"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