--- zzzz-none-000/linux-5.4.213/drivers/net/phy/mdio-gpio.c 2022-09-15 10:04:56.000000000 +0000 +++ miami-7690-761/linux-5.4.213/drivers/net/phy/mdio-gpio.c 2024-05-29 11:19:55.000000000 +0000 @@ -32,6 +32,11 @@ struct gpio_desc *mdc, *mdio, *mdo; }; +#if IS_ENABLED(CONFIG_MDIO_QCA) +extern int qca_phy_reset(struct platform_device *pdev); +extern void qca_mht_preinit(struct mii_bus *mii_bus); +#endif + static int mdio_gpio_get_data(struct device *dev, struct mdio_gpio_info *bitbang) { @@ -114,6 +119,9 @@ struct mii_bus *new_bus; bitbang->ctrl.ops = &mdio_gpio_ops; +#if IS_ENABLED(CONFIG_MDIO_QCA) + bitbang->ctrl.preinit = qca_mht_preinit; +#endif new_bus = alloc_mdio_bitbang(&bitbang->ctrl); if (!new_bus) @@ -180,6 +188,16 @@ if (!new_bus) return -ENODEV; +#if IS_ENABLED(CONFIG_MDIO_QCA) + ret = qca_phy_reset(pdev); + if (ret) { + dev_warn(&pdev->dev, "failed to reset PHY by GPIO\n"); + return ret; + } + + bitbang->ctrl.preinit(new_bus); +#endif + ret = of_mdiobus_register(new_bus, pdev->dev.of_node); if (ret) mdio_gpio_bus_deinit(&pdev->dev);