Skip to contentSkip to conversation

ARM: exynos: Adapt to cpuidle core time keeping and irq enable

PATCH New Amit Daniel Kachhap 5 participants 7 messages Apr 25, 2012 – May 9, 2012

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

This patch enables core cpuidle timekeeping and irq enabling and remove those redundant parts from the exynos cpuidle drivers

CC Daniel Lezcano <[email protected]>
CC Robert Lee <[email protected]>
---
 arch/arm/mach-exynos/cpuidle.c |   53 ++++-----------------------------------
 1 files changed, 6 insertions(+), 47 deletions(-)
arch/arm/mach-exynos/cpuidle.c +6 -47
index 33ab4e7..26dac28 100644
@@ -20,6 +20,7 @@
 #include <asm/smp_scu.h>
 #include <asm/suspend.h>
 #include <asm/unified.h>
+#include <asm/cpuidle.h>
 #include <mach/regs-pmu.h>
 #include <mach/pmu.h>
 
@@ -34,22 +35,12 @@
 
 #define S5P_CHECK_AFTR		0xFCBA0D10
 
-static int exynos4_enter_idle(struct cpuidle_device *dev,
-			struct cpuidle_driver *drv,
-			      int index);
 static int exynos4_enter_lowpower(struct cpuidle_device *dev,
 				struct cpuidle_driver *drv,
 				int index);
 
 static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
