From 494688df849923c1b0651c7ffc5fc6d6835364f1 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 2 Apr 2018 18:38:27 +0100 Subject: [PATCH] Improvements for the Raspberry Pi 3+, Fixes and minor improvements to Raspberry Pi 2/3 --- bcm2837-enable-pmu.patch | 31 +++ ...ander.patch => bcm2837-gpio-expander.patch | 69 ++++++ bcm2837-lan78xx-fixes.patch | 108 ++++++++++ bcm2837-rpi-initial-support-for-the-3.patch | 202 +++++++++--------- bcm283x-clk-audio-fixes.patch | 98 +++++++++ kernel.spec | 24 ++- 6 files changed, 420 insertions(+), 112 deletions(-) create mode 100644 bcm2837-enable-pmu.patch rename bcm283x-gpio-expander.patch => bcm2837-gpio-expander.patch (93%) create mode 100644 bcm2837-lan78xx-fixes.patch create mode 100644 bcm283x-clk-audio-fixes.patch diff --git a/bcm2837-enable-pmu.patch b/bcm2837-enable-pmu.patch new file mode 100644 index 000000000..378dd64c1 --- /dev/null +++ b/bcm2837-enable-pmu.patch @@ -0,0 +1,31 @@ +From 69e52712002cb6768b894cde9620fb426fd8728d Mon Sep 17 00:00:00 2001 +From: Stefan Wahren +Date: Fri, 16 Mar 2018 21:49:37 +0100 +Subject: [PATCH] ARM: dts: bcm2837: Enable PMU on Raspberry Pi 3 + +This enables the PMU (performance monitoring unit) on Raspberry Pi 3. +In order to make it work on ARM and ARM64, we need to specify two +compatible strings. + +Signed-off-by: Stefan Wahren +--- + arch/arm/boot/dts/bcm2837.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi +index 7704bb029605..1f5e5c782835 100644 +--- a/arch/arm/boot/dts/bcm2837.dtsi ++++ b/arch/arm/boot/dts/bcm2837.dtsi +@@ -17,6 +17,12 @@ + }; + }; + ++ arm-pmu { ++ compatible = "arm,cortex-a53-pmu", "arm,cortex-a7-pmu"; ++ interrupt-parent = <&local_intc>; ++ interrupts = <9 IRQ_TYPE_LEVEL_HIGH>; ++ }; ++ + timer { + compatible = "arm,armv7-timer"; + interrupt-parent = <&local_intc>; diff --git a/bcm283x-gpio-expander.patch b/bcm2837-gpio-expander.patch similarity index 93% rename from bcm283x-gpio-expander.patch rename to bcm2837-gpio-expander.patch index 55b7ec4d7..f5b8370b4 100644 --- a/bcm283x-gpio-expander.patch +++ b/bcm2837-gpio-expander.patch @@ -636,3 +636,72 @@ index 3e4ed7c5b0b3..0b31d995a066 100644 /* uart0 communicates with the BT module */ &uart0 { pinctrl-names = "default"; +From 257f497bb3e58f88500971145761ed55428618eb Mon Sep 17 00:00:00 2001 +From: Stefan Wahren +Date: Wed, 7 Mar 2018 15:56:20 +0100 +Subject: [PATCH] ARM: dts: bcm2837: Add missing GPIOs of Expander + +Signed-off-by: Stefan Wahren +--- + arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts +index 0b31d995a066..3e87ed05918e 100644 +--- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts ++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts +@@ -20,9 +20,14 @@ + + leds { + act { +- gpios = <&gpio 47 GPIO_ACTIVE_HIGH>; ++ gpios = <&expgpio 2 GPIO_ACTIVE_HIGH>; + }; + }; ++ ++ wifi_pwrseq: wifi-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_HIGH>; ++ }; + }; + + &firmware { +@@ -42,6 +47,10 @@ + }; + }; + ++&hdmi { ++ hpd-gpios = <&expgpio 4 GPIO_ACTIVE_LOW>; ++}; ++ + /* uart0 communicates with the BT module */ + &uart0 { + pinctrl-names = "default"; +@@ -51,6 +60,7 @@ + bluetooth { + compatible = "brcm,bcm43438-bt"; + max-speed = <2000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; + }; + }; + +@@ -63,11 +73,19 @@ + + /* SDHCI is used to control the SDIO for wireless */ + &sdhci { ++ #address-cells = <1>; ++ #size-cells = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&emmc_gpio34>; + status = "okay"; + bus-width = <4>; + non-removable; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; + }; + + /* SDHOST is used to drive the SD card */ diff --git a/bcm2837-lan78xx-fixes.patch b/bcm2837-lan78xx-fixes.patch new file mode 100644 index 000000000..f877ac15b --- /dev/null +++ b/bcm2837-lan78xx-fixes.patch @@ -0,0 +1,108 @@ +From 6ed88d188a8240ba44da6578eab7d17e036d0e61 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 17 Oct 2017 15:04:29 +0100 +Subject: [PATCH] lan78xx: Enable LEDs if no valid EEPROM or OTP + +For applications of the LAN78xx that don't have valid programmed +EEPROMs or OTPs, enabling both LEDs by default seems reasonable. + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index a21039852f8d..cd20ce4ed87d 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2414,6 +2414,12 @@ static int lan78xx_reset(struct lan78xx_net *dev) + + ret = lan78xx_read_reg(dev, HW_CFG, &buf); + buf |= HW_CFG_MEF_; ++ ++ /* If no valid EEPROM and no valid OTP, enable the LEDs by default */ ++ if (lan78xx_read_eeprom(dev, 0, 0, NULL) && ++ lan78xx_read_otp(dev, 0, 0, NULL)) ++ buf |= HW_CFG_LED0_EN_ | HW_CFG_LED1_EN_; ++ + ret = lan78xx_write_reg(dev, HW_CFG, buf); + + ret = lan78xx_read_reg(dev, USB_CFG0, &buf); +From f8a798bb45ae15cbec980c8e921eb377fd1a3df6 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 28 Nov 2017 12:02:37 +0000 +Subject: [PATCH] lan78xx: Correctly indicate invalid OTP + +lan78xx_read_otp tries to return -EINVAL in the event of invalid OTP +content, but the value gets overwritten before it is returned and the +read goes ahead anyway. Make the read conditional as it should be +and preserve the error code. + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index cd20ce4ed87d..b270935f3f8d 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -929,7 +929,8 @@ static int lan78xx_read_otp(struct lan78xx_net *dev, u32 offset, + offset += 0x100; + else + ret = -EINVAL; +- ret = lan78xx_read_raw_otp(dev, offset, length, data); ++ if (!ret) ++ ret = lan78xx_read_raw_otp(dev, offset, length, data); + } + + return ret; +From 4a4710f3847cd087e150f83382dffd92e09d9914 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Sat, 17 Mar 2018 00:10:02 +0100 +Subject: [PATCH] lan78xx: Read MAC address from DT if present + +There is a standard mechanism for locating and using a MAC address from +the Device Tree. Use this facility in the lan78xx driver to support +applications without programmed EEPROM or OTP. + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 60a604cc7647..a21039852f8d 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include "lan78xx.h" + +@@ -1639,6 +1640,14 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev) + u32 addr_lo, addr_hi; + int ret; + u8 addr[6]; ++ const u8 *mac_addr; ++ ++ /* maybe the boot loader passed the MAC address in devicetree */ ++ mac_addr = of_get_mac_address(dev->udev->dev.of_node); ++ if (mac_addr) { ++ ether_addr_copy(addr, mac_addr); ++ goto set_mac_addr; ++ } + + ret = lan78xx_read_reg(dev, RX_ADDRL, &addr_lo); + ret = lan78xx_read_reg(dev, RX_ADDRH, &addr_hi); +@@ -1667,6 +1676,7 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev) + "MAC address set to random addr"); + } + ++set_mac_addr: + addr_lo = addr[0] | (addr[1] << 8) | + (addr[2] << 16) | (addr[3] << 24); + addr_hi = addr[4] | (addr[5] << 8); diff --git a/bcm2837-rpi-initial-support-for-the-3.patch b/bcm2837-rpi-initial-support-for-the-3.patch index 90ba8b645..c9bedfebc 100644 --- a/bcm2837-rpi-initial-support-for-the-3.patch +++ b/bcm2837-rpi-initial-support-for-the-3.patch @@ -1,22 +1,60 @@ -From 383c32f69af61774ff3414f98c9bc29f28dca8fa Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Mon, 19 Mar 2018 09:26:57 +0000 -Subject: [PATCH] rpi: initial support for the 3+ +From defa4876ece55751c691d17ffc928d9bfe049585 Mon Sep 17 00:00:00 2001 +From: Stefan Wahren +Date: Fri, 16 Mar 2018 22:56:59 +0100 +Subject: [PATCH] arm64: dts: broadcom: Add reference to Raspberry Pi 3 B+ -Signed-off-by: Peter Robinson +This adds a reference to the dts file of the Raspberry Pi 3 B+ + +Signed-off-by: Stefan Wahren --- - arch/arm/boot/dts/Makefile | 1 + - arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 62 ++++++++++++++++++++++ - arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 36 +++++++++++++ - arch/arm64/boot/dts/broadcom/Makefile | 4 +- - .../boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts | 2 + - 5 files changed, 104 insertions(+), 1 deletion(-) - create mode 100644 arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts - create mode 100644 arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi + arch/arm64/boot/dts/broadcom/Makefile | 3 ++- + arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts | 2 ++ + 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts +diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile +index 2a2591ef1fee..1193a9e34bbb 100644 +--- a/arch/arm64/boot/dts/broadcom/Makefile ++++ b/arch/arm64/boot/dts/broadcom/Makefile +@@ -1,5 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0 +-dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb ++dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb \ ++ bcm2837-rpi-3-b-plus.dtb + + subdir-y += northstar2 + subdir-y += stingray +diff --git a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts +new file mode 100644 +index 000000000000..46ad2023cccf +--- /dev/null ++++ b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts +@@ -0,0 +1,2 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "arm/bcm2837-rpi-3-b-plus.dts" + +From c7c06c54087dfadd065abcba0b7f614f7a88d549 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Fri, 16 Mar 2018 22:42:28 +0100 +Subject: [PATCH] ARM: dts: bcm2837: Add Raspberry Pi 3 B+ + +The Raspberry Pi 3 B+ has the following major differences compared +to the model 3 B: +* Microchip LAN7515 (Gigabit Ethernet) +* Cypress CYW43455 (802.11ac and BT 4.2) + +Signed-off-by: Phil Elwell +Signed-off-by: Stefan Wahren +--- + arch/arm/boot/dts/Makefile | 1 + + arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 102 +++++++++++++++++++++++++++++ + arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 27 ++++++++ + 3 files changed, 130 insertions(+) + create mode 100644 arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts + create mode 100644 arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi + diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index ade7a38543dc..05b49935d84b 100644 +index 3b471e6787ff..dee85f848de9 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -75,6 +75,7 @@ dtb-$(CONFIG_ARCH_BCM2835) += \ @@ -29,10 +67,10 @@ index ade7a38543dc..05b49935d84b 100644 dtb-$(CONFIG_ARCH_BCM_5301X) += \ diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts new file mode 100644 -index 000000000000..63ff6bc56e36 +index 000000000000..fb9f6f7e965c --- /dev/null +++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts -@@ -0,0 +1,62 @@ +@@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; +#include "bcm2837.dtsi" @@ -55,9 +93,40 @@ index 000000000000..63ff6bc56e36 + + leds { + act { -+ gpios = <&gpio 47 GPIO_ACTIVE_HIGH>; ++ gpios = <&gpio 29 0>; ++ }; ++ ++ pwr { ++ label = "PWR"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; + }; + }; ++ ++ wifi_pwrseq: wifi-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++&firmware { ++ expgpio: gpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-line-names = "BT_ON", ++ "WL_ON", ++ "STATUS_LED", ++ "LAN_RUN", ++ "", ++ "CAM_GPIO0", ++ "CAM_GPIO1", ++ ""; ++ status = "okay"; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>; +}; + +/* uart0 communicates with the BT module */ @@ -69,6 +138,7 @@ index 000000000000..63ff6bc56e36 + bluetooth { + compatible = "brcm,bcm43438-bt"; + max-speed = <2000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; + }; +}; + @@ -81,11 +151,19 @@ index 000000000000..63ff6bc56e36 + +/* SDHCI is used to control the SDIO for wireless */ +&sdhci { ++ #address-cells = <1>; ++ #size-cells = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&emmc_gpio34>; + status = "okay"; + bus-width = <4>; + non-removable; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; +}; + +/* SDHOST is used to drive the SD card */ @@ -97,10 +175,11 @@ index 000000000000..63ff6bc56e36 +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi new file mode 100644 -index 000000000000..1b1075d4aa5c +index 000000000000..169203c5ce8b --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi -@@ -0,0 +1,36 @@ +@@ -0,0 +1,27 @@ ++// SPDX-License-Identifier: GPL-2.0 +/ { + aliases { + ethernet0 = ðernet; @@ -123,93 +202,8 @@ index 000000000000..1b1075d4aa5c + ethernet: usbether@1 { + compatible = "usb424,7800"; + reg = <1>; -+ microchip,eee-enabled; -+ microchip,tx-lpi-timer = <600>; /* non-aggressive*/ + }; + }; + }; +}; -+ -+ -+/ { -+ __overrides__ { -+ eee = <ðernet>,"microchip,eee-enabled?"; -+ tx_lpi_timer = <ðernet>,"microchip,tx-lpi-timer:0"; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile -index 2a2591ef1fee..6b5b70542dad 100644 ---- a/arch/arm64/boot/dts/broadcom/Makefile -+++ b/arch/arm64/boot/dts/broadcom/Makefile -@@ -1,5 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0 --dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb -+dtb-$(CONFIG_ARCH_BCM2835) += \ -+ bcm2837-rpi-3-b.dtb \ -+ bcm2837-rpi-3-b-plus.dtb - - subdir-y += northstar2 - subdir-y += stingray -diff --git a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts -new file mode 100644 -index 000000000000..46ad2023cccf ---- /dev/null -+++ b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts -@@ -0,0 +1,2 @@ -+// SPDX-License-Identifier: GPL-2.0 -+#include "arm/bcm2837-rpi-3-b-plus.dts" --- -2.16.2 -From patchwork Tue Feb 20 12:19:35 2018 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v5,5/5] ARM: dts: bcm2837-rpi-3-b: add GPIO expander -From: Baruch Siach -X-Patchwork-Id: 10229995 -Message-Id: -To: Linus Walleij , - Dave Stevenson , - Eric Anholt , Stefan Wahren -Cc: devicetree@vger.kernel.org, Baruch Siach , - linux-gpio@vger.kernel.org, Michael Zoran , - Rob Herring , linux-rpi-kernel@lists.infradead.org, - Frank Rowand , linux-arm-kernel@lists.infradead.org -Date: Tue, 20 Feb 2018 14:19:35 +0200 - -Add a description of the RPi3 GPIO expander that the VC4 firmware controls. - -Signed-off-by: Peter Robinson ---- - arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts -index 3e4ed7c5b0b3..0b31d995a066 100644 ---- a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts -+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts -@@ -25,6 +25,23 @@ - }; - }; - -+&firmware { -+ expgpio: gpio { -+ compatible = "raspberrypi,firmware-gpio"; -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-line-names = "BT_ON", -+ "WL_ON", -+ "STATUS_LED", -+ "LAN_RUN", -+ "HPD_N", -+ "CAM_GPIO0", -+ "CAM_GPIO1", -+ "PWR_LOW_N"; -+ status = "okay"; -+ }; -+}; -+ - /* uart0 communicates with the BT module */ - &uart0 { - pinctrl-names = "default"; diff --git a/bcm283x-clk-audio-fixes.patch b/bcm283x-clk-audio-fixes.patch new file mode 100644 index 000000000..51c9fa791 --- /dev/null +++ b/bcm283x-clk-audio-fixes.patch @@ -0,0 +1,98 @@ +From aa964d59aab2cb04bc011ffd370822ac79f82a0b Mon Sep 17 00:00:00 2001 +From: Boris Brezillon +Date: Wed, 7 Mar 2018 15:39:17 +0100 +Subject: [PATCH] clk: bcm2835: De-assert/assert PLL reset signal when + appropriate + +In order to enable a PLL, not only the PLL has to be powered up and +locked, but you also have to de-assert the reset signal. The last part +was missing. Add it so PLLs that were not enabled by the FW/bootloader +can be enabled from Linux. + +Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") +Cc: +Signed-off-by: Boris Brezillon +--- + drivers/clk/bcm/clk-bcm2835.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c +index a07f6451694a..6c5d4a8e426c 100644 +--- a/drivers/clk/bcm/clk-bcm2835.c ++++ b/drivers/clk/bcm/clk-bcm2835.c +@@ -602,6 +602,9 @@ static void bcm2835_pll_off(struct clk_hw *hw) + const struct bcm2835_pll_data *data = pll->data; + + spin_lock(&cprman->regs_lock); ++ cprman_write(cprman, data->a2w_ctrl_reg, ++ cprman_read(cprman, data->a2w_ctrl_reg) & ++ ~A2W_PLL_CTRL_PRST_DISABLE); + cprman_write(cprman, data->cm_ctrl_reg, + cprman_read(cprman, data->cm_ctrl_reg) | + CM_PLL_ANARST); +@@ -640,6 +643,10 @@ static int bcm2835_pll_on(struct clk_hw *hw) + cpu_relax(); + } + ++ cprman_write(cprman, data->a2w_ctrl_reg, ++ cprman_read(cprman, data->a2w_ctrl_reg) | ++ A2W_PLL_CTRL_PRST_DISABLE); ++ + return 0; + } + +From 1b6867ee05d84cc6ec23b5ec0b78684187d3190a Mon Sep 17 00:00:00 2001 +From: Boris Brezillon +Date: Wed, 7 Mar 2018 15:41:14 +0100 +Subject: [PATCH] clk: bcm2835: Make sure the PLL is gated before changing its + rate + +All bcm2835 PLLs should be gated before their rate can be changed. +Setting CLK_SET_RATE_GATE will let the core enforce that, but this is +not enough to make the code work in all situations. Indeed, the +CLK_SET_RATE_GATE flag prevents a user from changing the rate while +the clock is enabled, but this check only guarantees there's no Linux +users. In our case, the clock might have been enabled by the +bootloader/FW, and, because we have CLK_IGNORE_UNUSED set, Linux never +disables the PLL. So we have to make sure the PLL is actually disabled +before changing the rate. + +Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks") +Cc: +Signed-off-by: Boris Brezillon +--- + drivers/clk/bcm/clk-bcm2835.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c +index 6c5d4a8e426c..051ce769c109 100644 +--- a/drivers/clk/bcm/clk-bcm2835.c ++++ b/drivers/clk/bcm/clk-bcm2835.c +@@ -678,6 +678,18 @@ static int bcm2835_pll_set_rate(struct clk_hw *hw, + u32 ana[4]; + int i; + ++ /* ++ * Normally, the CLK_SET_RATE_GATE flag prevents a user from changing ++ * the rate while the clock is enabled, but this check only makes sure ++ * there's no Linux users. ++ * In our case, the clock might have been enabled by the bootloader/FW, ++ * and, since CLK_IGNORE_UNUSED flag is set, Linux never disables it. ++ * So we have to make sure the clk is actually disabled before changing ++ * the rate. ++ */ ++ if (bcm2835_pll_is_on(hw)) ++ bcm2835_pll_off(hw); ++ + if (rate > data->max_fb_rate) { + use_fb_prediv = true; + rate /= 2; +@@ -1318,7 +1330,7 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, + init.num_parents = 1; + init.name = data->name; + init.ops = &bcm2835_pll_clk_ops; +- init.flags = CLK_IGNORE_UNUSED; ++ init.flags = CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE; + + pll = kzalloc(sizeof(*pll), GFP_KERNEL); + if (!pll) diff --git a/kernel.spec b/kernel.spec index b4d42b587..2a1ba8a9d 100644 --- a/kernel.spec +++ b/kernel.spec @@ -588,9 +588,6 @@ Patch305: qcom-msm89xx-fixes.patch # https://patchwork.kernel.org/patch/10173115/ Patch306: arm-dts-imx6qdl-udoo-Disable-usbh1-to-avoid-kernel-hang.patch -# Fix USB on the RPi https://patchwork.kernel.org/patch/9879371/ -Patch307: bcm283x-dma-mapping-skip-USB-devices-when-configuring-DMA-during-probe.patch - # http://patches.linaro.org/patch/131764/ Patch308: wcn36xx-Fix-firmware-crash-due-to-corrupted-buffer-address.patch @@ -600,18 +597,25 @@ Patch309: wcn36xx-reduce-verbosity-of-drivers-messages.patch # https://www.spinics.net/lists/arm-kernel/msg632925.html Patch313: arm-crypto-sunxi-ss-Add-MODULE_ALIAS-to-sun4i-ss.patch -Patch314: bcm283x-gpio-expander.patch +# Fix USB on the RPi https://patchwork.kernel.org/patch/9879371/ +Patch320: bcm283x-dma-mapping-skip-USB-devices-when-configuring-DMA-during-probe.patch # https://www.spinics.net/lists/arm-kernel/msg621982.html -Patch315: bcm283x-Fix-probing-of-bcm2835-i2s.patch +Patch321: bcm283x-Fix-probing-of-bcm2835-i2s.patch # https://www.spinics.net/lists/arm-kernel/msg633942.html -Patch316: mmc-sdhci-iproc-Disable-preset-values-for-BCM2835.patch +Patch322: mmc-sdhci-iproc-Disable-preset-values-for-BCM2835.patch # https://www.spinics.net/lists/arm-kernel/msg633945.html -Patch317: bcm2835-hwrng-Handle-deferred-clock-properly.patch +Patch323: bcm2835-hwrng-Handle-deferred-clock-properly.patch -Patch318: bcm2837-rpi-initial-support-for-the-3.patch +Patch324: bcm283x-clk-audio-fixes.patch + +# Enabling Patches for the RPi3+ +Patch330: bcm2837-rpi-initial-support-for-the-3.patch +Patch331: bcm2837-gpio-expander.patch +Patch332: bcm2837-enable-pmu.patch +Patch333: bcm2837-lan78xx-fixes.patch # 400 - IBM (ppc/s390x) patches @@ -1878,6 +1882,10 @@ fi # # %changelog +* Mon Apr 2 2018 Peter Robinson +- Improvements for the Raspberry Pi 3+ +- Fixes and minor improvements to Raspberry Pi 2/3 + * Mon Apr 02 2018 Jeremy Cline - 4.16.0-1 - Linux v4.16 - Disable debugging options.