mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-01 10:36:41 +07:00
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>
This commit is contained in:
parent
f04d51404f
commit
40e32ee6e4
@ -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 @@
|
|||||||
#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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
* 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]);
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
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
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
struct led_classdev *led;
|
|
||||||
|
|
||||||
for (n = 0; n < 4; n++) {
|
for (n = 0; n < 4; n++) {
|
||||||
led = buzz->leds[n];
|
led = buzz->leds[n];
|
||||||
buzz->leds[n] = NULL;
|
buzz->leds[n] = NULL;
|
||||||
if (!led)
|
if (!led)
|
||||||
continue;
|
continue;
|
||||||
led_classdev_unregister(led);
|
led_classdev_unregister(led);
|
||||||
kfree(led);
|
kfree(led);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
kfree(drv_data->extra);
|
kfree(drv_data->extra);
|
||||||
drv_data->extra = NULL;
|
drv_data->extra = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user