Lines Matching +full:trigger +full:- +full:sources

1 // SPDX-License-Identifier: GPL-2.0
3 * USB port LED trigger
39 * usbport_trig_usb_dev_observed - Check if dev is connected to observed port
46 if (!usb_dev->parent) in usbport_trig_usb_dev_observed()
49 list_for_each_entry(port, &usbport_data->ports, list) { in usbport_trig_usb_dev_observed()
50 if (usb_dev->parent == port->hub && in usbport_trig_usb_dev_observed()
51 usb_dev->portnum == port->portnum) in usbport_trig_usb_dev_observed()
52 return port->observed; in usbport_trig_usb_dev_observed()
63 usbport_data->count++; in usbport_trig_usb_dev_check()
69 * usbport_trig_update_count - Recalculate amount of connected matching devices
73 struct led_classdev *led_cdev = usbport_data->led_cdev; in usbport_trig_update_count()
75 usbport_data->count = 0; in usbport_trig_update_count()
77 led_set_brightness(led_cdev, usbport_data->count ? LED_FULL : LED_OFF); in usbport_trig_update_count()
91 return sysfs_emit(buf, "%d\n", port->observed) + 1; in usbport_trig_port_show()
103 port->observed = 0; in usbport_trig_port_store()
105 port->observed = 1; in usbport_trig_port_store()
107 return -EINVAL; in usbport_trig_port_store()
109 usbport_trig_update_count(port->data); in usbport_trig_port_store()
128 * usbport_trig_port_observed - Check if port should be observed
133 struct device *dev = usbport_data->led_cdev->dev; in usbport_trig_port_observed()
134 struct device_node *led_np = dev->of_node; in usbport_trig_port_observed()
153 /* Amount of trigger sources for this LED */ in usbport_trig_port_observed()
154 count = of_count_phandle_with_args(led_np, "trigger-sources", in usbport_trig_port_observed()
155 "#trigger-source-cells"); in usbport_trig_port_observed()
157 dev_warn(dev, "Failed to get trigger sources for %pOF\n", in usbport_trig_port_observed()
162 /* Check list of sources for this specific port */ in usbport_trig_port_observed()
166 err = of_parse_phandle_with_args(led_np, "trigger-sources", in usbport_trig_port_observed()
167 "#trigger-source-cells", i, in usbport_trig_port_observed()
170 dev_err(dev, "Failed to get trigger source phandle at index %d: %d\n", in usbport_trig_port_observed()
188 struct led_classdev *led_cdev = usbport_data->led_cdev; in usbport_trig_add_port()
195 err = -ENOMEM; in usbport_trig_add_port()
199 port->data = usbport_data; in usbport_trig_add_port()
200 port->hub = usb_dev; in usbport_trig_add_port()
201 port->portnum = portnum; in usbport_trig_add_port()
202 port->observed = usbport_trig_port_observed(usbport_data, usb_dev, in usbport_trig_add_port()
206 port->port_name = kzalloc(len, GFP_KERNEL); in usbport_trig_add_port()
207 if (!port->port_name) { in usbport_trig_add_port()
208 err = -ENOMEM; in usbport_trig_add_port()
211 snprintf(port->port_name, len, "%s-port%d", hub_name, portnum); in usbport_trig_add_port()
213 sysfs_attr_init(&port->attr.attr); in usbport_trig_add_port()
214 port->attr.attr.name = port->port_name; in usbport_trig_add_port()
215 port->attr.attr.mode = S_IRUSR | S_IWUSR; in usbport_trig_add_port()
216 port->attr.show = usbport_trig_port_show; in usbport_trig_add_port()
217 port->attr.store = usbport_trig_port_store; in usbport_trig_add_port()
219 err = sysfs_add_file_to_group(&led_cdev->dev->kobj, &port->attr.attr, in usbport_trig_add_port()
224 list_add_tail(&port->list, &usbport_data->ports); in usbport_trig_add_port()
229 kfree(port->port_name); in usbport_trig_add_port()
242 for (i = 1; i <= usb_dev->maxchild; i++) in usbport_trig_add_usb_dev_ports()
244 dev_name(&usb_dev->dev), i); in usbport_trig_add_usb_dev_ports()
252 struct led_classdev *led_cdev = usbport_data->led_cdev; in usbport_trig_remove_port()
254 list_del(&port->list); in usbport_trig_remove_port()
255 sysfs_remove_file_from_group(&led_cdev->dev->kobj, &port->attr.attr, in usbport_trig_remove_port()
257 kfree(port->port_name); in usbport_trig_remove_port()
266 list_for_each_entry_safe(port, tmp, &usbport_data->ports, list) { in usbport_trig_remove_usb_dev_ports()
267 if (port->hub == usb_dev) in usbport_trig_remove_usb_dev_ports()
281 struct led_classdev *led_cdev = usbport_data->led_cdev; in usbport_trig_notify()
290 if (observed && usbport_data->count++ == 0) in usbport_trig_notify()
295 if (observed && --usbport_data->count == 0) in usbport_trig_notify()
310 return -ENOMEM; in usbport_trig_activate()
311 usbport_data->led_cdev = led_cdev; in usbport_trig_activate()
314 INIT_LIST_HEAD(&usbport_data->ports); in usbport_trig_activate()
315 err = sysfs_create_group(&led_cdev->dev->kobj, &ports_group); in usbport_trig_activate()
322 usbport_data->nb.notifier_call = usbport_trig_notify; in usbport_trig_activate()
324 usb_register_notify(&usbport_data->nb); in usbport_trig_activate()
337 list_for_each_entry_safe(port, tmp, &usbport_data->ports, list) { in usbport_trig_deactivate()
341 sysfs_remove_group(&led_cdev->dev->kobj, &ports_group); in usbport_trig_deactivate()
343 usb_unregister_notify(&usbport_data->nb); in usbport_trig_deactivate()
357 MODULE_DESCRIPTION("USB port trigger");