HID: sony: fix leds dependency
The newly added support for Buzz controller
- introduced Kconfig selection of LEDS_CLASS
- introduced conditional preprocessor checking for CONFIG_LEDS_CLASS
This has multiple problems -- namely select doesn't work transitively,
so it shouldn't be used. On the other hand the code assumed that LEDS_CLASS
is enabled in some places, but not everywhere.
Put LEDS_CLASS as a Kconfig dependency for hid-sony and remove all the
CONFIG_LEDS_CLASS conditionals from hid-sony.
Reported-by: fengguang.wu@intel.com
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 53caf0b..5bad26e 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -596,8 +596,8 @@
config HID_SONY
tristate "Sony PS2/3 accessories"
depends on USB_HID
- select NEW_LEDS
- select LEDS_CLASS
+ depends on NEW_LEDS
+ depends on LEDS_CLASS
---help---
Support for
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 41e829c..f1c9061 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -21,6 +21,7 @@
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/usb.h>
+#include <linux/leds.h>
#include "hid-ids.h"
@@ -103,10 +104,8 @@
};
struct buzz_extra {
-#ifdef CONFIG_LEDS_CLASS
int led_state;
struct led_classdev *leds[4];
-#endif
};
/* Sony Vaio VGX has wrongly mouse pointer declared as constant */
@@ -274,7 +273,6 @@
return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
}
-#ifdef CONFIG_LEDS_CLASS
static void buzz_set_leds(struct hid_device *hdev, int leds)
{
struct list_head *report_list =
@@ -351,13 +349,15 @@
return on ? LED_FULL : LED_OFF;
}
-#endif
static int buzz_init(struct hid_device *hdev)
{
struct sony_sc *drv_data;
struct buzz_extra *buzz;
- int ret = 0;
+ int n, ret = 0;
+ struct led_classdev *led;
+ size_t name_sz;
+ char *name;
drv_data = hid_get_drvdata(hdev);
BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
@@ -374,90 +374,69 @@
* LEDs to on */
buzz_set_leds(hdev, 0x00);
-#ifdef CONFIG_LEDS_CLASS
- {
- int n;
- struct led_classdev *led;
- size_t name_sz;
- char *name;
+ name_sz = strlen(dev_name(&hdev->dev)) + strlen("::buzz#") + 1;
- name_sz = strlen(dev_name(&hdev->dev)) + strlen("::buzz#") + 1;
-
- for (n = 0; n < 4; n++) {
- led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
- if (!led) {
- hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
- goto error_leds;
- }
-
- name = (void *)(&led[1]);
- snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1);
- led->name = name;
- led->brightness = 0;
- led->max_brightness = 1;
- led->brightness_get = buzz_led_get_brightness;
- led->brightness_set = buzz_led_set_brightness;
-
- if (led_classdev_register(&hdev->dev, led)) {
- hid_err(hdev, "Failed to register LED %d\n", n);
- kfree(led);
- goto error_leds;
- }
-
- buzz->leds[n] = led;
+ for (n = 0; n < 4; n++) {
+ led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL);
+ if (!led) {
+ hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
+ goto error_leds;
}
+
+ name = (void *)(&led[1]);
+ snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1);
+ led->name = name;
+ led->brightness = 0;
+ led->max_brightness = 1;
+ led->brightness_get = buzz_led_get_brightness;
+ led->brightness_set = buzz_led_set_brightness;
+
+ if (led_classdev_register(&hdev->dev, led)) {
+ hid_err(hdev, "Failed to register LED %d\n", n);
+ kfree(led);
+ goto error_leds;
+ }
+
+ buzz->leds[n] = led;
}
-#endif
return ret;
-#ifdef CONFIG_LEDS_CLASS
error_leds:
- {
- int n;
- struct led_classdev *led;
-
- for (n = 0; n < 4; n++) {
- led = buzz->leds[n];
- buzz->leds[n] = NULL;
- if (!led)
- continue;
- led_classdev_unregister(led);
- kfree(led);
- }
+ for (n = 0; n < 4; n++) {
+ led = buzz->leds[n];
+ buzz->leds[n] = NULL;
+ if (!led)
+ continue;
+ led_classdev_unregister(led);
+ kfree(led);
}
kfree(drv_data->extra);
drv_data->extra = NULL;
return ret;
-#endif
}
static void buzz_remove(struct hid_device *hdev)
{
struct sony_sc *drv_data;
struct buzz_extra *buzz;
+ struct led_classdev *led;
+ int n;
drv_data = hid_get_drvdata(hdev);
BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
buzz = drv_data->extra;
-
-#ifdef CONFIG_LEDS_CLASS
- {
- int n;
- struct led_classdev *led;
- for (n = 0; n < 4; n++) {
- led = buzz->leds[n];
- buzz->leds[n] = NULL;
- if (!led)
- continue;
- led_classdev_unregister(led);
- kfree(led);
- }
+ for (n = 0; n < 4; n++) {
+ led = buzz->leds[n];
+ buzz->leds[n] = NULL;
+ if (!led)
+ continue;
+ led_classdev_unregister(led);
+ kfree(led);
}
-#endif
kfree(drv_data->extra);
drv_data->extra = NULL;