aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/dm1105/Kconfig3
-rw-r--r--drivers/media/dvb/dm1105/dm1105.c44
-rw-r--r--drivers/media/dvb/dvb-core/dmxdev.c4
-rw-r--r--drivers/media/dvb/dvb-usb/Kconfig2
-rw-r--r--drivers/media/dvb/dvb-usb/a800.c6
-rw-r--r--drivers/media/dvb/dvb-usb/af9005-remote.c16
-rw-r--r--drivers/media/dvb/dvb-usb/af9005.c16
-rw-r--r--drivers/media/dvb/dvb-usb/af9005.h4
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.c22
-rw-r--r--drivers/media/dvb/dvb-usb/anysee.c4
-rw-r--r--drivers/media/dvb/dvb-usb/az6027.c13
-rw-r--r--drivers/media/dvb/dvb-usb/cinergyT2-core.c6
-rw-r--r--drivers/media/dvb/dvb-usb/cxusb.c62
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700.h2
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700_core.c18
-rw-r--r--drivers/media/dvb/dvb-usb/dib0700_devices.c146
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-common.c4
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-mb.c16
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb-mc.c4
-rw-r--r--drivers/media/dvb/dvb-usb/dibusb.h2
-rw-r--r--drivers/media/dvb/dvb-usb/digitv.c14
-rw-r--r--drivers/media/dvb/dvb-usb/dtt200u.c18
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-ids.h1
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-remote.c103
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb.h28
-rw-r--r--drivers/media/dvb/dvb-usb/dw2102.c54
-rw-r--r--drivers/media/dvb/dvb-usb/gp8psk.c28
-rw-r--r--drivers/media/dvb/dvb-usb/gp8psk.h8
-rw-r--r--drivers/media/dvb/dvb-usb/lmedm04.c329
-rw-r--r--drivers/media/dvb/dvb-usb/m920x.c24
-rw-r--r--drivers/media/dvb/dvb-usb/nova-t-usb2.c18
-rw-r--r--drivers/media/dvb/dvb-usb/opera1.c16
-rw-r--r--drivers/media/dvb/dvb-usb/ttusb2.c35
-rw-r--r--drivers/media/dvb/dvb-usb/vp702x.c12
-rw-r--r--drivers/media/dvb/dvb-usb/vp7045.c12
-rw-r--r--drivers/media/dvb/frontends/Kconfig10
-rw-r--r--drivers/media/dvb/frontends/Makefile2
-rw-r--r--drivers/media/dvb/frontends/af9013.c2
-rw-r--r--drivers/media/dvb/frontends/atbm8830.c8
-rw-r--r--drivers/media/dvb/frontends/au8522_decoder.c51
-rw-r--r--drivers/media/dvb/frontends/au8522_priv.h2
-rw-r--r--drivers/media/dvb/frontends/dib7000m.c10
-rw-r--r--drivers/media/dvb/frontends/dib7000p.c10
-rw-r--r--drivers/media/dvb/frontends/ix2505v.c2
-rw-r--r--drivers/media/dvb/frontends/lgs8gxx.c11
-rw-r--r--drivers/media/dvb/frontends/mb86a20s.c615
-rw-r--r--drivers/media/dvb/frontends/mb86a20s.h52
-rw-r--r--drivers/media/dvb/frontends/s921.c548
-rw-r--r--drivers/media/dvb/frontends/s921.h47
-rw-r--r--drivers/media/dvb/frontends/s921_core.c216
-rw-r--r--drivers/media/dvb/frontends/s921_core.h114
-rw-r--r--drivers/media/dvb/frontends/s921_module.c192
-rw-r--r--drivers/media/dvb/frontends/s921_module.h49
-rw-r--r--drivers/media/dvb/frontends/stb0899_drv.c2
-rw-r--r--drivers/media/dvb/frontends/stb6100.c198
-rw-r--r--drivers/media/dvb/frontends/stv090x.c6
-rw-r--r--drivers/media/dvb/mantis/Kconfig2
-rw-r--r--drivers/media/dvb/mantis/hopper_cards.c2
-rw-r--r--drivers/media/dvb/mantis/hopper_vp3028.c6
-rw-r--r--drivers/media/dvb/mantis/mantis_cards.c2
-rw-r--r--drivers/media/dvb/mantis/mantis_common.h4
-rw-r--r--drivers/media/dvb/mantis/mantis_dvb.c17
-rw-r--r--drivers/media/dvb/mantis/mantis_input.c76
-rw-r--r--drivers/media/dvb/mantis/mantis_ioc.c4
-rw-r--r--drivers/media/dvb/mantis/mantis_ioc.h2
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1033.c2
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1034.c10
-rw-r--r--drivers/media/dvb/mantis/mantis_vp1041.c6
-rw-r--r--drivers/media/dvb/mantis/mantis_vp2033.c4
-rw-r--r--drivers/media/dvb/mantis/mantis_vp2040.c4
-rw-r--r--drivers/media/dvb/mantis/mantis_vp3030.c8
-rw-r--r--drivers/media/dvb/ngene/ngene-core.c8
-rw-r--r--drivers/media/dvb/siano/Kconfig2
-rw-r--r--drivers/media/dvb/siano/smscoreapi.c2
-rw-r--r--drivers/media/dvb/siano/smsir.c52
-rw-r--r--drivers/media/dvb/siano/smsir.h5
-rw-r--r--drivers/media/dvb/siano/smsusb.c9
-rw-r--r--drivers/media/dvb/ttpci/Kconfig3
-rw-r--r--drivers/media/dvb/ttpci/av7110_v4l.c4
-rw-r--r--drivers/media/dvb/ttpci/budget-av.c6
-rw-r--r--drivers/media/dvb/ttpci/budget-ci.c54
81 files changed, 2199 insertions, 1336 deletions
diff --git a/drivers/media/dvb/dm1105/Kconfig b/drivers/media/dvb/dm1105/Kconfig
index a6ceb08f1183..f3de0a4d63f2 100644
--- a/drivers/media/dvb/dm1105/Kconfig
+++ b/drivers/media/dvb/dm1105/Kconfig
@@ -1,7 +1,6 @@
1config DVB_DM1105 1config DVB_DM1105
2 tristate "SDMC DM1105 based PCI cards" 2 tristate "SDMC DM1105 based PCI cards"
3 depends on DVB_CORE && PCI && I2C 3 depends on DVB_CORE && PCI && I2C
4 depends on INPUT
5 select DVB_PLL if !DVB_FE_CUSTOMISE 4 select DVB_PLL if !DVB_FE_CUSTOMISE
6 select DVB_STV0299 if !DVB_FE_CUSTOMISE 5 select DVB_STV0299 if !DVB_FE_CUSTOMISE
7 select DVB_STV0288 if !DVB_FE_CUSTOMISE 6 select DVB_STV0288 if !DVB_FE_CUSTOMISE
@@ -9,7 +8,7 @@ config DVB_DM1105
9 select DVB_CX24116 if !DVB_FE_CUSTOMISE 8 select DVB_CX24116 if !DVB_FE_CUSTOMISE
10 select DVB_SI21XX if !DVB_FE_CUSTOMISE 9 select DVB_SI21XX if !DVB_FE_CUSTOMISE
11 select DVB_DS3000 if !DVB_FE_CUSTOMISE 10 select DVB_DS3000 if !DVB_FE_CUSTOMISE
12 depends on VIDEO_IR 11 depends on RC_CORE
13 help 12 help
14 Support for cards based on the SDMC DM1105 PCI chip like 13 Support for cards based on the SDMC DM1105 PCI chip like
15 DvbWorld 2002 14 DvbWorld 2002
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c
index 5d404f1bf036..2d8b4044be36 100644
--- a/drivers/media/dvb/dm1105/dm1105.c
+++ b/drivers/media/dvb/dm1105/dm1105.c
@@ -26,9 +26,8 @@
26#include <linux/proc_fs.h> 26#include <linux/proc_fs.h>
27#include <linux/pci.h> 27#include <linux/pci.h>
28#include <linux/dma-mapping.h> 28#include <linux/dma-mapping.h>
29#include <linux/input.h>
30#include <linux/slab.h> 29#include <linux/slab.h>
31#include <media/ir-core.h> 30#include <media/rc-core.h>
32 31
33#include "demux.h" 32#include "demux.h"
34#include "dmxdev.h" 33#include "dmxdev.h"
@@ -266,7 +265,7 @@ static void dm1105_card_list(struct pci_dev *pci)
266 265
267/* infrared remote control */ 266/* infrared remote control */
268struct infrared { 267struct infrared {
269 struct input_dev *input_dev; 268 struct rc_dev *dev;
270 char input_phys[32]; 269 char input_phys[32];
271 struct work_struct work; 270 struct work_struct work;
272 u32 ir_command; 271 u32 ir_command;
@@ -532,7 +531,7 @@ static void dm1105_emit_key(struct work_struct *work)
532 531
533 data = (ircom >> 8) & 0x7f; 532 data = (ircom >> 8) & 0x7f;
534 533
535 ir_keydown(ir->input_dev, data, 0); 534 rc_keydown(ir->dev, data, 0);
536} 535}
537 536
538/* work handler */ 537/* work handler */
@@ -593,46 +592,47 @@ static irqreturn_t dm1105_irq(int irq, void *dev_id)
593 592
594int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) 593int __devinit dm1105_ir_init(struct dm1105_dev *dm1105)
595{ 594{
596 struct input_dev *input_dev; 595 struct rc_dev *dev;
597 char *ir_codes = RC_MAP_DM1105_NEC;
598 int err = -ENOMEM; 596 int err = -ENOMEM;
599 597
600 input_dev = input_allocate_device(); 598 dev = rc_allocate_device();
601 if (!input_dev) 599 if (!dev)
602 return -ENOMEM; 600 return -ENOMEM;
603 601
604 dm1105->ir.input_dev = input_dev;
605 snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), 602 snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys),
606 "pci-%s/ir0", pci_name(dm1105->pdev)); 603 "pci-%s/ir0", pci_name(dm1105->pdev));
607 604
608 input_dev->name = "DVB on-card IR receiver"; 605 dev->driver_name = MODULE_NAME;
609 input_dev->phys = dm1105->ir.input_phys; 606 dev->map_name = RC_MAP_DM1105_NEC;
610 input_dev->id.bustype = BUS_PCI; 607 dev->driver_type = RC_DRIVER_SCANCODE;
611 input_dev->id.version = 1; 608 dev->input_name = "DVB on-card IR receiver";
609 dev->input_phys = dm1105->ir.input_phys;
610 dev->input_id.bustype = BUS_PCI;
611 dev->input_id.version = 1;
612 if (dm1105->pdev->subsystem_vendor) { 612 if (dm1105->pdev->subsystem_vendor) {
613 input_dev->id.vendor = dm1105->pdev->subsystem_vendor; 613 dev->input_id.vendor = dm1105->pdev->subsystem_vendor;
614 input_dev->id.product = dm1105->pdev->subsystem_device; 614 dev->input_id.product = dm1105->pdev->subsystem_device;
615 } else { 615 } else {
616 input_dev->id.vendor = dm1105->pdev->vendor; 616 dev->input_id.vendor = dm1105->pdev->vendor;
617 input_dev->id.product = dm1105->pdev->device; 617 dev->input_id.product = dm1105->pdev->device;
618 } 618 }
619 619 dev->dev.parent = &dm1105->pdev->dev;
620 input_dev->dev.parent = &dm1105->pdev->dev;
621 620
622 INIT_WORK(&dm1105->ir.work, dm1105_emit_key); 621 INIT_WORK(&dm1105->ir.work, dm1105_emit_key);
623 622
624 err = ir_input_register(input_dev, ir_codes, NULL, MODULE_NAME); 623 err = rc_register_device(dev);
625 if (err < 0) { 624 if (err < 0) {
626 input_free_device(input_dev); 625 rc_free_device(dev);
627 return err; 626 return err;
628 } 627 }
629 628
629 dm1105->ir.dev = dev;
630 return 0; 630 return 0;
631} 631}
632 632
633void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105) 633void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105)
634{ 634{
635 ir_input_unregister(dm1105->ir.input_dev); 635 rc_unregister_device(dm1105->ir.dev);
636} 636}
637 637
638static int __devinit dm1105_hw_init(struct dm1105_dev *dev) 638static int __devinit dm1105_hw_init(struct dm1105_dev *dev)
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
index ad1f61d301e1..e4b5c03ae516 100644
--- a/drivers/media/dvb/dvb-core/dmxdev.c
+++ b/drivers/media/dvb/dvb-core/dmxdev.c
@@ -572,13 +572,13 @@ static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
572 dmx_output_t otype; 572 dmx_output_t otype;
573 int ret; 573 int ret;
574 int ts_type; 574 int ts_type;
575 enum dmx_ts_pes ts_pes; 575 dmx_pes_type_t ts_pes;
576 struct dmx_ts_feed *tsfeed; 576 struct dmx_ts_feed *tsfeed;
577 577
578 feed->ts = NULL; 578 feed->ts = NULL;
579 otype = para->output; 579 otype = para->output;
580 580
581 ts_pes = (enum dmx_ts_pes)para->pes_type; 581 ts_pes = para->pes_type;
582 582
583 if (ts_pes < DMX_PES_OTHER) 583 if (ts_pes < DMX_PES_OTHER)
584 ts_type = TS_DECODER; 584 ts_type = TS_DECODER;
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index 2525d3b3c88d..3d48ba019342 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -1,6 +1,6 @@
1config DVB_USB 1config DVB_USB
2 tristate "Support for various USB DVB devices" 2 tristate "Support for various USB DVB devices"
3 depends on DVB_CORE && USB && I2C && IR_CORE 3 depends on DVB_CORE && USB && I2C && RC_CORE
4 help 4 help
5 By enabling this you will be able to choose the various supported 5 By enabling this you will be able to choose the various supported
6 USB1.1 and USB2.0 DVB devices. 6 USB1.1 and USB2.0 DVB devices.
diff --git a/drivers/media/dvb/dvb-usb/a800.c b/drivers/media/dvb/dvb-usb/a800.c
index a5c363727133..53b93a4b6f8a 100644
--- a/drivers/media/dvb/dvb-usb/a800.c
+++ b/drivers/media/dvb/dvb-usb/a800.c
@@ -37,7 +37,7 @@ static int a800_identify_state(struct usb_device *udev, struct dvb_usb_device_pr
37 return 0; 37 return 0;
38} 38}
39 39
40static struct ir_scancode ir_codes_a800_table[] = { 40static struct rc_map_table rc_map_a800_table[] = {
41 { 0x0201, KEY_PROG1 }, /* SOURCE */ 41 { 0x0201, KEY_PROG1 }, /* SOURCE */
42 { 0x0200, KEY_POWER }, /* POWER */ 42 { 0x0200, KEY_POWER }, /* POWER */
43 { 0x0205, KEY_1 }, /* 1 */ 43 { 0x0205, KEY_1 }, /* 1 */
@@ -148,8 +148,8 @@ static struct dvb_usb_device_properties a800_properties = {
148 148
149 .rc.legacy = { 149 .rc.legacy = {
150 .rc_interval = DEFAULT_RC_INTERVAL, 150 .rc_interval = DEFAULT_RC_INTERVAL,
151 .rc_key_map = ir_codes_a800_table, 151 .rc_map_table = rc_map_a800_table,
152 .rc_key_map_size = ARRAY_SIZE(ir_codes_a800_table), 152 .rc_map_size = ARRAY_SIZE(rc_map_a800_table),
153 .rc_query = a800_rc_query, 153 .rc_query = a800_rc_query,
154 }, 154 },
155 155
diff --git a/drivers/media/dvb/dvb-usb/af9005-remote.c b/drivers/media/dvb/dvb-usb/af9005-remote.c
index 696207fe37ec..c3bc64ed405c 100644
--- a/drivers/media/dvb/dvb-usb/af9005-remote.c
+++ b/drivers/media/dvb/dvb-usb/af9005-remote.c
@@ -33,7 +33,7 @@ MODULE_PARM_DESC(debug,
33 33
34#define deb_decode(args...) dprintk(dvb_usb_af9005_remote_debug,0x01,args) 34#define deb_decode(args...) dprintk(dvb_usb_af9005_remote_debug,0x01,args)
35 35
36struct ir_scancode ir_codes_af9005_table[] = { 36struct rc_map_table rc_map_af9005_table[] = {
37 37
38 {0x01b7, KEY_POWER}, 38 {0x01b7, KEY_POWER},
39 {0x01a7, KEY_VOLUMEUP}, 39 {0x01a7, KEY_VOLUMEUP},
@@ -74,7 +74,7 @@ struct ir_scancode ir_codes_af9005_table[] = {
74 {0x00d5, KEY_GOTO}, /* marked jump on the remote */ 74 {0x00d5, KEY_GOTO}, /* marked jump on the remote */
75}; 75};
76 76
77int ir_codes_af9005_table_size = ARRAY_SIZE(ir_codes_af9005_table); 77int rc_map_af9005_table_size = ARRAY_SIZE(rc_map_af9005_table);
78 78
79static int repeatable_keys[] = { 79static int repeatable_keys[] = {
80 KEY_VOLUMEUP, 80 KEY_VOLUMEUP,
@@ -130,10 +130,10 @@ int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len, u32 * event,
130 deb_decode("code != inverted code\n"); 130 deb_decode("code != inverted code\n");
131 return 0; 131 return 0;
132 } 132 }
133 for (i = 0; i < ir_codes_af9005_table_size; i++) { 133 for (i = 0; i < rc_map_af9005_table_size; i++) {
134 if (rc5_custom(&ir_codes_af9005_table[i]) == cust 134 if (rc5_custom(&rc_map_af9005_table[i]) == cust
135 && rc5_data(&ir_codes_af9005_table[i]) == dat) { 135 && rc5_data(&rc_map_af9005_table[i]) == dat) {
136 *event = ir_codes_af9005_table[i].keycode; 136 *event = rc_map_af9005_table[i].keycode;
137 *state = REMOTE_KEY_PRESSED; 137 *state = REMOTE_KEY_PRESSED;
138 deb_decode 138 deb_decode
139 ("key pressed, event %x\n", *event); 139 ("key pressed, event %x\n", *event);
@@ -146,8 +146,8 @@ int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len, u32 * event,
146 return 0; 146 return 0;
147} 147}
148 148
149EXPORT_SYMBOL(ir_codes_af9005_table); 149EXPORT_SYMBOL(rc_map_af9005_table);
150EXPORT_SYMBOL(ir_codes_af9005_table_size); 150EXPORT_SYMBOL(rc_map_af9005_table_size);
151EXPORT_SYMBOL(af9005_rc_decode); 151EXPORT_SYMBOL(af9005_rc_decode);
152 152
153MODULE_AUTHOR("Luca Olivetti <luca@ventoso.org>"); 153MODULE_AUTHOR("Luca Olivetti <luca@ventoso.org>");
diff --git a/drivers/media/dvb/dvb-usb/af9005.c b/drivers/media/dvb/dvb-usb/af9005.c
index 8ecba8848bcf..51f6439dcfd5 100644
--- a/drivers/media/dvb/dvb-usb/af9005.c
+++ b/drivers/media/dvb/dvb-usb/af9005.c
@@ -1027,8 +1027,8 @@ static struct dvb_usb_device_properties af9005_properties = {
1027 1027
1028 .rc.legacy = { 1028 .rc.legacy = {
1029 .rc_interval = 200, 1029 .rc_interval = 200,
1030 .rc_key_map = NULL, 1030 .rc_map_table = NULL,
1031 .rc_key_map_size = 0, 1031 .rc_map_size = 0,
1032 .rc_query = af9005_rc_query, 1032 .rc_query = af9005_rc_query,
1033 }, 1033 },
1034 1034
@@ -1070,14 +1070,14 @@ static int __init af9005_usb_module_init(void)
1070 return result; 1070 return result;
1071 } 1071 }
1072 rc_decode = symbol_request(af9005_rc_decode); 1072 rc_decode = symbol_request(af9005_rc_decode);
1073 rc_keys = symbol_request(ir_codes_af9005_table); 1073 rc_keys = symbol_request(rc_map_af9005_table);
1074 rc_keys_size = symbol_request(ir_codes_af9005_table_size); 1074 rc_keys_size = symbol_request(rc_map_af9005_table_size);
1075 if (rc_decode == NULL || rc_keys == NULL || rc_keys_size == NULL) { 1075 if (rc_decode == NULL || rc_keys == NULL || rc_keys_size == NULL) {
1076 err("af9005_rc_decode function not found, disabling remote"); 1076 err("af9005_rc_decode function not found, disabling remote");
1077 af9005_properties.rc.legacy.rc_query = NULL; 1077 af9005_properties.rc.legacy.rc_query = NULL;
1078 } else { 1078 } else {
1079 af9005_properties.rc.legacy.rc_key_map = rc_keys; 1079 af9005_properties.rc.legacy.rc_map_table = rc_keys;
1080 af9005_properties.rc.legacy.rc_key_map_size = *rc_keys_size; 1080 af9005_properties.rc.legacy.rc_map_size = *rc_keys_size;
1081 } 1081 }
1082 1082
1083 return 0; 1083 return 0;
@@ -1089,9 +1089,9 @@ static void __exit af9005_usb_module_exit(void)
1089 if (rc_decode != NULL) 1089 if (rc_decode != NULL)
1090 symbol_put(af9005_rc_decode); 1090 symbol_put(af9005_rc_decode);
1091 if (rc_keys != NULL) 1091 if (rc_keys != NULL)
1092 symbol_put(ir_codes_af9005_table); 1092 symbol_put(rc_map_af9005_table);
1093 if (rc_keys_size != NULL) 1093 if (rc_keys_size != NULL)
1094 symbol_put(ir_codes_af9005_table_size); 1094 symbol_put(rc_map_af9005_table_size);
1095 /* deregister this driver from the USB subsystem */ 1095 /* deregister this driver from the USB subsystem */
1096 usb_deregister(&af9005_usb_driver); 1096 usb_deregister(&af9005_usb_driver);
1097} 1097}
diff --git a/drivers/media/dvb/dvb-usb/af9005.h b/drivers/media/dvb/dvb-usb/af9005.h
index 3c1fbd1c5d60..c71c77bd7f4b 100644
--- a/drivers/media/dvb/dvb-usb/af9005.h
+++ b/drivers/media/dvb/dvb-usb/af9005.h
@@ -3490,7 +3490,7 @@ extern u8 regmask[8];
3490/* remote control decoder */ 3490/* remote control decoder */
3491extern int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len, 3491extern int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len,
3492 u32 * event, int *state); 3492 u32 * event, int *state);
3493extern struct ir_scancode ir_codes_af9005_table[]; 3493extern struct rc_map_table rc_map_af9005_table[];
3494extern int ir_codes_af9005_table_size; 3494extern int rc_map_af9005_table_size;
3495 3495
3496#endif 3496#endif
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index 31c0a0ed39f5..8671ca362c81 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -1041,13 +1041,13 @@ static int af9015_rc_query(struct dvb_usb_device *d)
1041 priv->rc_keycode = buf[12] << 16 | 1041 priv->rc_keycode = buf[12] << 16 |
1042 buf[13] << 8 | buf[14]; 1042 buf[13] << 8 | buf[14];
1043 } 1043 }
1044 ir_keydown(d->rc_input_dev, priv->rc_keycode, 0); 1044 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1045 } else { 1045 } else {
1046 priv->rc_keycode = 0; /* clear just for sure */ 1046 priv->rc_keycode = 0; /* clear just for sure */
1047 } 1047 }
1048 } else if (priv->rc_repeat != buf[6] || buf[0]) { 1048 } else if (priv->rc_repeat != buf[6] || buf[0]) {
1049 deb_rc("%s: key repeated\n", __func__); 1049 deb_rc("%s: key repeated\n", __func__);
1050 ir_keydown(d->rc_input_dev, priv->rc_keycode, 0); 1050 rc_keydown(d->rc_dev, priv->rc_keycode, 0);
1051 } else { 1051 } else {
1052 deb_rc("%s: no key press\n", __func__); 1052 deb_rc("%s: no key press\n", __func__);
1053 } 1053 }
@@ -1344,13 +1344,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1344 .identify_state = af9015_identify_state, 1344 .identify_state = af9015_identify_state,
1345 1345
1346 .rc.core = { 1346 .rc.core = {
1347 .protocol = IR_TYPE_NEC, 1347 .protocol = RC_TYPE_NEC,
1348 .module_name = "af9015", 1348 .module_name = "af9015",
1349 .rc_query = af9015_rc_query, 1349 .rc_query = af9015_rc_query,
1350 .rc_interval = AF9015_RC_INTERVAL, 1350 .rc_interval = AF9015_RC_INTERVAL,
1351 .rc_props = { 1351 .allowed_protos = RC_TYPE_NEC,
1352 .allowed_protos = IR_TYPE_NEC,
1353 },
1354 }, 1352 },
1355 1353
1356 .i2c_algo = &af9015_i2c_algo, 1354 .i2c_algo = &af9015_i2c_algo,
@@ -1474,13 +1472,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1474 .identify_state = af9015_identify_state, 1472 .identify_state = af9015_identify_state,
1475 1473
1476 .rc.core = { 1474 .rc.core = {
1477 .protocol = IR_TYPE_NEC, 1475 .protocol = RC_TYPE_NEC,
1478 .module_name = "af9015", 1476 .module_name = "af9015",
1479 .rc_query = af9015_rc_query, 1477 .rc_query = af9015_rc_query,
1480 .rc_interval = AF9015_RC_INTERVAL, 1478 .rc_interval = AF9015_RC_INTERVAL,
1481 .rc_props = { 1479 .allowed_protos = RC_TYPE_NEC,
1482 .allowed_protos = IR_TYPE_NEC,
1483 },
1484 }, 1480 },
1485 1481
1486 .i2c_algo = &af9015_i2c_algo, 1482 .i2c_algo = &af9015_i2c_algo,
@@ -1588,13 +1584,11 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1588 .identify_state = af9015_identify_state, 1584 .identify_state = af9015_identify_state,
1589 1585
1590 .rc.core = { 1586 .rc.core = {
1591 .protocol = IR_TYPE_NEC, 1587 .protocol = RC_TYPE_NEC,
1592 .module_name = "af9015", 1588 .module_name = "af9015",
1593 .rc_query = af9015_rc_query, 1589 .rc_query = af9015_rc_query,
1594 .rc_interval = AF9015_RC_INTERVAL, 1590 .rc_interval = AF9015_RC_INTERVAL,
1595 .rc_props = { 1591 .allowed_protos = RC_TYPE_NEC,
1596 .allowed_protos = IR_TYPE_NEC,
1597 },
1598 }, 1592 },
1599 1593
1600 .i2c_algo = &af9015_i2c_algo, 1594 .i2c_algo = &af9015_i2c_algo,
diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c
index 1759d26bca42..6b402e943539 100644
--- a/drivers/media/dvb/dvb-usb/anysee.c
+++ b/drivers/media/dvb/dvb-usb/anysee.c
@@ -394,7 +394,7 @@ static int anysee_rc_query(struct dvb_usb_device *d)
394 394
395 if (ircode[0]) { 395 if (ircode[0]) {
396 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]); 396 deb_rc("%s: key pressed %02x\n", __func__, ircode[1]);
397 ir_keydown(d->rc_input_dev, 0x08 << 8 | ircode[1], 0); 397 rc_keydown(d->rc_dev, 0x08 << 8 | ircode[1], 0);
398 } 398 }
399 399
400 return 0; 400 return 0;
@@ -476,7 +476,7 @@ static struct dvb_usb_device_properties anysee_properties = {
476 476
477 .rc.core = { 477 .rc.core = {
478 .rc_codes = RC_MAP_ANYSEE, 478 .rc_codes = RC_MAP_ANYSEE,
479 .protocol = IR_TYPE_OTHER, 479 .protocol = RC_TYPE_OTHER,
480 .module_name = "anysee", 480 .module_name = "anysee",
481 .rc_query = anysee_rc_query, 481 .rc_query = anysee_rc_query,
482 .rc_interval = 250, /* windows driver uses 500ms */ 482 .rc_interval = 250, /* windows driver uses 500ms */
diff --git a/drivers/media/dvb/dvb-usb/az6027.c b/drivers/media/dvb/dvb-usb/az6027.c
index 62c58288469f..57e2444d51ab 100644
--- a/drivers/media/dvb/dvb-usb/az6027.c
+++ b/drivers/media/dvb/dvb-usb/az6027.c
@@ -386,7 +386,7 @@ static int az6027_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
386} 386}
387 387
388/* keys for the enclosed remote control */ 388/* keys for the enclosed remote control */
389static struct ir_scancode ir_codes_az6027_table[] = { 389static struct rc_map_table rc_map_az6027_table[] = {
390 { 0x01, KEY_1 }, 390 { 0x01, KEY_1 },
391 { 0x02, KEY_2 }, 391 { 0x02, KEY_2 },
392}; 392};
@@ -1089,6 +1089,7 @@ static struct usb_device_id az6027_usb_table[] = {
1089 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_DVBS2CI_V2) }, 1089 { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_DVBS2CI_V2) },
1090 { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_USB2_HDCI_V1) }, 1090 { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_USB2_HDCI_V1) },
1091 { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_USB2_HDCI_V2) }, 1091 { USB_DEVICE(USB_VID_TECHNISAT, USB_PID_TECHNISAT_USB2_HDCI_V2) },
1092 { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_SAT) },
1092 { }, 1093 { },
1093}; 1094};
1094 1095
@@ -1126,15 +1127,15 @@ static struct dvb_usb_device_properties az6027_properties = {
1126 .read_mac_address = az6027_read_mac_addr, 1127 .read_mac_address = az6027_read_mac_addr,
1127 */ 1128 */
1128 .rc.legacy = { 1129 .rc.legacy = {
1129 .rc_key_map = ir_codes_az6027_table, 1130 .rc_map_table = rc_map_az6027_table,
1130 .rc_key_map_size = ARRAY_SIZE(ir_codes_az6027_table), 1131 .rc_map_size = ARRAY_SIZE(rc_map_az6027_table),
1131 .rc_interval = 400, 1132 .rc_interval = 400,
1132 .rc_query = az6027_rc_query, 1133 .rc_query = az6027_rc_query,
1133 }, 1134 },
1134 1135
1135 .i2c_algo = &az6027_i2c_algo, 1136 .i2c_algo = &az6027_i2c_algo,
1136 1137
1137 .num_device_descs = 5, 1138 .num_device_descs = 6,
1138 .devices = { 1139 .devices = {
1139 { 1140 {
1140 .name = "AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)", 1141 .name = "AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)",
@@ -1156,6 +1157,10 @@ static struct dvb_usb_device_properties az6027_properties = {
1156 .name = "Technisat SkyStar USB 2 HD CI", 1157 .name = "Technisat SkyStar USB 2 HD CI",
1157 .cold_ids = { &az6027_usb_table[4], NULL }, 1158 .cold_ids = { &az6027_usb_table[4], NULL },
1158 .warm_ids = { NULL }, 1159 .warm_ids = { NULL },
1160 }, {
1161 .name = "Elgato EyeTV Sat",
1162 .cold_ids = { &az6027_usb_table[5], NULL },
1163 .warm_ids = { NULL },
1159 }, 1164 },
1160 { NULL }, 1165 { NULL },
1161 } 1166 }
diff --git a/drivers/media/dvb/dvb-usb/cinergyT2-core.c b/drivers/media/dvb/dvb-usb/cinergyT2-core.c
index 4f5aa83fc1fc..16f2ce2bc15a 100644
--- a/drivers/media/dvb/dvb-usb/cinergyT2-core.c
+++ b/drivers/media/dvb/dvb-usb/cinergyT2-core.c
@@ -84,7 +84,7 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
84 return 0; 84 return 0;
85} 85}
86 86
87static struct ir_scancode ir_codes_cinergyt2_table[] = { 87static struct rc_map_table rc_map_cinergyt2_table[] = {
88 { 0x0401, KEY_POWER }, 88 { 0x0401, KEY_POWER },
89 { 0x0402, KEY_1 }, 89 { 0x0402, KEY_1 },
90 { 0x0403, KEY_2 }, 90 { 0x0403, KEY_2 },
@@ -219,8 +219,8 @@ static struct dvb_usb_device_properties cinergyt2_properties = {
219 219
220 .rc.legacy = { 220 .rc.legacy = {
221 .rc_interval = 50, 221 .rc_interval = 50,
222 .rc_key_map = ir_codes_cinergyt2_table, 222 .rc_map_table = rc_map_cinergyt2_table,
223 .rc_key_map_size = ARRAY_SIZE(ir_codes_cinergyt2_table), 223 .rc_map_size = ARRAY_SIZE(rc_map_cinergyt2_table),
224 .rc_query = cinergyt2_rc_query, 224 .rc_query = cinergyt2_rc_query,
225 }, 225 },
226 226
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
index cd9f362c37b2..acb5fb2d2e73 100644
--- a/drivers/media/dvb/dvb-usb/cxusb.c
+++ b/drivers/media/dvb/dvb-usb/cxusb.c
@@ -385,7 +385,7 @@ static int cxusb_d680_dmb_streaming_ctrl(
385 385
386static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state) 386static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
387{ 387{
388 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 388 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
389 u8 ircode[4]; 389 u8 ircode[4];
390 int i; 390 int i;
391 391
@@ -394,7 +394,7 @@ static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
394 *event = 0; 394 *event = 0;
395 *state = REMOTE_NO_KEY_PRESSED; 395 *state = REMOTE_NO_KEY_PRESSED;
396 396
397 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) { 397 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
398 if (rc5_custom(&keymap[i]) == ircode[2] && 398 if (rc5_custom(&keymap[i]) == ircode[2] &&
399 rc5_data(&keymap[i]) == ircode[3]) { 399 rc5_data(&keymap[i]) == ircode[3]) {
400 *event = keymap[i].keycode; 400 *event = keymap[i].keycode;
@@ -410,7 +410,7 @@ static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
410static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d, u32 *event, 410static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d, u32 *event,
411 int *state) 411 int *state)
412{ 412{
413 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 413 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
414 u8 ircode[4]; 414 u8 ircode[4];
415 int i; 415 int i;
416 struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD, 416 struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
@@ -422,7 +422,7 @@ static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d, u32 *event,
422 if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1) 422 if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1)
423 return 0; 423 return 0;
424 424
425 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) { 425 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
426 if (rc5_custom(&keymap[i]) == ircode[1] && 426 if (rc5_custom(&keymap[i]) == ircode[1] &&
427 rc5_data(&keymap[i]) == ircode[2]) { 427 rc5_data(&keymap[i]) == ircode[2]) {
428 *event = keymap[i].keycode; 428 *event = keymap[i].keycode;
@@ -438,7 +438,7 @@ static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d, u32 *event,
438static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d, u32 *event, 438static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d, u32 *event,
439 int *state) 439 int *state)
440{ 440{
441 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 441 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
442 u8 ircode[2]; 442 u8 ircode[2];
443 int i; 443 int i;
444 444
@@ -448,7 +448,7 @@ static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d, u32 *event,
448 if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0) 448 if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0)
449 return 0; 449 return 0;
450 450
451 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) { 451 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
452 if (rc5_custom(&keymap[i]) == ircode[0] && 452 if (rc5_custom(&keymap[i]) == ircode[0] &&
453 rc5_data(&keymap[i]) == ircode[1]) { 453 rc5_data(&keymap[i]) == ircode[1]) {
454 *event = keymap[i].keycode; 454 *event = keymap[i].keycode;
@@ -461,7 +461,7 @@ static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d, u32 *event,
461 return 0; 461 return 0;
462} 462}
463 463
464static struct ir_scancode ir_codes_dvico_mce_table[] = { 464static struct rc_map_table rc_map_dvico_mce_table[] = {
465 { 0xfe02, KEY_TV }, 465 { 0xfe02, KEY_TV },
466 { 0xfe0e, KEY_MP3 }, 466 { 0xfe0e, KEY_MP3 },
467 { 0xfe1a, KEY_DVD }, 467 { 0xfe1a, KEY_DVD },
@@ -509,7 +509,7 @@ static struct ir_scancode ir_codes_dvico_mce_table[] = {
509 { 0xfe4e, KEY_POWER }, 509 { 0xfe4e, KEY_POWER },
510}; 510};
511 511
512static struct ir_scancode ir_codes_dvico_portable_table[] = { 512static struct rc_map_table rc_map_dvico_portable_table[] = {
513 { 0xfc02, KEY_SETUP }, /* Profile */ 513 { 0xfc02, KEY_SETUP }, /* Profile */
514 { 0xfc43, KEY_POWER2 }, 514 { 0xfc43, KEY_POWER2 },
515 { 0xfc06, KEY_EPG }, 515 { 0xfc06, KEY_EPG },
@@ -548,7 +548,7 @@ static struct ir_scancode ir_codes_dvico_portable_table[] = {
548 { 0xfc00, KEY_UNKNOWN }, /* HD */ 548 { 0xfc00, KEY_UNKNOWN }, /* HD */
549}; 549};
550 550
551static struct ir_scancode ir_codes_d680_dmb_table[] = { 551static struct rc_map_table rc_map_d680_dmb_table[] = {
552 { 0x0038, KEY_UNKNOWN }, /* TV/AV */ 552 { 0x0038, KEY_UNKNOWN }, /* TV/AV */
553 { 0x080c, KEY_ZOOM }, 553 { 0x080c, KEY_ZOOM },
554 { 0x0800, KEY_0 }, 554 { 0x0800, KEY_0 },
@@ -923,7 +923,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
923 return -EIO; 923 return -EIO;
924 924
925 /* try to determine if there is no IR decoder on the I2C bus */ 925 /* try to determine if there is no IR decoder on the I2C bus */
926 for (i = 0; adap->dev->props.rc.legacy.rc_key_map != NULL && i < 5; i++) { 926 for (i = 0; adap->dev->props.rc.legacy.rc_map_table != NULL && i < 5; i++) {
927 msleep(20); 927 msleep(20);
928 if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1) 928 if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1)
929 goto no_IR; 929 goto no_IR;
@@ -931,7 +931,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
931 continue; 931 continue;
932 if (ircode[2] + ircode[3] != 0xff) { 932 if (ircode[2] + ircode[3] != 0xff) {
933no_IR: 933no_IR:
934 adap->dev->props.rc.legacy.rc_key_map = NULL; 934 adap->dev->props.rc.legacy.rc_map_table = NULL;
935 info("No IR receiver detected on this device."); 935 info("No IR receiver detected on this device.");
936 break; 936 break;
937 } 937 }
@@ -1453,8 +1453,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
1453 1453
1454 .rc.legacy = { 1454 .rc.legacy = {
1455 .rc_interval = 100, 1455 .rc_interval = 100,
1456 .rc_key_map = ir_codes_dvico_portable_table, 1456 .rc_map_table = rc_map_dvico_portable_table,
1457 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_portable_table), 1457 .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1458 .rc_query = cxusb_rc_query, 1458 .rc_query = cxusb_rc_query,
1459 }, 1459 },
1460 1460
@@ -1506,8 +1506,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
1506 1506
1507 .rc.legacy = { 1507 .rc.legacy = {
1508 .rc_interval = 150, 1508 .rc_interval = 150,
1509 .rc_key_map = ir_codes_dvico_mce_table, 1509 .rc_map_table = rc_map_dvico_mce_table,
1510 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_mce_table), 1510 .rc_map_size = ARRAY_SIZE(rc_map_dvico_mce_table),
1511 .rc_query = cxusb_rc_query, 1511 .rc_query = cxusb_rc_query,
1512 }, 1512 },
1513 1513
@@ -1567,8 +1567,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
1567 1567
1568 .rc.legacy = { 1568 .rc.legacy = {
1569 .rc_interval = 100, 1569 .rc_interval = 100,
1570 .rc_key_map = ir_codes_dvico_portable_table, 1570 .rc_map_table = rc_map_dvico_portable_table,
1571 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_portable_table), 1571 .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1572 .rc_query = cxusb_rc_query, 1572 .rc_query = cxusb_rc_query,
1573 }, 1573 },
1574 1574
@@ -1619,8 +1619,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
1619 1619
1620 .rc.legacy = { 1620 .rc.legacy = {
1621 .rc_interval = 100, 1621 .rc_interval = 100,
1622 .rc_key_map = ir_codes_dvico_portable_table, 1622 .rc_map_table = rc_map_dvico_portable_table,
1623 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_portable_table), 1623 .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1624 .rc_query = cxusb_rc_query, 1624 .rc_query = cxusb_rc_query,
1625 }, 1625 },
1626 1626
@@ -1670,8 +1670,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1670 1670
1671 .rc.legacy = { 1671 .rc.legacy = {
1672 .rc_interval = 100, 1672 .rc_interval = 100,
1673 .rc_key_map = ir_codes_dvico_mce_table, 1673 .rc_map_table = rc_map_dvico_mce_table,
1674 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_mce_table), 1674 .rc_map_size = ARRAY_SIZE(rc_map_dvico_mce_table),
1675 .rc_query = cxusb_bluebird2_rc_query, 1675 .rc_query = cxusb_bluebird2_rc_query,
1676 }, 1676 },
1677 1677
@@ -1720,8 +1720,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1720 1720
1721 .rc.legacy = { 1721 .rc.legacy = {
1722 .rc_interval = 100, 1722 .rc_interval = 100,
1723 .rc_key_map = ir_codes_dvico_portable_table, 1723 .rc_map_table = rc_map_dvico_portable_table,
1724 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_portable_table), 1724 .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1725 .rc_query = cxusb_bluebird2_rc_query, 1725 .rc_query = cxusb_bluebird2_rc_query,
1726 }, 1726 },
1727 1727
@@ -1772,8 +1772,8 @@ static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_prope
1772 1772
1773 .rc.legacy = { 1773 .rc.legacy = {
1774 .rc_interval = 100, 1774 .rc_interval = 100,
1775 .rc_key_map = ir_codes_dvico_portable_table, 1775 .rc_map_table = rc_map_dvico_portable_table,
1776 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_portable_table), 1776 .rc_map_size = ARRAY_SIZE(rc_map_dvico_portable_table),
1777 .rc_query = cxusb_rc_query, 1777 .rc_query = cxusb_rc_query,
1778 }, 1778 },
1779 1779
@@ -1865,8 +1865,8 @@ struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
1865 1865
1866 .rc.legacy = { 1866 .rc.legacy = {
1867 .rc_interval = 100, 1867 .rc_interval = 100,
1868 .rc_key_map = ir_codes_dvico_mce_table, 1868 .rc_map_table = rc_map_dvico_mce_table,
1869 .rc_key_map_size = ARRAY_SIZE(ir_codes_dvico_mce_table), 1869 .rc_map_size = ARRAY_SIZE(rc_map_dvico_mce_table),
1870 .rc_query = cxusb_rc_query, 1870 .rc_query = cxusb_rc_query,
1871 }, 1871 },
1872 1872
@@ -1915,8 +1915,8 @@ static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
1915 1915
1916 .rc.legacy = { 1916 .rc.legacy = {
1917 .rc_interval = 100, 1917 .rc_interval = 100,
1918 .rc_key_map = ir_codes_d680_dmb_table, 1918 .rc_map_table = rc_map_d680_dmb_table,
1919 .rc_key_map_size = ARRAY_SIZE(ir_codes_d680_dmb_table), 1919 .rc_map_size = ARRAY_SIZE(rc_map_d680_dmb_table),
1920 .rc_query = cxusb_d680_dmb_rc_query, 1920 .rc_query = cxusb_d680_dmb_rc_query,
1921 }, 1921 },
1922 1922
@@ -1966,8 +1966,8 @@ static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
1966 1966
1967 .rc.legacy = { 1967 .rc.legacy = {
1968 .rc_interval = 100, 1968 .rc_interval = 100,
1969 .rc_key_map = ir_codes_d680_dmb_table, 1969 .rc_map_table = rc_map_d680_dmb_table,
1970 .rc_key_map_size = ARRAY_SIZE(ir_codes_d680_dmb_table), 1970 .rc_map_size = ARRAY_SIZE(rc_map_d680_dmb_table),
1971 .rc_query = cxusb_d680_dmb_rc_query, 1971 .rc_query = cxusb_d680_dmb_rc_query,
1972 }, 1972 },
1973 1973
diff --git a/drivers/media/dvb/dvb-usb/dib0700.h b/drivers/media/dvb/dvb-usb/dib0700.h
index c2c9d236ec7e..3537d65c04bc 100644
--- a/drivers/media/dvb/dvb-usb/dib0700.h
+++ b/drivers/media/dvb/dvb-usb/dib0700.h
@@ -60,7 +60,7 @@ extern int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff);
60extern struct i2c_algorithm dib0700_i2c_algo; 60extern struct i2c_algorithm dib0700_i2c_algo;
61extern int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props, 61extern int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
62 struct dvb_usb_device_description **desc, int *cold); 62 struct dvb_usb_device_description **desc, int *cold);
63extern int dib0700_change_protocol(void *priv, u64 ir_type); 63extern int dib0700_change_protocol(struct rc_dev *dev, u64 rc_type);
64 64
65extern int dib0700_device_count; 65extern int dib0700_device_count;
66extern int dvb_usb_dib0700_ir_proto; 66extern int dvb_usb_dib0700_ir_proto;
diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c
index 48397f103d32..8ca48f76dfa9 100644
--- a/drivers/media/dvb/dvb-usb/dib0700_core.c
+++ b/drivers/media/dvb/dvb-usb/dib0700_core.c
@@ -471,19 +471,19 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
471 return dib0700_ctrl_wr(adap->dev, b, 4); 471 return dib0700_ctrl_wr(adap->dev, b, 4);
472} 472}
473 473
474int dib0700_change_protocol(void *priv, u64 ir_type) 474int dib0700_change_protocol(struct rc_dev *rc, u64 rc_type)
475{ 475{
476 struct dvb_usb_device *d = priv; 476 struct dvb_usb_device *d = rc->priv;
477 struct dib0700_state *st = d->priv; 477 struct dib0700_state *st = d->priv;
478 u8 rc_setup[3] = { REQUEST_SET_RC, 0, 0 }; 478 u8 rc_setup[3] = { REQUEST_SET_RC, 0, 0 };
479 int new_proto, ret; 479 int new_proto, ret;
480 480
481 /* Set the IR mode */ 481 /* Set the IR mode */
482 if (ir_type == IR_TYPE_RC5) 482 if (rc_type == RC_TYPE_RC5)
483 new_proto = 1; 483 new_proto = 1;
484 else if (ir_type == IR_TYPE_NEC) 484 else if (rc_type == RC_TYPE_NEC)
485 new_proto = 0; 485 new_proto = 0;
486 else if (ir_type == IR_TYPE_RC6) { 486 else if (rc_type == RC_TYPE_RC6) {
487 if (st->fw_version < 0x10200) 487 if (st->fw_version < 0x10200)
488 return -EINVAL; 488 return -EINVAL;
489 489
@@ -499,7 +499,7 @@ int dib0700_change_protocol(void *priv, u64 ir_type)
499 return ret; 499 return ret;
500 } 500 }
501 501
502 d->props.rc.core.protocol = ir_type; 502 d->props.rc.core.protocol = rc_type;
503 503
504 return ret; 504 return ret;
505} 505}
@@ -535,7 +535,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)
535 if (d == NULL) 535 if (d == NULL)
536 return; 536 return;
537 537
538 if (d->rc_input_dev == NULL) { 538 if (d->rc_dev == NULL) {
539 /* This will occur if disable_rc_polling=1 */ 539 /* This will occur if disable_rc_polling=1 */
540 usb_free_urb(purb); 540 usb_free_urb(purb);
541 return; 541 return;
@@ -562,7 +562,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)
562 purb->actual_length); 562 purb->actual_length);
563 563
564 switch (d->props.rc.core.protocol) { 564 switch (d->props.rc.core.protocol) {
565 case IR_TYPE_NEC: 565 case RC_TYPE_NEC:
566 toggle = 0; 566 toggle = 0;
567 567
568 /* NEC protocol sends repeat code as 0 0 0 FF */ 568 /* NEC protocol sends repeat code as 0 0 0 FF */
@@ -600,7 +600,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)
600 goto resubmit; 600 goto resubmit;
601 } 601 }
602 602
603 ir_keydown(d->rc_input_dev, keycode, toggle); 603 rc_keydown(d->rc_dev, keycode, toggle);
604 604
605resubmit: 605resubmit:
606 /* Clean the buffer before we requeue */ 606 /* Clean the buffer before we requeue */
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
index e06acd1fecb6..defd83964ce2 100644
--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
+++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
@@ -510,7 +510,7 @@ static int dib0700_rc_query_old_firmware(struct dvb_usb_device *d)
510 510
511 d->last_event = 0; 511 d->last_event = 0;
512 switch (d->props.rc.core.protocol) { 512 switch (d->props.rc.core.protocol) {
513 case IR_TYPE_NEC: 513 case RC_TYPE_NEC:
514 /* NEC protocol sends repeat code as 0 0 0 FF */ 514 /* NEC protocol sends repeat code as 0 0 0 FF */
515 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) && 515 if ((key[3-2] == 0x00) && (key[3-3] == 0x00) &&
516 (key[3] == 0xff)) 516 (key[3] == 0xff))
@@ -520,13 +520,13 @@ static int dib0700_rc_query_old_firmware(struct dvb_usb_device *d)
520 d->last_event = keycode; 520 d->last_event = keycode;
521 } 521 }
522 522
523 ir_keydown(d->rc_input_dev, keycode, 0); 523 rc_keydown(d->rc_dev, keycode, 0);
524 break; 524 break;
525 default: 525 default:
526 /* RC-5 protocol changes toggle bit on new keypress */ 526 /* RC-5 protocol changes toggle bit on new keypress */
527 keycode = key[3-2] << 8 | key[3-3]; 527 keycode = key[3-2] << 8 | key[3-3];
528 toggle = key[3-1]; 528 toggle = key[3-1];
529 ir_keydown(d->rc_input_dev, keycode, toggle); 529 rc_keydown(d->rc_dev, keycode, toggle);
530 530
531 break; 531 break;
532 } 532 }
@@ -1924,12 +1924,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1924 .rc_interval = DEFAULT_RC_INTERVAL, 1924 .rc_interval = DEFAULT_RC_INTERVAL,
1925 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 1925 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
1926 .rc_query = dib0700_rc_query_old_firmware, 1926 .rc_query = dib0700_rc_query_old_firmware,
1927 .rc_props = { 1927 .allowed_protos = RC_TYPE_RC5 |
1928 .allowed_protos = IR_TYPE_RC5 | 1928 RC_TYPE_RC6 |
1929 IR_TYPE_RC6 | 1929 RC_TYPE_NEC,
1930 IR_TYPE_NEC, 1930 .change_protocol = dib0700_change_protocol,
1931 .change_protocol = dib0700_change_protocol,
1932 },
1933 }, 1931 },
1934 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 1932 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
1935 1933
@@ -1960,12 +1958,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
1960 .rc_interval = DEFAULT_RC_INTERVAL, 1958 .rc_interval = DEFAULT_RC_INTERVAL,
1961 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 1959 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
1962 .rc_query = dib0700_rc_query_old_firmware, 1960 .rc_query = dib0700_rc_query_old_firmware,
1963 .rc_props = { 1961 .allowed_protos = RC_TYPE_RC5 |
1964 .allowed_protos = IR_TYPE_RC5 | 1962 RC_TYPE_RC6 |
1965 IR_TYPE_RC6 | 1963 RC_TYPE_NEC,
1966 IR_TYPE_NEC, 1964 .change_protocol = dib0700_change_protocol,
1967 .change_protocol = dib0700_change_protocol,
1968 },
1969 }, 1965 },
1970 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 1966 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
1971 1967
@@ -2021,12 +2017,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2021 .rc_interval = DEFAULT_RC_INTERVAL, 2017 .rc_interval = DEFAULT_RC_INTERVAL,
2022 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2018 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2023 .rc_query = dib0700_rc_query_old_firmware, 2019 .rc_query = dib0700_rc_query_old_firmware,
2024 .rc_props = { 2020 .allowed_protos = RC_TYPE_RC5 |
2025 .allowed_protos = IR_TYPE_RC5 | 2021 RC_TYPE_RC6 |
2026 IR_TYPE_RC6 | 2022 RC_TYPE_NEC,
2027 IR_TYPE_NEC, 2023 .change_protocol = dib0700_change_protocol,
2028 .change_protocol = dib0700_change_protocol,
2029 },
2030 }, 2024 },
2031 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2025 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2032 2026
@@ -2065,12 +2059,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2065 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2059 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2066 .module_name = "dib0700", 2060 .module_name = "dib0700",
2067 .rc_query = dib0700_rc_query_old_firmware, 2061 .rc_query = dib0700_rc_query_old_firmware,
2068 .rc_props = { 2062 .allowed_protos = RC_TYPE_RC5 |
2069 .allowed_protos = IR_TYPE_RC5 | 2063 RC_TYPE_RC6 |
2070 IR_TYPE_RC6 | 2064 RC_TYPE_NEC,
2071 IR_TYPE_NEC, 2065 .change_protocol = dib0700_change_protocol,
2072 .change_protocol = dib0700_change_protocol,
2073 },
2074 }, 2066 },
2075 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2067 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2076 2068
@@ -2143,12 +2135,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2143 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2135 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2144 .module_name = "dib0700", 2136 .module_name = "dib0700",
2145 .rc_query = dib0700_rc_query_old_firmware, 2137 .rc_query = dib0700_rc_query_old_firmware,
2146 .rc_props = { 2138 .allowed_protos = RC_TYPE_RC5 |
2147 .allowed_protos = IR_TYPE_RC5 | 2139 RC_TYPE_RC6 |
2148 IR_TYPE_RC6 | 2140 RC_TYPE_NEC,
2149 IR_TYPE_NEC, 2141 .change_protocol = dib0700_change_protocol,
2150 .change_protocol = dib0700_change_protocol,
2151 },
2152 }, 2142 },
2153 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2143 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2154 2144
@@ -2189,12 +2179,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2189 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2179 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2190 .module_name = "dib0700", 2180 .module_name = "dib0700",
2191 .rc_query = dib0700_rc_query_old_firmware, 2181 .rc_query = dib0700_rc_query_old_firmware,
2192 .rc_props = { 2182 .allowed_protos = RC_TYPE_RC5 |
2193 .allowed_protos = IR_TYPE_RC5 | 2183 RC_TYPE_RC6 |
2194 IR_TYPE_RC6 | 2184 RC_TYPE_NEC,
2195 IR_TYPE_NEC, 2185 .change_protocol = dib0700_change_protocol,
2196 .change_protocol = dib0700_change_protocol,
2197 },
2198 }, 2186 },
2199 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2187 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2200 2188
@@ -2259,12 +2247,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2259 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2247 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2260 .module_name = "dib0700", 2248 .module_name = "dib0700",
2261 .rc_query = dib0700_rc_query_old_firmware, 2249 .rc_query = dib0700_rc_query_old_firmware,
2262 .rc_props = { 2250 .allowed_protos = RC_TYPE_RC5 |
2263 .allowed_protos = IR_TYPE_RC5 | 2251 RC_TYPE_RC6 |
2264 IR_TYPE_RC6 | 2252 RC_TYPE_NEC,
2265 IR_TYPE_NEC, 2253 .change_protocol = dib0700_change_protocol,
2266 .change_protocol = dib0700_change_protocol,
2267 },
2268 }, 2254 },
2269 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2255 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2270 2256
@@ -2308,12 +2294,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2308 .rc_codes = RC_MAP_DIB0700_NEC_TABLE, 2294 .rc_codes = RC_MAP_DIB0700_NEC_TABLE,
2309 .module_name = "dib0700", 2295 .module_name = "dib0700",
2310 .rc_query = dib0700_rc_query_old_firmware, 2296 .rc_query = dib0700_rc_query_old_firmware,
2311 .rc_props = { 2297 .allowed_protos = RC_TYPE_RC5 |
2312 .allowed_protos = IR_TYPE_RC5 | 2298 RC_TYPE_RC6 |
2313 IR_TYPE_RC6 | 2299 RC_TYPE_NEC,
2314 IR_TYPE_NEC, 2300 .change_protocol = dib0700_change_protocol,
2315 .change_protocol = dib0700_change_protocol,
2316 },
2317 }, 2301 },
2318 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2302 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2319 2303
@@ -2379,12 +2363,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2379 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2363 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2380 .module_name = "dib0700", 2364 .module_name = "dib0700",
2381 .rc_query = dib0700_rc_query_old_firmware, 2365 .rc_query = dib0700_rc_query_old_firmware,
2382 .rc_props = { 2366 .allowed_protos = RC_TYPE_RC5 |
2383 .allowed_protos = IR_TYPE_RC5 | 2367 RC_TYPE_RC6 |
2384 IR_TYPE_RC6 | 2368 RC_TYPE_NEC,
2385 IR_TYPE_NEC, 2369 .change_protocol = dib0700_change_protocol,
2386 .change_protocol = dib0700_change_protocol,
2387 },
2388 }, 2370 },
2389 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2371 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2390 .num_adapters = 1, 2372 .num_adapters = 1,
@@ -2417,12 +2399,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2417 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2399 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2418 .module_name = "dib0700", 2400 .module_name = "dib0700",
2419 .rc_query = dib0700_rc_query_old_firmware, 2401 .rc_query = dib0700_rc_query_old_firmware,
2420 .rc_props = { 2402 .allowed_protos = RC_TYPE_RC5 |
2421 .allowed_protos = IR_TYPE_RC5 | 2403 RC_TYPE_RC6 |
2422 IR_TYPE_RC6 | 2404 RC_TYPE_NEC,
2423 IR_TYPE_NEC, 2405 .change_protocol = dib0700_change_protocol,
2424 .change_protocol = dib0700_change_protocol,
2425 },
2426 }, 2406 },
2427 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2407 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2428 .num_adapters = 1, 2408 .num_adapters = 1,
@@ -2487,12 +2467,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2487 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2467 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2488 .module_name = "dib0700", 2468 .module_name = "dib0700",
2489 .rc_query = dib0700_rc_query_old_firmware, 2469 .rc_query = dib0700_rc_query_old_firmware,
2490 .rc_props = { 2470 .allowed_protos = RC_TYPE_RC5 |
2491 .allowed_protos = IR_TYPE_RC5 | 2471 RC_TYPE_RC6 |
2492 IR_TYPE_RC6 | 2472 RC_TYPE_NEC,
2493 IR_TYPE_NEC, 2473 .change_protocol = dib0700_change_protocol,
2494 .change_protocol = dib0700_change_protocol,
2495 },
2496 }, 2474 },
2497 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2475 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2498 .num_adapters = 1, 2476 .num_adapters = 1,
@@ -2533,12 +2511,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2533 .rc_codes = RC_MAP_DIB0700_NEC_TABLE, 2511 .rc_codes = RC_MAP_DIB0700_NEC_TABLE,
2534 .module_name = "dib0700", 2512 .module_name = "dib0700",
2535 .rc_query = dib0700_rc_query_old_firmware, 2513 .rc_query = dib0700_rc_query_old_firmware,
2536 .rc_props = { 2514 .allowed_protos = RC_TYPE_RC5 |
2537 .allowed_protos = IR_TYPE_RC5 | 2515 RC_TYPE_RC6 |
2538 IR_TYPE_RC6 | 2516 RC_TYPE_NEC,
2539 IR_TYPE_NEC, 2517 .change_protocol = dib0700_change_protocol,
2540 .change_protocol = dib0700_change_protocol,
2541 },
2542 }, 2518 },
2543 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2519 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2544 .num_adapters = 2, 2520 .num_adapters = 2,
@@ -2584,12 +2560,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2584 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2560 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2585 .module_name = "dib0700", 2561 .module_name = "dib0700",
2586 .rc_query = dib0700_rc_query_old_firmware, 2562 .rc_query = dib0700_rc_query_old_firmware,
2587 .rc_props = { 2563 .allowed_protos = RC_TYPE_RC5 |
2588 .allowed_protos = IR_TYPE_RC5 | 2564 RC_TYPE_RC6 |
2589 IR_TYPE_RC6 | 2565 RC_TYPE_NEC,
2590 IR_TYPE_NEC, 2566 .change_protocol = dib0700_change_protocol,
2591 .change_protocol = dib0700_change_protocol,
2592 },
2593 }, 2567 },
2594 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, 2568 }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
2595 .num_adapters = 1, 2569 .num_adapters = 1,
@@ -2623,12 +2597,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
2623 .rc_codes = RC_MAP_DIB0700_RC5_TABLE, 2597 .rc_codes = RC_MAP_DIB0700_RC5_TABLE,
2624 .module_name = "dib0700", 2598 .module_name = "dib0700",
2625 .rc_query = dib0700_rc_query_old_firmware, 2599 .rc_query = dib0700_rc_query_old_firmware,
2626 .rc_props = { 2600 .allowed_protos = RC_TYPE_RC5 |
2627 .allowed_protos = IR_TYPE_RC5 | 2601 RC_TYPE_RC6 |
2628 IR_TYPE_RC6 | 2602 RC_TYPE_NEC,
2629 IR_TYPE_NEC, 2603 .change_protocol = dib0700_change_protocol,
2630 .change_protocol = dib0700_change_protocol,
2631 },
2632 }, 2604 },
2633 }, 2605 },
2634}; 2606};
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c
index ba991aa21aff..956f7ae2e510 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-common.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-common.c
@@ -327,7 +327,7 @@ EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach);
327/* 327/*
328 * common remote control stuff 328 * common remote control stuff
329 */ 329 */
330struct ir_scancode ir_codes_dibusb_table[] = { 330struct rc_map_table rc_map_dibusb_table[] = {
331 /* Key codes for the little Artec T1/Twinhan/HAMA/ remote. */ 331 /* Key codes for the little Artec T1/Twinhan/HAMA/ remote. */
332 { 0x0016, KEY_POWER }, 332 { 0x0016, KEY_POWER },
333 { 0x0010, KEY_MUTE }, 333 { 0x0010, KEY_MUTE },
@@ -456,7 +456,7 @@ struct ir_scancode ir_codes_dibusb_table[] = {
456 { 0x804e, KEY_ENTER }, 456 { 0x804e, KEY_ENTER },
457 { 0x804f, KEY_VOLUMEDOWN }, 457 { 0x804f, KEY_VOLUMEDOWN },
458}; 458};
459EXPORT_SYMBOL(ir_codes_dibusb_table); 459EXPORT_SYMBOL(rc_map_dibusb_table);
460 460
461int dibusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state) 461int dibusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
462{ 462{
diff --git a/drivers/media/dvb/dvb-usb/dibusb-mb.c b/drivers/media/dvb/dvb-usb/dibusb-mb.c
index 8e3c0d2cce16..04d91bdd3562 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-mb.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-mb.c
@@ -213,8 +213,8 @@ static struct dvb_usb_device_properties dibusb1_1_properties = {
213 213
214 .rc.legacy = { 214 .rc.legacy = {
215 .rc_interval = DEFAULT_RC_INTERVAL, 215 .rc_interval = DEFAULT_RC_INTERVAL,
216 .rc_key_map = ir_codes_dibusb_table, 216 .rc_map_table = rc_map_dibusb_table,
217 .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 217 .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
218 .rc_query = dibusb_rc_query, 218 .rc_query = dibusb_rc_query,
219 }, 219 },
220 220
@@ -299,8 +299,8 @@ static struct dvb_usb_device_properties dibusb1_1_an2235_properties = {
299 299
300 .rc.legacy = { 300 .rc.legacy = {
301 .rc_interval = DEFAULT_RC_INTERVAL, 301 .rc_interval = DEFAULT_RC_INTERVAL,
302 .rc_key_map = ir_codes_dibusb_table, 302 .rc_map_table = rc_map_dibusb_table,
303 .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 303 .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
304 .rc_query = dibusb_rc_query, 304 .rc_query = dibusb_rc_query,
305 }, 305 },
306 306
@@ -365,8 +365,8 @@ static struct dvb_usb_device_properties dibusb2_0b_properties = {
365 365
366 .rc.legacy = { 366 .rc.legacy = {
367 .rc_interval = DEFAULT_RC_INTERVAL, 367 .rc_interval = DEFAULT_RC_INTERVAL,
368 .rc_key_map = ir_codes_dibusb_table, 368 .rc_map_table = rc_map_dibusb_table,
369 .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 369 .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
370 .rc_query = dibusb_rc_query, 370 .rc_query = dibusb_rc_query,
371 }, 371 },
372 372
@@ -424,8 +424,8 @@ static struct dvb_usb_device_properties artec_t1_usb2_properties = {
424 424
425 .rc.legacy = { 425 .rc.legacy = {
426 .rc_interval = DEFAULT_RC_INTERVAL, 426 .rc_interval = DEFAULT_RC_INTERVAL,
427 .rc_key_map = ir_codes_dibusb_table, 427 .rc_map_table = rc_map_dibusb_table,
428 .rc_key_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */ 428 .rc_map_size = 111, /* wow, that is ugly ... I want to load it to the driver dynamically */
429 .rc_query = dibusb_rc_query, 429 .rc_query = dibusb_rc_query,
430 }, 430 },
431 431
diff --git a/drivers/media/dvb/dvb-usb/dibusb-mc.c b/drivers/media/dvb/dvb-usb/dibusb-mc.c
index 1cbc41cb4e8f..c1d9094b61e5 100644
--- a/drivers/media/dvb/dvb-usb/dibusb-mc.c
+++ b/drivers/media/dvb/dvb-usb/dibusb-mc.c
@@ -83,8 +83,8 @@ static struct dvb_usb_device_properties dibusb_mc_properties = {
83 83
84 .rc.legacy = { 84 .rc.legacy = {
85 .rc_interval = DEFAULT_RC_INTERVAL, 85 .rc_interval = DEFAULT_RC_INTERVAL,
86 .rc_key_map = ir_codes_dibusb_table, 86 .rc_map_table = rc_map_dibusb_table,
87 .rc_key_map_size = 111, /* FIXME */ 87 .rc_map_size = 111, /* FIXME */
88 .rc_query = dibusb_rc_query, 88 .rc_query = dibusb_rc_query,
89 }, 89 },
90 90
diff --git a/drivers/media/dvb/dvb-usb/dibusb.h b/drivers/media/dvb/dvb-usb/dibusb.h
index 61a6bf389472..e47c321b3ffc 100644
--- a/drivers/media/dvb/dvb-usb/dibusb.h
+++ b/drivers/media/dvb/dvb-usb/dibusb.h
@@ -124,7 +124,7 @@ extern int dibusb2_0_power_ctrl(struct dvb_usb_device *, int);
124#define DEFAULT_RC_INTERVAL 150 124#define DEFAULT_RC_INTERVAL 150
125//#define DEFAULT_RC_INTERVAL 100000 125//#define DEFAULT_RC_INTERVAL 100000
126 126
127extern struct ir_scancode ir_codes_dibusb_table[]; 127extern struct rc_map_table rc_map_dibusb_table[];
128extern int dibusb_rc_query(struct dvb_usb_device *, u32 *, int *); 128extern int dibusb_rc_query(struct dvb_usb_device *, u32 *, int *);
129extern int dibusb_read_eeprom_byte(struct dvb_usb_device *, u8, u8 *); 129extern int dibusb_read_eeprom_byte(struct dvb_usb_device *, u8, u8 *);
130 130
diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c
index 13d006bb19db..f2dbce7edb3b 100644
--- a/drivers/media/dvb/dvb-usb/digitv.c
+++ b/drivers/media/dvb/dvb-usb/digitv.c
@@ -161,7 +161,7 @@ static int digitv_tuner_attach(struct dvb_usb_adapter *adap)
161 return 0; 161 return 0;
162} 162}
163 163
164static struct ir_scancode ir_codes_digitv_table[] = { 164static struct rc_map_table rc_map_digitv_table[] = {
165 { 0x5f55, KEY_0 }, 165 { 0x5f55, KEY_0 },
166 { 0x6f55, KEY_1 }, 166 { 0x6f55, KEY_1 },
167 { 0x9f55, KEY_2 }, 167 { 0x9f55, KEY_2 },
@@ -237,10 +237,10 @@ static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
237 /* if something is inside the buffer, simulate key press */ 237 /* if something is inside the buffer, simulate key press */
238 if (key[1] != 0) 238 if (key[1] != 0)
239 { 239 {
240 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) { 240 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
241 if (rc5_custom(&d->props.rc.legacy.rc_key_map[i]) == key[1] && 241 if (rc5_custom(&d->props.rc.legacy.rc_map_table[i]) == key[1] &&
242 rc5_data(&d->props.rc.legacy.rc_key_map[i]) == key[2]) { 242 rc5_data(&d->props.rc.legacy.rc_map_table[i]) == key[2]) {
243 *event = d->props.rc.legacy.rc_key_map[i].keycode; 243 *event = d->props.rc.legacy.rc_map_table[i].keycode;
244 *state = REMOTE_KEY_PRESSED; 244 *state = REMOTE_KEY_PRESSED;
245 return 0; 245 return 0;
246 } 246 }
@@ -312,8 +312,8 @@ static struct dvb_usb_device_properties digitv_properties = {
312 312
313 .rc.legacy = { 313 .rc.legacy = {
314 .rc_interval = 1000, 314 .rc_interval = 1000,
315 .rc_key_map = ir_codes_digitv_table, 315 .rc_map_table = rc_map_digitv_table,
316 .rc_key_map_size = ARRAY_SIZE(ir_codes_digitv_table), 316 .rc_map_size = ARRAY_SIZE(rc_map_digitv_table),
317 .rc_query = digitv_rc_query, 317 .rc_query = digitv_rc_query,
318 }, 318 },
319 319
diff --git a/drivers/media/dvb/dvb-usb/dtt200u.c b/drivers/media/dvb/dvb-usb/dtt200u.c
index ca495e07f35c..ecd86eca2548 100644
--- a/drivers/media/dvb/dvb-usb/dtt200u.c
+++ b/drivers/media/dvb/dvb-usb/dtt200u.c
@@ -57,7 +57,7 @@ static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
57 57
58/* remote control */ 58/* remote control */
59/* key list for the tiny remote control (Yakumo, don't know about the others) */ 59/* key list for the tiny remote control (Yakumo, don't know about the others) */
60static struct ir_scancode ir_codes_dtt200u_table[] = { 60static struct rc_map_table rc_map_dtt200u_table[] = {
61 { 0x8001, KEY_MUTE }, 61 { 0x8001, KEY_MUTE },
62 { 0x8002, KEY_CHANNELDOWN }, 62 { 0x8002, KEY_CHANNELDOWN },
63 { 0x8003, KEY_VOLUMEDOWN }, 63 { 0x8003, KEY_VOLUMEDOWN },
@@ -163,8 +163,8 @@ static struct dvb_usb_device_properties dtt200u_properties = {
163 163
164 .rc.legacy = { 164 .rc.legacy = {
165 .rc_interval = 300, 165 .rc_interval = 300,
166 .rc_key_map = ir_codes_dtt200u_table, 166 .rc_map_table = rc_map_dtt200u_table,
167 .rc_key_map_size = ARRAY_SIZE(ir_codes_dtt200u_table), 167 .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),
168 .rc_query = dtt200u_rc_query, 168 .rc_query = dtt200u_rc_query,
169 }, 169 },
170 170
@@ -210,8 +210,8 @@ static struct dvb_usb_device_properties wt220u_properties = {
210 210
211 .rc.legacy = { 211 .rc.legacy = {
212 .rc_interval = 300, 212 .rc_interval = 300,
213 .rc_key_map = ir_codes_dtt200u_table, 213 .rc_map_table = rc_map_dtt200u_table,
214 .rc_key_map_size = ARRAY_SIZE(ir_codes_dtt200u_table), 214 .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),
215 .rc_query = dtt200u_rc_query, 215 .rc_query = dtt200u_rc_query,
216 }, 216 },
217 217
@@ -257,8 +257,8 @@ static struct dvb_usb_device_properties wt220u_fc_properties = {
257 257
258 .rc.legacy = { 258 .rc.legacy = {
259 .rc_interval = 300, 259 .rc_interval = 300,
260 .rc_key_map = ir_codes_dtt200u_table, 260 .rc_map_table = rc_map_dtt200u_table,
261 .rc_key_map_size = ARRAY_SIZE(ir_codes_dtt200u_table), 261 .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),
262 .rc_query = dtt200u_rc_query, 262 .rc_query = dtt200u_rc_query,
263 }, 263 },
264 264
@@ -304,8 +304,8 @@ static struct dvb_usb_device_properties wt220u_zl0353_properties = {
304 304
305 .rc.legacy = { 305 .rc.legacy = {
306 .rc_interval = 300, 306 .rc_interval = 300,
307 .rc_key_map = ir_codes_dtt200u_table, 307 .rc_map_table = rc_map_dtt200u_table,
308 .rc_key_map_size = ARRAY_SIZE(ir_codes_dtt200u_table), 308 .rc_map_size = ARRAY_SIZE(rc_map_dtt200u_table),
309 .rc_query = dtt200u_rc_query, 309 .rc_query = dtt200u_rc_query,
310 }, 310 },
311 311
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 192a40ce583d..1a6310b61923 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -301,6 +301,7 @@
301#define USB_PID_ELGATO_EYETV_DIVERSITY 0x0011 301#define USB_PID_ELGATO_EYETV_DIVERSITY 0x0011
302#define USB_PID_ELGATO_EYETV_DTT 0x0021 302#define USB_PID_ELGATO_EYETV_DTT 0x0021
303#define USB_PID_ELGATO_EYETV_DTT_Dlx 0x0020 303#define USB_PID_ELGATO_EYETV_DTT_Dlx 0x0020
304#define USB_PID_ELGATO_EYETV_SAT 0x002a
304#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_COLD 0x5000 305#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_COLD 0x5000
305#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_WARM 0x5001 306#define USB_PID_DVB_T_USB_STICK_HIGH_SPEED_WARM 0x5001
306#define USB_PID_FRIIO_WHITE 0x0001 307#define USB_PID_FRIIO_WHITE 0x0001
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
index b579fed3ab3f..c6498f536dff 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-remote.c
@@ -13,11 +13,11 @@ static int legacy_dvb_usb_getkeycode(struct input_dev *dev,
13{ 13{
14 struct dvb_usb_device *d = input_get_drvdata(dev); 14 struct dvb_usb_device *d = input_get_drvdata(dev);
15 15
16 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 16 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
17 int i; 17 int i;
18 18
19 /* See if we can match the raw key code. */ 19 /* See if we can match the raw key code. */
20 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) 20 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
21 if (keymap[i].scancode == scancode) { 21 if (keymap[i].scancode == scancode) {
22 *keycode = keymap[i].keycode; 22 *keycode = keymap[i].keycode;
23 return 0; 23 return 0;
@@ -28,7 +28,7 @@ static int legacy_dvb_usb_getkeycode(struct input_dev *dev,
28 * otherwise, input core won't let legacy_dvb_usb_setkeycode 28 * otherwise, input core won't let legacy_dvb_usb_setkeycode
29 * to work 29 * to work
30 */ 30 */
31 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) 31 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
32 if (keymap[i].keycode == KEY_RESERVED || 32 if (keymap[i].keycode == KEY_RESERVED ||
33 keymap[i].keycode == KEY_UNKNOWN) { 33 keymap[i].keycode == KEY_UNKNOWN) {
34 *keycode = KEY_RESERVED; 34 *keycode = KEY_RESERVED;
@@ -43,18 +43,18 @@ static int legacy_dvb_usb_setkeycode(struct input_dev *dev,
43{ 43{
44 struct dvb_usb_device *d = input_get_drvdata(dev); 44 struct dvb_usb_device *d = input_get_drvdata(dev);
45 45
46 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 46 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
47 int i; 47 int i;
48 48
49 /* Search if it is replacing an existing keycode */ 49 /* Search if it is replacing an existing keycode */
50 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) 50 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
51 if (keymap[i].scancode == scancode) { 51 if (keymap[i].scancode == scancode) {
52 keymap[i].keycode = keycode; 52 keymap[i].keycode = keycode;
53 return 0; 53 return 0;
54 } 54 }
55 55
56 /* Search if is there a clean entry. If so, use it */ 56 /* Search if is there a clean entry. If so, use it */
57 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) 57 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
58 if (keymap[i].keycode == KEY_RESERVED || 58 if (keymap[i].keycode == KEY_RESERVED ||
59 keymap[i].keycode == KEY_UNKNOWN) { 59 keymap[i].keycode == KEY_UNKNOWN) {
60 keymap[i].scancode = scancode; 60 keymap[i].scancode = scancode;
@@ -106,10 +106,10 @@ static void legacy_dvb_usb_read_remote_control(struct work_struct *work)
106 d->last_event = event; 106 d->last_event = event;
107 case REMOTE_KEY_REPEAT: 107 case REMOTE_KEY_REPEAT:
108 deb_rc("key repeated\n"); 108 deb_rc("key repeated\n");
109 input_event(d->rc_input_dev, EV_KEY, event, 1); 109 input_event(d->input_dev, EV_KEY, event, 1);
110 input_sync(d->rc_input_dev); 110 input_sync(d->input_dev);
111 input_event(d->rc_input_dev, EV_KEY, d->last_event, 0); 111 input_event(d->input_dev, EV_KEY, d->last_event, 0);
112 input_sync(d->rc_input_dev); 112 input_sync(d->input_dev);
113 break; 113 break;
114 default: 114 default:
115 break; 115 break;
@@ -154,20 +154,32 @@ schedule:
154 schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc.legacy.rc_interval)); 154 schedule_delayed_work(&d->rc_query_work,msecs_to_jiffies(d->props.rc.legacy.rc_interval));
155} 155}
156 156
157static int legacy_dvb_usb_remote_init(struct dvb_usb_device *d, 157static int legacy_dvb_usb_remote_init(struct dvb_usb_device *d)
158 struct input_dev *input_dev)
159{ 158{
160 int i, err, rc_interval; 159 int i, err, rc_interval;
160 struct input_dev *input_dev;
161
162 input_dev = input_allocate_device();
163 if (!input_dev)
164 return -ENOMEM;
165
166 input_dev->evbit[0] = BIT_MASK(EV_KEY);
167 input_dev->name = "IR-receiver inside an USB DVB receiver";
168 input_dev->phys = d->rc_phys;
169 usb_to_input_id(d->udev, &input_dev->id);
170 input_dev->dev.parent = &d->udev->dev;
171 d->input_dev = input_dev;
172 d->rc_dev = NULL;
161 173
162 input_dev->getkeycode = legacy_dvb_usb_getkeycode; 174 input_dev->getkeycode = legacy_dvb_usb_getkeycode;
163 input_dev->setkeycode = legacy_dvb_usb_setkeycode; 175 input_dev->setkeycode = legacy_dvb_usb_setkeycode;
164 176
165 /* set the bits for the keys */ 177 /* set the bits for the keys */
166 deb_rc("key map size: %d\n", d->props.rc.legacy.rc_key_map_size); 178 deb_rc("key map size: %d\n", d->props.rc.legacy.rc_map_size);
167 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) { 179 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++) {
168 deb_rc("setting bit for event %d item %d\n", 180 deb_rc("setting bit for event %d item %d\n",
169 d->props.rc.legacy.rc_key_map[i].keycode, i); 181 d->props.rc.legacy.rc_map_table[i].keycode, i);
170 set_bit(d->props.rc.legacy.rc_key_map[i].keycode, input_dev->keybit); 182 set_bit(d->props.rc.legacy.rc_map_table[i].keycode, input_dev->keybit);
171 } 183 }
172 184
173 /* setting these two values to non-zero, we have to manage key repeats */ 185 /* setting these two values to non-zero, we have to manage key repeats */
@@ -221,18 +233,34 @@ static void dvb_usb_read_remote_control(struct work_struct *work)
221 msecs_to_jiffies(d->props.rc.core.rc_interval)); 233 msecs_to_jiffies(d->props.rc.core.rc_interval));
222} 234}
223 235
224static int rc_core_dvb_usb_remote_init(struct dvb_usb_device *d, 236static int rc_core_dvb_usb_remote_init(struct dvb_usb_device *d)
225 struct input_dev *input_dev)
226{ 237{
227 int err, rc_interval; 238 int err, rc_interval;
239 struct rc_dev *dev;
240
241 dev = rc_allocate_device();
242 if (!dev)
243 return -ENOMEM;
228 244
229 d->props.rc.core.rc_props.priv = d; 245 dev->driver_name = d->props.rc.core.module_name;
230 err = ir_input_register(input_dev, 246 dev->map_name = d->props.rc.core.rc_codes;
231 d->props.rc.core.rc_codes, 247 dev->change_protocol = d->props.rc.core.change_protocol;
232 &d->props.rc.core.rc_props, 248 dev->allowed_protos = d->props.rc.core.allowed_protos;
233 d->props.rc.core.module_name); 249 dev->driver_type = RC_DRIVER_SCANCODE;
234 if (err < 0) 250 usb_to_input_id(d->udev, &dev->input_id);
251 dev->input_name = "IR-receiver inside an USB DVB receiver";
252 dev->input_phys = d->rc_phys;
253 dev->dev.parent = &d->udev->dev;
254 dev->priv = d;
255
256 err = rc_register_device(dev);
257 if (err < 0) {
258 rc_free_device(dev);
235 return err; 259 return err;
260 }
261
262 d->input_dev = NULL;
263 d->rc_dev = dev;
236 264
237 if (!d->props.rc.core.rc_query || d->props.rc.core.bulk_mode) 265 if (!d->props.rc.core.rc_query || d->props.rc.core.bulk_mode)
238 return 0; 266 return 0;
@@ -251,13 +279,12 @@ static int rc_core_dvb_usb_remote_init(struct dvb_usb_device *d,
251 279
252int dvb_usb_remote_init(struct dvb_usb_device *d) 280int dvb_usb_remote_init(struct dvb_usb_device *d)
253{ 281{
254 struct input_dev *input_dev;
255 int err; 282 int err;
256 283
257 if (dvb_usb_disable_rc_polling) 284 if (dvb_usb_disable_rc_polling)
258 return 0; 285 return 0;
259 286
260 if (d->props.rc.legacy.rc_key_map && d->props.rc.legacy.rc_query) 287 if (d->props.rc.legacy.rc_map_table && d->props.rc.legacy.rc_query)
261 d->props.rc.mode = DVB_RC_LEGACY; 288 d->props.rc.mode = DVB_RC_LEGACY;
262 else if (d->props.rc.core.rc_codes) 289 else if (d->props.rc.core.rc_codes)
263 d->props.rc.mode = DVB_RC_CORE; 290 d->props.rc.mode = DVB_RC_CORE;
@@ -267,26 +294,14 @@ int dvb_usb_remote_init(struct dvb_usb_device *d)
267 usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys)); 294 usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
268 strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys)); 295 strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
269 296
270 input_dev = input_allocate_device();
271 if (!input_dev)
272 return -ENOMEM;
273
274 input_dev->evbit[0] = BIT_MASK(EV_KEY);
275 input_dev->name = "IR-receiver inside an USB DVB receiver";
276 input_dev->phys = d->rc_phys;
277 usb_to_input_id(d->udev, &input_dev->id);
278 input_dev->dev.parent = &d->udev->dev;
279
280 /* Start the remote-control polling. */ 297 /* Start the remote-control polling. */
281 if (d->props.rc.legacy.rc_interval < 40) 298 if (d->props.rc.legacy.rc_interval < 40)
282 d->props.rc.legacy.rc_interval = 100; /* default */ 299 d->props.rc.legacy.rc_interval = 100; /* default */
283 300
284 d->rc_input_dev = input_dev;
285
286 if (d->props.rc.mode == DVB_RC_LEGACY) 301 if (d->props.rc.mode == DVB_RC_LEGACY)
287 err = legacy_dvb_usb_remote_init(d, input_dev); 302 err = legacy_dvb_usb_remote_init(d);
288 else 303 else
289 err = rc_core_dvb_usb_remote_init(d, input_dev); 304 err = rc_core_dvb_usb_remote_init(d);
290 if (err) 305 if (err)
291 return err; 306 return err;
292 307
@@ -301,9 +316,9 @@ int dvb_usb_remote_exit(struct dvb_usb_device *d)
301 cancel_rearming_delayed_work(&d->rc_query_work); 316 cancel_rearming_delayed_work(&d->rc_query_work);
302 flush_scheduled_work(); 317 flush_scheduled_work();
303 if (d->props.rc.mode == DVB_RC_LEGACY) 318 if (d->props.rc.mode == DVB_RC_LEGACY)
304 input_unregister_device(d->rc_input_dev); 319 input_unregister_device(d->input_dev);
305 else 320 else
306 ir_input_unregister(d->rc_input_dev); 321 rc_unregister_device(d->rc_dev);
307 } 322 }
308 d->state &= ~DVB_USB_STATE_REMOTE; 323 d->state &= ~DVB_USB_STATE_REMOTE;
309 return 0; 324 return 0;
@@ -316,7 +331,7 @@ int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d,
316 u8 keybuf[5], u32 *event, int *state) 331 u8 keybuf[5], u32 *event, int *state)
317{ 332{
318 int i; 333 int i;
319 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 334 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
320 *event = 0; 335 *event = 0;
321 *state = REMOTE_NO_KEY_PRESSED; 336 *state = REMOTE_NO_KEY_PRESSED;
322 switch (keybuf[0]) { 337 switch (keybuf[0]) {
@@ -329,7 +344,7 @@ int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *d,
329 break; 344 break;
330 } 345 }
331 /* See if we can match the raw key code. */ 346 /* See if we can match the raw key code. */
332 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) 347 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
333 if (rc5_custom(&keymap[i]) == keybuf[1] && 348 if (rc5_custom(&keymap[i]) == keybuf[1] &&
334 rc5_data(&keymap[i]) == keybuf[3]) { 349 rc5_data(&keymap[i]) == keybuf[3]) {
335 *event = keymap[i].keycode; 350 *event = keymap[i].keycode;
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h
index 34f7b3ba8cc7..65fa9268e7f7 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb.h
@@ -14,7 +14,7 @@
14#include <linux/usb.h> 14#include <linux/usb.h>
15#include <linux/firmware.h> 15#include <linux/firmware.h>
16#include <linux/mutex.h> 16#include <linux/mutex.h>
17#include <media/ir-core.h> 17#include <media/rc-core.h>
18 18
19#include "dvb_frontend.h" 19#include "dvb_frontend.h"
20#include "dvb_demux.h" 20#include "dvb_demux.h"
@@ -75,17 +75,17 @@ struct dvb_usb_device_description {
75 struct usb_device_id *warm_ids[DVB_USB_ID_MAX_NUM]; 75 struct usb_device_id *warm_ids[DVB_USB_ID_MAX_NUM];
76}; 76};
77 77
78static inline u8 rc5_custom(struct ir_scancode *key) 78static inline u8 rc5_custom(struct rc_map_table *key)
79{ 79{
80 return (key->scancode >> 8) & 0xff; 80 return (key->scancode >> 8) & 0xff;
81} 81}
82 82
83static inline u8 rc5_data(struct ir_scancode *key) 83static inline u8 rc5_data(struct rc_map_table *key)
84{ 84{
85 return key->scancode & 0xff; 85 return key->scancode & 0xff;
86} 86}
87 87
88static inline u8 rc5_scan(struct ir_scancode *key) 88static inline u8 rc5_scan(struct rc_map_table *key)
89{ 89{
90 return key->scancode & 0xffff; 90 return key->scancode & 0xffff;
91} 91}
@@ -159,9 +159,9 @@ struct dvb_usb_adapter_properties {
159 159
160/** 160/**
161 * struct dvb_rc_legacy - old properties of remote controller 161 * struct dvb_rc_legacy - old properties of remote controller
162 * @rc_key_map: a hard-wired array of struct ir_scancode (NULL to disable 162 * @rc_map_table: a hard-wired array of struct rc_map_table (NULL to disable
163 * remote control handling). 163 * remote control handling).
164 * @rc_key_map_size: number of items in @rc_key_map. 164 * @rc_map_size: number of items in @rc_map_table.
165 * @rc_query: called to query an event event. 165 * @rc_query: called to query an event event.
166 * @rc_interval: time in ms between two queries. 166 * @rc_interval: time in ms between two queries.
167 */ 167 */
@@ -170,8 +170,8 @@ struct dvb_rc_legacy {
170#define REMOTE_NO_KEY_PRESSED 0x00 170#define REMOTE_NO_KEY_PRESSED 0x00
171#define REMOTE_KEY_PRESSED 0x01 171#define REMOTE_KEY_PRESSED 0x01
172#define REMOTE_KEY_REPEAT 0x02 172#define REMOTE_KEY_REPEAT 0x02
173 struct ir_scancode *rc_key_map; 173 struct rc_map_table *rc_map_table;
174 int rc_key_map_size; 174 int rc_map_size;
175 int (*rc_query) (struct dvb_usb_device *, u32 *, int *); 175 int (*rc_query) (struct dvb_usb_device *, u32 *, int *);
176 int rc_interval; 176 int rc_interval;
177}; 177};
@@ -180,18 +180,20 @@ struct dvb_rc_legacy {
180 * struct dvb_rc properties of remote controller, using rc-core 180 * struct dvb_rc properties of remote controller, using rc-core
181 * @rc_codes: name of rc codes table 181 * @rc_codes: name of rc codes table
182 * @protocol: type of protocol(s) currently used by the driver 182 * @protocol: type of protocol(s) currently used by the driver
183 * @allowed_protos: protocol(s) supported by the driver
184 * @change_protocol: callback to change protocol
183 * @rc_query: called to query an event event. 185 * @rc_query: called to query an event event.
184 * @rc_interval: time in ms between two queries. 186 * @rc_interval: time in ms between two queries.
185 * @rc_props: remote controller properties
186 * @bulk_mode: device supports bulk mode for RC (disable polling mode) 187 * @bulk_mode: device supports bulk mode for RC (disable polling mode)
187 */ 188 */
188struct dvb_rc { 189struct dvb_rc {
189 char *rc_codes; 190 char *rc_codes;
190 u64 protocol; 191 u64 protocol;
192 u64 allowed_protos;
193 int (*change_protocol)(struct rc_dev *dev, u64 rc_type);
191 char *module_name; 194 char *module_name;
192 int (*rc_query) (struct dvb_usb_device *d); 195 int (*rc_query) (struct dvb_usb_device *d);
193 int rc_interval; 196 int rc_interval;
194 struct ir_dev_props rc_props;
195 bool bulk_mode; /* uses bulk mode */ 197 bool bulk_mode; /* uses bulk mode */
196}; 198};
197 199
@@ -385,7 +387,8 @@ struct dvb_usb_adapter {
385 * 387 *
386 * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB 388 * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB
387 * 389 *
388 * @rc_input_dev: input device for the remote control. 390 * @rc_dev: rc device for the remote control (rc-core mode)
391 * @input_dev: input device for the remote control (legacy mode)
389 * @rc_query_work: struct work_struct frequent rc queries 392 * @rc_query_work: struct work_struct frequent rc queries
390 * @last_event: last triggered event 393 * @last_event: last triggered event
391 * @last_state: last state (no, pressed, repeat) 394 * @last_state: last state (no, pressed, repeat)
@@ -418,7 +421,8 @@ struct dvb_usb_device {
418 struct dvb_usb_adapter adapter[MAX_NO_OF_ADAPTER_PER_DEVICE]; 421 struct dvb_usb_adapter adapter[MAX_NO_OF_ADAPTER_PER_DEVICE];
419 422
420 /* remote control */ 423 /* remote control */
421 struct input_dev *rc_input_dev; 424 struct rc_dev *rc_dev;
425 struct input_dev *input_dev;
422 char rc_phys[64]; 426 char rc_phys[64];
423 struct delayed_work rc_query_work; 427 struct delayed_work rc_query_work;
424 u32 last_event; 428 u32 last_event;
diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c
index 774df88dc6e3..2c307ba0d28b 100644
--- a/drivers/media/dvb/dvb-usb/dw2102.c
+++ b/drivers/media/dvb/dvb-usb/dw2102.c
@@ -73,8 +73,8 @@
73 "Please see linux/Documentation/dvb/ for more details " \ 73 "Please see linux/Documentation/dvb/ for more details " \
74 "on firmware-problems." 74 "on firmware-problems."
75 75
76struct ir_codes_dvb_usb_table_table { 76struct rc_map_dvb_usb_table_table {
77 struct ir_scancode *rc_keys; 77 struct rc_map_table *rc_keys;
78 int rc_keys_size; 78 int rc_keys_size;
79}; 79};
80 80
@@ -948,7 +948,7 @@ static int dw3101_tuner_attach(struct dvb_usb_adapter *adap)
948 return 0; 948 return 0;
949} 949}
950 950
951static struct ir_scancode ir_codes_dw210x_table[] = { 951static struct rc_map_table rc_map_dw210x_table[] = {
952 { 0xf80a, KEY_Q }, /*power*/ 952 { 0xf80a, KEY_Q }, /*power*/
953 { 0xf80c, KEY_M }, /*mute*/ 953 { 0xf80c, KEY_M }, /*mute*/
954 { 0xf811, KEY_1 }, 954 { 0xf811, KEY_1 },
@@ -982,7 +982,7 @@ static struct ir_scancode ir_codes_dw210x_table[] = {
982 { 0xf81b, KEY_B }, /*recall*/ 982 { 0xf81b, KEY_B }, /*recall*/
983}; 983};
984 984
985static struct ir_scancode ir_codes_tevii_table[] = { 985static struct rc_map_table rc_map_tevii_table[] = {
986 { 0xf80a, KEY_POWER }, 986 { 0xf80a, KEY_POWER },
987 { 0xf80c, KEY_MUTE }, 987 { 0xf80c, KEY_MUTE },
988 { 0xf811, KEY_1 }, 988 { 0xf811, KEY_1 },
@@ -1032,7 +1032,7 @@ static struct ir_scancode ir_codes_tevii_table[] = {
1032 { 0xf858, KEY_SWITCHVIDEOMODE }, 1032 { 0xf858, KEY_SWITCHVIDEOMODE },
1033}; 1033};
1034 1034
1035static struct ir_scancode ir_codes_tbs_table[] = { 1035static struct rc_map_table rc_map_tbs_table[] = {
1036 { 0xf884, KEY_POWER }, 1036 { 0xf884, KEY_POWER },
1037 { 0xf894, KEY_MUTE }, 1037 { 0xf894, KEY_MUTE },
1038 { 0xf887, KEY_1 }, 1038 { 0xf887, KEY_1 },
@@ -1067,16 +1067,16 @@ static struct ir_scancode ir_codes_tbs_table[] = {
1067 { 0xf89b, KEY_MODE } 1067 { 0xf89b, KEY_MODE }
1068}; 1068};
1069 1069
1070static struct ir_codes_dvb_usb_table_table keys_tables[] = { 1070static struct rc_map_dvb_usb_table_table keys_tables[] = {
1071 { ir_codes_dw210x_table, ARRAY_SIZE(ir_codes_dw210x_table) }, 1071 { rc_map_dw210x_table, ARRAY_SIZE(rc_map_dw210x_table) },
1072 { ir_codes_tevii_table, ARRAY_SIZE(ir_codes_tevii_table) }, 1072 { rc_map_tevii_table, ARRAY_SIZE(rc_map_tevii_table) },
1073 { ir_codes_tbs_table, ARRAY_SIZE(ir_codes_tbs_table) }, 1073 { rc_map_tbs_table, ARRAY_SIZE(rc_map_tbs_table) },
1074}; 1074};
1075 1075
1076static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state) 1076static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
1077{ 1077{
1078 struct ir_scancode *keymap = d->props.rc.legacy.rc_key_map; 1078 struct rc_map_table *keymap = d->props.rc.legacy.rc_map_table;
1079 int keymap_size = d->props.rc.legacy.rc_key_map_size; 1079 int keymap_size = d->props.rc.legacy.rc_map_size;
1080 u8 key[2]; 1080 u8 key[2];
1081 struct i2c_msg msg = { 1081 struct i2c_msg msg = {
1082 .addr = DW2102_RC_QUERY, 1082 .addr = DW2102_RC_QUERY,
@@ -1185,14 +1185,14 @@ static int dw2102_load_firmware(struct usb_device *dev,
1185 /* init registers */ 1185 /* init registers */
1186 switch (dev->descriptor.idProduct) { 1186 switch (dev->descriptor.idProduct) {
1187 case USB_PID_PROF_1100: 1187 case USB_PID_PROF_1100:
1188 s6x0_properties.rc.legacy.rc_key_map = ir_codes_tbs_table; 1188 s6x0_properties.rc.legacy.rc_map_table = rc_map_tbs_table;
1189 s6x0_properties.rc.legacy.rc_key_map_size = 1189 s6x0_properties.rc.legacy.rc_map_size =
1190 ARRAY_SIZE(ir_codes_tbs_table); 1190 ARRAY_SIZE(rc_map_tbs_table);
1191 break; 1191 break;
1192 case USB_PID_TEVII_S650: 1192 case USB_PID_TEVII_S650:
1193 dw2104_properties.rc.legacy.rc_key_map = ir_codes_tevii_table; 1193 dw2104_properties.rc.legacy.rc_map_table = rc_map_tevii_table;
1194 dw2104_properties.rc.legacy.rc_key_map_size = 1194 dw2104_properties.rc.legacy.rc_map_size =
1195 ARRAY_SIZE(ir_codes_tevii_table); 1195 ARRAY_SIZE(rc_map_tevii_table);
1196 case USB_PID_DW2104: 1196 case USB_PID_DW2104:
1197 reset = 1; 1197 reset = 1;
1198 dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1, 1198 dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1,
@@ -1257,8 +1257,8 @@ static struct dvb_usb_device_properties dw2102_properties = {
1257 .i2c_algo = &dw2102_serit_i2c_algo, 1257 .i2c_algo = &dw2102_serit_i2c_algo,
1258 1258
1259 .rc.legacy = { 1259 .rc.legacy = {
1260 .rc_key_map = ir_codes_dw210x_table, 1260 .rc_map_table = rc_map_dw210x_table,
1261 .rc_key_map_size = ARRAY_SIZE(ir_codes_dw210x_table), 1261 .rc_map_size = ARRAY_SIZE(rc_map_dw210x_table),
1262 .rc_interval = 150, 1262 .rc_interval = 150,
1263 .rc_query = dw2102_rc_query, 1263 .rc_query = dw2102_rc_query,
1264 }, 1264 },
@@ -1310,8 +1310,8 @@ static struct dvb_usb_device_properties dw2104_properties = {
1310 1310
1311 .i2c_algo = &dw2104_i2c_algo, 1311 .i2c_algo = &dw2104_i2c_algo,
1312 .rc.legacy = { 1312 .rc.legacy = {
1313 .rc_key_map = ir_codes_dw210x_table, 1313 .rc_map_table = rc_map_dw210x_table,
1314 .rc_key_map_size = ARRAY_SIZE(ir_codes_dw210x_table), 1314 .rc_map_size = ARRAY_SIZE(rc_map_dw210x_table),
1315 .rc_interval = 150, 1315 .rc_interval = 150,
1316 .rc_query = dw2102_rc_query, 1316 .rc_query = dw2102_rc_query,
1317 }, 1317 },
@@ -1359,8 +1359,8 @@ static struct dvb_usb_device_properties dw3101_properties = {
1359 1359
1360 .i2c_algo = &dw3101_i2c_algo, 1360 .i2c_algo = &dw3101_i2c_algo,
1361 .rc.legacy = { 1361 .rc.legacy = {
1362 .rc_key_map = ir_codes_dw210x_table, 1362 .rc_map_table = rc_map_dw210x_table,
1363 .rc_key_map_size = ARRAY_SIZE(ir_codes_dw210x_table), 1363 .rc_map_size = ARRAY_SIZE(rc_map_dw210x_table),
1364 .rc_interval = 150, 1364 .rc_interval = 150,
1365 .rc_query = dw2102_rc_query, 1365 .rc_query = dw2102_rc_query,
1366 }, 1366 },
@@ -1404,8 +1404,8 @@ static struct dvb_usb_device_properties s6x0_properties = {
1404 1404
1405 .i2c_algo = &s6x0_i2c_algo, 1405 .i2c_algo = &s6x0_i2c_algo,
1406 .rc.legacy = { 1406 .rc.legacy = {
1407 .rc_key_map = ir_codes_tevii_table, 1407 .rc_map_table = rc_map_tevii_table,
1408 .rc_key_map_size = ARRAY_SIZE(ir_codes_tevii_table), 1408 .rc_map_size = ARRAY_SIZE(rc_map_tevii_table),
1409 .rc_interval = 150, 1409 .rc_interval = 150,
1410 .rc_query = dw2102_rc_query, 1410 .rc_query = dw2102_rc_query,
1411 }, 1411 },
@@ -1468,8 +1468,8 @@ static int dw2102_probe(struct usb_interface *intf,
1468 /* fill only different fields */ 1468 /* fill only different fields */
1469 p7500->firmware = "dvb-usb-p7500.fw"; 1469 p7500->firmware = "dvb-usb-p7500.fw";
1470 p7500->devices[0] = d7500; 1470 p7500->devices[0] = d7500;
1471 p7500->rc.legacy.rc_key_map = ir_codes_tbs_table; 1471 p7500->rc.legacy.rc_map_table = rc_map_tbs_table;
1472 p7500->rc.legacy.rc_key_map_size = ARRAY_SIZE(ir_codes_tbs_table); 1472 p7500->rc.legacy.rc_map_size = ARRAY_SIZE(rc_map_tbs_table);
1473 p7500->adapter->frontend_attach = prof_7500_frontend_attach; 1473 p7500->adapter->frontend_attach = prof_7500_frontend_attach;
1474 1474
1475 if (0 == dvb_usb_device_init(intf, &dw2102_properties, 1475 if (0 == dvb_usb_device_init(intf, &dw2102_properties,
diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c
index c821293dbc22..1cb3d9a66e02 100644
--- a/drivers/media/dvb/dvb-usb/gp8psk.c
+++ b/drivers/media/dvb/dvb-usb/gp8psk.c
@@ -24,6 +24,33 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DV
24 24
25DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 25DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
26 26
27static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers)
28{
29 return (gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6));
30}
31
32static int gp8psk_get_fpga_version(struct dvb_usb_device *d, u8 *fpga_vers)
33{
34 return (gp8psk_usb_in_op(d, GET_FPGA_VERS, 0, 0, fpga_vers, 1));
35}
36
37static void gp8psk_info(struct dvb_usb_device *d)
38{
39 u8 fpga_vers, fw_vers[6];
40
41 if (!gp8psk_get_fw_version(d, fw_vers))
42 info("FW Version = %i.%02i.%i (0x%x) Build %4i/%02i/%02i",
43 fw_vers[2], fw_vers[1], fw_vers[0], GP8PSK_FW_VERS(fw_vers),
44 2000 + fw_vers[5], fw_vers[4], fw_vers[3]);
45 else
46 info("failed to get FW version");
47
48 if (!gp8psk_get_fpga_version(d, &fpga_vers))
49 info("FPGA Version = %i", fpga_vers);
50 else
51 info("failed to get FPGA version");
52}
53
27int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) 54int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
28{ 55{
29 int ret = 0,try = 0; 56 int ret = 0,try = 0;
@@ -146,6 +173,7 @@ static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff)
146 gp8psk_usb_out_op(d, CW3K_INIT, 1, 0, NULL, 0); 173 gp8psk_usb_out_op(d, CW3K_INIT, 1, 0, NULL, 0);
147 if (gp8psk_usb_in_op(d, BOOT_8PSK, 1, 0, &buf, 1)) 174 if (gp8psk_usb_in_op(d, BOOT_8PSK, 1, 0, &buf, 1))
148 return -EINVAL; 175 return -EINVAL;
176 gp8psk_info(d);
149 } 177 }
150 178
151 if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) 179 if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM)
diff --git a/drivers/media/dvb/dvb-usb/gp8psk.h b/drivers/media/dvb/dvb-usb/gp8psk.h
index e83a57506cfa..831749a518cb 100644
--- a/drivers/media/dvb/dvb-usb/gp8psk.h
+++ b/drivers/media/dvb/dvb-usb/gp8psk.h
@@ -25,7 +25,6 @@ extern int dvb_usb_gp8psk_debug;
25#define deb_xfer(args...) dprintk(dvb_usb_gp8psk_debug,0x02,args) 25#define deb_xfer(args...) dprintk(dvb_usb_gp8psk_debug,0x02,args)
26#define deb_rc(args...) dprintk(dvb_usb_gp8psk_debug,0x04,args) 26#define deb_rc(args...) dprintk(dvb_usb_gp8psk_debug,0x04,args)
27#define deb_fe(args...) dprintk(dvb_usb_gp8psk_debug,0x08,args) 27#define deb_fe(args...) dprintk(dvb_usb_gp8psk_debug,0x08,args)
28/* gp8psk commands */
29 28
30/* Twinhan Vendor requests */ 29/* Twinhan Vendor requests */
31#define TH_COMMAND_IN 0xC0 30#define TH_COMMAND_IN 0xC0
@@ -49,8 +48,10 @@ extern int dvb_usb_gp8psk_debug;
49#define SET_DVB_MODE 0x8E 48#define SET_DVB_MODE 0x8E
50#define SET_DN_SWITCH 0x8F 49#define SET_DN_SWITCH 0x8F
51#define GET_SIGNAL_LOCK 0x90 /* in */ 50#define GET_SIGNAL_LOCK 0x90 /* in */
51#define GET_FW_VERS 0x92
52#define GET_SERIAL_NUMBER 0x93 /* in */ 52#define GET_SERIAL_NUMBER 0x93 /* in */
53#define USE_EXTRA_VOLT 0x94 53#define USE_EXTRA_VOLT 0x94
54#define GET_FPGA_VERS 0x95
54#define CW3K_INIT 0x9d 55#define CW3K_INIT 0x9d
55 56
56/* PSK_configuration bits */ 57/* PSK_configuration bits */
@@ -88,6 +89,11 @@ extern int dvb_usb_gp8psk_debug;
88#define PRODUCT_STRING_READ 0x0D 89#define PRODUCT_STRING_READ 0x0D
89#define FW_BCD_VERSION_READ 0x14 90#define FW_BCD_VERSION_READ 0x14
90 91
92/* firmware revision id's */
93#define GP8PSK_FW_REV1 0x020604
94#define GP8PSK_FW_REV2 0x020704
95#define GP8PSK_FW_VERS(_fw_vers) ((_fw_vers)[2]<<0x10 | (_fw_vers)[1]<<0x08 | (_fw_vers)[0])
96
91extern struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d); 97extern struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d);
92extern int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen); 98extern int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen);
93extern int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, 99extern int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c
index d939fbbf9fe6..9eea4188303b 100644
--- a/drivers/media/dvb/dvb-usb/lmedm04.c
+++ b/drivers/media/dvb/dvb-usb/lmedm04.c
@@ -61,7 +61,7 @@
61#define DVB_USB_LOG_PREFIX "LME2510(C)" 61#define DVB_USB_LOG_PREFIX "LME2510(C)"
62#include <linux/usb.h> 62#include <linux/usb.h>
63#include <linux/usb/input.h> 63#include <linux/usb/input.h>
64#include <media/ir-core.h> 64#include <media/rc-core.h>
65 65
66#include "dvb-usb.h" 66#include "dvb-usb.h"
67#include "lmedm04.h" 67#include "lmedm04.h"
@@ -112,7 +112,6 @@ struct lme2510_state {
112 u8 i2c_tuner_gate_r; 112 u8 i2c_tuner_gate_r;
113 u8 i2c_tuner_addr; 113 u8 i2c_tuner_addr;
114 u8 stream_on; 114 u8 stream_on;
115 u8 one_tune;
116 void *buffer; 115 void *buffer;
117 struct urb *lme_urb; 116 struct urb *lme_urb;
118 void *usb_buffer; 117 void *usb_buffer;
@@ -125,7 +124,7 @@ static int lme2510_bulk_write(struct usb_device *dev,
125 int ret, actual_l; 124 int ret, actual_l;
126 125
127 ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe), 126 ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, pipe),
128 snd, len , &actual_l, 500); 127 snd, len , &actual_l, 100);
129 return ret; 128 return ret;
130} 129}
131 130
@@ -135,7 +134,7 @@ static int lme2510_bulk_read(struct usb_device *dev,
135 int ret, actual_l; 134 int ret, actual_l;
136 135
137 ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe), 136 ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, pipe),
138 rev, len , &actual_l, 500); 137 rev, len , &actual_l, 200);
139 return ret; 138 return ret;
140} 139}
141 140
@@ -167,7 +166,7 @@ static int lme2510_usb_talk(struct dvb_usb_device *d,
167 166
168 ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01); 167 ret |= lme2510_bulk_write(d->udev, buff, wlen , 0x01);
169 168
170 msleep(12); 169 msleep(10);
171 170
172 ret |= usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x01)); 171 ret |= usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, 0x01));
173 172
@@ -182,15 +181,13 @@ static int lme2510_usb_talk(struct dvb_usb_device *d,
182 return (ret < 0) ? -ENODEV : 0; 181 return (ret < 0) ? -ENODEV : 0;
183} 182}
184 183
185static int lme2510_usb_talk_restart(struct dvb_usb_device *d, 184static int lme2510_stream_restart(struct dvb_usb_device *d)
186 u8 *wbuf, int wlen, u8 *rbuf, int rlen) { 185{
187 static u8 stream_on[] = LME_ST_ON_W; 186 static u8 stream_on[] = LME_ST_ON_W;
188 int ret; 187 int ret;
189 u8 rbuff[10]; 188 u8 rbuff[10];
190 /*Send Normal Command*/
191 ret = lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
192 /*Restart Stream Command*/ 189 /*Restart Stream Command*/
193 ret |= lme2510_usb_talk(d, stream_on, sizeof(stream_on), 190 ret = lme2510_usb_talk(d, stream_on, sizeof(stream_on),
194 rbuff, sizeof(rbuff)); 191 rbuff, sizeof(rbuff));
195 return ret; 192 return ret;
196} 193}
@@ -201,7 +198,7 @@ static int lme2510_remote_keypress(struct dvb_usb_adapter *adap, u16 keypress)
201 deb_info(1, "INT Key Keypress =%04x", keypress); 198 deb_info(1, "INT Key Keypress =%04x", keypress);
202 199
203 if (keypress > 0) 200 if (keypress > 0)
204 ir_keydown(d->rc_input_dev, keypress, 0); 201 rc_keydown(d->rc_dev, keypress, 0);
205 202
206 return 0; 203 return 0;
207} 204}
@@ -254,11 +251,16 @@ static void lme2510_int_response(struct urb *lme_urb)
254 case TUNER_S7395: 251 case TUNER_S7395:
255 /* Tweak for earlier firmware*/ 252 /* Tweak for earlier firmware*/
256 if (ibuf[1] == 0x03) { 253 if (ibuf[1] == 0x03) {
254 if (ibuf[2] > 1)
255 st->signal_lock = ibuf[2];
257 st->signal_level = ibuf[3]; 256 st->signal_level = ibuf[3];
258 st->signal_sn = ibuf[4]; 257 st->signal_sn = ibuf[4];
259 } else { 258 } else {
260 st->signal_level = ibuf[4]; 259 st->signal_level = ibuf[4];
261 st->signal_sn = ibuf[5]; 260 st->signal_sn = ibuf[5];
261 st->signal_lock =
262 (st->signal_lock & 0xf7) +
263 ((ibuf[2] & 0x01) << 0x03);
262 } 264 }
263 break; 265 break;
264 default: 266 default:
@@ -341,11 +343,10 @@ static int lme2510_msg(struct dvb_usb_device *d,
341 st->signal_lock = rbuf[1]; 343 st->signal_lock = rbuf[1];
342 if ((st->stream_on & 1) && 344 if ((st->stream_on & 1) &&
343 (st->signal_lock & 0x10)) { 345 (st->signal_lock & 0x10)) {
344 lme2510_usb_talk_restart(d, 346 lme2510_stream_restart(d);
345 wbuf, wlen, rbuf, rlen);
346 st->i2c_talk_onoff = 0; 347 st->i2c_talk_onoff = 0;
347 } 348 }
348 msleep(80); 349 msleep(80);
349 } 350 }
350 } 351 }
351 break; 352 break;
@@ -355,15 +356,12 @@ static int lme2510_msg(struct dvb_usb_device *d,
355 st->signal_lock = rbuf[1]; 356 st->signal_lock = rbuf[1];
356 if ((st->stream_on & 1) && 357 if ((st->stream_on & 1) &&
357 (st->signal_lock & 0x8)) { 358 (st->signal_lock & 0x8)) {
358 lme2510_usb_talk_restart(d, 359 lme2510_stream_restart(d);
359 wbuf, wlen, rbuf, rlen);
360 st->i2c_talk_onoff = 0; 360 st->i2c_talk_onoff = 0;
361 } 361 }
362 } 362 }
363 if ((wbuf[3] != 0x6) & (wbuf[3] != 0x5)) 363 if ((wbuf[3] != 0x6) & (wbuf[3] != 0x5))
364 msleep(5); 364 msleep(5);
365
366
367 } 365 }
368 break; 366 break;
369 default: 367 default:
@@ -385,18 +383,16 @@ static int lme2510_msg(struct dvb_usb_device *d,
385 rbuf[0] = 0x55; 383 rbuf[0] = 0x55;
386 rbuf[1] = st->signal_sn; 384 rbuf[1] = st->signal_sn;
387 break; 385 break;
388 /*DiSEqC functions as per TDA10086*/ 386 case 0x15:
389 case 0x36: 387 case 0x16:
390 case 0x48: 388 case 0x17:
391 case 0x49: 389 case 0x18:
392 case 0x4a: 390 rbuf[0] = 0x55;
393 case 0x4b: 391 rbuf[1] = 0x00;
394 case 0x4c: 392 break;
395 case 0x4d:
396 if (wbuf[2] == 0x1c)
397 lme2510_usb_talk_restart(d,
398 wbuf, wlen, rbuf, rlen);
399 default: 393 default:
394 lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
395 st->i2c_talk_onoff = 1;
400 break; 396 break;
401 } 397 }
402 break; 398 break;
@@ -413,39 +409,22 @@ static int lme2510_msg(struct dvb_usb_device *d,
413 break; 409 break;
414 case 0x24: 410 case 0x24:
415 rbuf[0] = 0x55; 411 rbuf[0] = 0x55;
416 rbuf[1] = (st->signal_level & 0x80) 412 rbuf[1] = st->signal_lock;
417 ? 0 : st->signal_lock;
418 break;
419 case 0x6:
420 if (wbuf[2] == 0xd0)
421 lme2510_usb_talk(d,
422 wbuf, wlen, rbuf, rlen);
423 break;
424 case 0x1:
425 if (st->one_tune > 0)
426 break;
427 st->one_tune++;
428 st->i2c_talk_onoff = 1;
429 /*DiSEqC functions as per STV0288*/
430 case 0x5:
431 case 0x7:
432 case 0x8:
433 case 0x9:
434 case 0xa:
435 case 0xb:
436 if (wbuf[2] == 0xd0)
437 lme2510_usb_talk_restart(d,
438 wbuf, wlen, rbuf, rlen);
439 break; 413 break;
440 default: 414 case 0x2e:
415 case 0x26:
416 case 0x27:
441 rbuf[0] = 0x55; 417 rbuf[0] = 0x55;
442 rbuf[1] = 0x00; 418 rbuf[1] = 0x00;
443 break; 419 break;
420 default:
421 lme2510_usb_talk(d, wbuf, wlen, rbuf, rlen);
422 st->i2c_talk_onoff = 1;
423 break;
444 } 424 }
445 break; 425 break;
446 default: 426 default:
447 break; 427 break;
448
449 } 428 }
450 429
451 deb_info(4, "I2C From Interupt Message out(%02x) in(%02x)", 430 deb_info(4, "I2C From Interupt Message out(%02x) in(%02x)",
@@ -548,35 +527,26 @@ static int lme2510_identify_state(struct usb_device *udev,
548static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) 527static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
549{ 528{
550 struct lme2510_state *st = adap->dev->priv; 529 struct lme2510_state *st = adap->dev->priv;
551 static u8 stream_on[] = LME_ST_ON_W;
552 static u8 clear_reg_3[] = LME_CLEAR_PID; 530 static u8 clear_reg_3[] = LME_CLEAR_PID;
553 static u8 rbuf[1]; 531 static u8 rbuf[1];
554 static u8 timeout; 532 int ret = 0, rlen = sizeof(rbuf);
555 int ret = 0, len = 2, rlen = sizeof(rbuf);
556 533
557 deb_info(1, "STM (%02x)", onoff); 534 deb_info(1, "STM (%02x)", onoff);
558 535
559 if (onoff == 1) { 536 /* Streaming is started by FE_HAS_LOCK */
560 st->i2c_talk_onoff = 0; 537 if (onoff == 1)
561 timeout = 0;
562 /* wait for i2C to be free */
563 while (mutex_lock_interruptible(&adap->dev->i2c_mutex) < 0) {
564 timeout++;
565 if (timeout > 5)
566 return -ENODEV;
567 }
568 msleep(100);
569 ret |= lme2510_usb_talk(adap->dev,
570 stream_on, len, rbuf, rlen);
571 st->stream_on = 1; 538 st->stream_on = 1;
572 st->one_tune = 0; 539 else {
573 mutex_unlock(&adap->dev->i2c_mutex);
574 } else {
575 deb_info(1, "STM Steam Off"); 540 deb_info(1, "STM Steam Off");
541 /* mutex is here only to avoid collision with I2C */
542 ret = mutex_lock_interruptible(&adap->dev->i2c_mutex);
543
576 ret |= lme2510_usb_talk(adap->dev, clear_reg_3, 544 ret |= lme2510_usb_talk(adap->dev, clear_reg_3,
577 sizeof(clear_reg_3), rbuf, rlen); 545 sizeof(clear_reg_3), rbuf, rlen);
578 st->stream_on = 0; 546 st->stream_on = 0;
579 st->i2c_talk_onoff = 1; 547 st->i2c_talk_onoff = 1;
548
549 mutex_unlock(&adap->dev->i2c_mutex);
580 } 550 }
581 551
582 return (ret < 0) ? -ENODEV : 0; 552 return (ret < 0) ? -ENODEV : 0;
@@ -585,41 +555,40 @@ static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
585static int lme2510_int_service(struct dvb_usb_adapter *adap) 555static int lme2510_int_service(struct dvb_usb_adapter *adap)
586{ 556{
587 struct dvb_usb_device *d = adap->dev; 557 struct dvb_usb_device *d = adap->dev;
588 struct input_dev *input_dev; 558 struct rc_dev *rc;
589 char *ir_codes = RC_MAP_LME2510; 559 int ret;
590 int ret = 0;
591 560
592 info("STA Configuring Remote"); 561 info("STA Configuring Remote");
593 562
594 usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys)); 563 rc = rc_allocate_device();
595 564 if (!rc)
596 strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
597
598 input_dev = input_allocate_device();
599 if (!input_dev)
600 return -ENOMEM; 565 return -ENOMEM;
601 566
602 input_dev->name = "LME2510 Remote Control"; 567 usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
603 input_dev->phys = d->rc_phys; 568 strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
604
605 usb_to_input_id(d->udev, &input_dev->id);
606 569
607 ret |= ir_input_register(input_dev, ir_codes, NULL, "LME 2510"); 570 rc->input_name = "LME2510 Remote Control";
571 rc->input_phys = d->rc_phys;
572 rc->map_name = RC_MAP_LME2510;
573 rc->driver_name = "LME 2510";
574 usb_to_input_id(d->udev, &rc->input_id);
608 575
576 ret = rc_register_device(rc);
609 if (ret) { 577 if (ret) {
610 input_free_device(input_dev); 578 rc_free_device(rc);
611 return ret; 579 return ret;
612 } 580 }
581 d->rc_dev = rc;
613 582
614 d->rc_input_dev = input_dev;
615 /* Start the Interupt */ 583 /* Start the Interupt */
616 ret = lme2510_int_read(adap); 584 ret = lme2510_int_read(adap);
617
618 if (ret < 0) { 585 if (ret < 0) {
619 ir_input_unregister(input_dev); 586 rc_unregister_device(rc);
620 input_free_device(input_dev); 587 info("INT Unable to start Interupt Service");
588 return -ENODEV;
621 } 589 }
622 return (ret < 0) ? -ENODEV : 0; 590
591 return 0;
623} 592}
624 593
625static u8 check_sum(u8 *p, u8 len) 594static u8 check_sum(u8 *p, u8 len)
@@ -668,6 +637,7 @@ static int lme2510_download_firmware(struct usb_device *dev,
668 ret |= (data[0] == 0x88) ? 0 : -1; 637 ret |= (data[0] == 0x88) ? 0 : -1;
669 } 638 }
670 } 639 }
640
671 usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 641 usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
672 0x06, 0x80, 0x0200, 0x00, data, 0x0109, 1000); 642 0x06, 0x80, 0x0200, 0x00, data, 0x0109, 1000);
673 643
@@ -701,10 +671,11 @@ static void lme_coldreset(struct usb_device *dev)
701 info("FRM Firmware Cold Reset"); 671 info("FRM Firmware Cold Reset");
702 ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Cold Resetting*/ 672 ret |= lme2510_bulk_write(dev, data , len_in, 1); /*Cold Resetting*/
703 ret |= lme2510_bulk_read(dev, data, len_in, 1); 673 ret |= lme2510_bulk_read(dev, data, len_in, 1);
674
704 return; 675 return;
705} 676}
706 677
707static void lme_firmware_switch(struct usb_device *udev, int cold) 678static int lme_firmware_switch(struct usb_device *udev, int cold)
708{ 679{
709 const struct firmware *fw = NULL; 680 const struct firmware *fw = NULL;
710 char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; 681 char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw";
@@ -712,8 +683,10 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
712 char *firm_msg[] = {"Loading", "Switching to"}; 683 char *firm_msg[] = {"Loading", "Switching to"};
713 int ret; 684 int ret;
714 685
686 cold = (cold > 0) ? (cold & 1) : 0;
687
715 if (udev->descriptor.idProduct == 0x1122) 688 if (udev->descriptor.idProduct == 0x1122)
716 return; 689 return 0;
717 690
718 switch (dvb_usb_lme2510_firmware) { 691 switch (dvb_usb_lme2510_firmware) {
719 case 0: 692 case 0:
@@ -740,22 +713,28 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
740 cold = 0; 713 cold = 0;
741 break; 714 break;
742 } 715 }
716
743 release_firmware(fw); 717 release_firmware(fw);
744 if (cold) 718
719 if (cold) {
745 lme_coldreset(udev); 720 lme_coldreset(udev);
746 return; 721 return -ENODEV;
722 }
723
724 return ret;
747} 725}
748 726
749static int lme2510_kill_urb(struct usb_data_stream *stream) 727static int lme2510_kill_urb(struct usb_data_stream *stream)
750{ 728{
751 int i; 729 int i;
730
752 for (i = 0; i < stream->urbs_submitted; i++) { 731 for (i = 0; i < stream->urbs_submitted; i++) {
753 deb_info(3, "killing URB no. %d.", i); 732 deb_info(3, "killing URB no. %d.", i);
754
755 /* stop the URB */ 733 /* stop the URB */
756 usb_kill_urb(stream->urb_list[i]); 734 usb_kill_urb(stream->urb_list[i]);
757 } 735 }
758 stream->urbs_submitted = 0; 736 stream->urbs_submitted = 0;
737
759 return 0; 738 return 0;
760} 739}
761 740
@@ -783,18 +762,13 @@ static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
783 fe_sec_voltage_t voltage) 762 fe_sec_voltage_t voltage)
784{ 763{
785 struct dvb_usb_adapter *adap = fe->dvb->priv; 764 struct dvb_usb_adapter *adap = fe->dvb->priv;
786 struct lme2510_state *st = adap->dev->priv;
787 static u8 voltage_low[] = LME_VOLTAGE_L; 765 static u8 voltage_low[] = LME_VOLTAGE_L;
788 static u8 voltage_high[] = LME_VOLTAGE_H; 766 static u8 voltage_high[] = LME_VOLTAGE_H;
789 static u8 lnb_on[] = LNB_ON;
790 static u8 lnb_off[] = LNB_OFF;
791 static u8 rbuf[1]; 767 static u8 rbuf[1];
792 int ret = 0, len = 3, rlen = 1; 768 int ret = 0, len = 3, rlen = 1;
793 769
794 if (st->stream_on == 1) 770 if (mutex_lock_interruptible(&adap->dev->i2c_mutex) < 0)
795 return 0; 771 return -EAGAIN;
796
797 ret |= lme2510_usb_talk(adap->dev, lnb_on, len, rbuf, rlen);
798 772
799 switch (voltage) { 773 switch (voltage) {
800 case SEC_VOLTAGE_18: 774 case SEC_VOLTAGE_18:
@@ -803,94 +777,143 @@ static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
803 break; 777 break;
804 778
805 case SEC_VOLTAGE_OFF: 779 case SEC_VOLTAGE_OFF:
806 ret |= lme2510_usb_talk(adap->dev,
807 lnb_off, len, rbuf, rlen);
808 case SEC_VOLTAGE_13: 780 case SEC_VOLTAGE_13:
809 default: 781 default:
810 ret |= lme2510_usb_talk(adap->dev, 782 ret |= lme2510_usb_talk(adap->dev,
811 voltage_low, len, rbuf, rlen); 783 voltage_low, len, rbuf, rlen);
812 break; 784 break;
785 }
813 786
787 mutex_unlock(&adap->dev->i2c_mutex);
814 788
815 };
816 st->i2c_talk_onoff = 1;
817 return (ret < 0) ? -ENODEV : 0; 789 return (ret < 0) ? -ENODEV : 0;
818} 790}
819 791
792static int lme_name(struct dvb_usb_adapter *adap)
793{
794 struct lme2510_state *st = adap->dev->priv;
795 const char *desc = adap->dev->desc->name;
796 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
797 char *name = adap->fe->ops.info.name;
798
799 strlcpy(name, desc, 128);
800 strlcat(name, fe_name[st->tuner_config], 128);
801
802 return 0;
803}
804
820static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) 805static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
821{ 806{
822 int ret = 0;
823 struct lme2510_state *st = adap->dev->priv; 807 struct lme2510_state *st = adap->dev->priv;
824 808
825 /* Interupt Start */ 809 int ret = 0;
826 ret = lme2510_int_service(adap);
827 if (ret < 0) {
828 info("INT Unable to start Interupt Service");
829 return -ENODEV;
830 }
831 810
832 st->i2c_talk_onoff = 1; 811 st->i2c_talk_onoff = 1;
833 st->i2c_gate = 4;
834 812
813 st->i2c_gate = 4;
835 adap->fe = dvb_attach(tda10086_attach, &tda10086_config, 814 adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
836 &adap->dev->i2c_adap); 815 &adap->dev->i2c_adap);
837 816
838 if (adap->fe) { 817 if (adap->fe) {
839 info("TUN Found Frontend TDA10086"); 818 info("TUN Found Frontend TDA10086");
840 memcpy(&adap->fe->ops.info.name,
841 &"DM04_LG_TDQY-P001F DVB-S", 24);
842 adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
843 st->i2c_tuner_gate_w = 4; 819 st->i2c_tuner_gate_w = 4;
844 st->i2c_tuner_gate_r = 4; 820 st->i2c_tuner_gate_r = 4;
845 st->i2c_tuner_addr = 0xc0; 821 st->i2c_tuner_addr = 0xc0;
846 if (dvb_attach(tda826x_attach, adap->fe, 0xc0, 822 st->tuner_config = TUNER_LG;
847 &adap->dev->i2c_adap, 1)) { 823 if (dvb_usb_lme2510_firmware != 1) {
848 info("TUN TDA8263 Found"); 824 dvb_usb_lme2510_firmware = 1;
849 st->tuner_config = TUNER_LG; 825 ret = lme_firmware_switch(adap->dev->udev, 1);
850 if (dvb_usb_lme2510_firmware != 1) { 826 } else /*stops LG/Sharp multi tuner problems*/
851 dvb_usb_lme2510_firmware = 1; 827 dvb_usb_lme2510_firmware = 0;
852 lme_firmware_switch(adap->dev->udev, 1); 828 goto end;
853 }
854 return 0;
855 }
856 kfree(adap->fe);
857 adap->fe = NULL;
858 } 829 }
830
859 st->i2c_gate = 5; 831 st->i2c_gate = 5;
860 adap->fe = dvb_attach(stv0288_attach, &lme_config, 832 adap->fe = dvb_attach(stv0288_attach, &lme_config,
861 &adap->dev->i2c_adap); 833 &adap->dev->i2c_adap);
862 834
863 if (adap->fe) { 835 if (adap->fe) {
864 info("FE Found Stv0288"); 836 info("FE Found Stv0288");
865 memcpy(&adap->fe->ops.info.name,
866 &"DM04_SHARP:BS2F7HZ7395", 22);
867 adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
868 st->i2c_tuner_gate_w = 4; 837 st->i2c_tuner_gate_w = 4;
869 st->i2c_tuner_gate_r = 5; 838 st->i2c_tuner_gate_r = 5;
870 st->i2c_tuner_addr = 0xc0; 839 st->i2c_tuner_addr = 0xc0;
871 if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, 840 st->tuner_config = TUNER_S7395;
872 &adap->dev->i2c_adap)) { 841 if (dvb_usb_lme2510_firmware != 0) {
873 st->tuner_config = TUNER_S7395; 842 dvb_usb_lme2510_firmware = 0;
874 info("TUN Sharp IX2505V silicon tuner"); 843 ret = lme_firmware_switch(adap->dev->udev, 1);
875 if (dvb_usb_lme2510_firmware != 0) {
876 dvb_usb_lme2510_firmware = 0;
877 lme_firmware_switch(adap->dev->udev, 1);
878 }
879 return 0;
880 } 844 }
845 } else {
846 info("DM04 Not Supported");
847 return -ENODEV;
848 }
849
850end: if (ret) {
881 kfree(adap->fe); 851 kfree(adap->fe);
882 adap->fe = NULL; 852 adap->fe = NULL;
853 return -ENODEV;
883 } 854 }
884 855
885 info("DM04 Not Supported"); 856 adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
886 return -ENODEV; 857 ret = lme_name(adap);
858
859 return ret;
860}
861
862static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
863{
864 struct lme2510_state *st = adap->dev->priv;
865 char *tun_msg[] = {"", "TDA8263", "IX2505V"};
866 int ret = 0;
867
868 switch (st->tuner_config) {
869 case TUNER_LG:
870 if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
871 &adap->dev->i2c_adap, 1))
872 ret = st->tuner_config;
873 break;
874 case TUNER_S7395:
875 if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
876 &adap->dev->i2c_adap))
877 ret = st->tuner_config;
878 break;
879 default:
880 break;
881 }
882
883 if (ret)
884 info("TUN Found %s tuner", tun_msg[ret]);
885 else {
886 info("TUN No tuner found --- reseting device");
887 lme_coldreset(adap->dev->udev);
888 return -ENODEV;
889 }
890
891 /* Start the Interupt & Remote*/
892 ret = lme2510_int_service(adap);
893
894 return ret;
887} 895}
888 896
889static int lme2510_powerup(struct dvb_usb_device *d, int onoff) 897static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
890{ 898{
891 struct lme2510_state *st = d->priv; 899 struct lme2510_state *st = d->priv;
900 static u8 lnb_on[] = LNB_ON;
901 static u8 lnb_off[] = LNB_OFF;
902 static u8 rbuf[1];
903 int ret, len = 3, rlen = 1;
904
905 ret = mutex_lock_interruptible(&d->i2c_mutex);
906
907 if (onoff)
908 ret |= lme2510_usb_talk(d, lnb_on, len, rbuf, rlen);
909 else
910 ret |= lme2510_usb_talk(d, lnb_off, len, rbuf, rlen);
911
892 st->i2c_talk_onoff = 1; 912 st->i2c_talk_onoff = 1;
893 return 0; 913
914 mutex_unlock(&d->i2c_mutex);
915
916 return ret;
894} 917}
895 918
896/* DVB USB Driver stuff */ 919/* DVB USB Driver stuff */
@@ -951,6 +974,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
951 { 974 {
952 .streaming_ctrl = lme2510_streaming_ctrl, 975 .streaming_ctrl = lme2510_streaming_ctrl,
953 .frontend_attach = dm04_lme2510_frontend_attach, 976 .frontend_attach = dm04_lme2510_frontend_attach,
977 .tuner_attach = dm04_lme2510_tuner,
954 /* parameter for the MPEG2-data transfer */ 978 /* parameter for the MPEG2-data transfer */
955 .stream = { 979 .stream = {
956 .type = USB_BULK, 980 .type = USB_BULK,
@@ -971,7 +995,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
971 .generic_bulk_ctrl_endpoint = 0, 995 .generic_bulk_ctrl_endpoint = 0,
972 .num_device_descs = 1, 996 .num_device_descs = 1,
973 .devices = { 997 .devices = {
974 { "DM04 LME2510 DVB-S USB 2.0", 998 { "DM04_LME2510_DVB-S",
975 { &lme2510_table[0], NULL }, 999 { &lme2510_table[0], NULL },
976 }, 1000 },
977 1001
@@ -989,6 +1013,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
989 { 1013 {
990 .streaming_ctrl = lme2510_streaming_ctrl, 1014 .streaming_ctrl = lme2510_streaming_ctrl,
991 .frontend_attach = dm04_lme2510_frontend_attach, 1015 .frontend_attach = dm04_lme2510_frontend_attach,
1016 .tuner_attach = dm04_lme2510_tuner,
992 /* parameter for the MPEG2-data transfer */ 1017 /* parameter for the MPEG2-data transfer */
993 .stream = { 1018 .stream = {
994 .type = USB_BULK, 1019 .type = USB_BULK,
@@ -1009,7 +1034,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
1009 .generic_bulk_ctrl_endpoint = 0, 1034 .generic_bulk_ctrl_endpoint = 0,
1010 .num_device_descs = 1, 1035 .num_device_descs = 1,
1011 .devices = { 1036 .devices = {
1012 { "DM04 LME2510C USB2.0", 1037 { "DM04_LME2510C_DVB-S",
1013 { &lme2510_table[1], NULL }, 1038 { &lme2510_table[1], NULL },
1014 }, 1039 },
1015 } 1040 }
@@ -1036,7 +1061,7 @@ void *lme2510_exit_int(struct dvb_usb_device *d)
1036 usb_free_coherent(d->udev, 5000, st->buffer, 1061 usb_free_coherent(d->udev, 5000, st->buffer,
1037 st->lme_urb->transfer_dma); 1062 st->lme_urb->transfer_dma);
1038 info("Interupt Service Stopped"); 1063 info("Interupt Service Stopped");
1039 ir_input_unregister(d->rc_input_dev); 1064 rc_unregister_device(d->rc_dev);
1040 info("Remote Stopped"); 1065 info("Remote Stopped");
1041 } 1066 }
1042 return buffer; 1067 return buffer;
@@ -1055,7 +1080,7 @@ void lme2510_exit(struct usb_interface *intf)
1055} 1080}
1056 1081
1057static struct usb_driver lme2510_driver = { 1082static struct usb_driver lme2510_driver = {
1058 .name = "LME2510C_DVBS", 1083 .name = "LME2510C_DVB-S",
1059 .probe = lme2510_probe, 1084 .probe = lme2510_probe,
1060 .disconnect = lme2510_exit, 1085 .disconnect = lme2510_exit,
1061 .id_table = lme2510_table, 1086 .id_table = lme2510_table,
@@ -1083,6 +1108,6 @@ module_init(lme2510_module_init);
1083module_exit(lme2510_module_exit); 1108module_exit(lme2510_module_exit);
1084 1109
1085MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); 1110MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1086MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0"); 1111MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1087MODULE_VERSION("1.60"); 1112MODULE_VERSION("1.74");
1088MODULE_LICENSE("GPL"); 1113MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c
index bdef1a18b664..da9dc91ce910 100644
--- a/drivers/media/dvb/dvb-usb/m920x.c
+++ b/drivers/media/dvb/dvb-usb/m920x.c
@@ -142,9 +142,9 @@ static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
142 if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_KEY, rc_state + 1, 1)) != 0) 142 if ((ret = m920x_read(d->udev, M9206_CORE, 0x0, M9206_RC_KEY, rc_state + 1, 1)) != 0)
143 goto unlock; 143 goto unlock;
144 144
145 for (i = 0; i < d->props.rc.legacy.rc_key_map_size; i++) 145 for (i = 0; i < d->props.rc.legacy.rc_map_size; i++)
146 if (rc5_data(&d->props.rc.legacy.rc_key_map[i]) == rc_state[1]) { 146 if (rc5_data(&d->props.rc.legacy.rc_map_table[i]) == rc_state[1]) {
147 *event = d->props.rc.legacy.rc_key_map[i].keycode; 147 *event = d->props.rc.legacy.rc_map_table[i].keycode;
148 148
149 switch(rc_state[0]) { 149 switch(rc_state[0]) {
150 case 0x80: 150 case 0x80:
@@ -589,7 +589,7 @@ static struct m920x_inits pinnacle310e_init[] = {
589}; 589};
590 590
591/* ir keymaps */ 591/* ir keymaps */
592static struct ir_scancode ir_codes_megasky_table[] = { 592static struct rc_map_table rc_map_megasky_table[] = {
593 { 0x0012, KEY_POWER }, 593 { 0x0012, KEY_POWER },
594 { 0x001e, KEY_CYCLEWINDOWS }, /* min/max */ 594 { 0x001e, KEY_CYCLEWINDOWS }, /* min/max */
595 { 0x0002, KEY_CHANNELUP }, 595 { 0x0002, KEY_CHANNELUP },
@@ -608,7 +608,7 @@ static struct ir_scancode ir_codes_megasky_table[] = {
608 { 0x000e, KEY_COFFEE }, /* "MTS" */ 608 { 0x000e, KEY_COFFEE }, /* "MTS" */
609}; 609};
610 610
611static struct ir_scancode ir_codes_tvwalkertwin_table[] = { 611static struct rc_map_table rc_map_tvwalkertwin_table[] = {
612 { 0x0001, KEY_ZOOM }, /* Full Screen */ 612 { 0x0001, KEY_ZOOM }, /* Full Screen */
613 { 0x0002, KEY_CAMERA }, /* snapshot */ 613 { 0x0002, KEY_CAMERA }, /* snapshot */
614 { 0x0003, KEY_MUTE }, 614 { 0x0003, KEY_MUTE },
@@ -628,7 +628,7 @@ static struct ir_scancode ir_codes_tvwalkertwin_table[] = {
628 { 0x001e, KEY_VOLUMEUP }, 628 { 0x001e, KEY_VOLUMEUP },
629}; 629};
630 630
631static struct ir_scancode ir_codes_pinnacle310e_table[] = { 631static struct rc_map_table rc_map_pinnacle310e_table[] = {
632 { 0x16, KEY_POWER }, 632 { 0x16, KEY_POWER },
633 { 0x17, KEY_FAVORITES }, 633 { 0x17, KEY_FAVORITES },
634 { 0x0f, KEY_TEXT }, 634 { 0x0f, KEY_TEXT },
@@ -786,8 +786,8 @@ static struct dvb_usb_device_properties megasky_properties = {
786 786
787 .rc.legacy = { 787 .rc.legacy = {
788 .rc_interval = 100, 788 .rc_interval = 100,
789 .rc_key_map = ir_codes_megasky_table, 789 .rc_map_table = rc_map_megasky_table,
790 .rc_key_map_size = ARRAY_SIZE(ir_codes_megasky_table), 790 .rc_map_size = ARRAY_SIZE(rc_map_megasky_table),
791 .rc_query = m920x_rc_query, 791 .rc_query = m920x_rc_query,
792 }, 792 },
793 793
@@ -889,8 +889,8 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
889 889
890 .rc.legacy = { 890 .rc.legacy = {
891 .rc_interval = 100, 891 .rc_interval = 100,
892 .rc_key_map = ir_codes_tvwalkertwin_table, 892 .rc_map_table = rc_map_tvwalkertwin_table,
893 .rc_key_map_size = ARRAY_SIZE(ir_codes_tvwalkertwin_table), 893 .rc_map_size = ARRAY_SIZE(rc_map_tvwalkertwin_table),
894 .rc_query = m920x_rc_query, 894 .rc_query = m920x_rc_query,
895 }, 895 },
896 896
@@ -998,8 +998,8 @@ static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
998 998
999 .rc.legacy = { 999 .rc.legacy = {
1000 .rc_interval = 100, 1000 .rc_interval = 100,
1001 .rc_key_map = ir_codes_pinnacle310e_table, 1001 .rc_map_table = rc_map_pinnacle310e_table,
1002 .rc_key_map_size = ARRAY_SIZE(ir_codes_pinnacle310e_table), 1002 .rc_map_size = ARRAY_SIZE(rc_map_pinnacle310e_table),
1003 .rc_query = m920x_rc_query, 1003 .rc_query = m920x_rc_query,
1004 }, 1004 },
1005 1005
diff --git a/drivers/media/dvb/dvb-usb/nova-t-usb2.c b/drivers/media/dvb/dvb-usb/nova-t-usb2.c
index 181f36a12e2a..9d3cd2de46fc 100644
--- a/drivers/media/dvb/dvb-usb/nova-t-usb2.c
+++ b/drivers/media/dvb/dvb-usb/nova-t-usb2.c
@@ -21,7 +21,7 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
21#define deb_ee(args...) dprintk(debug,0x02,args) 21#define deb_ee(args...) dprintk(debug,0x02,args)
22 22
23/* Hauppauge NOVA-T USB2 keys */ 23/* Hauppauge NOVA-T USB2 keys */
24static struct ir_scancode ir_codes_haupp_table[] = { 24static struct rc_map_table rc_map_haupp_table[] = {
25 { 0x1e00, KEY_0 }, 25 { 0x1e00, KEY_0 },
26 { 0x1e01, KEY_1 }, 26 { 0x1e01, KEY_1 },
27 { 0x1e02, KEY_2 }, 27 { 0x1e02, KEY_2 },
@@ -91,14 +91,14 @@ static int nova_t_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
91 91
92 deb_rc("raw key code 0x%02x, 0x%02x, 0x%02x to c: %02x d: %02x toggle: %d\n",key[1],key[2],key[3],custom,data,toggle); 92 deb_rc("raw key code 0x%02x, 0x%02x, 0x%02x to c: %02x d: %02x toggle: %d\n",key[1],key[2],key[3],custom,data,toggle);
93 93
94 for (i = 0; i < ARRAY_SIZE(ir_codes_haupp_table); i++) { 94 for (i = 0; i < ARRAY_SIZE(rc_map_haupp_table); i++) {
95 if (rc5_data(&ir_codes_haupp_table[i]) == data && 95 if (rc5_data(&rc_map_haupp_table[i]) == data &&
96 rc5_custom(&ir_codes_haupp_table[i]) == custom) { 96 rc5_custom(&rc_map_haupp_table[i]) == custom) {
97 97
98 deb_rc("c: %x, d: %x\n", rc5_data(&ir_codes_haupp_table[i]), 98 deb_rc("c: %x, d: %x\n", rc5_data(&rc_map_haupp_table[i]),
99 rc5_custom(&ir_codes_haupp_table[i])); 99 rc5_custom(&rc_map_haupp_table[i]));
100 100
101 *event = ir_codes_haupp_table[i].keycode; 101 *event = rc_map_haupp_table[i].keycode;
102 *state = REMOTE_KEY_PRESSED; 102 *state = REMOTE_KEY_PRESSED;
103 if (st->old_toggle == toggle) { 103 if (st->old_toggle == toggle) {
104 if (st->last_repeat_count++ < 2) 104 if (st->last_repeat_count++ < 2)
@@ -197,8 +197,8 @@ static struct dvb_usb_device_properties nova_t_properties = {
197 197
198 .rc.legacy = { 198 .rc.legacy = {
199 .rc_interval = 100, 199 .rc_interval = 100,
200 .rc_key_map = ir_codes_haupp_table, 200 .rc_map_table = rc_map_haupp_table,
201 .rc_key_map_size = ARRAY_SIZE(ir_codes_haupp_table), 201 .rc_map_size = ARRAY_SIZE(rc_map_haupp_table),
202 .rc_query = nova_t_rc_query, 202 .rc_query = nova_t_rc_query,
203 }, 203 },
204 204
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c
index f896337b4535..1f1b7d6980a5 100644
--- a/drivers/media/dvb/dvb-usb/opera1.c
+++ b/drivers/media/dvb/dvb-usb/opera1.c
@@ -35,7 +35,7 @@
35struct opera1_state { 35struct opera1_state {
36 u32 last_key_pressed; 36 u32 last_key_pressed;
37}; 37};
38struct ir_codes_opera_table { 38struct rc_map_opera_table {
39 u32 keycode; 39 u32 keycode;
40 u32 event; 40 u32 event;
41}; 41};
@@ -331,7 +331,7 @@ static int opera1_pid_filter_control(struct dvb_usb_adapter *adap, int onoff)
331 return 0; 331 return 0;
332} 332}
333 333
334static struct ir_scancode ir_codes_opera1_table[] = { 334static struct rc_map_table rc_map_opera1_table[] = {
335 {0x5fa0, KEY_1}, 335 {0x5fa0, KEY_1},
336 {0x51af, KEY_2}, 336 {0x51af, KEY_2},
337 {0x5da2, KEY_3}, 337 {0x5da2, KEY_3},
@@ -404,12 +404,12 @@ static int opera1_rc_query(struct dvb_usb_device *dev, u32 * event, int *state)
404 404
405 send_key = (send_key & 0xffff) | 0x0100; 405 send_key = (send_key & 0xffff) | 0x0100;
406 406
407 for (i = 0; i < ARRAY_SIZE(ir_codes_opera1_table); i++) { 407 for (i = 0; i < ARRAY_SIZE(rc_map_opera1_table); i++) {
408 if (rc5_scan(&ir_codes_opera1_table[i]) == (send_key & 0xffff)) { 408 if (rc5_scan(&rc_map_opera1_table[i]) == (send_key & 0xffff)) {
409 *state = REMOTE_KEY_PRESSED; 409 *state = REMOTE_KEY_PRESSED;
410 *event = ir_codes_opera1_table[i].keycode; 410 *event = rc_map_opera1_table[i].keycode;
411 opst->last_key_pressed = 411 opst->last_key_pressed =
412 ir_codes_opera1_table[i].keycode; 412 rc_map_opera1_table[i].keycode;
413 break; 413 break;
414 } 414 }
415 opst->last_key_pressed = 0; 415 opst->last_key_pressed = 0;
@@ -497,8 +497,8 @@ static struct dvb_usb_device_properties opera1_properties = {
497 .i2c_algo = &opera1_i2c_algo, 497 .i2c_algo = &opera1_i2c_algo,
498 498
499 .rc.legacy = { 499 .rc.legacy = {
500 .rc_key_map = ir_codes_opera1_table, 500 .rc_map_table = rc_map_opera1_table,
501 .rc_key_map_size = ARRAY_SIZE(ir_codes_opera1_table), 501 .rc_map_size = ARRAY_SIZE(rc_map_opera1_table),
502 .rc_interval = 200, 502 .rc_interval = 200,
503 .rc_query = opera1_rc_query, 503 .rc_query = opera1_rc_query,
504 }, 504 },
diff --git a/drivers/media/dvb/dvb-usb/ttusb2.c b/drivers/media/dvb/dvb-usb/ttusb2.c
index a6de489a6a39..0d4709ff9cbb 100644
--- a/drivers/media/dvb/dvb-usb/ttusb2.c
+++ b/drivers/media/dvb/dvb-usb/ttusb2.c
@@ -43,6 +43,7 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
43 43
44struct ttusb2_state { 44struct ttusb2_state {
45 u8 id; 45 u8 id;
46 u16 last_rc_key;
46}; 47};
47 48
48static int ttusb2_msg(struct dvb_usb_device *d, u8 cmd, 49static int ttusb2_msg(struct dvb_usb_device *d, u8 cmd,
@@ -128,6 +129,33 @@ static struct i2c_algorithm ttusb2_i2c_algo = {
128 .functionality = ttusb2_i2c_func, 129 .functionality = ttusb2_i2c_func,
129}; 130};
130 131
132/* command to poll IR receiver (copied from pctv452e.c) */
133#define CMD_GET_IR_CODE 0x1b
134
135/* IR */
136static int tt3650_rc_query(struct dvb_usb_device *d)
137{
138 int ret;
139 u8 rx[9]; /* A CMD_GET_IR_CODE reply is 9 bytes long */
140 struct ttusb2_state *st = d->priv;
141 ret = ttusb2_msg(d, CMD_GET_IR_CODE, NULL, 0, rx, sizeof(rx));
142 if (ret != 0)
143 return ret;
144
145 if (rx[8] & 0x01) {
146 /* got a "press" event */
147 st->last_rc_key = (rx[3] << 8) | rx[2];
148 deb_info("%s: cmd=0x%02x sys=0x%02x\n", __func__, rx[2], rx[3]);
149 rc_keydown(d->rc_dev, st->last_rc_key, 0);
150 } else if (st->last_rc_key) {
151 rc_keyup(d->rc_dev);
152 st->last_rc_key = 0;
153 }
154
155 return 0;
156}
157
158
131/* Callbacks for DVB USB */ 159/* Callbacks for DVB USB */
132static int ttusb2_identify_state (struct usb_device *udev, struct 160static int ttusb2_identify_state (struct usb_device *udev, struct
133 dvb_usb_device_properties *props, struct dvb_usb_device_description **desc, 161 dvb_usb_device_properties *props, struct dvb_usb_device_description **desc,
@@ -345,6 +373,13 @@ static struct dvb_usb_device_properties ttusb2_properties_ct3650 = {
345 373
346 .size_of_priv = sizeof(struct ttusb2_state), 374 .size_of_priv = sizeof(struct ttusb2_state),
347 375
376 .rc.core = {
377 .rc_interval = 150, /* Less than IR_KEYPRESS_TIMEOUT */
378 .rc_codes = RC_MAP_TT_1500,
379 .rc_query = tt3650_rc_query,
380 .allowed_protos = RC_TYPE_UNKNOWN,
381 },
382
348 .num_adapters = 1, 383 .num_adapters = 1,
349 .adapter = { 384 .adapter = {
350 { 385 {
diff --git a/drivers/media/dvb/dvb-usb/vp702x.c b/drivers/media/dvb/dvb-usb/vp702x.c
index 5c9f3275aaa0..7890e75600df 100644
--- a/drivers/media/dvb/dvb-usb/vp702x.c
+++ b/drivers/media/dvb/dvb-usb/vp702x.c
@@ -174,7 +174,7 @@ static int vp702x_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
174} 174}
175 175
176/* keys for the enclosed remote control */ 176/* keys for the enclosed remote control */
177static struct ir_scancode ir_codes_vp702x_table[] = { 177static struct rc_map_table rc_map_vp702x_table[] = {
178 { 0x0001, KEY_1 }, 178 { 0x0001, KEY_1 },
179 { 0x0002, KEY_2 }, 179 { 0x0002, KEY_2 },
180}; 180};
@@ -197,10 +197,10 @@ static int vp702x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
197 return 0; 197 return 0;
198 } 198 }
199 199
200 for (i = 0; i < ARRAY_SIZE(ir_codes_vp702x_table); i++) 200 for (i = 0; i < ARRAY_SIZE(rc_map_vp702x_table); i++)
201 if (rc5_custom(&ir_codes_vp702x_table[i]) == key[1]) { 201 if (rc5_custom(&rc_map_vp702x_table[i]) == key[1]) {
202 *state = REMOTE_KEY_PRESSED; 202 *state = REMOTE_KEY_PRESSED;
203 *event = ir_codes_vp702x_table[i].keycode; 203 *event = rc_map_vp702x_table[i].keycode;
204 break; 204 break;
205 } 205 }
206 return 0; 206 return 0;
@@ -284,8 +284,8 @@ static struct dvb_usb_device_properties vp702x_properties = {
284 .read_mac_address = vp702x_read_mac_addr, 284 .read_mac_address = vp702x_read_mac_addr,
285 285
286 .rc.legacy = { 286 .rc.legacy = {
287 .rc_key_map = ir_codes_vp702x_table, 287 .rc_map_table = rc_map_vp702x_table,
288 .rc_key_map_size = ARRAY_SIZE(ir_codes_vp702x_table), 288 .rc_map_size = ARRAY_SIZE(rc_map_vp702x_table),
289 .rc_interval = 400, 289 .rc_interval = 400,
290 .rc_query = vp702x_rc_query, 290 .rc_query = vp702x_rc_query,
291 }, 291 },
diff --git a/drivers/media/dvb/dvb-usb/vp7045.c b/drivers/media/dvb/dvb-usb/vp7045.c
index f13791ca5994..ab0ab3c35e80 100644
--- a/drivers/media/dvb/dvb-usb/vp7045.c
+++ b/drivers/media/dvb/dvb-usb/vp7045.c
@@ -99,7 +99,7 @@ static int vp7045_power_ctrl(struct dvb_usb_device *d, int onoff)
99 99
100/* The keymapping struct. Somehow this should be loaded to the driver, but 100/* The keymapping struct. Somehow this should be loaded to the driver, but
101 * currently it is hardcoded. */ 101 * currently it is hardcoded. */
102static struct ir_scancode ir_codes_vp7045_table[] = { 102static struct rc_map_table rc_map_vp7045_table[] = {
103 { 0x0016, KEY_POWER }, 103 { 0x0016, KEY_POWER },
104 { 0x0010, KEY_MUTE }, 104 { 0x0010, KEY_MUTE },
105 { 0x0003, KEY_1 }, 105 { 0x0003, KEY_1 },
@@ -165,10 +165,10 @@ static int vp7045_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
165 return 0; 165 return 0;
166 } 166 }
167 167
168 for (i = 0; i < ARRAY_SIZE(ir_codes_vp7045_table); i++) 168 for (i = 0; i < ARRAY_SIZE(rc_map_vp7045_table); i++)
169 if (rc5_data(&ir_codes_vp7045_table[i]) == key) { 169 if (rc5_data(&rc_map_vp7045_table[i]) == key) {
170 *state = REMOTE_KEY_PRESSED; 170 *state = REMOTE_KEY_PRESSED;
171 *event = ir_codes_vp7045_table[i].keycode; 171 *event = rc_map_vp7045_table[i].keycode;
172 break; 172 break;
173 } 173 }
174 return 0; 174 return 0;
@@ -261,8 +261,8 @@ static struct dvb_usb_device_properties vp7045_properties = {
261 261
262 .rc.legacy = { 262 .rc.legacy = {
263 .rc_interval = 400, 263 .rc_interval = 400,
264 .rc_key_map = ir_codes_vp7045_table, 264 .rc_map_table = rc_map_vp7045_table,
265 .rc_key_map_size = ARRAY_SIZE(ir_codes_vp7045_table), 265 .rc_map_size = ARRAY_SIZE(rc_map_vp7045_table),
266 .rc_query = vp7045_rc_query, 266 .rc_query = vp7045_rc_query,
267 }, 267 },
268 268
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index 96b27016670e..ef3e43a03199 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -497,7 +497,7 @@ comment "ISDB-T (terrestrial) frontends"
497 depends on DVB_CORE 497 depends on DVB_CORE
498 498
499config DVB_S921 499config DVB_S921
500 tristate "Sharp S921 tuner" 500 tristate "Sharp S921 frontend"
501 depends on DVB_CORE && I2C 501 depends on DVB_CORE && I2C
502 default m if DVB_FE_CUSTOMISE 502 default m if DVB_FE_CUSTOMISE
503 help 503 help
@@ -512,6 +512,14 @@ config DVB_DIB8000
512 A driver for DiBcom's DiB8000 ISDB-T/ISDB-Tsb demodulator. 512 A driver for DiBcom's DiB8000 ISDB-T/ISDB-Tsb demodulator.
513 Say Y when you want to support this frontend. 513 Say Y when you want to support this frontend.
514 514
515config DVB_MB86A20S
516 tristate "Fujitsu mb86a20s"
517 depends on DVB_CORE && I2C
518 default m if DVB_FE_CUSTOMISE
519 help
520 A driver for Fujitsu mb86a20s ISDB-T/ISDB-Tsb demodulator.
521 Say Y when you want to support this frontend.
522
515comment "Digital terrestrial only tuners/PLL" 523comment "Digital terrestrial only tuners/PLL"
516 depends on DVB_CORE 524 depends on DVB_CORE
517 525
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
index 9a31985c0dfb..b1d9525aa7e3 100644
--- a/drivers/media/dvb/frontends/Makefile
+++ b/drivers/media/dvb/frontends/Makefile
@@ -5,7 +5,6 @@
5EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ 5EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/
6EXTRA_CFLAGS += -Idrivers/media/common/tuners/ 6EXTRA_CFLAGS += -Idrivers/media/common/tuners/
7 7
8s921-objs := s921_module.o s921_core.o
9stb0899-objs = stb0899_drv.o stb0899_algo.o 8stb0899-objs = stb0899_drv.o stb0899_algo.o
10stv0900-objs = stv0900_core.o stv0900_sw.o 9stv0900-objs = stv0900_core.o stv0900_sw.o
11au8522-objs = au8522_dig.o au8522_decoder.o 10au8522-objs = au8522_dig.o au8522_decoder.o
@@ -82,4 +81,5 @@ obj-$(CONFIG_DVB_ISL6423) += isl6423.o
82obj-$(CONFIG_DVB_EC100) += ec100.o 81obj-$(CONFIG_DVB_EC100) += ec100.o
83obj-$(CONFIG_DVB_DS3000) += ds3000.o 82obj-$(CONFIG_DVB_DS3000) += ds3000.o
84obj-$(CONFIG_DVB_MB86A16) += mb86a16.o 83obj-$(CONFIG_DVB_MB86A16) += mb86a16.o
84obj-$(CONFIG_DVB_MB86A20S) += mb86a20s.o
85obj-$(CONFIG_DVB_IX2505V) += ix2505v.o 85obj-$(CONFIG_DVB_IX2505V) += ix2505v.o
diff --git a/drivers/media/dvb/frontends/af9013.c b/drivers/media/dvb/frontends/af9013.c
index e2a95c07bab4..ce222055526d 100644
--- a/drivers/media/dvb/frontends/af9013.c
+++ b/drivers/media/dvb/frontends/af9013.c
@@ -964,7 +964,7 @@ error:
964static int af9013_update_signal_strength(struct dvb_frontend *fe) 964static int af9013_update_signal_strength(struct dvb_frontend *fe)
965{ 965{
966 struct af9013_state *state = fe->demodulator_priv; 966 struct af9013_state *state = fe->demodulator_priv;
967 int ret; 967 int ret = 0;
968 u8 rf_gain, if_gain; 968 u8 rf_gain, if_gain;
969 int signal_strength; 969 int signal_strength;
970 970
diff --git a/drivers/media/dvb/frontends/atbm8830.c b/drivers/media/dvb/frontends/atbm8830.c
index 43aac2f85c2e..1539ea1f81ac 100644
--- a/drivers/media/dvb/frontends/atbm8830.c
+++ b/drivers/media/dvb/frontends/atbm8830.c
@@ -50,8 +50,7 @@ static int atbm8830_write_reg(struct atbm_state *priv, u16 reg, u8 data)
50 msg2.addr = dev_addr; 50 msg2.addr = dev_addr;
51 51
52 if (debug >= 2) 52 if (debug >= 2)
53 printk(KERN_DEBUG "%s: reg=0x%04X, data=0x%02X\n", 53 dprintk("%s: reg=0x%04X, data=0x%02X\n", __func__, reg, data);
54 __func__, reg, data);
55 54
56 ret = i2c_transfer(priv->i2c, &msg1, 1); 55 ret = i2c_transfer(priv->i2c, &msg1, 1);
57 if (ret != 1) 56 if (ret != 1)
@@ -77,8 +76,7 @@ static int atbm8830_read_reg(struct atbm_state *priv, u16 reg, u8 *p_data)
77 76
78 ret = i2c_transfer(priv->i2c, &msg1, 1); 77 ret = i2c_transfer(priv->i2c, &msg1, 1);
79 if (ret != 1) { 78 if (ret != 1) {
80 dprintk(KERN_DEBUG "%s: error reg=0x%04x, ret=%i\n", 79 dprintk("%s: error reg=0x%04x, ret=%i\n", __func__, reg, ret);
81 __func__, reg, ret);
82 return -EIO; 80 return -EIO;
83 } 81 }
84 82
@@ -88,7 +86,7 @@ static int atbm8830_read_reg(struct atbm_state *priv, u16 reg, u8 *p_data)
88 86
89 *p_data = buf2[0]; 87 *p_data = buf2[0];
90 if (debug >= 2) 88 if (debug >= 2)
91 printk(KERN_DEBUG "%s: reg=0x%04X, data=0x%02X\n", 89 dprintk("%s: reg=0x%04X, data=0x%02X\n",
92 __func__, reg, buf2[0]); 90 __func__, reg, buf2[0]);
93 91
94 return 0; 92 return 0;
diff --git a/drivers/media/dvb/frontends/au8522_decoder.c b/drivers/media/dvb/frontends/au8522_decoder.c
index 6d9c5943eb3d..b537891a4cc9 100644
--- a/drivers/media/dvb/frontends/au8522_decoder.c
+++ b/drivers/media/dvb/frontends/au8522_decoder.c
@@ -278,10 +278,18 @@ static void setup_decoder_defaults(struct au8522_state *state, u8 input_mode)
278 AU8522_TVDEC_COMB_HDIF_THR2_REG06AH_CVBS); 278 AU8522_TVDEC_COMB_HDIF_THR2_REG06AH_CVBS);
279 au8522_writereg(state, AU8522_TVDEC_COMB_HDIF_THR3_REG06BH, 279 au8522_writereg(state, AU8522_TVDEC_COMB_HDIF_THR3_REG06BH,
280 AU8522_TVDEC_COMB_HDIF_THR3_REG06BH_CVBS); 280 AU8522_TVDEC_COMB_HDIF_THR3_REG06BH_CVBS);
281 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH, 281 if (input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 ||
282 AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH_CVBS); 282 input_mode == AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24) {
283 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH, 283 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH,
284 AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH_CVBS); 284 AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH_SVIDEO);
285 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH,
286 AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH_SVIDEO);
287 } else {
288 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH,
289 AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH_CVBS);
290 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH,
291 AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH_CVBS);
292 }
285 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH, 293 au8522_writereg(state, AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH,
286 AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH_CVBS); 294 AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH_CVBS);
287 au8522_writereg(state, AU8522_TVDEC_UV_SEP_THR_REG06FH, 295 au8522_writereg(state, AU8522_TVDEC_UV_SEP_THR_REG06FH,
@@ -347,9 +355,11 @@ static void au8522_setup_cvbs_mode(struct au8522_state *state)
347 au8522_writereg(state, AU8522_MODULE_CLOCK_CONTROL_REG0A3H, 355 au8522_writereg(state, AU8522_MODULE_CLOCK_CONTROL_REG0A3H,
348 AU8522_MODULE_CLOCK_CONTROL_REG0A3H_CVBS); 356 AU8522_MODULE_CLOCK_CONTROL_REG0A3H_CVBS);
349 357
358 /* PGA in automatic mode */
350 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x00); 359 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x00);
351 au8522_writereg(state, AU8522_CLAMPING_CONTROL_REG083H, 0x0e); 360
352 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x10); 361 /* Enable clamping control */
362 au8522_writereg(state, AU8522_CLAMPING_CONTROL_REG083H, 0x00);
353 363
354 au8522_writereg(state, AU8522_INPUT_CONTROL_REG081H, 364 au8522_writereg(state, AU8522_INPUT_CONTROL_REG081H,
355 AU8522_INPUT_CONTROL_REG081H_CVBS_CH1); 365 AU8522_INPUT_CONTROL_REG081H_CVBS_CH1);
@@ -366,14 +376,14 @@ static void au8522_setup_cvbs_tuner_mode(struct au8522_state *state)
366 au8522_writereg(state, AU8522_MODULE_CLOCK_CONTROL_REG0A3H, 376 au8522_writereg(state, AU8522_MODULE_CLOCK_CONTROL_REG0A3H,
367 AU8522_MODULE_CLOCK_CONTROL_REG0A3H_CVBS); 377 AU8522_MODULE_CLOCK_CONTROL_REG0A3H_CVBS);
368 378
369 /* It's not clear why they turn off the PGA before enabling the clamp 379 /* It's not clear why we have to have the PGA in automatic mode while
370 control, but the Windows trace does it so we will too... */ 380 enabling clamp control, but it's what Windows does */
371 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x00); 381 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x00);
372 382
373 /* Enable clamping control */ 383 /* Enable clamping control */
374 au8522_writereg(state, AU8522_CLAMPING_CONTROL_REG083H, 0x0e); 384 au8522_writereg(state, AU8522_CLAMPING_CONTROL_REG083H, 0x0e);
375 385
376 /* Turn on the PGA */ 386 /* Disable automatic PGA (since the CVBS is coming from the tuner) */
377 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x10); 387 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x10);
378 388
379 /* Set input mode to CVBS on channel 4 with SIF audio input enabled */ 389 /* Set input mode to CVBS on channel 4 with SIF audio input enabled */
@@ -396,7 +406,10 @@ static void au8522_setup_svideo_mode(struct au8522_state *state)
396 au8522_writereg(state, AU8522_INPUT_CONTROL_REG081H, 406 au8522_writereg(state, AU8522_INPUT_CONTROL_REG081H,
397 AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13); 407 AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13);
398 408
399 /* Disable clamping control (required for S-video) */ 409 /* PGA in automatic mode */
410 au8522_writereg(state, AU8522_PGA_CONTROL_REG082H, 0x00);
411
412 /* Enable clamping control */
400 au8522_writereg(state, AU8522_CLAMPING_CONTROL_REG083H, 0x00); 413 au8522_writereg(state, AU8522_CLAMPING_CONTROL_REG083H, 0x00);
401 414
402 setup_decoder_defaults(state, 415 setup_decoder_defaults(state,
@@ -410,29 +423,15 @@ static void au8522_setup_svideo_mode(struct au8522_state *state)
410 423
411static void disable_audio_input(struct au8522_state *state) 424static void disable_audio_input(struct au8522_state *state)
412{ 425{
413 /* This can probably be optimized */
414 au8522_writereg(state, AU8522_AUDIO_VOLUME_L_REG0F2H, 0x00); 426 au8522_writereg(state, AU8522_AUDIO_VOLUME_L_REG0F2H, 0x00);
415 au8522_writereg(state, AU8522_AUDIO_VOLUME_R_REG0F3H, 0x00); 427 au8522_writereg(state, AU8522_AUDIO_VOLUME_R_REG0F3H, 0x00);
416 au8522_writereg(state, AU8522_AUDIO_VOLUME_REG0F4H, 0x00); 428 au8522_writereg(state, AU8522_AUDIO_VOLUME_REG0F4H, 0x00);
417 au8522_writereg(state, AU8522_I2C_CONTROL_REG1_REG091H, 0x80);
418 au8522_writereg(state, AU8522_I2C_CONTROL_REG0_REG090H, 0x84);
419
420 au8522_writereg(state, AU8522_ENA_USB_REG101H, 0x00);
421 au8522_writereg(state, AU8522_AUDIO_VOLUME_L_REG0F2H, 0x7F);
422 au8522_writereg(state, AU8522_AUDIO_VOLUME_R_REG0F3H, 0x7F);
423 au8522_writereg(state, AU8522_REG0F9H, AU8522_REG0F9H_AUDIO);
424 au8522_writereg(state, AU8522_AUDIO_MODE_REG0F1H, 0x40);
425
426 au8522_writereg(state, AU8522_GPIO_DATA_REG0E2H, 0x11);
427 msleep(5);
428 au8522_writereg(state, AU8522_GPIO_DATA_REG0E2H, 0x00);
429 429
430 au8522_writereg(state, AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H, 0x04); 430 au8522_writereg(state, AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H, 0x04);
431 au8522_writereg(state, AU8522_AUDIOFREQ_REG606H, 0x03);
432 au8522_writereg(state, AU8522_I2S_CTRL_2_REG112H, 0x02); 431 au8522_writereg(state, AU8522_I2S_CTRL_2_REG112H, 0x02);
433 432
434 au8522_writereg(state, AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H, 433 au8522_writereg(state, AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H,
435 AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_CVBS); 434 AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_SVIDEO);
436} 435}
437 436
438/* 0=disable, 1=SIF */ 437/* 0=disable, 1=SIF */
@@ -622,7 +621,7 @@ static int au8522_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc)
622 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 621 return v4l2_ctrl_query_fill(qc, 0, 255, 1,
623 AU8522_TVDEC_CONTRAST_REG00BH_CVBS); 622 AU8522_TVDEC_CONTRAST_REG00BH_CVBS);
624 case V4L2_CID_BRIGHTNESS: 623 case V4L2_CID_BRIGHTNESS:
625 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); 624 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 109);
626 case V4L2_CID_SATURATION: 625 case V4L2_CID_SATURATION:
627 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128); 626 return v4l2_ctrl_query_fill(qc, 0, 255, 1, 128);
628 case V4L2_CID_HUE: 627 case V4L2_CID_HUE:
diff --git a/drivers/media/dvb/frontends/au8522_priv.h b/drivers/media/dvb/frontends/au8522_priv.h
index 609cf04bc312..751e17d692a9 100644
--- a/drivers/media/dvb/frontends/au8522_priv.h
+++ b/drivers/media/dvb/frontends/au8522_priv.h
@@ -397,7 +397,9 @@ void au8522_release_state(struct au8522_state *state);
397#define AU8522_TVDEC_COMB_HDIF_THR2_REG06AH_CVBS 0x0A 397#define AU8522_TVDEC_COMB_HDIF_THR2_REG06AH_CVBS 0x0A
398#define AU8522_TVDEC_COMB_HDIF_THR3_REG06BH_CVBS 0x32 398#define AU8522_TVDEC_COMB_HDIF_THR3_REG06BH_CVBS 0x32
399#define AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH_CVBS 0x34 399#define AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH_CVBS 0x34
400#define AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH_SVIDEO 0x2a
400#define AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH_CVBS 0x05 401#define AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH_CVBS 0x05
402#define AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH_SVIDEO 0x15
401#define AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH_CVBS 0x6E 403#define AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH_CVBS 0x6E
402#define AU8522_TVDEC_UV_SEP_THR_REG06FH_CVBS 0x0F 404#define AU8522_TVDEC_UV_SEP_THR_REG06FH_CVBS 0x0F
403#define AU8522_TVDEC_COMB_DC_THR1_NTSC_REG070H_CVBS 0x80 405#define AU8522_TVDEC_COMB_DC_THR1_NTSC_REG070H_CVBS 0x80
diff --git a/drivers/media/dvb/frontends/dib7000m.c b/drivers/media/dvb/frontends/dib7000m.c
index 0f09fd31cb29..c7f5ccf54aa5 100644
--- a/drivers/media/dvb/frontends/dib7000m.c
+++ b/drivers/media/dvb/frontends/dib7000m.c
@@ -805,7 +805,7 @@ static void dib7000m_set_channel(struct dib7000m_state *state, struct dvb_fronte
805 value = 0; 805 value = 0;
806 switch (ch->u.ofdm.transmission_mode) { 806 switch (ch->u.ofdm.transmission_mode) {
807 case TRANSMISSION_MODE_2K: value |= (0 << 7); break; 807 case TRANSMISSION_MODE_2K: value |= (0 << 7); break;
808 case /* 4K MODE */ 255: value |= (2 << 7); break; 808 case TRANSMISSION_MODE_4K: value |= (2 << 7); break;
809 default: 809 default:
810 case TRANSMISSION_MODE_8K: value |= (1 << 7); break; 810 case TRANSMISSION_MODE_8K: value |= (1 << 7); break;
811 } 811 }
@@ -866,7 +866,7 @@ static void dib7000m_set_channel(struct dib7000m_state *state, struct dvb_fronte
866 /* P_dvsy_sync_wait */ 866 /* P_dvsy_sync_wait */
867 switch (ch->u.ofdm.transmission_mode) { 867 switch (ch->u.ofdm.transmission_mode) {
868 case TRANSMISSION_MODE_8K: value = 256; break; 868 case TRANSMISSION_MODE_8K: value = 256; break;
869 case /* 4K MODE */ 255: value = 128; break; 869 case TRANSMISSION_MODE_4K: value = 128; break;
870 case TRANSMISSION_MODE_2K: 870 case TRANSMISSION_MODE_2K:
871 default: value = 64; break; 871 default: value = 64; break;
872 } 872 }
@@ -1020,7 +1020,7 @@ static int dib7000m_tune(struct dvb_frontend *demod, struct dvb_frontend_paramet
1020 value = (6 << 8) | 0x80; 1020 value = (6 << 8) | 0x80;
1021 switch (ch->u.ofdm.transmission_mode) { 1021 switch (ch->u.ofdm.transmission_mode) {
1022 case TRANSMISSION_MODE_2K: value |= (7 << 12); break; 1022 case TRANSMISSION_MODE_2K: value |= (7 << 12); break;
1023 case /* 4K MODE */ 255: value |= (8 << 12); break; 1023 case TRANSMISSION_MODE_4K: value |= (8 << 12); break;
1024 default: 1024 default:
1025 case TRANSMISSION_MODE_8K: value |= (9 << 12); break; 1025 case TRANSMISSION_MODE_8K: value |= (9 << 12); break;
1026 } 1026 }
@@ -1030,7 +1030,7 @@ static int dib7000m_tune(struct dvb_frontend *demod, struct dvb_frontend_paramet
1030 value = (0 << 4); 1030 value = (0 << 4);
1031 switch (ch->u.ofdm.transmission_mode) { 1031 switch (ch->u.ofdm.transmission_mode) {
1032 case TRANSMISSION_MODE_2K: value |= 0x6; break; 1032 case TRANSMISSION_MODE_2K: value |= 0x6; break;
1033 case /* 4K MODE */ 255: value |= 0x7; break; 1033 case TRANSMISSION_MODE_4K: value |= 0x7; break;
1034 default: 1034 default:
1035 case TRANSMISSION_MODE_8K: value |= 0x8; break; 1035 case TRANSMISSION_MODE_8K: value |= 0x8; break;
1036 } 1036 }
@@ -1040,7 +1040,7 @@ static int dib7000m_tune(struct dvb_frontend *demod, struct dvb_frontend_paramet
1040 value = (0 << 4); 1040 value = (0 << 4);
1041 switch (ch->u.ofdm.transmission_mode) { 1041 switch (ch->u.ofdm.transmission_mode) {
1042 case TRANSMISSION_MODE_2K: value |= 0x6; break; 1042 case TRANSMISSION_MODE_2K: value |= 0x6; break;
1043 case /* 4K MODE */ 255: value |= 0x7; break; 1043 case TRANSMISSION_MODE_4K: value |= 0x7; break;
1044 default: 1044 default:
1045 case TRANSMISSION_MODE_8K: value |= 0x8; break; 1045 case TRANSMISSION_MODE_8K: value |= 0x8; break;
1046 } 1046 }
diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c
index 3aed0d433921..6aa02cb80733 100644
--- a/drivers/media/dvb/frontends/dib7000p.c
+++ b/drivers/media/dvb/frontends/dib7000p.c
@@ -717,7 +717,7 @@ static void dib7000p_set_channel(struct dib7000p_state *state, struct dvb_fronte
717 value = 0; 717 value = 0;
718 switch (ch->u.ofdm.transmission_mode) { 718 switch (ch->u.ofdm.transmission_mode) {
719 case TRANSMISSION_MODE_2K: value |= (0 << 7); break; 719 case TRANSMISSION_MODE_2K: value |= (0 << 7); break;
720 case /* 4K MODE */ 255: value |= (2 << 7); break; 720 case TRANSMISSION_MODE_4K: value |= (2 << 7); break;
721 default: 721 default:
722 case TRANSMISSION_MODE_8K: value |= (1 << 7); break; 722 case TRANSMISSION_MODE_8K: value |= (1 << 7); break;
723 } 723 }
@@ -770,7 +770,7 @@ static void dib7000p_set_channel(struct dib7000p_state *state, struct dvb_fronte
770 /* P_dvsy_sync_wait */ 770 /* P_dvsy_sync_wait */
771 switch (ch->u.ofdm.transmission_mode) { 771 switch (ch->u.ofdm.transmission_mode) {
772 case TRANSMISSION_MODE_8K: value = 256; break; 772 case TRANSMISSION_MODE_8K: value = 256; break;
773 case /* 4K MODE */ 255: value = 128; break; 773 case TRANSMISSION_MODE_4K: value = 128; break;
774 case TRANSMISSION_MODE_2K: 774 case TRANSMISSION_MODE_2K:
775 default: value = 64; break; 775 default: value = 64; break;
776 } 776 }
@@ -994,7 +994,7 @@ static int dib7000p_tune(struct dvb_frontend *demod, struct dvb_frontend_paramet
994 tmp = (6 << 8) | 0x80; 994 tmp = (6 << 8) | 0x80;
995 switch (ch->u.ofdm.transmission_mode) { 995 switch (ch->u.ofdm.transmission_mode) {
996 case TRANSMISSION_MODE_2K: tmp |= (7 << 12); break; 996 case TRANSMISSION_MODE_2K: tmp |= (7 << 12); break;
997 case /* 4K MODE */ 255: tmp |= (8 << 12); break; 997 case TRANSMISSION_MODE_4K: tmp |= (8 << 12); break;
998 default: 998 default:
999 case TRANSMISSION_MODE_8K: tmp |= (9 << 12); break; 999 case TRANSMISSION_MODE_8K: tmp |= (9 << 12); break;
1000 } 1000 }
@@ -1004,7 +1004,7 @@ static int dib7000p_tune(struct dvb_frontend *demod, struct dvb_frontend_paramet
1004 tmp = (0 << 4); 1004 tmp = (0 << 4);
1005 switch (ch->u.ofdm.transmission_mode) { 1005 switch (ch->u.ofdm.transmission_mode) {
1006 case TRANSMISSION_MODE_2K: tmp |= 0x6; break; 1006 case TRANSMISSION_MODE_2K: tmp |= 0x6; break;
1007 case /* 4K MODE */ 255: tmp |= 0x7; break; 1007 case TRANSMISSION_MODE_4K: tmp |= 0x7; break;
1008 default: 1008 default:
1009 case TRANSMISSION_MODE_8K: tmp |= 0x8; break; 1009 case TRANSMISSION_MODE_8K: tmp |= 0x8; break;
1010 } 1010 }
@@ -1014,7 +1014,7 @@ static int dib7000p_tune(struct dvb_frontend *demod, struct dvb_frontend_paramet
1014 tmp = (0 << 4); 1014 tmp = (0 << 4);
1015 switch (ch->u.ofdm.transmission_mode) { 1015 switch (ch->u.ofdm.transmission_mode) {
1016 case TRANSMISSION_MODE_2K: tmp |= 0x6; break; 1016 case TRANSMISSION_MODE_2K: tmp |= 0x6; break;
1017 case /* 4K MODE */ 255: tmp |= 0x7; break; 1017 case TRANSMISSION_MODE_4K: tmp |= 0x7; break;
1018 default: 1018 default:
1019 case TRANSMISSION_MODE_8K: tmp |= 0x8; break; 1019 case TRANSMISSION_MODE_8K: tmp |= 0x8; break;
1020 } 1020 }
diff --git a/drivers/media/dvb/frontends/ix2505v.c b/drivers/media/dvb/frontends/ix2505v.c
index 55f2eba7bc96..6360c681ded9 100644
--- a/drivers/media/dvb/frontends/ix2505v.c
+++ b/drivers/media/dvb/frontends/ix2505v.c
@@ -72,7 +72,7 @@ static int ix2505v_read_status_reg(struct ix2505v_state *state)
72 ret = i2c_transfer(state->i2c, msg, 1); 72 ret = i2c_transfer(state->i2c, msg, 1);
73 deb_i2c("Read %s ", __func__); 73 deb_i2c("Read %s ", __func__);
74 74
75 return (ret = 1) ? (int) b2[0] : -1; 75 return (ret == 1) ? (int) b2[0] : -1;
76} 76}
77 77
78static int ix2505v_write(struct ix2505v_state *state, u8 buf[], u8 count) 78static int ix2505v_write(struct ix2505v_state *state, u8 buf[], u8 count)
diff --git a/drivers/media/dvb/frontends/lgs8gxx.c b/drivers/media/dvb/frontends/lgs8gxx.c
index 0fcddc4569d2..1172b54689f8 100644
--- a/drivers/media/dvb/frontends/lgs8gxx.c
+++ b/drivers/media/dvb/frontends/lgs8gxx.c
@@ -60,13 +60,12 @@ static int lgs8gxx_write_reg(struct lgs8gxx_state *priv, u8 reg, u8 data)
60 msg.addr += 0x02; 60 msg.addr += 0x02;
61 61
62 if (debug >= 2) 62 if (debug >= 2)
63 printk(KERN_DEBUG "%s: reg=0x%02X, data=0x%02X\n", 63 dprintk("%s: reg=0x%02X, data=0x%02X\n", __func__, reg, data);
64 __func__, reg, data);
65 64
66 ret = i2c_transfer(priv->i2c, &msg, 1); 65 ret = i2c_transfer(priv->i2c, &msg, 1);
67 66
68 if (ret != 1) 67 if (ret != 1)
69 dprintk(KERN_DEBUG "%s: error reg=0x%x, data=0x%x, ret=%i\n", 68 dprintk("%s: error reg=0x%x, data=0x%x, ret=%i\n",
70 __func__, reg, data, ret); 69 __func__, reg, data, ret);
71 70
72 return (ret != 1) ? -1 : 0; 71 return (ret != 1) ? -1 : 0;
@@ -91,15 +90,13 @@ static int lgs8gxx_read_reg(struct lgs8gxx_state *priv, u8 reg, u8 *p_data)
91 90
92 ret = i2c_transfer(priv->i2c, msg, 2); 91 ret = i2c_transfer(priv->i2c, msg, 2);
93 if (ret != 2) { 92 if (ret != 2) {
94 dprintk(KERN_DEBUG "%s: error reg=0x%x, ret=%i\n", 93 dprintk("%s: error reg=0x%x, ret=%i\n", __func__, reg, ret);
95 __func__, reg, ret);
96 return -1; 94 return -1;
97 } 95 }
98 96
99 *p_data = b1[0]; 97 *p_data = b1[0];
100 if (debug >= 2) 98 if (debug >= 2)
101 printk(KERN_DEBUG "%s: reg=0x%02X, data=0x%02X\n", 99 dprintk("%s: reg=0x%02X, data=0x%02X\n", __func__, reg, b1[0]);
102 __func__, reg, b1[0]);
103 return 0; 100 return 0;
104} 101}
105 102
diff --git a/drivers/media/dvb/frontends/mb86a20s.c b/drivers/media/dvb/frontends/mb86a20s.c
new file mode 100644
index 000000000000..d3ad3e75a35a
--- /dev/null
+++ b/drivers/media/dvb/frontends/mb86a20s.c
@@ -0,0 +1,615 @@
1/*
2 * Fujitu mb86a20s ISDB-T/ISDB-Tsb Module driver
3 *
4 * Copyright (C) 2010 Mauro Carvalho Chehab <mchehab@redhat.com>
5 * Copyright (C) 2009-2010 Douglas Landgraf <dougsland@redhat.com>
6 *
7 * FIXME: Need to port to DVB v5.2 API
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation version 2.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 */
18
19#include <linux/kernel.h>
20#include <asm/div64.h>
21
22#include "dvb_frontend.h"
23#include "mb86a20s.h"
24
25static int debug = 1;
26module_param(debug, int, 0644);
27MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
28
29#define rc(args...) do { \
30 printk(KERN_ERR "mb86a20s: " args); \
31} while (0)
32
33#define dprintk(args...) \
34 do { \
35 if (debug) { \
36 printk(KERN_DEBUG "mb86a20s: %s: ", __func__); \
37 printk(args); \
38 } \
39 } while (0)
40
41struct mb86a20s_state {
42 struct i2c_adapter *i2c;
43 const struct mb86a20s_config *config;
44
45 struct dvb_frontend frontend;
46};
47
48struct regdata {
49 u8 reg;
50 u8 data;
51};
52
53/*
54 * Initialization sequence: Use whatevere default values that PV SBTVD
55 * does on its initialisation, obtained via USB snoop
56 */
57static struct regdata mb86a20s_init[] = {
58 { 0x70, 0x0f },
59 { 0x70, 0xff },
60 { 0x08, 0x01 },
61 { 0x09, 0x3e },
62 { 0x50, 0xd1 },
63 { 0x51, 0x22 },
64 { 0x39, 0x01 },
65 { 0x71, 0x00 },
66 { 0x28, 0x2a },
67 { 0x29, 0x00 },
68 { 0x2a, 0xff },
69 { 0x2b, 0x80 },
70 { 0x28, 0x20 },
71 { 0x29, 0x33 },
72 { 0x2a, 0xdf },
73 { 0x2b, 0xa9 },
74 { 0x3b, 0x21 },
75 { 0x3c, 0x3a },
76 { 0x01, 0x0d },
77 { 0x04, 0x08 },
78 { 0x05, 0x05 },
79 { 0x04, 0x0e },
80 { 0x05, 0x00 },
81 { 0x04, 0x0f },
82 { 0x05, 0x14 },
83 { 0x04, 0x0b },
84 { 0x05, 0x8c },
85 { 0x04, 0x00 },
86 { 0x05, 0x00 },
87 { 0x04, 0x01 },
88 { 0x05, 0x07 },
89 { 0x04, 0x02 },
90 { 0x05, 0x0f },
91 { 0x04, 0x03 },
92 { 0x05, 0xa0 },
93 { 0x04, 0x09 },
94 { 0x05, 0x00 },
95 { 0x04, 0x0a },
96 { 0x05, 0xff },
97 { 0x04, 0x27 },
98 { 0x05, 0x64 },
99 { 0x04, 0x28 },
100 { 0x05, 0x00 },
101 { 0x04, 0x1e },
102 { 0x05, 0xff },
103 { 0x04, 0x29 },
104 { 0x05, 0x0a },
105 { 0x04, 0x32 },
106 { 0x05, 0x0a },
107 { 0x04, 0x14 },
108 { 0x05, 0x02 },
109 { 0x04, 0x04 },
110 { 0x05, 0x00 },
111 { 0x04, 0x05 },
112 { 0x05, 0x22 },
113 { 0x04, 0x06 },
114 { 0x05, 0x0e },
115 { 0x04, 0x07 },
116 { 0x05, 0xd8 },
117 { 0x04, 0x12 },
118 { 0x05, 0x00 },
119 { 0x04, 0x13 },
120 { 0x05, 0xff },
121 { 0x52, 0x01 },
122 { 0x50, 0xa7 },
123 { 0x51, 0x00 },
124 { 0x50, 0xa8 },
125 { 0x51, 0xff },
126 { 0x50, 0xa9 },
127 { 0x51, 0xff },
128 { 0x50, 0xaa },
129 { 0x51, 0x00 },
130 { 0x50, 0xab },
131 { 0x51, 0xff },
132 { 0x50, 0xac },
133 { 0x51, 0xff },
134 { 0x50, 0xad },
135 { 0x51, 0x00 },
136 { 0x50, 0xae },
137 { 0x51, 0xff },
138 { 0x50, 0xaf },
139 { 0x51, 0xff },
140 { 0x5e, 0x07 },
141 { 0x50, 0xdc },
142 { 0x51, 0x01 },
143 { 0x50, 0xdd },
144 { 0x51, 0xf4 },
145 { 0x50, 0xde },
146 { 0x51, 0x01 },
147 { 0x50, 0xdf },
148 { 0x51, 0xf4 },
149 { 0x50, 0xe0 },
150 { 0x51, 0x01 },
151 { 0x50, 0xe1 },
152 { 0x51, 0xf4 },
153 { 0x50, 0xb0 },
154 { 0x51, 0x07 },
155 { 0x50, 0xb2 },
156 { 0x51, 0xff },
157 { 0x50, 0xb3 },
158 { 0x51, 0xff },
159 { 0x50, 0xb4 },
160 { 0x51, 0xff },
161 { 0x50, 0xb5 },
162 { 0x51, 0xff },
163 { 0x50, 0xb6 },
164 { 0x51, 0xff },
165 { 0x50, 0xb7 },
166 { 0x51, 0xff },
167 { 0x50, 0x50 },
168 { 0x51, 0x02 },
169 { 0x50, 0x51 },
170 { 0x51, 0x04 },
171 { 0x45, 0x04 },
172 { 0x48, 0x04 },
173 { 0x50, 0xd5 },
174 { 0x51, 0x01 }, /* Serial */
175 { 0x50, 0xd6 },
176 { 0x51, 0x1f },
177 { 0x50, 0xd2 },
178 { 0x51, 0x03 },
179 { 0x50, 0xd7 },
180 { 0x51, 0x3f },
181 { 0x1c, 0x01 },
182 { 0x28, 0x06 },
183 { 0x29, 0x00 },
184 { 0x2a, 0x00 },
185 { 0x2b, 0x03 },
186 { 0x28, 0x07 },
187 { 0x29, 0x00 },
188 { 0x2a, 0x00 },
189 { 0x2b, 0x0d },
190 { 0x28, 0x08 },
191 { 0x29, 0x00 },
192 { 0x2a, 0x00 },
193 { 0x2b, 0x02 },
194 { 0x28, 0x09 },
195 { 0x29, 0x00 },
196 { 0x2a, 0x00 },
197 { 0x2b, 0x01 },
198 { 0x28, 0x0a },
199 { 0x29, 0x00 },
200 { 0x2a, 0x00 },
201 { 0x2b, 0x21 },
202 { 0x28, 0x0b },
203 { 0x29, 0x00 },
204 { 0x2a, 0x00 },
205 { 0x2b, 0x29 },
206 { 0x28, 0x0c },
207 { 0x29, 0x00 },
208 { 0x2a, 0x00 },
209 { 0x2b, 0x16 },
210 { 0x28, 0x0d },
211 { 0x29, 0x00 },
212 { 0x2a, 0x00 },
213 { 0x2b, 0x31 },
214 { 0x28, 0x0e },
215 { 0x29, 0x00 },
216 { 0x2a, 0x00 },
217 { 0x2b, 0x0e },
218 { 0x28, 0x0f },
219 { 0x29, 0x00 },
220 { 0x2a, 0x00 },
221 { 0x2b, 0x4e },
222 { 0x28, 0x10 },
223 { 0x29, 0x00 },
224 { 0x2a, 0x00 },
225 { 0x2b, 0x46 },
226 { 0x28, 0x11 },
227 { 0x29, 0x00 },
228 { 0x2a, 0x00 },
229 { 0x2b, 0x0f },
230 { 0x28, 0x12 },
231 { 0x29, 0x00 },
232 { 0x2a, 0x00 },
233 { 0x2b, 0x56 },
234 { 0x28, 0x13 },
235 { 0x29, 0x00 },
236 { 0x2a, 0x00 },
237 { 0x2b, 0x35 },
238 { 0x28, 0x14 },
239 { 0x29, 0x00 },
240 { 0x2a, 0x01 },
241 { 0x2b, 0xbe },
242 { 0x28, 0x15 },
243 { 0x29, 0x00 },
244 { 0x2a, 0x01 },
245 { 0x2b, 0x84 },
246 { 0x28, 0x16 },
247 { 0x29, 0x00 },
248 { 0x2a, 0x03 },
249 { 0x2b, 0xee },
250 { 0x28, 0x17 },
251 { 0x29, 0x00 },
252 { 0x2a, 0x00 },
253 { 0x2b, 0x98 },
254 { 0x28, 0x18 },
255 { 0x29, 0x00 },
256 { 0x2a, 0x00 },
257 { 0x2b, 0x9f },
258 { 0x28, 0x19 },
259 { 0x29, 0x00 },
260 { 0x2a, 0x07 },
261 { 0x2b, 0xb2 },
262 { 0x28, 0x1a },
263 { 0x29, 0x00 },
264 { 0x2a, 0x06 },
265 { 0x2b, 0xc2 },
266 { 0x28, 0x1b },
267 { 0x29, 0x00 },
268 { 0x2a, 0x07 },
269 { 0x2b, 0x4a },
270 { 0x28, 0x1c },
271 { 0x29, 0x00 },
272 { 0x2a, 0x01 },
273 { 0x2b, 0xbc },
274 { 0x28, 0x1d },
275 { 0x29, 0x00 },
276 { 0x2a, 0x04 },
277 { 0x2b, 0xba },
278 { 0x28, 0x1e },
279 { 0x29, 0x00 },
280 { 0x2a, 0x06 },
281 { 0x2b, 0x14 },
282 { 0x50, 0x1e },
283 { 0x51, 0x5d },
284 { 0x50, 0x22 },
285 { 0x51, 0x00 },
286 { 0x50, 0x23 },
287 { 0x51, 0xc8 },
288 { 0x50, 0x24 },
289 { 0x51, 0x00 },
290 { 0x50, 0x25 },
291 { 0x51, 0xf0 },
292 { 0x50, 0x26 },
293 { 0x51, 0x00 },
294 { 0x50, 0x27 },
295 { 0x51, 0xc3 },
296 { 0x50, 0x39 },
297 { 0x51, 0x02 },
298 { 0x50, 0xd5 },
299 { 0x51, 0x01 },
300 { 0xd0, 0x00 },
301};
302
303static struct regdata mb86a20s_reset_reception[] = {
304 { 0x70, 0xf0 },
305 { 0x70, 0xff },
306 { 0x08, 0x01 },
307 { 0x08, 0x00 },
308};
309
310static int mb86a20s_i2c_writereg(struct mb86a20s_state *state,
311 u8 i2c_addr, int reg, int data)
312{
313 u8 buf[] = { reg, data };
314 struct i2c_msg msg = {
315 .addr = i2c_addr, .flags = 0, .buf = buf, .len = 2
316 };
317 int rc;
318
319 rc = i2c_transfer(state->i2c, &msg, 1);
320 if (rc != 1) {
321 printk("%s: writereg rcor(rc == %i, reg == 0x%02x,"
322 " data == 0x%02x)\n", __func__, rc, reg, data);
323 return rc;
324 }
325
326 return 0;
327}
328
329static int mb86a20s_i2c_writeregdata(struct mb86a20s_state *state,
330 u8 i2c_addr, struct regdata *rd, int size)
331{
332 int i, rc;
333
334 for (i = 0; i < size; i++) {
335 rc = mb86a20s_i2c_writereg(state, i2c_addr, rd[i].reg,
336 rd[i].data);
337 if (rc < 0)
338 return rc;
339 }
340 return 0;
341}
342
343static int mb86a20s_i2c_readreg(struct mb86a20s_state *state,
344 u8 i2c_addr, u8 reg)
345{
346 u8 val;
347 int rc;
348 struct i2c_msg msg[] = {
349 { .addr = i2c_addr, .flags = 0, .buf = &reg, .len = 1 },
350 { .addr = i2c_addr, .flags = I2C_M_RD, .buf = &val, .len = 1 }
351 };
352
353 rc = i2c_transfer(state->i2c, msg, 2);
354
355 if (rc != 2) {
356 rc("%s: reg=0x%x (rcor=%d)\n", __func__, reg, rc);
357 return rc;
358 }
359
360 return val;
361}
362
363#define mb86a20s_readreg(state, reg) \
364 mb86a20s_i2c_readreg(state, state->config->demod_address, reg)
365#define mb86a20s_writereg(state, reg, val) \
366 mb86a20s_i2c_writereg(state, state->config->demod_address, reg, val)
367#define mb86a20s_writeregdata(state, regdata) \
368 mb86a20s_i2c_writeregdata(state, state->config->demod_address, \
369 regdata, ARRAY_SIZE(regdata))
370
371static int mb86a20s_initfe(struct dvb_frontend *fe)
372{
373 struct mb86a20s_state *state = fe->demodulator_priv;
374 int rc;
375 u8 regD5 = 1;
376
377 dprintk("\n");
378
379 if (fe->ops.i2c_gate_ctrl)
380 fe->ops.i2c_gate_ctrl(fe, 0);
381
382 /* Initialize the frontend */
383 rc = mb86a20s_writeregdata(state, mb86a20s_init);
384 if (rc < 0)
385 return rc;
386
387 if (!state->config->is_serial) {
388 regD5 &= ~1;
389
390 rc = mb86a20s_writereg(state, 0x50, 0xd5);
391 if (rc < 0)
392 return rc;
393 rc = mb86a20s_writereg(state, 0x51, regD5);
394 if (rc < 0)
395 return rc;
396 }
397
398 if (fe->ops.i2c_gate_ctrl)
399 fe->ops.i2c_gate_ctrl(fe, 1);
400
401 return 0;
402}
403
404static int mb86a20s_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
405{
406 struct mb86a20s_state *state = fe->demodulator_priv;
407 unsigned rf_max, rf_min, rf;
408 u8 val;
409
410 dprintk("\n");
411
412 if (fe->ops.i2c_gate_ctrl)
413 fe->ops.i2c_gate_ctrl(fe, 0);
414
415 /* Does a binary search to get RF strength */
416 rf_max = 0xfff;
417 rf_min = 0;
418 do {
419 rf = (rf_max + rf_min) / 2;
420 mb86a20s_writereg(state, 0x04, 0x1f);
421 mb86a20s_writereg(state, 0x05, rf >> 8);
422 mb86a20s_writereg(state, 0x04, 0x20);
423 mb86a20s_writereg(state, 0x04, rf);
424
425 val = mb86a20s_readreg(state, 0x02);
426 if (val & 0x08)
427 rf_min = (rf_max + rf_min) / 2;
428 else
429 rf_max = (rf_max + rf_min) / 2;
430 if (rf_max - rf_min < 4) {
431 *strength = (((rf_max + rf_min) / 2) * 65535) / 4095;
432 break;
433 }
434 } while (1);
435
436 dprintk("signal strength = %d\n", *strength);
437
438 if (fe->ops.i2c_gate_ctrl)
439 fe->ops.i2c_gate_ctrl(fe, 1);
440
441 return 0;
442}
443
444static int mb86a20s_read_status(struct dvb_frontend *fe, fe_status_t *status)
445{
446 struct mb86a20s_state *state = fe->demodulator_priv;
447 u8 val;
448
449 dprintk("\n");
450 *status = 0;
451
452 if (fe->ops.i2c_gate_ctrl)
453 fe->ops.i2c_gate_ctrl(fe, 0);
454 val = mb86a20s_readreg(state, 0x0a) & 0xf;
455 if (fe->ops.i2c_gate_ctrl)
456 fe->ops.i2c_gate_ctrl(fe, 1);
457
458 if (val >= 2)
459 *status |= FE_HAS_SIGNAL;
460
461 if (val >= 4)
462 *status |= FE_HAS_CARRIER;
463
464 if (val >= 5)
465 *status |= FE_HAS_VITERBI;
466
467 if (val >= 7)
468 *status |= FE_HAS_SYNC;
469
470 if (val >= 8) /* Maybe 9? */
471 *status |= FE_HAS_LOCK;
472
473 dprintk("val = %d, status = 0x%02x\n", val, *status);
474
475 return 0;
476}
477
478static int mb86a20s_set_frontend(struct dvb_frontend *fe,
479 struct dvb_frontend_parameters *p)
480{
481 struct mb86a20s_state *state = fe->demodulator_priv;
482 int rc;
483
484 dprintk("\n");
485
486 if (fe->ops.i2c_gate_ctrl)
487 fe->ops.i2c_gate_ctrl(fe, 1);
488 fe->ops.tuner_ops.set_params(fe, p);
489
490 if (fe->ops.i2c_gate_ctrl)
491 fe->ops.i2c_gate_ctrl(fe, 0);
492 rc = mb86a20s_writeregdata(state, mb86a20s_reset_reception);
493 if (fe->ops.i2c_gate_ctrl)
494 fe->ops.i2c_gate_ctrl(fe, 1);
495
496 return rc;
497}
498
499static int mb86a20s_get_frontend(struct dvb_frontend *fe,
500 struct dvb_frontend_parameters *p)
501{
502
503 /* FIXME: For now, it does nothing */
504
505 fe->dtv_property_cache.bandwidth_hz = 6000000;
506 fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
507 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
508 fe->dtv_property_cache.isdbt_partial_reception = 0;
509
510 return 0;
511}
512
513static int mb86a20s_tune(struct dvb_frontend *fe,
514 struct dvb_frontend_parameters *params,
515 unsigned int mode_flags,
516 unsigned int *delay,
517 fe_status_t *status)
518{
519 int rc = 0;
520
521 dprintk("\n");
522
523 if (params != NULL)
524 rc = mb86a20s_set_frontend(fe, params);
525
526 if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
527 mb86a20s_read_status(fe, status);
528
529 return rc;
530}
531
532static void mb86a20s_release(struct dvb_frontend *fe)
533{
534 struct mb86a20s_state *state = fe->demodulator_priv;
535
536 dprintk("\n");
537
538 kfree(state);
539}
540
541static struct dvb_frontend_ops mb86a20s_ops;
542
543struct dvb_frontend *mb86a20s_attach(const struct mb86a20s_config *config,
544 struct i2c_adapter *i2c)
545{
546 u8 rev;
547
548 /* allocate memory for the internal state */
549 struct mb86a20s_state *state =
550 kzalloc(sizeof(struct mb86a20s_state), GFP_KERNEL);
551
552 dprintk("\n");
553 if (state == NULL) {
554 rc("Unable to kzalloc\n");
555 goto error;
556 }
557
558 /* setup the state */
559 state->config = config;
560 state->i2c = i2c;
561
562 /* create dvb_frontend */
563 memcpy(&state->frontend.ops, &mb86a20s_ops,
564 sizeof(struct dvb_frontend_ops));
565 state->frontend.demodulator_priv = state;
566
567 /* Check if it is a mb86a20s frontend */
568 rev = mb86a20s_readreg(state, 0);
569
570 if (rev == 0x13) {
571 printk(KERN_INFO "Detected a Fujitsu mb86a20s frontend\n");
572 } else {
573 printk(KERN_ERR "Frontend revision %d is unknown - aborting.\n",
574 rev);
575 goto error;
576 }
577
578 return &state->frontend;
579
580error:
581 kfree(state);
582 return NULL;
583}
584EXPORT_SYMBOL(mb86a20s_attach);
585
586static struct dvb_frontend_ops mb86a20s_ops = {
587 /* Use dib8000 values per default */
588 .info = {
589 .name = "Fujitsu mb86A20s",
590 .type = FE_OFDM,
591 .caps = FE_CAN_INVERSION_AUTO | FE_CAN_RECOVER |
592 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
593 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
594 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
595 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_QAM_AUTO |
596 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
597 /* Actually, those values depend on the used tuner */
598 .frequency_min = 45000000,
599 .frequency_max = 864000000,
600 .frequency_stepsize = 62500,
601 },
602
603 .release = mb86a20s_release,
604
605 .init = mb86a20s_initfe,
606 .set_frontend = mb86a20s_set_frontend,
607 .get_frontend = mb86a20s_get_frontend,
608 .read_status = mb86a20s_read_status,
609 .read_signal_strength = mb86a20s_read_signal_strength,
610 .tune = mb86a20s_tune,
611};
612
613MODULE_DESCRIPTION("DVB Frontend module for Fujitsu mb86A20s hardware");
614MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
615MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/mb86a20s.h b/drivers/media/dvb/frontends/mb86a20s.h
new file mode 100644
index 000000000000..bf22e77888b9
--- /dev/null
+++ b/drivers/media/dvb/frontends/mb86a20s.h
@@ -0,0 +1,52 @@
1/*
2 * Fujitsu mb86a20s driver
3 *
4 * Copyright (C) 2010 Mauro Carvalho Chehab <mchehab@redhat.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation version 2.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 */
15
16#ifndef MB86A20S_H
17#define MB86A20S_H
18
19#include <linux/dvb/frontend.h>
20
21/**
22 * struct mb86a20s_config - Define the per-device attributes of the frontend
23 *
24 * @demod_address: the demodulator's i2c address
25 */
26
27struct mb86a20s_config {
28 u8 demod_address;
29 bool is_serial;
30};
31
32#if defined(CONFIG_DVB_MB86A20S) || (defined(CONFIG_DVB_MB86A20S_MODULE) \
33 && defined(MODULE))
34extern struct dvb_frontend *mb86a20s_attach(const struct mb86a20s_config *config,
35 struct i2c_adapter *i2c);
36extern struct i2c_adapter *mb86a20s_get_tuner_i2c_adapter(struct dvb_frontend *);
37#else
38static inline struct dvb_frontend *mb86a20s_attach(
39 const struct mb86a20s_config *config, struct i2c_adapter *i2c)
40{
41 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
42 return NULL;
43}
44static struct i2c_adapter *
45 mb86a20s_get_tuner_i2c_adapter(struct dvb_frontend *fe)
46{
47 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
48 return NULL;
49}
50#endif
51
52#endif /* MB86A20S */
diff --git a/drivers/media/dvb/frontends/s921.c b/drivers/media/dvb/frontends/s921.c
new file mode 100644
index 000000000000..ca0103d5f148
--- /dev/null
+++ b/drivers/media/dvb/frontends/s921.c
@@ -0,0 +1,548 @@
1/*
2 * Sharp VA3A5JZ921 One Seg Broadcast Module driver
3 * This device is labeled as just S. 921 at the top of the frontend can
4 *
5 * Copyright (C) 2009-2010 Mauro Carvalho Chehab <mchehab@redhat.com>
6 * Copyright (C) 2009-2010 Douglas Landgraf <dougsland@redhat.com>
7 *
8 * Developed for Leadership SBTVD 1seg device sold in Brazil
9 *
10 * Frontend module based on cx24123 driver, getting some info from
11 * the old s921 driver.
12 *
13 * FIXME: Need to port to DVB v5.2 API
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License as
17 * published by the Free Software Foundation version 2.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * General Public License for more details.
23 */
24
25#include <linux/kernel.h>
26#include <asm/div64.h>
27
28#include "dvb_frontend.h"
29#include "s921.h"
30
31static int debug = 1;
32module_param(debug, int, 0644);
33MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
34
35#define rc(args...) do { \
36 printk(KERN_ERR "s921: " args); \
37} while (0)
38
39#define dprintk(args...) \
40 do { \
41 if (debug) { \
42 printk(KERN_DEBUG "s921: %s: ", __func__); \
43 printk(args); \
44 } \
45 } while (0)
46
47struct s921_state {
48 struct i2c_adapter *i2c;
49 const struct s921_config *config;
50
51 struct dvb_frontend frontend;
52
53 /* The Demod can't easily provide these, we cache them */
54 u32 currentfreq;
55};
56
57/*
58 * Various tuner defaults need to be established for a given frequency kHz.
59 * fixme: The bounds on the bands do not match the doc in real life.
60 * fixme: Some of them have been moved, other might need adjustment.
61 */
62static struct s921_bandselect_val {
63 u32 freq_low;
64 u8 band_reg;
65} s921_bandselect[] = {
66 { 0, 0x7b },
67 { 485140000, 0x5b },
68 { 515140000, 0x3b },
69 { 545140000, 0x1b },
70 { 599140000, 0xfb },
71 { 623140000, 0xdb },
72 { 659140000, 0xbb },
73 { 713140000, 0x9b },
74};
75
76struct regdata {
77 u8 reg;
78 u8 data;
79};
80
81static struct regdata s921_init[] = {
82 { 0x01, 0x80 }, /* Probably, a reset sequence */
83 { 0x01, 0x40 },
84 { 0x01, 0x80 },
85 { 0x01, 0x40 },
86
87 { 0x02, 0x00 },
88 { 0x03, 0x40 },
89 { 0x04, 0x01 },
90 { 0x05, 0x00 },
91 { 0x06, 0x00 },
92 { 0x07, 0x00 },
93 { 0x08, 0x00 },
94 { 0x09, 0x00 },
95 { 0x0a, 0x00 },
96 { 0x0b, 0x5a },
97 { 0x0c, 0x00 },
98 { 0x0d, 0x00 },
99 { 0x0f, 0x00 },
100 { 0x13, 0x1b },
101 { 0x14, 0x80 },
102 { 0x15, 0x40 },
103 { 0x17, 0x70 },
104 { 0x18, 0x01 },
105 { 0x19, 0x12 },
106 { 0x1a, 0x01 },
107 { 0x1b, 0x12 },
108 { 0x1c, 0xa0 },
109 { 0x1d, 0x00 },
110 { 0x1e, 0x0a },
111 { 0x1f, 0x08 },
112 { 0x20, 0x40 },
113 { 0x21, 0xff },
114 { 0x22, 0x4c },
115 { 0x23, 0x4e },
116 { 0x24, 0x4c },
117 { 0x25, 0x00 },
118 { 0x26, 0x00 },
119 { 0x27, 0xf4 },
120 { 0x28, 0x60 },
121 { 0x29, 0x88 },
122 { 0x2a, 0x40 },
123 { 0x2b, 0x40 },
124 { 0x2c, 0xff },
125 { 0x2d, 0x00 },
126 { 0x2e, 0xff },
127 { 0x2f, 0x00 },
128 { 0x30, 0x20 },
129 { 0x31, 0x06 },
130 { 0x32, 0x0c },
131 { 0x34, 0x0f },
132 { 0x37, 0xfe },
133 { 0x38, 0x00 },
134 { 0x39, 0x63 },
135 { 0x3a, 0x10 },
136 { 0x3b, 0x10 },
137 { 0x47, 0x00 },
138 { 0x49, 0xe5 },
139 { 0x4b, 0x00 },
140 { 0x50, 0xc0 },
141 { 0x52, 0x20 },
142 { 0x54, 0x5a },
143 { 0x55, 0x5b },
144 { 0x56, 0x40 },
145 { 0x57, 0x70 },
146 { 0x5c, 0x50 },
147 { 0x5d, 0x00 },
148 { 0x62, 0x17 },
149 { 0x63, 0x2f },
150 { 0x64, 0x6f },
151 { 0x68, 0x00 },
152 { 0x69, 0x89 },
153 { 0x6a, 0x00 },
154 { 0x6b, 0x00 },
155 { 0x6c, 0x00 },
156 { 0x6d, 0x00 },
157 { 0x6e, 0x00 },
158 { 0x70, 0x10 },
159 { 0x71, 0x00 },
160 { 0x75, 0x00 },
161 { 0x76, 0x30 },
162 { 0x77, 0x01 },
163 { 0xaf, 0x00 },
164 { 0xb0, 0xa0 },
165 { 0xb2, 0x3d },
166 { 0xb3, 0x25 },
167 { 0xb4, 0x8b },
168 { 0xb5, 0x4b },
169 { 0xb6, 0x3f },
170 { 0xb7, 0xff },
171 { 0xb8, 0xff },
172 { 0xb9, 0xfc },
173 { 0xba, 0x00 },
174 { 0xbb, 0x00 },
175 { 0xbc, 0x00 },
176 { 0xd0, 0x30 },
177 { 0xe4, 0x84 },
178 { 0xf0, 0x48 },
179 { 0xf1, 0x19 },
180 { 0xf2, 0x5a },
181 { 0xf3, 0x8e },
182 { 0xf4, 0x2d },
183 { 0xf5, 0x07 },
184 { 0xf6, 0x5a },
185 { 0xf7, 0xba },
186 { 0xf8, 0xd7 },
187};
188
189static struct regdata s921_prefreq[] = {
190 { 0x47, 0x60 },
191 { 0x68, 0x00 },
192 { 0x69, 0x89 },
193 { 0xf0, 0x48 },
194 { 0xf1, 0x19 },
195};
196
197static struct regdata s921_postfreq[] = {
198 { 0xf5, 0xae },
199 { 0xf6, 0xb7 },
200 { 0xf7, 0xba },
201 { 0xf8, 0xd7 },
202 { 0x68, 0x0a },
203 { 0x69, 0x09 },
204};
205
206static int s921_i2c_writereg(struct s921_state *state,
207 u8 i2c_addr, int reg, int data)
208{
209 u8 buf[] = { reg, data };
210 struct i2c_msg msg = {
211 .addr = i2c_addr, .flags = 0, .buf = buf, .len = 2
212 };
213 int rc;
214
215 rc = i2c_transfer(state->i2c, &msg, 1);
216 if (rc != 1) {
217 printk("%s: writereg rcor(rc == %i, reg == 0x%02x,"
218 " data == 0x%02x)\n", __func__, rc, reg, data);
219 return rc;
220 }
221
222 return 0;
223}
224
225static int s921_i2c_writeregdata(struct s921_state *state, u8 i2c_addr,
226 struct regdata *rd, int size)
227{
228 int i, rc;
229
230 for (i = 0; i < size; i++) {
231 rc = s921_i2c_writereg(state, i2c_addr, rd[i].reg, rd[i].data);
232 if (rc < 0)
233 return rc;
234 }
235 return 0;
236}
237
238static int s921_i2c_readreg(struct s921_state *state, u8 i2c_addr, u8 reg)
239{
240 u8 val;
241 int rc;
242 struct i2c_msg msg[] = {
243 { .addr = i2c_addr, .flags = 0, .buf = &reg, .len = 1 },
244 { .addr = i2c_addr, .flags = I2C_M_RD, .buf = &val, .len = 1 }
245 };
246
247 rc = i2c_transfer(state->i2c, msg, 2);
248
249 if (rc != 2) {
250 rc("%s: reg=0x%x (rcor=%d)\n", __func__, reg, rc);
251 return rc;
252 }
253
254 return val;
255}
256
257#define s921_readreg(state, reg) \
258 s921_i2c_readreg(state, state->config->demod_address, reg)
259#define s921_writereg(state, reg, val) \
260 s921_i2c_writereg(state, state->config->demod_address, reg, val)
261#define s921_writeregdata(state, regdata) \
262 s921_i2c_writeregdata(state, state->config->demod_address, \
263 regdata, ARRAY_SIZE(regdata))
264
265static int s921_pll_tune(struct dvb_frontend *fe,
266 struct dvb_frontend_parameters *p)
267{
268 struct s921_state *state = fe->demodulator_priv;
269 int band, rc, i;
270 unsigned long f_offset;
271 u8 f_switch;
272 u64 offset;
273
274 dprintk("frequency=%i\n", p->frequency);
275
276 for (band = 0; band < ARRAY_SIZE(s921_bandselect); band++)
277 if (p->frequency < s921_bandselect[band].freq_low)
278 break;
279 band--;
280
281 if (band < 0) {
282 rc("%s: frequency out of range\n", __func__);
283 return -EINVAL;
284 }
285
286 f_switch = s921_bandselect[band].band_reg;
287
288 offset = ((u64)p->frequency) * 258;
289 do_div(offset, 6000000);
290 f_offset = ((unsigned long)offset) + 2321;
291
292 rc = s921_writeregdata(state, s921_prefreq);
293 if (rc < 0)
294 return rc;
295
296 rc = s921_writereg(state, 0xf2, (f_offset >> 8) & 0xff);
297 if (rc < 0)
298 return rc;
299
300 rc = s921_writereg(state, 0xf3, f_offset & 0xff);
301 if (rc < 0)
302 return rc;
303
304 rc = s921_writereg(state, 0xf4, f_switch);
305 if (rc < 0)
306 return rc;
307
308 rc = s921_writeregdata(state, s921_postfreq);
309 if (rc < 0)
310 return rc;
311
312 for (i = 0 ; i < 6; i++) {
313 rc = s921_readreg(state, 0x80);
314 dprintk("status 0x80: %02x\n", rc);
315 }
316 rc = s921_writereg(state, 0x01, 0x40);
317 if (rc < 0)
318 return rc;
319
320 rc = s921_readreg(state, 0x01);
321 dprintk("status 0x01: %02x\n", rc);
322
323 rc = s921_readreg(state, 0x80);
324 dprintk("status 0x80: %02x\n", rc);
325
326 rc = s921_readreg(state, 0x80);
327 dprintk("status 0x80: %02x\n", rc);
328
329 rc = s921_readreg(state, 0x32);
330 dprintk("status 0x32: %02x\n", rc);
331
332 dprintk("pll tune band=%d, pll=%d\n", f_switch, (int)f_offset);
333
334 return 0;
335}
336
337static int s921_initfe(struct dvb_frontend *fe)
338{
339 struct s921_state *state = fe->demodulator_priv;
340 int rc;
341
342 dprintk("\n");
343
344 rc = s921_writeregdata(state, s921_init);
345 if (rc < 0)
346 return rc;
347
348 return 0;
349}
350
351static int s921_read_status(struct dvb_frontend *fe, fe_status_t *status)
352{
353 struct s921_state *state = fe->demodulator_priv;
354 int regstatus, rc;
355
356 *status = 0;
357
358 rc = s921_readreg(state, 0x81);
359 if (rc < 0)
360 return rc;
361
362 regstatus = rc << 8;
363
364 rc = s921_readreg(state, 0x82);
365 if (rc < 0)
366 return rc;
367
368 regstatus |= rc;
369
370 dprintk("status = %04x\n", regstatus);
371
372 /* Full Sync - We don't know what each bit means on regs 0x81/0x82 */
373 if ((regstatus & 0xff) == 0x40) {
374 *status = FE_HAS_SIGNAL |
375 FE_HAS_CARRIER |
376 FE_HAS_VITERBI |
377 FE_HAS_SYNC |
378 FE_HAS_LOCK;
379 } else if (regstatus & 0x40) {
380 /* This is close to Full Sync, but not enough to get useful info */
381 *status = FE_HAS_SIGNAL |
382 FE_HAS_CARRIER |
383 FE_HAS_VITERBI |
384 FE_HAS_SYNC;
385 }
386
387 return 0;
388}
389
390static int s921_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
391{
392 fe_status_t status;
393 struct s921_state *state = fe->demodulator_priv;
394 int rc;
395
396 /* FIXME: Use the proper register for it... 0x80? */
397 rc = s921_read_status(fe, &status);
398 if (rc < 0)
399 return rc;
400
401 *strength = (status & FE_HAS_LOCK) ? 0xffff : 0;
402
403 dprintk("strength = 0x%04x\n", *strength);
404
405 rc = s921_readreg(state, 0x01);
406 dprintk("status 0x01: %02x\n", rc);
407
408 rc = s921_readreg(state, 0x80);
409 dprintk("status 0x80: %02x\n", rc);
410
411 rc = s921_readreg(state, 0x32);
412 dprintk("status 0x32: %02x\n", rc);
413
414 return 0;
415}
416
417static int s921_set_frontend(struct dvb_frontend *fe,
418 struct dvb_frontend_parameters *p)
419{
420 struct s921_state *state = fe->demodulator_priv;
421 int rc;
422
423 dprintk("\n");
424
425 /* FIXME: We don't know how to use non-auto mode */
426
427 rc = s921_pll_tune(fe, p);
428 if (rc < 0)
429 return rc;
430
431 state->currentfreq = p->frequency;
432
433 return 0;
434}
435
436static int s921_get_frontend(struct dvb_frontend *fe,
437 struct dvb_frontend_parameters *p)
438{
439 struct s921_state *state = fe->demodulator_priv;
440
441 /* FIXME: Probably it is possible to get it from regs f1 and f2 */
442 p->frequency = state->currentfreq;
443
444 return 0;
445}
446
447static int s921_tune(struct dvb_frontend *fe,
448 struct dvb_frontend_parameters *params,
449 unsigned int mode_flags,
450 unsigned int *delay,
451 fe_status_t *status)
452{
453 int rc = 0;
454
455 dprintk("\n");
456
457 if (params != NULL)
458 rc = s921_set_frontend(fe, params);
459
460 if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
461 s921_read_status(fe, status);
462
463 return rc;
464}
465
466static int s921_get_algo(struct dvb_frontend *fe)
467{
468 return 1; /* FE_ALGO_HW */
469}
470
471static void s921_release(struct dvb_frontend *fe)
472{
473 struct s921_state *state = fe->demodulator_priv;
474
475 dprintk("\n");
476 kfree(state);
477}
478
479static struct dvb_frontend_ops s921_ops;
480
481struct dvb_frontend *s921_attach(const struct s921_config *config,
482 struct i2c_adapter *i2c)
483{
484 /* allocate memory for the internal state */
485 struct s921_state *state =
486 kzalloc(sizeof(struct s921_state), GFP_KERNEL);
487
488 dprintk("\n");
489 if (state == NULL) {
490 rc("Unable to kzalloc\n");
491 goto rcor;
492 }
493
494 /* setup the state */
495 state->config = config;
496 state->i2c = i2c;
497
498 /* create dvb_frontend */
499 memcpy(&state->frontend.ops, &s921_ops,
500 sizeof(struct dvb_frontend_ops));
501 state->frontend.demodulator_priv = state;
502
503 return &state->frontend;
504
505rcor:
506 kfree(state);
507
508 return NULL;
509}
510EXPORT_SYMBOL(s921_attach);
511
512static struct dvb_frontend_ops s921_ops = {
513 /* Use dib8000 values per default */
514 .info = {
515 .name = "Sharp S921",
516 .type = FE_OFDM,
517 .frequency_min = 470000000,
518 /*
519 * Max should be 770MHz instead, according with Sharp docs,
520 * but Leadership doc says it works up to 806 MHz. This is
521 * required to get channel 69, used in Brazil
522 */
523 .frequency_max = 806000000,
524 .frequency_tolerance = 0,
525 .caps = FE_CAN_INVERSION_AUTO |
526 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
527 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
528 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
529 FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO |
530 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER |
531 FE_CAN_HIERARCHY_AUTO,
532 },
533
534 .release = s921_release,
535
536 .init = s921_initfe,
537 .set_frontend = s921_set_frontend,
538 .get_frontend = s921_get_frontend,
539 .read_status = s921_read_status,
540 .read_signal_strength = s921_read_signal_strength,
541 .tune = s921_tune,
542 .get_frontend_algo = s921_get_algo,
543};
544
545MODULE_DESCRIPTION("DVB Frontend module for Sharp S921 hardware");
546MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
547MODULE_AUTHOR("Douglas Landgraf <dougsland@redhat.com>");
548MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/s921.h b/drivers/media/dvb/frontends/s921.h
new file mode 100644
index 000000000000..f220d8299c81
--- /dev/null
+++ b/drivers/media/dvb/frontends/s921.h
@@ -0,0 +1,47 @@
1/*
2 * Sharp s921 driver
3 *
4 * Copyright (C) 2009 Mauro Carvalho Chehab <mchehab@redhat.com>
5 * Copyright (C) 2009 Douglas Landgraf <dougsland@redhat.com>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation version 2.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 */
16
17#ifndef S921_H
18#define S921_H
19
20#include <linux/dvb/frontend.h>
21
22struct s921_config {
23 /* the demodulator's i2c address */
24 u8 demod_address;
25};
26
27#if defined(CONFIG_DVB_S921) || (defined(CONFIG_DVB_S921_MODULE) \
28 && defined(MODULE))
29extern struct dvb_frontend *s921_attach(const struct s921_config *config,
30 struct i2c_adapter *i2c);
31extern struct i2c_adapter *s921_get_tuner_i2c_adapter(struct dvb_frontend *);
32#else
33static inline struct dvb_frontend *s921_attach(
34 const struct s921_config *config, struct i2c_adapter *i2c)
35{
36 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
37 return NULL;
38}
39static struct i2c_adapter *
40 s921_get_tuner_i2c_adapter(struct dvb_frontend *fe)
41{
42 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
43 return NULL;
44}
45#endif
46
47#endif /* S921_H */
diff --git a/drivers/media/dvb/frontends/s921_core.c b/drivers/media/dvb/frontends/s921_core.c
deleted file mode 100644
index 974b52be9aea..000000000000
--- a/drivers/media/dvb/frontends/s921_core.c
+++ /dev/null
@@ -1,216 +0,0 @@
1/*
2 * Driver for Sharp s921 driver
3 *
4 * Copyright (C) 2008 Markus Rechberger <mrechberger@sundtek.de>
5 *
6 */
7
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/delay.h>
12#include "s921_core.h"
13
14static int s921_isdb_init(struct s921_isdb_t *dev);
15static int s921_isdb_set_parameters(struct s921_isdb_t *dev, struct s921_isdb_t_transmission_mode_params *params);
16static int s921_isdb_tune(struct s921_isdb_t *dev, struct s921_isdb_t_tune_params *params);
17static int s921_isdb_get_status(struct s921_isdb_t *dev, void *data);
18
19static u8 init_table[]={ 0x01, 0x40, 0x02, 0x00, 0x03, 0x40, 0x04, 0x01,
20 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00,
21 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x5a, 0x0c, 0x00,
22 0x0d, 0x00, 0x0f, 0x00, 0x13, 0x1b, 0x14, 0x80,
23 0x15, 0x40, 0x17, 0x70, 0x18, 0x01, 0x19, 0x12,
24 0x1a, 0x01, 0x1b, 0x12, 0x1c, 0xa0, 0x1d, 0x00,
25 0x1e, 0x0a, 0x1f, 0x08, 0x20, 0x40, 0x21, 0xff,
26 0x22, 0x4c, 0x23, 0x4e, 0x24, 0x4c, 0x25, 0x00,
27 0x26, 0x00, 0x27, 0xf4, 0x28, 0x60, 0x29, 0x88,
28 0x2a, 0x40, 0x2b, 0x40, 0x2c, 0xff, 0x2d, 0x00,
29 0x2e, 0xff, 0x2f, 0x00, 0x30, 0x20, 0x31, 0x06,
30 0x32, 0x0c, 0x34, 0x0f, 0x37, 0xfe, 0x38, 0x00,
31 0x39, 0x63, 0x3a, 0x10, 0x3b, 0x10, 0x47, 0x00,
32 0x49, 0xe5, 0x4b, 0x00, 0x50, 0xc0, 0x52, 0x20,
33 0x54, 0x5a, 0x55, 0x5b, 0x56, 0x40, 0x57, 0x70,
34 0x5c, 0x50, 0x5d, 0x00, 0x62, 0x17, 0x63, 0x2f,
35 0x64, 0x6f, 0x68, 0x00, 0x69, 0x89, 0x6a, 0x00,
36 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00,
37 0x70, 0x00, 0x71, 0x00, 0x75, 0x00, 0x76, 0x30,
38 0x77, 0x01, 0xaf, 0x00, 0xb0, 0xa0, 0xb2, 0x3d,
39 0xb3, 0x25, 0xb4, 0x8b, 0xb5, 0x4b, 0xb6, 0x3f,
40 0xb7, 0xff, 0xb8, 0xff, 0xb9, 0xfc, 0xba, 0x00,
41 0xbb, 0x00, 0xbc, 0x00, 0xd0, 0x30, 0xe4, 0x84,
42 0xf0, 0x48, 0xf1, 0x19, 0xf2, 0x5a, 0xf3, 0x8e,
43 0xf4, 0x2d, 0xf5, 0x07, 0xf6, 0x5a, 0xf7, 0xba,
44 0xf8, 0xd7 };
45
46static u8 c_table[]={ 0x58, 0x8a, 0x7b, 0x59, 0x8c, 0x7b, 0x5a, 0x8e, 0x5b,
47 0x5b, 0x90, 0x5b, 0x5c, 0x92, 0x5b, 0x5d, 0x94, 0x5b,
48 0x5e, 0x96, 0x5b, 0x5f, 0x98, 0x3b, 0x60, 0x9a, 0x3b,
49 0x61, 0x9c, 0x3b, 0x62, 0x9e, 0x3b, 0x63, 0xa0, 0x3b,
50 0x64, 0xa2, 0x1b, 0x65, 0xa4, 0x1b, 0x66, 0xa6, 0x1b,
51 0x67, 0xa8, 0x1b, 0x68, 0xaa, 0x1b, 0x69, 0xac, 0x1b,
52 0x6a, 0xae, 0x1b, 0x6b, 0xb0, 0x1b, 0x6c, 0xb2, 0x1b,
53 0x6d, 0xb4, 0xfb, 0x6e, 0xb6, 0xfb, 0x6f, 0xb8, 0xfb,
54 0x70, 0xba, 0xfb, 0x71, 0xbc, 0xdb, 0x72, 0xbe, 0xdb,
55 0x73, 0xc0, 0xdb, 0x74, 0xc2, 0xdb, 0x75, 0xc4, 0xdb,
56 0x76, 0xc6, 0xdb, 0x77, 0xc8, 0xbb, 0x78, 0xca, 0xbb,
57 0x79, 0xcc, 0xbb, 0x7a, 0xce, 0xbb, 0x7b, 0xd0, 0xbb,
58 0x7c, 0xd2, 0xbb, 0x7d, 0xd4, 0xbb, 0x7e, 0xd6, 0xbb,
59 0x7f, 0xd8, 0xbb, 0x80, 0xda, 0x9b, 0x81, 0xdc, 0x9b,
60 0x82, 0xde, 0x9b, 0x83, 0xe0, 0x9b, 0x84, 0xe2, 0x9b,
61 0x85, 0xe4, 0x9b, 0x86, 0xe6, 0x9b, 0x87, 0xe8, 0x9b,
62 0x88, 0xea, 0x9b, 0x89, 0xec, 0x9b };
63
64int s921_isdb_cmd(struct s921_isdb_t *dev, u32 cmd, void *data) {
65 switch(cmd) {
66 case ISDB_T_CMD_INIT:
67 s921_isdb_init(dev);
68 break;
69 case ISDB_T_CMD_SET_PARAM:
70 s921_isdb_set_parameters(dev, data);
71 break;
72 case ISDB_T_CMD_TUNE:
73 s921_isdb_tune(dev, data);
74 break;
75 case ISDB_T_CMD_GET_STATUS:
76 s921_isdb_get_status(dev, data);
77 break;
78 default:
79 printk("unhandled command\n");
80 return -EINVAL;
81 }
82 return 0;
83}
84
85static int s921_isdb_init(struct s921_isdb_t *dev) {
86 unsigned int i;
87 unsigned int ret;
88 printk("isdb_init\n");
89 for (i = 0; i < sizeof(init_table); i+=2) {
90 ret = dev->i2c_write(dev->priv_dev, init_table[i], init_table[i+1]);
91 if (ret != 0) {
92 printk("i2c write failed\n");
93 return ret;
94 }
95 }
96 return 0;
97}
98
99static int s921_isdb_set_parameters(struct s921_isdb_t *dev, struct s921_isdb_t_transmission_mode_params *params) {
100
101 int ret;
102 /* auto is sufficient for now, lateron this should be reflected in an extra interface */
103
104
105
106 ret = dev->i2c_write(dev->priv_dev, 0xb0, 0xa0); //mod_b2);
107 ret = dev->i2c_write(dev->priv_dev, 0xb2, 0x3d); //mod_b2);
108
109 if (ret < 0)
110 return -EINVAL;
111
112 ret = dev->i2c_write(dev->priv_dev, 0xb3, 0x25); //mod_b3);
113 if (ret < 0)
114 return -EINVAL;
115
116 ret = dev->i2c_write(dev->priv_dev, 0xb4, 0x8b); //mod_b4);
117 if (ret < 0)
118 return -EINVAL;
119
120 ret = dev->i2c_write(dev->priv_dev, 0xb5, 0x4b); //mod_b5);
121 if (ret < 0)
122 return -EINVAL;
123
124 ret = dev->i2c_write(dev->priv_dev, 0xb6, 0x3f); //mod_b6);
125 if (ret < 0)
126 return -EINVAL;
127
128 ret = dev->i2c_write(dev->priv_dev, 0xb7, 0x3f); //mod_b7);
129 if (ret < 0)
130 return -EINVAL;
131
132 return E_OK;
133}
134
135static int s921_isdb_tune(struct s921_isdb_t *dev, struct s921_isdb_t_tune_params *params) {
136
137 int ret;
138 int index;
139
140 index = (params->frequency - 473143000)/6000000;
141
142 if (index > 48) {
143 return -EINVAL;
144 }
145
146 dev->i2c_write(dev->priv_dev, 0x47, 0x60);
147
148 ret = dev->i2c_write(dev->priv_dev, 0x68, 0x00);
149 if (ret < 0)
150 return -EINVAL;
151
152 ret = dev->i2c_write(dev->priv_dev, 0x69, 0x89);
153 if (ret < 0)
154 return -EINVAL;
155
156 ret = dev->i2c_write(dev->priv_dev, 0xf0, 0x48);
157 if (ret < 0)
158 return -EINVAL;
159
160 ret = dev->i2c_write(dev->priv_dev, 0xf1, 0x19);
161 if (ret < 0)
162 return -EINVAL;
163
164 ret = dev->i2c_write(dev->priv_dev, 0xf2, c_table[index*3]);
165 if (ret < 0)
166 return -EINVAL;
167
168 ret = dev->i2c_write(dev->priv_dev, 0xf3, c_table[index*3+1]);
169 if (ret < 0)
170 return -EINVAL;
171
172 ret = dev->i2c_write(dev->priv_dev, 0xf4, c_table[index*3+2]);
173 if (ret < 0)
174 return -EINVAL;
175
176 ret = dev->i2c_write(dev->priv_dev, 0xf5, 0xae);
177 if (ret < 0)
178 return -EINVAL;
179
180 ret = dev->i2c_write(dev->priv_dev, 0xf6, 0xb7);
181 if (ret < 0)
182 return -EINVAL;
183
184 ret = dev->i2c_write(dev->priv_dev, 0xf7, 0xba);
185 if (ret < 0)
186 return -EINVAL;
187
188 ret = dev->i2c_write(dev->priv_dev, 0xf8, 0xd7);
189 if (ret < 0)
190 return -EINVAL;
191
192 ret = dev->i2c_write(dev->priv_dev, 0x68, 0x0a);
193 if (ret < 0)
194 return -EINVAL;
195
196 ret = dev->i2c_write(dev->priv_dev, 0x69, 0x09);
197 if (ret < 0)
198 return -EINVAL;
199
200 dev->i2c_write(dev->priv_dev, 0x01, 0x40);
201 return 0;
202}
203
204static int s921_isdb_get_status(struct s921_isdb_t *dev, void *data) {
205 unsigned int *ret = (unsigned int*)data;
206 u8 ifagc_dt;
207 u8 rfagc_dt;
208
209 mdelay(10);
210 ifagc_dt = dev->i2c_read(dev->priv_dev, 0x81);
211 rfagc_dt = dev->i2c_read(dev->priv_dev, 0x82);
212 if (rfagc_dt == 0x40) {
213 *ret = 1;
214 }
215 return 0;
216}
diff --git a/drivers/media/dvb/frontends/s921_core.h b/drivers/media/dvb/frontends/s921_core.h
deleted file mode 100644
index de2f10a44e72..000000000000
--- a/drivers/media/dvb/frontends/s921_core.h
+++ /dev/null
@@ -1,114 +0,0 @@
1#ifndef _S921_CORE_H
2#define _S921_CORE_H
3//#define u8 unsigned int
4//#define u32 unsigned int
5
6
7
8//#define EINVAL -1
9#define E_OK 0
10
11struct s921_isdb_t {
12 void *priv_dev;
13 int (*i2c_write)(void *dev, u8 reg, u8 val);
14 int (*i2c_read)(void *dev, u8 reg);
15};
16
17#define ISDB_T_CMD_INIT 0
18#define ISDB_T_CMD_SET_PARAM 1
19#define ISDB_T_CMD_TUNE 2
20#define ISDB_T_CMD_GET_STATUS 3
21
22struct s921_isdb_t_tune_params {
23 u32 frequency;
24};
25
26struct s921_isdb_t_status {
27};
28
29struct s921_isdb_t_transmission_mode_params {
30 u8 mode;
31 u8 layer_a_mode;
32#define ISDB_T_LA_MODE_1 0
33#define ISDB_T_LA_MODE_2 1
34#define ISDB_T_LA_MODE_3 2
35 u8 layer_a_carrier_modulation;
36#define ISDB_T_LA_CM_DQPSK 0
37#define ISDB_T_LA_CM_QPSK 1
38#define ISDB_T_LA_CM_16QAM 2
39#define ISDB_T_LA_CM_64QAM 3
40#define ISDB_T_LA_CM_NOLAYER 4
41 u8 layer_a_code_rate;
42#define ISDB_T_LA_CR_1_2 0
43#define ISDB_T_LA_CR_2_3 1
44#define ISDB_T_LA_CR_3_4 2
45#define ISDB_T_LA_CR_5_6 4
46#define ISDB_T_LA_CR_7_8 8
47#define ISDB_T_LA_CR_NOLAYER 16
48 u8 layer_a_time_interleave;
49#define ISDB_T_LA_TI_0 0
50#define ISDB_T_LA_TI_1 1
51#define ISDB_T_LA_TI_2 2
52#define ISDB_T_LA_TI_4 4
53#define ISDB_T_LA_TI_8 8
54#define ISDB_T_LA_TI_16 16
55#define ISDB_T_LA_TI_32 32
56 u8 layer_a_nseg;
57
58 u8 layer_b_mode;
59#define ISDB_T_LB_MODE_1 0
60#define ISDB_T_LB_MODE_2 1
61#define ISDB_T_LB_MODE_3 2
62 u8 layer_b_carrier_modulation;
63#define ISDB_T_LB_CM_DQPSK 0
64#define ISDB_T_LB_CM_QPSK 1
65#define ISDB_T_LB_CM_16QAM 2
66#define ISDB_T_LB_CM_64QAM 3
67#define ISDB_T_LB_CM_NOLAYER 4
68 u8 layer_b_code_rate;
69#define ISDB_T_LB_CR_1_2 0
70#define ISDB_T_LB_CR_2_3 1
71#define ISDB_T_LB_CR_3_4 2
72#define ISDB_T_LB_CR_5_6 4
73#define ISDB_T_LB_CR_7_8 8
74#define ISDB_T_LB_CR_NOLAYER 16
75 u8 layer_b_time_interleave;
76#define ISDB_T_LB_TI_0 0
77#define ISDB_T_LB_TI_1 1
78#define ISDB_T_LB_TI_2 2
79#define ISDB_T_LB_TI_4 4
80#define ISDB_T_LB_TI_8 8
81#define ISDB_T_LB_TI_16 16
82#define ISDB_T_LB_TI_32 32
83 u8 layer_b_nseg;
84
85 u8 layer_c_mode;
86#define ISDB_T_LC_MODE_1 0
87#define ISDB_T_LC_MODE_2 1
88#define ISDB_T_LC_MODE_3 2
89 u8 layer_c_carrier_modulation;
90#define ISDB_T_LC_CM_DQPSK 0
91#define ISDB_T_LC_CM_QPSK 1
92#define ISDB_T_LC_CM_16QAM 2
93#define ISDB_T_LC_CM_64QAM 3
94#define ISDB_T_LC_CM_NOLAYER 4
95 u8 layer_c_code_rate;
96#define ISDB_T_LC_CR_1_2 0
97#define ISDB_T_LC_CR_2_3 1
98#define ISDB_T_LC_CR_3_4 2
99#define ISDB_T_LC_CR_5_6 4
100#define ISDB_T_LC_CR_7_8 8
101#define ISDB_T_LC_CR_NOLAYER 16
102 u8 layer_c_time_interleave;
103#define ISDB_T_LC_TI_0 0
104#define ISDB_T_LC_TI_1 1
105#define ISDB_T_LC_TI_2 2
106#define ISDB_T_LC_TI_4 4
107#define ISDB_T_LC_TI_8 8
108#define ISDB_T_LC_TI_16 16
109#define ISDB_T_LC_TI_32 32
110 u8 layer_c_nseg;
111};
112
113int s921_isdb_cmd(struct s921_isdb_t *dev, u32 cmd, void *data);
114#endif
diff --git a/drivers/media/dvb/frontends/s921_module.c b/drivers/media/dvb/frontends/s921_module.c
deleted file mode 100644
index 0eefff61cc50..000000000000
--- a/drivers/media/dvb/frontends/s921_module.c
+++ /dev/null
@@ -1,192 +0,0 @@
1/*
2 * Driver for Sharp s921 driver
3 *
4 * Copyright (C) 2008 Markus Rechberger <mrechberger@sundtek.de>
5 *
6 * All rights reserved.
7 *
8 */
9
10#include <linux/kernel.h>
11#include <linux/module.h>
12#include <linux/slab.h>
13#include <linux/delay.h>
14#include "dvb_frontend.h"
15#include "s921_module.h"
16#include "s921_core.h"
17
18static unsigned int debug = 0;
19module_param(debug, int, 0644);
20MODULE_PARM_DESC(debug,"s921 debugging (default off)");
21
22#define dprintk(fmt, args...) if (debug) do {\
23 printk("s921 debug: " fmt, ##args); } while (0)
24
25struct s921_state
26{
27 struct dvb_frontend frontend;
28 fe_modulation_t current_modulation;
29 __u32 snr;
30 __u32 current_frequency;
31 __u8 addr;
32 struct s921_isdb_t dev;
33 struct i2c_adapter *i2c;
34};
35
36static int s921_set_parameters(struct dvb_frontend *fe, struct dvb_frontend_parameters *param) {
37 struct s921_state *state = (struct s921_state *)fe->demodulator_priv;
38 struct s921_isdb_t_transmission_mode_params params;
39 struct s921_isdb_t_tune_params tune_params;
40
41 tune_params.frequency = param->frequency;
42 s921_isdb_cmd(&state->dev, ISDB_T_CMD_SET_PARAM, &params);
43 s921_isdb_cmd(&state->dev, ISDB_T_CMD_TUNE, &tune_params);
44 mdelay(100);
45 return 0;
46}
47
48static int s921_init(struct dvb_frontend *fe) {
49 printk("s921 init\n");
50 return 0;
51}
52
53static int s921_sleep(struct dvb_frontend *fe) {
54 printk("s921 sleep\n");
55 return 0;
56}
57
58static int s921_read_status(struct dvb_frontend *fe, fe_status_t *status)
59{
60 struct s921_state *state = (struct s921_state *)fe->demodulator_priv;
61 unsigned int ret;
62 mdelay(5);
63 s921_isdb_cmd(&state->dev, ISDB_T_CMD_GET_STATUS, &ret);
64 *status = 0;
65
66 printk("status: %02x\n", ret);
67 if (ret == 1) {
68 *status |= FE_HAS_CARRIER;
69 *status |= FE_HAS_VITERBI;
70 *status |= FE_HAS_LOCK;
71 *status |= FE_HAS_SYNC;
72 *status |= FE_HAS_SIGNAL;
73 }
74
75 return 0;
76}
77
78static int s921_read_ber(struct dvb_frontend *fe, __u32 *ber)
79{
80 dprintk("read ber\n");
81 return 0;
82}
83
84static int s921_read_snr(struct dvb_frontend *fe, __u16 *snr)
85{
86 dprintk("read snr\n");
87 return 0;
88}
89
90static int s921_read_ucblocks(struct dvb_frontend *fe, __u32 *ucblocks)
91{
92 dprintk("read ucblocks\n");
93 return 0;
94}
95
96static void s921_release(struct dvb_frontend *fe)
97{
98 struct s921_state *state = (struct s921_state *)fe->demodulator_priv;
99 kfree(state);
100}
101
102static struct dvb_frontend_ops demod_s921={
103 .info = {
104 .name = "SHARP S921",
105 .type = FE_OFDM,
106 .frequency_min = 473143000,
107 .frequency_max = 767143000,
108 .frequency_stepsize = 6000000,
109 .frequency_tolerance = 0,
110 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
111 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
112 FE_CAN_FEC_AUTO |
113 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
114 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
115 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER |
116 FE_CAN_MUTE_TS
117 },
118 .init = s921_init,
119 .sleep = s921_sleep,
120 .set_frontend = s921_set_parameters,
121 .read_snr = s921_read_snr,
122 .read_ber = s921_read_ber,
123 .read_status = s921_read_status,
124 .read_ucblocks = s921_read_ucblocks,
125 .release = s921_release,
126};
127
128static int s921_write(void *dev, u8 reg, u8 val) {
129 struct s921_state *state = dev;
130 char buf[2]={reg,val};
131 int err;
132 struct i2c_msg i2cmsgs = {
133 .addr = state->addr,
134 .flags = 0,
135 .len = 2,
136 .buf = buf
137 };
138
139 if((err = i2c_transfer(state->i2c, &i2cmsgs, 1))<0) {
140 printk("%s i2c_transfer error %d\n", __func__, err);
141 if (err < 0)
142 return err;
143 else
144 return -EREMOTEIO;
145 }
146
147 return 0;
148}
149
150static int s921_read(void *dev, u8 reg) {
151 struct s921_state *state = dev;
152 u8 b1;
153 int ret;
154 struct i2c_msg msg[2] = { { .addr = state->addr,
155 .flags = 0,
156 .buf = &reg, .len = 1 },
157 { .addr = state->addr,
158 .flags = I2C_M_RD,
159 .buf = &b1, .len = 1 } };
160
161 ret = i2c_transfer(state->i2c, msg, 2);
162 if (ret != 2)
163 return ret;
164 return b1;
165}
166
167struct dvb_frontend* s921_attach(const struct s921_config *config,
168 struct i2c_adapter *i2c)
169{
170
171 struct s921_state *state;
172 state = kzalloc(sizeof(struct s921_state), GFP_KERNEL);
173 if (state == NULL)
174 return NULL;
175
176 state->addr = config->i2c_address;
177 state->i2c = i2c;
178 state->dev.i2c_write = &s921_write;
179 state->dev.i2c_read = &s921_read;
180 state->dev.priv_dev = state;
181
182 s921_isdb_cmd(&state->dev, ISDB_T_CMD_INIT, NULL);
183
184 memcpy(&state->frontend.ops, &demod_s921, sizeof(struct dvb_frontend_ops));
185 state->frontend.demodulator_priv = state;
186 return &state->frontend;
187}
188
189EXPORT_SYMBOL_GPL(s921_attach);
190MODULE_AUTHOR("Markus Rechberger <mrechberger@empiatech.com>");
191MODULE_DESCRIPTION("Sharp S921 ISDB-T 1Seg");
192MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb/frontends/s921_module.h b/drivers/media/dvb/frontends/s921_module.h
deleted file mode 100644
index 78660424ba95..000000000000
--- a/drivers/media/dvb/frontends/s921_module.h
+++ /dev/null
@@ -1,49 +0,0 @@
1/*
2 * Driver for DVB-T s921 demodulator
3 *
4 * Copyright (C) 2008 Markus Rechberger <mrechberger@sundtek.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 *
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.=
20 */
21
22#ifndef S921_MODULE_H
23#define S921_MODULE_H
24
25#include <linux/dvb/frontend.h>
26#include "s921_core.h"
27
28int s921_isdb_init(struct s921_isdb_t *dev);
29int s921_isdb_cmd(struct s921_isdb_t *dev, u32 cmd, void *data);
30
31struct s921_config
32{
33 /* demodulator's I2C address */
34 u8 i2c_address;
35};
36
37#if defined(CONFIG_DVB_S921) || (defined(CONFIG_DVB_S921_MODULE) && defined(MODULE))
38extern struct dvb_frontend* s921_attach(const struct s921_config *config,
39 struct i2c_adapter *i2c);
40#else
41static inline struct dvb_frontend* s921_attach(const struct s921_config *config,
42 struct i2c_adapter *i2c)
43{
44 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
45 return NULL;
46}
47#endif /* CONFIG_DVB_S921 */
48
49#endif /* S921_H */
diff --git a/drivers/media/dvb/frontends/stb0899_drv.c b/drivers/media/dvb/frontends/stb0899_drv.c
index 8e38fcee564e..37a222d9ddb3 100644
--- a/drivers/media/dvb/frontends/stb0899_drv.c
+++ b/drivers/media/dvb/frontends/stb0899_drv.c
@@ -714,7 +714,7 @@ static int stb0899_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_ma
714 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 714 reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
715 STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0); 715 STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0);
716 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 716 stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
717 717 msleep(100);
718 return 0; 718 return 0;
719} 719}
720 720
diff --git a/drivers/media/dvb/frontends/stb6100.c b/drivers/media/dvb/frontends/stb6100.c
index 80a9e4cba631..64673b8b64a2 100644
--- a/drivers/media/dvb/frontends/stb6100.c
+++ b/drivers/media/dvb/frontends/stb6100.c
@@ -51,7 +51,7 @@ module_param(verbose, int, 0644);
51 if (x > y) \ 51 if (x > y) \
52 printk(format, ##arg); \ 52 printk(format, ##arg); \
53 } \ 53 } \
54} while(0) 54} while (0)
55 55
56struct stb6100_lkup { 56struct stb6100_lkup {
57 u32 val_low; 57 u32 val_low;
@@ -117,7 +117,10 @@ static const struct stb6100_regmask stb6100_template[] = {
117 [STB6100_TEST3] = { 0x00, 0xde }, 117 [STB6100_TEST3] = { 0x00, 0xde },
118}; 118};
119 119
120static void stb6100_normalise_regs(u8 regs[]) 120/*
121 * Currently unused. Some boards might need it in the future
122 */
123static inline void stb6100_normalise_regs(u8 regs[])
121{ 124{
122 int i; 125 int i;
123 126
@@ -157,13 +160,25 @@ static int stb6100_read_reg(struct stb6100_state *state, u8 reg)
157 u8 regs[STB6100_NUMREGS]; 160 u8 regs[STB6100_NUMREGS];
158 int rc; 161 int rc;
159 162
163 struct i2c_msg msg = {
164 .addr = state->config->tuner_address + reg,
165 .flags = I2C_M_RD,
166 .buf = regs,
167 .len = 1
168 };
169
170 rc = i2c_transfer(state->i2c, &msg, 1);
171
160 if (unlikely(reg >= STB6100_NUMREGS)) { 172 if (unlikely(reg >= STB6100_NUMREGS)) {
161 dprintk(verbose, FE_ERROR, 1, "Invalid register offset 0x%x", reg); 173 dprintk(verbose, FE_ERROR, 1, "Invalid register offset 0x%x", reg);
162 return -EINVAL; 174 return -EINVAL;
163 } 175 }
164 if ((rc = stb6100_read_regs(state, regs)) < 0) 176 if (unlikely(verbose > FE_DEBUG)) {
165 return rc; 177 dprintk(verbose, FE_DEBUG, 1, " Read from 0x%02x", state->config->tuner_address);
166 return (unsigned int)regs[reg]; 178 dprintk(verbose, FE_DEBUG, 1, " %s: 0x%02x", stb6100_regnames[reg], regs[0]);
179 }
180
181 return (unsigned int)regs[0];
167} 182}
168 183
169static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int start, int len) 184static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int start, int len)
@@ -211,20 +226,17 @@ static int stb6100_write_reg(struct stb6100_state *state, u8 reg, u8 data)
211 return stb6100_write_reg_range(state, &data, reg, 1); 226 return stb6100_write_reg_range(state, &data, reg, 1);
212} 227}
213 228
214static int stb6100_write_regs(struct stb6100_state *state, u8 regs[])
215{
216 stb6100_normalise_regs(regs);
217 return stb6100_write_reg_range(state, &regs[1], 1, STB6100_NUMREGS - 1);
218}
219 229
220static int stb6100_get_status(struct dvb_frontend *fe, u32 *status) 230static int stb6100_get_status(struct dvb_frontend *fe, u32 *status)
221{ 231{
222 int rc; 232 int rc;
223 struct stb6100_state *state = fe->tuner_priv; 233 struct stb6100_state *state = fe->tuner_priv;
224 234
225 if ((rc = stb6100_read_reg(state, STB6100_LD)) < 0) 235 rc = stb6100_read_reg(state, STB6100_LD);
236 if (rc < 0) {
237 dprintk(verbose, FE_ERROR, 1, "%s failed", __func__);
226 return rc; 238 return rc;
227 239 }
228 return (rc & STB6100_LD_LOCK) ? TUNER_STATUS_LOCKED : 0; 240 return (rc & STB6100_LD_LOCK) ? TUNER_STATUS_LOCKED : 0;
229} 241}
230 242
@@ -234,7 +246,8 @@ static int stb6100_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
234 u8 f; 246 u8 f;
235 struct stb6100_state *state = fe->tuner_priv; 247 struct stb6100_state *state = fe->tuner_priv;
236 248
237 if ((rc = stb6100_read_reg(state, STB6100_F)) < 0) 249 rc = stb6100_read_reg(state, STB6100_F);
250 if (rc < 0)
238 return rc; 251 return rc;
239 f = rc & STB6100_F_F; 252 f = rc & STB6100_F_F;
240 253
@@ -265,14 +278,21 @@ static int stb6100_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth)
265 /* Turn on LPF bandwidth setting clock control, 278 /* Turn on LPF bandwidth setting clock control,
266 * set bandwidth, wait 10ms, turn off. 279 * set bandwidth, wait 10ms, turn off.
267 */ 280 */
268 if ((rc = stb6100_write_reg(state, STB6100_FCCK, 0x0d | STB6100_FCCK_FCCK)) < 0) 281 rc = stb6100_write_reg(state, STB6100_FCCK, 0x0d | STB6100_FCCK_FCCK);
282 if (rc < 0)
269 return rc; 283 return rc;
270 if ((rc = stb6100_write_reg(state, STB6100_F, 0xc0 | tmp)) < 0) 284 rc = stb6100_write_reg(state, STB6100_F, 0xc0 | tmp);
285 if (rc < 0)
271 return rc; 286 return rc;
272 msleep(1); 287
273 if ((rc = stb6100_write_reg(state, STB6100_FCCK, 0x0d)) < 0) 288 msleep(5); /* This is dangerous as another (related) thread may start */
289
290 rc = stb6100_write_reg(state, STB6100_FCCK, 0x0d);
291 if (rc < 0)
274 return rc; 292 return rc;
275 293
294 msleep(10); /* This is dangerous as another (related) thread may start */
295
276 return 0; 296 return 0;
277} 297}
278 298
@@ -284,7 +304,8 @@ static int stb6100_get_frequency(struct dvb_frontend *fe, u32 *frequency)
284 struct stb6100_state *state = fe->tuner_priv; 304 struct stb6100_state *state = fe->tuner_priv;
285 u8 regs[STB6100_NUMREGS]; 305 u8 regs[STB6100_NUMREGS];
286 306
287 if ((rc = stb6100_read_regs(state, regs)) < 0) 307 rc = stb6100_read_regs(state, regs);
308 if (rc < 0)
288 return rc; 309 return rc;
289 310
290 odiv = (regs[STB6100_VCO] & STB6100_VCO_ODIV) >> STB6100_VCO_ODIV_SHIFT; 311 odiv = (regs[STB6100_VCO] & STB6100_VCO_ODIV) >> STB6100_VCO_ODIV_SHIFT;
@@ -312,8 +333,7 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency)
312 u8 regs[STB6100_NUMREGS]; 333 u8 regs[STB6100_NUMREGS];
313 u8 g, psd2, odiv; 334 u8 g, psd2, odiv;
314 335
315 if ((rc = stb6100_read_regs(state, regs)) < 0) 336 dprintk(verbose, FE_DEBUG, 1, "Version 2010-8-14 13:51");
316 return rc;
317 337
318 if (fe->ops.get_frontend) { 338 if (fe->ops.get_frontend) {
319 dprintk(verbose, FE_DEBUG, 1, "Get frontend parameters"); 339 dprintk(verbose, FE_DEBUG, 1, "Get frontend parameters");
@@ -321,96 +341,140 @@ static int stb6100_set_frequency(struct dvb_frontend *fe, u32 frequency)
321 } 341 }
322 srate = p.u.qpsk.symbol_rate; 342 srate = p.u.qpsk.symbol_rate;
323 343
324 regs[STB6100_DLB] = 0xdc; 344 /* Set up tuner cleanly, LPF calibration on */
325 /* Disable LPEN */ 345 rc = stb6100_write_reg(state, STB6100_FCCK, 0x4d | STB6100_FCCK_FCCK);
326 regs[STB6100_LPEN] &= ~STB6100_LPEN_LPEN; /* PLL Loop disabled */ 346 if (rc < 0)
347 return rc; /* allow LPF calibration */
327 348
328 if ((rc = stb6100_write_regs(state, regs)) < 0) 349 /* PLL Loop disabled, bias on, VCO on, synth on */
350 regs[STB6100_LPEN] = 0xeb;
351 rc = stb6100_write_reg(state, STB6100_LPEN, regs[STB6100_LPEN]);
352 if (rc < 0)
329 return rc; 353 return rc;
330 354
331 /* Baseband gain. */ 355 /* Program the registers with their data values */
332 if (srate >= 15000000)
333 g = 9; // +4 dB
334 else if (srate >= 5000000)
335 g = 11; // +8 dB
336 else
337 g = 14; // +14 dB
338
339 regs[STB6100_G] = (regs[STB6100_G] & ~STB6100_G_G) | g;
340 regs[STB6100_G] &= ~STB6100_G_GCT; /* mask GCT */
341 regs[STB6100_G] |= (1 << 5); /* 2Vp-p Mode */
342 356
343 /* VCO divide ratio (LO divide ratio, VCO prescaler enable). */ 357 /* VCO divide ratio (LO divide ratio, VCO prescaler enable). */
344 if (frequency <= 1075000) 358 if (frequency <= 1075000)
345 odiv = 1; 359 odiv = 1;
346 else 360 else
347 odiv = 0; 361 odiv = 0;
348 regs[STB6100_VCO] = (regs[STB6100_VCO] & ~STB6100_VCO_ODIV) | (odiv << STB6100_VCO_ODIV_SHIFT);
349 362
350 if ((frequency > 1075000) && (frequency <= 1325000)) 363 /* VCO enabled, seach clock off as per LL3.7, 3.4.1 */
351 psd2 = 0; 364 regs[STB6100_VCO] = 0xe0 | (odiv << STB6100_VCO_ODIV_SHIFT);
352 else
353 psd2 = 1;
354 regs[STB6100_K] = (regs[STB6100_K] & ~STB6100_K_PSD2) | (psd2 << STB6100_K_PSD2_SHIFT);
355 365
356 /* OSM */ 366 /* OSM */
357 for (ptr = lkup; 367 for (ptr = lkup;
358 (ptr->val_high != 0) && !CHKRANGE(frequency, ptr->val_low, ptr->val_high); 368 (ptr->val_high != 0) && !CHKRANGE(frequency, ptr->val_low, ptr->val_high);
359 ptr++); 369 ptr++);
370
360 if (ptr->val_high == 0) { 371 if (ptr->val_high == 0) {
361 printk(KERN_ERR "%s: frequency out of range: %u kHz\n", __func__, frequency); 372 printk(KERN_ERR "%s: frequency out of range: %u kHz\n", __func__, frequency);
362 return -EINVAL; 373 return -EINVAL;
363 } 374 }
364 regs[STB6100_VCO] = (regs[STB6100_VCO] & ~STB6100_VCO_OSM) | ptr->reg; 375 regs[STB6100_VCO] = (regs[STB6100_VCO] & ~STB6100_VCO_OSM) | ptr->reg;
376 rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO]);
377 if (rc < 0)
378 return rc;
365 379
380 if ((frequency > 1075000) && (frequency <= 1325000))
381 psd2 = 0;
382 else
383 psd2 = 1;
366 /* F(VCO) = F(LO) * (ODIV == 0 ? 2 : 4) */ 384 /* F(VCO) = F(LO) * (ODIV == 0 ? 2 : 4) */
367 fvco = frequency << (1 + odiv); 385 fvco = frequency << (1 + odiv);
368 /* N(I) = floor(f(VCO) / (f(XTAL) * (PSD2 ? 2 : 1))) */ 386 /* N(I) = floor(f(VCO) / (f(XTAL) * (PSD2 ? 2 : 1))) */
369 nint = fvco / (state->reference << psd2); 387 nint = fvco / (state->reference << psd2);
370 /* N(F) = round(f(VCO) / f(XTAL) * (PSD2 ? 2 : 1) - N(I)) * 2 ^ 9 */ 388 /* N(F) = round(f(VCO) / f(XTAL) * (PSD2 ? 2 : 1) - N(I)) * 2 ^ 9 */
371 nfrac = DIV_ROUND_CLOSEST((fvco - (nint * state->reference << psd2)) 389 nfrac = DIV_ROUND_CLOSEST((fvco - (nint * state->reference << psd2))
372 << (9 - psd2), 390 << (9 - psd2), state->reference);
373 state->reference); 391
392 /* NI */
393 regs[STB6100_NI] = nint;
394 rc = stb6100_write_reg(state, STB6100_NI, regs[STB6100_NI]);
395 if (rc < 0)
396 return rc;
397
398 /* NF */
399 regs[STB6100_NF_LSB] = nfrac;
400 rc = stb6100_write_reg(state, STB6100_NF_LSB, regs[STB6100_NF_LSB]);
401 if (rc < 0)
402 return rc;
403
404 /* K */
405 regs[STB6100_K] = (0x38 & ~STB6100_K_PSD2) | (psd2 << STB6100_K_PSD2_SHIFT);
406 regs[STB6100_K] = (regs[STB6100_K] & ~STB6100_K_NF_MSB) | ((nfrac >> 8) & STB6100_K_NF_MSB);
407 rc = stb6100_write_reg(state, STB6100_K, regs[STB6100_K]);
408 if (rc < 0)
409 return rc;
410
411 /* G Baseband gain. */
412 if (srate >= 15000000)
413 g = 9; /* +4 dB */
414 else if (srate >= 5000000)
415 g = 11; /* +8 dB */
416 else
417 g = 14; /* +14 dB */
418
419 regs[STB6100_G] = (0x10 & ~STB6100_G_G) | g;
420 regs[STB6100_G] &= ~STB6100_G_GCT; /* mask GCT */
421 regs[STB6100_G] |= (1 << 5); /* 2Vp-p Mode */
422 rc = stb6100_write_reg(state, STB6100_G, regs[STB6100_G]);
423 if (rc < 0)
424 return rc;
425
426 /* F we don't write as it is set up in BW set */
427
428 /* DLB set DC servo loop BW to 160Hz (LLA 3.8 / 2.1) */
429 regs[STB6100_DLB] = 0xcc;
430 rc = stb6100_write_reg(state, STB6100_DLB, regs[STB6100_DLB]);
431 if (rc < 0)
432 return rc;
433
374 dprintk(verbose, FE_DEBUG, 1, 434 dprintk(verbose, FE_DEBUG, 1,
375 "frequency = %u, srate = %u, g = %u, odiv = %u, psd2 = %u, fxtal = %u, osm = %u, fvco = %u, N(I) = %u, N(F) = %u", 435 "frequency = %u, srate = %u, g = %u, odiv = %u, psd2 = %u, fxtal = %u, osm = %u, fvco = %u, N(I) = %u, N(F) = %u",
376 frequency, srate, (unsigned int)g, (unsigned int)odiv, 436 frequency, srate, (unsigned int)g, (unsigned int)odiv,
377 (unsigned int)psd2, state->reference, 437 (unsigned int)psd2, state->reference,
378 ptr->reg, fvco, nint, nfrac); 438 ptr->reg, fvco, nint, nfrac);
379 regs[STB6100_NI] = nint;
380 regs[STB6100_NF_LSB] = nfrac;
381 regs[STB6100_K] = (regs[STB6100_K] & ~STB6100_K_NF_MSB) | ((nfrac >> 8) & STB6100_K_NF_MSB);
382 regs[STB6100_VCO] |= STB6100_VCO_OSCH; /* VCO search enabled */
383 regs[STB6100_VCO] |= STB6100_VCO_OCK; /* VCO search clock off */
384 regs[STB6100_FCCK] |= STB6100_FCCK_FCCK; /* LPF BW setting clock enabled */
385 regs[STB6100_LPEN] &= ~STB6100_LPEN_LPEN; /* PLL loop disabled */
386 /* Power up. */
387 regs[STB6100_LPEN] |= STB6100_LPEN_SYNP | STB6100_LPEN_OSCP | STB6100_LPEN_BEN;
388 439
389 msleep(2); 440 /* Set up the test registers */
390 if ((rc = stb6100_write_regs(state, regs)) < 0) 441 regs[STB6100_TEST1] = 0x8f;
442 rc = stb6100_write_reg(state, STB6100_TEST1, regs[STB6100_TEST1]);
443 if (rc < 0)
444 return rc;
445 regs[STB6100_TEST3] = 0xde;
446 rc = stb6100_write_reg(state, STB6100_TEST3, regs[STB6100_TEST3]);
447 if (rc < 0)
391 return rc; 448 return rc;
392 449
393 msleep(2); 450 /* Bring up tuner according to LLA 3.7 3.4.1, step 2 */
394 regs[STB6100_LPEN] |= STB6100_LPEN_LPEN; /* PLL loop enabled */ 451 regs[STB6100_LPEN] = 0xfb; /* PLL Loop enabled, bias on, VCO on, synth on */
395 if ((rc = stb6100_write_reg(state, STB6100_LPEN, regs[STB6100_LPEN])) < 0) 452 rc = stb6100_write_reg(state, STB6100_LPEN, regs[STB6100_LPEN]);
453 if (rc < 0)
396 return rc; 454 return rc;
397 455
456 msleep(2);
457
458 /* Bring up tuner according to LLA 3.7 3.4.1, step 3 */
398 regs[STB6100_VCO] &= ~STB6100_VCO_OCK; /* VCO fast search */ 459 regs[STB6100_VCO] &= ~STB6100_VCO_OCK; /* VCO fast search */
399 if ((rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO])) < 0) 460 rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO]);
461 if (rc < 0)
400 return rc; 462 return rc;
401 463
402 msleep(10); /* wait for LO to lock */ 464 msleep(10); /* This is dangerous as another (related) thread may start */ /* wait for LO to lock */
465
403 regs[STB6100_VCO] &= ~STB6100_VCO_OSCH; /* vco search disabled */ 466 regs[STB6100_VCO] &= ~STB6100_VCO_OSCH; /* vco search disabled */
404 regs[STB6100_VCO] |= STB6100_VCO_OCK; /* search clock off */ 467 regs[STB6100_VCO] |= STB6100_VCO_OCK; /* search clock off */
405 if ((rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO])) < 0) 468 rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO]);
406 return rc; 469 if (rc < 0)
407 regs[STB6100_FCCK] &= ~STB6100_FCCK_FCCK; /* LPF BW clock disabled */
408 stb6100_normalise_regs(regs);
409 if ((rc = stb6100_write_reg_range(state, &regs[1], 1, STB6100_NUMREGS - 3)) < 0)
410 return rc; 470 return rc;
411 471
412 msleep(100); 472 rc = stb6100_write_reg(state, STB6100_FCCK, 0x0d);
473 if (rc < 0)
474 return rc; /* Stop LPF calibration */
413 475
476 msleep(10); /* This is dangerous as another (related) thread may start */
477 /* wait for stabilisation, (should not be necessary) */
414 return 0; 478 return 0;
415} 479}
416 480
@@ -433,8 +497,8 @@ static int stb6100_init(struct dvb_frontend *fe)
433 state->bandwidth = status->bandwidth * 1000; /* Hz */ 497 state->bandwidth = status->bandwidth * 1000; /* Hz */
434 state->reference = status->refclock / 1000; /* kHz */ 498 state->reference = status->refclock / 1000; /* kHz */
435 499
436 /* Set default bandwidth. */ 500 /* Set default bandwidth. Modified, PN 13-May-10 */
437 return stb6100_set_bandwidth(fe, state->bandwidth); 501 return 0;
438} 502}
439 503
440static int stb6100_get_state(struct dvb_frontend *fe, 504static int stb6100_get_state(struct dvb_frontend *fe,
diff --git a/drivers/media/dvb/frontends/stv090x.c b/drivers/media/dvb/frontends/stv090x.c
index 425e7a43ae19..4e0fc2c8a41c 100644
--- a/drivers/media/dvb/frontends/stv090x.c
+++ b/drivers/media/dvb/frontends/stv090x.c
@@ -1483,8 +1483,8 @@ static int stv090x_start_search(struct stv090x_state *state)
1483 if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0) 1483 if (STV090x_WRITE_DEMOD(state, FFECFG, 0x41) < 0)
1484 goto err; 1484 goto err;
1485 1485
1486 if ((state->search_mode == STV090x_DVBS1) || 1486 if ((state->search_mode == STV090x_SEARCH_DVBS1) ||
1487 (state->search_mode == STV090x_DSS) || 1487 (state->search_mode == STV090x_SEARCH_DSS) ||
1488 (state->search_mode == STV090x_SEARCH_AUTO)) { 1488 (state->search_mode == STV090x_SEARCH_AUTO)) {
1489 1489
1490 if (STV090x_WRITE_DEMOD(state, VITSCALE, 0x82) < 0) 1490 if (STV090x_WRITE_DEMOD(state, VITSCALE, 0x82) < 0)
@@ -2940,7 +2940,7 @@ static int stv090x_optimize_track(struct stv090x_state *state)
2940 STV090x_WRITE_DEMOD(state, ERRCTRL1, 0x67); /* PER */ 2940 STV090x_WRITE_DEMOD(state, ERRCTRL1, 0x67); /* PER */
2941 break; 2941 break;
2942 2942
2943 case STV090x_UNKNOWN: 2943 case STV090x_ERROR:
2944 default: 2944 default:
2945 reg = STV090x_READ_DEMOD(state, DMDCFGMD); 2945 reg = STV090x_READ_DEMOD(state, DMDCFGMD);
2946 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1); 2946 STV090x_SETFIELD_Px(reg, DVBS1_ENABLE_FIELD, 1);
diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
index fd0830ed10d8..a13a50503134 100644
--- a/drivers/media/dvb/mantis/Kconfig
+++ b/drivers/media/dvb/mantis/Kconfig
@@ -1,6 +1,6 @@
1config MANTIS_CORE 1config MANTIS_CORE
2 tristate "Mantis/Hopper PCI bridge based devices" 2 tristate "Mantis/Hopper PCI bridge based devices"
3 depends on PCI && I2C && INPUT && IR_CORE 3 depends on PCI && I2C && INPUT && RC_CORE
4 4
5 help 5 help
6 Support for PCI cards based on the Mantis and Hopper PCi bridge. 6 Support for PCI cards based on the Mantis and Hopper PCi bridge.
diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
index 09e9fc785189..70e73afefb3d 100644
--- a/drivers/media/dvb/mantis/hopper_cards.c
+++ b/drivers/media/dvb/mantis/hopper_cards.c
@@ -251,6 +251,8 @@ static struct pci_device_id hopper_pci_table[] = {
251 { } 251 { }
252}; 252};
253 253
254MODULE_DEVICE_TABLE(pci, hopper_pci_table);
255
254static struct pci_driver hopper_pci_driver = { 256static struct pci_driver hopper_pci_driver = {
255 .name = DRIVER_NAME, 257 .name = DRIVER_NAME,
256 .id_table = hopper_pci_table, 258 .id_table = hopper_pci_table,
diff --git a/drivers/media/dvb/mantis/hopper_vp3028.c b/drivers/media/dvb/mantis/hopper_vp3028.c
index 96674c78e86b..68a29f8bdf73 100644
--- a/drivers/media/dvb/mantis/hopper_vp3028.c
+++ b/drivers/media/dvb/mantis/hopper_vp3028.c
@@ -47,17 +47,17 @@ static int vp3028_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
47 struct mantis_hwconfig *config = mantis->hwconfig; 47 struct mantis_hwconfig *config = mantis->hwconfig;
48 int err = 0; 48 int err = 0;
49 49
50 gpio_set_bits(mantis, config->reset, 0); 50 mantis_gpio_set_bits(mantis, config->reset, 0);
51 msleep(100); 51 msleep(100);
52 err = mantis_frontend_power(mantis, POWER_ON); 52 err = mantis_frontend_power(mantis, POWER_ON);
53 msleep(100); 53 msleep(100);
54 gpio_set_bits(mantis, config->reset, 1); 54 mantis_gpio_set_bits(mantis, config->reset, 1);
55 55
56 err = mantis_frontend_power(mantis, POWER_ON); 56 err = mantis_frontend_power(mantis, POWER_ON);
57 if (err == 0) { 57 if (err == 0) {
58 msleep(250); 58 msleep(250);
59 dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)"); 59 dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
60 fe = zl10353_attach(&hopper_vp3028_config, adapter); 60 fe = dvb_attach(zl10353_attach, &hopper_vp3028_config, adapter);
61 61
62 if (!fe) 62 if (!fe)
63 return -1; 63 return -1;
diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
index cf4b39ffdaad..40da225098cc 100644
--- a/drivers/media/dvb/mantis/mantis_cards.c
+++ b/drivers/media/dvb/mantis/mantis_cards.c
@@ -281,6 +281,8 @@ static struct pci_device_id mantis_pci_table[] = {
281 { } 281 { }
282}; 282};
283 283
284MODULE_DEVICE_TABLE(pci, mantis_pci_table);
285
284static struct pci_driver mantis_pci_driver = { 286static struct pci_driver mantis_pci_driver = {
285 .name = DRIVER_NAME, 287 .name = DRIVER_NAME,
286 .id_table = mantis_pci_table, 288 .id_table = mantis_pci_table,
diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
index d0b645a483c9..bd400d21b81f 100644
--- a/drivers/media/dvb/mantis/mantis_common.h
+++ b/drivers/media/dvb/mantis/mantis_common.h
@@ -171,7 +171,9 @@ struct mantis_pci {
171 struct work_struct uart_work; 171 struct work_struct uart_work;
172 spinlock_t uart_lock; 172 spinlock_t uart_lock;
173 173
174 struct input_dev *rc; 174 struct rc_dev *rc;
175 char input_name[80];
176 char input_phys[80];
175}; 177};
176 178
177#define MANTIS_HIF_STATUS (mantis->gpio_status) 179#define MANTIS_HIF_STATUS (mantis->gpio_status)
diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
index 99d82eec3b03..e5180e45d310 100644
--- a/drivers/media/dvb/mantis/mantis_dvb.c
+++ b/drivers/media/dvb/mantis/mantis_dvb.c
@@ -47,15 +47,15 @@ int mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power)
47 switch (power) { 47 switch (power) {
48 case POWER_ON: 48 case POWER_ON:
49 dprintk(MANTIS_DEBUG, 1, "Power ON"); 49 dprintk(MANTIS_DEBUG, 1, "Power ON");
50 gpio_set_bits(mantis, config->power, POWER_ON); 50 mantis_gpio_set_bits(mantis, config->power, POWER_ON);
51 msleep(100); 51 msleep(100);
52 gpio_set_bits(mantis, config->power, POWER_ON); 52 mantis_gpio_set_bits(mantis, config->power, POWER_ON);
53 msleep(100); 53 msleep(100);
54 break; 54 break;
55 55
56 case POWER_OFF: 56 case POWER_OFF:
57 dprintk(MANTIS_DEBUG, 1, "Power OFF"); 57 dprintk(MANTIS_DEBUG, 1, "Power OFF");
58 gpio_set_bits(mantis, config->power, POWER_OFF); 58 mantis_gpio_set_bits(mantis, config->power, POWER_OFF);
59 msleep(100); 59 msleep(100);
60 break; 60 break;
61 61
@@ -73,13 +73,13 @@ void mantis_frontend_soft_reset(struct mantis_pci *mantis)
73 struct mantis_hwconfig *config = mantis->hwconfig; 73 struct mantis_hwconfig *config = mantis->hwconfig;
74 74
75 dprintk(MANTIS_DEBUG, 1, "Frontend RESET"); 75 dprintk(MANTIS_DEBUG, 1, "Frontend RESET");
76 gpio_set_bits(mantis, config->reset, 0); 76 mantis_gpio_set_bits(mantis, config->reset, 0);
77 msleep(100); 77 msleep(100);
78 gpio_set_bits(mantis, config->reset, 0); 78 mantis_gpio_set_bits(mantis, config->reset, 0);
79 msleep(100); 79 msleep(100);
80 gpio_set_bits(mantis, config->reset, 1); 80 mantis_gpio_set_bits(mantis, config->reset, 1);
81 msleep(100); 81 msleep(100);
82 gpio_set_bits(mantis, config->reset, 1); 82 mantis_gpio_set_bits(mantis, config->reset, 1);
83 msleep(100); 83 msleep(100);
84 84
85 return; 85 return;
@@ -117,6 +117,7 @@ static int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
117 if (mantis->feeds == 1) { 117 if (mantis->feeds == 1) {
118 dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma"); 118 dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma");
119 mantis_dma_start(mantis); 119 mantis_dma_start(mantis);
120 tasklet_enable(&mantis->tasklet);
120 } 121 }
121 122
122 return mantis->feeds; 123 return mantis->feeds;
@@ -136,6 +137,7 @@ static int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
136 mantis->feeds--; 137 mantis->feeds--;
137 if (mantis->feeds == 0) { 138 if (mantis->feeds == 0) {
138 dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma"); 139 dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma");
140 tasklet_disable(&mantis->tasklet);
139 mantis_dma_stop(mantis); 141 mantis_dma_stop(mantis);
140 } 142 }
141 143
@@ -216,6 +218,7 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
216 218
217 dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx); 219 dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
218 tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis); 220 tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
221 tasklet_disable(&mantis->tasklet);
219 if (mantis->hwconfig) { 222 if (mantis->hwconfig) {
220 result = config->frontend_init(mantis, mantis->fe); 223 result = config->frontend_init(mantis, mantis->fe);
221 if (result < 0) { 224 if (result < 0) {
diff --git a/drivers/media/dvb/mantis/mantis_input.c b/drivers/media/dvb/mantis/mantis_input.c
index a99489b8418b..db6d54d3fec0 100644
--- a/drivers/media/dvb/mantis/mantis_input.c
+++ b/drivers/media/dvb/mantis/mantis_input.c
@@ -18,8 +18,7 @@
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/ 19*/
20 20
21#include <linux/input.h> 21#include <media/rc-core.h>
22#include <media/ir-core.h>
23#include <linux/pci.h> 22#include <linux/pci.h>
24 23
25#include "dmxdev.h" 24#include "dmxdev.h"
@@ -33,8 +32,9 @@
33#include "mantis_uart.h" 32#include "mantis_uart.h"
34 33
35#define MODULE_NAME "mantis_core" 34#define MODULE_NAME "mantis_core"
35#define RC_MAP_MANTIS "rc-mantis"
36 36
37static struct ir_scancode mantis_ir_table[] = { 37static struct rc_map_table mantis_ir_table[] = {
38 { 0x29, KEY_POWER }, 38 { 0x29, KEY_POWER },
39 { 0x28, KEY_FAVORITES }, 39 { 0x28, KEY_FAVORITES },
40 { 0x30, KEY_TEXT }, 40 { 0x30, KEY_TEXT },
@@ -95,53 +95,65 @@ static struct ir_scancode mantis_ir_table[] = {
95 { 0x00, KEY_BLUE }, 95 { 0x00, KEY_BLUE },
96}; 96};
97 97
98struct ir_scancode_table ir_mantis = { 98static struct rc_map_list ir_mantis_map = {
99 .scan = mantis_ir_table, 99 .map = {
100 .size = ARRAY_SIZE(mantis_ir_table), 100 .scan = mantis_ir_table,
101 .size = ARRAY_SIZE(mantis_ir_table),
102 .rc_type = RC_TYPE_UNKNOWN,
103 .name = RC_MAP_MANTIS,
104 }
101}; 105};
102EXPORT_SYMBOL_GPL(ir_mantis);
103 106
104int mantis_input_init(struct mantis_pci *mantis) 107int mantis_input_init(struct mantis_pci *mantis)
105{ 108{
106 struct input_dev *rc; 109 struct rc_dev *dev;
107 char name[80], dev[80];
108 int err; 110 int err;
109 111
110 rc = input_allocate_device(); 112 err = rc_map_register(&ir_mantis_map);
111 if (!rc) { 113 if (err)
112 dprintk(MANTIS_ERROR, 1, "Input device allocate failed"); 114 goto out;
113 return -ENOMEM;
114 }
115 115
116 sprintf(name, "Mantis %s IR receiver", mantis->hwconfig->model_name); 116 dev = rc_allocate_device();
117 sprintf(dev, "pci-%s/ir0", pci_name(mantis->pdev)); 117 if (!dev) {
118 dprintk(MANTIS_ERROR, 1, "Remote device allocation failed");
119 err = -ENOMEM;
120 goto out_map;
121 }
118 122
119 rc->name = name; 123 sprintf(mantis->input_name, "Mantis %s IR receiver", mantis->hwconfig->model_name);
120 rc->phys = dev; 124 sprintf(mantis->input_phys, "pci-%s/ir0", pci_name(mantis->pdev));
121 125
122 rc->id.bustype = BUS_PCI; 126 dev->input_name = mantis->input_name;
123 rc->id.vendor = mantis->vendor_id; 127 dev->input_phys = mantis->input_phys;
124 rc->id.product = mantis->device_id; 128 dev->input_id.bustype = BUS_PCI;
125 rc->id.version = 1; 129 dev->input_id.vendor = mantis->vendor_id;
126 rc->dev = mantis->pdev->dev; 130 dev->input_id.product = mantis->device_id;
131 dev->input_id.version = 1;
132 dev->driver_name = MODULE_NAME;
133 dev->map_name = RC_MAP_MANTIS;
134 dev->dev.parent = &mantis->pdev->dev;
127 135
128 err = __ir_input_register(rc, &ir_mantis, NULL, MODULE_NAME); 136 err = rc_register_device(dev);
129 if (err) { 137 if (err) {
130 dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err); 138 dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err);
131 input_free_device(rc); 139 goto out_dev;
132 return -ENODEV;
133 } 140 }
134 141
135 mantis->rc = rc; 142 mantis->rc = dev;
136
137 return 0; 143 return 0;
144
145out_dev:
146 rc_free_device(dev);
147out_map:
148 rc_map_unregister(&ir_mantis_map);
149out:
150 return err;
138} 151}
139 152
140int mantis_exit(struct mantis_pci *mantis) 153int mantis_exit(struct mantis_pci *mantis)
141{ 154{
142 struct input_dev *rc = mantis->rc; 155 rc_unregister_device(mantis->rc);
143 156 rc_map_unregister(&ir_mantis_map);
144 ir_input_unregister(rc);
145
146 return 0; 157 return 0;
147} 158}
159
diff --git a/drivers/media/dvb/mantis/mantis_ioc.c b/drivers/media/dvb/mantis/mantis_ioc.c
index fe31cfb0b158..479086dbb9a8 100644
--- a/drivers/media/dvb/mantis/mantis_ioc.c
+++ b/drivers/media/dvb/mantis/mantis_ioc.c
@@ -75,7 +75,7 @@ int mantis_get_mac(struct mantis_pci *mantis)
75EXPORT_SYMBOL_GPL(mantis_get_mac); 75EXPORT_SYMBOL_GPL(mantis_get_mac);
76 76
77/* Turn the given bit on or off. */ 77/* Turn the given bit on or off. */
78void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value) 78void mantis_gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
79{ 79{
80 u32 cur; 80 u32 cur;
81 81
@@ -90,7 +90,7 @@ void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
90 mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR); 90 mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
91 mmwrite(0x00, MANTIS_GPIF_DOUT); 91 mmwrite(0x00, MANTIS_GPIF_DOUT);
92} 92}
93EXPORT_SYMBOL_GPL(gpio_set_bits); 93EXPORT_SYMBOL_GPL(mantis_gpio_set_bits);
94 94
95int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl) 95int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl)
96{ 96{
diff --git a/drivers/media/dvb/mantis/mantis_ioc.h b/drivers/media/dvb/mantis/mantis_ioc.h
index 188fe5a81614..d56e002b2955 100644
--- a/drivers/media/dvb/mantis/mantis_ioc.h
+++ b/drivers/media/dvb/mantis/mantis_ioc.h
@@ -44,7 +44,7 @@ enum mantis_stream_control {
44}; 44};
45 45
46extern int mantis_get_mac(struct mantis_pci *mantis); 46extern int mantis_get_mac(struct mantis_pci *mantis);
47extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value); 47extern void mantis_gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
48 48
49extern int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl); 49extern int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl);
50 50
diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
index 4a723bda0031..deec927c7f7a 100644
--- a/drivers/media/dvb/mantis/mantis_vp1033.c
+++ b/drivers/media/dvb/mantis/mantis_vp1033.c
@@ -173,7 +173,7 @@ static int vp1033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
173 msleep(250); 173 msleep(250);
174 174
175 dprintk(MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)"); 175 dprintk(MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
176 fe = stv0299_attach(&lgtdqcs001f_config, adapter); 176 fe = dvb_attach(stv0299_attach, &lgtdqcs001f_config, adapter);
177 177
178 if (fe) { 178 if (fe) {
179 fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set; 179 fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
index 8e6ae558ee57..26bc0cbe84d4 100644
--- a/drivers/media/dvb/mantis/mantis_vp1034.c
+++ b/drivers/media/dvb/mantis/mantis_vp1034.c
@@ -50,13 +50,13 @@ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
50 switch (voltage) { 50 switch (voltage) {
51 case SEC_VOLTAGE_13: 51 case SEC_VOLTAGE_13:
52 dprintk(MANTIS_ERROR, 1, "Polarization=[13V]"); 52 dprintk(MANTIS_ERROR, 1, "Polarization=[13V]");
53 gpio_set_bits(mantis, 13, 1); 53 mantis_gpio_set_bits(mantis, 13, 1);
54 gpio_set_bits(mantis, 14, 0); 54 mantis_gpio_set_bits(mantis, 14, 0);
55 break; 55 break;
56 case SEC_VOLTAGE_18: 56 case SEC_VOLTAGE_18:
57 dprintk(MANTIS_ERROR, 1, "Polarization=[18V]"); 57 dprintk(MANTIS_ERROR, 1, "Polarization=[18V]");
58 gpio_set_bits(mantis, 13, 1); 58 mantis_gpio_set_bits(mantis, 13, 1);
59 gpio_set_bits(mantis, 14, 1); 59 mantis_gpio_set_bits(mantis, 14, 1);
60 break; 60 break;
61 case SEC_VOLTAGE_OFF: 61 case SEC_VOLTAGE_OFF:
62 dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN"); 62 dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
@@ -82,7 +82,7 @@ static int vp1034_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
82 msleep(250); 82 msleep(250);
83 83
84 dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)"); 84 dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
85 fe = mb86a16_attach(&vp1034_mb86a16_config, adapter); 85 fe = dvb_attach(mb86a16_attach, &vp1034_mb86a16_config, adapter);
86 if (fe) { 86 if (fe) {
87 dprintk(MANTIS_ERROR, 1, 87 dprintk(MANTIS_ERROR, 1,
88 "found MB86A16 DVB-S/DSS frontend @0x%02x", 88 "found MB86A16 DVB-S/DSS frontend @0x%02x",
diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
index d1aa2bc0c155..38a436ca2fdf 100644
--- a/drivers/media/dvb/mantis/mantis_vp1041.c
+++ b/drivers/media/dvb/mantis/mantis_vp1041.c
@@ -316,14 +316,14 @@ static int vp1041_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
316 if (err == 0) { 316 if (err == 0) {
317 mantis_frontend_soft_reset(mantis); 317 mantis_frontend_soft_reset(mantis);
318 msleep(250); 318 msleep(250);
319 mantis->fe = stb0899_attach(&vp1041_stb0899_config, adapter); 319 mantis->fe = dvb_attach(stb0899_attach, &vp1041_stb0899_config, adapter);
320 if (mantis->fe) { 320 if (mantis->fe) {
321 dprintk(MANTIS_ERROR, 1, 321 dprintk(MANTIS_ERROR, 1,
322 "found STB0899 DVB-S/DVB-S2 frontend @0x%02x", 322 "found STB0899 DVB-S/DVB-S2 frontend @0x%02x",
323 vp1041_stb0899_config.demod_address); 323 vp1041_stb0899_config.demod_address);
324 324
325 if (stb6100_attach(mantis->fe, &vp1041_stb6100_config, adapter)) { 325 if (dvb_attach(stb6100_attach, mantis->fe, &vp1041_stb6100_config, adapter)) {
326 if (!lnbp21_attach(mantis->fe, adapter, 0, 0)) 326 if (!dvb_attach(lnbp21_attach, mantis->fe, adapter, 0, 0))
327 dprintk(MANTIS_ERROR, 1, "No LNBP21 found!"); 327 dprintk(MANTIS_ERROR, 1, "No LNBP21 found!");
328 } 328 }
329 } else { 329 } else {
diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
index 10ce81790a8c..06da0ddf05a7 100644
--- a/drivers/media/dvb/mantis/mantis_vp2033.c
+++ b/drivers/media/dvb/mantis/mantis_vp2033.c
@@ -132,7 +132,7 @@ static int vp2033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
132 msleep(250); 132 msleep(250);
133 133
134 dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)"); 134 dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
135 fe = tda10021_attach(&vp2033_tda1002x_cu1216_config, 135 fe = dvb_attach(tda10021_attach, &vp2033_tda1002x_cu1216_config,
136 adapter, 136 adapter,
137 read_pwm(mantis)); 137 read_pwm(mantis));
138 138
@@ -141,7 +141,7 @@ static int vp2033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
141 "found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x", 141 "found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
142 vp2033_tda1002x_cu1216_config.demod_address); 142 vp2033_tda1002x_cu1216_config.demod_address);
143 } else { 143 } else {
144 fe = tda10023_attach(&vp2033_tda10023_cu1216_config, 144 fe = dvb_attach(tda10023_attach, &vp2033_tda10023_cu1216_config,
145 adapter, 145 adapter,
146 read_pwm(mantis)); 146 read_pwm(mantis));
147 147
diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
index a7ca233e800b..f72b137b7652 100644
--- a/drivers/media/dvb/mantis/mantis_vp2040.c
+++ b/drivers/media/dvb/mantis/mantis_vp2040.c
@@ -132,7 +132,7 @@ static int vp2040_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
132 msleep(250); 132 msleep(250);
133 133
134 dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)"); 134 dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
135 fe = tda10021_attach(&vp2040_tda1002x_cu1216_config, 135 fe = dvb_attach(tda10021_attach, &vp2040_tda1002x_cu1216_config,
136 adapter, 136 adapter,
137 read_pwm(mantis)); 137 read_pwm(mantis));
138 138
@@ -141,7 +141,7 @@ static int vp2040_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
141 "found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x", 141 "found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
142 vp2040_tda1002x_cu1216_config.demod_address); 142 vp2040_tda1002x_cu1216_config.demod_address);
143 } else { 143 } else {
144 fe = tda10023_attach(&vp2040_tda10023_cu1216_config, 144 fe = dvb_attach(tda10023_attach, &vp2040_tda10023_cu1216_config,
145 adapter, 145 adapter,
146 read_pwm(mantis)); 146 read_pwm(mantis));
147 147
diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
index 1f4334214953..c09308cd3ac6 100644
--- a/drivers/media/dvb/mantis/mantis_vp3030.c
+++ b/drivers/media/dvb/mantis/mantis_vp3030.c
@@ -59,21 +59,21 @@ static int vp3030_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
59 struct mantis_hwconfig *config = mantis->hwconfig; 59 struct mantis_hwconfig *config = mantis->hwconfig;
60 int err = 0; 60 int err = 0;
61 61
62 gpio_set_bits(mantis, config->reset, 0); 62 mantis_gpio_set_bits(mantis, config->reset, 0);
63 msleep(100); 63 msleep(100);
64 err = mantis_frontend_power(mantis, POWER_ON); 64 err = mantis_frontend_power(mantis, POWER_ON);
65 msleep(100); 65 msleep(100);
66 gpio_set_bits(mantis, config->reset, 1); 66 mantis_gpio_set_bits(mantis, config->reset, 1);
67 67
68 if (err == 0) { 68 if (err == 0) {
69 msleep(250); 69 msleep(250);
70 dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)"); 70 dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
71 fe = zl10353_attach(&mantis_vp3030_config, adapter); 71 fe = dvb_attach(zl10353_attach, &mantis_vp3030_config, adapter);
72 72
73 if (!fe) 73 if (!fe)
74 return -1; 74 return -1;
75 75
76 tda665x_attach(fe, &env57h12d5_config, adapter); 76 dvb_attach(tda665x_attach, fe, &env57h12d5_config, adapter);
77 } else { 77 } else {
78 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>", 78 dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
79 adapter->name, 79 adapter->name,
diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c
index 3a7ef71087be..dc073bdc623a 100644
--- a/drivers/media/dvb/ngene/ngene-core.c
+++ b/drivers/media/dvb/ngene/ngene-core.c
@@ -1304,7 +1304,6 @@ static void ngene_stop(struct ngene *dev)
1304static int ngene_start(struct ngene *dev) 1304static int ngene_start(struct ngene *dev)
1305{ 1305{
1306 int stat; 1306 int stat;
1307 unsigned long flags;
1308 int i; 1307 int i;
1309 1308
1310 pci_set_master(dev->pci_dev); 1309 pci_set_master(dev->pci_dev);
@@ -1337,6 +1336,8 @@ static int ngene_start(struct ngene *dev)
1337#ifdef CONFIG_PCI_MSI 1336#ifdef CONFIG_PCI_MSI
1338 /* enable MSI if kernel and card support it */ 1337 /* enable MSI if kernel and card support it */
1339 if (pci_msi_enabled() && dev->card_info->msi_supported) { 1338 if (pci_msi_enabled() && dev->card_info->msi_supported) {
1339 unsigned long flags;
1340
1340 ngwritel(0, NGENE_INT_ENABLE); 1341 ngwritel(0, NGENE_INT_ENABLE);
1341 free_irq(dev->pci_dev->irq, dev); 1342 free_irq(dev->pci_dev->irq, dev);
1342 stat = pci_enable_msi(dev->pci_dev); 1343 stat = pci_enable_msi(dev->pci_dev);
@@ -1515,7 +1516,7 @@ static int init_channels(struct ngene *dev)
1515 1516
1516void __devexit ngene_remove(struct pci_dev *pdev) 1517void __devexit ngene_remove(struct pci_dev *pdev)
1517{ 1518{
1518 struct ngene *dev = (struct ngene *)pci_get_drvdata(pdev); 1519 struct ngene *dev = pci_get_drvdata(pdev);
1519 int i; 1520 int i;
1520 1521
1521 tasklet_kill(&dev->event_tasklet); 1522 tasklet_kill(&dev->event_tasklet);
@@ -1536,12 +1537,11 @@ int __devinit ngene_probe(struct pci_dev *pci_dev,
1536 if (pci_enable_device(pci_dev) < 0) 1537 if (pci_enable_device(pci_dev) < 0)
1537 return -ENODEV; 1538 return -ENODEV;
1538 1539
1539 dev = vmalloc(sizeof(struct ngene)); 1540 dev = vzalloc(sizeof(struct ngene));
1540 if (dev == NULL) { 1541 if (dev == NULL) {
1541 stat = -ENOMEM; 1542 stat = -ENOMEM;
1542 goto fail0; 1543 goto fail0;
1543 } 1544 }
1544 memset(dev, 0, sizeof(struct ngene));
1545 1545
1546 dev->pci_dev = pci_dev; 1546 dev->pci_dev = pci_dev;
1547 dev->card_info = (struct ngene_info *)id->driver_data; 1547 dev->card_info = (struct ngene_info *)id->driver_data;
diff --git a/drivers/media/dvb/siano/Kconfig b/drivers/media/dvb/siano/Kconfig
index e520bceee0af..bc6456eb2c4f 100644
--- a/drivers/media/dvb/siano/Kconfig
+++ b/drivers/media/dvb/siano/Kconfig
@@ -4,7 +4,7 @@
4 4
5config SMS_SIANO_MDTV 5config SMS_SIANO_MDTV
6 tristate "Siano SMS1xxx based MDTV receiver" 6 tristate "Siano SMS1xxx based MDTV receiver"
7 depends on DVB_CORE && IR_CORE && HAS_DMA 7 depends on DVB_CORE && RC_CORE && HAS_DMA
8 ---help--- 8 ---help---
9 Choose Y or M here if you have MDTV receiver with a Siano chipset. 9 Choose Y or M here if you have MDTV receiver with a Siano chipset.
10 10
diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c
index 135e45bd00c7..78765ed28063 100644
--- a/drivers/media/dvb/siano/smscoreapi.c
+++ b/drivers/media/dvb/siano/smscoreapi.c
@@ -438,7 +438,7 @@ static int smscore_init_ir(struct smscore_device_t *coredev)
438 int rc; 438 int rc;
439 void *buffer; 439 void *buffer;
440 440
441 coredev->ir.input_dev = NULL; 441 coredev->ir.dev = NULL;
442 ir_io = sms_get_board(smscore_get_board_id(coredev))->board_cfg.ir; 442 ir_io = sms_get_board(smscore_get_board_id(coredev))->board_cfg.ir;
443 if (ir_io) {/* only if IR port exist we use IR sub-module */ 443 if (ir_io) {/* only if IR port exist we use IR sub-module */
444 sms_info("IR loading"); 444 sms_info("IR loading");
diff --git a/drivers/media/dvb/siano/smsir.c b/drivers/media/dvb/siano/smsir.c
index a27c44a8af5a..37bc5c4b8ad8 100644
--- a/drivers/media/dvb/siano/smsir.c
+++ b/drivers/media/dvb/siano/smsir.c
@@ -45,25 +45,24 @@ void sms_ir_event(struct smscore_device_t *coredev, const char *buf, int len)
45 ev.duration = abs(samples[i]) * 1000; /* Convert to ns */ 45 ev.duration = abs(samples[i]) * 1000; /* Convert to ns */
46 ev.pulse = (samples[i] > 0) ? false : true; 46 ev.pulse = (samples[i] > 0) ? false : true;
47 47
48 ir_raw_event_store(coredev->ir.input_dev, &ev); 48 ir_raw_event_store(coredev->ir.dev, &ev);
49 } 49 }
50 ir_raw_event_handle(coredev->ir.input_dev); 50 ir_raw_event_handle(coredev->ir.dev);
51} 51}
52 52
53int sms_ir_init(struct smscore_device_t *coredev) 53int sms_ir_init(struct smscore_device_t *coredev)
54{ 54{
55 struct input_dev *input_dev; 55 int err;
56 int board_id = smscore_get_board_id(coredev); 56 int board_id = smscore_get_board_id(coredev);
57 struct rc_dev *dev;
57 58
58 sms_log("Allocating input device"); 59 sms_log("Allocating rc device");
59 input_dev = input_allocate_device(); 60 dev = rc_allocate_device();
60 if (!input_dev) { 61 if (!dev) {
61 sms_err("Not enough memory"); 62 sms_err("Not enough memory");
62 return -ENOMEM; 63 return -ENOMEM;
63 } 64 }
64 65
65 coredev->ir.input_dev = input_dev;
66
67 coredev->ir.controller = 0; /* Todo: vega/nova SPI number */ 66 coredev->ir.controller = 0; /* Todo: vega/nova SPI number */
68 coredev->ir.timeout = IR_DEFAULT_TIMEOUT; 67 coredev->ir.timeout = IR_DEFAULT_TIMEOUT;
69 sms_log("IR port %d, timeout %d ms", 68 sms_log("IR port %d, timeout %d ms",
@@ -75,38 +74,41 @@ int sms_ir_init(struct smscore_device_t *coredev)
75 strlcpy(coredev->ir.phys, coredev->devpath, sizeof(coredev->ir.phys)); 74 strlcpy(coredev->ir.phys, coredev->devpath, sizeof(coredev->ir.phys));
76 strlcat(coredev->ir.phys, "/ir0", sizeof(coredev->ir.phys)); 75 strlcat(coredev->ir.phys, "/ir0", sizeof(coredev->ir.phys));
77 76
78 input_dev->name = coredev->ir.name; 77 dev->input_name = coredev->ir.name;
79 input_dev->phys = coredev->ir.phys; 78 dev->input_phys = coredev->ir.phys;
80 input_dev->dev.parent = coredev->device; 79 dev->dev.parent = coredev->device;
81 80
82#if 0 81#if 0
83 /* TODO: properly initialize the parameters bellow */ 82 /* TODO: properly initialize the parameters bellow */
84 input_dev->id.bustype = BUS_USB; 83 dev->input_id.bustype = BUS_USB;
85 input_dev->id.version = 1; 84 dev->input_id.version = 1;
86 input_dev->id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor); 85 dev->input_id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor);
87 input_dev->id.product = le16_to_cpu(dev->udev->descriptor.idProduct); 86 dev->input_id.product = le16_to_cpu(dev->udev->descriptor.idProduct);
88#endif 87#endif
89 88
90 coredev->ir.props.priv = coredev; 89 dev->priv = coredev;
91 coredev->ir.props.driver_type = RC_DRIVER_IR_RAW; 90 dev->driver_type = RC_DRIVER_IR_RAW;
92 coredev->ir.props.allowed_protos = IR_TYPE_ALL; 91 dev->allowed_protos = RC_TYPE_ALL;
92 dev->map_name = sms_get_board(board_id)->rc_codes;
93 dev->driver_name = MODULE_NAME;
93 94
94 sms_log("Input device (IR) %s is set for key events", input_dev->name); 95 sms_log("Input device (IR) %s is set for key events", dev->input_name);
95 96
96 if (ir_input_register(input_dev, sms_get_board(board_id)->rc_codes, 97 err = rc_register_device(dev);
97 &coredev->ir.props, MODULE_NAME)) { 98 if (err < 0) {
98 sms_err("Failed to register device"); 99 sms_err("Failed to register device");
99 input_free_device(input_dev); 100 rc_free_device(dev);
100 return -EACCES; 101 return err;
101 } 102 }
102 103
104 coredev->ir.dev = dev;
103 return 0; 105 return 0;
104} 106}
105 107
106void sms_ir_exit(struct smscore_device_t *coredev) 108void sms_ir_exit(struct smscore_device_t *coredev)
107{ 109{
108 if (coredev->ir.input_dev) 110 if (coredev->ir.dev)
109 ir_input_unregister(coredev->ir.input_dev); 111 rc_unregister_device(coredev->ir.dev);
110 112
111 sms_log(""); 113 sms_log("");
112} 114}
diff --git a/drivers/media/dvb/siano/smsir.h b/drivers/media/dvb/siano/smsir.h
index 926e247523bd..ae92b3a8587e 100644
--- a/drivers/media/dvb/siano/smsir.h
+++ b/drivers/media/dvb/siano/smsir.h
@@ -28,20 +28,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
28#define __SMS_IR_H__ 28#define __SMS_IR_H__
29 29
30#include <linux/input.h> 30#include <linux/input.h>
31#include <media/ir-core.h> 31#include <media/rc-core.h>
32 32
33#define IR_DEFAULT_TIMEOUT 100 33#define IR_DEFAULT_TIMEOUT 100
34 34
35struct smscore_device_t; 35struct smscore_device_t;
36 36
37struct ir_t { 37struct ir_t {
38 struct input_dev *input_dev; 38 struct rc_dev *dev;
39 char name[40]; 39 char name[40];
40 char phys[32]; 40 char phys[32];
41 41
42 char *rc_codes; 42 char *rc_codes;
43 u64 protocol; 43 u64 protocol;
44 struct ir_dev_props props;
45 44
46 u32 timeout; 45 u32 timeout;
47 u32 controller; 46 u32 controller;
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c
index 50d4338610e0..0b8da57cf4c3 100644
--- a/drivers/media/dvb/siano/smsusb.c
+++ b/drivers/media/dvb/siano/smsusb.c
@@ -288,8 +288,7 @@ static int smsusb1_setmode(void *context, int mode)
288 288
289static void smsusb_term_device(struct usb_interface *intf) 289static void smsusb_term_device(struct usb_interface *intf)
290{ 290{
291 struct smsusb_device_t *dev = 291 struct smsusb_device_t *dev = usb_get_intfdata(intf);
292 (struct smsusb_device_t *) usb_get_intfdata(intf);
293 292
294 if (dev) { 293 if (dev) {
295 smsusb_stop_streaming(dev); 294 smsusb_stop_streaming(dev);
@@ -445,8 +444,7 @@ static void smsusb_disconnect(struct usb_interface *intf)
445 444
446static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg) 445static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
447{ 446{
448 struct smsusb_device_t *dev = 447 struct smsusb_device_t *dev = usb_get_intfdata(intf);
449 (struct smsusb_device_t *)usb_get_intfdata(intf);
450 printk(KERN_INFO "%s: Entering status %d.\n", __func__, msg.event); 448 printk(KERN_INFO "%s: Entering status %d.\n", __func__, msg.event);
451 smsusb_stop_streaming(dev); 449 smsusb_stop_streaming(dev);
452 return 0; 450 return 0;
@@ -455,8 +453,7 @@ static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
455static int smsusb_resume(struct usb_interface *intf) 453static int smsusb_resume(struct usb_interface *intf)
456{ 454{
457 int rc, i; 455 int rc, i;
458 struct smsusb_device_t *dev = 456 struct smsusb_device_t *dev = usb_get_intfdata(intf);
459 (struct smsusb_device_t *)usb_get_intfdata(intf);
460 struct usb_device *udev = interface_to_usbdev(intf); 457 struct usb_device *udev = interface_to_usbdev(intf);
461 458
462 printk(KERN_INFO "%s: Entering.\n", __func__); 459 printk(KERN_INFO "%s: Entering.\n", __func__);
diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig
index debea8d1d31c..44afab2fdc2d 100644
--- a/drivers/media/dvb/ttpci/Kconfig
+++ b/drivers/media/dvb/ttpci/Kconfig
@@ -89,7 +89,6 @@ config DVB_BUDGET
89config DVB_BUDGET_CI 89config DVB_BUDGET_CI
90 tristate "Budget cards with onboard CI connector" 90 tristate "Budget cards with onboard CI connector"
91 depends on DVB_BUDGET_CORE && I2C 91 depends on DVB_BUDGET_CORE && I2C
92 depends on INPUT # due to IR
93 select DVB_STV0297 if !DVB_FE_CUSTOMISE 92 select DVB_STV0297 if !DVB_FE_CUSTOMISE
94 select DVB_STV0299 if !DVB_FE_CUSTOMISE 93 select DVB_STV0299 if !DVB_FE_CUSTOMISE
95 select DVB_TDA1004X if !DVB_FE_CUSTOMISE 94 select DVB_TDA1004X if !DVB_FE_CUSTOMISE
@@ -98,7 +97,7 @@ config DVB_BUDGET_CI
98 select DVB_LNBP21 if !DVB_FE_CUSTOMISE 97 select DVB_LNBP21 if !DVB_FE_CUSTOMISE
99 select DVB_TDA10023 if !DVB_FE_CUSTOMISE 98 select DVB_TDA10023 if !DVB_FE_CUSTOMISE
100 select MEDIA_TUNER_TDA827X if !MEDIA_TUNER_CUSTOMISE 99 select MEDIA_TUNER_TDA827X if !MEDIA_TUNER_CUSTOMISE
101 depends on VIDEO_IR 100 depends on RC_CORE
102 help 101 help
103 Support for simple SAA7146 based DVB cards 102 Support for simple SAA7146 based DVB cards
104 (so called Budget- or Nova-PCI cards) without onboard 103 (so called Budget- or Nova-PCI cards) without onboard
diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c
index ac20c5bbfa43..cdd31cae46c4 100644
--- a/drivers/media/dvb/ttpci/av7110_v4l.c
+++ b/drivers/media/dvb/ttpci/av7110_v4l.c
@@ -100,6 +100,7 @@ static struct v4l2_input inputs[4] = {
100 .tuner = 0, /* ignored */ 100 .tuner = 0, /* ignored */
101 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 101 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
102 .status = 0, 102 .status = 0,
103 .capabilities = V4L2_IN_CAP_STD,
103 }, { 104 }, {
104 .index = 1, 105 .index = 1,
105 .name = "Television", 106 .name = "Television",
@@ -108,6 +109,7 @@ static struct v4l2_input inputs[4] = {
108 .tuner = 0, 109 .tuner = 0,
109 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 110 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
110 .status = 0, 111 .status = 0,
112 .capabilities = V4L2_IN_CAP_STD,
111 }, { 113 }, {
112 .index = 2, 114 .index = 2,
113 .name = "Video", 115 .name = "Video",
@@ -116,6 +118,7 @@ static struct v4l2_input inputs[4] = {
116 .tuner = 0, 118 .tuner = 0,
117 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 119 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
118 .status = 0, 120 .status = 0,
121 .capabilities = V4L2_IN_CAP_STD,
119 }, { 122 }, {
120 .index = 3, 123 .index = 3,
121 .name = "Y/C", 124 .name = "Y/C",
@@ -124,6 +127,7 @@ static struct v4l2_input inputs[4] = {
124 .tuner = 0, 127 .tuner = 0,
125 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 128 .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
126 .status = 0, 129 .status = 0,
130 .capabilities = V4L2_IN_CAP_STD,
127 } 131 }
128}; 132};
129 133
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c
index 97afc01f60d0..e957d7690bcc 100644
--- a/drivers/media/dvb/ttpci/budget-av.c
+++ b/drivers/media/dvb/ttpci/budget-av.c
@@ -1406,8 +1406,10 @@ static int budget_av_detach(struct saa7146_dev *dev)
1406 1406
1407#define KNC1_INPUTS 2 1407#define KNC1_INPUTS 2
1408static struct v4l2_input knc1_inputs[KNC1_INPUTS] = { 1408static struct v4l2_input knc1_inputs[KNC1_INPUTS] = {
1409 {0, "Composite", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0}, 1409 { 0, "Composite", V4L2_INPUT_TYPE_TUNER, 1, 0,
1410 {1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0}, 1410 V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
1411 { 1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0,
1412 V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0, V4L2_IN_CAP_STD },
1411}; 1413};
1412 1414
1413static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i) 1415static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
index a9c2c326df4b..b82756db5bd1 100644
--- a/drivers/media/dvb/ttpci/budget-ci.c
+++ b/drivers/media/dvb/ttpci/budget-ci.c
@@ -33,9 +33,8 @@
33#include <linux/errno.h> 33#include <linux/errno.h>
34#include <linux/slab.h> 34#include <linux/slab.h>
35#include <linux/interrupt.h> 35#include <linux/interrupt.h>
36#include <linux/input.h>
37#include <linux/spinlock.h> 36#include <linux/spinlock.h>
38#include <media/ir-core.h> 37#include <media/rc-core.h>
39 38
40#include "budget.h" 39#include "budget.h"
41 40
@@ -96,7 +95,7 @@ MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding");
96DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 95DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
97 96
98struct budget_ci_ir { 97struct budget_ci_ir {
99 struct input_dev *dev; 98 struct rc_dev *dev;
100 struct tasklet_struct msp430_irq_tasklet; 99 struct tasklet_struct msp430_irq_tasklet;
101 char name[72]; /* 40 + 32 for (struct saa7146_dev).name */ 100 char name[72]; /* 40 + 32 for (struct saa7146_dev).name */
102 char phys[32]; 101 char phys[32];
@@ -118,7 +117,7 @@ struct budget_ci {
118static void msp430_ir_interrupt(unsigned long data) 117static void msp430_ir_interrupt(unsigned long data)
119{ 118{
120 struct budget_ci *budget_ci = (struct budget_ci *) data; 119 struct budget_ci *budget_ci = (struct budget_ci *) data;
121 struct input_dev *dev = budget_ci->ir.dev; 120 struct rc_dev *dev = budget_ci->ir.dev;
122 u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8; 121 u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8;
123 122
124 /* 123 /*
@@ -160,19 +159,17 @@ static void msp430_ir_interrupt(unsigned long data)
160 budget_ci->ir.rc5_device != (command & 0x1f)) 159 budget_ci->ir.rc5_device != (command & 0x1f))
161 return; 160 return;
162 161
163 ir_keydown(dev, budget_ci->ir.ir_key, (command & 0x20) ? 1 : 0); 162 rc_keydown(dev, budget_ci->ir.ir_key, (command & 0x20) ? 1 : 0);
164} 163}
165 164
166static int msp430_ir_init(struct budget_ci *budget_ci) 165static int msp430_ir_init(struct budget_ci *budget_ci)
167{ 166{
168 struct saa7146_dev *saa = budget_ci->budget.dev; 167 struct saa7146_dev *saa = budget_ci->budget.dev;
169 struct input_dev *input_dev = budget_ci->ir.dev; 168 struct rc_dev *dev;
170 int error; 169 int error;
171 char *ir_codes = NULL;
172 170
173 171 dev = rc_allocate_device();
174 budget_ci->ir.dev = input_dev = input_allocate_device(); 172 if (!dev) {
175 if (!input_dev) {
176 printk(KERN_ERR "budget_ci: IR interface initialisation failed\n"); 173 printk(KERN_ERR "budget_ci: IR interface initialisation failed\n");
177 return -ENOMEM; 174 return -ENOMEM;
178 } 175 }
@@ -182,19 +179,20 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
182 snprintf(budget_ci->ir.phys, sizeof(budget_ci->ir.phys), 179 snprintf(budget_ci->ir.phys, sizeof(budget_ci->ir.phys),
183 "pci-%s/ir0", pci_name(saa->pci)); 180 "pci-%s/ir0", pci_name(saa->pci));
184 181
185 input_dev->name = budget_ci->ir.name; 182 dev->driver_name = MODULE_NAME;
186 183 dev->input_name = budget_ci->ir.name;
187 input_dev->phys = budget_ci->ir.phys; 184 dev->input_phys = budget_ci->ir.phys;
188 input_dev->id.bustype = BUS_PCI; 185 dev->input_id.bustype = BUS_PCI;
189 input_dev->id.version = 1; 186 dev->input_id.version = 1;
187 dev->scanmask = 0xff;
190 if (saa->pci->subsystem_vendor) { 188 if (saa->pci->subsystem_vendor) {
191 input_dev->id.vendor = saa->pci->subsystem_vendor; 189 dev->input_id.vendor = saa->pci->subsystem_vendor;
192 input_dev->id.product = saa->pci->subsystem_device; 190 dev->input_id.product = saa->pci->subsystem_device;
193 } else { 191 } else {
194 input_dev->id.vendor = saa->pci->vendor; 192 dev->input_id.vendor = saa->pci->vendor;
195 input_dev->id.product = saa->pci->device; 193 dev->input_id.product = saa->pci->device;
196 } 194 }
197 input_dev->dev.parent = &saa->pci->dev; 195 dev->dev.parent = &saa->pci->dev;
198 196
199 if (rc5_device < 0) 197 if (rc5_device < 0)
200 budget_ci->ir.rc5_device = IR_DEVICE_ANY; 198 budget_ci->ir.rc5_device = IR_DEVICE_ANY;
@@ -208,7 +206,7 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
208 case 0x1011: 206 case 0x1011:
209 case 0x1012: 207 case 0x1012:
210 /* The hauppauge keymap is a superset of these remotes */ 208 /* The hauppauge keymap is a superset of these remotes */
211 ir_codes = RC_MAP_HAUPPAUGE_NEW; 209 dev->map_name = RC_MAP_HAUPPAUGE_NEW;
212 210
213 if (rc5_device < 0) 211 if (rc5_device < 0)
214 budget_ci->ir.rc5_device = 0x1f; 212 budget_ci->ir.rc5_device = 0x1f;
@@ -218,23 +216,22 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
218 case 0x1019: 216 case 0x1019:
219 case 0x101a: 217 case 0x101a:
220 /* for the Technotrend 1500 bundled remote */ 218 /* for the Technotrend 1500 bundled remote */
221 ir_codes = RC_MAP_TT_1500; 219 dev->map_name = RC_MAP_TT_1500;
222 break; 220 break;
223 default: 221 default:
224 /* unknown remote */ 222 /* unknown remote */
225 ir_codes = RC_MAP_BUDGET_CI_OLD; 223 dev->map_name = RC_MAP_BUDGET_CI_OLD;
226 break; 224 break;
227 } 225 }
228 226
229 error = ir_input_register(input_dev, ir_codes, NULL, MODULE_NAME); 227 error = rc_register_device(dev);
230 if (error) { 228 if (error) {
231 printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error); 229 printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error);
230 rc_free_device(dev);
232 return error; 231 return error;
233 } 232 }
234 233
235 /* note: these must be after input_register_device */ 234 budget_ci->ir.dev = dev;
236 input_dev->rep[REP_DELAY] = 400;
237 input_dev->rep[REP_PERIOD] = 250;
238 235
239 tasklet_init(&budget_ci->ir.msp430_irq_tasklet, msp430_ir_interrupt, 236 tasklet_init(&budget_ci->ir.msp430_irq_tasklet, msp430_ir_interrupt,
240 (unsigned long) budget_ci); 237 (unsigned long) budget_ci);
@@ -248,13 +245,12 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
248static void msp430_ir_deinit(struct budget_ci *budget_ci) 245static void msp430_ir_deinit(struct budget_ci *budget_ci)
249{ 246{
250 struct saa7146_dev *saa = budget_ci->budget.dev; 247 struct saa7146_dev *saa = budget_ci->budget.dev;
251 struct input_dev *dev = budget_ci->ir.dev;
252 248
253 SAA7146_IER_DISABLE(saa, MASK_06); 249 SAA7146_IER_DISABLE(saa, MASK_06);
254 saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT); 250 saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
255 tasklet_kill(&budget_ci->ir.msp430_irq_tasklet); 251 tasklet_kill(&budget_ci->ir.msp430_irq_tasklet);
256 252
257 ir_input_unregister(dev); 253 rc_unregister_device(budget_ci->ir.dev);
258} 254}
259 255
260static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address) 256static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address)