Version:  2.0.40 2.2.26 2.4.37 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 4.0 4.1

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/cpuidle.h>
 25 
 26 #define KIRKWOOD_MAX_STATES     2
 27 
 28 static void __iomem *ddr_operation_base;
 29 
 30 /* Actual code that puts the SoC in different idle states */
 31 static int kirkwood_enter_idle(struct cpuidle_device *dev,
 32                                struct cpuidle_driver *drv,
 33                                int index)
 34 {
 35         writel(0x7, ddr_operation_base);
 36         cpu_do_idle();
 37 
 38         return index;
 39 }
 40 
 41 static struct cpuidle_driver kirkwood_idle_driver = {
 42         .name                   = "kirkwood_idle",
 43         .owner                  = THIS_MODULE,
 44         .states[0]              = ARM_CPUIDLE_WFI_STATE,
 45         .states[1]              = {
 46                 .enter                  = kirkwood_enter_idle,
 47                 .exit_latency           = 10,
 48                 .target_residency       = 100000,
 49                 .name                   = "DDR SR",
 50                 .desc                   = "WFI and DDR Self Refresh",
 51         },
 52         .state_count = KIRKWOOD_MAX_STATES,
 53 };
 54 
 55 /* Initialize CPU idle by registering the idle states */
 56 static int kirkwood_cpuidle_probe(struct platform_device *pdev)
 57 {
 58         struct resource *res;
 59 
 60         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 61         ddr_operation_base = devm_ioremap_resource(&pdev->dev, res);
 62         if (IS_ERR(ddr_operation_base))
 63                 return PTR_ERR(ddr_operation_base);
 64 
 65         return cpuidle_register(&kirkwood_idle_driver, NULL);
 66 }
 67 
 68 static int kirkwood_cpuidle_remove(struct platform_device *pdev)
 69 {
 70         cpuidle_unregister(&kirkwood_idle_driver);
 71         return 0;
 72 }
 73 
 74 static struct platform_driver kirkwood_cpuidle_driver = {
 75         .probe = kirkwood_cpuidle_probe,
 76         .remove = kirkwood_cpuidle_remove,
 77         .driver = {
 78                    .name = "kirkwood_cpuidle",
 79                    },
 80 };
 81 
 82 module_platform_driver(kirkwood_cpuidle_driver);
 83 
 84 MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
 85 MODULE_DESCRIPTION("Kirkwood cpu idle driver");
 86 MODULE_LICENSE("GPL v2");
 87 MODULE_ALIAS("platform:kirkwood-cpuidle");
 88 

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