RE: [PATCH 1/4] PM: Dynamic GPIO clock handling

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

 



These comments should now be fixed in the new version I just sent out.

-Tero 

>-----Original Message-----
>From: Högander Jouni [mailto:jouni.hogander@xxxxxxxxx] 
>Sent: 05 September, 2008 16:47
>To: ext Paul Walmsley
>Cc: Kristo Tero (Nokia-D/Tampere); linux-omap@xxxxxxxxxxxxxxx
>Subject: Re: [PATCH 1/4] PM: Dynamic GPIO clock handling
>
>"ext Paul Walmsley" <paul@xxxxxxxxx> 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 <jouni.hogander@xxxxxxxxx>
>>> 
>>> 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 <jouni.hogander@xxxxxxxxx>
>>> ---
>>>  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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux