diff options
-rw-r--r-- | drivers/net/phy/mdio_bus.c | 49 | ||||
-rw-r--r-- | drivers/net/phy/phy.c | 49 | ||||
-rw-r--r-- | include/linux/phy.h | 46 |
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) | |||
211 | EXPORT_SYMBOL(mdiobus_scan); | 211 | EXPORT_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 | */ | ||
223 | int 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 | } | ||
235 | EXPORT_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 | */ | ||
248 | int 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 | } | ||
260 | EXPORT_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 | */ | ||
69 | int 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 | } | ||
82 | EXPORT_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 | */ | ||
94 | int 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 | } | ||
107 | EXPORT_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 | ||
125 | struct mii_bus *mdiobus_alloc(void); | ||
126 | int mdiobus_register(struct mii_bus *bus); | ||
127 | void mdiobus_unregister(struct mii_bus *bus); | ||
128 | void mdiobus_free(struct mii_bus *bus); | ||
129 | struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); | ||
130 | int mdiobus_read(struct mii_bus *bus, int addr, u16 regnum); | ||
131 | int 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 | ||
402 | int phy_read(struct phy_device *phydev, u16 regnum); | 411 | /** |
403 | int 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 | */ | ||
420 | static 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 | */ | ||
435 | static 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 | |||
404 | int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); | 440 | int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); |
405 | struct phy_device* get_phy_device(struct mii_bus *bus, int addr); | 441 | struct phy_device* get_phy_device(struct mii_bus *bus, int addr); |
406 | int phy_clear_interrupt(struct phy_device *phydev); | 442 | int phy_clear_interrupt(struct phy_device *phydev); |
@@ -416,12 +452,6 @@ void phy_start(struct phy_device *phydev); | |||
416 | void phy_stop(struct phy_device *phydev); | 452 | void phy_stop(struct phy_device *phydev); |
417 | int phy_start_aneg(struct phy_device *phydev); | 453 | int phy_start_aneg(struct phy_device *phydev); |
418 | 454 | ||
419 | struct mii_bus *mdiobus_alloc(void); | ||
420 | int mdiobus_register(struct mii_bus *bus); | ||
421 | void mdiobus_unregister(struct mii_bus *bus); | ||
422 | void mdiobus_free(struct mii_bus *bus); | ||
423 | struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); | ||
424 | |||
425 | void phy_sanitize_settings(struct phy_device *phydev); | 455 | void phy_sanitize_settings(struct phy_device *phydev); |
426 | int phy_stop_interrupts(struct phy_device *phydev); | 456 | int phy_stop_interrupts(struct phy_device *phydev); |
427 | int phy_enable_interrupts(struct phy_device *phydev); | 457 | int phy_enable_interrupts(struct phy_device *phydev); |