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"
2009-05-14 23:32:12 +04:00
# include "smsir.h"
2008-06-19 05:09:55 +04:00
2009-02-27 08:42:16 +03:00
static int sms_dbg ;
module_param_named ( cards_dbg , sms_dbg , int , 0644 ) ;
MODULE_PARM_DESC ( cards_dbg , " set debug level (info=1, adv=2 (or-able)) " ) ;
2008-06-19 05:09:55 +04:00
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 ,
} ,
[ 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 ,
} ,
[ 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 ,
} ,
[ 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 " ,
2009-05-14 23:34:59 +04:00
. board_cfg . leds_power = 26 ,
. board_cfg . led0 = 27 ,
. board_cfg . led1 = 28 ,
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 ,
2009-05-14 23:34:59 +04:00
. board_cfg . foreign_lna0_ctrl = 29 ,
2008-12-16 08:56:08 +03:00
. rf_switch = 17 ,
2009-05-14 23:34:59 +04:00
. board_cfg . rf_switch_uhf = 17 ,
2008-11-17 04:45:42 +03:00
} ,
[ 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 " ,
2008-12-15 23:28:41 +03:00
. lna_ctrl = - 1 ,
2008-11-22 17:21:02 +03:00
} ,
2009-05-19 16:51:41 +04:00
[ SMS1XXX_BOARD_SIANO_NICE ] = {
/* 11 */
. name = " Siano Nice Digital Receiver " ,
. type = SMS_NOVA_B0 ,
} ,
[ SMS1XXX_BOARD_SIANO_VENICE ] = {
/* 12 */
. name = " Siano Venice Digital Receiver " ,
. type = SMS_VEGA ,
} ,
2008-06-19 05:09:55 +04:00
} ;
2009-11-18 01:43:40 +03:00
struct sms_board * sms_get_board ( unsigned id )
2008-06-19 05:09:55 +04:00
{
BUG_ON ( id > = ARRAY_SIZE ( sms_boards ) ) ;
return & sms_boards [ id ] ;
}
2009-02-27 00:32:36 +03:00
EXPORT_SYMBOL_GPL ( sms_get_board ) ;
2009-05-19 19:18:40 +04:00
static inline void sms_gpio_assign_11xx_default_led_config (
struct smscore_gpio_config * pGpioConfig ) {
pGpioConfig - > Direction = SMS_GPIO_DIRECTION_OUTPUT ;
pGpioConfig - > InputCharacteristics =
SMS_GPIO_INPUT_CHARACTERISTICS_NORMAL ;
pGpioConfig - > OutputDriving = SMS_GPIO_OUTPUT_DRIVING_4mA ;
pGpioConfig - > OutputSlewRate = SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS ;
pGpioConfig - > PullUpDown = SMS_GPIO_PULL_UP_DOWN_NONE ;
}
int sms_board_event ( struct smscore_device_t * coredev ,
enum SMS_BOARD_EVENTS gevent ) {
struct smscore_gpio_config MyGpioConfig ;
sms_gpio_assign_11xx_default_led_config ( & MyGpioConfig ) ;
switch ( gevent ) {
case BOARD_EVENT_POWER_INIT : /* including hotplug */
break ; /* BOARD_EVENT_BIND */
case BOARD_EVENT_POWER_SUSPEND :
break ; /* BOARD_EVENT_POWER_SUSPEND */
case BOARD_EVENT_POWER_RESUME :
break ; /* BOARD_EVENT_POWER_RESUME */
case BOARD_EVENT_BIND :
break ; /* BOARD_EVENT_BIND */
case BOARD_EVENT_SCAN_PROG :
break ; /* BOARD_EVENT_SCAN_PROG */
case BOARD_EVENT_SCAN_COMP :
break ; /* BOARD_EVENT_SCAN_COMP */
case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL :
break ; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */
case BOARD_EVENT_FE_LOCK :
break ; /* BOARD_EVENT_FE_LOCK */
case BOARD_EVENT_FE_UNLOCK :
break ; /* BOARD_EVENT_FE_UNLOCK */
case BOARD_EVENT_DEMOD_LOCK :
break ; /* BOARD_EVENT_DEMOD_LOCK */
case BOARD_EVENT_DEMOD_UNLOCK :
break ; /* BOARD_EVENT_DEMOD_UNLOCK */
case BOARD_EVENT_RECEPTION_MAX_4 :
break ; /* BOARD_EVENT_RECEPTION_MAX_4 */
case BOARD_EVENT_RECEPTION_3 :
break ; /* BOARD_EVENT_RECEPTION_3 */
case BOARD_EVENT_RECEPTION_2 :
break ; /* BOARD_EVENT_RECEPTION_2 */
case BOARD_EVENT_RECEPTION_1 :
break ; /* BOARD_EVENT_RECEPTION_1 */
case BOARD_EVENT_RECEPTION_LOST_0 :
break ; /* BOARD_EVENT_RECEPTION_LOST_0 */
case BOARD_EVENT_MULTIPLEX_OK :
break ; /* BOARD_EVENT_MULTIPLEX_OK */
case BOARD_EVENT_MULTIPLEX_ERRORS :
break ; /* BOARD_EVENT_MULTIPLEX_ERRORS */
default :
sms_err ( " Unknown SMS board event " ) ;
break ;
}
return 0 ;
}
EXPORT_SYMBOL_GPL ( sms_board_event ) ;
2008-06-19 05:09:55 +04:00
2008-11-28 07:02:56 +03:00
static int sms_set_gpio ( struct smscore_device_t * coredev , int pin , int enable )
2008-11-17 04:45:42 +03:00
{
2008-11-28 07:02:56 +03:00
int lvl , ret ;
u32 gpio ;
2009-05-19 18:49:19 +04:00
struct smscore_config_gpio gpioconfig = {
2008-11-17 04:45:42 +03:00
. 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 ;
2008-11-28 07:02:56 +03:00
if ( pin < 0 ) {
/* inverted gpio */
gpio = pin * - 1 ;
lvl = enable ? 0 : 1 ;
} else {
gpio = pin ;
lvl = enable ? 1 : 0 ;
}
2008-11-17 04:45:42 +03:00
2008-11-28 07:02:56 +03:00
ret = smscore_configure_gpio ( coredev , gpio , & gpioconfig ) ;
2008-11-17 04:45:42 +03:00
if ( ret < 0 )
return ret ;
2008-11-28 07:02:56 +03:00
return smscore_set_gpio ( coredev , gpio , lvl ) ;
2008-11-17 04:45:42 +03:00
}
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 ;
2008-11-22 20:33:00 +03:00
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 :
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD :
/* turn off LNA */
sms_set_gpio ( coredev , board - > lna_ctrl , 0 ) ;
break ;
2008-11-17 04:45:42 +03:00
}
return 0 ;
}
2009-02-27 00:32:36 +03:00
EXPORT_SYMBOL_GPL ( sms_board_setup ) ;
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 ;
2008-11-22 20:33:00 +03:00
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 :
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD :
/* LNA */
2008-12-16 08:56:08 +03:00
if ( ! onoff )
sms_set_gpio ( coredev , board - > lna_ctrl , 0 ) ;
2008-11-22 20:33:00 +03:00
break ;
2008-11-22 20:26:37 +03:00
}
return 0 ;
}
2009-02-27 00:32:36 +03:00
EXPORT_SYMBOL_GPL ( sms_board_power ) ;
2008-11-22 21:32:19 +03:00
int sms_board_led_feedback ( struct smscore_device_t * coredev , int led )
{
int board_id = smscore_get_board_id ( coredev ) ;
struct sms_board * board = sms_get_board ( board_id ) ;
/* dont touch GPIO if LEDs are already set */
if ( smscore_led_state ( coredev , - 1 ) = = led )
return 0 ;
switch ( board_id ) {
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM :
sms_set_gpio ( coredev ,
board - > led_lo , ( led & SMS_LED_LO ) ? 1 : 0 ) ;
sms_set_gpio ( coredev ,
board - > led_hi , ( led & SMS_LED_HI ) ? 1 : 0 ) ;
smscore_led_state ( coredev , led ) ;
break ;
}
return 0 ;
}
2009-02-27 00:32:36 +03:00
EXPORT_SYMBOL_GPL ( sms_board_led_feedback ) ;
2008-12-16 08:56:08 +03:00
int sms_board_lna_control ( struct smscore_device_t * coredev , int onoff )
{
int board_id = smscore_get_board_id ( coredev ) ;
struct sms_board * board = sms_get_board ( board_id ) ;
sms_debug ( " %s: LNA %s " , __func__ , onoff ? " enabled " : " disabled " ) ;
switch ( board_id ) {
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 :
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD :
sms_set_gpio ( coredev ,
board - > rf_switch , onoff ? 1 : 0 ) ;
return sms_set_gpio ( coredev ,
board - > lna_ctrl , onoff ? 1 : 0 ) ;
}
return - EINVAL ;
}
2009-02-27 00:32:36 +03:00
EXPORT_SYMBOL_GPL ( sms_board_lna_control ) ;
2008-09-01 00:39:58 +04:00
int sms_board_load_modules ( int id )
{
switch ( id ) {
case SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT :
case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A :
case SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B :
case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM :
2009-11-04 21:46:11 +03:00
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD :
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 :
2008-09-01 00:39:58 +04:00
request_module ( " smsdvb " ) ;
break ;
default :
/* do nothing */
break ;
}
return 0 ;
}
2009-02-27 00:32:36 +03:00
EXPORT_SYMBOL_GPL ( sms_board_load_modules ) ;