|
@@ -107,6 +107,7 @@
|
|
|
#define KEYBOARD_LAMPS 0x100
|
|
|
#define LOGOLAMP_POWERON 0x2000
|
|
|
#define LOGOLAMP_ALWAYS 0x4000
|
|
|
+#define RADIO_LED_ON 0x20
|
|
|
#endif
|
|
|
|
|
|
/* Hotkey details */
|
|
@@ -174,6 +175,7 @@ struct fujitsu_hotkey_t {
|
|
|
int rfkill_state;
|
|
|
int logolamp_registered;
|
|
|
int kblamps_registered;
|
|
|
+ int radio_led_registered;
|
|
|
};
|
|
|
|
|
|
static struct fujitsu_hotkey_t *fujitsu_hotkey;
|
|
@@ -200,6 +202,16 @@ static struct led_classdev kblamps_led = {
|
|
|
.brightness_get = kblamps_get,
|
|
|
.brightness_set = kblamps_set
|
|
|
};
|
|
|
+
|
|
|
+static enum led_brightness radio_led_get(struct led_classdev *cdev);
|
|
|
+static void radio_led_set(struct led_classdev *cdev,
|
|
|
+ enum led_brightness brightness);
|
|
|
+
|
|
|
+static struct led_classdev radio_led = {
|
|
|
+ .name = "fujitsu::radio_led",
|
|
|
+ .brightness_get = radio_led_get,
|
|
|
+ .brightness_set = radio_led_set
|
|
|
+};
|
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_FUJITSU_LAPTOP_DEBUG
|
|
@@ -275,6 +287,15 @@ static void kblamps_set(struct led_classdev *cdev,
|
|
|
call_fext_func(FUNC_LEDS, 0x1, KEYBOARD_LAMPS, FUNC_LED_OFF);
|
|
|
}
|
|
|
|
|
|
+static void radio_led_set(struct led_classdev *cdev,
|
|
|
+ enum led_brightness brightness)
|
|
|
+{
|
|
|
+ if (brightness >= LED_FULL)
|
|
|
+ call_fext_func(FUNC_RFKILL, 0x5, RADIO_LED_ON, RADIO_LED_ON);
|
|
|
+ else
|
|
|
+ call_fext_func(FUNC_RFKILL, 0x5, RADIO_LED_ON, 0x0);
|
|
|
+}
|
|
|
+
|
|
|
static enum led_brightness logolamp_get(struct led_classdev *cdev)
|
|
|
{
|
|
|
enum led_brightness brightness = LED_OFF;
|
|
@@ -299,6 +320,16 @@ static enum led_brightness kblamps_get(struct led_classdev *cdev)
|
|
|
|
|
|
return brightness;
|
|
|
}
|
|
|
+
|
|
|
+static enum led_brightness radio_led_get(struct led_classdev *cdev)
|
|
|
+{
|
|
|
+ enum led_brightness brightness = LED_OFF;
|
|
|
+
|
|
|
+ if (call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0) & RADIO_LED_ON)
|
|
|
+ brightness = LED_FULL;
|
|
|
+
|
|
|
+ return brightness;
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
/* Hardware access for LCD brightness control */
|
|
@@ -895,6 +926,23 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device)
|
|
|
result);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * BTNI bit 24 seems to indicate the presence of a radio toggle
|
|
|
+ * button in place of a slide switch, and all such machines appear
|
|
|
+ * to also have an RF LED. Therefore use bit 24 as an indicator
|
|
|
+ * that an RF LED is present.
|
|
|
+ */
|
|
|
+ if (call_fext_func(FUNC_BUTTONS, 0x0, 0x0, 0x0) & BIT(24)) {
|
|
|
+ result = led_classdev_register(&fujitsu->pf_device->dev,
|
|
|
+ &radio_led);
|
|
|
+ if (result == 0) {
|
|
|
+ fujitsu_hotkey->radio_led_registered = 1;
|
|
|
+ } else {
|
|
|
+ pr_err("Could not register LED handler for radio LED, error %i\n",
|
|
|
+ result);
|
|
|
+ }
|
|
|
+ }
|
|
|
#endif
|
|
|
|
|
|
return result;
|
|
@@ -921,6 +969,9 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device)
|
|
|
|
|
|
if (fujitsu_hotkey->kblamps_registered)
|
|
|
led_classdev_unregister(&kblamps_led);
|
|
|
+
|
|
|
+ if (fujitsu_hotkey->radio_led_registered)
|
|
|
+ led_classdev_unregister(&radio_led);
|
|
|
#endif
|
|
|
|
|
|
input_unregister_device(input);
|