Lines Matching +full:ctrl +full:- +full:len

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * uvc_status.c -- USB Video Class driver - Status endpoint
5 * Copyright (C) 2005-2009
17 /* --------------------------------------------------------------------------
28 return -ENOMEM; in uvc_input_init()
30 usb_make_path(dev->udev, dev->input_phys, sizeof(dev->input_phys)); in uvc_input_init()
31 strlcat(dev->input_phys, "/button", sizeof(dev->input_phys)); in uvc_input_init()
33 input->name = dev->name; in uvc_input_init()
34 input->phys = dev->input_phys; in uvc_input_init()
35 usb_to_input_id(dev->udev, &input->id); in uvc_input_init()
36 input->dev.parent = &dev->intf->dev; in uvc_input_init()
38 __set_bit(EV_KEY, input->evbit); in uvc_input_init()
39 __set_bit(KEY_CAMERA, input->keybit); in uvc_input_init()
44 dev->input = input; in uvc_input_init()
54 if (dev->input) in uvc_input_unregister()
55 input_unregister_device(dev->input); in uvc_input_unregister()
61 if (dev->input) { in uvc_input_report_key()
62 input_report_key(dev->input, code, value); in uvc_input_report_key()
63 input_sync(dev->input); in uvc_input_report_key()
73 /* --------------------------------------------------------------------------
93 struct uvc_streaming_status *status, int len) in uvc_event_streaming() argument
95 if (len < 3) { in uvc_event_streaming()
101 if (status->bEvent == 0) { in uvc_event_streaming()
102 if (len < 4) in uvc_event_streaming()
104 uvc_dbg(dev, STATUS, "Button (intf %u) %s len %d\n", in uvc_event_streaming()
105 status->bOriginator, in uvc_event_streaming()
106 status->bValue[0] ? "pressed" : "released", len); in uvc_event_streaming()
107 uvc_input_report_key(dev, KEY_CAMERA, status->bValue[0]); in uvc_event_streaming()
109 uvc_dbg(dev, STATUS, "Stream %u error event %02x len %d\n", in uvc_event_streaming()
110 status->bOriginator, status->bEvent, len); in uvc_event_streaming()
123 struct uvc_control *ctrl; in uvc_event_entity_find_ctrl() local
126 for (i = 0, ctrl = entity->controls; i < entity->ncontrols; i++, ctrl++) in uvc_event_entity_find_ctrl()
127 if (ctrl->info.selector == selector) in uvc_event_entity_find_ctrl()
128 return ctrl; in uvc_event_entity_find_ctrl()
137 list_for_each_entry((*chain), &dev->chains, list) { in uvc_event_find_ctrl()
139 struct uvc_control *ctrl; in uvc_event_find_ctrl() local
141 list_for_each_entry(entity, &(*chain)->entities, chain) { in uvc_event_find_ctrl()
142 if (entity->id != status->bOriginator) in uvc_event_find_ctrl()
145 ctrl = uvc_event_entity_find_ctrl(entity, in uvc_event_find_ctrl()
146 status->bSelector); in uvc_event_find_ctrl()
147 if (ctrl) in uvc_event_find_ctrl()
148 return ctrl; in uvc_event_find_ctrl()
156 const struct uvc_control_status *status, int len) in uvc_event_control() argument
159 struct uvc_device *dev = urb->context; in uvc_event_control()
161 struct uvc_control *ctrl; in uvc_event_control() local
163 if (len < 6 || status->bEvent != 0 || in uvc_event_control()
164 status->bAttribute >= ARRAY_SIZE(attrs)) { in uvc_event_control()
169 uvc_dbg(dev, STATUS, "Control %u/%u %s change len %d\n", in uvc_event_control()
170 status->bOriginator, status->bSelector, in uvc_event_control()
171 attrs[status->bAttribute], len); in uvc_event_control()
174 ctrl = uvc_event_find_ctrl(dev, status, &chain); in uvc_event_control()
175 if (!ctrl) in uvc_event_control()
178 switch (status->bAttribute) { in uvc_event_control()
180 return uvc_ctrl_status_event_async(urb, chain, ctrl, in uvc_event_control()
181 status->bValue); in uvc_event_control()
195 struct uvc_device *dev = urb->context; in uvc_status_complete()
196 int len, ret; in uvc_status_complete() local
198 switch (urb->status) { in uvc_status_complete()
202 case -ENOENT: /* usb_kill_urb() called. */ in uvc_status_complete()
203 case -ECONNRESET: /* usb_unlink_urb() called. */ in uvc_status_complete()
204 case -ESHUTDOWN: /* The endpoint is being disabled. */ in uvc_status_complete()
205 case -EPROTO: /* Device is disconnected (reported by some host controllers). */ in uvc_status_complete()
209 dev_warn(&dev->udev->dev, in uvc_status_complete()
210 "Non-zero status (%d) in status completion handler.\n", in uvc_status_complete()
211 urb->status); in uvc_status_complete()
215 len = urb->actual_length; in uvc_status_complete()
216 if (len > 0) { in uvc_status_complete()
217 switch (dev->status[0] & 0x0f) { in uvc_status_complete()
220 (struct uvc_control_status *)dev->status; in uvc_status_complete()
222 if (uvc_event_control(urb, status, len)) in uvc_status_complete()
230 (struct uvc_streaming_status *)dev->status; in uvc_status_complete()
232 uvc_event_streaming(dev, status, len); in uvc_status_complete()
238 dev->status[0]); in uvc_status_complete()
244 urb->interval = dev->int_ep->desc.bInterval; in uvc_status_complete()
247 dev_err(&dev->udev->dev, in uvc_status_complete()
253 struct usb_host_endpoint *ep = dev->int_ep; in uvc_status_init()
262 dev->status = kzalloc(UVC_MAX_STATUS_SIZE, GFP_KERNEL); in uvc_status_init()
263 if (dev->status == NULL) in uvc_status_init()
264 return -ENOMEM; in uvc_status_init()
266 dev->int_urb = usb_alloc_urb(0, GFP_KERNEL); in uvc_status_init()
267 if (dev->int_urb == NULL) { in uvc_status_init()
268 kfree(dev->status); in uvc_status_init()
269 return -ENOMEM; in uvc_status_init()
272 pipe = usb_rcvintpipe(dev->udev, ep->desc.bEndpointAddress); in uvc_status_init()
275 * For high-speed interrupt endpoints, the bInterval value is used as in uvc_status_init()
278 interval = ep->desc.bInterval; in uvc_status_init()
279 if (interval > 16 && dev->udev->speed == USB_SPEED_HIGH && in uvc_status_init()
280 (dev->quirks & UVC_QUIRK_STATUS_INTERVAL)) in uvc_status_init()
281 interval = fls(interval) - 1; in uvc_status_init()
283 usb_fill_int_urb(dev->int_urb, dev->udev, pipe, in uvc_status_init()
284 dev->status, UVC_MAX_STATUS_SIZE, uvc_status_complete, in uvc_status_init()
292 usb_kill_urb(dev->int_urb); in uvc_status_unregister()
298 usb_free_urb(dev->int_urb); in uvc_status_cleanup()
299 kfree(dev->status); in uvc_status_cleanup()
304 if (dev->int_urb == NULL) in uvc_status_start()
307 return usb_submit_urb(dev->int_urb, flags); in uvc_status_start()
312 usb_kill_urb(dev->int_urb); in uvc_status_stop()