diff options
Diffstat (limited to 'drivers/media/dvb')
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 @@ | |||
1 | config DVB_DM1105 | 1 | config 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 */ |
268 | struct infrared { | 267 | struct 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 | ||
594 | int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) | 593 | int __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 | ||
633 | void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105) | 633 | void __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 | ||
638 | static int __devinit dm1105_hw_init(struct dm1105_dev *dev) | 638 | static 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 @@ | |||
1 | config DVB_USB | 1 | config 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 | ||
40 | static struct ir_scancode ir_codes_a800_table[] = { | 40 | static 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 | ||
36 | struct ir_scancode ir_codes_af9005_table[] = { | 36 | struct 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 | ||
77 | int ir_codes_af9005_table_size = ARRAY_SIZE(ir_codes_af9005_table); | 77 | int rc_map_af9005_table_size = ARRAY_SIZE(rc_map_af9005_table); |
78 | 78 | ||
79 | static int repeatable_keys[] = { | 79 | static 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 | ||
149 | EXPORT_SYMBOL(ir_codes_af9005_table); | 149 | EXPORT_SYMBOL(rc_map_af9005_table); |
150 | EXPORT_SYMBOL(ir_codes_af9005_table_size); | 150 | EXPORT_SYMBOL(rc_map_af9005_table_size); |
151 | EXPORT_SYMBOL(af9005_rc_decode); | 151 | EXPORT_SYMBOL(af9005_rc_decode); |
152 | 152 | ||
153 | MODULE_AUTHOR("Luca Olivetti <luca@ventoso.org>"); | 153 | MODULE_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 */ |
3491 | extern int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len, | 3491 | extern int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len, |
3492 | u32 * event, int *state); | 3492 | u32 * event, int *state); |
3493 | extern struct ir_scancode ir_codes_af9005_table[]; | 3493 | extern struct rc_map_table rc_map_af9005_table[]; |
3494 | extern int ir_codes_af9005_table_size; | 3494 | extern 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 */ |
389 | static struct ir_scancode ir_codes_az6027_table[] = { | 389 | static 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 | ||
87 | static struct ir_scancode ir_codes_cinergyt2_table[] = { | 87 | static 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 | ||
386 | static int cxusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 386 | static 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) | |||
410 | static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d, u32 *event, | 410 | static 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, | |||
438 | static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d, u32 *event, | 438 | static 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 | ||
464 | static struct ir_scancode ir_codes_dvico_mce_table[] = { | 464 | static 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 | ||
512 | static struct ir_scancode ir_codes_dvico_portable_table[] = { | 512 | static 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 | ||
551 | static struct ir_scancode ir_codes_d680_dmb_table[] = { | 551 | static 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) { |
933 | no_IR: | 933 | no_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); | |||
60 | extern struct i2c_algorithm dib0700_i2c_algo; | 60 | extern struct i2c_algorithm dib0700_i2c_algo; |
61 | extern int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props, | 61 | extern 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); |
63 | extern int dib0700_change_protocol(void *priv, u64 ir_type); | 63 | extern int dib0700_change_protocol(struct rc_dev *dev, u64 rc_type); |
64 | 64 | ||
65 | extern int dib0700_device_count; | 65 | extern int dib0700_device_count; |
66 | extern int dvb_usb_dib0700_ir_proto; | 66 | extern 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 | ||
474 | int dib0700_change_protocol(void *priv, u64 ir_type) | 474 | int 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 | ||
605 | resubmit: | 605 | resubmit: |
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 | */ |
330 | struct ir_scancode ir_codes_dibusb_table[] = { | 330 | struct 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 | }; |
459 | EXPORT_SYMBOL(ir_codes_dibusb_table); | 459 | EXPORT_SYMBOL(rc_map_dibusb_table); |
460 | 460 | ||
461 | int dibusb_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 461 | int 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 | ||
127 | extern struct ir_scancode ir_codes_dibusb_table[]; | 127 | extern struct rc_map_table rc_map_dibusb_table[]; |
128 | extern int dibusb_rc_query(struct dvb_usb_device *, u32 *, int *); | 128 | extern int dibusb_rc_query(struct dvb_usb_device *, u32 *, int *); |
129 | extern int dibusb_read_eeprom_byte(struct dvb_usb_device *, u8, u8 *); | 129 | extern 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 | ||
164 | static struct ir_scancode ir_codes_digitv_table[] = { | 164 | static 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) */ |
60 | static struct ir_scancode ir_codes_dtt200u_table[] = { | 60 | static 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 | ||
157 | static int legacy_dvb_usb_remote_init(struct dvb_usb_device *d, | 157 | static 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 | ||
224 | static int rc_core_dvb_usb_remote_init(struct dvb_usb_device *d, | 236 | static 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 | ||
252 | int dvb_usb_remote_init(struct dvb_usb_device *d) | 280 | int 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 | ||
78 | static inline u8 rc5_custom(struct ir_scancode *key) | 78 | static 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 | ||
83 | static inline u8 rc5_data(struct ir_scancode *key) | 83 | static 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 | ||
88 | static inline u8 rc5_scan(struct ir_scancode *key) | 88 | static 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 | */ |
188 | struct dvb_rc { | 189 | struct 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 | ||
76 | struct ir_codes_dvb_usb_table_table { | 76 | struct 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 | ||
951 | static struct ir_scancode ir_codes_dw210x_table[] = { | 951 | static 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 | ||
985 | static struct ir_scancode ir_codes_tevii_table[] = { | 985 | static 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 | ||
1035 | static struct ir_scancode ir_codes_tbs_table[] = { | 1035 | static 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 | ||
1070 | static struct ir_codes_dvb_usb_table_table keys_tables[] = { | 1070 | static 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 | ||
1076 | static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 1076 | static 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 | ||
25 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 25 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
26 | 26 | ||
27 | static 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 | |||
32 | static 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 | |||
37 | static 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 | |||
27 | int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) | 54 | int 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 | |||
91 | extern struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d); | 97 | extern struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d); |
92 | extern int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen); | 98 | extern int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen); |
93 | extern int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | 99 | extern 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 | ||
185 | static int lme2510_usb_talk_restart(struct dvb_usb_device *d, | 184 | static 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, | |||
548 | static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | 527 | static 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) | |||
585 | static int lme2510_int_service(struct dvb_usb_adapter *adap) | 555 | static 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 | ||
625 | static u8 check_sum(u8 *p, u8 len) | 594 | static 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 | ||
707 | static void lme_firmware_switch(struct usb_device *udev, int cold) | 678 | static 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 | ||
749 | static int lme2510_kill_urb(struct usb_data_stream *stream) | 727 | static 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 | ||
792 | static 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 | |||
820 | static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) | 805 | static 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 | |||
850 | end: 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 | |||
862 | static 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 | ||
889 | static int lme2510_powerup(struct dvb_usb_device *d, int onoff) | 897 | static 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 | ||
1057 | static struct usb_driver lme2510_driver = { | 1082 | static 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); | |||
1083 | module_exit(lme2510_module_exit); | 1108 | module_exit(lme2510_module_exit); |
1084 | 1109 | ||
1085 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); | 1110 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); |
1086 | MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0"); | 1111 | MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); |
1087 | MODULE_VERSION("1.60"); | 1112 | MODULE_VERSION("1.74"); |
1088 | MODULE_LICENSE("GPL"); | 1113 | MODULE_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 */ |
592 | static struct ir_scancode ir_codes_megasky_table[] = { | 592 | static 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 | ||
611 | static struct ir_scancode ir_codes_tvwalkertwin_table[] = { | 611 | static 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 | ||
631 | static struct ir_scancode ir_codes_pinnacle310e_table[] = { | 631 | static 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 */ |
24 | static struct ir_scancode ir_codes_haupp_table[] = { | 24 | static 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 @@ | |||
35 | struct opera1_state { | 35 | struct opera1_state { |
36 | u32 last_key_pressed; | 36 | u32 last_key_pressed; |
37 | }; | 37 | }; |
38 | struct ir_codes_opera_table { | 38 | struct 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 | ||
334 | static struct ir_scancode ir_codes_opera1_table[] = { | 334 | static 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 | ||
44 | struct ttusb2_state { | 44 | struct ttusb2_state { |
45 | u8 id; | 45 | u8 id; |
46 | u16 last_rc_key; | ||
46 | }; | 47 | }; |
47 | 48 | ||
48 | static int ttusb2_msg(struct dvb_usb_device *d, u8 cmd, | 49 | static 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 */ | ||
136 | static 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 */ |
132 | static int ttusb2_identify_state (struct usb_device *udev, struct | 160 | static 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 */ |
177 | static struct ir_scancode ir_codes_vp702x_table[] = { | 177 | static 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. */ |
102 | static struct ir_scancode ir_codes_vp7045_table[] = { | 102 | static 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 | ||
499 | config DVB_S921 | 499 | config 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 | ||
515 | config 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 | |||
515 | comment "Digital terrestrial only tuners/PLL" | 523 | comment "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 @@ | |||
5 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ | 5 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ |
6 | EXTRA_CFLAGS += -Idrivers/media/common/tuners/ | 6 | EXTRA_CFLAGS += -Idrivers/media/common/tuners/ |
7 | 7 | ||
8 | s921-objs := s921_module.o s921_core.o | ||
9 | stb0899-objs = stb0899_drv.o stb0899_algo.o | 8 | stb0899-objs = stb0899_drv.o stb0899_algo.o |
10 | stv0900-objs = stv0900_core.o stv0900_sw.o | 9 | stv0900-objs = stv0900_core.o stv0900_sw.o |
11 | au8522-objs = au8522_dig.o au8522_decoder.o | 10 | au8522-objs = au8522_dig.o au8522_decoder.o |
@@ -82,4 +81,5 @@ obj-$(CONFIG_DVB_ISL6423) += isl6423.o | |||
82 | obj-$(CONFIG_DVB_EC100) += ec100.o | 81 | obj-$(CONFIG_DVB_EC100) += ec100.o |
83 | obj-$(CONFIG_DVB_DS3000) += ds3000.o | 82 | obj-$(CONFIG_DVB_DS3000) += ds3000.o |
84 | obj-$(CONFIG_DVB_MB86A16) += mb86a16.o | 83 | obj-$(CONFIG_DVB_MB86A16) += mb86a16.o |
84 | obj-$(CONFIG_DVB_MB86A20S) += mb86a20s.o | ||
85 | obj-$(CONFIG_DVB_IX2505V) += ix2505v.o | 85 | obj-$(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: | |||
964 | static int af9013_update_signal_strength(struct dvb_frontend *fe) | 964 | static 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 | ||
411 | static void disable_audio_input(struct au8522_state *state) | 424 | static 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 | ||
78 | static int ix2505v_write(struct ix2505v_state *state, u8 buf[], u8 count) | 78 | static 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 | |||
25 | static int debug = 1; | ||
26 | module_param(debug, int, 0644); | ||
27 | MODULE_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 | |||
41 | struct mb86a20s_state { | ||
42 | struct i2c_adapter *i2c; | ||
43 | const struct mb86a20s_config *config; | ||
44 | |||
45 | struct dvb_frontend frontend; | ||
46 | }; | ||
47 | |||
48 | struct 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 | */ | ||
57 | static 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 | |||
303 | static struct regdata mb86a20s_reset_reception[] = { | ||
304 | { 0x70, 0xf0 }, | ||
305 | { 0x70, 0xff }, | ||
306 | { 0x08, 0x01 }, | ||
307 | { 0x08, 0x00 }, | ||
308 | }; | ||
309 | |||
310 | static 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 | |||
329 | static 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 | |||
343 | static 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 = ®, .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 | |||
371 | static 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 | |||
404 | static 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 | |||
444 | static 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 | |||
478 | static 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 | |||
499 | static 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 | |||
513 | static 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 | |||
532 | static 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 | |||
541 | static struct dvb_frontend_ops mb86a20s_ops; | ||
542 | |||
543 | struct 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 | |||
580 | error: | ||
581 | kfree(state); | ||
582 | return NULL; | ||
583 | } | ||
584 | EXPORT_SYMBOL(mb86a20s_attach); | ||
585 | |||
586 | static 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 | |||
613 | MODULE_DESCRIPTION("DVB Frontend module for Fujitsu mb86A20s hardware"); | ||
614 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>"); | ||
615 | MODULE_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 | |||
27 | struct 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)) | ||
34 | extern struct dvb_frontend *mb86a20s_attach(const struct mb86a20s_config *config, | ||
35 | struct i2c_adapter *i2c); | ||
36 | extern struct i2c_adapter *mb86a20s_get_tuner_i2c_adapter(struct dvb_frontend *); | ||
37 | #else | ||
38 | static 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 | } | ||
44 | static 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 | |||
31 | static int debug = 1; | ||
32 | module_param(debug, int, 0644); | ||
33 | MODULE_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 | |||
47 | struct 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 | */ | ||
62 | static 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 | |||
76 | struct regdata { | ||
77 | u8 reg; | ||
78 | u8 data; | ||
79 | }; | ||
80 | |||
81 | static 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 | |||
189 | static struct regdata s921_prefreq[] = { | ||
190 | { 0x47, 0x60 }, | ||
191 | { 0x68, 0x00 }, | ||
192 | { 0x69, 0x89 }, | ||
193 | { 0xf0, 0x48 }, | ||
194 | { 0xf1, 0x19 }, | ||
195 | }; | ||
196 | |||
197 | static struct regdata s921_postfreq[] = { | ||
198 | { 0xf5, 0xae }, | ||
199 | { 0xf6, 0xb7 }, | ||
200 | { 0xf7, 0xba }, | ||
201 | { 0xf8, 0xd7 }, | ||
202 | { 0x68, 0x0a }, | ||
203 | { 0x69, 0x09 }, | ||
204 | }; | ||
205 | |||
206 | static 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 | |||
225 | static 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 | |||
238 | static 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 = ®, .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 | |||
265 | static 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 | |||
337 | static 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 | |||
351 | static 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 | |||
390 | static 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 | |||
417 | static 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 | |||
436 | static 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 | |||
447 | static 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 | |||
466 | static int s921_get_algo(struct dvb_frontend *fe) | ||
467 | { | ||
468 | return 1; /* FE_ALGO_HW */ | ||
469 | } | ||
470 | |||
471 | static 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 | |||
479 | static struct dvb_frontend_ops s921_ops; | ||
480 | |||
481 | struct 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 | |||
505 | rcor: | ||
506 | kfree(state); | ||
507 | |||
508 | return NULL; | ||
509 | } | ||
510 | EXPORT_SYMBOL(s921_attach); | ||
511 | |||
512 | static 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 | |||
545 | MODULE_DESCRIPTION("DVB Frontend module for Sharp S921 hardware"); | ||
546 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>"); | ||
547 | MODULE_AUTHOR("Douglas Landgraf <dougsland@redhat.com>"); | ||
548 | MODULE_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 | |||
22 | struct 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)) | ||
29 | extern struct dvb_frontend *s921_attach(const struct s921_config *config, | ||
30 | struct i2c_adapter *i2c); | ||
31 | extern struct i2c_adapter *s921_get_tuner_i2c_adapter(struct dvb_frontend *); | ||
32 | #else | ||
33 | static 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 | } | ||
39 | static 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 | |||
14 | static int s921_isdb_init(struct s921_isdb_t *dev); | ||
15 | static int s921_isdb_set_parameters(struct s921_isdb_t *dev, struct s921_isdb_t_transmission_mode_params *params); | ||
16 | static int s921_isdb_tune(struct s921_isdb_t *dev, struct s921_isdb_t_tune_params *params); | ||
17 | static int s921_isdb_get_status(struct s921_isdb_t *dev, void *data); | ||
18 | |||
19 | static 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 | |||
46 | static 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 | |||
64 | int 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 | |||
85 | static 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 | |||
99 | static 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 | |||
135 | static 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 | |||
204 | static 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 | |||
11 | struct 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 | |||
22 | struct s921_isdb_t_tune_params { | ||
23 | u32 frequency; | ||
24 | }; | ||
25 | |||
26 | struct s921_isdb_t_status { | ||
27 | }; | ||
28 | |||
29 | struct 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 | |||
113 | int 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 | |||
18 | static unsigned int debug = 0; | ||
19 | module_param(debug, int, 0644); | ||
20 | MODULE_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 | |||
25 | struct 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 | |||
36 | static 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, ¶ms); | ||
43 | s921_isdb_cmd(&state->dev, ISDB_T_CMD_TUNE, &tune_params); | ||
44 | mdelay(100); | ||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | static int s921_init(struct dvb_frontend *fe) { | ||
49 | printk("s921 init\n"); | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static int s921_sleep(struct dvb_frontend *fe) { | ||
54 | printk("s921 sleep\n"); | ||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | static 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 | |||
78 | static int s921_read_ber(struct dvb_frontend *fe, __u32 *ber) | ||
79 | { | ||
80 | dprintk("read ber\n"); | ||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | static int s921_read_snr(struct dvb_frontend *fe, __u16 *snr) | ||
85 | { | ||
86 | dprintk("read snr\n"); | ||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | static int s921_read_ucblocks(struct dvb_frontend *fe, __u32 *ucblocks) | ||
91 | { | ||
92 | dprintk("read ucblocks\n"); | ||
93 | return 0; | ||
94 | } | ||
95 | |||
96 | static void s921_release(struct dvb_frontend *fe) | ||
97 | { | ||
98 | struct s921_state *state = (struct s921_state *)fe->demodulator_priv; | ||
99 | kfree(state); | ||
100 | } | ||
101 | |||
102 | static 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 | |||
128 | static 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 | |||
150 | static 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 = ®, .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 | |||
167 | struct 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 | |||
189 | EXPORT_SYMBOL_GPL(s921_attach); | ||
190 | MODULE_AUTHOR("Markus Rechberger <mrechberger@empiatech.com>"); | ||
191 | MODULE_DESCRIPTION("Sharp S921 ISDB-T 1Seg"); | ||
192 | MODULE_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 | |||
28 | int s921_isdb_init(struct s921_isdb_t *dev); | ||
29 | int s921_isdb_cmd(struct s921_isdb_t *dev, u32 cmd, void *data); | ||
30 | |||
31 | struct 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)) | ||
38 | extern struct dvb_frontend* s921_attach(const struct s921_config *config, | ||
39 | struct i2c_adapter *i2c); | ||
40 | #else | ||
41 | static 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 | ||
56 | struct stb6100_lkup { | 56 | struct 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 | ||
120 | static void stb6100_normalise_regs(u8 regs[]) | 120 | /* |
121 | * Currently unused. Some boards might need it in the future | ||
122 | */ | ||
123 | static 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 | ||
169 | static int stb6100_write_reg_range(struct stb6100_state *state, u8 buf[], int start, int len) | 184 | static 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 | ||
214 | static int stb6100_write_regs(struct stb6100_state *state, u8 regs[]) | ||
215 | { | ||
216 | stb6100_normalise_regs(regs); | ||
217 | return stb6100_write_reg_range(state, ®s[1], 1, STB6100_NUMREGS - 1); | ||
218 | } | ||
219 | 229 | ||
220 | static int stb6100_get_status(struct dvb_frontend *fe, u32 *status) | 230 | static 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, ®s[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 | ||
440 | static int stb6100_get_state(struct dvb_frontend *fe, | 504 | static 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 @@ | |||
1 | config MANTIS_CORE | 1 | config 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 | ||
254 | MODULE_DEVICE_TABLE(pci, hopper_pci_table); | ||
255 | |||
254 | static struct pci_driver hopper_pci_driver = { | 256 | static 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 | ||
284 | MODULE_DEVICE_TABLE(pci, mantis_pci_table); | ||
285 | |||
284 | static struct pci_driver mantis_pci_driver = { | 286 | static 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 | ||
37 | static struct ir_scancode mantis_ir_table[] = { | 37 | static 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 | ||
98 | struct ir_scancode_table ir_mantis = { | 98 | static 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 | }; |
102 | EXPORT_SYMBOL_GPL(ir_mantis); | ||
103 | 106 | ||
104 | int mantis_input_init(struct mantis_pci *mantis) | 107 | int 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 | |||
145 | out_dev: | ||
146 | rc_free_device(dev); | ||
147 | out_map: | ||
148 | rc_map_unregister(&ir_mantis_map); | ||
149 | out: | ||
150 | return err; | ||
138 | } | 151 | } |
139 | 152 | ||
140 | int mantis_exit(struct mantis_pci *mantis) | 153 | int 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) | |||
75 | EXPORT_SYMBOL_GPL(mantis_get_mac); | 75 | EXPORT_SYMBOL_GPL(mantis_get_mac); |
76 | 76 | ||
77 | /* Turn the given bit on or off. */ | 77 | /* Turn the given bit on or off. */ |
78 | void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value) | 78 | void 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 | } |
93 | EXPORT_SYMBOL_GPL(gpio_set_bits); | 93 | EXPORT_SYMBOL_GPL(mantis_gpio_set_bits); |
94 | 94 | ||
95 | int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl) | 95 | int 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 | ||
46 | extern int mantis_get_mac(struct mantis_pci *mantis); | 46 | extern int mantis_get_mac(struct mantis_pci *mantis); |
47 | extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value); | 47 | extern void mantis_gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value); |
48 | 48 | ||
49 | extern int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl); | 49 | extern 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) | |||
1304 | static int ngene_start(struct ngene *dev) | 1304 | static 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 | ||
1516 | void __devexit ngene_remove(struct pci_dev *pdev) | 1517 | void __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 | ||
5 | config SMS_SIANO_MDTV | 5 | config 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 | ||
53 | int sms_ir_init(struct smscore_device_t *coredev) | 53 | int 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 | ||
106 | void sms_ir_exit(struct smscore_device_t *coredev) | 108 | void 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 | ||
35 | struct smscore_device_t; | 35 | struct smscore_device_t; |
36 | 36 | ||
37 | struct ir_t { | 37 | struct 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 | ||
289 | static void smsusb_term_device(struct usb_interface *intf) | 289 | static 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 | ||
446 | static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg) | 445 | static 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) | |||
455 | static int smsusb_resume(struct usb_interface *intf) | 453 | static 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 | |||
89 | config DVB_BUDGET_CI | 89 | config 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 |
1408 | static struct v4l2_input knc1_inputs[KNC1_INPUTS] = { | 1408 | static 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 | ||
1413 | static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i) | 1415 | static 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"); | |||
96 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 95 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
97 | 96 | ||
98 | struct budget_ci_ir { | 97 | struct 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 { | |||
118 | static void msp430_ir_interrupt(unsigned long data) | 117 | static 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 | ||
166 | static int msp430_ir_init(struct budget_ci *budget_ci) | 165 | static 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) | |||
248 | static void msp430_ir_deinit(struct budget_ci *budget_ci) | 245 | static 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 | ||
260 | static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address) | 256 | static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address) |