diff --git a/bcm2835-fix-bluetooth.patch b/bcm2835-fix-bluetooth.patch new file mode 100644 index 0000000..fd11078 --- /dev/null +++ b/bcm2835-fix-bluetooth.patch @@ -0,0 +1,109 @@ +From patchwork Sun Feb 25 14:10:52 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [1/4] Bluetooth: hci_bcm: Make shutdown and device wake GPIO optional +From: Stefan Wahren +X-Patchwork-Id: 10240917 +Message-Id: <1519567855-26105-2-git-send-email-stefan.wahren@i2se.com> +To: Loic Poulain , + =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= , + Marcel Holtmann , + Johan Hedberg , Eric Anholt , + Rob Herring , Mark Rutland +Cc: Stefan Wahren , devicetree@vger.kernel.org, + Florian Fainelli , + Phil Elwell , + linux-bluetooth@vger.kernel.org, Lukas Wunner , + linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org +Date: Sun, 25 Feb 2018 15:10:52 +0100 + +According to the devicetree binding the shutdown and device wake +GPIOs are optional. Since commit 3e81a4ca51a1 ("Bluetooth: hci_bcm: +Mandate presence of shutdown and device wake GPIO") this driver +won't probe anymore on Raspberry Pi 3 and Zero W (no device wake GPIO +connected). So fix this regression by reverting this commit partially. + +Cc: Lukas Wunner +Fixes: 3e81a4ca51a1 ("Bluetooth: hci_bcm: Mandate presence of shutdown and device wake GPIO") +Signed-off-by: Stefan Wahren +--- + drivers/bluetooth/hci_bcm.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c +index 0438a64..f8728eb 100644 +--- a/drivers/bluetooth/hci_bcm.c ++++ b/drivers/bluetooth/hci_bcm.c +@@ -922,12 +922,14 @@ static int bcm_get_resources(struct bcm_device *dev) + + dev->clk = devm_clk_get(dev->dev, NULL); + +- dev->device_wakeup = devm_gpiod_get(dev->dev, "device-wakeup", +- GPIOD_OUT_LOW); ++ dev->device_wakeup = devm_gpiod_get_optional(dev->dev, ++ "device-wakeup", ++ GPIOD_OUT_LOW); + if (IS_ERR(dev->device_wakeup)) + return PTR_ERR(dev->device_wakeup); + +- dev->shutdown = devm_gpiod_get(dev->dev, "shutdown", GPIOD_OUT_LOW); ++ dev->shutdown = devm_gpiod_get_optional(dev->dev, "shutdown", ++ GPIOD_OUT_LOW); + if (IS_ERR(dev->shutdown)) + return PTR_ERR(dev->shutdown); + +From patchwork Sun Feb 25 14:10:53 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [2/4] ARM: dts: bcm283x: Apply pull settings to Zero W relevant groups +From: Stefan Wahren +X-Patchwork-Id: 10240919 +Message-Id: <1519567855-26105-3-git-send-email-stefan.wahren@i2se.com> +To: Loic Poulain , + =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= , + Marcel Holtmann , + Johan Hedberg , Eric Anholt , + Rob Herring , Mark Rutland +Cc: Stefan Wahren , devicetree@vger.kernel.org, + Florian Fainelli , + Phil Elwell , + linux-bluetooth@vger.kernel.org, Lukas Wunner , + linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org +Date: Sun, 25 Feb 2018 15:10:53 +0100 + +Instead of keeping the firmware's pull settings, we better apply +them via the devicetree pin control. Start with the RPi Zero W relevant +first to keep the effort low. + +Signed-off-by: Stefan Wahren +--- + arch/arm/boot/dts/bcm283x.dtsi | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi +index 8d9a0df..1a50b67 100644 +--- a/arch/arm/boot/dts/bcm283x.dtsi ++++ b/arch/arm/boot/dts/bcm283x.dtsi +@@ -223,6 +223,7 @@ + gpclk2_gpio43: gpclk2_gpio43 { + brcm,pins = <43>; + brcm,function = ; ++ brcm,pull = ; + }; + + i2c0_gpio0: i2c0_gpio0 { +@@ -335,10 +336,12 @@ + uart0_ctsrts_gpio30: uart0_ctsrts_gpio30 { + brcm,pins = <30 31>; + brcm,function = ; ++ brcm,pull = ; + }; + uart0_gpio32: uart0_gpio32 { + brcm,pins = <32 33>; + brcm,function = ; ++ brcm,pull = ; + }; + uart0_gpio36: uart0_gpio36 { + brcm,pins = <36 37>; diff --git a/bcm2835-hwrng-Handle-deferred-clock-properly.patch b/bcm2835-hwrng-Handle-deferred-clock-properly.patch new file mode 100644 index 0000000..4b4cdfe --- /dev/null +++ b/bcm2835-hwrng-Handle-deferred-clock-properly.patch @@ -0,0 +1,42 @@ +From patchwork Mon Feb 12 20:11:36 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: hwrng: bcm2835: Handle deferred clock properly +From: Stefan Wahren +X-Patchwork-Id: 10214385 +Message-Id: <1518466296-30161-1-git-send-email-stefan.wahren@i2se.com> +To: Herbert Xu , Matt Mackall +Cc: Stefan Wahren , + Florian Fainelli , Arnd Bergmann , + Scott Branden , Jon Mason , + Greg Kroah-Hartman , + Eric Anholt , + bcm-kernel-feedback-list@broadcom.com, linux-crypto@vger.kernel.org, + Ray Jui , linux-arm-kernel@lists.infradead.org +Date: Mon, 12 Feb 2018 21:11:36 +0100 + +In case the probe of the clock is deferred, we would assume it is +optional. This is wrong, so defer the probe of this driver until +the clock is available. + +Fixes: 791af4f4907a ("hwrng: bcm2835 - Manage an optional clock") +Signed-off-by: Stefan Wahren +Acked-by: Florian Fainelli +--- + drivers/char/hw_random/bcm2835-rng.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c +index 7a84cec..6767d96 100644 +--- a/drivers/char/hw_random/bcm2835-rng.c ++++ b/drivers/char/hw_random/bcm2835-rng.c +@@ -163,6 +163,8 @@ static int bcm2835_rng_probe(struct platform_device *pdev) + + /* Clock is optional on most platforms */ + priv->clk = devm_clk_get(dev, NULL); ++ if (IS_ERR(priv->clk) && PTR_ERR(priv->clk) == -EPROBE_DEFER) ++ return -EPROBE_DEFER; + + priv->rng.name = pdev->name; + priv->rng.init = bcm2835_rng_init; diff --git a/bcm283x-Fix-probing-of-bcm2835-i2s.patch b/bcm283x-Fix-probing-of-bcm2835-i2s.patch new file mode 100644 index 0000000..911b2d9 --- /dev/null +++ b/bcm283x-Fix-probing-of-bcm2835-i2s.patch @@ -0,0 +1,118 @@ +From patchwork Fri Feb 16 10:55:33 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [V3, 1/2, + RESEND] dt-bindings: bcm283x: Fix register ranges of bcm2835-i2s +From: Stefan Wahren +X-Patchwork-Id: 10224429 +Message-Id: <1518778534-3328-2-git-send-email-stefan.wahren@i2se.com> +To: Rob Herring , Mark Rutland , + Eric Anholt +Cc: Stefan Wahren , devicetree@vger.kernel.org, + alsa-devel@alsa-project.org, Liam Girdwood , + Mark Brown , linux-rpi-kernel@lists.infradead.org, + linux-arm-kernel@lists.infradead.org +Date: Fri, 16 Feb 2018 11:55:33 +0100 + +Since 517e7a1537a ("ASoC: bcm2835: move to use the clock framework") +the bcm2835-i2s requires a clock as DT property. Unfortunately +the necessary DT change has never been applied. While we are at it +also fix the first PCM register range to cover the PCM_GRAY register. + +This patch only fixes the affected dt-bindings. + +Signed-off-by: Stefan Wahren +Reviewed-by: Eric Anholt +Reviewed-by: Rob Herring +--- + Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt | 4 ++-- + Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt | 9 ++++----- + 2 files changed, 6 insertions(+), 7 deletions(-) + +diff --git a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt b/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt +index baf9b34..b6a8cc0 100644 +--- a/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt ++++ b/Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt +@@ -74,8 +74,8 @@ Example: + + bcm2835_i2s: i2s@7e203000 { + compatible = "brcm,bcm2835-i2s"; +- reg = < 0x7e203000 0x20>, +- < 0x7e101098 0x02>; ++ reg = < 0x7e203000 0x24>; ++ clocks = <&clocks BCM2835_CLOCK_PCM>; + + dmas = <&dma 2>, + <&dma 3>; +diff --git a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt +index 65783de..7bb0362 100644 +--- a/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt ++++ b/Documentation/devicetree/bindings/sound/brcm,bcm2835-i2s.txt +@@ -2,9 +2,8 @@ + + Required properties: + - compatible: "brcm,bcm2835-i2s" +-- reg: A list of base address and size entries: +- * The first entry should cover the PCM registers +- * The second entry should cover the PCM clock registers ++- reg: Should contain PCM registers location and length. ++- clocks: the (PCM) clock to use + - dmas: List of DMA controller phandle and DMA request line ordered pairs. + - dma-names: Identifier string for each DMA request line in the dmas property. + These strings correspond 1:1 with the ordered pairs in dmas. +@@ -16,8 +15,8 @@ Example: + + bcm2835_i2s: i2s@7e203000 { + compatible = "brcm,bcm2835-i2s"; +- reg = <0x7e203000 0x20>, +- <0x7e101098 0x02>; ++ reg = <0x7e203000 0x24>; ++ clocks = <&clocks BCM2835_CLOCK_PCM>; + + dmas = <&dma 2>, + <&dma 3>; +From patchwork Fri Feb 16 10:55:34 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [V3,2/2,RESEND] ARM: dts: bcm283x: Fix probing of bcm2835-i2s +From: Stefan Wahren +X-Patchwork-Id: 10224427 +Message-Id: <1518778534-3328-3-git-send-email-stefan.wahren@i2se.com> +To: Rob Herring , Mark Rutland , + Eric Anholt +Cc: Stefan Wahren , devicetree@vger.kernel.org, + alsa-devel@alsa-project.org, Liam Girdwood , + Mark Brown , linux-rpi-kernel@lists.infradead.org, + linux-arm-kernel@lists.infradead.org +Date: Fri, 16 Feb 2018 11:55:34 +0100 + +Since 517e7a1537a ("ASoC: bcm2835: move to use the clock framework") +the bcm2835-i2s requires a clock as DT property. Unfortunately +the necessary DT change has never been applied. While we are at it +also fix the first PCM register range to cover the PCM_GRAY register. + +Fixes: 517e7a1537a ("ASoC: bcm2835: move to use the clock framework") +Signed-off-by: Stefan Wahren +Reviewed-by: Eric Anholt +Tested-by: Matthias Reichl +--- + 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 013431e..e08203c 100644 +--- a/arch/arm/boot/dts/bcm283x.dtsi ++++ b/arch/arm/boot/dts/bcm283x.dtsi +@@ -396,8 +396,8 @@ + + i2s: i2s@7e203000 { + compatible = "brcm,bcm2835-i2s"; +- reg = <0x7e203000 0x20>, +- <0x7e101098 0x02>; ++ reg = <0x7e203000 0x24>; ++ clocks = <&clocks BCM2835_CLOCK_PCM>; + + dmas = <&dma 2>, + <&dma 3>; diff --git a/bcm283x-gpio-expander.patch b/bcm283x-gpio-expander.patch new file mode 100644 index 0000000..55b7ec4 --- /dev/null +++ b/bcm283x-gpio-expander.patch @@ -0,0 +1,638 @@ +From patchwork Tue Feb 20 12:19:31 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v5,1/5] ARM: bcm2835: sync firmware properties with downstream +From: Baruch Siach +X-Patchwork-Id: 10229963 +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:31 +0200 + +Add latest firmware property tags from the latest Raspberry Pi downstream +kernel. This is needed for the GPIO tags, so we can control the GPIO +multiplexor lines. + +Acked-by: Stefan Wahren +Signed-off-by: Baruch Siach +--- +v4: No change + +v3: Add Stefan's ack + +v2: No change +--- + include/soc/bcm2835/raspberrypi-firmware.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h +index cb979ad90401..50df5b28d2c9 100644 +--- a/include/soc/bcm2835/raspberrypi-firmware.h ++++ b/include/soc/bcm2835/raspberrypi-firmware.h +@@ -63,6 +63,7 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_GET_MIN_VOLTAGE = 0x00030008, + RPI_FIRMWARE_GET_TURBO = 0x00030009, + RPI_FIRMWARE_GET_MAX_TEMPERATURE = 0x0003000a, ++ RPI_FIRMWARE_GET_STC = 0x0003000b, + RPI_FIRMWARE_ALLOCATE_MEMORY = 0x0003000c, + RPI_FIRMWARE_LOCK_MEMORY = 0x0003000d, + RPI_FIRMWARE_UNLOCK_MEMORY = 0x0003000e, +@@ -72,12 +73,22 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_SET_ENABLE_QPU = 0x00030012, + RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 0x00030014, + RPI_FIRMWARE_GET_EDID_BLOCK = 0x00030020, ++ RPI_FIRMWARE_GET_CUSTOMER_OTP = 0x00030021, + RPI_FIRMWARE_GET_DOMAIN_STATE = 0x00030030, + RPI_FIRMWARE_SET_CLOCK_STATE = 0x00038001, + RPI_FIRMWARE_SET_CLOCK_RATE = 0x00038002, + RPI_FIRMWARE_SET_VOLTAGE = 0x00038003, + RPI_FIRMWARE_SET_TURBO = 0x00038009, ++ RPI_FIRMWARE_SET_CUSTOMER_OTP = 0x00038021, + RPI_FIRMWARE_SET_DOMAIN_STATE = 0x00038030, ++ RPI_FIRMWARE_GET_GPIO_STATE = 0x00030041, ++ RPI_FIRMWARE_SET_GPIO_STATE = 0x00038041, ++ RPI_FIRMWARE_SET_SDHOST_CLOCK = 0x00038042, ++ RPI_FIRMWARE_GET_GPIO_CONFIG = 0x00030043, ++ RPI_FIRMWARE_SET_GPIO_CONFIG = 0x00038043, ++ RPI_FIRMWARE_GET_PERIPH_REG = 0x00030045, ++ RPI_FIRMWARE_SET_PERIPH_REG = 0x00038045, ++ + + /* Dispmanx TAGS */ + RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001, +@@ -91,6 +102,8 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 0x00040009, + RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 0x0004000a, + RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 0x0004000b, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 0x0004000f, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 0x00040010, + RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 0x00048001, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 0x00044004, +@@ -100,6 +113,7 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 0x00044009, + RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 0x0004400a, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 0x0004400b, ++ RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 0x0004400e, + RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 0x00048003, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 0x00048004, + RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 0x00048005, +@@ -108,6 +122,10 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009, + RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a, + RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 0x0004801f, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF = 0x00048020, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 0x0004800e, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 0x0004800f, + + RPI_FIRMWARE_VCHIQ_INIT = 0x00048010, + +From patchwork Tue Feb 20 12:19:32 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v5,2/5] dt-bindings: gpio: add raspberry pi GPIO expander binding +From: Baruch Siach +X-Patchwork-Id: 10229965 +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:32 +0200 + +The Raspberry Pi 3 GPIO expander is controlled by the VC4 firmware over +I2C. The firmware mailbox interface allows the ARM core to control the +GPIO lines. + +Signed-off-by: Baruch Siach +Reviewed-by: Rob Herring +--- +v5: + * Remove the 'firmware' property + * Note that the gpio node is a child of the firmware node + +v4: + * Move the example gpio node under the firmware node + * Rename gpio node name to plain 'gpio' + +v3: + * Rename node name. + +v2: + * Rename compatible string to raspberrypi,firmware-gpio +--- + .../bindings/gpio/raspberrypi,firmware-gpio.txt | 30 ++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + create mode 100644 Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt + +diff --git a/Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt b/Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt +new file mode 100644 +index 000000000000..ce97265e23ba +--- /dev/null ++++ b/Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt +@@ -0,0 +1,30 @@ ++Raspberry Pi GPIO expander ++ ++The Raspberry Pi 3 GPIO expander is controlled by the VC4 firmware. The ++firmware exposes a mailbox interface that allows the ARM core to control the ++GPIO lines on the expander. ++ ++The Raspberry Pi GPIO expander node must be a child node of the Raspberry Pi ++firmware node. ++ ++Required properties: ++ ++- compatible : Should be "raspberrypi,firmware-gpio" ++- gpio-controller : Marks the device node as a gpio controller ++- #gpio-cells : Should be two. The first cell is the pin number, and ++ the second cell is used to specify the gpio polarity: ++ 0 = active high ++ 1 = active low ++ ++Example: ++ ++firmware: firmware-rpi { ++ compatible = "raspberrypi,bcm2835-firmware"; ++ mboxes = <&mailbox>; ++ ++ expgpio: gpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ }; ++}; +From patchwork Tue Feb 20 12:19:33 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v5, + 3/5] gpio: raspberrypi-exp: Driver for RPi3 GPIO expander via mailbox + service +From: Baruch Siach +X-Patchwork-Id: 10229967 +Message-Id: <8c34f287ee72b340fa9d693aa0e304b25541c74c.1519128054.git.baruch@tkos.co.il> +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:33 +0200 + +From: Dave Stevenson + +Pi3 and Compute Module 3 have a GPIO expander that the +VPU communicates with. +There is a mailbox service that now allows control of this +expander, so add a kernel driver that can make use of it. + +Reviewed-by: Stefan Wahren +Signed-off-by: Dave Stevenson +Signed-off-by: Baruch Siach +--- +v5: + * Use the parent node to find the firmware + +v4: + * Don't set the .owner driver field + * Add Stefan's review tag + +v3: + * Tweak Kconfig driver prompt + * Make GPIO_RASPBERRYPI_EXP tristate + * Make COMPILE_TEST independent of RASPBERRYPI_FIRMWARE + * Remove redundant DMA header + * Use less code lines for dev_err() + * Check rpi_exp_gpio_get_polarity() return value + * Remove redundant platform_set_drvdata() call + +v2: + * Rename driver to gpio-raspberrypi-exp + * Populate the gpiochip parent device pointer + * Use macro for the mailbox base GPIO number + * Drop linux/gpio.h and GPIOF_DIR_* + * Check and print firmware error value + * Use devm_gpiochip_add_data(); drop .remove + * A few more minor tweaks +--- + drivers/gpio/Kconfig | 9 ++ + drivers/gpio/Makefile | 1 + + drivers/gpio/gpio-raspberrypi-exp.c | 252 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 262 insertions(+) + create mode 100644 drivers/gpio/gpio-raspberrypi-exp.c + +diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig +index 8dbb2280538d..fd0562a37f68 100644 +--- a/drivers/gpio/Kconfig ++++ b/drivers/gpio/Kconfig +@@ -122,6 +122,15 @@ config GPIO_ATH79 + Select this option to enable GPIO driver for + Atheros AR71XX/AR724X/AR913X SoC devices. + ++config GPIO_RASPBERRYPI_EXP ++ tristate "Raspberry Pi 3 GPIO Expander" ++ default RASPBERRYPI_FIRMWARE ++ depends on OF_GPIO ++ depends on (ARCH_BCM2835 && RASPBERRYPI_FIRMWARE) || COMPILE_TEST ++ help ++ Turn on GPIO support for the expander on Raspberry Pi 3 boards, using ++ the firmware mailbox to communicate with VideoCore on BCM283x chips. ++ + config GPIO_BCM_KONA + bool "Broadcom Kona GPIO" + depends on OF_GPIO && (ARCH_BCM_MOBILE || COMPILE_TEST) +diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile +index cccb0d40846c..76dc0a02bd56 100644 +--- a/drivers/gpio/Makefile ++++ b/drivers/gpio/Makefile +@@ -32,6 +32,7 @@ obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o + obj-$(CONFIG_GPIO_ARIZONA) += gpio-arizona.o + obj-$(CONFIG_GPIO_ATH79) += gpio-ath79.o + obj-$(CONFIG_GPIO_ASPEED) += gpio-aspeed.o ++obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o + obj-$(CONFIG_GPIO_BCM_KONA) += gpio-bcm-kona.o + obj-$(CONFIG_GPIO_BD9571MWV) += gpio-bd9571mwv.o + obj-$(CONFIG_GPIO_BRCMSTB) += gpio-brcmstb.o +diff --git a/drivers/gpio/gpio-raspberrypi-exp.c b/drivers/gpio/gpio-raspberrypi-exp.c +new file mode 100644 +index 000000000000..d6d36d537e37 +--- /dev/null ++++ b/drivers/gpio/gpio-raspberrypi-exp.c +@@ -0,0 +1,252 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Raspberry Pi 3 expander GPIO driver ++ * ++ * Uses the firmware mailbox service to communicate with the ++ * GPIO expander on the VPU. ++ * ++ * Copyright (C) 2017 Raspberry Pi Trading Ltd. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define MODULE_NAME "raspberrypi-exp-gpio" ++#define NUM_GPIO 8 ++ ++#define RPI_EXP_GPIO_BASE 128 ++ ++#define RPI_EXP_GPIO_DIR_IN 0 ++#define RPI_EXP_GPIO_DIR_OUT 1 ++ ++struct rpi_exp_gpio { ++ struct gpio_chip gc; ++ struct rpi_firmware *fw; ++}; ++ ++/* VC4 firmware mailbox interface data structures */ ++ ++struct gpio_set_config { ++ u32 gpio; ++ u32 direction; ++ u32 polarity; ++ u32 term_en; ++ u32 term_pull_up; ++ u32 state; ++}; ++ ++struct gpio_get_config { ++ u32 gpio; ++ u32 direction; ++ u32 polarity; ++ u32 term_en; ++ u32 term_pull_up; ++}; ++ ++struct gpio_get_set_state { ++ u32 gpio; ++ u32 state; ++}; ++ ++static int rpi_exp_gpio_get_polarity(struct gpio_chip *gc, unsigned int off) ++{ ++ struct rpi_exp_gpio *gpio; ++ struct gpio_get_config get; ++ int ret; ++ ++ gpio = gpiochip_get_data(gc); ++ ++ get.gpio = off + RPI_EXP_GPIO_BASE; /* GPIO to update */ ++ ++ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_GET_GPIO_CONFIG, ++ &get, sizeof(get)); ++ if (ret || get.gpio != 0) { ++ dev_err(gc->parent, "Failed to get GPIO %u config (%d %x)\n", ++ off, ret, get.gpio); ++ return ret ? ret : -EIO; ++ } ++ return get.polarity; ++} ++ ++static int rpi_exp_gpio_dir_in(struct gpio_chip *gc, unsigned int off) ++{ ++ struct rpi_exp_gpio *gpio; ++ struct gpio_set_config set_in; ++ int ret; ++ ++ gpio = gpiochip_get_data(gc); ++ ++ set_in.gpio = off + RPI_EXP_GPIO_BASE; /* GPIO to update */ ++ set_in.direction = RPI_EXP_GPIO_DIR_IN; ++ set_in.term_en = 0; /* termination disabled */ ++ set_in.term_pull_up = 0; /* n/a as termination disabled */ ++ set_in.state = 0; /* n/a as configured as an input */ ++ ++ ret = rpi_exp_gpio_get_polarity(gc, off); ++ if (ret < 0) ++ return ret; ++ set_in.polarity = ret; /* Retain existing setting */ ++ ++ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_SET_GPIO_CONFIG, ++ &set_in, sizeof(set_in)); ++ if (ret || set_in.gpio != 0) { ++ dev_err(gc->parent, "Failed to set GPIO %u to input (%d %x)\n", ++ off, ret, set_in.gpio); ++ return ret ? ret : -EIO; ++ } ++ return 0; ++} ++ ++static int rpi_exp_gpio_dir_out(struct gpio_chip *gc, unsigned int off, int val) ++{ ++ struct rpi_exp_gpio *gpio; ++ struct gpio_set_config set_out; ++ int ret; ++ ++ gpio = gpiochip_get_data(gc); ++ ++ set_out.gpio = off + RPI_EXP_GPIO_BASE; /* GPIO to update */ ++ set_out.direction = RPI_EXP_GPIO_DIR_OUT; ++ set_out.term_en = 0; /* n/a as an output */ ++ set_out.term_pull_up = 0; /* n/a as termination disabled */ ++ set_out.state = val; /* Output state */ ++ ++ ret = rpi_exp_gpio_get_polarity(gc, off); ++ if (ret < 0) ++ return ret; ++ set_out.polarity = ret; /* Retain existing setting */ ++ ++ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_SET_GPIO_CONFIG, ++ &set_out, sizeof(set_out)); ++ if (ret || set_out.gpio != 0) { ++ dev_err(gc->parent, "Failed to set GPIO %u to output (%d %x)\n", ++ off, ret, set_out.gpio); ++ return ret ? ret : -EIO; ++ } ++ return 0; ++} ++ ++static int rpi_exp_gpio_get_direction(struct gpio_chip *gc, unsigned int off) ++{ ++ struct rpi_exp_gpio *gpio; ++ struct gpio_get_config get; ++ int ret; ++ ++ gpio = gpiochip_get_data(gc); ++ ++ get.gpio = off + RPI_EXP_GPIO_BASE; /* GPIO to update */ ++ ++ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_GET_GPIO_CONFIG, ++ &get, sizeof(get)); ++ if (ret || get.gpio != 0) { ++ dev_err(gc->parent, ++ "Failed to get GPIO %u config (%d %x)\n", off, ret, ++ get.gpio); ++ return ret ? ret : -EIO; ++ } ++ return !get.direction; ++} ++ ++static int rpi_exp_gpio_get(struct gpio_chip *gc, unsigned int off) ++{ ++ struct rpi_exp_gpio *gpio; ++ struct gpio_get_set_state get; ++ int ret; ++ ++ gpio = gpiochip_get_data(gc); ++ ++ get.gpio = off + RPI_EXP_GPIO_BASE; /* GPIO to update */ ++ get.state = 0; /* storage for returned value */ ++ ++ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_GET_GPIO_STATE, ++ &get, sizeof(get)); ++ if (ret || get.gpio != 0) { ++ dev_err(gc->parent, ++ "Failed to get GPIO %u state (%d %x)\n", off, ret, ++ get.gpio); ++ return ret ? ret : -EIO; ++ } ++ return !!get.state; ++} ++ ++static void rpi_exp_gpio_set(struct gpio_chip *gc, unsigned int off, int val) ++{ ++ struct rpi_exp_gpio *gpio; ++ struct gpio_get_set_state set; ++ int ret; ++ ++ gpio = gpiochip_get_data(gc); ++ ++ set.gpio = off + RPI_EXP_GPIO_BASE; /* GPIO to update */ ++ set.state = val; /* Output state */ ++ ++ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_SET_GPIO_STATE, ++ &set, sizeof(set)); ++ if (ret || set.gpio != 0) ++ dev_err(gc->parent, ++ "Failed to set GPIO %u state (%d %x)\n", off, ret, ++ set.gpio); ++} ++ ++static int rpi_exp_gpio_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct device_node *np = dev->of_node; ++ struct device_node *fw_node; ++ struct rpi_firmware *fw; ++ struct rpi_exp_gpio *rpi_gpio; ++ ++ fw_node = of_get_parent(np); ++ if (!fw_node) { ++ dev_err(dev, "Missing firmware node\n"); ++ return -ENOENT; ++ } ++ ++ fw = rpi_firmware_get(fw_node); ++ if (!fw) ++ return -EPROBE_DEFER; ++ ++ rpi_gpio = devm_kzalloc(dev, sizeof(*rpi_gpio), GFP_KERNEL); ++ if (!rpi_gpio) ++ return -ENOMEM; ++ ++ rpi_gpio->fw = fw; ++ rpi_gpio->gc.parent = dev; ++ rpi_gpio->gc.label = MODULE_NAME; ++ rpi_gpio->gc.owner = THIS_MODULE; ++ rpi_gpio->gc.of_node = np; ++ rpi_gpio->gc.base = -1; ++ rpi_gpio->gc.ngpio = NUM_GPIO; ++ ++ rpi_gpio->gc.direction_input = rpi_exp_gpio_dir_in; ++ rpi_gpio->gc.direction_output = rpi_exp_gpio_dir_out; ++ rpi_gpio->gc.get_direction = rpi_exp_gpio_get_direction; ++ rpi_gpio->gc.get = rpi_exp_gpio_get; ++ rpi_gpio->gc.set = rpi_exp_gpio_set; ++ rpi_gpio->gc.can_sleep = true; ++ ++ return devm_gpiochip_add_data(dev, &rpi_gpio->gc, rpi_gpio); ++} ++ ++static const struct of_device_id rpi_exp_gpio_ids[] = { ++ { .compatible = "raspberrypi,firmware-gpio" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, rpi_exp_gpio_ids); ++ ++static struct platform_driver rpi_exp_gpio_driver = { ++ .driver = { ++ .name = MODULE_NAME, ++ .of_match_table = of_match_ptr(rpi_exp_gpio_ids), ++ }, ++ .probe = rpi_exp_gpio_probe, ++}; ++module_platform_driver(rpi_exp_gpio_driver); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Dave Stevenson "); ++MODULE_DESCRIPTION("Raspberry Pi 3 expander GPIO driver"); ++MODULE_ALIAS("platform:rpi-exp-gpio"); +From patchwork Tue Feb 20 12:19:34 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v5,4/5] ARM: dts: bcm2835: make the firmware node into a bus +From: Baruch Siach +X-Patchwork-Id: 10229961 +Message-Id: <43f9082a6835df6d7bcd3e16d79db687c52826d2.1519128054.git.baruch@tkos.co.il> +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:34 +0200 + +This allows adding devices for which the firmware exposes control interface +via the mailbox. An example of such device is the GPIO expander. + +Signed-off-by: Baruch Siach +Reviewed-by: Linus Walleij +--- +v4: New patch in this series +--- + arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi +index e36c392a2b8f..0198bd46ef7c 100644 +--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi ++++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi +@@ -18,7 +18,9 @@ + + soc { + firmware: firmware { +- compatible = "raspberrypi,bcm2835-firmware"; ++ compatible = "raspberrypi,bcm2835-firmware", "simple-bus"; ++ #address-cells = <0>; ++ #size-cells = <0>; + mboxes = <&mailbox>; + }; + +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. + +Acked-by: Stefan Wahren +Signed-off-by: Baruch Siach +Reviewed-by: Linus Walleij +--- +v5: + * Drop the 'firmware' property + +v4: + * Move the gpio node under the firmware node + * Rename the gpio node to plain 'gpio' + * Add Stefan's ack + +v3: + * List GPIO names one per line. + +v2: + * Move GPIO expander node out of the soc container + * Rename compatible string + * Add gpio-line-names property +--- + arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts +index 3e4ed7c5b0b3..0b31d995a066 100644 +--- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts ++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.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/configs/fedora/generic/CONFIG_TIMER_STATS b/configs/fedora/generic/CONFIG_TIMER_STATS deleted file mode 100644 index 0dfc820..0000000 --- a/configs/fedora/generic/CONFIG_TIMER_STATS +++ /dev/null @@ -1 +0,0 @@ -# CONFIG_TIMER_STATS is not set diff --git a/configs/fedora/generic/arm/CONFIG_GPIO_RASPBERRYPI_EXP b/configs/fedora/generic/arm/CONFIG_GPIO_RASPBERRYPI_EXP new file mode 100644 index 0000000..c98e757 --- /dev/null +++ b/configs/fedora/generic/arm/CONFIG_GPIO_RASPBERRYPI_EXP @@ -0,0 +1 @@ +CONFIG_GPIO_RASPBERRYPI_EXP=m diff --git a/configs/fedora/generic/arm/aarch64/CONFIG_HW_RANDOM_OMAP b/configs/fedora/generic/arm/aarch64/CONFIG_HW_RANDOM_OMAP deleted file mode 100644 index cf37a6e..0000000 --- a/configs/fedora/generic/arm/aarch64/CONFIG_HW_RANDOM_OMAP +++ /dev/null @@ -1 +0,0 @@ -CONFIG_HW_RANDOM_OMAP=m diff --git a/configs/fedora/generic/arm/armv7/CONFIG_HW_RANDOM_OMAP b/configs/fedora/generic/arm/armv7/CONFIG_HW_RANDOM_OMAP deleted file mode 100644 index cf37a6e..0000000 --- a/configs/fedora/generic/arm/armv7/CONFIG_HW_RANDOM_OMAP +++ /dev/null @@ -1 +0,0 @@ -CONFIG_HW_RANDOM_OMAP=m diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_HW_RANDOM_OMAP b/configs/fedora/generic/arm/armv7/armv7/CONFIG_HW_RANDOM_OMAP deleted file mode 100644 index cf37a6e..0000000 --- a/configs/fedora/generic/arm/armv7/armv7/CONFIG_HW_RANDOM_OMAP +++ /dev/null @@ -1 +0,0 @@ -CONFIG_HW_RANDOM_OMAP=m diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_MFD_TI_LMU b/configs/fedora/generic/arm/armv7/armv7/CONFIG_MFD_TI_LMU new file mode 100644 index 0000000..777cb90 --- /dev/null +++ b/configs/fedora/generic/arm/armv7/armv7/CONFIG_MFD_TI_LMU @@ -0,0 +1 @@ +CONFIG_MFD_TI_LMU=m diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_REGULATOR_LM363X b/configs/fedora/generic/arm/armv7/armv7/CONFIG_REGULATOR_LM363X new file mode 100644 index 0000000..a4610d5 --- /dev/null +++ b/configs/fedora/generic/arm/armv7/armv7/CONFIG_REGULATOR_LM363X @@ -0,0 +1 @@ +CONFIG_REGULATOR_LM363X=m diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_REMOTEPROC b/configs/fedora/generic/arm/armv7/armv7/CONFIG_REMOTEPROC deleted file mode 100644 index 5a1f9df..0000000 --- a/configs/fedora/generic/arm/armv7/armv7/CONFIG_REMOTEPROC +++ /dev/null @@ -1 +0,0 @@ -CONFIG_REMOTEPROC=m diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP index 582053b..0f7ea54 100644 --- a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP +++ b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP @@ -1 +1 @@ -CONFIG_SERIAL_8250_OMAP=m +CONFIG_SERIAL_8250_OMAP=y diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP new file mode 100644 index 0000000..cffbc1b --- /dev/null +++ b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP @@ -0,0 +1 @@ +CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP=y diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP index 0dbd205..1c036ec 100644 --- a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP +++ b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP @@ -1 +1 @@ -CONFIG_SERIAL_OMAP=y +# CONFIG_SERIAL_OMAP is not set diff --git a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP_CONSOLE b/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP_CONSOLE deleted file mode 100644 index 84ab44f..0000000 --- a/configs/fedora/generic/arm/armv7/armv7/CONFIG_SERIAL_OMAP_CONSOLE +++ /dev/null @@ -1 +0,0 @@ -CONFIG_SERIAL_OMAP_CONSOLE=y diff --git a/kernel-aarch64-debug.config b/kernel-aarch64-debug.config index 023854f..ce239f8 100644 --- a/kernel-aarch64-debug.config +++ b/kernel-aarch64-debug.config @@ -1810,6 +1810,7 @@ CONFIG_GPIO_PCF857X=m CONFIG_GPIO_PCI_IDIO_16=m # CONFIG_GPIO_PISOSR is not set CONFIG_GPIO_PL061=y +CONFIG_GPIO_RASPBERRYPI_EXP=m # CONFIG_GPIO_RDC321X is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_SX150X is not set @@ -5805,7 +5806,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_MI0283QT=m CONFIG_TINYDRM_MIPI_DBI=m diff --git a/kernel-aarch64.config b/kernel-aarch64.config index c48f570..90e9aee 100644 --- a/kernel-aarch64.config +++ b/kernel-aarch64.config @@ -1792,6 +1792,7 @@ CONFIG_GPIO_PCF857X=m CONFIG_GPIO_PCI_IDIO_16=m # CONFIG_GPIO_PISOSR is not set CONFIG_GPIO_PL061=y +CONFIG_GPIO_RASPBERRYPI_EXP=m # CONFIG_GPIO_RDC321X is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_SX150X is not set @@ -5781,7 +5782,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_MI0283QT=m CONFIG_TINYDRM_MIPI_DBI=m diff --git a/kernel-armv7hl-debug.config b/kernel-armv7hl-debug.config index 59f12cd..cf30358 100644 --- a/kernel-armv7hl-debug.config +++ b/kernel-armv7hl-debug.config @@ -1927,6 +1927,7 @@ CONFIG_GPIO_PCF857X=m CONFIG_GPIO_PCI_IDIO_16=m # CONFIG_GPIO_PISOSR is not set CONFIG_GPIO_PL061=y +CONFIG_GPIO_RASPBERRYPI_EXP=m # CONFIG_GPIO_RDC321X is not set # CONFIG_GPIO_SCH311X is not set CONFIG_GPIO_STMPE=y @@ -3288,7 +3289,7 @@ CONFIG_MFD_T7L66XB=y CONFIG_MFD_TC6387XB=y # CONFIG_MFD_TC6393XB is not set CONFIG_MFD_TI_AM335X_TSCADC=m -# CONFIG_MFD_TI_LMU is not set +CONFIG_MFD_TI_LMU=m # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TIMBERDALE is not set @@ -4765,6 +4766,7 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y CONFIG_REGULATOR_GPIO=m CONFIG_REGULATOR_ISL6271A=m CONFIG_REGULATOR_ISL9305=m +CONFIG_REGULATOR_LM363X=m CONFIG_REGULATOR_LP3971=m CONFIG_REGULATOR_LP3972=m CONFIG_REGULATOR_LP872X=y @@ -5416,7 +5418,8 @@ CONFIG_SERIAL_8250_MANY_PORTS=y # CONFIG_SERIAL_8250_MID is not set CONFIG_SERIAL_8250_MOXA=m CONFIG_SERIAL_8250_NR_UARTS=32 -CONFIG_SERIAL_8250_OMAP=m +CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP=y +CONFIG_SERIAL_8250_OMAP=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_RT288X=y @@ -5455,8 +5458,7 @@ CONFIG_SERIAL_MVEBU_CONSOLE=y CONFIG_SERIAL_MVEBU_UART=y # CONFIG_SERIAL_NONSTANDARD is not set CONFIG_SERIAL_OF_PLATFORM=y -CONFIG_SERIAL_OMAP_CONSOLE=y -CONFIG_SERIAL_OMAP=y +# CONFIG_SERIAL_OMAP is not set # CONFIG_SERIAL_PCH_UART is not set CONFIG_SERIAL_PXA_CONSOLE=y CONFIG_SERIAL_PXA=y @@ -6283,7 +6285,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_MI0283QT=m CONFIG_TINYDRM_MIPI_DBI=m diff --git a/kernel-armv7hl-lpae-debug.config b/kernel-armv7hl-lpae-debug.config index 47770a4..cfbb4d7 100644 --- a/kernel-armv7hl-lpae-debug.config +++ b/kernel-armv7hl-lpae-debug.config @@ -1828,6 +1828,7 @@ CONFIG_GPIO_PCF857X=m CONFIG_GPIO_PCI_IDIO_16=m # CONFIG_GPIO_PISOSR is not set CONFIG_GPIO_PL061=y +CONFIG_GPIO_RASPBERRYPI_EXP=m # CONFIG_GPIO_RDC321X is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_SX150X is not set @@ -5874,7 +5875,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TI_MESSAGE_MANAGER=m CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_MI0283QT=m diff --git a/kernel-armv7hl-lpae.config b/kernel-armv7hl-lpae.config index 5640a35..5c73e5d 100644 --- a/kernel-armv7hl-lpae.config +++ b/kernel-armv7hl-lpae.config @@ -1810,6 +1810,7 @@ CONFIG_GPIO_PCF857X=m CONFIG_GPIO_PCI_IDIO_16=m # CONFIG_GPIO_PISOSR is not set CONFIG_GPIO_PL061=y +CONFIG_GPIO_RASPBERRYPI_EXP=m # CONFIG_GPIO_RDC321X is not set # CONFIG_GPIO_SCH311X is not set # CONFIG_GPIO_SX150X is not set @@ -5850,7 +5851,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TI_MESSAGE_MANAGER=m CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_MI0283QT=m diff --git a/kernel-armv7hl.config b/kernel-armv7hl.config index 6408026..c9c3b6d 100644 --- a/kernel-armv7hl.config +++ b/kernel-armv7hl.config @@ -1909,6 +1909,7 @@ CONFIG_GPIO_PCF857X=m CONFIG_GPIO_PCI_IDIO_16=m # CONFIG_GPIO_PISOSR is not set CONFIG_GPIO_PL061=y +CONFIG_GPIO_RASPBERRYPI_EXP=m # CONFIG_GPIO_RDC321X is not set # CONFIG_GPIO_SCH311X is not set CONFIG_GPIO_STMPE=y @@ -3267,7 +3268,7 @@ CONFIG_MFD_T7L66XB=y CONFIG_MFD_TC6387XB=y # CONFIG_MFD_TC6393XB is not set CONFIG_MFD_TI_AM335X_TSCADC=m -# CONFIG_MFD_TI_LMU is not set +CONFIG_MFD_TI_LMU=m # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TIMBERDALE is not set @@ -4742,6 +4743,7 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y CONFIG_REGULATOR_GPIO=m CONFIG_REGULATOR_ISL6271A=m CONFIG_REGULATOR_ISL9305=m +CONFIG_REGULATOR_LM363X=m CONFIG_REGULATOR_LP3971=m CONFIG_REGULATOR_LP3972=m CONFIG_REGULATOR_LP872X=y @@ -5393,7 +5395,8 @@ CONFIG_SERIAL_8250_MANY_PORTS=y # CONFIG_SERIAL_8250_MID is not set CONFIG_SERIAL_8250_MOXA=m CONFIG_SERIAL_8250_NR_UARTS=32 -CONFIG_SERIAL_8250_OMAP=m +CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP=y +CONFIG_SERIAL_8250_OMAP=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_RT288X=y @@ -5432,8 +5435,7 @@ CONFIG_SERIAL_MVEBU_CONSOLE=y CONFIG_SERIAL_MVEBU_UART=y # CONFIG_SERIAL_NONSTANDARD is not set CONFIG_SERIAL_OF_PLATFORM=y -CONFIG_SERIAL_OMAP_CONSOLE=y -CONFIG_SERIAL_OMAP=y +# CONFIG_SERIAL_OMAP is not set # CONFIG_SERIAL_PCH_UART is not set CONFIG_SERIAL_PXA_CONSOLE=y CONFIG_SERIAL_PXA=y @@ -6259,7 +6261,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TINYDRM_ILI9225=m CONFIG_TINYDRM_MI0283QT=m CONFIG_TINYDRM_MIPI_DBI=m diff --git a/kernel-i686-PAE.config b/kernel-i686-PAE.config index bf503e1..2a38705 100644 --- a/kernel-i686-PAE.config +++ b/kernel-i686-PAE.config @@ -5440,7 +5440,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-i686-PAEdebug.config b/kernel-i686-PAEdebug.config index 5a2e8c6..da863e5 100644 --- a/kernel-i686-PAEdebug.config +++ b/kernel-i686-PAEdebug.config @@ -5463,7 +5463,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-i686-debug.config b/kernel-i686-debug.config index 487f2b7..1420b76 100644 --- a/kernel-i686-debug.config +++ b/kernel-i686-debug.config @@ -5463,7 +5463,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-i686.config b/kernel-i686.config index 6ebbf41..898c565 100644 --- a/kernel-i686.config +++ b/kernel-i686.config @@ -5440,7 +5440,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-ppc64-debug.config b/kernel-ppc64-debug.config index eb1ec4f..3289aff 100644 --- a/kernel-ppc64-debug.config +++ b/kernel-ppc64-debug.config @@ -5227,7 +5227,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-ppc64.config b/kernel-ppc64.config index 9ad2854..f211e4b 100644 --- a/kernel-ppc64.config +++ b/kernel-ppc64.config @@ -5202,7 +5202,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-ppc64le-debug.config b/kernel-ppc64le-debug.config index 6d64d56..59b3e81 100644 --- a/kernel-ppc64le-debug.config +++ b/kernel-ppc64le-debug.config @@ -5155,7 +5155,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-ppc64le.config b/kernel-ppc64le.config index 46135f8..93ed61a 100644 --- a/kernel-ppc64le.config +++ b/kernel-ppc64le.config @@ -5130,7 +5130,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-s390x-debug.config b/kernel-s390x-debug.config index 37d0c75..c05b3c5 100644 --- a/kernel-s390x-debug.config +++ b/kernel-s390x-debug.config @@ -5049,7 +5049,6 @@ CONFIG_TIFM_7XX1=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-s390x.config b/kernel-s390x.config index 0044620..21eafc9 100644 --- a/kernel-s390x.config +++ b/kernel-s390x.config @@ -5024,7 +5024,6 @@ CONFIG_TIFM_7XX1=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-x86_64-debug.config b/kernel-x86_64-debug.config index 926a0f2..be00d23 100644 --- a/kernel-x86_64-debug.config +++ b/kernel-x86_64-debug.config @@ -5553,7 +5553,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel-x86_64.config b/kernel-x86_64.config index eeaf805..ade2b9c 100644 --- a/kernel-x86_64.config +++ b/kernel-x86_64.config @@ -5530,7 +5530,6 @@ CONFIG_TIFM_CORE=m CONFIG_TIGON3_HWMON=y CONFIG_TIGON3=m # CONFIG_TIMB_DMA is not set -# CONFIG_TIMER_STATS is not set CONFIG_TIPC=m # CONFIG_TIPC_MEDIA_IB is not set CONFIG_TIPC_MEDIA_UDP=y diff --git a/kernel.spec b/kernel.spec index feab5c6..70b7c96 100644 --- a/kernel.spec +++ b/kernel.spec @@ -24,7 +24,7 @@ Summary: The Linux kernel %global zipsed -e 's/\.ko$/\.ko.xz/' %endif -# define buildid .local +%define buildid .rpi3 # baserelease defines which build revision of this kernel version we're # building. We used to call this fedora_build, but the magical name @@ -595,6 +595,20 @@ Patch311: arm-clk-bcm2835-hdmi-fixes.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 + +# https://www.spinics.net/lists/arm-kernel/msg621982.html +Patch315: 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 + +# https://www.spinics.net/lists/arm-kernel/msg633945.html +Patch317: bcm2835-hwrng-Handle-deferred-clock-properly.patch + +# https://www.spinics.net/lists/linux-bluetooth/msg74414.html +Patch318: bcm2835-fix-bluetooth.patch + # 400 - IBM (ppc/s390x) patches # 500 - Temp fixes/CVEs etc @@ -1863,6 +1877,12 @@ fi # # %changelog +* Sat Mar 3 2018 Peter Robinson +- Add GPIO expander driver for Raspberry Pi 3 +- Some Raspberry Pi fixes +- Switch OMAP serial driver to new 8250 driver +- General ARM updates + * Fri Mar 02 2018 Jeremy Cline - 4.16.0-0.rc3.git4.1 - Linux v4.16-rc3-245-g5d60e057d127 diff --git a/mmc-sdhci-iproc-Disable-preset-values-for-BCM2835.patch b/mmc-sdhci-iproc-Disable-preset-values-for-BCM2835.patch new file mode 100644 index 0000000..7b3b2c0 --- /dev/null +++ b/mmc-sdhci-iproc-Disable-preset-values-for-BCM2835.patch @@ -0,0 +1,37 @@ +From patchwork Mon Feb 12 20:02:44 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: mmc: sdhci-iproc: Disable preset values for BCM2835 +From: Stefan Wahren +X-Patchwork-Id: 10214367 +Message-Id: <1518465764-30051-1-git-send-email-stefan.wahren@i2se.com> +To: Adrian Hunter , + Ulf Hansson +Cc: Eric Anholt , Ray Jui , + Scott Branden , Jon Mason , + linux-arm-kernel@lists.infradead.org, + bcm-kernel-feedback-list@broadcom.com, linux-mmc@vger.kernel.org, + Stefan Wahren +Date: Mon, 12 Feb 2018 21:02:44 +0100 + +According to the BCM2835 datasheet there are no preset value registers. +This wasn't an issue before, because we didn't propagate 1.8V support. + +Signed-off-by: Stefan Wahren +--- + drivers/mmc/host/sdhci-iproc.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c +index 61666d2..0ef741b 100644 +--- a/drivers/mmc/host/sdhci-iproc.c ++++ b/drivers/mmc/host/sdhci-iproc.c +@@ -214,6 +214,7 @@ static const struct sdhci_pltfm_data sdhci_bcm2835_pltfm_data = { + SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | + SDHCI_QUIRK_MISSING_CAPS | + SDHCI_QUIRK_NO_HISPD_BIT, ++ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN, + .ops = &sdhci_iproc_32only_ops, + }; +