
On 27.04.22 12:41, Marek Behún wrote:
From: Marek Behún marek.behun@nic.cz
In order to be able to get rid of the non-DM MDIO bus registered in mvneta driver, start using the DM registered one in Turris MOX board code.
This also allows us to drop the hack introduced in MOX' -u-boot.dtsi file.
Signed-off-by: Marek Behún marek.behun@nic.cz
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
.../dts/armada-3720-turris-mox-u-boot.dtsi | 19 ---- board/CZ.NIC/turris_mox/turris_mox.c | 88 +++++++++---------- 2 files changed, 44 insertions(+), 63 deletions(-)
diff --git a/arch/arm/dts/armada-3720-turris-mox-u-boot.dtsi b/arch/arm/dts/armada-3720-turris-mox-u-boot.dtsi index 28a36a6103..71d5e70ca4 100644 --- a/arch/arm/dts/armada-3720-turris-mox-u-boot.dtsi +++ b/arch/arm/dts/armada-3720-turris-mox-u-boot.dtsi @@ -3,25 +3,6 @@
- 2022 by Marek Behún kabel@kernel.org
*/
-/ {
- mdio {
#address-cells = <1>;
#size-cells = <0>;
old_binding_phy1: ethernet-phy@1 {
reg = <1>;
};
- };
-};
-ð0 {
- pinctrl-0 = <&rgmii_pins>, <&smi_pins>;
- /delete-property/ phy-handle;
- phy = <&old_binding_phy1>;
-};
-/delete-node/ &mdio;
- &usb3 { vbus-supply = <&exp_usb3_vbus>; };
diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c index 9702d1fc78..a4738b3a3c 100644 --- a/board/CZ.NIC/turris_mox/turris_mox.c +++ b/board/CZ.NIC/turris_mox/turris_mox.c @@ -13,6 +13,7 @@ #include <button.h> #include <clk.h> #include <dm.h> +#include <dm/of_extra.h> #include <env.h> #include <fdt_support.h> #include <init.h> @@ -216,35 +217,35 @@ static int mox_get_topology(const u8 **ptopology, int *psize, int *pis_sd) #define SW_SMI_CMD_R(d, r) (0x9800 | (((d) & 0x1f) << 5) | ((r) & 0x1f)) #define SW_SMI_CMD_W(d, r) (0x9400 | (((d) & 0x1f) << 5) | ((r) & 0x1f))
-static int sw_multi_read(struct mii_dev *bus, int sw, int dev, int reg) +static int sw_multi_read(struct udevice *bus, int sw, int dev, int reg) {
- bus->write(bus, sw, 0, 0, SW_SMI_CMD_R(dev, reg));
- dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 0, SW_SMI_CMD_R(dev, reg)); mdelay(5);
- return bus->read(bus, sw, 0, 1);
- return dm_mdio_read(bus, sw, MDIO_DEVAD_NONE, 1); }
-static void sw_multi_write(struct mii_dev *bus, int sw, int dev, int reg, +static void sw_multi_write(struct udevice *bus, int sw, int dev, int reg, u16 val) {
- bus->write(bus, sw, 0, 1, val);
- bus->write(bus, sw, 0, 0, SW_SMI_CMD_W(dev, reg));
- dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 1, val);
- dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 0, SW_SMI_CMD_W(dev, reg)); mdelay(5); }
-static int sw_scratch_read(struct mii_dev *bus, int sw, int reg) +static int sw_scratch_read(struct udevice *bus, int sw, int reg) { sw_multi_write(bus, sw, 0x1c, 0x1a, (reg & 0x7f) << 8); return sw_multi_read(bus, sw, 0x1c, 0x1a) & 0xff; }
-static void sw_led_write(struct mii_dev *bus, int sw, int port, int reg, +static void sw_led_write(struct udevice *bus, int sw, int port, int reg, u16 val) { sw_multi_write(bus, sw, port, 0x16, 0x8000 | ((reg & 7) << 12) | (val & 0x7ff)); }
-static void sw_blink_leds(struct mii_dev *bus, int peridot, int topaz) +static void sw_blink_leds(struct udevice *bus, int peridot, int topaz) { int i, p; struct { @@ -275,7 +276,7 @@ static void sw_blink_leds(struct mii_dev *bus, int peridot, int topaz) } }
-static void check_switch_address(struct mii_dev *bus, int addr) +static void check_switch_address(struct udevice *bus, int addr) { if (sw_scratch_read(bus, addr, 0x70) >> 3 != addr) printf("Check of switch MDIO address failed for 0x%02x\n", @@ -374,36 +375,22 @@ static void mox_phy_modify(struct phy_device *phydev, int page, int reg, static void mox_phy_leds_start_blinking(void) { struct phy_device *phydev;
- struct mii_dev *bus;
- const char *node_name;
- int node;
- ofnode phy_node;
- node = fdt_path_offset(gd->fdt_blob, "ethernet0");
- if (node < 0) {
printf("Cannot get eth0!\n");
return;
- }
- phy_node = ofnode_get_phy_node(ofnode_path("ethernet0"));
- if (!ofnode_valid(phy_node))
goto err;
- node_name = fdt_get_name(gd->fdt_blob, node, NULL);
- if (!node_name) {
printf("Cannot get eth0 node name!\n");
return;
- }
- bus = miiphy_get_dev_by_name(node_name);
- if (!bus) {
printf("Cannot get MDIO bus device!\n");
return;
- }
- phydev = phy_find_by_mask(bus, BIT(1));
- if (!phydev) {
printf("Cannot get ethernet PHY!\n");
return;
- }
phydev = dm_phy_find_by_ofnode(phy_node);
if (!phydev)
goto err;
mox_phy_modify(phydev, 3, 0x12, 0x700, 0x400); mox_phy_modify(phydev, 3, 0x10, 0xff, 0xbb);
return;
+err:
printf("Cannot get ethernet PHY!\n"); }
static bool read_reset_button(void)
@@ -611,6 +598,26 @@ int show_board_info(void) return 0; }
+static struct udevice *mox_mdio_bus(void) +{
- struct udevice *bus;
- ofnode node;
- node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
- if (!ofnode_valid(node))
goto err;
- dm_mdio_probe_devices();
- if (uclass_get_device_by_ofnode(UCLASS_MDIO, node, &bus))
goto err;
- return bus;
+err:
- printf("Cannot get MDIO bus device!\n");
- return NULL;
+}
- int last_stage_init(void) { struct gpio_desc reset_gpio = {};
@@ -636,16 +643,9 @@ int last_stage_init(void) * 0x70 of Peridot (and potentially Topaz) modules */ if (peridot || topaz) {
struct mii_dev *bus;
const char *node_name;
int node;
struct udevice *bus = mox_mdio_bus();
node = fdt_path_offset(gd->fdt_blob, "ethernet0");
node_name = (node >= 0) ? fdt_get_name(gd->fdt_blob, node, NULL) : NULL;
bus = node_name ? miiphy_get_dev_by_name(node_name) : NULL;
if (!bus) {
printf("Cannot get MDIO bus device!\n");
} else {
if (bus) { int i; for (i = 0; i < peridot; ++i)
Viele Grüße, Stefan Roese