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 >
*
* This program is free software ; you can redistribute it and / or modify
2008-09-03 16:48:17 -03:00
* it under the terms of the GNU General Public License version 2 as
2008-06-18 22:09:55 -03: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 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 ] = {
. 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-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 ) ;
/* 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-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 ) ;