2006-09-23 20:00:41 -03:00
/* DVB USB compliant linux driver for MSI Mega Sky 580 DVB-T USB2.0 receiver
*
* Copyright ( C ) 2006 Aapo Tahkola ( aet @ rasterburn . org )
*
* This program is free software ; you can redistribute it and / or modify it
2007-03-22 19:03:37 -03:00
* under the terms of the GNU General Public License as published by the
* Free Software Foundation , version 2.
2006-09-23 20:00:41 -03:00
*
* see Documentation / dvb / README . dvb - usb for more information
*/
2006-09-23 20:01:29 -03:00
2006-09-23 20:00:42 -03:00
# include "m920x.h"
2006-09-23 20:00:41 -03:00
# include "mt352.h"
# include "mt352_priv.h"
2006-09-23 20:40:20 -03:00
# include "qt1010.h"
2007-03-18 19:54:07 -03:00
# include "tda1004x.h"
# include "tda827x.h"
2009-10-24 13:12:37 -03:00
# include <media/tuner.h>
# include "tuner-simple.h"
2008-05-21 00:32:41 -03:00
# include <asm/unaligned.h>
2006-09-23 20:00:41 -03:00
/* debug */
2006-09-28 01:46:49 -03:00
static int dvb_usb_m920x_debug ;
2006-09-23 20:01:29 -03:00
module_param_named ( debug , dvb_usb_m920x_debug , int , 0644 ) ;
2006-09-23 20:00:41 -03:00
MODULE_PARM_DESC ( debug , " set debugging level (1=rc (or-able)). " DVB_USB_DEBUG_STATUS ) ;
2008-04-09 19:13:13 -03:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2007-05-08 12:03:55 -03:00
static int m920x_set_filter ( struct dvb_usb_device * d , int type , int idx , int pid ) ;
2007-03-26 17:05:59 -03:00
static inline int m920x_read ( struct usb_device * udev , u8 request , u16 value ,
2007-01-21 15:57:48 -03:00
u16 index , void * data , int size )
2006-09-23 20:00:41 -03:00
{
int ret ;
ret = usb_control_msg ( udev , usb_rcvctrlpipe ( udev , 0 ) ,
request , USB_TYPE_VENDOR | USB_DIR_IN ,
value , index , data , size , 2000 ) ;
2007-03-15 13:24:29 -03:00
if ( ret < 0 ) {
printk ( KERN_INFO " m920x_read = error: %d \n " , ret ) ;
2006-09-23 20:00:41 -03:00
return ret ;
2007-03-15 13:24:29 -03:00
}
2006-09-23 20:00:41 -03:00
2007-03-15 13:24:29 -03:00
if ( ret ! = size ) {
2007-03-26 16:59:16 -03:00
deb ( " m920x_read = no data \n " ) ;
2006-09-23 20:00:41 -03:00
return - EIO ;
2007-03-15 13:24:29 -03:00
}
2006-09-23 20:00:41 -03:00
return 0 ;
}
2007-03-26 17:05:59 -03:00
static inline int m920x_write ( struct usb_device * udev , u8 request ,
2007-01-21 15:57:48 -03:00
u16 value , u16 index )
2006-09-23 20:00:41 -03:00
{
int ret ;
ret = usb_control_msg ( udev , usb_sndctrlpipe ( udev , 0 ) ,
request , USB_TYPE_VENDOR | USB_DIR_OUT ,
value , index , NULL , 0 , 2000 ) ;
2007-03-15 13:24:29 -03:00
2006-09-28 00:47:51 -03:00
return ret ;
}
2007-03-26 17:05:59 -03:00
static int m920x_init ( struct dvb_usb_device * d , struct m920x_inits * rc_seq )
2006-09-28 00:47:51 -03:00
{
2007-05-08 18:21:47 -03:00
int ret = 0 , i , epi , flags = 0 ;
2007-05-08 12:03:55 -03:00
int adap_enabled [ M9206_MAX_ADAPTERS ] = { 0 } ;
2006-09-28 00:47:51 -03:00
/* Remote controller init. */
2010-07-31 18:04:09 -03:00
if ( d - > props . rc . legacy . rc_query ) {
2007-03-26 16:59:16 -03:00
deb ( " Initialising remote control \n " ) ;
2007-03-22 17:09:35 -03:00
while ( rc_seq - > address ) {
2007-03-26 17:05:59 -03:00
if ( ( ret = m920x_write ( d - > udev , M9206_CORE ,
2007-03-22 19:03:37 -03:00
rc_seq - > data ,
rc_seq - > address ) ) ! = 0 ) {
2007-03-26 16:59:16 -03:00
deb ( " Initialising remote control failed \n " ) ;
2007-03-22 17:09:35 -03:00
return ret ;
}
2006-09-28 00:47:51 -03:00
2007-03-22 17:09:35 -03:00
rc_seq + + ;
}
2007-03-26 16:59:16 -03:00
deb ( " Initialising remote control success \n " ) ;
2007-03-05 18:54:27 -03:00
}
2006-09-23 20:00:41 -03:00
2007-05-08 18:21:47 -03:00
for ( i = 0 ; i < d - > props . num_adapters ; i + + )
flags | = d - > adapter [ i ] . props . caps ;
2007-05-08 12:03:55 -03:00
2007-05-08 18:21:47 -03:00
/* Some devices(Dposh) might crash if we attempt touch at all. */
if ( flags & DVB_USB_ADAP_HAS_PID_FILTER ) {
for ( i = 0 ; i < d - > props . num_adapters ; i + + ) {
epi = d - > adapter [ i ] . props . stream . endpoint - 0x81 ;
2007-05-08 12:03:55 -03:00
2007-05-08 18:21:47 -03:00
if ( epi < 0 | | epi > = M9206_MAX_ADAPTERS ) {
printk ( KERN_INFO " m920x: Unexpected adapter endpoint! \n " ) ;
return - EINVAL ;
}
adap_enabled [ epi ] = 1 ;
}
2007-05-08 12:03:55 -03:00
2007-05-08 18:21:47 -03:00
for ( i = 0 ; i < M9206_MAX_ADAPTERS ; i + + ) {
if ( adap_enabled [ i ] )
continue ;
2007-05-08 12:03:55 -03:00
2007-05-08 18:21:47 -03:00
if ( ( ret = m920x_set_filter ( d , 0x81 + i , 0 , 0x0 ) ) ! = 0 )
return ret ;
2007-05-08 12:03:55 -03:00
2007-05-08 18:21:47 -03:00
if ( ( ret = m920x_set_filter ( d , 0x81 + i , 0 , 0x02f5 ) ) ! = 0 )
return ret ;
}
2007-05-08 12:03:55 -03:00
}
2006-09-23 20:00:41 -03:00
return ret ;
}
2007-05-08 12:56:54 -03:00
static int m920x_init_ep ( struct usb_interface * intf )
{
struct usb_device * udev = interface_to_usbdev ( intf ) ;
struct usb_host_interface * alt ;
if ( ( alt = usb_altnum_to_altsetting ( intf , 1 ) ) = = NULL ) {
deb ( " No alt found! \n " ) ;
return - ENODEV ;
}
return usb_set_interface ( udev , alt - > desc . bInterfaceNumber ,
alt - > desc . bAlternateSetting ) ;
}
2007-03-26 17:05:59 -03:00
static int m920x_rc_query ( struct dvb_usb_device * d , u32 * event , int * state )
2006-09-23 20:00:41 -03:00
{
2007-03-26 17:05:59 -03:00
struct m920x_state * m = d - > priv ;
2006-09-23 20:00:41 -03:00
int i , ret = 0 ;
u8 rc_state [ 2 ] ;
2007-04-20 13:34:25 -03:00
if ( ( ret = m920x_read ( d - > udev , M9206_CORE , 0x0 , M9206_RC_STATE , rc_state , 1 ) ) ! = 0 )
2006-09-23 20:00:41 -03:00
goto unlock ;
2007-04-20 13:34:25 -03:00
if ( ( ret = m920x_read ( d - > udev , M9206_CORE , 0x0 , M9206_RC_KEY , rc_state + 1 , 1 ) ) ! = 0 )
2006-09-23 20:00:41 -03:00
goto unlock ;
2010-07-31 18:04:09 -03:00
for ( i = 0 ; i < d - > props . rc . legacy . rc_key_map_size ; i + + )
if ( rc5_data ( & d - > props . rc . legacy . rc_key_map [ i ] ) = = rc_state [ 1 ] ) {
* event = d - > props . rc . legacy . rc_key_map [ i ] . keycode ;
2006-09-23 20:00:41 -03:00
switch ( rc_state [ 0 ] ) {
case 0x80 :
* state = REMOTE_NO_KEY_PRESSED ;
goto unlock ;
2007-03-22 17:09:35 -03:00
case 0x88 : /* framing error or "invalid code" */
case 0x99 :
case 0xc0 :
case 0xd8 :
* state = REMOTE_NO_KEY_PRESSED ;
m - > rep_count = 0 ;
goto unlock ;
2006-09-23 20:00:41 -03:00
case 0x93 :
case 0x92 :
2009-10-24 13:12:37 -03:00
case 0x83 : /* pinnacle PCTV310e */
case 0x82 :
2006-09-28 00:47:51 -03:00
m - > rep_count = 0 ;
2006-09-23 20:00:41 -03:00
* state = REMOTE_KEY_PRESSED ;
goto unlock ;
case 0x91 :
2009-10-24 13:12:37 -03:00
case 0x81 : /* pinnacle PCTV310e */
2007-03-22 17:09:35 -03:00
/* prevent immediate auto-repeat */
2006-09-28 00:47:51 -03:00
if ( + + m - > rep_count > 2 )
* state = REMOTE_KEY_REPEAT ;
2007-03-22 17:09:35 -03:00
else
* state = REMOTE_NO_KEY_PRESSED ;
2006-09-23 20:00:41 -03:00
goto unlock ;
default :
2007-03-26 16:59:16 -03:00
deb ( " Unexpected rc state %02x \n " , rc_state [ 0 ] ) ;
2006-09-23 20:00:41 -03:00
* state = REMOTE_NO_KEY_PRESSED ;
goto unlock ;
}
}
if ( rc_state [ 1 ] ! = 0 )
2007-03-26 16:59:16 -03:00
deb ( " Unknown rc key %02x \n " , rc_state [ 1 ] ) ;
2006-09-23 20:00:41 -03:00
* state = REMOTE_NO_KEY_PRESSED ;
2007-03-22 19:03:37 -03:00
unlock :
2006-09-23 20:00:41 -03:00
return ret ;
}
/* I2C */
2007-04-20 13:34:25 -03:00
static int m920x_i2c_xfer ( struct i2c_adapter * adap , struct i2c_msg msg [ ] , int num )
2006-09-23 20:00:41 -03:00
{
struct dvb_usb_device * d = i2c_get_adapdata ( adap ) ;
2007-03-05 18:23:19 -03:00
int i , j ;
2006-09-23 20:00:41 -03:00
int ret = 0 ;
2007-03-05 23:55:00 -03:00
if ( ! num )
return - EINVAL ;
2006-09-23 20:00:41 -03:00
if ( mutex_lock_interruptible ( & d - > i2c_mutex ) < 0 )
return - EAGAIN ;
for ( i = 0 ; i < num ; i + + ) {
2007-04-20 13:34:25 -03:00
if ( msg [ i ] . flags & ( I2C_M_NO_RD_ACK | I2C_M_IGNORE_NAK | I2C_M_TEN ) | | msg [ i ] . len = = 0 ) {
2007-03-22 19:03:37 -03:00
/* For a 0 byte message, I think sending the address
* to index 0x80 | 0x40 would be the correct thing to
* do . However , zero byte messages are only used for
* probing , and since we don ' t know how to get the
* slave ' s ack , we can ' t probe . */
2007-03-05 23:55:00 -03:00
ret = - ENOTSUPP ;
goto unlock ;
}
/* Send START & address/RW bit */
if ( ! ( msg [ i ] . flags & I2C_M_NOSTART ) ) {
2007-03-26 17:05:59 -03:00
if ( ( ret = m920x_write ( d - > udev , M9206_I2C ,
2007-03-22 19:03:37 -03:00
( msg [ i ] . addr < < 1 ) |
2007-04-20 13:34:25 -03:00
( msg [ i ] . flags & I2C_M_RD ? 0x01 : 0 ) , 0x80 ) ) ! = 0 )
2007-01-21 15:57:20 -03:00
goto unlock ;
2007-03-05 23:55:00 -03:00
/* Should check for ack here, if we knew how. */
}
if ( msg [ i ] . flags & I2C_M_RD ) {
for ( j = 0 ; j < msg [ i ] . len ; j + + ) {
2007-03-22 19:03:37 -03:00
/* Last byte of transaction?
* Send STOP , otherwise send ACK . */
2007-04-20 13:34:25 -03:00
int stop = ( i + 1 = = num & & j + 1 = = msg [ i ] . len ) ? 0x40 : 0x01 ;
2007-03-22 19:03:37 -03:00
2007-03-26 17:05:59 -03:00
if ( ( ret = m920x_read ( d - > udev , M9206_I2C , 0x0 ,
2007-04-20 13:34:25 -03:00
0x20 | stop ,
2007-03-22 19:03:37 -03:00
& msg [ i ] . buf [ j ] , 1 ) ) ! = 0 )
2007-03-05 23:55:00 -03:00
goto unlock ;
2007-01-21 15:57:20 -03:00
}
2007-03-05 18:23:19 -03:00
} else {
2007-03-05 23:55:00 -03:00
for ( j = 0 ; j < msg [ i ] . len ; j + + ) {
/* Last byte of transaction? Then send STOP. */
2007-04-20 13:34:25 -03:00
int stop = ( i + 1 = = num & & j + 1 = = msg [ i ] . len ) ? 0x40 : 0x00 ;
2007-03-22 19:03:37 -03:00
2007-04-20 13:34:25 -03:00
if ( ( ret = m920x_write ( d - > udev , M9206_I2C , msg [ i ] . buf [ j ] , stop ) ) ! = 0 )
2007-03-05 23:55:00 -03:00
goto unlock ;
/* Should check for ack here too. */
2007-03-05 18:23:19 -03:00
}
2006-09-23 20:00:41 -03:00
}
}
2007-03-05 18:23:19 -03:00
ret = num ;
2007-03-05 23:55:00 -03:00
2007-03-22 19:03:37 -03:00
unlock :
2006-09-23 20:00:41 -03:00
mutex_unlock ( & d - > i2c_mutex ) ;
return ret ;
}
2007-03-26 17:05:59 -03:00
static u32 m920x_i2c_func ( struct i2c_adapter * adapter )
2006-09-23 20:00:41 -03:00
{
return I2C_FUNC_I2C ;
}
2007-03-26 17:05:59 -03:00
static struct i2c_algorithm m920x_i2c_algo = {
. master_xfer = m920x_i2c_xfer ,
. functionality = m920x_i2c_func ,
2006-09-23 20:00:41 -03:00
} ;
2007-03-26 16:35:29 -03:00
/* pid filter */
2007-05-08 12:03:55 -03:00
static int m920x_set_filter ( struct dvb_usb_device * d , int type , int idx , int pid )
2006-09-23 20:00:41 -03:00
{
int ret = 0 ;
if ( pid > = 0x8000 )
return - EINVAL ;
pid | = 0x8000 ;
2007-05-08 12:03:55 -03:00
if ( ( ret = m920x_write ( d - > udev , M9206_FILTER , pid , ( type < < 8 ) | ( idx * 4 ) ) ) ! = 0 )
2006-09-23 20:00:41 -03:00
return ret ;
2007-05-08 12:03:55 -03:00
if ( ( ret = m920x_write ( d - > udev , M9206_FILTER , 0 , ( type < < 8 ) | ( idx * 4 ) ) ) ! = 0 )
2006-09-23 20:00:41 -03:00
return ret ;
return ret ;
}
2007-03-26 17:05:59 -03:00
static int m920x_update_filters ( struct dvb_usb_adapter * adap )
2006-09-23 20:00:41 -03:00
{
2007-03-26 17:05:59 -03:00
struct m920x_state * m = adap - > dev - > priv ;
2007-05-08 12:03:55 -03:00
int enabled = m - > filtering_enabled [ adap - > id ] ;
2006-09-28 00:47:51 -03:00
int i , ret = 0 , filter = 0 ;
2007-05-08 12:03:55 -03:00
int ep = adap - > props . stream . endpoint ;
2006-09-23 20:00:41 -03:00
2006-09-28 00:47:51 -03:00
for ( i = 0 ; i < M9206_MAX_FILTERS ; i + + )
2007-05-08 12:03:55 -03:00
if ( m - > filters [ adap - > id ] [ i ] = = 8192 )
2006-09-28 00:47:51 -03:00
enabled = 0 ;
2006-09-23 20:00:41 -03:00
2006-09-28 00:47:51 -03:00
/* Disable all filters */
2007-05-08 12:03:55 -03:00
if ( ( ret = m920x_set_filter ( adap - > dev , ep , 1 , enabled ) ) ! = 0 )
2006-09-28 00:47:51 -03:00
return ret ;
2006-09-23 20:00:41 -03:00
2006-09-28 00:47:51 -03:00
for ( i = 0 ; i < M9206_MAX_FILTERS ; i + + )
2007-05-08 12:03:55 -03:00
if ( ( ret = m920x_set_filter ( adap - > dev , ep , i + 2 , 0 ) ) ! = 0 )
2006-09-28 00:47:51 -03:00
return ret ;
/* Set */
if ( enabled ) {
for ( i = 0 ; i < M9206_MAX_FILTERS ; i + + ) {
2007-05-08 12:03:55 -03:00
if ( m - > filters [ adap - > id ] [ i ] = = 0 )
2006-09-28 00:47:51 -03:00
continue ;
2007-05-08 12:03:55 -03:00
if ( ( ret = m920x_set_filter ( adap - > dev , ep , filter + 2 , m - > filters [ adap - > id ] [ i ] ) ) ! = 0 )
2006-09-28 00:47:51 -03:00
return ret ;
filter + + ;
}
2006-09-23 20:00:41 -03:00
}
2006-09-28 00:47:51 -03:00
2006-09-23 20:00:41 -03:00
return ret ;
}
2007-03-26 17:05:59 -03:00
static int m920x_pid_filter_ctrl ( struct dvb_usb_adapter * adap , int onoff )
2006-09-23 20:00:41 -03:00
{
2007-03-26 17:05:59 -03:00
struct m920x_state * m = adap - > dev - > priv ;
2006-09-23 20:00:41 -03:00
2007-05-08 12:03:55 -03:00
m - > filtering_enabled [ adap - > id ] = onoff ? 1 : 0 ;
2006-09-23 20:00:41 -03:00
2007-03-26 17:05:59 -03:00
return m920x_update_filters ( adap ) ;
2006-09-28 00:47:51 -03:00
}
2006-09-23 20:00:41 -03:00
2007-04-20 13:34:25 -03:00
static int m920x_pid_filter ( struct dvb_usb_adapter * adap , int index , u16 pid , int onoff )
2006-09-28 00:47:51 -03:00
{
2007-03-26 17:05:59 -03:00
struct m920x_state * m = adap - > dev - > priv ;
2006-09-23 20:00:41 -03:00
2007-05-08 12:03:55 -03:00
m - > filters [ adap - > id ] [ index ] = onoff ? pid : 0 ;
2006-09-23 20:00:41 -03:00
2007-03-26 17:05:59 -03:00
return m920x_update_filters ( adap ) ;
2006-09-23 20:00:41 -03:00
}
2007-04-20 13:34:25 -03:00
static int m920x_firmware_download ( struct usb_device * udev , const struct firmware * fw )
2006-09-23 20:00:41 -03:00
{
u16 value , index , size ;
u8 read [ 4 ] , * buff ;
int i , pass , ret = 0 ;
buff = kmalloc ( 65536 , GFP_KERNEL ) ;
2009-09-18 20:09:52 -03:00
if ( buff = = NULL )
return - ENOMEM ;
2006-09-23 20:00:41 -03:00
2007-03-26 17:05:59 -03:00
if ( ( ret = m920x_read ( udev , M9206_FILTER , 0x0 , 0x8000 , read , 4 ) ) ! = 0 )
2006-09-23 20:00:41 -03:00
goto done ;
2007-03-26 16:59:16 -03:00
deb ( " %x %x %x %x \n " , read [ 0 ] , read [ 1 ] , read [ 2 ] , read [ 3 ] ) ;
2006-09-23 20:00:41 -03:00
2007-03-26 17:05:59 -03:00
if ( ( ret = m920x_read ( udev , M9206_FW , 0x0 , 0x0 , read , 1 ) ) ! = 0 )
2006-09-23 20:00:41 -03:00
goto done ;
2007-03-26 16:59:16 -03:00
deb ( " %x \n " , read [ 0 ] ) ;
2006-09-23 20:00:41 -03:00
for ( pass = 0 ; pass < 2 ; pass + + ) {
for ( i = 0 ; i + ( sizeof ( u16 ) * 3 ) < fw - > size ; ) {
2008-05-21 00:32:41 -03:00
value = get_unaligned_le16 ( fw - > data + i ) ;
2006-09-23 20:00:41 -03:00
i + = sizeof ( u16 ) ;
2008-05-21 00:32:41 -03:00
index = get_unaligned_le16 ( fw - > data + i ) ;
2006-09-23 20:00:41 -03:00
i + = sizeof ( u16 ) ;
2008-05-21 00:32:41 -03:00
size = get_unaligned_le16 ( fw - > data + i ) ;
2006-09-23 20:00:41 -03:00
i + = sizeof ( u16 ) ;
if ( pass = = 1 ) {
/* Will stall if using fw->data ... */
memcpy ( buff , fw - > data + i , size ) ;
ret = usb_control_msg ( udev , usb_sndctrlpipe ( udev , 0 ) ,
2007-04-20 13:34:25 -03:00
M9206_FW ,
USB_TYPE_VENDOR | USB_DIR_OUT ,
value , index , buff , size , 20 ) ;
2006-09-23 20:00:41 -03:00
if ( ret ! = size ) {
2007-03-26 16:59:16 -03:00
deb ( " error while uploading fw! \n " ) ;
2006-09-23 20:00:41 -03:00
ret = - EIO ;
goto done ;
}
msleep ( 3 ) ;
}
i + = size ;
}
if ( i ! = fw - > size ) {
2007-03-26 16:59:16 -03:00
deb ( " bad firmware file! \n " ) ;
2006-09-23 20:00:41 -03:00
ret = - EINVAL ;
goto done ;
}
}
msleep ( 36 ) ;
2007-03-26 17:05:59 -03:00
/* m920x will disconnect itself from the bus after this. */
( void ) m920x_write ( udev , M9206_CORE , 0x01 , M9206_FW_GO ) ;
2007-03-26 16:59:16 -03:00
deb ( " firmware uploaded! \n " ) ;
2006-09-23 20:00:41 -03:00
2007-03-22 19:03:37 -03:00
done :
2006-09-23 20:00:41 -03:00
kfree ( buff ) ;
return ret ;
}
2007-01-23 15:00:42 -03:00
/* Callbacks for DVB USB */
2007-03-15 13:01:46 -03:00
static int m920x_identify_state ( struct usb_device * udev ,
struct dvb_usb_device_properties * props ,
struct dvb_usb_device_description * * desc ,
int * cold )
2007-01-23 15:00:42 -03:00
{
struct usb_host_interface * alt ;
alt = usb_altnum_to_altsetting ( usb_ifnum_to_if ( udev , 0 ) , 1 ) ;
* cold = ( alt = = NULL ) ? 1 : 0 ;
return 0 ;
}
2007-03-26 16:35:29 -03:00
/* demod configurations */
2007-03-26 16:39:20 -03:00
static int m920x_mt352_demod_init ( struct dvb_frontend * fe )
2007-01-23 15:00:42 -03:00
{
2007-05-08 18:33:52 -03:00
int ret ;
2007-01-23 15:00:42 -03:00
u8 config [ ] = { CONFIG , 0x3d } ;
u8 clock [ ] = { CLOCK_CTL , 0x30 } ;
u8 reset [ ] = { RESET , 0x80 } ;
u8 adc_ctl [ ] = { ADC_CTL_1 , 0x40 } ;
u8 agc [ ] = { AGC_TARGET , 0x1c , 0x20 } ;
u8 sec_agc [ ] = { 0x69 , 0x00 , 0xff , 0xff , 0x40 , 0xff , 0x00 , 0x40 , 0x40 } ;
u8 unk1 [ ] = { 0x93 , 0x1a } ;
u8 unk2 [ ] = { 0xb5 , 0x7a } ;
2007-03-26 16:59:16 -03:00
deb ( " Demod init! \n " ) ;
2007-01-23 15:00:42 -03:00
2007-05-08 18:33:52 -03:00
if ( ( ret = mt352_write ( fe , config , ARRAY_SIZE ( config ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , clock , ARRAY_SIZE ( clock ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , reset , ARRAY_SIZE ( reset ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , adc_ctl , ARRAY_SIZE ( adc_ctl ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , agc , ARRAY_SIZE ( agc ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , sec_agc , ARRAY_SIZE ( sec_agc ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , unk1 , ARRAY_SIZE ( unk1 ) ) ) ! = 0 )
return ret ;
if ( ( ret = mt352_write ( fe , unk2 , ARRAY_SIZE ( unk2 ) ) ) ! = 0 )
return ret ;
2007-01-23 15:00:42 -03:00
return 0 ;
}
2007-03-26 16:39:20 -03:00
static struct mt352_config m920x_mt352_config = {
2007-03-05 18:23:19 -03:00
. demod_address = 0x0f ,
2007-01-23 15:00:42 -03:00
. no_tuner = 1 ,
2007-03-26 16:39:20 -03:00
. demod_init = m920x_mt352_demod_init ,
2007-01-23 15:00:42 -03:00
} ;
2007-03-26 16:39:20 -03:00
static struct tda1004x_config m920x_tda10046_08_config = {
2007-03-18 19:54:07 -03:00
. demod_address = 0x08 ,
. invert = 0 ,
. invert_oclk = 0 ,
. ts_mode = TDA10046_TS_SERIAL ,
. xtal_freq = TDA10046_XTAL_16M ,
. if_freq = TDA10046_FREQ_045 ,
. agc_config = TDA10046_AGC_TDA827X ,
. gpio_config = TDA10046_GPTRI ,
. request_firmware = NULL ,
} ;
2007-03-26 16:39:20 -03:00
static struct tda1004x_config m920x_tda10046_0b_config = {
2007-03-22 17:09:35 -03:00
. demod_address = 0x0b ,
. invert = 0 ,
. invert_oclk = 0 ,
. ts_mode = TDA10046_TS_SERIAL ,
. xtal_freq = TDA10046_XTAL_16M ,
. if_freq = TDA10046_FREQ_045 ,
. agc_config = TDA10046_AGC_TDA827X ,
. gpio_config = TDA10046_GPTRI ,
. request_firmware = NULL , /* uses firmware EEPROM */
} ;
2007-03-26 16:35:29 -03:00
/* tuner configurations */
2007-03-26 16:39:20 -03:00
static struct qt1010_config m920x_qt1010_config = {
2007-03-26 16:35:29 -03:00
. i2c_address = 0x62
} ;
/* Callbacks for DVB USB */
2007-03-26 16:39:20 -03:00
static int m920x_mt352_frontend_attach ( struct dvb_usb_adapter * adap )
2007-03-26 16:35:29 -03:00
{
2008-04-08 23:20:00 -03:00
deb ( " %s \n " , __func__ ) ;
2007-03-26 16:35:29 -03:00
2007-04-20 13:34:25 -03:00
if ( ( adap - > fe = dvb_attach ( mt352_attach ,
& m920x_mt352_config ,
2007-03-26 16:35:29 -03:00
& adap - > dev - > i2c_adap ) ) = = NULL )
return - EIO ;
return 0 ;
}
2007-03-26 16:39:20 -03:00
static int m920x_tda10046_08_frontend_attach ( struct dvb_usb_adapter * adap )
2007-03-22 17:09:35 -03:00
{
2008-04-08 23:20:00 -03:00
deb ( " %s \n " , __func__ ) ;
2007-03-22 17:09:35 -03:00
2007-03-22 19:03:37 -03:00
if ( ( adap - > fe = dvb_attach ( tda10046_attach ,
2007-03-26 16:39:20 -03:00
& m920x_tda10046_08_config ,
2007-03-22 19:03:37 -03:00
& adap - > dev - > i2c_adap ) ) = = NULL )
2007-03-22 17:09:35 -03:00
return - EIO ;
return 0 ;
}
2007-03-26 16:39:20 -03:00
static int m920x_tda10046_0b_frontend_attach ( struct dvb_usb_adapter * adap )
2007-03-22 17:09:35 -03:00
{
2008-04-08 23:20:00 -03:00
deb ( " %s \n " , __func__ ) ;
2007-03-22 17:09:35 -03:00
2007-03-22 19:03:37 -03:00
if ( ( adap - > fe = dvb_attach ( tda10046_attach ,
2007-03-26 16:39:20 -03:00
& m920x_tda10046_0b_config ,
2007-03-22 19:03:37 -03:00
& adap - > dev - > i2c_adap ) ) = = NULL )
2007-03-22 17:09:35 -03:00
return - EIO ;
return 0 ;
}
2007-03-26 16:39:20 -03:00
static int m920x_qt1010_tuner_attach ( struct dvb_usb_adapter * adap )
2007-03-26 16:35:29 -03:00
{
2008-04-08 23:20:00 -03:00
deb ( " %s \n " , __func__ ) ;
2007-03-26 16:39:20 -03:00
2007-04-20 13:34:25 -03:00
if ( dvb_attach ( qt1010_attach , adap - > fe , & adap - > dev - > i2c_adap , & m920x_qt1010_config ) = = NULL )
2007-03-26 16:35:29 -03:00
return - ENODEV ;
return 0 ;
}
2007-03-26 16:39:20 -03:00
static int m920x_tda8275_60_tuner_attach ( struct dvb_usb_adapter * adap )
2007-03-22 17:09:35 -03:00
{
2008-04-08 23:20:00 -03:00
deb ( " %s \n " , __func__ ) ;
2007-03-22 17:09:35 -03:00
2007-04-20 13:34:25 -03:00
if ( dvb_attach ( tda827x_attach , adap - > fe , 0x60 , & adap - > dev - > i2c_adap , NULL ) = = NULL )
2007-03-22 17:09:35 -03:00
return - ENODEV ;
return 0 ;
}
2007-03-26 16:39:20 -03:00
static int m920x_tda8275_61_tuner_attach ( struct dvb_usb_adapter * adap )
2007-03-22 17:09:35 -03:00
{
2008-04-08 23:20:00 -03:00
deb ( " %s \n " , __func__ ) ;
2007-03-22 17:09:35 -03:00
2007-04-20 13:34:25 -03:00
if ( dvb_attach ( tda827x_attach , adap - > fe , 0x61 , & adap - > dev - > i2c_adap , NULL ) = = NULL )
2007-03-22 17:09:35 -03:00
return - ENODEV ;
return 0 ;
}
2009-10-24 13:12:37 -03:00
static int m920x_fmd1216me_tuner_attach ( struct dvb_usb_adapter * adap )
{
dvb_attach ( simple_tuner_attach , adap - > fe ,
& adap - > dev - > i2c_adap , 0x61 ,
TUNER_PHILIPS_FMD1216ME_MK3 ) ;
return 0 ;
}
2007-03-26 16:35:29 -03:00
/* device-specific initialization */
2007-03-26 17:05:59 -03:00
static struct m920x_inits megasky_rc_init [ ] = {
2007-03-26 16:35:29 -03:00
{ M9206_RC_INIT2 , 0xa8 } ,
{ M9206_RC_INIT1 , 0x51 } ,
{ } /* terminating entry */
} ;
2007-03-26 17:05:59 -03:00
static struct m920x_inits tvwalkertwin_rc_init [ ] = {
2007-03-22 17:09:35 -03:00
{ M9206_RC_INIT2 , 0x00 } ,
{ M9206_RC_INIT1 , 0xef } ,
{ 0xff28 , 0x00 } ,
{ 0xff23 , 0x00 } ,
{ 0xff21 , 0x30 } ,
{ } /* terminating entry */
} ;
2009-10-24 13:12:37 -03:00
static struct m920x_inits pinnacle310e_init [ ] = {
/* without these the tuner don't work */
{ 0xff20 , 0x9b } ,
{ 0xff22 , 0x70 } ,
/* rc settings */
{ 0xff50 , 0x80 } ,
{ M9206_RC_INIT1 , 0x00 } ,
{ M9206_RC_INIT2 , 0xff } ,
{ } /* terminating entry */
} ;
2007-03-26 16:35:29 -03:00
/* ir keymaps */
2010-07-31 11:24:57 -03:00
static struct ir_scancode ir_codes_megasky_table [ ] = {
2009-08-29 15:19:31 -03:00
{ 0x0012 , KEY_POWER } ,
{ 0x001e , KEY_CYCLEWINDOWS } , /* min/max */
{ 0x0002 , KEY_CHANNELUP } ,
{ 0x0005 , KEY_CHANNELDOWN } ,
{ 0x0003 , KEY_VOLUMEUP } ,
{ 0x0006 , KEY_VOLUMEDOWN } ,
{ 0x0004 , KEY_MUTE } ,
{ 0x0007 , KEY_OK } , /* TS */
{ 0x0008 , KEY_STOP } ,
{ 0x0009 , KEY_MENU } , /* swap */
{ 0x000a , KEY_REWIND } ,
{ 0x001b , KEY_PAUSE } ,
{ 0x001f , KEY_FASTFORWARD } ,
{ 0x000c , KEY_RECORD } ,
{ 0x000d , KEY_CAMERA } , /* screenshot */
{ 0x000e , KEY_COFFEE } , /* "MTS" */
2007-03-26 16:35:29 -03:00
} ;
2010-07-31 11:24:57 -03:00
static struct ir_scancode ir_codes_tvwalkertwin_table [ ] = {
2009-08-29 15:19:31 -03:00
{ 0x0001 , KEY_ZOOM } , /* Full Screen */
{ 0x0002 , KEY_CAMERA } , /* snapshot */
{ 0x0003 , KEY_MUTE } ,
{ 0x0004 , KEY_REWIND } ,
{ 0x0005 , KEY_PLAYPAUSE } , /* Play/Pause */
{ 0x0006 , KEY_FASTFORWARD } ,
{ 0x0007 , KEY_RECORD } ,
{ 0x0008 , KEY_STOP } ,
{ 0x0009 , KEY_TIME } , /* Timeshift */
{ 0x000c , KEY_COFFEE } , /* Recall */
{ 0x000e , KEY_CHANNELUP } ,
{ 0x0012 , KEY_POWER } ,
{ 0x0015 , KEY_MENU } , /* source */
{ 0x0018 , KEY_CYCLEWINDOWS } , /* TWIN PIP */
{ 0x001a , KEY_CHANNELDOWN } ,
{ 0x001b , KEY_VOLUMEDOWN } ,
{ 0x001e , KEY_VOLUMEUP } ,
2007-03-26 16:35:29 -03:00
} ;
2010-07-31 11:24:57 -03:00
static struct ir_scancode ir_codes_pinnacle310e_table [ ] = {
2009-10-24 13:12:37 -03:00
{ 0x16 , KEY_POWER } ,
{ 0x17 , KEY_FAVORITES } ,
{ 0x0f , KEY_TEXT } ,
{ 0x48 , KEY_MEDIA } , /* preview */
{ 0x1c , KEY_EPG } ,
{ 0x04 , KEY_LIST } , /* record list */
{ 0x03 , KEY_1 } ,
{ 0x01 , KEY_2 } ,
{ 0x06 , KEY_3 } ,
{ 0x09 , KEY_4 } ,
{ 0x1d , KEY_5 } ,
{ 0x1f , KEY_6 } ,
{ 0x0d , KEY_7 } ,
{ 0x19 , KEY_8 } ,
{ 0x1b , KEY_9 } ,
{ 0x15 , KEY_0 } ,
{ 0x0c , KEY_CANCEL } ,
{ 0x4a , KEY_CLEAR } ,
{ 0x13 , KEY_BACK } ,
{ 0x00 , KEY_TAB } ,
{ 0x4b , KEY_UP } ,
{ 0x4e , KEY_LEFT } ,
{ 0x52 , KEY_RIGHT } ,
{ 0x51 , KEY_DOWN } ,
{ 0x4f , KEY_ENTER } , /* could also be KEY_OK */
{ 0x1e , KEY_VOLUMEUP } ,
{ 0x0a , KEY_VOLUMEDOWN } ,
{ 0x05 , KEY_CHANNELUP } ,
{ 0x02 , KEY_CHANNELDOWN } ,
{ 0x11 , KEY_RECORD } ,
{ 0x14 , KEY_PLAY } ,
{ 0x4c , KEY_PAUSE } ,
{ 0x1a , KEY_STOP } ,
{ 0x40 , KEY_REWIND } ,
{ 0x12 , KEY_FASTFORWARD } ,
{ 0x41 , KEY_PREVIOUSSONG } , /* Replay */
{ 0x42 , KEY_NEXTSONG } , /* Skip */
{ 0x54 , KEY_CAMERA } , /* Capture */
/* { 0x50, KEY_SAP }, */ /* Sap */
{ 0x47 , KEY_CYCLEWINDOWS } , /* Pip */
{ 0x4d , KEY_SCREEN } , /* FullScreen */
{ 0x08 , KEY_SUBTITLE } ,
{ 0x0e , KEY_MUTE } ,
/* { 0x49, KEY_LR }, */ /* L/R */
{ 0x07 , KEY_SLEEP } , /* Hibernate */
{ 0x08 , KEY_MEDIA } , /* A/V */
{ 0x0e , KEY_MENU } , /* Recall */
{ 0x45 , KEY_ZOOMIN } ,
{ 0x46 , KEY_ZOOMOUT } ,
{ 0x18 , KEY_TV } , /* Red */
{ 0x53 , KEY_VCR } , /* Green */
{ 0x5e , KEY_SAT } , /* Yellow */
{ 0x5f , KEY_PLAYER } , /* Blue */
} ;
2006-09-28 01:46:49 -03:00
/* DVB USB Driver stuff */
static struct dvb_usb_device_properties megasky_properties ;
2007-03-18 19:54:07 -03:00
static struct dvb_usb_device_properties digivox_mini_ii_properties ;
2007-03-22 17:09:35 -03:00
static struct dvb_usb_device_properties tvwalkertwin_properties ;
2007-03-22 17:37:58 -03:00
static struct dvb_usb_device_properties dposh_properties ;
2009-10-24 13:12:37 -03:00
static struct dvb_usb_device_properties pinnacle_pctv310e_properties ;
2007-03-22 19:03:37 -03:00
2007-01-21 15:57:48 -03:00
static int m920x_probe ( struct usb_interface * intf ,
const struct usb_device_id * id )
2006-09-28 01:46:49 -03:00
{
2007-05-08 12:56:54 -03:00
struct dvb_usb_device * d = NULL ;
2006-09-28 01:46:49 -03:00
int ret ;
2007-03-26 17:05:59 -03:00
struct m920x_inits * rc_init_seq = NULL ;
2007-03-22 17:09:35 -03:00
int bInterfaceNumber = intf - > cur_altsetting - > desc . bInterfaceNumber ;
2006-09-28 01:46:49 -03:00
2007-03-26 16:59:16 -03:00
deb ( " Probing for m920x device at interface %d \n " , bInterfaceNumber ) ;
2006-09-28 01:46:49 -03:00
2007-03-22 17:09:35 -03:00
if ( bInterfaceNumber = = 0 ) {
/* Single-tuner device, or first interface on
* multi - tuner device
*/
2006-09-28 01:46:49 -03:00
2008-04-09 19:13:13 -03:00
ret = dvb_usb_device_init ( intf , & megasky_properties ,
THIS_MODULE , & d , adapter_nr ) ;
if ( ret = = 0 ) {
2007-03-22 17:09:35 -03:00
rc_init_seq = megasky_rc_init ;
goto found ;
}
2008-04-09 19:13:13 -03:00
ret = dvb_usb_device_init ( intf , & digivox_mini_ii_properties ,
THIS_MODULE , & d , adapter_nr ) ;
if ( ret = = 0 ) {
2007-03-22 17:09:35 -03:00
/* No remote control, so no rc_init_seq */
goto found ;
}
/* This configures both tuners on the TV Walker Twin */
2008-04-09 19:13:13 -03:00
ret = dvb_usb_device_init ( intf , & tvwalkertwin_properties ,
THIS_MODULE , & d , adapter_nr ) ;
if ( ret = = 0 ) {
2007-03-22 17:09:35 -03:00
rc_init_seq = tvwalkertwin_rc_init ;
goto found ;
}
2008-04-09 19:13:13 -03:00
ret = dvb_usb_device_init ( intf , & dposh_properties ,
THIS_MODULE , & d , adapter_nr ) ;
if ( ret = = 0 ) {
2007-03-22 17:37:58 -03:00
/* Remote controller not supported yet. */
goto found ;
}
2009-10-24 13:12:37 -03:00
ret = dvb_usb_device_init ( intf , & pinnacle_pctv310e_properties ,
THIS_MODULE , & d , adapter_nr ) ;
if ( ret = = 0 ) {
rc_init_seq = pinnacle310e_init ;
goto found ;
}
2007-03-22 17:09:35 -03:00
return ret ;
} else {
/* Another interface on a multi-tuner device */
/* The LifeView TV Walker Twin gets here, but struct
* tvwalkertwin_properties already configured both
* tuners , so there is nothing for us to do here
*/
}
2006-09-28 01:46:49 -03:00
2007-03-26 16:39:20 -03:00
found :
2007-05-08 12:56:54 -03:00
if ( ( ret = m920x_init_ep ( intf ) ) < 0 )
2007-03-05 18:54:27 -03:00
return ret ;
2007-05-08 12:56:54 -03:00
if ( d & & ( ret = m920x_init ( d , rc_init_seq ) ) ! = 0 )
2007-03-05 18:54:27 -03:00
return ret ;
2006-09-28 01:46:49 -03:00
return ret ;
}
static struct usb_device_id m920x_table [ ] = {
{ USB_DEVICE ( USB_VID_MSI , USB_PID_MSI_MEGASKY580 ) } ,
2007-03-18 19:54:07 -03:00
{ USB_DEVICE ( USB_VID_ANUBIS_ELECTRONIC ,
USB_PID_MSI_DIGI_VOX_MINI_II ) } ,
2007-03-22 17:09:35 -03:00
{ USB_DEVICE ( USB_VID_ANUBIS_ELECTRONIC ,
USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD ) } ,
{ USB_DEVICE ( USB_VID_ANUBIS_ELECTRONIC ,
USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM ) } ,
2007-03-22 17:37:58 -03:00
{ USB_DEVICE ( USB_VID_DPOSH , USB_PID_DPOSH_M9206_COLD ) } ,
{ USB_DEVICE ( USB_VID_DPOSH , USB_PID_DPOSH_M9206_WARM ) } ,
2009-10-24 13:12:37 -03:00
{ USB_DEVICE ( USB_VID_VISIONPLUS , USB_PID_PINNACLE_PCTV310E ) } ,
2006-09-28 01:46:49 -03:00
{ } /* Terminating entry */
} ;
MODULE_DEVICE_TABLE ( usb , m920x_table ) ;
2006-09-23 20:01:29 -03:00
static struct dvb_usb_device_properties megasky_properties = {
2007-01-23 15:34:10 -03:00
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
2006-10-07 15:03:04 -03:00
2006-09-23 20:00:41 -03:00
. usb_ctrl = DEVICE_SPECIFIC ,
. firmware = " dvb-usb-megasky-02.fw " ,
2007-03-26 17:05:59 -03:00
. download_firmware = m920x_firmware_download ,
2006-09-23 20:00:41 -03:00
2010-07-31 18:04:09 -03:00
. rc . legacy = {
. rc_interval = 100 ,
. rc_key_map = ir_codes_megasky_table ,
. rc_key_map_size = ARRAY_SIZE ( ir_codes_megasky_table ) ,
. rc_query = m920x_rc_query ,
} ,
2006-09-23 20:00:41 -03:00
2007-03-26 17:05:59 -03:00
. size_of_priv = sizeof ( struct m920x_state ) ,
2006-09-23 20:00:41 -03:00
2007-03-15 13:01:46 -03:00
. identify_state = m920x_identify_state ,
2006-09-23 20:01:29 -03:00
. num_adapters = 1 ,
. adapter = { {
2007-01-23 15:34:10 -03:00
. caps = DVB_USB_ADAP_HAS_PID_FILTER |
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
2006-09-23 20:01:29 -03:00
. pid_filter_count = 8 ,
2007-03-26 17:05:59 -03:00
. pid_filter = m920x_pid_filter ,
. pid_filter_ctrl = m920x_pid_filter_ctrl ,
2006-09-23 20:01:29 -03:00
2007-03-26 16:39:20 -03:00
. frontend_attach = m920x_mt352_frontend_attach ,
. tuner_attach = m920x_qt1010_tuner_attach ,
2006-09-23 20:01:29 -03:00
. stream = {
. type = USB_BULK ,
. count = 8 ,
. endpoint = 0x81 ,
. u = {
. bulk = {
. buffersize = 512 ,
}
}
} ,
} } ,
2007-03-26 17:05:59 -03:00
. i2c_algo = & m920x_i2c_algo ,
2006-09-23 20:00:41 -03:00
. num_device_descs = 1 ,
. devices = {
{ " MSI Mega Sky 580 DVB-T USB2.0 " ,
2006-09-23 20:01:29 -03:00
{ & m920x_table [ 0 ] , NULL } ,
2006-09-23 20:00:41 -03:00
{ NULL } ,
2007-03-18 19:54:07 -03:00
}
}
} ;
static struct dvb_usb_device_properties digivox_mini_ii_properties = {
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
. usb_ctrl = DEVICE_SPECIFIC ,
. firmware = " dvb-usb-digivox-02.fw " ,
2007-03-26 17:05:59 -03:00
. download_firmware = m920x_firmware_download ,
2007-03-18 19:54:07 -03:00
2007-03-26 17:05:59 -03:00
. size_of_priv = sizeof ( struct m920x_state ) ,
2007-03-18 19:54:07 -03:00
. identify_state = m920x_identify_state ,
. num_adapters = 1 ,
. adapter = { {
. caps = DVB_USB_ADAP_HAS_PID_FILTER |
2007-03-22 19:03:37 -03:00
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
2007-03-18 19:54:07 -03:00
. pid_filter_count = 8 ,
2007-03-26 17:05:59 -03:00
. pid_filter = m920x_pid_filter ,
. pid_filter_ctrl = m920x_pid_filter_ctrl ,
2007-03-18 19:54:07 -03:00
2007-03-26 16:39:20 -03:00
. frontend_attach = m920x_tda10046_08_frontend_attach ,
. tuner_attach = m920x_tda8275_60_tuner_attach ,
2007-03-18 19:54:07 -03:00
. stream = {
. type = USB_BULK ,
. count = 8 ,
. endpoint = 0x81 ,
. u = {
. bulk = {
. buffersize = 0x4000 ,
}
}
} ,
} } ,
2007-03-26 17:05:59 -03:00
. i2c_algo = & m920x_i2c_algo ,
2007-03-18 19:54:07 -03:00
. num_device_descs = 1 ,
. devices = {
{ " MSI DIGI VOX mini II DVB-T USB2.0 " ,
{ & m920x_table [ 1 ] , NULL } ,
{ NULL } ,
2006-09-23 20:00:41 -03:00
} ,
}
} ;
2007-03-26 16:39:20 -03:00
/* LifeView TV Walker Twin support by Nick Andrew <nick@nick-andrew.net>
*
* LifeView TV Walker Twin has 1 x M9206 , 2 x TDA10046 , 2 x TDA8275A
* TDA10046 # 0 is located at i2c address 0x08
2007-05-08 18:23:38 -03:00
* TDA10046 # 1 is located at i2c address 0x0b
2007-03-26 16:39:20 -03:00
* TDA8275A # 0 is located at i2c address 0x60
2007-05-08 18:23:38 -03:00
* TDA8275A # 1 is located at i2c address 0x61
2007-03-26 16:39:20 -03:00
*/
2007-03-22 17:09:35 -03:00
static struct dvb_usb_device_properties tvwalkertwin_properties = {
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
. usb_ctrl = DEVICE_SPECIFIC ,
. firmware = " dvb-usb-tvwalkert.fw " ,
2007-03-26 17:05:59 -03:00
. download_firmware = m920x_firmware_download ,
2007-03-22 17:09:35 -03:00
2010-07-31 18:04:09 -03:00
. rc . legacy = {
. rc_interval = 100 ,
. rc_key_map = ir_codes_tvwalkertwin_table ,
. rc_key_map_size = ARRAY_SIZE ( ir_codes_tvwalkertwin_table ) ,
. rc_query = m920x_rc_query ,
} ,
2007-03-22 17:09:35 -03:00
2007-03-26 17:05:59 -03:00
. size_of_priv = sizeof ( struct m920x_state ) ,
2007-03-22 17:09:35 -03:00
. identify_state = m920x_identify_state ,
2007-05-08 18:23:38 -03:00
. num_adapters = 2 ,
2007-03-22 19:03:37 -03:00
. adapter = { {
. caps = DVB_USB_ADAP_HAS_PID_FILTER |
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
. pid_filter_count = 8 ,
2007-03-26 17:05:59 -03:00
. pid_filter = m920x_pid_filter ,
. pid_filter_ctrl = m920x_pid_filter_ctrl ,
2007-03-22 19:03:37 -03:00
2007-03-26 16:39:20 -03:00
. frontend_attach = m920x_tda10046_08_frontend_attach ,
. tuner_attach = m920x_tda8275_60_tuner_attach ,
2007-03-22 19:03:37 -03:00
. stream = {
. type = USB_BULK ,
. count = 8 ,
. endpoint = 0x81 ,
. u = {
. bulk = {
. buffersize = 512 ,
}
}
} } , {
. caps = DVB_USB_ADAP_HAS_PID_FILTER |
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
. pid_filter_count = 8 ,
2007-03-26 17:05:59 -03:00
. pid_filter = m920x_pid_filter ,
. pid_filter_ctrl = m920x_pid_filter_ctrl ,
2007-03-22 19:03:37 -03:00
2007-03-26 16:39:20 -03:00
. frontend_attach = m920x_tda10046_0b_frontend_attach ,
. tuner_attach = m920x_tda8275_61_tuner_attach ,
2007-03-22 19:03:37 -03:00
. stream = {
. type = USB_BULK ,
. count = 8 ,
. endpoint = 0x82 ,
. u = {
. bulk = {
. buffersize = 512 ,
}
}
2007-03-22 17:09:35 -03:00
} ,
2007-03-22 19:03:37 -03:00
} } ,
2007-03-26 17:05:59 -03:00
. i2c_algo = & m920x_i2c_algo ,
2007-03-22 17:09:35 -03:00
. num_device_descs = 1 ,
. devices = {
{ . name = " LifeView TV Walker Twin DVB-T USB2.0 " ,
. cold_ids = { & m920x_table [ 2 ] , NULL } ,
. warm_ids = { & m920x_table [ 3 ] , NULL } ,
} ,
}
} ;
2007-03-22 17:37:58 -03:00
static struct dvb_usb_device_properties dposh_properties = {
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
. usb_ctrl = DEVICE_SPECIFIC ,
. firmware = " dvb-usb-dposh-01.fw " ,
2007-03-26 17:05:59 -03:00
. download_firmware = m920x_firmware_download ,
2007-03-22 17:37:58 -03:00
2007-03-26 17:05:59 -03:00
. size_of_priv = sizeof ( struct m920x_state ) ,
2007-03-22 17:37:58 -03:00
. identify_state = m920x_identify_state ,
. num_adapters = 1 ,
. adapter = { {
2007-03-22 19:03:37 -03:00
/* Hardware pid filters don't work with this device/firmware */
2007-03-26 16:39:20 -03:00
. frontend_attach = m920x_mt352_frontend_attach ,
. tuner_attach = m920x_qt1010_tuner_attach ,
2007-03-22 19:03:37 -03:00
. stream = {
. type = USB_BULK ,
. count = 8 ,
. endpoint = 0x81 ,
. u = {
. bulk = {
. buffersize = 512 ,
}
}
} ,
} } ,
2007-03-26 17:05:59 -03:00
. i2c_algo = & m920x_i2c_algo ,
2007-03-22 17:37:58 -03:00
. num_device_descs = 1 ,
. devices = {
{ . name = " Dposh DVB-T USB2.0 " ,
. cold_ids = { & m920x_table [ 4 ] , NULL } ,
. warm_ids = { & m920x_table [ 5 ] , NULL } ,
} ,
}
} ;
2009-10-24 13:12:37 -03:00
static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
. caps = DVB_USB_IS_AN_I2C_ADAPTER ,
. usb_ctrl = DEVICE_SPECIFIC ,
. download_firmware = NULL ,
2010-07-31 18:04:09 -03:00
. rc . legacy = {
. rc_interval = 100 ,
. rc_key_map = ir_codes_pinnacle310e_table ,
. rc_key_map_size = ARRAY_SIZE ( ir_codes_pinnacle310e_table ) ,
. rc_query = m920x_rc_query ,
} ,
2009-10-24 13:12:37 -03:00
. size_of_priv = sizeof ( struct m920x_state ) ,
. identify_state = m920x_identify_state ,
. num_adapters = 1 ,
. adapter = { {
. caps = DVB_USB_ADAP_HAS_PID_FILTER |
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF ,
. pid_filter_count = 8 ,
. pid_filter = m920x_pid_filter ,
. pid_filter_ctrl = m920x_pid_filter_ctrl ,
. frontend_attach = m920x_mt352_frontend_attach ,
. tuner_attach = m920x_fmd1216me_tuner_attach ,
. stream = {
. type = USB_ISOC ,
. count = 5 ,
. endpoint = 0x84 ,
. u = {
. isoc = {
. framesperurb = 128 ,
. framesize = 564 ,
. interval = 1 ,
}
}
} ,
} } ,
. i2c_algo = & m920x_i2c_algo ,
. num_device_descs = 1 ,
. devices = {
{ " Pinnacle PCTV 310e " ,
{ & m920x_table [ 6 ] , NULL } ,
{ NULL } ,
}
}
} ;
2006-09-23 20:01:29 -03:00
static struct usb_driver m920x_driver = {
. name = " dvb_usb_m920x " ,
2006-09-23 20:13:12 -03:00
. probe = m920x_probe ,
2006-09-23 20:00:41 -03:00
. disconnect = dvb_usb_device_exit ,
2006-09-23 20:01:29 -03:00
. id_table = m920x_table ,
2006-09-23 20:00:41 -03:00
} ;
/* module stuff */
2006-09-23 20:01:29 -03:00
static int __init m920x_module_init ( void )
2006-09-23 20:00:41 -03:00
{
int ret ;
2006-09-23 20:01:29 -03:00
if ( ( ret = usb_register ( & m920x_driver ) ) ) {
2006-09-23 20:00:41 -03:00
err ( " usb_register failed. Error number %d " , ret ) ;
return ret ;
}
return 0 ;
}
2006-09-23 20:01:29 -03:00
static void __exit m920x_module_exit ( void )
2006-09-23 20:00:41 -03:00
{
/* deregister this driver from the USB subsystem */
2006-09-23 20:01:29 -03:00
usb_deregister ( & m920x_driver ) ;
2006-09-23 20:00:41 -03:00
}
2006-09-23 20:01:29 -03:00
module_init ( m920x_module_init ) ;
module_exit ( m920x_module_exit ) ;
2006-09-23 20:00:41 -03:00
MODULE_AUTHOR ( " Aapo Tahkola <aet@rasterburn.org> " ) ;
2007-03-22 17:09:35 -03:00
MODULE_DESCRIPTION ( " DVB Driver for ULI M920x " ) ;
2006-09-23 20:00:41 -03:00
MODULE_VERSION ( " 0.1 " ) ;
MODULE_LICENSE ( " GPL " ) ;
2007-03-22 17:18:26 -03:00
/*
* Local variables :
* c - basic - offset : 8
*/