diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/media/dvb/dm1105/dm1105.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/media/dvb/dm1105/dm1105.c')
-rw-r--r-- | drivers/media/dvb/dm1105/dm1105.c | 317 |
1 files changed, 258 insertions, 59 deletions
diff --git a/drivers/media/dvb/dm1105/dm1105.c b/drivers/media/dvb/dm1105/dm1105.c index bca07c0bcd01..b2b0c45f32a9 100644 --- a/drivers/media/dvb/dm1105/dm1105.c +++ b/drivers/media/dvb/dm1105/dm1105.c | |||
@@ -20,15 +20,15 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/i2c.h> | 22 | #include <linux/i2c.h> |
23 | #include <linux/i2c-algo-bit.h> | ||
23 | #include <linux/init.h> | 24 | #include <linux/init.h> |
24 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
25 | #include <linux/module.h> | 26 | #include <linux/module.h> |
26 | #include <linux/proc_fs.h> | 27 | #include <linux/proc_fs.h> |
27 | #include <linux/pci.h> | 28 | #include <linux/pci.h> |
28 | #include <linux/dma-mapping.h> | 29 | #include <linux/dma-mapping.h> |
29 | #include <linux/input.h> | ||
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <media/ir-core.h> | 31 | #include <media/rc-core.h> |
32 | 32 | ||
33 | #include "demux.h" | 33 | #include "demux.h" |
34 | #include "dmxdev.h" | 34 | #include "dmxdev.h" |
@@ -50,11 +50,12 @@ | |||
50 | 50 | ||
51 | #define UNSET (-1U) | 51 | #define UNSET (-1U) |
52 | 52 | ||
53 | #define DM1105_BOARD_NOAUTO UNSET | 53 | #define DM1105_BOARD_NOAUTO UNSET |
54 | #define DM1105_BOARD_UNKNOWN 0 | 54 | #define DM1105_BOARD_UNKNOWN 0 |
55 | #define DM1105_BOARD_DVBWORLD_2002 1 | 55 | #define DM1105_BOARD_DVBWORLD_2002 1 |
56 | #define DM1105_BOARD_DVBWORLD_2004 2 | 56 | #define DM1105_BOARD_DVBWORLD_2004 2 |
57 | #define DM1105_BOARD_AXESS_DM05 3 | 57 | #define DM1105_BOARD_AXESS_DM05 3 |
58 | #define DM1105_BOARD_UNBRANDED_I2C_ON_GPIO 4 | ||
58 | 59 | ||
59 | /* ----------------------------------------------- */ | 60 | /* ----------------------------------------------- */ |
60 | /* | 61 | /* |
@@ -158,22 +159,38 @@ | |||
158 | #define DM1105_MAX 0x04 | 159 | #define DM1105_MAX 0x04 |
159 | 160 | ||
160 | #define DRIVER_NAME "dm1105" | 161 | #define DRIVER_NAME "dm1105" |
162 | #define DM1105_I2C_GPIO_NAME "dm1105-gpio" | ||
161 | 163 | ||
162 | #define DM1105_DMA_PACKETS 47 | 164 | #define DM1105_DMA_PACKETS 47 |
163 | #define DM1105_DMA_PACKET_LENGTH (128*4) | 165 | #define DM1105_DMA_PACKET_LENGTH (128*4) |
164 | #define DM1105_DMA_BYTES (128 * 4 * DM1105_DMA_PACKETS) | 166 | #define DM1105_DMA_BYTES (128 * 4 * DM1105_DMA_PACKETS) |
165 | 167 | ||
168 | /* */ | ||
169 | #define GPIO08 (1 << 8) | ||
170 | #define GPIO13 (1 << 13) | ||
171 | #define GPIO14 (1 << 14) | ||
172 | #define GPIO15 (1 << 15) | ||
173 | #define GPIO16 (1 << 16) | ||
174 | #define GPIO17 (1 << 17) | ||
175 | #define GPIO_ALL 0x03ffff | ||
176 | |||
166 | /* GPIO's for LNB power control */ | 177 | /* GPIO's for LNB power control */ |
167 | #define DM1105_LNB_MASK 0x00000000 | 178 | #define DM1105_LNB_MASK (GPIO_ALL & ~(GPIO14 | GPIO13)) |
168 | #define DM1105_LNB_OFF 0x00020000 | 179 | #define DM1105_LNB_OFF GPIO17 |
169 | #define DM1105_LNB_13V 0x00010100 | 180 | #define DM1105_LNB_13V (GPIO16 | GPIO08) |
170 | #define DM1105_LNB_18V 0x00000100 | 181 | #define DM1105_LNB_18V GPIO08 |
171 | 182 | ||
172 | /* GPIO's for LNB power control for Axess DM05 */ | 183 | /* GPIO's for LNB power control for Axess DM05 */ |
173 | #define DM05_LNB_MASK 0x00000000 | 184 | #define DM05_LNB_MASK (GPIO_ALL & ~(GPIO14 | GPIO13)) |
174 | #define DM05_LNB_OFF 0x00020000/* actually 13v */ | 185 | #define DM05_LNB_OFF GPIO17/* actually 13v */ |
175 | #define DM05_LNB_13V 0x00020000 | 186 | #define DM05_LNB_13V GPIO17 |
176 | #define DM05_LNB_18V 0x00030000 | 187 | #define DM05_LNB_18V (GPIO17 | GPIO16) |
188 | |||
189 | /* GPIO's for LNB power control for unbranded with I2C on GPIO */ | ||
190 | #define UNBR_LNB_MASK (GPIO17 | GPIO16) | ||
191 | #define UNBR_LNB_OFF 0 | ||
192 | #define UNBR_LNB_13V GPIO17 | ||
193 | #define UNBR_LNB_18V (GPIO17 | GPIO16) | ||
177 | 194 | ||
178 | static unsigned int card[] = {[0 ... 3] = UNSET }; | 195 | static unsigned int card[] = {[0 ... 3] = UNSET }; |
179 | module_param_array(card, int, NULL, 0444); | 196 | module_param_array(card, int, NULL, 0444); |
@@ -188,7 +205,11 @@ static unsigned int dm1105_devcount; | |||
188 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 205 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
189 | 206 | ||
190 | struct dm1105_board { | 207 | struct dm1105_board { |
191 | char *name; | 208 | char *name; |
209 | struct { | ||
210 | u32 mask, off, v13, v18; | ||
211 | } lnb; | ||
212 | u32 gpio_scl, gpio_sda; | ||
192 | }; | 213 | }; |
193 | 214 | ||
194 | struct dm1105_subid { | 215 | struct dm1105_subid { |
@@ -200,15 +221,50 @@ struct dm1105_subid { | |||
200 | static const struct dm1105_board dm1105_boards[] = { | 221 | static const struct dm1105_board dm1105_boards[] = { |
201 | [DM1105_BOARD_UNKNOWN] = { | 222 | [DM1105_BOARD_UNKNOWN] = { |
202 | .name = "UNKNOWN/GENERIC", | 223 | .name = "UNKNOWN/GENERIC", |
224 | .lnb = { | ||
225 | .mask = DM1105_LNB_MASK, | ||
226 | .off = DM1105_LNB_OFF, | ||
227 | .v13 = DM1105_LNB_13V, | ||
228 | .v18 = DM1105_LNB_18V, | ||
229 | }, | ||
203 | }, | 230 | }, |
204 | [DM1105_BOARD_DVBWORLD_2002] = { | 231 | [DM1105_BOARD_DVBWORLD_2002] = { |
205 | .name = "DVBWorld PCI 2002", | 232 | .name = "DVBWorld PCI 2002", |
233 | .lnb = { | ||
234 | .mask = DM1105_LNB_MASK, | ||
235 | .off = DM1105_LNB_OFF, | ||
236 | .v13 = DM1105_LNB_13V, | ||
237 | .v18 = DM1105_LNB_18V, | ||
238 | }, | ||
206 | }, | 239 | }, |
207 | [DM1105_BOARD_DVBWORLD_2004] = { | 240 | [DM1105_BOARD_DVBWORLD_2004] = { |
208 | .name = "DVBWorld PCI 2004", | 241 | .name = "DVBWorld PCI 2004", |
242 | .lnb = { | ||
243 | .mask = DM1105_LNB_MASK, | ||
244 | .off = DM1105_LNB_OFF, | ||
245 | .v13 = DM1105_LNB_13V, | ||
246 | .v18 = DM1105_LNB_18V, | ||
247 | }, | ||
209 | }, | 248 | }, |
210 | [DM1105_BOARD_AXESS_DM05] = { | 249 | [DM1105_BOARD_AXESS_DM05] = { |
211 | .name = "Axess/EasyTv DM05", | 250 | .name = "Axess/EasyTv DM05", |
251 | .lnb = { | ||
252 | .mask = DM05_LNB_MASK, | ||
253 | .off = DM05_LNB_OFF, | ||
254 | .v13 = DM05_LNB_13V, | ||
255 | .v18 = DM05_LNB_18V, | ||
256 | }, | ||
257 | }, | ||
258 | [DM1105_BOARD_UNBRANDED_I2C_ON_GPIO] = { | ||
259 | .name = "Unbranded DM1105 with i2c on GPIOs", | ||
260 | .lnb = { | ||
261 | .mask = UNBR_LNB_MASK, | ||
262 | .off = UNBR_LNB_OFF, | ||
263 | .v13 = UNBR_LNB_13V, | ||
264 | .v18 = UNBR_LNB_18V, | ||
265 | }, | ||
266 | .gpio_scl = GPIO14, | ||
267 | .gpio_sda = GPIO13, | ||
212 | }, | 268 | }, |
213 | }; | 269 | }; |
214 | 270 | ||
@@ -266,7 +322,7 @@ static void dm1105_card_list(struct pci_dev *pci) | |||
266 | 322 | ||
267 | /* infrared remote control */ | 323 | /* infrared remote control */ |
268 | struct infrared { | 324 | struct infrared { |
269 | struct input_dev *input_dev; | 325 | struct rc_dev *dev; |
270 | char input_phys[32]; | 326 | char input_phys[32]; |
271 | struct work_struct work; | 327 | struct work_struct work; |
272 | u32 ir_command; | 328 | u32 ir_command; |
@@ -294,6 +350,8 @@ struct dm1105_dev { | |||
294 | 350 | ||
295 | /* i2c */ | 351 | /* i2c */ |
296 | struct i2c_adapter i2c_adap; | 352 | struct i2c_adapter i2c_adap; |
353 | struct i2c_adapter i2c_bb_adap; | ||
354 | struct i2c_algo_bit_data i2c_bit; | ||
297 | 355 | ||
298 | /* irq */ | 356 | /* irq */ |
299 | struct work_struct work; | 357 | struct work_struct work; |
@@ -329,6 +387,103 @@ struct dm1105_dev { | |||
329 | #define dm_setl(reg, bit) dm_andorl((reg), (bit), (bit)) | 387 | #define dm_setl(reg, bit) dm_andorl((reg), (bit), (bit)) |
330 | #define dm_clearl(reg, bit) dm_andorl((reg), (bit), 0) | 388 | #define dm_clearl(reg, bit) dm_andorl((reg), (bit), 0) |
331 | 389 | ||
390 | /* The chip has 18 GPIOs. In HOST mode GPIO's used as 15 bit address lines, | ||
391 | so we can use only 3 GPIO's from GPIO15 to GPIO17. | ||
392 | Here I don't check whether HOST is enebled as it is not implemented yet. | ||
393 | */ | ||
394 | static void dm1105_gpio_set(struct dm1105_dev *dev, u32 mask) | ||
395 | { | ||
396 | if (mask & 0xfffc0000) | ||
397 | printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); | ||
398 | |||
399 | if (mask & 0x0003ffff) | ||
400 | dm_setl(DM1105_GPIOVAL, mask & 0x0003ffff); | ||
401 | |||
402 | } | ||
403 | |||
404 | static void dm1105_gpio_clear(struct dm1105_dev *dev, u32 mask) | ||
405 | { | ||
406 | if (mask & 0xfffc0000) | ||
407 | printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); | ||
408 | |||
409 | if (mask & 0x0003ffff) | ||
410 | dm_clearl(DM1105_GPIOVAL, mask & 0x0003ffff); | ||
411 | |||
412 | } | ||
413 | |||
414 | static void dm1105_gpio_andor(struct dm1105_dev *dev, u32 mask, u32 val) | ||
415 | { | ||
416 | if (mask & 0xfffc0000) | ||
417 | printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); | ||
418 | |||
419 | if (mask & 0x0003ffff) | ||
420 | dm_andorl(DM1105_GPIOVAL, mask & 0x0003ffff, val); | ||
421 | |||
422 | } | ||
423 | |||
424 | static u32 dm1105_gpio_get(struct dm1105_dev *dev, u32 mask) | ||
425 | { | ||
426 | if (mask & 0xfffc0000) | ||
427 | printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); | ||
428 | |||
429 | if (mask & 0x0003ffff) | ||
430 | return dm_readl(DM1105_GPIOVAL) & mask & 0x0003ffff; | ||
431 | |||
432 | return 0; | ||
433 | } | ||
434 | |||
435 | static void dm1105_gpio_enable(struct dm1105_dev *dev, u32 mask, int asoutput) | ||
436 | { | ||
437 | if (mask & 0xfffc0000) | ||
438 | printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); | ||
439 | |||
440 | if ((mask & 0x0003ffff) && asoutput) | ||
441 | dm_clearl(DM1105_GPIOCTR, mask & 0x0003ffff); | ||
442 | else if ((mask & 0x0003ffff) && !asoutput) | ||
443 | dm_setl(DM1105_GPIOCTR, mask & 0x0003ffff); | ||
444 | |||
445 | } | ||
446 | |||
447 | static void dm1105_setline(struct dm1105_dev *dev, u32 line, int state) | ||
448 | { | ||
449 | if (state) | ||
450 | dm1105_gpio_enable(dev, line, 0); | ||
451 | else { | ||
452 | dm1105_gpio_enable(dev, line, 1); | ||
453 | dm1105_gpio_clear(dev, line); | ||
454 | } | ||
455 | } | ||
456 | |||
457 | static void dm1105_setsda(void *data, int state) | ||
458 | { | ||
459 | struct dm1105_dev *dev = data; | ||
460 | |||
461 | dm1105_setline(dev, dm1105_boards[dev->boardnr].gpio_sda, state); | ||
462 | } | ||
463 | |||
464 | static void dm1105_setscl(void *data, int state) | ||
465 | { | ||
466 | struct dm1105_dev *dev = data; | ||
467 | |||
468 | dm1105_setline(dev, dm1105_boards[dev->boardnr].gpio_scl, state); | ||
469 | } | ||
470 | |||
471 | static int dm1105_getsda(void *data) | ||
472 | { | ||
473 | struct dm1105_dev *dev = data; | ||
474 | |||
475 | return dm1105_gpio_get(dev, dm1105_boards[dev->boardnr].gpio_sda) | ||
476 | ? 1 : 0; | ||
477 | } | ||
478 | |||
479 | static int dm1105_getscl(void *data) | ||
480 | { | ||
481 | struct dm1105_dev *dev = data; | ||
482 | |||
483 | return dm1105_gpio_get(dev, dm1105_boards[dev->boardnr].gpio_scl) | ||
484 | ? 1 : 0; | ||
485 | } | ||
486 | |||
332 | static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap, | 487 | static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap, |
333 | struct i2c_msg *msgs, int num) | 488 | struct i2c_msg *msgs, int num) |
334 | { | 489 | { |
@@ -437,31 +592,20 @@ static inline struct dm1105_dev *frontend_to_dm1105_dev(struct dvb_frontend *fe) | |||
437 | static int dm1105_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | 592 | static int dm1105_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) |
438 | { | 593 | { |
439 | struct dm1105_dev *dev = frontend_to_dm1105_dev(fe); | 594 | struct dm1105_dev *dev = frontend_to_dm1105_dev(fe); |
440 | u32 lnb_mask, lnb_13v, lnb_18v, lnb_off; | ||
441 | 595 | ||
442 | switch (dev->boardnr) { | 596 | dm1105_gpio_enable(dev, dm1105_boards[dev->boardnr].lnb.mask, 1); |
443 | case DM1105_BOARD_AXESS_DM05: | ||
444 | lnb_mask = DM05_LNB_MASK; | ||
445 | lnb_off = DM05_LNB_OFF; | ||
446 | lnb_13v = DM05_LNB_13V; | ||
447 | lnb_18v = DM05_LNB_18V; | ||
448 | break; | ||
449 | case DM1105_BOARD_DVBWORLD_2002: | ||
450 | case DM1105_BOARD_DVBWORLD_2004: | ||
451 | default: | ||
452 | lnb_mask = DM1105_LNB_MASK; | ||
453 | lnb_off = DM1105_LNB_OFF; | ||
454 | lnb_13v = DM1105_LNB_13V; | ||
455 | lnb_18v = DM1105_LNB_18V; | ||
456 | } | ||
457 | |||
458 | dm_writel(DM1105_GPIOCTR, lnb_mask); | ||
459 | if (voltage == SEC_VOLTAGE_18) | 597 | if (voltage == SEC_VOLTAGE_18) |
460 | dm_writel(DM1105_GPIOVAL, lnb_18v); | 598 | dm1105_gpio_andor(dev, |
599 | dm1105_boards[dev->boardnr].lnb.mask, | ||
600 | dm1105_boards[dev->boardnr].lnb.v18); | ||
461 | else if (voltage == SEC_VOLTAGE_13) | 601 | else if (voltage == SEC_VOLTAGE_13) |
462 | dm_writel(DM1105_GPIOVAL, lnb_13v); | 602 | dm1105_gpio_andor(dev, |
603 | dm1105_boards[dev->boardnr].lnb.mask, | ||
604 | dm1105_boards[dev->boardnr].lnb.v13); | ||
463 | else | 605 | else |
464 | dm_writel(DM1105_GPIOVAL, lnb_off); | 606 | dm1105_gpio_andor(dev, |
607 | dm1105_boards[dev->boardnr].lnb.mask, | ||
608 | dm1105_boards[dev->boardnr].lnb.off); | ||
465 | 609 | ||
466 | return 0; | 610 | return 0; |
467 | } | 611 | } |
@@ -532,7 +676,7 @@ static void dm1105_emit_key(struct work_struct *work) | |||
532 | 676 | ||
533 | data = (ircom >> 8) & 0x7f; | 677 | data = (ircom >> 8) & 0x7f; |
534 | 678 | ||
535 | ir_keydown(ir->input_dev, data, 0); | 679 | rc_keydown(ir->dev, data, 0); |
536 | } | 680 | } |
537 | 681 | ||
538 | /* work handler */ | 682 | /* work handler */ |
@@ -593,46 +737,47 @@ static irqreturn_t dm1105_irq(int irq, void *dev_id) | |||
593 | 737 | ||
594 | int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) | 738 | int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) |
595 | { | 739 | { |
596 | struct input_dev *input_dev; | 740 | struct rc_dev *dev; |
597 | char *ir_codes = RC_MAP_DM1105_NEC; | ||
598 | int err = -ENOMEM; | 741 | int err = -ENOMEM; |
599 | 742 | ||
600 | input_dev = input_allocate_device(); | 743 | dev = rc_allocate_device(); |
601 | if (!input_dev) | 744 | if (!dev) |
602 | return -ENOMEM; | 745 | return -ENOMEM; |
603 | 746 | ||
604 | dm1105->ir.input_dev = input_dev; | ||
605 | snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), | 747 | snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), |
606 | "pci-%s/ir0", pci_name(dm1105->pdev)); | 748 | "pci-%s/ir0", pci_name(dm1105->pdev)); |
607 | 749 | ||
608 | input_dev->name = "DVB on-card IR receiver"; | 750 | dev->driver_name = MODULE_NAME; |
609 | input_dev->phys = dm1105->ir.input_phys; | 751 | dev->map_name = RC_MAP_DM1105_NEC; |
610 | input_dev->id.bustype = BUS_PCI; | 752 | dev->driver_type = RC_DRIVER_SCANCODE; |
611 | input_dev->id.version = 1; | 753 | dev->input_name = "DVB on-card IR receiver"; |
754 | dev->input_phys = dm1105->ir.input_phys; | ||
755 | dev->input_id.bustype = BUS_PCI; | ||
756 | dev->input_id.version = 1; | ||
612 | if (dm1105->pdev->subsystem_vendor) { | 757 | if (dm1105->pdev->subsystem_vendor) { |
613 | input_dev->id.vendor = dm1105->pdev->subsystem_vendor; | 758 | dev->input_id.vendor = dm1105->pdev->subsystem_vendor; |
614 | input_dev->id.product = dm1105->pdev->subsystem_device; | 759 | dev->input_id.product = dm1105->pdev->subsystem_device; |
615 | } else { | 760 | } else { |
616 | input_dev->id.vendor = dm1105->pdev->vendor; | 761 | dev->input_id.vendor = dm1105->pdev->vendor; |
617 | input_dev->id.product = dm1105->pdev->device; | 762 | dev->input_id.product = dm1105->pdev->device; |
618 | } | 763 | } |
619 | 764 | dev->dev.parent = &dm1105->pdev->dev; | |
620 | input_dev->dev.parent = &dm1105->pdev->dev; | ||
621 | 765 | ||
622 | INIT_WORK(&dm1105->ir.work, dm1105_emit_key); | 766 | INIT_WORK(&dm1105->ir.work, dm1105_emit_key); |
623 | 767 | ||
624 | err = ir_input_register(input_dev, ir_codes, NULL, MODULE_NAME); | 768 | err = rc_register_device(dev); |
625 | if (err < 0) { | 769 | if (err < 0) { |
626 | input_free_device(input_dev); | 770 | rc_free_device(dev); |
627 | return err; | 771 | return err; |
628 | } | 772 | } |
629 | 773 | ||
774 | dm1105->ir.dev = dev; | ||
630 | return 0; | 775 | return 0; |
631 | } | 776 | } |
632 | 777 | ||
633 | void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105) | 778 | void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105) |
634 | { | 779 | { |
635 | ir_input_unregister(dm1105->ir.input_dev); | 780 | rc_unregister_device(dm1105->ir.dev); |
636 | } | 781 | } |
637 | 782 | ||
638 | static int __devinit dm1105_hw_init(struct dm1105_dev *dev) | 783 | static int __devinit dm1105_hw_init(struct dm1105_dev *dev) |
@@ -708,6 +853,38 @@ static int __devinit frontend_init(struct dm1105_dev *dev) | |||
708 | int ret; | 853 | int ret; |
709 | 854 | ||
710 | switch (dev->boardnr) { | 855 | switch (dev->boardnr) { |
856 | case DM1105_BOARD_UNBRANDED_I2C_ON_GPIO: | ||
857 | dm1105_gpio_enable(dev, GPIO15, 1); | ||
858 | dm1105_gpio_clear(dev, GPIO15); | ||
859 | msleep(100); | ||
860 | dm1105_gpio_set(dev, GPIO15); | ||
861 | msleep(200); | ||
862 | dev->fe = dvb_attach( | ||
863 | stv0299_attach, &sharp_z0194a_config, | ||
864 | &dev->i2c_bb_adap); | ||
865 | if (dev->fe) { | ||
866 | dev->fe->ops.set_voltage = dm1105_set_voltage; | ||
867 | dvb_attach(dvb_pll_attach, dev->fe, 0x60, | ||
868 | &dev->i2c_bb_adap, DVB_PLL_OPERA1); | ||
869 | break; | ||
870 | } | ||
871 | |||
872 | dev->fe = dvb_attach( | ||
873 | stv0288_attach, &earda_config, | ||
874 | &dev->i2c_bb_adap); | ||
875 | if (dev->fe) { | ||
876 | dev->fe->ops.set_voltage = dm1105_set_voltage; | ||
877 | dvb_attach(stb6000_attach, dev->fe, 0x61, | ||
878 | &dev->i2c_bb_adap); | ||
879 | break; | ||
880 | } | ||
881 | |||
882 | dev->fe = dvb_attach( | ||
883 | si21xx_attach, &serit_config, | ||
884 | &dev->i2c_bb_adap); | ||
885 | if (dev->fe) | ||
886 | dev->fe->ops.set_voltage = dm1105_set_voltage; | ||
887 | break; | ||
711 | case DM1105_BOARD_DVBWORLD_2004: | 888 | case DM1105_BOARD_DVBWORLD_2004: |
712 | dev->fe = dvb_attach( | 889 | dev->fe = dvb_attach( |
713 | cx24116_attach, &serit_sp2633_config, | 890 | cx24116_attach, &serit_sp2633_config, |
@@ -862,7 +1039,6 @@ static int __devinit dm1105_probe(struct pci_dev *pdev, | |||
862 | i2c_set_adapdata(&dev->i2c_adap, dev); | 1039 | i2c_set_adapdata(&dev->i2c_adap, dev); |
863 | strcpy(dev->i2c_adap.name, DRIVER_NAME); | 1040 | strcpy(dev->i2c_adap.name, DRIVER_NAME); |
864 | dev->i2c_adap.owner = THIS_MODULE; | 1041 | dev->i2c_adap.owner = THIS_MODULE; |
865 | dev->i2c_adap.class = I2C_CLASS_TV_DIGITAL; | ||
866 | dev->i2c_adap.dev.parent = &pdev->dev; | 1042 | dev->i2c_adap.dev.parent = &pdev->dev; |
867 | dev->i2c_adap.algo = &dm1105_algo; | 1043 | dev->i2c_adap.algo = &dm1105_algo; |
868 | dev->i2c_adap.algo_data = dev; | 1044 | dev->i2c_adap.algo_data = dev; |
@@ -871,11 +1047,32 @@ static int __devinit dm1105_probe(struct pci_dev *pdev, | |||
871 | if (ret < 0) | 1047 | if (ret < 0) |
872 | goto err_dm1105_hw_exit; | 1048 | goto err_dm1105_hw_exit; |
873 | 1049 | ||
1050 | i2c_set_adapdata(&dev->i2c_bb_adap, dev); | ||
1051 | strcpy(dev->i2c_bb_adap.name, DM1105_I2C_GPIO_NAME); | ||
1052 | dev->i2c_bb_adap.owner = THIS_MODULE; | ||
1053 | dev->i2c_bb_adap.dev.parent = &pdev->dev; | ||
1054 | dev->i2c_bb_adap.algo_data = &dev->i2c_bit; | ||
1055 | dev->i2c_bit.data = dev; | ||
1056 | dev->i2c_bit.setsda = dm1105_setsda; | ||
1057 | dev->i2c_bit.setscl = dm1105_setscl; | ||
1058 | dev->i2c_bit.getsda = dm1105_getsda; | ||
1059 | dev->i2c_bit.getscl = dm1105_getscl; | ||
1060 | dev->i2c_bit.udelay = 10; | ||
1061 | dev->i2c_bit.timeout = 10; | ||
1062 | |||
1063 | /* Raise SCL and SDA */ | ||
1064 | dm1105_setsda(dev, 1); | ||
1065 | dm1105_setscl(dev, 1); | ||
1066 | |||
1067 | ret = i2c_bit_add_bus(&dev->i2c_bb_adap); | ||
1068 | if (ret < 0) | ||
1069 | goto err_i2c_del_adapter; | ||
1070 | |||
874 | /* dvb */ | 1071 | /* dvb */ |
875 | ret = dvb_register_adapter(&dev->dvb_adapter, DRIVER_NAME, | 1072 | ret = dvb_register_adapter(&dev->dvb_adapter, DRIVER_NAME, |
876 | THIS_MODULE, &pdev->dev, adapter_nr); | 1073 | THIS_MODULE, &pdev->dev, adapter_nr); |
877 | if (ret < 0) | 1074 | if (ret < 0) |
878 | goto err_i2c_del_adapter; | 1075 | goto err_i2c_del_adapters; |
879 | 1076 | ||
880 | dvb_adapter = &dev->dvb_adapter; | 1077 | dvb_adapter = &dev->dvb_adapter; |
881 | 1078 | ||
@@ -953,6 +1150,8 @@ err_dvb_dmx_release: | |||
953 | dvb_dmx_release(dvbdemux); | 1150 | dvb_dmx_release(dvbdemux); |
954 | err_dvb_unregister_adapter: | 1151 | err_dvb_unregister_adapter: |
955 | dvb_unregister_adapter(dvb_adapter); | 1152 | dvb_unregister_adapter(dvb_adapter); |
1153 | err_i2c_del_adapters: | ||
1154 | i2c_del_adapter(&dev->i2c_bb_adap); | ||
956 | err_i2c_del_adapter: | 1155 | err_i2c_del_adapter: |
957 | i2c_del_adapter(&dev->i2c_adap); | 1156 | i2c_del_adapter(&dev->i2c_adap); |
958 | err_dm1105_hw_exit: | 1157 | err_dm1105_hw_exit: |