Skip to content

Commit

Permalink
HID: sony: Move LED data to the main structure
Browse files Browse the repository at this point in the history
It is not necessary to keep the LED information in an extra struct which is
only used by the Buzz device. It can also be used by other devices.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Sven Eckelmann authored and Jiri Kosina committed Nov 20, 2013
1 parent c538251 commit 2251b85
Showing 1 changed file with 17 additions and 41 deletions.
58 changes: 17 additions & 41 deletions drivers/hid/hid-sony.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ static const unsigned int buzz_keymap[] = {
};

struct sony_sc {
struct led_classdev *leds[4];
unsigned long quirks;

#ifdef CONFIG_SONY_FF
Expand All @@ -232,12 +233,7 @@ struct sony_sc {
__u8 right;
#endif

void *extra;
};

struct buzz_extra {
int led_state;
struct led_classdev *leds[4];
__u8 led_state;
};

static __u8 *ps3remote_fixup(struct hid_device *hdev, __u8 *rdesc,
Expand Down Expand Up @@ -472,26 +468,24 @@ static void sony_led_set_brightness(struct led_classdev *led,
struct device *dev = led->dev->parent;
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
struct sony_sc *drv_data;
struct buzz_extra *buzz;

int n;

drv_data = hid_get_drvdata(hdev);
if (!drv_data || !drv_data->extra) {
if (!drv_data) {
hid_err(hdev, "No device data\n");
return;
}
buzz = drv_data->extra;

for (n = 0; n < 4; n++) {
if (led == buzz->leds[n]) {
int on = !! (buzz->led_state & (1 << n));
if (led == drv_data->leds[n]) {
int on = !!(drv_data->led_state & (1 << n));
if (value == LED_OFF && on) {
buzz->led_state &= ~(1 << n);
buzz_set_leds(hdev, buzz->led_state);
drv_data->led_state &= ~(1 << n);
buzz_set_leds(hdev, drv_data->led_state);
} else if (value != LED_OFF && !on) {
buzz->led_state |= (1 << n);
buzz_set_leds(hdev, buzz->led_state);
drv_data->led_state |= (1 << n);
buzz_set_leds(hdev, drv_data->led_state);
}
break;
}
Expand All @@ -503,21 +497,19 @@ static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
struct device *dev = led->dev->parent;
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
struct sony_sc *drv_data;
struct buzz_extra *buzz;

int n;
int on = 0;

drv_data = hid_get_drvdata(hdev);
if (!drv_data || !drv_data->extra) {
if (!drv_data) {
hid_err(hdev, "No device data\n");
return LED_OFF;
}
buzz = drv_data->extra;

for (n = 0; n < 4; n++) {
if (led == buzz->leds[n]) {
on = !! (buzz->led_state & (1 << n));
if (led == drv_data->leds[n]) {
on = !!(drv_data->led_state & (1 << n));
break;
}
}
Expand All @@ -528,7 +520,6 @@ static enum led_brightness sony_led_get_brightness(struct led_classdev *led)
static int sony_leds_init(struct hid_device *hdev)
{
struct sony_sc *drv_data;
struct buzz_extra *buzz;
int n, ret = 0;
struct led_classdev *led;
size_t name_sz;
Expand All @@ -541,13 +532,6 @@ static int sony_leds_init(struct hid_device *hdev)
if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 0, 0, 7))
return -ENODEV;

buzz = kzalloc(sizeof(*buzz), GFP_KERNEL);
if (!buzz) {
hid_err(hdev, "Insufficient memory, cannot allocate driver data\n");
return -ENOMEM;
}
drv_data->extra = buzz;

/* Clear LEDs as we have no way of reading their initial state. This is
* only relevant if the driver is loaded after somebody actively set the
* LEDs to on */
Expand Down Expand Up @@ -576,49 +560,41 @@ static int sony_leds_init(struct hid_device *hdev)
goto error_leds;
}

buzz->leds[n] = led;
drv_data->leds[n] = led;
}

return ret;

error_leds:
for (n = 0; n < 4; n++) {
led = buzz->leds[n];
buzz->leds[n] = NULL;
led = drv_data->leds[n];
drv_data->leds[n] = NULL;
if (!led)
continue;
led_classdev_unregister(led);
kfree(led);
}

kfree(drv_data->extra);
drv_data->extra = NULL;
return ret;
}

static void sony_leds_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;

for (n = 0; n < 4; n++) {
led = buzz->leds[n];
buzz->leds[n] = NULL;
led = drv_data->leds[n];
drv_data->leds[n] = NULL;
if (!led)
continue;
led_classdev_unregister(led);
kfree(led);
}

kfree(drv_data->extra);
drv_data->extra = NULL;
}

#ifdef CONFIG_SONY_FF
Expand Down

0 comments on commit 2251b85

Please sign in to comment.