blob: ce940871331e99888894078fa1e45962f6914776 [file] [log] [blame]
Andrew Lunna2443fd2019-01-21 19:05:50 +01001// SPDX-License-Identifier: GPL-2.0+
Sergei Shtylyov02d320c2014-01-05 03:18:27 +03002/* MDIO Bus interface
Andy Fleming00db8182005-07-30 19:31:23 -04003 *
4 * Author: Andy Fleming
5 *
6 * Copyright (c) 2004 Freescale Semiconductor, Inc.
Andy Fleming00db8182005-07-30 19:31:23 -04007 */
Joe Perches8d242482012-06-09 07:49:07 +00008
9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10
Andy Fleming00db8182005-07-30 19:31:23 -040011#include <linux/kernel.h>
Andy Fleming00db8182005-07-30 19:31:23 -040012#include <linux/string.h>
13#include <linux/errno.h>
14#include <linux/unistd.h>
15#include <linux/slab.h>
16#include <linux/interrupt.h>
17#include <linux/init.h>
18#include <linux/delay.h>
Anton Vorontsov3d1e4db2009-02-01 00:53:34 -080019#include <linux/device.h>
Roger Quadros69226892017-04-21 16:15:38 +030020#include <linux/gpio.h>
21#include <linux/gpio/consumer.h>
David Daneya30e2c12012-06-27 07:33:37 +000022#include <linux/of_device.h>
Mark Brown4085a7f2012-10-08 22:55:43 +000023#include <linux/of_mdio.h>
Roger Quadros69226892017-04-21 16:15:38 +030024#include <linux/of_gpio.h>
Andy Fleming00db8182005-07-30 19:31:23 -040025#include <linux/netdevice.h>
26#include <linux/etherdevice.h>
David Bauer71dd6c02019-04-17 23:59:21 +020027#include <linux/reset.h>
Andy Fleming00db8182005-07-30 19:31:23 -040028#include <linux/skbuff.h>
29#include <linux/spinlock.h>
30#include <linux/mm.h>
31#include <linux/module.h>
Andy Fleming00db8182005-07-30 19:31:23 -040032#include <linux/mii.h>
33#include <linux/ethtool.h>
34#include <linux/phy.h>
Sergei Shtylyov02d320c2014-01-05 03:18:27 +030035#include <linux/io.h>
36#include <linux/uaccess.h>
Andy Fleming00db8182005-07-30 19:31:23 -040037
Uwe Kleine-Könige22e9962016-11-22 16:47:11 +010038#define CREATE_TRACE_POINTS
39#include <trace/events/mdio.h>
40
Florian Fainelli648ea012017-02-04 13:02:44 -080041#include "mdio-boardinfo.h"
42
Andrew Lunnee7e16b2018-01-02 17:40:26 +010043static int mdiobus_register_gpiod(struct mdio_device *mdiodev)
Andrew Lunn7f854422016-01-06 20:11:18 +010044{
Sergei Shtylyovbafbdd52017-12-04 13:35:05 +010045 struct gpio_desc *gpiod = NULL;
46
Sergei Shtylyovbafbdd52017-12-04 13:35:05 +010047 /* Deassert the optional reset signal */
48 if (mdiodev->dev.of_node)
49 gpiod = fwnode_get_named_gpiod(&mdiodev->dev.of_node->fwnode,
50 "reset-gpios", 0, GPIOD_OUT_LOW,
51 "PHY reset");
YueHaibing780feae2019-02-16 10:59:35 +080052 if (IS_ERR(gpiod)) {
53 if (PTR_ERR(gpiod) == -ENOENT || PTR_ERR(gpiod) == -ENOSYS)
54 gpiod = NULL;
55 else
56 return PTR_ERR(gpiod);
57 }
Sergei Shtylyovbafbdd52017-12-04 13:35:05 +010058
David Bauer6110ed22019-04-17 23:59:22 +020059 mdiodev->reset_gpio = gpiod;
Sergei Shtylyovbafbdd52017-12-04 13:35:05 +010060
David Bauer71dd6c02019-04-17 23:59:21 +020061 return 0;
62}
63
64static int mdiobus_register_reset(struct mdio_device *mdiodev)
65{
66 struct reset_control *reset = NULL;
67
68 if (mdiodev->dev.of_node)
69 reset = devm_reset_control_get_exclusive(&mdiodev->dev,
70 "phy");
71 if (PTR_ERR(reset) == -ENOENT ||
72 PTR_ERR(reset) == -ENOTSUPP)
73 reset = NULL;
74 else if (IS_ERR(reset))
75 return PTR_ERR(reset);
76
77 mdiodev->reset_ctrl = reset;
Sergei Shtylyovbafbdd52017-12-04 13:35:05 +010078
Andrew Lunnee7e16b2018-01-02 17:40:26 +010079 return 0;
80}
81
82int mdiobus_register_device(struct mdio_device *mdiodev)
83{
84 int err;
85
86 if (mdiodev->bus->mdio_map[mdiodev->addr])
87 return -EBUSY;
88
89 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) {
90 err = mdiobus_register_gpiod(mdiodev);
91 if (err)
92 return err;
David Bauer71dd6c02019-04-17 23:59:21 +020093
94 err = mdiobus_register_reset(mdiodev);
95 if (err)
96 return err;
97
98 /* Assert the reset signal */
99 mdio_device_reset(mdiodev, 1);
Andrew Lunnee7e16b2018-01-02 17:40:26 +0100100 }
101
Andrew Lunn7f854422016-01-06 20:11:18 +0100102 mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev;
103
104 return 0;
105}
106EXPORT_SYMBOL(mdiobus_register_device);
107
108int mdiobus_unregister_device(struct mdio_device *mdiodev)
109{
110 if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev)
111 return -EINVAL;
112
113 mdiodev->bus->mdio_map[mdiodev->addr] = NULL;
114
115 return 0;
116}
117EXPORT_SYMBOL(mdiobus_unregister_device);
118
119struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
120{
121 struct mdio_device *mdiodev = bus->mdio_map[addr];
122
123 if (!mdiodev)
124 return NULL;
125
126 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
127 return NULL;
128
129 return container_of(mdiodev, struct phy_device, mdio);
130}
131EXPORT_SYMBOL(mdiobus_get_phy);
132
133bool mdiobus_is_registered_device(struct mii_bus *bus, int addr)
134{
135 return bus->mdio_map[addr];
136}
137EXPORT_SYMBOL(mdiobus_is_registered_device);
138
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800139/**
Timur Tabieb8a54a72012-01-12 15:23:04 -0800140 * mdiobus_alloc_size - allocate a mii_bus structure
Randy Dunlapaf58f1d2012-01-21 09:03:04 +0000141 * @size: extra amount of memory to allocate for private storage.
142 * If non-zero, then bus->priv is points to that memory.
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700143 *
144 * Description: called by a bus driver to allocate an mii_bus
145 * structure to fill in.
146 */
Timur Tabieb8a54a72012-01-12 15:23:04 -0800147struct mii_bus *mdiobus_alloc_size(size_t size)
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700148{
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700149 struct mii_bus *bus;
Timur Tabieb8a54a72012-01-12 15:23:04 -0800150 size_t aligned_size = ALIGN(sizeof(*bus), NETDEV_ALIGN);
151 size_t alloc_size;
Andrew Lunne7f4dc32016-01-06 20:11:15 +0100152 int i;
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700153
Timur Tabieb8a54a72012-01-12 15:23:04 -0800154 /* If we alloc extra space, it should be aligned */
155 if (size)
156 alloc_size = aligned_size + size;
157 else
158 alloc_size = sizeof(*bus);
159
160 bus = kzalloc(alloc_size, GFP_KERNEL);
Dan Carpenterdb9107b2016-01-12 12:34:36 +0300161 if (!bus)
162 return NULL;
163
164 bus->state = MDIOBUS_ALLOCATED;
165 if (size)
166 bus->priv = (void *)bus + aligned_size;
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700167
Andrew Lunne7f4dc32016-01-06 20:11:15 +0100168 /* Initialise the interrupts to polling */
169 for (i = 0; i < PHY_MAX_ADDR; i++)
170 bus->irq[i] = PHY_POLL;
171
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700172 return bus;
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700173}
Timur Tabieb8a54a72012-01-12 15:23:04 -0800174EXPORT_SYMBOL(mdiobus_alloc_size);
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700175
Grygorii Strashko6d48f442014-04-30 15:23:33 +0300176static void _devm_mdiobus_free(struct device *dev, void *res)
177{
178 mdiobus_free(*(struct mii_bus **)res);
179}
180
181static int devm_mdiobus_match(struct device *dev, void *res, void *data)
182{
183 struct mii_bus **r = res;
184
185 if (WARN_ON(!r || !*r))
186 return 0;
187
188 return *r == data;
189}
190
191/**
192 * devm_mdiobus_alloc_size - Resource-managed mdiobus_alloc_size()
193 * @dev: Device to allocate mii_bus for
194 * @sizeof_priv: Space to allocate for private structure.
195 *
196 * Managed mdiobus_alloc_size. mii_bus allocated with this function is
197 * automatically freed on driver detach.
198 *
199 * If an mii_bus allocated with this function needs to be freed separately,
200 * devm_mdiobus_free() must be used.
201 *
202 * RETURNS:
203 * Pointer to allocated mii_bus on success, NULL on failure.
204 */
205struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv)
206{
207 struct mii_bus **ptr, *bus;
208
209 ptr = devres_alloc(_devm_mdiobus_free, sizeof(*ptr), GFP_KERNEL);
210 if (!ptr)
211 return NULL;
212
213 /* use raw alloc_dr for kmalloc caller tracing */
214 bus = mdiobus_alloc_size(sizeof_priv);
215 if (bus) {
216 *ptr = bus;
217 devres_add(dev, ptr);
218 } else {
219 devres_free(ptr);
220 }
221
222 return bus;
223}
Arnd Bergmann93dccc52014-05-08 16:46:52 +0200224EXPORT_SYMBOL_GPL(devm_mdiobus_alloc_size);
Grygorii Strashko6d48f442014-04-30 15:23:33 +0300225
226/**
227 * devm_mdiobus_free - Resource-managed mdiobus_free()
228 * @dev: Device this mii_bus belongs to
229 * @bus: the mii_bus associated with the device
230 *
231 * Free mii_bus allocated with devm_mdiobus_alloc_size().
232 */
233void devm_mdiobus_free(struct device *dev, struct mii_bus *bus)
234{
235 int rc;
236
237 rc = devres_release(dev, _devm_mdiobus_free,
238 devm_mdiobus_match, bus);
239 WARN_ON(rc);
240}
241EXPORT_SYMBOL_GPL(devm_mdiobus_free);
242
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700243/**
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700244 * mdiobus_release - mii_bus device release callback
Randy Dunlap78c36b12008-10-13 18:46:22 -0700245 * @d: the target struct device that contains the mii_bus
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700246 *
247 * Description: called when the last reference to an mii_bus is
248 * dropped, to free the underlying memory.
249 */
250static void mdiobus_release(struct device *d)
251{
252 struct mii_bus *bus = to_mii_bus(d);
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800253 BUG_ON(bus->state != MDIOBUS_RELEASED &&
254 /* for compatibility with error handling in drivers */
255 bus->state != MDIOBUS_ALLOCATED);
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700256 kfree(bus);
257}
258
259static struct class mdio_bus_class = {
260 .name = "mdio_bus",
261 .dev_release = mdiobus_release,
262};
263
Bjørn Morkb943fbb2012-05-11 05:47:01 +0000264#if IS_ENABLED(CONFIG_OF_MDIO)
David Daney25106022012-05-02 15:16:37 +0000265/**
266 * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
Randy Dunlapf41ef2e2012-06-08 14:07:19 +0000267 * @mdio_bus_np: Pointer to the mii_bus.
David Daney25106022012-05-02 15:16:37 +0000268 *
Russell Kinga1364422015-09-24 20:35:52 +0100269 * Returns a reference to the mii_bus, or NULL if none found. The
270 * embedded struct device will have its reference count incremented,
271 * and this must be put once the bus is finished with.
David Daney25106022012-05-02 15:16:37 +0000272 *
273 * Because the association of a device_node and mii_bus is made via
274 * of_mdiobus_register(), the mii_bus cannot be found before it is
275 * registered with of_mdiobus_register().
276 *
277 */
278struct mii_bus *of_mdio_find_bus(struct device_node *mdio_bus_np)
279{
280 struct device *d;
281
282 if (!mdio_bus_np)
283 return NULL;
284
Suzuki K Poulosecfba5de2019-07-23 23:18:33 +0100285 d = class_find_device_by_of_node(&mdio_bus_class, mdio_bus_np);
David Daney25106022012-05-02 15:16:37 +0000286 return d ? to_mii_bus(d) : NULL;
287}
288EXPORT_SYMBOL(of_mdio_find_bus);
Daniel Mackd9daa242014-06-28 01:23:35 +0200289
Andrew Lunnf03bc4a2016-01-06 20:11:24 +0100290/* Walk the list of subnodes of a mdio bus and look for a node that
291 * matches the mdio device's address with its 'reg' property. If
292 * found, set the of_node pointer for the mdio device. This allows
293 * auto-probed phy devices to be supplied with information passed in
294 * via DT.
Daniel Mackd9daa242014-06-28 01:23:35 +0200295 */
Andrew Lunnf03bc4a2016-01-06 20:11:24 +0100296static void of_mdiobus_link_mdiodev(struct mii_bus *bus,
297 struct mdio_device *mdiodev)
Daniel Mackd9daa242014-06-28 01:23:35 +0200298{
Andrew Lunnf03bc4a2016-01-06 20:11:24 +0100299 struct device *dev = &mdiodev->dev;
Daniel Mackd9daa242014-06-28 01:23:35 +0200300 struct device_node *child;
301
Andrew Lunne5a03bf2016-01-06 20:11:16 +0100302 if (dev->of_node || !bus->dev.of_node)
Daniel Mackd9daa242014-06-28 01:23:35 +0200303 return;
304
Andrew Lunne5a03bf2016-01-06 20:11:16 +0100305 for_each_available_child_of_node(bus->dev.of_node, child) {
Daniel Mackd9daa242014-06-28 01:23:35 +0200306 int addr;
Daniel Mackd9daa242014-06-28 01:23:35 +0200307
Jon Masond0a654002017-05-31 15:43:30 -0400308 addr = of_mdio_parse_addr(dev, child);
309 if (addr < 0)
Daniel Mackd9daa242014-06-28 01:23:35 +0200310 continue;
Daniel Mackd9daa242014-06-28 01:23:35 +0200311
Andrew Lunnf03bc4a2016-01-06 20:11:24 +0100312 if (addr == mdiodev->addr) {
Daniel Mackd9daa242014-06-28 01:23:35 +0200313 dev->of_node = child;
Russell King94a5ef12017-12-12 10:49:15 +0000314 dev->fwnode = of_fwnode_handle(child);
Daniel Mackd9daa242014-06-28 01:23:35 +0200315 return;
316 }
317 }
318}
319#else /* !IS_ENABLED(CONFIG_OF_MDIO) */
Andrew Lunnf03bc4a2016-01-06 20:11:24 +0100320static inline void of_mdiobus_link_mdiodev(struct mii_bus *mdio,
321 struct mdio_device *mdiodev)
Daniel Mackd9daa242014-06-28 01:23:35 +0200322{
323}
David Daney25106022012-05-02 15:16:37 +0000324#endif
325
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700326/**
Florian Fainellid0281a52017-03-28 12:57:09 -0700327 * mdiobus_create_device_from_board_info - create a full MDIO device given
328 * a mdio_board_info structure
329 * @bus: MDIO bus to create the devices on
330 * @bi: mdio_board_info structure describing the devices
331 *
332 * Returns 0 on success or < 0 on error.
333 */
334static int mdiobus_create_device(struct mii_bus *bus,
335 struct mdio_board_info *bi)
336{
337 struct mdio_device *mdiodev;
338 int ret = 0;
339
340 mdiodev = mdio_device_create(bus, bi->mdio_addr);
341 if (IS_ERR(mdiodev))
342 return -ENODEV;
343
344 strncpy(mdiodev->modalias, bi->modalias,
345 sizeof(mdiodev->modalias));
346 mdiodev->bus_match = mdio_device_bus_match;
347 mdiodev->dev.platform_data = (void *)bi->platform_data;
348
349 ret = mdio_device_register(mdiodev);
350 if (ret)
351 mdio_device_free(mdiodev);
352
353 return ret;
354}
355
356/**
Russell King59f06972015-09-25 11:56:56 +0100357 * __mdiobus_register - bring up all the PHYs on a given bus and attach them to bus
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800358 * @bus: target mii_bus
Russell King59f06972015-09-25 11:56:56 +0100359 * @owner: module containing bus accessor functions
Andy Fleminge1393452005-08-24 18:46:21 -0500360 *
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800361 * Description: Called by a bus driver to bring up all the PHYs
Russell King59f06972015-09-25 11:56:56 +0100362 * on a given bus, and attach them to the bus. Drivers should use
363 * mdiobus_register() rather than __mdiobus_register() unless they
Andrew Lunnf89df3f2016-01-06 20:11:25 +0100364 * need to pass a specific owner module. MDIO devices which are not
365 * PHYs will not be brought up by this function. They are expected to
366 * to be explicitly listed in DT and instantiated by of_mdiobus_register().
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800367 *
368 * Returns 0 on success or < 0 on error.
Andy Fleminge1393452005-08-24 18:46:21 -0500369 */
Russell King3e3aaf62015-09-24 20:36:02 +0100370int __mdiobus_register(struct mii_bus *bus, struct module *owner)
Andy Fleminge1393452005-08-24 18:46:21 -0500371{
Andrew Lunn711fdba2016-01-06 20:11:27 +0100372 struct mdio_device *mdiodev;
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800373 int i, err;
Roger Quadros69226892017-04-21 16:15:38 +0300374 struct gpio_desc *gpiod;
Andy Fleminge1393452005-08-24 18:46:21 -0500375
Andy Fleminge1393452005-08-24 18:46:21 -0500376 if (NULL == bus || NULL == bus->name ||
Sergei Shtylyov02d320c2014-01-05 03:18:27 +0300377 NULL == bus->read || NULL == bus->write)
Andy Fleminge1393452005-08-24 18:46:21 -0500378 return -EINVAL;
379
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700380 BUG_ON(bus->state != MDIOBUS_ALLOCATED &&
381 bus->state != MDIOBUS_UNREGISTERED);
382
Russell King3e3aaf62015-09-24 20:36:02 +0100383 bus->owner = owner;
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700384 bus->dev.parent = bus->parent;
385 bus->dev.class = &mdio_bus_class;
386 bus->dev.groups = NULL;
Stephen Hemminger036b6682009-02-26 10:19:36 +0000387 dev_set_name(&bus->dev, "%s", bus->id);
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700388
389 err = device_register(&bus->dev);
390 if (err) {
Joe Perches8d242482012-06-09 07:49:07 +0000391 pr_err("mii_bus %s failed to register\n", bus->id);
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700392 return -EINVAL;
393 }
394
Adrian Bunkd1e7fe42008-02-20 02:13:53 +0200395 mutex_init(&bus->mdio_lock);
396
Sergei Shtylyovd396e842017-06-12 23:55:38 +0300397 /* de-assert bus level PHY GPIO reset */
Sergei Shtylyovfe0e4052017-06-12 23:55:39 +0300398 gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_LOW);
Sergei Shtylyovd396e842017-06-12 23:55:38 +0300399 if (IS_ERR(gpiod)) {
Sergei Shtylyovfe0e4052017-06-12 23:55:39 +0300400 dev_err(&bus->dev, "mii_bus %s couldn't get reset GPIO\n",
401 bus->id);
Thomas Petazzonie40e2a22019-01-16 10:53:58 +0100402 device_del(&bus->dev);
Sergei Shtylyovfe0e4052017-06-12 23:55:39 +0300403 return PTR_ERR(gpiod);
404 } else if (gpiod) {
Sergei Shtylyovd396e842017-06-12 23:55:38 +0300405 bus->reset_gpiod = gpiod;
406
407 gpiod_set_value_cansleep(gpiod, 1);
408 udelay(bus->reset_delay_us);
409 gpiod_set_value_cansleep(gpiod, 0);
Roger Quadros69226892017-04-21 16:15:38 +0300410 }
411
Florian Fainellidf0c8d92017-05-11 11:24:16 -0700412 if (bus->reset)
413 bus->reset(bus);
414
Andy Fleminge1393452005-08-24 18:46:21 -0500415 for (i = 0; i < PHY_MAX_ADDR; i++) {
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200416 if ((bus->phy_mask & (1 << i)) == 0) {
417 struct phy_device *phydev;
Andy Fleminge1393452005-08-24 18:46:21 -0500418
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200419 phydev = mdiobus_scan(bus, i);
Marek Vasut70e927b2016-05-02 02:47:31 +0200420 if (IS_ERR(phydev) && (PTR_ERR(phydev) != -ENODEV)) {
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200421 err = PTR_ERR(phydev);
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800422 goto error;
423 }
Herbert Valerio Riedel64b1c2b2006-05-10 12:12:57 -0400424 }
Andy Fleminge1393452005-08-24 18:46:21 -0500425 }
426
Florian Fainellid0281a52017-03-28 12:57:09 -0700427 mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device);
Florian Fainelli648ea012017-02-04 13:02:44 -0800428
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800429 bus->state = MDIOBUS_REGISTERED;
Andy Fleminge1393452005-08-24 18:46:21 -0500430 pr_info("%s: probed\n", bus->name);
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800431 return 0;
Andy Fleminge1393452005-08-24 18:46:21 -0500432
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800433error:
434 while (--i >= 0) {
Andrew Lunn711fdba2016-01-06 20:11:27 +0100435 mdiodev = bus->mdio_map[i];
436 if (!mdiodev)
437 continue;
438
439 mdiodev->device_remove(mdiodev);
440 mdiodev->device_free(mdiodev);
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800441 }
Roger Quadros69226892017-04-21 16:15:38 +0300442
443 /* Put PHYs in RESET to save power */
Florian Fainellia010a2f2017-09-08 15:38:07 -0700444 if (bus->reset_gpiod)
445 gpiod_set_value_cansleep(bus->reset_gpiod, 1);
Roger Quadros69226892017-04-21 16:15:38 +0300446
Krzysztof Halasa161c8d22008-12-25 16:50:41 -0800447 device_del(&bus->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500448 return err;
449}
Russell King3e3aaf62015-09-24 20:36:02 +0100450EXPORT_SYMBOL(__mdiobus_register);
Andy Fleminge1393452005-08-24 18:46:21 -0500451
452void mdiobus_unregister(struct mii_bus *bus)
453{
Andrew Lunna9049e02016-01-06 20:11:26 +0100454 struct mdio_device *mdiodev;
Andy Fleminge1393452005-08-24 18:46:21 -0500455 int i;
456
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700457 BUG_ON(bus->state != MDIOBUS_REGISTERED);
458 bus->state = MDIOBUS_UNREGISTERED;
459
Andy Fleminge1393452005-08-24 18:46:21 -0500460 for (i = 0; i < PHY_MAX_ADDR; i++) {
Andrew Lunna9049e02016-01-06 20:11:26 +0100461 mdiodev = bus->mdio_map[i];
462 if (!mdiodev)
463 continue;
464
David Bauer6110ed22019-04-17 23:59:22 +0200465 if (mdiodev->reset_gpio)
466 gpiod_put(mdiodev->reset_gpio);
Sergei Shtylyovbafbdd52017-12-04 13:35:05 +0100467
Andrew Lunn711fdba2016-01-06 20:11:27 +0100468 mdiodev->device_remove(mdiodev);
469 mdiodev->device_free(mdiodev);
Andy Fleminge1393452005-08-24 18:46:21 -0500470 }
Roger Quadros69226892017-04-21 16:15:38 +0300471
472 /* Put PHYs in RESET to save power */
Florian Fainellia010a2f2017-09-08 15:38:07 -0700473 if (bus->reset_gpiod)
474 gpiod_set_value_cansleep(bus->reset_gpiod, 1);
Roger Quadros69226892017-04-21 16:15:38 +0300475
Mark Salterb6c6aed2015-09-01 09:36:05 -0400476 device_del(&bus->dev);
Andy Fleminge1393452005-08-24 18:46:21 -0500477}
478EXPORT_SYMBOL(mdiobus_unregister);
479
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700480/**
481 * mdiobus_free - free a struct mii_bus
482 * @bus: mii_bus to free
483 *
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700484 * This function releases the reference to the underlying device
485 * object in the mii_bus. If this is the last reference, the mii_bus
486 * will be freed.
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700487 */
488void mdiobus_free(struct mii_bus *bus)
489{
Sergei Shtylyov02d320c2014-01-05 03:18:27 +0300490 /* For compatibility with error handling in drivers. */
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700491 if (bus->state == MDIOBUS_ALLOCATED) {
492 kfree(bus);
493 return;
494 }
495
496 BUG_ON(bus->state != MDIOBUS_UNREGISTERED);
497 bus->state = MDIOBUS_RELEASED;
498
499 put_device(&bus->dev);
Lennert Buytenhek298cf9b2008-10-08 16:29:57 -0700500}
501EXPORT_SYMBOL(mdiobus_free);
502
Andrew Lunnf89df3f2016-01-06 20:11:25 +0100503/**
504 * mdiobus_scan - scan a bus for MDIO devices.
505 * @bus: mii_bus to scan
506 * @addr: address on bus to scan
507 *
508 * This function scans the MDIO bus, looking for devices which can be
509 * identified using a vendor/product ID in registers 2 and 3. Not all
510 * MDIO devices have such registers, but PHY devices typically
511 * do. Hence this function assumes anything found is a PHY, or can be
512 * treated as a PHY. Other MDIO devices, such as switches, will
513 * probably not be found during the scan.
514 */
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200515struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
516{
517 struct phy_device *phydev;
518 int err;
519
David Daneyac28b9f2012-06-27 07:33:35 +0000520 phydev = get_phy_device(bus, addr, false);
Sergei Shtylyov66c239e2016-04-24 20:30:53 +0300521 if (IS_ERR(phydev))
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200522 return phydev;
523
Daniel Mack86f6cf42014-05-24 09:34:26 +0200524 /*
525 * For DT, see if the auto-probed phy has a correspoding child
526 * in the bus node, and set the of_node pointer in this case.
527 */
Andrew Lunnf03bc4a2016-01-06 20:11:24 +0100528 of_mdiobus_link_mdiodev(bus, &phydev->mdio);
Daniel Mack86f6cf42014-05-24 09:34:26 +0200529
Grant Likely4dea5472009-04-25 12:52:46 +0000530 err = phy_device_register(phydev);
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200531 if (err) {
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200532 phy_device_free(phydev);
Sergei Shtylyove98a3aa2016-05-03 23:14:41 +0300533 return ERR_PTR(-ENODEV);
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200534 }
535
Lennert Buytenhek4fd5f812008-08-26 13:08:46 +0200536 return phydev;
537}
538EXPORT_SYMBOL(mdiobus_scan);
539
Randy Dunlapb3df0da2007-03-06 02:41:48 -0800540/**
Russell King34dc08e2018-01-02 10:58:27 +0000541 * __mdiobus_read - Unlocked version of the mdiobus_read function
542 * @bus: the mii_bus struct
543 * @addr: the phy address
544 * @regnum: register number to read
545 *
546 * Read a MDIO bus register. Caller must hold the mdio bus lock.
547 *
548 * NOTE: MUST NOT be called from interrupt context.
549 */
550int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
551{
552 int retval;
553
554 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
555
556 retval = bus->read(bus, addr, regnum);
557
558 trace_mdio_access(bus, 1, addr, regnum, retval, retval);
559
560 return retval;
561}
562EXPORT_SYMBOL(__mdiobus_read);
563
564/**
565 * __mdiobus_write - Unlocked version of the mdiobus_write function
566 * @bus: the mii_bus struct
567 * @addr: the phy address
568 * @regnum: register number to write
569 * @val: value to write to @regnum
570 *
571 * Write a MDIO bus register. Caller must hold the mdio bus lock.
572 *
573 * NOTE: MUST NOT be called from interrupt context.
574 */
575int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
576{
577 int err;
578
579 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
580
581 err = bus->write(bus, addr, regnum, val);
582
583 trace_mdio_access(bus, 0, addr, regnum, val, err);
584
585 return err;
586}
587EXPORT_SYMBOL(__mdiobus_write);
588
589/**
Neil Armstrong21dd19f2015-10-22 10:37:49 +0200590 * mdiobus_read_nested - Nested version of the mdiobus_read function
591 * @bus: the mii_bus struct
592 * @addr: the phy address
593 * @regnum: register number to read
594 *
595 * In case of nested MDIO bus access avoid lockdep false positives by
596 * using mutex_lock_nested().
597 *
598 * NOTE: MUST NOT be called from interrupt context,
599 * because the bus read/write functions may wait for an interrupt
600 * to conclude the operation.
601 */
602int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum)
603{
604 int retval;
605
606 BUG_ON(in_interrupt());
607
Andrew Lunn9a6f2b02016-04-11 21:40:05 +0200608 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
Russell King34dc08e2018-01-02 10:58:27 +0000609 retval = __mdiobus_read(bus, addr, regnum);
Neil Armstrong21dd19f2015-10-22 10:37:49 +0200610 mutex_unlock(&bus->mdio_lock);
611
612 return retval;
613}
614EXPORT_SYMBOL(mdiobus_read_nested);
615
616/**
Lennert Buytenhek2e888102008-09-29 17:12:35 +0000617 * mdiobus_read - Convenience function for reading a given MII mgmt register
618 * @bus: the mii_bus struct
619 * @addr: the phy address
620 * @regnum: register number to read
621 *
622 * NOTE: MUST NOT be called from interrupt context,
623 * because the bus read/write functions may wait for an interrupt
624 * to conclude the operation.
625 */
Jason Gunthorpeabf35df2010-03-09 09:17:42 +0000626int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
Lennert Buytenhek2e888102008-09-29 17:12:35 +0000627{
628 int retval;
629
630 BUG_ON(in_interrupt());
631
632 mutex_lock(&bus->mdio_lock);
Russell King34dc08e2018-01-02 10:58:27 +0000633 retval = __mdiobus_read(bus, addr, regnum);
Lennert Buytenhek2e888102008-09-29 17:12:35 +0000634 mutex_unlock(&bus->mdio_lock);
635
636 return retval;
637}
638EXPORT_SYMBOL(mdiobus_read);
639
640/**
Neil Armstrong21dd19f2015-10-22 10:37:49 +0200641 * mdiobus_write_nested - Nested version of the mdiobus_write function
642 * @bus: the mii_bus struct
643 * @addr: the phy address
644 * @regnum: register number to write
645 * @val: value to write to @regnum
646 *
647 * In case of nested MDIO bus access avoid lockdep false positives by
648 * using mutex_lock_nested().
649 *
650 * NOTE: MUST NOT be called from interrupt context,
651 * because the bus read/write functions may wait for an interrupt
652 * to conclude the operation.
653 */
654int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val)
655{
656 int err;
657
658 BUG_ON(in_interrupt());
659
Andrew Lunn9a6f2b02016-04-11 21:40:05 +0200660 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
Russell King34dc08e2018-01-02 10:58:27 +0000661 err = __mdiobus_write(bus, addr, regnum, val);
Neil Armstrong21dd19f2015-10-22 10:37:49 +0200662 mutex_unlock(&bus->mdio_lock);
663
664 return err;
665}
666EXPORT_SYMBOL(mdiobus_write_nested);
667
668/**
Lennert Buytenhek2e888102008-09-29 17:12:35 +0000669 * mdiobus_write - Convenience function for writing a given MII mgmt register
670 * @bus: the mii_bus struct
671 * @addr: the phy address
672 * @regnum: register number to write
673 * @val: value to write to @regnum
674 *
675 * NOTE: MUST NOT be called from interrupt context,
676 * because the bus read/write functions may wait for an interrupt
677 * to conclude the operation.
678 */
Jason Gunthorpeabf35df2010-03-09 09:17:42 +0000679int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
Lennert Buytenhek2e888102008-09-29 17:12:35 +0000680{
681 int err;
682
683 BUG_ON(in_interrupt());
684
685 mutex_lock(&bus->mdio_lock);
Russell King34dc08e2018-01-02 10:58:27 +0000686 err = __mdiobus_write(bus, addr, regnum, val);
Lennert Buytenhek2e888102008-09-29 17:12:35 +0000687 mutex_unlock(&bus->mdio_lock);
688
689 return err;
690}
691EXPORT_SYMBOL(mdiobus_write);
692
693/**
Andrew Lunne76a4952016-01-06 20:11:23 +0100694 * mdio_bus_match - determine if given MDIO driver supports the given
695 * MDIO device
696 * @dev: target MDIO device
697 * @drv: given MDIO driver
Andy Fleming00db8182005-07-30 19:31:23 -0400698 *
Andrew Lunne76a4952016-01-06 20:11:23 +0100699 * Description: Given a MDIO device, and a MDIO driver, return 1 if
700 * the driver supports the device. Otherwise, return 0. This may
701 * require calling the devices own match function, since different classes
702 * of MDIO devices have different match criteria.
Andy Fleming00db8182005-07-30 19:31:23 -0400703 */
704static int mdio_bus_match(struct device *dev, struct device_driver *drv)
705{
Andrew Lunne76a4952016-01-06 20:11:23 +0100706 struct mdio_device *mdio = to_mdio_device(dev);
Andy Fleming00db8182005-07-30 19:31:23 -0400707
David Daneya30e2c12012-06-27 07:33:37 +0000708 if (of_driver_match_device(dev, drv))
709 return 1;
710
Andrew Lunne76a4952016-01-06 20:11:23 +0100711 if (mdio->bus_match)
712 return mdio->bus_match(dev, drv);
David Daneya30e2c12012-06-27 07:33:37 +0000713
Andrew Lunne76a4952016-01-06 20:11:23 +0100714 return 0;
Andy Fleming00db8182005-07-30 19:31:23 -0400715}
716
Russell King1b8f8692017-05-30 21:38:18 +0100717static int mdio_uevent(struct device *dev, struct kobj_uevent_env *env)
718{
719 int rc;
720
721 /* Some devices have extra OF data and an OF-style MODALIAS */
722 rc = of_device_uevent_modalias(dev, env);
723 if (rc != -ENODEV)
724 return rc;
725
726 return 0;
727}
728
Andy Fleming00db8182005-07-30 19:31:23 -0400729struct bus_type mdio_bus_type = {
730 .name = "mdio_bus",
731 .match = mdio_bus_match,
Russell King1b8f8692017-05-30 21:38:18 +0100732 .uevent = mdio_uevent,
Andy Fleming00db8182005-07-30 19:31:23 -0400733};
Vitaly Bordug11b0bac2006-08-14 23:00:29 -0700734EXPORT_SYMBOL(mdio_bus_type);
Andy Fleming00db8182005-07-30 19:31:23 -0400735
Jeff Garzik67c4f3f2005-08-11 02:07:25 -0400736int __init mdio_bus_init(void)
Andy Fleming00db8182005-07-30 19:31:23 -0400737{
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700738 int ret;
739
740 ret = class_register(&mdio_bus_class);
741 if (!ret) {
742 ret = bus_register(&mdio_bus_type);
743 if (ret)
744 class_unregister(&mdio_bus_class);
745 }
746
747 return ret;
Andy Fleming00db8182005-07-30 19:31:23 -0400748}
Florian Fainelli90eff902017-03-23 10:01:19 -0700749EXPORT_SYMBOL_GPL(mdio_bus_init);
Andy Fleming00db8182005-07-30 19:31:23 -0400750
Florian Fainelli90eff902017-03-23 10:01:19 -0700751#if IS_ENABLED(CONFIG_PHYLIB)
Peter Chubbdc85dec2005-09-03 14:05:06 -0700752void mdio_bus_exit(void)
Andy Fleminge1393452005-08-24 18:46:21 -0500753{
Lennert Buytenhek46abc022008-10-08 16:33:40 -0700754 class_unregister(&mdio_bus_class);
Andy Fleminge1393452005-08-24 18:46:21 -0500755 bus_unregister(&mdio_bus_type);
756}
Florian Fainelli90eff902017-03-23 10:01:19 -0700757EXPORT_SYMBOL_GPL(mdio_bus_exit);
758#else
759module_init(mdio_bus_init);
760/* no module_exit, intentional */
761MODULE_LICENSE("GPL");
762MODULE_DESCRIPTION("MDIO bus/device layer");
763#endif