On ar933x and later chips, there are separated mac/mdio resets, but
resetting the entire gmac block with register values requires both
mac_reset and mdio_reset to be asserted together.
Add support for optional mdio reset so that we can do a full reset
if needed.
This patch also replaced deprecated devm_reset_control_get for
mac reset.
To use this feature, the following is needed:
1. drop "simple-mfd" compatible to register mdio0 after gmac init
so that mdio registers aren't reset after initialization.
2. move mdio reset from mdio-bus to its parent eth node.
NOTE: This can't be applied on gmac1 with builtin switch since we
haven't add a feature to defer probe if phy connection failed.
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
struct timer_list oom_timer;
struct reset_control *mac_reset;
struct timer_list oom_timer;
struct reset_control *mac_reset;
+ struct reset_control *mdio_reset;
u32 fifodata[3];
u32 plldata[3];
u32 fifodata[3];
u32 plldata[3];
udelay(20);
reset_control_assert(ag->mac_reset);
udelay(20);
reset_control_assert(ag->mac_reset);
+ if (ag->mdio_reset)
+ reset_control_assert(ag->mdio_reset);
msleep(100);
reset_control_deassert(ag->mac_reset);
msleep(100);
reset_control_deassert(ag->mac_reset);
+ if (ag->mdio_reset)
+ reset_control_deassert(ag->mdio_reset);
msleep(200);
ag71xx_hw_setup(ag);
msleep(200);
ag71xx_hw_setup(ag);
AG71XX_DEFAULT_MSG_ENABLE);
spin_lock_init(&ag->lock);
AG71XX_DEFAULT_MSG_ENABLE);
spin_lock_init(&ag->lock);
- ag->mac_reset = devm_reset_control_get(&pdev->dev, "mac");
+ ag->mac_reset = devm_reset_control_get_exclusive(&pdev->dev, "mac");
if (IS_ERR(ag->mac_reset)) {
dev_err(&pdev->dev, "missing mac reset\n");
return PTR_ERR(ag->mac_reset);
}
if (IS_ERR(ag->mac_reset)) {
dev_err(&pdev->dev, "missing mac reset\n");
return PTR_ERR(ag->mac_reset);
}
+ ag->mdio_reset = devm_reset_control_get_optional_exclusive(&pdev->dev, "mdio");
+
if (of_property_read_u32_array(np, "fifo-data", ag->fifodata, 3)) {
if (of_device_is_compatible(np, "qca,ar9130-eth") ||
of_device_is_compatible(np, "qca,ar7100-eth")) {
if (of_property_read_u32_array(np, "fifo-data", ag->fifodata, 3)) {
if (of_device_is_compatible(np, "qca,ar9130-eth") ||
of_device_is_compatible(np, "qca,ar7100-eth")) {