diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-cards.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-cards.c | 108 |
1 files changed, 104 insertions, 4 deletions
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c index 6bbbfc66bb4b..94b7a52629d0 100644 --- a/drivers/media/video/cx88/cx88-cards.c +++ b/drivers/media/video/cx88/cx88-cards.c | |||
@@ -1969,6 +1969,54 @@ static const struct cx88_board cx88_boards[] = { | |||
1969 | }, | 1969 | }, |
1970 | .mpeg = CX88_MPEG_DVB, | 1970 | .mpeg = CX88_MPEG_DVB, |
1971 | }, | 1971 | }, |
1972 | [CX88_BOARD_HAUPPAUGE_IRONLY] = { | ||
1973 | .name = "Hauppauge WinTV-IR Only", | ||
1974 | .tuner_type = UNSET, | ||
1975 | .radio_type = UNSET, | ||
1976 | .tuner_addr = ADDR_UNSET, | ||
1977 | .radio_addr = ADDR_UNSET, | ||
1978 | }, | ||
1979 | [CX88_BOARD_WINFAST_DTV1800H] = { | ||
1980 | .name = "Leadtek WinFast DTV1800 Hybrid", | ||
1981 | .tuner_type = TUNER_XC2028, | ||
1982 | .radio_type = TUNER_XC2028, | ||
1983 | .tuner_addr = 0x61, | ||
1984 | .radio_addr = 0x61, | ||
1985 | /* | ||
1986 | * GPIO setting | ||
1987 | * | ||
1988 | * 2: mute (0=off,1=on) | ||
1989 | * 12: tuner reset pin | ||
1990 | * 13: audio source (0=tuner audio,1=line in) | ||
1991 | * 14: FM (0=on,1=off ???) | ||
1992 | */ | ||
1993 | .input = {{ | ||
1994 | .type = CX88_VMUX_TELEVISION, | ||
1995 | .vmux = 0, | ||
1996 | .gpio0 = 0x0400, /* pin 2 = 0 */ | ||
1997 | .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */ | ||
1998 | .gpio2 = 0x0000, | ||
1999 | }, { | ||
2000 | .type = CX88_VMUX_COMPOSITE1, | ||
2001 | .vmux = 1, | ||
2002 | .gpio0 = 0x0400, /* pin 2 = 0 */ | ||
2003 | .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ | ||
2004 | .gpio2 = 0x0000, | ||
2005 | }, { | ||
2006 | .type = CX88_VMUX_SVIDEO, | ||
2007 | .vmux = 2, | ||
2008 | .gpio0 = 0x0400, /* pin 2 = 0 */ | ||
2009 | .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ | ||
2010 | .gpio2 = 0x0000, | ||
2011 | } }, | ||
2012 | .radio = { | ||
2013 | .type = CX88_RADIO, | ||
2014 | .gpio0 = 0x0400, /* pin 2 = 0 */ | ||
2015 | .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */ | ||
2016 | .gpio2 = 0x0000, | ||
2017 | }, | ||
2018 | .mpeg = CX88_MPEG_DVB, | ||
2019 | }, | ||
1972 | }; | 2020 | }; |
1973 | 2021 | ||
1974 | /* ------------------------------------------------------------------ */ | 2022 | /* ------------------------------------------------------------------ */ |
@@ -2382,6 +2430,14 @@ static const struct cx88_subid cx88_subids[] = { | |||
2382 | .subvendor = 0x153b, | 2430 | .subvendor = 0x153b, |
2383 | .subdevice = 0x1177, | 2431 | .subdevice = 0x1177, |
2384 | .card = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII, | 2432 | .card = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII, |
2433 | }, { | ||
2434 | .subvendor = 0x0070, | ||
2435 | .subdevice = 0x9290, | ||
2436 | .card = CX88_BOARD_HAUPPAUGE_IRONLY, | ||
2437 | }, { | ||
2438 | .subvendor = 0x107d, | ||
2439 | .subdevice = 0x6654, | ||
2440 | .card = CX88_BOARD_WINFAST_DTV1800H, | ||
2385 | }, | 2441 | }, |
2386 | }; | 2442 | }; |
2387 | 2443 | ||
@@ -2448,6 +2504,7 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data) | |||
2448 | case 90500: /* Nova-T-PCI (oem) */ | 2504 | case 90500: /* Nova-T-PCI (oem) */ |
2449 | case 90501: /* Nova-T-PCI (oem/IR) */ | 2505 | case 90501: /* Nova-T-PCI (oem/IR) */ |
2450 | case 92000: /* Nova-SE2 (OEM, No Video or IR) */ | 2506 | case 92000: /* Nova-SE2 (OEM, No Video or IR) */ |
2507 | case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */ | ||
2451 | case 94009: /* WinTV-HVR1100 (Video and IR Retail) */ | 2508 | case 94009: /* WinTV-HVR1100 (Video and IR Retail) */ |
2452 | case 94501: /* WinTV-HVR1100 (Video and IR OEM) */ | 2509 | case 94501: /* WinTV-HVR1100 (Video and IR OEM) */ |
2453 | case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */ | 2510 | case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */ |
@@ -2579,6 +2636,23 @@ static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core, | |||
2579 | return -EINVAL; | 2636 | return -EINVAL; |
2580 | } | 2637 | } |
2581 | 2638 | ||
2639 | static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core, | ||
2640 | int command, int arg) | ||
2641 | { | ||
2642 | switch (command) { | ||
2643 | case XC2028_TUNER_RESET: | ||
2644 | /* GPIO 12 (xc3028 tuner reset) */ | ||
2645 | cx_set(MO_GP1_IO, 0x1010); | ||
2646 | mdelay(50); | ||
2647 | cx_clear(MO_GP1_IO, 0x10); | ||
2648 | mdelay(50); | ||
2649 | cx_set(MO_GP1_IO, 0x10); | ||
2650 | mdelay(50); | ||
2651 | return 0; | ||
2652 | } | ||
2653 | return -EINVAL; | ||
2654 | } | ||
2655 | |||
2582 | /* ------------------------------------------------------------------- */ | 2656 | /* ------------------------------------------------------------------- */ |
2583 | /* some Divco specific stuff */ | 2657 | /* some Divco specific stuff */ |
2584 | static int cx88_pv_8000gt_callback(struct cx88_core *core, | 2658 | static int cx88_pv_8000gt_callback(struct cx88_core *core, |
@@ -2651,6 +2725,8 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core, | |||
2651 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: | 2725 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: |
2652 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | 2726 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: |
2653 | return cx88_dvico_xc2028_callback(core, command, arg); | 2727 | return cx88_dvico_xc2028_callback(core, command, arg); |
2728 | case CX88_BOARD_WINFAST_DTV1800H: | ||
2729 | return cx88_xc3028_winfast1800h_callback(core, command, arg); | ||
2654 | } | 2730 | } |
2655 | 2731 | ||
2656 | switch (command) { | 2732 | switch (command) { |
@@ -2690,10 +2766,22 @@ static int cx88_xc5000_tuner_callback(struct cx88_core *core, | |||
2690 | switch (core->boardnr) { | 2766 | switch (core->boardnr) { |
2691 | case CX88_BOARD_PINNACLE_PCTV_HD_800i: | 2767 | case CX88_BOARD_PINNACLE_PCTV_HD_800i: |
2692 | if (command == 0) { /* This is the reset command from xc5000 */ | 2768 | if (command == 0) { /* This is the reset command from xc5000 */ |
2693 | /* Reset XC5000 tuner via SYS_RSTO_pin */ | 2769 | |
2694 | cx_write(MO_SRST_IO, 0); | 2770 | /* djh - According to the engineer at PCTV Systems, |
2695 | msleep(10); | 2771 | the xc5000 reset pin is supposed to be on GPIO12. |
2696 | cx_write(MO_SRST_IO, 1); | 2772 | However, despite three nights of effort, pulling |
2773 | that GPIO low didn't reset the xc5000. While | ||
2774 | pulling MO_SRST_IO low does reset the xc5000, this | ||
2775 | also resets in the s5h1409 being reset as well. | ||
2776 | This causes tuning to always fail since the internal | ||
2777 | state of the s5h1409 does not match the driver's | ||
2778 | state. Given that the only two conditions in which | ||
2779 | the driver performs a reset is during firmware load | ||
2780 | and powering down the chip, I am taking out the | ||
2781 | reset. We know that the chip is being reset | ||
2782 | when the cx88 comes online, and not being able to | ||
2783 | do power management for this board is worse than | ||
2784 | not having any tuning at all. */ | ||
2697 | return 0; | 2785 | return 0; |
2698 | } else { | 2786 | } else { |
2699 | err_printk(core, "xc5000: unknown tuner " | 2787 | err_printk(core, "xc5000: unknown tuner " |
@@ -2825,6 +2913,16 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core) | |||
2825 | cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */ | 2913 | cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */ |
2826 | udelay(1000); | 2914 | udelay(1000); |
2827 | break; | 2915 | break; |
2916 | |||
2917 | case CX88_BOARD_WINFAST_DTV1800H: | ||
2918 | /* GPIO 12 (xc3028 tuner reset) */ | ||
2919 | cx_set(MO_GP1_IO, 0x1010); | ||
2920 | mdelay(50); | ||
2921 | cx_clear(MO_GP1_IO, 0x10); | ||
2922 | mdelay(50); | ||
2923 | cx_set(MO_GP1_IO, 0x10); | ||
2924 | mdelay(50); | ||
2925 | break; | ||
2828 | } | 2926 | } |
2829 | } | 2927 | } |
2830 | 2928 | ||
@@ -2845,6 +2943,7 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) | |||
2845 | core->i2c_algo.udelay = 16; | 2943 | core->i2c_algo.udelay = 16; |
2846 | break; | 2944 | break; |
2847 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: | 2945 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: |
2946 | case CX88_BOARD_WINFAST_DTV1800H: | ||
2848 | ctl->demod = XC3028_FE_ZARLINK456; | 2947 | ctl->demod = XC3028_FE_ZARLINK456; |
2849 | break; | 2948 | break; |
2850 | case CX88_BOARD_KWORLD_ATSC_120: | 2949 | case CX88_BOARD_KWORLD_ATSC_120: |
@@ -2907,6 +3006,7 @@ static void cx88_card_setup(struct cx88_core *core) | |||
2907 | case CX88_BOARD_HAUPPAUGE_HVR1300: | 3006 | case CX88_BOARD_HAUPPAUGE_HVR1300: |
2908 | case CX88_BOARD_HAUPPAUGE_HVR4000: | 3007 | case CX88_BOARD_HAUPPAUGE_HVR4000: |
2909 | case CX88_BOARD_HAUPPAUGE_HVR4000LITE: | 3008 | case CX88_BOARD_HAUPPAUGE_HVR4000LITE: |
3009 | case CX88_BOARD_HAUPPAUGE_IRONLY: | ||
2910 | if (0 == core->i2c_rc) | 3010 | if (0 == core->i2c_rc) |
2911 | hauppauge_eeprom(core, eeprom); | 3011 | hauppauge_eeprom(core, eeprom); |
2912 | break; | 3012 | break; |