summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2022-01-08 08:57:23 +0100
committerRobert Schwebel <r.schwebel@pengutronix.de>2022-01-08 10:36:20 +0100
commitc7bb5bb26ac21311a73130ff17bfc27bcad5a046 (patch)
treee75af5ced61a614d06feac7ed32e48277b644baf
parentc4c066013c1e709051ac53cae667f456296c7d56 (diff)
downloadDistroKit-c7bb5bb26ac21311a73130ff17bfc27bcad5a046.tar.gz
DistroKit-c7bb5bb26ac21311a73130ff17bfc27bcad5a046.tar.xz
v7a: barebox: cherry-pick CPSW/Linux reboot fixes from master
The upstream device tree change addressed by the previous commit also made it into barebox and broke Beaglebone networking there. This is fixed in master, so import the patch. It was also reported that bumping bumping up core clock frequency for faster boot times broke reboot from within Linux. This might be brown out resulting from Linux scaling down the voltage and Linux system reset not affecting the PMIC. Until that's resolved, barebox master reverts the overclocking, so import that patch as well. Both patches are scheduled to appear in v2022.01.0. Fixes: 949c5ef2 ("v7a: barebox: version bump v2021.08.0 → v2021.11.0") # CPSW Fixes: afdae878 ("v7a: barebox: version bump v2021.05.0 → v2021.07.0") # reset Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.pengutronix.de/20220108075723.432333-3-a.fatoum@pengutronix.de Signed-off-by: Robert Schwebel <r.schwebel@pengutronix.de>
-rw-r--r--configs/platform-v7a/patches/barebox-2021.11.0/0001-net-cpsw-add-support-for-new-binding-in-Linux-v5.15-.patch210
-rw-r--r--configs/platform-v7a/patches/barebox-2021.11.0/0002-Revert-ARM-beaglebone-init-MPU-speed-to-800Mhz.patch45
-rw-r--r--configs/platform-v7a/patches/barebox-2021.11.0/series2
3 files changed, 257 insertions, 0 deletions
diff --git a/configs/platform-v7a/patches/barebox-2021.11.0/0001-net-cpsw-add-support-for-new-binding-in-Linux-v5.15-.patch b/configs/platform-v7a/patches/barebox-2021.11.0/0001-net-cpsw-add-support-for-new-binding-in-Linux-v5.15-.patch
new file mode 100644
index 0000000..287f052
--- /dev/null
+++ b/configs/platform-v7a/patches/barebox-2021.11.0/0001-net-cpsw-add-support-for-new-binding-in-Linux-v5.15-.patch
@@ -0,0 +1,210 @@
+From ed7f3fd5b5e2088f04d2f5d615d71cf6e6507509 Mon Sep 17 00:00:00 2001
+From: Ahmad Fatoum <a.fatoum@pengutronix.de>
+Date: Fri, 3 Dec 2021 21:50:35 +0100
+Subject: [PATCH 1/2] net: cpsw: add support for new binding in Linux v5.15-rc1
+ DTs
+
+As is customary, upstream OMAP DTs have yet again added a new binding
+breaking compatibility with a barebox driver. This time, the old Ethernet
+node was disabled in favor of a new node that is matched by the new Linux
+cpsw driver introduced with Linux commit ed3525eda4c4 ("net: ethernet:
+ti: introduce cpsw switchdev based driver part 1 - dual-emac").
+
+Add support for the new binding to restore working Beaglebone Black
+networking. These changes have been tested against both the old and new
+bindings.
+
+Fixes: 618948e4e5b3 ("dts: update to v5.15-rc1")
+Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
+Link: https://lore.barebox.org/20211203205035.555285-1-a.fatoum@pengutronix.de
+Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
+---
+ drivers/net/cpsw.c | 120 +++++++++++++++++++++++++++++++++------------
+ 1 file changed, 89 insertions(+), 31 deletions(-)
+
+diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
+index 4a8f9e67d6f0..6725c7b9bdb4 100644
+--- a/drivers/net/cpsw.c
++++ b/drivers/net/cpsw.c
+@@ -592,7 +592,12 @@ static int cpsw_mdio_probe(struct device_d *dev)
+
+ priv = xzalloc(sizeof(*priv));
+
++ /* If we can't request I/O memory region, we'll assume parent did
++ * it for us
++ */
+ iores = dev_request_mem_resource(dev, 0);
++ if (IS_ERR(iores) && PTR_ERR(iores) == -EBUSY)
++ iores = dev_get_resource(dev, IORESOURCE_MEM, 0);
+ if (IS_ERR(iores))
+ return PTR_ERR(iores);
+ priv->mdio_regs = IOMEM(iores->start);
+@@ -1214,11 +1219,27 @@ static void cpsw_gmii_sel_am335x(struct cpsw_slave *slave)
+ writel(reg, phy_sel_addr);
+ }
+
+-static int cpsw_probe_dt(struct cpsw_priv *priv)
++static void cpsw_add_slave(struct cpsw_slave *slave, struct device_node *child, int i)
++{
++ uint32_t phy_id[2] = {-1, -1};
++ int ret;
++
++ if (!of_find_node_by_name(child, "fixed-link")) {
++ ret = of_property_read_u32_array(child, "phy_id", phy_id, 2);
++ if (!ret)
++ dev_warn(slave->cpsw->dev, "phy_id is deprecated, use phy-handle\n");
++ }
++
++ slave->dev.device_node = child;
++ slave->phy_id = phy_id[1];
++ slave->phy_if = of_get_phy_mode(child);
++ slave->slave_num = i;
++}
++
++static int cpsw_legacy_probe_dt(struct cpsw_priv *priv)
+ {
+ struct device_d *dev = priv->dev;
+ struct device_node *np = dev->device_node, *child;
+- struct device_node *physel;
+ int ret, i = 0;
+
+ ret = of_property_read_u32(np, "slaves", &priv->num_slaves);
+@@ -1227,15 +1248,6 @@ static int cpsw_probe_dt(struct cpsw_priv *priv)
+
+ priv->slaves = xzalloc(sizeof(struct cpsw_slave) * priv->num_slaves);
+
+- physel = of_find_compatible_node(NULL, NULL, "ti,am3352-phy-gmii-sel");
+- if (!physel) {
+- dev_err(dev, "Cannot find ti,am3352-phy-gmii-sel node\n");
+- return -EINVAL;
+- }
+- ret = cpsw_phy_sel_init(priv, physel);
+- if (ret)
+- return ret;
+-
+ for_each_child_of_node(np, child) {
+ if (of_device_is_compatible(child, "ti,davinci_mdio")) {
+ ret = of_pinctrl_select_state_default(child);
+@@ -1244,29 +1256,73 @@ static int cpsw_probe_dt(struct cpsw_priv *priv)
+ }
+
+ if (i < priv->num_slaves && !strncmp(child->name, "slave", 5)) {
+- struct cpsw_slave *slave = &priv->slaves[i];
+- uint32_t phy_id[2] = {-1, -1};
++ cpsw_add_slave(&priv->slaves[i], child, i);
++ i++;
++ }
++ }
+
+- if (!of_find_node_by_name(child, "fixed-link")) {
+- ret = of_property_read_u32_array(child, "phy_id", phy_id, 2);
+- if (!ret)
+- dev_warn(dev, "phy_id is deprecated, use phy-handle\n");
+- }
++ return 0;
++}
++
++static int cpsw_switch_probe_dt(struct cpsw_priv *priv)
++{
++ struct device_d *dev = priv->dev;
++ struct device_node *np = dev->device_node, *child;
++ struct device_node *ports = NULL;
++ int ret, i = 0;
+
+- slave->dev.device_node = child;
+- slave->phy_id = phy_id[1];
+- slave->phy_if = of_get_phy_mode(child);
+- slave->slave_num = i;
++ for_each_child_of_node(np, child) {
++ if (of_device_is_compatible(child, "ti,davinci_mdio")) {
++ ret = of_pinctrl_select_state_default(child);
++ if (ret)
++ return ret;
++ }
+
+- i++;
++ if (!strcmp(child->name, "ethernet-ports")) {
++ ports = child;
++ priv->num_slaves = of_get_available_child_count(ports);
+ }
+ }
+
+- for (i = 0; i < priv->num_slaves; i++) {
+- struct cpsw_slave *slave = &priv->slaves[i];
++ if (!ports)
++ return -EINVAL;
++
++ priv->slaves = xzalloc(sizeof(struct cpsw_slave) * priv->num_slaves);
++
++ for_each_available_child_of_node(ports, child) {
++ cpsw_add_slave(&priv->slaves[i], child, i);
++ i++;
++ }
++
++ return 0;
++}
+
+- cpsw_gmii_sel_am335x(slave);
++static int cpsw_probe_dt(struct cpsw_priv *priv)
++{
++ struct device_d *dev = priv->dev;
++ struct device_node *physel;
++ int (*probe_slaves_dt)(struct cpsw_priv *priv);
++ int ret, i = 0;
++
++ physel = of_find_compatible_node(NULL, NULL, "ti,am3352-phy-gmii-sel");
++ if (!physel) {
++ dev_err(dev, "Cannot find ti,am3352-phy-gmii-sel node\n");
++ return -EINVAL;
+ }
++ ret = cpsw_phy_sel_init(priv, physel);
++ if (ret)
++ return ret;
++
++ probe_slaves_dt = device_get_match_data(dev);
++ if (!probe_slaves_dt)
++ return -EINVAL;
++
++ ret = probe_slaves_dt(priv);
++ if (ret < 0)
++ return ret;
++
++ for (i = 0; i < priv->num_slaves; i++)
++ cpsw_gmii_sel_am335x(&priv->slaves[i]);
+
+ return 0;
+ }
+@@ -1282,15 +1338,15 @@ static int cpsw_probe(struct device_d *dev)
+
+ dev_dbg(dev, "* %s\n", __func__);
+
+- ret = of_platform_populate(dev->device_node, NULL, dev);
+- if (ret)
+- return ret;
+-
+ iores = dev_request_mem_resource(dev, 0);
+ if (IS_ERR(iores))
+ return PTR_ERR(iores);
+ regs = IOMEM(iores->start);
+
++ ret = of_platform_populate(dev->device_node, NULL, dev);
++ if (ret)
++ return ret;
++
+ priv = xzalloc(sizeof(*priv));
+ priv->dev = dev;
+
+@@ -1371,7 +1427,9 @@ static void cpsw_remove(struct device_d *dev)
+
+ static __maybe_unused struct of_device_id cpsw_dt_ids[] = {
+ {
+- .compatible = "ti,cpsw",
++ .compatible = "ti,cpsw", .data = cpsw_legacy_probe_dt
++ }, {
++ .compatible = "ti,cpsw-switch", .data = cpsw_switch_probe_dt
+ }, {
+ /* sentinel */
+ }
+--
+2.30.2
+
diff --git a/configs/platform-v7a/patches/barebox-2021.11.0/0002-Revert-ARM-beaglebone-init-MPU-speed-to-800Mhz.patch b/configs/platform-v7a/patches/barebox-2021.11.0/0002-Revert-ARM-beaglebone-init-MPU-speed-to-800Mhz.patch
new file mode 100644
index 0000000..10bfb83
--- /dev/null
+++ b/configs/platform-v7a/patches/barebox-2021.11.0/0002-Revert-ARM-beaglebone-init-MPU-speed-to-800Mhz.patch
@@ -0,0 +1,45 @@
+From 9c1a78f959dd751c9b8ceb31e44926afc89d7769 Mon Sep 17 00:00:00 2001
+From: Ahmad Fatoum <a.fatoum@pengutronix.de>
+Date: Fri, 3 Dec 2021 19:51:54 +0100
+Subject: [PATCH 2/2] Revert "ARM: beaglebone: init MPU speed to 800Mhz"
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Commit 130c7d6715e9 ("ARM: beaglebone: init MPU speed to 800Mhz") causes
+warm reboot from within Linux v5.14.0 to no longer succeed.
+barebox MLO is entered, but hangs. Reset from within barebox is
+unaffected.
+This can be reproduced using DistroKit 949c5ef2b9a6 ("v7a: barebox:
+version bump v2021.08.0 → v2021.11.0") on a Beaglebone Black.
+Until that's figured out, revert the commit; functional reboot is more
+important than the quicker boot up.
+
+This reverts commit 130c7d6715e932a1e0b3e026fea97f700ab33ea9.
+
+Fixes: 130c7d6715e9 ("ARM: beaglebone: init MPU speed to 800Mhz")
+Reported-by: arwie # IRC
+Cc: Marc Reilly <marc@cpdesign.com.au>
+Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
+Link: https://lore.barebox.org/20211203185154.388145-1-a.fatoum@pengutronix.de
+Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
+---
+ arch/arm/boards/beaglebone/lowlevel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boards/beaglebone/lowlevel.c b/arch/arm/boards/beaglebone/lowlevel.c
+index 31211448f5e8..91d143e4150b 100644
+--- a/arch/arm/boards/beaglebone/lowlevel.c
++++ b/arch/arm/boards/beaglebone/lowlevel.c
+@@ -126,7 +126,7 @@ static noinline int beaglebone_sram_init(void)
+
+ /* Setup the PLLs and the clocks for the peripherals */
+ if (is_beaglebone_black()) {
+- am33xx_pll_init(MPUPLL_M_800, DDRPLL_M_400);
++ am33xx_pll_init(MPUPLL_M_500, DDRPLL_M_400);
+ am335x_sdram_init(0x18B, &ddr3_cmd_ctrl, &ddr3_regs,
+ &ddr3_data);
+ } else {
+--
+2.30.2
+
diff --git a/configs/platform-v7a/patches/barebox-2021.11.0/series b/configs/platform-v7a/patches/barebox-2021.11.0/series
new file mode 100644
index 0000000..ba7c27d
--- /dev/null
+++ b/configs/platform-v7a/patches/barebox-2021.11.0/series
@@ -0,0 +1,2 @@
+0001-net-cpsw-add-support-for-new-binding-in-Linux-v5.15-.patch
+0002-Revert-ARM-beaglebone-init-MPU-speed-to-800Mhz.patch