RE: [PATCH] usb: musb: Offmode fix for idle path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 Hello,

>-----Original Message-----
>From: Sergei Shtylyov [mailto:sshtylyov@xxxxxxxxxx] 
>Sent: Thursday, July 08, 2010 6:58 PM
>To: Kalliguddi, Hema
>Cc: linux-usb@xxxxxxxxxxxxxxx; linux-omap@xxxxxxxxxxxxxxx; 
>Mankad, Maulik Ojas; Felipe Balbi; Tony Lindgren; Kevin Hilman
>Subject: Re: [PATCH] usb: musb: Offmode fix for idle path
>
>Hello.
>
>Hema HK wrote:
>
>> With OMAP coreoff support usb was not functional as context 
>was getting
>> lost after wakeup from coreoff. And also usb was blocking 
>the coreoff 
>
>    USB is an acronym.
>
Agree I will change it accordingly.

>> after loading the gadget driver even with no cable connected 
>sometimes.
>
>> Added the conext save/restore api in the platform layer which will
>
>    API is an acronym.
>
Agree.

>> be called in the idle and wakeup path.
>
>> Changed the usb sysconfig settings as per the usbotg functional spec.
>
>    Do you mean the OTG supplement to USB 2.0 spec. or something else?
>
No it is TI OMAP USBOTG functional specifications.

>> When the device is not used, configure in force idle and 
>force standby mode.
>> When it is being used, configure in smart standby and smart 
>idle mode.
>> So while attempting to coreoff the usb is configured to 
>force standby and 
>> force idle mode, after wakeup configured in smart idle and 
>smart standby.
>
>> Since clock used for musb is auto gated, there is no need to 
>specifically
>> enable/disable the clock. Removed enable/disable clock in 
>suspend resume api.
>
>    I'm not sure it's auto-gated on all platforms...

Might be. need to check this. 

Blackfin guys,
Please comment...

