Merge tag 'io_uring-5.11-2021-01-16' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / drivers / media / dvb-frontends / dib9000.c
blob04d92d6142797e658ca0747f330f5c935af2a2c3
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
5 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
6 */
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/kernel.h>
11 #include <linux/i2c.h>
12 #include <linux/mutex.h>
14 #include <media/dvb_math.h>
15 #include <media/dvb_frontend.h>
17 #include "dib9000.h"
18 #include "dibx000_common.h"
20 static int debug;
21 module_param(debug, int, 0644);
22 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
24 #define dprintk(fmt, arg...) do { \
25 if (debug) \
26 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
27 __func__, ##arg); \
28 } while (0)
30 #define MAX_NUMBER_OF_FRONTENDS 6
32 struct i2c_device {
33 struct i2c_adapter *i2c_adap;
34 u8 i2c_addr;
35 u8 *i2c_read_buffer;
36 u8 *i2c_write_buffer;
39 struct dib9000_pid_ctrl {
40 #define DIB9000_PID_FILTER_CTRL 0
41 #define DIB9000_PID_FILTER 1
42 u8 cmd;
43 u8 id;
44 u16 pid;
45 u8 onoff;
48 struct dib9000_state {
49 struct i2c_device i2c;
51 struct dibx000_i2c_master i2c_master;
52 struct i2c_adapter tuner_adap;
53 struct i2c_adapter component_bus;
55 u16 revision;
56 u8 reg_offs;
58 enum frontend_tune_state tune_state;
59 u32 status;
60 struct dvb_frontend_parametersContext channel_status;
62 u8 fe_id;
64 #define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
65 u16 gpio_dir;
66 #define DIB9000_GPIO_DEFAULT_VALUES 0x0000
67 u16 gpio_val;
68 #define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
69 u16 gpio_pwm_pos;
71 union { /* common for all chips */
72 struct {
73 u8 mobile_mode:1;
74 } host;
76 struct {
77 struct dib9000_fe_memory_map {
78 u16 addr;
79 u16 size;
80 } fe_mm[18];
81 u8 memcmd;
83 struct mutex mbx_if_lock; /* to protect read/write operations */
84 struct mutex mbx_lock; /* to protect the whole mailbox handling */
86 struct mutex mem_lock; /* to protect the memory accesses */
87 struct mutex mem_mbx_lock; /* to protect the memory-based mailbox */
89 #define MBX_MAX_WORDS (256 - 200 - 2)
90 #define DIB9000_MSG_CACHE_SIZE 2
91 u16 message_cache[DIB9000_MSG_CACHE_SIZE][MBX_MAX_WORDS];
92 u8 fw_is_running;
93 } risc;
94 } platform;
96 union { /* common for all platforms */
97 struct {
98 struct dib9000_config cfg;
99 } d9;
100 } chip;
102 struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
103 u16 component_bus_speed;
105 /* for the I2C transfer */
106 struct i2c_msg msg[2];
107 u8 i2c_write_buffer[255];
108 u8 i2c_read_buffer[255];
109 struct mutex demod_lock;
110 u8 get_frontend_internal;
111 struct dib9000_pid_ctrl pid_ctrl[10];
112 s8 pid_ctrl_index; /* -1: empty list; -2: do not use the list */
115 static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0, 0, 0
120 enum dib9000_power_mode {
121 DIB9000_POWER_ALL = 0,
123 DIB9000_POWER_NO,
124 DIB9000_POWER_INTERF_ANALOG_AGC,
125 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD,
126 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD,
127 DIB9000_POWER_INTERFACE_ONLY,
130 enum dib9000_out_messages {
131 OUT_MSG_HBM_ACK,
132 OUT_MSG_HOST_BUF_FAIL,
133 OUT_MSG_REQ_VERSION,
134 OUT_MSG_BRIDGE_I2C_W,
135 OUT_MSG_BRIDGE_I2C_R,
136 OUT_MSG_BRIDGE_APB_W,
137 OUT_MSG_BRIDGE_APB_R,
138 OUT_MSG_SCAN_CHANNEL,
139 OUT_MSG_MONIT_DEMOD,
140 OUT_MSG_CONF_GPIO,
141 OUT_MSG_DEBUG_HELP,
142 OUT_MSG_SUBBAND_SEL,
143 OUT_MSG_ENABLE_TIME_SLICE,
144 OUT_MSG_FE_FW_DL,
145 OUT_MSG_FE_CHANNEL_SEARCH,
146 OUT_MSG_FE_CHANNEL_TUNE,
147 OUT_MSG_FE_SLEEP,
148 OUT_MSG_FE_SYNC,
149 OUT_MSG_CTL_MONIT,
151 OUT_MSG_CONF_SVC,
152 OUT_MSG_SET_HBM,
153 OUT_MSG_INIT_DEMOD,
154 OUT_MSG_ENABLE_DIVERSITY,
155 OUT_MSG_SET_OUTPUT_MODE,
156 OUT_MSG_SET_PRIORITARY_CHANNEL,
157 OUT_MSG_ACK_FRG,
158 OUT_MSG_INIT_PMU,
161 enum dib9000_in_messages {
162 IN_MSG_DATA,
163 IN_MSG_FRAME_INFO,
164 IN_MSG_CTL_MONIT,
165 IN_MSG_ACK_FREE_ITEM,
166 IN_MSG_DEBUG_BUF,
167 IN_MSG_MPE_MONITOR,
168 IN_MSG_RAWTS_MONITOR,
169 IN_MSG_END_BRIDGE_I2C_RW,
170 IN_MSG_END_BRIDGE_APB_RW,
171 IN_MSG_VERSION,
172 IN_MSG_END_OF_SCAN,
173 IN_MSG_MONIT_DEMOD,
174 IN_MSG_ERROR,
175 IN_MSG_FE_FW_DL_DONE,
176 IN_MSG_EVENT,
177 IN_MSG_ACK_CHANGE_SVC,
178 IN_MSG_HBM_PROF,
181 /* memory_access requests */
182 #define FE_MM_W_CHANNEL 0
183 #define FE_MM_W_FE_INFO 1
184 #define FE_MM_RW_SYNC 2
186 #define FE_SYNC_CHANNEL 1
187 #define FE_SYNC_W_GENERIC_MONIT 2
188 #define FE_SYNC_COMPONENT_ACCESS 3
190 #define FE_MM_R_CHANNEL_SEARCH_STATE 3
191 #define FE_MM_R_CHANNEL_UNION_CONTEXT 4
192 #define FE_MM_R_FE_INFO 5
193 #define FE_MM_R_FE_MONITOR 6
195 #define FE_MM_W_CHANNEL_HEAD 7
196 #define FE_MM_W_CHANNEL_UNION 8
197 #define FE_MM_W_CHANNEL_CONTEXT 9
198 #define FE_MM_R_CHANNEL_UNION 10
199 #define FE_MM_R_CHANNEL_CONTEXT 11
200 #define FE_MM_R_CHANNEL_TUNE_STATE 12
202 #define FE_MM_R_GENERIC_MONITORING_SIZE 13
203 #define FE_MM_W_GENERIC_MONITORING 14
204 #define FE_MM_R_GENERIC_MONITORING 15
206 #define FE_MM_W_COMPONENT_ACCESS 16
207 #define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
208 static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len);
209 static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len);
211 static u16 to_fw_output_mode(u16 mode)
213 switch (mode) {
214 case OUTMODE_HIGH_Z:
215 return 0;
216 case OUTMODE_MPEG2_PAR_GATED_CLK:
217 return 4;
218 case OUTMODE_MPEG2_PAR_CONT_CLK:
219 return 8;
220 case OUTMODE_MPEG2_SERIAL:
221 return 16;
222 case OUTMODE_DIVERSITY:
223 return 128;
224 case OUTMODE_MPEG2_FIFO:
225 return 2;
226 case OUTMODE_ANALOG_ADC:
227 return 1;
228 default:
229 return 0;
233 static int dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 *b, u32 len, u16 attribute)
235 u32 chunk_size = 126;
236 u32 l;
237 int ret;
239 if (state->platform.risc.fw_is_running && (reg < 1024))
240 return dib9000_risc_apb_access_read(state, reg, attribute, NULL, 0, b, len);
242 memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
243 state->msg[0].addr = state->i2c.i2c_addr >> 1;
244 state->msg[0].flags = 0;
245 state->msg[0].buf = state->i2c_write_buffer;
246 state->msg[0].len = 2;
247 state->msg[1].addr = state->i2c.i2c_addr >> 1;
248 state->msg[1].flags = I2C_M_RD;
249 state->msg[1].buf = b;
250 state->msg[1].len = len;
252 state->i2c_write_buffer[0] = reg >> 8;
253 state->i2c_write_buffer[1] = reg & 0xff;
255 if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
256 state->i2c_write_buffer[0] |= (1 << 5);
257 if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
258 state->i2c_write_buffer[0] |= (1 << 4);
260 do {
261 l = len < chunk_size ? len : chunk_size;
262 state->msg[1].len = l;
263 state->msg[1].buf = b;
264 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 2) != 2 ? -EREMOTEIO : 0;
265 if (ret != 0) {
266 dprintk("i2c read error on %d\n", reg);
267 return -EREMOTEIO;
270 b += l;
271 len -= l;
273 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
274 reg += l / 2;
275 } while ((ret == 0) && len);
277 return 0;
280 static u16 dib9000_i2c_read16(struct i2c_device *i2c, u16 reg)
282 struct i2c_msg msg[2] = {
283 {.addr = i2c->i2c_addr >> 1, .flags = 0,
284 .buf = i2c->i2c_write_buffer, .len = 2},
285 {.addr = i2c->i2c_addr >> 1, .flags = I2C_M_RD,
286 .buf = i2c->i2c_read_buffer, .len = 2},
289 i2c->i2c_write_buffer[0] = reg >> 8;
290 i2c->i2c_write_buffer[1] = reg & 0xff;
292 if (i2c_transfer(i2c->i2c_adap, msg, 2) != 2) {
293 dprintk("read register %x error\n", reg);
294 return 0;
297 return (i2c->i2c_read_buffer[0] << 8) | i2c->i2c_read_buffer[1];
300 static inline u16 dib9000_read_word(struct dib9000_state *state, u16 reg)
302 if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2, 0) != 0)
303 return 0;
304 return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
307 static inline u16 dib9000_read_word_attr(struct dib9000_state *state, u16 reg, u16 attribute)
309 if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2,
310 attribute) != 0)
311 return 0;
312 return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
315 #define dib9000_read16_noinc_attr(state, reg, b, len, attribute) dib9000_read16_attr(state, reg, b, len, (attribute) | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
317 static int dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 *buf, u32 len, u16 attribute)
319 u32 chunk_size = 126;
320 u32 l;
321 int ret;
323 if (state->platform.risc.fw_is_running && (reg < 1024)) {
324 if (dib9000_risc_apb_access_write
325 (state, reg, DATA_BUS_ACCESS_MODE_16BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | attribute, buf, len) != 0)
326 return -EINVAL;
327 return 0;
330 memset(&state->msg[0], 0, sizeof(struct i2c_msg));
331 state->msg[0].addr = state->i2c.i2c_addr >> 1;
332 state->msg[0].flags = 0;
333 state->msg[0].buf = state->i2c_write_buffer;
334 state->msg[0].len = len + 2;
336 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
337 state->i2c_write_buffer[1] = (reg) & 0xff;
339 if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
340 state->i2c_write_buffer[0] |= (1 << 5);
341 if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
342 state->i2c_write_buffer[0] |= (1 << 4);
344 do {
345 l = len < chunk_size ? len : chunk_size;
346 state->msg[0].len = l + 2;
347 memcpy(&state->i2c_write_buffer[2], buf, l);
349 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
351 buf += l;
352 len -= l;
354 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
355 reg += l / 2;
356 } while ((ret == 0) && len);
358 return ret;
361 static int dib9000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
363 struct i2c_msg msg = {
364 .addr = i2c->i2c_addr >> 1, .flags = 0,
365 .buf = i2c->i2c_write_buffer, .len = 4
368 i2c->i2c_write_buffer[0] = (reg >> 8) & 0xff;
369 i2c->i2c_write_buffer[1] = reg & 0xff;
370 i2c->i2c_write_buffer[2] = (val >> 8) & 0xff;
371 i2c->i2c_write_buffer[3] = val & 0xff;
373 return i2c_transfer(i2c->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
376 static inline int dib9000_write_word(struct dib9000_state *state, u16 reg, u16 val)
378 u8 b[2] = { val >> 8, val & 0xff };
379 return dib9000_write16_attr(state, reg, b, 2, 0);
382 static inline int dib9000_write_word_attr(struct dib9000_state *state, u16 reg, u16 val, u16 attribute)
384 u8 b[2] = { val >> 8, val & 0xff };
385 return dib9000_write16_attr(state, reg, b, 2, attribute);
388 #define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
389 #define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
390 #define dib9000_write16_noinc_attr(state, reg, buf, len, attribute) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | (attribute))
392 #define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
393 #define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
395 #define MAC_IRQ (1 << 1)
396 #define IRQ_POL_MSK (1 << 4)
398 #define dib9000_risc_mem_read_chunks(state, b, len) dib9000_read16_attr(state, 1063, b, len, DATA_BUS_ACCESS_MODE_8BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
399 #define dib9000_risc_mem_write_chunks(state, buf, len) dib9000_write16_attr(state, 1063, buf, len, DATA_BUS_ACCESS_MODE_8BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
401 static void dib9000_risc_mem_setup_cmd(struct dib9000_state *state, u32 addr, u32 len, u8 reading)
403 u8 b[14] = { 0 };
405 /* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
406 /* b[0] = 0 << 7; */
407 b[1] = 1;
409 /* b[2] = 0; */
410 /* b[3] = 0; */
411 b[4] = (u8) (addr >> 8);
412 b[5] = (u8) (addr & 0xff);
414 /* b[10] = 0; */
415 /* b[11] = 0; */
416 b[12] = (u8) (addr >> 8);
417 b[13] = (u8) (addr & 0xff);
419 addr += len;
420 /* b[6] = 0; */
421 /* b[7] = 0; */
422 b[8] = (u8) (addr >> 8);
423 b[9] = (u8) (addr & 0xff);
425 dib9000_write(state, 1056, b, 14);
426 if (reading)
427 dib9000_write_word(state, 1056, (1 << 15) | 1);
428 state->platform.risc.memcmd = -1; /* if it was called directly reset it - to force a future setup-call to set it */
431 static void dib9000_risc_mem_setup(struct dib9000_state *state, u8 cmd)
433 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd & 0x7f];
434 /* decide whether we need to "refresh" the memory controller */
435 if (state->platform.risc.memcmd == cmd && /* same command */
436 !(cmd & 0x80 && m->size < 67)) /* and we do not want to read something with less than 67 bytes looping - working around a bug in the memory controller */
437 return;
438 dib9000_risc_mem_setup_cmd(state, m->addr, m->size, cmd & 0x80);
439 state->platform.risc.memcmd = cmd;
442 static int dib9000_risc_mem_read(struct dib9000_state *state, u8 cmd, u8 * b, u16 len)
444 if (!state->platform.risc.fw_is_running)
445 return -EIO;
447 if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
448 dprintk("could not get the lock\n");
449 return -EINTR;
451 dib9000_risc_mem_setup(state, cmd | 0x80);
452 dib9000_risc_mem_read_chunks(state, b, len);
453 mutex_unlock(&state->platform.risc.mem_lock);
454 return 0;
457 static int dib9000_risc_mem_write(struct dib9000_state *state, u8 cmd, const u8 * b)
459 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd];
460 if (!state->platform.risc.fw_is_running)
461 return -EIO;
463 if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
464 dprintk("could not get the lock\n");
465 return -EINTR;
467 dib9000_risc_mem_setup(state, cmd);
468 dib9000_risc_mem_write_chunks(state, b, m->size);
469 mutex_unlock(&state->platform.risc.mem_lock);
470 return 0;
473 static int dib9000_firmware_download(struct dib9000_state *state, u8 risc_id, u16 key, const u8 * code, u32 len)
475 u16 offs;
477 if (risc_id == 1)
478 offs = 16;
479 else
480 offs = 0;
482 /* config crtl reg */
483 dib9000_write_word(state, 1024 + offs, 0x000f);
484 dib9000_write_word(state, 1025 + offs, 0);
485 dib9000_write_word(state, 1031 + offs, key);
487 dprintk("going to download %dB of microcode\n", len);
488 if (dib9000_write16_noinc(state, 1026 + offs, (u8 *) code, (u16) len) != 0) {
489 dprintk("error while downloading microcode for RISC %c\n", 'A' + risc_id);
490 return -EIO;
493 dprintk("Microcode for RISC %c loaded\n", 'A' + risc_id);
495 return 0;
498 static int dib9000_mbx_host_init(struct dib9000_state *state, u8 risc_id)
500 u16 mbox_offs;
501 u16 reset_reg;
502 u16 tries = 1000;
504 if (risc_id == 1)
505 mbox_offs = 16;
506 else
507 mbox_offs = 0;
509 /* Reset mailbox */
510 dib9000_write_word(state, 1027 + mbox_offs, 0x8000);
512 /* Read reset status */
513 do {
514 reset_reg = dib9000_read_word(state, 1027 + mbox_offs);
515 msleep(100);
516 } while ((reset_reg & 0x8000) && --tries);
518 if (reset_reg & 0x8000) {
519 dprintk("MBX: init ERROR, no response from RISC %c\n", 'A' + risc_id);
520 return -EIO;
522 dprintk("MBX: initialized\n");
523 return 0;
526 #define MAX_MAILBOX_TRY 100
527 static int dib9000_mbx_send_attr(struct dib9000_state *state, u8 id, u16 * data, u8 len, u16 attr)
529 u8 *d, b[2];
530 u16 tmp;
531 u16 size;
532 u32 i;
533 int ret = 0;
535 if (!state->platform.risc.fw_is_running)
536 return -EINVAL;
538 if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
539 dprintk("could not get the lock\n");
540 return -EINTR;
542 tmp = MAX_MAILBOX_TRY;
543 do {
544 size = dib9000_read_word_attr(state, 1043, attr) & 0xff;
545 if ((size + len + 1) > MBX_MAX_WORDS && --tmp) {
546 dprintk("MBX: RISC mbx full, retrying\n");
547 msleep(100);
548 } else
549 break;
550 } while (1);
552 /*dprintk( "MBX: size: %d\n", size); */
554 if (tmp == 0) {
555 ret = -EINVAL;
556 goto out;
558 #ifdef DUMP_MSG
559 dprintk("--> %02x %d %*ph\n", id, len + 1, len, data);
560 #endif
562 /* byte-order conversion - works on big (where it is not necessary) or little endian */
563 d = (u8 *) data;
564 for (i = 0; i < len; i++) {
565 tmp = data[i];
566 *d++ = tmp >> 8;
567 *d++ = tmp & 0xff;
570 /* write msg */
571 b[0] = id;
572 b[1] = len + 1;
573 if (dib9000_write16_noinc_attr(state, 1045, b, 2, attr) != 0 || dib9000_write16_noinc_attr(state, 1045, (u8 *) data, len * 2, attr) != 0) {
574 ret = -EIO;
575 goto out;
578 /* update register nb_mes_in_RX */
579 ret = (u8) dib9000_write_word_attr(state, 1043, 1 << 14, attr);
581 out:
582 mutex_unlock(&state->platform.risc.mbx_if_lock);
584 return ret;
587 static u8 dib9000_mbx_read(struct dib9000_state *state, u16 * data, u8 risc_id, u16 attr)
589 #ifdef DUMP_MSG
590 u16 *d = data;
591 #endif
593 u16 tmp, i;
594 u8 size;
595 u8 mc_base;
597 if (!state->platform.risc.fw_is_running)
598 return 0;
600 if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
601 dprintk("could not get the lock\n");
602 return 0;
604 if (risc_id == 1)
605 mc_base = 16;
606 else
607 mc_base = 0;
609 /* Length and type in the first word */
610 *data = dib9000_read_word_attr(state, 1029 + mc_base, attr);
612 size = *data & 0xff;
613 if (size <= MBX_MAX_WORDS) {
614 data++;
615 size--; /* Initial word already read */
617 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, size * 2, attr);
619 /* to word conversion */
620 for (i = 0; i < size; i++) {
621 tmp = *data;
622 *data = (tmp >> 8) | (tmp << 8);
623 data++;
626 #ifdef DUMP_MSG
627 dprintk("<--\n");
628 for (i = 0; i < size + 1; i++)
629 dprintk("%04x\n", d[i]);
630 dprintk("\n");
631 #endif
632 } else {
633 dprintk("MBX: message is too big for message cache (%d), flushing message\n", size);
634 size--; /* Initial word already read */
635 while (size--)
636 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, 2, attr);
638 /* Update register nb_mes_in_TX */
639 dib9000_write_word_attr(state, 1028 + mc_base, 1 << 14, attr);
641 mutex_unlock(&state->platform.risc.mbx_if_lock);
643 return size + 1;
646 static int dib9000_risc_debug_buf(struct dib9000_state *state, u16 * data, u8 size)
648 u32 ts = data[1] << 16 | data[0];
649 char *b = (char *)&data[2];
651 b[2 * (size - 2) - 1] = '\0'; /* Bullet proof the buffer */
652 if (*b == '~') {
653 b++;
654 dprintk("%s\n", b);
655 } else
656 dprintk("RISC%d: %d.%04d %s\n",
657 state->fe_id,
658 ts / 10000, ts % 10000, *b ? b : "<empty>");
659 return 1;
662 static int dib9000_mbx_fetch_to_cache(struct dib9000_state *state, u16 attr)
664 int i;
665 u8 size;
666 u16 *block;
667 /* find a free slot */
668 for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
669 block = state->platform.risc.message_cache[i];
670 if (*block == 0) {
671 size = dib9000_mbx_read(state, block, 1, attr);
673 /* dprintk( "MBX: fetched %04x message to cache\n", *block); */
675 switch (*block >> 8) {
676 case IN_MSG_DEBUG_BUF:
677 dib9000_risc_debug_buf(state, block + 1, size); /* debug-messages are going to be printed right away */
678 *block = 0; /* free the block */
679 break;
680 #if 0
681 case IN_MSG_DATA: /* FE-TRACE */
682 dib9000_risc_data_process(state, block + 1, size);
683 *block = 0;
684 break;
685 #endif
686 default:
687 break;
690 return 1;
693 dprintk("MBX: no free cache-slot found for new message...\n");
694 return -1;
697 static u8 dib9000_mbx_count(struct dib9000_state *state, u8 risc_id, u16 attr)
699 if (risc_id == 0)
700 return (u8) (dib9000_read_word_attr(state, 1028, attr) >> 10) & 0x1f; /* 5 bit field */
701 else
702 return (u8) (dib9000_read_word_attr(state, 1044, attr) >> 8) & 0x7f; /* 7 bit field */
705 static int dib9000_mbx_process(struct dib9000_state *state, u16 attr)
707 int ret = 0;
709 if (!state->platform.risc.fw_is_running)
710 return -1;
712 if (mutex_lock_interruptible(&state->platform.risc.mbx_lock) < 0) {
713 dprintk("could not get the lock\n");
714 return -1;
717 if (dib9000_mbx_count(state, 1, attr)) /* 1=RiscB */
718 ret = dib9000_mbx_fetch_to_cache(state, attr);
720 dib9000_read_word_attr(state, 1229, attr); /* Clear the IRQ */
721 /* if (tmp) */
722 /* dprintk( "cleared IRQ: %x\n", tmp); */
723 mutex_unlock(&state->platform.risc.mbx_lock);
725 return ret;
728 static int dib9000_mbx_get_message_attr(struct dib9000_state *state, u16 id, u16 * msg, u8 * size, u16 attr)
730 u8 i;
731 u16 *block;
732 u16 timeout = 30;
734 *msg = 0;
735 do {
736 /* dib9000_mbx_get_from_cache(); */
737 for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
738 block = state->platform.risc.message_cache[i];
739 if ((*block >> 8) == id) {
740 *size = (*block & 0xff) - 1;
741 memcpy(msg, block + 1, (*size) * 2);
742 *block = 0; /* free the block */
743 i = 0; /* signal that we found a message */
744 break;
748 if (i == 0)
749 break;
751 if (dib9000_mbx_process(state, attr) == -1) /* try to fetch one message - if any */
752 return -1;
754 } while (--timeout);
756 if (timeout == 0) {
757 dprintk("waiting for message %d timed out\n", id);
758 return -1;
761 return i == 0;
764 static int dib9000_risc_check_version(struct dib9000_state *state)
766 u8 r[4];
767 u8 size;
768 u16 fw_version = 0;
770 if (dib9000_mbx_send(state, OUT_MSG_REQ_VERSION, &fw_version, 1) != 0)
771 return -EIO;
773 if (dib9000_mbx_get_message(state, IN_MSG_VERSION, (u16 *) r, &size) < 0)
774 return -EIO;
776 fw_version = (r[0] << 8) | r[1];
777 dprintk("RISC: ver: %d.%02d (IC: %d)\n", fw_version >> 10, fw_version & 0x3ff, (r[2] << 8) | r[3]);
779 if ((fw_version >> 10) != 7)
780 return -EINVAL;
782 switch (fw_version & 0x3ff) {
783 case 11:
784 case 12:
785 case 14:
786 case 15:
787 case 16:
788 case 17:
789 break;
790 default:
791 dprintk("RISC: invalid firmware version");
792 return -EINVAL;
795 dprintk("RISC: valid firmware version");
796 return 0;
799 static int dib9000_fw_boot(struct dib9000_state *state, const u8 * codeA, u32 lenA, const u8 * codeB, u32 lenB)
801 /* Reconfig pool mac ram */
802 dib9000_write_word(state, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
803 dib9000_write_word(state, 1226, 0x05);
805 /* Toggles IP crypto to Host APB interface. */
806 dib9000_write_word(state, 1542, 1);
808 /* Set jump and no jump in the dma box */
809 dib9000_write_word(state, 1074, 0);
810 dib9000_write_word(state, 1075, 0);
812 /* Set MAC as APB Master. */
813 dib9000_write_word(state, 1237, 0);
815 /* Reset the RISCs */
816 if (codeA != NULL)
817 dib9000_write_word(state, 1024, 2);
818 else
819 dib9000_write_word(state, 1024, 15);
820 if (codeB != NULL)
821 dib9000_write_word(state, 1040, 2);
823 if (codeA != NULL)
824 dib9000_firmware_download(state, 0, 0x1234, codeA, lenA);
825 if (codeB != NULL)
826 dib9000_firmware_download(state, 1, 0x1234, codeB, lenB);
828 /* Run the RISCs */
829 if (codeA != NULL)
830 dib9000_write_word(state, 1024, 0);
831 if (codeB != NULL)
832 dib9000_write_word(state, 1040, 0);
834 if (codeA != NULL)
835 if (dib9000_mbx_host_init(state, 0) != 0)
836 return -EIO;
837 if (codeB != NULL)
838 if (dib9000_mbx_host_init(state, 1) != 0)
839 return -EIO;
841 msleep(100);
842 state->platform.risc.fw_is_running = 1;
844 if (dib9000_risc_check_version(state) != 0)
845 return -EINVAL;
847 state->platform.risc.memcmd = 0xff;
848 return 0;
851 static u16 dib9000_identify(struct i2c_device *client)
853 u16 value;
855 value = dib9000_i2c_read16(client, 896);
856 if (value != 0x01b3) {
857 dprintk("wrong Vendor ID (0x%x)\n", value);
858 return 0;
861 value = dib9000_i2c_read16(client, 897);
862 if (value != 0x4000 && value != 0x4001 && value != 0x4002 && value != 0x4003 && value != 0x4004 && value != 0x4005) {
863 dprintk("wrong Device ID (0x%x)\n", value);
864 return 0;
867 /* protect this driver to be used with 7000PC */
868 if (value == 0x4000 && dib9000_i2c_read16(client, 769) == 0x4000) {
869 dprintk("this driver does not work with DiB7000PC\n");
870 return 0;
873 switch (value) {
874 case 0x4000:
875 dprintk("found DiB7000MA/PA/MB/PB\n");
876 break;
877 case 0x4001:
878 dprintk("found DiB7000HC\n");
879 break;
880 case 0x4002:
881 dprintk("found DiB7000MC\n");
882 break;
883 case 0x4003:
884 dprintk("found DiB9000A\n");
885 break;
886 case 0x4004:
887 dprintk("found DiB9000H\n");
888 break;
889 case 0x4005:
890 dprintk("found DiB9000M\n");
891 break;
894 return value;
897 static void dib9000_set_power_mode(struct dib9000_state *state, enum dib9000_power_mode mode)
899 /* by default everything is going to be powered off */
900 u16 reg_903 = 0x3fff, reg_904 = 0xffff, reg_905 = 0xffff, reg_906;
901 u8 offset;
903 if (state->revision == 0x4003 || state->revision == 0x4004 || state->revision == 0x4005)
904 offset = 1;
905 else
906 offset = 0;
908 reg_906 = dib9000_read_word(state, 906 + offset) | 0x3; /* keep settings for RISC */
910 /* now, depending on the requested mode, we power on */
911 switch (mode) {
912 /* power up everything in the demod */
913 case DIB9000_POWER_ALL:
914 reg_903 = 0x0000;
915 reg_904 = 0x0000;
916 reg_905 = 0x0000;
917 reg_906 = 0x0000;
918 break;
920 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
921 case DIB9000_POWER_INTERFACE_ONLY: /* TODO power up either SDIO or I2C or SRAM */
922 reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
923 break;
925 case DIB9000_POWER_INTERF_ANALOG_AGC:
926 reg_903 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
927 reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
928 reg_906 &= ~((1 << 0));
929 break;
931 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD:
932 reg_903 = 0x0000;
933 reg_904 = 0x801f;
934 reg_905 = 0x0000;
935 reg_906 &= ~((1 << 0));
936 break;
938 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD:
939 reg_903 = 0x0000;
940 reg_904 = 0x8000;
941 reg_905 = 0x010b;
942 reg_906 &= ~((1 << 0));
943 break;
944 default:
945 case DIB9000_POWER_NO:
946 break;
949 /* always power down unused parts */
950 if (!state->platform.host.mobile_mode)
951 reg_904 |= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
953 /* P_sdio_select_clk = 0 on MC and after */
954 if (state->revision != 0x4000)
955 reg_906 <<= 1;
957 dib9000_write_word(state, 903 + offset, reg_903);
958 dib9000_write_word(state, 904 + offset, reg_904);
959 dib9000_write_word(state, 905 + offset, reg_905);
960 dib9000_write_word(state, 906 + offset, reg_906);
963 static int dib9000_fw_reset(struct dvb_frontend *fe)
965 struct dib9000_state *state = fe->demodulator_priv;
967 dib9000_write_word(state, 1817, 0x0003);
969 dib9000_write_word(state, 1227, 1);
970 dib9000_write_word(state, 1227, 0);
972 switch ((state->revision = dib9000_identify(&state->i2c))) {
973 case 0x4003:
974 case 0x4004:
975 case 0x4005:
976 state->reg_offs = 1;
977 break;
978 default:
979 return -EINVAL;
982 /* reset the i2c-master to use the host interface */
983 dibx000_reset_i2c_master(&state->i2c_master);
985 dib9000_set_power_mode(state, DIB9000_POWER_ALL);
987 /* unforce divstr regardless whether i2c enumeration was done or not */
988 dib9000_write_word(state, 1794, dib9000_read_word(state, 1794) & ~(1 << 1));
989 dib9000_write_word(state, 1796, 0);
990 dib9000_write_word(state, 1805, 0x805);
992 /* restart all parts */
993 dib9000_write_word(state, 898, 0xffff);
994 dib9000_write_word(state, 899, 0xffff);
995 dib9000_write_word(state, 900, 0x0001);
996 dib9000_write_word(state, 901, 0xff19);
997 dib9000_write_word(state, 902, 0x003c);
999 dib9000_write_word(state, 898, 0);
1000 dib9000_write_word(state, 899, 0);
1001 dib9000_write_word(state, 900, 0);
1002 dib9000_write_word(state, 901, 0);
1003 dib9000_write_word(state, 902, 0);
1005 dib9000_write_word(state, 911, state->chip.d9.cfg.if_drives);
1007 dib9000_set_power_mode(state, DIB9000_POWER_INTERFACE_ONLY);
1009 return 0;
1012 static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len)
1014 u16 mb[10];
1015 u8 i, s;
1017 if (address >= 1024 || !state->platform.risc.fw_is_running)
1018 return -EINVAL;
1020 /* dprintk( "APB access through rd fw %d %x\n", address, attribute); */
1022 mb[0] = (u16) address;
1023 mb[1] = len / 2;
1024 dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_R, mb, 2, attribute);
1025 switch (dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute)) {
1026 case 1:
1027 s--;
1028 for (i = 0; i < s; i++) {
1029 b[i * 2] = (mb[i + 1] >> 8) & 0xff;
1030 b[i * 2 + 1] = (mb[i + 1]) & 0xff;
1032 return 0;
1033 default:
1034 return -EIO;
1036 return -EIO;
1039 static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len)
1041 u16 mb[10];
1042 u8 s, i;
1044 if (address >= 1024 || !state->platform.risc.fw_is_running)
1045 return -EINVAL;
1047 if (len > 18)
1048 return -EINVAL;
1050 /* dprintk( "APB access through wr fw %d %x\n", address, attribute); */
1052 mb[0] = (u16)address;
1053 for (i = 0; i + 1 < len; i += 2)
1054 mb[1 + i / 2] = b[i] << 8 | b[i + 1];
1055 if (len & 1)
1056 mb[1 + len / 2] = b[len - 1] << 8;
1058 dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_W, mb, (3 + len) / 2, attribute);
1059 return dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute) == 1 ? 0 : -EINVAL;
1062 static int dib9000_fw_memmbx_sync(struct dib9000_state *state, u8 i)
1064 u8 index_loop = 10;
1066 if (!state->platform.risc.fw_is_running)
1067 return 0;
1068 dib9000_risc_mem_write(state, FE_MM_RW_SYNC, &i);
1069 do {
1070 dib9000_risc_mem_read(state, FE_MM_RW_SYNC, state->i2c_read_buffer, 1);
1071 } while (state->i2c_read_buffer[0] && index_loop--);
1073 if (index_loop > 0)
1074 return 0;
1075 return -EIO;
1078 static int dib9000_fw_init(struct dib9000_state *state)
1080 struct dibGPIOFunction *f;
1081 u16 b[40] = { 0 };
1082 u8 i;
1083 u8 size;
1085 if (dib9000_fw_boot(state, NULL, 0, state->chip.d9.cfg.microcode_B_fe_buffer, state->chip.d9.cfg.microcode_B_fe_size) != 0)
1086 return -EIO;
1088 /* initialize the firmware */
1089 for (i = 0; i < ARRAY_SIZE(state->chip.d9.cfg.gpio_function); i++) {
1090 f = &state->chip.d9.cfg.gpio_function[i];
1091 if (f->mask) {
1092 switch (f->function) {
1093 case BOARD_GPIO_FUNCTION_COMPONENT_ON:
1094 b[0] = (u16) f->mask;
1095 b[1] = (u16) f->direction;
1096 b[2] = (u16) f->value;
1097 break;
1098 case BOARD_GPIO_FUNCTION_COMPONENT_OFF:
1099 b[3] = (u16) f->mask;
1100 b[4] = (u16) f->direction;
1101 b[5] = (u16) f->value;
1102 break;
1106 if (dib9000_mbx_send(state, OUT_MSG_CONF_GPIO, b, 15) != 0)
1107 return -EIO;
1109 /* subband */
1110 b[0] = state->chip.d9.cfg.subband.size; /* type == 0 -> GPIO - PWM not yet supported */
1111 for (i = 0; i < state->chip.d9.cfg.subband.size; i++) {
1112 b[1 + i * 4] = state->chip.d9.cfg.subband.subband[i].f_mhz;
1113 b[2 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.mask;
1114 b[3 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.direction;
1115 b[4 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.value;
1117 b[1 + i * 4] = 0; /* fe_id */
1118 if (dib9000_mbx_send(state, OUT_MSG_SUBBAND_SEL, b, 2 + 4 * i) != 0)
1119 return -EIO;
1121 /* 0 - id, 1 - no_of_frontends */
1122 b[0] = (0 << 8) | 1;
1123 /* 0 = i2c-address demod, 0 = tuner */
1124 b[1] = (0 << 8) | (0);
1125 b[2] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000) >> 16) & 0xffff);
1126 b[3] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000)) & 0xffff);
1127 b[4] = (u16) ((state->chip.d9.cfg.vcxo_timer >> 16) & 0xffff);
1128 b[5] = (u16) ((state->chip.d9.cfg.vcxo_timer) & 0xffff);
1129 b[6] = (u16) ((state->chip.d9.cfg.timing_frequency >> 16) & 0xffff);
1130 b[7] = (u16) ((state->chip.d9.cfg.timing_frequency) & 0xffff);
1131 b[29] = state->chip.d9.cfg.if_drives;
1132 if (dib9000_mbx_send(state, OUT_MSG_INIT_DEMOD, b, ARRAY_SIZE(b)) != 0)
1133 return -EIO;
1135 if (dib9000_mbx_send(state, OUT_MSG_FE_FW_DL, NULL, 0) != 0)
1136 return -EIO;
1138 if (dib9000_mbx_get_message(state, IN_MSG_FE_FW_DL_DONE, b, &size) < 0)
1139 return -EIO;
1141 if (size > ARRAY_SIZE(b)) {
1142 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size,
1143 (int)ARRAY_SIZE(b));
1144 return -EINVAL;
1147 for (i = 0; i < size; i += 2) {
1148 state->platform.risc.fe_mm[i / 2].addr = b[i + 0];
1149 state->platform.risc.fe_mm[i / 2].size = b[i + 1];
1152 return 0;
1155 static void dib9000_fw_set_channel_head(struct dib9000_state *state)
1157 u8 b[9];
1158 u32 freq = state->fe[0]->dtv_property_cache.frequency / 1000;
1159 if (state->fe_id % 2)
1160 freq += 101;
1162 b[0] = (u8) ((freq >> 0) & 0xff);
1163 b[1] = (u8) ((freq >> 8) & 0xff);
1164 b[2] = (u8) ((freq >> 16) & 0xff);
1165 b[3] = (u8) ((freq >> 24) & 0xff);
1166 b[4] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 0) & 0xff);
1167 b[5] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 8) & 0xff);
1168 b[6] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 16) & 0xff);
1169 b[7] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 24) & 0xff);
1170 b[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1171 if (state->fe[0]->dtv_property_cache.delivery_system == SYS_DVBT)
1172 b[8] |= 1;
1173 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_HEAD, b);
1176 static int dib9000_fw_get_channel(struct dvb_frontend *fe)
1178 struct dib9000_state *state = fe->demodulator_priv;
1179 struct dibDVBTChannel {
1180 s8 spectrum_inversion;
1182 s8 nfft;
1183 s8 guard;
1184 s8 constellation;
1186 s8 hrch;
1187 s8 alpha;
1188 s8 code_rate_hp;
1189 s8 code_rate_lp;
1190 s8 select_hp;
1192 s8 intlv_native;
1194 struct dibDVBTChannel *ch;
1195 int ret = 0;
1197 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1198 dprintk("could not get the lock\n");
1199 return -EINTR;
1201 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
1202 ret = -EIO;
1203 goto error;
1206 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_UNION,
1207 state->i2c_read_buffer, sizeof(struct dibDVBTChannel));
1208 ch = (struct dibDVBTChannel *)state->i2c_read_buffer;
1211 switch (ch->spectrum_inversion & 0x7) {
1212 case 1:
1213 state->fe[0]->dtv_property_cache.inversion = INVERSION_ON;
1214 break;
1215 case 0:
1216 state->fe[0]->dtv_property_cache.inversion = INVERSION_OFF;
1217 break;
1218 default:
1219 case -1:
1220 state->fe[0]->dtv_property_cache.inversion = INVERSION_AUTO;
1221 break;
1223 switch (ch->nfft) {
1224 case 0:
1225 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
1226 break;
1227 case 2:
1228 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
1229 break;
1230 case 1:
1231 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
1232 break;
1233 default:
1234 case -1:
1235 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
1236 break;
1238 switch (ch->guard) {
1239 case 0:
1240 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
1241 break;
1242 case 1:
1243 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
1244 break;
1245 case 2:
1246 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
1247 break;
1248 case 3:
1249 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
1250 break;
1251 default:
1252 case -1:
1253 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
1254 break;
1256 switch (ch->constellation) {
1257 case 2:
1258 state->fe[0]->dtv_property_cache.modulation = QAM_64;
1259 break;
1260 case 1:
1261 state->fe[0]->dtv_property_cache.modulation = QAM_16;
1262 break;
1263 case 0:
1264 state->fe[0]->dtv_property_cache.modulation = QPSK;
1265 break;
1266 default:
1267 case -1:
1268 state->fe[0]->dtv_property_cache.modulation = QAM_AUTO;
1269 break;
1271 switch (ch->hrch) {
1272 case 0:
1273 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_NONE;
1274 break;
1275 case 1:
1276 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_1;
1277 break;
1278 default:
1279 case -1:
1280 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
1281 break;
1283 switch (ch->code_rate_hp) {
1284 case 1:
1285 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_1_2;
1286 break;
1287 case 2:
1288 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_2_3;
1289 break;
1290 case 3:
1291 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_3_4;
1292 break;
1293 case 5:
1294 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_5_6;
1295 break;
1296 case 7:
1297 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_7_8;
1298 break;
1299 default:
1300 case -1:
1301 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_AUTO;
1302 break;
1304 switch (ch->code_rate_lp) {
1305 case 1:
1306 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_1_2;
1307 break;
1308 case 2:
1309 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_2_3;
1310 break;
1311 case 3:
1312 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_3_4;
1313 break;
1314 case 5:
1315 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_5_6;
1316 break;
1317 case 7:
1318 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_7_8;
1319 break;
1320 default:
1321 case -1:
1322 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_AUTO;
1323 break;
1326 error:
1327 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1328 return ret;
1331 static int dib9000_fw_set_channel_union(struct dvb_frontend *fe)
1333 struct dib9000_state *state = fe->demodulator_priv;
1334 struct dibDVBTChannel {
1335 s8 spectrum_inversion;
1337 s8 nfft;
1338 s8 guard;
1339 s8 constellation;
1341 s8 hrch;
1342 s8 alpha;
1343 s8 code_rate_hp;
1344 s8 code_rate_lp;
1345 s8 select_hp;
1347 s8 intlv_native;
1349 struct dibDVBTChannel ch;
1351 switch (state->fe[0]->dtv_property_cache.inversion) {
1352 case INVERSION_ON:
1353 ch.spectrum_inversion = 1;
1354 break;
1355 case INVERSION_OFF:
1356 ch.spectrum_inversion = 0;
1357 break;
1358 default:
1359 case INVERSION_AUTO:
1360 ch.spectrum_inversion = -1;
1361 break;
1363 switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1364 case TRANSMISSION_MODE_2K:
1365 ch.nfft = 0;
1366 break;
1367 case TRANSMISSION_MODE_4K:
1368 ch.nfft = 2;
1369 break;
1370 case TRANSMISSION_MODE_8K:
1371 ch.nfft = 1;
1372 break;
1373 default:
1374 case TRANSMISSION_MODE_AUTO:
1375 ch.nfft = 1;
1376 break;
1378 switch (state->fe[0]->dtv_property_cache.guard_interval) {
1379 case GUARD_INTERVAL_1_32:
1380 ch.guard = 0;
1381 break;
1382 case GUARD_INTERVAL_1_16:
1383 ch.guard = 1;
1384 break;
1385 case GUARD_INTERVAL_1_8:
1386 ch.guard = 2;
1387 break;
1388 case GUARD_INTERVAL_1_4:
1389 ch.guard = 3;
1390 break;
1391 default:
1392 case GUARD_INTERVAL_AUTO:
1393 ch.guard = -1;
1394 break;
1396 switch (state->fe[0]->dtv_property_cache.modulation) {
1397 case QAM_64:
1398 ch.constellation = 2;
1399 break;
1400 case QAM_16:
1401 ch.constellation = 1;
1402 break;
1403 case QPSK:
1404 ch.constellation = 0;
1405 break;
1406 default:
1407 case QAM_AUTO:
1408 ch.constellation = -1;
1409 break;
1411 switch (state->fe[0]->dtv_property_cache.hierarchy) {
1412 case HIERARCHY_NONE:
1413 ch.hrch = 0;
1414 break;
1415 case HIERARCHY_1:
1416 case HIERARCHY_2:
1417 case HIERARCHY_4:
1418 ch.hrch = 1;
1419 break;
1420 default:
1421 case HIERARCHY_AUTO:
1422 ch.hrch = -1;
1423 break;
1425 ch.alpha = 1;
1426 switch (state->fe[0]->dtv_property_cache.code_rate_HP) {
1427 case FEC_1_2:
1428 ch.code_rate_hp = 1;
1429 break;
1430 case FEC_2_3:
1431 ch.code_rate_hp = 2;
1432 break;
1433 case FEC_3_4:
1434 ch.code_rate_hp = 3;
1435 break;
1436 case FEC_5_6:
1437 ch.code_rate_hp = 5;
1438 break;
1439 case FEC_7_8:
1440 ch.code_rate_hp = 7;
1441 break;
1442 default:
1443 case FEC_AUTO:
1444 ch.code_rate_hp = -1;
1445 break;
1447 switch (state->fe[0]->dtv_property_cache.code_rate_LP) {
1448 case FEC_1_2:
1449 ch.code_rate_lp = 1;
1450 break;
1451 case FEC_2_3:
1452 ch.code_rate_lp = 2;
1453 break;
1454 case FEC_3_4:
1455 ch.code_rate_lp = 3;
1456 break;
1457 case FEC_5_6:
1458 ch.code_rate_lp = 5;
1459 break;
1460 case FEC_7_8:
1461 ch.code_rate_lp = 7;
1462 break;
1463 default:
1464 case FEC_AUTO:
1465 ch.code_rate_lp = -1;
1466 break;
1468 ch.select_hp = 1;
1469 ch.intlv_native = 1;
1471 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_UNION, (u8 *) &ch);
1473 return 0;
1476 static int dib9000_fw_tune(struct dvb_frontend *fe)
1478 struct dib9000_state *state = fe->demodulator_priv;
1479 int ret = 10, search = state->channel_status.status == CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1480 s8 i;
1482 switch (state->tune_state) {
1483 case CT_DEMOD_START:
1484 dib9000_fw_set_channel_head(state);
1486 /* write the channel context - a channel is initialized to 0, so it is OK */
1487 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_CONTEXT, (u8 *) fe_info);
1488 dib9000_risc_mem_write(state, FE_MM_W_FE_INFO, (u8 *) fe_info);
1490 if (search)
1491 dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_SEARCH, NULL, 0);
1492 else {
1493 dib9000_fw_set_channel_union(fe);
1494 dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_TUNE, NULL, 0);
1496 state->tune_state = CT_DEMOD_STEP_1;
1497 break;
1498 case CT_DEMOD_STEP_1:
1499 if (search)
1500 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_SEARCH_STATE, state->i2c_read_buffer, 1);
1501 else
1502 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_TUNE_STATE, state->i2c_read_buffer, 1);
1503 i = (s8)state->i2c_read_buffer[0];
1504 switch (i) { /* something happened */
1505 case 0:
1506 break;
1507 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1508 if (search)
1509 state->status = FE_STATUS_DEMOD_SUCCESS;
1510 else {
1511 state->tune_state = CT_DEMOD_STOP;
1512 state->status = FE_STATUS_LOCKED;
1514 break;
1515 default:
1516 state->status = FE_STATUS_TUNE_FAILED;
1517 state->tune_state = CT_DEMOD_STOP;
1518 break;
1520 break;
1521 default:
1522 ret = FE_CALLBACK_TIME_NEVER;
1523 break;
1526 return ret;
1529 static int dib9000_fw_set_diversity_in(struct dvb_frontend *fe, int onoff)
1531 struct dib9000_state *state = fe->demodulator_priv;
1532 u16 mode = (u16) onoff;
1533 return dib9000_mbx_send(state, OUT_MSG_ENABLE_DIVERSITY, &mode, 1);
1536 static int dib9000_fw_set_output_mode(struct dvb_frontend *fe, int mode)
1538 struct dib9000_state *state = fe->demodulator_priv;
1539 u16 outreg, smo_mode;
1541 dprintk("setting output mode for demod %p to %d\n", fe, mode);
1543 switch (mode) {
1544 case OUTMODE_MPEG2_PAR_GATED_CLK:
1545 outreg = (1 << 10); /* 0x0400 */
1546 break;
1547 case OUTMODE_MPEG2_PAR_CONT_CLK:
1548 outreg = (1 << 10) | (1 << 6); /* 0x0440 */
1549 break;
1550 case OUTMODE_MPEG2_SERIAL:
1551 outreg = (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1552 break;
1553 case OUTMODE_DIVERSITY:
1554 outreg = (1 << 10) | (4 << 6); /* 0x0500 */
1555 break;
1556 case OUTMODE_MPEG2_FIFO:
1557 outreg = (1 << 10) | (5 << 6);
1558 break;
1559 case OUTMODE_HIGH_Z:
1560 outreg = 0;
1561 break;
1562 default:
1563 dprintk("Unhandled output_mode passed to be set for demod %p\n", &state->fe[0]);
1564 return -EINVAL;
1567 dib9000_write_word(state, 1795, outreg);
1569 switch (mode) {
1570 case OUTMODE_MPEG2_PAR_GATED_CLK:
1571 case OUTMODE_MPEG2_PAR_CONT_CLK:
1572 case OUTMODE_MPEG2_SERIAL:
1573 case OUTMODE_MPEG2_FIFO:
1574 smo_mode = (dib9000_read_word(state, 295) & 0x0010) | (1 << 1);
1575 if (state->chip.d9.cfg.output_mpeg2_in_188_bytes)
1576 smo_mode |= (1 << 5);
1577 dib9000_write_word(state, 295, smo_mode);
1578 break;
1581 outreg = to_fw_output_mode(mode);
1582 return dib9000_mbx_send(state, OUT_MSG_SET_OUTPUT_MODE, &outreg, 1);
1585 static int dib9000_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1587 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1588 u16 i, len, t, index_msg;
1590 for (index_msg = 0; index_msg < num; index_msg++) {
1591 if (msg[index_msg].flags & I2C_M_RD) { /* read */
1592 len = msg[index_msg].len;
1593 if (len > 16)
1594 len = 16;
1596 if (dib9000_read_word(state, 790) != 0)
1597 dprintk("TunerITF: read busy\n");
1599 dib9000_write_word(state, 784, (u16) (msg[index_msg].addr));
1600 dib9000_write_word(state, 787, (len / 2) - 1);
1601 dib9000_write_word(state, 786, 1); /* start read */
1603 i = 1000;
1604 while (dib9000_read_word(state, 790) != (len / 2) && i)
1605 i--;
1607 if (i == 0)
1608 dprintk("TunerITF: read failed\n");
1610 for (i = 0; i < len; i += 2) {
1611 t = dib9000_read_word(state, 785);
1612 msg[index_msg].buf[i] = (t >> 8) & 0xff;
1613 msg[index_msg].buf[i + 1] = (t) & 0xff;
1615 if (dib9000_read_word(state, 790) != 0)
1616 dprintk("TunerITF: read more data than expected\n");
1617 } else {
1618 i = 1000;
1619 while (dib9000_read_word(state, 789) && i)
1620 i--;
1621 if (i == 0)
1622 dprintk("TunerITF: write busy\n");
1624 len = msg[index_msg].len;
1625 if (len > 16)
1626 len = 16;
1628 for (i = 0; i < len; i += 2)
1629 dib9000_write_word(state, 785, (msg[index_msg].buf[i] << 8) | msg[index_msg].buf[i + 1]);
1630 dib9000_write_word(state, 784, (u16) msg[index_msg].addr);
1631 dib9000_write_word(state, 787, (len / 2) - 1);
1632 dib9000_write_word(state, 786, 0); /* start write */
1634 i = 1000;
1635 while (dib9000_read_word(state, 791) > 0 && i)
1636 i--;
1637 if (i == 0)
1638 dprintk("TunerITF: write failed\n");
1641 return num;
1644 int dib9000_fw_set_component_bus_speed(struct dvb_frontend *fe, u16 speed)
1646 struct dib9000_state *state = fe->demodulator_priv;
1648 state->component_bus_speed = speed;
1649 return 0;
1651 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed);
1653 static int dib9000_fw_component_bus_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1655 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1656 u8 type = 0; /* I2C */
1657 u8 port = DIBX000_I2C_INTERFACE_GPIO_3_4;
1658 u16 scl = state->component_bus_speed; /* SCL frequency */
1659 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[FE_MM_RW_COMPONENT_ACCESS_BUFFER];
1660 u8 p[13] = { 0 };
1662 p[0] = type;
1663 p[1] = port;
1664 p[2] = msg[0].addr << 1;
1666 p[3] = (u8) scl & 0xff; /* scl */
1667 p[4] = (u8) (scl >> 8);
1669 p[7] = 0;
1670 p[8] = 0;
1672 p[9] = (u8) (msg[0].len);
1673 p[10] = (u8) (msg[0].len >> 8);
1674 if ((num > 1) && (msg[1].flags & I2C_M_RD)) {
1675 p[11] = (u8) (msg[1].len);
1676 p[12] = (u8) (msg[1].len >> 8);
1677 } else {
1678 p[11] = 0;
1679 p[12] = 0;
1682 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1683 dprintk("could not get the lock\n");
1684 return 0;
1687 dib9000_risc_mem_write(state, FE_MM_W_COMPONENT_ACCESS, p);
1689 { /* write-part */
1690 dib9000_risc_mem_setup_cmd(state, m->addr, msg[0].len, 0);
1691 dib9000_risc_mem_write_chunks(state, msg[0].buf, msg[0].len);
1694 /* do the transaction */
1695 if (dib9000_fw_memmbx_sync(state, FE_SYNC_COMPONENT_ACCESS) < 0) {
1696 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1697 return 0;
1700 /* read back any possible result */
1701 if ((num > 1) && (msg[1].flags & I2C_M_RD))
1702 dib9000_risc_mem_read(state, FE_MM_RW_COMPONENT_ACCESS_BUFFER, msg[1].buf, msg[1].len);
1704 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1706 return num;
1709 static u32 dib9000_i2c_func(struct i2c_adapter *adapter)
1711 return I2C_FUNC_I2C;
1714 static const struct i2c_algorithm dib9000_tuner_algo = {
1715 .master_xfer = dib9000_tuner_xfer,
1716 .functionality = dib9000_i2c_func,
1719 static const struct i2c_algorithm dib9000_component_bus_algo = {
1720 .master_xfer = dib9000_fw_component_bus_xfer,
1721 .functionality = dib9000_i2c_func,
1724 struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe)
1726 struct dib9000_state *st = fe->demodulator_priv;
1727 return &st->tuner_adap;
1729 EXPORT_SYMBOL(dib9000_get_tuner_interface);
1731 struct i2c_adapter *dib9000_get_component_bus_interface(struct dvb_frontend *fe)
1733 struct dib9000_state *st = fe->demodulator_priv;
1734 return &st->component_bus;
1736 EXPORT_SYMBOL(dib9000_get_component_bus_interface);
1738 struct i2c_adapter *dib9000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
1740 struct dib9000_state *st = fe->demodulator_priv;
1741 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
1743 EXPORT_SYMBOL(dib9000_get_i2c_master);
1745 int dib9000_set_i2c_adapter(struct dvb_frontend *fe, struct i2c_adapter *i2c)
1747 struct dib9000_state *st = fe->demodulator_priv;
1749 st->i2c.i2c_adap = i2c;
1750 return 0;
1752 EXPORT_SYMBOL(dib9000_set_i2c_adapter);
1754 static int dib9000_cfg_gpio(struct dib9000_state *st, u8 num, u8 dir, u8 val)
1756 st->gpio_dir = dib9000_read_word(st, 773);
1757 st->gpio_dir &= ~(1 << num); /* reset the direction bit */
1758 st->gpio_dir |= (dir & 0x1) << num; /* set the new direction */
1759 dib9000_write_word(st, 773, st->gpio_dir);
1761 st->gpio_val = dib9000_read_word(st, 774);
1762 st->gpio_val &= ~(1 << num); /* reset the direction bit */
1763 st->gpio_val |= (val & 0x01) << num; /* set the new value */
1764 dib9000_write_word(st, 774, st->gpio_val);
1766 dprintk("gpio dir: %04x: gpio val: %04x\n", st->gpio_dir, st->gpio_val);
1768 return 0;
1771 int dib9000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
1773 struct dib9000_state *state = fe->demodulator_priv;
1774 return dib9000_cfg_gpio(state, num, dir, val);
1776 EXPORT_SYMBOL(dib9000_set_gpio);
1778 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1780 struct dib9000_state *state = fe->demodulator_priv;
1781 u16 val;
1782 int ret;
1784 if ((state->pid_ctrl_index != -2) && (state->pid_ctrl_index < 9)) {
1785 /* postpone the pid filtering cmd */
1786 dprintk("pid filter cmd postpone\n");
1787 state->pid_ctrl_index++;
1788 state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER_CTRL;
1789 state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1790 return 0;
1793 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1794 dprintk("could not get the lock\n");
1795 return -EINTR;
1798 val = dib9000_read_word(state, 294 + 1) & 0xffef;
1799 val |= (onoff & 0x1) << 4;
1801 dprintk("PID filter enabled %d\n", onoff);
1802 ret = dib9000_write_word(state, 294 + 1, val);
1803 mutex_unlock(&state->demod_lock);
1804 return ret;
1807 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
1809 int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1811 struct dib9000_state *state = fe->demodulator_priv;
1812 int ret;
1814 if (state->pid_ctrl_index != -2) {
1815 /* postpone the pid filtering cmd */
1816 dprintk("pid filter postpone\n");
1817 if (state->pid_ctrl_index < 9) {
1818 state->pid_ctrl_index++;
1819 state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER;
1820 state->pid_ctrl[state->pid_ctrl_index].id = id;
1821 state->pid_ctrl[state->pid_ctrl_index].pid = pid;
1822 state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1823 } else
1824 dprintk("can not add any more pid ctrl cmd\n");
1825 return 0;
1828 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1829 dprintk("could not get the lock\n");
1830 return -EINTR;
1832 dprintk("Index %x, PID %d, OnOff %d\n", id, pid, onoff);
1833 ret = dib9000_write_word(state, 300 + 1 + id,
1834 onoff ? (1 << 13) | pid : 0);
1835 mutex_unlock(&state->demod_lock);
1836 return ret;
1838 EXPORT_SYMBOL(dib9000_fw_pid_filter);
1840 int dib9000_firmware_post_pll_init(struct dvb_frontend *fe)
1842 struct dib9000_state *state = fe->demodulator_priv;
1843 return dib9000_fw_init(state);
1845 EXPORT_SYMBOL(dib9000_firmware_post_pll_init);
1847 static void dib9000_release(struct dvb_frontend *demod)
1849 struct dib9000_state *st = demod->demodulator_priv;
1850 u8 index_frontend;
1852 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
1853 dvb_frontend_detach(st->fe[index_frontend]);
1855 dibx000_exit_i2c_master(&st->i2c_master);
1857 i2c_del_adapter(&st->tuner_adap);
1858 i2c_del_adapter(&st->component_bus);
1859 kfree(st->fe[0]);
1860 kfree(st);
1863 static int dib9000_wakeup(struct dvb_frontend *fe)
1865 return 0;
1868 static int dib9000_sleep(struct dvb_frontend *fe)
1870 struct dib9000_state *state = fe->demodulator_priv;
1871 u8 index_frontend;
1872 int ret = 0;
1874 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1875 dprintk("could not get the lock\n");
1876 return -EINTR;
1878 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1879 ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
1880 if (ret < 0)
1881 goto error;
1883 ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
1885 error:
1886 mutex_unlock(&state->demod_lock);
1887 return ret;
1890 static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1892 tune->min_delay_ms = 1000;
1893 return 0;
1896 static int dib9000_get_frontend(struct dvb_frontend *fe,
1897 struct dtv_frontend_properties *c)
1899 struct dib9000_state *state = fe->demodulator_priv;
1900 u8 index_frontend, sub_index_frontend;
1901 enum fe_status stat;
1902 int ret = 0;
1904 if (state->get_frontend_internal == 0) {
1905 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1906 dprintk("could not get the lock\n");
1907 return -EINTR;
1911 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1912 state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
1913 if (stat & FE_HAS_SYNC) {
1914 dprintk("TPS lock on the slave%i\n", index_frontend);
1916 /* synchronize the cache with the other frontends */
1917 state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
1918 for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL);
1919 sub_index_frontend++) {
1920 if (sub_index_frontend != index_frontend) {
1921 state->fe[sub_index_frontend]->dtv_property_cache.modulation =
1922 state->fe[index_frontend]->dtv_property_cache.modulation;
1923 state->fe[sub_index_frontend]->dtv_property_cache.inversion =
1924 state->fe[index_frontend]->dtv_property_cache.inversion;
1925 state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode =
1926 state->fe[index_frontend]->dtv_property_cache.transmission_mode;
1927 state->fe[sub_index_frontend]->dtv_property_cache.guard_interval =
1928 state->fe[index_frontend]->dtv_property_cache.guard_interval;
1929 state->fe[sub_index_frontend]->dtv_property_cache.hierarchy =
1930 state->fe[index_frontend]->dtv_property_cache.hierarchy;
1931 state->fe[sub_index_frontend]->dtv_property_cache.code_rate_HP =
1932 state->fe[index_frontend]->dtv_property_cache.code_rate_HP;
1933 state->fe[sub_index_frontend]->dtv_property_cache.code_rate_LP =
1934 state->fe[index_frontend]->dtv_property_cache.code_rate_LP;
1935 state->fe[sub_index_frontend]->dtv_property_cache.rolloff =
1936 state->fe[index_frontend]->dtv_property_cache.rolloff;
1939 ret = 0;
1940 goto return_value;
1944 /* get the channel from master chip */
1945 ret = dib9000_fw_get_channel(fe);
1946 if (ret != 0)
1947 goto return_value;
1949 /* synchronize the cache with the other frontends */
1950 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1951 state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
1952 state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
1953 state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
1954 state->fe[index_frontend]->dtv_property_cache.modulation = c->modulation;
1955 state->fe[index_frontend]->dtv_property_cache.hierarchy = c->hierarchy;
1956 state->fe[index_frontend]->dtv_property_cache.code_rate_HP = c->code_rate_HP;
1957 state->fe[index_frontend]->dtv_property_cache.code_rate_LP = c->code_rate_LP;
1958 state->fe[index_frontend]->dtv_property_cache.rolloff = c->rolloff;
1960 ret = 0;
1962 return_value:
1963 if (state->get_frontend_internal == 0)
1964 mutex_unlock(&state->demod_lock);
1965 return ret;
1968 static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1970 struct dib9000_state *state = fe->demodulator_priv;
1971 state->tune_state = tune_state;
1972 if (tune_state == CT_DEMOD_START)
1973 state->status = FE_STATUS_TUNE_PENDING;
1975 return 0;
1978 static u32 dib9000_get_status(struct dvb_frontend *fe)
1980 struct dib9000_state *state = fe->demodulator_priv;
1981 return state->status;
1984 static int dib9000_set_channel_status(struct dvb_frontend *fe, struct dvb_frontend_parametersContext *channel_status)
1986 struct dib9000_state *state = fe->demodulator_priv;
1988 memcpy(&state->channel_status, channel_status, sizeof(struct dvb_frontend_parametersContext));
1989 return 0;
1992 static int dib9000_set_frontend(struct dvb_frontend *fe)
1994 struct dib9000_state *state = fe->demodulator_priv;
1995 int sleep_time, sleep_time_slave;
1996 u32 frontend_status;
1997 u8 nbr_pending, exit_condition, index_frontend, index_frontend_success;
1998 struct dvb_frontend_parametersContext channel_status;
2000 /* check that the correct parameters are set */
2001 if (state->fe[0]->dtv_property_cache.frequency == 0) {
2002 dprintk("dib9000: must specify frequency\n");
2003 return 0;
2006 if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
2007 dprintk("dib9000: must specify bandwidth\n");
2008 return 0;
2011 state->pid_ctrl_index = -1; /* postpone the pid filtering cmd */
2012 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2013 dprintk("could not get the lock\n");
2014 return 0;
2017 fe->dtv_property_cache.delivery_system = SYS_DVBT;
2019 /* set the master status */
2020 if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO ||
2021 state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO ||
2022 state->fe[0]->dtv_property_cache.modulation == QAM_AUTO ||
2023 state->fe[0]->dtv_property_cache.code_rate_HP == FEC_AUTO) {
2024 /* no channel specified, autosearch the channel */
2025 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_UNKNOWN;
2026 } else
2027 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2029 /* set mode and status for the different frontends */
2030 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2031 dib9000_fw_set_diversity_in(state->fe[index_frontend], 1);
2033 /* synchronization of the cache */
2034 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2036 state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_DVBT;
2037 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_HIGH_Z);
2039 dib9000_set_channel_status(state->fe[index_frontend], &state->channel_status);
2040 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2043 /* actual tune */
2044 exit_condition = 0; /* 0: tune pending; 1: tune failed; 2:tune success */
2045 index_frontend_success = 0;
2046 do {
2047 sleep_time = dib9000_fw_tune(state->fe[0]);
2048 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2049 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2050 if (sleep_time == FE_CALLBACK_TIME_NEVER)
2051 sleep_time = sleep_time_slave;
2052 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2053 sleep_time = sleep_time_slave;
2055 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2056 msleep(sleep_time / 10);
2057 else
2058 break;
2060 nbr_pending = 0;
2061 exit_condition = 0;
2062 index_frontend_success = 0;
2063 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2064 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2065 if (frontend_status > -FE_STATUS_TUNE_PENDING) {
2066 exit_condition = 2; /* tune success */
2067 index_frontend_success = index_frontend;
2068 break;
2070 if (frontend_status == -FE_STATUS_TUNE_PENDING)
2071 nbr_pending++; /* some frontends are still tuning */
2073 if ((exit_condition != 2) && (nbr_pending == 0))
2074 exit_condition = 1; /* if all tune are done and no success, exit: tune failed */
2076 } while (exit_condition == 0);
2078 /* check the tune result */
2079 if (exit_condition == 1) { /* tune failed */
2080 dprintk("tune failed\n");
2081 mutex_unlock(&state->demod_lock);
2082 /* tune failed; put all the pid filtering cmd to junk */
2083 state->pid_ctrl_index = -1;
2084 return 0;
2087 dprintk("tune success on frontend%i\n", index_frontend_success);
2089 /* synchronize all the channel cache */
2090 state->get_frontend_internal = 1;
2091 dib9000_get_frontend(state->fe[0], &state->fe[0]->dtv_property_cache);
2092 state->get_frontend_internal = 0;
2094 /* retune the other frontends with the found channel */
2095 channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2096 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2097 /* only retune the frontends which was not tuned success */
2098 if (index_frontend != index_frontend_success) {
2099 dib9000_set_channel_status(state->fe[index_frontend], &channel_status);
2100 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2103 do {
2104 sleep_time = FE_CALLBACK_TIME_NEVER;
2105 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2106 if (index_frontend != index_frontend_success) {
2107 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2108 if (sleep_time == FE_CALLBACK_TIME_NEVER)
2109 sleep_time = sleep_time_slave;
2110 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2111 sleep_time = sleep_time_slave;
2114 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2115 msleep(sleep_time / 10);
2116 else
2117 break;
2119 nbr_pending = 0;
2120 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2121 if (index_frontend != index_frontend_success) {
2122 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2123 if ((index_frontend != index_frontend_success) && (frontend_status == -FE_STATUS_TUNE_PENDING))
2124 nbr_pending++; /* some frontends are still tuning */
2127 } while (nbr_pending != 0);
2129 /* set the output mode */
2130 dib9000_fw_set_output_mode(state->fe[0], state->chip.d9.cfg.output_mode);
2131 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2132 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_DIVERSITY);
2134 /* turn off the diversity for the last frontend */
2135 dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
2137 mutex_unlock(&state->demod_lock);
2138 if (state->pid_ctrl_index >= 0) {
2139 u8 index_pid_filter_cmd;
2140 u8 pid_ctrl_index = state->pid_ctrl_index;
2142 state->pid_ctrl_index = -2;
2143 for (index_pid_filter_cmd = 0;
2144 index_pid_filter_cmd <= pid_ctrl_index;
2145 index_pid_filter_cmd++) {
2146 if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER_CTRL)
2147 dib9000_fw_pid_filter_ctrl(state->fe[0],
2148 state->pid_ctrl[index_pid_filter_cmd].onoff);
2149 else if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER)
2150 dib9000_fw_pid_filter(state->fe[0],
2151 state->pid_ctrl[index_pid_filter_cmd].id,
2152 state->pid_ctrl[index_pid_filter_cmd].pid,
2153 state->pid_ctrl[index_pid_filter_cmd].onoff);
2156 /* do not postpone any more the pid filtering */
2157 state->pid_ctrl_index = -2;
2159 return 0;
2162 static u16 dib9000_read_lock(struct dvb_frontend *fe)
2164 struct dib9000_state *state = fe->demodulator_priv;
2166 return dib9000_read_word(state, 535);
2169 static int dib9000_read_status(struct dvb_frontend *fe, enum fe_status *stat)
2171 struct dib9000_state *state = fe->demodulator_priv;
2172 u8 index_frontend;
2173 u16 lock = 0, lock_slave = 0;
2175 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2176 dprintk("could not get the lock\n");
2177 return -EINTR;
2179 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2180 lock_slave |= dib9000_read_lock(state->fe[index_frontend]);
2182 lock = dib9000_read_word(state, 535);
2184 *stat = 0;
2186 if ((lock & 0x8000) || (lock_slave & 0x8000))
2187 *stat |= FE_HAS_SIGNAL;
2188 if ((lock & 0x3000) || (lock_slave & 0x3000))
2189 *stat |= FE_HAS_CARRIER;
2190 if ((lock & 0x0100) || (lock_slave & 0x0100))
2191 *stat |= FE_HAS_VITERBI;
2192 if (((lock & 0x0038) == 0x38) || ((lock_slave & 0x0038) == 0x38))
2193 *stat |= FE_HAS_SYNC;
2194 if ((lock & 0x0008) || (lock_slave & 0x0008))
2195 *stat |= FE_HAS_LOCK;
2197 mutex_unlock(&state->demod_lock);
2199 return 0;
2202 static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber)
2204 struct dib9000_state *state = fe->demodulator_priv;
2205 u16 *c;
2206 int ret = 0;
2208 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2209 dprintk("could not get the lock\n");
2210 return -EINTR;
2212 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2213 dprintk("could not get the lock\n");
2214 ret = -EINTR;
2215 goto error;
2217 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2218 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2219 ret = -EIO;
2220 goto error;
2222 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR,
2223 state->i2c_read_buffer, 16 * 2);
2224 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2226 c = (u16 *)state->i2c_read_buffer;
2228 *ber = c[10] << 16 | c[11];
2230 error:
2231 mutex_unlock(&state->demod_lock);
2232 return ret;
2235 static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2237 struct dib9000_state *state = fe->demodulator_priv;
2238 u8 index_frontend;
2239 u16 *c = (u16 *)state->i2c_read_buffer;
2240 u16 val;
2241 int ret = 0;
2243 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2244 dprintk("could not get the lock\n");
2245 return -EINTR;
2247 *strength = 0;
2248 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2249 state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
2250 if (val > 65535 - *strength)
2251 *strength = 65535;
2252 else
2253 *strength += val;
2256 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2257 dprintk("could not get the lock\n");
2258 ret = -EINTR;
2259 goto error;
2261 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2262 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2263 ret = -EIO;
2264 goto error;
2266 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2267 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2269 val = 65535 - c[4];
2270 if (val > 65535 - *strength)
2271 *strength = 65535;
2272 else
2273 *strength += val;
2275 error:
2276 mutex_unlock(&state->demod_lock);
2277 return ret;
2280 static u32 dib9000_get_snr(struct dvb_frontend *fe)
2282 struct dib9000_state *state = fe->demodulator_priv;
2283 u16 *c = (u16 *)state->i2c_read_buffer;
2284 u32 n, s, exp;
2285 u16 val;
2287 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2288 dprintk("could not get the lock\n");
2289 return 0;
2291 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2292 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2293 return 0;
2295 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2296 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2298 val = c[7];
2299 n = (val >> 4) & 0xff;
2300 exp = ((val & 0xf) << 2);
2301 val = c[8];
2302 exp += ((val >> 14) & 0x3);
2303 if ((exp & 0x20) != 0)
2304 exp -= 0x40;
2305 n <<= exp + 16;
2307 s = (val >> 6) & 0xFF;
2308 exp = (val & 0x3F);
2309 if ((exp & 0x20) != 0)
2310 exp -= 0x40;
2311 s <<= exp + 16;
2313 if (n > 0) {
2314 u32 t = (s / n) << 16;
2315 return t + ((s << 16) - n * t) / n;
2317 return 0xffffffff;
2320 static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr)
2322 struct dib9000_state *state = fe->demodulator_priv;
2323 u8 index_frontend;
2324 u32 snr_master;
2326 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2327 dprintk("could not get the lock\n");
2328 return -EINTR;
2330 snr_master = dib9000_get_snr(fe);
2331 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2332 snr_master += dib9000_get_snr(state->fe[index_frontend]);
2334 if ((snr_master >> 16) != 0) {
2335 snr_master = 10 * intlog10(snr_master >> 16);
2336 *snr = snr_master / ((1 << 24) / 10);
2337 } else
2338 *snr = 0;
2340 mutex_unlock(&state->demod_lock);
2342 return 0;
2345 static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
2347 struct dib9000_state *state = fe->demodulator_priv;
2348 u16 *c = (u16 *)state->i2c_read_buffer;
2349 int ret = 0;
2351 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2352 dprintk("could not get the lock\n");
2353 return -EINTR;
2355 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2356 dprintk("could not get the lock\n");
2357 ret = -EINTR;
2358 goto error;
2360 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2361 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2362 ret = -EIO;
2363 goto error;
2365 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2366 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2368 *unc = c[12];
2370 error:
2371 mutex_unlock(&state->demod_lock);
2372 return ret;
2375 int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
2377 int k = 0, ret = 0;
2378 u8 new_addr = 0;
2379 struct i2c_device client = {.i2c_adap = i2c };
2381 client.i2c_write_buffer = kzalloc(4, GFP_KERNEL);
2382 if (!client.i2c_write_buffer) {
2383 dprintk("%s: not enough memory\n", __func__);
2384 return -ENOMEM;
2386 client.i2c_read_buffer = kzalloc(4, GFP_KERNEL);
2387 if (!client.i2c_read_buffer) {
2388 dprintk("%s: not enough memory\n", __func__);
2389 ret = -ENOMEM;
2390 goto error_memory;
2393 client.i2c_addr = default_addr + 16;
2394 dib9000_i2c_write16(&client, 1796, 0x0);
2396 for (k = no_of_demods - 1; k >= 0; k--) {
2397 /* designated i2c address */
2398 new_addr = first_addr + (k << 1);
2399 client.i2c_addr = default_addr;
2401 dib9000_i2c_write16(&client, 1817, 3);
2402 dib9000_i2c_write16(&client, 1796, 0);
2403 dib9000_i2c_write16(&client, 1227, 1);
2404 dib9000_i2c_write16(&client, 1227, 0);
2406 client.i2c_addr = new_addr;
2407 dib9000_i2c_write16(&client, 1817, 3);
2408 dib9000_i2c_write16(&client, 1796, 0);
2409 dib9000_i2c_write16(&client, 1227, 1);
2410 dib9000_i2c_write16(&client, 1227, 0);
2412 if (dib9000_identify(&client) == 0) {
2413 client.i2c_addr = default_addr;
2414 if (dib9000_identify(&client) == 0) {
2415 dprintk("DiB9000 #%d: not identified\n", k);
2416 ret = -EIO;
2417 goto error;
2421 dib9000_i2c_write16(&client, 1795, (1 << 10) | (4 << 6));
2422 dib9000_i2c_write16(&client, 1794, (new_addr << 2) | 2);
2424 dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
2427 for (k = 0; k < no_of_demods; k++) {
2428 new_addr = first_addr | (k << 1);
2429 client.i2c_addr = new_addr;
2431 dib9000_i2c_write16(&client, 1794, (new_addr << 2));
2432 dib9000_i2c_write16(&client, 1795, 0);
2435 error:
2436 kfree(client.i2c_read_buffer);
2437 error_memory:
2438 kfree(client.i2c_write_buffer);
2440 return ret;
2442 EXPORT_SYMBOL(dib9000_i2c_enumeration);
2444 int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
2446 struct dib9000_state *state = fe->demodulator_priv;
2447 u8 index_frontend = 1;
2449 while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2450 index_frontend++;
2451 if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
2452 dprintk("set slave fe %p to index %i\n", fe_slave, index_frontend);
2453 state->fe[index_frontend] = fe_slave;
2454 return 0;
2457 dprintk("too many slave frontend\n");
2458 return -ENOMEM;
2460 EXPORT_SYMBOL(dib9000_set_slave_frontend);
2462 struct dvb_frontend *dib9000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
2464 struct dib9000_state *state = fe->demodulator_priv;
2466 if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
2467 return NULL;
2468 return state->fe[slave_index];
2470 EXPORT_SYMBOL(dib9000_get_slave_frontend);
2472 static const struct dvb_frontend_ops dib9000_ops;
2473 struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg)
2475 struct dvb_frontend *fe;
2476 struct dib9000_state *st;
2477 st = kzalloc(sizeof(struct dib9000_state), GFP_KERNEL);
2478 if (st == NULL)
2479 return NULL;
2480 fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
2481 if (fe == NULL) {
2482 kfree(st);
2483 return NULL;
2486 memcpy(&st->chip.d9.cfg, cfg, sizeof(struct dib9000_config));
2487 st->i2c.i2c_adap = i2c_adap;
2488 st->i2c.i2c_addr = i2c_addr;
2489 st->i2c.i2c_write_buffer = st->i2c_write_buffer;
2490 st->i2c.i2c_read_buffer = st->i2c_read_buffer;
2492 st->gpio_dir = DIB9000_GPIO_DEFAULT_DIRECTIONS;
2493 st->gpio_val = DIB9000_GPIO_DEFAULT_VALUES;
2494 st->gpio_pwm_pos = DIB9000_GPIO_DEFAULT_PWM_POS;
2496 mutex_init(&st->platform.risc.mbx_if_lock);
2497 mutex_init(&st->platform.risc.mbx_lock);
2498 mutex_init(&st->platform.risc.mem_lock);
2499 mutex_init(&st->platform.risc.mem_mbx_lock);
2500 mutex_init(&st->demod_lock);
2501 st->get_frontend_internal = 0;
2503 st->pid_ctrl_index = -2;
2505 st->fe[0] = fe;
2506 fe->demodulator_priv = st;
2507 memcpy(&st->fe[0]->ops, &dib9000_ops, sizeof(struct dvb_frontend_ops));
2509 /* Ensure the output mode remains at the previous default if it's
2510 * not specifically set by the caller.
2512 if ((st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2513 st->chip.d9.cfg.output_mode = OUTMODE_MPEG2_FIFO;
2515 if (dib9000_identify(&st->i2c) == 0)
2516 goto error;
2518 dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
2520 st->tuner_adap.dev.parent = i2c_adap->dev.parent;
2521 strscpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS",
2522 sizeof(st->tuner_adap.name));
2523 st->tuner_adap.algo = &dib9000_tuner_algo;
2524 st->tuner_adap.algo_data = NULL;
2525 i2c_set_adapdata(&st->tuner_adap, st);
2526 if (i2c_add_adapter(&st->tuner_adap) < 0)
2527 goto error;
2529 st->component_bus.dev.parent = i2c_adap->dev.parent;
2530 strscpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS",
2531 sizeof(st->component_bus.name));
2532 st->component_bus.algo = &dib9000_component_bus_algo;
2533 st->component_bus.algo_data = NULL;
2534 st->component_bus_speed = 340;
2535 i2c_set_adapdata(&st->component_bus, st);
2536 if (i2c_add_adapter(&st->component_bus) < 0)
2537 goto component_bus_add_error;
2539 dib9000_fw_reset(fe);
2541 return fe;
2543 component_bus_add_error:
2544 i2c_del_adapter(&st->tuner_adap);
2545 error:
2546 kfree(st);
2547 return NULL;
2549 EXPORT_SYMBOL(dib9000_attach);
2551 static const struct dvb_frontend_ops dib9000_ops = {
2552 .delsys = { SYS_DVBT },
2553 .info = {
2554 .name = "DiBcom 9000",
2555 .frequency_min_hz = 44250 * kHz,
2556 .frequency_max_hz = 867250 * kHz,
2557 .frequency_stepsize_hz = 62500,
2558 .caps = FE_CAN_INVERSION_AUTO |
2559 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2560 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2561 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2562 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2565 .release = dib9000_release,
2567 .init = dib9000_wakeup,
2568 .sleep = dib9000_sleep,
2570 .set_frontend = dib9000_set_frontend,
2571 .get_tune_settings = dib9000_fe_get_tune_settings,
2572 .get_frontend = dib9000_get_frontend,
2574 .read_status = dib9000_read_status,
2575 .read_ber = dib9000_read_ber,
2576 .read_signal_strength = dib9000_read_signal_strength,
2577 .read_snr = dib9000_read_snr,
2578 .read_ucblocks = dib9000_read_unc_blocks,
2581 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2582 MODULE_AUTHOR("Olivier Grenie <olivier.grenie@parrot.com>");
2583 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2584 MODULE_LICENSE("GPL");