Commit 40e32ee6 authored by Jiri Kosina's avatar Jiri Kosina

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: default avatarJiri Kosina <jkosina@suse.cz>
parent f04d5140
...@@ -596,8 +596,8 @@ config HID_SAMSUNG ...@@ -596,8 +596,8 @@ config HID_SAMSUNG
config HID_SONY config HID_SONY
tristate "Sony PS2/3 accessories" tristate "Sony PS2/3 accessories"
depends on USB_HID depends on USB_HID
select NEW_LEDS depends on NEW_LEDS
select LEDS_CLASS depends on LEDS_CLASS
---help--- ---help---
Support for Support for
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/leds.h>
#include "hid-ids.h" #include "hid-ids.h"
...@@ -103,10 +104,8 @@ struct sony_sc { ...@@ -103,10 +104,8 @@ struct sony_sc {
}; };
struct buzz_extra { struct buzz_extra {
#ifdef CONFIG_LEDS_CLASS
int led_state; int led_state;
struct led_classdev *leds[4]; struct led_classdev *leds[4];
#endif
}; };
/* Sony Vaio VGX has wrongly mouse pointer declared as constant */ /* Sony Vaio VGX has wrongly mouse pointer declared as constant */
...@@ -274,7 +273,6 @@ static int sixaxis_set_operational_bt(struct hid_device *hdev) ...@@ -274,7 +273,6 @@ static int sixaxis_set_operational_bt(struct hid_device *hdev)
return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT); 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) static void buzz_set_leds(struct hid_device *hdev, int leds)
{ {
struct list_head *report_list = struct list_head *report_list =
...@@ -351,13 +349,15 @@ static enum led_brightness buzz_led_get_brightness(struct led_classdev *led) ...@@ -351,13 +349,15 @@ static enum led_brightness buzz_led_get_brightness(struct led_classdev *led)
return on ? LED_FULL : LED_OFF; return on ? LED_FULL : LED_OFF;
} }
#endif
static int buzz_init(struct hid_device *hdev) static int buzz_init(struct hid_device *hdev)
{ {
struct sony_sc *drv_data; struct sony_sc *drv_data;
struct buzz_extra *buzz; 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); drv_data = hid_get_drvdata(hdev);
BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER)); BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
...@@ -374,90 +374,69 @@ static int buzz_init(struct hid_device *hdev) ...@@ -374,90 +374,69 @@ static int buzz_init(struct hid_device *hdev)
* LEDs to on */ * LEDs to on */
buzz_set_leds(hdev, 0x00); buzz_set_leds(hdev, 0x00);
#ifdef CONFIG_LEDS_CLASS name_sz = strlen(dev_name(&hdev->dev)) + strlen("::buzz#") + 1;
{
int n;
struct led_classdev *led;
size_t name_sz;
char *name;
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);
for (n = 0; n < 4; n++) { if (!led) {
led = kzalloc(sizeof(struct led_classdev) + name_sz, GFP_KERNEL); hid_err(hdev, "Couldn't allocate memory for LED %d\n", n);
if (!led) { goto error_leds;
hid_err(hdev, "Couldn't allocate memory for LED %d\n", n); }
goto error_leds;
}
name = (void *)(&led[1]); name = (void *)(&led[1]);
snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1); snprintf(name, name_sz, "%s::buzz%d", dev_name(&hdev->dev), n + 1);
led->name = name; led->name = name;
led->brightness = 0; led->brightness = 0;
led->max_brightness = 1; led->max_brightness = 1;
led->brightness_get = buzz_led_get_brightness; led->brightness_get = buzz_led_get_brightness;
led->brightness_set = buzz_led_set_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; 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; return ret;
#ifdef CONFIG_LEDS_CLASS
error_leds: error_leds:
{ for (n = 0; n < 4; n++) {
int n; led = buzz->leds[n];
struct led_classdev *led; buzz->leds[n] = NULL;
if (!led)
for (n = 0; n < 4; n++) { continue;
led = buzz->leds[n]; led_classdev_unregister(led);
buzz->leds[n] = NULL; kfree(led);
if (!led)
continue;
led_classdev_unregister(led);
kfree(led);
}
} }
kfree(drv_data->extra); kfree(drv_data->extra);
drv_data->extra = NULL; drv_data->extra = NULL;
return ret; return ret;
#endif
} }
static void buzz_remove(struct hid_device *hdev) static void buzz_remove(struct hid_device *hdev)
{ {
struct sony_sc *drv_data; struct sony_sc *drv_data;
struct buzz_extra *buzz; struct buzz_extra *buzz;
struct led_classdev *led;
int n;
drv_data = hid_get_drvdata(hdev); drv_data = hid_get_drvdata(hdev);
BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER)); BUG_ON(!(drv_data->quirks & BUZZ_CONTROLLER));
buzz = drv_data->extra; buzz = drv_data->extra;
#ifdef CONFIG_LEDS_CLASS for (n = 0; n < 4; n++) {
{ led = buzz->leds[n];
int n; buzz->leds[n] = NULL;
struct led_classdev *led; if (!led)
continue;
for (n = 0; n < 4; n++) { led_classdev_unregister(led);
led = buzz->leds[n]; kfree(led);
buzz->leds[n] = NULL;
if (!led)
continue;
led_classdev_unregister(led);
kfree(led);
}
} }
#endif
kfree(drv_data->extra); kfree(drv_data->extra);
drv_data->extra = NULL; drv_data->extra = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment