Lines Matching +full:mini +full:- +full:core

22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include <media/rc-core.h>
36 /* ---------------------------------------------------------------------- */
39 struct cx88_core *core; member
62 MODULE_PARM_DESC(ir_samplerate, "IR samplerate in kHz, 1 - 20, default 4");
69 printk(KERN_DEBUG "%s IR: " fmt , ir->core->name , ##arg)
74 /* ---------------------------------------------------------------------- */
78 struct cx88_core *core = ir->core; in cx88_ir_handle_key() local
82 gpio = cx_read(ir->gpio_addr); in cx88_ir_handle_key()
83 switch (core->boardnr) { in cx88_ir_handle_key()
114 if (ir->polling) { in cx88_ir_handle_key()
115 if (ir->last_gpio == auxgpio) in cx88_ir_handle_key()
117 ir->last_gpio = auxgpio; in cx88_ir_handle_key()
121 data = ir_extract_bits(gpio, ir->mask_keycode); in cx88_ir_handle_key()
124 ir->polling ? "poll" : "irq", in cx88_ir_handle_key()
125 (gpio & ir->mask_keydown) ? " down" : "", in cx88_ir_handle_key()
126 (gpio & ir->mask_keyup) ? " up" : ""); in cx88_ir_handle_key()
128 if (ir->core->boardnr == CX88_BOARD_NORWOOD_MICRO) { in cx88_ir_handle_key()
133 rc_keydown(ir->dev, data, 0); in cx88_ir_handle_key()
135 } else if (ir->mask_keydown) { in cx88_ir_handle_key()
137 if (gpio & ir->mask_keydown) in cx88_ir_handle_key()
138 rc_keydown_notimeout(ir->dev, data, 0); in cx88_ir_handle_key()
140 rc_keyup(ir->dev); in cx88_ir_handle_key()
142 } else if (ir->mask_keyup) { in cx88_ir_handle_key()
144 if (0 == (gpio & ir->mask_keyup)) in cx88_ir_handle_key()
145 rc_keydown_notimeout(ir->dev, data, 0); in cx88_ir_handle_key()
147 rc_keyup(ir->dev); in cx88_ir_handle_key()
150 /* can't distinguish keydown/up :-/ */ in cx88_ir_handle_key()
151 rc_keydown_notimeout(ir->dev, data, 0); in cx88_ir_handle_key()
152 rc_keyup(ir->dev); in cx88_ir_handle_key()
162 missed = hrtimer_forward_now(&ir->timer, in cx88_ir_work()
163 ktime_set(0, ir->polling * 1000000)); in cx88_ir_work()
165 ir_dprintk("Missed ticks %ld\n", missed - 1); in cx88_ir_work()
172 struct cx88_core *core = priv; in __cx88_ir_start() local
175 if (!core || !core->ir) in __cx88_ir_start()
176 return -EINVAL; in __cx88_ir_start()
178 ir = core->ir; in __cx88_ir_start()
180 if (ir->polling) { in __cx88_ir_start()
181 hrtimer_init(&ir->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in __cx88_ir_start()
182 ir->timer.function = cx88_ir_work; in __cx88_ir_start()
183 hrtimer_start(&ir->timer, in __cx88_ir_start()
184 ktime_set(0, ir->polling * 1000000), in __cx88_ir_start()
187 if (ir->sampling) { in __cx88_ir_start()
188 core->pci_irqmask |= PCI_INT_IR_SMPINT; in __cx88_ir_start()
197 struct cx88_core *core = priv; in __cx88_ir_stop() local
200 if (!core || !core->ir) in __cx88_ir_stop()
203 ir = core->ir; in __cx88_ir_stop()
204 if (ir->sampling) { in __cx88_ir_stop()
206 core->pci_irqmask &= ~PCI_INT_IR_SMPINT; in __cx88_ir_stop()
209 if (ir->polling) in __cx88_ir_stop()
210 hrtimer_cancel(&ir->timer); in __cx88_ir_stop()
213 int cx88_ir_start(struct cx88_core *core) in cx88_ir_start() argument
215 if (core->ir->users) in cx88_ir_start()
216 return __cx88_ir_start(core); in cx88_ir_start()
221 void cx88_ir_stop(struct cx88_core *core) in cx88_ir_stop() argument
223 if (core->ir->users) in cx88_ir_stop()
224 __cx88_ir_stop(core); in cx88_ir_stop()
229 struct cx88_core *core = rc->priv; in cx88_ir_open() local
231 core->ir->users++; in cx88_ir_open()
232 return __cx88_ir_start(core); in cx88_ir_open()
237 struct cx88_core *core = rc->priv; in cx88_ir_close() local
239 core->ir->users--; in cx88_ir_close()
240 if (!core->ir->users) in cx88_ir_close()
241 __cx88_ir_stop(core); in cx88_ir_close()
244 /* ---------------------------------------------------------------------- */
246 int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) in cx88_ir_init() argument
252 int err = -ENOMEM; in cx88_ir_init()
254 * used with a full-code IR table in cx88_ir_init()
262 ir->dev = dev; in cx88_ir_init()
265 switch (core->boardnr) { in cx88_ir_init()
270 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
271 ir->mask_keycode = 0x1f; in cx88_ir_init()
272 ir->mask_keyup = 0x60; in cx88_ir_init()
273 ir->polling = 50; /* ms */ in cx88_ir_init()
277 ir->sampling = 0xeb04; /* address */ in cx88_ir_init()
291 ir->sampling = 1; in cx88_ir_init()
299 ir->gpio_addr = MO_GP0_IO; in cx88_ir_init()
300 ir->mask_keycode = 0x8f8; in cx88_ir_init()
301 ir->mask_keyup = 0x100; in cx88_ir_init()
302 ir->polling = 50; /* ms */ in cx88_ir_init()
310 ir->gpio_addr = MO_GP0_IO; in cx88_ir_init()
311 ir->mask_keycode = 0x8f8; in cx88_ir_init()
312 ir->mask_keyup = 0x100; in cx88_ir_init()
313 ir->polling = 1; /* ms */ in cx88_ir_init()
317 ir->gpio_addr = MO_GP0_IO; in cx88_ir_init()
318 ir->mask_keycode = 0xfd; in cx88_ir_init()
319 ir->mask_keydown = 0x02; in cx88_ir_init()
320 ir->polling = 5; /* ms */ in cx88_ir_init()
329 * 002-T mini RC, provided with newer PV hardware in cx88_ir_init()
332 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
333 ir->mask_keyup = 0x80; in cx88_ir_init()
334 ir->polling = 10; /* ms */ in cx88_ir_init()
340 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
341 ir->mask_keycode = 0x3f; in cx88_ir_init()
342 ir->mask_keyup = 0x80; in cx88_ir_init()
343 ir->polling = 1; /* ms */ in cx88_ir_init()
347 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
348 ir->mask_keycode = 0x1f; in cx88_ir_init()
349 ir->mask_keyup = 0x60; in cx88_ir_init()
350 ir->polling = 1; /* ms */ in cx88_ir_init()
354 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
355 ir->mask_keycode = 0xbf; in cx88_ir_init()
356 ir->mask_keyup = 0x40; in cx88_ir_init()
357 ir->polling = 50; /* ms */ in cx88_ir_init()
361 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
362 ir->mask_keycode = 0x1f; in cx88_ir_init()
363 ir->mask_keyup = 0x40; in cx88_ir_init()
364 ir->polling = 1; /* ms */ in cx88_ir_init()
369 ir->gpio_addr = MO_GP2_IO; in cx88_ir_init()
370 ir->mask_keycode = 0xfb; in cx88_ir_init()
371 ir->mask_keydown = 0x02; in cx88_ir_init()
372 ir->polling = 50; /* ms */ in cx88_ir_init()
382 ir->sampling = 0xff00; /* address */ in cx88_ir_init()
388 ir->sampling = 0xff00; /* address */ in cx88_ir_init()
392 ir->sampling = 0xff00; /* address */ in cx88_ir_init()
396 ir->gpio_addr = MO_GP1_IO; in cx88_ir_init()
397 ir->mask_keycode = 0x0e; in cx88_ir_init()
398 ir->mask_keyup = 0x80; in cx88_ir_init()
399 ir->polling = 50; /* ms */ in cx88_ir_init()
403 ir->gpio_addr = MO_GP0_IO; in cx88_ir_init()
404 ir->mask_keycode = 0xfa; in cx88_ir_init()
405 ir->polling = 50; /* ms */ in cx88_ir_init()
409 ir->sampling = 1; in cx88_ir_init()
413 ir->gpio_addr = MO_GP2_IO; in cx88_ir_init()
414 ir->mask_keycode = 0x7e; in cx88_ir_init()
415 ir->polling = 100; /* ms */ in cx88_ir_init()
420 ir->sampling = 0xff00; /* address */ in cx88_ir_init()
425 err = -ENODEV; in cx88_ir_init()
441 if (hardware_mask && !ir->mask_keycode) in cx88_ir_init()
442 ir->mask_keycode = hardware_mask; in cx88_ir_init()
445 snprintf(ir->name, sizeof(ir->name), "cx88 IR (%s)", core->board.name); in cx88_ir_init()
446 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", pci_name(pci)); in cx88_ir_init()
448 dev->input_name = ir->name; in cx88_ir_init()
449 dev->input_phys = ir->phys; in cx88_ir_init()
450 dev->input_id.bustype = BUS_PCI; in cx88_ir_init()
451 dev->input_id.version = 1; in cx88_ir_init()
452 if (pci->subsystem_vendor) { in cx88_ir_init()
453 dev->input_id.vendor = pci->subsystem_vendor; in cx88_ir_init()
454 dev->input_id.product = pci->subsystem_device; in cx88_ir_init()
456 dev->input_id.vendor = pci->vendor; in cx88_ir_init()
457 dev->input_id.product = pci->device; in cx88_ir_init()
459 dev->dev.parent = &pci->dev; in cx88_ir_init()
460 dev->map_name = ir_codes; in cx88_ir_init()
461 dev->driver_name = MODULE_NAME; in cx88_ir_init()
462 dev->priv = core; in cx88_ir_init()
463 dev->open = cx88_ir_open; in cx88_ir_init()
464 dev->close = cx88_ir_close; in cx88_ir_init()
465 dev->scanmask = hardware_mask; in cx88_ir_init()
467 if (ir->sampling) { in cx88_ir_init()
468 dev->driver_type = RC_DRIVER_IR_RAW; in cx88_ir_init()
469 dev->timeout = 10 * 1000 * 1000; /* 10 ms */ in cx88_ir_init()
471 dev->driver_type = RC_DRIVER_SCANCODE; in cx88_ir_init()
472 dev->allowed_protos = rc_type; in cx88_ir_init()
475 ir->core = core; in cx88_ir_init()
476 core->ir = ir; in cx88_ir_init()
487 core->ir = NULL; in cx88_ir_init()
492 int cx88_ir_fini(struct cx88_core *core) in cx88_ir_fini() argument
494 struct cx88_IR *ir = core->ir; in cx88_ir_fini()
500 cx88_ir_stop(core); in cx88_ir_fini()
501 rc_unregister_device(ir->dev); in cx88_ir_fini()
505 core->ir = NULL; in cx88_ir_fini()
509 /* ---------------------------------------------------------------------- */
511 void cx88_ir_irq(struct cx88_core *core) in cx88_ir_irq() argument
513 struct cx88_IR *ir = core->ir; in cx88_ir_irq()
518 if (!ir || !ir->sampling) in cx88_ir_irq()
528 if (samples == 0xff && ir->dev->idle) in cx88_ir_irq()
532 for (todo = 32; todo > 0; todo -= bits) { in cx88_ir_irq()
534 bits = min(todo, 32U - fls(ev.pulse ? samples : ~samples)); in cx88_ir_irq()
536 ir_raw_event_store_with_filter(ir->dev, &ev); in cx88_ir_irq()
539 ir_raw_event_handle(ir->dev); in cx88_ir_irq()
547 flags = i2c_smbus_read_byte_data(ir->c, 0x10); in get_key_pvr2000()
557 code = i2c_smbus_read_byte_data(ir->c, 0x00); in get_key_pvr2000()
571 void cx88_i2c_init_ir(struct cx88_core *core) in cx88_i2c_init_ir() argument
585 if (0 != core->i2c_rc) in cx88_i2c_init_ir()
591 switch (core->boardnr) { in cx88_i2c_init_ir()
594 core->init_data.name = "cx88 Leadtek PVR 2000 remote"; in cx88_i2c_init_ir()
595 core->init_data.type = RC_TYPE_UNKNOWN; in cx88_i2c_init_ir()
596 core->init_data.get_key = get_key_pvr2000; in cx88_i2c_init_ir()
597 core->init_data.ir_codes = RC_MAP_EMPTY; in cx88_i2c_init_ir()
610 memset(&core->init_data, 0, sizeof(core->init_data)); in cx88_i2c_init_ir()
614 core->init_data.name = "cx88 Hauppauge XVR remote"; in cx88_i2c_init_ir()
615 core->init_data.ir_codes = RC_MAP_HAUPPAUGE; in cx88_i2c_init_ir()
616 core->init_data.type = RC_TYPE_RC5; in cx88_i2c_init_ir()
617 core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; in cx88_i2c_init_ir()
619 info.platform_data = &core->init_data; in cx88_i2c_init_ir()
621 if (i2c_smbus_xfer(&core->i2c_adap, *addrp, 0, in cx88_i2c_init_ir()
625 i2c_new_device(&core->i2c_adap, &info); in cx88_i2c_init_ir()
631 /* ---------------------------------------------------------------------- */
634 MODULE_DESCRIPTION("input driver for cx88 GPIO-based IR remote controls");