diff mbox

OMAP4: MMC: fix power and audio issue, decouple USBC1 from MMC1

Message ID 1311276543-9374-1-git-send-email-bryan.buckley@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Bryan Buckley July 21, 2011, 7:29 p.m. UTC
Remove OMAP4_USBC1_ICUSB_PWRDNZ_MASK during enable/disable PWRDNZ mode for
MMC1_PBIAS and associated extended-drain MMC1 I/O cell. This is in accordance
with the control module programming guide. This fixes a bug where if trying to
use gpio_98 or gpio_99 and MMC1 at the same time the GPIO signal will be
affected by a changing SDMMC1_VDDS.

Software must keep MMC1_PBIAS cell and MMC1_IO cell PWRDNZ signals low whenever
SDMMC1_VDDS ramps up/down or changes for cell protection purposes.

MMC1 is based on SDMMC1_VDDS whereas USBC1 is based on SIM_VDDS therefore
they can operate independently.

Signed-off-by: Bryan Buckley <bryan.buckley@ti.com>
---
 arch/arm/mach-omap2/hsmmc.c |   12 ++++--------
 1 files changed, 4 insertions(+), 8 deletions(-)

Comments

kishore kadiyala July 22, 2011, 12:30 p.m. UTC | #1
On Fri, Jul 22, 2011 at 12:59 AM, Bryan Buckley <bryan.buckley@ti.com> wrote:
> Remove OMAP4_USBC1_ICUSB_PWRDNZ_MASK during enable/disable PWRDNZ mode for
> MMC1_PBIAS and associated extended-drain MMC1 I/O cell. This is in accordance
> with the control module programming guide. This fixes a bug where if trying to
> use gpio_98 or gpio_99 and MMC1 at the same time the GPIO signal will be
> affected by a changing SDMMC1_VDDS.
>
> Software must keep MMC1_PBIAS cell and MMC1_IO cell PWRDNZ signals low whenever
> SDMMC1_VDDS ramps up/down or changes for cell protection purposes.
>
> MMC1 is based on SDMMC1_VDDS whereas USBC1 is based on SIM_VDDS therefore
> they can operate independently.
>
> Signed-off-by: Bryan Buckley <bryan.buckley@ti.com>

Good catch,

Acked-by:  Kishore Kadiyala <kishore.kadiyala@ti.com>

