Skip to content

Commit 71dd6c0

Browse files
blocktrrondavem330
authored andcommitted
net: phy: add support for reset-controller
This commit adds support for PHY reset pins handled by a reset controller. Signed-off-by: David Bauer <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b54dd90 commit 71dd6c0

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

drivers/net/phy/mdio_bus.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <linux/of_gpio.h>
2525
#include <linux/netdevice.h>
2626
#include <linux/etherdevice.h>
27+
#include <linux/reset.h>
2728
#include <linux/skbuff.h>
2829
#include <linux/spinlock.h>
2930
#include <linux/mm.h>
@@ -57,8 +58,23 @@ static int mdiobus_register_gpiod(struct mdio_device *mdiodev)
5758

5859
mdiodev->reset = gpiod;
5960

60-
/* Assert the reset signal again */
61-
mdio_device_reset(mdiodev, 1);
61+
return 0;
62+
}
63+
64+
static 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;
6278

6379
return 0;
6480
}
@@ -74,6 +90,13 @@ int mdiobus_register_device(struct mdio_device *mdiodev)
7490
err = mdiobus_register_gpiod(mdiodev);
7591
if (err)
7692
return err;
93+
94+
err = mdiobus_register_reset(mdiodev);
95+
if (err)
96+
return err;
97+
98+
/* Assert the reset signal */
99+
mdio_device_reset(mdiodev, 1);
77100
}
78101

79102
mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev;

drivers/net/phy/mdio_device.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/mii.h>
1717
#include <linux/module.h>
1818
#include <linux/phy.h>
19+
#include <linux/reset.h>
1920
#include <linux/slab.h>
2021
#include <linux/string.h>
2122
#include <linux/unistd.h>
@@ -116,10 +117,18 @@ void mdio_device_reset(struct mdio_device *mdiodev, int value)
116117
{
117118
unsigned int d;
118119

119-
if (!mdiodev->reset)
120+
if (!mdiodev->reset && !mdiodev->reset_ctrl)
120121
return;
121122

122-
gpiod_set_value(mdiodev->reset, value);
123+
if (mdiodev->reset)
124+
gpiod_set_value(mdiodev->reset, 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+
}
123132

124133
d = value ? mdiodev->reset_assert_delay : mdiodev->reset_deassert_delay;
125134
if (d)

include/linux/mdio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct mdio_device {
4040
int addr;
4141
int flags;
4242
struct gpio_desc *reset;
43+
struct reset_control *reset_ctrl;
4344
unsigned int reset_assert_delay;
4445
unsigned int reset_deassert_delay;
4546
};

0 commit comments

Comments
 (0)