[PATCH v7 8/8] drivers: cpuidle: initialize Exynos driver through DT

Lina Iyer lina.iyer at linaro.org
Fri Aug 15 14:12:33 PDT 2014


On Wed, Aug 13, 2014 at 04:52:07PM +0100, Lorenzo Pieralisi wrote:
>With the introduction of DT based idle states, CPUidle drivers for
>ARM can now initialize idle states data through properties in the device
>tree.
>
>This patch adds code to the Exynos CPUidle driver to dynamically
>initialize idle states data through the updated device tree source
>files.
>
>Cc: Chander Kashyap <k.chander at samsung.com>
>Cc: Kukjin Kim <kgene.kim at samsung.com>
>Cc: Tomasz Figa <t.figa at samsung.com>
>Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
>---
> arch/arm/boot/dts/exynos4210.dtsi | 11 +++++++++++
> arch/arm/boot/dts/exynos5250.dtsi | 11 +++++++++++
> drivers/cpuidle/Kconfig.arm       |  1 +
> drivers/cpuidle/cpuidle-exynos.c  | 27 ++++++++++++++++++++++++---
> 4 files changed, 47 insertions(+), 3 deletions(-)
>
>diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi
>index eab7c7b..69fd1a0 100644
>--- a/arch/arm/boot/dts/exynos4210.dtsi
>+++ b/arch/arm/boot/dts/exynos4210.dtsi
>@@ -48,12 +48,23 @@
> 			device_type = "cpu";
> 			compatible = "arm,cortex-a9";
> 			reg = <0x900>;
>+			cpu-idle-states = <&CLUSTER_SLEEP_0>;
> 		};
>
> 		cpu at 901 {
> 			device_type = "cpu";
> 			compatible = "arm,cortex-a9";
> 			reg = <0x901>;
>+			cpu-idle-states = <&CLUSTER_SLEEP_0>;
>+		};
>+
>+		idle-states {
>+			CLUSTER_SLEEP_0: cluster-sleep-0 {
>+				compatible = "arm,idle-state";
>+				entry-latency-us = <1000>;
>+				exit-latency-us = <300>;
>+				min-residency-us = <100000>;
>+			};
> 		};
> 	};
>
>diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi
>index 492e1ef..3a758ff 100644
>--- a/arch/arm/boot/dts/exynos5250.dtsi
>+++ b/arch/arm/boot/dts/exynos5250.dtsi
>@@ -63,12 +63,23 @@
> 			compatible = "arm,cortex-a15";
> 			reg = <0>;
> 			clock-frequency = <1700000000>;
>+			cpu-idle-states = <&CLUSTER_SLEEP_0>;
> 		};
> 		cpu at 1 {
> 			device_type = "cpu";
> 			compatible = "arm,cortex-a15";
> 			reg = <1>;
> 			clock-frequency = <1700000000>;
>+			cpu-idle-states = <&CLUSTER_SLEEP_0>;
>+		};
>+
>+		idle-states {
>+			CLUSTER_SLEEP_0: cluster-sleep-0 {
>+				compatible = "arm,idle-state";
>+				entry-latency-us = <1000>;
>+				exit-latency-us = <300>;
>+				min-residency-us = <100000>;
>+			};
> 		};
> 	};
>
>diff --git a/drivers/cpuidle/Kconfig.arm b/drivers/cpuidle/Kconfig.arm
>index e339c7f..04cc229 100644
>--- a/drivers/cpuidle/Kconfig.arm
>+++ b/drivers/cpuidle/Kconfig.arm
>@@ -55,6 +55,7 @@ config ARM_AT91_CPUIDLE
> config ARM_EXYNOS_CPUIDLE
> 	bool "Cpu Idle Driver for the Exynos processors"
> 	depends on ARCH_EXYNOS
>+	select DT_IDLE_STATES
> 	help
> 	  Select this to enable cpuidle for Exynos processors
>
>diff --git a/drivers/cpuidle/cpuidle-exynos.c b/drivers/cpuidle/cpuidle-exynos.c
>index ba9b34b..6dff982 100644
>--- a/drivers/cpuidle/cpuidle-exynos.c
>+++ b/drivers/cpuidle/cpuidle-exynos.c
>@@ -13,11 +13,14 @@
> #include <linux/export.h>
> #include <linux/module.h>
> #include <linux/platform_device.h>
>+#include <linux/slab.h>
>
> #include <asm/proc-fns.h>
> #include <asm/suspend.h>
> #include <asm/cpuidle.h>
>
>+#include "dt_idle_states.h"
>+
> static void (*exynos_enter_aftr)(void);
>
> static int exynos_enter_lowpower(struct cpuidle_device *dev,
>@@ -58,17 +61,35 @@ static struct cpuidle_driver exynos_idle_driver = {
>
> static int exynos_cpuidle_probe(struct platform_device *pdev)
> {
>-	int ret;
>+	int ret, i;
>+	struct cpuidle_driver *drv = &exynos_idle_driver;
>
> 	exynos_enter_aftr = (void *)(pdev->dev.platform_data);
>
>-	ret = cpuidle_register(&exynos_idle_driver, NULL);
>+	drv->cpumask = kzalloc(cpumask_size(), GFP_KERNEL);
>+	if (!drv->cpumask)
>+		return -ENOMEM;
drv->cpumask would not have any cpu set. I dont see it being modified
elsewhere.
>+
>+	/* Start at index 1, index 0 standard WFI */
>+	ret = dt_init_idle_driver(drv, 1);
>+	if (ret < 0) {
>+		dev_err(&pdev->dev, "failed to initialize idle states\n");
>+		goto free_mem;
>+	}
>+
>+	for (i = 1; i < drv->state_count; i++)
>+		drv->states[i].enter = exynos_enter_lowpower;
>+
>+	ret = cpuidle_register(drv, NULL);
> 	if (ret) {
> 		dev_err(&pdev->dev, "failed to register cpuidle driver\n");
>-		return ret;
>+		goto free_mem;
> 	}
>
> 	return 0;
>+free_mem:
>+	kfree(drv->cpumask);
>+	return ret;
> }
>
> static struct platform_driver exynos_cpuidle_driver = {
>-- 
>1.9.1
>
>



More information about the linux-arm-kernel mailing list