linux/arch/arm/mach-at91/cpuidle.c
<<
>>
Prefs
   1/*
   2 * based on arch/arm/mach-kirkwood/cpuidle.c
   3 *
   4 * CPU idle support for AT91 SoC
   5 *
   6 * This file is licensed under the terms of the GNU General Public
   7 * License version 2.  This program is licensed "as is" without any
   8 * warranty of any kind, whether express or implied.
   9 *
  10 * The cpu idle uses wait-for-interrupt and RAM self refresh in order
  11 * to implement two idle states -
  12 * #1 wait-for-interrupt
  13 * #2 wait-for-interrupt and RAM self refresh
  14 */
  15
  16#include <linux/kernel.h>
  17#include <linux/init.h>
  18#include <linux/platform_device.h>
  19#include <linux/cpuidle.h>
  20#include <linux/io.h>
  21#include <linux/export.h>
  22#include <asm/proc-fns.h>
  23#include <asm/cpuidle.h>
  24#include <mach/cpu.h>
  25
  26#include "pm.h"
  27
  28#define AT91_MAX_STATES 2
  29
  30/* Actual code that puts the SoC in different idle states */
  31static int at91_enter_idle(struct cpuidle_device *dev,
  32                        struct cpuidle_driver *drv,
  33                               int index)
  34{
  35        if (cpu_is_at91rm9200())
  36                at91rm9200_standby();
  37        else if (cpu_is_at91sam9g45())
  38                at91sam9g45_standby();
  39        else if (cpu_is_at91sam9263())
  40                at91sam9263_standby();
  41        else
  42                at91sam9_standby();
  43
  44        return index;
  45}
  46
  47static struct cpuidle_driver at91_idle_driver = {
  48        .name                   = "at91_idle",
  49        .owner                  = THIS_MODULE,
  50        .states[0]              = ARM_CPUIDLE_WFI_STATE,
  51        .states[1]              = {
  52                .enter                  = at91_enter_idle,
  53                .exit_latency           = 10,
  54                .target_residency       = 10000,
  55                .flags                  = CPUIDLE_FLAG_TIME_VALID,
  56                .name                   = "RAM_SR",
  57                .desc                   = "WFI and DDR Self Refresh",
  58        },
  59        .state_count = AT91_MAX_STATES,
  60};
  61
  62/* Initialize CPU idle by registering the idle states */
  63static int __init at91_init_cpuidle(void)
  64{
  65        return cpuidle_register(&at91_idle_driver, NULL);
  66}
  67
  68device_initcall(at91_init_cpuidle);
  69