提交 1773232e 编写于 作者: R Rafael J. Wysocki

Merge branch 'pm-cpuidle'

* pm-cpuidle:
  ARM: AT91: DT: pm: Select ram controller standby based on DT
  ARM: AT91: pm: Factorize standby function
  ARM: at91: cpuidle: Move driver to drivers/cpuidle
  ARM: at91: cpuidle: Convert to platform driver
  ARM: ux500: cpuidle: fix section mismatch
  ARM: zynq: cpuidle: convert to platform driver
  ARM: zynq: cpuidle: Remove useless compatibility string
  drivers: cpuidle: rename ARM big.LITTLE driver config and makefile entries
  ARM: EXYNOS: convert cpuidle driver to be a platform driver
  intel_idle: mark some functions with __init tag
  intel_idle: mark states tables with __initdata tag
  intel_idle: shrink states tables
...@@ -98,7 +98,6 @@ obj-y += leds.o ...@@ -98,7 +98,6 @@ obj-y += leds.o
# Power Management # Power Management
obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_PM) += pm.o
obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
ifeq ($(CONFIG_PM_DEBUG),y) ifeq ($(CONFIG_PM_DEBUG),y)
CFLAGS_pm.o += -DDEBUG CFLAGS_pm.o += -DDEBUG
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
#include "sam9_smc.h" #include "sam9_smc.h"
#include "pm.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* Clocks * Clocks
...@@ -327,6 +328,7 @@ static void __init at91rm9200_ioremap_registers(void) ...@@ -327,6 +328,7 @@ static void __init at91rm9200_ioremap_registers(void)
{ {
at91rm9200_ioremap_st(AT91RM9200_BASE_ST); at91rm9200_ioremap_st(AT91RM9200_BASE_ST);
at91_ioremap_ramc(0, AT91RM9200_BASE_MC, 256); at91_ioremap_ramc(0, AT91RM9200_BASE_MC, 256);
at91_pm_set_standby(at91rm9200_standby);
} }
static void __init at91rm9200_initialize(void) static void __init at91rm9200_initialize(void)
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
#include "sam9_smc.h" #include "sam9_smc.h"
#include "pm.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* Clocks * Clocks
...@@ -342,6 +343,7 @@ static void __init at91sam9260_ioremap_registers(void) ...@@ -342,6 +343,7 @@ static void __init at91sam9260_ioremap_registers(void)
at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT); at91sam926x_ioremap_pit(AT91SAM9260_BASE_PIT);
at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC); at91sam9_ioremap_smc(0, AT91SAM9260_BASE_SMC);
at91_ioremap_matrix(AT91SAM9260_BASE_MATRIX); at91_ioremap_matrix(AT91SAM9260_BASE_MATRIX);
at91_pm_set_standby(at91sam9_sdram_standby);
} }
static void __init at91sam9260_initialize(void) static void __init at91sam9260_initialize(void)
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
#include "sam9_smc.h" #include "sam9_smc.h"
#include "pm.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* Clocks * Clocks
...@@ -284,6 +285,7 @@ static void __init at91sam9261_ioremap_registers(void) ...@@ -284,6 +285,7 @@ static void __init at91sam9261_ioremap_registers(void)
at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT); at91sam926x_ioremap_pit(AT91SAM9261_BASE_PIT);
at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC); at91sam9_ioremap_smc(0, AT91SAM9261_BASE_SMC);
at91_ioremap_matrix(AT91SAM9261_BASE_MATRIX); at91_ioremap_matrix(AT91SAM9261_BASE_MATRIX);
at91_pm_set_standby(at91sam9_sdram_standby);
} }
static void __init at91sam9261_initialize(void) static void __init at91sam9261_initialize(void)
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
#include "sam9_smc.h" #include "sam9_smc.h"
#include "pm.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* Clocks * Clocks
...@@ -321,6 +322,7 @@ static void __init at91sam9263_ioremap_registers(void) ...@@ -321,6 +322,7 @@ static void __init at91sam9263_ioremap_registers(void)
at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0); at91sam9_ioremap_smc(0, AT91SAM9263_BASE_SMC0);
at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1); at91sam9_ioremap_smc(1, AT91SAM9263_BASE_SMC1);
at91_ioremap_matrix(AT91SAM9263_BASE_MATRIX); at91_ioremap_matrix(AT91SAM9263_BASE_MATRIX);
at91_pm_set_standby(at91sam9_sdram_standby);
} }
static void __init at91sam9263_initialize(void) static void __init at91sam9263_initialize(void)
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
#include "sam9_smc.h" #include "sam9_smc.h"
#include "pm.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* Clocks * Clocks
...@@ -370,6 +371,7 @@ static void __init at91sam9g45_ioremap_registers(void) ...@@ -370,6 +371,7 @@ static void __init at91sam9g45_ioremap_registers(void)
at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT); at91sam926x_ioremap_pit(AT91SAM9G45_BASE_PIT);
at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC); at91sam9_ioremap_smc(0, AT91SAM9G45_BASE_SMC);
at91_ioremap_matrix(AT91SAM9G45_BASE_MATRIX); at91_ioremap_matrix(AT91SAM9G45_BASE_MATRIX);
at91_pm_set_standby(at91_ddr_standby);
} }
static void __init at91sam9g45_initialize(void) static void __init at91sam9g45_initialize(void)
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "generic.h" #include "generic.h"
#include "clock.h" #include "clock.h"
#include "sam9_smc.h" #include "sam9_smc.h"
#include "pm.h"
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
* Clocks * Clocks
...@@ -287,6 +288,7 @@ static void __init at91sam9rl_ioremap_registers(void) ...@@ -287,6 +288,7 @@ static void __init at91sam9rl_ioremap_registers(void)
at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT); at91sam926x_ioremap_pit(AT91SAM9RL_BASE_PIT);
at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC); at91sam9_ioremap_smc(0, AT91SAM9RL_BASE_SMC);
at91_ioremap_matrix(AT91SAM9RL_BASE_MATRIX); at91_ioremap_matrix(AT91SAM9RL_BASE_MATRIX);
at91_pm_set_standby(at91sam9_sdram_standby);
} }
static void __init at91sam9rl_initialize(void) static void __init at91sam9rl_initialize(void)
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
#include "at91_rstc.h" #include "at91_rstc.h"
#include "at91_shdwc.h" #include "at91_shdwc.h"
static void (*at91_pm_standby)(void);
static void __init show_reset_status(void) static void __init show_reset_status(void)
{ {
static char reset[] __initdata = "reset"; static char reset[] __initdata = "reset";
...@@ -266,14 +268,8 @@ static int at91_pm_enter(suspend_state_t state) ...@@ -266,14 +268,8 @@ static int at91_pm_enter(suspend_state_t state)
* For ARM 926 based chips, this requirement is weaker * For ARM 926 based chips, this requirement is weaker
* as at91sam9 can access a RAM in self-refresh mode. * as at91sam9 can access a RAM in self-refresh mode.
*/ */
if (cpu_is_at91rm9200()) if (at91_pm_standby)
at91rm9200_standby(); at91_pm_standby();
else if (cpu_is_at91sam9g45())
at91sam9g45_standby();
else if (cpu_is_at91sam9263())
at91sam9263_standby();
else
at91sam9_standby();
break; break;
case PM_SUSPEND_ON: case PM_SUSPEND_ON:
...@@ -314,6 +310,18 @@ static const struct platform_suspend_ops at91_pm_ops = { ...@@ -314,6 +310,18 @@ static const struct platform_suspend_ops at91_pm_ops = {
.end = at91_pm_end, .end = at91_pm_end,
}; };
static struct platform_device at91_cpuidle_device = {
.name = "cpuidle-at91",
};
void at91_pm_set_standby(void (*at91_standby)(void))
{
if (at91_standby) {
at91_cpuidle_device.dev.platform_data = at91_standby;
at91_pm_standby = at91_standby;
}
}
static int __init at91_pm_init(void) static int __init at91_pm_init(void)
{ {
#ifdef CONFIG_AT91_SLOW_CLOCK #ifdef CONFIG_AT91_SLOW_CLOCK
...@@ -326,6 +334,9 @@ static int __init at91_pm_init(void) ...@@ -326,6 +334,9 @@ static int __init at91_pm_init(void)
if (cpu_is_at91rm9200()) if (cpu_is_at91rm9200())
at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0); at91_ramc_write(0, AT91RM9200_SDRAMC_LPR, 0);
if (at91_cpuidle_device.dev.platform_data)
platform_device_register(&at91_cpuidle_device);
suspend_set_ops(&at91_pm_ops); suspend_set_ops(&at91_pm_ops);
show_reset_status(); show_reset_status();
......
...@@ -11,9 +11,13 @@ ...@@ -11,9 +11,13 @@
#ifndef __ARCH_ARM_MACH_AT91_PM #ifndef __ARCH_ARM_MACH_AT91_PM
#define __ARCH_ARM_MACH_AT91_PM #define __ARCH_ARM_MACH_AT91_PM
#include <asm/proc-fns.h>
#include <mach/at91_ramc.h> #include <mach/at91_ramc.h>
#include <mach/at91rm9200_sdramc.h> #include <mach/at91rm9200_sdramc.h>
extern void at91_pm_set_standby(void (*at91_standby)(void));
/* /*
* The AT91RM9200 goes into self-refresh mode with this command, and will * The AT91RM9200 goes into self-refresh mode with this command, and will
* terminate self-refresh automatically on the next SDRAM access. * terminate self-refresh automatically on the next SDRAM access.
...@@ -45,16 +49,18 @@ static inline void at91rm9200_standby(void) ...@@ -45,16 +49,18 @@ static inline void at91rm9200_standby(void)
/* We manage both DDRAM/SDRAM controllers, we need more than one value to /* We manage both DDRAM/SDRAM controllers, we need more than one value to
* remember. * remember.
*/ */
static inline void at91sam9g45_standby(void) static inline void at91_ddr_standby(void)
{ {
/* Those two values allow us to delay self-refresh activation /* Those two values allow us to delay self-refresh activation
* to the maximum. */ * to the maximum. */
u32 lpr0, lpr1; u32 lpr0, lpr1 = 0;
u32 saved_lpr0, saved_lpr1; u32 saved_lpr0, saved_lpr1 = 0;
if (at91_ramc_base[1]) {
saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR); saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR);
lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB; lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB;
lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH; lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH;
}
saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR); saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB; lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
...@@ -62,25 +68,29 @@ static inline void at91sam9g45_standby(void) ...@@ -62,25 +68,29 @@ static inline void at91sam9g45_standby(void)
/* self-refresh mode now */ /* self-refresh mode now */
at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0); at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
if (at91_ramc_base[1])
at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1); at91_ramc_write(1, AT91_DDRSDRC_LPR, lpr1);
cpu_do_idle(); cpu_do_idle();
at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
if (at91_ramc_base[1])
at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
} }
/* We manage both DDRAM/SDRAM controllers, we need more than one value to /* We manage both DDRAM/SDRAM controllers, we need more than one value to
* remember. * remember.
*/ */
static inline void at91sam9263_standby(void) static inline void at91sam9_sdram_standby(void)
{ {
u32 lpr0, lpr1; u32 lpr0, lpr1 = 0;
u32 saved_lpr0, saved_lpr1; u32 saved_lpr0, saved_lpr1 = 0;
if (at91_ramc_base[1]) {
saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR); saved_lpr1 = at91_ramc_read(1, AT91_SDRAMC_LPR);
lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB; lpr1 = saved_lpr1 & ~AT91_SDRAMC_LPCB;
lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH; lpr1 |= AT91_SDRAMC_LPCB_SELF_REFRESH;
}
saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR); saved_lpr0 = at91_ramc_read(0, AT91_SDRAMC_LPR);
lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB; lpr0 = saved_lpr0 & ~AT91_SDRAMC_LPCB;
...@@ -88,27 +98,14 @@ static inline void at91sam9263_standby(void) ...@@ -88,27 +98,14 @@ static inline void at91sam9263_standby(void)
/* self-refresh mode now */ /* self-refresh mode now */
at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0); at91_ramc_write(0, AT91_SDRAMC_LPR, lpr0);
if (at91_ramc_base[1])
at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1); at91_ramc_write(1, AT91_SDRAMC_LPR, lpr1);
cpu_do_idle(); cpu_do_idle();
at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0); at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr0);
if (at91_ramc_base[1])
at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1); at91_ramc_write(1, AT91_SDRAMC_LPR, saved_lpr1);
} }
static inline void at91sam9_standby(void)
{
u32 saved_lpr, lpr;
saved_lpr = at91_ramc_read(0, AT91_SDRAMC_LPR);
lpr = saved_lpr & ~AT91_SDRAMC_LPCB;
at91_ramc_write(0, AT91_SDRAMC_LPR, lpr |
AT91_SDRAMC_LPCB_SELF_REFRESH);
cpu_do_idle();
at91_ramc_write(0, AT91_SDRAMC_LPR, saved_lpr);
}
#endif #endif
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "at91_shdwc.h" #include "at91_shdwc.h"
#include "soc.h" #include "soc.h"
#include "generic.h" #include "generic.h"
#include "pm.h"
struct at91_init_soc __initdata at91_boot_soc; struct at91_init_soc __initdata at91_boot_soc;
...@@ -376,15 +377,16 @@ static void at91_dt_rstc(void) ...@@ -376,15 +377,16 @@ static void at91_dt_rstc(void)
} }
static struct of_device_id ramc_ids[] = { static struct of_device_id ramc_ids[] = {
{ .compatible = "atmel,at91rm9200-sdramc" }, { .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby },
{ .compatible = "atmel,at91sam9260-sdramc" }, { .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby },
{ .compatible = "atmel,at91sam9g45-ddramc" }, { .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby },
{ /*sentinel*/ } { /*sentinel*/ }
}; };
static void at91_dt_ramc(void) static void at91_dt_ramc(void)
{ {
struct device_node *np; struct device_node *np;
const struct of_device_id *of_id;
np = of_find_matching_node(NULL, ramc_ids); np = of_find_matching_node(NULL, ramc_ids);
if (!np) if (!np)
...@@ -396,6 +398,12 @@ static void at91_dt_ramc(void) ...@@ -396,6 +398,12 @@ static void at91_dt_ramc(void)
/* the controller may have 2 banks */ /* the controller may have 2 banks */
at91_ramc_base[1] = of_iomap(np, 1); at91_ramc_base[1] = of_iomap(np, 1);
of_id = of_match_node(ramc_ids, np);
if (!of_id)
pr_warn("AT91: ramc no standby function available\n");
else
at91_pm_set_standby(of_id->data);
of_node_put(np); of_node_put(np);
} }
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/irqchip/arm-gic.h> #include <linux/irqchip/arm-gic.h>
#include <linux/irqchip/chained_irq.h> #include <linux/irqchip/chained_irq.h>
#include <linux/platform_device.h>
#include <asm/proc-fns.h> #include <asm/proc-fns.h>
#include <asm/exception.h> #include <asm/exception.h>
...@@ -294,6 +295,16 @@ void exynos5_restart(enum reboot_mode mode, const char *cmd) ...@@ -294,6 +295,16 @@ void exynos5_restart(enum reboot_mode mode, const char *cmd)
__raw_writel(val, addr); __raw_writel(val, addr);
} }
static struct platform_device exynos_cpuidle = {
.name = "exynos_cpuidle",
.id = -1,
};
void __init exynos_cpuidle_init(void)
{
platform_device_register(&exynos_cpuidle);
}
void __init exynos_init_late(void) void __init exynos_init_late(void)
{ {
if (of_machine_is_compatible("samsung,exynos5440")) if (of_machine_is_compatible("samsung,exynos5440"))
......
...@@ -22,6 +22,7 @@ struct map_desc; ...@@ -22,6 +22,7 @@ struct map_desc;
void exynos_init_io(void); void exynos_init_io(void);
void exynos4_restart(enum reboot_mode mode, const char *cmd); void exynos4_restart(enum reboot_mode mode, const char *cmd);
void exynos5_restart(enum reboot_mode mode, const char *cmd); void exynos5_restart(enum reboot_mode mode, const char *cmd);
void exynos_cpuidle_init(void);
void exynos_init_late(void); void exynos_init_late(void);
void exynos_firmware_init(void); void exynos_firmware_init(void);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/platform_device.h>
#include <asm/proc-fns.h> #include <asm/proc-fns.h>
#include <asm/smp_scu.h> #include <asm/smp_scu.h>
...@@ -192,7 +193,7 @@ static void __init exynos5_core_down_clk(void) ...@@ -192,7 +193,7 @@ static void __init exynos5_core_down_clk(void)
__raw_writel(tmp, EXYNOS5_PWR_CTRL2); __raw_writel(tmp, EXYNOS5_PWR_CTRL2);
} }
static int __init exynos4_init_cpuidle(void) static int __init exynos_cpuidle_probe(struct platform_device *pdev)
{ {
int cpu_id, ret; int cpu_id, ret;
struct cpuidle_device *device; struct cpuidle_device *device;
...@@ -226,4 +227,13 @@ static int __init exynos4_init_cpuidle(void) ...@@ -226,4 +227,13 @@ static int __init exynos4_init_cpuidle(void)
return 0; return 0;
} }
device_initcall(exynos4_init_cpuidle);
static struct platform_driver exynos_cpuidle_driver = {
.probe = exynos_cpuidle_probe,
.driver = {
.name = "exynos_cpuidle",
.owner = THIS_MODULE,
},
};
module_platform_driver(exynos_cpuidle_driver);
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
static void __init exynos4_dt_machine_init(void) static void __init exynos4_dt_machine_init(void)
{ {
exynos_cpuidle_init();
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
} }
......
...@@ -47,6 +47,8 @@ static void __init exynos5_dt_machine_init(void) ...@@ -47,6 +47,8 @@ static void __init exynos5_dt_machine_init(void)
} }
} }
exynos_cpuidle_init();
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
} }
......
...@@ -44,6 +44,10 @@ static struct of_device_id zynq_of_bus_ids[] __initdata = { ...@@ -44,6 +44,10 @@ static struct of_device_id zynq_of_bus_ids[] __initdata = {
{} {}
}; };
static struct platform_device zynq_cpuidle_device = {
.name = "cpuidle-zynq",
};
/** /**
* zynq_init_machine - System specific initialization, intended to be * zynq_init_machine - System specific initialization, intended to be
* called from board specific initialization. * called from board specific initialization.
...@@ -56,6 +60,8 @@ static void __init zynq_init_machine(void) ...@@ -56,6 +60,8 @@ static void __init zynq_init_machine(void)
l2x0_of_init(0x02060000, 0xF0F0FFFF); l2x0_of_init(0x02060000, 0xF0F0FFFF);
of_platform_bus_probe(NULL, zynq_of_bus_ids, NULL); of_platform_bus_probe(NULL, zynq_of_bus_ids, NULL);
platform_device_register(&zynq_cpuidle_device);
} }
static void __init zynq_timer_init(void) static void __init zynq_timer_init(void)
......
...@@ -2,6 +2,17 @@ ...@@ -2,6 +2,17 @@
# ARM CPU Idle drivers # ARM CPU Idle drivers
# #
config ARM_BIG_LITTLE_CPUIDLE
bool "Support for ARM big.LITTLE processors"
depends on ARCH_VEXPRESS_TC2_PM
select ARM_CPU_SUSPEND
select CPU_IDLE_MULTIPLE_DRIVERS
help
Select this option to enable CPU idle driver for big.LITTLE based
ARM systems. Driver manages CPUs coordination through MCPM and
define different C-states for little and big cores through the
multiple CPU idle drivers infrastructure.
config ARM_HIGHBANK_CPUIDLE config ARM_HIGHBANK_CPUIDLE
bool "CPU Idle Driver for Calxeda processors" bool "CPU Idle Driver for Calxeda processors"
depends on ARCH_HIGHBANK depends on ARCH_HIGHBANK
...@@ -27,13 +38,9 @@ config ARM_U8500_CPUIDLE ...@@ -27,13 +38,9 @@ config ARM_U8500_CPUIDLE
help help
Select this to enable cpuidle for ST-E u8500 processors Select this to enable cpuidle for ST-E u8500 processors
config CPU_IDLE_BIG_LITTLE config ARM_AT91_CPUIDLE
bool "Support for ARM big.LITTLE processors" bool "Cpu Idle Driver for the AT91 processors"
depends on ARCH_VEXPRESS_TC2_PM default y
select ARM_CPU_SUSPEND depends on ARCH_AT91
select CPU_IDLE_MULTIPLE_DRIVERS
help help
Select this option to enable CPU idle driver for big.LITTLE based Select this to enable cpuidle for AT91 processors
ARM systems. Driver manages CPUs coordination through MCPM and
define different C-states for little and big cores through the
multiple CPU idle drivers infrastructure.
...@@ -7,8 +7,9 @@ obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o ...@@ -7,8 +7,9 @@ obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
################################################################################## ##################################################################################
# ARM SoC drivers # ARM SoC drivers
obj-$(CONFIG_ARM_BIG_LITTLE_CPUIDLE) += cpuidle-big_little.o
obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE) += cpuidle-calxeda.o obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE) += cpuidle-calxeda.o
obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o
obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o
obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o
obj-$(CONFIG_CPU_IDLE_BIG_LITTLE) += cpuidle-big_little.o obj-$(CONFIG_ARM_AT91_CPUIDLE) += cpuidle-at91.o
...@@ -21,26 +21,17 @@ ...@@ -21,26 +21,17 @@
#include <linux/export.h> #include <linux/export.h>
#include <asm/proc-fns.h> #include <asm/proc-fns.h>
#include <asm/cpuidle.h> #include <asm/cpuidle.h>
#include <mach/cpu.h>
#include "pm.h"
#define AT91_MAX_STATES 2 #define AT91_MAX_STATES 2
static void (*at91_standby)(void);
/* Actual code that puts the SoC in different idle states */ /* Actual code that puts the SoC in different idle states */
static int at91_enter_idle(struct cpuidle_device *dev, static int at91_enter_idle(struct cpuidle_device *dev,
struct cpuidle_driver *drv, struct cpuidle_driver *drv,
int index) int index)
{ {
if (cpu_is_at91rm9200()) at91_standby();
at91rm9200_standby();
else if (cpu_is_at91sam9g45())
at91sam9g45_standby();
else if (cpu_is_at91sam9263())
at91sam9263_standby();
else
at91sam9_standby();
return index; return index;
} }
...@@ -60,9 +51,19 @@ static struct cpuidle_driver at91_idle_driver = { ...@@ -60,9 +51,19 @@ static struct cpuidle_driver at91_idle_driver = {
}; };
/* Initialize CPU idle by registering the idle states */ /* Initialize CPU idle by registering the idle states */
static int __init at91_init_cpuidle(void) static int at91_cpuidle_probe(struct platform_device *dev)
{ {
at91_standby = (void *)(dev->dev.platform_data);
return cpuidle_register(&at91_idle_driver, NULL); return cpuidle_register(&at91_idle_driver, NULL);
} }
device_initcall(at91_init_cpuidle); static struct platform_driver at91_cpuidle_driver = {
.driver = {
.name = "cpuidle-at91",
.owner = THIS_MODULE,
},
.probe = at91_cpuidle_probe,
};
module_platform_driver(at91_cpuidle_driver);
...@@ -111,7 +111,7 @@ static struct cpuidle_driver ux500_idle_driver = { ...@@ -111,7 +111,7 @@ static struct cpuidle_driver ux500_idle_driver = {
.state_count = 2, .state_count = 2,
}; };
static int __init dbx500_cpuidle_probe(struct platform_device *pdev) static int dbx500_cpuidle_probe(struct platform_device *pdev)
{ {
/* Configure wake up reasons */ /* Configure wake up reasons */
prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/cpu_pm.h> #include <linux/cpu_pm.h>
#include <linux/cpuidle.h> #include <linux/cpuidle.h>
#include <linux/of.h> #include <linux/platform_device.h>
#include <asm/proc-fns.h> #include <asm/proc-fns.h>
#include <asm/cpuidle.h> #include <asm/cpuidle.h>
...@@ -70,14 +70,19 @@ static struct cpuidle_driver zynq_idle_driver = { ...@@ -70,14 +70,19 @@ static struct cpuidle_driver zynq_idle_driver = {
}; };
/* Initialize CPU idle by registering the idle states */ /* Initialize CPU idle by registering the idle states */
static int __init zynq_cpuidle_init(void) static int zynq_cpuidle_probe(struct platform_device *pdev)
{ {
if (!of_machine_is_compatible("xlnx,zynq-7000"))
return -ENODEV;
pr_info("Xilinx Zynq CpuIdle Driver started\n"); pr_info("Xilinx Zynq CpuIdle Driver started\n");
return cpuidle_register(&zynq_idle_driver, NULL); return cpuidle_register(&zynq_idle_driver, NULL);
} }
device_initcall(zynq_cpuidle_init); static struct platform_driver zynq_cpuidle_driver = {
.driver = {
.name = "cpuidle-zynq",
.owner = THIS_MODULE,
},
.probe = zynq_cpuidle_probe,
};
module_platform_driver(zynq_cpuidle_driver);
...@@ -123,7 +123,7 @@ static struct cpuidle_state *cpuidle_state_table; ...@@ -123,7 +123,7 @@ static struct cpuidle_state *cpuidle_state_table;
* which is also the index into the MWAIT hint array. * which is also the index into the MWAIT hint array.
* Thus C0 is a dummy. * Thus C0 is a dummy.
*/ */
static struct cpuidle_state nehalem_cstates[CPUIDLE_STATE_MAX] = { static struct cpuidle_state nehalem_cstates[] __initdata = {
{ {
.name = "C1-NHM", .name = "C1-NHM",
.desc = "MWAIT 0x00", .desc = "MWAIT 0x00",
...@@ -156,7 +156,7 @@ static struct cpuidle_state nehalem_cstates[CPUIDLE_STATE_MAX] = { ...@@ -156,7 +156,7 @@ static struct cpuidle_state nehalem_cstates[CPUIDLE_STATE_MAX] = {
.enter = NULL } .enter = NULL }
}; };
static struct cpuidle_state snb_cstates[CPUIDLE_STATE_MAX] = { static struct cpuidle_state snb_cstates[] __initdata = {
{ {
.name = "C1-SNB", .name = "C1-SNB",
.desc = "MWAIT 0x00", .desc = "MWAIT 0x00",
...@@ -196,7 +196,7 @@ static struct cpuidle_state snb_cstates[CPUIDLE_STATE_MAX] = { ...@@ -196,7 +196,7 @@ static struct cpuidle_state snb_cstates[CPUIDLE_STATE_MAX] = {
.enter = NULL } .enter = NULL }
}; };
static struct cpuidle_state ivb_cstates[CPUIDLE_STATE_MAX] = { static struct cpuidle_state ivb_cstates[] __initdata = {
{ {
.name = "C1-IVB", .name = "C1-IVB",
.desc = "MWAIT 0x00", .desc = "MWAIT 0x00",
...@@ -236,7 +236,7 @@ static struct cpuidle_state ivb_cstates[CPUIDLE_STATE_MAX] = { ...@@ -236,7 +236,7 @@ static struct cpuidle_state ivb_cstates[CPUIDLE_STATE_MAX] = {
.enter = NULL } .enter = NULL }
}; };
static struct cpuidle_state hsw_cstates[CPUIDLE_STATE_MAX] = { static struct cpuidle_state hsw_cstates[] __initdata = {
{ {
.name = "C1-HSW", .name = "C1-HSW",
.desc = "MWAIT 0x00", .desc = "MWAIT 0x00",
...@@ -297,7 +297,7 @@ static struct cpuidle_state hsw_cstates[CPUIDLE_STATE_MAX] = { ...@@ -297,7 +297,7 @@ static struct cpuidle_state hsw_cstates[CPUIDLE_STATE_MAX] = {
.enter = NULL } .enter = NULL }
}; };
static struct cpuidle_state atom_cstates[CPUIDLE_STATE_MAX] = { static struct cpuidle_state atom_cstates[] __initdata = {
{ {
.name = "C1E-ATM", .name = "C1E-ATM",
.desc = "MWAIT 0x00", .desc = "MWAIT 0x00",
...@@ -490,7 +490,7 @@ MODULE_DEVICE_TABLE(x86cpu, intel_idle_ids); ...@@ -490,7 +490,7 @@ MODULE_DEVICE_TABLE(x86cpu, intel_idle_ids);
/* /*
* intel_idle_probe() * intel_idle_probe()
*/ */
static int intel_idle_probe(void) static int __init intel_idle_probe(void)
{ {
unsigned int eax, ebx, ecx; unsigned int eax, ebx, ecx;
const struct x86_cpu_id *id; const struct x86_cpu_id *id;
...@@ -558,7 +558,7 @@ static void intel_idle_cpuidle_devices_uninit(void) ...@@ -558,7 +558,7 @@ static void intel_idle_cpuidle_devices_uninit(void)
* intel_idle_cpuidle_driver_init() * intel_idle_cpuidle_driver_init()
* allocate, initialize cpuidle_states * allocate, initialize cpuidle_states
*/ */
static int intel_idle_cpuidle_driver_init(void) static int __init intel_idle_cpuidle_driver_init(void)
{ {
int cstate; int cstate;
struct cpuidle_driver *drv = &intel_idle_driver; struct cpuidle_driver *drv = &intel_idle_driver;
...@@ -628,7 +628,7 @@ static int intel_idle_cpu_init(int cpu) ...@@ -628,7 +628,7 @@ static int intel_idle_cpu_init(int cpu)
int num_substates, mwait_hint, mwait_cstate, mwait_substate; int num_substates, mwait_hint, mwait_cstate, mwait_substate;
if (cpuidle_state_table[cstate].enter == NULL) if (cpuidle_state_table[cstate].enter == NULL)
continue; break;
if (cstate + 1 > max_cstate) { if (cstate + 1 > max_cstate) {
printk(PREFIX "max_cstate %d reached\n", max_cstate); printk(PREFIX "max_cstate %d reached\n", max_cstate);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册