dell-led: move driver to drivers/platform/x86/dell-wmi-led.c
authorMichał Kępień <kernel@kempniu.pl>
Fri, 17 Feb 2017 07:57:52 +0000 (08:57 +0100)
committerJacek Anaszewski <jacek.anaszewski@gmail.com>
Mon, 6 Mar 2017 21:07:09 +0000 (22:07 +0100)
The dell-led driver handles a specific WMI GUID present on some Dell
laptops and as such it belongs in the x86 platform driver subsystem.
Source code is moved along with the relevant Kconfig and Makefile
entries, with some minor modifications:

  - Kconfig option is renamed from CONFIG_LEDS_DELL_NETBOOKS to
    CONFIG_DELL_WMI_LED,

  - the X86 Kconfig dependency is removed as the whole
    drivers/platform/x86 menu depends on it, so there is no need to
    duplicate it,

  - the name of the module's source file is removed from the header
    comment to avoid the need to update it in the future.

Signed-off-by: Michał Kępień <kernel@kempniu.pl>
Tested-by: Alex Hung <alex.hung@canonical.com>
Reviewed-by: Pali Rohár <pali.rohar@gmail.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
drivers/leds/Kconfig
drivers/leds/Makefile
drivers/leds/dell-led.c [deleted file]
drivers/platform/x86/Kconfig
drivers/platform/x86/Makefile
drivers/platform/x86/dell-wmi-led.c [new file with mode: 0644]

index 8d1b4c9b3bda3f84bf9b78791896dc7b935e3174..6a88474b2970a28c4866383648776eaf62692d29 100644 (file)
@@ -463,14 +463,6 @@ config LEDS_ADP5520
          To compile this driver as a module, choose M here: the module will
          be called leds-adp5520.
 
-config LEDS_DELL_NETBOOKS
-       tristate "External LED on Dell Business Netbooks"
-       depends on LEDS_CLASS
-       depends on X86 && ACPI_WMI
-       help
-         This adds support for the Latitude 2100 and similar
-         notebooks that have an external LED.
-
 config LEDS_MC13783
        tristate "LED Support for MC13XXX PMIC"
        depends on LEDS_CLASS
index 6b8273736478a623424e4c0b74fbe5a40844732b..558d24675454b1ad3f4c4a836b9f4ea2ce29ea52 100644 (file)
@@ -52,7 +52,6 @@ obj-$(CONFIG_LEDS_REGULATOR)          += leds-regulator.o
 obj-$(CONFIG_LEDS_INTEL_SS4200)                += leds-ss4200.o
 obj-$(CONFIG_LEDS_LT3593)              += leds-lt3593.o
 obj-$(CONFIG_LEDS_ADP5520)             += leds-adp5520.o
-obj-$(CONFIG_LEDS_DELL_NETBOOKS)       += dell-led.o
 obj-$(CONFIG_LEDS_MC13783)             += leds-mc13783.o
 obj-$(CONFIG_LEDS_NS2)                 += leds-ns2.o
 obj-$(CONFIG_LEDS_NETXBIG)             += leds-netxbig.o
