diff options
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 |