2019-05-28 09:57:14 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2008-06-18 22:09:55 -03:00
/*
* Card - specific functions for the Siano SMS1xxx USB dongle
*
* Copyright ( c ) 2008 Michael Krufky < mkrufky @ linuxtv . org >
*/
# include "sms-cards.h"
2009-05-14 16:32:12 -03:00
# include "smsir.h"
2011-07-03 14:03:12 -04:00
# include <linux/module.h>
2008-06-18 22:09:55 -03:00
static struct sms_board sms_boards [ ] = {
[ SMS_BOARD_UNKNOWN ] = {
. name = " Unknown board " ,
2013-03-05 22:35:44 -03:00
. type = SMS_UNKNOWN_TYPE ,
. default_mode = DEVICE_MODE_NONE ,
2008-06-18 22:09:55 -03:00
} ,
[ SMS1XXX_BOARD_SIANO_STELLAR ] = {
2008-06-28 16:45:36 -03:00
. name = " Siano Stellar Digital Receiver " ,
2008-06-18 22:09:55 -03:00
. type = SMS_STELLAR ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-06-18 22:09:55 -03:00
} ,
[ SMS1XXX_BOARD_SIANO_NOVA_A ] = {
2008-06-28 16:45:36 -03:00
. name = " Siano Nova A Digital Receiver " ,
2008-06-18 22:09:55 -03:00
. type = SMS_NOVA_A0 ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-06-18 22:09:55 -03:00
} ,
[ SMS1XXX_BOARD_SIANO_NOVA_B ] = {
2008-06-28 16:45:36 -03:00
. name = " Siano Nova B Digital Receiver " ,
2008-06-18 22:09:55 -03:00
. type = SMS_NOVA_B0 ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-06-18 22:09:55 -03:00
} ,
[ SMS1XXX_BOARD_SIANO_VEGA ] = {
2008-06-28 16:45:36 -03:00
. name = " Siano Vega Digital Receiver " ,
2008-06-18 22:09:55 -03:00
. type = SMS_VEGA ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_CMMB ,
2008-06-18 22:09:55 -03:00
} ,
2008-06-28 23:55:36 -03:00
[ SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT ] = {
. name = " Hauppauge Catamount " ,
. type = SMS_STELLAR ,
2013-03-19 17:02:54 -03:00
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVBT_STELLAR ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-06-28 23:55:36 -03:00
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A ] = {
. name = " Hauppauge Okemo-A " ,
. type = SMS_NOVA_A0 ,
2013-03-19 17:02:54 -03:00
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVBT_NOVA_A ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-06-28 23:55:36 -03:00
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B ] = {
. name = " Hauppauge Okemo-B " ,
. type = SMS_NOVA_B0 ,
2013-03-19 17:02:54 -03:00
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVBT_NOVA_B ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-06-28 23:55:36 -03:00
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_WINDHAM ] = {
2008-09-11 23:02:12 -03:00
. name = " Hauppauge WinTV MiniStick " ,
2008-06-28 23:55:36 -03:00
. type = SMS_NOVA_B0 ,
2013-03-19 17:02:54 -03:00
. fw [ DEVICE_MODE_ISDBT_BDA ] = SMS_FW_ISDBT_HCW_55XXX ,
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVBT_HCW_55XXX ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2011-01-24 12:18:47 -03:00
. rc_codes = RC_MAP_HAUPPAUGE ,
2009-05-14 16:34:59 -03:00
. board_cfg . leds_power = 26 ,
. board_cfg . led0 = 27 ,
. board_cfg . led1 = 28 ,
2010-08-01 13:01:40 -03:00
. board_cfg . ir = 9 ,
2008-11-16 22:45:42 -03:00
. led_power = 26 ,
. led_lo = 27 ,
. led_hi = 28 ,
2008-06-28 23:55:36 -03:00
} ,
2008-11-22 11:21:02 -03:00
[ SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD ] = {
. name = " Hauppauge WinTV MiniCard " ,
. type = SMS_NOVA_B0 ,
2013-03-19 17:02:54 -03:00
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVBT_HCW_55XXX ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-11-16 22:45:42 -03:00
. lna_ctrl = 29 ,
2009-05-14 16:34:59 -03:00
. board_cfg . foreign_lna0_ctrl = 29 ,
2008-12-16 02:56:08 -03:00
. rf_switch = 17 ,
2009-05-14 16:34:59 -03:00
. board_cfg . rf_switch_uhf = 17 ,
2008-11-16 22:45:42 -03:00
} ,
[ SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 ] = {
media: siano: rename a duplicated card string
There are two different variants for Hauppauge WinTV MiniCard:
[SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD] = {
.name = "Hauppauge WinTV MiniCard",
.type = SMS_NOVA_B0,
.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX,
.default_mode = DEVICE_MODE_DVBT_BDA,
.lna_ctrl = 29,
.board_cfg.foreign_lna0_ctrl = 29,
.rf_switch = 17,
.board_cfg.rf_switch_uhf = 17,
},
[SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = {
.name = "Hauppauge WinTV MiniCard Rev 2",
.type = SMS_NOVA_B0,
.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX,
.default_mode = DEVICE_MODE_DVBT_BDA,
.lna_ctrl = -1,
},
As it can be seen, the RF part of the definitions are different.
So, better to use different names in order to distinguish
between them.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
2020-10-02 14:24:07 +02:00
. name = " Hauppauge WinTV MiniCard Rev 2 " ,
2008-11-16 22:45:42 -03:00
. type = SMS_NOVA_B0 ,
2013-03-19 17:02:54 -03:00
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVBT_HCW_55XXX ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2008-12-15 17:28:41 -03:00
. lna_ctrl = - 1 ,
2008-11-22 11:21:02 -03:00
} ,
2009-05-19 09:51:41 -03:00
[ SMS1XXX_BOARD_SIANO_NICE ] = {
. name = " Siano Nice Digital Receiver " ,
. type = SMS_NOVA_B0 ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_DVBT_BDA ,
2009-05-19 09:51:41 -03:00
} ,
[ SMS1XXX_BOARD_SIANO_VENICE ] = {
. name = " Siano Venice Digital Receiver " ,
. type = SMS_VEGA ,
2013-03-05 22:35:44 -03:00
. default_mode = DEVICE_MODE_CMMB ,
} ,
[ SMS1XXX_BOARD_SIANO_STELLAR_ROM ] = {
. name = " Siano Stellar Digital Receiver ROM " ,
. type = SMS_STELLAR ,
. default_mode = DEVICE_MODE_DVBT_BDA ,
. intf_num = 1 ,
} ,
[ SMS1XXX_BOARD_ZTE_DVB_DATA_CARD ] = {
. name = " ZTE Data Card Digital Receiver " ,
. type = SMS_NOVA_B0 ,
. default_mode = DEVICE_MODE_DVBT_BDA ,
. intf_num = 5 ,
. mtu = 15792 ,
} ,
[ SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD ] = {
. name = " ONDA Data Card Digital Receiver " ,
. type = SMS_NOVA_B0 ,
. default_mode = DEVICE_MODE_DVBT_BDA ,
. intf_num = 6 ,
. mtu = 15792 ,
} ,
[ SMS1XXX_BOARD_SIANO_MING ] = {
. name = " Siano Ming Digital Receiver " ,
. type = SMS_MING ,
. default_mode = DEVICE_MODE_CMMB ,
} ,
[ SMS1XXX_BOARD_SIANO_PELE ] = {
. name = " Siano Pele Digital Receiver " ,
. type = SMS_PELE ,
. default_mode = DEVICE_MODE_ISDBT_BDA ,
} ,
[ SMS1XXX_BOARD_SIANO_RIO ] = {
. name = " Siano Rio Digital Receiver " ,
. type = SMS_RIO ,
. default_mode = DEVICE_MODE_ISDBT_BDA ,
} ,
[ SMS1XXX_BOARD_SIANO_DENVER_1530 ] = {
. name = " Siano Denver (ATSC-M/H) Digital Receiver " ,
. type = SMS_DENVER_1530 ,
. default_mode = DEVICE_MODE_ATSC ,
. crystal = 2400 ,
} ,
[ SMS1XXX_BOARD_SIANO_DENVER_2160 ] = {
. name = " Siano Denver (TDMB) Digital Receiver " ,
. type = SMS_DENVER_2160 ,
. default_mode = DEVICE_MODE_DAB_TDMB ,
2009-05-19 09:51:41 -03:00
} ,
2014-08-11 18:09:32 -03:00
[ SMS1XXX_BOARD_PCTV_77E ] = {
. name = " Hauppauge microStick 77e " ,
. type = SMS_NOVA_B0 ,
. fw [ DEVICE_MODE_DVBT_BDA ] = SMS_FW_DVB_NOVA_12MHZ_B0 ,
. default_mode = DEVICE_MODE_DVBT_BDA ,
} ,
2008-06-18 22:09:55 -03:00
} ;
2009-11-17 19:43:40 -03:00
struct sms_board * sms_get_board ( unsigned id )
2008-06-18 22:09:55 -03:00
{
BUG_ON ( id > = ARRAY_SIZE ( sms_boards ) ) ;
return & sms_boards [ id ] ;
}
2009-02-26 18:32:36 -03:00
EXPORT_SYMBOL_GPL ( sms_get_board ) ;
2009-05-19 12:18:40 -03:00
static inline void sms_gpio_assign_11xx_default_led_config (
2013-03-21 08:49:43 -03:00
struct smscore_config_gpio * p_gpio_config ) {
p_gpio_config - > direction = SMS_GPIO_DIRECTION_OUTPUT ;
p_gpio_config - > inputcharacteristics =
2013-03-06 08:30:08 -03:00
SMS_GPIO_INPUTCHARACTERISTICS_NORMAL ;
2013-03-21 08:49:43 -03:00
p_gpio_config - > outputdriving = SMS_GPIO_OUTPUTDRIVING_4mA ;
p_gpio_config - > outputslewrate = SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS ;
p_gpio_config - > pullupdown = SMS_GPIO_PULLUPDOWN_NONE ;
2009-05-19 12:18:40 -03:00
}
int sms_board_event ( struct smscore_device_t * coredev ,
2013-03-05 22:35:44 -03:00
enum SMS_BOARD_EVENTS gevent )
{
2013-03-21 09:27:37 -03:00
struct smscore_config_gpio my_gpio_config ;
2009-05-19 12:18:40 -03:00
2013-03-21 09:27:37 -03:00
sms_gpio_assign_11xx_default_led_config ( & my_gpio_config ) ;
2009-05-19 12:18:40 -03:00
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 :
2015-02-22 11:04:35 -03:00
pr_err ( " Unknown SMS board event \n " ) ;
2009-05-19 12:18:40 -03:00
break ;
}
return 0 ;
}
EXPORT_SYMBOL_GPL ( sms_board_event ) ;
2008-06-18 22:09:55 -03:00
2008-11-28 01:02:56 -03:00
static int sms_set_gpio ( struct smscore_device_t * coredev , int pin , int enable )
2008-11-16 22:45:42 -03:00
{
2008-11-28 01:02:56 -03:00
int lvl , ret ;
u32 gpio ;
2009-05-19 11:49:19 -03:00
struct smscore_config_gpio gpioconfig = {
2008-11-16 22:45:42 -03:00
. direction = SMS_GPIO_DIRECTION_OUTPUT ,
. pullupdown = SMS_GPIO_PULLUPDOWN_NONE ,
. inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL ,
2013-03-06 08:30:08 -03:00
. outputslewrate = SMS_GPIO_OUTPUT_SLEW_RATE_FAST ,
2013-03-06 07:09:54 -03:00
. outputdriving = SMS_GPIO_OUTPUTDRIVING_S_4mA ,
2008-11-16 22:45:42 -03:00
} ;
if ( pin = = 0 )
return - EINVAL ;
2008-11-28 01: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-16 22:45:42 -03:00
2008-11-28 01:02:56 -03:00
ret = smscore_configure_gpio ( coredev , gpio , & gpioconfig ) ;
2008-11-16 22:45:42 -03:00
if ( ret < 0 )
return ret ;
2008-11-28 01:02:56 -03:00
return smscore_set_gpio ( coredev , gpio , lvl ) ;
2008-11-16 22: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 14: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-16 22:45:42 -03:00
}
return 0 ;
}
2009-02-26 18:32:36 -03:00
EXPORT_SYMBOL_GPL ( sms_board_setup ) ;
2008-11-22 14: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 14:33:00 -03:00
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 :
case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD :
/* LNA */
2008-12-16 02:56:08 -03:00
if ( ! onoff )
sms_set_gpio ( coredev , board - > lna_ctrl , 0 ) ;
2008-11-22 14:33:00 -03:00
break ;
2008-11-22 14:26:37 -03:00
}
return 0 ;
}
2009-02-26 18:32:36 -03:00
EXPORT_SYMBOL_GPL ( sms_board_power ) ;
2008-11-22 15: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 ) ;
2019-02-18 14:29:05 -05:00
/* don't touch GPIO if LEDs are already set */
2008-11-22 15:32:19 -03:00
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-26 18:32:36 -03:00
EXPORT_SYMBOL_GPL ( sms_board_led_feedback ) ;
2008-12-16 02: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 ) ;
2015-02-22 11:33:37 -03:00
pr_debug ( " %s: LNA %s \n " , __func__ , onoff ? " enabled " : " disabled " ) ;
2008-12-16 02:56:08 -03:00
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-26 18:32:36 -03:00
EXPORT_SYMBOL_GPL ( sms_board_lna_control ) ;
2008-08-31 17:39:58 -03:00
int sms_board_load_modules ( int id )
{
2013-03-07 11:35:00 -03:00
request_module ( " smsdvb " ) ;
2008-08-31 17:39:58 -03:00
return 0 ;
}
2009-02-26 18:32:36 -03:00
EXPORT_SYMBOL_GPL ( sms_board_load_modules ) ;