diff --git a/drivers/leds/dell-led.c b/drivers/leds/dell-led.c
deleted file mode 100644 (file)
index e5c5738..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * dell_led.c - Dell LED Driver
- *
- * Copyright (C) 2010 Dell Inc.
- * Louis Davis <louis_davis@dell.com>
- * Jim Dailey <jim_dailey@dell.com>
- *
- * 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.
- *
- */
-
-#include <linux/acpi.h>
-#include <linux/leds.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-
-MODULE_AUTHOR("Louis Davis/Jim Dailey");
-MODULE_DESCRIPTION("Dell LED Control Driver");
-MODULE_LICENSE("GPL");
-
-#define DELL_LED_BIOS_GUID "F6E4FE6E-909D-47cb-8BAB-C9F6F2F8D396"
-MODULE_ALIAS("wmi:" DELL_LED_BIOS_GUID);
-
-/* Error Result Codes: */
-#define INVALID_DEVICE_ID      250
-#define INVALID_PARAMETER      251
-#define INVALID_BUFFER         252
-#define INTERFACE_ERROR                253
-#define UNSUPPORTED_COMMAND    254
-#define UNSPECIFIED_ERROR      255
-
-/* Device ID */
-#define DEVICE_ID_PANEL_BACK   1
-
-/* LED Commands */
-#define CMD_LED_ON     16
-#define CMD_LED_OFF    17
-#define CMD_LED_BLINK  18
-
-struct bios_args {
-       unsigned char length;
-       unsigned char result_code;
-       unsigned char device_id;
-       unsigned char command;
-       unsigned char on_time;
-       unsigned char off_time;
-};
-
-static int dell_led_perform_fn(u8 length,
-               u8 result_code,
-               u8 device_id,
-               u8 command,
-               u8 on_time,
-               u8 off_time)
-{
-       struct bios_args *bios_return;
-       u8 return_code;
-       union acpi_object *obj;
-       struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
-       struct acpi_buffer input;
-       acpi_status status;
-
-       struct bios_args args;
-       args.length = length;
-       args.result_code = result_code;
-       args.device_id = device_id;
-       args.command = command;
-       args.on_time = on_time;
-       args.off_time = off_time;
-
-       input.length = sizeof(struct bios_args);
-       input.pointer = &args;
-
-       status = wmi_evaluate_method(DELL_LED_BIOS_GUID,
-               1,
-               1,
-               &input,
-               &output);
-
-       if (ACPI_FAILURE(status))
-               return status;
-
-       obj = output.pointer;
-
-       if (!obj)
-               return -EINVAL;
-       else if (obj->type != ACPI_TYPE_BUFFER) {
-               kfree(obj);
-               return -EINVAL;
-       }
-
-       bios_return = ((struct bios_args *)obj->buffer.pointer);
-       return_code = bios_return->result_code;
-
-       kfree(obj);
-
-       return return_code;
-}
-
-static int led_on(void)
-{
-       return dell_led_perform_fn(3,   /* Length of command */
-               INTERFACE_ERROR,        /* Init to  INTERFACE_ERROR */
-               DEVICE_ID_PANEL_BACK,   /* Device ID */
-               CMD_LED_ON,             /* Command */
-               0,                      /* not used */
-               0);                     /* not used */
-}
-
-static int led_off(void)
-{
-       return dell_led_perform_fn(3,   /* Length of command */
-               INTERFACE_ERROR,        /* Init to  INTERFACE_ERROR */
-               DEVICE_ID_PANEL_BACK,   /* Device ID */
-               CMD_LED_OFF,            /* Command */
-               0,                      /* not used */
-               0);                     /* not used */
-}
-
-static int led_blink(unsigned char on_eighths,
-               unsigned char off_eighths)
-{
-       return dell_led_perform_fn(5,   /* Length of command */
-               INTERFACE_ERROR,        /* Init to  INTERFACE_ERROR */
-               DEVICE_ID_PANEL_BACK,   /* Device ID */
-               CMD_LED_BLINK,          /* Command */
-               on_eighths,             /* blink on in eigths of a second */
-               off_eighths);           /* blink off in eights of a second */
-}
-
-static void dell_led_set(struct led_classdev *led_cdev,
-               enum led_brightness value)
-{
-       if (value == LED_OFF)
-               led_off();
-       else
-               led_on();
-}
-
-static int dell_led_blink(struct led_classdev *led_cdev,
-               unsigned long *delay_on,
-               unsigned long *delay_off)
-{
-       unsigned long on_eighths;
-       unsigned long off_eighths;
-
-       /* The Dell LED delay is based on 125ms intervals.
-          Need to round up to next interval. */
-
-       on_eighths = (*delay_on + 124) / 125;
-       if (0 == on_eighths)
-               on_eighths = 1;
-       if (on_eighths > 255)
-               on_eighths = 255;
-       *delay_on = on_eighths * 125;
-
-       off_eighths = (*delay_off + 124) / 125;
-       if (0 == off_eighths)
-               off_eighths = 1;
-       if (off_eighths > 255)
-               off_eighths = 255;
-       *delay_off = off_eighths * 125;
-
-       led_blink(on_eighths, off_eighths);
-
-       return 0;
-}
-
-static struct led_classdev dell_led = {
-       .name           = "dell::lid",
-       .brightness     = LED_OFF,
-       .max_brightness = 1,
-       .brightness_set = dell_led_set,
-       .blink_set      = dell_led_blink,
-       .flags          = LED_CORE_SUSPENDRESUME,
-};
-
-static int __init dell_led_init(void)
-{
-       int error = 0;
-
-       if (!wmi_has_guid(DELL_LED_BIOS_GUID))
-               return -ENODEV;
-
-       error = led_off();
-       if (error != 0)
-               return -ENODEV;
-
-       return led_classdev_register(NULL, &dell_led);
-}
-
-static void __exit dell_led_exit(void)
-{
-       led_classdev_unregister(&dell_led);
-
-       led_off();
-}
-
-module_init(dell_led_init);
-module_exit(dell_led_exit);
index 4bc88eb52712c7a8231ac64b94bbfacd5607f1f5..e1bffc9bb194396fe6f8b9c15b71bc3608990a9a 100644 (file)
@@ -141,6 +141,14 @@ config DELL_WMI_AIO
          To compile this driver as a module, choose M here: the module will
          be called dell-wmi-aio.
 
