diff options
Diffstat (limited to 'drivers/net/dsa/realtek-smi-core.c')
| -rw-r--r-- | drivers/net/dsa/realtek-smi-core.c | 22 | 
1 files changed, 20 insertions, 2 deletions
| diff --git a/drivers/net/dsa/realtek-smi-core.c b/drivers/net/dsa/realtek-smi-core.c index 8e49d4f85d48..2fcfd917b876 100644 --- a/drivers/net/dsa/realtek-smi-core.c +++ b/drivers/net/dsa/realtek-smi-core.c @@ -368,7 +368,7 @@ int realtek_smi_setup_mdio(struct realtek_smi *smi)  	smi->slave_mii_bus->parent = smi->dev;  	smi->ds->slave_mii_bus = smi->slave_mii_bus; -	ret = of_mdiobus_register(smi->slave_mii_bus, mdio_np); +	ret = devm_of_mdiobus_register(smi->dev, smi->slave_mii_bus, mdio_np);  	if (ret) {  		dev_err(smi->dev, "unable to register MDIO bus %s\n",  			smi->slave_mii_bus->id); @@ -464,16 +464,33 @@ static int realtek_smi_probe(struct platform_device *pdev)  static int realtek_smi_remove(struct platform_device *pdev)  { -	struct realtek_smi *smi = dev_get_drvdata(&pdev->dev); +	struct realtek_smi *smi = platform_get_drvdata(pdev); + +	if (!smi) +		return 0;  	dsa_unregister_switch(smi->ds);  	if (smi->slave_mii_bus)  		of_node_put(smi->slave_mii_bus->dev.of_node);  	gpiod_set_value(smi->reset, 1); +	platform_set_drvdata(pdev, NULL); +  	return 0;  } +static void realtek_smi_shutdown(struct platform_device *pdev) +{ +	struct realtek_smi *smi = platform_get_drvdata(pdev); + +	if (!smi) +		return; + +	dsa_switch_shutdown(smi->ds); + +	platform_set_drvdata(pdev, NULL); +} +  static const struct of_device_id realtek_smi_of_match[] = {  	{  		.compatible = "realtek,rtl8366rb", @@ -495,6 +512,7 @@ static struct platform_driver realtek_smi_driver = {  	},  	.probe  = realtek_smi_probe,  	.remove = realtek_smi_remove, +	.shutdown = realtek_smi_shutdown,  };  module_platform_driver(realtek_smi_driver); |