aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/phy/mdio_bus.c49
-rw-r--r--drivers/net/phy/phy.c49
-rw-r--r--include/linux/phy.h46
3 files changed, 87 insertions, 57 deletions
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index fb4c0965b152..6671e2da0d57 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -211,6 +211,55 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
211EXPORT_SYMBOL(mdiobus_scan); 211EXPORT_SYMBOL(mdiobus_scan);
212 212
213/** 213/**
214 * mdiobus_read - Convenience function for reading a given MII mgmt register
215 * @bus: the mii_bus struct
216 * @addr: the phy address
217 * @regnum: register number to read
218 *
219 * NOTE: MUST NOT be called from interrupt context,
220 * because the bus read/write functions may wait for an interrupt
221 * to conclude the operation.
222 */
223int mdiobus_read(struct mii_bus *bus, int addr, u16 regnum)
224{
225 int retval;
226
227 BUG_ON(in_interrupt());
228
229 mutex_lock(&bus->mdio_lock);
230 retval = bus->read(bus, addr, regnum);
231 mutex_unlock(&bus->mdio_lock);
232
233 return retval;
234}
235EXPORT_SYMBOL(mdiobus_read);
236
237/**
238 * mdiobus_write - Convenience function for writing a given MII mgmt register
239 * @bus: the mii_bus struct
240 * @addr: the phy address
241 * @regnum: register number to write
242 * @val: value to write to @regnum
243 *
244 * NOTE: MUST NOT be called from interrupt context,
245 * because the bus read/write functions may wait for an interrupt
246 * to conclude the operation.
247 */
248int mdiobus_write(struct mii_bus *bus, int addr, u16 regnum, u16 val)
249{
250 int err;
251
252 BUG_ON(in_interrupt());
253
254 mutex_lock(&bus->mdio_lock);
255 err = bus->write(bus, addr, regnum, val);
256 mutex_unlock(&bus->mdio_lock);
257
258 return err;
259}
260EXPORT_SYMBOL(mdiobus_write);
261
262/**
214 * mdio_bus_match - determine if given PHY driver supports the given PHY device 263 * mdio_bus_match - determine if given PHY driver supports the given PHY device
215 * @dev: target PHY device 264 * @dev: target PHY device
216 * @drv: given PHY driver 265 * @drv: given PHY driver
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 20cc82c78137..df4e6257d4a7 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -58,55 +58,6 @@ EXPORT_SYMBOL(phy_print_status);
58 58
59 59
60/** 60/**
61 * phy_read - Convenience function for reading a given PHY register
62 * @phydev: the phy_device struct
63 * @regnum: register number to read
64 *
65 * NOTE: MUST NOT be called from interrupt context,
66 * because the bus read/write functions may wait for an interrupt
67 * to conclude the operation.
68 */
69int phy_read(struct phy_device *phydev, u16 regnum)
70{
71 int retval;
72 struct mii_bus *bus = phydev->bus;
73
74 BUG_ON(in_interrupt());
75
76 mutex_lock(&bus->mdio_lock);
77 retval = bus->read(bus, phydev->addr, regnum);
78 mutex_unlock(&bus->mdio_lock);
79
80 return retval;
81}
82EXPORT_SYMBOL(phy_read);
83
84/**
85 * phy_write - Convenience function for writing a given PHY register
86 * @phydev: the phy_device struct
87 * @regnum: register number to write
88 * @val: value to write to @regnum
89 *
90 * NOTE: MUST NOT be called from interrupt context,
91 * because the bus read/write functions may wait for an interrupt
92 * to conclude the operation.
93 */
94int phy_write(struct phy_device *phydev, u16 regnum, u16 val)
95{
96 int err;
97 struct mii_bus *bus = phydev->bus;
98
99 BUG_ON(in_interrupt());
100
101 mutex_lock(&bus->mdio_lock);
102 err = bus->write(bus, phydev->addr, regnum, val);
103 mutex_unlock(&bus->mdio_lock);
104
105 return err;
106}
107EXPORT_SYMBOL(phy_write);
108
109/**
110 * phy_clear_interrupt - Ack the phy device's interrupt 61 * phy_clear_interrupt - Ack the phy device's interrupt
111 * @phydev: the phy_device struct 62 * @phydev: the phy_device struct
112 * 63 *
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 891f27f9137e..77c4ed60b982 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -122,6 +122,15 @@ struct mii_bus {
122}; 122};
123#define to_mii_bus(d) container_of(d, struct mii_bus, dev) 123#define to_mii_bus(d) container_of(d, struct mii_bus, dev)
124 124
125struct mii_bus *mdiobus_alloc(void);
126int mdiobus_register(struct mii_bus *bus);
127void mdiobus_unregister(struct mii_bus *bus);
128void mdiobus_free(struct mii_bus *bus);
129struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
130int mdiobus_read(struct mii_bus *bus, int addr, u16 regnum);
131int mdiobus_write(struct mii_bus *bus, int addr, u16 regnum, u16 val);
132
133
125#define PHY_INTERRUPT_DISABLED 0x0 134#define PHY_INTERRUPT_DISABLED 0x0
126#define PHY_INTERRUPT_ENABLED 0x80000000 135#define PHY_INTERRUPT_ENABLED 0x80000000
127 136
@@ -399,8 +408,35 @@ struct phy_fixup {
399 int (*run)(struct phy_device *phydev); 408 int (*run)(struct phy_device *phydev);
400}; 409};
401 410
402int phy_read(struct phy_device *phydev, u16 regnum); 411/**
403int phy_write(struct phy_device *phydev, u16 regnum, u16 val); 412 * phy_read - Convenience function for reading a given PHY register
413 * @phydev: the phy_device struct
414 * @regnum: register number to read
415 *
416 * NOTE: MUST NOT be called from interrupt context,
417 * because the bus read/write functions may wait for an interrupt
418 * to conclude the operation.
419 */
420static inline int phy_read(struct phy_device *phydev, u16 regnum)
421{
422 return mdiobus_read(phydev->bus, phydev->addr, regnum);
423}
424
425/**
426 * phy_write - Convenience function for writing a given PHY register
427 * @phydev: the phy_device struct
428 * @regnum: register number to write
429 * @val: value to write to @regnum
430 *
431 * NOTE: MUST NOT be called from interrupt context,
432 * because the bus read/write functions may wait for an interrupt
433 * to conclude the operation.
434 */
435static inline int phy_write(struct phy_device *phydev, u16 regnum, u16 val)
436{
437 return mdiobus_write(phydev->bus, phydev->addr, regnum, val);
438}
439
404int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); 440int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id);
405struct phy_device* get_phy_device(struct mii_bus *bus, int addr); 441struct phy_device* get_phy_device(struct mii_bus *bus, int addr);
406int phy_clear_interrupt(struct phy_device *phydev); 442int phy_clear_interrupt(struct phy_device *phydev);
@@ -416,12 +452,6 @@ void phy_start(struct phy_device *phydev);
416void phy_stop(struct phy_device *phydev); 452void phy_stop(struct phy_device *phydev);
417int phy_start_aneg(struct phy_device *phydev); 453int phy_start_aneg(struct phy_device *phydev);
418 454
419struct mii_bus *mdiobus_alloc(void);
420int mdiobus_register(struct mii_bus *bus);
421void mdiobus_unregister(struct mii_bus *bus);
422void mdiobus_free(struct mii_bus *bus);
423struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
424
425void phy_sanitize_settings(struct phy_device *phydev); 455void phy_sanitize_settings(struct phy_device *phydev);
426int phy_stop_interrupts(struct phy_device *phydev); 456int phy_stop_interrupts(struct phy_device *phydev);
427int phy_enable_interrupts(struct phy_device *phydev); 457int phy_enable_interrupts(struct phy_device *phydev);