> ---
>  arch/arm/mach-omap2/hsmmc.c |   12 ++++--------
>  1 files changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
> index 3842405..a6135df 100644
> --- a/arch/arm/mach-omap2/hsmmc.c
> +++ b/arch/arm/mach-omap2/hsmmc.c
> @@ -144,8 +144,7 @@ static void omap4_hsmmc1_before_set_reg(struct device *dev, int slot,
>         */
>        reg = omap4_ctrl_pad_readl(control_pbias_offset);
>        reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
> -               OMAP4_MMC1_PWRDNZ_MASK |
> -               OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
> +               OMAP4_MMC1_PWRDNZ_MASK);
>        omap4_ctrl_pad_writel(reg, control_pbias_offset);
>  }
>
> @@ -165,8 +164,7 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
>                else
>                        reg |= OMAP4_MMC1_PBIASLITE_VMODE_MASK;
>                reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
> -                       OMAP4_MMC1_PWRDNZ_MASK |
> -                       OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
> +                       OMAP4_MMC1_PWRDNZ_MASK);
>                omap4_ctrl_pad_writel(reg, control_pbias_offset);
>                /* 4 microsec delay for comparator to generate an error*/
>                udelay(4);
> @@ -174,16 +172,14 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
>                if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) {
>                        pr_err("Pbias Voltage is not same as LDO\n");
>                        /* Caution : On VMODE_ERROR Power Down MMC IO */
> -                       reg &= ~(OMAP4_MMC1_PWRDNZ_MASK |
> -                               OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
> +                       reg &= ~(OMAP4_MMC1_PWRDNZ_MASK);
>                        omap4_ctrl_pad_writel(reg, control_pbias_offset);
>                }
>        } else {
>                reg = omap4_ctrl_pad_readl(control_pbias_offset);
>                reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
>                        OMAP4_MMC1_PWRDNZ_MASK |
> -                       OMAP4_MMC1_PBIASLITE_VMODE_MASK |
> -                       OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
> +                       OMAP4_MMC1_PBIASLITE_VMODE_MASK);
>                omap4_ctrl_pad_writel(reg, control_pbias_offset);
>        }
>  }
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bryan Buckley Aug. 12, 2011, 3:13 p.m. UTC | #2
On Fri, Jul 22, 2011 at 7:30 AM, Kishore Kadiyala
<kishorek.kadiyala@gmail.com> wrote:
>
> On Fri, Jul 22, 2011 at 12:59 AM, Bryan Buckley <bryan.buckley@ti.com> wrote:
> > Remove OMAP4_USBC1_ICUSB_PWRDNZ_MASK during enable/disable PWRDNZ mode for
> > MMC1_PBIAS and associated extended-drain MMC1 I/O cell. This is in accordance
> > with the control module programming guide. This fixes a bug where if trying to
> > use gpio_98 or gpio_99 and MMC1 at the same time the GPIO signal will be
> > affected by a changing SDMMC1_VDDS.
> >
> > Software must keep MMC1_PBIAS cell and MMC1_IO cell PWRDNZ signals low whenever
> > SDMMC1_VDDS ramps up/down or changes for cell protection purposes.
> >
> > MMC1 is based on SDMMC1_VDDS whereas USBC1 is based on SIM_VDDS therefore
> > they can operate independently.
> >
> > Signed-off-by: Bryan Buckley <bryan.buckley@ti.com>
>
> Good catch,
>
> Acked-by:  Kishore Kadiyala <kishore.kadiyala@ti.com>
>

Any other comments from anyone else?  Noticed that this commit isn't
in any upstream branches. This patch will fix issues with people who
want to use GPIO 98/99 AND MMC1 at the same time.  Would be good to
have this fix upstream.
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index 3842405..a6135df 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -144,8 +144,7 @@  static void omap4_hsmmc1_before_set_reg(struct device *dev, int slot,
 	 */
 	reg = omap4_ctrl_pad_readl(control_pbias_offset);
 	reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
-		OMAP4_MMC1_PWRDNZ_MASK |
-		OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+		OMAP4_MMC1_PWRDNZ_MASK);
 	omap4_ctrl_pad_writel(reg, control_pbias_offset);
 }
 
@@ -165,8 +164,7 @@  static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
 		else
 			reg |= OMAP4_MMC1_PBIASLITE_VMODE_MASK;
 		reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
-			OMAP4_MMC1_PWRDNZ_MASK |
-			OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+			OMAP4_MMC1_PWRDNZ_MASK);
 		omap4_ctrl_pad_writel(reg, control_pbias_offset);
 		/* 4 microsec delay for comparator to generate an error*/
 		udelay(4);
@@ -174,16 +172,14 @@  static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
 		if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) {
 			pr_err("Pbias Voltage is not same as LDO\n");
 			/* Caution : On VMODE_ERROR Power Down MMC IO */
-			reg &= ~(OMAP4_MMC1_PWRDNZ_MASK |
-				OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+			reg &= ~(OMAP4_MMC1_PWRDNZ_MASK);
 			omap4_ctrl_pad_writel(reg, control_pbias_offset);
 		}
 	} else {
 		reg = omap4_ctrl_pad_readl(control_pbias_offset);
 		reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
 			OMAP4_MMC1_PWRDNZ_MASK |
-			OMAP4_MMC1_PBIASLITE_VMODE_MASK |
-			OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
+			OMAP4_MMC1_PBIASLITE_VMODE_MASK);
 		omap4_ctrl_pad_writel(reg, control_pbias_offset);
 	}
 }