>
>> Signed-off-by: Hema HK <hemahk@xxxxxx>
>> Signed-off-by: Maulik Mankad <x0082077@xxxxxx>
>
>> Cc: Felipe Balbi <felipe.balbi@xxxxxxxxx>
>> Cc: Tony Lindgren <tony@xxxxxxxxxxx>
>> Cc: Kevin Hilman <khilman@xxxxxxxxxxxxxxxxxxx>
>
>> Index: linux-omap-pm/arch/arm/mach-omap2/usb-musb.c
>> ===================================================================
>> --- linux-omap-pm.orig/arch/arm/mach-omap2/usb-musb.c
>> +++ linux-omap-pm/arch/arm/mach-omap2/usb-musb.c
>> @@ -177,6 +177,21 @@ void __init usb_musb_init(struct omap_mu
>>  	usb_musb_pm_init();
>>  }
>>  
>> +void musb_context_save_restore(int save)
>> +{
>> +	struct device *dev = &musb_device.dev;
>> +	struct device_driver *drv = dev->driver;
>
>    Need an empty line here.
>
OK.
>> +	if (dev->driver) {
>
>   You've just assigned that to 'drv' -- why not use it?
>
I will do that.

>> Index: linux-omap-pm/arch/arm/plat-omap/include/plat/usb.h
>> ===================================================================
>> --- linux-omap-pm.orig/arch/arm/plat-omap/include/plat/usb.h
>> +++ linux-omap-pm/arch/arm/plat-omap/include/plat/usb.h
>> @@ -82,6 +82,8 @@ extern void usb_ohci_init(const struct o
>>  /* This is needed for OMAP3 errata 1.164: enabled autoidle 
>can prevent sleep */
>>  extern void usb_musb_disable_autoidle(void);
>>  
>> +/* For saving and restoring the musb context during off/wakeup*/
>> +extern void musb_context_save_restore(int save);
>>  #endif
>>  
>>  void omap_usb_init(struct omap_usb_config *pdata);
>> Index: linux-omap-pm/drivers/usb/musb/musb_core.c
>> ===================================================================
>> --- linux-omap-pm.orig/drivers/usb/musb/musb_core.c
>> +++ linux-omap-pm/drivers/usb/musb/musb_core.c
>> @@ -2430,11 +2430,6 @@ static int musb_suspend(struct device *d
>>  	}
>>  
>>  	musb_save_context(musb);
>> -
>> -	if (musb->set_clock)
>> -		musb->set_clock(musb->clock, 0);
>> -	else
>> -		clk_disable(musb->clock);
>>  	spin_unlock_irqrestore(&musb->lock, flags);
>>  	return 0;
>>  }
>> @@ -2446,12 +2441,6 @@ static int musb_resume_noirq(struct devi
>>  
>>  	if (!musb->clock)
>>  		return 0;
>> -
>> -	if (musb->set_clock)
>> -		musb->set_clock(musb->clock, 1);
>> -	else
>> -		clk_enable(musb->clock);
>> -
>
>    OK, maybe for OMAP the clock is auto-gated but what about 
>the other platforms?
>

For OMAP it is autogated. 

Blackfin guys comments please?

>>  	musb_restore_context(musb);
>>  
>>  	/* for static cmos like DaVinci, register values were preserved
>> Index: linux-omap-pm/drivers/usb/musb/omap2430.c
>> ===================================================================
>> --- linux-omap-pm.orig/drivers/usb/musb/omap2430.c
>> +++ linux-omap-pm/drivers/usb/musb/omap2430.c
>> @@ -257,15 +257,39 @@ int __init musb_platform_init(struct mus
>>  void musb_platform_save_context(struct musb *musb,
>>  		struct musb_context_registers *musb_context)
>>  {
>> -	musb_context->otg_sysconfig = musb_readl(musb->mregs, 
>OTG_SYSCONFIG);
>> -	musb_context->otg_forcestandby = 
>musb_readl(musb->mregs, OTG_FORCESTDBY);
>> +	/*
>> +	 * As per the specification, configure it to forced standby
>> +	 * and  force idle mode when no activity on usb.
>> +	 */
>> +	void __iomem *musb_base = musb->mregs;
>
>    Need an empty line here.
>
OK. 
>> +	musb_writel(musb_base, OTG_FORCESTDBY, 0);
>> +	musb_writel(musb_base, OTG_SYSCONFIG, musb_readl(musb_base,
>> +				OTG_SYSCONFIG) & ~(NOSTDBY | 
>SMARTSTDBY));
>> +
>> +	musb_writel(musb_base, OTG_SYSCONFIG, musb_readl(musb_base,
>> +					OTG_SYSCONFIG) & ~(AUTOIDLE));
>
>    Parens around AUTOIDLE are not useful.
>

OK. I will remove.
>> +
>> +	musb_writel(musb_base, OTG_SYSCONFIG, musb_readl(musb_base,
>> +				OTG_SYSCONFIG) & ~(NOIDLE | SMARTIDLE));
>> +
>> +	musb_writel(musb_base, OTG_FORCESTDBY, 1);
>>  }
>>  
>>  void musb_platform_restore_context(struct musb *musb,
>>  		struct musb_context_registers *musb_context)
>>  {
>> -	musb_writel(musb->mregs, OTG_SYSCONFIG, 
>musb_context->otg_sysconfig);
>> -	musb_writel(musb->mregs, OTG_FORCESTDBY, 
>musb_context->otg_forcestandby);
>> +	/*
>> +	 * As per the specification, configure it smart standby
>> +	 * and smart idle during operation.
>> +	 */
>> +	void __iomem *musb_base = musb->mregs;
>
>   Need an empty line here.
OK.
>
>> +	musb_writel(musb_base, OTG_FORCESTDBY, 0);
>> +
>> +	musb_writel(musb_base, OTG_SYSCONFIG, musb_readl(musb_base,
>> +				OTG_SYSCONFIG) | (SMARTSTDBY));
>
>    Parens around SMARTSTDBY are not useful.
>
OK. I will remove.
>> +
>> +	musb_writel(musb_base, OTG_SYSCONFIG, musb_readl(musb_base,
>> +					OTG_SYSCONFIG) | (SMARTIDLE));
>
>    Ditto about parens around SMARTIDLE...
>
OK I will remove.
>WBR, Sergei
>
~Hema--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux