[v5,3/9] ARM: omap: Consolidate OMAP3 cpuidle time keeping and irq enable

Message ID 1330318063-25460-4-git-send-email-rob.lee@linaro.org
State New
Headers show

Commit Message

Rob Feb. 27, 2012, 4:47 a.m.
Use core cpuidle timekeeping and irqen wrapper and remove that
handling from this code.

Signed-off-by: Robert Lee <rob.lee@linaro.org>
---
 arch/arm/mach-omap2/cpuidle34xx.c |   43 +++++++++++++++---------------------
 1 files changed, 18 insertions(+), 25 deletions(-)

Comments

Jean Pihet Feb. 27, 2012, 4:26 p.m. | #1
On Mon, Feb 27, 2012 at 5:47 AM, Robert Lee <rob.lee@linaro.org> wrote:
> Use core cpuidle timekeeping and irqen wrapper and remove that
> handling from this code.
>
> Signed-off-by: Robert Lee <rob.lee@linaro.org>
> ---
>  arch/arm/mach-omap2/cpuidle34xx.c |   43 +++++++++++++++---------------------
>  1 files changed, 18 insertions(+), 25 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
> index 464cffd..1f6123f 100644
> --- a/arch/arm/mach-omap2/cpuidle34xx.c
> +++ b/arch/arm/mach-omap2/cpuidle34xx.c
...

>  /**
> + * omap3_enter_idle - Programs OMAP3 to enter the specified state
> + * @dev: cpuidle device
> + * @drv: cpuidle driver
> + * @index: the index of state to be entered
> + *
> + * Called from the CPUidle framework to program the device to the
> + * specified target state selected by the governor.
> + */
> +static int omap3_enter_idle(struct cpuidle_device *dev,
> +                               struct cpuidle_driver *drv,
> +                               int index)
> +{
> +       return cpuidle_wrap_enter(dev, drv, index, __omap3_enter_idle);
Is it the intention to call cpuidle_wrap_enter from the non-common
code? Could the driver set en_core_tk_irqen to 1 and so let the core
call the idle function? Is it to have the time measurement code closer
to the low level idle code in  __omap3_enter_idle?

> +}
> +
> +/**
>  * next_valid_state - Find next valid C-state
>  * @dev: cpuidle device
>  * @drv: cpuidle driver
> @@ -295,6 +287,7 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
>        new_state_idx = next_valid_state(dev, drv, index);
>
>  select_state:
> +
Stray change

>        ret = omap3_enter_idle(dev, drv, new_state_idx);
>
>        /* Restore original PER state if it was modified */
> --
> 1.7.1
>

Regards,
Jean
Rob Feb. 27, 2012, 7:27 p.m. | #2
On Mon, Feb 27, 2012 at 10:26 AM, Jean Pihet <jean.pihet@newoldbits.com> wrote:
> On Mon, Feb 27, 2012 at 5:47 AM, Robert Lee <rob.lee@linaro.org> wrote:
>> Use core cpuidle timekeeping and irqen wrapper and remove that
>> handling from this code.
>>
>> Signed-off-by: Robert Lee <rob.lee@linaro.org>
>> ---
>>  arch/arm/mach-omap2/cpuidle34xx.c |   43 +++++++++++++++---------------------
>>  1 files changed, 18 insertions(+), 25 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
>> index 464cffd..1f6123f 100644
>> --- a/arch/arm/mach-omap2/cpuidle34xx.c
>> +++ b/arch/arm/mach-omap2/cpuidle34xx.c
> ...
>
>>  /**
>> + * omap3_enter_idle - Programs OMAP3 to enter the specified state
>> + * @dev: cpuidle device
>> + * @drv: cpuidle driver
>> + * @index: the index of state to be entered
>> + *
>> + * Called from the CPUidle framework to program the device to the
>> + * specified target state selected by the governor.
>> + */
>> +static int omap3_enter_idle(struct cpuidle_device *dev,
>> +                               struct cpuidle_driver *drv,
>> +                               int index)
>> +{
>> +       return cpuidle_wrap_enter(dev, drv, index, __omap3_enter_idle);
> Is it the intention to call cpuidle_wrap_enter from the non-common
> code? Could the driver set en_core_tk_irqen to 1 and so let the core
> call the idle function? Is it to have the time measurement code closer
> to the low level idle code in  __omap3_enter_idle?
>

Yes, Yes, and Yes.

>> +}
>> +
>> +/**
>>  * next_valid_state - Find next valid C-state
>>  * @dev: cpuidle device
>>  * @drv: cpuidle driver
>> @@ -295,6 +287,7 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
>>        new_state_idx = next_valid_state(dev, drv, index);
>>
>>  select_state:
>> +
> Stray change
>

Oops, thanks.

>>        ret = omap3_enter_idle(dev, drv, new_state_idx);
>>
>>        /* Restore original PER state if it was modified */
>> --
>> 1.7.1
>>
>
> Regards,
> Jean

Patch

diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
index 464cffd..1f6123f 100644
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -87,29 +87,14 @@  static int _cpuidle_deny_idle(struct powerdomain *pwrdm,
 	return 0;
 }
 
-/**
- * omap3_enter_idle - Programs OMAP3 to enter the specified state
- * @dev: cpuidle device
- * @drv: cpuidle driver
- * @index: the index of state to be entered
- *
- * Called from the CPUidle framework to program the device to the
- * specified target state selected by the governor.
- */
-static int omap3_enter_idle(struct cpuidle_device *dev,
+static inline int __omap3_enter_idle(struct cpuidle_device *dev,
 				struct cpuidle_driver *drv,
 				int index)
 {
 	struct omap3_idle_statedata *cx =
 			cpuidle_get_statedata(&dev->states_usage[index]);
-	struct timespec ts_preidle, ts_postidle, ts_idle;
 	u32 mpu_state = cx->mpu_state, core_state = cx->core_state;
-	int idle_time;
 
-	/* Used to keep track of the total time in idle */
-	getnstimeofday(&ts_preidle);
-
-	local_irq_disable();
 	local_fiq_disable();
 
 	pwrdm_set_next_pwrst(mpu_pd, mpu_state);
@@ -148,22 +133,29 @@  static int omap3_enter_idle(struct cpuidle_device *dev,
 	}
 
 return_sleep_time:
-	getnstimeofday(&ts_postidle);
-	ts_idle = timespec_sub(ts_postidle, ts_preidle);
 
-	local_irq_enable();
 	local_fiq_enable();
 
-	idle_time = ts_idle.tv_nsec / NSEC_PER_USEC + ts_idle.tv_sec * \
-								USEC_PER_SEC;
-
-	/* Update cpuidle counters */
-	dev->last_residency = idle_time;
-
 	return index;
 }
 
 /**
+ * omap3_enter_idle - Programs OMAP3 to enter the specified state
+ * @dev: cpuidle device
+ * @drv: cpuidle driver
+ * @index: the index of state to be entered
+ *
+ * Called from the CPUidle framework to program the device to the
+ * specified target state selected by the governor.
+ */
+static int omap3_enter_idle(struct cpuidle_device *dev,
+				struct cpuidle_driver *drv,
+				int index)
+{
+	return cpuidle_wrap_enter(dev, drv, index, __omap3_enter_idle);
+}
+
+/**
  * next_valid_state - Find next valid C-state
  * @dev: cpuidle device
  * @drv: cpuidle driver
@@ -295,6 +287,7 @@  static int omap3_enter_idle_bm(struct cpuidle_device *dev,
 	new_state_idx = next_valid_state(dev, drv, index);
 
 select_state:
+
 	ret = omap3_enter_idle(dev, drv, new_state_idx);
 
 	/* Restore original PER state if it was modified */