Version:  2.0.40 2.2.26 2.4.37 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16

Linux/drivers/cpuidle/cpuidle-kirkwood.c

  1 /*
  2  * CPU idle Marvell Kirkwood SoCs
  3  *
  4  * This file is licensed under the terms of the GNU General Public
  5  * License version 2.  This program is licensed "as is" without any
  6  * warranty of any kind, whether express or implied.
  7  *
  8  * The cpu idle uses wait-for-interrupt and DDR self refresh in order
  9  * to implement two idle states -
 10  * #1 wait-for-interrupt
 11  * #2 wait-for-interrupt and DDR self refresh
 12  *
 13  * Maintainer: Jason Cooper <jason@lakedaemon.net>
 14  * Maintainer: Andrew Lunn <andrew@lunn.ch>
 15  */
 16 
 17 #include <linux/kernel.h>
 18 #include <linux/module.h>
 19 #include <linux/init.h>
 20 #include <linux/platform_device.h>
 21 #include <linux/cpuidle.h>
 22 #include <linux/io.h>
 23 #include <linux/export.h>
 24 #include <asm/proc-fns.h>
 25 #include <asm/cpuidle.h>
 26 
 27 #define KIRKWOOD_MAX_STATES     2
 28 
 29 static void __iomem *ddr_operation_base;
 30 
 31 /* Actual code that puts the SoC in different idle states */
 32 static int kirkwood_enter_idle(struct cpuidle_device *dev,
 33                                struct cpuidle_driver *drv,
 34                                int index)
 35 {
 36         writel(0x7, ddr_operation_base);
 37         cpu_do_idle();
 38 
 39         return index;
 40 }
 41 
 42 static struct cpuidle_driver kirkwood_idle_driver = {
 43         .name                   = "kirkwood_idle",
 44         .owner                  = THIS_MODULE,
 45         .states[0]              = ARM_CPUIDLE_WFI_STATE,
 46         .states[1]              = {
 47                 .enter                  = kirkwood_enter_idle,
 48                 .exit_latency           = 10,
 49                 .target_residency       = 100000,
 50                 .flags                  = CPUIDLE_FLAG_TIME_VALID,
 51                 .name                   = "DDR SR",
 52                 .desc                   = "WFI and DDR Self Refresh",
 53         },
 54         .state_count = KIRKWOOD_MAX_STATES,
 55 };
 56 
 57 /* Initialize CPU idle by registering the idle states */
 58 static int kirkwood_cpuidle_probe(struct platform_device *pdev)
 59 {
 60         struct resource *res;
 61 
 62         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 63         ddr_operation_base = devm_ioremap_resource(&pdev->dev, res);
 64         if (IS_ERR(ddr_operation_base))
 65                 return PTR_ERR(ddr_operation_base);
 66 
 67         return cpuidle_register(&kirkwood_idle_driver, NULL);
 68 }
 69 
 70 static int kirkwood_cpuidle_remove(struct platform_device *pdev)
 71 {
 72         cpuidle_unregister(&kirkwood_idle_driver);
 73         return 0;
 74 }
 75 
 76 static struct platform_driver kirkwood_cpuidle_driver = {
 77         .probe = kirkwood_cpuidle_probe,
 78         .remove = kirkwood_cpuidle_remove,
 79         .driver = {
 80                    .name = "kirkwood_cpuidle",
 81                    .owner = THIS_MODULE,
 82                    },
 83 };
 84 
 85 module_platform_driver(kirkwood_cpuidle_driver);
 86 
 87 MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
 88 MODULE_DESCRIPTION("Kirkwood cpu idle driver");
 89 MODULE_LICENSE("GPL v2");
 90 MODULE_ALIAS("platform:kirkwood-cpuidle");
 91 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us