2007-03-11 20:44:05 -03:00
/*
* Driver for the Conexant CX23885 PCIe bridge
*
* Copyright ( c ) 2006 Steven Toth < stoth @ hauppauge . com >
*
* 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/module.h>
# include <linux/init.h>
# include <linux/device.h>
# include <linux/fs.h>
# include <linux/kthread.h>
# include <linux/file.h>
# include <linux/suspend.h>
# include "cx23885.h"
# include <media/v4l2-common.h>
# include "s5h1409.h"
# include "mt2131.h"
2007-09-04 21:32:41 -03:00
static unsigned int debug = 0 ;
2007-03-11 20:44:05 -03:00
# define dprintk(level,fmt, arg...) if (debug >= level) \
printk ( KERN_DEBUG " %s: " fmt , dev - > name , # # arg )
/* ------------------------------------------------------------------ */
static int dvb_buf_setup ( struct videobuf_queue * q ,
unsigned int * count , unsigned int * size )
{
struct cx23885_tsport * port = q - > priv_data ;
port - > ts_packet_size = 188 * 4 ;
port - > ts_packet_count = 32 ;
* size = port - > ts_packet_size * port - > ts_packet_count ;
* count = 32 ;
return 0 ;
}
2007-03-20 23:00:18 -03:00
static int dvb_buf_prepare ( struct videobuf_queue * q ,
struct videobuf_buffer * vb , enum v4l2_field field )
2007-03-11 20:44:05 -03:00
{
struct cx23885_tsport * port = q - > priv_data ;
2007-03-20 23:00:18 -03:00
return cx23885_buf_prepare ( q , port , ( struct cx23885_buffer * ) vb , field ) ;
2007-03-11 20:44:05 -03:00
}
static void dvb_buf_queue ( struct videobuf_queue * q , struct videobuf_buffer * vb )
{
struct cx23885_tsport * port = q - > priv_data ;
cx23885_buf_queue ( port , ( struct cx23885_buffer * ) vb ) ;
}
2007-03-20 23:00:18 -03:00
static void dvb_buf_release ( struct videobuf_queue * q ,
struct videobuf_buffer * vb )
2007-03-11 20:44:05 -03:00
{
cx23885_free_buffer ( q , ( struct cx23885_buffer * ) vb ) ;
}
static struct videobuf_queue_ops dvb_qops = {
. buf_setup = dvb_buf_setup ,
. buf_prepare = dvb_buf_prepare ,
. buf_queue = dvb_buf_queue ,
. buf_release = dvb_buf_release ,
} ;
2007-09-04 21:40:47 -03:00
static struct s5h1409_config hauppauge_generic_config = {
2007-03-11 20:44:05 -03:00
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
. if_freq = 44000 ,
2007-03-20 15:27:53 -03:00
. inversion = S5H1409_INVERSION_OFF ,
. status_mode = S5H1409_DEMODLOCKING
2007-03-11 20:44:05 -03:00
} ;
2007-09-04 21:40:47 -03:00
static struct mt2131_config hauppauge_generic_tunerconfig = {
2007-08-22 21:01:20 -03:00
0x61
} ;
2007-03-11 20:44:05 -03:00
static int dvb_register ( struct cx23885_tsport * port )
{
struct cx23885_dev * dev = port - > dev ;
/* init struct videobuf_dvb */
port - > dvb . name = dev - > name ;
/* init frontend */
switch ( dev - > board ) {
2007-08-22 21:01:20 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
2007-03-11 20:44:05 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
2007-09-04 21:40:47 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800lp :
2007-03-11 20:44:05 -03:00
port - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-09-04 21:40:47 -03:00
& hauppauge_generic_config ,
2007-03-20 23:00:18 -03:00
& dev - > i2c_bus [ 0 ] . i2c_adap ) ;
2007-03-11 20:44:05 -03:00
if ( port - > dvb . frontend ! = NULL ) {
2007-03-20 23:00:18 -03:00
dvb_attach ( mt2131_attach , port - > dvb . frontend ,
& dev - > i2c_bus [ 0 ] . i2c_adap ,
2007-09-04 21:40:47 -03:00
& hauppauge_generic_tunerconfig , 0 ) ;
2007-03-11 20:44:05 -03:00
}
break ;
default :
printk ( " %s: The frontend of your DVB/ATSC card isn't supported yet \n " ,
dev - > name ) ;
break ;
}
if ( NULL = = port - > dvb . frontend ) {
printk ( " %s: frontend initialization failed \n " , dev - > name ) ;
return - 1 ;
}
/* Put the analog decoder in standby to keep it quiet */
cx23885_call_i2c_clients ( & dev - > i2c_bus [ 0 ] , TUNER_SET_STANDBY , NULL ) ;
/* register everything */
2007-03-20 23:00:18 -03:00
return videobuf_dvb_register ( & port - > dvb , THIS_MODULE , port ,
& dev - > pci - > dev ) ;
2007-03-11 20:44:05 -03:00
}
int cx23885_dvb_register ( struct cx23885_tsport * port )
{
struct cx23885_dev * dev = port - > dev ;
int err ;
2007-03-20 23:00:18 -03:00
dprintk ( 1 , " %s \n " , __FUNCTION__ ) ;
dprintk ( 1 , " ->being probed by Card=%d Name=%s, PCI %02x:%02x \n " ,
2007-03-11 20:44:05 -03:00
dev - > board ,
dev - > name ,
dev - > pci_bus ,
dev - > pci_slot ) ;
err = - ENODEV ;
if ( ! ( cx23885_boards [ dev - > board ] . portc & CX23885_MPEG_DVB ) )
goto fail_core ;
/* dvb stuff */
printk ( " %s: cx23885 based dvb card \n " , dev - > name ) ;
2007-03-20 23:00:18 -03:00
videobuf_queue_init ( & port - > dvb . dvbq , & dvb_qops , dev - > pci , & port - > slock ,
V4L2_BUF_TYPE_VIDEO_CAPTURE , V4L2_FIELD_TOP ,
sizeof ( struct cx23885_buffer ) , port ) ;
2007-03-11 20:44:05 -03:00
err = dvb_register ( port ) ;
if ( err ! = 0 )
printk ( " %s() dvb_register failed err = %d \n " , __FUNCTION__ , err ) ;
fail_core :
return err ;
}
int cx23885_dvb_unregister ( struct cx23885_tsport * port )
{
/* dvb */
if ( port - > dvb . frontend )
videobuf_dvb_unregister ( & port - > dvb ) ;
return 0 ;
}
2007-03-20 23:00:18 -03:00
/*
* Local variables :
* c - basic - offset : 8
* End :
* kate : eol " unix " ; indent - width 3 ; remove - trailing - space on ; replace - trailing - space - save on ; tab - width 8 ; replace - tabs off ; space - indent off ; mixed - indent off
*/