summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Robinson <pbrobinson@gmail.com>2018-04-23 17:16:43 +0100
committerJeremy Cline <jeremy@jcline.org>2018-04-24 18:31:43 -0400
commit0edfe4f286703af715625ca588532edcbbb68e2a (patch)
tree1df6c5730b8538cdcf368270a6faad0bd234a9b8
parentd16f67c2d93b7bd5b8ff5ac87b863f641dfe3e71 (diff)
downloadkernel-0edfe4f286703af715625ca588532edcbbb68e2a.tar.gz
kernel-0edfe4f286703af715625ca588532edcbbb68e2a.tar.xz
kernel-0edfe4f286703af715625ca588532edcbbb68e2a.zip
Latest RPi3+ patches, RPi fixes, further lan78xx patches (some from 4.17, some under review), fixes for Marvell a37xx EspressoBin
-rw-r--r--bcm2837-gpio-expander.patch250
-rw-r--r--bcm2837-lan78xx-fixes.patch911
-rw-r--r--bcm2837-rpi-initial-3plus-support.patch560
-rw-r--r--bcm2837-rpi-initial-support-for-the-3.patch209
-rw-r--r--bcm283x-drm-vc4-fix-mem-leak.patch54
-rw-r--r--kernel.spec17
-rw-r--r--mvebu-a37xx-fixes.patch245
7 files changed, 1629 insertions, 617 deletions
diff --git a/bcm2837-gpio-expander.patch b/bcm2837-gpio-expander.patch
index f5b8370b4..b2872cbe1 100644
--- a/bcm2837-gpio-expander.patch
+++ b/bcm2837-gpio-expander.patch
@@ -1,19 +1,7 @@
-From patchwork Tue Feb 20 12:19:31 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v5,1/5] ARM: bcm2835: sync firmware properties with downstream
+From 08af112e79cab22f318ca0ad1a48187eee5ac2f0 Mon Sep 17 00:00:00 2001
From: Baruch Siach <baruch@tkos.co.il>
-X-Patchwork-Id: 10229963
-Message-Id: <e7d1f1d0789f11d37957a8998bee23d035115aeb.1519128054.git.baruch@tkos.co.il>
-To: Linus Walleij <linus.walleij@linaro.org>,
- Dave Stevenson <dave.stevenson@raspberrypi.org>,
- Eric Anholt <eric@anholt.net>, Stefan Wahren <stefan.wahren@i2se.com>
-Cc: devicetree@vger.kernel.org, Baruch Siach <baruch@tkos.co.il>,
- linux-gpio@vger.kernel.org, Michael Zoran <mzoran@crowfest.net>,
- Rob Herring <robh+dt@kernel.org>, linux-rpi-kernel@lists.infradead.org,
- Frank Rowand <frowand.list@gmail.com>, linux-arm-kernel@lists.infradead.org
Date: Tue, 20 Feb 2018 14:19:31 +0200
+Subject: soc: bcm2835: sync firmware properties with downstream
Add latest firmware property tags from the latest Raspberry Pi downstream
kernel. This is needed for the GPIO tags, so we can control the GPIO
@@ -21,18 +9,13 @@ multiplexor lines.
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
----
-v4: No change
-
-v3: Add Stefan's ack
-
-v2: No change
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
include/soc/bcm2835/raspberrypi-firmware.h | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
-index cb979ad90401..50df5b28d2c9 100644
+index cb979ad..50df5b2 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -63,6 +63,7 @@ enum rpi_firmware_property_tag {
@@ -94,22 +77,12 @@ index cb979ad90401..50df5b28d2c9 100644
RPI_FIRMWARE_VCHIQ_INIT = 0x00048010,
-From patchwork Tue Feb 20 12:19:32 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v5,2/5] dt-bindings: gpio: add raspberry pi GPIO expander binding
+--
+cgit v1.1
+From 9777d8099a4a9df1625b4caaee1388c0158478c5 Mon Sep 17 00:00:00 2001
From: Baruch Siach <baruch@tkos.co.il>
-X-Patchwork-Id: 10229965
-Message-Id: <f400b48cbcd8a138c39d4e8f63d6c1f569090dcc.1519128054.git.baruch@tkos.co.il>
-To: Linus Walleij <linus.walleij@linaro.org>,
- Dave Stevenson <dave.stevenson@raspberrypi.org>,
- Eric Anholt <eric@anholt.net>, Stefan Wahren <stefan.wahren@i2se.com>
-Cc: devicetree@vger.kernel.org, Baruch Siach <baruch@tkos.co.il>,
- linux-gpio@vger.kernel.org, Michael Zoran <mzoran@crowfest.net>,
- Rob Herring <robh+dt@kernel.org>, linux-rpi-kernel@lists.infradead.org,
- Frank Rowand <frowand.list@gmail.com>, linux-arm-kernel@lists.infradead.org
Date: Tue, 20 Feb 2018 14:19:32 +0200
+Subject: dt-bindings: gpio: add raspberry pi GPIO expander binding
The Raspberry Pi 3 GPIO expander is controlled by the VC4 firmware over
I2C. The firmware mailbox interface allows the ARM core to control the
@@ -117,20 +90,7 @@ GPIO lines.
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Reviewed-by: Rob Herring <robh@kernel.org>
----
-v5:
- * Remove the 'firmware' property
- * Note that the gpio node is a child of the firmware node
-
-v4:
- * Move the example gpio node under the firmware node
- * Rename gpio node name to plain 'gpio'
-
-v3:
- * Rename node name.
-
-v2:
- * Rename compatible string to raspberrypi,firmware-gpio
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
.../bindings/gpio/raspberrypi,firmware-gpio.txt | 30 ++++++++++++++++++++++
1 file changed, 30 insertions(+)
@@ -138,7 +98,7 @@ v2:
diff --git a/Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt b/Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt
new file mode 100644
-index 000000000000..ce97265e23ba
+index 0000000..ce97265
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/raspberrypi,firmware-gpio.txt
@@ -0,0 +1,30 @@
@@ -172,26 +132,13 @@ index 000000000000..ce97265e23ba
+ #gpio-cells = <2>;
+ };
+};
-From patchwork Tue Feb 20 12:19:33 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v5,
- 3/5] gpio: raspberrypi-exp: Driver for RPi3 GPIO expander via mailbox
- service
-From: Baruch Siach <baruch@tkos.co.il>
-X-Patchwork-Id: 10229967
-Message-Id: <8c34f287ee72b340fa9d693aa0e304b25541c74c.1519128054.git.baruch@tkos.co.il>
-To: Linus Walleij <linus.walleij@linaro.org>,
- Dave Stevenson <dave.stevenson@raspberrypi.org>,
- Eric Anholt <eric@anholt.net>, Stefan Wahren <stefan.wahren@i2se.com>
-Cc: devicetree@vger.kernel.org, Baruch Siach <baruch@tkos.co.il>,
- linux-gpio@vger.kernel.org, Michael Zoran <mzoran@crowfest.net>,
- Rob Herring <robh+dt@kernel.org>, linux-rpi-kernel@lists.infradead.org,
- Frank Rowand <frowand.list@gmail.com>, linux-arm-kernel@lists.infradead.org
-Date: Tue, 20 Feb 2018 14:19:33 +0200
-
+--
+cgit v1.1
+From a98d90e7d588045716c3c85d63f93dc3f15a079b Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
+Date: Tue, 20 Feb 2018 14:19:33 +0200
+Subject: gpio: raspberrypi-exp: Driver for RPi3 GPIO expander via mailbox
+ service
Pi3 and Compute Module 3 have a GPIO expander that the
VPU communicates with.
@@ -201,31 +148,7 @@ expander, so add a kernel driver that can make use of it.
Reviewed-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
----
-v5:
- * Use the parent node to find the firmware
-
-v4:
- * Don't set the .owner driver field
- * Add Stefan's review tag
-
-v3:
- * Tweak Kconfig driver prompt
- * Make GPIO_RASPBERRYPI_EXP tristate
- * Make COMPILE_TEST independent of RASPBERRYPI_FIRMWARE
- * Remove redundant DMA header
- * Use less code lines for dev_err()
- * Check rpi_exp_gpio_get_polarity() return value
- * Remove redundant platform_set_drvdata() call
-
-v2:
- * Rename driver to gpio-raspberrypi-exp
- * Populate the gpiochip parent device pointer
- * Use macro for the mailbox base GPIO number
- * Drop linux/gpio.h and GPIOF_DIR_*
- * Check and print firmware error value
- * Use devm_gpiochip_add_data(); drop .remove
- * A few more minor tweaks
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
drivers/gpio/Kconfig | 9 ++
drivers/gpio/Makefile | 1 +
@@ -234,7 +157,7 @@ v2:
create mode 100644 drivers/gpio/gpio-raspberrypi-exp.c
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
-index 8dbb2280538d..fd0562a37f68 100644
+index 8dbb228..fd0562a 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -122,6 +122,15 @@ config GPIO_ATH79
@@ -254,7 +177,7 @@ index 8dbb2280538d..fd0562a37f68 100644
bool "Broadcom Kona GPIO"
depends on OF_GPIO && (ARCH_BCM_MOBILE || COMPILE_TEST)
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
-index cccb0d40846c..76dc0a02bd56 100644
+index cccb0d4..76dc0a0 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -32,6 +32,7 @@ obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o
@@ -267,7 +190,7 @@ index cccb0d40846c..76dc0a02bd56 100644
obj-$(CONFIG_GPIO_BRCMSTB) += gpio-brcmstb.o
diff --git a/drivers/gpio/gpio-raspberrypi-exp.c b/drivers/gpio/gpio-raspberrypi-exp.c
new file mode 100644
-index 000000000000..d6d36d537e37
+index 0000000..d6d36d5
--- /dev/null
+++ b/drivers/gpio/gpio-raspberrypi-exp.c
@@ -0,0 +1,252 @@
@@ -523,36 +446,26 @@ index 000000000000..d6d36d537e37
+MODULE_AUTHOR("Dave Stevenson <dave.stevenson@raspberrypi.org>");
+MODULE_DESCRIPTION("Raspberry Pi 3 expander GPIO driver");
+MODULE_ALIAS("platform:rpi-exp-gpio");
-From patchwork Tue Feb 20 12:19:34 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v5,4/5] ARM: dts: bcm2835: make the firmware node into a bus
+--
+cgit v1.1
+From b0c07c5af6d286f3d3b907743998e9d41f6ab042 Mon Sep 17 00:00:00 2001
From: Baruch Siach <baruch@tkos.co.il>
-X-Patchwork-Id: 10229961
-Message-Id: <43f9082a6835df6d7bcd3e16d79db687c52826d2.1519128054.git.baruch@tkos.co.il>
-To: Linus Walleij <linus.walleij@linaro.org>,
- Dave Stevenson <dave.stevenson@raspberrypi.org>,
- Eric Anholt <eric@anholt.net>, Stefan Wahren <stefan.wahren@i2se.com>
-Cc: devicetree@vger.kernel.org, Baruch Siach <baruch@tkos.co.il>,
- linux-gpio@vger.kernel.org, Michael Zoran <mzoran@crowfest.net>,
- Rob Herring <robh+dt@kernel.org>, linux-rpi-kernel@lists.infradead.org,
- Frank Rowand <frowand.list@gmail.com>, linux-arm-kernel@lists.infradead.org
Date: Tue, 20 Feb 2018 14:19:34 +0200
+Subject: ARM: dts: bcm2835: make the firmware node into a bus
This allows adding devices for which the firmware exposes control interface
via the mailbox. An example of such device is the GPIO expander.
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
----
-v4: New patch in this series
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
---
arch/arm/boot/dts/bcm2835-rpi.dtsi | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
-index e36c392a2b8f..0198bd46ef7c 100644
+index e36c392..0198bd4 100644
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
@@ -18,7 +18,9 @@
@@ -566,50 +479,26 @@ index e36c392a2b8f..0198bd46ef7c 100644
mboxes = <&mailbox>;
};
-From patchwork Tue Feb 20 12:19:35 2018
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: [v5,5/5] ARM: dts: bcm2837-rpi-3-b: add GPIO expander
+--
+cgit v1.1
+From 4d5b2eaf3ca80c56a59f230208c4ff11e3f68d55 Mon Sep 17 00:00:00 2001
From: Baruch Siach <baruch@tkos.co.il>
-X-Patchwork-Id: 10229995
-Message-Id: <a6d59692dc4847e0b1639a26542e28c95ad5240f.1519128054.git.baruch@tkos.co.il>
-To: Linus Walleij <linus.walleij@linaro.org>,
- Dave Stevenson <dave.stevenson@raspberrypi.org>,
- Eric Anholt <eric@anholt.net>, Stefan Wahren <stefan.wahren@i2se.com>
-Cc: devicetree@vger.kernel.org, Baruch Siach <baruch@tkos.co.il>,
- linux-gpio@vger.kernel.org, Michael Zoran <mzoran@crowfest.net>,
- Rob Herring <robh+dt@kernel.org>, linux-rpi-kernel@lists.infradead.org,
- Frank Rowand <frowand.list@gmail.com>, linux-arm-kernel@lists.infradead.org
Date: Tue, 20 Feb 2018 14:19:35 +0200
+Subject: ARM: dts: bcm2837-rpi-3-b: add GPIO expander
Add a description of the RPi3 GPIO expander that the VC4 firmware controls.
Acked-by: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
----
-v5:
- * Drop the 'firmware' property
-
-v4:
- * Move the gpio node under the firmware node
- * Rename the gpio node to plain 'gpio'
- * Add Stefan's ack
-
-v3:
- * List GPIO names one per line.
-
-v2:
- * Move GPIO expander node out of the soc container
- * Rename compatible string
- * Add gpio-line-names property
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
---
arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
-index 3e4ed7c5b0b3..0b31d995a066 100644
+index 3e4ed7c..0b31d99 100644
--- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
@@ -25,6 +25,23 @@
@@ -636,72 +525,5 @@ index 3e4ed7c5b0b3..0b31d995a066 100644
/* uart0 communicates with the BT module */
&uart0 {
pinctrl-names = "default";
-From 257f497bb3e58f88500971145761ed55428618eb Mon Sep 17 00:00:00 2001
-From: Stefan Wahren <stefan.wahren@i2se.com>
-Date: Wed, 7 Mar 2018 15:56:20 +0100
-Subject: [PATCH] ARM: dts: bcm2837: Add missing GPIOs of Expander
-
-Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
----
- arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 20 +++++++++++++++++++-
- 1 file changed, 19 insertions(+), 1 deletion(-)
-
-diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
-index 0b31d995a066..3e87ed05918e 100644
---- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
-+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
-@@ -20,9 +20,14 @@
-
- leds {
- act {
-- gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
-+ gpios = <&expgpio 2 GPIO_ACTIVE_HIGH>;
- };
- };
-+
-+ wifi_pwrseq: wifi-pwrseq {
-+ compatible = "mmc-pwrseq-simple";
-+ reset-gpios = <&expgpio 1 GPIO_ACTIVE_HIGH>;
-+ };
- };
-
- &firmware {
-@@ -42,6 +47,10 @@
- };
- };
-
-+&hdmi {
-+ hpd-gpios = <&expgpio 4 GPIO_ACTIVE_LOW>;
-+};
-+
- /* uart0 communicates with the BT module */
- &uart0 {
- pinctrl-names = "default";
-@@ -51,6 +60,7 @@
- bluetooth {
- compatible = "brcm,bcm43438-bt";
- max-speed = <2000000>;
-+ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>;
- };
- };
-
-@@ -63,11 +73,19 @@
-
- /* SDHCI is used to control the SDIO for wireless */
- &sdhci {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- pinctrl-names = "default";
- pinctrl-0 = <&emmc_gpio34>;
- status = "okay";
- bus-width = <4>;
- non-removable;
-+ mmc-pwrseq = <&wifi_pwrseq>;
-+
-+ brcmf: wifi@1 {
-+ reg = <1>;
-+ compatible = "brcm,bcm4329-fmac";
-+ };
- };
-
- /* SDHOST is used to drive the SD card */
+--
+cgit v1.1
diff --git a/bcm2837-lan78xx-fixes.patch b/bcm2837-lan78xx-fixes.patch
index c8fd0b9f0..7fa432a5e 100644
--- a/bcm2837-lan78xx-fixes.patch
+++ b/bcm2837-lan78xx-fixes.patch
@@ -1,188 +1,268 @@
-From 6ed88d188a8240ba44da6578eab7d17e036d0e61 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Tue, 17 Oct 2017 15:04:29 +0100
-Subject: [PATCH] lan78xx: Enable LEDs if no valid EEPROM or OTP
-
-For applications of the LAN78xx that don't have valid programmed
-EEPROMs or OTPs, enabling both LEDs by default seems reasonable.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+From b23d39c166ca3ed30a2a0a4c8ba4cf29677eed83 Mon Sep 17 00:00:00 2001
+From: Raghuram Chary J <raghuramchary.jallipalli@microchip.com>
+Date: Wed, 11 Apr 2018 20:36:36 +0530
+Subject: [PATCH 1/9] lan78xx: PHY DSP registers initialization to address EEE
+ link drop issues with long cables
+
+The patch is to configure DSP registers of PHY device
+to handle Gbe-EEE failures with >40m cable length.
+
+Fixes: 55d7de9de6c3 ("Microchip's LAN7800 family USB 2/3 to 10/100/1000 Ethernet device driver")
+Signed-off-by: Raghuram Chary J <raghuramchary.jallipalli@microchip.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
---
- drivers/net/usb/lan78xx.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index a21039852f8d..cd20ce4ed87d 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -2414,6 +2414,12 @@ static int lan78xx_reset(struct lan78xx_net *dev)
+ drivers/net/phy/microchip.c | 178 ++++++++++++++++++++++++++++++++++-
+ include/linux/microchipphy.h | 8 ++
+ 2 files changed, 185 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c
+index 0f293ef28935..a97ac8c12c4c 100644
+--- a/drivers/net/phy/microchip.c
++++ b/drivers/net/phy/microchip.c
+@@ -20,6 +20,7 @@
+ #include <linux/ethtool.h>
+ #include <linux/phy.h>
+ #include <linux/microchipphy.h>
++#include <linux/delay.h>
+
+ #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
+ #define DRIVER_DESC "Microchip LAN88XX PHY driver"
+@@ -30,6 +31,16 @@ struct lan88xx_priv {
+ __u32 wolopts;
+ };
- ret = lan78xx_read_reg(dev, HW_CFG, &buf);
- buf |= HW_CFG_MEF_;
++static int lan88xx_read_page(struct phy_device *phydev)
++{
++ return __phy_read(phydev, LAN88XX_EXT_PAGE_ACCESS);
++}
+
-+ /* If no valid EEPROM and no valid OTP, enable the LEDs by default */
-+ if (lan78xx_read_eeprom(dev, 0, 0, NULL) &&
-+ lan78xx_read_otp(dev, 0, 0, NULL))
-+ buf |= HW_CFG_LED0_EN_ | HW_CFG_LED1_EN_;
++static int lan88xx_write_page(struct phy_device *phydev, int page)
++{
++ return __phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, page);
++}
+
- ret = lan78xx_write_reg(dev, HW_CFG, buf);
-
- ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
-From 4a4710f3847cd087e150f83382dffd92e09d9914 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Sat, 17 Mar 2018 00:10:02 +0100
-Subject: [PATCH] lan78xx: Read MAC address from DT if present
-
-There is a standard mechanism for locating and using a MAC address from
-the Device Tree. Use this facility in the lan78xx driver to support
-applications without programmed EEPROM or OTP.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/net/usb/lan78xx.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 60a604cc7647..a21039852f8d 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -36,6 +36,7 @@
- #include <linux/irq.h>
- #include <linux/irqchip/chained_irq.h>
- #include <linux/microchipphy.h>
-+#include <linux/of_net.h>
- #include <linux/phy.h>
- #include "lan78xx.h"
+ static int lan88xx_phy_config_intr(struct phy_device *phydev)
+ {
+ int rc;
+@@ -66,6 +77,150 @@ static int lan88xx_suspend(struct phy_device *phydev)
+ return 0;
+ }
-@@ -1639,6 +1640,14 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
- u32 addr_lo, addr_hi;
- int ret;
- u8 addr[6];
-+ const u8 *mac_addr;
-+
-+ /* maybe the boot loader passed the MAC address in devicetree */
-+ mac_addr = of_get_mac_address(dev->udev->dev.of_node);
-+ if (mac_addr) {
-+ ether_addr_copy(addr, mac_addr);
-+ goto set_mac_addr;
++static int lan88xx_TR_reg_set(struct phy_device *phydev, u16 regaddr,
++ u32 data)
++{
++ int val, save_page, ret = 0;
++ u16 buf;
++
++ /* Save current page */
++ save_page = phy_save_page(phydev);
++ if (save_page < 0) {
++ pr_warn("Failed to get current page\n");
++ goto err;
+ }
-
- ret = lan78xx_read_reg(dev, RX_ADDRL, &addr_lo);
- ret = lan78xx_read_reg(dev, RX_ADDRH, &addr_hi);
-@@ -1667,6 +1676,7 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
- "MAC address set to random addr");
- }
-
-+set_mac_addr:
- addr_lo = addr[0] | (addr[1] << 8) |
- (addr[2] << 16) | (addr[3] << 24);
- addr_hi = addr[4] | (addr[5] << 8);
-From b5284e5d2d3562dac311443969a538b7fecb9848 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 28 Mar 2018 12:18:13 +0100
-Subject: [PATCH 1/5] 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 <phil@raspberrypi.org>
----
- 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 b43b16b6e7ee..97ee7d3f749d 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;
-+ }
++ /* Switch to TR page */
++ lan88xx_write_page(phydev, LAN88XX_EXT_PAGE_ACCESS_TR);
+
- /* reading mac address from EEPROM or OTP */
- if ((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
- addr) == 0) ||
---
-2.17.0
-
-From 2c5d6ac9133cbfed05b97b34246121bddaf2aea4 Mon Sep 17 00:00:00 2001
-From: Dave Stevenson <dave.stevenson@raspberrypi.org>
-Date: Wed, 4 Apr 2018 16:34:24 +0100
-Subject: [PATCH 2/5] 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 <dave.stevenson@raspberrypi.org>
----
- 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 97ee7d3f749d..5fd7b8569cba 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -2193,7 +2193,7 @@ static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
- if ((ll_mtu % dev->maxpacket) == 0)
- return -EDOM;
++ ret = __phy_write(phydev, LAN88XX_EXT_PAGE_TR_LOW_DATA,
++ (data & 0xFFFF));
++ if (ret < 0) {
++ pr_warn("Failed to write TR low data\n");
++ goto err;
++ }
++
++ ret = __phy_write(phydev, LAN88XX_EXT_PAGE_TR_HIGH_DATA,
++ (data & 0x00FF0000) >> 16);
++ if (ret < 0) {
++ pr_warn("Failed to write TR high data\n");
++ goto err;
++ }
++
++ /* Config control bits [15:13] of register */
++ buf = (regaddr & ~(0x3 << 13));/* Clr [14:13] to write data in reg */
++ buf |= 0x8000; /* Set [15] to Packet transmit */
++
++ ret = __phy_write(phydev, LAN88XX_EXT_PAGE_TR_CR, buf);
++ if (ret < 0) {
++ pr_warn("Failed to write data in reg\n");
++ goto err;
++ }
++
++ usleep_range(1000, 2000);/* Wait for Data to be written */
++ val = __phy_read(phydev, LAN88XX_EXT_PAGE_TR_CR);
++ if (!(val & 0x8000))
++ pr_warn("TR Register[0x%X] configuration failed\n", regaddr);
++err:
++ return phy_restore_page(phydev, save_page, ret);
++}
++
++static void lan88xx_config_TR_regs(struct phy_device *phydev)
++{
++ int err;
++
++ /* Get access to Channel 0x1, Node 0xF , Register 0x01.
++ * Write 24-bit value 0x12B00A to register. Setting MrvlTrFix1000Kf,
++ * MrvlTrFix1000Kp, MasterEnableTR bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x0F82, 0x12B00A);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x0F82]\n");
++
++ /* Get access to Channel b'10, Node b'1101, Register 0x06.
++ * Write 24-bit value 0xD2C46F to register. Setting SSTrKf1000Slv,
++ * SSTrKp1000Mas bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x168C, 0xD2C46F);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x168C]\n");
++
++ /* Get access to Channel b'10, Node b'1111, Register 0x11.
++ * Write 24-bit value 0x620 to register. Setting rem_upd_done_thresh
++ * bits
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x17A2, 0x620);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x17A2]\n");
++
++ /* Get access to Channel b'10, Node b'1101, Register 0x10.
++ * Write 24-bit value 0xEEFFDD to register. Setting
++ * eee_TrKp1Long_1000, eee_TrKp2Long_1000, eee_TrKp3Long_1000,
++ * eee_TrKp1Short_1000,eee_TrKp2Short_1000, eee_TrKp3Short_1000 bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x16A0, 0xEEFFDD);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x16A0]\n");
++
++ /* Get access to Channel b'10, Node b'1101, Register 0x13.
++ * Write 24-bit value 0x071448 to register. Setting
++ * slv_lpi_tr_tmr_val1, slv_lpi_tr_tmr_val2 bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x16A6, 0x071448);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x16A6]\n");
++
++ /* Get access to Channel b'10, Node b'1101, Register 0x12.
++ * Write 24-bit value 0x13132F to register. Setting
++ * slv_sigdet_timer_val1, slv_sigdet_timer_val2 bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x16A4, 0x13132F);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x16A4]\n");
++
++ /* Get access to Channel b'10, Node b'1101, Register 0x14.
++ * Write 24-bit value 0x0 to register. Setting eee_3level_delay,
++ * eee_TrKf_freeze_delay bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x16A8, 0x0);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x16A8]\n");
++
++ /* Get access to Channel b'01, Node b'1111, Register 0x34.
++ * Write 24-bit value 0x91B06C to register. Setting
++ * FastMseSearchThreshLong1000, FastMseSearchThreshShort1000,
++ * FastMseSearchUpdGain1000 bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x0FE8, 0x91B06C);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x0FE8]\n");
++
++ /* Get access to Channel b'01, Node b'1111, Register 0x3E.
++ * Write 24-bit value 0xC0A028 to register. Setting
++ * FastMseKp2ThreshLong1000, FastMseKp2ThreshShort1000,
++ * FastMseKp2UpdGain1000, FastMseKp2ExitEn1000 bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x0FFC, 0xC0A028);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x0FFC]\n");
++
++ /* Get access to Channel b'01, Node b'1111, Register 0x35.
++ * Write 24-bit value 0x041600 to register. Setting
++ * FastMseSearchPhShNum1000, FastMseSearchClksPerPh1000,
++ * FastMsePhChangeDelay1000 bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x0FEA, 0x041600);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x0FEA]\n");
++
++ /* Get access to Channel b'10, Node b'1101, Register 0x03.
++ * Write 24-bit value 0x000004 to register. Setting TrFreeze bits.
++ */
++ err = lan88xx_TR_reg_set(phydev, 0x1686, 0x000004);
++ if (err < 0)
++ pr_warn("Failed to Set Register[0x1686]\n");
++}
++
+ static int lan88xx_probe(struct phy_device *phydev)
+ {
+ struct device *dev = &phydev->mdio.dev;
+@@ -132,6 +287,25 @@ static void lan88xx_set_mdix(struct phy_device *phydev)
+ phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, LAN88XX_EXT_PAGE_SPACE_0);
+ }
-- 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);
++static int lan88xx_config_init(struct phy_device *phydev)
++{
++ int val;
++
++ genphy_config_init(phydev);
++ /*Zerodetect delay enable */
++ val = phy_read_mmd(phydev, MDIO_MMD_PCS,
++ PHY_ARDENNES_MMD_DEV_3_PHY_CFG);
++ val |= PHY_ARDENNES_MMD_DEV_3_PHY_CFG_ZD_DLY_EN_;
++
++ phy_write_mmd(phydev, MDIO_MMD_PCS, PHY_ARDENNES_MMD_DEV_3_PHY_CFG,
++ val);
++
++ /* Config DSP registers */
++ lan88xx_config_TR_regs(phydev);
++
++ return 0;
++}
++
+ static int lan88xx_config_aneg(struct phy_device *phydev)
+ {
+ lan88xx_set_mdix(phydev);
+@@ -151,7 +325,7 @@ static struct phy_driver microchip_phy_driver[] = {
+ .probe = lan88xx_probe,
+ .remove = lan88xx_remove,
- netdev->mtu = new_mtu;
+- .config_init = genphy_config_init,
++ .config_init = lan88xx_config_init,
+ .config_aneg = lan88xx_config_aneg,
-@@ -2488,7 +2488,8 @@ static int lan78xx_reset(struct lan78xx_net *dev)
- buf |= FCT_TX_CTL_EN_;
- ret = lan78xx_write_reg(dev, FCT_TX_CTL, buf);
+ .ack_interrupt = lan88xx_phy_ack_interrupt,
+@@ -160,6 +334,8 @@ static struct phy_driver microchip_phy_driver[] = {
+ .suspend = lan88xx_suspend,
+ .resume = genphy_resume,
+ .set_wol = lan88xx_set_wol,
++ .read_page = lan88xx_read_page,
++ .write_page = lan88xx_write_page,
+ } };
-- 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);
+ module_phy_driver(microchip_phy_driver);
+diff --git a/include/linux/microchipphy.h b/include/linux/microchipphy.h
+index eb492d47f717..8f9c90379732 100644
+--- a/include/linux/microchipphy.h
++++ b/include/linux/microchipphy.h
+@@ -70,4 +70,12 @@
+ #define LAN88XX_MMD3_CHIP_ID (32877)
+ #define LAN88XX_MMD3_CHIP_REV (32878)
- ret = lan78xx_read_reg(dev, MAC_RX, &buf);
- buf |= MAC_RX_RXEN_;
++/* DSP registers */
++#define PHY_ARDENNES_MMD_DEV_3_PHY_CFG (0x806A)
++#define PHY_ARDENNES_MMD_DEV_3_PHY_CFG_ZD_DLY_EN_ (0x2000)
++#define LAN88XX_EXT_PAGE_ACCESS_TR (0x52B5)
++#define LAN88XX_EXT_PAGE_TR_CR 16
++#define LAN88XX_EXT_PAGE_TR_LOW_DATA 17
++#define LAN88XX_EXT_PAGE_TR_HIGH_DATA 18
++
+ #endif /* _MICROCHIPPHY_H */
--
2.17.0
-From 833315351413d94d7db407847448dfeddfafe127 Mon Sep 17 00:00:00 2001
-From: Peter Robinson <pbrobinson@gmail.com>
-Date: Mon, 9 Apr 2018 17:51:35 +0100
-Subject: [PATCH 3/5] lan78xx: Connect phy early
+From 7d76fccb22d71c80209eb9ef5b013a630424cb6c Mon Sep 17 00:00:00 2001
+From: Alexander Graf <agraf@suse.de>
+Date: Wed, 4 Apr 2018 00:19:35 +0200
+Subject: [PATCH 2/9] 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
@@ -261,15 +341,16 @@ the interface up and down as many times as I want, without getting NULL pointer
dereferences in between.
Signed-off-by: Alexander Graf <agraf@suse.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
---
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 5fd7b8569cba..60fa1257721c 100644
+index 32cf21716f19..145bb7cbf5b2 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
-@@ -2094,10 +2094,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
+@@ -2083,10 +2083,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
dev->fc_autoneg = phydev->autoneg;
@@ -280,7 +361,7 @@ index 5fd7b8569cba..60fa1257721c 100644
return 0;
error:
-@@ -2541,9 +2537,9 @@ static int lan78xx_open(struct net_device *net)
+@@ -2523,9 +2519,9 @@ static int lan78xx_open(struct net_device *net)
if (ret < 0)
goto done;
@@ -293,7 +374,7 @@ index 5fd7b8569cba..60fa1257721c 100644
/* for Link Check */
if (dev->urb_intr) {
-@@ -2604,13 +2600,8 @@ static int lan78xx_stop(struct net_device *net)
+@@ -2586,13 +2582,8 @@ static int lan78xx_stop(struct net_device *net)
if (timer_pending(&dev->stat_monitor))
del_timer_sync(&dev->stat_monitor);
@@ -309,7 +390,7 @@ index 5fd7b8569cba..60fa1257721c 100644
clear_bit(EVENT_DEV_OPEN, &dev->flags);
netif_stop_queue(net);
-@@ -3525,8 +3516,13 @@ static void lan78xx_disconnect(struct usb_interface *intf)
+@@ -3507,8 +3498,13 @@ static void lan78xx_disconnect(struct usb_interface *intf)
return;
udev = interface_to_usbdev(intf);
@@ -324,7 +405,7 @@ index 5fd7b8569cba..60fa1257721c 100644
unregister_netdev(net);
cancel_delayed_work_sync(&dev->wq);
-@@ -3682,8 +3678,14 @@ static int lan78xx_probe(struct usb_interface *intf,
+@@ -3664,8 +3660,14 @@ static int lan78xx_probe(struct usb_interface *intf,
pm_runtime_set_autosuspend_delay(&udev->dev,
DEFAULT_AUTOSUSPEND_DELAY);
@@ -339,7 +420,7 @@ index 5fd7b8569cba..60fa1257721c 100644
out3:
lan78xx_unbind(dev, intf);
out2:
-@@ -4031,7 +4033,7 @@ static int lan78xx_reset_resume(struct usb_interface *intf)
+@@ -4013,7 +4015,7 @@ static int lan78xx_reset_resume(struct usb_interface *intf)
lan78xx_reset(dev);
@@ -351,29 +432,67 @@ index 5fd7b8569cba..60fa1257721c 100644
--
2.17.0
-From 7b4cc4a0af02c0d798007a143efa7509711d52d7 Mon Sep 17 00:00:00 2001
+From 502356f8db439d77a41958041feec187c42f72bb Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 4 Apr 2018 16:39:44 +0100
-Subject: [PATCH 4/5] lan78xx: Don't reset the interface on open
+Date: Wed, 11 Apr 2018 12:02:47 +0100
+Subject: [PATCH 3/9] lan78xx: Avoid spurious kevent 4 "error"
+
+lan78xx_defer_event generates an error message whenever the work item
+is already scheduled. lan78xx_open defers three events -
+EVENT_STAT_UPDATE, EVENT_DEV_OPEN and EVENT_LINK_RESET. Being aware
+of the likelihood (or certainty) of an error message, the DEV_OPEN
+event is added to the set of pending events directly, relying on
+the subsequent deferral of the EVENT_LINK_RESET call to schedule the
+work. Take the same precaution with EVENT_STAT_UPDATE to avoid a
+totally unnecessary error message.
-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).
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/usb/lan78xx.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
-Avoid this issue by removing the lan78xx_reset call.
+diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
+index 145bb7cbf5b2..bdb696612e11 100644
+--- a/drivers/net/usb/lan78xx.c
++++ b/drivers/net/usb/lan78xx.c
+@@ -2503,7 +2503,7 @@ static void lan78xx_init_stats(struct lan78xx_net *dev)
+ dev->stats.rollover_max.eee_tx_lpi_transitions = 0xFFFFFFFF;
+ dev->stats.rollover_max.eee_tx_lpi_time = 0xFFFFFFFF;
+
+- lan78xx_defer_kevent(dev, EVENT_STAT_UPDATE);
++ set_bit(EVENT_STAT_UPDATE, &dev->flags);
+ }
+
+ static int lan78xx_open(struct net_device *net)
+--
+2.17.0
+
+From d9332c56373a8c43bc4761267ba3a246082e2270 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 10 Apr 2018 13:18:25 +0100
+Subject: [PATCH 4/9] lan78xx: Don't reset the interface on open
-See: https://github.com/raspberrypi/linux/issues/2437
- https://github.com/raspberrypi/linux/issues/2442
- https://github.com/raspberrypi/linux/issues/2457
+Commit 92571a1aae40 ("lan78xx: Connect phy early") moves the PHY
+initialisation into lan78xx_probe, but lan78xx_open subsequently calls
+lan78xx_reset. As well as forcing a second round of link negotiation,
+this reset frequently prevents the phy interrupt from being generated
+(even though the link is up), rendering the interface unusable.
+
+Fix this issue by removing the lan78xx_reset call from lan78xx_open.
+
+Fixes: 92571a1aae40 ("lan78xx: Connect phy early")
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
---
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 60fa1257721c..293ed1847932 100644
+index bdb696612e11..0867f7275852 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
-@@ -2533,10 +2533,6 @@ static int lan78xx_open(struct net_device *net)
+@@ -2515,10 +2515,6 @@ static int lan78xx_open(struct net_device *net)
if (ret < 0)
goto out;
@@ -387,10 +506,53 @@ index 60fa1257721c..293ed1847932 100644
--
2.17.0
-From ddbd11509f01c388b968872aeabf630654275b0a Mon Sep 17 00:00:00 2001
+From bce4fe9fa48df0cbbe842e80d9a520f7265b4cd4 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.org>
+Date: Wed, 4 Apr 2018 16:34:24 +0100
+Subject: [PATCH 5/9] 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 <dave.stevenson@raspberrypi.org>
+---
+ 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 0867f7275852..5b46998a6dce 100644
+--- a/drivers/net/usb/lan78xx.c
++++ b/drivers/net/usb/lan78xx.c
+@@ -2178,7 +2178,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;
+
+@@ -2467,7 +2467,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.17.0
+
+From 6fecd97fd35e9c624d101495ca34c83b1cb23e3d Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
Date: Mon, 9 Apr 2018 14:31:54 +0100
-Subject: [PATCH 5/5] net: lan78xx: Request s/w csum check on VLAN tagged
+Subject: [PATCH 6/9] net: lan78xx: Request s/w csum check on VLAN tagged
packets.
There appears to be some issue in the LAN78xx where the checksum
@@ -412,10 +574,10 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index 293ed1847932..44cabda17bb6 100644
+index 5b46998a6dce..6b61bb21f2ae 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
-@@ -2937,8 +2937,12 @@ static void lan78xx_rx_csum_offload(struct lan78xx_net *dev,
+@@ -2920,8 +2920,12 @@ static void lan78xx_rx_csum_offload(struct lan78xx_net *dev,
struct sk_buff *skb,
u32 rx_cmd_a, u32 rx_cmd_b)
{
@@ -432,3 +594,368 @@ index 293ed1847932..44cabda17bb6 100644
--
2.17.0
+From 7528d39c5d01383fadb17a84b9840f9f685d1e0b Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 19 Apr 2018 17:59:38 +0100
+Subject: [PATCH 7/9] lan78xx: Read MAC address from DT if present
+
+There is a standard mechanism for locating and using a MAC address from
+the Device Tree. Use this facility in the lan78xx driver to support
+applications without programmed EEPROM or OTP. At the same time,
+regularise the handling of the different address sources.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/net/usb/lan78xx.c | 42 +++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
+index 6b61bb21f2ae..6c38a74bb32d 100644
+--- a/drivers/net/usb/lan78xx.c
++++ b/drivers/net/usb/lan78xx.c
+@@ -37,6 +37,7 @@
+ #include <linux/irqchip/chained_irq.h>
+ #include <linux/microchipphy.h>
+ #include <linux/phy.h>
++#include <linux/of_net.h>
+ #include "lan78xx.h"
+
+ #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
+@@ -1652,34 +1653,31 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
+ addr[5] = (addr_hi >> 8) & 0xFF;
+
+ if (!is_valid_ether_addr(addr)) {
+- /* reading mac address from EEPROM or OTP */
+- if ((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
+- addr) == 0) ||
+- (lan78xx_read_otp(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
+- addr) == 0)) {
+- if (is_valid_ether_addr(addr)) {
+- /* eeprom values are valid so use them */
+- netif_dbg(dev, ifup, dev->net,
+- "MAC address read from EEPROM");
+- } else {
+- /* generate random MAC */
+- random_ether_addr(addr);
+- netif_dbg(dev, ifup, dev->net,
+- "MAC address set to random addr");
+- }
+-
+- addr_lo = addr[0] | (addr[1] << 8) |
+- (addr[2] << 16) | (addr[3] << 24);
+- addr_hi = addr[4] | (addr[5] << 8);
+-
+- ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
+- ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
++ if (!eth_platform_get_mac_address(&dev->udev->dev, addr)) {
++ /* valid address present in Device Tree */
++ netif_dbg(dev, ifup, dev->net,
++ "MAC address read from Device Tree");
++ } else if (((lan78xx_read_eeprom(dev, EEPROM_MAC_OFFSET,
++ ETH_ALEN, addr) == 0) ||
++ (lan78xx_read_otp(dev, EEPROM_MAC_OFFSET,
++ ETH_ALEN, addr) == 0)) &&
++ is_valid_ether_addr(addr)) {
++ /* eeprom values are valid so use them */
++ netif_dbg(dev, ifup, dev->net,
++ "MAC address read from EEPROM");
+ } else {
+ /* generate random MAC */
+ random_ether_addr(addr);
+ netif_dbg(dev, ifup, dev->net,
+ "MAC address set to random addr");
+ }
++
++ addr_lo = addr[0] | (addr[1] << 8) |
++ (addr[2] << 16) | (addr[3] << 24);
++ addr_hi = addr[4] | (addr[5] << 8);
++
++ ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
++ ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
+ }
+
+ ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
+--
+2.17.0
+
+From f8f9ad43b37f5db5895619e4304aa9ba286cbbb0 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 19 Apr 2018 17:59:40 +0100
+Subject: [PATCH 8/9] dt-bindings: Document the DT bindings for lan78xx
+
+The Microchip LAN78XX family of devices are Ethernet controllers with
+a USB interface. Despite being discoverable devices it can be useful to
+be able to configure them from Device Tree, particularly in low-cost
+applications without an EEPROM or programmed OTP.
+
+Document the supported properties in a bindings file.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+---
+ .../bindings/net/microchip,lan78xx.txt | 54 +++++++++++++++++++
+ 1 file changed, 54 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/net/microchip,lan78xx.txt
+
+diff --git a/Documentation/devicetree/bindings/net/microchip,lan78xx.txt b/Documentation/devicetree/bindings/net/microchip,lan78xx.txt
+new file mode 100644
+index 000000000000..76786a0f6d3d
+--- /dev/null
++++ b/Documentation/devicetree/bindings/net/microchip,lan78xx.txt
+@@ -0,0 +1,54 @@
++Microchip LAN78xx Gigabit Ethernet controller
++
++The LAN78XX devices are usually configured by programming their OTP or with
++an external EEPROM, but some platforms (e.g. Raspberry Pi 3 B+) have neither.
++The Device Tree properties, if present, override the OTP and EEPROM.
++
++Required properties:
++- compatible: Should be one of "usb424,7800", "usb424,7801" or "usb424,7850".
++
++Optional properties:
++- local-mac-address: see ethernet.txt
++- mac-address: see ethernet.txt
++
++Optional properties of the embedded PHY:
++- microchip,led-modes: a 0..4 element vector, with each element configuring
++ the operating mode of an LED. Omitted LEDs are turned off. Allowed values
++ are defined in "include/dt-bindings/net/microchip-lan78xx.h".
++
++Example:
++
++/* Based on the configuration for a Raspberry Pi 3 B+ */
++&usb {
++ usb-port@1 {
++ compatible = "usb424,2514";
++ reg = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ usb-port@1 {
++ compatible = "usb424,2514";
++ reg = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ ethernet: ethernet@1 {
++ compatible = "usb424,7800";
++ reg = <1>;
++ local-mac-address = [ 00 11 22 33 44 55 ];
++
++ mdio {
++ #address-cells = <0x1>;
++ #size-cells = <0x0>;
++ eth_phy: ethernet-phy@1 {
++ reg = <1>;
++ microchip,led-modes = <
++ LAN78XX_LINK_1000_ACTIVITY
++ LAN78XX_LINK_10_100_ACTIVITY
++ >;
++ };
++ };
++ };
++ };
++ };
++};
+--
+2.17.0
+
+From be24db04ec2949e9b03763366f100ae40836c61e Mon Sep 17 00:00:00 2001
+From: Peter Robinson <pbrobinson@gmail.com>
+Date: Mon, 23 Apr 2018 14:31:26 +0100
+Subject: [PATCH 9/9] lan78xx: Read LED states from Device Tree
+
+Add support for DT property "microchip,led-modes", a vector of zero
+to four cells (u32s) in the range 0-15, each of which sets the mode
+for one of the LEDs. Some 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
+
+These values are given symbolic constants in a dt-bindings header.
+
+Also use the presence of the DT property to indicate that the
+LEDs should be enabled - necessary in the event that no valid OTP
+or EEPROM is available.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+---
+ MAINTAINERS | 1 +
+ drivers/net/phy/microchip.c | 25 ++++++++++++++++
+ drivers/net/usb/lan78xx.c | 32 ++++++++++++++++++++-
+ include/dt-bindings/net/microchip-lan78xx.h | 21 ++++++++++++++
+ include/linux/microchipphy.h | 3 ++
+ 5 files changed, 81 insertions(+), 1 deletion(-)
+ create mode 100644 include/dt-bindings/net/microchip-lan78xx.h
+
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 6e950b8b4a41..c7d5f8c60a2c 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -14437,6 +14437,7 @@ M: Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
+ L: netdev@vger.kernel.org
+ S: Maintained
+ F: drivers/net/usb/lan78xx.*
++F: include/dt-bindings/net/microchip-lan78xx.h
+
+ USB MASS STORAGE DRIVER
+ M: Alan Stern <stern@rowland.harvard.edu>
+diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c
+index a97ac8c12c4c..2d67937866a3 100644
+--- a/drivers/net/phy/microchip.c
++++ b/drivers/net/phy/microchip.c
+@@ -21,6 +21,8 @@
+ #include <linux/phy.h>
+ #include <linux/microchipphy.h>
+ #include <linux/delay.h>
++#include <linux/of.h>
++#include <dt-bindings/net/microchip-lan78xx.h>
+
+ #define DRIVER_AUTHOR "WOOJUNG HUH <woojung.huh@microchip.com>"
+ #define DRIVER_DESC "Microchip LAN88XX PHY driver"
+@@ -225,6 +227,8 @@ static int lan88xx_probe(struct phy_device *phydev)
+ {
+ struct device *dev = &phydev->mdio.dev;
+ struct lan88xx_priv *priv;
++ u32 led_modes[4];
++ int len;
+
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+@@ -232,6 +236,27 @@ static int lan88xx_probe(struct phy_device *phydev)
+
+ priv->wolopts = 0;
+
++ len = of_property_read_variable_u32_array(dev->of_node,
++ "microchip,led-modes",
++ led_modes,
++ 0,
++ ARRAY_SIZE(led_modes));
++ if (len >= 0) {
++ u32 reg = 0;
++ int i;
++
++ for (i = 0; i < len; i++) {
++ if (led_modes[i] > 15)
++ return -EINVAL;
++ reg |= led_modes[i] << (i * 4);
++ }
++ for (; i < ARRAY_SIZE(led_modes); i++)
++ reg |= LAN78XX_FORCE_LED_OFF << (i * 4);
++ (void)phy_write(phydev, LAN78XX_PHY_LED_MODE_SELECT, reg);
++ } else if (len == -EOVERFLOW) {
++ return -EINVAL;
++ }
++
+ /* these values can be used to identify internal PHY */
+ priv->chip_id = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_ID);
+ priv->chip_rev = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_REV);
+diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
+index 6c38a74bb32d..01b876daa600 100644
+--- a/drivers/net/usb/lan78xx.c
++++ b/drivers/net/usb/lan78xx.c
+@@ -37,6 +37,7 @@
+ #include <linux/irqchip/chained_irq.h>
+ #include <linux/microchipphy.h>
+ #include <linux/phy.h>
++#include <linux/of_mdio.h>
+ #include <linux/of_net.h>
+ #include "lan78xx.h"
+
+@@ -1760,6 +1761,7 @@ static int lan78xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx,
+
+ static int lan78xx_mdio_init(struct lan78xx_net *dev)
+ {
++ struct device_node *node;
+ int ret;
+
+ dev->mdiobus = mdiobus_alloc();
+@@ -1788,7 +1790,13 @@ static int lan78xx_mdio_init(struct lan78xx_net *dev)
+ break;
+ }
+
+- ret = mdiobus_register(dev->mdiobus);
++ node = of_get_child_by_name(dev->udev->dev.of_node, "mdio");
++ if (node) {
++ ret = of_mdiobus_register(dev->mdiobus, node);
++ of_node_put(node);
++ } else {
++ ret = mdiobus_register(dev->mdiobus);
++ }
+ if (ret) {
+ netdev_err(dev->net, "can't register MDIO bus\n");
+ goto exit1;
+@@ -2077,6 +2085,28 @@ 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 (phydev->mdio.dev.of_node) {
++ u32 reg;
++ int len;
++
++ len = of_property_count_elems_of_size(phydev->mdio.dev.of_node,
++ "microchip,led-modes",
++ sizeof(u32));
++ if (len >= 0) {
++ /* Ensure the appropriate LEDs are enabled */
++ lan78xx_read_reg(dev, HW_CFG, &reg);
++ reg &= ~(HW_CFG_LED0_EN_ |
++ HW_CFG_LED1_EN_ |
++ HW_CFG_LED2_EN_ |
++ HW_CFG_LED3_EN_);
++ reg |= (len > 0) * HW_CFG_LED0_EN_ |
++ (len > 1) * HW_CFG_LED1_EN_ |
++ (len > 2) * HW_CFG_LED2_EN_ |
++ (len > 3) * HW_CFG_LED3_EN_;
++ lan78xx_write_reg(dev, HW_CFG, reg);
++ }
++ }
++
+ genphy_config_aneg(phydev);
+
+ dev->fc_autoneg = phydev->autoneg;
+diff --git a/include/dt-bindings/net/microchip-lan78xx.h b/include/dt-bindings/net/microchip-lan78xx.h
+new file mode 100644
+index 000000000000..0742ff075307
+--- /dev/null
++++ b/include/dt-bindings/net/microchip-lan78xx.h
+@@ -0,0 +1,21 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++#ifndef _DT_BINDINGS_MICROCHIP_LAN78XX_H
++#define _DT_BINDINGS_MICROCHIP_LAN78XX_H
++
++/* LED modes for LAN7800/LAN7850 embedded PHY */
++
++#define LAN78XX_LINK_ACTIVITY 0
++#define LAN78XX_LINK_1000_ACTIVITY 1
++#define LAN78XX_LINK_100_ACTIVITY 2
++#define LAN78XX_LINK_10_ACTIVITY 3
++#define LAN78XX_LINK_100_1000_ACTIVITY 4
++#define LAN78XX_LINK_10_1000_ACTIVITY 5
++#define LAN78XX_LINK_10_100_ACTIVITY 6
++#define LAN78XX_DUPLEX_COLLISION 8
++#define LAN78XX_COLLISION 9
++#define LAN78XX_ACTIVITY 10
++#define LAN78XX_AUTONEG_FAULT 12
++#define LAN78XX_FORCE_LED_OFF 14
++#define LAN78XX_FORCE_LED_ON 15
++
++#endif
+diff --git a/include/linux/microchipphy.h b/include/linux/microchipphy.h
+index 8f9c90379732..fd1fc8c248ef 100644
+--- a/include/linux/microchipphy.h
++++ b/include/linux/microchipphy.h
+@@ -78,4 +78,7 @@
+ #define LAN88XX_EXT_PAGE_TR_LOW_DATA 17
+ #define LAN88XX_EXT_PAGE_TR_HIGH_DATA 18
+
++/* Registers specific to the LAN7800/LAN7850 embedded phy */
++#define LAN78XX_PHY_LED_MODE_SELECT (0x1D)
++
+ #endif /* _MICROCHIPPHY_H */
+--
+2.17.0
+
diff --git a/bcm2837-rpi-initial-3plus-support.patch b/bcm2837-rpi-initial-3plus-support.patch
new file mode 100644
index 000000000..e69303ada
--- /dev/null
+++ b/bcm2837-rpi-initial-3plus-support.patch
@@ -0,0 +1,560 @@
+From patchwork Sat Apr 21 11:28:34 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [V2,1/9] ARM: dts: bcm283x: Fix PWM pin assignment
+From: Stefan Wahren <stefan.wahren@i2se.com>
+X-Patchwork-Id: 10354085
+Message-Id: <1524310122-9439-2-git-send-email-stefan.wahren@i2se.com>
+To: Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,
+ Eric Anholt <eric@anholt.net>, Catalin Marinas <catalin.marinas@arm.com>,
+ Will Deacon <will.deacon@arm.com>
+Cc: Stefan Wahren <stefan.wahren@i2se.com>, devicetree@vger.kernel.org,
+ Florian Fainelli <f.fainelli@gmail.com>, Arnd Bergmann <arnd@arndb.de>,
+ Scott Branden <sbranden@broadcom.com>, Ray Jui <rjui@broadcom.com>,
+ Phil Elwell <phil@raspberrypi.org>, Alexander Graf <agraf@suse.de>,
+ bcm-kernel-feedback-list@broadcom.com,
+ linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org
+Date: Sat, 21 Apr 2018 13:28:34 +0200
+
+All RPi 1 and 2 boards used the PWM (audio out) on pin 40 and 45.
+So it was easy to define them in bcm2835-rpi.dtsi. Starting with RPi 3
+this wont work anymore, because it uses pin 40 and 41. Furthermore the
+Zero variants doesn't have audio out.
+
+This patch fixes this pin conflict by moving the PWM node to the board-level.
+
+Change summary:
+RPi 3 B: PWM1 45 -> 41
+Zero, Zero W: PWM disabled
+all other: no functional change
+
+Reported-by: Baruch Siach <baruch@tkos.co.il>
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2835-rpi-a-plus.dts | 6 ++++++
+ arch/arm/boot/dts/bcm2835-rpi-a.dts | 6 ++++++
+ arch/arm/boot/dts/bcm2835-rpi-b-plus.dts | 6 ++++++
+ arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts | 6 ++++++
+ arch/arm/boot/dts/bcm2835-rpi-b.dts | 6 ++++++
+ arch/arm/boot/dts/bcm2835-rpi.dtsi | 6 ------
+ arch/arm/boot/dts/bcm2836-rpi-2-b.dts | 6 ++++++
+ arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 6 ++++++
+ 8 files changed, 42 insertions(+), 6 deletions(-)
+
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
+index aa1fc7b..2cd9c5e 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
+@@ -101,6 +101,12 @@
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
++ status = "okay";
++};
++
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-a.dts b/arch/arm/boot/dts/bcm2835-rpi-a.dts
+index 425f6b0..067d1f0 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-a.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts
+@@ -96,6 +96,12 @@
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
++ status = "okay";
++};
++
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
+index effa195..cfbdaac 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
+@@ -103,6 +103,12 @@
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
++ status = "okay";
++};
++
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
+index 772ec3b..5641d16 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
+@@ -96,6 +96,12 @@
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
++ status = "okay";
++};
++
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts
+index 434483d..31ff602 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
+@@ -91,6 +91,12 @@
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
++ status = "okay";
++};
++
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
+index 6c3cfaa..cb2d6d7 100644
+--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
++++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
+@@ -83,12 +83,6 @@
+ bus-width = <4>;
+ };
+
+-&pwm {
+- pinctrl-names = "default";
+- pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
+- status = "okay";
+-};
+-
+ &usb {
+ power-domains = <&power RPI_POWER_DOMAIN_USB>;
+ };
+diff --git a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
+index 5c339ad..2fef70a 100644
+--- a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
++++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
+@@ -41,6 +41,12 @@
+ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>;
++ status = "okay";
++};
++
+ &uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_gpio14>;
+diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+index 0b31d99..cc39b6f 100644
+--- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+@@ -42,6 +42,12 @@
+ };
+ };
+
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio41>;
++ status = "okay";
++};
++
+ /* uart0 communicates with the BT module */
+ &uart0 {
+ pinctrl-names = "default";
+From patchwork Sat Apr 21 11:28:35 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [V2,2/9] ARM: dts: bcm2837: Add missing GPIOs of Expander
+From: Stefan Wahren <stefan.wahren@i2se.com>
+X-Patchwork-Id: 10354079
+Message-Id: <1524310122-9439-3-git-send-email-stefan.wahren@i2se.com>
+To: Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,
+ Eric Anholt <eric@anholt.net>, Catalin Marinas <catalin.marinas@arm.com>,
+ Will Deacon <will.deacon@arm.com>
+Cc: Stefan Wahren <stefan.wahren@i2se.com>, devicetree@vger.kernel.org,
+ Florian Fainelli <f.fainelli@gmail.com>, Arnd Bergmann <arnd@arndb.de>,
+ Scott Branden <sbranden@broadcom.com>, Ray Jui <rjui@broadcom.com>,
+ Phil Elwell <phil@raspberrypi.org>, Alexander Graf <agraf@suse.de>,
+ bcm-kernel-feedback-list@broadcom.com,
+ linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org
+Date: Sat, 21 Apr 2018 13:28:35 +0200
+
+After commit a98d90e7d588 ("gpio: raspberrypi-exp: Driver for RPi3 GPIO
+expander via mailbox service") we are able to control the rest of the
+GPIOs of the RPi 3. So add all the missing parts (ACT LED,
+Wifi & BT control, HDMI detect) to the DT.
+
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2837-rpi-3-b.dts | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+index cc39b6f..c318bcb 100644
+--- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts
+@@ -20,9 +20,14 @@
+
+ leds {
+ act {
+- gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
++ gpios = <&expgpio 2 GPIO_ACTIVE_HIGH>;
+ };
+ };
++
++ wifi_pwrseq: wifi-pwrseq {
++ compatible = "mmc-pwrseq-simple";
++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_HIGH>;
++ };
+ };
+
+ &firmware {
+@@ -48,6 +53,10 @@
+ status = "okay";
+ };
+
++&hdmi {
++ hpd-gpios = <&expgpio 4 GPIO_ACTIVE_LOW>;
++};
++
+ /* uart0 communicates with the BT module */
+ &uart0 {
+ pinctrl-names = "default";
+@@ -57,6 +66,7 @@
+ bluetooth {
+ compatible = "brcm,bcm43438-bt";
+ max-speed = <2000000>;
++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>;
+ };
+ };
+
+@@ -69,11 +79,19 @@
+
+ /* SDHCI is used to control the SDIO for wireless */
+ &sdhci {
++ #address-cells = <1>;
++ #size-cells = <0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&emmc_gpio34>;
+ status = "okay";
+ bus-width = <4>;
+ non-removable;
++ mmc-pwrseq = <&wifi_pwrseq>;
++
++ brcmf: wifi@1 {
++ reg = <1>;
++ compatible = "brcm,bcm4329-fmac";
++ };
+ };
+
+ /* SDHOST is used to drive the SD card */
+From patchwork Sat Apr 21 11:28:36 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [V2,3/9] dt-bindings: bcm: Add Raspberry Pi 3 B+
+From: Stefan Wahren <stefan.wahren@i2se.com>
+X-Patchwork-Id: 10354081
+Message-Id: <1524310122-9439-4-git-send-email-stefan.wahren@i2se.com>
+To: Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,
+ Eric Anholt <eric@anholt.net>, Catalin Marinas <catalin.marinas@arm.com>,
+ Will Deacon <will.deacon@arm.com>
+Cc: Stefan Wahren <stefan.wahren@i2se.com>, devicetree@vger.kernel.org,
+ Florian Fainelli <f.fainelli@gmail.com>, Arnd Bergmann <arnd@arndb.de>,
+ Scott Branden <sbranden@broadcom.com>, Ray Jui <rjui@broadcom.com>,
+ Phil Elwell <phil@raspberrypi.org>, Alexander Graf <agraf@suse.de>,
+ bcm-kernel-feedback-list@broadcom.com,
+ linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org
+Date: Sat, 21 Apr 2018 13:28:36 +0200
+
+This adds the root properties for the Raspberry Pi 3 B+
+
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Reviewed-by: Rob Herring <robh@kernel.org>
+---
+ Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
+index 3e3efa0..1e3e29a 100644
+--- a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
++++ b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
+@@ -34,6 +34,10 @@ Raspberry Pi 3 Model B
+ Required root node properties:
+ compatible = "raspberrypi,3-model-b", "brcm,bcm2837";
+
++Raspberry Pi 3 Model B+
++Required root node properties:
++compatible = "raspberrypi,3-model-b-plus", "brcm,bcm2837";
++
+ Raspberry Pi Compute Module
+ Required root node properties:
+ compatible = "raspberrypi,compute-module", "brcm,bcm2835";
+From patchwork Sat Apr 21 11:28:37 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [V2,4/9] ARM: dts: bcm2837: Add Raspberry Pi 3 B+
+From: Stefan Wahren <stefan.wahren@i2se.com>
+X-Patchwork-Id: 10354075
+Message-Id: <1524310122-9439-5-git-send-email-stefan.wahren@i2se.com>
+To: Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,
+ Eric Anholt <eric@anholt.net>, Catalin Marinas <catalin.marinas@arm.com>,
+ Will Deacon <will.deacon@arm.com>
+Cc: Stefan Wahren <stefan.wahren@i2se.com>, devicetree@vger.kernel.org,
+ Florian Fainelli <f.fainelli@gmail.com>, Arnd Bergmann <arnd@arndb.de>,
+ Scott Branden <sbranden@broadcom.com>, Ray Jui <rjui@broadcom.com>,
+ Phil Elwell <phil@raspberrypi.org>, Alexander Graf <agraf@suse.de>,
+ bcm-kernel-feedback-list@broadcom.com,
+ linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org
+Date: Sat, 21 Apr 2018 13:28:37 +0200
+
+The Raspberry Pi 3 B+ has the following major differences compared
+to the model 3 B:
+* Microchip LAN7515 (Gigabit Ethernet with integrated USB 2.0 HUB)
+* Cypress CYW43455 (802.11n/ac and BT 4.2)
+
+We need to add the USB LAN chip so the bootloader can add the MAC address.
+This is necessary because there ain't an EEPROM or a valid OTP.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/Makefile | 1 +
+ arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 108 +++++++++++++++++++++++++++++
+ arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 27 ++++++++
+ 3 files changed, 136 insertions(+)
+ create mode 100644 arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
+ create mode 100644 arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
+
+diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
+index 7e24249..a300a35 100644
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -75,6 +75,7 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
+ bcm2835-rpi-a-plus.dtb \
+ bcm2836-rpi-2-b.dtb \
+ bcm2837-rpi-3-b.dtb \
++ bcm2837-rpi-3-b-plus.dtb \
+ bcm2835-rpi-zero.dtb \
+ bcm2835-rpi-zero-w.dtb
+ dtb-$(CONFIG_ARCH_BCM_5301X) += \
+diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
+new file mode 100644
+index 0000000..4adb85e
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
+@@ -0,0 +1,108 @@
++// SPDX-License-Identifier: GPL-2.0
++/dts-v1/;
++#include "bcm2837.dtsi"
++#include "bcm2835-rpi.dtsi"
++#include "bcm283x-rpi-lan7515.dtsi"
++#include "bcm283x-rpi-usb-host.dtsi"
++
++/ {
++ compatible = "raspberrypi,3-model-b-plus", "brcm,bcm2837";
++ model = "Raspberry Pi 3 Model B+";
++
++ chosen {
++ /* 8250 auxiliary UART instead of pl011 */
++ stdout-path = "serial1:115200n8";
++ };
++
++ memory {
++ reg = <0 0x40000000>;
++ };
++
++ leds {
++ act {
++ gpios = <&gpio 29 GPIO_ACTIVE_HIGH>;
++ };
++
++ pwr {
++ label = "PWR";
++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
++ };
++ };
++
++ wifi_pwrseq: wifi-pwrseq {
++ compatible = "mmc-pwrseq-simple";
++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_HIGH>;
++ };
++};
++
++&firmware {
++ expgpio: gpio {
++ compatible = "raspberrypi,firmware-gpio";
++ gpio-controller;
++ #gpio-cells = <2>;
++ gpio-line-names = "BT_ON",
++ "WL_ON",
++ "STATUS_LED",
++ "LAN_RUN",
++ "",
++ "CAM_GPIO0",
++ "CAM_GPIO1",
++ "";
++ status = "okay";
++ };
++};
++
++&hdmi {
++ hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>;
++};
++
++&pwm {
++ pinctrl-names = "default";
++ pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio41>;
++ status = "okay";
++};
++
++/* SDHCI is used to control the SDIO for wireless */
++&sdhci {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ pinctrl-names = "default";
++ pinctrl-0 = <&emmc_gpio34>;
++ status = "okay";
++ bus-width = <4>;
++ non-removable;
++ mmc-pwrseq = <&wifi_pwrseq>;
++
++ brcmf: wifi@1 {
++ reg = <1>;
++ compatible = "brcm,bcm4329-fmac";
++ };
++};
++
++/* SDHOST is used to drive the SD card */
++&sdhost {
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdhost_gpio48>;
++ status = "okay";
++ bus-width = <4>;
++};
++
++/* uart0 communicates with the BT module */
++&uart0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32 &gpclk2_gpio43>;
++ status = "okay";
++
++ bluetooth {
++ compatible = "brcm,bcm43438-bt";
++ max-speed = <2000000>;
++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>;
++ };
++};
++
++/* uart1 is mapped to the pin header */
++&uart1 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart1_gpio14>;
++ status = "okay";
++};
+diff --git a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
+new file mode 100644
+index 0000000..9403da0
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
+@@ -0,0 +1,27 @@
++// SPDX-License-Identifier: GPL-2.0
++/ {
++ aliases {
++ ethernet0 = &ethernet;
++ };
++};
++
++&usb {
++ usb-port@1 {
++ compatible = "usb424,2514";
++ reg = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ usb-port@1 {
++ compatible = "usb424,2514";
++ reg = <1>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ ethernet: ethernet@1 {
++ compatible = "usb424,7800";
++ reg = <1>;
++ };
++ };
++ };
++};
+From patchwork Sat Apr 21 11:28:42 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [V2,9/9] arm64: dts: broadcom: Add reference to Raspberry Pi 3 B+
+From: Stefan Wahren <stefan.wahren@i2se.com>
+X-Patchwork-Id: 10354077
+Message-Id: <1524310122-9439-10-git-send-email-stefan.wahren@i2se.com>
+To: Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>,
+ Eric Anholt <eric@anholt.net>, Catalin Marinas <catalin.marinas@arm.com>,
+ Will Deacon <will.deacon@arm.com>
+Cc: Stefan Wahren <stefan.wahren@i2se.com>, devicetree@vger.kernel.org,
+ Florian Fainelli <f.fainelli@gmail.com>, Arnd Bergmann <arnd@arndb.de>,
+ Scott Branden <sbranden@broadcom.com>, Ray Jui <rjui@broadcom.com>,
+ Phil Elwell <phil@raspberrypi.org>, Alexander Graf <agraf@suse.de>,
+ bcm-kernel-feedback-list@broadcom.com,
+ linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org
+Date: Sat, 21 Apr 2018 13:28:42 +0200
+
+This adds a reference to the dts of the Raspberry Pi 3 B+
+in arm, so don't need to maintain the content in arm64.
+
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm64/boot/dts/broadcom/Makefile | 3 ++-
+ arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts | 2 ++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+ create mode 100644 arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts
+
+diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile
+index 2a2591e..1193a9e 100644
+--- a/arch/arm64/boot/dts/broadcom/Makefile
++++ b/arch/arm64/boot/dts/broadcom/Makefile
+@@ -1,5 +1,6 @@
+ # SPDX-License-Identifier: GPL-2.0
+-dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb
++dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb \
++ bcm2837-rpi-3-b-plus.dtb
+
+ subdir-y += northstar2
+ subdir-y += stingray
+diff --git a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts
+new file mode 100644
+index 0000000..46ad202
+--- /dev/null
++++ b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts
+@@ -0,0 +1,2 @@
++// SPDX-License-Identifier: GPL-2.0
++#include "arm/bcm2837-rpi-3-b-plus.dts"
diff --git a/bcm2837-rpi-initial-support-for-the-3.patch b/bcm2837-rpi-initial-support-for-the-3.patch
deleted file mode 100644
index c9bedfebc..000000000
--- a/bcm2837-rpi-initial-support-for-the-3.patch
+++ /dev/null
@@ -1,209 +0,0 @@
-From defa4876ece55751c691d17ffc928d9bfe049585 Mon Sep 17 00:00:00 2001
-From: Stefan Wahren <stefan.wahren@i2se.com>
-Date: Fri, 16 Mar 2018 22:56:59 +0100
-Subject: [PATCH] arm64: dts: broadcom: Add reference to Raspberry Pi 3 B+
-
-This adds a reference to the dts file of the Raspberry Pi 3 B+
-
-Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
----
- arch/arm64/boot/dts/broadcom/Makefile | 3 ++-
- arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts | 2 ++
- 2 files changed, 4 insertions(+), 1 deletion(-)
- create mode 100644 arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts
-
-diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile
-index 2a2591ef1fee..1193a9e34bbb 100644
---- a/arch/arm64/boot/dts/broadcom/Makefile
-+++ b/arch/arm64/boot/dts/broadcom/Makefile
-@@ -1,5 +1,6 @@
- # SPDX-License-Identifier: GPL-2.0
--dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb
-+dtb-$(CONFIG_ARCH_BCM2835) += bcm2837-rpi-3-b.dtb \
-+ bcm2837-rpi-3-b-plus.dtb
-
- subdir-y += northstar2
- subdir-y += stingray
-diff --git a/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts
-new file mode 100644
-index 000000000000..46ad2023cccf
---- /dev/null
-+++ b/arch/arm64/boot/dts/broadcom/bcm2837-rpi-3-b-plus.dts
-@@ -0,0 +1,2 @@
-+// SPDX-License-Identifier: GPL-2.0
-+#include "arm/bcm2837-rpi-3-b-plus.dts"
-
-From c7c06c54087dfadd065abcba0b7f614f7a88d549 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 16 Mar 2018 22:42:28 +0100
-Subject: [PATCH] ARM: dts: bcm2837: Add Raspberry Pi 3 B+
-
-The Raspberry Pi 3 B+ has the following major differences compared
-to the model 3 B:
-* Microchip LAN7515 (Gigabit Ethernet)
-* Cypress CYW43455 (802.11ac and BT 4.2)
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
-Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
----
- arch/arm/boot/dts/Makefile | 1 +
- arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 102 +++++++++++++++++++++++++++++
- arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi | 27 ++++++++
- 3 files changed, 130 insertions(+)
- create mode 100644 arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
- create mode 100644 arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
-
-diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
-index 3b471e6787ff..dee85f848de9 100644
---- a/arch/arm/boot/dts/Makefile
-+++ b/arch/arm/boot/dts/Makefile
-@@ -75,6 +75,7 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
- bcm2835-rpi-a-plus.dtb \
- bcm2836-rpi-2-b.dtb \
- bcm2837-rpi-3-b.dtb \
-+ bcm2837-rpi-3-b-plus.dtb \
- bcm2835-rpi-zero.dtb \
- bcm2835-rpi-zero-w.dtb
- dtb-$(CONFIG_ARCH_BCM_5301X) += \
-diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
-new file mode 100644
-index 000000000000..fb9f6f7e965c
---- /dev/null
-+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
-@@ -0,0 +1,102 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/dts-v1/;
-+#include "bcm2837.dtsi"
-+#include "bcm2835-rpi.dtsi"
-+#include "bcm283x-rpi-lan7515.dtsi"
-+#include "bcm283x-rpi-usb-host.dtsi"
-+
-+/ {
-+ compatible = "raspberrypi,3-model-b-plus", "brcm,bcm2837";
-+ model = "Raspberry Pi 3 Model B+";
-+
-+ chosen {
-+ /* 8250 auxiliary UART instead of pl011 */
-+ stdout-path = "serial1:115200n8";
-+ };
-+
-+ memory {
-+ reg = <0 0x40000000>;
-+ };
-+
-+ leds {
-+ act {
-+ gpios = <&gpio 29 0>;
-+ };
-+
-+ pwr {
-+ label = "PWR";
-+ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
-+ };
-+ };
-+
-+ wifi_pwrseq: wifi-pwrseq {
-+ compatible = "mmc-pwrseq-simple";
-+ reset-gpios = <&expgpio 1 GPIO_ACTIVE_HIGH>;
-+ };
-+};
-+
-+&firmware {
-+ expgpio: gpio {
-+ compatible = "raspberrypi,firmware-gpio";
-+ gpio-controller;
-+ #gpio-cells = <2>;
-+ gpio-line-names = "BT_ON",
-+ "WL_ON",
-+ "STATUS_LED",
-+ "LAN_RUN",
-+ "",
-+ "CAM_GPIO0",
-+ "CAM_GPIO1",
-+ "";
-+ status = "okay";
-+ };
-+};
-+
-+&hdmi {
-+ hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>;
-+};
-+
-+/* uart0 communicates with the BT module */
-+&uart0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_gpio32 &gpclk2_gpio43>;
-+ status = "okay";
-+
-+ bluetooth {
-+ compatible = "brcm,bcm43438-bt";
-+ max-speed = <2000000>;
-+ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>;
-+ };
-+};
-+
-+/* uart1 is mapped to the pin header */
-+&uart1 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart1_gpio14>;
-+ status = "okay";
-+};
-+
-+/* SDHCI is used to control the SDIO for wireless */
-+&sdhci {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&emmc_gpio34>;
-+ status = "okay";
-+ bus-width = <4>;
-+ non-removable;
-+ mmc-pwrseq = <&wifi_pwrseq>;
-+
-+ brcmf: wifi@1 {
-+ reg = <1>;
-+ compatible = "brcm,bcm4329-fmac";
-+ };
-+};
-+
-+/* SDHOST is used to drive the SD card */
-+&sdhost {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&sdhost_gpio48>;
-+ status = "okay";
-+ bus-width = <4>;
-+};
-diff --git a/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
-new file mode 100644
-index 000000000000..169203c5ce8b
---- /dev/null
-+++ b/arch/arm/boot/dts/bcm283x-rpi-lan7515.dtsi
-@@ -0,0 +1,27 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/ {
-+ aliases {
-+ ethernet0 = &ethernet;
-+ };
-+};
-+
-+&usb {
-+ usb1@1 {
-+ compatible = "usb424,2514";
-+ reg = <1>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ usb1_1@1 {
-+ compatible = "usb424,2514";
-+ reg = <1>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ ethernet: usbether@1 {
-+ compatible = "usb424,7800";
-+ reg = <1>;
-+ };
-+ };
-+ };
-+};
-
diff --git a/bcm283x-drm-vc4-fix-mem-leak.patch b/bcm283x-drm-vc4-fix-mem-leak.patch
new file mode 100644
index 000000000..58ffce722
--- /dev/null
+++ b/bcm283x-drm-vc4-fix-mem-leak.patch
@@ -0,0 +1,54 @@
+From c0db1b677e1d584fab5d7ac76a32e1c0157542e0 Mon Sep 17 00:00:00 2001
+From: Daniel J Blueman <daniel@quora.org>
+Date: Mon, 2 Apr 2018 15:10:35 +0800
+Subject: drm/vc4: Fix memory leak during BO teardown
+
+During BO teardown, an indirect list 'uniform_addr_offsets' wasn't being
+freed leading to leaking many 128B allocations. Fix the memory leak by
+releasing it at teardown time.
+
+Cc: stable@vger.kernel.org
+Fixes: 6d45c81d229d ("drm/vc4: Add support for branching in shader validation.")
+Signed-off-by: Daniel J Blueman <daniel@quora.org>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Link: https://patchwork.freedesktop.org/patch/msgid/20180402071035.25356-1-daniel@quora.org
+---
+ drivers/gpu/drm/vc4/vc4_bo.c | 2 ++
+ drivers/gpu/drm/vc4/vc4_validate_shaders.c | 1 +
+ 2 files changed, 3 insertions(+)
+
+diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
+index 2decc8e..add9cc9 100644
+--- a/drivers/gpu/drm/vc4/vc4_bo.c
++++ b/drivers/gpu/drm/vc4/vc4_bo.c
+@@ -195,6 +195,7 @@ static void vc4_bo_destroy(struct vc4_bo *bo)
+ vc4_bo_set_label(obj, -1);
+
+ if (bo->validated_shader) {
++ kfree(bo->validated_shader->uniform_addr_offsets);
+ kfree(bo->validated_shader->texture_samples);
+ kfree(bo->validated_shader);
+ bo->validated_shader = NULL;
+@@ -591,6 +592,7 @@ void vc4_free_object(struct drm_gem_object *gem_bo)
+ }
+
+ if (bo->validated_shader) {
++ kfree(bo->validated_shader->uniform_addr_offsets);
+ kfree(bo->validated_shader->texture_samples);
+ kfree(bo->validated_shader);
+ bo->validated_shader = NULL;
+diff --git a/drivers/gpu/drm/vc4/vc4_validate_shaders.c b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+index d3f15bf..7cf82b0 100644
+--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
++++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+@@ -942,6 +942,7 @@ vc4_validate_shader(struct drm_gem_cma_object *shader_obj)
+ fail:
+ kfree(validation_state.branch_targets);
+ if (validated_shader) {
++ kfree(validated_shader->uniform_addr_offsets);
+ kfree(validated_shader->texture_samples);
+ kfree(validated_shader);
+ }
+--
+cgit v1.1
diff --git a/kernel.spec b/kernel.spec
index a70970041..5f7ce9e09 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -627,9 +627,19 @@ Patch319: clk-ti-fix-flag-space-conflict-with-clkctrl-clocks.patch
Patch320: arm-dts-Add-am335x-pocketbeagle.patch
+# https://patchwork.kernel.org/patch/10354521/
+# https://patchwork.kernel.org/patch/10354187/
+# https://patchwork.kernel.org/patch/10306793/
+# https://patchwork.kernel.org/patch/10133165/
+Patch321: mvebu-a37xx-fixes.patch
+
+# in 4.17, headed to stable
+Patch329: bcm283x-drm-vc4-fix-mem-leak.patch
+
# Enabling Patches for the RPi3+
-Patch330: bcm2837-rpi-initial-support-for-the-3.patch
-Patch331: bcm2837-gpio-expander.patch
+Patch330: bcm2837-gpio-expander.patch
+# http://www.spinics.net/lists/arm-kernel/msg647617.html
+Patch331: bcm2837-rpi-initial-3plus-support.patch
Patch332: bcm2837-enable-pmu.patch
Patch333: bcm2837-lan78xx-fixes.patch
@@ -1907,6 +1917,9 @@ fi
%changelog
* Sun Apr 22 2018 Peter Robinson <pbrobinson@fedoraproject.org>
- Add quirk patch to fix X-Gene 1 console on HP m400/Mustang (RHBZ 1531140)
+- Add fixes for Marvell a37xx EspressoBin
+- Update to latest Raspberry Pi 3+ fixes
+- More fixes for lan78xx on the Raspberry Pi 3+
* Thu Apr 19 2018 Jeremy Cline <jeremy@jcline.org> - 4.16.3-200
- Linux v4.16.3
diff --git a/mvebu-a37xx-fixes.patch b/mvebu-a37xx-fixes.patch
new file mode 100644
index 000000000..25090c7fd
--- /dev/null
+++ b/mvebu-a37xx-fixes.patch
@@ -0,0 +1,245 @@
+From patchwork Sun Apr 22 12:33:46 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: serial: mvebu-uart: Fix local flags handling on termios update
+From: Marc Zyngier <Marc.Zyngier@arm.com>
+X-Patchwork-Id: 10354521
+Message-Id: <20180422123346.15538-1-marc.zyngier@arm.com>
+To: linux-arm-kernel@lists.infradead.org,
+ linux-kernel@vger.kernel.org
+Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>,
+ Allen Yan <yanwei@marvell.com>,
+ Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
+ Miquel Raynal <miquel.raynal@free-electrons.com>
+Date: Sun, 22 Apr 2018 13:33:46 +0100
+
+Commit 68a0db1d7da2 reworked the baud rate selection, but also added
+a (not so) subtle change in the way the local flags (c_lflag in the
+termios structure) are handled, forcing the new flags to always be the
+same as the old ones.
+
+The reason for that particular change is both obscure and undocumented.
+It also completely breaks userspace. Something as trivial as getty is
+unusable:
+
+<example>
+ Debian GNU/Linux 9 sy-borg ttyMV0
+
+ sy-borg login: root
+ root
+ [timeout]
+
+ Debian GNU/Linux 9 sy-borg ttyMV0
+</example>
+
+which is quite obvious in retrospect: getty cannot get in control of
+the echo mode, is stuck in canonical mode, and times out without ever
+seeing anything valid. It also begs the question of how this change was
+ever tested.
+
+The fix is pretty obvious: stop messing with c_lflag, and the world
+will be a happier place.
+
+Cc: stable@vger.kernel.org # 4.15+
+Fixes: 68a0db1d7da2 ("serial: mvebu-uart: add function to change baudrate")
+Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
+---
+ drivers/tty/serial/mvebu-uart.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
+index 750e5645dc85..f503fab1e268 100644
+--- a/drivers/tty/serial/mvebu-uart.c
++++ b/drivers/tty/serial/mvebu-uart.c
+@@ -495,7 +495,6 @@ static void mvebu_uart_set_termios(struct uart_port *port,
+ termios->c_iflag |= old->c_iflag & ~(INPCK | IGNPAR);
+ termios->c_cflag &= CREAD | CBAUD;
+ termios->c_cflag |= old->c_cflag & ~(CREAD | CBAUD);
+- termios->c_lflag = old->c_lflag;
+ }
+
+ spin_unlock_irqrestore(&port->lock, flags);
+From patchwork Wed Apr 4 14:44:44 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: cpufreq: armada-37xx: Fix clock leak
+From: Gregory CLEMENT <gregory.clement@bootlin.com>
+X-Patchwork-Id: 10322649
+Message-Id: <20180404144444.4142-1-gregory.clement@bootlin.com>
+To: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
+ Viresh Kumar <viresh.kumar@linaro.org>, linux-pm@vger.kernel.org
+Cc: Andrew Lunn <andrew@lunn.ch>, Jason Cooper <jason@lakedaemon.net>,
+ Hua Jing <jinghua@marvell.com>,
+ Antoine Tenart <antoine.tenart@bootlin.com>,
+ Gregory CLEMENT <gregory.clement@bootlin.com>, stable@vger.kernel.org,
+ Maxime Chevallier <maxime.chevallier@bootlin.com>,
+ Nadav Haklai <nadavh@marvell.com>, Victor Gu <xigu@marvell.com>,
+ Neta Zur Hershkovits <neta@marvell.com>,
+ Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
+ =?UTF-8?q?Miqu=C3=A8l=20Raynal?= <miquel.raynal@bootlin.com>,
+ Marcin Wojtas <mw@semihalf.com>, Wilson Ding <dingwei@marvell.com>,
+ linux-arm-kernel@lists.infradead.org,
+ Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+Date: Wed, 4 Apr 2018 16:44:44 +0200
+
+There was no clk_put() balancing the clk_get(). This commit fixes it.
+
+Fixes: 92ce45fb875d ("cpufreq: Add DVFS support for Armada 37xx")
+Cc: <stable@vger.kernel.org>
+Reported-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
+Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
+Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
+---
+ drivers/cpufreq/armada-37xx-cpufreq.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/cpufreq/armada-37xx-cpufreq.c b/drivers/cpufreq/armada-37xx-cpufreq.c
+index c6ebc88a7d8d..72a2975499db 100644
+--- a/drivers/cpufreq/armada-37xx-cpufreq.c
++++ b/drivers/cpufreq/armada-37xx-cpufreq.c
+@@ -202,6 +202,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
+ cur_frequency = clk_get_rate(clk);
+ if (!cur_frequency) {
+ dev_err(cpu_dev, "Failed to get clock rate for CPU\n");
++ clk_put(clk);
+ return -EINVAL;
+ }
+
+@@ -210,6 +211,7 @@ static int __init armada37xx_cpufreq_driver_init(void)
+ return -EINVAL;
+
+ armada37xx_cpufreq_dvfs_setup(nb_pm_base, clk, dvfs->divider);
++ clk_put(clk);
+
+ for (load_lvl = ARMADA_37XX_DVFS_LOAD_0; load_lvl < LOAD_LEVEL_NR;
+ load_lvl++) {
+From patchwork Sun Mar 25 19:57:36 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 8bit
+Subject: arm64: dts: armada-3720-espressobin: wire up spi flash
+From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
+X-Patchwork-Id: 10306793
+Message-Id: <20180325195736.19782-1-u.kleine-koenig@pengutronix.de>
+To: Jason Cooper <jason@lakedaemon.net>, Andrew Lunn <andrew@lunn.ch>,
+ Gregory Clement <gregory.clement@bootlin.com>,
+ Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+Cc: Ellie Reeves <ellierevves@gmail.com>,
+ linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de
+Date: Sun, 25 Mar 2018 21:57:36 +0200
+
+From: Ellie Reeves <ellierevves@gmail.com>
+
+This is the storage the machine boots from by default. The partitioning
+is taken from the U-Boot that is shipped with the board. There is some
+more space on the flash that isn't used.
+
+Signed-off-by: Ellie Reeves <ellierevves@gmail.com>
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+---
+ .../boot/dts/marvell/armada-3720-espressobin.dts | 27 ++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
+index 882d6e4a04e4..5f98c2fecca4 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
++++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
+@@ -108,6 +108,33 @@
+ status = "okay";
+ };
+
++&spi0 {
++ status = "okay";
++
++ flash@0 {
++ reg = <0>;
++ compatible = "winbond,w25q32dw", "jedec,spi-flash";
++ spi-max-frequency = <104000000>;
++ m25p,fast-read;
++
++ partitions {
++ compatible = "fixed-partitions";
++ #address-cells = <1>;
++ #size-cells = <1>;
++
++ partition@0 {
++ label = "uboot";
++ reg = <0 0x180000>;
++ };
++
++ partition@180000 {
++ label = "ubootenv";
++ reg = <0x180000 0x10000>;
++ };
++ };
++ };
++};
++
+ /* Exported on the micro USB connector J5 through an FTDI */
+ &uart0 {
+ pinctrl-names = "default";
+From patchwork Sat Apr 21 14:03:42 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: arm64: dts: marvell: armada-37xx: reserve memory for ATF
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+X-Patchwork-Id: 10354187
+Message-Id: <20180421140342.25082-1-miquel.raynal@bootlin.com>
+To: Gregory Clement <gregory.clement@bootlin.com>,
+ Jason Cooper <jason@lakedaemon.net>, Andrew Lunn <andrew@lunn.ch>,
+ Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+Cc: Mark Rutland <mark.rutland@arm.com>, devicetree@vger.kernel.org,
+ Antoine Tenart <antoine.tenart@bootlin.com>,
+ Catalin Marinas <catalin.marinas@arm.com>,
+ Will Deacon <will.deacon@arm.com>,
+ Maxime Chevallier <maxime.chevallier@bootlin.com>,
+ Nadav Haklai <nadavh@marvell.com>, Rob Herring <robh+dt@kernel.org>,
+ Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
+ Miquel Raynal <miquel.raynal@bootlin.com>, Victor Gu <xigu@marvell.com>,
+ linux-arm-kernel@lists.infradead.org
+Date: Sat, 21 Apr 2018 16:03:42 +0200
+
+From: Victor Gu <xigu@marvell.com>
+
+The PSCI area should be reserved in Linux for PSCI operations such as
+suspend/resume.
+
+Reserve 2MiB of memory which matches the area used by ATF (BL1, BL2,
+BL3x, see [1] in ATF source code). This covers all PSCI code and data
+area and is 2MiB aligned, which is required by Linux for huge pages
+handling.
+
+[1] plat/marvell/a3700/common/include/platform_def.h
+
+Signed-off-by: Victor Gu <xigu@marvell.com>
+[miquel.raynal@bootlin.com: reword of commit message]
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+---
+ arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+index 97207a61bc79..429ce91bfc39 100644
+--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
++++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+@@ -22,6 +22,17 @@
+ serial1 = &uart1;
+ };
+
++ reserved-memory {
++ #address-cells = <2>;
++ #size-cells = <2>;
++ ranges;
++
++ psci-area@4000000 {
++ reg = <0 0x4000000 0 0x200000>;
++ no-map;
++ };
++ };
++
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;