summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Leemhuis <fedora@leemhuis.info>2017-03-13 21:53:01 +0100
committerThorsten Leemhuis <fedora@leemhuis.info>2017-03-13 21:53:01 +0100
commit82996f747d62b732c02f9eade1fb7e20cf993331 (patch)
tree41129f900a7367b3b3e8cec68ab4bc46284d94a0
parente24e150d0b8fa9a0cab6b01c312b9702bc410055 (diff)
parent177691df09ec3379dfdf3980aeaa6f21e39d94b6 (diff)
downloadkernel-4.11.0-0.rc2.git0.1.vanilla.knurd.1.fc25.tar.gz
kernel-4.11.0-0.rc2.git0.1.vanilla.knurd.1.fc25.tar.xz
kernel-4.11.0-0.rc2.git0.1.vanilla.knurd.1.fc25.zip
Merge remote-tracking branch 'origin/master'kernel-4.11.0-0.rc2.git0.1.vanilla.knurd.1.fc25
-rw-r--r--0001-tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch311
-rw-r--r--baseconfig/CONFIG_MVPP21
-rw-r--r--baseconfig/arm/CONFIG_MMC_BCM28351
-rw-r--r--baseconfig/arm/CONFIG_MVPP2 (renamed from baseconfig/arm/armv7/CONFIG_MVPP2)0
-rw-r--r--baseconfig/arm/CONFIG_REGULATOR_PWM2
-rw-r--r--baseconfig/arm/arm64/CONFIG_QCOM_QDF2400_ERRATUM_00651
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_AHCI_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ARCH_STI1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ARM_STI_CPUFREQ1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_DWMAC_STI1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_HW_RANDOM_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_I2C_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_KEYBOARD_ST_KEYSCAN1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_MMC_SDHCI_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY28LP1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY365X1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH407_USB1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH41X_USB1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_POWER_RESET_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_PWM_STI1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_RC_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_RTC_DRV_ST_LPC1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI_SAS1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH4071
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH4151
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH4161
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_SPI_ST_SSC41
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_STI_MBOX1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ST_FDMA1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ST_LPC_WATCHDOG1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ST_REMOTEPROC1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_MEMMAP1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_SYSCFG1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_USB_DWC3_ST1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_USB_EHCI_HCD_STI1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_USB_OHCI_HCD_STI1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_BDISP1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_DRIVER1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_MJPEG1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HDMI_CEC1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA1
-rw-r--r--baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA_DEBUGFS1
-rw-r--r--bcm283x-mmc-bcm2835.patch1893
-rw-r--r--kernel-aarch64-debug.config6
-rw-r--r--kernel-aarch64.config6
-rw-r--r--kernel-armv7hl-debug.config44
-rw-r--r--kernel-armv7hl-lpae-debug.config3
-rw-r--r--kernel-armv7hl-lpae.config3
-rw-r--r--kernel-armv7hl.config44
-rw-r--r--kernel-i686-PAE.config1
-rw-r--r--kernel-i686-PAEdebug.config1
-rw-r--r--kernel-i686-debug.config1
-rw-r--r--kernel-i686.config1
-rw-r--r--kernel-ppc64-debug.config1
-rw-r--r--kernel-ppc64.config1
-rw-r--r--kernel-ppc64le-debug.config1
-rw-r--r--kernel-ppc64le.config1
-rw-r--r--kernel-ppc64p7-debug.config1
-rw-r--r--kernel-ppc64p7.config1
-rw-r--r--kernel-s390x-debug.config1
-rw-r--r--kernel-s390x.config1
-rw-r--r--kernel-x86_64-debug.config1
-rw-r--r--kernel-x86_64.config1
-rw-r--r--kernel.spec26
-rwxr-xr-xscripts/rawhide-rc.sh7
-rw-r--r--sources3
69 files changed, 2056 insertions, 348 deletions
diff --git a/0001-tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch b/0001-tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch
deleted file mode 100644
index b6cd8b211..000000000
--- a/0001-tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch
+++ /dev/null
@@ -1,311 +0,0 @@
-From 1dea7a8061ad9212f4464464a80d0dcd477eceab Mon Sep 17 00:00:00 2001
-From: Alexander Popov <alex.popov@linux.com>
-Date: Tue, 28 Feb 2017 19:28:54 +0300
-Subject: [PATCH 1/1] tty: n_hdlc: get rid of racy n_hdlc.tbuf
-
-Currently N_HDLC line discipline uses a self-made singly linked list for
-data buffers and has n_hdlc.tbuf pointer for buffer retransmitting after
-an error.
-
-The commit be10eb7589337e5defbe214dae038a53dd21add8
-("tty: n_hdlc add buffer flushing") introduced racy access to n_hdlc.tbuf.
-After tx error concurrent flush_tx_queue() and n_hdlc_send_frames() can put
-one data buffer to tx_free_buf_list twice. That causes double free in
-n_hdlc_release().
-
-Let's use standard kernel linked list and get rid of n_hdlc.tbuf:
-in case of tx error put current data buffer after the head of tx_buf_list.
-
-Signed-off-by: Alexander Popov <alex.popov@linux.com>
----
- drivers/tty/n_hdlc.c | 132 +++++++++++++++++++++++++++------------------------
- 1 file changed, 69 insertions(+), 63 deletions(-)
-
-diff --git a/drivers/tty/n_hdlc.c b/drivers/tty/n_hdlc.c
-index eb27883..728c824 100644
---- a/drivers/tty/n_hdlc.c
-+++ b/drivers/tty/n_hdlc.c
-@@ -114,7 +114,7 @@
- #define DEFAULT_TX_BUF_COUNT 3
-
- struct n_hdlc_buf {
-- struct n_hdlc_buf *link;
-+ struct list_head list_item;
- int count;
- char buf[1];
- };
-@@ -122,8 +122,7 @@ struct n_hdlc_buf {
- #define N_HDLC_BUF_SIZE (sizeof(struct n_hdlc_buf) + maxframe)
-
- struct n_hdlc_buf_list {
-- struct n_hdlc_buf *head;
-- struct n_hdlc_buf *tail;
-+ struct list_head list;
- int count;
- spinlock_t spinlock;
- };
-@@ -136,7 +135,6 @@ struct n_hdlc_buf_list {
- * @backup_tty - TTY to use if tty gets closed
- * @tbusy - reentrancy flag for tx wakeup code
- * @woke_up - FIXME: describe this field
-- * @tbuf - currently transmitting tx buffer
- * @tx_buf_list - list of pending transmit frame buffers
- * @rx_buf_list - list of received frame buffers
- * @tx_free_buf_list - list unused transmit frame buffers
-@@ -149,7 +147,6 @@ struct n_hdlc {
- struct tty_struct *backup_tty;
- int tbusy;
- int woke_up;
-- struct n_hdlc_buf *tbuf;
- struct n_hdlc_buf_list tx_buf_list;
- struct n_hdlc_buf_list rx_buf_list;
- struct n_hdlc_buf_list tx_free_buf_list;
-@@ -159,6 +156,8 @@ struct n_hdlc {
- /*
- * HDLC buffer list manipulation functions
- */
-+static void n_hdlc_buf_return(struct n_hdlc_buf_list *buf_list,
-+ struct n_hdlc_buf *buf);
- static void n_hdlc_buf_put(struct n_hdlc_buf_list *list,
- struct n_hdlc_buf *buf);
- static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_buf_list *list);
-@@ -208,16 +207,9 @@ static void flush_tx_queue(struct tty_struct *tty)
- {
- struct n_hdlc *n_hdlc = tty2n_hdlc(tty);
- struct n_hdlc_buf *buf;
-- unsigned long flags;
-
- while ((buf = n_hdlc_buf_get(&n_hdlc->tx_buf_list)))
- n_hdlc_buf_put(&n_hdlc->tx_free_buf_list, buf);
-- spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock, flags);
-- if (n_hdlc->tbuf) {
-- n_hdlc_buf_put(&n_hdlc->tx_free_buf_list, n_hdlc->tbuf);
-- n_hdlc->tbuf = NULL;
-- }
-- spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags);
- }
-
- static struct tty_ldisc_ops n_hdlc_ldisc = {
-@@ -283,7 +275,6 @@ static void n_hdlc_release(struct n_hdlc *n_hdlc)
- } else
- break;
- }
-- kfree(n_hdlc->tbuf);
- kfree(n_hdlc);
-
- } /* end of n_hdlc_release() */
-@@ -402,13 +393,7 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *tty)
- n_hdlc->woke_up = 0;
- spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock, flags);
-
-- /* get current transmit buffer or get new transmit */
-- /* buffer from list of pending transmit buffers */
--
-- tbuf = n_hdlc->tbuf;
-- if (!tbuf)
-- tbuf = n_hdlc_buf_get(&n_hdlc->tx_buf_list);
--
-+ tbuf = n_hdlc_buf_get(&n_hdlc->tx_buf_list);
- while (tbuf) {
- if (debuglevel >= DEBUG_LEVEL_INFO)
- printk("%s(%d)sending frame %p, count=%d\n",
-@@ -420,7 +405,7 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *tty)
-
- /* rollback was possible and has been done */
- if (actual == -ERESTARTSYS) {
-- n_hdlc->tbuf = tbuf;
-+ n_hdlc_buf_return(&n_hdlc->tx_buf_list, tbuf);
- break;
- }
- /* if transmit error, throw frame away by */
-@@ -435,10 +420,7 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *tty)
-
- /* free current transmit buffer */
- n_hdlc_buf_put(&n_hdlc->tx_free_buf_list, tbuf);
--
-- /* this tx buffer is done */
-- n_hdlc->tbuf = NULL;
--
-+
- /* wait up sleeping writers */
- wake_up_interruptible(&tty->write_wait);
-
-@@ -448,10 +430,12 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *tty)
- if (debuglevel >= DEBUG_LEVEL_INFO)
- printk("%s(%d)frame %p pending\n",
- __FILE__,__LINE__,tbuf);
--
-- /* buffer not accepted by driver */
-- /* set this buffer as pending buffer */
-- n_hdlc->tbuf = tbuf;
-+
-+ /*
-+ * the buffer was not accepted by driver,
-+ * return it back into tx queue
-+ */
-+ n_hdlc_buf_return(&n_hdlc->tx_buf_list, tbuf);
- break;
- }
- }
-@@ -749,7 +733,8 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, struct file *file,
- int error = 0;
- int count;
- unsigned long flags;
--
-+ struct n_hdlc_buf *buf = NULL;
-+
- if (debuglevel >= DEBUG_LEVEL_INFO)
- printk("%s(%d)n_hdlc_tty_ioctl() called %d\n",
- __FILE__,__LINE__,cmd);
-@@ -763,8 +748,10 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, struct file *file,
- /* report count of read data available */
- /* in next available frame (if any) */
- spin_lock_irqsave(&n_hdlc->rx_buf_list.spinlock,flags);
-- if (n_hdlc->rx_buf_list.head)
-- count = n_hdlc->rx_buf_list.head->count;
-+ buf = list_first_entry_or_null(&n_hdlc->rx_buf_list.list,
-+ struct n_hdlc_buf, list_item);
-+ if (buf)
-+ count = buf->count;
- else
- count = 0;
- spin_unlock_irqrestore(&n_hdlc->rx_buf_list.spinlock,flags);
-@@ -776,8 +763,10 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, struct file *file,
- count = tty_chars_in_buffer(tty);
- /* add size of next output frame in queue */
- spin_lock_irqsave(&n_hdlc->tx_buf_list.spinlock,flags);
-- if (n_hdlc->tx_buf_list.head)
-- count += n_hdlc->tx_buf_list.head->count;
-+ buf = list_first_entry_or_null(&n_hdlc->tx_buf_list.list,
-+ struct n_hdlc_buf, list_item);
-+ if (buf)
-+ count += buf->count;
- spin_unlock_irqrestore(&n_hdlc->tx_buf_list.spinlock,flags);
- error = put_user(count, (int __user *)arg);
- break;
-@@ -825,14 +814,14 @@ static unsigned int n_hdlc_tty_poll(struct tty_struct *tty, struct file *filp,
- poll_wait(filp, &tty->write_wait, wait);
-
- /* set bits for operations that won't block */
-- if (n_hdlc->rx_buf_list.head)
-+ if (!list_empty(&n_hdlc->rx_buf_list.list))
- mask |= POLLIN | POLLRDNORM; /* readable */
- if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
- mask |= POLLHUP;
- if (tty_hung_up_p(filp))
- mask |= POLLHUP;
- if (!tty_is_writelocked(tty) &&
-- n_hdlc->tx_free_buf_list.head)
-+ !list_empty(&n_hdlc->tx_free_buf_list.list))
- mask |= POLLOUT | POLLWRNORM; /* writable */
- }
- return mask;
-@@ -856,7 +845,12 @@ static struct n_hdlc *n_hdlc_alloc(void)
- spin_lock_init(&n_hdlc->tx_free_buf_list.spinlock);
- spin_lock_init(&n_hdlc->rx_buf_list.spinlock);
- spin_lock_init(&n_hdlc->tx_buf_list.spinlock);
--
-+
-+ INIT_LIST_HEAD(&n_hdlc->rx_free_buf_list.list);
-+ INIT_LIST_HEAD(&n_hdlc->tx_free_buf_list.list);
-+ INIT_LIST_HEAD(&n_hdlc->rx_buf_list.list);
-+ INIT_LIST_HEAD(&n_hdlc->tx_buf_list.list);
-+
- /* allocate free rx buffer list */
- for(i=0;i<DEFAULT_RX_BUF_COUNT;i++) {
- buf = kmalloc(N_HDLC_BUF_SIZE, GFP_KERNEL);
-@@ -884,53 +878,65 @@ static struct n_hdlc *n_hdlc_alloc(void)
- } /* end of n_hdlc_alloc() */
-
- /**
-+ * n_hdlc_buf_return - put the HDLC buffer after the head of the specified list
-+ * @buf_list - pointer to the buffer list
-+ * @buf - pointer to the buffer
-+ */
-+static void n_hdlc_buf_return(struct n_hdlc_buf_list *buf_list,
-+ struct n_hdlc_buf *buf)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&buf_list->spinlock, flags);
-+
-+ list_add(&buf->list_item, &buf_list->list);
-+ buf_list->count++;
-+
-+ spin_unlock_irqrestore(&buf_list->spinlock, flags);
-+}
-+
-+/**
- * n_hdlc_buf_put - add specified HDLC buffer to tail of specified list
-- * @list - pointer to buffer list
-+ * @buf_list - pointer to buffer list
- * @buf - pointer to buffer
- */
--static void n_hdlc_buf_put(struct n_hdlc_buf_list *list,
-+static void n_hdlc_buf_put(struct n_hdlc_buf_list *buf_list,
- struct n_hdlc_buf *buf)
- {
- unsigned long flags;
-- spin_lock_irqsave(&list->spinlock,flags);
--
-- buf->link=NULL;
-- if (list->tail)
-- list->tail->link = buf;
-- else
-- list->head = buf;
-- list->tail = buf;
-- (list->count)++;
--
-- spin_unlock_irqrestore(&list->spinlock,flags);
--
-+
-+ spin_lock_irqsave(&buf_list->spinlock, flags);
-+
-+ list_add_tail(&buf->list_item, &buf_list->list);
-+ buf_list->count++;
-+
-+ spin_unlock_irqrestore(&buf_list->spinlock, flags);
- } /* end of n_hdlc_buf_put() */
-
- /**
- * n_hdlc_buf_get - remove and return an HDLC buffer from list
-- * @list - pointer to HDLC buffer list
-+ * @buf_list - pointer to HDLC buffer list
- *
- * Remove and return an HDLC buffer from the head of the specified HDLC buffer
- * list.
- * Returns a pointer to HDLC buffer if available, otherwise %NULL.
- */
--static struct n_hdlc_buf* n_hdlc_buf_get(struct n_hdlc_buf_list *list)
-+static struct n_hdlc_buf *n_hdlc_buf_get(struct n_hdlc_buf_list *buf_list)
- {
- unsigned long flags;
- struct n_hdlc_buf *buf;
-- spin_lock_irqsave(&list->spinlock,flags);
--
-- buf = list->head;
-+
-+ spin_lock_irqsave(&buf_list->spinlock, flags);
-+
-+ buf = list_first_entry_or_null(&buf_list->list,
-+ struct n_hdlc_buf, list_item);
- if (buf) {
-- list->head = buf->link;
-- (list->count)--;
-+ list_del(&buf->list_item);
-+ buf_list->count--;
- }
-- if (!list->head)
-- list->tail = NULL;
--
-- spin_unlock_irqrestore(&list->spinlock,flags);
-+
-+ spin_unlock_irqrestore(&buf_list->spinlock, flags);
- return buf;
--
- } /* end of n_hdlc_buf_get() */
-
- static char hdlc_banner[] __initdata =
---
-2.7.4
-
diff --git a/baseconfig/CONFIG_MVPP2 b/baseconfig/CONFIG_MVPP2
deleted file mode 100644
index ae82dcbc4..000000000
--- a/baseconfig/CONFIG_MVPP2
+++ /dev/null
@@ -1 +0,0 @@
-# CONFIG_MVPP2 is not set
diff --git a/baseconfig/arm/CONFIG_MMC_BCM2835 b/baseconfig/arm/CONFIG_MMC_BCM2835
new file mode 100644
index 000000000..b3750c1a7
--- /dev/null
+++ b/baseconfig/arm/CONFIG_MMC_BCM2835
@@ -0,0 +1 @@
+CONFIG_MMC_BCM2835=m
diff --git a/baseconfig/arm/armv7/CONFIG_MVPP2 b/baseconfig/arm/CONFIG_MVPP2
index e41ec5ca1..e41ec5ca1 100644
--- a/baseconfig/arm/armv7/CONFIG_MVPP2
+++ b/baseconfig/arm/CONFIG_MVPP2
diff --git a/baseconfig/arm/CONFIG_REGULATOR_PWM b/baseconfig/arm/CONFIG_REGULATOR_PWM
index 654817956..e41417821 100644
--- a/baseconfig/arm/CONFIG_REGULATOR_PWM
+++ b/baseconfig/arm/CONFIG_REGULATOR_PWM
@@ -1 +1 @@
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
diff --git a/baseconfig/arm/arm64/CONFIG_QCOM_QDF2400_ERRATUM_0065 b/baseconfig/arm/arm64/CONFIG_QCOM_QDF2400_ERRATUM_0065
new file mode 100644
index 000000000..dec9be970
--- /dev/null
+++ b/baseconfig/arm/arm64/CONFIG_QCOM_QDF2400_ERRATUM_0065
@@ -0,0 +1 @@
+CONFIG_QCOM_QDF2400_ERRATUM_0065=y
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_AHCI_ST b/baseconfig/arm/armv7/armv7/CONFIG_AHCI_ST
new file mode 100644
index 000000000..975ecd425
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_AHCI_ST
@@ -0,0 +1 @@
+CONFIG_AHCI_ST=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ARCH_STI b/baseconfig/arm/armv7/armv7/CONFIG_ARCH_STI
new file mode 100644
index 000000000..7a253ecf5
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ARCH_STI
@@ -0,0 +1 @@
+CONFIG_ARCH_STI=y
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ARM_STI_CPUFREQ b/baseconfig/arm/armv7/armv7/CONFIG_ARM_STI_CPUFREQ
new file mode 100644
index 000000000..0e26a51f0
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ARM_STI_CPUFREQ
@@ -0,0 +1 @@
+CONFIG_ARM_STI_CPUFREQ=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_DWMAC_STI b/baseconfig/arm/armv7/armv7/CONFIG_DWMAC_STI
new file mode 100644
index 000000000..b0da5ddbc
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_DWMAC_STI
@@ -0,0 +1 @@
+CONFIG_DWMAC_STI=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_HW_RANDOM_ST b/baseconfig/arm/armv7/armv7/CONFIG_HW_RANDOM_ST
new file mode 100644
index 000000000..e908df516
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_HW_RANDOM_ST
@@ -0,0 +1 @@
+CONFIG_HW_RANDOM_ST=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_I2C_ST b/baseconfig/arm/armv7/armv7/CONFIG_I2C_ST
new file mode 100644
index 000000000..dac85894e
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_I2C_ST
@@ -0,0 +1 @@
+CONFIG_I2C_ST=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_KEYBOARD_ST_KEYSCAN b/baseconfig/arm/armv7/armv7/CONFIG_KEYBOARD_ST_KEYSCAN
new file mode 100644
index 000000000..5ad9d0409
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_KEYBOARD_ST_KEYSCAN
@@ -0,0 +1 @@
+CONFIG_KEYBOARD_ST_KEYSCAN=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_MMC_SDHCI_ST b/baseconfig/arm/armv7/armv7/CONFIG_MMC_SDHCI_ST
new file mode 100644
index 000000000..4a513a669
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_MMC_SDHCI_ST
@@ -0,0 +1 @@
+CONFIG_MMC_SDHCI_ST=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY28LP b/baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY28LP
new file mode 100644
index 000000000..c0b002711
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY28LP
@@ -0,0 +1 @@
+CONFIG_PHY_MIPHY28LP=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY365X b/baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY365X
new file mode 100644
index 000000000..b824f4d74
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_PHY_MIPHY365X
@@ -0,0 +1 @@
+# CONFIG_PHY_MIPHY365X is not set
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH407_USB b/baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH407_USB
new file mode 100644
index 000000000..62d71519e
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH407_USB
@@ -0,0 +1 @@
+CONFIG_PHY_STIH407_USB=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH41X_USB b/baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH41X_USB
new file mode 100644
index 000000000..65f0bc9b7
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_PHY_STIH41X_USB
@@ -0,0 +1 @@
+# CONFIG_PHY_STIH41X_USB is not set
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_POWER_RESET_ST b/baseconfig/arm/armv7/armv7/CONFIG_POWER_RESET_ST
new file mode 100644
index 000000000..e14ee1ac1
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_POWER_RESET_ST
@@ -0,0 +1 @@
+CONFIG_POWER_RESET_ST=y
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_PWM_STI b/baseconfig/arm/armv7/armv7/CONFIG_PWM_STI
new file mode 100644
index 000000000..8aaff84cb
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_PWM_STI
@@ -0,0 +1 @@
+CONFIG_PWM_STI=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_RC_ST b/baseconfig/arm/armv7/armv7/CONFIG_RC_ST
new file mode 100644
index 000000000..878dd631d
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_RC_ST
@@ -0,0 +1 @@
+CONFIG_RC_ST=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_RTC_DRV_ST_LPC b/baseconfig/arm/armv7/armv7/CONFIG_RTC_DRV_ST_LPC
new file mode 100644
index 000000000..548d6d6c9
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_RTC_DRV_ST_LPC
@@ -0,0 +1 @@
+CONFIG_RTC_DRV_ST_LPC=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI b/baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI
new file mode 100644
index 000000000..af73428f9
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI
@@ -0,0 +1 @@
+CONFIG_SND_SOC_STI=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI_SAS b/baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI_SAS
new file mode 100644
index 000000000..99ae102fc
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_SND_SOC_STI_SAS
@@ -0,0 +1 @@
+CONFIG_SND_SOC_STI_SAS=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH407 b/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH407
new file mode 100644
index 000000000..e1a2ca5a6
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH407
@@ -0,0 +1 @@
+CONFIG_SOC_STIH407=y
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH415 b/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH415
new file mode 100644
index 000000000..41502f339
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH415
@@ -0,0 +1 @@
+# CONFIG_SOC_STIH415 is not set
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH416 b/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH416
new file mode 100644
index 000000000..9835ddfc1
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_SOC_STIH416
@@ -0,0 +1 @@
+# CONFIG_SOC_STIH416 is not set
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_SPI_ST_SSC4 b/baseconfig/arm/armv7/armv7/CONFIG_SPI_ST_SSC4
new file mode 100644
index 000000000..87403eb57
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_SPI_ST_SSC4
@@ -0,0 +1 @@
+CONFIG_SPI_ST_SSC4=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_STI_MBOX b/baseconfig/arm/armv7/armv7/CONFIG_STI_MBOX
new file mode 100644
index 000000000..60dd9ded6
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_STI_MBOX
@@ -0,0 +1 @@
+CONFIG_STI_MBOX=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ST_FDMA b/baseconfig/arm/armv7/armv7/CONFIG_ST_FDMA
new file mode 100644
index 000000000..73c09775d
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ST_FDMA
@@ -0,0 +1 @@
+CONFIG_ST_FDMA=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ST_LPC_WATCHDOG b/baseconfig/arm/armv7/armv7/CONFIG_ST_LPC_WATCHDOG
new file mode 100644
index 000000000..5e0a376a8
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ST_LPC_WATCHDOG
@@ -0,0 +1 @@
+CONFIG_ST_LPC_WATCHDOG=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ST_REMOTEPROC b/baseconfig/arm/armv7/armv7/CONFIG_ST_REMOTEPROC
new file mode 100644
index 000000000..73ad95532
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ST_REMOTEPROC
@@ -0,0 +1 @@
+CONFIG_ST_REMOTEPROC=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL b/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL
new file mode 100644
index 000000000..62b32ecb6
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL
@@ -0,0 +1 @@
+CONFIG_ST_THERMAL=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_MEMMAP b/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_MEMMAP
new file mode 100644
index 000000000..22f120d14
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_MEMMAP
@@ -0,0 +1 @@
+CONFIG_ST_THERMAL_MEMMAP=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_SYSCFG b/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_SYSCFG
new file mode 100644
index 000000000..865418b83
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_ST_THERMAL_SYSCFG
@@ -0,0 +1 @@
+# CONFIG_ST_THERMAL_SYSCFG is not set
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_USB_DWC3_ST b/baseconfig/arm/armv7/armv7/CONFIG_USB_DWC3_ST
new file mode 100644
index 000000000..8c2b8b403
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_USB_DWC3_ST
@@ -0,0 +1 @@
+CONFIG_USB_DWC3_ST=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_USB_EHCI_HCD_STI b/baseconfig/arm/armv7/armv7/CONFIG_USB_EHCI_HCD_STI
new file mode 100644
index 000000000..7f13c6b05
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_USB_EHCI_HCD_STI
@@ -0,0 +1 @@
+CONFIG_USB_EHCI_HCD_STI=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_USB_OHCI_HCD_STI b/baseconfig/arm/armv7/armv7/CONFIG_USB_OHCI_HCD_STI
new file mode 100644
index 000000000..ac20563d8
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_USB_OHCI_HCD_STI
@@ -0,0 +1 @@
+CONFIG_USB_OHCI_HCD_STI=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_BDISP b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_BDISP
new file mode 100644
index 000000000..430657aeb
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_BDISP
@@ -0,0 +1 @@
+CONFIG_VIDEO_STI_BDISP=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA
new file mode 100644
index 000000000..8bb71fa96
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA
@@ -0,0 +1 @@
+CONFIG_VIDEO_STI_DELTA=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_DRIVER b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_DRIVER
new file mode 100644
index 000000000..0292f4baa
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_DRIVER
@@ -0,0 +1 @@
+CONFIG_VIDEO_STI_DELTA_DRIVER=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_MJPEG b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_MJPEG
new file mode 100644
index 000000000..f847894b9
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_DELTA_MJPEG
@@ -0,0 +1 @@
+CONFIG_VIDEO_STI_DELTA_MJPEG=y
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HDMI_CEC b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HDMI_CEC
new file mode 100644
index 000000000..a1d5539f7
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HDMI_CEC
@@ -0,0 +1 @@
+CONFIG_VIDEO_STI_HDMI_CEC=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA
new file mode 100644
index 000000000..7058385d2
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA
@@ -0,0 +1 @@
+CONFIG_VIDEO_STI_HVA=m
diff --git a/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA_DEBUGFS b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA_DEBUGFS
new file mode 100644
index 000000000..637bf6eb4
--- /dev/null
+++ b/baseconfig/arm/armv7/armv7/CONFIG_VIDEO_STI_HVA_DEBUGFS
@@ -0,0 +1 @@
+# CONFIG_VIDEO_STI_HVA_DEBUGFS is not set
diff --git a/bcm283x-mmc-bcm2835.patch b/bcm283x-mmc-bcm2835.patch
new file mode 100644
index 000000000..59916d82c
--- /dev/null
+++ b/bcm283x-mmc-bcm2835.patch
@@ -0,0 +1,1893 @@
+From patchwork Wed Mar 8 09:19:01 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4,1/7] dt-bindings: Add binding for brcm,bcm2835-sdhost.
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610673
+Message-Id: <1488964751-22763-2-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:01 +0100
+
+From: Eric Anholt <eric@anholt.net>
+
+This is the other SD controller on the platform, which can be swapped
+to the role of SD card host using pin muxing.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+Acked-by: Rob Herring <robh@kernel.org>
+---
+ .../bindings/mmc/brcm,bcm2835-sdhost.txt | 23 ++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/mmc/brcm,bcm2835-sdhost.txt
+
+diff --git a/Documentation/devicetree/bindings/mmc/brcm,bcm2835-sdhost.txt b/Documentation/devicetree/bindings/mmc/brcm,bcm2835-sdhost.txt
+new file mode 100644
+index 0000000..d876580
+--- /dev/null
++++ b/Documentation/devicetree/bindings/mmc/brcm,bcm2835-sdhost.txt
+@@ -0,0 +1,23 @@
++Broadcom BCM2835 SDHOST controller
++
++This file documents differences between the core properties described
++by mmc.txt and the properties that represent the BCM2835 controller.
++
++Required properties:
++- compatible: Should be "brcm,bcm2835-sdhost".
++- clocks: The clock feeding the SDHOST controller.
++
++Optional properties:
++- dmas: DMA channel for read and write.
++ See Documentation/devicetree/bindings/dma/dma.txt for details
++
++Example:
++
++sdhost: mmc@7e202000 {
++ compatible = "brcm,bcm2835-sdhost";
++ reg = <0x7e202000 0x100>;
++ interrupts = <2 24>;
++ clocks = <&clocks BCM2835_CLOCK_VPU>;
++ dmas = <&dma 13>;
++ dma-names = "rx-tx";
++};
+From patchwork Wed Mar 8 09:19:03 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4,2/7] mmc: bcm2835: Add new driver for the sdhost controller.
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610701
+Message-Id: <1488964751-22763-4-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:03 +0100
+
+From: Eric Anholt <eric@anholt.net>
+
+The 2835 has two SD controllers: The Arasan sdhci controller (supported
+by the iproc driver) and a custom sdhost controller. This patch adds a
+driver for the latter.
+
+The sdhci controller supports both sdcard and sdio. The sdhost
+controller supports the sdcard only, but has better performance. Also
+note that the rpi3 has sdio wifi, so driving the sdcard with the sdhost
+controller allows to use the sdhci controller for wifi support.
+
+The configuration is done by devicetree via pin muxing. Both SD
+controller are available on the same pins (2 pin groups = pin 22 to 27 +
+pin 48 to 53). So it's possible to use both SD controllers at the same
+time with different pin groups.
+
+The code was originally written by Phil Elwell in the downstream
+Rasbperry Pi tree. In preparation for the upstream merge it was
+cleaned up and the code base was moderized by Eric Anholt, Stefan
+Wahren and Gerd Hoffmann.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ drivers/mmc/host/Kconfig | 14 +
+ drivers/mmc/host/Makefile | 1 +
+ drivers/mmc/host/bcm2835.c | 1465 ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 1480 insertions(+)
+ create mode 100644 drivers/mmc/host/bcm2835.c
+
+diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
+index f08691a..a638cd0 100644
+--- a/drivers/mmc/host/Kconfig
++++ b/drivers/mmc/host/Kconfig
+@@ -799,6 +799,20 @@ config MMC_TOSHIBA_PCI
+ depends on PCI
+ help
+
++config MMC_BCM2835
++ tristate "Broadcom BCM2835 SDHOST MMC Controller support"
++ depends on ARCH_BCM2835 || COMPILE_TEST
++ depends on HAS_DMA
++ help
++ This selects the BCM2835 SDHOST MMC controller. If you have
++ a BCM2835 platform with SD or MMC devices, say Y or M here.
++
++ Note that the BCM2835 has two SD controllers: The Arasan
++ sdhci controller (supported by MMC_SDHCI_IPROC) and a custom
++ sdhost controller (supported by this driver).
++
++ If unsure, say N.
++
+ config MMC_MTK
+ tristate "MediaTek SD/MMC Card Interface support"
+ depends on HAS_DMA
+diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
+index 6d548c4..bc2c2e2 100644
+--- a/drivers/mmc/host/Makefile
++++ b/drivers/mmc/host/Makefile
+@@ -59,6 +59,7 @@ obj-$(CONFIG_MMC_MOXART) += moxart-mmc.o
+ obj-$(CONFIG_MMC_SUNXI) += sunxi-mmc.o
+ obj-$(CONFIG_MMC_USDHI6ROL0) += usdhi6rol0.o
+ obj-$(CONFIG_MMC_TOSHIBA_PCI) += toshsd.o
++obj-$(CONFIG_MMC_BCM2835) += bcm2835.o
+
+ obj-$(CONFIG_MMC_REALTEK_PCI) += rtsx_pci_sdmmc.o
+ obj-$(CONFIG_MMC_REALTEK_USB) += rtsx_usb_sdmmc.o
+diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c
+new file mode 100644
+index 0000000..7d1b0db7
+--- /dev/null
++++ b/drivers/mmc/host/bcm2835.c
+@@ -0,0 +1,1465 @@
++/*
++ * bcm2835 sdhost driver.
++ *
++ * The 2835 has two SD controllers: The Arasan sdhci controller
++ * (supported by the iproc driver) and a custom sdhost controller
++ * (supported by this driver).
++ *
++ * The sdhci controller supports both sdcard and sdio. The sdhost
++ * controller supports the sdcard only, but has better performance.
++ * Also note that the rpi3 has sdio wifi, so driving the sdcard with
++ * the sdhost controller allows to use the sdhci controller for wifi
++ * support.
++ *
++ * The configuration is done by devicetree via pin muxing. Both
++ * SD controller are available on the same pins (2 pin groups = pin 22
++ * to 27 + pin 48 to 53). So it's possible to use both SD controllers
++ * at the same time with different pin groups.
++ *
++ * Author: Phil Elwell <phil@raspberrypi.org>
++ * Copyright (C) 2015-2016 Raspberry Pi (Trading) Ltd.
++ *
++ * Based on
++ * mmc-bcm2835.c by Gellert Weisz
++ * which is, in turn, based on
++ * sdhci-bcm2708.c by Broadcom
++ * sdhci-bcm2835.c by Stephen Warren and Oleksandr Tymoshenko
++ * sdhci.c and sdhci-pci.c by Pierre Ossman
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++#include <linux/clk.h>
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/dmaengine.h>
++#include <linux/dma-mapping.h>
++#include <linux/err.h>
++#include <linux/highmem.h>
++#include <linux/interrupt.h>
++#include <linux/io.h>
++#include <linux/iopoll.h>
++#include <linux/module.h>
++#include <linux/of_address.h>
++#include <linux/of_irq.h>
++#include <linux/platform_device.h>
++#include <linux/scatterlist.h>
++#include <linux/time.h>
++#include <linux/workqueue.h>
++
++#include <linux/mmc/host.h>
++#include <linux/mmc/mmc.h>
++#include <linux/mmc/sd.h>
++
++#define SDCMD 0x00 /* Command to SD card - 16 R/W */
++#define SDARG 0x04 /* Argument to SD card - 32 R/W */
++#define SDTOUT 0x08 /* Start value for timeout counter - 32 R/W */
++#define SDCDIV 0x0c /* Start value for clock divider - 11 R/W */
++#define SDRSP0 0x10 /* SD card response (31:0) - 32 R */
++#define SDRSP1 0x14 /* SD card response (63:32) - 32 R */
++#define SDRSP2 0x18 /* SD card response (95:64) - 32 R */
++#define SDRSP3 0x1c /* SD card response (127:96) - 32 R */
++#define SDHSTS 0x20 /* SD host status - 11 R/W */
++#define SDVDD 0x30 /* SD card power control - 1 R/W */
++#define SDEDM 0x34 /* Emergency Debug Mode - 13 R/W */
++#define SDHCFG 0x38 /* Host configuration - 2 R/W */
++#define SDHBCT 0x3c /* Host byte count (debug) - 32 R/W */
++#define SDDATA 0x40 /* Data to/from SD card - 32 R/W */
++#define SDHBLC 0x50 /* Host block count (SDIO/SDHC) - 9 R/W */
++
++#define SDCMD_NEW_FLAG 0x8000
++#define SDCMD_FAIL_FLAG 0x4000
++#define SDCMD_BUSYWAIT 0x800
++#define SDCMD_NO_RESPONSE 0x400
++#define SDCMD_LONG_RESPONSE 0x200
++#define SDCMD_WRITE_CMD 0x80
++#define SDCMD_READ_CMD 0x40
++#define SDCMD_CMD_MASK 0x3f
++
++#define SDCDIV_MAX_CDIV 0x7ff
++
++#define SDHSTS_BUSY_IRPT 0x400
++#define SDHSTS_BLOCK_IRPT 0x200
++#define SDHSTS_SDIO_IRPT 0x100
++#define SDHSTS_REW_TIME_OUT 0x80
++#define SDHSTS_CMD_TIME_OUT 0x40
++#define SDHSTS_CRC16_ERROR 0x20
++#define SDHSTS_CRC7_ERROR 0x10
++#define SDHSTS_FIFO_ERROR 0x08
++/* Reserved */
++/* Reserved */
++#define SDHSTS_DATA_FLAG 0x01
++
++#define SDHSTS_TRANSFER_ERROR_MASK (SDHSTS_CRC7_ERROR | \
++ SDHSTS_CRC16_ERROR | \
++ SDHSTS_REW_TIME_OUT | \
++ SDHSTS_FIFO_ERROR)
++
++#define SDHSTS_ERROR_MASK (SDHSTS_CMD_TIME_OUT | \
++ SDHSTS_TRANSFER_ERROR_MASK)
++
++#define SDHCFG_BUSY_IRPT_EN BIT(10)
++#define SDHCFG_BLOCK_IRPT_EN BIT(8)
++#define SDHCFG_SDIO_IRPT_EN BIT(5)
++#define SDHCFG_DATA_IRPT_EN BIT(4)
++#define SDHCFG_SLOW_CARD BIT(3)
++#define SDHCFG_WIDE_EXT_BUS BIT(2)
++#define SDHCFG_WIDE_INT_BUS BIT(1)
++#define SDHCFG_REL_CMD_LINE BIT(0)
++
++#define SDVDD_POWER_OFF 0
++#define SDVDD_POWER_ON 1
++
++#define SDEDM_FORCE_DATA_MODE BIT(19)
++#define SDEDM_CLOCK_PULSE BIT(20)
++#define SDEDM_BYPASS BIT(21)
++
++#define SDEDM_WRITE_THRESHOLD_SHIFT 9
++#define SDEDM_READ_THRESHOLD_SHIFT 14
++#define SDEDM_THRESHOLD_MASK 0x1f
++
++#define SDEDM_FSM_MASK 0xf
++#define SDEDM_FSM_IDENTMODE 0x0
++#define SDEDM_FSM_DATAMODE 0x1
++#define SDEDM_FSM_READDATA 0x2
++#define SDEDM_FSM_WRITEDATA 0x3
++#define SDEDM_FSM_READWAIT 0x4
++#define SDEDM_FSM_READCRC 0x5
++#define SDEDM_FSM_WRITECRC 0x6
++#define SDEDM_FSM_WRITEWAIT1 0x7
++#define SDEDM_FSM_POWERDOWN 0x8
++#define SDEDM_FSM_POWERUP 0x9
++#define SDEDM_FSM_WRITESTART1 0xa
++#define SDEDM_FSM_WRITESTART2 0xb
++#define SDEDM_FSM_GENPULSES 0xc
++#define SDEDM_FSM_WRITEWAIT2 0xd
++#define SDEDM_FSM_STARTPOWDOWN 0xf
++
++#define SDDATA_FIFO_WORDS 16
++
++#define FIFO_READ_THRESHOLD 4
++#define FIFO_WRITE_THRESHOLD 4
++#define SDDATA_FIFO_PIO_BURST 8
++
++#define PIO_THRESHOLD 1 /* Maximum block count for PIO (0 = always DMA) */
++
++struct bcm2835_host {
++ spinlock_t lock;
++ struct mutex mutex;
++
++ void __iomem *ioaddr;
++ u32 phys_addr;
++
++ struct mmc_host *mmc;
++ struct platform_device *pdev;
++
++ int clock; /* Current clock speed */
++ unsigned int max_clk; /* Max possible freq */
++ struct work_struct dma_work;
++ struct delayed_work timeout_work; /* Timer for timeouts */
++ struct sg_mapping_iter sg_miter; /* SG state for PIO */
++ unsigned int blocks; /* remaining PIO blocks */
++ int irq; /* Device IRQ */
++
++ u32 ns_per_fifo_word;
++
++ /* cached registers */
++ u32 hcfg;
++ u32 cdiv;
++
++ struct mmc_request *mrq; /* Current request */
++ struct mmc_command *cmd; /* Current command */
++ struct mmc_data *data; /* Current data request */
++ bool data_complete:1;/* Data finished before cmd */
++ bool use_busy:1; /* Wait for busy interrupt */
++ bool use_sbc:1; /* Send CMD23 */
++
++ /* for threaded irq handler */
++ bool irq_block;
++ bool irq_busy;
++ bool irq_data;
++
++ /* DMA part */
++ struct dma_chan *dma_chan_rxtx;
++ struct dma_chan *dma_chan;
++ struct dma_slave_config dma_cfg_rx;
++ struct dma_slave_config dma_cfg_tx;
++ struct dma_async_tx_descriptor *dma_desc;
++ u32 dma_dir;
++ u32 drain_words;
++ struct page *drain_page;
++ u32 drain_offset;
++ bool use_dma;
++};
++
++static void bcm2835_dumpcmd(struct bcm2835_host *host, struct mmc_command *cmd,
++ const char *label)
++{
++ struct device *dev = &host->pdev->dev;
++
++ if (!cmd)
++ return;
++
++ dev_dbg(dev, "%c%s op %d arg 0x%x flags 0x%x - resp %08x %08x %08x %08x, err %d\n",
++ (cmd == host->cmd) ? '>' : ' ',
++ label, cmd->opcode, cmd->arg, cmd->flags,
++ cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3],
++ cmd->error);
++}
++
++static void bcm2835_dumpregs(struct bcm2835_host *host)
++{
++ struct mmc_request *mrq = host->mrq;
++ struct device *dev = &host->pdev->dev;
++
++ if (mrq) {
++ bcm2835_dumpcmd(host, mrq->sbc, "sbc");
++ bcm2835_dumpcmd(host, mrq->cmd, "cmd");
++ if (mrq->data) {
++ dev_dbg(dev, "data blocks %x blksz %x - err %d\n",
++ mrq->data->blocks,
++ mrq->data->blksz,
++ mrq->data->error);
++ }
++ bcm2835_dumpcmd(host, mrq->stop, "stop");
++ }
++
++ dev_dbg(dev, "=========== REGISTER DUMP ===========\n");
++ dev_dbg(dev, "SDCMD 0x%08x\n", readl(host->ioaddr + SDCMD));
++ dev_dbg(dev, "SDARG 0x%08x\n", readl(host->ioaddr + SDARG));
++ dev_dbg(dev, "SDTOUT 0x%08x\n", readl(host->ioaddr + SDTOUT));
++ dev_dbg(dev, "SDCDIV 0x%08x\n", readl(host->ioaddr + SDCDIV));
++ dev_dbg(dev, "SDRSP0 0x%08x\n", readl(host->ioaddr + SDRSP0));
++ dev_dbg(dev, "SDRSP1 0x%08x\n", readl(host->ioaddr + SDRSP1));
++ dev_dbg(dev, "SDRSP2 0x%08x\n", readl(host->ioaddr + SDRSP2));
++ dev_dbg(dev, "SDRSP3 0x%08x\n", readl(host->ioaddr + SDRSP3));
++ dev_dbg(dev, "SDHSTS 0x%08x\n", readl(host->ioaddr + SDHSTS));
++ dev_dbg(dev, "SDVDD 0x%08x\n", readl(host->ioaddr + SDVDD));
++ dev_dbg(dev, "SDEDM 0x%08x\n", readl(host->ioaddr + SDEDM));
++ dev_dbg(dev, "SDHCFG 0x%08x\n", readl(host->ioaddr + SDHCFG));
++ dev_dbg(dev, "SDHBCT 0x%08x\n", readl(host->ioaddr + SDHBCT));
++ dev_dbg(dev, "SDHBLC 0x%08x\n", readl(host->ioaddr + SDHBLC));
++ dev_dbg(dev, "===========================================\n");
++}
++
++static void bcm2835_reset_internal(struct bcm2835_host *host)
++{
++ u32 temp;
++
++ writel(SDVDD_POWER_OFF, host->ioaddr + SDVDD);
++ writel(0, host->ioaddr + SDCMD);
++ writel(0, host->ioaddr + SDARG);
++ writel(0xf00000, host->ioaddr + SDTOUT);
++ writel(0, host->ioaddr + SDCDIV);
++ writel(0x7f8, host->ioaddr + SDHSTS); /* Write 1s to clear */
++ writel(0, host->ioaddr + SDHCFG);
++ writel(0, host->ioaddr + SDHBCT);
++ writel(0, host->ioaddr + SDHBLC);
++
++ /* Limit fifo usage due to silicon bug */
++ temp = readl(host->ioaddr + SDEDM);
++ temp &= ~((SDEDM_THRESHOLD_MASK << SDEDM_READ_THRESHOLD_SHIFT) |
++ (SDEDM_THRESHOLD_MASK << SDEDM_WRITE_THRESHOLD_SHIFT));
++ temp |= (FIFO_READ_THRESHOLD << SDEDM_READ_THRESHOLD_SHIFT) |
++ (FIFO_WRITE_THRESHOLD << SDEDM_WRITE_THRESHOLD_SHIFT);
++ writel(temp, host->ioaddr + SDEDM);
++ msleep(20);
++ writel(SDVDD_POWER_ON, host->ioaddr + SDVDD);
++ msleep(20);
++ host->clock = 0;
++ writel(host->hcfg, host->ioaddr + SDHCFG);
++ writel(host->cdiv, host->ioaddr + SDCDIV);
++}
++
++static void bcm2835_reset(struct mmc_host *mmc)
++{
++ struct bcm2835_host *host = mmc_priv(mmc);
++
++ if (host->dma_chan)
++ dmaengine_terminate_sync(host->dma_chan);
++ bcm2835_reset_internal(host);
++}
++
++static void bcm2835_finish_command(struct bcm2835_host *host);
++
++static void bcm2835_wait_transfer_complete(struct bcm2835_host *host)
++{
++ int timediff;
++ u32 alternate_idle;
++
++ alternate_idle = (host->mrq->data->flags & MMC_DATA_READ) ?
++ SDEDM_FSM_READWAIT : SDEDM_FSM_WRITESTART1;
++
++ timediff = 0;
++
++ while (1) {
++ u32 edm, fsm;
++
++ edm = readl(host->ioaddr + SDEDM);
++ fsm = edm & SDEDM_FSM_MASK;
++
++ if ((fsm == SDEDM_FSM_IDENTMODE) ||
++ (fsm == SDEDM_FSM_DATAMODE))
++ break;
++ if (fsm == alternate_idle) {
++ writel(edm | SDEDM_FORCE_DATA_MODE,
++ host->ioaddr + SDEDM);
++ break;
++ }
++
++ timediff++;
++ if (timediff == 100000) {
++ dev_err(&host->pdev->dev,
++ "wait_transfer_complete - still waiting after %d retries\n",
++ timediff);
++ bcm2835_dumpregs(host);
++ host->mrq->data->error = -ETIMEDOUT;
++ return;
++ }
++ cpu_relax();
++ }
++}
++
++static void bcm2835_dma_complete(void *param)
++{
++ struct bcm2835_host *host = param;
++
++ schedule_work(&host->dma_work);
++}
++
++static void bcm2835_transfer_block_pio(struct bcm2835_host *host, bool is_read)
++{
++ unsigned long flags;
++ size_t blksize;
++ unsigned long wait_max;
++
++ blksize = host->data->blksz;
++
++ wait_max = jiffies + msecs_to_jiffies(500);
++
++ local_irq_save(flags);
++
++ while (blksize) {
++ int copy_words;
++ u32 hsts = 0;
++ size_t len;
++ u32 *buf;
++
++ if (!sg_miter_next(&host->sg_miter)) {
++ host->data->error = -EINVAL;
++ break;
++ }
++
++ len = min(host->sg_miter.length, blksize);
++ if (len % 4) {
++ host->data->error = -EINVAL;
++ break;
++ }
++
++ blksize -= len;
++ host->sg_miter.consumed = len;
++
++ buf = (u32 *)host->sg_miter.addr;
++
++ copy_words = len / 4;
++
++ while (copy_words) {
++ int burst_words, words;
++ u32 edm;
++
++ burst_words = min(SDDATA_FIFO_PIO_BURST, copy_words);
++ edm = readl(host->ioaddr + SDEDM);
++ if (is_read)
++ words = ((edm >> 4) & 0x1f);
++ else
++ words = SDDATA_FIFO_WORDS - ((edm >> 4) & 0x1f);
++
++ if (words < burst_words) {
++ int fsm_state = (edm & SDEDM_FSM_MASK);
++ struct device *dev = &host->pdev->dev;
++
++ if ((is_read &&
++ (fsm_state != SDEDM_FSM_READDATA &&
++ fsm_state != SDEDM_FSM_READWAIT &&
++ fsm_state != SDEDM_FSM_READCRC)) ||
++ (!is_read &&
++ (fsm_state != SDEDM_FSM_WRITEDATA &&
++ fsm_state != SDEDM_FSM_WRITESTART1 &&
++ fsm_state != SDEDM_FSM_WRITESTART2))) {
++ hsts = readl(host->ioaddr + SDHSTS);
++ dev_err(dev, "fsm %x, hsts %08x\n",
++ fsm_state, hsts);
++ if (hsts & SDHSTS_ERROR_MASK)
++ break;
++ }
++
++ if (time_after(jiffies, wait_max)) {
++ dev_err(dev, "PIO %s timeout - EDM %08x\n",
++ is_read ? "read" : "write",
++ edm);
++ hsts = SDHSTS_REW_TIME_OUT;
++ break;
++ }
++ ndelay((burst_words - words) *
++ host->ns_per_fifo_word);
++ continue;
++ } else if (words > copy_words) {
++ words = copy_words;
++ }
++
++ copy_words -= words;
++
++ while (words) {
++ if (is_read)
++ *(buf++) = readl(host->ioaddr + SDDATA);
++ else
++ writel(*(buf++), host->ioaddr + SDDATA);
++ words--;
++ }
++ }
++
++ if (hsts & SDHSTS_ERROR_MASK)
++ break;
++ }
++
++ sg_miter_stop(&host->sg_miter);
++
++ local_irq_restore(flags);
++}
++
++static void bcm2835_transfer_pio(struct bcm2835_host *host)
++{
++ struct device *dev = &host->pdev->dev;
++ u32 sdhsts;
++ bool is_read;
++
++ is_read = (host->data->flags & MMC_DATA_READ) != 0;
++ bcm2835_transfer_block_pio(host, is_read);
++
++ sdhsts = readl(host->ioaddr + SDHSTS);
++ if (sdhsts & (SDHSTS_CRC16_ERROR |
++ SDHSTS_CRC7_ERROR |
++ SDHSTS_FIFO_ERROR)) {
++ dev_err(dev, "%s transfer error - HSTS %08x\n",
++ is_read ? "read" : "write", sdhsts);
++ host->data->error = -EILSEQ;
++ } else if ((sdhsts & (SDHSTS_CMD_TIME_OUT |
++ SDHSTS_REW_TIME_OUT))) {
++ dev_err(dev, "%s timeout error - HSTS %08x\n",
++ is_read ? "read" : "write", sdhsts);
++ host->data->error = -ETIMEDOUT;
++ }
++}
++
++static
++void bcm2835_prepare_dma(struct bcm2835_host *host, struct mmc_data *data)
++{
++ int len, dir_data, dir_slave;
++ struct dma_async_tx_descriptor *desc = NULL;
++ struct dma_chan *dma_chan;
++
++ dma_chan = host->dma_chan_rxtx;
++ if (data->flags & MMC_DATA_READ) {
++ dir_data = DMA_FROM_DEVICE;
++ dir_slave = DMA_DEV_TO_MEM;
++ } else {
++ dir_data = DMA_TO_DEVICE;
++ dir_slave = DMA_MEM_TO_DEV;
++ }
++
++ /* The block doesn't manage the FIFO DREQs properly for
++ * multi-block transfers, so don't attempt to DMA the final
++ * few words. Unfortunately this requires the final sg entry
++ * to be trimmed. N.B. This code demands that the overspill
++ * is contained in a single sg entry.
++ */
++
++ host->drain_words = 0;
++ if ((data->blocks > 1) && (dir_data == DMA_FROM_DEVICE)) {
++ struct scatterlist *sg;
++ u32 len;
++ int i;
++
++ len = min((u32)(FIFO_READ_THRESHOLD - 1) * 4,
++ (u32)data->blocks * data->blksz);
++
++ for_each_sg(data->sg, sg, data->sg_len, i) {
++ if (sg_is_last(sg)) {
++ WARN_ON(sg->length < len);
++ sg->length -= len;
++ host->drain_page = sg_page(sg);
++ host->drain_offset = sg->offset + sg->length;
++ }
++ }
++ host->drain_words = len / 4;
++ }
++
++ /* The parameters have already been validated, so this will not fail */
++ (void)dmaengine_slave_config(dma_chan,
++ (dir_data == DMA_FROM_DEVICE) ?
++ &host->dma_cfg_rx :
++ &host->dma_cfg_tx);
++
++ len = dma_map_sg(dma_chan->device->dev, data->sg, data->sg_len,
++ dir_data);
++
++ if (len > 0) {
++ desc = dmaengine_prep_slave_sg(dma_chan, data->sg,
++ len, dir_slave,
++ DMA_PREP_INTERRUPT |
++ DMA_CTRL_ACK);
++ }
++
++ if (desc) {
++ desc->callback = bcm2835_dma_complete;
++ desc->callback_param = host;
++ host->dma_desc = desc;
++ host->dma_chan = dma_chan;
++ host->dma_dir = dir_data;
++ }
++}
++
++static void bcm2835_start_dma(struct bcm2835_host *host)
++{
++ dmaengine_submit(host->dma_desc);
++ dma_async_issue_pending(host->dma_chan);
++}
++
++static void bcm2835_set_transfer_irqs(struct bcm2835_host *host)
++{
++ u32 all_irqs = SDHCFG_DATA_IRPT_EN | SDHCFG_BLOCK_IRPT_EN |
++ SDHCFG_BUSY_IRPT_EN;
++
++ if (host->dma_desc) {
++ host->hcfg = (host->hcfg & ~all_irqs) |
++ SDHCFG_BUSY_IRPT_EN;
++ } else {
++ host->hcfg = (host->hcfg & ~all_irqs) |
++ SDHCFG_DATA_IRPT_EN |
++ SDHCFG_BUSY_IRPT_EN;
++ }
++
++ writel(host->hcfg, host->ioaddr + SDHCFG);
++}
++
++static
++void bcm2835_prepare_data(struct bcm2835_host *host, struct mmc_command *cmd)
++{
++ struct mmc_data *data = cmd->data;
++
++ WARN_ON(host->data);
++
++ host->data = data;
++ if (!data)
++ return;
++
++ host->data_complete = false;
++ host->data->bytes_xfered = 0;
++
++ if (!host->dma_desc) {
++ /* Use PIO */
++ int flags = SG_MITER_ATOMIC;
++
++ if (data->flags & MMC_DATA_READ)
++ flags |= SG_MITER_TO_SG;
++ else
++ flags |= SG_MITER_FROM_SG;
++ sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags);
++ host->blocks = data->blocks;
++ }
++
++ bcm2835_set_transfer_irqs(host);
++
++ writel(data->blksz, host->ioaddr + SDHBCT);
++ writel(data->blocks, host->ioaddr + SDHBLC);
++}
++
++static u32 bcm2835_read_wait_sdcmd(struct bcm2835_host *host, u32 max_ms)
++{
++ struct device *dev = &host->pdev->dev;
++ u32 value;
++ int ret;
++
++ ret = readl_poll_timeout(host->ioaddr + SDCMD, value,
++ !(value & SDCMD_NEW_FLAG), 1, 10);
++ if (ret == -ETIMEDOUT)
++ /* if it takes a while make poll interval bigger */
++ ret = readl_poll_timeout(host->ioaddr + SDCMD, value,
++ !(value & SDCMD_NEW_FLAG),
++ 10, max_ms * 1000);
++ if (ret == -ETIMEDOUT)
++ dev_err(dev, "%s: timeout (%d ms)\n", __func__, max_ms);
++
++ return value;
++}
++
++static void bcm2835_finish_request(struct bcm2835_host *host)
++{
++ struct dma_chan *terminate_chan = NULL;
++ struct mmc_request *mrq;
++
++ cancel_delayed_work(&host->timeout_work);
++
++ mrq = host->mrq;
++
++ host->mrq = NULL;
++ host->cmd = NULL;
++ host->data = NULL;
++
++ host->dma_desc = NULL;
++ terminate_chan = host->dma_chan;
++ host->dma_chan = NULL;
++
++ if (terminate_chan) {
++ int err = dmaengine_terminate_all(terminate_chan);
++
++ if (err)
++ dev_err(&host->pdev->dev,
++ "failed to terminate DMA (%d)\n", err);
++ }
++
++ mmc_request_done(host->mmc, mrq);
++}
++
++static
++bool bcm2835_send_command(struct bcm2835_host *host, struct mmc_command *cmd)
++{
++ struct device *dev = &host->pdev->dev;
++ u32 sdcmd, sdhsts;
++ unsigned long timeout;
++
++ WARN_ON(host->cmd);
++
++ sdcmd = bcm2835_read_wait_sdcmd(host, 100);
++ if (sdcmd & SDCMD_NEW_FLAG) {
++ dev_err(dev, "previous command never completed.\n");
++ bcm2835_dumpregs(host);
++ cmd->error = -EILSEQ;
++ bcm2835_finish_request(host);
++ return false;
++ }
++
++ if (!cmd->data && cmd->busy_timeout > 9000)
++ timeout = DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ;
++ else
++ timeout = 10 * HZ;
++ schedule_delayed_work(&host->timeout_work, timeout);
++
++ host->cmd = cmd;
++
++ /* Clear any error flags */
++ sdhsts = readl(host->ioaddr + SDHSTS);
++ if (sdhsts & SDHSTS_ERROR_MASK)
++ writel(sdhsts, host->ioaddr + SDHSTS);
++
++ if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
++ dev_err(dev, "unsupported response type!\n");
++ cmd->error = -EINVAL;
++ bcm2835_finish_request(host);
++ return false;
++ }
++
++ bcm2835_prepare_data(host, cmd);
++
++ writel(cmd->arg, host->ioaddr + SDARG);
++
++ sdcmd = cmd->opcode & SDCMD_CMD_MASK;
++
++ host->use_busy = false;
++ if (!(cmd->flags & MMC_RSP_PRESENT)) {
++ sdcmd |= SDCMD_NO_RESPONSE;
++ } else {
++ if (cmd->flags & MMC_RSP_136)
++ sdcmd |= SDCMD_LONG_RESPONSE;
++ if (cmd->flags & MMC_RSP_BUSY) {
++ sdcmd |= SDCMD_BUSYWAIT;
++ host->use_busy = true;
++ }
++ }
++
++ if (cmd->data) {
++ if (cmd->data->flags & MMC_DATA_WRITE)
++ sdcmd |= SDCMD_WRITE_CMD;
++ if (cmd->data->flags & MMC_DATA_READ)
++ sdcmd |= SDCMD_READ_CMD;
++ }
++
++ writel(sdcmd | SDCMD_NEW_FLAG, host->ioaddr + SDCMD);
++
++ return true;
++}
++
++static void bcm2835_transfer_complete(struct bcm2835_host *host)
++{
++ struct mmc_data *data;
++
++ WARN_ON(!host->data_complete);
++
++ data = host->data;
++ host->data = NULL;
++
++ /* Need to send CMD12 if -
++ * a) open-ended multiblock transfer (no CMD23)
++ * b) error in multiblock transfer
++ */
++ if (host->mrq->stop && (data->error || !host->use_sbc)) {
++ if (bcm2835_send_command(host, host->mrq->stop)) {
++ /* No busy, so poll for completion */
++ if (!host->use_busy)
++ bcm2835_finish_command(host);
++ }
++ } else {
++ bcm2835_wait_transfer_complete(host);
++ bcm2835_finish_request(host);
++ }
++}
++
++static void bcm2835_finish_data(struct bcm2835_host *host)
++{
++ struct device *dev = &host->pdev->dev;
++ struct mmc_data *data;
++
++ data = host->data;
++
++ host->hcfg &= ~(SDHCFG_DATA_IRPT_EN | SDHCFG_BLOCK_IRPT_EN);
++ writel(host->hcfg, host->ioaddr + SDHCFG);
++
++ data->bytes_xfered = data->error ? 0 : (data->blksz * data->blocks);
++
++ host->data_complete = true;
++
++ if (host->cmd) {
++ /* Data managed to finish before the
++ * command completed. Make sure we do
++ * things in the proper order.
++ */
++ dev_dbg(dev, "Finished early - HSTS %08x\n",
++ readl(host->ioaddr + SDHSTS));
++ } else {
++ bcm2835_transfer_complete(host);
++ }
++}
++
++static void bcm2835_finish_command(struct bcm2835_host *host)
++{
++ struct device *dev = &host->pdev->dev;
++ struct mmc_command *cmd = host->cmd;
++ u32 sdcmd;
++
++ sdcmd = bcm2835_read_wait_sdcmd(host, 100);
++
++ /* Check for errors */
++ if (sdcmd & SDCMD_NEW_FLAG) {
++ dev_err(dev, "command never completed.\n");
++ bcm2835_dumpregs(host);
++ host->cmd->error = -EIO;
++ bcm2835_finish_request(host);
++ return;
++ } else if (sdcmd & SDCMD_FAIL_FLAG) {
++ u32 sdhsts = readl(host->ioaddr + SDHSTS);
++
++ /* Clear the errors */
++ writel(SDHSTS_ERROR_MASK, host->ioaddr + SDHSTS);
++
++ if (!(sdhsts & SDHSTS_CRC7_ERROR) ||
++ (host->cmd->opcode != MMC_SEND_OP_COND)) {
++ if (sdhsts & SDHSTS_CMD_TIME_OUT) {
++ host->cmd->error = -ETIMEDOUT;
++ } else {
++ dev_err(dev, "unexpected command %d error\n",
++ host->cmd->opcode);
++ bcm2835_dumpregs(host);
++ host->cmd->error = -EILSEQ;
++ }
++ bcm2835_finish_request(host);
++ return;
++ }
++ }
++
++ if (cmd->flags & MMC_RSP_PRESENT) {
++ if (cmd->flags & MMC_RSP_136) {
++ int i;
++
++ for (i = 0; i < 4; i++) {
++ cmd->resp[3 - i] =
++ readl(host->ioaddr + SDRSP0 + i * 4);
++ }
++ } else {
++ cmd->resp[0] = readl(host->ioaddr + SDRSP0);
++ }
++ }
++
++ if (cmd == host->mrq->sbc) {
++ /* Finished CMD23, now send actual command. */
++ host->cmd = NULL;
++ if (bcm2835_send_command(host, host->mrq->cmd)) {
++ if (host->data && host->dma_desc)
++ /* DMA transfer starts now, PIO starts
++ * after irq
++ */
++ bcm2835_start_dma(host);
++
++ if (!host->use_busy)
++ bcm2835_finish_command(host);
++ }
++ } else if (cmd == host->mrq->stop) {
++ /* Finished CMD12 */
++ bcm2835_finish_request(host);
++ } else {
++ /* Processed actual command. */
++ host->cmd = NULL;
++ if (!host->data)
++ bcm2835_finish_request(host);
++ else if (host->data_complete)
++ bcm2835_transfer_complete(host);
++ }
++}
++
++static void bcm2835_timeout(struct work_struct *work)
++{
++ struct delayed_work *d = to_delayed_work(work);
++ struct bcm2835_host *host =
++ container_of(d, struct bcm2835_host, timeout_work);
++ struct device *dev = &host->pdev->dev;
++
++ mutex_lock(&host->mutex);
++
++ if (host->mrq) {
++ dev_err(dev, "timeout waiting for hardware interrupt.\n");
++ bcm2835_dumpregs(host);
++
++ if (host->data) {
++ host->data->error = -ETIMEDOUT;
++ bcm2835_finish_data(host);
++ } else {
++ if (host->cmd)
++ host->cmd->error = -ETIMEDOUT;
++ else
++ host->mrq->cmd->error = -ETIMEDOUT;
++
++ bcm2835_finish_request(host);
++ }
++ }
++
++ mutex_unlock(&host->mutex);
++}
++
++static bool bcm2835_check_cmd_error(struct bcm2835_host *host, u32 intmask)
++{
++ struct device *dev = &host->pdev->dev;
++
++ if (!(intmask & SDHSTS_ERROR_MASK))
++ return false;
++
++ if (!host->cmd)
++ return true;
++
++ dev_err(dev, "sdhost_busy_irq: intmask %08x\n", intmask);
++ if (intmask & SDHSTS_CRC7_ERROR) {
++ host->cmd->error = -EILSEQ;
++ } else if (intmask & (SDHSTS_CRC16_ERROR |
++ SDHSTS_FIFO_ERROR)) {
++ if (host->mrq->data)
++ host->mrq->data->error = -EILSEQ;
++ else
++ host->cmd->error = -EILSEQ;
++ } else if (intmask & SDHSTS_REW_TIME_OUT) {
++ if (host->mrq->data)
++ host->mrq->data->error = -ETIMEDOUT;
++ else
++ host->cmd->error = -ETIMEDOUT;
++ } else if (intmask & SDHSTS_CMD_TIME_OUT) {
++ host->cmd->error = -ETIMEDOUT;
++ }
++ bcm2835_dumpregs(host);
++ return true;
++}
++
++static void bcm2835_check_data_error(struct bcm2835_host *host, u32 intmask)
++{
++ if (!host->data)
++ return;
++ if (intmask & (SDHSTS_CRC16_ERROR | SDHSTS_FIFO_ERROR))
++ host->data->error = -EILSEQ;
++ if (intmask & SDHSTS_REW_TIME_OUT)
++ host->data->error = -ETIMEDOUT;
++}
++
++static void bcm2835_busy_irq(struct bcm2835_host *host)
++{
++ if (WARN_ON(!host->cmd)) {
++ bcm2835_dumpregs(host);
++ return;
++ }
++
++ if (WARN_ON(!host->use_busy)) {
++ bcm2835_dumpregs(host);
++ return;
++ }
++ host->use_busy = false;
++
++ bcm2835_finish_command(host);
++}
++
++static void bcm2835_data_irq(struct bcm2835_host *host, u32 intmask)
++{
++ /* There are no dedicated data/space available interrupt
++ * status bits, so it is necessary to use the single shared
++ * data/space available FIFO status bits. It is therefore not
++ * an error to get here when there is no data transfer in
++ * progress.
++ */
++ if (!host->data)
++ return;
++
++ bcm2835_check_data_error(host, intmask);
++ if (host->data->error)
++ goto finished;
++
++ if (host->data->flags & MMC_DATA_WRITE) {
++ /* Use the block interrupt for writes after the first block */
++ host->hcfg &= ~(SDHCFG_DATA_IRPT_EN);
++ host->hcfg |= SDHCFG_BLOCK_IRPT_EN;
++ writel(host->hcfg, host->ioaddr + SDHCFG);
++ bcm2835_transfer_pio(host);
++ } else {
++ bcm2835_transfer_pio(host);
++ host->blocks--;
++ if ((host->blocks == 0) || host->data->error)
++ goto finished;
++ }
++ return;
++
++finished:
++ host->hcfg &= ~(SDHCFG_DATA_IRPT_EN | SDHCFG_BLOCK_IRPT_EN);
++ writel(host->hcfg, host->ioaddr + SDHCFG);
++}
++
++static void bcm2835_data_threaded_irq(struct bcm2835_host *host)
++{
++ if (!host->data)
++ return;
++ if ((host->blocks == 0) || host->data->error)
++ bcm2835_finish_data(host);
++}
++
++static void bcm2835_block_irq(struct bcm2835_host *host)
++{
++ if (WARN_ON(!host->data)) {
++ bcm2835_dumpregs(host);
++ return;
++ }
++
++ if (!host->dma_desc) {
++ WARN_ON(!host->blocks);
++ if (host->data->error || (--host->blocks == 0))
++ bcm2835_finish_data(host);
++ else
++ bcm2835_transfer_pio(host);
++ } else if (host->data->flags & MMC_DATA_WRITE) {
++ bcm2835_finish_data(host);
++ }
++}
++
++static irqreturn_t bcm2835_irq(int irq, void *dev_id)
++{
++ irqreturn_t result = IRQ_NONE;
++ struct bcm2835_host *host = dev_id;
++ u32 intmask;
++
++ spin_lock(&host->lock);
++
++ intmask = readl(host->ioaddr + SDHSTS);
++
++ writel(SDHSTS_BUSY_IRPT |
++ SDHSTS_BLOCK_IRPT |
++ SDHSTS_SDIO_IRPT |
++ SDHSTS_DATA_FLAG,
++ host->ioaddr + SDHSTS);
++
++ if (intmask & SDHSTS_BLOCK_IRPT) {
++ bcm2835_check_data_error(host, intmask);
++ host->irq_block = true;
++ result = IRQ_WAKE_THREAD;
++ }
++
++ if (intmask & SDHSTS_BUSY_IRPT) {
++ if (!bcm2835_check_cmd_error(host, intmask)) {
++ host->irq_busy = true;
++ result = IRQ_WAKE_THREAD;
++ } else {
++ result = IRQ_HANDLED;
++ }
++ }
++
++ /* There is no true data interrupt status bit, so it is
++ * necessary to qualify the data flag with the interrupt
++ * enable bit.
++ */
++ if ((intmask & SDHSTS_DATA_FLAG) &&
++ (host->hcfg & SDHCFG_DATA_IRPT_EN)) {
++ bcm2835_data_irq(host, intmask);
++ host->irq_data = true;
++ result = IRQ_WAKE_THREAD;
++ }
++
++ spin_unlock(&host->lock);
++
++ return result;
++}
++
++static irqreturn_t bcm2835_threaded_irq(int irq, void *dev_id)
++{
++ struct bcm2835_host *host = dev_id;
++ unsigned long flags;
++ bool block, busy, data;
++
++ spin_lock_irqsave(&host->lock, flags);
++
++ block = host->irq_block;
++ busy = host->irq_busy;
++ data = host->irq_data;
++ host->irq_block = false;
++ host->irq_busy = false;
++ host->irq_data = false;
++
++ spin_unlock_irqrestore(&host->lock, flags);
++
++ mutex_lock(&host->mutex);
++
++ if (block)
++ bcm2835_block_irq(host);
++ if (busy)
++ bcm2835_busy_irq(host);
++ if (data)
++ bcm2835_data_threaded_irq(host);
++
++ mutex_unlock(&host->mutex);
++
++ return IRQ_HANDLED;
++}
++
++static void bcm2835_dma_complete_work(struct work_struct *work)
++{
++ struct bcm2835_host *host =
++ container_of(work, struct bcm2835_host, dma_work);
++ struct mmc_data *data = host->data;
++
++ mutex_lock(&host->mutex);
++
++ if (host->dma_chan) {
++ dma_unmap_sg(host->dma_chan->device->dev,
++ data->sg, data->sg_len,
++ host->dma_dir);
++
++ host->dma_chan = NULL;
++ }
++
++ if (host->drain_words) {
++ unsigned long flags;
++ void *page;
++ u32 *buf;
++
++ if (host->drain_offset & PAGE_MASK) {
++ host->drain_page += host->drain_offset >> PAGE_SHIFT;
++ host->drain_offset &= ~PAGE_MASK;
++ }
++ local_irq_save(flags);
++ page = kmap_atomic(host->drain_page);
++ buf = page + host->drain_offset;
++
++ while (host->drain_words) {
++ u32 edm = readl(host->ioaddr + SDEDM);
++
++ if ((edm >> 4) & 0x1f)
++ *(buf++) = readl(host->ioaddr + SDDATA);
++ host->drain_words--;
++ }
++
++ kunmap_atomic(page);
++ local_irq_restore(flags);
++ }
++
++ bcm2835_finish_data(host);
++
++ mutex_unlock(&host->mutex);
++}
++
++static void bcm2835_set_clock(struct bcm2835_host *host, unsigned int clock)
++{
++ int div;
++
++ /* The SDCDIV register has 11 bits, and holds (div - 2). But
++ * in data mode the max is 50MHz wihout a minimum, and only
++ * the bottom 3 bits are used. Since the switch over is
++ * automatic (unless we have marked the card as slow...),
++ * chosen values have to make sense in both modes. Ident mode
++ * must be 100-400KHz, so can range check the requested
++ * clock. CMD15 must be used to return to data mode, so this
++ * can be monitored.
++ *
++ * clock 250MHz -> 0->125MHz, 1->83.3MHz, 2->62.5MHz, 3->50.0MHz
++ * 4->41.7MHz, 5->35.7MHz, 6->31.3MHz, 7->27.8MHz
++ *
++ * 623->400KHz/27.8MHz
++ * reset value (507)->491159/50MHz
++ *
++ * BUT, the 3-bit clock divisor in data mode is too small if
++ * the core clock is higher than 250MHz, so instead use the
++ * SLOW_CARD configuration bit to force the use of the ident
++ * clock divisor at all times.
++ */
++
++ if (clock < 100000) {
++ /* Can't stop the clock, but make it as slow as possible
++ * to show willing
++ */
++ host->cdiv = SDCDIV_MAX_CDIV;
++ writel(host->cdiv, host->ioaddr + SDCDIV);
++ return;
++ }
++
++ div = host->max_clk / clock;
++ if (div < 2)
++ div = 2;
++ if ((host->max_clk / div) > clock)
++ div++;
++ div -= 2;
++
++ if (div > SDCDIV_MAX_CDIV)
++ div = SDCDIV_MAX_CDIV;
++
++ clock = host->max_clk / (div + 2);
++ host->mmc->actual_clock = clock;
++
++ /* Calibrate some delays */
++
++ host->ns_per_fifo_word = (1000000000 / clock) *
++ ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
++
++ host->cdiv = div;
++ writel(host->cdiv, host->ioaddr + SDCDIV);
++
++ /* Set the timeout to 500ms */
++ writel(host->mmc->actual_clock / 2, host->ioaddr + SDTOUT);
++}
++
++static void bcm2835_request(struct mmc_host *mmc, struct mmc_request *mrq)
++{
++ struct bcm2835_host *host = mmc_priv(mmc);
++ struct device *dev = &host->pdev->dev;
++ u32 edm, fsm;
++
++ /* Reset the error statuses in case this is a retry */
++ if (mrq->sbc)
++ mrq->sbc->error = 0;
++ if (mrq->cmd)
++ mrq->cmd->error = 0;
++ if (mrq->data)
++ mrq->data->error = 0;
++ if (mrq->stop)
++ mrq->stop->error = 0;
++
++ if (mrq->data && !is_power_of_2(mrq->data->blksz)) {
++ dev_err(dev, "unsupported block size (%d bytes)\n",
++ mrq->data->blksz);
++ mrq->cmd->error = -EINVAL;
++ mmc_request_done(mmc, mrq);
++ return;
++ }
++
++ if (host->use_dma && mrq->data && (mrq->data->blocks > PIO_THRESHOLD))
++ bcm2835_prepare_dma(host, mrq->data);
++
++ mutex_lock(&host->mutex);
++
++ WARN_ON(host->mrq);
++ host->mrq = mrq;
++
++ edm = readl(host->ioaddr + SDEDM);
++ fsm = edm & SDEDM_FSM_MASK;
++
++ if ((fsm != SDEDM_FSM_IDENTMODE) &&
++ (fsm != SDEDM_FSM_DATAMODE)) {
++ dev_err(dev, "previous command (%d) not complete (EDM %08x)\n",
++ readl(host->ioaddr + SDCMD) & SDCMD_CMD_MASK,
++ edm);
++ bcm2835_dumpregs(host);
++ mrq->cmd->error = -EILSEQ;
++ bcm2835_finish_request(host);
++ mutex_unlock(&host->mutex);
++ return;
++ }
++
++ host->use_sbc = !!mrq->sbc && (host->mrq->data->flags & MMC_DATA_READ);
++ if (host->use_sbc) {
++ if (bcm2835_send_command(host, mrq->sbc)) {
++ if (!host->use_busy)
++ bcm2835_finish_command(host);
++ }
++ } else if (bcm2835_send_command(host, mrq->cmd)) {
++ if (host->data && host->dma_desc) {
++ /* DMA transfer starts now, PIO starts after irq */
++ bcm2835_start_dma(host);
++ }
++
++ if (!host->use_busy)
++ bcm2835_finish_command(host);
++ }
++
++ mutex_unlock(&host->mutex);
++}
++
++static void bcm2835_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
++{
++ struct bcm2835_host *host = mmc_priv(mmc);
++
++ mutex_lock(&host->mutex);
++
++ if (!ios->clock || ios->clock != host->clock) {
++ bcm2835_set_clock(host, ios->clock);
++ host->clock = ios->clock;
++ }
++
++ /* set bus width */
++ host->hcfg &= ~SDHCFG_WIDE_EXT_BUS;
++ if (ios->bus_width == MMC_BUS_WIDTH_4)
++ host->hcfg |= SDHCFG_WIDE_EXT_BUS;
++
++ host->hcfg |= SDHCFG_WIDE_INT_BUS;
++
++ /* Disable clever clock switching, to cope with fast core clocks */
++ host->hcfg |= SDHCFG_SLOW_CARD;
++
++ writel(host->hcfg, host->ioaddr + SDHCFG);
++
++ mutex_unlock(&host->mutex);
++}
++
++static struct mmc_host_ops bcm2835_ops = {
++ .request = bcm2835_request,
++ .set_ios = bcm2835_set_ios,
++ .hw_reset = bcm2835_reset,
++};
++
++static int bcm2835_add_host(struct bcm2835_host *host)
++{
++ struct mmc_host *mmc = host->mmc;
++ struct device *dev = &host->pdev->dev;
++ char pio_limit_string[20];
++ int ret;
++
++ mmc->f_max = host->max_clk;
++ mmc->f_min = host->max_clk / SDCDIV_MAX_CDIV;
++
++ mmc->max_busy_timeout = ~0 / (mmc->f_max / 1000);
++
++ dev_dbg(dev, "f_max %d, f_min %d, max_busy_timeout %d\n",
++ mmc->f_max, mmc->f_min, mmc->max_busy_timeout);
++
++ /* host controller capabilities */
++ mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED |
++ MMC_CAP_NEEDS_POLL | MMC_CAP_HW_RESET | MMC_CAP_ERASE |
++ MMC_CAP_CMD23;
++
++ spin_lock_init(&host->lock);
++ mutex_init(&host->mutex);
++
++ if (IS_ERR_OR_NULL(host->dma_chan_rxtx)) {
++ dev_warn(dev, "unable to initialise DMA channel. Falling back to PIO\n");
++ host->use_dma = false;
++ } else {
++ host->use_dma = true;
++
++ host->dma_cfg_tx.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
++ host->dma_cfg_tx.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
++ host->dma_cfg_tx.slave_id = 13; /* DREQ channel */
++ host->dma_cfg_tx.direction = DMA_MEM_TO_DEV;
++ host->dma_cfg_tx.src_addr = 0;
++ host->dma_cfg_tx.dst_addr = host->phys_addr + SDDATA;
++
++ host->dma_cfg_rx.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
++ host->dma_cfg_rx.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
++ host->dma_cfg_rx.slave_id = 13; /* DREQ channel */
++ host->dma_cfg_rx.direction = DMA_DEV_TO_MEM;
++ host->dma_cfg_rx.src_addr = host->phys_addr + SDDATA;
++ host->dma_cfg_rx.dst_addr = 0;
++
++ if (dmaengine_slave_config(host->dma_chan_rxtx,
++ &host->dma_cfg_tx) != 0 ||
++ dmaengine_slave_config(host->dma_chan_rxtx,
++ &host->dma_cfg_rx) != 0)
++ host->use_dma = false;
++ }
++
++ mmc->max_segs = 128;
++ mmc->max_req_size = 524288;
++ mmc->max_seg_size = mmc->max_req_size;
++ mmc->max_blk_size = 1024;
++ mmc->max_blk_count = 65535;
++
++ /* report supported voltage ranges */
++ mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
++
++ INIT_WORK(&host->dma_work, bcm2835_dma_complete_work);
++ INIT_DELAYED_WORK(&host->timeout_work, bcm2835_timeout);
++
++ /* Set interrupt enables */
++ host->hcfg = SDHCFG_BUSY_IRPT_EN;
++
++ bcm2835_reset_internal(host);
++
++ ret = request_threaded_irq(host->irq, bcm2835_irq,
++ bcm2835_threaded_irq,
++ 0, mmc_hostname(mmc), host);
++ if (ret) {
++ dev_err(dev, "failed to request IRQ %d: %d\n", host->irq, ret);
++ return ret;
++ }
++
++ ret = mmc_add_host(mmc);
++ if (ret) {
++ free_irq(host->irq, host);
++ return ret;
++ }
++
++ pio_limit_string[0] = '\0';
++ if (host->use_dma && (PIO_THRESHOLD > 0))
++ sprintf(pio_limit_string, " (>%d)", PIO_THRESHOLD);
++ dev_info(dev, "loaded - DMA %s%s\n",
++ host->use_dma ? "enabled" : "disabled", pio_limit_string);
++
++ return 0;
++}
++
++static int bcm2835_probe(struct platform_device *pdev)
++{
++ struct device *dev = &pdev->dev;
++ struct clk *clk;
++ struct resource *iomem;
++ struct bcm2835_host *host;
++ struct mmc_host *mmc;
++ const __be32 *regaddr_p;
++ int ret;
++
++ dev_dbg(dev, "%s\n", __func__);
++ mmc = mmc_alloc_host(sizeof(*host), dev);
++ if (!mmc)
++ return -ENOMEM;
++
++ mmc->ops = &bcm2835_ops;
++ host = mmc_priv(mmc);
++ host->mmc = mmc;
++ host->pdev = pdev;
++ spin_lock_init(&host->lock);
++
++ iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ host->ioaddr = devm_ioremap_resource(dev, iomem);
++ if (IS_ERR(host->ioaddr)) {
++ ret = PTR_ERR(host->ioaddr);
++ goto err;
++ }
++
++ /* Parse OF address directly to get the physical address for
++ * DMA to our registers.
++ */
++ regaddr_p = of_get_address(pdev->dev.of_node, 0, NULL, NULL);
++ if (!regaddr_p) {
++ dev_err(dev, "Can't get phys address\n");
++ ret = -EINVAL;
++ goto err;
++ }
++
++ host->phys_addr = be32_to_cpup(regaddr_p);
++
++ host->dma_chan = NULL;
++ host->dma_desc = NULL;
++
++ host->dma_chan_rxtx = dma_request_slave_channel(dev, "rx-tx");
++
++ clk = devm_clk_get(dev, NULL);
++ if (IS_ERR(clk)) {
++ ret = PTR_ERR(clk);
++ if (ret != -EPROBE_DEFER)
++ dev_err(dev, "could not get clk: %d\n", ret);
++ goto err;
++ }
++
++ host->max_clk = clk_get_rate(clk);
++
++ host->irq = platform_get_irq(pdev, 0);
++ if (host->irq <= 0) {
++ dev_err(dev, "get IRQ failed\n");
++ ret = -EINVAL;
++ goto err;
++ }
++
++ ret = mmc_of_parse(mmc);
++ if (ret)
++ goto err;
++
++ ret = bcm2835_add_host(host);
++ if (ret)
++ goto err;
++
++ platform_set_drvdata(pdev, host);
++
++ dev_dbg(dev, "%s -> OK\n", __func__);
++
++ return 0;
++
++err:
++ dev_dbg(dev, "%s -> err %d\n", __func__, ret);
++ mmc_free_host(mmc);
++
++ return ret;
++}
++
++static int bcm2835_remove(struct platform_device *pdev)
++{
++ struct bcm2835_host *host = platform_get_drvdata(pdev);
++
++ mmc_remove_host(host->mmc);
++
++ writel(SDVDD_POWER_OFF, host->ioaddr + SDVDD);
++
++ free_irq(host->irq, host);
++
++ cancel_work_sync(&host->dma_work);
++ cancel_delayed_work_sync(&host->timeout_work);
++
++ mmc_free_host(host->mmc);
++ platform_set_drvdata(pdev, NULL);
++
++ return 0;
++}
++
++static const struct of_device_id bcm2835_match[] = {
++ { .compatible = "brcm,bcm2835-sdhost" },
++ { }
++};
++MODULE_DEVICE_TABLE(of, bcm2835_match);
++
++static struct platform_driver bcm2835_driver = {
++ .probe = bcm2835_probe,
++ .remove = bcm2835_remove,
++ .driver = {
++ .name = "sdhost-bcm2835",
++ .of_match_table = bcm2835_match,
++ },
++};
++module_platform_driver(bcm2835_driver);
++
++MODULE_ALIAS("platform:sdhost-bcm2835");
++MODULE_DESCRIPTION("BCM2835 SDHost driver");
++MODULE_LICENSE("GPL v2");
++MODULE_AUTHOR("Phil Elwell");
+From patchwork Wed Mar 8 09:19:05 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4,3/7] mmc: bcm2835: add sdhost controller to devicetree
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610693
+Message-Id: <1488964751-22763-6-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:05 +0100
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+Acked-by: Eric Anholt <eric@anholt.net>
+Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
+---
+ arch/arm/boot/dts/bcm2835-rpi.dtsi | 6 ++++++
+ arch/arm/boot/dts/bcm283x.dtsi | 10 ++++++++++
+ 2 files changed, 16 insertions(+)
+
+diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
+index 1e00a28..8b95832 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
++++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
+@@ -69,6 +69,12 @@
+ bus-width = <4>;
+ };
+
++&sdhost {
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdhost_gpio48>;
++ bus-width = <4>;
++};
++
+ &pwm {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
+diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
+index 9798bc9..19099a5 100644
+--- a/arch/arm/boot/dts/bcm283x.dtsi
++++ b/arch/arm/boot/dts/bcm283x.dtsi
+@@ -350,6 +350,16 @@
+ arm,primecell-periphid = <0x00241011>;
+ };
+
++ sdhost: mmc@7e202000 {
++ compatible = "brcm,bcm2835-sdhost";
++ reg = <0x7e202000 0x100>;
++ interrupts = <2 24>;
++ clocks = <&clocks BCM2835_CLOCK_VPU>;
++ dmas = <&dma 13>;
++ dma-names = "rx-tx";
++ status = "disabled";
++ };
++
+ i2s: i2s@7e203000 {
+ compatible = "brcm,bcm2835-i2s";
+ reg = <0x7e203000 0x20>,
+From patchwork Wed Mar 8 09:19:07 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4, 4/7] arm: set CONFIG_MMC_BCM2835=y in bcm2835_defconfig and
+ multi_v7_defconfig
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610689
+Message-Id: <1488964751-22763-8-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:07 +0100
+
+We need to enable this controller so that we can switch the SD card's
+pinmux over to it by default, which will improve storage performance.
+
+Read access (dd with 64k blocks on rpi2):
+ CONFIG_MMC_SDHCI_IPROC: 11-12 MB/s
+ CONFIG_MMC_BCM2835: 19-20 MB/s
+
+Differences on write access are pretty much in the noise.
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ arch/arm/configs/bcm2835_defconfig | 1 +
+ arch/arm/configs/multi_v7_defconfig | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig
+index 4b89f4e..3767c24 100644
+--- a/arch/arm/configs/bcm2835_defconfig
++++ b/arch/arm/configs/bcm2835_defconfig
+@@ -92,6 +92,7 @@ CONFIG_MMC=y
+ CONFIG_MMC_SDHCI=y
+ CONFIG_MMC_SDHCI_PLTFM=y
+ CONFIG_MMC_SDHCI_IPROC=y
++CONFIG_MMC_BCM2835=y
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=y
+ CONFIG_LEDS_GPIO=y
+diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
+index a94126f..63b94d0 100644
+--- a/arch/arm/configs/multi_v7_defconfig
++++ b/arch/arm/configs/multi_v7_defconfig
+@@ -730,6 +730,7 @@ CONFIG_MMC_DW_EXYNOS=y
+ CONFIG_MMC_DW_ROCKCHIP=y
+ CONFIG_MMC_SH_MMCIF=y
+ CONFIG_MMC_SUNXI=y
++CONFIG_MMC_BCM2835=y
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=y
+ CONFIG_LEDS_CLASS_FLASH=m
+From patchwork Wed Mar 8 09:19:09 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4,5/7] arm64: set CONFIG_MMC_BCM2835=y in defconfig
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610647
+Message-Id: <1488964751-22763-10-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:09 +0100
+
+We need to enable this controller so that we can switch the SD card's
+pinmux over to it by default, which will improve storage performance.
+
+Read access (dd with 64k blocks on rpi2):
+ CONFIG_MMC_SDHCI_IPROC: 11-12 MB/s
+ CONFIG_MMC_BCM2835: 19-20 MB/s
+
+Differences on write access are pretty much in the noise.
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+---
+ arch/arm64/configs/defconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
+index 7c48028..519a55c 100644
+--- a/arch/arm64/configs/defconfig
++++ b/arch/arm64/configs/defconfig
+@@ -398,6 +398,7 @@ CONFIG_MMC_DW_EXYNOS=y
+ CONFIG_MMC_DW_K3=y
+ CONFIG_MMC_DW_ROCKCHIP=y
+ CONFIG_MMC_SUNXI=y
++CONFIG_MMC_BCM2835=y
+ CONFIG_NEW_LEDS=y
+ CONFIG_LEDS_CLASS=y
+ CONFIG_LEDS_GPIO=y
+From patchwork Wed Mar 8 09:19:10 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4,6/7] arm: dts: bcm283x: switch from &sdhci to &sdhost
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610687
+Message-Id: <1488964751-22763-11-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:10 +0100
+
+sdcard access with the sdhost controller is faster.
+
+Read access (dd with 64k blocks on rpi2):
+ CONFIG_MMC_SDHCI_IPROC: 11-12 MB/s
+ CONFIG_MMC_BCM2835: 19-20 MB/s
+
+Differences on write access are pretty much in the noise.
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+Acked-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2835-rpi.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
+index 8b95832..e36c392 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
++++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
+@@ -65,13 +65,13 @@
+ &sdhci {
+ pinctrl-names = "default";
+ pinctrl-0 = <&emmc_gpio48>;
+- status = "okay";
+ bus-width = <4>;
+ };
+
+ &sdhost {
+ pinctrl-names = "default";
+ pinctrl-0 = <&sdhost_gpio48>;
++ status = "okay";
+ bus-width = <4>;
+ };
+
+From patchwork Wed Mar 8 09:19:11 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v4,7/7] arm64: dts: bcm2837: add &sdhci and &sdhost
+From: Gerd Hoffmann <kraxel@redhat.com>
+X-Patchwork-Id: 9610637
+Message-Id: <1488964751-22763-12-git-send-email-kraxel@redhat.com>
+To: linux-rpi-kernel@lists.infradead.org
+Cc: mark.rutland@arm.com, stefan.wahren@i2se.com, ulf.hansson@linaro.org,
+ f.fainelli@gmail.com, sbranden@broadcom.com, devicetree@vger.kernel.org,
+ rjui@broadcom.com, lee@kernel.org, will.deacon@arm.com,
+ linux@armlinux.org.uk,
+ linux-kernel@vger.kernel.org, eric@anholt.net, robh+dt@kernel.org,
+ bcm-kernel-feedback-list@broadcom.com, Gerd Hoffmann <kraxel@redhat.com>,
+ catalin.marinas@arm.com, linux-mmc@vger.kernel.org,
+ linux-arm-kernel@lists.infradead.org
+Date: Wed, 8 Mar 2017 10:19:11 +0100
+
+For the raspberry pi 3 we'll need both sdhci (handles sdio wifi) and
+sdhost (handles sdcard).
+
+Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
+Acked-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts
+index c309633..972f14d 100644
+--- a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts
++++ b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b.dts
+@@ -22,3 +22,20 @@
+ &uart1 {
+ status = "okay";
+ };
++
++/* SDHCI is used to control the SDIO for wireless */
++&sdhci {
++ pinctrl-names = "default";
++ pinctrl-0 = <&emmc_gpio34>;
++ status = "okay";
++ bus-width = <4>;
++ non-removable;
++};
++
++/* SDHOST is used to drive the SD card */
++&sdhost {
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdhost_gpio48>;
++ status = "okay";
++ bus-width = <4>;
++};
diff --git a/kernel-aarch64-debug.config b/kernel-aarch64-debug.config
index bcc018653..4747bcd58 100644
--- a/kernel-aarch64-debug.config
+++ b/kernel-aarch64-debug.config
@@ -3004,6 +3004,7 @@ CONFIG_MMA7660=m
# CONFIG_MMA9553 is not set
# CONFIG_MMC35240 is not set
CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_BCM2835=m
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
@@ -3186,7 +3187,7 @@ CONFIG_MVEBU_MBUS=y
CONFIG_MVMDIO=m
CONFIG_MVNETA_BM_ENABLE=m
CONFIG_MVNETA=m
-# CONFIG_MVPP2 is not set
+CONFIG_MVPP2=m
# CONFIG_MV_XOR_V2 is not set
CONFIG_MV_XOR=y
CONFIG_MWAVE=m
@@ -4081,6 +4082,7 @@ CONFIG_QCOM_HIDMA_MGMT=m
CONFIG_QCOM_IRQ_COMBINER=y
CONFIG_QCOM_L2_PMU=y
# CONFIG_QCOM_Q6V5_PIL is not set
+CONFIG_QCOM_QDF2400_ERRATUM_0065=y
CONFIG_QCOM_QFPROM=m
CONFIG_QCOM_SMD=m
CONFIG_QCOM_SMD_RPM=m
@@ -4222,7 +4224,7 @@ CONFIG_REGULATOR_MAX77620=m
# CONFIG_REGULATOR_PV88060 is not set
# CONFIG_REGULATOR_PV88080 is not set
# CONFIG_REGULATOR_PV88090 is not set
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
CONFIG_REGULATOR_QCOM_RPM=m
CONFIG_REGULATOR_QCOM_SMD_RPM=m
CONFIG_REGULATOR_QCOM_SPMI=m
diff --git a/kernel-aarch64.config b/kernel-aarch64.config
index e2ffa03d1..7becd1ab7 100644
--- a/kernel-aarch64.config
+++ b/kernel-aarch64.config
@@ -2984,6 +2984,7 @@ CONFIG_MMA7660=m
# CONFIG_MMA9553 is not set
# CONFIG_MMC35240 is not set
CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_BCM2835=m
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
@@ -3165,7 +3166,7 @@ CONFIG_MVEBU_MBUS=y
CONFIG_MVMDIO=m
CONFIG_MVNETA_BM_ENABLE=m
CONFIG_MVNETA=m
-# CONFIG_MVPP2 is not set
+CONFIG_MVPP2=m
# CONFIG_MV_XOR_V2 is not set
CONFIG_MV_XOR=y
CONFIG_MWAVE=m
@@ -4059,6 +4060,7 @@ CONFIG_QCOM_HIDMA_MGMT=m
CONFIG_QCOM_IRQ_COMBINER=y
CONFIG_QCOM_L2_PMU=y
# CONFIG_QCOM_Q6V5_PIL is not set
+CONFIG_QCOM_QDF2400_ERRATUM_0065=y
CONFIG_QCOM_QFPROM=m
CONFIG_QCOM_SMD=m
CONFIG_QCOM_SMD_RPM=m
@@ -4200,7 +4202,7 @@ CONFIG_REGULATOR_MAX77620=m
# CONFIG_REGULATOR_PV88060 is not set
# CONFIG_REGULATOR_PV88080 is not set
# CONFIG_REGULATOR_PV88090 is not set
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
CONFIG_REGULATOR_QCOM_RPM=m
CONFIG_REGULATOR_QCOM_SMD_RPM=m
CONFIG_REGULATOR_QCOM_SPMI=m
diff --git a/kernel-armv7hl-debug.config b/kernel-armv7hl-debug.config
index d30434604..2ef6d5a0c 100644
--- a/kernel-armv7hl-debug.config
+++ b/kernel-armv7hl-debug.config
@@ -128,6 +128,7 @@ CONFIG_AEABI=y
CONFIG_AHCI_IMX=m
CONFIG_AHCI_MVEBU=m
# CONFIG_AHCI_QORIQ is not set
+CONFIG_AHCI_ST=m
CONFIG_AHCI_SUNXI=m
CONFIG_AHCI_TEGRA=m
# CONFIG_AIC79XX_BUILD_FIRMWARE is not set
@@ -224,7 +225,7 @@ CONFIG_ARCH_ROCKCHIP=y
# CONFIG_ARCH_SHMOBILE_MULTI is not set
# CONFIG_ARCH_SIRF is not set
# CONFIG_ARCH_SOCFPGA is not set
-# CONFIG_ARCH_STI is not set
+CONFIG_ARCH_STI=y
CONFIG_ARCH_SUNXI=y
# CONFIG_ARCH_TANGO is not set
CONFIG_ARCH_TEGRA_114_SOC=y
@@ -318,6 +319,7 @@ CONFIG_ARM_SCPI_POWER_DOMAIN=m
CONFIG_ARM_SCPI_PROTOCOL=m
CONFIG_ARM_SMMU=y
CONFIG_ARM_SP805_WATCHDOG=m
+CONFIG_ARM_STI_CPUFREQ=m
CONFIG_ARM_TEGRA124_CPUFREQ=m
# CONFIG_ARM_TEGRA20_CPUFREQ is not set
CONFIG_ARM_TEGRA_DEVFREQ=m
@@ -1509,6 +1511,7 @@ CONFIG_DWMAC_GENERIC=m
# CONFIG_DWMAC_IPQ806X is not set
CONFIG_DWMAC_MESON=m
CONFIG_DWMAC_ROCKCHIP=m
+CONFIG_DWMAC_STI=m
CONFIG_DWMAC_SUNXI=m
CONFIG_DW_WATCHDOG=m
CONFIG_DYNAMIC_DEBUG=y
@@ -2069,6 +2072,7 @@ CONFIG_HW_RANDOM_MSM=m
CONFIG_HW_RANDOM_MXC_RNGA=m
CONFIG_HW_RANDOM_OMAP3_ROM=m
CONFIG_HW_RANDOM_OMAP=m
+CONFIG_HW_RANDOM_ST=m
CONFIG_HW_RANDOM_TIMERIOMEM=m
CONFIG_HW_RANDOM_TPM=m
CONFIG_HW_RANDOM_VIRTIO=m
@@ -2150,6 +2154,7 @@ CONFIG_I2C_SIMTEC=m
# CONFIG_I2C_SIS96X is not set
CONFIG_I2C_SLAVE_EEPROM=m
CONFIG_I2C_SLAVE=y
+CONFIG_I2C_ST=m
CONFIG_I2C_STUB=m
CONFIG_I2C_SUN6I_P2WI=m
# CONFIG_I2C_TAOS_EVM is not set
@@ -2732,6 +2737,7 @@ CONFIG_KEYBOARD_PXA27x=y
CONFIG_KEYBOARD_SAMSUNG=m
# CONFIG_KEYBOARD_SH_KEYSC is not set
CONFIG_KEYBOARD_SNVS_PWRKEY=m
+CONFIG_KEYBOARD_ST_KEYSCAN=m
CONFIG_KEYBOARD_STMPE=m
# CONFIG_KEYBOARD_STOWAWAY is not set
CONFIG_KEYBOARD_SUN4I_LRADC=m
@@ -3221,6 +3227,7 @@ CONFIG_MMA7660=m
# CONFIG_MMA9553 is not set
# CONFIG_MMC35240 is not set
CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_BCM2835=m
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
@@ -3261,6 +3268,7 @@ CONFIG_MMC_SDHCI_PXAV2=m
CONFIG_MMC_SDHCI_PXAV3=m
CONFIG_MMC_SDHCI_S3C_DMA=y
CONFIG_MMC_SDHCI_S3C=m
+CONFIG_MMC_SDHCI_ST=m
CONFIG_MMC_SDHCI_TEGRA=m
CONFIG_MMC_SDRICOH_CS=m
CONFIG_MMC_SPI=m
@@ -4211,6 +4219,8 @@ CONFIG_PHY_EXYNOS_MIPI_VIDEO=m
CONFIG_PHY_EXYNOS_PCIE=y
CONFIG_PHYLIB=y
CONFIG_PHY_MESON8B_USB2=m
+CONFIG_PHY_MIPHY28LP=m
+# CONFIG_PHY_MIPHY365X is not set
CONFIG_PHY_MVEBU_SATA=y
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
@@ -4226,6 +4236,8 @@ CONFIG_PHY_ROCKCHIP_PCIE=m
CONFIG_PHY_ROCKCHIP_TYPEC=m
CONFIG_PHY_ROCKCHIP_USB=m
CONFIG_PHY_SAMSUNG_USB2=m
+CONFIG_PHY_STIH407_USB=m
+# CONFIG_PHY_STIH41X_USB is not set
# CONFIG_PHY_ST_SPEAR1310_MIPHY is not set
# CONFIG_PHY_ST_SPEAR1340_MIPHY is not set
CONFIG_PHY_SUN4I_USB=m
@@ -4317,6 +4329,7 @@ CONFIG_POWER_RESET_IMX=y
CONFIG_POWER_RESET_MSM=y
# CONFIG_POWER_RESET_QNAP is not set
CONFIG_POWER_RESET_RESTART=y
+CONFIG_POWER_RESET_ST=y
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y
CONFIG_POWER_RESET_VERSATILE=y
@@ -4383,6 +4396,7 @@ CONFIG_PWM_OMAP_DMTIMER=m
# CONFIG_PWM_PCA9685 is not set
CONFIG_PWM_ROCKCHIP=m
CONFIG_PWM_SAMSUNG=m
+CONFIG_PWM_STI=m
# CONFIG_PWM_STMPE is not set
CONFIG_PWM_SUN4I=m
CONFIG_PWM_SYSFS=y
@@ -4488,6 +4502,7 @@ CONFIG_RC_DECODERS=y
CONFIG_RC_DEVICES=y
CONFIG_RC_LOOPBACK=m
CONFIG_RC_MAP=m
+CONFIG_RC_ST=m
CONFIG_RCU_CPU_STALL_TIMEOUT=60
# CONFIG_RCU_EQS_DEBUG is not set
# CONFIG_RCU_EXPERT is not set
@@ -4565,7 +4580,7 @@ CONFIG_REGULATOR_PFUZE100=m
CONFIG_REGULATOR_PV88060=m
# CONFIG_REGULATOR_PV88080 is not set
CONFIG_REGULATOR_PV88090=m
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
CONFIG_REGULATOR_QCOM_RPM=m
CONFIG_REGULATOR_QCOM_SMD_RPM=m
CONFIG_REGULATOR_QCOM_SPMI=m
@@ -4757,6 +4772,7 @@ CONFIG_RTC_DRV_S5M=m
# CONFIG_RTC_DRV_SA1100 is not set
CONFIG_RTC_DRV_SNVS=m
CONFIG_RTC_DRV_STK17TA8=m
+CONFIG_RTC_DRV_ST_LPC=m
# CONFIG_RTC_DRV_SUN6I is not set
CONFIG_RTC_DRV_SUNXI=m
CONFIG_RTC_DRV_TEGRA=m
@@ -5540,7 +5556,8 @@ CONFIG_SND_SOC_SPDIF=m
# CONFIG_SND_SOC_SSM4567 is not set
# CONFIG_SND_SOC_STA32X is not set
# CONFIG_SND_SOC_STA350 is not set
-# CONFIG_SND_SOC_STI_SAS is not set
+CONFIG_SND_SOC_STI=m
+CONFIG_SND_SOC_STI_SAS=m
CONFIG_SND_SOC_STORM=m
# CONFIG_SND_SOC_TAS2552 is not set
# CONFIG_SND_SOC_TAS5086 is not set
@@ -5652,6 +5669,9 @@ CONFIG_SOC_IMX7D=y
# CONFIG_SOC_LS1021A is not set
CONFIG_SOC_OMAP3430=y
CONFIG_SOC_OMAP5=y
+CONFIG_SOC_STIH407=y
+# CONFIG_SOC_STIH415 is not set
+# CONFIG_SOC_STIH416 is not set
CONFIG_SOC_TI81XX=y
# CONFIG_SOC_TI is not set
# CONFIG_SOC_VF610 is not set
@@ -5702,6 +5722,7 @@ CONFIG_SPI_ROCKCHIP=m
CONFIG_SPI_S3C64XX=m
# CONFIG_SPI_SC18IS602 is not set
CONFIG_SPI_SPIDEV=m
+CONFIG_SPI_ST_SSC4=m
CONFIG_SPI_SUN4I=m
CONFIG_SPI_SUN6I=m
CONFIG_SPI_TEGRA114=m
@@ -5746,9 +5767,12 @@ CONFIG_STANDALONE=y
# CONFIG_STATIC_USERMODEHELPER is not set
CONFIG_STE10XP=m
# CONFIG_STE_MODEM_RPROC is not set
+CONFIG_ST_FDMA=m
+CONFIG_STI_MBOX=m
CONFIG_STK3310=m
# CONFIG_STK8312 is not set
# CONFIG_STK8BA50 is not set
+CONFIG_ST_LPC_WATCHDOG=m
# CONFIG_STM_DUMMY is not set
# CONFIG_STM is not set
CONFIG_STMMAC_ETH=m
@@ -5757,11 +5781,15 @@ CONFIG_STMMAC_PLATFORM=m
CONFIG_STMPE_I2C=y
CONFIG_STMPE_SPI=y
# CONFIG_STM_SOURCE_CONSOLE is not set
+CONFIG_ST_REMOTEPROC=m
CONFIG_STRICT_DEVMEM=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_STRICT_MODULE_RWX=y
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_STRIP is not set
+CONFIG_ST_THERMAL=m
+CONFIG_ST_THERMAL_MEMMAP=m
+# CONFIG_ST_THERMAL_SYSCFG is not set
CONFIG_SUN4I_EMAC=m
# CONFIG_SUN50I_A64_CCU is not set
CONFIG_SUN5I_CCU=y
@@ -6168,6 +6196,7 @@ CONFIG_USB_DWC3=m
CONFIG_USB_DWC3_OF_SIMPLE=m
CONFIG_USB_DWC3_OMAP=m
CONFIG_USB_DWC3_PCI=m
+CONFIG_USB_DWC3_ST=m
CONFIG_USB_DWC3_ULPI=y
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_EG20T is not set
@@ -6175,6 +6204,7 @@ CONFIG_USB_EHCI_EXYNOS=m
CONFIG_USB_EHCI_HCD_OMAP=m
CONFIG_USB_EHCI_HCD_ORION=m
CONFIG_USB_EHCI_HCD_PLATFORM=m
+CONFIG_USB_EHCI_HCD_STI=m
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_MSM=m
# CONFIG_USB_EHCI_MV is not set
@@ -6344,6 +6374,7 @@ CONFIG_USB_OHCI_HCD_OMAP3=m
CONFIG_USB_OHCI_HCD_PCI=y
CONFIG_USB_OHCI_HCD_PLATFORM=m
# CONFIG_USB_OHCI_HCD_SSB is not set
+CONFIG_USB_OHCI_HCD_STI=m
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
# CONFIG_USB_OTG_FSM is not set
@@ -6632,6 +6663,13 @@ CONFIG_VIDEO_SAMSUNG_S5P_MFC=m
# CONFIG_VIDEO_SH_VEU is not set
CONFIG_VIDEO_SOLO6X10=m
CONFIG_VIDEO_SR030PC30=m
+CONFIG_VIDEO_STI_BDISP=m
+CONFIG_VIDEO_STI_DELTA_DRIVER=m
+CONFIG_VIDEO_STI_DELTA=m
+CONFIG_VIDEO_STI_DELTA_MJPEG=y
+CONFIG_VIDEO_STI_HDMI_CEC=m
+# CONFIG_VIDEO_STI_HVA_DEBUGFS is not set
+CONFIG_VIDEO_STI_HVA=m
CONFIG_VIDEO_STK1160_AC97=y
CONFIG_VIDEO_STK1160_COMMON=m
CONFIG_VIDEO_STK1160=m
diff --git a/kernel-armv7hl-lpae-debug.config b/kernel-armv7hl-lpae-debug.config
index 0c521f1a6..669d9ceee 100644
--- a/kernel-armv7hl-lpae-debug.config
+++ b/kernel-armv7hl-lpae-debug.config
@@ -3092,6 +3092,7 @@ CONFIG_MMA7660=m
# CONFIG_MMA9553 is not set
# CONFIG_MMC35240 is not set
CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_BCM2835=m
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
@@ -4315,7 +4316,7 @@ CONFIG_REGULATOR_PFUZE100=m
CONFIG_REGULATOR_PV88060=m
# CONFIG_REGULATOR_PV88080 is not set
CONFIG_REGULATOR_PV88090=m
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
# CONFIG_REGULATOR_QCOM_SPMI is not set
CONFIG_REGULATOR_RK808=m
CONFIG_REGULATOR_S2MPA01=m
diff --git a/kernel-armv7hl-lpae.config b/kernel-armv7hl-lpae.config
index fe7ed9997..bc8fed4e7 100644
--- a/kernel-armv7hl-lpae.config
+++ b/kernel-armv7hl-lpae.config
@@ -3072,6 +3072,7 @@ CONFIG_MMA7660=m
# CONFIG_MMA9553 is not set
# CONFIG_MMC35240 is not set
CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_BCM2835=m
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
@@ -4293,7 +4294,7 @@ CONFIG_REGULATOR_PFUZE100=m
CONFIG_REGULATOR_PV88060=m
# CONFIG_REGULATOR_PV88080 is not set
CONFIG_REGULATOR_PV88090=m
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
# CONFIG_REGULATOR_QCOM_SPMI is not set
CONFIG_REGULATOR_RK808=m
CONFIG_REGULATOR_S2MPA01=m
diff --git a/kernel-armv7hl.config b/kernel-armv7hl.config
index 188c19a1d..6550ab4d4 100644
--- a/kernel-armv7hl.config
+++ b/kernel-armv7hl.config
@@ -128,6 +128,7 @@ CONFIG_AEABI=y
CONFIG_AHCI_IMX=m
CONFIG_AHCI_MVEBU=m
# CONFIG_AHCI_QORIQ is not set
+CONFIG_AHCI_ST=m
CONFIG_AHCI_SUNXI=m
CONFIG_AHCI_TEGRA=m
# CONFIG_AIC79XX_BUILD_FIRMWARE is not set
@@ -224,7 +225,7 @@ CONFIG_ARCH_ROCKCHIP=y
# CONFIG_ARCH_SHMOBILE_MULTI is not set
# CONFIG_ARCH_SIRF is not set
# CONFIG_ARCH_SOCFPGA is not set
-# CONFIG_ARCH_STI is not set
+CONFIG_ARCH_STI=y
CONFIG_ARCH_SUNXI=y
# CONFIG_ARCH_TANGO is not set
CONFIG_ARCH_TEGRA_114_SOC=y
@@ -317,6 +318,7 @@ CONFIG_ARM_SCPI_POWER_DOMAIN=m
CONFIG_ARM_SCPI_PROTOCOL=m
CONFIG_ARM_SMMU=y
CONFIG_ARM_SP805_WATCHDOG=m
+CONFIG_ARM_STI_CPUFREQ=m
CONFIG_ARM_TEGRA124_CPUFREQ=m
# CONFIG_ARM_TEGRA20_CPUFREQ is not set
CONFIG_ARM_TEGRA_DEVFREQ=m
@@ -1499,6 +1501,7 @@ CONFIG_DWMAC_GENERIC=m
# CONFIG_DWMAC_IPQ806X is not set
CONFIG_DWMAC_MESON=m
CONFIG_DWMAC_ROCKCHIP=m
+CONFIG_DWMAC_STI=m
CONFIG_DWMAC_SUNXI=m
CONFIG_DW_WATCHDOG=m
CONFIG_DYNAMIC_DEBUG=y
@@ -2052,6 +2055,7 @@ CONFIG_HW_RANDOM_MSM=m
CONFIG_HW_RANDOM_MXC_RNGA=m
CONFIG_HW_RANDOM_OMAP3_ROM=m
CONFIG_HW_RANDOM_OMAP=m
+CONFIG_HW_RANDOM_ST=m
CONFIG_HW_RANDOM_TIMERIOMEM=m
CONFIG_HW_RANDOM_TPM=m
CONFIG_HW_RANDOM_VIRTIO=m
@@ -2133,6 +2137,7 @@ CONFIG_I2C_SIMTEC=m
# CONFIG_I2C_SIS96X is not set
CONFIG_I2C_SLAVE_EEPROM=m
CONFIG_I2C_SLAVE=y
+CONFIG_I2C_ST=m
CONFIG_I2C_STUB=m
CONFIG_I2C_SUN6I_P2WI=m
# CONFIG_I2C_TAOS_EVM is not set
@@ -2713,6 +2718,7 @@ CONFIG_KEYBOARD_PXA27x=y
CONFIG_KEYBOARD_SAMSUNG=m
# CONFIG_KEYBOARD_SH_KEYSC is not set
CONFIG_KEYBOARD_SNVS_PWRKEY=m
+CONFIG_KEYBOARD_ST_KEYSCAN=m
CONFIG_KEYBOARD_STMPE=m
# CONFIG_KEYBOARD_STOWAWAY is not set
CONFIG_KEYBOARD_SUN4I_LRADC=m
@@ -3201,6 +3207,7 @@ CONFIG_MMA7660=m
# CONFIG_MMA9553 is not set
# CONFIG_MMC35240 is not set
CONFIG_MMC_ARMMMCI=m
+CONFIG_MMC_BCM2835=m
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
@@ -3241,6 +3248,7 @@ CONFIG_MMC_SDHCI_PXAV2=m
CONFIG_MMC_SDHCI_PXAV3=m
CONFIG_MMC_SDHCI_S3C_DMA=y
CONFIG_MMC_SDHCI_S3C=m
+CONFIG_MMC_SDHCI_ST=m
CONFIG_MMC_SDHCI_TEGRA=m
CONFIG_MMC_SDRICOH_CS=m
CONFIG_MMC_SPI=m
@@ -4190,6 +4198,8 @@ CONFIG_PHY_EXYNOS_MIPI_VIDEO=m
CONFIG_PHY_EXYNOS_PCIE=y
CONFIG_PHYLIB=y
CONFIG_PHY_MESON8B_USB2=m
+CONFIG_PHY_MIPHY28LP=m
+# CONFIG_PHY_MIPHY365X is not set
CONFIG_PHY_MVEBU_SATA=y
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
@@ -4205,6 +4215,8 @@ CONFIG_PHY_ROCKCHIP_PCIE=m
CONFIG_PHY_ROCKCHIP_TYPEC=m
CONFIG_PHY_ROCKCHIP_USB=m
CONFIG_PHY_SAMSUNG_USB2=m
+CONFIG_PHY_STIH407_USB=m
+# CONFIG_PHY_STIH41X_USB is not set
# CONFIG_PHY_ST_SPEAR1310_MIPHY is not set
# CONFIG_PHY_ST_SPEAR1340_MIPHY is not set
CONFIG_PHY_SUN4I_USB=m
@@ -4296,6 +4308,7 @@ CONFIG_POWER_RESET_IMX=y
CONFIG_POWER_RESET_MSM=y
# CONFIG_POWER_RESET_QNAP is not set
CONFIG_POWER_RESET_RESTART=y
+CONFIG_POWER_RESET_ST=y
CONFIG_POWER_RESET_SYSCON_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y
CONFIG_POWER_RESET_VERSATILE=y
@@ -4361,6 +4374,7 @@ CONFIG_PWM_OMAP_DMTIMER=m
# CONFIG_PWM_PCA9685 is not set
CONFIG_PWM_ROCKCHIP=m
CONFIG_PWM_SAMSUNG=m
+CONFIG_PWM_STI=m
# CONFIG_PWM_STMPE is not set
CONFIG_PWM_SUN4I=m
CONFIG_PWM_SYSFS=y
@@ -4466,6 +4480,7 @@ CONFIG_RC_DECODERS=y
CONFIG_RC_DEVICES=y
CONFIG_RC_LOOPBACK=m
CONFIG_RC_MAP=m
+CONFIG_RC_ST=m
CONFIG_RCU_CPU_STALL_TIMEOUT=60
# CONFIG_RCU_EQS_DEBUG is not set
# CONFIG_RCU_EXPERT is not set
@@ -4543,7 +4558,7 @@ CONFIG_REGULATOR_PFUZE100=m
CONFIG_REGULATOR_PV88060=m
# CONFIG_REGULATOR_PV88080 is not set
CONFIG_REGULATOR_PV88090=m
-CONFIG_REGULATOR_PWM=m
+CONFIG_REGULATOR_PWM=y
CONFIG_REGULATOR_QCOM_RPM=m
CONFIG_REGULATOR_QCOM_SMD_RPM=m
CONFIG_REGULATOR_QCOM_SPMI=m
@@ -4735,6 +4750,7 @@ CONFIG_RTC_DRV_S5M=m
# CONFIG_RTC_DRV_SA1100 is not set
CONFIG_RTC_DRV_SNVS=m
CONFIG_RTC_DRV_STK17TA8=m
+CONFIG_RTC_DRV_ST_LPC=m
# CONFIG_RTC_DRV_SUN6I is not set
CONFIG_RTC_DRV_SUNXI=m
CONFIG_RTC_DRV_TEGRA=m
@@ -5517,7 +5533,8 @@ CONFIG_SND_SOC_SPDIF=m
# CONFIG_SND_SOC_SSM4567 is not set
# CONFIG_SND_SOC_STA32X is not set
# CONFIG_SND_SOC_STA350 is not set
-# CONFIG_SND_SOC_STI_SAS is not set
+CONFIG_SND_SOC_STI=m
+CONFIG_SND_SOC_STI_SAS=m
CONFIG_SND_SOC_STORM=m
# CONFIG_SND_SOC_TAS2552 is not set
# CONFIG_SND_SOC_TAS5086 is not set
@@ -5629,6 +5646,9 @@ CONFIG_SOC_IMX7D=y
# CONFIG_SOC_LS1021A is not set
CONFIG_SOC_OMAP3430=y
CONFIG_SOC_OMAP5=y
+CONFIG_SOC_STIH407=y
+# CONFIG_SOC_STIH415 is not set
+# CONFIG_SOC_STIH416 is not set
CONFIG_SOC_TI81XX=y
# CONFIG_SOC_TI is not set
# CONFIG_SOC_VF610 is not set
@@ -5679,6 +5699,7 @@ CONFIG_SPI_ROCKCHIP=m
CONFIG_SPI_S3C64XX=m
# CONFIG_SPI_SC18IS602 is not set
CONFIG_SPI_SPIDEV=m
+CONFIG_SPI_ST_SSC4=m
CONFIG_SPI_SUN4I=m
CONFIG_SPI_SUN6I=m
CONFIG_SPI_TEGRA114=m
@@ -5723,9 +5744,12 @@ CONFIG_STANDALONE=y
# CONFIG_STATIC_USERMODEHELPER is not set
CONFIG_STE10XP=m
# CONFIG_STE_MODEM_RPROC is not set
+CONFIG_ST_FDMA=m
+CONFIG_STI_MBOX=m
CONFIG_STK3310=m
# CONFIG_STK8312 is not set
# CONFIG_STK8BA50 is not set
+CONFIG_ST_LPC_WATCHDOG=m
# CONFIG_STM_DUMMY is not set
# CONFIG_STM is not set
CONFIG_STMMAC_ETH=m
@@ -5734,11 +5758,15 @@ CONFIG_STMMAC_PLATFORM=m
CONFIG_STMPE_I2C=y
CONFIG_STMPE_SPI=y
# CONFIG_STM_SOURCE_CONSOLE is not set
+CONFIG_ST_REMOTEPROC=m
CONFIG_STRICT_DEVMEM=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_STRICT_MODULE_RWX=y
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_STRIP is not set
+CONFIG_ST_THERMAL=m
+CONFIG_ST_THERMAL_MEMMAP=m
+# CONFIG_ST_THERMAL_SYSCFG is not set
CONFIG_SUN4I_EMAC=m
# CONFIG_SUN50I_A64_CCU is not set
CONFIG_SUN5I_CCU=y
@@ -6145,6 +6173,7 @@ CONFIG_USB_DWC3=m
CONFIG_USB_DWC3_OF_SIMPLE=m
CONFIG_USB_DWC3_OMAP=m
CONFIG_USB_DWC3_PCI=m
+CONFIG_USB_DWC3_ST=m
CONFIG_USB_DWC3_ULPI=y
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_EG20T is not set
@@ -6152,6 +6181,7 @@ CONFIG_USB_EHCI_EXYNOS=m
CONFIG_USB_EHCI_HCD_OMAP=m
CONFIG_USB_EHCI_HCD_ORION=m
CONFIG_USB_EHCI_HCD_PLATFORM=m
+CONFIG_USB_EHCI_HCD_STI=m
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_MSM=m
# CONFIG_USB_EHCI_MV is not set
@@ -6321,6 +6351,7 @@ CONFIG_USB_OHCI_HCD_OMAP3=m
CONFIG_USB_OHCI_HCD_PCI=y
CONFIG_USB_OHCI_HCD_PLATFORM=m
# CONFIG_USB_OHCI_HCD_SSB is not set
+CONFIG_USB_OHCI_HCD_STI=m
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
# CONFIG_USB_OTG_FSM is not set
@@ -6609,6 +6640,13 @@ CONFIG_VIDEO_SAMSUNG_S5P_MFC=m
# CONFIG_VIDEO_SH_VEU is not set
CONFIG_VIDEO_SOLO6X10=m
CONFIG_VIDEO_SR030PC30=m
+CONFIG_VIDEO_STI_BDISP=m
+CONFIG_VIDEO_STI_DELTA_DRIVER=m
+CONFIG_VIDEO_STI_DELTA=m
+CONFIG_VIDEO_STI_DELTA_MJPEG=y
+CONFIG_VIDEO_STI_HDMI_CEC=m
+# CONFIG_VIDEO_STI_HVA_DEBUGFS is not set
+CONFIG_VIDEO_STI_HVA=m
CONFIG_VIDEO_STK1160_AC97=y
CONFIG_VIDEO_STK1160_COMMON=m
CONFIG_VIDEO_STK1160=m
diff --git a/kernel-i686-PAE.config b/kernel-i686-PAE.config
index cba70f84c..5368ca765 100644
--- a/kernel-i686-PAE.config
+++ b/kernel-i686-PAE.config
@@ -3077,7 +3077,6 @@ CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR=y
# CONFIG_MVIAC3_2 is not set
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-i686-PAEdebug.config b/kernel-i686-PAEdebug.config
index 1bb5ebb6c..8ebe7ac84 100644
--- a/kernel-i686-PAEdebug.config
+++ b/kernel-i686-PAEdebug.config
@@ -3097,7 +3097,6 @@ CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR=y
# CONFIG_MVIAC3_2 is not set
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-i686-debug.config b/kernel-i686-debug.config
index 952b46fee..fcc84298b 100644
--- a/kernel-i686-debug.config
+++ b/kernel-i686-debug.config
@@ -3097,7 +3097,6 @@ CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR=y
# CONFIG_MVIAC3_2 is not set
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-i686.config b/kernel-i686.config
index 2fa682913..3a16f7510 100644
--- a/kernel-i686.config
+++ b/kernel-i686.config
@@ -3077,7 +3077,6 @@ CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR=y
# CONFIG_MVIAC3_2 is not set
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-ppc64-debug.config b/kernel-ppc64-debug.config
index cc7331921..32694d4cb 100644
--- a/kernel-ppc64-debug.config
+++ b/kernel-ppc64-debug.config
@@ -2951,7 +2951,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-ppc64.config b/kernel-ppc64.config
index 1d7d6b227..672225cba 100644
--- a/kernel-ppc64.config
+++ b/kernel-ppc64.config
@@ -2929,7 +2929,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-ppc64le-debug.config b/kernel-ppc64le-debug.config
index d19d366be..964132952 100644
--- a/kernel-ppc64le-debug.config
+++ b/kernel-ppc64le-debug.config
@@ -2896,7 +2896,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-ppc64le.config b/kernel-ppc64le.config
index 987d2e1c0..1d4ca8894 100644
--- a/kernel-ppc64le.config
+++ b/kernel-ppc64le.config
@@ -2874,7 +2874,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-ppc64p7-debug.config b/kernel-ppc64p7-debug.config
index f62c03e85..7f2596c63 100644
--- a/kernel-ppc64p7-debug.config
+++ b/kernel-ppc64p7-debug.config
@@ -2895,7 +2895,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-ppc64p7.config b/kernel-ppc64p7.config
index d34c46840..cf065cb3d 100644
--- a/kernel-ppc64p7.config
+++ b/kernel-ppc64p7.config
@@ -2873,7 +2873,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-s390x-debug.config b/kernel-s390x-debug.config
index 6f7436a7f..28df4691d 100644
--- a/kernel-s390x-debug.config
+++ b/kernel-s390x-debug.config
@@ -2828,7 +2828,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-s390x.config b/kernel-s390x.config
index 8882f74f7..d234f2a88 100644
--- a/kernel-s390x.config
+++ b/kernel-s390x.config
@@ -2806,7 +2806,6 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-x86_64-debug.config b/kernel-x86_64-debug.config
index ca3813820..dba8cf632 100644
--- a/kernel-x86_64-debug.config
+++ b/kernel-x86_64-debug.config
@@ -3121,7 +3121,6 @@ CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR=y
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel-x86_64.config b/kernel-x86_64.config
index 123b71017..5fd76079a 100644
--- a/kernel-x86_64.config
+++ b/kernel-x86_64.config
@@ -3101,7 +3101,6 @@ CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR=y
CONFIG_MVMDIO=m
-# CONFIG_MVPP2 is not set
CONFIG_MWAVE=m
CONFIG_MWIFIEX=m
CONFIG_MWIFIEX_PCIE=m
diff --git a/kernel.spec b/kernel.spec
index 9d9fc831b..8e25897db 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -75,9 +75,9 @@ Summary: The Linux kernel
# The next upstream release sublevel (base_sublevel+1)
%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
# The rc snapshot level
-%global rcrev 1
+%global rcrev 2
# The git snapshot level
-%define gitrev 3
+%define gitrev 0
# Set rpm version accordingly
%define rpmversion 4.%{upstream_sublevel}.0
%endif
@@ -133,7 +133,7 @@ Summary: The Linux kernel
# Set debugbuildsenabled to 1 for production (build separate debug kernels)
# and 0 for rawhide (all kernels are debug kernels).
# See also 'make debug' and 'make release'.
-%define debugbuildsenabled 0
+%define debugbuildsenabled 1
# Want to build a vanilla kernel build without any non-upstream patches?
%define with_vanilla %{?_without_vanilla: 0} %{?!_without_vanilla: 1}
@@ -420,7 +420,7 @@ BuildRequires: binutils-%{_build_arch}-linux-gnu, gcc-%{_build_arch}-linux-gnu
%define cross_opts CROSS_COMPILE=%{_build_arch}-linux-gnu-
%endif
-Source0: ftp://ftp.kernel.org/pub/linux/kernel/v4.x/linux-%{kversion}.tar.xz
+Source0: https://www.kernel.org/pub/linux/kernel/v4.x/linux-%{kversion}.tar.xz
Source10: perf-man-%{kversion}.tar.gz
Source11: x509.genkey
@@ -547,6 +547,9 @@ Patch430: bcm2837-initial-support.patch
# http://www.spinics.net/lists/dri-devel/msg132235.html
Patch433: drm-vc4-Fix-OOPSes-from-trying-to-cache-a-partially-constructed-BO..patch
+# bcm283x mmc for wifi http://www.spinics.net/lists/arm-kernel/msg567077.html
+Patch434: bcm283x-mmc-bcm2835.patch
+
# Upstream fixes for i2c/serial/ethernet MAC addresses
Patch435: bcm283x-fixes.patch
@@ -613,9 +616,6 @@ Patch665: netfilter-x_tables-deal-with-bogus-nextoffset-values.patch
# grabbed from mailing list
Patch667: v3-Revert-tty-serial-pl011-add-ttyAMA-for-matching-pl011-console.patch
-# CVE-2017-2636 rhbz 1430049
-Patch668: 0001-tty-n_hdlc-get-rid-of-racy-n_hdlc.tbuf.patch
-
# END OF PATCH DEFINITIONS
%endif
@@ -2183,6 +2183,18 @@ fi
#
#
%changelog
+* Mon Mar 13 2017 Laura Abbott <labbott@fedoraproject.org> - 4.11.0-0.rc2.git0.1
+- Linux v4.11-rc2
+
+* Mon Mar 13 2017 Laura Abbott <labbott@fedoraproject.org>
+- Disable debugging options.
+
+* Sun Mar 12 2017 Peter Robinson <pbrobinson@fedoraproject.org>
+- Update kernel source location now ftp is retired
+- Enable STi h407 SoC
+- Minor ARM config cleanups
+- bcm283x mmc driver improvements
+
* Fri Mar 10 2017 Laura Abbott <labbott@fedoraproject.org> - 4.11.0-0.rc1.git3.1
- Linux v4.11-rc1-136-gc1aa905
diff --git a/scripts/rawhide-rc.sh b/scripts/rawhide-rc.sh
index 51a3b09f2..5982403e7 100755
--- a/scripts/rawhide-rc.sh
+++ b/scripts/rawhide-rc.sh
@@ -3,6 +3,13 @@
source scripts/kernel-version.sh
+klist -s
+if [ ! $? -eq 0 ]; then
+ echo "klist couldn't read the credential cache."
+ echo "Do you need to fix your kerberos tokens?"
+ exit 1
+fi
+
make release
# fixup the release because rpmdev-bumpspec *sigh*
scripts/fixup-bumpspec.sh
diff --git a/sources b/sources
index 7e8b5a82d..b1cbfe06f 100644
--- a/sources
+++ b/sources
@@ -1,4 +1,3 @@
SHA512 (linux-4.10.tar.xz) = c3690125a8402df638095bd98a613fcf1a257b81de7611c84711d315cd11e2634ab4636302b3742aedf1e3ba9ce0fea53fe8c7d48e37865d8ee5db3565220d90
SHA512 (perf-man-4.10.tar.gz) = 2c830e06f47211d70a8330961487af73a8bc01073019475e6b6131d3bb8c95658b77ca0ae5f1b44371accf103658bc5a3a4366b3e017a4088a8fd408dd6867e8
-SHA512 (patch-4.11-rc1.xz) = a7b11ee0f2faedb2415effd3ad49e5309e30b3e57a49106a18d21628f4d08b988112086b080d4620bd9e00b07ec2751a5bfe05c348cfd343020c39d4d18faa81
-SHA512 (patch-4.11-rc1-git3.xz) = c33bcec6f12d65b5c5df1aa29278cfad4932e204b83319ea4dca73feddb8a7e754b29abb81274301af6e5e6998be5c59f38df54180bb3b41584d357460f99d3d
+SHA512 (patch-4.11-rc2.xz) = 01fcc1e67bba67a1bfef74acea99a52b489cdaf3f6feb59dd4e7719a3a9c07ff3131a754823a283ef50535d730929b4ddd31fa24c6bda2c68c3ad41283db49ec