Version:  2.0.40 2.2.26 2.4.37 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 3.17 3.18 3.19

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                 .name                   = "DDR SR",
 51                 .desc                   = "WFI and DDR Self Refresh",
 52         },
 53         .state_count = KIRKWOOD_MAX_STATES,
 54 };
 55 
 56 /* Initialize CPU idle by registering the idle states */
 57 static int kirkwood_cpuidle_probe(struct platform_device *pdev)
 58 {
 59         struct resource *res;
 60 
 61         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 62         ddr_operation_base = devm_ioremap_resource(&pdev->dev, res);
 63         if (IS_ERR(ddr_operation_base))
 64                 return PTR_ERR(ddr_operation_base);
 65 
 66         return cpuidle_register(&kirkwood_idle_driver, NULL);
 67 }
 68 
 69 static int kirkwood_cpuidle_remove(struct platform_device *pdev)
 70 {
 71         cpuidle_unregister(&kirkwood_idle_driver);
 72         return 0;
 73 }
 74 
 75 static struct platform_driver kirkwood_cpuidle_driver = {
 76         .probe = kirkwood_cpuidle_probe,
 77         .remove = kirkwood_cpuidle_remove,
 78         .driver = {
 79                    .name = "kirkwood_cpuidle",
 80                    },
 81 };
 82 
 83 module_platform_driver(kirkwood_cpuidle_driver);
 84 
 85 MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
 86 MODULE_DESCRIPTION("Kirkwood cpu idle driver");
 87 MODULE_LICENSE("GPL v2");
 88 MODULE_ALIAS("platform:kirkwood-cpuidle");
 89 

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