diff options
author | Justin M. Forbes <jforbes@redhat.com> | 2017-02-20 13:20:23 -0600 |
---|---|---|
committer | Justin M. Forbes <jforbes@redhat.com> | 2017-02-20 13:20:23 -0600 |
commit | a98ed5ce60a3a27dd83f47a33d8993eaaef3685e (patch) | |
tree | 2390fe67f35cf364436421355cf15e7fab72e294 /bcm283x-fixes.patch | |
parent | 7a011b1bac9aea1fdb059ef767f1445c7062b79d (diff) | |
download | kernel-a98ed5ce60a3a27dd83f47a33d8993eaaef3685e.tar.gz kernel-a98ed5ce60a3a27dd83f47a33d8993eaaef3685e.tar.xz kernel-a98ed5ce60a3a27dd83f47a33d8993eaaef3685e.zip |
Linux 4.10 rebase for stabilization
Diffstat (limited to 'bcm283x-fixes.patch')
-rw-r--r-- | bcm283x-fixes.patch | 1160 |
1 files changed, 207 insertions, 953 deletions
diff --git a/bcm283x-fixes.patch b/bcm283x-fixes.patch index 07abd3aa4..fcddac501 100644 --- a/bcm283x-fixes.patch +++ b/bcm283x-fixes.patch @@ -1,964 +1,218 @@ -From e2474541032db65d02bf88b6a8c2f954654b443f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:08 +0200 -Subject: [PATCH 31155/39886] i2c: bcm2835: Fix hang for writing messages - larger than 16 bytes +From patchwork Sun Jan 29 18:40:59 2017 +Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Writing messages larger than the FIFO size results in a hang, rendering -the machine unusable. This is because the RXD status flag is set on the -first interrupt which results in bcm2835_drain_rxfifo() stealing bytes -from the buffer. The controller continues to trigger interrupts waiting -for the missing bytes, but bcm2835_fill_txfifo() has none to give. -In this situation wait_for_completion_timeout() apparently is unable to -stop the madness. - -The BCM2835 ARM Peripherals datasheet has this to say about the flags: - TXD: is set when the FIFO has space for at least one byte of data. - RXD: is set when the FIFO contains at least one byte of data. - TXW: is set during a write transfer and the FIFO is less than full. - RXR: is set during a read transfer and the FIFO is or more full. - -Implementing the logic from the downstream i2c-bcm2708 driver solved -the hang problem. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> -Reviewed-by: Eric Anholt <eric@anholt.net> -Reviewed-by: Martin Sperl <kernel@martin.sperl.org> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> ---- - drivers/i2c/busses/i2c-bcm2835.c | 22 ++++++++++++++-------- - 1 file changed, 14 insertions(+), 8 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index d4f3239..f283b71 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -64,6 +64,7 @@ struct bcm2835_i2c_dev { - int irq; - struct i2c_adapter adapter; - struct completion completion; -+ struct i2c_msg *curr_msg; - u32 msg_err; - u8 *msg_buf; - size_t msg_buf_remaining; -@@ -126,14 +127,13 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) - return IRQ_HANDLED; - } - -- if (val & BCM2835_I2C_S_RXD) { -- bcm2835_drain_rxfifo(i2c_dev); -- if (!(val & BCM2835_I2C_S_DONE)) -- return IRQ_HANDLED; -- } -- - if (val & BCM2835_I2C_S_DONE) { -- if (i2c_dev->msg_buf_remaining) -+ if (i2c_dev->curr_msg->flags & I2C_M_RD) { -+ bcm2835_drain_rxfifo(i2c_dev); -+ val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); -+ } -+ -+ if ((val & BCM2835_I2C_S_RXD) || i2c_dev->msg_buf_remaining) - i2c_dev->msg_err = BCM2835_I2C_S_LEN; - else - i2c_dev->msg_err = 0; -@@ -141,11 +141,16 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) - return IRQ_HANDLED; - } - -- if (val & BCM2835_I2C_S_TXD) { -+ if (val & BCM2835_I2C_S_TXW) { - bcm2835_fill_txfifo(i2c_dev); - return IRQ_HANDLED; - } - -+ if (val & BCM2835_I2C_S_RXR) { -+ bcm2835_drain_rxfifo(i2c_dev); -+ return IRQ_HANDLED; -+ } -+ - return IRQ_NONE; - } - -@@ -155,6 +160,7 @@ static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, - u32 c; - unsigned long time_left; - -+ i2c_dev->curr_msg = msg; - i2c_dev->msg_buf = msg->buf; - i2c_dev->msg_buf_remaining = msg->len; - reinit_completion(&i2c_dev->completion); --- -2.9.3 - -From d4030d75c7cbb434b2a3e5f6af5065879d2615a5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:09 +0200 -Subject: [PATCH 31156/39886] i2c: bcm2835: Protect against unexpected TXW/RXR - interrupts -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -If an unexpected TXW or RXR interrupt occurs (msg_buf_remaining == 0), -the driver has no way to fill/drain the FIFO to stop the interrupts. -In this case the controller has to be disabled and the transfer -completed to avoid hang. - -(CLKT | ERR) and DONE interrupts are completed in their own paths, and -the controller is disabled in the transfer function after completion. -Unite the code paths and do disabling inside the interrupt routine. - -Clear interrupt status bits in the united completion path instead of -trying to do it on every interrupt which isn't necessary. -Only CLKT, ERR and DONE can be cleared that way. - -Add the status value to the error value in case of TXW/RXR errors to -distinguish them from the other S_LEN error. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> ---- - drivers/i2c/busses/i2c-bcm2835.c | 40 +++++++++++++++++++++++++++++++--------- - 1 file changed, 31 insertions(+), 9 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index f283b71..d2ba1a4 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -50,8 +50,6 @@ - #define BCM2835_I2C_S_CLKT BIT(9) - #define BCM2835_I2C_S_LEN BIT(10) /* Fake bit for SW error reporting */ - --#define BCM2835_I2C_BITMSK_S 0x03FF -- - #define BCM2835_I2C_CDIV_MIN 0x0002 - #define BCM2835_I2C_CDIV_MAX 0xFFFE - -@@ -111,20 +109,26 @@ static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) - } - } - -+/* -+ * Note about I2C_C_CLEAR on error: -+ * The I2C_C_CLEAR on errors will take some time to resolve -- if you were in -+ * non-idle state and I2C_C_READ, it sets an abort_rx flag and runs through -+ * the state machine to send a NACK and a STOP. Since we're setting CLEAR -+ * without I2CEN, that NACK will be hanging around queued up for next time -+ * we start the engine. -+ */ -+ - static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) - { - struct bcm2835_i2c_dev *i2c_dev = data; - u32 val, err; - - val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); -- val &= BCM2835_I2C_BITMSK_S; -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, val); - - err = val & (BCM2835_I2C_S_CLKT | BCM2835_I2C_S_ERR); - if (err) { - i2c_dev->msg_err = err; -- complete(&i2c_dev->completion); -- return IRQ_HANDLED; -+ goto complete; - } - - if (val & BCM2835_I2C_S_DONE) { -@@ -137,21 +141,38 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) - i2c_dev->msg_err = BCM2835_I2C_S_LEN; - else - i2c_dev->msg_err = 0; -- complete(&i2c_dev->completion); -- return IRQ_HANDLED; -+ goto complete; - } - - if (val & BCM2835_I2C_S_TXW) { -+ if (!i2c_dev->msg_buf_remaining) { -+ i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; -+ goto complete; -+ } -+ - bcm2835_fill_txfifo(i2c_dev); - return IRQ_HANDLED; - } - - if (val & BCM2835_I2C_S_RXR) { -+ if (!i2c_dev->msg_buf_remaining) { -+ i2c_dev->msg_err = val | BCM2835_I2C_S_LEN; -+ goto complete; -+ } -+ - bcm2835_drain_rxfifo(i2c_dev); - return IRQ_HANDLED; - } - - return IRQ_NONE; -+ -+complete: -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, BCM2835_I2C_S_CLKT | -+ BCM2835_I2C_S_ERR | BCM2835_I2C_S_DONE); -+ complete(&i2c_dev->completion); -+ -+ return IRQ_HANDLED; - } - - static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, -@@ -181,8 +202,9 @@ static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, - - time_left = wait_for_completion_timeout(&i2c_dev->completion, - BCM2835_I2C_TIMEOUT); -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); - if (!time_left) { -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, -+ BCM2835_I2C_C_CLEAR); - dev_err(i2c_dev->dev, "i2c transfer timed out\n"); - return -ETIMEDOUT; - } --- -2.9.3 - -From 23c9540b3ad1d7473fe40df80074d0fb0bf04869 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:10 +0200 -Subject: [PATCH 31157/39886] i2c: bcm2835: Use dev_dbg logging on transfer - errors -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Writing to an AT24C32 generates on average 2x i2c transfer errors per -32-byte page write. Which amounts to a lot for a 4k write. This is due -to the fact that the chip doesn't respond during it's internal write -cycle when the at24 driver tries and retries the next write. -Only a handful drivers use dev_err() on transfer error, so switch to -dev_dbg() instead. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> +Content-Transfer-Encoding: 7bit +Subject: [v2] ARM: bcm2835: dts: fix uart0 pinctrl node names +From: Baruch Siach <baruch@tkos.co.il> +X-Patchwork-Id: 9544261 +Message-Id: <f37d02c769d0e2b6db2529cafb86b5fdd1e09a94.1485715259.git.baruch@tkos.co.il> +To: Stephen Warren <swarren@wwwdotorg.org>, Lee Jones <lee@kernel.org>, + Eric Anholt <eric@anholt.net> +Cc: Baruch Siach <baruch@tkos.co.il>, linux-rpi-kernel@lists.infradead.org, + linux-arm-kernel@lists.infradead.org +Date: Sun, 29 Jan 2017 20:40:59 +0200 + +Downstream kernel uses pins 32, 33 as UART0 (PL011) Rx/Tx to communicate with +the Bluetooth chip. So ALT3 of these pins is most likely not CTS/RTS. Change +the node name to reflect that. This matches section 6.2 "Alternative Function +Assignments" in the BCM2835 ARM Peripherals document. + +With this change in place, adding + + &uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_gpio32 &gpclk2_gpio43>; + status = "okay"; + }; + +to bcm2837-rpi-3-b.dts does the right thing on my Raspberry Pi 3. + +Pins 30, 31 are CTS/RTS of UART0 in alternate function 3. Rename uart0_gpio30 +as well. + +While at it, fix a little typo in a nearby comment. + +Fixes: 21ff843931b ("ARM: dts: bcm283x: Define standard pinctrl groups in the gpio node.") +Acked-by: Stefan Wahren <stefan.wahren@i2se.com> +Signed-off-by: Baruch Siach <baruch@tkos.co.il> Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> --- - drivers/i2c/busses/i2c-bcm2835.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index d2ba1a4..54d510a 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -216,7 +216,7 @@ static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, - (msg->flags & I2C_M_IGNORE_NAK)) - return 0; - -- dev_err(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); -+ dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); - - if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) - return -EREMOTEIO; --- -2.9.3 - -From 8d2cc5cc6ee5c0fc48a96bb29af55fc700f66fdf Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:11 +0200 -Subject: [PATCH 31158/39886] i2c: bcm2835: Can't support I2C_M_IGNORE_NAK -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The controller can't support this flag, so remove it. - -Documentation/i2c/i2c-protocol states that all of the message is sent: - -I2C_M_IGNORE_NAK: - Normally message is interrupted immediately if there is [NA] from the - client. Setting this flag treats any [NA] as [A], and all of - message is sent. - ->From the BCM2835 ARM Peripherals datasheet: - - The ERR field is set when the slave fails to acknowledge either - its address or a data byte written to it. - -So when the controller doesn't receive an ack, it sets ERR and raises -an interrupt. In other words, the whole message is not sent. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> +v2: + * Reference the ARM Peripherals document + * Fix subject typo (Stefan) + * Rename also uart0_gpio30 (Stefan) + * Add comment typo fix (Stefan) + * Add Stefan's ack --- - drivers/i2c/busses/i2c-bcm2835.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index 54d510a..565ef69 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -212,10 +212,6 @@ static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, - if (likely(!i2c_dev->msg_err)) - return 0; - -- if ((i2c_dev->msg_err & BCM2835_I2C_S_ERR) && -- (msg->flags & I2C_M_IGNORE_NAK)) -- return 0; -- - dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); - - if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) --- -2.9.3 - -From ee05fea21b017b81a9477569b6a0c2d8e2946ac9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:12 +0200 -Subject: [PATCH 31159/39886] i2c: bcm2835: Add support for Repeated Start - Condition + arch/arm/boot/dts/bcm283x.dtsi | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi +index 9a44da190897..bc8ad417c8a3 100644 +--- a/arch/arm/boot/dts/bcm283x.dtsi ++++ b/arch/arm/boot/dts/bcm283x.dtsi +@@ -292,17 +292,17 @@ + /* Separate from the uart0_gpio14 group + * because it conflicts with spi1_gpio16, and + * people often run uart0 on the two pins +- * without flow contrl. ++ * without flow control. + */ + uart0_ctsrts_gpio16: uart0_ctsrts_gpio16 { + brcm,pins = <16 17>; + brcm,function = <BCM2835_FSEL_ALT3>; + }; +- uart0_gpio30: uart0_gpio30 { ++ uart0_ctsrts_gpio30: uart0_ctsrts_gpio30 { + brcm,pins = <30 31>; + brcm,function = <BCM2835_FSEL_ALT3>; + }; +- uart0_ctsrts_gpio32: uart0_ctsrts_gpio32 { ++ uart0_gpio32: uart0_gpio32 { + brcm,pins = <32 33>; + brcm,function = <BCM2835_FSEL_ALT3>; + }; +From patchwork Sun Jan 29 19:53:10 2017 +Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Documentation/i2c/i2c-protocol states that Combined transactions should -separate messages with a Start bit and end the whole transaction with a -Stop bit. This patch adds support for issuing only a Start between -messages instead of a Stop followed by a Start. - -This implementation differs from downstream i2c-bcm2708 in 2 respects: -- it uses an interrupt to detect that the transfer is active instead - of using polling. There is no interrupt for Transfer Active, but by - not prefilling the FIFO it's possible to use the TXW interrupt. -- when resetting/disabling the controller between transfers it writes - CLEAR to the control register instead of just zero. - Using just zero gave many errors. This might be the reason why - downstream had to disable this feature and make it available with a - module parameter. - -I have run thousands of transfers to a DS1307 (rtc), MMA8451 (accel) -and AT24C32 (eeprom) in parallel without problems. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> -Acked-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> +Content-Transfer-Encoding: 7bit +Subject: [1/2] ARM: bcm2835: dts: fix i2c0 pins +From: Baruch Siach <baruch@tkos.co.il> +X-Patchwork-Id: 9544275 +Message-Id: <9290fa9eed6b5ff1c5c96b9dac41eca286b7eef9.1485719591.git.baruch@tkos.co.il> +To: Stephen Warren <swarren@wwwdotorg.org>, Lee Jones <lee@kernel.org>, + Eric Anholt <eric@anholt.net> +Cc: Baruch Siach <baruch@tkos.co.il>, linux-rpi-kernel@lists.infradead.org, + linux-arm-kernel@lists.infradead.org +Date: Sun, 29 Jan 2017 21:53:10 +0200 + +According to the BCM2835 ARM Peripherals document i2c0 doesn't map to pins 32, +34 but to 28, 29. + +Fixes: 21ff843931b ("ARM: dts: bcm283x: Define standard pinctrl groups in the gpio node.") +Signed-off-by: Baruch Siach <baruch@tkos.co.il> --- - drivers/i2c/busses/i2c-bcm2835.c | 101 ++++++++++++++++++++++++--------------- - 1 file changed, 63 insertions(+), 38 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index 565ef69..241e08a 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -63,6 +63,7 @@ struct bcm2835_i2c_dev { - struct i2c_adapter adapter; - struct completion completion; - struct i2c_msg *curr_msg; -+ int num_msgs; - u32 msg_err; - u8 *msg_buf; - size_t msg_buf_remaining; -@@ -110,6 +111,45 @@ static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) - } - - /* -+ * Repeated Start Condition (Sr) -+ * The BCM2835 ARM Peripherals datasheet mentions a way to trigger a Sr when it -+ * talks about reading from a slave with 10 bit address. This is achieved by -+ * issuing a write, poll the I2CS.TA flag and wait for it to be set, and then -+ * issue a read. -+ * A comment in https://github.com/raspberrypi/linux/issues/254 shows how the -+ * firmware actually does it using polling and says that it's a workaround for -+ * a problem in the state machine. -+ * It turns out that it is possible to use the TXW interrupt to know when the -+ * transfer is active, provided the FIFO has not been prefilled. -+ */ -+ -+static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev) -+{ -+ u32 c = BCM2835_I2C_C_ST | BCM2835_I2C_C_I2CEN; -+ struct i2c_msg *msg = i2c_dev->curr_msg; -+ bool last_msg = (i2c_dev->num_msgs == 1); -+ -+ if (!i2c_dev->num_msgs) -+ return; -+ -+ i2c_dev->num_msgs--; -+ i2c_dev->msg_buf = msg->buf; -+ i2c_dev->msg_buf_remaining = msg->len; -+ -+ if (msg->flags & I2C_M_RD) -+ c |= BCM2835_I2C_C_READ | BCM2835_I2C_C_INTR; -+ else -+ c |= BCM2835_I2C_C_INTT; -+ -+ if (last_msg) -+ c |= BCM2835_I2C_C_INTD; -+ -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); -+} -+ -+/* - * Note about I2C_C_CLEAR on error: - * The I2C_C_CLEAR on errors will take some time to resolve -- if you were in - * non-idle state and I2C_C_READ, it sets an abort_rx flag and runs through -@@ -151,6 +191,12 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) - } - - bcm2835_fill_txfifo(i2c_dev); -+ -+ if (i2c_dev->num_msgs && !i2c_dev->msg_buf_remaining) { -+ i2c_dev->curr_msg++; -+ bcm2835_i2c_start_transfer(i2c_dev); -+ } -+ - return IRQ_HANDLED; - } - -@@ -175,30 +221,25 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) - return IRQ_HANDLED; - } - --static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, -- struct i2c_msg *msg) -+static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], -+ int num) - { -- u32 c; -+ struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); - unsigned long time_left; -+ int i; - -- i2c_dev->curr_msg = msg; -- i2c_dev->msg_buf = msg->buf; -- i2c_dev->msg_buf_remaining = msg->len; -- reinit_completion(&i2c_dev->completion); -- -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); -+ for (i = 0; i < (num - 1); i++) -+ if (msgs[i].flags & I2C_M_RD) { -+ dev_warn_once(i2c_dev->dev, -+ "only one read message supported, has to be last\n"); -+ return -EOPNOTSUPP; -+ } - -- if (msg->flags & I2C_M_RD) { -- c = BCM2835_I2C_C_READ | BCM2835_I2C_C_INTR; -- } else { -- c = BCM2835_I2C_C_INTT; -- bcm2835_fill_txfifo(i2c_dev); -- } -- c |= BCM2835_I2C_C_ST | BCM2835_I2C_C_INTD | BCM2835_I2C_C_I2CEN; -+ i2c_dev->curr_msg = msgs; -+ i2c_dev->num_msgs = num; -+ reinit_completion(&i2c_dev->completion); - -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); -+ bcm2835_i2c_start_transfer(i2c_dev); - - time_left = wait_for_completion_timeout(&i2c_dev->completion, - BCM2835_I2C_TIMEOUT); -@@ -209,31 +250,15 @@ static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, - return -ETIMEDOUT; - } - -- if (likely(!i2c_dev->msg_err)) -- return 0; -+ if (!i2c_dev->msg_err) -+ return num; - - dev_dbg(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); - - if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) - return -EREMOTEIO; -- else -- return -EIO; --} -- --static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], -- int num) --{ -- struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); -- int i; -- int ret = 0; -- -- for (i = 0; i < num; i++) { -- ret = bcm2835_i2c_xfer_msg(i2c_dev, &msgs[i]); -- if (ret) -- break; -- } - -- return ret ?: i; -+ return -EIO; - } - - static u32 bcm2835_i2c_func(struct i2c_adapter *adap) --- -2.9.3 - -From e13e19e12f66401ce1e21ab491715835852babe7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:13 +0200 -Subject: [PATCH 31160/39886] i2c: bcm2835: Support i2c-dev ioctl I2C_TIMEOUT + arch/arm/boot/dts/bcm283x.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi +index bc8ad417c8a3..2ae842921250 100644 +--- a/arch/arm/boot/dts/bcm283x.dtsi ++++ b/arch/arm/boot/dts/bcm283x.dtsi +@@ -195,8 +195,8 @@ + brcm,pins = <0 1>; + brcm,function = <BCM2835_FSEL_ALT0>; + }; +- i2c0_gpio32: i2c0_gpio32 { +- brcm,pins = <32 34>; ++ i2c0_gpio28: i2c0_gpio28 { ++ brcm,pins = <28 29>; + brcm,function = <BCM2835_FSEL_ALT0>; + }; + i2c0_gpio44: i2c0_gpio44 { +From patchwork Sun Jan 29 19:53:11 2017 +Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use i2c_adapter->timeout for the completion timeout value. The core -default is 1 second. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> +Content-Transfer-Encoding: 7bit +Subject: [2/2] ARM: bcm2835: dts: fix uart0/uart1 pins +From: Baruch Siach <baruch@tkos.co.il> +X-Patchwork-Id: 9544277 +Message-Id: <e0f527a24b0048daba88ef36d5324245e003111c.1485719591.git.baruch@tkos.co.il> +To: Stephen Warren <swarren@wwwdotorg.org>, Lee Jones <lee@kernel.org>, + Eric Anholt <eric@anholt.net> +Cc: Baruch Siach <baruch@tkos.co.il>, linux-rpi-kernel@lists.infradead.org, + linux-arm-kernel@lists.infradead.org +Date: Sun, 29 Jan 2017 21:53:11 +0200 + +According to the BCM2835 ARM Peripherals document uart1 doesn't map to pins +36-39, but uart0 does. + +Also, split into separate Rx/Tx and CST/RTS groups to match other uart nodes. + +Fixes: 21ff843931b ("ARM: dts: bcm283x: Define standard pinctrl groups in the gpio node.") +Signed-off-by: Baruch Siach <baruch@tkos.co.il> --- - drivers/i2c/busses/i2c-bcm2835.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index 241e08a..d2085dd 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -53,8 +53,6 @@ - #define BCM2835_I2C_CDIV_MIN 0x0002 - #define BCM2835_I2C_CDIV_MAX 0xFFFE - --#define BCM2835_I2C_TIMEOUT (msecs_to_jiffies(1000)) -- - struct bcm2835_i2c_dev { - struct device *dev; - void __iomem *regs; -@@ -242,7 +240,7 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], - bcm2835_i2c_start_transfer(i2c_dev); - - time_left = wait_for_completion_timeout(&i2c_dev->completion, -- BCM2835_I2C_TIMEOUT); -+ adap->timeout); - if (!time_left) { - bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, - BCM2835_I2C_C_CLEAR); --- -2.9.3 - -From 9446f62e8e18057fceb179d947508df2f7253b26 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org> -Date: Mon, 3 Oct 2016 22:06:14 +0200 -Subject: [PATCH 31161/39886] i2c: bcm2835: Add support for dynamic clock + arch/arm/boot/dts/bcm283x.dtsi | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi +index 2ae842921250..9ee8346b8b19 100644 +--- a/arch/arm/boot/dts/bcm283x.dtsi ++++ b/arch/arm/boot/dts/bcm283x.dtsi +@@ -306,6 +306,14 @@ + brcm,pins = <32 33>; + brcm,function = <BCM2835_FSEL_ALT3>; + }; ++ uart0_gpio36: uart0_gpio36 { ++ brcm,pins = <36 37>; ++ brcm,function = <BCM2835_FSEL_ALT2>; ++ }; ++ uart0_ctsrts_gpio38: uart0_ctsrts_gpio38 { ++ brcm,pins = <38 39>; ++ brcm,function = <BCM2835_FSEL_ALT2>; ++ }; + + uart1_gpio14: uart1_gpio14 { + brcm,pins = <14 15>; +@@ -323,10 +331,6 @@ + brcm,pins = <30 31>; + brcm,function = <BCM2835_FSEL_ALT5>; + }; +- uart1_gpio36: uart1_gpio36 { +- brcm,pins = <36 37 38 39>; +- brcm,function = <BCM2835_FSEL_ALT2>; +- }; + uart1_gpio40: uart1_gpio40 { + brcm,pins = <40 41>; + brcm,function = <BCM2835_FSEL_ALT5>; +From patchwork Mon Jan 30 18:44:39 2017 +Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Support a dynamic clock by reading the frequency and setting the -divisor in the transfer function instead of during probe. - -Signed-off-by: Noralf Trønnes <noralf@tronnes.org> -Reviewed-by: Martin Sperl <kernel@martin.sperl.org> -Signed-off-by: Wolfram Sang <wsa@the-dreams.de> ---- - drivers/i2c/busses/i2c-bcm2835.c | 51 +++++++++++++++++++++++++--------------- - 1 file changed, 32 insertions(+), 19 deletions(-) - -diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index d2085dd..c3436f6 100644 ---- a/drivers/i2c/busses/i2c-bcm2835.c -+++ b/drivers/i2c/busses/i2c-bcm2835.c -@@ -58,6 +58,7 @@ struct bcm2835_i2c_dev { - void __iomem *regs; - struct clk *clk; - int irq; -+ u32 bus_clk_rate; - struct i2c_adapter adapter; - struct completion completion; - struct i2c_msg *curr_msg; -@@ -78,6 +79,30 @@ static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) - return readl(i2c_dev->regs + reg); - } - -+static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev) -+{ -+ u32 divider; -+ -+ divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk), -+ i2c_dev->bus_clk_rate); -+ /* -+ * Per the datasheet, the register is always interpreted as an even -+ * number, by rounding down. In other words, the LSB is ignored. So, -+ * if the LSB is set, increment the divider to avoid any issue. -+ */ -+ if (divider & 1) -+ divider++; -+ if ((divider < BCM2835_I2C_CDIV_MIN) || -+ (divider > BCM2835_I2C_CDIV_MAX)) { -+ dev_err_ratelimited(i2c_dev->dev, "Invalid clock-frequency\n"); -+ return -EINVAL; -+ } -+ -+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider); -+ -+ return 0; -+} -+ - static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev) - { - u32 val; -@@ -224,7 +249,7 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], - { - struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); - unsigned long time_left; -- int i; -+ int i, ret; - - for (i = 0; i < (num - 1); i++) - if (msgs[i].flags & I2C_M_RD) { -@@ -233,6 +258,10 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], - return -EOPNOTSUPP; - } - -+ ret = bcm2835_i2c_set_divider(i2c_dev); -+ if (ret) -+ return ret; -+ - i2c_dev->curr_msg = msgs; - i2c_dev->num_msgs = num; - reinit_completion(&i2c_dev->completion); -@@ -282,7 +311,6 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) - { - struct bcm2835_i2c_dev *i2c_dev; - struct resource *mem, *irq; -- u32 bus_clk_rate, divider; - int ret; - struct i2c_adapter *adap; - -@@ -306,27 +334,12 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) - } - - ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency", -- &bus_clk_rate); -+ &i2c_dev->bus_clk_rate); - if (ret < 0) { - dev_warn(&pdev->dev, - "Could not read clock-frequency property\n"); -- bus_clk_rate = 100000; -- } -- -- divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk), bus_clk_rate); -- /* -- * Per the datasheet, the register is always interpreted as an even -- * number, by rounding down. In other words, the LSB is ignored. So, -- * if the LSB is set, increment the divider to avoid any issue. -- */ -- if (divider & 1) -- divider++; -- if ((divider < BCM2835_I2C_CDIV_MIN) || -- (divider > BCM2835_I2C_CDIV_MAX)) { -- dev_err(&pdev->dev, "Invalid clock-frequency\n"); -- return -ENODEV; -+ i2c_dev->bus_clk_rate = 100000; - } -- bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider); - - irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); - if (!irq) { --- -2.9.3 - -From f2a46926aba1f0c33944901d2420a6a887455ddc Mon Sep 17 00:00:00 2001 -From: Boris Brezillon <boris.brezillon@free-electrons.com> -Date: Tue, 22 Nov 2016 12:45:28 -0800 -Subject: [PATCH 08819/13183] clk: bcm2835: Fix ->fixed_divider of pllh_aux - -There is no fixed divider on pllh_aux. - -Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> -Signed-off-by: Eric Anholt <eric@anholt.net> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> ---- - drivers/clk/bcm/clk-bcm2835.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c -index 8c7763f..836d075 100644 ---- a/drivers/clk/bcm/clk-bcm2835.c -+++ b/drivers/clk/bcm/clk-bcm2835.c -@@ -1596,7 +1596,7 @@ static const struct bcm2835_clk_desc clk_desc_array[] = { - .a2w_reg = A2W_PLLH_AUX, - .load_mask = CM_PLLH_LOADAUX, - .hold_mask = 0, -- .fixed_divider = 10), -+ .fixed_divider = 1), - [BCM2835_PLLH_PIX] = REGISTER_PLL_DIV( - .name = "pllh_pix", - .source_pll = "pllh", --- -2.9.3 - -commit 84c39b8b7d46883f7a7514c7d55909831aa846fd -Author: Arvind Yadav <arvind.yadav.cs@gmail.com> -Date: Wed Sep 21 23:03:57 2016 +0530 - - clocksource/drivers/bcm2835_timer: Unmap region obtained by of_iomap - - Free memory mapping, if bcm2835_timer_init is not successful. - - Signed-off-by: Arvind Yadav <arvind.yadav.cs@gmail.com> - Reviewed-by: Eric Anholt <eric@anholt.net> - Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> - -diff --git a/drivers/clocksource/bcm2835_timer.c b/drivers/clocksource/bcm2835_timer.c -index e71acf2..f2f29d2 100644 ---- a/drivers/clocksource/bcm2835_timer.c -+++ b/drivers/clocksource/bcm2835_timer.c -@@ -96,7 +96,7 @@ static int __init bcm2835_timer_init(struct device_node *node) - ret = of_property_read_u32(node, "clock-frequency", &freq); - if (ret) { - pr_err("Can't read clock-frequency"); -- return ret; -+ goto err_iounmap; - } - - system_clock = base + REG_COUNTER_LO; -@@ -108,13 +108,15 @@ static int __init bcm2835_timer_init(struct device_node *node) - irq = irq_of_parse_and_map(node, DEFAULT_TIMER); - if (irq <= 0) { - pr_err("Can't parse IRQ"); -- return -EINVAL; -+ ret = -EINVAL; -+ goto err_iounmap; - } - - timer = kzalloc(sizeof(*timer), GFP_KERNEL); - if (!timer) { - pr_err("Can't allocate timer struct\n"); -- return -ENOMEM; -+ ret = -ENOMEM; -+ goto err_iounmap; - } - - timer->control = base + REG_CONTROL; -@@ -133,7 +135,7 @@ static int __init bcm2835_timer_init(struct device_node *node) - ret = setup_irq(irq, &timer->act); - if (ret) { - pr_err("Can't set up timer IRQ\n"); -- return ret; -+ goto err_iounmap; - } - - clockevents_config_and_register(&timer->evt, freq, 0xf, 0xffffffff); -@@ -141,6 +143,10 @@ static int __init bcm2835_timer_init(struct device_node *node) - pr_info("bcm2835: system timer (irq = %d)\n", irq); - - return 0; -+ -+err_iounmap: -+ iounmap(base); -+ return ret; - } - CLOCKSOURCE_OF_DECLARE(bcm2835, "brcm,bcm2835-system-timer", - bcm2835_timer_init); -From 155e8b3b0ee320ae866b97dd31eba8a1f080a772 Mon Sep 17 00:00:00 2001 -From: Boris Brezillon <boris.brezillon@free-electrons.com> -Date: Thu, 1 Dec 2016 22:00:19 +0100 -Subject: [PATCH 11733/13183] clk: bcm: Support rate change propagation on - bcm2835 clocks - -Some peripheral clocks, like the VEC (Video EnCoder) clock need to be set -to a precise rate (in our case 108MHz). With the current implementation, -where peripheral clocks are not allowed to forward rate change requests -to their parents, it is impossible to match this requirement unless the -bootloader has configured things correctly, or a specific rate has been -assigned through the DT (with the assigned-clk-rates property). - -Add a new field to struct bcm2835_clock_data to specify which parent -clocks accept rate change propagation, and support set rate propagation -in bcm2835_clock_determine_rate(). - -Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> ---- - drivers/clk/bcm/clk-bcm2835.c | 67 ++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 63 insertions(+), 4 deletions(-) - -diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c -index 2acaa77..df96fe6 100644 ---- a/drivers/clk/bcm/clk-bcm2835.c -+++ b/drivers/clk/bcm/clk-bcm2835.c -@@ -436,6 +436,9 @@ struct bcm2835_clock_data { - const char *const *parents; - int num_mux_parents; - -+ /* Bitmap encoding which parents accept rate change propagation. */ -+ unsigned int set_rate_parent; -+ - u32 ctl_reg; - u32 div_reg; - -@@ -1017,10 +1020,60 @@ bcm2835_clk_is_pllc(struct clk_hw *hw) - return strncmp(clk_hw_get_name(hw), "pllc", 4) == 0; - } - -+static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw, -+ int parent_idx, -+ unsigned long rate, -+ u32 *div, -+ unsigned long *prate) -+{ -+ struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); -+ struct bcm2835_cprman *cprman = clock->cprman; -+ const struct bcm2835_clock_data *data = clock->data; -+ unsigned long best_rate; -+ u32 curdiv, mindiv, maxdiv; -+ struct clk_hw *parent; -+ -+ parent = clk_hw_get_parent_by_index(hw, parent_idx); -+ -+ if (!(BIT(parent_idx) & data->set_rate_parent)) { -+ *prate = clk_hw_get_rate(parent); -+ *div = bcm2835_clock_choose_div(hw, rate, *prate, true); -+ -+ return bcm2835_clock_rate_from_divisor(clock, *prate, -+ *div); -+ } -+ -+ if (data->frac_bits) -+ dev_warn(cprman->dev, -+ "frac bits are not used when propagating rate change"); -+ -+ /* clamp to min divider of 2 if we're dealing with a mash clock */ -+ mindiv = data->is_mash_clock ? 2 : 1; -+ maxdiv = BIT(data->int_bits) - 1; -+ -+ /* TODO: Be smart, and only test a subset of the available divisors. */ -+ for (curdiv = mindiv; curdiv <= maxdiv; curdiv++) { -+ unsigned long tmp_rate; -+ -+ tmp_rate = clk_hw_round_rate(parent, rate * curdiv); -+ tmp_rate /= curdiv; -+ if (curdiv == mindiv || -+ (tmp_rate > best_rate && tmp_rate <= rate)) -+ best_rate = tmp_rate; -+ -+ if (best_rate == rate) -+ break; -+ } -+ -+ *div = curdiv << CM_DIV_FRAC_BITS; -+ *prate = curdiv * best_rate; -+ -+ return best_rate; -+} -+ - static int bcm2835_clock_determine_rate(struct clk_hw *hw, - struct clk_rate_request *req) - { -- struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); - struct clk_hw *parent, *best_parent = NULL; - bool current_parent_is_pllc; - unsigned long rate, best_rate = 0; -@@ -1048,9 +1101,8 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw, - if (bcm2835_clk_is_pllc(parent) && !current_parent_is_pllc) - continue; - -- prate = clk_hw_get_rate(parent); -- div = bcm2835_clock_choose_div(hw, req->rate, prate, true); -- rate = bcm2835_clock_rate_from_divisor(clock, prate, div); -+ rate = bcm2835_clock_choose_div_and_prate(hw, i, req->rate, -+ &div, &prate); - if (rate > best_rate && rate <= req->rate) { - best_parent = parent; - best_prate = prate; -@@ -1262,6 +1314,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, - init.name = data->name; - init.flags = data->flags | CLK_IGNORE_UNUSED; - -+ /* -+ * Pass the CLK_SET_RATE_PARENT flag if we are allowed to propagate -+ * rate changes on at least of the parents. -+ */ -+ if (data->set_rate_parent) -+ init.flags |= CLK_SET_RATE_PARENT; -+ - if (data->is_vpu_clock) { - init.ops = &bcm2835_vpu_clock_clk_ops; - } else { --- -2.9.3 - -From d86d46af84855403c00018be1c3e7bc190f2a6cd Mon Sep 17 00:00:00 2001 -From: Boris Brezillon <boris.brezillon@free-electrons.com> -Date: Thu, 1 Dec 2016 22:00:20 +0100 -Subject: [PATCH 11734/13183] clk: bcm: Allow rate change propagation to - PLLH_AUX on VEC clock - -The VEC clock requires needs to be set at exactly 108MHz. Allow rate -change propagation on PLLH_AUX to match this requirement wihtout -impacting other IPs (PLLH is currently only used by the HDMI encoder, -which cannot be enabled when the VEC encoder is enabled). - -Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> ---- - drivers/clk/bcm/clk-bcm2835.c | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c -index df96fe6..eaf82f4 100644 ---- a/drivers/clk/bcm/clk-bcm2835.c -+++ b/drivers/clk/bcm/clk-bcm2835.c -@@ -1861,7 +1861,12 @@ static const struct bcm2835_clk_desc clk_desc_array[] = { - .ctl_reg = CM_VECCTL, - .div_reg = CM_VECDIV, - .int_bits = 4, -- .frac_bits = 0), -+ .frac_bits = 0, -+ /* -+ * Allow rate change propagation only on PLLH_AUX which is -+ * assigned index 7 in the parent array. -+ */ -+ .set_rate_parent = BIT(7)), - - /* dsi clocks */ - [BCM2835_CLOCK_DSI0E] = REGISTER_PER_CLK( --- -2.9.3 - -From 2aab7a2055a1705c9e30920d95a596226999eb21 Mon Sep 17 00:00:00 2001 -From: Boris Brezillon <boris.brezillon@free-electrons.com> -Date: Mon, 12 Dec 2016 09:00:53 +0100 -Subject: [PATCH 12092/13183] clk: bcm: Fix 'maybe-uninitialized' warning in - bcm2835_clock_choose_div_and_prate() - -best_rate is reported as potentially uninitialized by gcc. - -Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> -Fixes: 155e8b3b0ee3 ("clk: bcm: Support rate change propagation on bcm2835 clocks") -Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> -Reviewed-by: Eric Anholt <eric@anholt.net> -Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> +Content-Transfer-Encoding: 7bit +Subject: ARM: bcm2835: dt: add index to the ethernet alias +From: Baruch Siach <baruch@tkos.co.il> +X-Patchwork-Id: 9545945 +Message-Id: <5942321c5d0bfea54eac64ace2b217e8e0b6220d.1485801879.git.baruch@tkos.co.il> +To: Stephen Warren <swarren@wwwdotorg.org>, Lee Jones <lee@kernel.org>, + Eric Anholt <eric@anholt.net> +Cc: Lubomir Rintel <lkundrak@v3.sk>, Baruch Siach <baruch@tkos.co.il>, + linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org +Date: Mon, 30 Jan 2017 20:44:39 +0200 + +An alias name should have an index number even when it is the only of its type. +This allows U-Boot to add the local-mac-address property. Otherwise U-Boot +skips the alias. + +Cc: Lubomir Rintel <lkundrak@v3.sk> +Fixes: 6a93792774 ("ARM: bcm2835: dt: Add the ethernet to the device trees") +Signed-off-by: Baruch Siach <baruch@tkos.co.il> +Acked-by: Lubomir Rintel <lkundrak@v3.sk> --- - drivers/clk/bcm/clk-bcm2835.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c -index eaf82f4..0d14409 100644 ---- a/drivers/clk/bcm/clk-bcm2835.c -+++ b/drivers/clk/bcm/clk-bcm2835.c -@@ -1029,7 +1029,7 @@ static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw, - struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); - struct bcm2835_cprman *cprman = clock->cprman; - const struct bcm2835_clock_data *data = clock->data; -- unsigned long best_rate; -+ unsigned long best_rate = 0; - u32 curdiv, mindiv, maxdiv; - struct clk_hw *parent; + arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi | 2 +- + arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi b/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi +index 12c981e51134..9a0599f711ff 100644 +--- a/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi ++++ b/arch/arm/boot/dts/bcm283x-rpi-smsc9512.dtsi +@@ -1,6 +1,6 @@ + / { + aliases { +- ethernet = ðernet; ++ ethernet0 = ðernet; + }; + }; + +diff --git a/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi b/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi +index 3f0a56ebcf1f..dc7ae776db5f 100644 +--- a/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi ++++ b/arch/arm/boot/dts/bcm283x-rpi-smsc9514.dtsi +@@ -1,6 +1,6 @@ + / { + aliases { +- ethernet = ðernet; ++ ethernet0 = ðernet; + }; + }; --- -2.9.3 - |