else {
stmmac_set_mac(priv->ioaddr, false);
/* Disable clock in case of PWM is off */
- if ((priv->plat) && (priv->plat->bsp_priv)) {
- struct bsp_priv * bsp_priv = priv->plat->bsp_priv;
- if ((bsp_priv) && (bsp_priv->gmac_clk_enable)) {
- bsp_priv->gmac_clk_enable(false);
+ if ((priv->plat) && (priv->plat->bsp_priv)) {
+ struct bsp_priv * bsp_priv = priv->plat->bsp_priv;
+ if (bsp_priv) {
+ if (bsp_priv->gmac_clk_enable) {
+ bsp_priv->gmac_clk_enable(false);
+ }
+ if (bsp_priv->phy_power_on) {
+ bsp_priv->phy_power_on(false);
+ }
+ }
}
}
-
- }
spin_unlock_irqrestore(&priv->lock, flags);
return 0;
}
/* enable the clk prevously disabled */
if ((priv->plat) && (priv->plat->bsp_priv)) {
struct bsp_priv * bsp_priv = priv->plat->bsp_priv;
- if ((bsp_priv) && (bsp_priv->gmac_clk_enable)) {
- bsp_priv->gmac_clk_enable(true);
+ if (bsp_priv) {
+ if (bsp_priv->gmac_clk_enable) {
+ bsp_priv->gmac_clk_enable(true);
+ }
+ if (bsp_priv->phy_power_on) {
+ bsp_priv->phy_power_on(true);
+ }
}
}
}
}
}
regulator_put(ldo);
- msleep(100);
-
- if (enable) {
- //reset
- if (gpio_is_valid(bsp_priv->reset_io)) {
- gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level);
- msleep(10);
- gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level);
- }
-
- msleep(100);
- } else {
- //pull up reset
- if (gpio_is_valid(bsp_priv->reset_io)) {
- gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level);
- }
- }
-
}
return 0;
if (gpio_is_valid(bsp_priv->power_io)) {
gpio_direction_output(bsp_priv->power_io, bsp_priv->power_io_level);
}
-
- //reset
- if (gpio_is_valid(bsp_priv->reset_io)) {
- gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level);
- msleep(10);
- gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level);
- }
- msleep(100);
} else {
//power off
if (gpio_is_valid(bsp_priv->power_io)) {
gpio_direction_output(bsp_priv->power_io, !bsp_priv->power_io_level);
}
- //pull down reset
- if (gpio_is_valid(bsp_priv->reset_io)) {
- gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level);
- }
}
return 0;
static int phy_power_on(bool enable)
{
struct bsp_priv *bsp_priv = &g_bsp_priv;
+ int ret = -1;
+
printk("%s: enable = %d \n", __func__, enable);
if (bsp_priv->power_ctrl_by_pmu) {
- return power_on_by_pmu(enable);
+ ret = power_on_by_pmu(enable);
} else {
- return power_on_by_gpio(enable);
+ ret = power_on_by_gpio(enable);
}
+
+ if (enable) {
+ //reset
+ if (gpio_is_valid(bsp_priv->reset_io)) {
+ gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level);
+ mdelay(5);
+ gpio_direction_output(bsp_priv->reset_io, !bsp_priv->reset_io_level);
+ }
+ mdelay(30);
+
+ } else {
+ //pull down reset
+ if (gpio_is_valid(bsp_priv->reset_io)) {
+ gpio_direction_output(bsp_priv->reset_io, bsp_priv->reset_io_level);
+ }
+ }
+
+ return ret;
}
int stmmc_pltfr_init(struct platform_device *pdev) {