1 // SPDX-License-Identifier: GPL-2.0-or-later
3 Driver for Spase SP8870 demodulator
5 Copyright (C) 1999 Juergen Peitz
11 #include <linux/init.h>
12 #include <linux/module.h>
13 #include <linux/device.h>
14 #include <linux/firmware.h>
15 #include <linux/delay.h>
16 #include <linux/string.h>
17 #include <linux/slab.h>
19 #include <media/dvb_frontend.h>
25 struct i2c_adapter* i2c;
27 const struct sp8870_config* config;
29 struct dvb_frontend frontend;
31 /* demodulator private data */
36 #define dprintk(args...) \
38 if (debug) printk(KERN_DEBUG "sp8870: " args); \
41 /* firmware size for sp8870 */
42 #define SP8870_FIRMWARE_SIZE 16382
44 /* starting point for firmware in file 'Sc_main.mc' */
45 #define SP8870_FIRMWARE_OFFSET 0x0A
47 static int sp8870_writereg (struct sp8870_state* state, u16 reg, u16 data)
49 u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
50 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 4 };
53 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
54 dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __func__, err, reg, data);
61 static int sp8870_readreg (struct sp8870_state* state, u16 reg)
64 u8 b0 [] = { reg >> 8 , reg & 0xff };
66 struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 2 },
67 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 } };
69 ret = i2c_transfer (state->i2c, msg, 2);
72 dprintk("%s: readreg error (ret == %i)\n", __func__, ret);
76 return (b1[0] << 8 | b1[1]);
79 static int sp8870_firmware_upload (struct sp8870_state* state, const struct firmware *fw)
82 const char *fw_buf = fw->data;
88 dprintk ("%s: ...\n", __func__);
90 if (fw->size < SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET)
93 // system controller stop
94 sp8870_writereg(state, 0x0F00, 0x0000);
96 // instruction RAM register hiword
97 sp8870_writereg(state, 0x8F08, ((SP8870_FIRMWARE_SIZE / 2) & 0xFFFF));
99 // instruction RAM MWR
100 sp8870_writereg(state, 0x8F0A, ((SP8870_FIRMWARE_SIZE / 2) >> 16));
102 // do firmware upload
103 fw_pos = SP8870_FIRMWARE_OFFSET;
104 while (fw_pos < SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET){
105 tx_len = (fw_pos <= SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET - 252) ? 252 : SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET - fw_pos;
106 // write register 0xCF0A
109 memcpy(&tx_buf[2], fw_buf + fw_pos, tx_len);
110 msg.addr = state->config->demod_address;
113 msg.len = tx_len + 2;
114 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
115 printk("%s: firmware upload failed!\n", __func__);
116 printk ("%s: i2c error (err == %i)\n", __func__, err);
122 dprintk ("%s: done!\n", __func__);
126 static void sp8870_microcontroller_stop (struct sp8870_state* state)
128 sp8870_writereg(state, 0x0F08, 0x000);
129 sp8870_writereg(state, 0x0F09, 0x000);
131 // microcontroller STOP
132 sp8870_writereg(state, 0x0F00, 0x000);
135 static void sp8870_microcontroller_start (struct sp8870_state* state)
137 sp8870_writereg(state, 0x0F08, 0x000);
138 sp8870_writereg(state, 0x0F09, 0x000);
140 // microcontroller START
141 sp8870_writereg(state, 0x0F00, 0x001);
142 // not documented but if we don't read 0x0D01 out here
143 // we don't get a correct data valid signal
144 sp8870_readreg(state, 0x0D01);
147 static int sp8870_read_data_valid_signal(struct sp8870_state* state)
149 return (sp8870_readreg(state, 0x0D02) > 0);
152 static int configure_reg0xc05 (struct dtv_frontend_properties *p, u16 *reg0xc05)
154 int known_parameters = 1;
158 switch (p->modulation) {
162 *reg0xc05 |= (1 << 10);
165 *reg0xc05 |= (2 << 10);
168 known_parameters = 0;
174 switch (p->hierarchy) {
178 *reg0xc05 |= (1 << 7);
181 *reg0xc05 |= (2 << 7);
184 *reg0xc05 |= (3 << 7);
187 known_parameters = 0;
193 switch (p->code_rate_HP) {
197 *reg0xc05 |= (1 << 3);
200 *reg0xc05 |= (2 << 3);
203 *reg0xc05 |= (3 << 3);
206 *reg0xc05 |= (4 << 3);
209 known_parameters = 0;
215 if (known_parameters)
216 *reg0xc05 |= (2 << 1); /* use specified parameters */
218 *reg0xc05 |= (1 << 1); /* enable autoprobing */
223 static int sp8870_wake_up(struct sp8870_state* state)
225 // enable TS output and interface pins
226 return sp8870_writereg(state, 0xC18, 0x00D);
229 static int sp8870_set_frontend_parameters(struct dvb_frontend *fe)
231 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
232 struct sp8870_state* state = fe->demodulator_priv;
236 if ((err = configure_reg0xc05(p, ®0xc05)))
239 // system controller stop
240 sp8870_microcontroller_stop(state);
242 // set tuner parameters
243 if (fe->ops.tuner_ops.set_params) {
244 fe->ops.tuner_ops.set_params(fe);
245 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
248 // sample rate correction bit [23..17]
249 sp8870_writereg(state, 0x0319, 0x000A);
251 // sample rate correction bit [16..0]
252 sp8870_writereg(state, 0x031A, 0x0AAB);
254 // integer carrier offset
255 sp8870_writereg(state, 0x0309, 0x0400);
257 // fractional carrier offset
258 sp8870_writereg(state, 0x030A, 0x0000);
260 // filter for 6/7/8 Mhz channel
261 if (p->bandwidth_hz == 6000000)
262 sp8870_writereg(state, 0x0311, 0x0002);
263 else if (p->bandwidth_hz == 7000000)
264 sp8870_writereg(state, 0x0311, 0x0001);
266 sp8870_writereg(state, 0x0311, 0x0000);
268 // scan order: 2k first = 0x0000, 8k first = 0x0001
269 if (p->transmission_mode == TRANSMISSION_MODE_2K)
270 sp8870_writereg(state, 0x0338, 0x0000);
272 sp8870_writereg(state, 0x0338, 0x0001);
274 sp8870_writereg(state, 0xc05, reg0xc05);
276 // read status reg in order to clear pending irqs
277 err = sp8870_readreg(state, 0x200);
281 // system controller start
282 sp8870_microcontroller_start(state);
287 static int sp8870_init (struct dvb_frontend* fe)
289 struct sp8870_state* state = fe->demodulator_priv;
290 const struct firmware *fw = NULL;
292 sp8870_wake_up(state);
293 if (state->initialised) return 0;
294 state->initialised = 1;
296 dprintk ("%s\n", __func__);
299 /* request the firmware, this will block until someone uploads it */
300 printk("sp8870: waiting for firmware upload (%s)...\n", "/*(DEBLOBBED)*/");
301 if (state->config->request_firmware(fe, &fw, "/*(DEBLOBBED)*/")) {
302 printk("sp8870: no firmware upload (timeout or file not found?)\n");
306 if (sp8870_firmware_upload(state, fw)) {
307 printk("sp8870: writing firmware to device failed\n");
308 release_firmware(fw);
311 release_firmware(fw);
312 printk("sp8870: firmware upload complete\n");
314 /* enable TS output and interface pins */
315 sp8870_writereg(state, 0xc18, 0x00d);
317 // system controller stop
318 sp8870_microcontroller_stop(state);
321 sp8870_writereg(state, 0x0301, 0x0003);
323 // Reed Solomon parity bytes passed to output
324 sp8870_writereg(state, 0x0C13, 0x0001);
326 // MPEG clock is suppressed if no valid data
327 sp8870_writereg(state, 0x0C14, 0x0001);
329 /* bit 0x010: enable data valid signal */
330 sp8870_writereg(state, 0x0D00, 0x010);
331 sp8870_writereg(state, 0x0D01, 0x000);
336 static int sp8870_read_status(struct dvb_frontend *fe,
337 enum fe_status *fe_status)
339 struct sp8870_state* state = fe->demodulator_priv;
345 status = sp8870_readreg (state, 0x0200);
349 signal = sp8870_readreg (state, 0x0303);
354 *fe_status |= FE_HAS_SIGNAL;
356 *fe_status |= FE_HAS_SYNC;
358 *fe_status |= FE_HAS_LOCK | FE_HAS_CARRIER | FE_HAS_VITERBI;
363 static int sp8870_read_ber (struct dvb_frontend* fe, u32 * ber)
365 struct sp8870_state* state = fe->demodulator_priv;
371 ret = sp8870_readreg(state, 0xC08);
377 ret = sp8870_readreg(state, 0xC07);
390 static int sp8870_read_signal_strength(struct dvb_frontend* fe, u16 * signal)
392 struct sp8870_state* state = fe->demodulator_priv;
398 ret = sp8870_readreg (state, 0x306);
404 ret = sp8870_readreg (state, 0x303);
411 *signal = 0xFFFF - tmp;
416 static int sp8870_read_uncorrected_blocks (struct dvb_frontend* fe, u32* ublocks)
418 struct sp8870_state* state = fe->demodulator_priv;
423 ret = sp8870_readreg(state, 0xC0C);
435 /* number of trials to recover from lockup */
437 /* maximum checks for data valid signal */
438 #define MAXCHECKS 100
440 /* only for debugging: counter for detected lockups */
442 /* only for debugging: counter for channel switches */
445 static int sp8870_set_frontend(struct dvb_frontend *fe)
447 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
448 struct sp8870_state* state = fe->demodulator_priv;
451 The firmware of the sp8870 sometimes locks up after setting frontend parameters.
452 We try to detect this by checking the data valid signal.
453 If it is not set after MAXCHECKS we try to recover the lockup by setting
454 the frontend parameters again.
462 dprintk("%s: frequency = %i\n", __func__, p->frequency);
464 for (trials = 1; trials <= MAXTRIALS; trials++) {
466 err = sp8870_set_frontend_parameters(fe);
470 for (check_count = 0; check_count < MAXCHECKS; check_count++) {
471 // valid = ((sp8870_readreg(i2c, 0x0200) & 4) == 0);
472 valid = sp8870_read_data_valid_signal(state);
474 dprintk("%s: delay = %i usec\n",
475 __func__, check_count * 10);
485 printk("%s: firmware crash!!!!!!\n", __func__);
492 printk("%s: firmware lockup!!!\n", __func__);
493 printk("%s: recovered after %i trial(s))\n", __func__, trials - 1);
498 printk("%s: switches = %i lockups = %i\n", __func__, switches, lockups);
504 static int sp8870_sleep(struct dvb_frontend* fe)
506 struct sp8870_state* state = fe->demodulator_priv;
508 // tristate TS output and disable interface pins
509 return sp8870_writereg(state, 0xC18, 0x000);
512 static int sp8870_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
514 fesettings->min_delay_ms = 350;
515 fesettings->step_size = 0;
516 fesettings->max_drift = 0;
520 static int sp8870_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
522 struct sp8870_state* state = fe->demodulator_priv;
525 return sp8870_writereg(state, 0x206, 0x001);
527 return sp8870_writereg(state, 0x206, 0x000);
531 static void sp8870_release(struct dvb_frontend* fe)
533 struct sp8870_state* state = fe->demodulator_priv;
537 static const struct dvb_frontend_ops sp8870_ops;
539 struct dvb_frontend* sp8870_attach(const struct sp8870_config* config,
540 struct i2c_adapter* i2c)
542 struct sp8870_state* state = NULL;
544 /* allocate memory for the internal state */
545 state = kzalloc(sizeof(struct sp8870_state), GFP_KERNEL);
546 if (state == NULL) goto error;
548 /* setup the state */
549 state->config = config;
551 state->initialised = 0;
553 /* check if the demod is there */
554 if (sp8870_readreg(state, 0x0200) < 0) goto error;
556 /* create dvb_frontend */
557 memcpy(&state->frontend.ops, &sp8870_ops, sizeof(struct dvb_frontend_ops));
558 state->frontend.demodulator_priv = state;
559 return &state->frontend;
566 static const struct dvb_frontend_ops sp8870_ops = {
567 .delsys = { SYS_DVBT },
569 .name = "Spase SP8870 DVB-T",
570 .frequency_min_hz = 470 * MHz,
571 .frequency_max_hz = 860 * MHz,
572 .frequency_stepsize_hz = 166666,
573 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
574 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 |
575 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
576 FE_CAN_QPSK | FE_CAN_QAM_16 |
577 FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
578 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER
581 .release = sp8870_release,
584 .sleep = sp8870_sleep,
585 .i2c_gate_ctrl = sp8870_i2c_gate_ctrl,
587 .set_frontend = sp8870_set_frontend,
588 .get_tune_settings = sp8870_get_tune_settings,
590 .read_status = sp8870_read_status,
591 .read_ber = sp8870_read_ber,
592 .read_signal_strength = sp8870_read_signal_strength,
593 .read_ucblocks = sp8870_read_uncorrected_blocks,
596 module_param(debug, int, 0644);
597 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
599 MODULE_DESCRIPTION("Spase SP8870 DVB-T Demodulator driver");
600 MODULE_AUTHOR("Juergen Peitz");
601 MODULE_LICENSE("GPL");
603 EXPORT_SYMBOL(sp8870_attach);