diff options
Diffstat (limited to 'drivers/net/dsa/qca8k.c')
| -rw-r--r-- | drivers/net/dsa/qca8k.c | 48 | 
1 files changed, 40 insertions, 8 deletions
diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c index 1f63f50f73f1..a984f06f6f04 100644 --- a/drivers/net/dsa/qca8k.c +++ b/drivers/net/dsa/qca8k.c @@ -643,10 +643,8 @@ qca8k_mdio_busy_wait(struct mii_bus *bus, u32 reg, u32 mask)  }  static int -qca8k_mdio_write(struct mii_bus *salve_bus, int phy, int regnum, u16 data) +qca8k_mdio_write(struct mii_bus *bus, int phy, int regnum, u16 data)  { -	struct qca8k_priv *priv = salve_bus->priv; -	struct mii_bus *bus = priv->bus;  	u16 r1, r2, page;  	u32 val;  	int ret; @@ -682,10 +680,8 @@ exit:  }  static int -qca8k_mdio_read(struct mii_bus *salve_bus, int phy, int regnum) +qca8k_mdio_read(struct mii_bus *bus, int phy, int regnum)  { -	struct qca8k_priv *priv = salve_bus->priv; -	struct mii_bus *bus = priv->bus;  	u16 r1, r2, page;  	u32 val;  	int ret; @@ -727,6 +723,24 @@ exit:  }  static int +qca8k_internal_mdio_write(struct mii_bus *slave_bus, int phy, int regnum, u16 data) +{ +	struct qca8k_priv *priv = slave_bus->priv; +	struct mii_bus *bus = priv->bus; + +	return qca8k_mdio_write(bus, phy, regnum, data); +} + +static int +qca8k_internal_mdio_read(struct mii_bus *slave_bus, int phy, int regnum) +{ +	struct qca8k_priv *priv = slave_bus->priv; +	struct mii_bus *bus = priv->bus; + +	return qca8k_mdio_read(bus, phy, regnum); +} + +static int  qca8k_phy_write(struct dsa_switch *ds, int port, int regnum, u16 data)  {  	struct qca8k_priv *priv = ds->priv; @@ -775,8 +789,8 @@ qca8k_mdio_register(struct qca8k_priv *priv, struct device_node *mdio)  	bus->priv = (void *)priv;  	bus->name = "qca8k slave mii"; -	bus->read = qca8k_mdio_read; -	bus->write = qca8k_mdio_write; +	bus->read = qca8k_internal_mdio_read; +	bus->write = qca8k_internal_mdio_write;  	snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d",  		 ds->index); @@ -1866,10 +1880,27 @@ qca8k_sw_remove(struct mdio_device *mdiodev)  	struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev);  	int i; +	if (!priv) +		return; +  	for (i = 0; i < QCA8K_NUM_PORTS; i++)  		qca8k_port_set_status(priv, i, 0);  	dsa_unregister_switch(priv->ds); + +	dev_set_drvdata(&mdiodev->dev, NULL); +} + +static void qca8k_sw_shutdown(struct mdio_device *mdiodev) +{ +	struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev); + +	if (!priv) +		return; + +	dsa_switch_shutdown(priv->ds); + +	dev_set_drvdata(&mdiodev->dev, NULL);  }  #ifdef CONFIG_PM_SLEEP @@ -1926,6 +1957,7 @@ static const struct of_device_id qca8k_of_match[] = {  static struct mdio_driver qca8kmdio_driver = {  	.probe  = qca8k_sw_probe,  	.remove = qca8k_sw_remove, +	.shutdown = qca8k_sw_shutdown,  	.mdiodrv.driver = {  		.name = "qca8k",  		.of_match_table = qca8k_of_match,  | 