-	[0] = {
-		.enter			= exynos4_enter_idle,
-		.exit_latency		= 1,
-		.target_residency	= 100000,
-		.flags			= CPUIDLE_FLAG_TIME_VALID,
-		.name			= "C0",
-		.desc			= "ARM clock gating(WFI)",
-	},
+	[0] = ARM_CPUIDLE_WFI_STATE,
 	[1] = {
 		.enter			= exynos4_enter_lowpower,
 		.exit_latency		= 300,
@@ -63,8 +54,9 @@ static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
 static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
 
 static struct cpuidle_driver exynos4_idle_driver = {
-	.name		= "exynos4_idle",
-	.owner		= THIS_MODULE,
+	.name			= "exynos4_idle",
+	.owner			= THIS_MODULE,
+	.en_core_tk_irqen	= 1,
 };
 
 /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
@@ -103,13 +95,8 @@ static int exynos4_enter_core0_aftr(struct cpuidle_device *dev,
 				struct cpuidle_driver *drv,
 				int index)
 {
-	struct timeval before, after;
-	int idle_time;
 	unsigned long tmp;
 
-	local_irq_disable();
-	do_gettimeofday(&before);
-
 	exynos4_set_wakeupmask();
 
 	/* Set value of power down register for aftr mode */
@@ -150,34 +137,6 @@ static int exynos4_enter_core0_aftr(struct cpuidle_device *dev,
 	/* Clear wakeup state register */
 	__raw_writel(0x0, S5P_WAKEUP_STAT);
 
-	do_gettimeofday(&after);
-
-	local_irq_enable();
-	idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
-		    (after.tv_usec - before.tv_usec);
-
-	dev->last_residency = idle_time;
-	return index;
-}
-
-static int exynos4_enter_idle(struct cpuidle_device *dev,
-				struct cpuidle_driver *drv,
-				int index)
-{
-	struct timeval before, after;
-	int idle_time;
-
-	local_irq_disable();
-	do_gettimeofday(&before);
-
-	cpu_do_idle();
-
-	do_gettimeofday(&after);
-	local_irq_enable();
-	idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
-		    (after.tv_usec - before.tv_usec);
-
-	dev->last_residency = idle_time;
 	return index;
 }
 
@@ -192,7 +151,7 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev,
 		new_index = drv->safe_state_index;
 
 	if (new_index == 0)
-		return exynos4_enter_idle(dev, drv, new_index);
+		return arm_cpuidle_simple_enter(dev, drv, new_index);
 	else
 		return exynos4_enter_core0_aftr(dev, drv, new_index);
 }
Signature · 1 line
1.7.1
#1 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

Quoted 108 lines · Amit Daniel Kachhap

This patch enables core cpuidle timekeeping and irq enabling and remove those redundant parts from the exynos cpuidle drivers

CC Daniel Lezcano<[email protected]>
CC Robert Lee<[email protected]>
---
  arch/arm/mach-exynos/cpuidle.c |   53 ++++-----------------------------------
  1 files changed, 6 insertions(+), 47 deletions(-)
arch/arm/mach-exynos/cpuidle.c +5 -46
index 33ab4e7..26dac28 100644
@@ -20,6 +20,7 @@
  #include<asm/smp_scu.h>
  #include<asm/suspend.h>
  #include<asm/unified.h>
+#include<asm/cpuidle.h>
  #include<mach/regs-pmu.h>
  #include<mach/pmu.h>
 
@@ -34,22 +35,12 @@
 
  #define S5P_CHECK_AFTR		0xFCBA0D10
 
-static int exynos4_enter_idle(struct cpuidle_device *dev,
-			struct cpuidle_driver *drv,
-			      int index);
  static int exynos4_enter_lowpower(struct cpuidle_device *dev,
  				struct cpuidle_driver *drv,
  				int index);
 
  static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
-	[0] = {
-		.enter			= exynos4_enter_idle,
-		.exit_latency		= 1,
-		.target_residency	= 100000,
-		.flags			= CPUIDLE_FLAG_TIME_VALID,
-		.name			= "C0",
-		.desc			= "ARM clock gating(WFI)",
-	},
+	[0] = ARM_CPUIDLE_WFI_STATE,
  	[1] = {
  		.enter			= exynos4_enter_lowpower,
  		.exit_latency		= 300,
@@ -63,8 +54,9 @@ static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
  static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
 
  static struct cpuidle_driver exynos4_idle_driver = {
-	.name		= "exynos4_idle",
-	.owner		= THIS_MODULE,
+	.name			= "exynos4_idle",
+	.owner			= THIS_MODULE,
+	.en_core_tk_irqen	= 1,
  };
 
  /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */
@@ -103,13 +95,8 @@ static int exynos4_enter_core0_aftr(struct cpuidle_device *dev,
  				struct cpuidle_driver *drv,
  				int index)
  {
-	struct timeval before, after;
-	int idle_time;
  	unsigned long tmp;
 
-	local_irq_disable();
-	do_gettimeofday(&before);
-
  	exynos4_set_wakeupmask();
 
  	/* Set value of power down register for aftr mode */
@@ -150,34 +137,6 @@ static int exynos4_enter_core0_aftr(struct cpuidle_device *dev,
  	/* Clear wakeup state register */
  	__raw_writel(0x0, S5P_WAKEUP_STAT);
 
-	do_gettimeofday(&after);
-
-	local_irq_enable();
-	idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
-		    (after.tv_usec - before.tv_usec);
-
-	dev->last_residency = idle_time;
-	return index;
-}
-
-static int exynos4_enter_idle(struct cpuidle_device *dev,
-				struct cpuidle_driver *drv,
-				int index)
-{
-	struct timeval before, after;
-	int idle_time;
-
-	local_irq_disable();
-	do_gettimeofday(&before);
-
-	cpu_do_idle();
-
-	do_gettimeofday(&after);
-	local_irq_enable();
-	idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
-		    (after.tv_usec - before.tv_usec);
-
-	dev->last_residency = idle_time;
  	return index;
  }
 

arch/arm/mach-exynos/cpuidle.c static int exynos4_enter_lowpower(struct cpuidle_device *dev, · line 157

Quoted 8 lines
arch/arm/mach-exynos/cpuidle.c +1 -1
@@ -192,7 +151,7 @@ static int exynos4_enter_lowpower(struct cpuidle_device *dev,
  		new_index = drv->safe_state_index;
 
  	if (new_index == 0)
-		return exynos4_enter_idle(dev, drv, new_index);
+		return arm_cpuidle_simple_enter(dev, drv, new_index);
  	else
  		return exynos4_enter_core0_aftr(dev, drv, new_index);
  }
Signature · 5 lines
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
#2 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

Quoted 118 lines · Daniel Lezcano
Quoted 117 lines · Amit Daniel Kachhap

This patch enables core cpuidle timekeeping and irq enabling and remove those redundant parts from the exynos cpuidle drivers

CC Daniel Lezcano<[email protected]>
CC Robert Lee<[email protected]>

---
?arch/arm/mach-exynos/cpuidle.c | ? 53
++++-----------------------------------
?1 files changed, 6 insertions(+), 47 deletions(-)

arch/arm/mach-exynos/cpuidle.c +0 -0
index 33ab4e7..26dac28 100644
@@ -20,6 +20,7 @@

?#include<asm/smp_scu.h>
?#include<asm/suspend.h>
?#include<asm/unified.h>
+#include<asm/cpuidle.h>
?#include<mach/regs-pmu.h>
?#include<mach/pmu.h>

arch/arm/mach-exynos/cpuidle.c +0 -0
@@ -34,22 +35,12 @@
 

?#define S5P_CHECK_AFTR ? ? ? ? ? ? ? ?0xFCBA0D10

-static int exynos4_enter_idle(struct cpuidle_device *dev,
- ? ? ? ? ? ? ? ? ? ? ? struct cpuidle_driver *drv,
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? int index);
?static int exynos4_enter_lowpower(struct cpuidle_device *dev, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct cpuidle_driver *drv, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int index);

?static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
- ? ? ? [0] = {
- ? ? ? ? ? ? ? .enter ? ? ? ? ? ? ? ? ?= exynos4_enter_idle,
- ? ? ? ? ? ? ? .exit_latency ? ? ? ? ? = 1,
- ? ? ? ? ? ? ? .target_residency ? ? ? = 100000,
- ? ? ? ? ? ? ? .flags ? ? ? ? ? ? ? ? ?= CPUIDLE_FLAG_TIME_VALID,
- ? ? ? ? ? ? ? .name ? ? ? ? ? ? ? ? ? = "C0",
- ? ? ? ? ? ? ? .desc ? ? ? ? ? ? ? ? ? = "ARM clock gating(WFI)",
- ? ? ? },
+ ? ? ? [0] = ARM_CPUIDLE_WFI_STATE,
? ? ? ?[1] = {
? ? ? ? ? ? ? ?.enter ? ? ? ? ? ? ? ? ?= exynos4_enter_lowpower, ? ? ? ? ? ? ? ?.exit_latency ? ? ? ? ? = 300,

arch/arm/mach-exynos/cpuidle.c +3 -2
@@ -63,8 +54,9 @@ static struct cpuidle_state exynos4_cpuidle_set[]
 __initdata = {
 ?static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
 
 ?static struct cpuidle_driver exynos4_idle_driver = {
- ? ? ? .name ? ? ? ? ? = "exynos4_idle",
- ? ? ? .owner ? ? ? ? ?= THIS_MODULE,
+ ? ? ? .name ? ? ? ? ? ? ? ? ? = "exynos4_idle",
+ ? ? ? .owner ? ? ? ? ? ? ? ? ?= THIS_MODULE,
+ ? ? ? .en_core_tk_irqen ? ? ? = 1,
 ?};
 

?/* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */

arch/arm/mach-exynos/cpuidle.c +0 -5
@@ -103,13 +95,8 @@ static int exynos4_enter_core0_aftr(struct
 cpuidle_device *dev,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct cpuidle_driver *drv,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int index)
 ?{
- ? ? ? struct timeval before, after;
- ? ? ? int idle_time;
 ? ? ? ?unsigned long tmp;
 
- ? ? ? local_irq_disable();
- ? ? ? do_gettimeofday(&before);
-
 ? ? ? ?exynos4_set_wakeupmask();
 

? ? ? ?/* Set value of power down register for aftr mode */

arch/arm/mach-exynos/cpuidle.c +0 -0
@@ -150,34 +137,6 @@ static int exynos4_enter_core0_aftr(struct
 cpuidle_device *dev,

? ? ? ?/* Clear wakeup state register */
? ? ? ?__raw_writel(0x0, S5P_WAKEUP_STAT);

- ? ? ? do_gettimeofday(&after);

arch/arm/mach-exynos/cpuidle.c +0 -27
-
- ? ? ? local_irq_enable();
- ? ? ? idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
- ? ? ? ? ? ? ? ? ? (after.tv_usec - before.tv_usec);
-
- ? ? ? dev->last_residency = idle_time;
- ? ? ? return index;
-}
-
-static int exynos4_enter_idle(struct cpuidle_device *dev,
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct cpuidle_driver *drv,
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int index)
-{
- ? ? ? struct timeval before, after;
- ? ? ? int idle_time;
-
- ? ? ? local_irq_disable();
- ? ? ? do_gettimeofday(&before);
-
- ? ? ? cpu_do_idle();
-
- ? ? ? do_gettimeofday(&after);
- ? ? ? local_irq_enable();
- ? ? ? idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
- ? ? ? ? ? ? ? ? ? (after.tv_usec - before.tv_usec);
-
- ? ? ? dev->last_residency = idle_time;

? ? ? ?return index;
?}

arch/arm/mach-exynos/cpuidle.c +0 -0
@@ -192,7 +151,7 @@ static int exynos4_enter_lowpower(struct
 cpuidle_device *dev,
 ? ? ? ? ? ? ? ?new_index = drv->safe_state_index;
 
Quoted 6 lines
Quoted 6 lines
arch/arm/mach-exynos/cpuidle.c +1 -1
 ? ? ? ?if (new_index == 0)
- ? ? ? ? ? ? ? return exynos4_enter_idle(dev, drv, new_index);
+ ? ? ? ? ? ? ? return arm_cpuidle_simple_enter(dev, drv, new_index);

? ? ? ?else
? ? ? ? ? ? ? ?return exynos4_enter_core0_aftr(dev, drv, new_index); ?}

Quoted 11 lines

--
?<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro: ?<http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

#3 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

Hi Mr Kukjin,

Any comment or update about this patch?

Regards,
Amit Daniel

Quoted 144 lines · Rob Lee
Quoted 118 lines · Daniel Lezcano
Quoted 117 lines · Amit Daniel Kachhap

This patch enables core cpuidle timekeeping and irq enabling and remove those redundant parts from the exynos cpuidle drivers

CC Daniel Lezcano<[email protected]>
CC Robert Lee<[email protected]>

---
?arch/arm/mach-exynos/cpuidle.c | ? 53
++++-----------------------------------
?1 files changed, 6 insertions(+), 47 deletions(-)

arch/arm/mach-exynos/cpuidle.c +0 -0
index 33ab4e7..26dac28 100644
@@ -20,6 +20,7 @@

?#include<asm/smp_scu.h>
?#include<asm/suspend.h>
?#include<asm/unified.h>
+#include<asm/cpuidle.h>
?#include<mach/regs-pmu.h>
?#include<mach/pmu.h>

arch/arm/mach-exynos/cpuidle.c +0 -0
@@ -34,22 +35,12 @@
 

?#define S5P_CHECK_AFTR ? ? ? ? ? ? ? ?0xFCBA0D10

-static int exynos4_enter_idle(struct cpuidle_device *dev,
- ? ? ? ? ? ? ? ? ? ? ? struct cpuidle_driver *drv,
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? int index);
?static int exynos4_enter_lowpower(struct cpuidle_device *dev, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct cpuidle_driver *drv, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int index);

?static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
- ? ? ? [0] = {
- ? ? ? ? ? ? ? .enter ? ? ? ? ? ? ? ? ?= exynos4_enter_idle,
- ? ? ? ? ? ? ? .exit_latency ? ? ? ? ? = 1,
- ? ? ? ? ? ? ? .target_residency ? ? ? = 100000,
- ? ? ? ? ? ? ? .flags ? ? ? ? ? ? ? ? ?= CPUIDLE_FLAG_TIME_VALID,
- ? ? ? ? ? ? ? .name ? ? ? ? ? ? ? ? ? = "C0",
- ? ? ? ? ? ? ? .desc ? ? ? ? ? ? ? ? ? = "ARM clock gating(WFI)",
- ? ? ? },
+ ? ? ? [0] = ARM_CPUIDLE_WFI_STATE,
? ? ? ?[1] = {
? ? ? ? ? ? ? ?.enter ? ? ? ? ? ? ? ? ?= exynos4_enter_lowpower, ? ? ? ? ? ? ? ?.exit_latency ? ? ? ? ? = 300,

arch/arm/mach-exynos/cpuidle.c +3 -2
@@ -63,8 +54,9 @@ static struct cpuidle_state exynos4_cpuidle_set[]
 __initdata = {
 ?static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
 
 ?static struct cpuidle_driver exynos4_idle_driver = {
- ? ? ? .name ? ? ? ? ? = "exynos4_idle",
- ? ? ? .owner ? ? ? ? ?= THIS_MODULE,
+ ? ? ? .name ? ? ? ? ? ? ? ? ? = "exynos4_idle",
+ ? ? ? .owner ? ? ? ? ? ? ? ? ?= THIS_MODULE,
+ ? ? ? .en_core_tk_irqen ? ? ? = 1,
 ?};
 

?/* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */

arch/arm/mach-exynos/cpuidle.c +0 -5
@@ -103,13 +95,8 @@ static int exynos4_enter_core0_aftr(struct
 cpuidle_device *dev,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct cpuidle_driver *drv,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int index)
 ?{
- ? ? ? struct timeval before, after;
- ? ? ? int idle_time;
 ? ? ? ?unsigned long tmp;
 
- ? ? ? local_irq_disable();
- ? ? ? do_gettimeofday(&before);
-
 ? ? ? ?exynos4_set_wakeupmask();
 

? ? ? ?/* Set value of power down register for aftr mode */

arch/arm/mach-exynos/cpuidle.c +0 -0
@@ -150,34 +137,6 @@ static int exynos4_enter_core0_aftr(struct
 cpuidle_device *dev,

? ? ? ?/* Clear wakeup state register */
? ? ? ?__raw_writel(0x0, S5P_WAKEUP_STAT);

- ? ? ? do_gettimeofday(&after);

arch/arm/mach-exynos/cpuidle.c +0 -27
-
- ? ? ? local_irq_enable();
- ? ? ? idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
- ? ? ? ? ? ? ? ? ? (after.tv_usec - before.tv_usec);
-
- ? ? ? dev->last_residency = idle_time;
- ? ? ? return index;
-}
-
-static int exynos4_enter_idle(struct cpuidle_device *dev,
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct cpuidle_driver *drv,
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int index)
-{
- ? ? ? struct timeval before, after;
- ? ? ? int idle_time;
-
- ? ? ? local_irq_disable();
- ? ? ? do_gettimeofday(&before);
-
- ? ? ? cpu_do_idle();
-
- ? ? ? do_gettimeofday(&after);
- ? ? ? local_irq_enable();
- ? ? ? idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
- ? ? ? ? ? ? ? ? ? (after.tv_usec - before.tv_usec);
-
- ? ? ? dev->last_residency = idle_time;

? ? ? ?return index;
?}

arch/arm/mach-exynos/cpuidle.c +0 -0
@@ -192,7 +151,7 @@ static int exynos4_enter_lowpower(struct
 cpuidle_device *dev,
 ? ? ? ? ? ? ? ?new_index = drv->safe_state_index;
 
Quoted 6 lines
Quoted 6 lines
arch/arm/mach-exynos/cpuidle.c +1 -1
 ? ? ? ?if (new_index == 0)
- ? ? ? ? ? ? ? return exynos4_enter_idle(dev, drv, new_index);
+ ? ? ? ? ? ? ? return arm_cpuidle_simple_enter(dev, drv, new_index);

? ? ? ?else
? ? ? ? ? ? ? ?return exynos4_enter_core0_aftr(dev, drv, new_index); ?}

Quoted 11 lines

--
?<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro: ?<http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo at vger.kernel.org
More majordomo info at ?http://vger.kernel.org/majordomo-info.html

#4 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

Quoted 5 lines · amit kachhap

Hi Mr Kukjin,

Any comment or update about this patch?

I'm not sure we don't need to check the idle_time? Others, looks ok to me.

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.

Quoted 150 lines

Regards,
Amit Daniel

Quoted 120 lines · Rob Lee
Quoted 118 lines · Daniel Lezcano
Quoted 117 lines · Amit Daniel Kachhap

This patch enables core cpuidle timekeeping and irq enabling and remove those redundant parts from the exynos cpuidle drivers

CC Daniel Lezcano<[email protected]>
CC Robert Lee<[email protected]>
---
 arch/arm/mach-exynos/cpuidle.c |   53
++++-----------------------------------
 1 files changed, 6 insertions(+), 47 deletions(-)
arch/arm/mach-exynos/cpuidle.c +5 -13
index 33ab4e7..26dac28 100644
@@ -20,6 +20,7 @@
 #include<asm/smp_scu.h>
 #include<asm/suspend.h>
 #include<asm/unified.h>
+#include<asm/cpuidle.h>
 #include<mach/regs-pmu.h>
 #include<mach/pmu.h>
 
@@ -34,22 +35,12 @@
 
 #define S5P_CHECK_AFTR                0xFCBA0D10
 
-static int exynos4_enter_idle(struct cpuidle_device *dev,
-                       struct cpuidle_driver *drv,
-                             int index);
 static int exynos4_enter_lowpower(struct cpuidle_device *dev,
                               struct cpuidle_driver *drv,
                               int index);
 
 static struct cpuidle_state exynos4_cpuidle_set[] __initdata = {
-       [0] = {
-               .enter                  = exynos4_enter_idle,
-               .exit_latency           = 1,
-               .target_residency       = 100000,
-               .flags                  = CPUIDLE_FLAG_TIME_VALID,
-               .name                   = "C0",
-               .desc                   = "ARM clock gating(WFI)",
-       },
+       [0] = ARM_CPUIDLE_WFI_STATE,
       [1] = {
               .enter                  = exynos4_enter_lowpower,
               .exit_latency           = 300,
@@ -63,8 +54,9 @@ static struct cpuidle_state exynos4_cpuidle_set[]
 __initdata = {
 static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device);
 
 static struct cpuidle_driver exynos4_idle_driver = {
-       .name           = "exynos4_idle",
-       .owner          = THIS_MODULE,
+       .name                   = "exynos4_idle",
+       .owner                  = THIS_MODULE,
+       .en_core_tk_irqen       = 1,
 };
 

/* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */

arch/arm/mach-exynos/cpuidle.c +0 -5
@@ -103,13 +95,8 @@ static int exynos4_enter_core0_aftr(struct
 cpuidle_device *dev,
                               struct cpuidle_driver *drv,
                               int index)
 {
-       struct timeval before, after;
-       int idle_time;
       unsigned long tmp;
 
-       local_irq_disable();
-       do_gettimeofday(&before);
-
       exynos4_set_wakeupmask();
 
       /* Set value of power down register for aftr mode */
arch/arm/mach-exynos/cpuidle.c +0 -28
@@ -150,34 +137,6 @@ static int exynos4_enter_core0_aftr(struct
 cpuidle_device *dev,
       /* Clear wakeup state register */
       __raw_writel(0x0, S5P_WAKEUP_STAT);
 
-       do_gettimeofday(&after);
-
-       local_irq_enable();
-       idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
-                   (after.tv_usec - before.tv_usec);
-
-       dev->last_residency = idle_time;
-       return index;
-}
-
-static int exynos4_enter_idle(struct cpuidle_device *dev,
-                               struct cpuidle_driver *drv,
-                               int index)
-{
-       struct timeval before, after;
-       int idle_time;
-
-       local_irq_disable();
-       do_gettimeofday(&before);
-
-       cpu_do_idle();
-
-       do_gettimeofday(&after);
-       local_irq_enable();
-       idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC +
-                   (after.tv_usec - before.tv_usec);
-
-       dev->last_residency = idle_time;
       return index;
 }
@@ -192,7 +151,7 @@ static int exynos4_enter_lowpower(struct
 cpuidle_device *dev,
               new_index = drv->safe_state_index;
 
Quoted 15 lines
Quoted 6 lines
Quoted 6 lines
arch/arm/mach-exynos/cpuidle.c +1 -1
       if (new_index == 0)
-               return exynos4_enter_idle(dev, drv, new_index);
+               return arm_cpuidle_simple_enter(dev, drv, new_index);
       else
               return exynos4_enter_core0_aftr(dev, drv, new_index);

}

Quoted 6 lines

--
<http://www.linaro.org/> Linaro.org ? Open source software for ARM

SoCs

Quoted 7 lines
Quoted 5 lines

Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-

soc" in

Quoted 2 lines

the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

Quoted 8 lines · Kukjin Kim
Quoted 5 lines · amit kachhap

Hi Mr Kukjin,

Any comment or update about this patch?

I'm not sure we don't need to check the idle_time? Others, looks ok to me.

Hi,

may be I misunderstood your question but the behavior is not changed here, just the code is refactored and using a common routine where the time is computed.

The idle_time computation is done by the cpuidle core now if the en_core_tk_irqen flag is enabled. That allows to remove a lot of duplicated code across the cpuidle drivers.

Thanks
-- Daniel

#6 lore raw

PATCH 1/1 ARM: exynos: Adapt to cpuidle core time keeping and irq enable

Quoted 13 lines · Daniel Lezcano
Quoted 8 lines · Kukjin Kim
Quoted 5 lines · amit kachhap

Hi Mr Kukjin,

Any comment or update about this patch?

I'm not sure we don't need to check the idle_time? Others, looks ok to me.

Hi,

Quoted 8 lines

may be I misunderstood your question but the behavior is not changed here, just the code is refactored and using a common routine where the time is computed.

The idle_time computation is done by the cpuidle core now if the en_core_tk_irqen flag is enabled. That allows to remove a lot of duplicated code across the cpuidle drivers.

OK, I see and checked. Daniel, thanks.

Amit, this looks ok to me, will apply.
Thanks.

Best regards,
Kgene.
--
Kukjin Kim <[email protected]>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd.