aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ar7-2.6/files/drivers/leds/leds-ar7.c
blob: 85533dee121264c2cd951667414bcfc0c315e5dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * linux/drivers/leds/leds-ar7.c
 * 
 * Copyright (C) 2007 OpenWrt.org
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */


#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/err.h>
#include <asm/io.h>
#include <gpio.h>

#define DRVNAME "ar7-leds"
#define LONGNAME "TI AR7 LEDs driver"
#define AR7_GPIO_BIT_STATUS_LED 8

MODULE_AUTHOR("Nicolas Thill <nico@openwrt.org>");
MODULE_DESCRIPTION(LONGNAME);
MODULE_LICENSE("GPL");

static void ar7_status_led_set(struct led_classdev *pled, 
		enum led_brightness value)
{
	gpio_set_value(AR7_GPIO_BIT_STATUS_LED, value ? 0 : 1);
}

static struct led_classdev ar7_status_led = {
	.name		= "ar7:status",
	.brightness_set	= ar7_status_led_set,
};

#ifdef CONFIG_PM
static int ar7_leds_suspend(struct platform_device *dev,
		pm_message_t state)
{
	led_classdev_suspend(&ar7_status_led);
	return 0;
}

static int ar7_leds_resume(struct platform_device *dev)
{
	led_classdev_resume(&ar7_status_led);
	return 0;
}
#else /* CONFIG_PM */
#define ar7_leds_suspend NULL
#define ar7_leds_resume NULL
#endif /* CONFIG_PM */

static int ar7_leds_probe(struct platform_device *pdev)
{
	int rc;

	rc = led_classdev_register(&pdev->dev, &ar7_status_led);
	if (rc < 0 )
		goto out;

	ar7_gpio_enable(AR7_GPIO_BIT_STATUS_LED);
	gpio_direction_output(AR7_GPIO_BIT_STATUS_LED);

out:
	return rc;
}

static int ar7_leds_remove(struct platform_device *pdev)
{
	led_classdev_unregister(&ar7_status_led);

	return 0;
}

static struct platform_device *ar7_leds_device;

static struct platform_driver ar7_leds_driver = {
	.probe		= ar7_leds_probe,
	.remove		= ar7_leds_remove,
	.suspend	= ar7_leds_suspend,
	.resume		= ar7_leds_resume,
	.driver		= {
		.name		= DRVNAME,
	},
};

static int __init ar7_leds_init(void)
{
	int rc;

	ar7_leds_device = platform_device_alloc(DRVNAME, -1);
	if (!ar7_leds_device)
		return -ENOMEM;

	rc = platform_device_add(ar7_leds_device);
	if (rc < 0)
		goto out_put;

	rc = platform_driver_register(&ar7_leds_driver);
	if (rc < 0)
		goto out_put;

	goto out;

out_put:
	platform_device_put(ar7_leds_device);
out:
	return rc;
}

static void __exit ar7_leds_exit(void)
{
	platform_driver_unregister(&ar7_leds_driver);
	platform_device_unregister(ar7_leds_device);
}

module_init(ar7_leds_init);
module_exit(ar7_leds_exit);