linux/drivers/cpuidle/cpuidle-zynq.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012-2013 Xilinx
   3 *
   4 * CPU idle support for Xilinx Zynq
   5 *
   6 * based on arch/arm/mach-at91/cpuidle.c
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms and conditions of the GNU General Public License,
  10 * version 2, as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope it will be useful, but WITHOUT
  13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  15 * more details.
  16 *
  17 * You should have received a copy of the GNU General Public License along with
  18 * this program.  If not, see <http://www.gnu.org/licenses/>.
  19 *
  20 * The cpu idle uses wait-for-interrupt and RAM self refresh in order
  21 * to implement two idle states -
  22 * #1 wait-for-interrupt
  23 * #2 wait-for-interrupt and RAM self refresh
  24 *
  25 * Maintainer: Michal Simek <michal.simek@xilinx.com>
  26 */
  27
  28#include <linux/init.h>
  29#include <linux/cpuidle.h>
  30#include <linux/platform_device.h>
  31#include <asm/proc-fns.h>
  32#include <asm/cpuidle.h>
  33
  34#define ZYNQ_MAX_STATES         2
  35
  36/* Actual code that puts the SoC in different idle states */
  37static int zynq_enter_idle(struct cpuidle_device *dev,
  38                           struct cpuidle_driver *drv, int index)
  39{
  40        /* Add code for DDR self refresh start */
  41        cpu_do_idle();
  42
  43        return index;
  44}
  45
  46static struct cpuidle_driver zynq_idle_driver = {
  47        .name = "zynq_idle",
  48        .owner = THIS_MODULE,
  49        .states = {
  50                ARM_CPUIDLE_WFI_STATE,
  51                {
  52                        .enter                  = zynq_enter_idle,
  53                        .exit_latency           = 10,
  54                        .target_residency       = 10000,
  55                        .name                   = "RAM_SR",
  56                        .desc                   = "WFI and RAM Self Refresh",
  57                },
  58        },
  59        .safe_state_index = 0,
  60        .state_count = ZYNQ_MAX_STATES,
  61};
  62
  63/* Initialize CPU idle by registering the idle states */
  64static int zynq_cpuidle_probe(struct platform_device *pdev)
  65{
  66        pr_info("Xilinx Zynq CpuIdle Driver started\n");
  67
  68        return cpuidle_register(&zynq_idle_driver, NULL);
  69}
  70
  71static struct platform_driver zynq_cpuidle_driver = {
  72        .driver = {
  73                .name = "cpuidle-zynq",
  74        },
  75        .probe = zynq_cpuidle_probe,
  76};
  77
  78module_platform_driver(zynq_cpuidle_driver);
  79
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.