+config DELL_WMI_LED
+       tristate "External LED on Dell Business Netbooks"
+       depends on LEDS_CLASS
+       depends on ACPI_WMI
+       help
+         This adds support for the Latitude 2100 and similar
+         notebooks that have an external LED.
+
 config DELL_SMO8800
        tristate "Dell Latitude freefall driver (ACPI SMO88XX)"
        depends on ACPI
index 299d0f9e40f7b309feaf534764a5e852f061aa14..776b3a7a4984b179d9e3af209704de5ee35df39a 100644 (file)
@@ -15,6 +15,7 @@ obj-$(CONFIG_DELL_SMBIOS)     += dell-smbios.o
 obj-$(CONFIG_DELL_LAPTOP)      += dell-laptop.o
 obj-$(CONFIG_DELL_WMI)         += dell-wmi.o
 obj-$(CONFIG_DELL_WMI_AIO)     += dell-wmi-aio.o
+obj-$(CONFIG_DELL_WMI_LED)     += dell-wmi-led.o
 obj-$(CONFIG_DELL_SMO8800)     += dell-smo8800.o
 obj-$(CONFIG_DELL_RBTN)                += dell-rbtn.o
 obj-$(CONFIG_ACER_WMI)         += acer-wmi.o
diff --git a/drivers/platform/x86/dell-wmi-led.c b/drivers/platform/x86/dell-wmi-led.c
new file mode 100644 (file)
index 0000000..d0232c7
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2010 Dell Inc.
+ * Louis Davis <louis_davis@dell.com>
+ * Jim Dailey <jim_dailey@dell.com>
+ *
+ * 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.
+ *
+ */
+
+#include <linux/acpi.h>
+#include <linux/leds.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+
+MODULE_AUTHOR("Louis Davis/Jim Dailey");
+MODULE_DESCRIPTION("Dell LED Control Driver");
+MODULE_LICENSE("GPL");
+
+#define DELL_LED_BIOS_GUID "F6E4FE6E-909D-47cb-8BAB-C9F6F2F8D396"
+MODULE_ALIAS("wmi:" DELL_LED_BIOS_GUID);
+
+/* Error Result Codes: */
+#define INVALID_DEVICE_ID      250
+#define INVALID_PARAMETER      251
+#define INVALID_BUFFER         252
+#define INTERFACE_ERROR                253
+#define UNSUPPORTED_COMMAND    254
+#define UNSPECIFIED_ERROR      255
+
+/* Device ID */
+#define DEVICE_ID_PANEL_BACK   1
+
+/* LED Commands */
+#define CMD_LED_ON     16
+#define CMD_LED_OFF    17
+#define CMD_LED_BLINK  18
+
+struct bios_args {
+       unsigned char length;
+       unsigned char result_code;
+       unsigned char device_id;
+       unsigned char command;
+       unsigned char on_time;
+       unsigned char off_time;
+};
+
+static int dell_led_perform_fn(u8 length,
+               u8 result_code,
+               u8 device_id,
+               u8 command,
+               u8 on_time,
+               u8 off_time)
+{
+       struct bios_args *bios_return;
+       u8 return_code;
+       union acpi_object *obj;
+       struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
+       struct acpi_buffer input;
+       acpi_status status;
+
+       struct bios_args args;
+       args.length = length;
+       args.result_code = result_code;
+       args.device_id = device_id;
+       args.command = command;
+       args.on_time = on_time;
+       args.off_time = off_time;
+
+       input.length = sizeof(struct bios_args);
+       input.pointer = &args;
+
+       status = wmi_evaluate_method(DELL_LED_BIOS_GUID,
+               1,
+               1,
+               &input,
+               &output);
+
+       if (ACPI_FAILURE(status))
+               return status;
+
+       obj = output.pointer;
+
+       if (!obj)
+               return -EINVAL;
+       else if (obj->type != ACPI_TYPE_BUFFER) {
+               kfree(obj);
+               return -EINVAL;
+       }
+
+       bios_return = ((struct bios_args *)obj->buffer.pointer);
+       return_code = bios_return->result_code;
+
+       kfree(obj);
+
+       return return_code;
+}
+
+static int led_on(void)
+{
+       return dell_led_perform_fn(3,   /* Length of command */
+               INTERFACE_ERROR,        /* Init to  INTERFACE_ERROR */
+               DEVICE_ID_PANEL_BACK,   /* Device ID */
+               CMD_LED_ON,             /* Command */
+               0,                      /* not used */
+               0);                     /* not used */
+}
+
+static int led_off(void)
+{
+       return dell_led_perform_fn(3,   /* Length of command */
+               INTERFACE_ERROR,        /* Init to  INTERFACE_ERROR */
+               DEVICE_ID_PANEL_BACK,   /* Device ID */
+               CMD_LED_OFF,            /* Command */
+               0,                      /* not used */
+               0);                     /* not used */
+}
+
+static int led_blink(unsigned char on_eighths,
+               unsigned char off_eighths)
+{
+       return dell_led_perform_fn(5,   /* Length of command */
+               INTERFACE_ERROR,        /* Init to  INTERFACE_ERROR */
+               DEVICE_ID_PANEL_BACK,   /* Device ID */
+               CMD_LED_BLINK,          /* Command */
+               on_eighths,             /* blink on in eigths of a second */
+               off_eighths);           /* blink off in eights of a second */
+}
+
+static void dell_led_set(struct led_classdev *led_cdev,
+               enum led_brightness value)
+{
+       if (value == LED_OFF)
+               led_off();
+       else
+               led_on();
+}
+
+static int dell_led_blink(struct led_classdev *led_cdev,
+               unsigned long *delay_on,
+               unsigned long *delay_off)
+{
+       unsigned long on_eighths;
+       unsigned long off_eighths;
+
+       /* The Dell LED delay is based on 125ms intervals.
+          Need to round up to next interval. */
+
+       on_eighths = (*delay_on + 124) / 125;
+       if (0 == on_eighths)
+               on_eighths = 1;
+       if (on_eighths > 255)
+               on_eighths = 255;
+       *delay_on = on_eighths * 125;
+
+       off_eighths = (*delay_off + 124) / 125;
+       if (0 == off_eighths)
+               off_eighths = 1;
+       if (off_eighths > 255)
+               off_eighths = 255;
+       *delay_off = off_eighths * 125;
+
+       led_blink(on_eighths, off_eighths);
+
+       return 0;
+}
+
+static struct led_classdev dell_led = {
+       .name           = "dell::lid",
+       .brightness     = LED_OFF,
+       .max_brightness = 1,
+       .brightness_set = dell_led_set,
+       .blink_set      = dell_led_blink,
+       .flags          = LED_CORE_SUSPENDRESUME,
+};
+
+static int __init dell_led_init(void)
+{
+       int error = 0;
+
+       if (!wmi_has_guid(DELL_LED_BIOS_GUID))
+               return -ENODEV;
+
+       error = led_off();
+       if (error != 0)
+               return -ENODEV;
+
+       return led_classdev_register(NULL, &dell_led);
+}
+
+static void __exit dell_led_exit(void)
+{
+       led_classdev_unregister(&dell_led);
+
+       led_off();
+}
+
+module_init(dell_led_init);
+module_exit(dell_led_exit);