RT-AC56 3.0.0.4.374.37 core
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / arch / mips / mti-sead3 / leds-sead3.c
blob4e574aeb3a682f7db334f35298bbe9353707470e
1 /*
2 * LEDs driver for SEAD3
4 * Copyright (C) 2006 Kristian Kielhofner <kris@krisk.org>
6 * Based on leds-wrap.c
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/platform_device.h>
16 #include <linux/leds.h>
17 #include <linux/err.h>
18 #include <asm/io.h>
20 #define DRVNAME "sead3-led"
22 static struct platform_device *pdev;
24 static void sead3_pled_set(struct led_classdev *led_cdev,
25 enum led_brightness value)
27 pr_debug("sead3_pled_set\n");
28 writel(value, (void __iomem *)0xBF000210);
31 static void sead3_fled_set(struct led_classdev *led_cdev,
32 enum led_brightness value)
34 pr_debug("sead3_fled_set\n");
35 writel(value, (void __iomem *)0xBF000218);
38 static struct led_classdev sead3_pled = {
39 .name = "sead3::pled",
40 .brightness_set = sead3_pled_set,
43 static struct led_classdev sead3_fled = {
44 .name = "sead3::fled",
45 .brightness_set = sead3_fled_set,
48 #ifdef CONFIG_PM
49 static int sead3_led_suspend(struct platform_device *dev,
50 pm_message_t state)
52 led_classdev_suspend(&sead3_pled);
53 led_classdev_suspend(&sead3_fled);
54 return 0;
57 static int sead3_led_resume(struct platform_device *dev)
59 led_classdev_resume(&sead3_pled);
60 led_classdev_resume(&sead3_fled);
61 return 0;
63 #else
64 #define sead3_led_suspend NULL
65 #define sead3_led_resume NULL
66 #endif
68 static int sead3_led_probe(struct platform_device *pdev)
70 int ret;
72 ret = led_classdev_register(&pdev->dev, &sead3_pled);
73 if (ret < 0)
74 return ret;
76 ret = led_classdev_register(&pdev->dev, &sead3_fled);
77 if (ret < 0)
78 led_classdev_unregister(&sead3_pled);
80 return ret;
83 static int sead3_led_remove(struct platform_device *pdev)
85 led_classdev_unregister(&sead3_pled);
86 led_classdev_unregister(&sead3_fled);
87 return 0;
90 static struct platform_driver sead3_led_driver = {
91 .probe = sead3_led_probe,
92 .remove = sead3_led_remove,
93 .suspend = sead3_led_suspend,
94 .resume = sead3_led_resume,
95 .driver = {
96 .name = DRVNAME,
97 .owner = THIS_MODULE,
101 static int __init sead3_led_init(void)
103 int ret;
105 ret = platform_driver_register(&sead3_led_driver);
106 if (ret < 0)
107 goto out;
109 pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
110 if (IS_ERR(pdev)) {
111 ret = PTR_ERR(pdev);
112 platform_driver_unregister(&sead3_led_driver);
113 goto out;
116 out:
117 return ret;
120 static void __exit sead3_led_exit(void)
122 platform_device_unregister(pdev);
123 platform_driver_unregister(&sead3_led_driver);
126 module_init(sead3_led_init);
127 module_exit(sead3_led_exit);
129 MODULE_AUTHOR("Kristian Kielhofner <kris@krisk.org>");
130 MODULE_DESCRIPTION("SEAD3 LED driver");
131 MODULE_LICENSE("GPL");