2007-03-11 20:44:05 -03:00
/*
* Driver for the Conexant CX23885 PCIe bridge
*
2008-09-03 17:12:12 -03:00
* Copyright ( c ) 2006 Steven Toth < stoth @ linuxtv . org >
2007-03-11 20:44:05 -03:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
*
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <linux/init.h>
# include <linux/module.h>
# include <linux/pci.h>
# include <linux/delay.h>
2008-01-10 03:40:49 -03:00
# include <media/cx25840.h>
2007-03-11 20:44:05 -03:00
# include "cx23885.h"
2008-08-04 21:38:46 -03:00
# include "tuner-xc2028.h"
2009-03-03 12:06:09 -03:00
# include "netup-init.h"
2007-03-11 20:44:05 -03:00
/* ------------------------------------------------------------------ */
/* board config info */
struct cx23885_board cx23885_boards [ ] = {
[ CX23885_BOARD_UNKNOWN ] = {
. name = " UNKNOWN/GENERIC " ,
2008-01-10 02:24:27 -03:00
/* Ensure safe default for unknown boards */
. clk_freq = 0 ,
2007-03-11 20:44:05 -03:00
. input = { {
. type = CX23885_VMUX_COMPOSITE1 ,
. vmux = 0 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_COMPOSITE2 ,
. vmux = 1 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_COMPOSITE3 ,
. vmux = 2 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_COMPOSITE4 ,
. vmux = 3 ,
2008-10-16 20:18:44 -03:00
} } ,
2007-03-11 20:44:05 -03:00
} ,
[ CX23885_BOARD_HAUPPAUGE_HVR1800lp ] = {
. name = " Hauppauge WinTV-HVR1800lp " ,
. portc = CX23885_MPEG_DVB ,
. input = { {
. type = CX23885_VMUX_TELEVISION ,
. vmux = 0 ,
. gpio0 = 0xff00 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_DEBUG ,
. vmux = 0 ,
. gpio0 = 0xff01 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_COMPOSITE1 ,
. vmux = 1 ,
. gpio0 = 0xff02 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_SVIDEO ,
. vmux = 2 ,
. gpio0 = 0xff02 ,
2008-10-16 20:18:44 -03:00
} } ,
2007-03-11 20:44:05 -03:00
} ,
[ CX23885_BOARD_HAUPPAUGE_HVR1800 ] = {
. name = " Hauppauge WinTV-HVR1800 " ,
2008-01-10 03:40:49 -03:00
. porta = CX23885_ANALOG_VIDEO ,
2008-01-13 23:44:47 -03:00
. portb = CX23885_MPEG_ENCODER ,
2007-03-11 20:44:05 -03:00
. portc = CX23885_MPEG_DVB ,
2008-01-10 03:40:49 -03:00
. tuner_type = TUNER_PHILIPS_TDA8290 ,
. tuner_addr = 0x42 , /* 0x84 >> 1 */
2007-03-11 20:44:05 -03:00
. input = { {
. type = CX23885_VMUX_TELEVISION ,
2008-01-10 03:40:49 -03:00
. vmux = CX25840_VIN7_CH3 |
CX25840_VIN5_CH2 |
CX25840_VIN2_CH1 ,
. gpio0 = 0 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_COMPOSITE1 ,
2008-01-10 03:40:49 -03:00
. vmux = CX25840_VIN7_CH3 |
CX25840_VIN4_CH2 |
CX25840_VIN6_CH1 ,
. gpio0 = 0 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. type = CX23885_VMUX_SVIDEO ,
2008-01-10 03:40:49 -03:00
. vmux = CX25840_VIN7_CH3 |
CX25840_VIN4_CH2 |
CX25840_VIN8_CH1 |
CX25840_SVIDEO_ON ,
. gpio0 = 0 ,
2008-10-16 20:18:44 -03:00
} } ,
2007-03-11 20:44:05 -03:00
} ,
2007-08-22 21:01:20 -03:00
[ CX23885_BOARD_HAUPPAUGE_HVR1250 ] = {
. name = " Hauppauge WinTV-HVR1250 " ,
. portc = CX23885_MPEG_DVB ,
. input = { {
. type = CX23885_VMUX_TELEVISION ,
. vmux = 0 ,
. gpio0 = 0xff00 ,
2008-10-16 20:18:44 -03:00
} , {
2007-08-22 21:01:20 -03:00
. type = CX23885_VMUX_DEBUG ,
. vmux = 0 ,
. gpio0 = 0xff01 ,
2008-10-16 20:18:44 -03:00
} , {
2007-08-22 21:01:20 -03:00
. type = CX23885_VMUX_COMPOSITE1 ,
. vmux = 1 ,
. gpio0 = 0xff02 ,
2008-10-16 20:18:44 -03:00
} , {
2007-08-22 21:01:20 -03:00
. type = CX23885_VMUX_SVIDEO ,
. vmux = 2 ,
. gpio0 = 0xff02 ,
2008-10-16 20:18:44 -03:00
} } ,
2007-08-22 21:01:20 -03:00
} ,
2007-09-08 15:17:13 -03:00
[ CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP ] = {
. name = " DViCO FusionHDTV5 Express " ,
2007-09-08 21:31:56 -03:00
. portb = CX23885_MPEG_DVB ,
2007-09-08 15:17:13 -03:00
} ,
2007-12-18 01:57:06 -03:00
[ CX23885_BOARD_HAUPPAUGE_HVR1500Q ] = {
. name = " Hauppauge WinTV-HVR1500Q " ,
. portc = CX23885_MPEG_DVB ,
} ,
2007-12-18 01:09:11 -03:00
[ CX23885_BOARD_HAUPPAUGE_HVR1500 ] = {
. name = " Hauppauge WinTV-HVR1500 " ,
. portc = CX23885_MPEG_DVB ,
} ,
2008-04-19 01:14:19 -03:00
[ CX23885_BOARD_HAUPPAUGE_HVR1200 ] = {
. name = " Hauppauge WinTV-HVR1200 " ,
. portc = CX23885_MPEG_DVB ,
} ,
2008-04-19 01:25:52 -03:00
[ CX23885_BOARD_HAUPPAUGE_HVR1700 ] = {
. name = " Hauppauge WinTV-HVR1700 " ,
. portc = CX23885_MPEG_DVB ,
} ,
2008-04-22 15:38:26 -03:00
[ CX23885_BOARD_HAUPPAUGE_HVR1400 ] = {
. name = " Hauppauge WinTV-HVR1400 " ,
. portc = CX23885_MPEG_DVB ,
} ,
2008-05-07 01:43:10 -03:00
[ CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP ] = {
. name = " DViCO FusionHDTV7 Dual Express " ,
2008-06-30 20:58:38 -03:00
. portb = CX23885_MPEG_DVB ,
2008-05-07 01:43:10 -03:00
. portc = CX23885_MPEG_DVB ,
} ,
2008-08-04 21:39:53 -03:00
[ CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP ] = {
. name = " DViCO FusionHDTV DVB-T Dual Express " ,
. portb = CX23885_MPEG_DVB ,
. portc = CX23885_MPEG_DVB ,
} ,
2008-08-12 13:30:03 -03:00
[ CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H ] = {
. name = " Leadtek Winfast PxDVR3200 H " ,
. portc = CX23885_MPEG_DVB ,
} ,
2008-11-23 14:11:16 -03:00
[ CX23885_BOARD_COMPRO_VIDEOMATE_E650F ] = {
. name = " Compro VideoMate E650F " ,
. portc = CX23885_MPEG_DVB ,
} ,
2009-01-17 12:11:20 -03:00
[ CX23885_BOARD_TBS_6920 ] = {
. name = " TurboSight TBS 6920 " ,
. portb = CX23885_MPEG_DVB ,
} ,
2009-01-17 12:18:26 -03:00
[ CX23885_BOARD_TEVII_S470 ] = {
. name = " TeVii S470 " ,
. portb = CX23885_MPEG_DVB ,
} ,
2009-01-17 12:23:31 -03:00
[ CX23885_BOARD_DVBWORLD_2005 ] = {
. name = " DVBWorld DVB-S2 2005 " ,
. portb = CX23885_MPEG_DVB ,
} ,
2009-03-03 12:06:09 -03:00
[ CX23885_BOARD_NETUP_DUAL_DVBS2_CI ] = {
. cimax = 1 ,
. name = " NetUP Dual DVB-S2 CI " ,
. portb = CX23885_MPEG_DVB ,
. portc = CX23885_MPEG_DVB ,
} ,
2007-03-11 20:44:05 -03:00
} ;
const unsigned int cx23885_bcount = ARRAY_SIZE ( cx23885_boards ) ;
/* ------------------------------------------------------------------ */
/* PCI subsystem IDs */
struct cx23885_subid cx23885_subids [ ] = {
{
. subvendor = 0x0070 ,
. subdevice = 0x3400 ,
. card = CX23885_BOARD_UNKNOWN ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7600 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1800lp ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7800 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1800 ,
2008-10-16 20:18:44 -03:00
} , {
2007-03-11 20:44:05 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7801 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1800 ,
2008-10-16 20:18:44 -03:00
} , {
2007-12-27 21:46:34 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7809 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1800 ,
2008-10-16 20:18:44 -03:00
} , {
2007-08-22 21:01:20 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7911 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1250 ,
2008-10-16 20:18:44 -03:00
} , {
2007-09-08 15:17:13 -03:00
. subvendor = 0x18ac ,
. subdevice = 0xd500 ,
. card = CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP ,
2008-10-16 20:18:44 -03:00
} , {
2007-12-27 22:19:31 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7790 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1500Q ,
2008-10-16 20:18:44 -03:00
} , {
2007-12-18 01:57:06 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7797 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1500Q ,
2008-10-16 20:18:44 -03:00
} , {
2007-12-27 22:19:31 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7710 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1500 ,
2008-10-16 20:18:44 -03:00
} , {
2007-12-18 01:09:11 -03:00
. subvendor = 0x0070 ,
. subdevice = 0x7717 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1500 ,
2008-04-19 01:14:19 -03:00
} , {
. subvendor = 0x0070 ,
. subdevice = 0x71d1 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1200 ,
2008-05-02 16:12:44 -03:00
} , {
. subvendor = 0x0070 ,
. subdevice = 0x71d3 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1200 ,
2008-04-19 01:25:52 -03:00
} , {
. subvendor = 0x0070 ,
. subdevice = 0x8101 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1700 ,
2008-04-22 15:38:26 -03:00
} , {
. subvendor = 0x0070 ,
. subdevice = 0x8010 ,
. card = CX23885_BOARD_HAUPPAUGE_HVR1400 ,
2008-10-16 20:18:44 -03:00
} , {
2008-05-07 01:43:10 -03:00
. subvendor = 0x18ac ,
. subdevice = 0xd618 ,
. card = CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP ,
2008-10-16 20:18:44 -03:00
} , {
2008-08-04 21:39:53 -03:00
. subvendor = 0x18ac ,
. subdevice = 0xdb78 ,
. card = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP ,
2008-08-12 13:30:03 -03:00
} , {
. subvendor = 0x107d ,
. subdevice = 0x6681 ,
. card = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H ,
2008-11-23 14:11:16 -03:00
} , {
. subvendor = 0x185b ,
. subdevice = 0xe800 ,
. card = CX23885_BOARD_COMPRO_VIDEOMATE_E650F ,
2009-01-17 12:11:20 -03:00
} , {
. subvendor = 0x6920 ,
. subdevice = 0x8888 ,
. card = CX23885_BOARD_TBS_6920 ,
2009-01-17 12:18:26 -03:00
} , {
. subvendor = 0xd470 ,
. subdevice = 0x9022 ,
. card = CX23885_BOARD_TEVII_S470 ,
2009-01-17 12:23:31 -03:00
} , {
. subvendor = 0x0001 ,
. subdevice = 0x2005 ,
. card = CX23885_BOARD_DVBWORLD_2005 ,
2009-03-03 12:06:09 -03:00
} , {
. subvendor = 0x1b55 ,
. subdevice = 0x2a2c ,
. card = CX23885_BOARD_NETUP_DUAL_DVBS2_CI ,
2007-03-11 20:44:05 -03:00
} ,
} ;
const unsigned int cx23885_idcount = ARRAY_SIZE ( cx23885_subids ) ;
void cx23885_card_list ( struct cx23885_dev * dev )
{
int i ;
if ( 0 = = dev - > pci - > subsystem_vendor & &
0 = = dev - > pci - > subsystem_device ) {
2008-10-16 20:18:44 -03:00
printk ( KERN_INFO
" %s: Board has no valid PCIe Subsystem ID and can't \n "
" %s: be autodetected. Pass card=<n> insmod option \n "
" %s: to workaround that. Redirect complaints to the \n "
" %s: vendor of the TV card. Best regards, \n "
2007-03-11 20:44:05 -03:00
" %s: -- tux \n " ,
dev - > name , dev - > name , dev - > name , dev - > name , dev - > name ) ;
} else {
2008-10-16 20:18:44 -03:00
printk ( KERN_INFO
" %s: Your board isn't known (yet) to the driver. \n "
" %s: Try to pick one of the existing card configs via \n "
2007-03-11 20:44:05 -03:00
" %s: card=<n> insmod option. Updating to the latest \n "
" %s: version might help as well. \n " ,
dev - > name , dev - > name , dev - > name , dev - > name ) ;
}
2008-10-16 20:18:44 -03:00
printk ( KERN_INFO " %s: Here is a list of valid choices for the card=<n> insmod option: \n " ,
2007-03-11 20:44:05 -03:00
dev - > name ) ;
for ( i = 0 ; i < cx23885_bcount ; i + + )
2008-10-16 20:18:44 -03:00
printk ( KERN_INFO " %s: card=%d -> %s \n " ,
2007-03-11 20:44:05 -03:00
dev - > name , i , cx23885_boards [ i ] . name ) ;
}
static void hauppauge_eeprom ( struct cx23885_dev * dev , u8 * eeprom_data )
{
struct tveeprom tv ;
2008-10-16 20:18:44 -03:00
tveeprom_hauppauge_analog ( & dev - > i2c_bus [ 0 ] . i2c_client , & tv ,
eeprom_data ) ;
2007-03-11 20:44:05 -03:00
/* Make sure we support the board model */
2008-10-16 20:18:44 -03:00
switch ( tv . model ) {
2008-05-02 16:14:33 -03:00
case 71009 :
/* WinTV-HVR1200 (PCIe, Retail, full height)
* DVB - T and basic analog */
case 71359 :
/* WinTV-HVR1200 (PCIe, OEM, half height)
* DVB - T and basic analog */
case 71439 :
/* WinTV-HVR1200 (PCIe, OEM, half height)
* DVB - T and basic analog */
case 71449 :
/* WinTV-HVR1200 (PCIe, OEM, full height)
* DVB - T and basic analog */
case 71939 :
/* WinTV-HVR1200 (PCIe, OEM, half height)
* DVB - T and basic analog */
case 71949 :
/* WinTV-HVR1200 (PCIe, OEM, full height)
* DVB - T and basic analog */
case 71959 :
/* WinTV-HVR1200 (PCIe, OEM, full height)
* DVB - T and basic analog */
case 71979 :
/* WinTV-HVR1200 (PCIe, OEM, half height)
* DVB - T and basic analog */
case 71999 :
/* WinTV-HVR1200 (PCIe, OEM, full height)
* DVB - T and basic analog */
2008-10-16 20:18:44 -03:00
case 76601 :
/* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual
channel ATSC and MPEG2 HW Encoder */
case 77001 :
/* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC
and Basic analog */
case 77011 :
/* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC
and Basic analog */
case 77041 :
/* WinTV-HVR1500Q (Express Card, OEM, No IR, ATSC/QAM
and Basic analog */
case 77051 :
/* WinTV-HVR1500Q (Express Card, Retail, No IR, ATSC/QAM
and Basic analog */
case 78011 :
/* WinTV-HVR1800 (PCIe, Retail, 3.5mm in, IR, No FM,
Dual channel ATSC and MPEG2 HW Encoder */
case 78501 :
/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
Dual channel ATSC and MPEG2 HW Encoder */
case 78521 :
/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
Dual channel ATSC and MPEG2 HW Encoder */
case 78531 :
/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, No FM,
Dual channel ATSC and MPEG2 HW Encoder */
case 78631 :
/* WinTV-HVR1800 (PCIe, OEM, No IR, No FM,
Dual channel ATSC and MPEG2 HW Encoder */
case 79001 :
/* WinTV-HVR1250 (PCIe, Retail, IR, full height,
ATSC and Basic analog */
case 79101 :
/* WinTV-HVR1250 (PCIe, Retail, IR, half height,
ATSC and Basic analog */
case 79561 :
/* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
ATSC and Basic analog */
case 79571 :
/* WinTV-HVR1250 (PCIe, OEM, No IR, full height,
ATSC and Basic analog */
case 79671 :
/* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
ATSC and Basic analog */
2008-04-22 15:38:26 -03:00
case 80019 :
/* WinTV-HVR1400 (Express Card, Retail, IR,
* DVB - T and Basic analog */
2008-05-02 16:14:33 -03:00
case 81509 :
/* WinTV-HVR1700 (PCIe, OEM, No IR, half height)
* DVB - T and MPEG2 HW Encoder */
2008-04-19 01:25:52 -03:00
case 81519 :
2008-05-02 16:14:33 -03:00
/* WinTV-HVR1700 (PCIe, OEM, No IR, full height)
2008-04-19 01:25:52 -03:00
* DVB - T and MPEG2 HW Encoder */
2007-03-11 20:44:05 -03:00
break ;
default :
2008-10-16 20:18:44 -03:00
printk ( KERN_WARNING " %s: warning: unknown hauppauge model #%d \n " ,
dev - > name , tv . model ) ;
2007-03-11 20:44:05 -03:00
break ;
}
printk ( KERN_INFO " %s: hauppauge eeprom: model=%d \n " ,
dev - > name , tv . model ) ;
}
2008-09-12 13:31:45 -03:00
int cx23885_tuner_callback ( void * priv , int component , int command , int arg )
2008-01-05 16:55:45 -03:00
{
2008-08-04 22:18:19 -03:00
struct cx23885_tsport * port = priv ;
struct cx23885_dev * dev = port - > dev ;
2008-06-30 22:17:05 -03:00
u32 bitmask = 0 ;
2008-08-04 22:18:19 -03:00
if ( command = = XC2028_RESET_CLK )
return 0 ;
2008-06-30 22:17:05 -03:00
if ( command ! = 0 ) {
printk ( KERN_ERR " %s(): Unknown command 0x%x. \n " ,
__func__ , command ) ;
return - EINVAL ;
}
2008-01-05 16:55:45 -03:00
2008-10-16 20:18:44 -03:00
switch ( dev - > board ) {
2008-08-04 21:38:46 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
2008-01-05 16:55:45 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
2008-08-12 13:30:03 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H :
2008-11-23 14:11:16 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F :
2008-08-04 21:38:46 -03:00
/* Tuner Reset Command */
2008-08-12 13:30:03 -03:00
bitmask = 0x04 ;
2008-06-30 22:17:05 -03:00
break ;
case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP :
2008-08-04 21:39:53 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP :
2008-08-12 13:30:03 -03:00
/* Two identical tuners on two different i2c buses,
* we need to reset the correct gpio . */
if ( port - > nr = = 0 )
bitmask = 0x01 ;
else if ( port - > nr = = 1 )
bitmask = 0x04 ;
2008-01-05 16:55:45 -03:00
break ;
}
2008-06-30 22:17:05 -03:00
if ( bitmask ) {
/* Drive the tuner into reset and back out */
cx_clear ( GP0_IO , bitmask ) ;
mdelay ( 200 ) ;
cx_set ( GP0_IO , bitmask ) ;
}
return 0 ;
2008-01-05 16:55:45 -03:00
}
2008-01-05 17:08:05 -03:00
2007-09-08 21:31:56 -03:00
void cx23885_gpio_setup ( struct cx23885_dev * dev )
{
2008-10-16 20:18:44 -03:00
switch ( dev - > board ) {
2007-09-08 21:31:56 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
/* GPIO-0 cx24227 demodulator reset */
cx_set ( GP0_IO , 0x00010001 ) ; /* Bring the part out of reset */
break ;
2007-12-18 01:09:11 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
/* GPIO-0 cx24227 demodulator */
/* GPIO-2 xc3028 tuner */
/* Put the parts into reset */
cx_set ( GP0_IO , 0x00050000 ) ;
cx_clear ( GP0_IO , 0x00000005 ) ;
msleep ( 5 ) ;
/* Bring the parts out of reset */
cx_set ( GP0_IO , 0x00050005 ) ;
break ;
2007-12-18 01:57:06 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
/* GPIO-0 cx24227 demodulator reset */
/* GPIO-2 xc5000 tuner reset */
cx_set ( GP0_IO , 0x00050005 ) ; /* Bring the part out of reset */
break ;
2007-09-08 21:31:56 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
/* GPIO-0 656_CLK */
/* GPIO-1 656_D0 */
/* GPIO-2 8295A Reset */
/* GPIO-3-10 cx23417 data0-7 */
/* GPIO-11-14 cx23417 addr0-3 */
/* GPIO-15-18 cx23417 READY, CS, RD, WR */
/* GPIO-19 IR_RX */
2007-12-07 01:40:36 -03:00
2008-01-13 23:44:47 -03:00
/* CX23417 GPIO's */
/* EIO15 Zilog Reset */
/* EIO14 S5H1409/CX24227 Reset */
2008-01-10 02:09:27 -03:00
/* Force the TDA8295A into reset and back */
cx_set ( GP0_IO , 0x00040004 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x00000004 ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x00040004 ) ;
mdelay ( 20 ) ;
2007-09-08 21:31:56 -03:00
break ;
2008-04-19 01:14:19 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1200 :
/* GPIO-0 tda10048 demodulator reset */
/* GPIO-2 tda18271 tuner reset */
2008-04-19 01:25:52 -03:00
/* Put the parts into reset and back */
cx_set ( GP0_IO , 0x00050000 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x00000005 ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x00050005 ) ;
break ;
case CX23885_BOARD_HAUPPAUGE_HVR1700 :
/* GPIO-0 TDA10048 demodulator reset */
/* GPIO-2 TDA8295A Reset */
/* GPIO-3-10 cx23417 data0-7 */
/* GPIO-11-14 cx23417 addr0-3 */
/* GPIO-15-18 cx23417 READY, CS, RD, WR */
/* The following GPIO's are on the interna AVCore (cx25840) */
/* GPIO-19 IR_RX */
/* GPIO-20 IR_TX 416/DVBT Select */
/* GPIO-21 IIS DAT */
/* GPIO-22 IIS WCLK */
/* GPIO-23 IIS BCLK */
2008-04-22 15:38:26 -03:00
/* Put the parts into reset and back */
cx_set ( GP0_IO , 0x00050000 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x00000005 ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x00050005 ) ;
break ;
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
/* GPIO-0 Dibcom7000p demodulator reset */
/* GPIO-2 xc3028L tuner reset */
/* GPIO-13 LED */
2008-04-19 01:14:19 -03:00
/* Put the parts into reset and back */
cx_set ( GP0_IO , 0x00050000 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x00000005 ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x00050005 ) ;
break ;
2008-06-30 21:23:50 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP :
/* GPIO-0 xc5000 tuner reset i2c bus 0 */
/* GPIO-1 s5h1409 demod reset i2c bus 0 */
/* GPIO-2 xc5000 tuner reset i2c bus 1 */
/* GPIO-3 s5h1409 demod reset i2c bus 0 */
2008-08-04 21:39:53 -03:00
/* Put the parts into reset and back */
cx_set ( GP0_IO , 0x000f0000 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x0000000f ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x000f000f ) ;
break ;
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP :
/* GPIO-0 portb xc3028 reset */
/* GPIO-1 portb zl10353 reset */
/* GPIO-2 portc xc3028 reset */
/* GPIO-3 portc zl10353 reset */
2008-06-30 21:23:50 -03:00
/* Put the parts into reset and back */
cx_set ( GP0_IO , 0x000f0000 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x0000000f ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x000f000f ) ;
break ;
2008-08-12 13:30:03 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H :
2008-11-23 14:11:16 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F :
2008-08-12 13:30:03 -03:00
/* GPIO-2 xc3028 tuner reset */
/* The following GPIO's are on the internal AVCore (cx25840) */
/* GPIO-? zl10353 demod reset */
/* Put the parts into reset and back */
cx_set ( GP0_IO , 0x00040000 ) ;
mdelay ( 20 ) ;
cx_clear ( GP0_IO , 0x00000004 ) ;
mdelay ( 20 ) ;
cx_set ( GP0_IO , 0x00040004 ) ;
break ;
2009-01-17 12:11:20 -03:00
case CX23885_BOARD_TBS_6920 :
2009-01-17 12:18:26 -03:00
case CX23885_BOARD_TEVII_S470 :
2009-01-17 12:11:20 -03:00
cx_write ( MC417_CTL , 0x00000036 ) ;
cx_write ( MC417_OEN , 0x00001000 ) ;
cx_write ( MC417_RWD , 0x00001800 ) ;
break ;
2009-03-03 12:06:09 -03:00
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
/* GPIO-0 INTA from CiMax1
GPIO - 1 INTB from CiMax2
GPIO - 2 reset chips
GPIO - 3 to GPIO - 10 data / addr for CA
GPIO - 11 ~ CS0 to CiMax1
GPIO - 12 ~ CS1 to CiMax2
GPIO - 13 ADL0 load LSB addr
GPIO - 14 ADL1 load MSB addr
GPIO - 15 ~ RDY from CiMax
GPIO - 17 ~ RD to CiMax
GPIO - 18 ~ WR to CiMax
*/
cx_set ( GP0_IO , 0x00040000 ) ; /* GPIO as out */
/* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */
cx_clear ( GP0_IO , 0x00030004 ) ;
mdelay ( 100 ) ; /* reset delay */
cx_set ( GP0_IO , 0x00040004 ) ; /* GPIO as out, reset high */
cx_write ( MC417_CTL , 0x00000037 ) ; /* enable GPIO3-18 pins */
/* GPIO-15 IN as ~ACK, rest as OUT */
cx_write ( MC417_OEN , 0x00001000 ) ;
/* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
cx_write ( MC417_RWD , 0x0000c300 ) ;
/* enable irq */
cx_write ( GPIO_ISM , 0x00000000 ) ; /* INTERRUPTS active low*/
break ;
2007-09-08 21:31:56 -03:00
}
}
int cx23885_ir_init ( struct cx23885_dev * dev )
{
switch ( dev - > board ) {
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
2007-12-18 01:09:11 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
2007-12-18 01:57:06 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
2007-09-08 21:31:56 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
2008-04-19 01:14:19 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1200 :
2008-04-22 15:38:26 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
2007-09-08 21:31:56 -03:00
/* FIXME: Implement me */
break ;
2008-08-04 21:41:06 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP :
request_module ( " ir-kbd-i2c " ) ;
break ;
2007-09-08 21:31:56 -03:00
}
return 0 ;
}
2007-03-11 20:44:05 -03:00
void cx23885_card_setup ( struct cx23885_dev * dev )
{
2007-09-08 21:31:56 -03:00
struct cx23885_tsport * ts1 = & dev - > ts1 ;
struct cx23885_tsport * ts2 = & dev - > ts2 ;
2007-03-11 20:44:05 -03:00
static u8 eeprom [ 256 ] ;
if ( dev - > i2c_bus [ 0 ] . i2c_rc = = 0 ) {
dev - > i2c_bus [ 0 ] . i2c_client . addr = 0xa0 > > 1 ;
2007-03-20 23:00:18 -03:00
tveeprom_read ( & dev - > i2c_bus [ 0 ] . i2c_client ,
eeprom , sizeof ( eeprom ) ) ;
2007-03-11 20:44:05 -03:00
}
switch ( dev - > board ) {
2007-08-22 21:01:20 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
2007-12-18 01:09:11 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
2007-12-18 01:57:06 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
2008-04-22 15:38:26 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
2008-03-29 17:36:09 -03:00
if ( dev - > i2c_bus [ 0 ] . i2c_rc = = 0 )
hauppauge_eeprom ( dev , eeprom + 0x80 ) ;
break ;
2007-03-11 20:44:05 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
case CX23885_BOARD_HAUPPAUGE_HVR1800lp :
2008-04-19 01:14:19 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1200 :
2008-04-19 01:25:52 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1700 :
2007-03-11 20:44:05 -03:00
if ( dev - > i2c_bus [ 0 ] . i2c_rc = = 0 )
2008-03-29 17:36:09 -03:00
hauppauge_eeprom ( dev , eeprom + 0xc0 ) ;
2007-03-11 20:44:05 -03:00
break ;
}
2007-09-08 21:31:56 -03:00
switch ( dev - > board ) {
2008-05-07 01:43:10 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP :
2008-08-04 21:39:53 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP :
2008-05-07 01:43:10 -03:00
ts2 - > gen_ctrl_val = 0xc ; /* Serial bus + punctured clock */
ts2 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts2 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
/* break omitted intentionally */
2007-09-08 21:31:56 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP :
ts1 - > gen_ctrl_val = 0xc ; /* Serial bus + punctured clock */
ts1 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts1 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
break ;
2008-01-13 23:44:47 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
/* Defaults for VID B - Analog encoder */
/* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
ts1 - > gen_ctrl_val = 0x10e ;
ts1 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts1 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
/* APB_TSVALERR_POL (active low)*/
ts1 - > vld_misc_val = 0x2000 ;
ts1 - > hw_sop_ctrl_val = ( 0x47 < < 16 | 188 < < 4 | 0xc ) ;
/* Defaults for VID C */
ts2 - > gen_ctrl_val = 0xc ; /* Serial bus + punctured clock */
ts2 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts2 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
2009-01-17 12:11:20 -03:00
break ;
2009-01-17 12:18:26 -03:00
case CX23885_BOARD_TEVII_S470 :
2009-01-17 12:11:20 -03:00
case CX23885_BOARD_TBS_6920 :
2009-01-17 12:23:31 -03:00
case CX23885_BOARD_DVBWORLD_2005 :
2009-01-17 12:11:20 -03:00
ts1 - > gen_ctrl_val = 0x5 ; /* Parallel */
ts1 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts1 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
2008-01-13 23:44:47 -03:00
break ;
2009-03-03 12:06:09 -03:00
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
ts1 - > gen_ctrl_val = 0xc ; /* Serial bus + punctured clock */
ts1 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts1 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
ts2 - > gen_ctrl_val = 0xc ; /* Serial bus + punctured clock */
ts2 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts2 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
break ;
2007-09-08 21:31:56 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
2007-12-18 01:09:11 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
2007-12-18 01:57:06 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
2007-09-08 21:31:56 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800lp :
2008-04-19 01:14:19 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1200 :
2008-04-19 01:25:52 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1700 :
2008-04-22 15:38:26 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
2008-08-12 13:30:03 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H :
2008-11-23 14:11:16 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F :
2007-09-08 21:31:56 -03:00
default :
ts2 - > gen_ctrl_val = 0xc ; /* Serial bus + punctured clock */
ts2 - > ts_clk_en_val = 0x1 ; /* Enable TS_CLK */
ts2 - > src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO ;
}
2008-04-19 01:36:06 -03:00
/* Certain boards support analog, or require the avcore to be
* loaded , ensure this happens .
*/
switch ( dev - > board ) {
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
case CX23885_BOARD_HAUPPAUGE_HVR1800lp :
case CX23885_BOARD_HAUPPAUGE_HVR1700 :
2008-08-12 13:30:03 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H :
2008-11-23 14:11:16 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F :
2009-03-03 12:06:09 -03:00
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
2008-04-19 01:36:06 -03:00
request_module ( " cx25840 " ) ;
break ;
}
2009-03-03 12:06:09 -03:00
/* AUX-PLL 27MHz CLK */
switch ( dev - > board ) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
netup_initialize ( dev ) ;
break ;
}
2007-03-11 20:44:05 -03:00
}
/* ------------------------------------------------------------------ */