FRV: Use generic show_interrupts()
[cris-mirror.git] / drivers / media / dvb / frontends / stv0288.c
blobe3fe17fd96fb361744fa4b9824dd16259b031e63
1 /*
2 Driver for ST STV0288 demodulator
3 Copyright (C) 2006 Georg Acher, BayCom GmbH, acher (at) baycom (dot) de
4 for Reel Multimedia
5 Copyright (C) 2008 TurboSight.com, Bob Liu <bob@turbosight.com>
6 Copyright (C) 2008 Igor M. Liplianin <liplianin@me.by>
7 Removed stb6000 specific tuner code and revised some
8 procedures.
9 2010-09-01 Josef Pavlik <josef@pavlik.it>
10 Fixed diseqc_msg, diseqc_burst and set_tone problems
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include <linux/init.h>
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/string.h>
32 #include <linux/slab.h>
33 #include <linux/jiffies.h>
34 #include <asm/div64.h>
36 #include "dvb_frontend.h"
37 #include "stv0288.h"
39 struct stv0288_state {
40 struct i2c_adapter *i2c;
41 const struct stv0288_config *config;
42 struct dvb_frontend frontend;
44 u8 initialised:1;
45 u32 tuner_frequency;
46 u32 symbol_rate;
47 fe_code_rate_t fec_inner;
48 int errmode;
51 #define STATUS_BER 0
52 #define STATUS_UCBLOCKS 1
54 static int debug;
55 static int debug_legacy_dish_switch;
56 #define dprintk(args...) \
57 do { \
58 if (debug) \
59 printk(KERN_DEBUG "stv0288: " args); \
60 } while (0)
63 static int stv0288_writeregI(struct stv0288_state *state, u8 reg, u8 data)
65 int ret;
66 u8 buf[] = { reg, data };
67 struct i2c_msg msg = {
68 .addr = state->config->demod_address,
69 .flags = 0,
70 .buf = buf,
71 .len = 2
74 ret = i2c_transfer(state->i2c, &msg, 1);
76 if (ret != 1)
77 dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, "
78 "ret == %i)\n", __func__, reg, data, ret);
80 return (ret != 1) ? -EREMOTEIO : 0;
83 static int stv0288_write(struct dvb_frontend *fe, const u8 buf[], int len)
85 struct stv0288_state *state = fe->demodulator_priv;
87 if (len != 2)
88 return -EINVAL;
90 return stv0288_writeregI(state, buf[0], buf[1]);
93 static u8 stv0288_readreg(struct stv0288_state *state, u8 reg)
95 int ret;
96 u8 b0[] = { reg };
97 u8 b1[] = { 0 };
98 struct i2c_msg msg[] = {
100 .addr = state->config->demod_address,
101 .flags = 0,
102 .buf = b0,
103 .len = 1
104 }, {
105 .addr = state->config->demod_address,
106 .flags = I2C_M_RD,
107 .buf = b1,
108 .len = 1
112 ret = i2c_transfer(state->i2c, msg, 2);
114 if (ret != 2)
115 dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
116 __func__, reg, ret);
118 return b1[0];
121 static int stv0288_set_symbolrate(struct dvb_frontend *fe, u32 srate)
123 struct stv0288_state *state = fe->demodulator_priv;
124 unsigned int temp;
125 unsigned char b[3];
127 if ((srate < 1000000) || (srate > 45000000))
128 return -EINVAL;
130 temp = (unsigned int)srate / 1000;
132 temp = temp * 32768;
133 temp = temp / 25;
134 temp = temp / 125;
135 b[0] = (unsigned char)((temp >> 12) & 0xff);
136 b[1] = (unsigned char)((temp >> 4) & 0xff);
137 b[2] = (unsigned char)((temp << 4) & 0xf0);
138 stv0288_writeregI(state, 0x28, 0x80); /* SFRH */
139 stv0288_writeregI(state, 0x29, 0); /* SFRM */
140 stv0288_writeregI(state, 0x2a, 0); /* SFRL */
142 stv0288_writeregI(state, 0x28, b[0]);
143 stv0288_writeregI(state, 0x29, b[1]);
144 stv0288_writeregI(state, 0x2a, b[2]);
145 dprintk("stv0288: stv0288_set_symbolrate\n");
147 return 0;
150 static int stv0288_send_diseqc_msg(struct dvb_frontend *fe,
151 struct dvb_diseqc_master_cmd *m)
153 struct stv0288_state *state = fe->demodulator_priv;
155 int i;
157 dprintk("%s\n", __func__);
159 stv0288_writeregI(state, 0x09, 0);
160 msleep(30);
161 stv0288_writeregI(state, 0x05, 0x12);/* modulated mode, single shot */
163 for (i = 0; i < m->msg_len; i++) {
164 if (stv0288_writeregI(state, 0x06, m->msg[i]))
165 return -EREMOTEIO;
167 msleep(m->msg_len*12);
168 return 0;
171 static int stv0288_send_diseqc_burst(struct dvb_frontend *fe,
172 fe_sec_mini_cmd_t burst)
174 struct stv0288_state *state = fe->demodulator_priv;
176 dprintk("%s\n", __func__);
178 if (stv0288_writeregI(state, 0x05, 0x03))/* burst mode, single shot */
179 return -EREMOTEIO;
181 if (stv0288_writeregI(state, 0x06, burst == SEC_MINI_A ? 0x00 : 0xff))
182 return -EREMOTEIO;
184 msleep(15);
185 if (stv0288_writeregI(state, 0x05, 0x12))
186 return -EREMOTEIO;
188 return 0;
191 static int stv0288_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
193 struct stv0288_state *state = fe->demodulator_priv;
195 switch (tone) {
196 case SEC_TONE_ON:
197 if (stv0288_writeregI(state, 0x05, 0x10))/* cont carrier */
198 return -EREMOTEIO;
199 break;
201 case SEC_TONE_OFF:
202 if (stv0288_writeregI(state, 0x05, 0x12))/* burst mode off*/
203 return -EREMOTEIO;
204 break;
206 default:
207 return -EINVAL;
209 return 0;
212 static u8 stv0288_inittab[] = {
213 0x01, 0x15,
214 0x02, 0x20,
215 0x09, 0x0,
216 0x0a, 0x4,
217 0x0b, 0x0,
218 0x0c, 0x0,
219 0x0d, 0x0,
220 0x0e, 0xd4,
221 0x0f, 0x30,
222 0x11, 0x80,
223 0x12, 0x03,
224 0x13, 0x48,
225 0x14, 0x84,
226 0x15, 0x45,
227 0x16, 0xb7,
228 0x17, 0x9c,
229 0x18, 0x0,
230 0x19, 0xa6,
231 0x1a, 0x88,
232 0x1b, 0x8f,
233 0x1c, 0xf0,
234 0x20, 0x0b,
235 0x21, 0x54,
236 0x22, 0x0,
237 0x23, 0x0,
238 0x2b, 0xff,
239 0x2c, 0xf7,
240 0x30, 0x0,
241 0x31, 0x1e,
242 0x32, 0x14,
243 0x33, 0x0f,
244 0x34, 0x09,
245 0x35, 0x0c,
246 0x36, 0x05,
247 0x37, 0x2f,
248 0x38, 0x16,
249 0x39, 0xbe,
250 0x3a, 0x0,
251 0x3b, 0x13,
252 0x3c, 0x11,
253 0x3d, 0x30,
254 0x40, 0x63,
255 0x41, 0x04,
256 0x42, 0x60,
257 0x43, 0x00,
258 0x44, 0x00,
259 0x45, 0x00,
260 0x46, 0x00,
261 0x47, 0x00,
262 0x4a, 0x00,
263 0x50, 0x10,
264 0x51, 0x38,
265 0x52, 0x21,
266 0x58, 0x54,
267 0x59, 0x86,
268 0x5a, 0x0,
269 0x5b, 0x9b,
270 0x5c, 0x08,
271 0x5d, 0x7f,
272 0x5e, 0x0,
273 0x5f, 0xff,
274 0x70, 0x0,
275 0x71, 0x0,
276 0x72, 0x0,
277 0x74, 0x0,
278 0x75, 0x0,
279 0x76, 0x0,
280 0x81, 0x0,
281 0x82, 0x3f,
282 0x83, 0x3f,
283 0x84, 0x0,
284 0x85, 0x0,
285 0x88, 0x0,
286 0x89, 0x0,
287 0x8a, 0x0,
288 0x8b, 0x0,
289 0x8c, 0x0,
290 0x90, 0x0,
291 0x91, 0x0,
292 0x92, 0x0,
293 0x93, 0x0,
294 0x94, 0x1c,
295 0x97, 0x0,
296 0xa0, 0x48,
297 0xa1, 0x0,
298 0xb0, 0xb8,
299 0xb1, 0x3a,
300 0xb2, 0x10,
301 0xb3, 0x82,
302 0xb4, 0x80,
303 0xb5, 0x82,
304 0xb6, 0x82,
305 0xb7, 0x82,
306 0xb8, 0x20,
307 0xb9, 0x0,
308 0xf0, 0x0,
309 0xf1, 0x0,
310 0xf2, 0xc0,
311 0x51, 0x36,
312 0x52, 0x09,
313 0x53, 0x94,
314 0x54, 0x62,
315 0x55, 0x29,
316 0x56, 0x64,
317 0x57, 0x2b,
318 0xff, 0xff,
321 static int stv0288_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t volt)
323 dprintk("%s: %s\n", __func__,
324 volt == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
325 volt == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??");
327 return 0;
330 static int stv0288_init(struct dvb_frontend *fe)
332 struct stv0288_state *state = fe->demodulator_priv;
333 int i;
334 u8 reg;
335 u8 val;
337 dprintk("stv0288: init chip\n");
338 stv0288_writeregI(state, 0x41, 0x04);
339 msleep(50);
341 /* we have default inittab */
342 if (state->config->inittab == NULL) {
343 for (i = 0; !(stv0288_inittab[i] == 0xff &&
344 stv0288_inittab[i + 1] == 0xff); i += 2)
345 stv0288_writeregI(state, stv0288_inittab[i],
346 stv0288_inittab[i + 1]);
347 } else {
348 for (i = 0; ; i += 2) {
349 reg = state->config->inittab[i];
350 val = state->config->inittab[i+1];
351 if (reg == 0xff && val == 0xff)
352 break;
353 stv0288_writeregI(state, reg, val);
356 return 0;
359 static int stv0288_read_status(struct dvb_frontend *fe, fe_status_t *status)
361 struct stv0288_state *state = fe->demodulator_priv;
363 u8 sync = stv0288_readreg(state, 0x24);
364 if (sync == 255)
365 sync = 0;
367 dprintk("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __func__, sync);
369 *status = 0;
370 if (sync & 0x80)
371 *status |= FE_HAS_CARRIER | FE_HAS_SIGNAL;
372 if (sync & 0x10)
373 *status |= FE_HAS_VITERBI;
374 if (sync & 0x08) {
375 *status |= FE_HAS_LOCK;
376 dprintk("stv0288 has locked\n");
379 return 0;
382 static int stv0288_read_ber(struct dvb_frontend *fe, u32 *ber)
384 struct stv0288_state *state = fe->demodulator_priv;
386 if (state->errmode != STATUS_BER)
387 return 0;
388 *ber = (stv0288_readreg(state, 0x26) << 8) |
389 stv0288_readreg(state, 0x27);
390 dprintk("stv0288_read_ber %d\n", *ber);
392 return 0;
396 static int stv0288_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
398 struct stv0288_state *state = fe->demodulator_priv;
400 s32 signal = 0xffff - ((stv0288_readreg(state, 0x10) << 8));
403 signal = signal * 5 / 4;
404 *strength = (signal > 0xffff) ? 0xffff : (signal < 0) ? 0 : signal;
405 dprintk("stv0288_read_signal_strength %d\n", *strength);
407 return 0;
409 static int stv0288_sleep(struct dvb_frontend *fe)
411 struct stv0288_state *state = fe->demodulator_priv;
413 stv0288_writeregI(state, 0x41, 0x84);
414 state->initialised = 0;
416 return 0;
418 static int stv0288_read_snr(struct dvb_frontend *fe, u16 *snr)
420 struct stv0288_state *state = fe->demodulator_priv;
422 s32 xsnr = 0xffff - ((stv0288_readreg(state, 0x2d) << 8)
423 | stv0288_readreg(state, 0x2e));
424 xsnr = 3 * (xsnr - 0xa100);
425 *snr = (xsnr > 0xffff) ? 0xffff : (xsnr < 0) ? 0 : xsnr;
426 dprintk("stv0288_read_snr %d\n", *snr);
428 return 0;
431 static int stv0288_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
433 struct stv0288_state *state = fe->demodulator_priv;
435 if (state->errmode != STATUS_BER)
436 return 0;
437 *ucblocks = (stv0288_readreg(state, 0x26) << 8) |
438 stv0288_readreg(state, 0x27);
439 dprintk("stv0288_read_ber %d\n", *ucblocks);
441 return 0;
444 static int stv0288_set_property(struct dvb_frontend *fe, struct dtv_property *p)
446 dprintk("%s(..)\n", __func__);
447 return 0;
450 static int stv0288_get_property(struct dvb_frontend *fe, struct dtv_property *p)
452 dprintk("%s(..)\n", __func__);
453 return 0;
456 static int stv0288_set_frontend(struct dvb_frontend *fe,
457 struct dvb_frontend_parameters *dfp)
459 struct stv0288_state *state = fe->demodulator_priv;
460 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
462 char tm;
463 unsigned char tda[3];
465 dprintk("%s : FE_SET_FRONTEND\n", __func__);
467 if (c->delivery_system != SYS_DVBS) {
468 dprintk("%s: unsupported delivery "
469 "system selected (%d)\n",
470 __func__, c->delivery_system);
471 return -EOPNOTSUPP;
474 if (state->config->set_ts_params)
475 state->config->set_ts_params(fe, 0);
477 /* only frequency & symbol_rate are used for tuner*/
478 dfp->frequency = c->frequency;
479 dfp->u.qpsk.symbol_rate = c->symbol_rate;
480 if (fe->ops.tuner_ops.set_params) {
481 fe->ops.tuner_ops.set_params(fe, dfp);
482 if (fe->ops.i2c_gate_ctrl)
483 fe->ops.i2c_gate_ctrl(fe, 0);
486 udelay(10);
487 stv0288_set_symbolrate(fe, c->symbol_rate);
488 /* Carrier lock control register */
489 stv0288_writeregI(state, 0x15, 0xc5);
491 tda[0] = 0x2b; /* CFRM */
492 tda[2] = 0x0; /* CFRL */
493 for (tm = -6; tm < 7;) {
494 /* Viterbi status */
495 if (stv0288_readreg(state, 0x24) & 0x8)
496 break;
498 tda[2] += 40;
499 if (tda[2] < 40)
500 tm++;
501 tda[1] = (unsigned char)tm;
502 stv0288_writeregI(state, 0x2b, tda[1]);
503 stv0288_writeregI(state, 0x2c, tda[2]);
504 udelay(30);
507 state->tuner_frequency = c->frequency;
508 state->fec_inner = FEC_AUTO;
509 state->symbol_rate = c->symbol_rate;
511 return 0;
514 static int stv0288_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
516 struct stv0288_state *state = fe->demodulator_priv;
518 if (enable)
519 stv0288_writeregI(state, 0x01, 0xb5);
520 else
521 stv0288_writeregI(state, 0x01, 0x35);
523 udelay(1);
525 return 0;
528 static void stv0288_release(struct dvb_frontend *fe)
530 struct stv0288_state *state = fe->demodulator_priv;
531 kfree(state);
534 static struct dvb_frontend_ops stv0288_ops = {
536 .info = {
537 .name = "ST STV0288 DVB-S",
538 .type = FE_QPSK,
539 .frequency_min = 950000,
540 .frequency_max = 2150000,
541 .frequency_stepsize = 1000, /* kHz for QPSK frontends */
542 .frequency_tolerance = 0,
543 .symbol_rate_min = 1000000,
544 .symbol_rate_max = 45000000,
545 .symbol_rate_tolerance = 500, /* ppm */
546 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
547 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
548 FE_CAN_QPSK |
549 FE_CAN_FEC_AUTO
552 .release = stv0288_release,
553 .init = stv0288_init,
554 .sleep = stv0288_sleep,
555 .write = stv0288_write,
556 .i2c_gate_ctrl = stv0288_i2c_gate_ctrl,
557 .read_status = stv0288_read_status,
558 .read_ber = stv0288_read_ber,
559 .read_signal_strength = stv0288_read_signal_strength,
560 .read_snr = stv0288_read_snr,
561 .read_ucblocks = stv0288_read_ucblocks,
562 .diseqc_send_master_cmd = stv0288_send_diseqc_msg,
563 .diseqc_send_burst = stv0288_send_diseqc_burst,
564 .set_tone = stv0288_set_tone,
565 .set_voltage = stv0288_set_voltage,
567 .set_property = stv0288_set_property,
568 .get_property = stv0288_get_property,
569 .set_frontend = stv0288_set_frontend,
572 struct dvb_frontend *stv0288_attach(const struct stv0288_config *config,
573 struct i2c_adapter *i2c)
575 struct stv0288_state *state = NULL;
576 int id;
578 /* allocate memory for the internal state */
579 state = kzalloc(sizeof(struct stv0288_state), GFP_KERNEL);
580 if (state == NULL)
581 goto error;
583 /* setup the state */
584 state->config = config;
585 state->i2c = i2c;
586 state->initialised = 0;
587 state->tuner_frequency = 0;
588 state->symbol_rate = 0;
589 state->fec_inner = 0;
590 state->errmode = STATUS_BER;
592 stv0288_writeregI(state, 0x41, 0x04);
593 msleep(200);
594 id = stv0288_readreg(state, 0x00);
595 dprintk("stv0288 id %x\n", id);
597 /* register 0x00 contains 0x11 for STV0288 */
598 if (id != 0x11)
599 goto error;
601 /* create dvb_frontend */
602 memcpy(&state->frontend.ops, &stv0288_ops,
603 sizeof(struct dvb_frontend_ops));
604 state->frontend.demodulator_priv = state;
605 return &state->frontend;
607 error:
608 kfree(state);
610 return NULL;
612 EXPORT_SYMBOL(stv0288_attach);
614 module_param(debug_legacy_dish_switch, int, 0444);
615 MODULE_PARM_DESC(debug_legacy_dish_switch,
616 "Enable timing analysis for Dish Network legacy switches");
618 module_param(debug, int, 0644);
619 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
621 MODULE_DESCRIPTION("ST STV0288 DVB Demodulator driver");
622 MODULE_AUTHOR("Georg Acher, Bob Liu, Igor liplianin");
623 MODULE_LICENSE("GPL");