hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/net/phy/mdio_device.c
....@@ -1,16 +1,12 @@
1
+// SPDX-License-Identifier: GPL-2.0+
12 /* Framework for MDIO devices, other than PHYs.
23 *
34 * Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms of the GNU General Public License as published by the
7
- * Free Software Foundation; either version 2 of the License, or (at your
8
- * option) any later version.
9
- *
105 */
116
127 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
138
9
+#include <linux/delay.h>
1410 #include <linux/errno.h>
1511 #include <linux/gpio.h>
1612 #include <linux/gpio/consumer.h>
....@@ -21,10 +17,10 @@
2117 #include <linux/mii.h>
2218 #include <linux/module.h>
2319 #include <linux/phy.h>
20
+#include <linux/reset.h>
2421 #include <linux/slab.h>
2522 #include <linux/string.h>
2623 #include <linux/unistd.h>
27
-#include <linux/delay.h>
2824
2925 void mdio_device_free(struct mdio_device *mdiodev)
3026 {
....@@ -121,14 +117,22 @@
121117 {
122118 unsigned int d;
123119
124
- if (!mdiodev->reset)
120
+ if (!mdiodev->reset_gpio && !mdiodev->reset_ctrl)
125121 return;
126122
127
- gpiod_set_value(mdiodev->reset, value);
123
+ if (mdiodev->reset_gpio)
124
+ gpiod_set_value_cansleep(mdiodev->reset_gpio, value);
125
+
126
+ if (mdiodev->reset_ctrl) {
127
+ if (value)
128
+ reset_control_assert(mdiodev->reset_ctrl);
129
+ else
130
+ reset_control_deassert(mdiodev->reset_ctrl);
131
+ }
128132
129133 d = value ? mdiodev->reset_assert_delay : mdiodev->reset_deassert_delay;
130134 if (d)
131
- usleep_range(d, d + max_t(unsigned int, d / 10, 100));
135
+ fsleep(d);
132136 }
133137 EXPORT_SYMBOL(mdio_device_reset);
134138
....@@ -146,10 +150,10 @@
146150 struct mdio_driver *mdiodrv = to_mdio_driver(drv);
147151 int err = 0;
148152
149
- if (mdiodrv->probe) {
150
- /* Deassert the reset signal */
151
- mdio_device_reset(mdiodev, 0);
153
+ /* Deassert the reset signal */
154
+ mdio_device_reset(mdiodev, 0);
152155
156
+ if (mdiodrv->probe) {
153157 err = mdiodrv->probe(mdiodev);
154158 if (err) {
155159 /* Assert the reset signal */
....@@ -166,12 +170,11 @@
166170 struct device_driver *drv = mdiodev->dev.driver;
167171 struct mdio_driver *mdiodrv = to_mdio_driver(drv);
168172
169
- if (mdiodrv->remove) {
173
+ if (mdiodrv->remove)
170174 mdiodrv->remove(mdiodev);
171175
172
- /* Assert the reset signal */
173
- mdio_device_reset(mdiodev, 1);
174
- }
176
+ /* Assert the reset signal */
177
+ mdio_device_reset(mdiodev, 1);
175178
176179 return 0;
177180 }
....@@ -188,7 +191,7 @@
188191
189192 /**
190193 * mdio_driver_register - register an mdio_driver with the MDIO layer
191
- * @new_driver: new mdio_driver to register
194
+ * @drv: new mdio_driver to register
192195 */
193196 int mdio_driver_register(struct mdio_driver *drv)
194197 {