]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - drivers/net/wireless/rt2x00/rt2x00leds.c
2 Copyright (C) 2004 - 2008 rt2x00 SourceForge Project
3 <http://rt2x00.serialmonkey.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the
17 Free Software Foundation, Inc.,
18 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 Abstract: rt2x00 led specific routines.
26 #include <linux/kernel.h>
27 #include <linux/module.h>
30 #include "rt2x00lib.h"
32 void rt2x00leds_led_quality(struct rt2x00_dev
*rt2x00dev
, int rssi
)
34 struct rt2x00_led
*led
= &rt2x00dev
->led_qual
;
35 unsigned int brightness
;
37 if ((led
->type
!= LED_TYPE_QUALITY
) || !(led
->flags
& LED_REGISTERED
))
41 * Led handling requires a positive value for the rssi,
42 * to do that correctly we need to add the correction.
44 rssi
+= rt2x00dev
->rssi_offset
;
47 * Get the rssi level, this is used to convert the rssi
48 * to a LED value inside the range LED_OFF - LED_FULL.
64 * Note that we must _not_ send LED_OFF since the driver
65 * is going to calculate the value and might use it in a
68 brightness
= ((LED_FULL
/ 6) * rssi
) + 1;
69 if (brightness
!= led
->led_dev
.brightness
) {
70 led
->led_dev
.brightness_set(&led
->led_dev
, brightness
);
71 led
->led_dev
.brightness
= brightness
;
75 void rt2x00led_led_activity(struct rt2x00_dev
*rt2x00dev
, bool enabled
)
77 struct rt2x00_led
*led
= &rt2x00dev
->led_qual
;
78 unsigned int brightness
;
80 if ((led
->type
!= LED_TYPE_ACTIVITY
) || !(led
->flags
& LED_REGISTERED
))
83 brightness
= enabled
? LED_FULL
: LED_OFF
;
84 if (brightness
!= led
->led_dev
.brightness
) {
85 led
->led_dev
.brightness_set(&led
->led_dev
, brightness
);
86 led
->led_dev
.brightness
= brightness
;
90 void rt2x00leds_led_assoc(struct rt2x00_dev
*rt2x00dev
, bool enabled
)
92 struct rt2x00_led
*led
= &rt2x00dev
->led_assoc
;
93 unsigned int brightness
;
95 if ((led
->type
!= LED_TYPE_ASSOC
) || !(led
->flags
& LED_REGISTERED
))
98 brightness
= enabled
? LED_FULL
: LED_OFF
;
99 if (brightness
!= led
->led_dev
.brightness
) {
100 led
->led_dev
.brightness_set(&led
->led_dev
, brightness
);
101 led
->led_dev
.brightness
= brightness
;
105 void rt2x00leds_led_radio(struct rt2x00_dev
*rt2x00dev
, bool enabled
)
107 struct rt2x00_led
*led
= &rt2x00dev
->led_radio
;
108 unsigned int brightness
;
110 if ((led
->type
!= LED_TYPE_RADIO
) || !(led
->flags
& LED_REGISTERED
))
113 brightness
= enabled
? LED_FULL
: LED_OFF
;
114 if (brightness
!= led
->led_dev
.brightness
) {
115 led
->led_dev
.brightness_set(&led
->led_dev
, brightness
);
116 led
->led_dev
.brightness
= brightness
;
120 static int rt2x00leds_register_led(struct rt2x00_dev
*rt2x00dev
,
121 struct rt2x00_led
*led
,
124 struct device
*device
= wiphy_dev(rt2x00dev
->hw
->wiphy
);
127 led
->led_dev
.name
= name
;
129 retval
= led_classdev_register(device
, &led
->led_dev
);
131 ERROR(rt2x00dev
, "Failed to register led handler.\n");
135 led
->flags
|= LED_REGISTERED
;
140 void rt2x00leds_register(struct rt2x00_dev
*rt2x00dev
)
145 unsigned long on_period
;
146 unsigned long off_period
;
148 snprintf(dev_name
, sizeof(dev_name
), "%s-%s",
149 rt2x00dev
->ops
->name
, wiphy_name(rt2x00dev
->hw
->wiphy
));
151 if (rt2x00dev
->led_radio
.flags
& LED_INITIALIZED
) {
152 snprintf(name
, sizeof(name
), "%s:radio", dev_name
);
154 retval
= rt2x00leds_register_led(rt2x00dev
,
155 &rt2x00dev
->led_radio
,
161 if (rt2x00dev
->led_assoc
.flags
& LED_INITIALIZED
) {
162 snprintf(name
, sizeof(name
), "%s:assoc", dev_name
);
164 retval
= rt2x00leds_register_led(rt2x00dev
,
165 &rt2x00dev
->led_assoc
,
171 if (rt2x00dev
->led_qual
.flags
& LED_INITIALIZED
) {
172 snprintf(name
, sizeof(name
), "%s:quality", dev_name
);
174 retval
= rt2x00leds_register_led(rt2x00dev
,
175 &rt2x00dev
->led_qual
,
182 * Initialize blink time to default value:
186 if (rt2x00dev
->led_radio
.led_dev
.blink_set
) {
189 rt2x00dev
->led_radio
.led_dev
.blink_set(
190 &rt2x00dev
->led_radio
.led_dev
, &on_period
, &off_period
);
196 rt2x00leds_unregister(rt2x00dev
);
199 static void rt2x00leds_unregister_led(struct rt2x00_led
*led
)
201 led_classdev_unregister(&led
->led_dev
);
202 led
->led_dev
.brightness_set(&led
->led_dev
, LED_OFF
);
203 led
->flags
&= ~LED_REGISTERED
;
206 void rt2x00leds_unregister(struct rt2x00_dev
*rt2x00dev
)
208 if (rt2x00dev
->led_qual
.flags
& LED_REGISTERED
)
209 rt2x00leds_unregister_led(&rt2x00dev
->led_qual
);
210 if (rt2x00dev
->led_assoc
.flags
& LED_REGISTERED
)
211 rt2x00leds_unregister_led(&rt2x00dev
->led_assoc
);
212 if (rt2x00dev
->led_radio
.flags
& LED_REGISTERED
)
213 rt2x00leds_unregister_led(&rt2x00dev
->led_radio
);
216 void rt2x00leds_suspend(struct rt2x00_dev
*rt2x00dev
)
218 if (rt2x00dev
->led_qual
.flags
& LED_REGISTERED
)
219 led_classdev_suspend(&rt2x00dev
->led_qual
.led_dev
);
220 if (rt2x00dev
->led_assoc
.flags
& LED_REGISTERED
)
221 led_classdev_suspend(&rt2x00dev
->led_assoc
.led_dev
);
222 if (rt2x00dev
->led_radio
.flags
& LED_REGISTERED
)
223 led_classdev_suspend(&rt2x00dev
->led_radio
.led_dev
);
226 void rt2x00leds_resume(struct rt2x00_dev
*rt2x00dev
)
228 if (rt2x00dev
->led_radio
.flags
& LED_REGISTERED
)
229 led_classdev_resume(&rt2x00dev
->led_radio
.led_dev
);
230 if (rt2x00dev
->led_assoc
.flags
& LED_REGISTERED
)
231 led_classdev_resume(&rt2x00dev
->led_assoc
.led_dev
);
232 if (rt2x00dev
->led_qual
.flags
& LED_REGISTERED
)
233 led_classdev_resume(&rt2x00dev
->led_qual
.led_dev
);