diff mbox

[1/2] ARM: OMAP4: MMC: increase delay for pbias

Message ID 1306765534-20103-2-git-send-email-balajitk@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Balaji T K May 30, 2011, 2:25 p.m. UTC
4 micro seconds is not enough for PBIAS if MMC regulator is
enabled from MMC regulator OFF.
Increase the delay for PBIAS to stabilize.
Wait for PBIAS and timeout if not.

Resolves MMC/SD failure on OMAP4
"Pbias Voltage is not same as LDO"

Signed-off-by: Balaji T K <balajitk@ti.com>
---
 arch/arm/mach-omap2/hsmmc.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

Comments

Tony Lindgren June 1, 2011, 7:41 a.m. UTC | #1
* Balaji T K <balajitk@ti.com> [110530 07:23]:
> 4 micro seconds is not enough for PBIAS if MMC regulator is
> enabled from MMC regulator OFF.
> Increase the delay for PBIAS to stabilize.
> Wait for PBIAS and timeout if not.
> 
> Resolves MMC/SD failure on OMAP4
> "Pbias Voltage is not same as LDO"
> 
> Signed-off-by: Balaji T K <balajitk@ti.com>
> ---
>  arch/arm/mach-omap2/hsmmc.c |   13 ++++++++++---
>  1 files changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
> index b2f30be..3f8dc16 100644
> --- a/arch/arm/mach-omap2/hsmmc.c
> +++ b/arch/arm/mach-omap2/hsmmc.c
> @@ -145,6 +145,7 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
>  				 int power_on, int vdd)
>  {
>  	u32 reg;
> +	unsigned long timeout;
>  
>  	if (power_on) {
>  		reg = omap4_ctrl_pad_readl(control_pbias_offset);
> @@ -157,9 +158,15 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
>  			OMAP4_MMC1_PWRDNZ_MASK |
>  			OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
>  		omap4_ctrl_pad_writel(reg, control_pbias_offset);
> -		/* 4 microsec delay for comparator to generate an error*/
> -		udelay(4);
> -		reg = omap4_ctrl_pad_readl(control_pbias_offset);
> +
> +		timeout = jiffies + msecs_to_jiffies(5);
> +		do {
> +			reg = omap4_ctrl_pad_readl(control_pbias_offset);
> +			if (!(reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK))
> +				break;
> +			udelay(100);
> +		} while (!time_after(jiffies, timeout));
> +
>  		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 */

Actually, can you check if you can use usleep_range here as recommended
by checkpatch.pl?

Tony
Balaji T K June 1, 2011, 9:18 a.m. UTC | #2
On Wed, Jun 1, 2011 at 1:11 PM, Tony Lindgren <tony@atomide.com> wrote:
> * Balaji T K <balajitk@ti.com> [110530 07:23]:
>> 4 micro seconds is not enough for PBIAS if MMC regulator is
>> enabled from MMC regulator OFF.
>> Increase the delay for PBIAS to stabilize.
>> Wait for PBIAS and timeout if not.
>>
>> Resolves MMC/SD failure on OMAP4
>> "Pbias Voltage is not same as LDO"
>>
>> Signed-off-by: Balaji T K <balajitk@ti.com>
>> ---
>>  arch/arm/mach-omap2/hsmmc.c |   13 ++++++++++---
>>  1 files changed, 10 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
>> index b2f30be..3f8dc16 100644
>> --- a/arch/arm/mach-omap2/hsmmc.c
>> +++ b/arch/arm/mach-omap2/hsmmc.c
>> @@ -145,6 +145,7 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
>>                                int power_on, int vdd)
>>  {
>>       u32 reg;
>> +     unsigned long timeout;
>>
>>       if (power_on) {
>>               reg = omap4_ctrl_pad_readl(control_pbias_offset);
>> @@ -157,9 +158,15 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
>>                       OMAP4_MMC1_PWRDNZ_MASK |
>>                       OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
>>               omap4_ctrl_pad_writel(reg, control_pbias_offset);
>> -             /* 4 microsec delay for comparator to generate an error*/
>> -             udelay(4);
>> -             reg = omap4_ctrl_pad_readl(control_pbias_offset);
>> +
>> +             timeout = jiffies + msecs_to_jiffies(5);
>> +             do {
>> +                     reg = omap4_ctrl_pad_readl(control_pbias_offset);
>> +                     if (!(reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK))
>> +                             break;
>> +                     udelay(100);
>> +             } while (!time_after(jiffies, timeout));
>> +
>>               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 */
>
> Actually, can you check if you can use usleep_range here as recommended
> by checkpatch.pl?

sure, fixing it in v2

>
> Tony
>
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index b2f30be..3f8dc16 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -145,6 +145,7 @@  static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
 				 int power_on, int vdd)
 {
 	u32 reg;
+	unsigned long timeout;
 
 	if (power_on) {
 		reg = omap4_ctrl_pad_readl(control_pbias_offset);
@@ -157,9 +158,15 @@  static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
 			OMAP4_MMC1_PWRDNZ_MASK |
 			OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
 		omap4_ctrl_pad_writel(reg, control_pbias_offset);
-		/* 4 microsec delay for comparator to generate an error*/
-		udelay(4);
-		reg = omap4_ctrl_pad_readl(control_pbias_offset);
+
+		timeout = jiffies + msecs_to_jiffies(5);
+		do {
+			reg = omap4_ctrl_pad_readl(control_pbias_offset);
+			if (!(reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK))
+				break;
+			udelay(100);
+		} while (!time_after(jiffies, timeout));
+
 		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 */