• Home
  • Raw
  • Download

Lines Matching +full:led +full:- +full:order

1 // SPDX-License-Identifier: GPL-2.0-only
3 * tm6000-input.c - driver for TM5600/TM6000/TM6010 USB video capture devices
15 #include <media/rc-core.h>
18 #include "tm6000-regs.h"
32 #define URB_SUBMIT_DELAY 100 /* ms - Delay to submit an URB request on retrial and init */
33 #define URB_INT_LED_DELAY 100 /* ms - Delay to turn led on again on int mode */
39 printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg); \
66 struct tm6000_IR *ir = dev->ir; in tm6000_ir_wait()
68 if (!dev->ir) in tm6000_ir_wait()
71 dprintk(2, "%s: %i\n",__func__, ir->wait); in tm6000_ir_wait()
74 ir->wait = 1; in tm6000_ir_wait()
76 ir->wait = 0; in tm6000_ir_wait()
81 struct tm6000_core *dev = ir->dev; in tm6000_ir_config()
87 * The IR decoder supports RC-5 or NEC, with a configurable timing. in tm6000_ir_config()
90 * and RC-5 uses a 888.8 period. in tm6000_ir_config()
94 * It seems that the 900ms timing for NEC is used to detect a RC-5 in tm6000_ir_config()
95 * IR, in order to discard such decoding in tm6000_ir_config()
98 switch (ir->rc_proto) { in tm6000_ir_config()
101 pulse = 700; /* ms - the actual value would be 562 */ in tm6000_ir_config()
105 leader = 900; /* ms - from the NEC decoding */ in tm6000_ir_config()
106 pulse = 1780; /* ms - The actual value would be 1776 */ in tm6000_ir_config()
112 if (ir->rc_proto == RC_PROTO_BIT_NEC) in tm6000_ir_config()
117 (ir->rc_proto == RC_PROTO_BIT_NEC) ? "NEC" : "RC-5", in tm6000_ir_config()
123 /* Enable IR reception on non-busrt mode */ in tm6000_ir_config()
137 if (!ir->polling) in tm6000_ir_config()
143 /* Shows that IR is working via the LED */ in tm6000_ir_config()
147 ir->pwled = 1; in tm6000_ir_config()
164 switch (ir->rc_proto) { in tm6000_ir_keydown()
181 rc_keydown(ir->rc, protocol, scancode, 0); in tm6000_ir_keydown()
186 struct tm6000_core *dev = urb->context; in tm6000_ir_urb_received()
187 struct tm6000_IR *ir = dev->ir; in tm6000_ir_urb_received()
191 if (urb->status < 0 || urb->actual_length <= 0) { in tm6000_ir_urb_received()
193 urb->status, urb->actual_length); in tm6000_ir_urb_received()
194 ir->submit_urb = 1; in tm6000_ir_urb_received()
195 schedule_delayed_work(&ir->work, msecs_to_jiffies(URB_SUBMIT_DELAY)); in tm6000_ir_urb_received()
198 buf = urb->transfer_buffer; in tm6000_ir_urb_received()
203 buf, urb->actual_length, false); in tm6000_ir_urb_received()
205 tm6000_ir_keydown(ir, urb->transfer_buffer, urb->actual_length); in tm6000_ir_urb_received()
209 * Flash the led. We can't do it here, as it is running on IRQ context. in tm6000_ir_urb_received()
212 ir->pwled = 2; in tm6000_ir_urb_received()
213 schedule_delayed_work(&ir->work, msecs_to_jiffies(10)); in tm6000_ir_urb_received()
219 struct tm6000_core *dev = ir->dev; in tm6000_ir_handle_key()
223 if (ir->wait) in tm6000_ir_handle_key()
236 if (!ir->pwled) { in tm6000_ir_handle_key()
238 ir->pwled = 1; in tm6000_ir_handle_key()
245 ir->pwled = 0; in tm6000_ir_handle_key()
247 /* Re-schedule polling */ in tm6000_ir_handle_key()
248 schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling)); in tm6000_ir_handle_key()
254 struct tm6000_core *dev = ir->dev; in tm6000_ir_int_work()
257 dprintk(3, "%s, submit_urb = %d, pwled = %d\n",__func__, ir->submit_urb, in tm6000_ir_int_work()
258 ir->pwled); in tm6000_ir_int_work()
260 if (ir->submit_urb) { in tm6000_ir_int_work()
264 rc = usb_submit_urb(ir->int_urb, GFP_ATOMIC); in tm6000_ir_int_work()
269 schedule_delayed_work(&ir->work, msecs_to_jiffies(URB_SUBMIT_DELAY)); in tm6000_ir_int_work()
272 ir->submit_urb = 0; in tm6000_ir_int_work()
275 /* Led is enabled only if USB submit doesn't fail */ in tm6000_ir_int_work()
276 if (ir->pwled == 2) { in tm6000_ir_int_work()
278 ir->pwled = 0; in tm6000_ir_int_work()
279 schedule_delayed_work(&ir->work, msecs_to_jiffies(URB_INT_LED_DELAY)); in tm6000_ir_int_work()
280 } else if (!ir->pwled) { in tm6000_ir_int_work()
282 ir->pwled = 1; in tm6000_ir_int_work()
288 struct tm6000_IR *ir = rc->priv; in tm6000_ir_start()
292 schedule_delayed_work(&ir->work, 0); in tm6000_ir_start()
299 struct tm6000_IR *ir = rc->priv; in tm6000_ir_stop()
303 cancel_delayed_work_sync(&ir->work); in tm6000_ir_stop()
308 struct tm6000_IR *ir = rc->priv; in tm6000_ir_change_protocol()
315 ir->rc_proto = *rc_proto; in tm6000_ir_change_protocol()
324 struct tm6000_IR *ir = rc->priv; in __tm6000_ir_int_start()
327 int err = -ENOMEM; in __tm6000_ir_int_start()
330 return -ENODEV; in __tm6000_ir_int_start()
331 dev = ir->dev; in __tm6000_ir_int_start()
335 ir->int_urb = usb_alloc_urb(0, GFP_ATOMIC); in __tm6000_ir_int_start()
336 if (!ir->int_urb) in __tm6000_ir_int_start()
337 return -ENOMEM; in __tm6000_ir_int_start()
339 pipe = usb_rcvintpipe(dev->udev, in __tm6000_ir_int_start()
340 dev->int_in.endp->desc.bEndpointAddress in __tm6000_ir_int_start()
343 size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe)); in __tm6000_ir_int_start()
346 ir->int_urb->transfer_buffer = kzalloc(size, GFP_ATOMIC); in __tm6000_ir_int_start()
347 if (!ir->int_urb->transfer_buffer) { in __tm6000_ir_int_start()
348 usb_free_urb(ir->int_urb); in __tm6000_ir_int_start()
351 dprintk(1, "int interval: %d\n", dev->int_in.endp->desc.bInterval); in __tm6000_ir_int_start()
353 usb_fill_int_urb(ir->int_urb, dev->udev, pipe, in __tm6000_ir_int_start()
354 ir->int_urb->transfer_buffer, size, in __tm6000_ir_int_start()
356 dev->int_in.endp->desc.bInterval); in __tm6000_ir_int_start()
358 ir->submit_urb = 1; in __tm6000_ir_int_start()
359 schedule_delayed_work(&ir->work, msecs_to_jiffies(URB_SUBMIT_DELAY)); in __tm6000_ir_int_start()
366 struct tm6000_IR *ir = rc->priv; in __tm6000_ir_int_stop()
368 if (!ir || !ir->int_urb) in __tm6000_ir_int_stop()
373 usb_kill_urb(ir->int_urb); in __tm6000_ir_int_stop()
374 kfree(ir->int_urb->transfer_buffer); in __tm6000_ir_int_stop()
375 usb_free_urb(ir->int_urb); in __tm6000_ir_int_stop()
376 ir->int_urb = NULL; in __tm6000_ir_int_stop()
381 struct tm6000_IR *ir = dev->ir; in tm6000_ir_int_start()
386 return __tm6000_ir_int_start(ir->rc); in tm6000_ir_int_start()
391 struct tm6000_IR *ir = dev->ir; in tm6000_ir_int_stop()
393 if (!ir || !ir->rc) in tm6000_ir_int_stop()
396 __tm6000_ir_int_stop(ir->rc); in tm6000_ir_int_stop()
403 int err = -ENOMEM; in tm6000_ir_init()
407 return -ENODEV; in tm6000_ir_init()
409 if (!dev->caps.has_remote) in tm6000_ir_init()
412 if (!dev->ir_codes) in tm6000_ir_init()
423 ir->dev = dev; in tm6000_ir_init()
424 dev->ir = ir; in tm6000_ir_init()
425 ir->rc = rc; in tm6000_ir_init()
428 rc->allowed_protocols = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_NEC; in tm6000_ir_init()
429 /* Needed, in order to support NEC remotes with 24 or 32 bits */ in tm6000_ir_init()
430 rc->scancode_mask = 0xffff; in tm6000_ir_init()
431 rc->priv = ir; in tm6000_ir_init()
432 rc->change_protocol = tm6000_ir_change_protocol; in tm6000_ir_init()
433 if (dev->int_in.endp) { in tm6000_ir_init()
434 rc->open = __tm6000_ir_int_start; in tm6000_ir_init()
435 rc->close = __tm6000_ir_int_stop; in tm6000_ir_init()
436 INIT_DELAYED_WORK(&ir->work, tm6000_ir_int_work); in tm6000_ir_init()
438 rc->open = tm6000_ir_start; in tm6000_ir_init()
439 rc->close = tm6000_ir_stop; in tm6000_ir_init()
440 ir->polling = 50; in tm6000_ir_init()
441 INIT_DELAYED_WORK(&ir->work, tm6000_ir_handle_key); in tm6000_ir_init()
444 snprintf(ir->name, sizeof(ir->name), "tm5600/60x0 IR (%s)", in tm6000_ir_init()
445 dev->name); in tm6000_ir_init()
447 usb_make_path(dev->udev, ir->phys, sizeof(ir->phys)); in tm6000_ir_init()
448 strlcat(ir->phys, "/input0", sizeof(ir->phys)); in tm6000_ir_init()
453 rc->device_name = ir->name; in tm6000_ir_init()
454 rc->input_phys = ir->phys; in tm6000_ir_init()
455 rc->input_id.bustype = BUS_USB; in tm6000_ir_init()
456 rc->input_id.version = 1; in tm6000_ir_init()
457 rc->input_id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor); in tm6000_ir_init()
458 rc->input_id.product = le16_to_cpu(dev->udev->descriptor.idProduct); in tm6000_ir_init()
459 rc->map_name = dev->ir_codes; in tm6000_ir_init()
460 rc->driver_name = "tm6000"; in tm6000_ir_init()
461 rc->dev.parent = &dev->udev->dev; in tm6000_ir_init()
471 dev->ir = NULL; in tm6000_ir_init()
479 struct tm6000_IR *ir = dev->ir; in tm6000_ir_fini()
488 if (!ir->polling) in tm6000_ir_fini()
489 __tm6000_ir_int_stop(ir->rc); in tm6000_ir_fini()
491 tm6000_ir_stop(ir->rc); in tm6000_ir_fini()
493 /* Turn off the led */ in tm6000_ir_fini()
495 ir->pwled = 0; in tm6000_ir_fini()
497 rc_unregister_device(ir->rc); in tm6000_ir_fini()
500 dev->ir = NULL; in tm6000_ir_fini()