• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/mips/mti-sead3/
1/*
2 * LEDs driver for SEAD3
3 *
4 * Copyright (C) 2006 Kristian Kielhofner <kris@krisk.org>
5 *
6 * Based on leds-wrap.c
7 *
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.
11 */
12
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>
19
20#define DRVNAME "sead3-led"
21
22static struct platform_device *pdev;
23
24static void sead3_pled_set(struct led_classdev *led_cdev,
25		enum led_brightness value)
26{
27	pr_debug("sead3_pled_set\n");
28	writel(value, (void __iomem *)0xBF000210);
29}
30
31static void sead3_fled_set(struct led_classdev *led_cdev,
32		enum led_brightness value)
33{
34	pr_debug("sead3_fled_set\n");
35	writel(value, (void __iomem *)0xBF000218);
36}
37
38static struct led_classdev sead3_pled = {
39	.name		= "sead3::pled",
40	.brightness_set	= sead3_pled_set,
41};
42
43static struct led_classdev sead3_fled = {
44	.name		= "sead3::fled",
45	.brightness_set	= sead3_fled_set,
46};
47
48#ifdef CONFIG_PM
49static int sead3_led_suspend(struct platform_device *dev,
50		pm_message_t state)
51{
52	led_classdev_suspend(&sead3_pled);
53	led_classdev_suspend(&sead3_fled);
54	return 0;
55}
56
57static int sead3_led_resume(struct platform_device *dev)
58{
59	led_classdev_resume(&sead3_pled);
60	led_classdev_resume(&sead3_fled);
61	return 0;
62}
63#else
64#define sead3_led_suspend NULL
65#define sead3_led_resume NULL
66#endif
67
68static int sead3_led_probe(struct platform_device *pdev)
69{
70	int ret;
71
72	ret = led_classdev_register(&pdev->dev, &sead3_pled);
73	if (ret < 0)
74		return ret;
75
76	ret = led_classdev_register(&pdev->dev, &sead3_fled);
77	if (ret < 0)
78		led_classdev_unregister(&sead3_pled);
79
80	return ret;
81}
82
83static int sead3_led_remove(struct platform_device *pdev)
84{
85	led_classdev_unregister(&sead3_pled);
86	led_classdev_unregister(&sead3_fled);
87	return 0;
88}
89
90static 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,
98	},
99};
100
101static int __init sead3_led_init(void)
102{
103	int ret;
104
105	ret = platform_driver_register(&sead3_led_driver);
106	if (ret < 0)
107		goto out;
108
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;
114	}
115
116out:
117	return ret;
118}
119
120static void __exit sead3_led_exit(void)
121{
122	platform_device_unregister(pdev);
123	platform_driver_unregister(&sead3_led_driver);
124}
125
126module_init(sead3_led_init);
127module_exit(sead3_led_exit);
128
129MODULE_AUTHOR("Kristian Kielhofner <kris@krisk.org>");
130MODULE_DESCRIPTION("SEAD3 LED driver");
131MODULE_LICENSE("GPL");
132