"ext Paul Walmsley" <[EMAIL PROTECTED]> writes:

> Hello Tero, Jouni,
>
> so is this basically a workaround patch?

Yes in new format. Please do not use word workaround;)

>
> a few comments:
>
> On Wed, 27 Aug 2008, Tero Kristo wrote:
>
>> From: ext Jouni Hogander <[EMAIL PROTECTED]>
>> 
>> In omap3 gpios 2-6 are in per domain. Functional clocks for these
>> should be disabled.
>> 
>> GPIO modules in PER domain are not able to act as a wake up source if
>> PER domain is in retention. PER domain sleep transition before MPU is
>> prevented by leaving icks active. PER domain still enters retention
>> together with MPU. When this happens IOPAD wake up mechanism is used
>> for gpios.
>> 
>> Signed-off-by: Jouni Hogander <[EMAIL PROTECTED]>
>> ---
>>  arch/arm/mach-omap2/pm.c     |   20 ++++++++------
>>  arch/arm/mach-omap2/pm.h     |    2 +-
>>  arch/arm/mach-omap2/pm34xx.c |   56 
>> +++++++++++++++++++++++++++++++++++++++++-
>>  3 files changed, 67 insertions(+), 11 deletions(-)
>> 
>> diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
>> index 4652136..1de5f14 100644
>> --- a/arch/arm/mach-omap2/pm.c
>> +++ b/arch/arm/mach-omap2/pm.c
>> @@ -32,7 +32,7 @@
>>  #include "pm.h"
>>  
>>  unsigned short enable_dyn_sleep;
>> -unsigned short clocks_off_while_idle;
>> +unsigned short gpio_clocks_off_while_idle;
>>  atomic_t sleep_block = ATOMIC_INIT(0);
>>  
>>  static ssize_t idle_show(struct kobject *, struct kobj_attribute *, char *);
>> @@ -42,16 +42,16 @@ static ssize_t idle_store(struct kobject *k, struct 
>> kobj_attribute *,
>>  static struct kobj_attribute sleep_while_idle_attr =
>>      __ATTR(sleep_while_idle, 0644, idle_show, idle_store);
>>  
>> -static struct kobj_attribute clocks_off_while_idle_attr =
>> -    __ATTR(clocks_off_while_idle, 0644, idle_show, idle_store);
>> +static struct kobj_attribute gpio_clocks_off_while_idle_attr =
>> +    __ATTR(gpio_clocks_off_while_idle, 0644, idle_show, idle_store);
>>  
>>  static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr,
>>                       char *buf)
>>  {
>>      if (attr == &sleep_while_idle_attr)
>>              return sprintf(buf, "%hu\n", enable_dyn_sleep);
>> -    else if (attr == &clocks_off_while_idle_attr)
>> -            return sprintf(buf, "%hu\n", clocks_off_while_idle);
>> +    else if (attr == &gpio_clocks_off_while_idle_attr)
>> +            return sprintf(buf, "%hu\n", gpio_clocks_off_while_idle);
>>      else
>>              return -EINVAL;
>>  }
>> @@ -69,8 +69,8 @@ static ssize_t idle_store(struct kobject *kobj, struct 
>> kobj_attribute *attr,
>>  
>>      if (attr == &sleep_while_idle_attr)
>>              enable_dyn_sleep = value;
>> -    else if (attr == &clocks_off_while_idle_attr)
>> -            clocks_off_while_idle = value;
>> +    else if (attr == &gpio_clocks_off_while_idle_attr)
>> +            gpio_clocks_off_while_idle = value;
>>      else
>>              return -EINVAL;
>>  
>> @@ -106,10 +106,12 @@ static int __init omap_pm_init(void)
>>      /* disabled till drivers are fixed */
>>      enable_dyn_sleep = 0;
>>      error = sysfs_create_file(power_kobj, &sleep_while_idle_attr.attr);
>> -    if (error)
>> +    if (error) {
>>              printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
>> +            return error;
>> +    }
>>      error = sysfs_create_file(power_kobj,
>> -                              &clocks_off_while_idle_attr.attr);
>> +                              &gpio_clocks_off_while_idle_attr.attr);
>>      if (error)
>>              printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
>>  
>> diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
>> index 68c9278..d446ea4 100644
>> --- a/arch/arm/mach-omap2/pm.h
>> +++ b/arch/arm/mach-omap2/pm.h
>> @@ -17,7 +17,7 @@ extern int omap2_pm_init(void);
>>  extern int omap3_pm_init(void);
>>  
>>  extern unsigned short enable_dyn_sleep;
>> -extern unsigned short clocks_off_while_idle;
>> +extern unsigned short gpio_clocks_off_while_idle;
>>  extern atomic_t sleep_block;
>>  
>>  extern void omap2_block_sleep(void);
>> diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
>> index a16eb33..0baf359 100644
>> --- a/arch/arm/mach-omap2/pm34xx.c
>> +++ b/arch/arm/mach-omap2/pm34xx.c
>> @@ -53,6 +53,43 @@ static void (*saved_idle)(void);
>>  
>>  static struct powerdomain *mpu_pwrdm;
>>  
>> +/* Dynamic GPIO clock handling for sleep routines.
>> + * omap_sram_idle() will call these functions and they will dynamically
>> + * enable / disable GPIO clocks to allow sleep transitions. */
>
> Please use CodingStyle format for multiple-line comments, e.g.,

Yes, needs to be fixed...

>
> /*
>  * Dynamic GPIO clock handling ...
>  * etc. etc. etc.
>  */
>
> This also applies to several other comments later in the file.

ok

>
>> +#define NUM_OF_PERGPIOS 5
>> +static struct clk *gpio_fcks[NUM_OF_PERGPIOS];
>> +
>> +/* Enable GPIO clocks from sleep routines if allowed */
>> +static void per_gpio_clk_enable(void)
>> +{
>> +    int i;
>> +
>> +    if (gpio_clocks_off_while_idle == 0)
>> +            return;
>> +    for (i = 1; i < NUM_OF_PERGPIOS + 1; i++)
>> +            clk_enable(gpio_fcks[i-1]);
>
> Why not just:
>
>     for (i = 0; i < NUM_OF_PERGPIOS; i++)
>              clk_enable(gpio_fcks[i]);
>
> ?

Yes, these all needs to be fixed. 

Thank you for you comments.

-- 
Jouni Högander

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to