sched: Remove double_rq_lock() from __migrate_task()
[linux/fpc-iii.git] / drivers / media / dvb-frontends / dib9000.c
blobe540cfb13bac4b15dbfa06d1c050e0ad1246fcd0
1 /*
2 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
4 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
9 */
10 #include <linux/kernel.h>
11 #include <linux/i2c.h>
12 #include <linux/mutex.h>
14 #include "dvb_math.h"
15 #include "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(args...) do { if (debug) { printk(KERN_DEBUG "DiB9000: "); printk(args); printk("\n"); } } while (0)
25 #define MAX_NUMBER_OF_FRONTENDS 6
27 struct i2c_device {
28 struct i2c_adapter *i2c_adap;
29 u8 i2c_addr;
30 u8 *i2c_read_buffer;
31 u8 *i2c_write_buffer;
34 struct dib9000_pid_ctrl {
35 #define DIB9000_PID_FILTER_CTRL 0
36 #define DIB9000_PID_FILTER 1
37 u8 cmd;
38 u8 id;
39 u16 pid;
40 u8 onoff;
43 struct dib9000_state {
44 struct i2c_device i2c;
46 struct dibx000_i2c_master i2c_master;
47 struct i2c_adapter tuner_adap;
48 struct i2c_adapter component_bus;
50 u16 revision;
51 u8 reg_offs;
53 enum frontend_tune_state tune_state;
54 u32 status;
55 struct dvb_frontend_parametersContext channel_status;
57 u8 fe_id;
59 #define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
60 u16 gpio_dir;
61 #define DIB9000_GPIO_DEFAULT_VALUES 0x0000
62 u16 gpio_val;
63 #define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
64 u16 gpio_pwm_pos;
66 union { /* common for all chips */
67 struct {
68 u8 mobile_mode:1;
69 } host;
71 struct {
72 struct dib9000_fe_memory_map {
73 u16 addr;
74 u16 size;
75 } fe_mm[18];
76 u8 memcmd;
78 struct mutex mbx_if_lock; /* to protect read/write operations */
79 struct mutex mbx_lock; /* to protect the whole mailbox handling */
81 struct mutex mem_lock; /* to protect the memory accesses */
82 struct mutex mem_mbx_lock; /* to protect the memory-based mailbox */
84 #define MBX_MAX_WORDS (256 - 200 - 2)
85 #define DIB9000_MSG_CACHE_SIZE 2
86 u16 message_cache[DIB9000_MSG_CACHE_SIZE][MBX_MAX_WORDS];
87 u8 fw_is_running;
88 } risc;
89 } platform;
91 union { /* common for all platforms */
92 struct {
93 struct dib9000_config cfg;
94 } d9;
95 } chip;
97 struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
98 u16 component_bus_speed;
100 /* for the I2C transfer */
101 struct i2c_msg msg[2];
102 u8 i2c_write_buffer[255];
103 u8 i2c_read_buffer[255];
104 struct mutex demod_lock;
105 u8 get_frontend_internal;
106 struct dib9000_pid_ctrl pid_ctrl[10];
107 s8 pid_ctrl_index; /* -1: empty list; -2: do not use the list */
110 static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0
115 enum dib9000_power_mode {
116 DIB9000_POWER_ALL = 0,
118 DIB9000_POWER_NO,
119 DIB9000_POWER_INTERF_ANALOG_AGC,
120 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD,
121 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD,
122 DIB9000_POWER_INTERFACE_ONLY,
125 enum dib9000_out_messages {
126 OUT_MSG_HBM_ACK,
127 OUT_MSG_HOST_BUF_FAIL,
128 OUT_MSG_REQ_VERSION,
129 OUT_MSG_BRIDGE_I2C_W,
130 OUT_MSG_BRIDGE_I2C_R,
131 OUT_MSG_BRIDGE_APB_W,
132 OUT_MSG_BRIDGE_APB_R,
133 OUT_MSG_SCAN_CHANNEL,
134 OUT_MSG_MONIT_DEMOD,
135 OUT_MSG_CONF_GPIO,
136 OUT_MSG_DEBUG_HELP,
137 OUT_MSG_SUBBAND_SEL,
138 OUT_MSG_ENABLE_TIME_SLICE,
139 OUT_MSG_FE_FW_DL,
140 OUT_MSG_FE_CHANNEL_SEARCH,
141 OUT_MSG_FE_CHANNEL_TUNE,
142 OUT_MSG_FE_SLEEP,
143 OUT_MSG_FE_SYNC,
144 OUT_MSG_CTL_MONIT,
146 OUT_MSG_CONF_SVC,
147 OUT_MSG_SET_HBM,
148 OUT_MSG_INIT_DEMOD,
149 OUT_MSG_ENABLE_DIVERSITY,
150 OUT_MSG_SET_OUTPUT_MODE,
151 OUT_MSG_SET_PRIORITARY_CHANNEL,
152 OUT_MSG_ACK_FRG,
153 OUT_MSG_INIT_PMU,
156 enum dib9000_in_messages {
157 IN_MSG_DATA,
158 IN_MSG_FRAME_INFO,
159 IN_MSG_CTL_MONIT,
160 IN_MSG_ACK_FREE_ITEM,
161 IN_MSG_DEBUG_BUF,
162 IN_MSG_MPE_MONITOR,
163 IN_MSG_RAWTS_MONITOR,
164 IN_MSG_END_BRIDGE_I2C_RW,
165 IN_MSG_END_BRIDGE_APB_RW,
166 IN_MSG_VERSION,
167 IN_MSG_END_OF_SCAN,
168 IN_MSG_MONIT_DEMOD,
169 IN_MSG_ERROR,
170 IN_MSG_FE_FW_DL_DONE,
171 IN_MSG_EVENT,
172 IN_MSG_ACK_CHANGE_SVC,
173 IN_MSG_HBM_PROF,
176 /* memory_access requests */
177 #define FE_MM_W_CHANNEL 0
178 #define FE_MM_W_FE_INFO 1
179 #define FE_MM_RW_SYNC 2
181 #define FE_SYNC_CHANNEL 1
182 #define FE_SYNC_W_GENERIC_MONIT 2
183 #define FE_SYNC_COMPONENT_ACCESS 3
185 #define FE_MM_R_CHANNEL_SEARCH_STATE 3
186 #define FE_MM_R_CHANNEL_UNION_CONTEXT 4
187 #define FE_MM_R_FE_INFO 5
188 #define FE_MM_R_FE_MONITOR 6
190 #define FE_MM_W_CHANNEL_HEAD 7
191 #define FE_MM_W_CHANNEL_UNION 8
192 #define FE_MM_W_CHANNEL_CONTEXT 9
193 #define FE_MM_R_CHANNEL_UNION 10
194 #define FE_MM_R_CHANNEL_CONTEXT 11
195 #define FE_MM_R_CHANNEL_TUNE_STATE 12
197 #define FE_MM_R_GENERIC_MONITORING_SIZE 13
198 #define FE_MM_W_GENERIC_MONITORING 14
199 #define FE_MM_R_GENERIC_MONITORING 15
201 #define FE_MM_W_COMPONENT_ACCESS 16
202 #define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
203 static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len);
204 static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len);
206 static u16 to_fw_output_mode(u16 mode)
208 switch (mode) {
209 case OUTMODE_HIGH_Z:
210 return 0;
211 case OUTMODE_MPEG2_PAR_GATED_CLK:
212 return 4;
213 case OUTMODE_MPEG2_PAR_CONT_CLK:
214 return 8;
215 case OUTMODE_MPEG2_SERIAL:
216 return 16;
217 case OUTMODE_DIVERSITY:
218 return 128;
219 case OUTMODE_MPEG2_FIFO:
220 return 2;
221 case OUTMODE_ANALOG_ADC:
222 return 1;
223 default:
224 return 0;
228 static u16 dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 * b, u32 len, u16 attribute)
230 u32 chunk_size = 126;
231 u32 l;
232 int ret;
234 if (state->platform.risc.fw_is_running && (reg < 1024))
235 return dib9000_risc_apb_access_read(state, reg, attribute, NULL, 0, b, len);
237 memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
238 state->msg[0].addr = state->i2c.i2c_addr >> 1;
239 state->msg[0].flags = 0;
240 state->msg[0].buf = state->i2c_write_buffer;
241 state->msg[0].len = 2;
242 state->msg[1].addr = state->i2c.i2c_addr >> 1;
243 state->msg[1].flags = I2C_M_RD;
244 state->msg[1].buf = b;
245 state->msg[1].len = len;
247 state->i2c_write_buffer[0] = reg >> 8;
248 state->i2c_write_buffer[1] = reg & 0xff;
250 if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
251 state->i2c_write_buffer[0] |= (1 << 5);
252 if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
253 state->i2c_write_buffer[0] |= (1 << 4);
255 do {
256 l = len < chunk_size ? len : chunk_size;
257 state->msg[1].len = l;
258 state->msg[1].buf = b;
259 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 2) != 2 ? -EREMOTEIO : 0;
260 if (ret != 0) {
261 dprintk("i2c read error on %d", reg);
262 return -EREMOTEIO;
265 b += l;
266 len -= l;
268 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
269 reg += l / 2;
270 } while ((ret == 0) && len);
272 return 0;
275 static u16 dib9000_i2c_read16(struct i2c_device *i2c, u16 reg)
277 struct i2c_msg msg[2] = {
278 {.addr = i2c->i2c_addr >> 1, .flags = 0,
279 .buf = i2c->i2c_write_buffer, .len = 2},
280 {.addr = i2c->i2c_addr >> 1, .flags = I2C_M_RD,
281 .buf = i2c->i2c_read_buffer, .len = 2},
284 i2c->i2c_write_buffer[0] = reg >> 8;
285 i2c->i2c_write_buffer[1] = reg & 0xff;
287 if (i2c_transfer(i2c->i2c_adap, msg, 2) != 2) {
288 dprintk("read register %x error", reg);
289 return 0;
292 return (i2c->i2c_read_buffer[0] << 8) | i2c->i2c_read_buffer[1];
295 static inline u16 dib9000_read_word(struct dib9000_state *state, u16 reg)
297 if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2, 0) != 0)
298 return 0;
299 return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
302 static inline u16 dib9000_read_word_attr(struct dib9000_state *state, u16 reg, u16 attribute)
304 if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2,
305 attribute) != 0)
306 return 0;
307 return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
310 #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)
312 static u16 dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 * buf, u32 len, u16 attribute)
314 u32 chunk_size = 126;
315 u32 l;
316 int ret;
318 if (state->platform.risc.fw_is_running && (reg < 1024)) {
319 if (dib9000_risc_apb_access_write
320 (state, reg, DATA_BUS_ACCESS_MODE_16BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | attribute, buf, len) != 0)
321 return -EINVAL;
322 return 0;
325 memset(&state->msg[0], 0, sizeof(struct i2c_msg));
326 state->msg[0].addr = state->i2c.i2c_addr >> 1;
327 state->msg[0].flags = 0;
328 state->msg[0].buf = state->i2c_write_buffer;
329 state->msg[0].len = len + 2;
331 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
332 state->i2c_write_buffer[1] = (reg) & 0xff;
334 if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
335 state->i2c_write_buffer[0] |= (1 << 5);
336 if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
337 state->i2c_write_buffer[0] |= (1 << 4);
339 do {
340 l = len < chunk_size ? len : chunk_size;
341 state->msg[0].len = l + 2;
342 memcpy(&state->i2c_write_buffer[2], buf, l);
344 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
346 buf += l;
347 len -= l;
349 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
350 reg += l / 2;
351 } while ((ret == 0) && len);
353 return ret;
356 static int dib9000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
358 struct i2c_msg msg = {
359 .addr = i2c->i2c_addr >> 1, .flags = 0,
360 .buf = i2c->i2c_write_buffer, .len = 4
363 i2c->i2c_write_buffer[0] = (reg >> 8) & 0xff;
364 i2c->i2c_write_buffer[1] = reg & 0xff;
365 i2c->i2c_write_buffer[2] = (val >> 8) & 0xff;
366 i2c->i2c_write_buffer[3] = val & 0xff;
368 return i2c_transfer(i2c->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
371 static inline int dib9000_write_word(struct dib9000_state *state, u16 reg, u16 val)
373 u8 b[2] = { val >> 8, val & 0xff };
374 return dib9000_write16_attr(state, reg, b, 2, 0);
377 static inline int dib9000_write_word_attr(struct dib9000_state *state, u16 reg, u16 val, u16 attribute)
379 u8 b[2] = { val >> 8, val & 0xff };
380 return dib9000_write16_attr(state, reg, b, 2, attribute);
383 #define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
384 #define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
385 #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))
387 #define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
388 #define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
390 #define MAC_IRQ (1 << 1)
391 #define IRQ_POL_MSK (1 << 4)
393 #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)
394 #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)
396 static void dib9000_risc_mem_setup_cmd(struct dib9000_state *state, u32 addr, u32 len, u8 reading)
398 u8 b[14] = { 0 };
400 /* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
401 /* b[0] = 0 << 7; */
402 b[1] = 1;
404 /* b[2] = 0; */
405 /* b[3] = 0; */
406 b[4] = (u8) (addr >> 8);
407 b[5] = (u8) (addr & 0xff);
409 /* b[10] = 0; */
410 /* b[11] = 0; */
411 b[12] = (u8) (addr >> 8);
412 b[13] = (u8) (addr & 0xff);
414 addr += len;
415 /* b[6] = 0; */
416 /* b[7] = 0; */
417 b[8] = (u8) (addr >> 8);
418 b[9] = (u8) (addr & 0xff);
420 dib9000_write(state, 1056, b, 14);
421 if (reading)
422 dib9000_write_word(state, 1056, (1 << 15) | 1);
423 state->platform.risc.memcmd = -1; /* if it was called directly reset it - to force a future setup-call to set it */
426 static void dib9000_risc_mem_setup(struct dib9000_state *state, u8 cmd)
428 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd & 0x7f];
429 /* decide whether we need to "refresh" the memory controller */
430 if (state->platform.risc.memcmd == cmd && /* same command */
431 !(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 */
432 return;
433 dib9000_risc_mem_setup_cmd(state, m->addr, m->size, cmd & 0x80);
434 state->platform.risc.memcmd = cmd;
437 static int dib9000_risc_mem_read(struct dib9000_state *state, u8 cmd, u8 * b, u16 len)
439 if (!state->platform.risc.fw_is_running)
440 return -EIO;
442 if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
443 dprintk("could not get the lock");
444 return -EINTR;
446 dib9000_risc_mem_setup(state, cmd | 0x80);
447 dib9000_risc_mem_read_chunks(state, b, len);
448 mutex_unlock(&state->platform.risc.mem_lock);
449 return 0;
452 static int dib9000_risc_mem_write(struct dib9000_state *state, u8 cmd, const u8 * b)
454 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd];
455 if (!state->platform.risc.fw_is_running)
456 return -EIO;
458 if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
459 dprintk("could not get the lock");
460 return -EINTR;
462 dib9000_risc_mem_setup(state, cmd);
463 dib9000_risc_mem_write_chunks(state, b, m->size);
464 mutex_unlock(&state->platform.risc.mem_lock);
465 return 0;
468 static int dib9000_firmware_download(struct dib9000_state *state, u8 risc_id, u16 key, const u8 * code, u32 len)
470 u16 offs;
472 if (risc_id == 1)
473 offs = 16;
474 else
475 offs = 0;
477 /* config crtl reg */
478 dib9000_write_word(state, 1024 + offs, 0x000f);
479 dib9000_write_word(state, 1025 + offs, 0);
480 dib9000_write_word(state, 1031 + offs, key);
482 dprintk("going to download %dB of microcode", len);
483 if (dib9000_write16_noinc(state, 1026 + offs, (u8 *) code, (u16) len) != 0) {
484 dprintk("error while downloading microcode for RISC %c", 'A' + risc_id);
485 return -EIO;
488 dprintk("Microcode for RISC %c loaded", 'A' + risc_id);
490 return 0;
493 static int dib9000_mbx_host_init(struct dib9000_state *state, u8 risc_id)
495 u16 mbox_offs;
496 u16 reset_reg;
497 u16 tries = 1000;
499 if (risc_id == 1)
500 mbox_offs = 16;
501 else
502 mbox_offs = 0;
504 /* Reset mailbox */
505 dib9000_write_word(state, 1027 + mbox_offs, 0x8000);
507 /* Read reset status */
508 do {
509 reset_reg = dib9000_read_word(state, 1027 + mbox_offs);
510 msleep(100);
511 } while ((reset_reg & 0x8000) && --tries);
513 if (reset_reg & 0x8000) {
514 dprintk("MBX: init ERROR, no response from RISC %c", 'A' + risc_id);
515 return -EIO;
517 dprintk("MBX: initialized");
518 return 0;
521 #define MAX_MAILBOX_TRY 100
522 static int dib9000_mbx_send_attr(struct dib9000_state *state, u8 id, u16 * data, u8 len, u16 attr)
524 u8 *d, b[2];
525 u16 tmp;
526 u16 size;
527 u32 i;
528 int ret = 0;
530 if (!state->platform.risc.fw_is_running)
531 return -EINVAL;
533 if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
534 dprintk("could not get the lock");
535 return -EINTR;
537 tmp = MAX_MAILBOX_TRY;
538 do {
539 size = dib9000_read_word_attr(state, 1043, attr) & 0xff;
540 if ((size + len + 1) > MBX_MAX_WORDS && --tmp) {
541 dprintk("MBX: RISC mbx full, retrying");
542 msleep(100);
543 } else
544 break;
545 } while (1);
547 /*dprintk( "MBX: size: %d", size); */
549 if (tmp == 0) {
550 ret = -EINVAL;
551 goto out;
553 #ifdef DUMP_MSG
554 dprintk("--> %02x %d ", id, len + 1);
555 for (i = 0; i < len; i++)
556 dprintk("%04x ", data[i]);
557 dprintk("\n");
558 #endif
560 /* byte-order conversion - works on big (where it is not necessary) or little endian */
561 d = (u8 *) data;
562 for (i = 0; i < len; i++) {
563 tmp = data[i];
564 *d++ = tmp >> 8;
565 *d++ = tmp & 0xff;
568 /* write msg */
569 b[0] = id;
570 b[1] = len + 1;
571 if (dib9000_write16_noinc_attr(state, 1045, b, 2, attr) != 0 || dib9000_write16_noinc_attr(state, 1045, (u8 *) data, len * 2, attr) != 0) {
572 ret = -EIO;
573 goto out;
576 /* update register nb_mes_in_RX */
577 ret = (u8) dib9000_write_word_attr(state, 1043, 1 << 14, attr);
579 out:
580 mutex_unlock(&state->platform.risc.mbx_if_lock);
582 return ret;
585 static u8 dib9000_mbx_read(struct dib9000_state *state, u16 * data, u8 risc_id, u16 attr)
587 #ifdef DUMP_MSG
588 u16 *d = data;
589 #endif
591 u16 tmp, i;
592 u8 size;
593 u8 mc_base;
595 if (!state->platform.risc.fw_is_running)
596 return 0;
598 if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
599 dprintk("could not get the lock");
600 return 0;
602 if (risc_id == 1)
603 mc_base = 16;
604 else
605 mc_base = 0;
607 /* Length and type in the first word */
608 *data = dib9000_read_word_attr(state, 1029 + mc_base, attr);
610 size = *data & 0xff;
611 if (size <= MBX_MAX_WORDS) {
612 data++;
613 size--; /* Initial word already read */
615 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, size * 2, attr);
617 /* to word conversion */
618 for (i = 0; i < size; i++) {
619 tmp = *data;
620 *data = (tmp >> 8) | (tmp << 8);
621 data++;
624 #ifdef DUMP_MSG
625 dprintk("<-- ");
626 for (i = 0; i < size + 1; i++)
627 dprintk("%04x ", d[i]);
628 dprintk("\n");
629 #endif
630 } else {
631 dprintk("MBX: message is too big for message cache (%d), flushing message", size);
632 size--; /* Initial word already read */
633 while (size--)
634 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, 2, attr);
636 /* Update register nb_mes_in_TX */
637 dib9000_write_word_attr(state, 1028 + mc_base, 1 << 14, attr);
639 mutex_unlock(&state->platform.risc.mbx_if_lock);
641 return size + 1;
644 static int dib9000_risc_debug_buf(struct dib9000_state *state, u16 * data, u8 size)
646 u32 ts = data[1] << 16 | data[0];
647 char *b = (char *)&data[2];
649 b[2 * (size - 2) - 1] = '\0'; /* Bullet proof the buffer */
650 if (*b == '~') {
651 b++;
652 dprintk("%s", b);
653 } else
654 dprintk("RISC%d: %d.%04d %s", state->fe_id, ts / 10000, ts % 10000, *b ? b : "<empty>");
655 return 1;
658 static int dib9000_mbx_fetch_to_cache(struct dib9000_state *state, u16 attr)
660 int i;
661 u8 size;
662 u16 *block;
663 /* find a free slot */
664 for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
665 block = state->platform.risc.message_cache[i];
666 if (*block == 0) {
667 size = dib9000_mbx_read(state, block, 1, attr);
669 /* dprintk( "MBX: fetched %04x message to cache", *block); */
671 switch (*block >> 8) {
672 case IN_MSG_DEBUG_BUF:
673 dib9000_risc_debug_buf(state, block + 1, size); /* debug-messages are going to be printed right away */
674 *block = 0; /* free the block */
675 break;
676 #if 0
677 case IN_MSG_DATA: /* FE-TRACE */
678 dib9000_risc_data_process(state, block + 1, size);
679 *block = 0;
680 break;
681 #endif
682 default:
683 break;
686 return 1;
689 dprintk("MBX: no free cache-slot found for new message...");
690 return -1;
693 static u8 dib9000_mbx_count(struct dib9000_state *state, u8 risc_id, u16 attr)
695 if (risc_id == 0)
696 return (u8) (dib9000_read_word_attr(state, 1028, attr) >> 10) & 0x1f; /* 5 bit field */
697 else
698 return (u8) (dib9000_read_word_attr(state, 1044, attr) >> 8) & 0x7f; /* 7 bit field */
701 static int dib9000_mbx_process(struct dib9000_state *state, u16 attr)
703 int ret = 0;
705 if (!state->platform.risc.fw_is_running)
706 return -1;
708 if (mutex_lock_interruptible(&state->platform.risc.mbx_lock) < 0) {
709 dprintk("could not get the lock");
710 return -1;
713 if (dib9000_mbx_count(state, 1, attr)) /* 1=RiscB */
714 ret = dib9000_mbx_fetch_to_cache(state, attr);
716 dib9000_read_word_attr(state, 1229, attr); /* Clear the IRQ */
717 /* if (tmp) */
718 /* dprintk( "cleared IRQ: %x", tmp); */
719 mutex_unlock(&state->platform.risc.mbx_lock);
721 return ret;
724 static int dib9000_mbx_get_message_attr(struct dib9000_state *state, u16 id, u16 * msg, u8 * size, u16 attr)
726 u8 i;
727 u16 *block;
728 u16 timeout = 30;
730 *msg = 0;
731 do {
732 /* dib9000_mbx_get_from_cache(); */
733 for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
734 block = state->platform.risc.message_cache[i];
735 if ((*block >> 8) == id) {
736 *size = (*block & 0xff) - 1;
737 memcpy(msg, block + 1, (*size) * 2);
738 *block = 0; /* free the block */
739 i = 0; /* signal that we found a message */
740 break;
744 if (i == 0)
745 break;
747 if (dib9000_mbx_process(state, attr) == -1) /* try to fetch one message - if any */
748 return -1;
750 } while (--timeout);
752 if (timeout == 0) {
753 dprintk("waiting for message %d timed out", id);
754 return -1;
757 return i == 0;
760 static int dib9000_risc_check_version(struct dib9000_state *state)
762 u8 r[4];
763 u8 size;
764 u16 fw_version = 0;
766 if (dib9000_mbx_send(state, OUT_MSG_REQ_VERSION, &fw_version, 1) != 0)
767 return -EIO;
769 if (dib9000_mbx_get_message(state, IN_MSG_VERSION, (u16 *) r, &size) < 0)
770 return -EIO;
772 fw_version = (r[0] << 8) | r[1];
773 dprintk("RISC: ver: %d.%02d (IC: %d)", fw_version >> 10, fw_version & 0x3ff, (r[2] << 8) | r[3]);
775 if ((fw_version >> 10) != 7)
776 return -EINVAL;
778 switch (fw_version & 0x3ff) {
779 case 11:
780 case 12:
781 case 14:
782 case 15:
783 case 16:
784 case 17:
785 break;
786 default:
787 dprintk("RISC: invalid firmware version");
788 return -EINVAL;
791 dprintk("RISC: valid firmware version");
792 return 0;
795 static int dib9000_fw_boot(struct dib9000_state *state, const u8 * codeA, u32 lenA, const u8 * codeB, u32 lenB)
797 /* Reconfig pool mac ram */
798 dib9000_write_word(state, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
799 dib9000_write_word(state, 1226, 0x05);
801 /* Toggles IP crypto to Host APB interface. */
802 dib9000_write_word(state, 1542, 1);
804 /* Set jump and no jump in the dma box */
805 dib9000_write_word(state, 1074, 0);
806 dib9000_write_word(state, 1075, 0);
808 /* Set MAC as APB Master. */
809 dib9000_write_word(state, 1237, 0);
811 /* Reset the RISCs */
812 if (codeA != NULL)
813 dib9000_write_word(state, 1024, 2);
814 else
815 dib9000_write_word(state, 1024, 15);
816 if (codeB != NULL)
817 dib9000_write_word(state, 1040, 2);
819 if (codeA != NULL)
820 dib9000_firmware_download(state, 0, 0x1234, codeA, lenA);
821 if (codeB != NULL)
822 dib9000_firmware_download(state, 1, 0x1234, codeB, lenB);
824 /* Run the RISCs */
825 if (codeA != NULL)
826 dib9000_write_word(state, 1024, 0);
827 if (codeB != NULL)
828 dib9000_write_word(state, 1040, 0);
830 if (codeA != NULL)
831 if (dib9000_mbx_host_init(state, 0) != 0)
832 return -EIO;
833 if (codeB != NULL)
834 if (dib9000_mbx_host_init(state, 1) != 0)
835 return -EIO;
837 msleep(100);
838 state->platform.risc.fw_is_running = 1;
840 if (dib9000_risc_check_version(state) != 0)
841 return -EINVAL;
843 state->platform.risc.memcmd = 0xff;
844 return 0;
847 static u16 dib9000_identify(struct i2c_device *client)
849 u16 value;
851 value = dib9000_i2c_read16(client, 896);
852 if (value != 0x01b3) {
853 dprintk("wrong Vendor ID (0x%x)", value);
854 return 0;
857 value = dib9000_i2c_read16(client, 897);
858 if (value != 0x4000 && value != 0x4001 && value != 0x4002 && value != 0x4003 && value != 0x4004 && value != 0x4005) {
859 dprintk("wrong Device ID (0x%x)", value);
860 return 0;
863 /* protect this driver to be used with 7000PC */
864 if (value == 0x4000 && dib9000_i2c_read16(client, 769) == 0x4000) {
865 dprintk("this driver does not work with DiB7000PC");
866 return 0;
869 switch (value) {
870 case 0x4000:
871 dprintk("found DiB7000MA/PA/MB/PB");
872 break;
873 case 0x4001:
874 dprintk("found DiB7000HC");
875 break;
876 case 0x4002:
877 dprintk("found DiB7000MC");
878 break;
879 case 0x4003:
880 dprintk("found DiB9000A");
881 break;
882 case 0x4004:
883 dprintk("found DiB9000H");
884 break;
885 case 0x4005:
886 dprintk("found DiB9000M");
887 break;
890 return value;
893 static void dib9000_set_power_mode(struct dib9000_state *state, enum dib9000_power_mode mode)
895 /* by default everything is going to be powered off */
896 u16 reg_903 = 0x3fff, reg_904 = 0xffff, reg_905 = 0xffff, reg_906;
897 u8 offset;
899 if (state->revision == 0x4003 || state->revision == 0x4004 || state->revision == 0x4005)
900 offset = 1;
901 else
902 offset = 0;
904 reg_906 = dib9000_read_word(state, 906 + offset) | 0x3; /* keep settings for RISC */
906 /* now, depending on the requested mode, we power on */
907 switch (mode) {
908 /* power up everything in the demod */
909 case DIB9000_POWER_ALL:
910 reg_903 = 0x0000;
911 reg_904 = 0x0000;
912 reg_905 = 0x0000;
913 reg_906 = 0x0000;
914 break;
916 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
917 case DIB9000_POWER_INTERFACE_ONLY: /* TODO power up either SDIO or I2C or SRAM */
918 reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
919 break;
921 case DIB9000_POWER_INTERF_ANALOG_AGC:
922 reg_903 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
923 reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
924 reg_906 &= ~((1 << 0));
925 break;
927 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD:
928 reg_903 = 0x0000;
929 reg_904 = 0x801f;
930 reg_905 = 0x0000;
931 reg_906 &= ~((1 << 0));
932 break;
934 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD:
935 reg_903 = 0x0000;
936 reg_904 = 0x8000;
937 reg_905 = 0x010b;
938 reg_906 &= ~((1 << 0));
939 break;
940 default:
941 case DIB9000_POWER_NO:
942 break;
945 /* always power down unused parts */
946 if (!state->platform.host.mobile_mode)
947 reg_904 |= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
949 /* P_sdio_select_clk = 0 on MC and after */
950 if (state->revision != 0x4000)
951 reg_906 <<= 1;
953 dib9000_write_word(state, 903 + offset, reg_903);
954 dib9000_write_word(state, 904 + offset, reg_904);
955 dib9000_write_word(state, 905 + offset, reg_905);
956 dib9000_write_word(state, 906 + offset, reg_906);
959 static int dib9000_fw_reset(struct dvb_frontend *fe)
961 struct dib9000_state *state = fe->demodulator_priv;
963 dib9000_write_word(state, 1817, 0x0003);
965 dib9000_write_word(state, 1227, 1);
966 dib9000_write_word(state, 1227, 0);
968 switch ((state->revision = dib9000_identify(&state->i2c))) {
969 case 0x4003:
970 case 0x4004:
971 case 0x4005:
972 state->reg_offs = 1;
973 break;
974 default:
975 return -EINVAL;
978 /* reset the i2c-master to use the host interface */
979 dibx000_reset_i2c_master(&state->i2c_master);
981 dib9000_set_power_mode(state, DIB9000_POWER_ALL);
983 /* unforce divstr regardless whether i2c enumeration was done or not */
984 dib9000_write_word(state, 1794, dib9000_read_word(state, 1794) & ~(1 << 1));
985 dib9000_write_word(state, 1796, 0);
986 dib9000_write_word(state, 1805, 0x805);
988 /* restart all parts */
989 dib9000_write_word(state, 898, 0xffff);
990 dib9000_write_word(state, 899, 0xffff);
991 dib9000_write_word(state, 900, 0x0001);
992 dib9000_write_word(state, 901, 0xff19);
993 dib9000_write_word(state, 902, 0x003c);
995 dib9000_write_word(state, 898, 0);
996 dib9000_write_word(state, 899, 0);
997 dib9000_write_word(state, 900, 0);
998 dib9000_write_word(state, 901, 0);
999 dib9000_write_word(state, 902, 0);
1001 dib9000_write_word(state, 911, state->chip.d9.cfg.if_drives);
1003 dib9000_set_power_mode(state, DIB9000_POWER_INTERFACE_ONLY);
1005 return 0;
1008 static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len)
1010 u16 mb[10];
1011 u8 i, s;
1013 if (address >= 1024 || !state->platform.risc.fw_is_running)
1014 return -EINVAL;
1016 /* dprintk( "APB access thru rd fw %d %x", address, attribute); */
1018 mb[0] = (u16) address;
1019 mb[1] = len / 2;
1020 dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_R, mb, 2, attribute);
1021 switch (dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute)) {
1022 case 1:
1023 s--;
1024 for (i = 0; i < s; i++) {
1025 b[i * 2] = (mb[i + 1] >> 8) & 0xff;
1026 b[i * 2 + 1] = (mb[i + 1]) & 0xff;
1028 return 0;
1029 default:
1030 return -EIO;
1032 return -EIO;
1035 static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len)
1037 u16 mb[10];
1038 u8 s, i;
1040 if (address >= 1024 || !state->platform.risc.fw_is_running)
1041 return -EINVAL;
1043 /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1045 mb[0] = (unsigned short)address;
1046 for (i = 0; i < len && i < 20; i += 2)
1047 mb[1 + (i / 2)] = (b[i] << 8 | b[i + 1]);
1049 dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_W, mb, 1 + len / 2, attribute);
1050 return dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute) == 1 ? 0 : -EINVAL;
1053 static int dib9000_fw_memmbx_sync(struct dib9000_state *state, u8 i)
1055 u8 index_loop = 10;
1057 if (!state->platform.risc.fw_is_running)
1058 return 0;
1059 dib9000_risc_mem_write(state, FE_MM_RW_SYNC, &i);
1060 do {
1061 dib9000_risc_mem_read(state, FE_MM_RW_SYNC, state->i2c_read_buffer, 1);
1062 } while (state->i2c_read_buffer[0] && index_loop--);
1064 if (index_loop > 0)
1065 return 0;
1066 return -EIO;
1069 static int dib9000_fw_init(struct dib9000_state *state)
1071 struct dibGPIOFunction *f;
1072 u16 b[40] = { 0 };
1073 u8 i;
1074 u8 size;
1076 if (dib9000_fw_boot(state, NULL, 0, state->chip.d9.cfg.microcode_B_fe_buffer, state->chip.d9.cfg.microcode_B_fe_size) != 0)
1077 return -EIO;
1079 /* initialize the firmware */
1080 for (i = 0; i < ARRAY_SIZE(state->chip.d9.cfg.gpio_function); i++) {
1081 f = &state->chip.d9.cfg.gpio_function[i];
1082 if (f->mask) {
1083 switch (f->function) {
1084 case BOARD_GPIO_FUNCTION_COMPONENT_ON:
1085 b[0] = (u16) f->mask;
1086 b[1] = (u16) f->direction;
1087 b[2] = (u16) f->value;
1088 break;
1089 case BOARD_GPIO_FUNCTION_COMPONENT_OFF:
1090 b[3] = (u16) f->mask;
1091 b[4] = (u16) f->direction;
1092 b[5] = (u16) f->value;
1093 break;
1097 if (dib9000_mbx_send(state, OUT_MSG_CONF_GPIO, b, 15) != 0)
1098 return -EIO;
1100 /* subband */
1101 b[0] = state->chip.d9.cfg.subband.size; /* type == 0 -> GPIO - PWM not yet supported */
1102 for (i = 0; i < state->chip.d9.cfg.subband.size; i++) {
1103 b[1 + i * 4] = state->chip.d9.cfg.subband.subband[i].f_mhz;
1104 b[2 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.mask;
1105 b[3 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.direction;
1106 b[4 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.value;
1108 b[1 + i * 4] = 0; /* fe_id */
1109 if (dib9000_mbx_send(state, OUT_MSG_SUBBAND_SEL, b, 2 + 4 * i) != 0)
1110 return -EIO;
1112 /* 0 - id, 1 - no_of_frontends */
1113 b[0] = (0 << 8) | 1;
1114 /* 0 = i2c-address demod, 0 = tuner */
1115 b[1] = (0 << 8) | (0);
1116 b[2] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000) >> 16) & 0xffff);
1117 b[3] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000)) & 0xffff);
1118 b[4] = (u16) ((state->chip.d9.cfg.vcxo_timer >> 16) & 0xffff);
1119 b[5] = (u16) ((state->chip.d9.cfg.vcxo_timer) & 0xffff);
1120 b[6] = (u16) ((state->chip.d9.cfg.timing_frequency >> 16) & 0xffff);
1121 b[7] = (u16) ((state->chip.d9.cfg.timing_frequency) & 0xffff);
1122 b[29] = state->chip.d9.cfg.if_drives;
1123 if (dib9000_mbx_send(state, OUT_MSG_INIT_DEMOD, b, ARRAY_SIZE(b)) != 0)
1124 return -EIO;
1126 if (dib9000_mbx_send(state, OUT_MSG_FE_FW_DL, NULL, 0) != 0)
1127 return -EIO;
1129 if (dib9000_mbx_get_message(state, IN_MSG_FE_FW_DL_DONE, b, &size) < 0)
1130 return -EIO;
1132 if (size > ARRAY_SIZE(b)) {
1133 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size,
1134 (int)ARRAY_SIZE(b));
1135 return -EINVAL;
1138 for (i = 0; i < size; i += 2) {
1139 state->platform.risc.fe_mm[i / 2].addr = b[i + 0];
1140 state->platform.risc.fe_mm[i / 2].size = b[i + 1];
1143 return 0;
1146 static void dib9000_fw_set_channel_head(struct dib9000_state *state)
1148 u8 b[9];
1149 u32 freq = state->fe[0]->dtv_property_cache.frequency / 1000;
1150 if (state->fe_id % 2)
1151 freq += 101;
1153 b[0] = (u8) ((freq >> 0) & 0xff);
1154 b[1] = (u8) ((freq >> 8) & 0xff);
1155 b[2] = (u8) ((freq >> 16) & 0xff);
1156 b[3] = (u8) ((freq >> 24) & 0xff);
1157 b[4] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 0) & 0xff);
1158 b[5] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 8) & 0xff);
1159 b[6] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 16) & 0xff);
1160 b[7] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 24) & 0xff);
1161 b[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1162 if (state->fe[0]->dtv_property_cache.delivery_system == SYS_DVBT)
1163 b[8] |= 1;
1164 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_HEAD, b);
1167 static int dib9000_fw_get_channel(struct dvb_frontend *fe)
1169 struct dib9000_state *state = fe->demodulator_priv;
1170 struct dibDVBTChannel {
1171 s8 spectrum_inversion;
1173 s8 nfft;
1174 s8 guard;
1175 s8 constellation;
1177 s8 hrch;
1178 s8 alpha;
1179 s8 code_rate_hp;
1180 s8 code_rate_lp;
1181 s8 select_hp;
1183 s8 intlv_native;
1185 struct dibDVBTChannel *ch;
1186 int ret = 0;
1188 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1189 dprintk("could not get the lock");
1190 return -EINTR;
1192 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
1193 ret = -EIO;
1194 goto error;
1197 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_UNION,
1198 state->i2c_read_buffer, sizeof(struct dibDVBTChannel));
1199 ch = (struct dibDVBTChannel *)state->i2c_read_buffer;
1202 switch (ch->spectrum_inversion & 0x7) {
1203 case 1:
1204 state->fe[0]->dtv_property_cache.inversion = INVERSION_ON;
1205 break;
1206 case 0:
1207 state->fe[0]->dtv_property_cache.inversion = INVERSION_OFF;
1208 break;
1209 default:
1210 case -1:
1211 state->fe[0]->dtv_property_cache.inversion = INVERSION_AUTO;
1212 break;
1214 switch (ch->nfft) {
1215 case 0:
1216 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
1217 break;
1218 case 2:
1219 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
1220 break;
1221 case 1:
1222 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
1223 break;
1224 default:
1225 case -1:
1226 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
1227 break;
1229 switch (ch->guard) {
1230 case 0:
1231 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
1232 break;
1233 case 1:
1234 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
1235 break;
1236 case 2:
1237 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
1238 break;
1239 case 3:
1240 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
1241 break;
1242 default:
1243 case -1:
1244 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
1245 break;
1247 switch (ch->constellation) {
1248 case 2:
1249 state->fe[0]->dtv_property_cache.modulation = QAM_64;
1250 break;
1251 case 1:
1252 state->fe[0]->dtv_property_cache.modulation = QAM_16;
1253 break;
1254 case 0:
1255 state->fe[0]->dtv_property_cache.modulation = QPSK;
1256 break;
1257 default:
1258 case -1:
1259 state->fe[0]->dtv_property_cache.modulation = QAM_AUTO;
1260 break;
1262 switch (ch->hrch) {
1263 case 0:
1264 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_NONE;
1265 break;
1266 case 1:
1267 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_1;
1268 break;
1269 default:
1270 case -1:
1271 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
1272 break;
1274 switch (ch->code_rate_hp) {
1275 case 1:
1276 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_1_2;
1277 break;
1278 case 2:
1279 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_2_3;
1280 break;
1281 case 3:
1282 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_3_4;
1283 break;
1284 case 5:
1285 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_5_6;
1286 break;
1287 case 7:
1288 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_7_8;
1289 break;
1290 default:
1291 case -1:
1292 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_AUTO;
1293 break;
1295 switch (ch->code_rate_lp) {
1296 case 1:
1297 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_1_2;
1298 break;
1299 case 2:
1300 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_2_3;
1301 break;
1302 case 3:
1303 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_3_4;
1304 break;
1305 case 5:
1306 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_5_6;
1307 break;
1308 case 7:
1309 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_7_8;
1310 break;
1311 default:
1312 case -1:
1313 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_AUTO;
1314 break;
1317 error:
1318 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1319 return ret;
1322 static int dib9000_fw_set_channel_union(struct dvb_frontend *fe)
1324 struct dib9000_state *state = fe->demodulator_priv;
1325 struct dibDVBTChannel {
1326 s8 spectrum_inversion;
1328 s8 nfft;
1329 s8 guard;
1330 s8 constellation;
1332 s8 hrch;
1333 s8 alpha;
1334 s8 code_rate_hp;
1335 s8 code_rate_lp;
1336 s8 select_hp;
1338 s8 intlv_native;
1340 struct dibDVBTChannel ch;
1342 switch (state->fe[0]->dtv_property_cache.inversion) {
1343 case INVERSION_ON:
1344 ch.spectrum_inversion = 1;
1345 break;
1346 case INVERSION_OFF:
1347 ch.spectrum_inversion = 0;
1348 break;
1349 default:
1350 case INVERSION_AUTO:
1351 ch.spectrum_inversion = -1;
1352 break;
1354 switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1355 case TRANSMISSION_MODE_2K:
1356 ch.nfft = 0;
1357 break;
1358 case TRANSMISSION_MODE_4K:
1359 ch.nfft = 2;
1360 break;
1361 case TRANSMISSION_MODE_8K:
1362 ch.nfft = 1;
1363 break;
1364 default:
1365 case TRANSMISSION_MODE_AUTO:
1366 ch.nfft = 1;
1367 break;
1369 switch (state->fe[0]->dtv_property_cache.guard_interval) {
1370 case GUARD_INTERVAL_1_32:
1371 ch.guard = 0;
1372 break;
1373 case GUARD_INTERVAL_1_16:
1374 ch.guard = 1;
1375 break;
1376 case GUARD_INTERVAL_1_8:
1377 ch.guard = 2;
1378 break;
1379 case GUARD_INTERVAL_1_4:
1380 ch.guard = 3;
1381 break;
1382 default:
1383 case GUARD_INTERVAL_AUTO:
1384 ch.guard = -1;
1385 break;
1387 switch (state->fe[0]->dtv_property_cache.modulation) {
1388 case QAM_64:
1389 ch.constellation = 2;
1390 break;
1391 case QAM_16:
1392 ch.constellation = 1;
1393 break;
1394 case QPSK:
1395 ch.constellation = 0;
1396 break;
1397 default:
1398 case QAM_AUTO:
1399 ch.constellation = -1;
1400 break;
1402 switch (state->fe[0]->dtv_property_cache.hierarchy) {
1403 case HIERARCHY_NONE:
1404 ch.hrch = 0;
1405 break;
1406 case HIERARCHY_1:
1407 case HIERARCHY_2:
1408 case HIERARCHY_4:
1409 ch.hrch = 1;
1410 break;
1411 default:
1412 case HIERARCHY_AUTO:
1413 ch.hrch = -1;
1414 break;
1416 ch.alpha = 1;
1417 switch (state->fe[0]->dtv_property_cache.code_rate_HP) {
1418 case FEC_1_2:
1419 ch.code_rate_hp = 1;
1420 break;
1421 case FEC_2_3:
1422 ch.code_rate_hp = 2;
1423 break;
1424 case FEC_3_4:
1425 ch.code_rate_hp = 3;
1426 break;
1427 case FEC_5_6:
1428 ch.code_rate_hp = 5;
1429 break;
1430 case FEC_7_8:
1431 ch.code_rate_hp = 7;
1432 break;
1433 default:
1434 case FEC_AUTO:
1435 ch.code_rate_hp = -1;
1436 break;
1438 switch (state->fe[0]->dtv_property_cache.code_rate_LP) {
1439 case FEC_1_2:
1440 ch.code_rate_lp = 1;
1441 break;
1442 case FEC_2_3:
1443 ch.code_rate_lp = 2;
1444 break;
1445 case FEC_3_4:
1446 ch.code_rate_lp = 3;
1447 break;
1448 case FEC_5_6:
1449 ch.code_rate_lp = 5;
1450 break;
1451 case FEC_7_8:
1452 ch.code_rate_lp = 7;
1453 break;
1454 default:
1455 case FEC_AUTO:
1456 ch.code_rate_lp = -1;
1457 break;
1459 ch.select_hp = 1;
1460 ch.intlv_native = 1;
1462 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_UNION, (u8 *) &ch);
1464 return 0;
1467 static int dib9000_fw_tune(struct dvb_frontend *fe)
1469 struct dib9000_state *state = fe->demodulator_priv;
1470 int ret = 10, search = state->channel_status.status == CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1471 s8 i;
1473 switch (state->tune_state) {
1474 case CT_DEMOD_START:
1475 dib9000_fw_set_channel_head(state);
1477 /* write the channel context - a channel is initialized to 0, so it is OK */
1478 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_CONTEXT, (u8 *) fe_info);
1479 dib9000_risc_mem_write(state, FE_MM_W_FE_INFO, (u8 *) fe_info);
1481 if (search)
1482 dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_SEARCH, NULL, 0);
1483 else {
1484 dib9000_fw_set_channel_union(fe);
1485 dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_TUNE, NULL, 0);
1487 state->tune_state = CT_DEMOD_STEP_1;
1488 break;
1489 case CT_DEMOD_STEP_1:
1490 if (search)
1491 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_SEARCH_STATE, state->i2c_read_buffer, 1);
1492 else
1493 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_TUNE_STATE, state->i2c_read_buffer, 1);
1494 i = (s8)state->i2c_read_buffer[0];
1495 switch (i) { /* something happened */
1496 case 0:
1497 break;
1498 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1499 if (search)
1500 state->status = FE_STATUS_DEMOD_SUCCESS;
1501 else {
1502 state->tune_state = CT_DEMOD_STOP;
1503 state->status = FE_STATUS_LOCKED;
1505 break;
1506 default:
1507 state->status = FE_STATUS_TUNE_FAILED;
1508 state->tune_state = CT_DEMOD_STOP;
1509 break;
1511 break;
1512 default:
1513 ret = FE_CALLBACK_TIME_NEVER;
1514 break;
1517 return ret;
1520 static int dib9000_fw_set_diversity_in(struct dvb_frontend *fe, int onoff)
1522 struct dib9000_state *state = fe->demodulator_priv;
1523 u16 mode = (u16) onoff;
1524 return dib9000_mbx_send(state, OUT_MSG_ENABLE_DIVERSITY, &mode, 1);
1527 static int dib9000_fw_set_output_mode(struct dvb_frontend *fe, int mode)
1529 struct dib9000_state *state = fe->demodulator_priv;
1530 u16 outreg, smo_mode;
1532 dprintk("setting output mode for demod %p to %d", fe, mode);
1534 switch (mode) {
1535 case OUTMODE_MPEG2_PAR_GATED_CLK:
1536 outreg = (1 << 10); /* 0x0400 */
1537 break;
1538 case OUTMODE_MPEG2_PAR_CONT_CLK:
1539 outreg = (1 << 10) | (1 << 6); /* 0x0440 */
1540 break;
1541 case OUTMODE_MPEG2_SERIAL:
1542 outreg = (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1543 break;
1544 case OUTMODE_DIVERSITY:
1545 outreg = (1 << 10) | (4 << 6); /* 0x0500 */
1546 break;
1547 case OUTMODE_MPEG2_FIFO:
1548 outreg = (1 << 10) | (5 << 6);
1549 break;
1550 case OUTMODE_HIGH_Z:
1551 outreg = 0;
1552 break;
1553 default:
1554 dprintk("Unhandled output_mode passed to be set for demod %p", &state->fe[0]);
1555 return -EINVAL;
1558 dib9000_write_word(state, 1795, outreg);
1560 switch (mode) {
1561 case OUTMODE_MPEG2_PAR_GATED_CLK:
1562 case OUTMODE_MPEG2_PAR_CONT_CLK:
1563 case OUTMODE_MPEG2_SERIAL:
1564 case OUTMODE_MPEG2_FIFO:
1565 smo_mode = (dib9000_read_word(state, 295) & 0x0010) | (1 << 1);
1566 if (state->chip.d9.cfg.output_mpeg2_in_188_bytes)
1567 smo_mode |= (1 << 5);
1568 dib9000_write_word(state, 295, smo_mode);
1569 break;
1572 outreg = to_fw_output_mode(mode);
1573 return dib9000_mbx_send(state, OUT_MSG_SET_OUTPUT_MODE, &outreg, 1);
1576 static int dib9000_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1578 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1579 u16 i, len, t, index_msg;
1581 for (index_msg = 0; index_msg < num; index_msg++) {
1582 if (msg[index_msg].flags & I2C_M_RD) { /* read */
1583 len = msg[index_msg].len;
1584 if (len > 16)
1585 len = 16;
1587 if (dib9000_read_word(state, 790) != 0)
1588 dprintk("TunerITF: read busy");
1590 dib9000_write_word(state, 784, (u16) (msg[index_msg].addr));
1591 dib9000_write_word(state, 787, (len / 2) - 1);
1592 dib9000_write_word(state, 786, 1); /* start read */
1594 i = 1000;
1595 while (dib9000_read_word(state, 790) != (len / 2) && i)
1596 i--;
1598 if (i == 0)
1599 dprintk("TunerITF: read failed");
1601 for (i = 0; i < len; i += 2) {
1602 t = dib9000_read_word(state, 785);
1603 msg[index_msg].buf[i] = (t >> 8) & 0xff;
1604 msg[index_msg].buf[i + 1] = (t) & 0xff;
1606 if (dib9000_read_word(state, 790) != 0)
1607 dprintk("TunerITF: read more data than expected");
1608 } else {
1609 i = 1000;
1610 while (dib9000_read_word(state, 789) && i)
1611 i--;
1612 if (i == 0)
1613 dprintk("TunerITF: write busy");
1615 len = msg[index_msg].len;
1616 if (len > 16)
1617 len = 16;
1619 for (i = 0; i < len; i += 2)
1620 dib9000_write_word(state, 785, (msg[index_msg].buf[i] << 8) | msg[index_msg].buf[i + 1]);
1621 dib9000_write_word(state, 784, (u16) msg[index_msg].addr);
1622 dib9000_write_word(state, 787, (len / 2) - 1);
1623 dib9000_write_word(state, 786, 0); /* start write */
1625 i = 1000;
1626 while (dib9000_read_word(state, 791) > 0 && i)
1627 i--;
1628 if (i == 0)
1629 dprintk("TunerITF: write failed");
1632 return num;
1635 int dib9000_fw_set_component_bus_speed(struct dvb_frontend *fe, u16 speed)
1637 struct dib9000_state *state = fe->demodulator_priv;
1639 state->component_bus_speed = speed;
1640 return 0;
1642 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed);
1644 static int dib9000_fw_component_bus_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1646 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1647 u8 type = 0; /* I2C */
1648 u8 port = DIBX000_I2C_INTERFACE_GPIO_3_4;
1649 u16 scl = state->component_bus_speed; /* SCL frequency */
1650 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[FE_MM_RW_COMPONENT_ACCESS_BUFFER];
1651 u8 p[13] = { 0 };
1653 p[0] = type;
1654 p[1] = port;
1655 p[2] = msg[0].addr << 1;
1657 p[3] = (u8) scl & 0xff; /* scl */
1658 p[4] = (u8) (scl >> 8);
1660 p[7] = 0;
1661 p[8] = 0;
1663 p[9] = (u8) (msg[0].len);
1664 p[10] = (u8) (msg[0].len >> 8);
1665 if ((num > 1) && (msg[1].flags & I2C_M_RD)) {
1666 p[11] = (u8) (msg[1].len);
1667 p[12] = (u8) (msg[1].len >> 8);
1668 } else {
1669 p[11] = 0;
1670 p[12] = 0;
1673 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1674 dprintk("could not get the lock");
1675 return 0;
1678 dib9000_risc_mem_write(state, FE_MM_W_COMPONENT_ACCESS, p);
1680 { /* write-part */
1681 dib9000_risc_mem_setup_cmd(state, m->addr, msg[0].len, 0);
1682 dib9000_risc_mem_write_chunks(state, msg[0].buf, msg[0].len);
1685 /* do the transaction */
1686 if (dib9000_fw_memmbx_sync(state, FE_SYNC_COMPONENT_ACCESS) < 0) {
1687 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1688 return 0;
1691 /* read back any possible result */
1692 if ((num > 1) && (msg[1].flags & I2C_M_RD))
1693 dib9000_risc_mem_read(state, FE_MM_RW_COMPONENT_ACCESS_BUFFER, msg[1].buf, msg[1].len);
1695 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1697 return num;
1700 static u32 dib9000_i2c_func(struct i2c_adapter *adapter)
1702 return I2C_FUNC_I2C;
1705 static struct i2c_algorithm dib9000_tuner_algo = {
1706 .master_xfer = dib9000_tuner_xfer,
1707 .functionality = dib9000_i2c_func,
1710 static struct i2c_algorithm dib9000_component_bus_algo = {
1711 .master_xfer = dib9000_fw_component_bus_xfer,
1712 .functionality = dib9000_i2c_func,
1715 struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe)
1717 struct dib9000_state *st = fe->demodulator_priv;
1718 return &st->tuner_adap;
1720 EXPORT_SYMBOL(dib9000_get_tuner_interface);
1722 struct i2c_adapter *dib9000_get_component_bus_interface(struct dvb_frontend *fe)
1724 struct dib9000_state *st = fe->demodulator_priv;
1725 return &st->component_bus;
1727 EXPORT_SYMBOL(dib9000_get_component_bus_interface);
1729 struct i2c_adapter *dib9000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
1731 struct dib9000_state *st = fe->demodulator_priv;
1732 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
1734 EXPORT_SYMBOL(dib9000_get_i2c_master);
1736 int dib9000_set_i2c_adapter(struct dvb_frontend *fe, struct i2c_adapter *i2c)
1738 struct dib9000_state *st = fe->demodulator_priv;
1740 st->i2c.i2c_adap = i2c;
1741 return 0;
1743 EXPORT_SYMBOL(dib9000_set_i2c_adapter);
1745 static int dib9000_cfg_gpio(struct dib9000_state *st, u8 num, u8 dir, u8 val)
1747 st->gpio_dir = dib9000_read_word(st, 773);
1748 st->gpio_dir &= ~(1 << num); /* reset the direction bit */
1749 st->gpio_dir |= (dir & 0x1) << num; /* set the new direction */
1750 dib9000_write_word(st, 773, st->gpio_dir);
1752 st->gpio_val = dib9000_read_word(st, 774);
1753 st->gpio_val &= ~(1 << num); /* reset the direction bit */
1754 st->gpio_val |= (val & 0x01) << num; /* set the new value */
1755 dib9000_write_word(st, 774, st->gpio_val);
1757 dprintk("gpio dir: %04x: gpio val: %04x", st->gpio_dir, st->gpio_val);
1759 return 0;
1762 int dib9000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
1764 struct dib9000_state *state = fe->demodulator_priv;
1765 return dib9000_cfg_gpio(state, num, dir, val);
1767 EXPORT_SYMBOL(dib9000_set_gpio);
1769 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1771 struct dib9000_state *state = fe->demodulator_priv;
1772 u16 val;
1773 int ret;
1775 if ((state->pid_ctrl_index != -2) && (state->pid_ctrl_index < 9)) {
1776 /* postpone the pid filtering cmd */
1777 dprintk("pid filter cmd postpone");
1778 state->pid_ctrl_index++;
1779 state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER_CTRL;
1780 state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1781 return 0;
1784 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1785 dprintk("could not get the lock");
1786 return -EINTR;
1789 val = dib9000_read_word(state, 294 + 1) & 0xffef;
1790 val |= (onoff & 0x1) << 4;
1792 dprintk("PID filter enabled %d", onoff);
1793 ret = dib9000_write_word(state, 294 + 1, val);
1794 mutex_unlock(&state->demod_lock);
1795 return ret;
1798 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
1800 int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1802 struct dib9000_state *state = fe->demodulator_priv;
1803 int ret;
1805 if (state->pid_ctrl_index != -2) {
1806 /* postpone the pid filtering cmd */
1807 dprintk("pid filter postpone");
1808 if (state->pid_ctrl_index < 9) {
1809 state->pid_ctrl_index++;
1810 state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER;
1811 state->pid_ctrl[state->pid_ctrl_index].id = id;
1812 state->pid_ctrl[state->pid_ctrl_index].pid = pid;
1813 state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1814 } else
1815 dprintk("can not add any more pid ctrl cmd");
1816 return 0;
1819 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1820 dprintk("could not get the lock");
1821 return -EINTR;
1823 dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
1824 ret = dib9000_write_word(state, 300 + 1 + id,
1825 onoff ? (1 << 13) | pid : 0);
1826 mutex_unlock(&state->demod_lock);
1827 return ret;
1829 EXPORT_SYMBOL(dib9000_fw_pid_filter);
1831 int dib9000_firmware_post_pll_init(struct dvb_frontend *fe)
1833 struct dib9000_state *state = fe->demodulator_priv;
1834 return dib9000_fw_init(state);
1836 EXPORT_SYMBOL(dib9000_firmware_post_pll_init);
1838 static void dib9000_release(struct dvb_frontend *demod)
1840 struct dib9000_state *st = demod->demodulator_priv;
1841 u8 index_frontend;
1843 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
1844 dvb_frontend_detach(st->fe[index_frontend]);
1846 dibx000_exit_i2c_master(&st->i2c_master);
1848 i2c_del_adapter(&st->tuner_adap);
1849 i2c_del_adapter(&st->component_bus);
1850 kfree(st->fe[0]);
1851 kfree(st);
1854 static int dib9000_wakeup(struct dvb_frontend *fe)
1856 return 0;
1859 static int dib9000_sleep(struct dvb_frontend *fe)
1861 struct dib9000_state *state = fe->demodulator_priv;
1862 u8 index_frontend;
1863 int ret = 0;
1865 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1866 dprintk("could not get the lock");
1867 return -EINTR;
1869 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1870 ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
1871 if (ret < 0)
1872 goto error;
1874 ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
1876 error:
1877 mutex_unlock(&state->demod_lock);
1878 return ret;
1881 static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1883 tune->min_delay_ms = 1000;
1884 return 0;
1887 static int dib9000_get_frontend(struct dvb_frontend *fe)
1889 struct dib9000_state *state = fe->demodulator_priv;
1890 u8 index_frontend, sub_index_frontend;
1891 fe_status_t stat;
1892 int ret = 0;
1894 if (state->get_frontend_internal == 0) {
1895 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1896 dprintk("could not get the lock");
1897 return -EINTR;
1901 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1902 state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
1903 if (stat & FE_HAS_SYNC) {
1904 dprintk("TPS lock on the slave%i", index_frontend);
1906 /* synchronize the cache with the other frontends */
1907 state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
1908 for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL);
1909 sub_index_frontend++) {
1910 if (sub_index_frontend != index_frontend) {
1911 state->fe[sub_index_frontend]->dtv_property_cache.modulation =
1912 state->fe[index_frontend]->dtv_property_cache.modulation;
1913 state->fe[sub_index_frontend]->dtv_property_cache.inversion =
1914 state->fe[index_frontend]->dtv_property_cache.inversion;
1915 state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode =
1916 state->fe[index_frontend]->dtv_property_cache.transmission_mode;
1917 state->fe[sub_index_frontend]->dtv_property_cache.guard_interval =
1918 state->fe[index_frontend]->dtv_property_cache.guard_interval;
1919 state->fe[sub_index_frontend]->dtv_property_cache.hierarchy =
1920 state->fe[index_frontend]->dtv_property_cache.hierarchy;
1921 state->fe[sub_index_frontend]->dtv_property_cache.code_rate_HP =
1922 state->fe[index_frontend]->dtv_property_cache.code_rate_HP;
1923 state->fe[sub_index_frontend]->dtv_property_cache.code_rate_LP =
1924 state->fe[index_frontend]->dtv_property_cache.code_rate_LP;
1925 state->fe[sub_index_frontend]->dtv_property_cache.rolloff =
1926 state->fe[index_frontend]->dtv_property_cache.rolloff;
1929 ret = 0;
1930 goto return_value;
1934 /* get the channel from master chip */
1935 ret = dib9000_fw_get_channel(fe);
1936 if (ret != 0)
1937 goto return_value;
1939 /* synchronize the cache with the other frontends */
1940 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1941 state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
1942 state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
1943 state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
1944 state->fe[index_frontend]->dtv_property_cache.modulation = fe->dtv_property_cache.modulation;
1945 state->fe[index_frontend]->dtv_property_cache.hierarchy = fe->dtv_property_cache.hierarchy;
1946 state->fe[index_frontend]->dtv_property_cache.code_rate_HP = fe->dtv_property_cache.code_rate_HP;
1947 state->fe[index_frontend]->dtv_property_cache.code_rate_LP = fe->dtv_property_cache.code_rate_LP;
1948 state->fe[index_frontend]->dtv_property_cache.rolloff = fe->dtv_property_cache.rolloff;
1950 ret = 0;
1952 return_value:
1953 if (state->get_frontend_internal == 0)
1954 mutex_unlock(&state->demod_lock);
1955 return ret;
1958 static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1960 struct dib9000_state *state = fe->demodulator_priv;
1961 state->tune_state = tune_state;
1962 if (tune_state == CT_DEMOD_START)
1963 state->status = FE_STATUS_TUNE_PENDING;
1965 return 0;
1968 static u32 dib9000_get_status(struct dvb_frontend *fe)
1970 struct dib9000_state *state = fe->demodulator_priv;
1971 return state->status;
1974 static int dib9000_set_channel_status(struct dvb_frontend *fe, struct dvb_frontend_parametersContext *channel_status)
1976 struct dib9000_state *state = fe->demodulator_priv;
1978 memcpy(&state->channel_status, channel_status, sizeof(struct dvb_frontend_parametersContext));
1979 return 0;
1982 static int dib9000_set_frontend(struct dvb_frontend *fe)
1984 struct dib9000_state *state = fe->demodulator_priv;
1985 int sleep_time, sleep_time_slave;
1986 u32 frontend_status;
1987 u8 nbr_pending, exit_condition, index_frontend, index_frontend_success;
1988 struct dvb_frontend_parametersContext channel_status;
1990 /* check that the correct parameters are set */
1991 if (state->fe[0]->dtv_property_cache.frequency == 0) {
1992 dprintk("dib9000: must specify frequency ");
1993 return 0;
1996 if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
1997 dprintk("dib9000: must specify bandwidth ");
1998 return 0;
2001 state->pid_ctrl_index = -1; /* postpone the pid filtering cmd */
2002 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2003 dprintk("could not get the lock");
2004 return 0;
2007 fe->dtv_property_cache.delivery_system = SYS_DVBT;
2009 /* set the master status */
2010 if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO ||
2011 state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO ||
2012 state->fe[0]->dtv_property_cache.modulation == QAM_AUTO ||
2013 state->fe[0]->dtv_property_cache.code_rate_HP == FEC_AUTO) {
2014 /* no channel specified, autosearch the channel */
2015 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_UNKNOWN;
2016 } else
2017 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2019 /* set mode and status for the different frontends */
2020 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2021 dib9000_fw_set_diversity_in(state->fe[index_frontend], 1);
2023 /* synchronization of the cache */
2024 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2026 state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_DVBT;
2027 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_HIGH_Z);
2029 dib9000_set_channel_status(state->fe[index_frontend], &state->channel_status);
2030 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2033 /* actual tune */
2034 exit_condition = 0; /* 0: tune pending; 1: tune failed; 2:tune success */
2035 index_frontend_success = 0;
2036 do {
2037 sleep_time = dib9000_fw_tune(state->fe[0]);
2038 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2039 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2040 if (sleep_time == FE_CALLBACK_TIME_NEVER)
2041 sleep_time = sleep_time_slave;
2042 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2043 sleep_time = sleep_time_slave;
2045 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2046 msleep(sleep_time / 10);
2047 else
2048 break;
2050 nbr_pending = 0;
2051 exit_condition = 0;
2052 index_frontend_success = 0;
2053 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2054 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2055 if (frontend_status > -FE_STATUS_TUNE_PENDING) {
2056 exit_condition = 2; /* tune success */
2057 index_frontend_success = index_frontend;
2058 break;
2060 if (frontend_status == -FE_STATUS_TUNE_PENDING)
2061 nbr_pending++; /* some frontends are still tuning */
2063 if ((exit_condition != 2) && (nbr_pending == 0))
2064 exit_condition = 1; /* if all tune are done and no success, exit: tune failed */
2066 } while (exit_condition == 0);
2068 /* check the tune result */
2069 if (exit_condition == 1) { /* tune failed */
2070 dprintk("tune failed");
2071 mutex_unlock(&state->demod_lock);
2072 /* tune failed; put all the pid filtering cmd to junk */
2073 state->pid_ctrl_index = -1;
2074 return 0;
2077 dprintk("tune success on frontend%i", index_frontend_success);
2079 /* synchronize all the channel cache */
2080 state->get_frontend_internal = 1;
2081 dib9000_get_frontend(state->fe[0]);
2082 state->get_frontend_internal = 0;
2084 /* retune the other frontends with the found channel */
2085 channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2086 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2087 /* only retune the frontends which was not tuned success */
2088 if (index_frontend != index_frontend_success) {
2089 dib9000_set_channel_status(state->fe[index_frontend], &channel_status);
2090 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2093 do {
2094 sleep_time = FE_CALLBACK_TIME_NEVER;
2095 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2096 if (index_frontend != index_frontend_success) {
2097 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2098 if (sleep_time == FE_CALLBACK_TIME_NEVER)
2099 sleep_time = sleep_time_slave;
2100 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2101 sleep_time = sleep_time_slave;
2104 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2105 msleep(sleep_time / 10);
2106 else
2107 break;
2109 nbr_pending = 0;
2110 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2111 if (index_frontend != index_frontend_success) {
2112 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2113 if ((index_frontend != index_frontend_success) && (frontend_status == -FE_STATUS_TUNE_PENDING))
2114 nbr_pending++; /* some frontends are still tuning */
2117 } while (nbr_pending != 0);
2119 /* set the output mode */
2120 dib9000_fw_set_output_mode(state->fe[0], state->chip.d9.cfg.output_mode);
2121 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2122 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_DIVERSITY);
2124 /* turn off the diversity for the last frontend */
2125 dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
2127 mutex_unlock(&state->demod_lock);
2128 if (state->pid_ctrl_index >= 0) {
2129 u8 index_pid_filter_cmd;
2130 u8 pid_ctrl_index = state->pid_ctrl_index;
2132 state->pid_ctrl_index = -2;
2133 for (index_pid_filter_cmd = 0;
2134 index_pid_filter_cmd <= pid_ctrl_index;
2135 index_pid_filter_cmd++) {
2136 if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER_CTRL)
2137 dib9000_fw_pid_filter_ctrl(state->fe[0],
2138 state->pid_ctrl[index_pid_filter_cmd].onoff);
2139 else if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER)
2140 dib9000_fw_pid_filter(state->fe[0],
2141 state->pid_ctrl[index_pid_filter_cmd].id,
2142 state->pid_ctrl[index_pid_filter_cmd].pid,
2143 state->pid_ctrl[index_pid_filter_cmd].onoff);
2146 /* do not postpone any more the pid filtering */
2147 state->pid_ctrl_index = -2;
2149 return 0;
2152 static u16 dib9000_read_lock(struct dvb_frontend *fe)
2154 struct dib9000_state *state = fe->demodulator_priv;
2156 return dib9000_read_word(state, 535);
2159 static int dib9000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
2161 struct dib9000_state *state = fe->demodulator_priv;
2162 u8 index_frontend;
2163 u16 lock = 0, lock_slave = 0;
2165 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2166 dprintk("could not get the lock");
2167 return -EINTR;
2169 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2170 lock_slave |= dib9000_read_lock(state->fe[index_frontend]);
2172 lock = dib9000_read_word(state, 535);
2174 *stat = 0;
2176 if ((lock & 0x8000) || (lock_slave & 0x8000))
2177 *stat |= FE_HAS_SIGNAL;
2178 if ((lock & 0x3000) || (lock_slave & 0x3000))
2179 *stat |= FE_HAS_CARRIER;
2180 if ((lock & 0x0100) || (lock_slave & 0x0100))
2181 *stat |= FE_HAS_VITERBI;
2182 if (((lock & 0x0038) == 0x38) || ((lock_slave & 0x0038) == 0x38))
2183 *stat |= FE_HAS_SYNC;
2184 if ((lock & 0x0008) || (lock_slave & 0x0008))
2185 *stat |= FE_HAS_LOCK;
2187 mutex_unlock(&state->demod_lock);
2189 return 0;
2192 static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber)
2194 struct dib9000_state *state = fe->demodulator_priv;
2195 u16 *c;
2196 int ret = 0;
2198 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2199 dprintk("could not get the lock");
2200 return -EINTR;
2202 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2203 dprintk("could not get the lock");
2204 ret = -EINTR;
2205 goto error;
2207 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2208 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2209 ret = -EIO;
2210 goto error;
2212 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR,
2213 state->i2c_read_buffer, 16 * 2);
2214 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2216 c = (u16 *)state->i2c_read_buffer;
2218 *ber = c[10] << 16 | c[11];
2220 error:
2221 mutex_unlock(&state->demod_lock);
2222 return ret;
2225 static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2227 struct dib9000_state *state = fe->demodulator_priv;
2228 u8 index_frontend;
2229 u16 *c = (u16 *)state->i2c_read_buffer;
2230 u16 val;
2231 int ret = 0;
2233 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2234 dprintk("could not get the lock");
2235 return -EINTR;
2237 *strength = 0;
2238 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2239 state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
2240 if (val > 65535 - *strength)
2241 *strength = 65535;
2242 else
2243 *strength += val;
2246 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2247 dprintk("could not get the lock");
2248 ret = -EINTR;
2249 goto error;
2251 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2252 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2253 ret = -EIO;
2254 goto error;
2256 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2257 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2259 val = 65535 - c[4];
2260 if (val > 65535 - *strength)
2261 *strength = 65535;
2262 else
2263 *strength += val;
2265 error:
2266 mutex_unlock(&state->demod_lock);
2267 return ret;
2270 static u32 dib9000_get_snr(struct dvb_frontend *fe)
2272 struct dib9000_state *state = fe->demodulator_priv;
2273 u16 *c = (u16 *)state->i2c_read_buffer;
2274 u32 n, s, exp;
2275 u16 val;
2277 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2278 dprintk("could not get the lock");
2279 return 0;
2281 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2282 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2283 return 0;
2285 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2286 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2288 val = c[7];
2289 n = (val >> 4) & 0xff;
2290 exp = ((val & 0xf) << 2);
2291 val = c[8];
2292 exp += ((val >> 14) & 0x3);
2293 if ((exp & 0x20) != 0)
2294 exp -= 0x40;
2295 n <<= exp + 16;
2297 s = (val >> 6) & 0xFF;
2298 exp = (val & 0x3F);
2299 if ((exp & 0x20) != 0)
2300 exp -= 0x40;
2301 s <<= exp + 16;
2303 if (n > 0) {
2304 u32 t = (s / n) << 16;
2305 return t + ((s << 16) - n * t) / n;
2307 return 0xffffffff;
2310 static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr)
2312 struct dib9000_state *state = fe->demodulator_priv;
2313 u8 index_frontend;
2314 u32 snr_master;
2316 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2317 dprintk("could not get the lock");
2318 return -EINTR;
2320 snr_master = dib9000_get_snr(fe);
2321 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2322 snr_master += dib9000_get_snr(state->fe[index_frontend]);
2324 if ((snr_master >> 16) != 0) {
2325 snr_master = 10 * intlog10(snr_master >> 16);
2326 *snr = snr_master / ((1 << 24) / 10);
2327 } else
2328 *snr = 0;
2330 mutex_unlock(&state->demod_lock);
2332 return 0;
2335 static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
2337 struct dib9000_state *state = fe->demodulator_priv;
2338 u16 *c = (u16 *)state->i2c_read_buffer;
2339 int ret = 0;
2341 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2342 dprintk("could not get the lock");
2343 return -EINTR;
2345 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2346 dprintk("could not get the lock");
2347 ret = -EINTR;
2348 goto error;
2350 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2351 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2352 ret = -EIO;
2353 goto error;
2355 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2356 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2358 *unc = c[12];
2360 error:
2361 mutex_unlock(&state->demod_lock);
2362 return ret;
2365 int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
2367 int k = 0, ret = 0;
2368 u8 new_addr = 0;
2369 struct i2c_device client = {.i2c_adap = i2c };
2371 client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
2372 if (!client.i2c_write_buffer) {
2373 dprintk("%s: not enough memory", __func__);
2374 return -ENOMEM;
2376 client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
2377 if (!client.i2c_read_buffer) {
2378 dprintk("%s: not enough memory", __func__);
2379 ret = -ENOMEM;
2380 goto error_memory;
2383 client.i2c_addr = default_addr + 16;
2384 dib9000_i2c_write16(&client, 1796, 0x0);
2386 for (k = no_of_demods - 1; k >= 0; k--) {
2387 /* designated i2c address */
2388 new_addr = first_addr + (k << 1);
2389 client.i2c_addr = default_addr;
2391 dib9000_i2c_write16(&client, 1817, 3);
2392 dib9000_i2c_write16(&client, 1796, 0);
2393 dib9000_i2c_write16(&client, 1227, 1);
2394 dib9000_i2c_write16(&client, 1227, 0);
2396 client.i2c_addr = new_addr;
2397 dib9000_i2c_write16(&client, 1817, 3);
2398 dib9000_i2c_write16(&client, 1796, 0);
2399 dib9000_i2c_write16(&client, 1227, 1);
2400 dib9000_i2c_write16(&client, 1227, 0);
2402 if (dib9000_identify(&client) == 0) {
2403 client.i2c_addr = default_addr;
2404 if (dib9000_identify(&client) == 0) {
2405 dprintk("DiB9000 #%d: not identified", k);
2406 ret = -EIO;
2407 goto error;
2411 dib9000_i2c_write16(&client, 1795, (1 << 10) | (4 << 6));
2412 dib9000_i2c_write16(&client, 1794, (new_addr << 2) | 2);
2414 dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
2417 for (k = 0; k < no_of_demods; k++) {
2418 new_addr = first_addr | (k << 1);
2419 client.i2c_addr = new_addr;
2421 dib9000_i2c_write16(&client, 1794, (new_addr << 2));
2422 dib9000_i2c_write16(&client, 1795, 0);
2425 error:
2426 kfree(client.i2c_read_buffer);
2427 error_memory:
2428 kfree(client.i2c_write_buffer);
2430 return ret;
2432 EXPORT_SYMBOL(dib9000_i2c_enumeration);
2434 int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
2436 struct dib9000_state *state = fe->demodulator_priv;
2437 u8 index_frontend = 1;
2439 while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2440 index_frontend++;
2441 if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
2442 dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
2443 state->fe[index_frontend] = fe_slave;
2444 return 0;
2447 dprintk("too many slave frontend");
2448 return -ENOMEM;
2450 EXPORT_SYMBOL(dib9000_set_slave_frontend);
2452 int dib9000_remove_slave_frontend(struct dvb_frontend *fe)
2454 struct dib9000_state *state = fe->demodulator_priv;
2455 u8 index_frontend = 1;
2457 while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2458 index_frontend++;
2459 if (index_frontend != 1) {
2460 dprintk("remove slave fe %p (index %i)", state->fe[index_frontend - 1], index_frontend - 1);
2461 state->fe[index_frontend] = NULL;
2462 return 0;
2465 dprintk("no frontend to be removed");
2466 return -ENODEV;
2468 EXPORT_SYMBOL(dib9000_remove_slave_frontend);
2470 struct dvb_frontend *dib9000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
2472 struct dib9000_state *state = fe->demodulator_priv;
2474 if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
2475 return NULL;
2476 return state->fe[slave_index];
2478 EXPORT_SYMBOL(dib9000_get_slave_frontend);
2480 static struct dvb_frontend_ops dib9000_ops;
2481 struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg)
2483 struct dvb_frontend *fe;
2484 struct dib9000_state *st;
2485 st = kzalloc(sizeof(struct dib9000_state), GFP_KERNEL);
2486 if (st == NULL)
2487 return NULL;
2488 fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
2489 if (fe == NULL) {
2490 kfree(st);
2491 return NULL;
2494 memcpy(&st->chip.d9.cfg, cfg, sizeof(struct dib9000_config));
2495 st->i2c.i2c_adap = i2c_adap;
2496 st->i2c.i2c_addr = i2c_addr;
2497 st->i2c.i2c_write_buffer = st->i2c_write_buffer;
2498 st->i2c.i2c_read_buffer = st->i2c_read_buffer;
2500 st->gpio_dir = DIB9000_GPIO_DEFAULT_DIRECTIONS;
2501 st->gpio_val = DIB9000_GPIO_DEFAULT_VALUES;
2502 st->gpio_pwm_pos = DIB9000_GPIO_DEFAULT_PWM_POS;
2504 mutex_init(&st->platform.risc.mbx_if_lock);
2505 mutex_init(&st->platform.risc.mbx_lock);
2506 mutex_init(&st->platform.risc.mem_lock);
2507 mutex_init(&st->platform.risc.mem_mbx_lock);
2508 mutex_init(&st->demod_lock);
2509 st->get_frontend_internal = 0;
2511 st->pid_ctrl_index = -2;
2513 st->fe[0] = fe;
2514 fe->demodulator_priv = st;
2515 memcpy(&st->fe[0]->ops, &dib9000_ops, sizeof(struct dvb_frontend_ops));
2517 /* Ensure the output mode remains at the previous default if it's
2518 * not specifically set by the caller.
2520 if ((st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2521 st->chip.d9.cfg.output_mode = OUTMODE_MPEG2_FIFO;
2523 if (dib9000_identify(&st->i2c) == 0)
2524 goto error;
2526 dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
2528 st->tuner_adap.dev.parent = i2c_adap->dev.parent;
2529 strncpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS", sizeof(st->tuner_adap.name));
2530 st->tuner_adap.algo = &dib9000_tuner_algo;
2531 st->tuner_adap.algo_data = NULL;
2532 i2c_set_adapdata(&st->tuner_adap, st);
2533 if (i2c_add_adapter(&st->tuner_adap) < 0)
2534 goto error;
2536 st->component_bus.dev.parent = i2c_adap->dev.parent;
2537 strncpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st->component_bus.name));
2538 st->component_bus.algo = &dib9000_component_bus_algo;
2539 st->component_bus.algo_data = NULL;
2540 st->component_bus_speed = 340;
2541 i2c_set_adapdata(&st->component_bus, st);
2542 if (i2c_add_adapter(&st->component_bus) < 0)
2543 goto component_bus_add_error;
2545 dib9000_fw_reset(fe);
2547 return fe;
2549 component_bus_add_error:
2550 i2c_del_adapter(&st->tuner_adap);
2551 error:
2552 kfree(st);
2553 return NULL;
2555 EXPORT_SYMBOL(dib9000_attach);
2557 static struct dvb_frontend_ops dib9000_ops = {
2558 .delsys = { SYS_DVBT },
2559 .info = {
2560 .name = "DiBcom 9000",
2561 .frequency_min = 44250000,
2562 .frequency_max = 867250000,
2563 .frequency_stepsize = 62500,
2564 .caps = FE_CAN_INVERSION_AUTO |
2565 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2566 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2567 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2568 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2571 .release = dib9000_release,
2573 .init = dib9000_wakeup,
2574 .sleep = dib9000_sleep,
2576 .set_frontend = dib9000_set_frontend,
2577 .get_tune_settings = dib9000_fe_get_tune_settings,
2578 .get_frontend = dib9000_get_frontend,
2580 .read_status = dib9000_read_status,
2581 .read_ber = dib9000_read_ber,
2582 .read_signal_strength = dib9000_read_signal_strength,
2583 .read_snr = dib9000_read_snr,
2584 .read_ucblocks = dib9000_read_unc_blocks,
2587 MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
2588 MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
2589 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2590 MODULE_LICENSE("GPL");