2011-04-04 16:42:58 +08:00
|
|
|
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
|
|
|
|
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
|
2011-04-08 02:42:22 +08:00
|
|
|
@@ -938,6 +938,7 @@ EXPORT_SYMBOL_GPL(rt2800_rfkill_poll);
|
2011-04-04 16:42:58 +08:00
|
|
|
static void rt2800_brightness_set(struct led_classdev *led_cdev,
|
|
|
|
enum led_brightness brightness)
|
|
|
|
{
|
|
|
|
+ u32 reg;
|
|
|
|
struct rt2x00_led *led =
|
|
|
|
container_of(led_cdev, struct rt2x00_led, led_dev);
|
|
|
|
unsigned int enabled = brightness != LED_OFF;
|
2011-04-08 02:42:22 +08:00
|
|
|
@@ -950,24 +951,46 @@ static void rt2800_brightness_set(struct
|
2011-04-04 16:42:58 +08:00
|
|
|
rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
|
|
|
|
EEPROM_FREQ_LED_MODE);
|
2011-04-08 02:42:22 +08:00
|
|
|
|
2011-04-04 16:42:58 +08:00
|
|
|
- if (led->type == LED_TYPE_RADIO) {
|
|
|
|
- rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
|
|
|
|
- enabled ? 0x20 : 0);
|
|
|
|
- } else if (led->type == LED_TYPE_ASSOC) {
|
|
|
|
- rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
|
|
|
|
- enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
|
|
|
|
- } else if (led->type == LED_TYPE_QUALITY) {
|
|
|
|
- /*
|
|
|
|
- * The brightness is divided into 6 levels (0 - 5),
|
|
|
|
- * The specs tell us the following levels:
|
|
|
|
- * 0, 1 ,3, 7, 15, 31
|
|
|
|
- * to determine the level in a simple way we can simply
|
|
|
|
- * work with bitshifting:
|
|
|
|
- * (1 << level) - 1
|
|
|
|
- */
|
|
|
|
- rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
|
|
|
|
- (1 << brightness / (LED_FULL / 6)) - 1,
|
|
|
|
- polarity);
|
|
|
|
+ /* Check for SoC (SOC devices don't support MCU requests) */
|
|
|
|
+ if (rt2x00_is_soc(led->rt2x00dev)) {
|
|
|
|
+ rt2800_register_read(led->rt2x00dev, LED_CFG, ®);
|
|
|
|
+
|
|
|
|
+ /* Set LED Polarity */
|
|
|
|
+ rt2x00_set_field32(®, LED_CFG_LED_POLAR, polarity);
|
|
|
|
+
|
|
|
|
+ /* Set LED Mode */
|
|
|
|
+ if (led->type == LED_TYPE_RADIO) {
|
|
|
|
+ rt2x00_set_field32(®, LED_CFG_G_LED_MODE,
|
|
|
|
+ enabled ? 3 : 0);
|
|
|
|
+ } else if (led->type == LED_TYPE_ASSOC) {
|
|
|
|
+ rt2x00_set_field32(®, LED_CFG_Y_LED_MODE,
|
|
|
|
+ enabled ? 3 : 0);
|
|
|
|
+ } else if (led->type == LED_TYPE_QUALITY) {
|
|
|
|
+ rt2x00_set_field32(®, LED_CFG_R_LED_MODE,
|
|
|
|
+ enabled ? 3 : 0);
|
|
|
|
+ }
|
|
|
|
+ rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ if (led->type == LED_TYPE_RADIO) {
|
|
|
|
+ rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
|
|
|
|
+ enabled ? 0x20 : 0);
|
|
|
|
+ } else if (led->type == LED_TYPE_ASSOC) {
|
|
|
|
+ rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
|
|
|
|
+ enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
|
|
|
|
+ } else if (led->type == LED_TYPE_QUALITY) {
|
|
|
|
+ /*
|
|
|
|
+ * The brightness is divided into 6 levels (0 - 5),
|
|
|
|
+ * The specs tell us the following levels:
|
|
|
|
+ * 0, 1 ,3, 7, 15, 31
|
|
|
|
+ * to determine the level in a simple way we can simply
|
|
|
|
+ * work with bitshifting:
|
|
|
|
+ * (1 << level) - 1
|
|
|
|
+ */
|
|
|
|
+ rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
|
|
|
|
+ (1 << brightness / (LED_FULL / 6)) - 1,
|
|
|
|
+ polarity);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
}
|
2011-04-08 02:42:22 +08:00
|
|
|
|