1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Card-specific functions for the Siano SMS1xxx USB dongle
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org>
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include "sms-cards.h"
9*4882a593Smuzhiyun #include "smsir.h"
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun static struct sms_board sms_boards[] = {
13*4882a593Smuzhiyun [SMS_BOARD_UNKNOWN] = {
14*4882a593Smuzhiyun .name = "Unknown board",
15*4882a593Smuzhiyun .type = SMS_UNKNOWN_TYPE,
16*4882a593Smuzhiyun .default_mode = DEVICE_MODE_NONE,
17*4882a593Smuzhiyun },
18*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_STELLAR] = {
19*4882a593Smuzhiyun .name = "Siano Stellar Digital Receiver",
20*4882a593Smuzhiyun .type = SMS_STELLAR,
21*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
22*4882a593Smuzhiyun },
23*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_NOVA_A] = {
24*4882a593Smuzhiyun .name = "Siano Nova A Digital Receiver",
25*4882a593Smuzhiyun .type = SMS_NOVA_A0,
26*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
27*4882a593Smuzhiyun },
28*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_NOVA_B] = {
29*4882a593Smuzhiyun .name = "Siano Nova B Digital Receiver",
30*4882a593Smuzhiyun .type = SMS_NOVA_B0,
31*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
32*4882a593Smuzhiyun },
33*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_VEGA] = {
34*4882a593Smuzhiyun .name = "Siano Vega Digital Receiver",
35*4882a593Smuzhiyun .type = SMS_VEGA,
36*4882a593Smuzhiyun .default_mode = DEVICE_MODE_CMMB,
37*4882a593Smuzhiyun },
38*4882a593Smuzhiyun [SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT] = {
39*4882a593Smuzhiyun .name = "Hauppauge Catamount",
40*4882a593Smuzhiyun .type = SMS_STELLAR,
41*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_STELLAR,
42*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
43*4882a593Smuzhiyun },
44*4882a593Smuzhiyun [SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A] = {
45*4882a593Smuzhiyun .name = "Hauppauge Okemo-A",
46*4882a593Smuzhiyun .type = SMS_NOVA_A0,
47*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_NOVA_A,
48*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
49*4882a593Smuzhiyun },
50*4882a593Smuzhiyun [SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B] = {
51*4882a593Smuzhiyun .name = "Hauppauge Okemo-B",
52*4882a593Smuzhiyun .type = SMS_NOVA_B0,
53*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_NOVA_B,
54*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
55*4882a593Smuzhiyun },
56*4882a593Smuzhiyun [SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
57*4882a593Smuzhiyun .name = "Hauppauge WinTV MiniStick",
58*4882a593Smuzhiyun .type = SMS_NOVA_B0,
59*4882a593Smuzhiyun .fw[DEVICE_MODE_ISDBT_BDA] = SMS_FW_ISDBT_HCW_55XXX,
60*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX,
61*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
62*4882a593Smuzhiyun .rc_codes = RC_MAP_HAUPPAUGE,
63*4882a593Smuzhiyun .board_cfg.leds_power = 26,
64*4882a593Smuzhiyun .board_cfg.led0 = 27,
65*4882a593Smuzhiyun .board_cfg.led1 = 28,
66*4882a593Smuzhiyun .board_cfg.ir = 9,
67*4882a593Smuzhiyun .led_power = 26,
68*4882a593Smuzhiyun .led_lo = 27,
69*4882a593Smuzhiyun .led_hi = 28,
70*4882a593Smuzhiyun },
71*4882a593Smuzhiyun [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD] = {
72*4882a593Smuzhiyun .name = "Hauppauge WinTV MiniCard",
73*4882a593Smuzhiyun .type = SMS_NOVA_B0,
74*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX,
75*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
76*4882a593Smuzhiyun .lna_ctrl = 29,
77*4882a593Smuzhiyun .board_cfg.foreign_lna0_ctrl = 29,
78*4882a593Smuzhiyun .rf_switch = 17,
79*4882a593Smuzhiyun .board_cfg.rf_switch_uhf = 17,
80*4882a593Smuzhiyun },
81*4882a593Smuzhiyun [SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = {
82*4882a593Smuzhiyun .name = "Hauppauge WinTV MiniCard Rev 2",
83*4882a593Smuzhiyun .type = SMS_NOVA_B0,
84*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX,
85*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
86*4882a593Smuzhiyun .lna_ctrl = -1,
87*4882a593Smuzhiyun },
88*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_NICE] = {
89*4882a593Smuzhiyun .name = "Siano Nice Digital Receiver",
90*4882a593Smuzhiyun .type = SMS_NOVA_B0,
91*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
92*4882a593Smuzhiyun },
93*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_VENICE] = {
94*4882a593Smuzhiyun .name = "Siano Venice Digital Receiver",
95*4882a593Smuzhiyun .type = SMS_VEGA,
96*4882a593Smuzhiyun .default_mode = DEVICE_MODE_CMMB,
97*4882a593Smuzhiyun },
98*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_STELLAR_ROM] = {
99*4882a593Smuzhiyun .name = "Siano Stellar Digital Receiver ROM",
100*4882a593Smuzhiyun .type = SMS_STELLAR,
101*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
102*4882a593Smuzhiyun .intf_num = 1,
103*4882a593Smuzhiyun },
104*4882a593Smuzhiyun [SMS1XXX_BOARD_ZTE_DVB_DATA_CARD] = {
105*4882a593Smuzhiyun .name = "ZTE Data Card Digital Receiver",
106*4882a593Smuzhiyun .type = SMS_NOVA_B0,
107*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
108*4882a593Smuzhiyun .intf_num = 5,
109*4882a593Smuzhiyun .mtu = 15792,
110*4882a593Smuzhiyun },
111*4882a593Smuzhiyun [SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD] = {
112*4882a593Smuzhiyun .name = "ONDA Data Card Digital Receiver",
113*4882a593Smuzhiyun .type = SMS_NOVA_B0,
114*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
115*4882a593Smuzhiyun .intf_num = 6,
116*4882a593Smuzhiyun .mtu = 15792,
117*4882a593Smuzhiyun },
118*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_MING] = {
119*4882a593Smuzhiyun .name = "Siano Ming Digital Receiver",
120*4882a593Smuzhiyun .type = SMS_MING,
121*4882a593Smuzhiyun .default_mode = DEVICE_MODE_CMMB,
122*4882a593Smuzhiyun },
123*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_PELE] = {
124*4882a593Smuzhiyun .name = "Siano Pele Digital Receiver",
125*4882a593Smuzhiyun .type = SMS_PELE,
126*4882a593Smuzhiyun .default_mode = DEVICE_MODE_ISDBT_BDA,
127*4882a593Smuzhiyun },
128*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_RIO] = {
129*4882a593Smuzhiyun .name = "Siano Rio Digital Receiver",
130*4882a593Smuzhiyun .type = SMS_RIO,
131*4882a593Smuzhiyun .default_mode = DEVICE_MODE_ISDBT_BDA,
132*4882a593Smuzhiyun },
133*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_DENVER_1530] = {
134*4882a593Smuzhiyun .name = "Siano Denver (ATSC-M/H) Digital Receiver",
135*4882a593Smuzhiyun .type = SMS_DENVER_1530,
136*4882a593Smuzhiyun .default_mode = DEVICE_MODE_ATSC,
137*4882a593Smuzhiyun .crystal = 2400,
138*4882a593Smuzhiyun },
139*4882a593Smuzhiyun [SMS1XXX_BOARD_SIANO_DENVER_2160] = {
140*4882a593Smuzhiyun .name = "Siano Denver (TDMB) Digital Receiver",
141*4882a593Smuzhiyun .type = SMS_DENVER_2160,
142*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DAB_TDMB,
143*4882a593Smuzhiyun },
144*4882a593Smuzhiyun [SMS1XXX_BOARD_PCTV_77E] = {
145*4882a593Smuzhiyun .name = "Hauppauge microStick 77e",
146*4882a593Smuzhiyun .type = SMS_NOVA_B0,
147*4882a593Smuzhiyun .fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVB_NOVA_12MHZ_B0,
148*4882a593Smuzhiyun .default_mode = DEVICE_MODE_DVBT_BDA,
149*4882a593Smuzhiyun },
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun
sms_get_board(unsigned id)152*4882a593Smuzhiyun struct sms_board *sms_get_board(unsigned id)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun BUG_ON(id >= ARRAY_SIZE(sms_boards));
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun return &sms_boards[id];
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_get_board);
sms_gpio_assign_11xx_default_led_config(struct smscore_config_gpio * p_gpio_config)159*4882a593Smuzhiyun static inline void sms_gpio_assign_11xx_default_led_config(
160*4882a593Smuzhiyun struct smscore_config_gpio *p_gpio_config) {
161*4882a593Smuzhiyun p_gpio_config->direction = SMS_GPIO_DIRECTION_OUTPUT;
162*4882a593Smuzhiyun p_gpio_config->inputcharacteristics =
163*4882a593Smuzhiyun SMS_GPIO_INPUTCHARACTERISTICS_NORMAL;
164*4882a593Smuzhiyun p_gpio_config->outputdriving = SMS_GPIO_OUTPUTDRIVING_4mA;
165*4882a593Smuzhiyun p_gpio_config->outputslewrate = SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS;
166*4882a593Smuzhiyun p_gpio_config->pullupdown = SMS_GPIO_PULLUPDOWN_NONE;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
sms_board_event(struct smscore_device_t * coredev,enum SMS_BOARD_EVENTS gevent)169*4882a593Smuzhiyun int sms_board_event(struct smscore_device_t *coredev,
170*4882a593Smuzhiyun enum SMS_BOARD_EVENTS gevent)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun struct smscore_config_gpio my_gpio_config;
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun sms_gpio_assign_11xx_default_led_config(&my_gpio_config);
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun switch (gevent) {
177*4882a593Smuzhiyun case BOARD_EVENT_POWER_INIT: /* including hotplug */
178*4882a593Smuzhiyun break; /* BOARD_EVENT_BIND */
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun case BOARD_EVENT_POWER_SUSPEND:
181*4882a593Smuzhiyun break; /* BOARD_EVENT_POWER_SUSPEND */
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun case BOARD_EVENT_POWER_RESUME:
184*4882a593Smuzhiyun break; /* BOARD_EVENT_POWER_RESUME */
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun case BOARD_EVENT_BIND:
187*4882a593Smuzhiyun break; /* BOARD_EVENT_BIND */
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun case BOARD_EVENT_SCAN_PROG:
190*4882a593Smuzhiyun break; /* BOARD_EVENT_SCAN_PROG */
191*4882a593Smuzhiyun case BOARD_EVENT_SCAN_COMP:
192*4882a593Smuzhiyun break; /* BOARD_EVENT_SCAN_COMP */
193*4882a593Smuzhiyun case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL:
194*4882a593Smuzhiyun break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */
195*4882a593Smuzhiyun case BOARD_EVENT_FE_LOCK:
196*4882a593Smuzhiyun break; /* BOARD_EVENT_FE_LOCK */
197*4882a593Smuzhiyun case BOARD_EVENT_FE_UNLOCK:
198*4882a593Smuzhiyun break; /* BOARD_EVENT_FE_UNLOCK */
199*4882a593Smuzhiyun case BOARD_EVENT_DEMOD_LOCK:
200*4882a593Smuzhiyun break; /* BOARD_EVENT_DEMOD_LOCK */
201*4882a593Smuzhiyun case BOARD_EVENT_DEMOD_UNLOCK:
202*4882a593Smuzhiyun break; /* BOARD_EVENT_DEMOD_UNLOCK */
203*4882a593Smuzhiyun case BOARD_EVENT_RECEPTION_MAX_4:
204*4882a593Smuzhiyun break; /* BOARD_EVENT_RECEPTION_MAX_4 */
205*4882a593Smuzhiyun case BOARD_EVENT_RECEPTION_3:
206*4882a593Smuzhiyun break; /* BOARD_EVENT_RECEPTION_3 */
207*4882a593Smuzhiyun case BOARD_EVENT_RECEPTION_2:
208*4882a593Smuzhiyun break; /* BOARD_EVENT_RECEPTION_2 */
209*4882a593Smuzhiyun case BOARD_EVENT_RECEPTION_1:
210*4882a593Smuzhiyun break; /* BOARD_EVENT_RECEPTION_1 */
211*4882a593Smuzhiyun case BOARD_EVENT_RECEPTION_LOST_0:
212*4882a593Smuzhiyun break; /* BOARD_EVENT_RECEPTION_LOST_0 */
213*4882a593Smuzhiyun case BOARD_EVENT_MULTIPLEX_OK:
214*4882a593Smuzhiyun break; /* BOARD_EVENT_MULTIPLEX_OK */
215*4882a593Smuzhiyun case BOARD_EVENT_MULTIPLEX_ERRORS:
216*4882a593Smuzhiyun break; /* BOARD_EVENT_MULTIPLEX_ERRORS */
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun default:
219*4882a593Smuzhiyun pr_err("Unknown SMS board event\n");
220*4882a593Smuzhiyun break;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun return 0;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_board_event);
225*4882a593Smuzhiyun
sms_set_gpio(struct smscore_device_t * coredev,int pin,int enable)226*4882a593Smuzhiyun static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun int lvl, ret;
229*4882a593Smuzhiyun u32 gpio;
230*4882a593Smuzhiyun struct smscore_config_gpio gpioconfig = {
231*4882a593Smuzhiyun .direction = SMS_GPIO_DIRECTION_OUTPUT,
232*4882a593Smuzhiyun .pullupdown = SMS_GPIO_PULLUPDOWN_NONE,
233*4882a593Smuzhiyun .inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL,
234*4882a593Smuzhiyun .outputslewrate = SMS_GPIO_OUTPUT_SLEW_RATE_FAST,
235*4882a593Smuzhiyun .outputdriving = SMS_GPIO_OUTPUTDRIVING_S_4mA,
236*4882a593Smuzhiyun };
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun if (pin == 0)
239*4882a593Smuzhiyun return -EINVAL;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun if (pin < 0) {
242*4882a593Smuzhiyun /* inverted gpio */
243*4882a593Smuzhiyun gpio = pin * -1;
244*4882a593Smuzhiyun lvl = enable ? 0 : 1;
245*4882a593Smuzhiyun } else {
246*4882a593Smuzhiyun gpio = pin;
247*4882a593Smuzhiyun lvl = enable ? 1 : 0;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun ret = smscore_configure_gpio(coredev, gpio, &gpioconfig);
251*4882a593Smuzhiyun if (ret < 0)
252*4882a593Smuzhiyun return ret;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun return smscore_set_gpio(coredev, gpio, lvl);
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
sms_board_setup(struct smscore_device_t * coredev)257*4882a593Smuzhiyun int sms_board_setup(struct smscore_device_t *coredev)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun int board_id = smscore_get_board_id(coredev);
260*4882a593Smuzhiyun struct sms_board *board = sms_get_board(board_id);
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun switch (board_id) {
263*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
264*4882a593Smuzhiyun /* turn off all LEDs */
265*4882a593Smuzhiyun sms_set_gpio(coredev, board->led_power, 0);
266*4882a593Smuzhiyun sms_set_gpio(coredev, board->led_hi, 0);
267*4882a593Smuzhiyun sms_set_gpio(coredev, board->led_lo, 0);
268*4882a593Smuzhiyun break;
269*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
270*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
271*4882a593Smuzhiyun /* turn off LNA */
272*4882a593Smuzhiyun sms_set_gpio(coredev, board->lna_ctrl, 0);
273*4882a593Smuzhiyun break;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun return 0;
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_board_setup);
278*4882a593Smuzhiyun
sms_board_power(struct smscore_device_t * coredev,int onoff)279*4882a593Smuzhiyun int sms_board_power(struct smscore_device_t *coredev, int onoff)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun int board_id = smscore_get_board_id(coredev);
282*4882a593Smuzhiyun struct sms_board *board = sms_get_board(board_id);
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun switch (board_id) {
285*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
286*4882a593Smuzhiyun /* power LED */
287*4882a593Smuzhiyun sms_set_gpio(coredev,
288*4882a593Smuzhiyun board->led_power, onoff ? 1 : 0);
289*4882a593Smuzhiyun break;
290*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
291*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
292*4882a593Smuzhiyun /* LNA */
293*4882a593Smuzhiyun if (!onoff)
294*4882a593Smuzhiyun sms_set_gpio(coredev, board->lna_ctrl, 0);
295*4882a593Smuzhiyun break;
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun return 0;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_board_power);
300*4882a593Smuzhiyun
sms_board_led_feedback(struct smscore_device_t * coredev,int led)301*4882a593Smuzhiyun int sms_board_led_feedback(struct smscore_device_t *coredev, int led)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun int board_id = smscore_get_board_id(coredev);
304*4882a593Smuzhiyun struct sms_board *board = sms_get_board(board_id);
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun /* don't touch GPIO if LEDs are already set */
307*4882a593Smuzhiyun if (smscore_led_state(coredev, -1) == led)
308*4882a593Smuzhiyun return 0;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun switch (board_id) {
311*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM:
312*4882a593Smuzhiyun sms_set_gpio(coredev,
313*4882a593Smuzhiyun board->led_lo, (led & SMS_LED_LO) ? 1 : 0);
314*4882a593Smuzhiyun sms_set_gpio(coredev,
315*4882a593Smuzhiyun board->led_hi, (led & SMS_LED_HI) ? 1 : 0);
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun smscore_led_state(coredev, led);
318*4882a593Smuzhiyun break;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun return 0;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_board_led_feedback);
323*4882a593Smuzhiyun
sms_board_lna_control(struct smscore_device_t * coredev,int onoff)324*4882a593Smuzhiyun int sms_board_lna_control(struct smscore_device_t *coredev, int onoff)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun int board_id = smscore_get_board_id(coredev);
327*4882a593Smuzhiyun struct sms_board *board = sms_get_board(board_id);
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun pr_debug("%s: LNA %s\n", __func__, onoff ? "enabled" : "disabled");
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun switch (board_id) {
332*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2:
333*4882a593Smuzhiyun case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD:
334*4882a593Smuzhiyun sms_set_gpio(coredev,
335*4882a593Smuzhiyun board->rf_switch, onoff ? 1 : 0);
336*4882a593Smuzhiyun return sms_set_gpio(coredev,
337*4882a593Smuzhiyun board->lna_ctrl, onoff ? 1 : 0);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun return -EINVAL;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_board_lna_control);
342*4882a593Smuzhiyun
sms_board_load_modules(int id)343*4882a593Smuzhiyun int sms_board_load_modules(int id)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun request_module("smsdvb");
346*4882a593Smuzhiyun return 0;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sms_board_load_modules);
349