ar9331.c (d1b803f4ca4f25d6f171219d039f9410a10b29ee) | ar9331.c (0650bf52b31ff35dc6430fc2e37969c36baba724) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2// Copyright (c) 2019 Pengutronix, Oleksij Rempel <kernel@pengutronix.de> 3/* 4 * +----------------------+ 5 * GMAC1----RGMII----|--MAC0 | 6 * \---MDIO1----|--REGs |----MDIO3----\ 7 * | | | +------+ 8 * | | +--| | --- 1069 unchanged lines hidden (view full) --- 1078 return ret; 1079} 1080 1081static void ar9331_sw_remove(struct mdio_device *mdiodev) 1082{ 1083 struct ar9331_sw_priv *priv = dev_get_drvdata(&mdiodev->dev); 1084 unsigned int i; 1085 | 1// SPDX-License-Identifier: GPL-2.0-only 2// Copyright (c) 2019 Pengutronix, Oleksij Rempel <kernel@pengutronix.de> 3/* 4 * +----------------------+ 5 * GMAC1----RGMII----|--MAC0 | 6 * \---MDIO1----|--REGs |----MDIO3----\ 7 * | | | +------+ 8 * | | +--| | --- 1069 unchanged lines hidden (view full) --- 1078 return ret; 1079} 1080 1081static void ar9331_sw_remove(struct mdio_device *mdiodev) 1082{ 1083 struct ar9331_sw_priv *priv = dev_get_drvdata(&mdiodev->dev); 1084 unsigned int i; 1085 |
1086 if (!priv) 1087 return; 1088 |
|
1086 for (i = 0; i < ARRAY_SIZE(priv->port); i++) { 1087 struct ar9331_sw_port *port = &priv->port[i]; 1088 1089 cancel_delayed_work_sync(&port->mib_read); 1090 } 1091 1092 irq_domain_remove(priv->irqdomain); 1093 mdiobus_unregister(priv->mbus); 1094 dsa_unregister_switch(&priv->ds); 1095 1096 reset_control_assert(priv->sw_reset); | 1089 for (i = 0; i < ARRAY_SIZE(priv->port); i++) { 1090 struct ar9331_sw_port *port = &priv->port[i]; 1091 1092 cancel_delayed_work_sync(&port->mib_read); 1093 } 1094 1095 irq_domain_remove(priv->irqdomain); 1096 mdiobus_unregister(priv->mbus); 1097 dsa_unregister_switch(&priv->ds); 1098 1099 reset_control_assert(priv->sw_reset); |
1100 1101 dev_set_drvdata(&mdiodev->dev, NULL); |
|
1097} 1098 | 1102} 1103 |
1104static void ar9331_sw_shutdown(struct mdio_device *mdiodev) 1105{ 1106 struct ar9331_sw_priv *priv = dev_get_drvdata(&mdiodev->dev); 1107 1108 if (!priv) 1109 return; 1110 1111 dsa_switch_shutdown(&priv->ds); 1112 1113 dev_set_drvdata(&mdiodev->dev, NULL); 1114} 1115 |
|
1099static const struct of_device_id ar9331_sw_of_match[] = { 1100 { .compatible = "qca,ar9331-switch" }, 1101 { }, 1102}; 1103 1104static struct mdio_driver ar9331_sw_mdio_driver = { 1105 .probe = ar9331_sw_probe, 1106 .remove = ar9331_sw_remove, | 1116static const struct of_device_id ar9331_sw_of_match[] = { 1117 { .compatible = "qca,ar9331-switch" }, 1118 { }, 1119}; 1120 1121static struct mdio_driver ar9331_sw_mdio_driver = { 1122 .probe = ar9331_sw_probe, 1123 .remove = ar9331_sw_remove, |
1124 .shutdown = ar9331_sw_shutdown, |
|
1107 .mdiodrv.driver = { 1108 .name = AR9331_SW_NAME, 1109 .of_match_table = ar9331_sw_of_match, 1110 }, 1111}; 1112 1113mdio_module_driver(ar9331_sw_mdio_driver); 1114 1115MODULE_AUTHOR("Oleksij Rempel <kernel@pengutronix.de>"); 1116MODULE_DESCRIPTION("Driver for Atheros AR9331 switch"); 1117MODULE_LICENSE("GPL v2"); | 1125 .mdiodrv.driver = { 1126 .name = AR9331_SW_NAME, 1127 .of_match_table = ar9331_sw_of_match, 1128 }, 1129}; 1130 1131mdio_module_driver(ar9331_sw_mdio_driver); 1132 1133MODULE_AUTHOR("Oleksij Rempel <kernel@pengutronix.de>"); 1134MODULE_DESCRIPTION("Driver for Atheros AR9331 switch"); 1135MODULE_LICENSE("GPL v2"); |