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");