|
@@ -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
|
|
|
***************************************/
|
|
@@ -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)
|