Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54a4644b authored by Daniel Lezcano's avatar Daniel Lezcano Committed by Rafael J. Wysocki
Browse files

ARM: imx: cpuidle: use init/exit common routine



The code intializes the cpuidle driver at different places.
The cpuidle driver for :
  * imx5 : is in the pm-imx5.c, the init function is in cpuidle.c
  * imx6 : is in cpuidle-imx6q.c, the init function is in cpuidle.c
           and cpuidle-imx6q.c

Instead of having the cpuidle code spread across different files,
let's create a driver for each SoC and use the common register function.

Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 3aec0345
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o
obj-$(CONFIG_CPU_FREQ_IMX)    += cpufreq.o

ifeq ($(CONFIG_CPU_IDLE),y)
obj-y += cpuidle.o
obj-$(CONFIG_SOC_IMX5) += cpuidle-imx5.o
obj-$(CONFIG_SOC_IMX6Q) += cpuidle-imx6q.o
endif

+37 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 Freescale Semiconductor, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/cpuidle.h>
#include <linux/module.h>
#include <asm/system_misc.h>

static int imx5_cpuidle_enter(struct cpuidle_device *dev,
			      struct cpuidle_driver *drv, int index)
{
	arm_pm_idle();
	return index;
}

static struct cpuidle_driver imx5_cpuidle_driver = {
	.name             = "imx5_cpuidle",
	.owner            = THIS_MODULE,
	.states[0] = {
		.enter            = imx5_cpuidle_enter,
		.exit_latency     = 2,
		.target_residency = 1,
		.flags            = CPUIDLE_FLAG_TIME_VALID,
		.name             = "IMX5 SRPG",
		.desc             = "CPU state retained,powered off",
	},
	.state_count = 1,
};

int __init imx5_cpuidle_init(void)
{
	return cpuidle_register(&imx5_cpuidle_driver, NULL);
}
+1 −1
Original line number Diff line number Diff line
@@ -71,5 +71,5 @@ int __init imx6q_cpuidle_init(void)
	/* Set chicken bit to get a reliable WAIT mode support */
	imx6q_set_chicken_bit();

	return imx_cpuidle_init(&imx6q_cpuidle_driver);
	return cpuidle_register(&imx6q_cpuidle_driver, NULL);
}

arch/arm/mach-imx/cpuidle.c

deleted100644 → 0
+0 −80
Original line number Diff line number Diff line
/*
 * Copyright 2012 Freescale Semiconductor, Inc.
 * Copyright 2012 Linaro Ltd.
 *
 * The code contained herein is licensed under the GNU General Public
 * License. You may obtain a copy of the GNU General Public License
 * Version 2 or later at the following locations:
 *
 * http://www.opensource.org/licenses/gpl-license.html
 * http://www.gnu.org/copyleft/gpl.html
 */

#include <linux/cpuidle.h>
#include <linux/err.h>
#include <linux/hrtimer.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/slab.h>

static struct cpuidle_device __percpu * imx_cpuidle_devices;

static void __init imx_cpuidle_devices_uninit(void)
{
	int cpu_id;
	struct cpuidle_device *dev;

	for_each_possible_cpu(cpu_id) {
		dev = per_cpu_ptr(imx_cpuidle_devices, cpu_id);
		cpuidle_unregister_device(dev);
	}

	free_percpu(imx_cpuidle_devices);
}

int __init imx_cpuidle_init(struct cpuidle_driver *drv)
{
	struct cpuidle_device *dev;
	int cpu_id, ret;

	if (drv->state_count > CPUIDLE_STATE_MAX) {
		pr_err("%s: state_count exceeds maximum\n", __func__);
		return -EINVAL;
	}

	ret = cpuidle_register_driver(drv);
	if (ret) {
		pr_err("%s: Failed to register cpuidle driver with error: %d\n",
			 __func__, ret);
		return ret;
	}

	imx_cpuidle_devices = alloc_percpu(struct cpuidle_device);
	if (imx_cpuidle_devices == NULL) {
		ret = -ENOMEM;
		goto unregister_drv;
	}

	/* initialize state data for each cpuidle_device */
	for_each_possible_cpu(cpu_id) {
		dev = per_cpu_ptr(imx_cpuidle_devices, cpu_id);
		dev->cpu = cpu_id;
		dev->state_count = drv->state_count;

		ret = cpuidle_register_device(dev);
		if (ret) {
			pr_err("%s: Failed to register cpu %u, error: %d\n",
				__func__, cpu_id, ret);
			goto uninit;
		}
	}

	return 0;

uninit:
	imx_cpuidle_devices_uninit();

unregister_drv:
	cpuidle_unregister_driver(drv);
	return ret;
}
+4 −6
Original line number Diff line number Diff line
@@ -10,18 +10,16 @@
 * http://www.gnu.org/copyleft/gpl.html
 */

#include <linux/cpuidle.h>

#ifdef CONFIG_CPU_IDLE
extern int imx_cpuidle_init(struct cpuidle_driver *drv);
extern int imx5_cpuidle_init(void);
extern int imx6q_cpuidle_init(void);
#else
static inline int imx_cpuidle_init(struct cpuidle_driver *drv)
static inline int imx5_cpuidle_init(void)
{
	return -ENODEV;
	return 0;
}
static inline int imx6q_cpuidle_init(void)
{
	return -ENODEV;
	return 0;
}
#endif
Loading