diff --git a/drivers/power/regulator/pbias_regulator.c b/drivers/power/regulator/pbias_regulator.c index 366f97b38b..4ed3c94e03 100644 --- a/drivers/power/regulator/pbias_regulator.c +++ b/drivers/power/regulator/pbias_regulator.c @@ -14,6 +14,11 @@ #include #include #include +#ifdef CONFIG_MMC_OMAP36XX_PINS +#include +#include +#include +#endif struct pbias_reg_info { u32 enable; @@ -223,8 +228,11 @@ static int pbias_regulator_get_value(struct udevice *dev) static int pbias_regulator_set_value(struct udevice *dev, int uV) { const struct pbias_reg_info *p = dev_get_priv(dev); - int rc; + int rc, ret; u32 reg; +#ifdef CONFIG_MMC_OMAP36XX_PINS + u32 wkup_ctrl = readl(OMAP34XX_CTRL_WKUP_CTRL); +#endif rc = pmic_read(dev->parent, 0, (uint8_t *)®, sizeof(reg)); if (rc) @@ -240,7 +248,23 @@ static int pbias_regulator_set_value(struct udevice *dev, int uV) debug("Setting %s voltage to %s\n", p->name, (reg & p->vmode) ? "3.0v" : "1.8v"); - return pmic_write(dev->parent, 0, (uint8_t *)®, sizeof(reg)); +#ifdef CONFIG_MMC_OMAP36XX_PINS + if (get_cpu_family() == CPU_OMAP36XX) { + /* Disable extended drain IO before changing PBIAS */ + wkup_ctrl &= ~OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ; + writel(wkup_ctrl, OMAP34XX_CTRL_WKUP_CTRL); + } +#endif + ret = pmic_write(dev->parent, 0, (uint8_t *)®, sizeof(reg)); +#ifdef CONFIG_MMC_OMAP36XX_PINS + if (get_cpu_family() == CPU_OMAP36XX) { + /* Enable extended drain IO after changing PBIAS */ + writel(wkup_ctrl | + OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ, + OMAP34XX_CTRL_WKUP_CTRL); + } +#endif + return ret; } static int pbias_regulator_get_enable(struct udevice *dev) @@ -264,9 +288,20 @@ static int pbias_regulator_set_enable(struct udevice *dev, bool enable) const struct pbias_reg_info *p = dev_get_priv(dev); int rc; u32 reg; +#ifdef CONFIG_MMC_OMAP36XX_PINS + u32 wkup_ctrl = readl(OMAP34XX_CTRL_WKUP_CTRL); +#endif debug("Turning %s %s\n", enable ? "on" : "off", p->name); +#ifdef CONFIG_MMC_OMAP36XX_PINS + if (get_cpu_family() == CPU_OMAP36XX) { + /* Disable extended drain IO before changing PBIAS */ + wkup_ctrl &= ~OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ; + writel(wkup_ctrl, OMAP34XX_CTRL_WKUP_CTRL); + } +#endif + rc = pmic_read(dev->parent, 0, (uint8_t *)®, sizeof(reg)); if (rc) return rc; @@ -278,6 +313,16 @@ static int pbias_regulator_set_enable(struct udevice *dev, bool enable) reg |= p->disable_val; rc = pmic_write(dev->parent, 0, (uint8_t *)®, sizeof(reg)); + +#ifdef CONFIG_MMC_OMAP36XX_PINS + if (get_cpu_family() == CPU_OMAP36XX) { + /* Enable extended drain IO after changing PBIAS */ + writel(wkup_ctrl | + OMAP34XX_CTRL_WKUP_CTRL_GPIO_IO_PWRDNZ, + OMAP34XX_CTRL_WKUP_CTRL); + } +#endif + if (rc) return rc;