Skip to content

Commit

Permalink
net: phy: add support for reset-controller
Browse files Browse the repository at this point in the history
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]>
  • Loading branch information
blocktrron authored and davem330 committed Apr 19, 2019
1 parent b54dd90 commit 71dd6c0
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
27 changes: 25 additions & 2 deletions drivers/net/phy/mdio_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <linux/of_gpio.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/reset.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/mm.h>
Expand Down Expand Up @@ -57,8 +58,23 @@ static int mdiobus_register_gpiod(struct mdio_device *mdiodev)

mdiodev->reset = gpiod;

/* Assert the reset signal again */
mdio_device_reset(mdiodev, 1);
return 0;
}

static int mdiobus_register_reset(struct mdio_device *mdiodev)
{
struct reset_control *reset = NULL;

if (mdiodev->dev.of_node)
reset = devm_reset_control_get_exclusive(&mdiodev->dev,
"phy");
if (PTR_ERR(reset) == -ENOENT ||
PTR_ERR(reset) == -ENOTSUPP)
reset = NULL;
else if (IS_ERR(reset))
return PTR_ERR(reset);

mdiodev->reset_ctrl = reset;

return 0;
}
Expand All @@ -74,6 +90,13 @@ int mdiobus_register_device(struct mdio_device *mdiodev)
err = mdiobus_register_gpiod(mdiodev);
if (err)
return err;

err = mdiobus_register_reset(mdiodev);
if (err)
return err;

/* Assert the reset signal */
mdio_device_reset(mdiodev, 1);
}

mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev;
Expand Down
13 changes: 11 additions & 2 deletions drivers/net/phy/mdio_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/mii.h>
#include <linux/module.h>
#include <linux/phy.h>
#include <linux/reset.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/unistd.h>
Expand Down Expand Up @@ -116,10 +117,18 @@ void mdio_device_reset(struct mdio_device *mdiodev, int value)
{
unsigned int d;

if (!mdiodev->reset)
if (!mdiodev->reset && !mdiodev->reset_ctrl)
return;

gpiod_set_value(mdiodev->reset, value);
if (mdiodev->reset)
gpiod_set_value(mdiodev->reset, value);

if (mdiodev->reset_ctrl) {
if (value)
reset_control_assert(mdiodev->reset_ctrl);
else
reset_control_deassert(mdiodev->reset_ctrl);
}

d = value ? mdiodev->reset_assert_delay : mdiodev->reset_deassert_delay;
if (d)
Expand Down
1 change: 1 addition & 0 deletions include/linux/mdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ struct mdio_device {
int addr;
int flags;
struct gpio_desc *reset;
struct reset_control *reset_ctrl;
unsigned int reset_assert_delay;
unsigned int reset_deassert_delay;
};
Expand Down

0 comments on commit 71dd6c0

Please sign in to comment.