diff options
Diffstat (limited to 'drivers/net/dsa/microchip')
| -rw-r--r-- | drivers/net/dsa/microchip/ksz8795_spi.c | 11 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz8863_smi.c | 13 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz9477_i2c.c | 14 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz9477_spi.c | 8 | ||||
| -rw-r--r-- | drivers/net/dsa/microchip/ksz_common.c | 4 | 
5 files changed, 44 insertions, 6 deletions
| diff --git a/drivers/net/dsa/microchip/ksz8795_spi.c b/drivers/net/dsa/microchip/ksz8795_spi.c index ea7550d1b634..866767b70d65 100644 --- a/drivers/net/dsa/microchip/ksz8795_spi.c +++ b/drivers/net/dsa/microchip/ksz8795_spi.c @@ -94,6 +94,8 @@ static int ksz8795_spi_remove(struct spi_device *spi)  	if (dev)  		ksz_switch_remove(dev); +	spi_set_drvdata(spi, NULL); +  	return 0;  } @@ -101,8 +103,15 @@ static void ksz8795_spi_shutdown(struct spi_device *spi)  {  	struct ksz_device *dev = spi_get_drvdata(spi); -	if (dev && dev->dev_ops->shutdown) +	if (!dev) +		return; + +	if (dev->dev_ops->shutdown)  		dev->dev_ops->shutdown(dev); + +	dsa_switch_shutdown(dev->ds); + +	spi_set_drvdata(spi, NULL);  }  static const struct of_device_id ksz8795_dt_ids[] = { diff --git a/drivers/net/dsa/microchip/ksz8863_smi.c b/drivers/net/dsa/microchip/ksz8863_smi.c index 11293485138c..5883fa7edda2 100644 --- a/drivers/net/dsa/microchip/ksz8863_smi.c +++ b/drivers/net/dsa/microchip/ksz8863_smi.c @@ -191,6 +191,18 @@ static void ksz8863_smi_remove(struct mdio_device *mdiodev)  	if (dev)  		ksz_switch_remove(dev); + +	dev_set_drvdata(&mdiodev->dev, NULL); +} + +static void ksz8863_smi_shutdown(struct mdio_device *mdiodev) +{ +	struct ksz_device *dev = dev_get_drvdata(&mdiodev->dev); + +	if (dev) +		dsa_switch_shutdown(dev->ds); + +	dev_set_drvdata(&mdiodev->dev, NULL);  }  static const struct of_device_id ksz8863_dt_ids[] = { @@ -203,6 +215,7 @@ MODULE_DEVICE_TABLE(of, ksz8863_dt_ids);  static struct mdio_driver ksz8863_driver = {  	.probe	= ksz8863_smi_probe,  	.remove	= ksz8863_smi_remove, +	.shutdown = ksz8863_smi_shutdown,  	.mdiodrv.driver = {  		.name	= "ksz8863-switch",  		.of_match_table = ksz8863_dt_ids, diff --git a/drivers/net/dsa/microchip/ksz9477_i2c.c b/drivers/net/dsa/microchip/ksz9477_i2c.c index 4e053a25d077..f3afb8b8c4cc 100644 --- a/drivers/net/dsa/microchip/ksz9477_i2c.c +++ b/drivers/net/dsa/microchip/ksz9477_i2c.c @@ -56,7 +56,10 @@ static int ksz9477_i2c_remove(struct i2c_client *i2c)  {  	struct ksz_device *dev = i2c_get_clientdata(i2c); -	ksz_switch_remove(dev); +	if (dev) +		ksz_switch_remove(dev); + +	i2c_set_clientdata(i2c, NULL);  	return 0;  } @@ -65,8 +68,15 @@ static void ksz9477_i2c_shutdown(struct i2c_client *i2c)  {  	struct ksz_device *dev = i2c_get_clientdata(i2c); -	if (dev && dev->dev_ops->shutdown) +	if (!dev) +		return; + +	if (dev->dev_ops->shutdown)  		dev->dev_ops->shutdown(dev); + +	dsa_switch_shutdown(dev->ds); + +	i2c_set_clientdata(i2c, NULL);  }  static const struct i2c_device_id ksz9477_i2c_id[] = { diff --git a/drivers/net/dsa/microchip/ksz9477_spi.c b/drivers/net/dsa/microchip/ksz9477_spi.c index 15bc11b3cda4..e3cb0e6c9f6f 100644 --- a/drivers/net/dsa/microchip/ksz9477_spi.c +++ b/drivers/net/dsa/microchip/ksz9477_spi.c @@ -72,6 +72,8 @@ static int ksz9477_spi_remove(struct spi_device *spi)  	if (dev)  		ksz_switch_remove(dev); +	spi_set_drvdata(spi, NULL); +  	return 0;  } @@ -79,8 +81,10 @@ static void ksz9477_spi_shutdown(struct spi_device *spi)  {  	struct ksz_device *dev = spi_get_drvdata(spi); -	if (dev && dev->dev_ops->shutdown) -		dev->dev_ops->shutdown(dev); +	if (dev) +		dsa_switch_shutdown(dev->ds); + +	spi_set_drvdata(spi, NULL);  }  static const struct of_device_id ksz9477_dt_ids[] = { diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 1542bfb8b5e5..7c2968a639eb 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -449,8 +449,10 @@ EXPORT_SYMBOL(ksz_switch_register);  void ksz_switch_remove(struct ksz_device *dev)  {  	/* timer started */ -	if (dev->mib_read_interval) +	if (dev->mib_read_interval) { +		dev->mib_read_interval = 0;  		cancel_delayed_work_sync(&dev->mib_read); +	}  	dev->dev_ops->exit(dev);  	dsa_unregister_switch(dev->ds); |