2008-06-19 05:09:55 +04:00
/*
* Card - specific functions for the Siano SMS1xxx USB dongle
*
* Copyright ( c ) 2008 Michael Krufky < mkrufky @ linuxtv . org >
*
* This program is free software ; you can redistribute it and / or modify
2008-09-03 23:48:17 +04:00
* it under the terms of the GNU General Public License version 2 as
2008-06-19 05:09:55 +04:00
* published by the Free Software Foundation ;
*
* Software distributed under the License is distributed on an " AS IS "
* basis , WITHOUT WARRANTY OF ANY KIND , either express or implied .
*
* 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 "sms-cards.h"
struct usb_device_id smsusb_id_table [ ] = {
2008-06-29 06:53:51 +04:00
# ifdef CONFIG_DVB_SIANO_SMS1XXX_SMS_IDS
2008-06-19 05:09:55 +04:00
{ USB_DEVICE ( 0x187f , 0x0010 ) ,
. driver_info = SMS1XXX_BOARD_SIANO_STELLAR } ,
{ USB_DEVICE ( 0x187f , 0x0100 ) ,
. driver_info = SMS1XXX_BOARD_SIANO_STELLAR } ,
{ USB_DEVICE ( 0x187f , 0x0200 ) ,
. driver_info = SMS1XXX_BOARD_SIANO_NOVA_A } ,
{ USB_DEVICE ( 0x187f , 0x0201 ) ,
. driver_info = SMS1XXX_BOARD_SIANO_NOVA_B } ,
{ USB_DEVICE ( 0x187f , 0x0300 ) ,
. driver_info = SMS1XXX_BOARD_SIANO_VEGA } ,
2008-06-29 06:53:51 +04:00
# endif
2008-06-29 06:55:36 +04:00
{ USB_DEVICE ( 0x2040 , 0x1700 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT } ,
{ USB_DEVICE ( 0x2040 , 0x1800 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A } ,
{ USB_DEVICE ( 0x2040 , 0x1801 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B } ,
2008-11-22 17:21:02 +03:00
{ USB_DEVICE ( 0x2040 , 0x2000 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD } ,
{ USB_DEVICE ( 0x2040 , 0x2009 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD } ,
{ USB_DEVICE ( 0x2040 , 0x200a ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD } ,
{ USB_DEVICE ( 0x2040 , 0x2010 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD } ,
{ USB_DEVICE ( 0x2040 , 0x2019 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD } ,
2008-06-29 06:55:36 +04:00
{ USB_DEVICE ( 0x2040 , 0x5500 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM } ,
2008-09-16 23:46:42 +04:00
{ USB_DEVICE ( 0x2040 , 0x5510 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM } ,
2008-10-16 00:05:34 +04:00
{ USB_DEVICE ( 0x2040 , 0x5520 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM } ,
{ USB_DEVICE ( 0x2040 , 0x5530 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM } ,
2008-06-29 06:55:36 +04:00
{ USB_DEVICE ( 0x2040 , 0x5580 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM } ,
{ USB_DEVICE ( 0x2040 , 0x5590 ) ,
. driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM } ,
2008-06-19 05:09:55 +04:00
{ } /* Terminating entry */
} ;
MODULE_DEVICE_TABLE ( usb , smsusb_id_table ) ;
static struct sms_board sms_boards [ ] = {
[ SMS_BOARD_UNKNOWN ] = {
. name = " Unknown board " ,
} ,
[ SMS1XXX_BOARD_SIANO_STELLAR ] = {
2008-06-28 23:45:36 +04:00
. name = " Siano Stellar Digital Receiver " ,
2008-06-19 05:09:55 +04:00
. type = SMS_STELLAR ,
2008-07-01 11:47:10 +04:00
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-stellar-dvbt-01.fw " ,
2008-06-19 05:09:55 +04:00
} ,
[ SMS1XXX_BOARD_SIANO_NOVA_A ] = {
2008-06-28 23:45:36 +04:00
. name = " Siano Nova A Digital Receiver " ,
2008-06-19 05:09:55 +04:00
. type = SMS_NOVA_A0 ,
2008-07-01 11:47:10 +04:00
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-nova-a-dvbt-01.fw " ,
2008-06-19 05:09:55 +04:00
} ,
[ SMS1XXX_BOARD_SIANO_NOVA_B ] = {
2008-06-28 23:45:36 +04:00
. name = " Siano Nova B Digital Receiver " ,
2008-06-19 05:09:55 +04:00
. type = SMS_NOVA_B0 ,
2008-07-01 11:47:10 +04:00
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-nova-b-dvbt-01.fw " ,
2008-06-19 05:09:55 +04:00
} ,
[ SMS1XXX_BOARD_SIANO_VEGA ] = {
2008-06-28 23:45:36 +04:00
. name = " Siano Vega Digital Receiver " ,
2008-06-19 05:09:55 +04:00
. type = SMS_VEGA ,
} ,
2008-06-29 06:55:36 +04:00
[ SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT ] = {
. name = " Hauppauge Catamount " ,
. type = SMS_STELLAR ,
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-stellar-dvbt-01.fw " ,
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A ] = {
. name = " Hauppauge Okemo-A " ,
. type = SMS_NOVA_A0 ,
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-nova-a-dvbt-01.fw " ,
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B ] = {
. name = " Hauppauge Okemo-B " ,
. type = SMS_NOVA_B0 ,
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-nova-b-dvbt-01.fw " ,
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_WINDHAM ] = {
2008-09-12 06:02:12 +04:00
. name = " Hauppauge WinTV MiniStick " ,
2008-06-29 06:55:36 +04:00
. type = SMS_NOVA_B0 ,
2008-11-21 23:14:37 +03:00
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-hcw-55xxx-dvbt-02.fw " ,
2008-11-17 04:45:42 +03:00
. led_power = 26 ,
. led_lo = 27 ,
. led_hi = 28 ,
2008-06-29 06:55:36 +04:00
} ,
2008-11-22 17:21:02 +03:00
[ SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD ] = {
. name = " Hauppauge WinTV MiniCard " ,
. type = SMS_NOVA_B0 ,
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-hcw-55xxx-dvbt-02.fw " ,
2008-11-17 04:45:42 +03:00
. lna_ctrl = 29 ,
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 ] = {
. name = " Hauppauge WinTV MiniCard " ,
. type = SMS_NOVA_B0 ,
. fw [ DEVICE_MODE_DVBT_BDA ] = " sms1xxx-hcw-55xxx-dvbt-02.fw " ,
. lna_ctrl = 1 ,
2008-11-22 17:21:02 +03:00
} ,
2008-06-19 05:09:55 +04:00
} ;
struct sms_board * sms_get_board ( int id )
{
BUG_ON ( id > = ARRAY_SIZE ( sms_boards ) ) ;
return & sms_boards [ id ] ;
}
2008-11-17 04:45:42 +03:00
static int sms_set_gpio ( struct smscore_device_t * coredev , u32 pin , int enable )
{
int ret ;
struct smscore_gpio_config gpioconfig = {
. direction = SMS_GPIO_DIRECTION_OUTPUT ,
. pullupdown = SMS_GPIO_PULLUPDOWN_NONE ,
. inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL ,
. outputslewrate = SMS_GPIO_OUTPUTSLEWRATE_FAST ,
. outputdriving = SMS_GPIO_OUTPUTDRIVING_4mA ,
} ;
if ( pin = = 0 )
return - EINVAL ;
ret = smscore_configure_gpio ( coredev , pin , & gpioconfig ) ;
if ( ret < 0 )
return ret ;
return smscore_set_gpio ( coredev , pin , enable ) ;
}
int sms_board_setup ( struct smscore_device_t * coredev )
{
int board_id = smscore_get_board_id ( coredev ) ;
struct sms_board * board = sms_get_board ( board_id ) ;
switch ( board_id ) {
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM :
/* turn off all LEDs */
sms_set_gpio ( coredev , board - > led_power , 0 ) ;
sms_set_gpio ( coredev , board - > led_hi , 0 ) ;
sms_set_gpio ( coredev , board - > led_lo , 0 ) ;
break ;
}
return 0 ;
}
2008-11-22 20:26:37 +03:00
int sms_board_power ( struct smscore_device_t * coredev , int onoff )
{
int board_id = smscore_get_board_id ( coredev ) ;
struct sms_board * board = sms_get_board ( board_id ) ;
switch ( board_id ) {
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM :
/* power LED */
sms_set_gpio ( coredev ,
board - > led_power , onoff ? 1 : 0 ) ;
break ;
}
return 0 ;
}