Message ID | 20220325041451.894-3-dylan_hung@aspeedtech.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Add reset deassertion for Aspeed MDIO | expand |
Hi, On Fri, Mar 25, 2022 at 12:14:50PM +0800, Dylan Hung wrote: > Add reset assertion/deassertion for Aspeed MDIO. There are 4 MDIO > controllers embedded in Aspeed AST2600 SOC and share one reset control > register SCU50[3]. To work with old DT blobs which don't have the reset > property, devm_reset_control_get_optional_shared is used in this change. > > Signed-off-by: Dylan Hung <dylan_hung@aspeedtech.com> > Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> Should this really be specific to one driver rather than being handled in the core mdio code?
Hi Russell, > -----Original Message----- > From: Russell King [mailto:linux@armlinux.org.uk] > Sent: 2022年3月31日 3:12 PM > To: Dylan Hung <dylan_hung@aspeedtech.com> > Cc: robh+dt@kernel.org; joel@jms.id.au; andrew@aj.id.au; andrew@lunn.ch; > hkallweit1@gmail.com; davem@davemloft.net; kuba@kernel.org; > pabeni@redhat.com; p.zabel@pengutronix.de; devicetree@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; linux-aspeed@lists.ozlabs.org; > linux-kernel@vger.kernel.org; netdev@vger.kernel.org; BMC-SW > <BMC-SW@aspeedtech.com> > Subject: Re: [PATCH v3 2/3] net: mdio: add reset control for Aspeed MDIO > > Hi, > > On Fri, Mar 25, 2022 at 12:14:50PM +0800, Dylan Hung wrote: > > Add reset assertion/deassertion for Aspeed MDIO. There are 4 MDIO > > controllers embedded in Aspeed AST2600 SOC and share one reset control > > register SCU50[3]. To work with old DT blobs which don't have the > > reset property, devm_reset_control_get_optional_shared is used in this > change. > > > > Signed-off-by: Dylan Hung <dylan_hung@aspeedtech.com> > > Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> > > Should this really be specific to one driver rather than being handled in the > core mdio code? > Is the core mdio code able to know the reset is shared or exclusive? I supposed that the reset property is hardware dependent. Did I get that right? > -- > RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ > FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!
diff --git a/drivers/net/mdio/mdio-aspeed.c b/drivers/net/mdio/mdio-aspeed.c index e2273588c75b..1afb58ccc524 100644 --- a/drivers/net/mdio/mdio-aspeed.c +++ b/drivers/net/mdio/mdio-aspeed.c @@ -3,6 +3,7 @@ #include <linux/bitfield.h> #include <linux/delay.h> +#include <linux/reset.h> #include <linux/iopoll.h> #include <linux/mdio.h> #include <linux/module.h> @@ -37,6 +38,7 @@ struct aspeed_mdio { void __iomem *base; + struct reset_control *reset; }; static int aspeed_mdio_read(struct mii_bus *bus, int addr, int regnum) @@ -120,6 +122,12 @@ static int aspeed_mdio_probe(struct platform_device *pdev) if (IS_ERR(ctx->base)) return PTR_ERR(ctx->base); + ctx->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL); + if (IS_ERR(ctx->reset)) + return PTR_ERR(ctx->reset); + + reset_control_deassert(ctx->reset); + bus->name = DRV_NAME; snprintf(bus->id, MII_BUS_ID_SIZE, "%s%d", pdev->name, pdev->id); bus->parent = &pdev->dev; @@ -129,6 +137,7 @@ static int aspeed_mdio_probe(struct platform_device *pdev) rc = of_mdiobus_register(bus, pdev->dev.of_node); if (rc) { dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); + reset_control_assert(ctx->reset); return rc; } @@ -139,7 +148,11 @@ static int aspeed_mdio_probe(struct platform_device *pdev) static int aspeed_mdio_remove(struct platform_device *pdev) { - mdiobus_unregister(platform_get_drvdata(pdev)); + struct mii_bus *bus = (struct mii_bus *)platform_get_drvdata(pdev); + struct aspeed_mdio *ctx = bus->priv; + + reset_control_assert(ctx->reset); + mdiobus_unregister(bus); return 0; }