Skip to content

Commit

Permalink
usb: simplify usbport trigger
Browse files Browse the repository at this point in the history
The led trigger core learned a few things that allow to simplify the
trigger drivers.  Make use of automated trigger attributes and error
checking of the activate callback. Also use the wrappers to set and get
trigger_data.

Acked-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
  • Loading branch information
Uwe Kleine-König authored and Jacek Anaszewski committed Jul 5, 2018
1 parent 9bfd7d9 commit 6f7b0ba
Showing 1 changed file with 11 additions and 20 deletions.
31 changes: 11 additions & 20 deletions drivers/usb/core/ledtrig-usbport.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,17 @@ static ssize_t usbport_trig_port_store(struct device *dev,
static struct attribute *ports_attrs[] = {
NULL,
};

static const struct attribute_group ports_group = {
.name = "ports",
.attrs = ports_attrs,
};

static const struct attribute_group *ports_groups[] = {
&ports_group,
NULL
};

/***************************************
* Adding & removing ports
***************************************/
Expand Down Expand Up @@ -301,59 +307,44 @@ static int usbport_trig_notify(struct notifier_block *nb, unsigned long action,
static int usbport_trig_activate(struct led_classdev *led_cdev)
{
struct usbport_trig_data *usbport_data;
int err;

usbport_data = kzalloc(sizeof(*usbport_data), GFP_KERNEL);
if (!usbport_data)
return 0;
return -ENOMEM;
usbport_data->led_cdev = led_cdev;

/* List of ports */
INIT_LIST_HEAD(&usbport_data->ports);
err = sysfs_create_group(&led_cdev->dev->kobj, &ports_group);
if (err)
goto err_free;
usb_for_each_dev(usbport_data, usbport_trig_add_usb_dev_ports);
usbport_trig_update_count(usbport_data);

/* Notifications */
usbport_data->nb.notifier_call = usbport_trig_notify,
led_cdev->trigger_data = usbport_data;
usbport_data->nb.notifier_call = usbport_trig_notify;
led_set_trigger_data(led_cdev, usbport_data);
usb_register_notify(&usbport_data->nb);

led_cdev->activated = true;
return 0;

err_free:
kfree(usbport_data);
return 0;
}

static void usbport_trig_deactivate(struct led_classdev *led_cdev)
{
struct usbport_trig_data *usbport_data = led_cdev->trigger_data;
struct usbport_trig_data *usbport_data = led_get_trigger_data(led_cdev);
struct usbport_trig_port *port, *tmp;

if (!led_cdev->activated)
return;

list_for_each_entry_safe(port, tmp, &usbport_data->ports, list) {
usbport_trig_remove_port(usbport_data, port);
}

usb_unregister_notify(&usbport_data->nb);

sysfs_remove_group(&led_cdev->dev->kobj, &ports_group);

kfree(usbport_data);

led_cdev->activated = false;
}

static struct led_trigger usbport_led_trigger = {
.name = "usbport",
.activate = usbport_trig_activate,
.deactivate = usbport_trig_deactivate,
.groups = ports_groups,
};

static int __init usbport_trig_init(void)
Expand Down

0 comments on commit 6f7b0ba

Please sign in to comment.