aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-12-13 22:16:55 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-02-26 13:10:23 -0500
commite93854da880d6dc357c00625d8371b6a926fd19b (patch)
tree8bf87df8cf639fe7af7e35fb5cbc42792742a31b
parent4714eda87748f226833c32400ab60dd6a3b80766 (diff)
V4L/DVB (13634): ir-core: allow passing IR device parameters to ir-core
Adds an structure to ir_input_register to contain IR device characteristics, like supported protocols and a callback to handle protocol event changes. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/IR/ir-functions.c2
-rw-r--r--drivers/media/IR/ir-keytable.c9
-rw-r--r--drivers/media/dvb/dm1105/dm1105.c4
-rw-r--r--drivers/media/dvb/mantis/mantis_input.c2
-rw-r--r--drivers/media/dvb/ttpci/budget-ci.c2
-rw-r--r--drivers/media/video/bt8xx/bttv-input.c4
-rw-r--r--drivers/media/video/cx231xx/cx231xx-input.c2
-rw-r--r--drivers/media/video/cx23885/cx23885-input.c2
-rw-r--r--drivers/media/video/cx88/cx88-input.c4
-rw-r--r--drivers/media/video/em28xx/em28xx-input.c2
-rw-r--r--drivers/media/video/ir-kbd-i2c.c4
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c4
-rw-r--r--include/media/ir-common.h4
-rw-r--r--include/media/ir-core.h18
-rw-r--r--include/media/ir-kbd-i2c.h2
15 files changed, 39 insertions, 26 deletions
diff --git a/drivers/media/IR/ir-functions.c b/drivers/media/IR/ir-functions.c
index 776a136616d6..b501ac9d401d 100644
--- a/drivers/media/IR/ir-functions.c
+++ b/drivers/media/IR/ir-functions.c
@@ -52,7 +52,7 @@ static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir)
52/* -------------------------------------------------------------------------- */ 52/* -------------------------------------------------------------------------- */
53 53
54int ir_input_init(struct input_dev *dev, struct ir_input_state *ir, 54int ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
55 int ir_type) 55 const enum ir_type ir_type)
56{ 56{
57 ir->ir_type = ir_type; 57 ir->ir_type = ir_type;
58 58
diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c
index 8097561ec66f..b2d498c3183a 100644
--- a/drivers/media/IR/ir-keytable.c
+++ b/drivers/media/IR/ir-keytable.c
@@ -89,6 +89,8 @@ EXPORT_SYMBOL_GPL(ir_roundup_tablesize);
89 * @origin: origin table 89 * @origin: origin table
90 * 90 *
91 * Copies all entries where the keycode is not KEY_UNKNOWN/KEY_RESERVED 91 * Copies all entries where the keycode is not KEY_UNKNOWN/KEY_RESERVED
92 * Also copies table size and table protocol.
93 * NOTE: It shouldn't copy the lock field
92 */ 94 */
93 95
94int ir_copy_table(struct ir_scancode_table *destin, 96int ir_copy_table(struct ir_scancode_table *destin,
@@ -105,6 +107,7 @@ int ir_copy_table(struct ir_scancode_table *destin,
105 j++; 107 j++;
106 } 108 }
107 destin->size = j; 109 destin->size = j;
110 destin->ir_type = origin->ir_type;
108 111
109 IR_dprintk(1, "Copied %d scancodes to the new keycode table\n", destin->size); 112 IR_dprintk(1, "Copied %d scancodes to the new keycode table\n", destin->size);
110 113
@@ -404,7 +407,8 @@ EXPORT_SYMBOL_GPL(ir_g_keycode_from_table);
404 * It should be called before registering the IR device. 407 * It should be called before registering the IR device.
405 */ 408 */
406int ir_input_register(struct input_dev *input_dev, 409int ir_input_register(struct input_dev *input_dev,
407 struct ir_scancode_table *rc_tab) 410 const struct ir_scancode_table *rc_tab,
411 const struct ir_dev_props *props)
408{ 412{
409 struct ir_input_dev *ir_dev; 413 struct ir_input_dev *ir_dev;
410 struct ir_scancode *keymap = rc_tab->scan; 414 struct ir_scancode *keymap = rc_tab->scan;
@@ -417,7 +421,7 @@ int ir_input_register(struct input_dev *input_dev,
417 if (!ir_dev) 421 if (!ir_dev)
418 return -ENOMEM; 422 return -ENOMEM;
419 423
420 spin_lock_init(&rc_tab->lock); 424 spin_lock_init(&ir_dev->rc_tab.lock);
421 425
422 ir_dev->rc_tab.size = ir_roundup_tablesize(rc_tab->size); 426 ir_dev->rc_tab.size = ir_roundup_tablesize(rc_tab->size);
423 ir_dev->rc_tab.scan = kzalloc(ir_dev->rc_tab.size * 427 ir_dev->rc_tab.scan = kzalloc(ir_dev->rc_tab.size *
@@ -430,6 +434,7 @@ int ir_input_register(struct input_dev *input_dev,
430 ir_dev->rc_tab.size * sizeof(ir_dev->rc_tab.scan)); 434 ir_dev->rc_tab.size * sizeof(ir_dev->rc_tab.scan));
431 435
432 ir_copy_table(&ir_dev->rc_tab, rc_tab); 436 ir_copy_table(&ir_dev->rc_tab, rc_tab);
437 ir_dev->props = props;
433 438
434 /* set the bits for the keys */ 439 /* set the bits for the keys */
435 IR_dprintk(1, "key map size: %d\n", rc_tab->size); 440 IR_dprintk(1, "key map size: %d\n", rc_tab->size);
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c
index f0f483ac8b89..414d3b2444a2 100644
--- a/drivers/media/dvb/dm1105/dm1105.c
+++ b/drivers/media/dvb/dm1105/dm1105.c
@@ -578,7 +578,7 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105)
578{ 578{
579 struct input_dev *input_dev; 579 struct input_dev *input_dev;
580 struct ir_scancode_table *ir_codes = &ir_codes_dm1105_nec_table; 580 struct ir_scancode_table *ir_codes = &ir_codes_dm1105_nec_table;
581 int ir_type = IR_TYPE_OTHER; 581 enum ir_type ir_type = IR_TYPE_OTHER;
582 int err = -ENOMEM; 582 int err = -ENOMEM;
583 583
584 input_dev = input_allocate_device(); 584 input_dev = input_allocate_device();
@@ -611,7 +611,7 @@ int __devinit dm1105_ir_init(struct dm1105dvb *dm1105)
611 611
612 INIT_WORK(&dm1105->ir.work, dm1105_emit_key); 612 INIT_WORK(&dm1105->ir.work, dm1105_emit_key);
613 613
614 err = ir_input_register(input_dev, ir_codes); 614 err = ir_input_register(input_dev, ir_codes, NULL);
615 615
616 return err; 616 return err;
617} 617}
diff --git a/drivers/media/dvb/mantis/mantis_input.c b/drivers/media/dvb/mantis/mantis_input.c
index 6a9df779441f..4675a3b53c7d 100644
--- a/drivers/media/dvb/mantis/mantis_input.c
+++ b/drivers/media/dvb/mantis/mantis_input.c
@@ -126,7 +126,7 @@ int mantis_input_init(struct mantis_pci *mantis)
126 rc->id.version = 1; 126 rc->id.version = 1;
127 rc->dev = mantis->pdev->dev; 127 rc->dev = mantis->pdev->dev;
128 128
129 err = ir_input_register(rc, &ir_mantis); 129 err = ir_input_register(rc, &ir_mantis, NULL);
130 if (err) { 130 if (err) {
131 dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err); 131 dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err);
132 input_free_device(rc); 132 input_free_device(rc);
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
index 9782e0593733..49c2a817a06f 100644
--- a/drivers/media/dvb/ttpci/budget-ci.c
+++ b/drivers/media/dvb/ttpci/budget-ci.c
@@ -254,7 +254,7 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
254 budget_ci->ir.timer_keyup.function = msp430_ir_keyup; 254 budget_ci->ir.timer_keyup.function = msp430_ir_keyup;
255 budget_ci->ir.timer_keyup.data = (unsigned long) &budget_ci->ir; 255 budget_ci->ir.timer_keyup.data = (unsigned long) &budget_ci->ir;
256 budget_ci->ir.last_raw = 0xffff; /* An impossible value */ 256 budget_ci->ir.last_raw = 0xffff; /* An impossible value */
257 error = ir_input_register(input_dev, ir_codes); 257 error = ir_input_register(input_dev, ir_codes, NULL);
258 if (error) { 258 if (error) {
259 printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error); 259 printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error);
260 return error; 260 return error;
diff --git a/drivers/media/video/bt8xx/bttv-input.c b/drivers/media/video/bt8xx/bttv-input.c
index 277a092e1214..f8053fd88346 100644
--- a/drivers/media/video/bt8xx/bttv-input.c
+++ b/drivers/media/video/bt8xx/bttv-input.c
@@ -247,7 +247,7 @@ int bttv_input_init(struct bttv *btv)
247 struct card_ir *ir; 247 struct card_ir *ir;
248 struct ir_scancode_table *ir_codes = NULL; 248 struct ir_scancode_table *ir_codes = NULL;
249 struct input_dev *input_dev; 249 struct input_dev *input_dev;
250 int ir_type = IR_TYPE_OTHER; 250 enum ir_type ir_type = IR_TYPE_OTHER;
251 int err = -ENOMEM; 251 int err = -ENOMEM;
252 252
253 if (!btv->has_remote) 253 if (!btv->has_remote)
@@ -389,7 +389,7 @@ int bttv_input_init(struct bttv *btv)
389 bttv_ir_start(btv, ir); 389 bttv_ir_start(btv, ir);
390 390
391 /* all done */ 391 /* all done */
392 err = ir_input_register(btv->remote->dev, ir_codes); 392 err = ir_input_register(btv->remote->dev, ir_codes, NULL);
393 if (err) 393 if (err)
394 goto err_out_stop; 394 goto err_out_stop;
395 395
diff --git a/drivers/media/video/cx231xx/cx231xx-input.c b/drivers/media/video/cx231xx/cx231xx-input.c
index 15826f98b688..c5771db3bfce 100644
--- a/drivers/media/video/cx231xx/cx231xx-input.c
+++ b/drivers/media/video/cx231xx/cx231xx-input.c
@@ -216,7 +216,7 @@ int cx231xx_ir_init(struct cx231xx *dev)
216 cx231xx_ir_start(ir); 216 cx231xx_ir_start(ir);
217 217
218 /* all done */ 218 /* all done */
219 err = ir_input_register(ir->input, dev->board.ir_codes); 219 err = ir_input_register(ir->input, dev->board.ir_codes, NULL);
220 if (err) 220 if (err)
221 goto err_out_stop; 221 goto err_out_stop;
222 222
diff --git a/drivers/media/video/cx23885/cx23885-input.c b/drivers/media/video/cx23885/cx23885-input.c
index 768eec92ccf9..9c6620f86dca 100644
--- a/drivers/media/video/cx23885/cx23885-input.c
+++ b/drivers/media/video/cx23885/cx23885-input.c
@@ -397,7 +397,7 @@ int cx23885_input_init(struct cx23885_dev *dev)
397 dev->ir_input = ir; 397 dev->ir_input = ir;
398 cx23885_input_ir_start(dev); 398 cx23885_input_ir_start(dev);
399 399
400 ret = ir_input_register(ir->dev, ir_codes); 400 ret = ir_input_register(ir->dev, ir_codes, NULL);
401 if (ret) 401 if (ret)
402 goto err_out_stop; 402 goto err_out_stop;
403 403
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
index f9fda18b410c..49c07535e754 100644
--- a/drivers/media/video/cx88/cx88-input.c
+++ b/drivers/media/video/cx88/cx88-input.c
@@ -192,7 +192,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
192 struct cx88_IR *ir; 192 struct cx88_IR *ir;
193 struct input_dev *input_dev; 193 struct input_dev *input_dev;
194 struct ir_scancode_table *ir_codes = NULL; 194 struct ir_scancode_table *ir_codes = NULL;
195 int ir_type = IR_TYPE_OTHER; 195 enum ir_type ir_type = IR_TYPE_OTHER;
196 int err = -ENOMEM; 196 int err = -ENOMEM;
197 197
198 ir = kzalloc(sizeof(*ir), GFP_KERNEL); 198 ir = kzalloc(sizeof(*ir), GFP_KERNEL);
@@ -383,7 +383,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
383 cx88_ir_start(core, ir); 383 cx88_ir_start(core, ir);
384 384
385 /* all done */ 385 /* all done */
386 err = ir_input_register(ir->input, ir_codes); 386 err = ir_input_register(ir->input, ir_codes, NULL);
387 if (err) 387 if (err)
388 goto err_out_stop; 388 goto err_out_stop;
389 389
diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c
index af0d935c29be..fbfbab6841cd 100644
--- a/drivers/media/video/em28xx/em28xx-input.c
+++ b/drivers/media/video/em28xx/em28xx-input.c
@@ -412,7 +412,7 @@ int em28xx_ir_init(struct em28xx *dev)
412 em28xx_ir_start(ir); 412 em28xx_ir_start(ir);
413 413
414 /* all done */ 414 /* all done */
415 err = ir_input_register(ir->input, dev->board.ir_codes); 415 err = ir_input_register(ir->input, dev->board.ir_codes, NULL);
416 if (err) 416 if (err)
417 goto err_out_stop; 417 goto err_out_stop;
418 418
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c
index b86e35386cee..4cd75a3c47d1 100644
--- a/drivers/media/video/ir-kbd-i2c.c
+++ b/drivers/media/video/ir-kbd-i2c.c
@@ -299,7 +299,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
299{ 299{
300 struct ir_scancode_table *ir_codes = NULL; 300 struct ir_scancode_table *ir_codes = NULL;
301 const char *name = NULL; 301 const char *name = NULL;
302 int ir_type = 0; 302 enum ir_type ir_type = 0;
303 struct IR_i2c *ir; 303 struct IR_i2c *ir;
304 struct input_dev *input_dev; 304 struct input_dev *input_dev;
305 struct i2c_adapter *adap = client->adapter; 305 struct i2c_adapter *adap = client->adapter;
@@ -446,7 +446,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
446 input_dev->name = ir->name; 446 input_dev->name = ir->name;
447 input_dev->phys = ir->phys; 447 input_dev->phys = ir->phys;
448 448
449 err = ir_input_register(ir->input, ir->ir_codes); 449 err = ir_input_register(ir->input, ir->ir_codes, NULL);
450 if (err) 450 if (err)
451 goto err_out_free; 451 goto err_out_free;
452 452
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index f8e985989ca0..71b4b01824ac 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -460,7 +460,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
460 int polling = 0; 460 int polling = 0;
461 int rc5_gpio = 0; 461 int rc5_gpio = 0;
462 int nec_gpio = 0; 462 int nec_gpio = 0;
463 int ir_type = IR_TYPE_OTHER; 463 enum ir_type ir_type = IR_TYPE_OTHER;
464 int err; 464 int err;
465 465
466 if (dev->has_remote != SAA7134_REMOTE_GPIO) 466 if (dev->has_remote != SAA7134_REMOTE_GPIO)
@@ -728,7 +728,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
728 dev->remote = ir; 728 dev->remote = ir;
729 saa7134_ir_start(dev, ir); 729 saa7134_ir_start(dev, ir);
730 730
731 err = ir_input_register(ir->dev, ir_codes); 731 err = ir_input_register(ir->dev, ir_codes, NULL);
732 if (err) 732 if (err)
733 goto err_out_stop; 733 goto err_out_stop;
734 734
diff --git a/include/media/ir-common.h b/include/media/ir-common.h
index 2c6af24b905e..1b43b772165a 100644
--- a/include/media/ir-common.h
+++ b/include/media/ir-common.h
@@ -35,7 +35,7 @@
35 35
36struct ir_input_state { 36struct ir_input_state {
37 /* configuration */ 37 /* configuration */
38 int ir_type; 38 enum ir_type ir_type;
39 39
40 /* key info */ 40 /* key info */
41 u32 ir_key; /* ir scancode */ 41 u32 ir_key; /* ir scancode */
@@ -84,7 +84,7 @@ struct card_ir {
84/* Routines from ir-functions.c */ 84/* Routines from ir-functions.c */
85 85
86int ir_input_init(struct input_dev *dev, struct ir_input_state *ir, 86int ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
87 int ir_type); 87 const enum ir_type ir_type);
88void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir); 88void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir);
89void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir, 89void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
90 u32 ir_key); 90 u32 ir_key);
diff --git a/include/media/ir-core.h b/include/media/ir-core.h
index a5a3bda354de..dbdffd1458fb 100644
--- a/include/media/ir-core.h
+++ b/include/media/ir-core.h
@@ -23,10 +23,10 @@ extern int ir_core_debug;
23 23
24enum ir_type { 24enum ir_type {
25 IR_TYPE_UNKNOWN = 0, 25 IR_TYPE_UNKNOWN = 0,
26 IR_TYPE_RC5 = 1, 26 IR_TYPE_RC5 = 1L << 0, /* Philips RC5 protocol */
27 IR_TYPE_PD = 2, /* Pulse distance encoded IR */ 27 IR_TYPE_PD = 1L << 1, /* Pulse distance encoded IR */
28 IR_TYPE_NEC = 3, 28 IR_TYPE_NEC = 1L << 2,
29 IR_TYPE_OTHER = 99, 29 IR_TYPE_OTHER = 1L << 63,
30}; 30};
31 31
32struct ir_scancode { 32struct ir_scancode {
@@ -41,12 +41,19 @@ struct ir_scancode_table {
41 spinlock_t lock; 41 spinlock_t lock;
42}; 42};
43 43
44struct ir_dev_props {
45 unsigned long allowed_protos;
46 void *priv;
47 int (*change_protocol)(void *priv, unsigned long protocol);
48};
49
44struct ir_input_dev { 50struct ir_input_dev {
45 struct input_dev *dev; /* Input device*/ 51 struct input_dev *dev; /* Input device*/
46 struct ir_scancode_table rc_tab; /* scan/key table */ 52 struct ir_scancode_table rc_tab; /* scan/key table */
47 unsigned long devno; /* device number */ 53 unsigned long devno; /* device number */
48 struct attribute_group attr; /* IR attributes */ 54 struct attribute_group attr; /* IR attributes */
49 struct device *class_dev; /* virtual class dev */ 55 struct device *class_dev; /* virtual class dev */
56 const struct ir_dev_props *props; /* Device properties */
50}; 57};
51 58
52/* Routines from ir-keytable.c */ 59/* Routines from ir-keytable.c */
@@ -59,7 +66,8 @@ int ir_set_keycode_table(struct input_dev *input_dev,
59 66
60int ir_roundup_tablesize(int n_elems); 67int ir_roundup_tablesize(int n_elems);
61int ir_input_register(struct input_dev *dev, 68int ir_input_register(struct input_dev *dev,
62 struct ir_scancode_table *ir_codes); 69 const struct ir_scancode_table *ir_codes,
70 const struct ir_dev_props *props);
63void ir_input_unregister(struct input_dev *input_dev); 71void ir_input_unregister(struct input_dev *input_dev);
64 72
65/* Routines from ir-sysfs.c */ 73/* Routines from ir-sysfs.c */
diff --git a/include/media/ir-kbd-i2c.h b/include/media/ir-kbd-i2c.h
index aaf65e8b1a40..45926e3559f3 100644
--- a/include/media/ir-kbd-i2c.h
+++ b/include/media/ir-kbd-i2c.h
@@ -36,7 +36,7 @@ enum ir_kbd_get_key_fn {
36struct IR_i2c_init_data { 36struct IR_i2c_init_data {
37 struct ir_scancode_table *ir_codes; 37 struct ir_scancode_table *ir_codes;
38 const char *name; 38 const char *name;
39 int type; /* IR_TYPE_RC5, IR_TYPE_PD, etc */ 39 enum ir_type type; /* IR_TYPE_RC5, IR_TYPE_PD, etc */
40 /* 40 /*
41 * Specify either a function pointer or a value indicating one of 41 * Specify either a function pointer or a value indicating one of
42 * ir_kbd_i2c's internal get_key functions 42 * ir_kbd_i2c's internal get_key functions