diff --git a/root/package/kernel/brcm2708-gpu-fw/Makefile b/root/package/kernel/brcm2708-gpu-fw/Makefile index 25ea8295..75c1885f 100644 --- a/root/package/kernel/brcm2708-gpu-fw/Makefile +++ b/root/package/kernel/brcm2708-gpu-fw/Makefile @@ -1,6 +1,7 @@ # # Copyright (C) 2012-2016 OpenWrt.org # Copyright (C) 2017 LEDE project +# Copyright (C) 2018 Ycarus (Yannick Chabanois) # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,8 +10,8 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=brcm2708-gpu-fw -PKG_VERSION:=2018-03-26 -PKG_RELEASE:=75de5d7a5ccaeb2dc499c38bcd95593ca76a6269 +PKG_VERSION:=2018-04-06 +PKG_RELEASE:=3aa806091dc57b757790b026c01754883cee2abc PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)/rpi-firmware-$(PKG_RELEASE) @@ -49,7 +50,7 @@ define Download/fixup_cd_dat FILE:=$(RPI_FIRMWARE_FILE)-fixup_cd.dat URL:=$(RPI_FIRMWARE_URL) URL_FILE:=fixup_cd.dat - HASH:=ea8d0e1cc55755652c63ccf41e3f1987b73de7fb0d74baee5aa8f2147391ce48 + HASH:=83109aff303b871ae68e8a5e214639d4795bdaebfaa7de58cd680065b7822c5f endef $(eval $(call Download,fixup_cd_dat)) @@ -57,7 +58,7 @@ define Download/start_elf FILE:=$(RPI_FIRMWARE_FILE)-start.elf URL:=$(RPI_FIRMWARE_URL) URL_FILE:=start.elf - HASH:=44922983955dedb52057265ef0e1130da682ee92819283c0fc819c7e6c512d24 + HASH:=83109aff303b871ae68e8a5e214639d4795bdaebfaa7de58cd680065b7822c5f endef $(eval $(call Download,start_elf)) @@ -65,7 +66,7 @@ define Download/start_cd_elf FILE:=$(RPI_FIRMWARE_FILE)-start_cd.elf URL:=$(RPI_FIRMWARE_URL) URL_FILE:=start_cd.elf - HASH:=dccf2e4cd106b9568b7759fcc6de3e3bbbdab4c5262310f89f3b76d7e46f668e + HASH:=e283f91a728a4046ff7143de87326187c4cdbc29d335812537ae3872251323c5 endef $(eval $(call Download,start_cd_elf)) diff --git a/root/target/linux/brcm2708/patches-4.14/0278-overlays-use-all-seven-dwc2-gadget-fifos.patch b/root/target/linux/brcm2708/patches-4.14/0278-overlays-use-all-seven-dwc2-gadget-fifos.patch new file mode 100644 index 00000000..256e46a2 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0278-overlays-use-all-seven-dwc2-gadget-fifos.patch @@ -0,0 +1,32 @@ +From bc80536c9c9a429db34f96d98549b98ee026df63 Mon Sep 17 00:00:00 2001 +From: hexameron +Date: Tue, 20 Mar 2018 12:48:10 +0000 +Subject: [PATCH 278/297] overlays: use all seven dwc2 gadget fifos. + +Linux 4.9 needed fifos to be set to their default values, + leaving the last one (silently) set to zero size. +From 4.12 Linux allows fifos to be set to any size EXCEPT zero. + +Resolves https://github.com/raspberrypi/linux/issues/2390 + +Signed-off-by: John Greb +--- + arch/arm/boot/dts/overlays/dwc2-overlay.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/overlays/dwc2-overlay.dts b/arch/arm/boot/dts/overlays/dwc2-overlay.dts +index 265a16bab008..d6c223bc559a 100644 +--- a/arch/arm/boot/dts/overlays/dwc2-overlay.dts ++++ b/arch/arm/boot/dts/overlays/dwc2-overlay.dts +@@ -15,7 +15,7 @@ + dr_mode = "otg"; + g-np-tx-fifo-size = <32>; + g-rx-fifo-size = <256>; +- g-tx-fifo-size = <512 512 512 512 512 768>; ++ g-tx-fifo-size = <512 512 512 512 512 256 256>; + status = "okay"; + }; + }; +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0279-overlays-Update-upstream-overlay-with-new-dwc2.patch b/root/target/linux/brcm2708/patches-4.14/0279-overlays-Update-upstream-overlay-with-new-dwc2.patch new file mode 100644 index 00000000..2675acbc --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0279-overlays-Update-upstream-overlay-with-new-dwc2.patch @@ -0,0 +1,26 @@ +From 69c1d8b43a86a07dec8dabf5503296da509c6d1c Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 21 Mar 2018 13:53:39 +0000 +Subject: [PATCH 279/297] overlays: Update 'upstream' overlay with new dwc2 + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/overlays/upstream-overlay.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/overlays/upstream-overlay.dts b/arch/arm/boot/dts/overlays/upstream-overlay.dts +index 3890d900486f..ff37a5013de4 100644 +--- a/arch/arm/boot/dts/overlays/upstream-overlay.dts ++++ b/arch/arm/boot/dts/overlays/upstream-overlay.dts +@@ -126,7 +126,7 @@ + dr_mode = "otg"; + g-np-tx-fifo-size = <32>; + g-rx-fifo-size = <256>; +- g-tx-fifo-size = <512 512 512 512 512 768>; ++ g-tx-fifo-size = <512 512 512 512 512 256 256>; + status = "okay"; + }; + }; +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0280-lan78xx-Read-LED-states-from-Device-Tree.patch b/root/target/linux/brcm2708/patches-4.14/0280-lan78xx-Read-LED-states-from-Device-Tree.patch new file mode 100644 index 00000000..6c8c43db --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0280-lan78xx-Read-LED-states-from-Device-Tree.patch @@ -0,0 +1,72 @@ +From a32256581a6be7e3315af44802ae217f1816af8c Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 21 Mar 2018 15:59:26 +0000 +Subject: [PATCH 280/297] lan78xx: Read LED states from Device Tree + +Add support for DT property "microchip,led-modes", a vector of two +cells (u32s) in the range 0-15, each of which sets the mode for one +of the two LEDs. The possible values are: + + 0=link/activity 1=link1000/activity + 2=link100/activity 3=link10/activity + 4=link100/1000/activity 5=link10/1000/activity + 6=link10/100/activity 14=off 15=on + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 53c6dbaf8425..52593368a48d 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2017,7 +2017,9 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + { + int ret; + u32 mii_adv; +- u32 led_modes; ++ u32 led_modes[2]; ++ u32 led_modes_reg; ++ int i; + struct phy_device *phydev = dev->net->phydev; + + phydev = phy_find_first(dev->mdiobus); +@@ -2090,18 +2092,27 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); + phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv); + +- /* Change LED defaults: +- * orange = link1000/activity +- * green = link10/link100/activity ++ /* Set LED modes: + * led: 0=link/activity 1=link1000/activity + * 2=link100/activity 3=link10/activity + * 4=link100/1000/activity 5=link10/1000/activity + * 6=link10/100/activity 14=off 15=on + */ +- led_modes = phy_read(phydev, 0x1d); +- led_modes &= ~0xff; +- led_modes |= (1 << 0) | (6 << 4); +- (void)phy_write(phydev, 0x1d, led_modes); ++ ++ memset(led_modes, ~0, sizeof(led_modes)); ++ ++ of_property_read_u32_array(dev->udev->dev.of_node, ++ "microchip,led-modes", ++ led_modes, ARRAY_SIZE(led_modes)); ++ ++ led_modes_reg = phy_read(phydev, 0x1d); ++ for (i = 0; i < ARRAY_SIZE(led_modes); i++) { ++ if (led_modes[i] != ~0) { ++ led_modes_reg &= ~(0xf << (i * 4)); ++ led_modes_reg |= (led_modes[i] & 0xf) << (i * 4); ++ } ++ } ++ (void)phy_write(phydev, 0x1d, led_modes_reg); + + genphy_config_aneg(phydev); + +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0281-BCM27XX_DT-Set-LED-modes-from-Device-Tree.patch b/root/target/linux/brcm2708/patches-4.14/0281-BCM27XX_DT-Set-LED-modes-from-Device-Tree.patch new file mode 100644 index 00000000..e2f4edc1 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0281-BCM27XX_DT-Set-LED-modes-from-Device-Tree.patch @@ -0,0 +1,67 @@ +From 06e903ade73529bd4e36d68e52da48a397033ef5 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 21 Mar 2018 16:04:18 +0000 +Subject: [PATCH 281/297] BCM27XX_DT: Set LED modes from Device Tree + +The new default values for LAN7515 (LAN7800) are: + + LED0 = 1 (link1000/activity) + LED1 = 6 (link10/link100/activity) + +Also add two dtparams - eth_led0 and eth_led1 - to provide user control +over the LEDs. + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 7 +++++++ + arch/arm/boot/dts/overlays/README | 10 ++++++++++ + 2 files changed, 17 insertions(+) + +diff --git a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi +index 1b1075d4aa5c..154d48b7c45d 100644 +--- a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi ++++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi +@@ -22,6 +22,11 @@ + reg = <1>; + microchip,eee-enabled; + microchip,tx-lpi-timer = <600>; /* non-aggressive*/ ++ /* ++ * led0 = 1:link1000/activity ++ * led1 = 6:link10/100/activity ++ */ ++ microchip,led-modes = <1 6>; + }; + }; + }; +@@ -32,5 +37,7 @@ + __overrides__ { + eee = <ðernet>,"microchip,eee-enabled?"; + tx_lpi_timer = <ðernet>,"microchip,tx-lpi-timer:0"; ++ eth_led0 = <ðernet>,"microchip,led-modes:0"; ++ eth_led1 = <ðernet>,"microchip,led-modes:4"; + }; + }; +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 3e260a9325fb..9652c741377b 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -93,6 +93,16 @@ Params: + compatible devices (default "on"). See also + "tx_lpi_timer". + ++ eth_led0 Set mode of LED0 (usually orange) (default ++ "1"). The legal values are: ++ 0=link/activity 1=link1000/activity ++ 2=link100/activity 3=link10/activity ++ 4=link100/1000/activity 5=link10/1000/activity ++ 6=link10/100/activity 14=off 15=on ++ ++ eth_led1 Set mode of LED1 (usually green) (default ++ "6"). See eth_led0 for legal values. ++ + i2c_arm Set to "on" to enable the ARM's i2c interface + (default "off") + +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0282-This-commit-adds-support-for-RP3-B-Plus-in-in-arch-a.patch b/root/target/linux/brcm2708/patches-4.14/0282-This-commit-adds-support-for-RP3-B-Plus-in-in-arch-a.patch new file mode 100644 index 00000000..810bd433 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0282-This-commit-adds-support-for-RP3-B-Plus-in-in-arch-a.patch @@ -0,0 +1,59 @@ +From 74b4a1d8a7906120d69ef2312e503bc628590a8b Mon Sep 17 00:00:00 2001 +From: derpeter +Date: Sun, 25 Mar 2018 23:27:30 +0200 +Subject: [PATCH 282/297] This commit adds support for RP3-B-Plus in in arch + arm64 (#2464) + +--- + arch/arm64/boot/dts/broadcom/Makefile | 1 + + arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts | 3 +++ + arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi | 1 + + arch/arm64/configs/bcmrpi3_defconfig | 1 + + 4 files changed, 6 insertions(+) + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts + create mode 120000 arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi + +diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile +index 3adfeab86f3f..f056f542dac4 100644 +--- a/arch/arm64/boot/dts/broadcom/Makefile ++++ b/arch/arm64/boot/dts/broadcom/Makefile +@@ -8,6 +8,7 @@ endif + dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb + dtb-$(CONFIG_ARCH_BCM2709) += bcm2710-rpi-3-b.dtb + dtb-$(CONFIG_ARCH_BCM2835) += bcm2710-rpi-3-b.dtb ++dtb-$(CONFIG_ARCH_BCM2835) += bcm2710-rpi-3-b-plus.dtb + + dts-dirs += ../overlays + +diff --git a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts +new file mode 100644 +index 000000000000..d9242ff77079 +--- /dev/null ++++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts +@@ -0,0 +1,3 @@ ++#define RPI364 ++ ++#include "../../../../arm/boot/dts/bcm2710-rpi-3-b-plus.dts" +diff --git a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi +new file mode 120000 +index 000000000000..fc4c05bbe7fd +--- /dev/null ++++ b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi +@@ -0,0 +1 @@ ++../../../../arm/boot/dts/bcm283x-rpi-lan7515.dtsi +\ No newline at end of file +diff --git a/arch/arm64/configs/bcmrpi3_defconfig b/arch/arm64/configs/bcmrpi3_defconfig +index 43052ca2aa35..50acf25b1f28 100644 +--- a/arch/arm64/configs/bcmrpi3_defconfig ++++ b/arch/arm64/configs/bcmrpi3_defconfig +@@ -479,6 +479,7 @@ CONFIG_USB_NET_SR9700=m + CONFIG_USB_NET_SR9800=m + CONFIG_USB_NET_SMSC75XX=m + CONFIG_USB_NET_SMSC95XX=y ++CONFIG_USB_LAN78XX=y + CONFIG_USB_NET_GL620A=m + CONFIG_USB_NET_NET1080=m + CONFIG_USB_NET_PLUSB=m +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0283-Add-overlay-for-Semtech-SX150X-I2C-GPIO-Expanders.patch b/root/target/linux/brcm2708/patches-4.14/0283-Add-overlay-for-Semtech-SX150X-I2C-GPIO-Expanders.patch new file mode 100644 index 00000000..e93dc005 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0283-Add-overlay-for-Semtech-SX150X-I2C-GPIO-Expanders.patch @@ -0,0 +1,1769 @@ +From 9e22852c05a75d2be953a08f0fff7c01c74cc700 Mon Sep 17 00:00:00 2001 +From: wavelet2 +Date: Thu, 22 Mar 2018 19:08:02 +0000 +Subject: [PATCH 283/297] Add overlay for Semtech SX150X I2C GPIO Expanders + +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 19 + + arch/arm/boot/dts/overlays/sx150x-overlay.dts | 1706 +++++++++++++++++++++++++ + 3 files changed, 1726 insertions(+) + create mode 100644 arch/arm/boot/dts/overlays/sx150x-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index 64ea686d6495..dcc64b5a3237 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -120,6 +120,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + spi2-2cs.dtbo \ + spi2-3cs.dtbo \ + superaudioboard.dtbo \ ++ sx150x.dtbo \ + tinylcd35.dtbo \ + uart0.dtbo \ + uart1.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 9652c741377b..dd2575cf7def 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -1703,6 +1703,25 @@ Load: dtoverlay=superaudioboard,= + Params: gpiopin GPIO pin for codec reset + + ++Name: sx150x ++Info: Configures the Semtech SX150X I2C GPIO expanders. ++Load: dtoverlay=sx150x,= ++Params: sx150-- Enables SX150X device on I2C# with slave ++ address . may be 1-9. may be 0 or 1. ++ Permissible values of (which is denoted in ++ hex) depend on the device variant. For SX1501, ++ SX1502, SX1504 and SX1505, may be 20 or 21. ++ For SX1503 and SX1506, may be 20. For ++ SX1507 and SX1509, may be 3E, 3F, 70 or 71. ++ For SX1508, may be 20, 21, 22 or 23. ++ ++ sx150---int-gpio ++ Integer, enables interrupts on SX150X device on ++ I2C# with slave address , specifies ++ the GPIO pin to which NINT output of SX150X is ++ connected. ++ ++ + Name: tinylcd35 + Info: 3.5" Color TFT Display by www.tinylcd.com + Options: Touch, RTC, keypad +diff --git a/arch/arm/boot/dts/overlays/sx150x-overlay.dts b/arch/arm/boot/dts/overlays/sx150x-overlay.dts +new file mode 100644 +index 000000000000..0321b292c133 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/sx150x-overlay.dts +@@ -0,0 +1,1706 @@ ++// Definitions for SX150x I2C GPIO Expanders from Semtech ++ ++// dtparams: ++// sx150-- - Enables SX150X device on I2C# with slave address . may be 1-9. ++// may be 0 or 1. Permissible values of (which is denoted in hex) ++// depend on the device variant. ++// For SX1501, SX1502, SX1504 and SX1505, may be 20 or 21. ++// For SX1503 and SX1506, may be 20. ++// For SX1507 and SX1509, may be 3E, 3F, 70 or 71. ++// For SX1508, may be 20, 21, 22 or 23. ++// sx150---int-gpio - Integer, enables interrupts on SX150X device on I2C# with slave address , ++// specifies the GPIO pin to which NINT output of SX150X is connected. ++// ++// ++// Example 1: A single SX1505 device on I2C#1 with its slave address set to 0x20 and NINT output connected to GPIO25: ++// dtoverlay=sx150x:sx1505-1-20,sx1505-1-20-int-gpio=25 ++// ++// Example 2: Two SX1507 devices on I2C#0 with their slave addresses set to 0x3E and 0x70 (interrupts not used): ++// dtoverlay=sx150x:sx1507-0-3E,sx1507-0-70 ++ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; ++ ++ // Enable I2C#0 interface ++ fragment@0 { ++ target = <&i2c0>; ++ __dormant__ { ++ status = "okay"; ++ }; ++ }; ++ ++ // Enable I2C#1 interface ++ fragment@1 { ++ target = <&i2c1>; ++ __dormant__ { ++ status = "okay"; ++ }; ++ }; ++ ++ // Enable a SX1501 on I2C#0 at slave addr 0x20 ++ fragment@2 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1501_0_20: sx150x@20 { ++ compatible = "semtech,sx1501q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1501-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1501 on I2C#1 at slave addr 0x20 ++ fragment@3 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1501_1_20: sx150x@20 { ++ compatible = "semtech,sx1501q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1501-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1501 on I2C#0 at slave addr 0x21 ++ fragment@4 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1501_0_21: sx150x@21 { ++ compatible = "semtech,sx1501q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1501-0-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1501 on I2C#1 at slave addr 0x21 ++ fragment@5 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1501_1_21: sx150x@21 { ++ compatible = "semtech,sx1501q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1501-1-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1502 on I2C#0 at slave addr 0x20 ++ fragment@6 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1502_0_20: sx150x@20 { ++ compatible = "semtech,sx1502q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1502-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1502 on I2C#1 at slave addr 0x20 ++ fragment@7 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1502_1_20: sx150x@20 { ++ compatible = "semtech,sx1502q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1502-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1502 on I2C#0 at slave addr 0x21 ++ fragment@8 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1502_0_21: sx150x@21 { ++ compatible = "semtech,sx1502q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1502-0-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1502 on I2C#1 at slave addr 0x21 ++ fragment@9 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1502_1_21: sx150x@21 { ++ compatible = "semtech,sx1502q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1501-1-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1503 on I2C#0 at slave addr 0x20 ++ fragment@10 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1503_0_20: sx150x@20 { ++ compatible = "semtech,sx1503q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1503-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1503 on I2C#1 at slave addr 0x20 ++ fragment@11 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1503_1_20: sx150x@20 { ++ compatible = "semtech,sx1503q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1503-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1504 on I2C#0 at slave addr 0x20 ++ fragment@12 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1504_0_20: sx150x@20 { ++ compatible = "semtech,sx1504q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1504-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1504 on I2C#1 at slave addr 0x20 ++ fragment@13 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1504_1_20: sx150x@20 { ++ compatible = "semtech,sx1504q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1504-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1504 on I2C#0 at slave addr 0x21 ++ fragment@14 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1504_0_21: sx150x@21 { ++ compatible = "semtech,sx1504q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1504-0-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1504 on I2C#1 at slave addr 0x21 ++ fragment@15 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1504_1_21: sx150x@21 { ++ compatible = "semtech,sx1504q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1504-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1505 on I2C#0 at slave addr 0x20 ++ fragment@16 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1505_0_20: sx150x@20 { ++ compatible = "semtech,sx1505q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1505-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1505 on I2C#1 at slave addr 0x20 ++ fragment@17 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1505_1_20: sx150x@20 { ++ compatible = "semtech,sx1505q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1505-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1505 on I2C#0 at slave addr 0x21 ++ fragment@18 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1505_0_21: sx150x@21 { ++ compatible = "semtech,sx1505q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1505-0-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1505 on I2C#1 at slave addr 0x21 ++ fragment@19 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1505_1_21: sx150x@21 { ++ compatible = "semtech,sx1505q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1505-1-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1506 on I2C#0 at slave addr 0x20 ++ fragment@20 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1506_0_20: sx150x@20 { ++ compatible = "semtech,sx1506q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1506-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1506 on I2C#1 at slave addr 0x20 ++ fragment@21 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1506_1_20: sx150x@20 { ++ compatible = "semtech,sx1506q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1506-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#0 at slave addr 0x3E ++ fragment@22 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_0_3E: sx150x@3E { ++ compatible = "semtech,sx1507q"; ++ reg = <0x3E>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507_0_3E-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#1 at slave addr 0x3E ++ fragment@23 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_1_3E: sx150x@3E { ++ compatible = "semtech,sx1507q"; ++ reg = <0x3E>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507_1_3E-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#0 at slave addr 0x3F ++ fragment@24 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_0_3F: sx150x@3F { ++ compatible = "semtech,sx1507q"; ++ reg = <0x3F>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507_0_3F-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#1 at slave addr 0x3F ++ fragment@25 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_1_3F: sx150x@3F { ++ compatible = "semtech,sx1507q"; ++ reg = <0x3F>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507_1_3F-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#0 at slave addr 0x70 ++ fragment@26 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_0_70: sx150x@70 { ++ compatible = "semtech,sx1507q"; ++ reg = <0x70>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507-0-70-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#1 at slave addr 0x70 ++ fragment@27 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_1_70: sx150x@70 { ++ compatible = "semtech,sx1507q"; ++ reg = <0x70>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507-1-70-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#0 at slave addr 0x71 ++ fragment@28 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_0_71: sx150x@71 { ++ compatible = "semtech,sx1507q"; ++ reg = <0x71>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507-0-71-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1507 on I2C#1 at slave addr 0x71 ++ fragment@29 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1507_1_71: sx150x@71 { ++ compatible = "semtech,sx1507q"; ++ reg = <0x71>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1507-1-71-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#0 at slave addr 0x20 ++ fragment@30 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_0_20: sx150x@20 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-0-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#1 at slave addr 0x20 ++ fragment@31 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_1_20: sx150x@20 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x20>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-1-20-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#0 at slave addr 0x21 ++ fragment@32 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_0_21: sx150x@21 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-0-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#1 at slave addr 0x21 ++ fragment@33 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_1_21: sx150x@21 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x21>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-1-21-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#0 at slave addr 0x22 ++ fragment@34 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_0_22: sx150x@22 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x22>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-0-22-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#1 at slave addr 0x22 ++ fragment@35 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_1_22: sx150x@22 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x22>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-1-22-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#0 at slave addr 0x23 ++ fragment@36 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_0_23: sx150x@23 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x23>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-0-23-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1508 on I2C#1 at slave addr 0x23 ++ fragment@37 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1508_1_23: sx150x@23 { ++ compatible = "semtech,sx1508q"; ++ reg = <0x23>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1508-1-23-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#0 at slave addr 0x3E ++ fragment@38 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_0_3E: sx150x@3E { ++ compatible = "semtech,sx1509q"; ++ reg = <0x3E>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509_0_3E-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#1 at slave addr 0x3E ++ fragment@39 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_1_3E: sx150x@3E { ++ compatible = "semtech,sx1509q"; ++ reg = <0x3E>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509_1_3E-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#0 at slave addr 0x3F ++ fragment@40 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_0_3F: sx150x@3F { ++ compatible = "semtech,sx1509q"; ++ reg = <0x3F>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509_0_3F-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#1 at slave addr 0x3F ++ fragment@41 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_1_3F: sx150x@3F { ++ compatible = "semtech,sx1509q"; ++ reg = <0x3F>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509_1_3F-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#0 at slave addr 0x70 ++ fragment@42 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_0_70: sx150x@70 { ++ compatible = "semtech,sx1509q"; ++ reg = <0x70>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509-0-70-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#1 at slave addr 0x70 ++ fragment@43 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_1_70: sx150x@70 { ++ compatible = "semtech,sx1509q"; ++ reg = <0x70>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509-1-70-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#0 at slave addr 0x71 ++ fragment@44 { ++ target = <&i2c0>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_0_71: sx150x@71 { ++ compatible = "semtech,sx1509q"; ++ reg = <0x71>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509-0-71-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable a SX1509 on I2C#1 at slave addr 0x71 ++ fragment@45 { ++ target = <&i2c1>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ sx1509_1_71: sx150x@71 { ++ compatible = "semtech,sx1509q"; ++ reg = <0x71>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ #interrupt-cells = <2>; ++ interrupts = <25 2>; /* 1st word overwritten by sx1509-1-71-int-gpio parameter ++ 2nd word is 2 for falling-edge triggered */ ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1501 on I2C#0 at slave addr 0x20 ++ fragment@46 { ++ target = <&sx1501_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1501 on I2C#1 at slave addr 0x20 ++ fragment@47 { ++ target = <&sx1501_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1501 on I2C#0 at slave addr 0x21 ++ fragment@48 { ++ target = <&sx1501_0_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1501 on I2C#1 at slave addr 0x21 ++ fragment@49 { ++ target = <&sx1501_1_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1502 on I2C#0 at slave addr 0x20 ++ fragment@50 { ++ target = <&sx1502_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1502 on I2C#1 at slave addr 0x20 ++ fragment@51 { ++ target = <&sx1502_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1502 on I2C#0 at slave addr 0x21 ++ fragment@52 { ++ target = <&sx1502_0_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1502 on I2C#1 at slave addr 0x21 ++ fragment@53 { ++ target = <&sx1502_1_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1503 on I2C#0 at slave addr 0x20 ++ fragment@54 { ++ target = <&sx1503_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1503 on I2C#1 at slave addr 0x20 ++ fragment@55 { ++ target = <&sx1503_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1504 on I2C#0 at slave addr 0x20 ++ fragment@56 { ++ target = <&sx1504_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1504 on I2C#1 at slave addr 0x20 ++ fragment@57 { ++ target = <&sx1504_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1504 on I2C#0 at slave addr 0x21 ++ fragment@58 { ++ target = <&sx1504_0_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1504 on I2C#1 at slave addr 0x21 ++ fragment@59 { ++ target = <&sx1504_1_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1505 on I2C#0 at slave addr 0x20 ++ fragment@60 { ++ target = <&sx1505_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1505 on I2C#1 at slave addr 0x20 ++ fragment@61 { ++ target = <&sx1505_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1505 on I2C#0 at slave addr 0x21 ++ fragment@62 { ++ target = <&sx1505_0_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1505 on I2C#1 at slave addr 0x21 ++ fragment@63 { ++ target = <&sx1505_1_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1506 on I2C#0 at slave addr 0x20 ++ fragment@64 { ++ target = <&sx1506_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1506 on I2C#1 at slave addr 0x20 ++ fragment@65 { ++ target = <&sx1506_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#0 at slave addr 0x3E ++ fragment@66 { ++ target = <&sx1507_0_3E>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_3E_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#1 at slave addr 0x3E ++ fragment@67 { ++ target = <&sx1507_1_3E>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_3E_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#0 at slave addr 0x3F ++ fragment@68 { ++ target = <&sx1507_0_3F>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_3F_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#1 at slave addr 0x3F ++ fragment@69 { ++ target = <&sx1507_1_3F>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_3F_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#0 at slave addr 0x70 ++ fragment@70 { ++ target = <&sx1507_0_70>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_70_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#1 at slave addr 0x70 ++ fragment@71 { ++ target = <&sx1507_1_70>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_70_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#0 at slave addr 0x71 ++ fragment@72 { ++ target = <&sx1507_0_71>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_71_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1507 on I2C#1 at slave addr 0x71 ++ fragment@73 { ++ target = <&sx1507_1_71>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_71_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#0 at slave addr 0x20 ++ fragment@74 { ++ target = <&sx1508_0_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#1 at slave addr 0x20 ++ fragment@75 { ++ target = <&sx1508_1_20>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_20_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#0 at slave addr 0x21 ++ fragment@76 { ++ target = <&sx1508_0_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#1 at slave addr 0x21 ++ fragment@77 { ++ target = <&sx1508_1_21>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_21_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#0 at slave addr 0x22 ++ fragment@78 { ++ target = <&sx1508_0_22>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_22_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#1 at slave addr 0x22 ++ fragment@79 { ++ target = <&sx1508_1_22>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_22_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#0 at slave addr 0x23 ++ fragment@80 { ++ target = <&sx1508_0_23>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_23_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1508 on I2C#1 at slave addr 0x23 ++ fragment@81 { ++ target = <&sx1508_1_23>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_23_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#0 at slave addr 0x3E ++ fragment@82 { ++ target = <&sx1509_0_3E>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_3E_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#1 at slave addr 0x3E ++ fragment@83 { ++ target = <&sx1509_1_3E>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_3E_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#0 at slave addr 0x3F ++ fragment@84 { ++ target = <&sx1509_0_3F>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_3F_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#1 at slave addr 0x3F ++ fragment@85 { ++ target = <&sx1509_1_3F>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_3F_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#0 at slave addr 0x70 ++ fragment@86 { ++ target = <&sx1509_0_70>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_70_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#1 at slave addr 0x70 ++ fragment@87 { ++ target = <&sx1509_1_70>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_70_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#0 at slave addr 0x71 ++ fragment@88 { ++ target = <&sx1509_0_71>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_0_71_pins>; ++ }; ++ }; ++ ++ // Enable interrupts for a SX1509 on I2C#1 at slave addr 0x71 ++ fragment@89 { ++ target = <&sx1509_1_71>; ++ __dormant__ { ++ interrupt-parent = <&gpio>; ++ interrupt-controller; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sx150x_1_71_pins>; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x20 ++ // Configure as a input with no pull-up/down ++ fragment@90 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_20_pins: sx150x_0_20_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-20-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x20 ++ // Configure as a input with no pull-up/down ++ fragment@91 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_20_pins: sx150x_1_20_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-20-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x21 ++ // Configure as a input with no pull-up/down ++ fragment@92 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_21_pins: sx150x_0_21_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-21-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x21 ++ // Configure as a input with no pull-up/down ++ fragment@93 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_21_pins: sx150x_1_21_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-21-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x22 ++ // Configure as a input with no pull-up/down ++ fragment@94 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_22_pins: sx150x_0_22_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-22-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x22 ++ // Configure as a input with no pull-up/down ++ fragment@95 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_22_pins: sx150x_1_22_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-22-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x23 ++ // Configure as a input with no pull-up/down ++ fragment@96 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_23_pins: sx150x_0_23_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-23-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x23 ++ // Configure as a input with no pull-up/down ++ fragment@97 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_23_pins: sx150x_1_23_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-23-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x3E ++ // Configure as a input with no pull-up/down ++ fragment@98 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_3E_pins: sx150x_0_3E_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-3E-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x3E ++ // Configure as a input with no pull-up/down ++ fragment@99 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_3E_pins: sx150x_1_3E_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-3E-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x3F ++ // Configure as a input with no pull-up/down ++ fragment@100 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_3F_pins: sx150x_0_3F_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-3F-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x3F ++ // Configure as a input with no pull-up/down ++ fragment@101 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_3F_pins: sx150x_1_3F_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-3F-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x70 ++ // Configure as a input with no pull-up/down ++ fragment@102 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_70_pins: sx150x_0_70_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-70-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x70 ++ // Configure as a input with no pull-up/down ++ fragment@103 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_70_pins: sx150x_1_70_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-70-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#0 interface at slave addr 0x71 ++ // Configure as a input with no pull-up/down ++ fragment@104 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_0_71_pins: sx150x_0_71_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-0-71-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ // Configure GPIO pin connected to NINT output of a SX150x on I2C#1 interface at slave addr 0x71 ++ // Configure as a input with no pull-up/down ++ fragment@105 { ++ target = <&gpio>; ++ __dormant__ { ++ sx150x_1_71_pins: sx150x_1_71_pins { ++ brcm,pins = <0>; /* overwritten by sx150x-1-71-int-gpio parameter */ ++ brcm,function = <0>; ++ brcm,pull = <0>; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ sx1501-0-20 = <0>,"+0+2"; ++ sx1501-1-20 = <0>,"+1+3"; ++ sx1501-0-21 = <0>,"+0+4"; ++ sx1501-1-21 = <0>,"+1+5"; ++ sx1502-0-20 = <0>,"+0+6"; ++ sx1502-1-20 = <0>,"+1+7"; ++ sx1502-0-21 = <0>,"+0+8"; ++ sx1502-1-21 = <0>,"+1+9"; ++ sx1503-0-20 = <0>,"+0+10"; ++ sx1503-1-20 = <0>,"+1+11"; ++ sx1504-0-20 = <0>,"+0+12"; ++ sx1504-1-20 = <0>,"+1+13"; ++ sx1504-0-21 = <0>,"+0+14"; ++ sx1504-1-21 = <0>,"+1+15"; ++ sx1505-0-20 = <0>,"+0+16"; ++ sx1505-1-20 = <0>,"+1+17"; ++ sx1505-0-21 = <0>,"+0+18"; ++ sx1505-1-21 = <0>,"+1+19"; ++ sx1506-0-20 = <0>,"+0+20"; ++ sx1506-1-20 = <0>,"+1+21"; ++ sx1507-0-3E = <0>,"+0+22"; ++ sx1507-1-3E = <0>,"+1+23"; ++ sx1507-0-3F = <0>,"+0+24"; ++ sx1507-1-3F = <0>,"+1+25"; ++ sx1507-0-70 = <0>,"+0+26"; ++ sx1507-1-70 = <0>,"+1+27"; ++ sx1507-0-71 = <0>,"+0+28"; ++ sx1507-1-71 = <0>,"+1+29"; ++ sx1508-0-20 = <0>,"+0+30"; ++ sx1508-1-20 = <0>,"+1+31"; ++ sx1508-0-21 = <0>,"+0+32"; ++ sx1508-1-21 = <0>,"+1+33"; ++ sx1508-0-22 = <0>,"+0+34"; ++ sx1508-1-22 = <0>,"+1+35"; ++ sx1508-0-23 = <0>,"+0+36"; ++ sx1508-1-23 = <0>,"+1+37"; ++ sx1509-0-3E = <0>,"+0+38"; ++ sx1509-1-3E = <0>,"+1+39"; ++ sx1509-0-3F = <0>,"+0+40"; ++ sx1509-1-3F = <0>,"+1+41"; ++ sx1509-0-70 = <0>,"+0+42"; ++ sx1509-1-70 = <0>,"+1+43"; ++ sx1509-0-71 = <0>,"+0+44"; ++ sx1509-1-71 = <0>,"+1+45"; ++ sx1501-0-20-int-gpio = <0>,"+46+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1501_0_20>,"interrupts:0"; ++ sx1501-1-20-int-gpio = <0>,"+47+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1501_1_20>,"interrupts:0"; ++ sx1501-0-21-int-gpio = <0>,"+48+92", <&sx150x_0_21_pins>,"brcm,pins:0", <&sx1501_0_21>,"interrupts:0"; ++ sx1501-1-21-int-gpio = <0>,"+49+93", <&sx150x_1_21_pins>,"brcm,pins:0", <&sx1501_1_21>,"interrupts:0"; ++ sx1502-0-20-int-gpio = <0>,"+50+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1502_0_20>,"interrupts:0"; ++ sx1502-1-20-int-gpio = <0>,"+51+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1502_1_20>,"interrupts:0"; ++ sx1502-0-21-int-gpio = <0>,"+52+92", <&sx150x_0_21_pins>,"brcm,pins:0", <&sx1502_0_21>,"interrupts:0"; ++ sx1502-1-21-int-gpio = <0>,"+53+93", <&sx150x_1_21_pins>,"brcm,pins:0", <&sx1502_1_21>,"interrupts:0"; ++ sx1503-0-20-int-gpio = <0>,"+54+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1503_0_20>,"interrupts:0"; ++ sx1503-1-20-int-gpio = <0>,"+55+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1503_1_20>,"interrupts:0"; ++ sx1504-0-20-int-gpio = <0>,"+56+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1504_0_20>,"interrupts:0"; ++ sx1504-1-20-int-gpio = <0>,"+57+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1504_1_20>,"interrupts:0"; ++ sx1504-0-21-int-gpio = <0>,"+58+92", <&sx150x_0_21_pins>,"brcm,pins:0", <&sx1504_0_21>,"interrupts:0"; ++ sx1504-1-21-int-gpio = <0>,"+59+93", <&sx150x_1_21_pins>,"brcm,pins:0", <&sx1504_1_21>,"interrupts:0"; ++ sx1505-0-20-int-gpio = <0>,"+60+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1505_0_20>,"interrupts:0"; ++ sx1505-1-20-int-gpio = <0>,"+61+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1505_1_20>,"interrupts:0"; ++ sx1505-0-21-int-gpio = <0>,"+62+92", <&sx150x_0_21_pins>,"brcm,pins:0", <&sx1505_0_21>,"interrupts:0"; ++ sx1505-1-21-int-gpio = <0>,"+63+93", <&sx150x_1_21_pins>,"brcm,pins:0", <&sx1505_1_21>,"interrupts:0"; ++ sx1506-0-20-int-gpio = <0>,"+64+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1506_0_20>,"interrupts:0"; ++ sx1506-1-20-int-gpio = <0>,"+65+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1506_1_20>,"interrupts:0"; ++ sx1507-0-3E-int-gpio = <0>,"+66+98", <&sx150x_0_3E_pins>,"brcm,pins:0", <&sx1507_0_3E>,"interrupts:0"; ++ sx1507-1-3E-int-gpio = <0>,"+67+99", <&sx150x_1_3E_pins>,"brcm,pins:0", <&sx1507_1_3E>,"interrupts:0"; ++ sx1507-0-3F-int-gpio = <0>,"+68+100", <&sx150x_0_3F_pins>,"brcm,pins:0", <&sx1507_0_3F>,"interrupts:0"; ++ sx1507-1-3F-int-gpio = <0>,"+69+101", <&sx150x_1_3F_pins>,"brcm,pins:0", <&sx1507_1_3F>,"interrupts:0"; ++ sx1507-0-70-int-gpio = <0>,"+60+102", <&sx150x_0_70_pins>,"brcm,pins:0", <&sx1507_0_70>,"interrupts:0"; ++ sx1507-1-70-int-gpio = <0>,"+71+103", <&sx150x_1_70_pins>,"brcm,pins:0", <&sx1507_1_70>,"interrupts:0"; ++ sx1507-0-71-int-gpio = <0>,"+72+104", <&sx150x_0_71_pins>,"brcm,pins:0", <&sx1507_0_71>,"interrupts:0"; ++ sx1507-1-71-int-gpio = <0>,"+73+105", <&sx150x_1_71_pins>,"brcm,pins:0", <&sx1507_1_71>,"interrupts:0"; ++ sx1508-0-20-int-gpio = <0>,"+74+90", <&sx150x_0_20_pins>,"brcm,pins:0", <&sx1508_0_20>,"interrupts:0"; ++ sx1508-1-20-int-gpio = <0>,"+75+91", <&sx150x_1_20_pins>,"brcm,pins:0", <&sx1508_1_20>,"interrupts:0"; ++ sx1508-0-21-int-gpio = <0>,"+76+92", <&sx150x_0_21_pins>,"brcm,pins:0", <&sx1508_0_21>,"interrupts:0"; ++ sx1508-1-21-int-gpio = <0>,"+77+93", <&sx150x_1_21_pins>,"brcm,pins:0", <&sx1508_1_21>,"interrupts:0"; ++ sx1508-0-22-int-gpio = <0>,"+78+94", <&sx150x_0_22_pins>,"brcm,pins:0", <&sx1508_0_22>,"interrupts:0"; ++ sx1508-1-22-int-gpio = <0>,"+79+95", <&sx150x_1_22_pins>,"brcm,pins:0", <&sx1508_1_22>,"interrupts:0"; ++ sx1508-0-23-int-gpio = <0>,"+80+96", <&sx150x_0_23_pins>,"brcm,pins:0", <&sx1508_0_23>,"interrupts:0"; ++ sx1508-1-23-int-gpio = <0>,"+81+97", <&sx150x_1_23_pins>,"brcm,pins:0", <&sx1508_1_23>,"interrupts:0"; ++ sx1509-0-3E-int-gpio = <0>,"+82+98", <&sx150x_0_3E_pins>,"brcm,pins:0", <&sx1509_0_3E>,"interrupts:0"; ++ sx1509-1-3E-int-gpio = <0>,"+83+99", <&sx150x_1_3E_pins>,"brcm,pins:0", <&sx1509_1_3E>,"interrupts:0"; ++ sx1509-0-3F-int-gpio = <0>,"+84+100", <&sx150x_0_3F_pins>,"brcm,pins:0", <&sx1509_0_3F>,"interrupts:0"; ++ sx1509-1-3F-int-gpio = <0>,"+85+101", <&sx150x_1_3F_pins>,"brcm,pins:0", <&sx1509_1_3F>,"interrupts:0"; ++ sx1509-0-70-int-gpio = <0>,"+86+102", <&sx150x_0_70_pins>,"brcm,pins:0", <&sx1509_0_70>,"interrupts:0"; ++ sx1509-1-70-int-gpio = <0>,"+87+103", <&sx150x_1_70_pins>,"brcm,pins:0", <&sx1509_1_70>,"interrupts:0"; ++ sx1509-0-71-int-gpio = <0>,"+88+104", <&sx150x_0_71_pins>,"brcm,pins:0", <&sx1509_0_71>,"interrupts:0"; ++ sx1509-1-71-int-gpio = <0>,"+89+105", <&sx150x_1_71_pins>,"brcm,pins:0", <&sx1509_1_71>,"interrupts:0"; ++ }; ++}; ++ +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0284-lan78xx-Ignore-DT-MAC-address-if-already-valid.patch b/root/target/linux/brcm2708/patches-4.14/0284-lan78xx-Ignore-DT-MAC-address-if-already-valid.patch new file mode 100644 index 00000000..b7f4656d --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0284-lan78xx-Ignore-DT-MAC-address-if-already-valid.patch @@ -0,0 +1,59 @@ +From 9696aab22bb8163fb3a2a262dd6c67f6d05b70a1 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 28 Mar 2018 12:18:13 +0100 +Subject: [PATCH 284/297] lan78xx: Ignore DT MAC address if already valid + +The patch to set the lan78xx MAC address from DT does so regardless of +whether or not the interface already has a valid address. As the +initialisation function is called from the reset handler when the +interface is brought up, it is impossible to change the MAC address +in a way that persists across the interface being brought up. + +Fix the problem by moving the DT reading code after the check for a +valid address. + +See: https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=209309 + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 52593368a48d..981cc5bf2df4 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -1641,14 +1641,6 @@ 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); +@@ -1661,6 +1653,15 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev) + addr[5] = (addr_hi >> 8) & 0xFF; + + if (!is_valid_ether_addr(addr)) { ++ 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; ++ } ++ + /* reading mac address from EEPROM or OTP */ + if ((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN, + addr) == 0) || +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch b/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch new file mode 100644 index 00000000..3073b6bc --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch @@ -0,0 +1,70 @@ +From 661230038a8736ba9023978c53cd21cd65739406 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 28 Mar 2018 17:32:20 +0100 +Subject: [PATCH 285/297] lan78xx: Simple patch to prevent some crashes + +Alexander Graf submitted a patch to solve a problem when connecting to +the device before the interface is brought up, but with that patch +applied the interface fails to work (for me and others). This simpler +patch should be considered a stepping stone that may prevent some of the +crashes seen when the interface is reset but without solving the early +access problem. + +See: https://github.com/raspberrypi/linux/issues/2449 + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 981cc5bf2df4..e7bdbd1accad 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2023,6 +2023,9 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + int i; + struct phy_device *phydev = dev->net->phydev; + ++ /* Return early if already initialised */ ++ if (phydev) ++ return 0; + phydev = phy_find_first(dev->mdiobus); + if (!phydev) { + netdev_err(dev->net, "no PHY found\n"); +@@ -2639,13 +2642,8 @@ static int lan78xx_stop(struct net_device *net) + if (timer_pending(&dev->stat_monitor)) + del_timer_sync(&dev->stat_monitor); + +- phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); +- phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); +- +- phy_stop(net->phydev); +- phy_disconnect(net->phydev); +- +- net->phydev = NULL; ++ if (net->phydev) ++ phy_stop(net->phydev); + + clear_bit(EVENT_DEV_OPEN, &dev->flags); + netif_stop_queue(net); +@@ -3543,10 +3541,16 @@ static void lan78xx_disconnect(struct usb_interface *intf) + udev = interface_to_usbdev(intf); + + net = dev->net; +- unregister_netdev(net); + + cancel_delayed_work_sync(&dev->wq); + ++ phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); ++ phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); ++ ++ phy_disconnect(net->phydev); ++ net->phydev = NULL; ++ unregister_netdev(net); ++ + usb_scuttle_anchored_urbs(&dev->deferred); + + lan78xx_unbind(dev, intf); +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0287-usb-dwc_otg-fix-memory-corruption-in-dwc_otg-driver.patch b/root/target/linux/brcm2708/patches-4.14/0287-usb-dwc_otg-fix-memory-corruption-in-dwc_otg-driver.patch new file mode 100644 index 00000000..a8607ed6 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0287-usb-dwc_otg-fix-memory-corruption-in-dwc_otg-driver.patch @@ -0,0 +1,62 @@ +From 8960ba68b681a62a523cc593773d5d03a413a075 Mon Sep 17 00:00:00 2001 +From: Paul Zimmerman +Date: Tue, 4 Feb 2014 11:21:24 -0800 +Subject: [PATCH 287/297] usb: dwc_otg: fix memory corruption in dwc_otg driver + +[Upstream commit 51b1b6491752ac066ee8d32cc66042fcc955fef6] + +The move from the staging tree to the main tree exposed a +longstanding memory corruption bug in the dwc2 driver. The +reordering of the driver initialization caused the dwc2 driver +to corrupt the initialization data of the sdhci driver on the +Raspberry Pi platform, which made the bug show up. + +The error is in calling to_usb_device(hsotg->dev), since ->dev +is not a member of struct usb_device. The easiest fix is to +just remove the offending code, since it is not really needed. + +Thanks to Stephen Warren for tracking down the cause of this. + +Reported-by: Andre Heider +Tested-by: Stephen Warren +Signed-off-by: Paul Zimmerman +Signed-off-by: Greg Kroah-Hartman +[lukas: port from upstream dwc2 to out-of-tree dwc_otg driver] +Signed-off-by: Lukas Wunner +--- + drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c | 14 -------------- + 1 file changed, 14 deletions(-) + +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +index 2ccd2a80dbef..ed9694058ed0 100644 +--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c ++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +@@ -1012,25 +1012,11 @@ static void endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *ep) + static void endpoint_reset(struct usb_hcd *hcd, struct usb_host_endpoint *ep) + { + dwc_irqflags_t flags; +- struct usb_device *udev = NULL; +- int epnum = usb_endpoint_num(&ep->desc); +- int is_out = usb_endpoint_dir_out(&ep->desc); +- int is_control = usb_endpoint_xfer_control(&ep->desc); + dwc_otg_hcd_t *dwc_otg_hcd = hcd_to_dwc_otg_hcd(hcd); +- struct device *dev = DWC_OTG_OS_GETDEV(dwc_otg_hcd->otg_dev->os_dep); +- +- if (dev) +- udev = to_usb_device(dev); +- else +- return; + + DWC_DEBUGPL(DBG_HCD, "DWC OTG HCD EP RESET: Endpoint Num=0x%02d\n", epnum); + + DWC_SPINLOCK_IRQSAVE(dwc_otg_hcd->lock, &flags); +- usb_settoggle(udev, epnum, is_out, 0); +- if (is_control) +- usb_settoggle(udev, epnum, !is_out, 0); +- + if (ep->hcpriv) { + dwc_otg_hcd_endpoint_reset(dwc_otg_hcd, ep->hcpriv); + } +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0290-Add-overlay-for-JEDEC-SPI-NOR-flash.patch b/root/target/linux/brcm2708/patches-4.14/0290-Add-overlay-for-JEDEC-SPI-NOR-flash.patch new file mode 100644 index 00000000..aa854786 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0290-Add-overlay-for-JEDEC-SPI-NOR-flash.patch @@ -0,0 +1,362 @@ +From 4332ceb0c6de3c82a25137ac354f36a8e71382f7 Mon Sep 17 00:00:00 2001 +From: wavelet2 +Date: Mon, 26 Mar 2018 21:05:10 +0100 +Subject: [PATCH 290/297] Add overlay for JEDEC SPI NOR flash + +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 9 + + .../boot/dts/overlays/jedec-spi-nor-overlay.dts | 309 +++++++++++++++++++++ + 3 files changed, 319 insertions(+) + create mode 100644 arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index dcc64b5a3237..5439afd9b28c 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -55,6 +55,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + iqaudio-dac.dtbo \ + iqaudio-dacplus.dtbo \ + iqaudio-digi-wm8804-audio.dtbo \ ++ jedec-spi-nor.dtbo \ + justboom-dac.dtbo \ + justboom-digi.dtbo \ + lirc-rpi.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index dd2575cf7def..7ec84713cd06 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -939,6 +939,15 @@ Params: card_name Override the default, "IQAudIODigi", card name. + dai stream name. + + ++Name: jedec-spi-nor ++Info: Adds support for JEDEC-compliant SPI NOR flash devices. (Note: The ++ "jedec,spi-nor" kernel driver was formerly known as "m25p80".) ++Load: dtoverlay=jedec-spi-nor,= ++Params: flash-spi- Enables flash device on SPI, CS#. ++ flash-fastr-spi- Enables flash device with fast read capability ++ on SPI, CS#. ++ ++ + Name: justboom-dac + Info: Configures the JustBoom DAC HAT, Amp HAT, DAC Zero and Amp Zero audio + cards +diff --git a/arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts b/arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts +new file mode 100644 +index 000000000000..279e22efc013 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts +@@ -0,0 +1,309 @@ ++// Overlay for JEDEC SPI-NOR Flash Devices (aka m25p80) ++ ++// dtparams: ++// flash-spi- - Enables flash device on SPI, CS#. ++// flash-fastr-spi- - Enables flash device with fast read capability on SPI, CS#. ++// ++// If devices are present on SPI1 or SPI2, those interfaces must be enabled with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays. ++// ++// Example: A single flash device with fast read capability on SPI0, CS#0: ++// dtoverlay=jedec-spi-nor:flash-fastr-spi0-0 ++ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; ++ ++ // disable spi-dev on spi0.0 ++ fragment@0 { ++ target = <&spidev0>; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi0.1 ++ fragment@1 { ++ target = <&spidev1>; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi1.0 ++ fragment@2 { ++ target-path = "spi1/spidev@0"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi1.1 ++ fragment@3 { ++ target-path = "spi1/spidev@1"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi1.2 ++ fragment@4 { ++ target-path = "spi1/spidev@2"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi2.0 ++ fragment@5 { ++ target-path = "spi2/spidev@0"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi2.1 ++ fragment@6 { ++ target-path = "spi2/spidev@1"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // disable spi-dev on spi2.2 ++ fragment@7 { ++ target-path = "spi2/spidev@2"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ // enable flash on spi0.0 ++ fragment@8 { ++ target = <&spi0>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_00: spi_nor@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi0.1 ++ fragment@9 { ++ target = <&spi0>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_01: spi_nor@1 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <1>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi1.0 ++ fragment@10 { ++ target = <&spi1>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_10: spi_nor@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi1.1 ++ fragment@11 { ++ target = <&spi1>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_11: spi_nor@1 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <1>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi1.2 ++ fragment@12 { ++ target = <&spi1>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_12: spi_nor@2 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <2>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi2.0 ++ fragment@13 { ++ target = <&spi2>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_20: spi_nor@0 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi2.1 ++ fragment@14 { ++ target = <&spi2>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_21: spi_nor@1 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <1>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // enable flash on spi2.2 ++ fragment@15 { ++ target = <&spi2>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi_nor_22: spi_nor@2 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "jedec,spi-nor"; ++ reg = <2>; ++ spi-max-frequency = <500000>; ++ }; ++ }; ++ }; ++ ++ // Enable fast read for device on spi0.0. ++ // Use default active low interrupt signalling. ++ fragment@16 { ++ target = <&spi_nor_00>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi0.1. ++ // Use default active low interrupt signalling. ++ fragment@17 { ++ target = <&spi_nor_01>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi1.0. ++ // Use default active low interrupt signalling. ++ fragment@18 { ++ target = <&spi_nor_10>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi1.1. ++ // Use default active low interrupt signalling. ++ fragment@19 { ++ target = <&spi_nor_11>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi1.2. ++ // Use default active low interrupt signalling. ++ fragment@20 { ++ target = <&spi_nor_12>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi2.0. ++ // Use default active low interrupt signalling. ++ fragment@21 { ++ target = <&spi_nor_20>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi2.1. ++ // Use default active low interrupt signalling. ++ fragment@22 { ++ target = <&spi_nor_21>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ // Enable fast read for device on spi2.2. ++ // Use default active low interrupt signalling. ++ fragment@23 { ++ target = <&spi_nor_22>; ++ __dormant__ { ++ m25p,fast-read; ++ }; ++ }; ++ ++ __overrides__ { ++ flash-spi0-0 = <0>,"+0+8"; ++ flash-spi0-1 = <0>,"+1+9"; ++ flash-spi1-0 = <0>,"+2+10"; ++ flash-spi1-1 = <0>,"+3+11"; ++ flash-spi1-2 = <0>,"+4+12"; ++ flash-spi2-0 = <0>,"+5+13"; ++ flash-spi2-1 = <0>,"+6+14"; ++ flash-spi2-2 = <0>,"+7+15"; ++ flash-fastr-spi0-0 = <0>,"+0+8+16"; ++ flash-fastr-spi0-1 = <0>,"+1+9+17"; ++ flash-fastr-spi1-0 = <0>,"+2+10+18"; ++ flash-fastr-spi1-1 = <0>,"+3+11+19"; ++ flash-fastr-spi1-2 = <0>,"+4+12+20"; ++ flash-fastr-spi2-0 = <0>,"+5+13+21"; ++ flash-fastr-spi2-1 = <0>,"+6+14+22"; ++ flash-fastr-spi2-2 = <0>,"+7+15+23"; ++ }; ++}; ++ +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0291-net-lan78xx-Allow-for-VLAN-headers-in-timeout.patch b/root/target/linux/brcm2708/patches-4.14/0291-net-lan78xx-Allow-for-VLAN-headers-in-timeout.patch new file mode 100644 index 00000000..9ee96ed2 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0291-net-lan78xx-Allow-for-VLAN-headers-in-timeout.patch @@ -0,0 +1,43 @@ +From 55140f53d406070183b156ea56c6f6f76f7012d1 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 4 Apr 2018 16:34:24 +0100 +Subject: [PATCH 291/297] net: lan78xx: Allow for VLAN headers in timeout. + +The frame abort timeout being set by lan78xx_set_rx_max_frame_length +didn't account for any VLAN headers, resulting in very low +throughput if used with tagged VLANs. +Use VLAN_ETH_HLEN instead of ETH_HLEN to correct for this. + +See https://github.com/raspberrypi/linux/issues/2458 + +Signed-off-by: Dave Stevenson +--- + drivers/net/usb/lan78xx.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index e7bdbd1accad..099c7a06e365 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2221,7 +2221,7 @@ static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu) + if ((ll_mtu % dev->maxpacket) == 0) + return -EDOM; + +- ret = lan78xx_set_rx_max_frame_length(dev, new_mtu + ETH_HLEN); ++ ret = lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN); + + netdev->mtu = new_mtu; + +@@ -2511,7 +2511,8 @@ static int lan78xx_reset(struct lan78xx_net *dev) + buf |= FCT_TX_CTL_EN_; + ret = lan78xx_write_reg(dev, FCT_TX_CTL, buf); + +- ret = lan78xx_set_rx_max_frame_length(dev, dev->net->mtu + ETH_HLEN); ++ ret = lan78xx_set_rx_max_frame_length(dev, ++ dev->net->mtu + VLAN_ETH_HLEN); + + ret = lan78xx_read_reg(dev, MAC_RX, &buf); + buf |= MAC_RX_RXEN_; +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0292-Revert-lan78xx-Simple-patch-to-prevent-some-crashes.patch b/root/target/linux/brcm2708/patches-4.14/0292-Revert-lan78xx-Simple-patch-to-prevent-some-crashes.patch new file mode 100644 index 00000000..5af8c8a4 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0292-Revert-lan78xx-Simple-patch-to-prevent-some-crashes.patch @@ -0,0 +1,62 @@ +From 8d51cdad7dfe77c6b5dfeb95e675d7c4036c9f0f Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 4 Apr 2018 16:56:49 +0100 +Subject: [PATCH 292/297] Revert "lan78xx: Simple patch to prevent some + crashes" + +This reverts commit 661230038a8736ba9023978c53cd21cd65739406. +--- + drivers/net/usb/lan78xx.c | 20 ++++++++------------ + 1 file changed, 8 insertions(+), 12 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 099c7a06e365..70490995022b 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2023,9 +2023,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + int i; + struct phy_device *phydev = dev->net->phydev; + +- /* Return early if already initialised */ +- if (phydev) +- return 0; + phydev = phy_find_first(dev->mdiobus); + if (!phydev) { + netdev_err(dev->net, "no PHY found\n"); +@@ -2643,8 +2640,13 @@ static int lan78xx_stop(struct net_device *net) + if (timer_pending(&dev->stat_monitor)) + del_timer_sync(&dev->stat_monitor); + +- if (net->phydev) +- phy_stop(net->phydev); ++ phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); ++ phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); ++ ++ phy_stop(net->phydev); ++ phy_disconnect(net->phydev); ++ ++ net->phydev = NULL; + + clear_bit(EVENT_DEV_OPEN, &dev->flags); + netif_stop_queue(net); +@@ -3542,16 +3544,10 @@ static void lan78xx_disconnect(struct usb_interface *intf) + udev = interface_to_usbdev(intf); + + net = dev->net; ++ unregister_netdev(net); + + cancel_delayed_work_sync(&dev->wq); + +- phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); +- phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); +- +- phy_disconnect(net->phydev); +- net->phydev = NULL; +- unregister_netdev(net); +- + usb_scuttle_anchored_urbs(&dev->deferred); + + lan78xx_unbind(dev, intf); +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0293-lan78xx-Connect-phy-early.patch b/root/target/linux/brcm2708/patches-4.14/0293-lan78xx-Connect-phy-early.patch new file mode 100644 index 00000000..03f5cdc6 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0293-lan78xx-Connect-phy-early.patch @@ -0,0 +1,172 @@ +From c11ae4fec531878e4d416004912b3bd6dda7b432 Mon Sep 17 00:00:00 2001 +From: Alexander Graf +Date: Wed, 4 Apr 2018 00:19:35 +0200 +Subject: [PATCH 293/297] lan78xx: Connect phy early + +When using wicked with a lan78xx device attached to the system, we +end up with ethtool commands issued on the device before an ifup +got issued. That lead to the following crash: + + Unable to handle kernel NULL pointer dereference at virtual address 0000039c + pgd = ffff800035b30000 + [0000039c] *pgd=0000000000000000 + Internal error: Oops: 96000004 [#1] SMP + Modules linked in: [...] + Supported: Yes + CPU: 3 PID: 638 Comm: wickedd Tainted: G E 4.12.14-0-default #1 + Hardware name: raspberrypi rpi/rpi, BIOS 2018.03-rc2 02/21/2018 + task: ffff800035e74180 task.stack: ffff800036718000 + PC is at phy_ethtool_ksettings_get+0x20/0x98 + LR is at lan78xx_get_link_ksettings+0x44/0x60 [lan78xx] + pc : [] lr : [] pstate: 20000005 + sp : ffff80003671bb20 + x29: ffff80003671bb20 x28: ffff800035e74180 + x27: ffff000008912000 x26: 000000000000001d + x25: 0000000000000124 x24: ffff000008f74d00 + x23: 0000004000114809 x22: 0000000000000000 + x21: ffff80003671bbd0 x20: 0000000000000000 + x19: ffff80003671bbd0 x18: 000000000000040d + x17: 0000000000000001 x16: 0000000000000000 + x15: 0000000000000000 x14: ffffffffffffffff + x13: 0000000000000000 x12: 0000000000000020 + x11: 0101010101010101 x10: fefefefefefefeff + x9 : 7f7f7f7f7f7f7f7f x8 : fefefeff31677364 + x7 : 0000000080808080 x6 : ffff80003671bc9c + x5 : ffff80003671b9f8 x4 : ffff80002c296190 + x3 : 0000000000000000 x2 : 0000000000000000 + x1 : ffff80003671bbd0 x0 : ffff80003671bc00 + Process wickedd (pid: 638, stack limit = 0xffff800036718000) + Call trace: + Exception stack(0xffff80003671b9e0 to 0xffff80003671bb20) + b9e0: ffff80003671bc00 ffff80003671bbd0 0000000000000000 0000000000000000 + ba00: ffff80002c296190 ffff80003671b9f8 ffff80003671bc9c 0000000080808080 + ba20: fefefeff31677364 7f7f7f7f7f7f7f7f fefefefefefefeff 0101010101010101 + ba40: 0000000000000020 0000000000000000 ffffffffffffffff 0000000000000000 + ba60: 0000000000000000 0000000000000001 000000000000040d ffff80003671bbd0 + ba80: 0000000000000000 ffff80003671bbd0 0000000000000000 0000004000114809 + baa0: ffff000008f74d00 0000000000000124 000000000000001d ffff000008912000 + bac0: ffff800035e74180 ffff80003671bb20 ffff000000dcca84 ffff80003671bb20 + bae0: ffff0000086f7f30 0000000020000005 ffff80002c296000 ffff800035223900 + bb00: 0000ffffffffffff 0000000000000000 ffff80003671bb20 ffff0000086f7f30 + [] phy_ethtool_ksettings_get+0x20/0x98 + [] lan78xx_get_link_ksettings+0x44/0x60 [lan78xx] + [] ethtool_get_settings+0x68/0x210 + [] dev_ethtool+0x214/0x2180 + [] dev_ioctl+0x400/0x630 + [] sock_do_ioctl+0x70/0x88 + [] sock_ioctl+0x208/0x368 + [] do_vfs_ioctl+0xb0/0x848 + [] SyS_ioctl+0x8c/0xa8 + Exception stack(0xffff80003671bec0 to 0xffff80003671c000) + bec0: 0000000000000009 0000000000008946 0000fffff4e841d0 0000aa0032687465 + bee0: 0000aaaafa2319d4 0000fffff4e841d4 0000000032687465 0000000032687465 + bf00: 000000000000001d 7f7fff7f7f7f7f7f 72606b622e71ff4c 7f7f7f7f7f7f7f7f + bf20: 0101010101010101 0000000000000020 ffffffffffffffff 0000ffff7f510c68 + bf40: 0000ffff7f6a9d18 0000ffff7f44ce30 000000000000040d 0000ffff7f6f98f0 + bf60: 0000fffff4e842c0 0000000000000001 0000aaaafa2c2e00 0000ffff7f6ab000 + bf80: 0000fffff4e842c0 0000ffff7f62a000 0000aaaafa2b9f20 0000aaaafa2c2e00 + bfa0: 0000fffff4e84818 0000fffff4e841a0 0000ffff7f5ad0cc 0000fffff4e841a0 + bfc0: 0000ffff7f44ce3c 0000000080000000 0000000000000009 000000000000001d + bfe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 + +The culprit is quite simple: The driver tries to access the phy left and right, +but only actually has a working reference to it when the device is up. + +The fix thus is quite simple too: Get a reference to the phy on probe already +and keep it even when the device is going down. + +With this patch applied, I can successfully run wicked on my system and bring +the interface up and down as many times as I want, without getting NULL pointer +dereferences in between. + +Signed-off-by: Alexander Graf +--- + drivers/net/usb/lan78xx.c | 34 ++++++++++++++++++---------------- + 1 file changed, 18 insertions(+), 16 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 70490995022b..5c6972871b7b 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2119,10 +2119,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + + dev->fc_autoneg = phydev->autoneg; + +- phy_start(phydev); +- +- netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); +- + return 0; + + error: +@@ -2561,9 +2557,9 @@ static int lan78xx_open(struct net_device *net) + if (ret < 0) + goto done; + +- ret = lan78xx_phy_init(dev); +- if (ret < 0) +- goto done; ++ phy_start(net->phydev); ++ ++ netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); + + if (of_property_read_bool(dev->udev->dev.of_node, + "microchip,eee-enabled")) { +@@ -2640,13 +2636,8 @@ static int lan78xx_stop(struct net_device *net) + if (timer_pending(&dev->stat_monitor)) + del_timer_sync(&dev->stat_monitor); + +- phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); +- phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); +- +- phy_stop(net->phydev); +- phy_disconnect(net->phydev); +- +- net->phydev = NULL; ++ if (net->phydev) ++ phy_stop(net->phydev); + + clear_bit(EVENT_DEV_OPEN, &dev->flags); + netif_stop_queue(net); +@@ -3542,8 +3533,13 @@ static void lan78xx_disconnect(struct usb_interface *intf) + return; + + udev = interface_to_usbdev(intf); +- + net = dev->net; ++ ++ phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); ++ phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); ++ ++ phy_disconnect(net->phydev); ++ + unregister_netdev(net); + + cancel_delayed_work_sync(&dev->wq); +@@ -3703,8 +3699,14 @@ static int lan78xx_probe(struct usb_interface *intf, + pm_runtime_set_autosuspend_delay(&udev->dev, + DEFAULT_AUTOSUSPEND_DELAY); + ++ ret = lan78xx_phy_init(dev); ++ if (ret < 0) ++ goto out4; ++ + return 0; + ++out4: ++ unregister_netdev(netdev); + out3: + lan78xx_unbind(dev, intf); + out2: +@@ -4052,7 +4054,7 @@ static int lan78xx_reset_resume(struct usb_interface *intf) + + lan78xx_reset(dev); + +- lan78xx_phy_init(dev); ++ phy_start(dev->net->phydev); + + return lan78xx_resume(intf); + } +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0294-lan78xx-Don-t-reset-the-interface-on-open.patch b/root/target/linux/brcm2708/patches-4.14/0294-lan78xx-Don-t-reset-the-interface-on-open.patch new file mode 100644 index 00000000..7830a303 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0294-lan78xx-Don-t-reset-the-interface-on-open.patch @@ -0,0 +1,36 @@ +From b5b6bb9bdb5e62bc7dfc64b40bd833bffd971693 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 4 Apr 2018 16:39:44 +0100 +Subject: [PATCH 294/297] lan78xx: Don't reset the interface on open + +With Alexander Graf's patch ("lan78xx: Connect phy early") applied, +the call to lan78xx_reset within lan78xx_open prevents the phy +interrupt from being generated (even though the link is up). + +Avoid this issue by removing the lan78xx_reset call. + +See: https://github.com/raspberrypi/linux/issues/2437 + https://github.com/raspberrypi/linux/issues/2442 + https://github.com/raspberrypi/linux/issues/2457 +--- + drivers/net/usb/lan78xx.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 5c6972871b7b..b57e86f45434 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2553,10 +2553,6 @@ static int lan78xx_open(struct net_device *net) + if (ret < 0) + goto out; + +- ret = lan78xx_reset(dev); +- if (ret < 0) +- goto done; +- + phy_start(net->phydev); + + netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0295-config-Add-BT_HCIUART_BCM-y-and-SERIAL_DEV_BUS-m.patch b/root/target/linux/brcm2708/patches-4.14/0295-config-Add-BT_HCIUART_BCM-y-and-SERIAL_DEV_BUS-m.patch new file mode 100644 index 00000000..3e1a6d9b --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0295-config-Add-BT_HCIUART_BCM-y-and-SERIAL_DEV_BUS-m.patch @@ -0,0 +1,56 @@ +From 924deccc8667392fa4daf305e56c68daa1369b5f Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Thu, 5 Apr 2018 12:49:00 +0100 +Subject: [PATCH 295/297] config: Add BT_HCIUART_BCM=y and SERIAL_DEV_BUS=m + +See: https://github.com/raspberrypi/linux/issues/2479 + +Signed-off-by: Phil Elwell +--- + arch/arm/configs/bcm2709_defconfig | 2 ++ + arch/arm/configs/bcmrpi_defconfig | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/arch/arm/configs/bcm2709_defconfig b/arch/arm/configs/bcm2709_defconfig +index ae321226db5f..cb348578d44f 100644 +--- a/arch/arm/configs/bcm2709_defconfig ++++ b/arch/arm/configs/bcm2709_defconfig +@@ -374,6 +374,7 @@ CONFIG_BT_6LOWPAN=m + CONFIG_BT_HCIBTUSB=m + CONFIG_BT_HCIUART=m + CONFIG_BT_HCIUART_3WIRE=y ++CONFIG_BT_HCIUART_BCM=y + CONFIG_BT_HCIBCM203X=m + CONFIG_BT_HCIBPA10X=m + CONFIG_BT_HCIBFUSB=m +@@ -597,6 +598,7 @@ CONFIG_SERIAL_AMBA_PL011=y + CONFIG_SERIAL_AMBA_PL011_CONSOLE=y + CONFIG_SERIAL_SC16IS7XX=m + CONFIG_SERIAL_SC16IS7XX_SPI=y ++CONFIG_SERIAL_DEV_BUS=m + CONFIG_TTY_PRINTK=y + CONFIG_HW_RANDOM=y + CONFIG_RAW_DRIVER=y +diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig +index 21f9acf849f6..12f20a105638 100644 +--- a/arch/arm/configs/bcmrpi_defconfig ++++ b/arch/arm/configs/bcmrpi_defconfig +@@ -369,6 +369,7 @@ CONFIG_BT_6LOWPAN=m + CONFIG_BT_HCIBTUSB=m + CONFIG_BT_HCIUART=m + CONFIG_BT_HCIUART_3WIRE=y ++CONFIG_BT_HCIUART_BCM=y + CONFIG_BT_HCIBCM203X=m + CONFIG_BT_HCIBPA10X=m + CONFIG_BT_HCIBFUSB=m +@@ -592,6 +593,7 @@ CONFIG_SERIAL_AMBA_PL011=y + CONFIG_SERIAL_AMBA_PL011_CONSOLE=y + CONFIG_SERIAL_SC16IS7XX=m + CONFIG_SERIAL_SC16IS7XX_SPI=y ++CONFIG_SERIAL_DEV_BUS=m + CONFIG_TTY_PRINTK=y + CONFIG_HW_RANDOM=y + CONFIG_RAW_DRIVER=y +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0296-arm64-Add-CONFIG_SERIAL_DEV_BUS-m-to-bcmrpi3_defconf.patch b/root/target/linux/brcm2708/patches-4.14/0296-arm64-Add-CONFIG_SERIAL_DEV_BUS-m-to-bcmrpi3_defconf.patch new file mode 100644 index 00000000..7b3f58bc --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0296-arm64-Add-CONFIG_SERIAL_DEV_BUS-m-to-bcmrpi3_defconf.patch @@ -0,0 +1,28 @@ +From 274cd7bcba6874bfb3d891d957845b3da7206be3 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Thu, 5 Apr 2018 13:29:02 +0100 +Subject: [PATCH 296/297] arm64: Add CONFIG_SERIAL_DEV_BUS=m to + bcmrpi3_defconfig + +See: https://github.com/raspberrypi/linux/issues/2479 + +Signed-off-by: Phil Elwell +--- + arch/arm64/configs/bcmrpi3_defconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm64/configs/bcmrpi3_defconfig b/arch/arm64/configs/bcmrpi3_defconfig +index 50acf25b1f28..69aea2f6da4a 100644 +--- a/arch/arm64/configs/bcmrpi3_defconfig ++++ b/arch/arm64/configs/bcmrpi3_defconfig +@@ -595,6 +595,7 @@ CONFIG_SERIAL_AMBA_PL011=y + CONFIG_SERIAL_AMBA_PL011_CONSOLE=y + CONFIG_SERIAL_SC16IS7XX=m + CONFIG_SERIAL_SC16IS7XX_SPI=y ++CONFIG_SERIAL_DEV_BUS=m + CONFIG_TTY_PRINTK=y + CONFIG_HW_RANDOM=y + CONFIG_RAW_DRIVER=y +-- +2.16.1 + diff --git a/root/target/linux/brcm2708/patches-4.14/0297-lan78xx-Move-enabling-of-EEE-into-PHY-init-code.patch b/root/target/linux/brcm2708/patches-4.14/0297-lan78xx-Move-enabling-of-EEE-into-PHY-init-code.patch new file mode 100644 index 00000000..83631655 --- /dev/null +++ b/root/target/linux/brcm2708/patches-4.14/0297-lan78xx-Move-enabling-of-EEE-into-PHY-init-code.patch @@ -0,0 +1,69 @@ +From c2eb30683b43b13b931bd9cfef6a2a09ac7b7c1e Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Thu, 5 Apr 2018 14:46:11 +0100 +Subject: [PATCH 297/297] lan78xx: Move enabling of EEE into PHY init code + +Enable EEE mode as soon as possible after connecting to the PHY, and +before phy_start. This avoids a second link negotiation, which speeds +up booting and stops the interface failing to become ready. + +See: https://github.com/raspberrypi/linux/issues/2437 + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index b57e86f45434..3bc5ce4b73f9 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2093,6 +2093,22 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + mii_adv = (u32)mii_advertise_flowctrl(dev->fc_request_control); + phydev->advertising |= mii_adv_to_ethtool_adv_t(mii_adv); + ++ if (of_property_read_bool(dev->udev->dev.of_node, ++ "microchip,eee-enabled")) { ++ struct ethtool_eee edata; ++ memset(&edata, 0, sizeof(edata)); ++ edata.cmd = ETHTOOL_SEEE; ++ edata.advertised = ADVERTISED_1000baseT_Full | ++ ADVERTISED_100baseT_Full; ++ edata.eee_enabled = true; ++ edata.tx_lpi_enabled = true; ++ if (of_property_read_u32(dev->udev->dev.of_node, ++ "microchip,tx-lpi-timer", ++ &edata.tx_lpi_timer)) ++ edata.tx_lpi_timer = 600; /* non-aggressive */ ++ (void)lan78xx_set_eee(dev->net, &edata); ++ } ++ + /* Set LED modes: + * led: 0=link/activity 1=link1000/activity + * 2=link100/activity 3=link10/activity +@@ -2557,22 +2573,6 @@ static int lan78xx_open(struct net_device *net) + + netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); + +- if (of_property_read_bool(dev->udev->dev.of_node, +- "microchip,eee-enabled")) { +- struct ethtool_eee edata; +- memset(&edata, 0, sizeof(edata)); +- edata.cmd = ETHTOOL_SEEE; +- edata.advertised = ADVERTISED_1000baseT_Full | +- ADVERTISED_100baseT_Full; +- edata.eee_enabled = true; +- edata.tx_lpi_enabled = true; +- if (of_property_read_u32(dev->udev->dev.of_node, +- "microchip,tx-lpi-timer", +- &edata.tx_lpi_timer)) +- edata.tx_lpi_timer = 600; /* non-aggressive */ +- (void)lan78xx_set_eee(net, &edata); +- } +- + /* for Link Check */ + if (dev->urb_intr) { + ret = usb_submit_urb(dev->urb_intr, GFP_KERNEL); +-- +2.16.1 +