aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends/dib9000.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/frontends/dib9000.c')
-rw-r--r--drivers/media/dvb/frontends/dib9000.c2403
1 files changed, 2403 insertions, 0 deletions
diff --git a/drivers/media/dvb/frontends/dib9000.c b/drivers/media/dvb/frontends/dib9000.c
new file mode 100644
index 000000000000..a0855883b5ce
--- /dev/null
+++ b/drivers/media/dvb/frontends/dib9000.c
@@ -0,0 +1,2403 @@
1/*
2 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
3 *
4 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
5 *
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>
13
14#include "dvb_math.h"
15#include "dvb_frontend.h"
16
17#include "dib9000.h"
18#include "dibx000_common.h"
19
20static int debug;
21module_param(debug, int, 0644);
22MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
23
24#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB9000: "); printk(args); printk("\n"); } } while (0)
25#define MAX_NUMBER_OF_FRONTENDS 6
26
27struct i2c_device {
28 struct i2c_adapter *i2c_adap;
29 u8 i2c_addr;
30 u8 *i2c_read_buffer;
31 u8 *i2c_write_buffer;
32};
33
34/* lock */
35#define DIB_LOCK struct mutex
36#define DibAcquireLock(lock) do { if (mutex_lock_interruptible(lock) < 0) dprintk("could not get the lock"); } while (0)
37#define DibReleaseLock(lock) mutex_unlock(lock)
38#define DibInitLock(lock) mutex_init(lock)
39#define DibFreeLock(lock)
40
41struct dib9000_state {
42 struct i2c_device i2c;
43
44 struct dibx000_i2c_master i2c_master;
45 struct i2c_adapter tuner_adap;
46 struct i2c_adapter component_bus;
47
48 u16 revision;
49 u8 reg_offs;
50
51 enum frontend_tune_state tune_state;
52 u32 status;
53 struct dvb_frontend_parametersContext channel_status;
54
55 u8 fe_id;
56
57#define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
58 u16 gpio_dir;
59#define DIB9000_GPIO_DEFAULT_VALUES 0x0000
60 u16 gpio_val;
61#define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
62 u16 gpio_pwm_pos;
63
64 union { /* common for all chips */
65 struct {
66 u8 mobile_mode:1;
67 } host;
68
69 struct {
70 struct dib9000_fe_memory_map {
71 u16 addr;
72 u16 size;
73 } fe_mm[18];
74 u8 memcmd;
75
76 DIB_LOCK mbx_if_lock; /* to protect read/write operations */
77 DIB_LOCK mbx_lock; /* to protect the whole mailbox handling */
78
79 DIB_LOCK mem_lock; /* to protect the memory accesses */
80 DIB_LOCK mem_mbx_lock; /* to protect the memory-based mailbox */
81
82#define MBX_MAX_WORDS (256 - 200 - 2)
83#define DIB9000_MSG_CACHE_SIZE 2
84 u16 message_cache[DIB9000_MSG_CACHE_SIZE][MBX_MAX_WORDS];
85 u8 fw_is_running;
86 } risc;
87 } platform;
88
89 union { /* common for all platforms */
90 struct {
91 struct dib9000_config cfg;
92 } d9;
93 } chip;
94
95 struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
96 u16 component_bus_speed;
97
98 /* for the I2C transfer */
99 struct i2c_msg msg[2];
100 u8 i2c_write_buffer[255];
101 u8 i2c_read_buffer[255];
102};
103
104static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0, 0, 0
107};
108
109enum dib9000_power_mode {
110 DIB9000_POWER_ALL = 0,
111
112 DIB9000_POWER_NO,
113 DIB9000_POWER_INTERF_ANALOG_AGC,
114 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD,
115 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD,
116 DIB9000_POWER_INTERFACE_ONLY,
117};
118
119enum dib9000_out_messages {
120 OUT_MSG_HBM_ACK,
121 OUT_MSG_HOST_BUF_FAIL,
122 OUT_MSG_REQ_VERSION,
123 OUT_MSG_BRIDGE_I2C_W,
124 OUT_MSG_BRIDGE_I2C_R,
125 OUT_MSG_BRIDGE_APB_W,
126 OUT_MSG_BRIDGE_APB_R,
127 OUT_MSG_SCAN_CHANNEL,
128 OUT_MSG_MONIT_DEMOD,
129 OUT_MSG_CONF_GPIO,
130 OUT_MSG_DEBUG_HELP,
131 OUT_MSG_SUBBAND_SEL,
132 OUT_MSG_ENABLE_TIME_SLICE,
133 OUT_MSG_FE_FW_DL,
134 OUT_MSG_FE_CHANNEL_SEARCH,
135 OUT_MSG_FE_CHANNEL_TUNE,
136 OUT_MSG_FE_SLEEP,
137 OUT_MSG_FE_SYNC,
138 OUT_MSG_CTL_MONIT,
139
140 OUT_MSG_CONF_SVC,
141 OUT_MSG_SET_HBM,
142 OUT_MSG_INIT_DEMOD,
143 OUT_MSG_ENABLE_DIVERSITY,
144 OUT_MSG_SET_OUTPUT_MODE,
145 OUT_MSG_SET_PRIORITARY_CHANNEL,
146 OUT_MSG_ACK_FRG,
147 OUT_MSG_INIT_PMU,
148};
149
150enum dib9000_in_messages {
151 IN_MSG_DATA,
152 IN_MSG_FRAME_INFO,
153 IN_MSG_CTL_MONIT,
154 IN_MSG_ACK_FREE_ITEM,
155 IN_MSG_DEBUG_BUF,
156 IN_MSG_MPE_MONITOR,
157 IN_MSG_RAWTS_MONITOR,
158 IN_MSG_END_BRIDGE_I2C_RW,
159 IN_MSG_END_BRIDGE_APB_RW,
160 IN_MSG_VERSION,
161 IN_MSG_END_OF_SCAN,
162 IN_MSG_MONIT_DEMOD,
163 IN_MSG_ERROR,
164 IN_MSG_FE_FW_DL_DONE,
165 IN_MSG_EVENT,
166 IN_MSG_ACK_CHANGE_SVC,
167 IN_MSG_HBM_PROF,
168};
169
170/* memory_access requests */
171#define FE_MM_W_CHANNEL 0
172#define FE_MM_W_FE_INFO 1
173#define FE_MM_RW_SYNC 2
174
175#define FE_SYNC_CHANNEL 1
176#define FE_SYNC_W_GENERIC_MONIT 2
177#define FE_SYNC_COMPONENT_ACCESS 3
178
179#define FE_MM_R_CHANNEL_SEARCH_STATE 3
180#define FE_MM_R_CHANNEL_UNION_CONTEXT 4
181#define FE_MM_R_FE_INFO 5
182#define FE_MM_R_FE_MONITOR 6
183
184#define FE_MM_W_CHANNEL_HEAD 7
185#define FE_MM_W_CHANNEL_UNION 8
186#define FE_MM_W_CHANNEL_CONTEXT 9
187#define FE_MM_R_CHANNEL_UNION 10
188#define FE_MM_R_CHANNEL_CONTEXT 11
189#define FE_MM_R_CHANNEL_TUNE_STATE 12
190
191#define FE_MM_R_GENERIC_MONITORING_SIZE 13
192#define FE_MM_W_GENERIC_MONITORING 14
193#define FE_MM_R_GENERIC_MONITORING 15
194
195#define FE_MM_W_COMPONENT_ACCESS 16
196#define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
197static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len);
198static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len);
199
200static u16 to_fw_output_mode(u16 mode)
201{
202 switch (mode) {
203 case OUTMODE_HIGH_Z:
204 return 0;
205 case OUTMODE_MPEG2_PAR_GATED_CLK:
206 return 4;
207 case OUTMODE_MPEG2_PAR_CONT_CLK:
208 return 8;
209 case OUTMODE_MPEG2_SERIAL:
210 return 16;
211 case OUTMODE_DIVERSITY:
212 return 128;
213 case OUTMODE_MPEG2_FIFO:
214 return 2;
215 case OUTMODE_ANALOG_ADC:
216 return 1;
217 default:
218 return 0;
219 }
220}
221
222static u16 dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 * b, u32 len, u16 attribute)
223{
224 u32 chunk_size = 126;
225 u32 l;
226 int ret;
227
228 if (state->platform.risc.fw_is_running && (reg < 1024))
229 return dib9000_risc_apb_access_read(state, reg, attribute, NULL, 0, b, len);
230
231 memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
232 state->msg[0].addr = state->i2c.i2c_addr >> 1;
233 state->msg[0].flags = 0;
234 state->msg[0].buf = state->i2c_write_buffer;
235 state->msg[0].len = 2;
236 state->msg[1].addr = state->i2c.i2c_addr >> 1;
237 state->msg[1].flags = I2C_M_RD;
238 state->msg[1].buf = b;
239 state->msg[1].len = len;
240
241 state->i2c_write_buffer[0] = reg >> 8;
242 state->i2c_write_buffer[1] = reg & 0xff;
243
244 if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
245 state->i2c_write_buffer[0] |= (1 << 5);
246 if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
247 state->i2c_write_buffer[0] |= (1 << 4);
248
249 do {
250 l = len < chunk_size ? len : chunk_size;
251 state->msg[1].len = l;
252 state->msg[1].buf = b;
253 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 2) != 2 ? -EREMOTEIO : 0;
254 if (ret != 0) {
255 dprintk("i2c read error on %d", reg);
256 return -EREMOTEIO;
257 }
258
259 b += l;
260 len -= l;
261
262 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
263 reg += l / 2;
264 } while ((ret == 0) && len);
265
266 return 0;
267}
268
269static u16 dib9000_i2c_read16(struct i2c_device *i2c, u16 reg)
270{
271 struct i2c_msg msg[2] = {
272 {.addr = i2c->i2c_addr >> 1, .flags = 0,
273 .buf = i2c->i2c_write_buffer, .len = 2},
274 {.addr = i2c->i2c_addr >> 1, .flags = I2C_M_RD,
275 .buf = i2c->i2c_read_buffer, .len = 2},
276 };
277
278 i2c->i2c_write_buffer[0] = reg >> 8;
279 i2c->i2c_write_buffer[1] = reg & 0xff;
280
281 if (i2c_transfer(i2c->i2c_adap, msg, 2) != 2) {
282 dprintk("read register %x error", reg);
283 return 0;
284 }
285
286 return (i2c->i2c_read_buffer[0] << 8) | i2c->i2c_read_buffer[1];
287}
288
289static inline u16 dib9000_read_word(struct dib9000_state *state, u16 reg)
290{
291 if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2, 0) != 0)
292 return 0;
293 return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
294}
295
296static inline u16 dib9000_read_word_attr(struct dib9000_state *state, u16 reg, u16 attribute)
297{
298 if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2,
299 attribute) != 0)
300 return 0;
301 return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
302}
303
304#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)
305
306static u16 dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 * buf, u32 len, u16 attribute)
307{
308 u32 chunk_size = 126;
309 u32 l;
310 int ret;
311
312 if (state->platform.risc.fw_is_running && (reg < 1024)) {
313 if (dib9000_risc_apb_access_write
314 (state, reg, DATA_BUS_ACCESS_MODE_16BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | attribute, buf, len) != 0)
315 return -EINVAL;
316 return 0;
317 }
318
319 memset(&state->msg[0], 0, sizeof(struct i2c_msg));
320 state->msg[0].addr = state->i2c.i2c_addr >> 1;
321 state->msg[0].flags = 0;
322 state->msg[0].buf = state->i2c_write_buffer;
323 state->msg[0].len = len + 2;
324
325 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
326 state->i2c_write_buffer[1] = (reg) & 0xff;
327
328 if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
329 state->i2c_write_buffer[0] |= (1 << 5);
330 if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
331 state->i2c_write_buffer[0] |= (1 << 4);
332
333 do {
334 l = len < chunk_size ? len : chunk_size;
335 state->msg[0].len = l + 2;
336 memcpy(&state->i2c_write_buffer[2], buf, l);
337
338 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
339
340 buf += l;
341 len -= l;
342
343 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
344 reg += l / 2;
345 } while ((ret == 0) && len);
346
347 return ret;
348}
349
350static int dib9000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
351{
352 struct i2c_msg msg = {
353 .addr = i2c->i2c_addr >> 1, .flags = 0,
354 .buf = i2c->i2c_write_buffer, .len = 4
355 };
356
357 i2c->i2c_write_buffer[0] = (reg >> 8) & 0xff;
358 i2c->i2c_write_buffer[1] = reg & 0xff;
359 i2c->i2c_write_buffer[2] = (val >> 8) & 0xff;
360 i2c->i2c_write_buffer[3] = val & 0xff;
361
362 return i2c_transfer(i2c->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
363}
364
365static inline int dib9000_write_word(struct dib9000_state *state, u16 reg, u16 val)
366{
367 u8 b[2] = { val >> 8, val & 0xff };
368 return dib9000_write16_attr(state, reg, b, 2, 0);
369}
370
371static inline int dib9000_write_word_attr(struct dib9000_state *state, u16 reg, u16 val, u16 attribute)
372{
373 u8 b[2] = { val >> 8, val & 0xff };
374 return dib9000_write16_attr(state, reg, b, 2, attribute);
375}
376
377#define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
378#define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
379#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))
380
381#define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
382#define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
383
384#define MAC_IRQ (1 << 1)
385#define IRQ_POL_MSK (1 << 4)
386
387#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)
388#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)
389
390static void dib9000_risc_mem_setup_cmd(struct dib9000_state *state, u32 addr, u32 len, u8 reading)
391{
392 u8 b[14] = { 0 };
393
394/* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
395/* b[0] = 0 << 7; */
396 b[1] = 1;
397
398/* b[2] = 0; */
399/* b[3] = 0; */
400 b[4] = (u8) (addr >> 8);
401 b[5] = (u8) (addr & 0xff);
402
403/* b[10] = 0; */
404/* b[11] = 0; */
405 b[12] = (u8) (addr >> 8);
406 b[13] = (u8) (addr & 0xff);
407
408 addr += len;
409/* b[6] = 0; */
410/* b[7] = 0; */
411 b[8] = (u8) (addr >> 8);
412 b[9] = (u8) (addr & 0xff);
413
414 dib9000_write(state, 1056, b, 14);
415 if (reading)
416 dib9000_write_word(state, 1056, (1 << 15) | 1);
417 state->platform.risc.memcmd = -1; /* if it was called directly reset it - to force a future setup-call to set it */
418}
419
420static void dib9000_risc_mem_setup(struct dib9000_state *state, u8 cmd)
421{
422 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd & 0x7f];
423 /* decide whether we need to "refresh" the memory controller */
424 if (state->platform.risc.memcmd == cmd && /* same command */
425 !(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 */
426 return;
427 dib9000_risc_mem_setup_cmd(state, m->addr, m->size, cmd & 0x80);
428 state->platform.risc.memcmd = cmd;
429}
430
431static int dib9000_risc_mem_read(struct dib9000_state *state, u8 cmd, u8 * b, u16 len)
432{
433 if (!state->platform.risc.fw_is_running)
434 return -EIO;
435
436 DibAcquireLock(&state->platform.risc.mem_lock);
437 dib9000_risc_mem_setup(state, cmd | 0x80);
438 dib9000_risc_mem_read_chunks(state, b, len);
439 DibReleaseLock(&state->platform.risc.mem_lock);
440 return 0;
441}
442
443static int dib9000_risc_mem_write(struct dib9000_state *state, u8 cmd, const u8 * b)
444{
445 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd];
446 if (!state->platform.risc.fw_is_running)
447 return -EIO;
448
449 DibAcquireLock(&state->platform.risc.mem_lock);
450 dib9000_risc_mem_setup(state, cmd);
451 dib9000_risc_mem_write_chunks(state, b, m->size);
452 DibReleaseLock(&state->platform.risc.mem_lock);
453 return 0;
454}
455
456static int dib9000_firmware_download(struct dib9000_state *state, u8 risc_id, u16 key, const u8 * code, u32 len)
457{
458 u16 offs;
459
460 if (risc_id == 1)
461 offs = 16;
462 else
463 offs = 0;
464
465 /* config crtl reg */
466 dib9000_write_word(state, 1024 + offs, 0x000f);
467 dib9000_write_word(state, 1025 + offs, 0);
468 dib9000_write_word(state, 1031 + offs, key);
469
470 dprintk("going to download %dB of microcode", len);
471 if (dib9000_write16_noinc(state, 1026 + offs, (u8 *) code, (u16) len) != 0) {
472 dprintk("error while downloading microcode for RISC %c", 'A' + risc_id);
473 return -EIO;
474 }
475
476 dprintk("Microcode for RISC %c loaded", 'A' + risc_id);
477
478 return 0;
479}
480
481static int dib9000_mbx_host_init(struct dib9000_state *state, u8 risc_id)
482{
483 u16 mbox_offs;
484 u16 reset_reg;
485 u16 tries = 1000;
486
487 if (risc_id == 1)
488 mbox_offs = 16;
489 else
490 mbox_offs = 0;
491
492 /* Reset mailbox */
493 dib9000_write_word(state, 1027 + mbox_offs, 0x8000);
494
495 /* Read reset status */
496 do {
497 reset_reg = dib9000_read_word(state, 1027 + mbox_offs);
498 msleep(100);
499 } while ((reset_reg & 0x8000) && --tries);
500
501 if (reset_reg & 0x8000) {
502 dprintk("MBX: init ERROR, no response from RISC %c", 'A' + risc_id);
503 return -EIO;
504 }
505 dprintk("MBX: initialized");
506 return 0;
507}
508
509#define MAX_MAILBOX_TRY 100
510static int dib9000_mbx_send_attr(struct dib9000_state *state, u8 id, u16 * data, u8 len, u16 attr)
511{
512 u8 *d, b[2];
513 u16 tmp;
514 u16 size;
515 u32 i;
516 int ret = 0;
517
518 if (!state->platform.risc.fw_is_running)
519 return -EINVAL;
520
521 DibAcquireLock(&state->platform.risc.mbx_if_lock);
522 tmp = MAX_MAILBOX_TRY;
523 do {
524 size = dib9000_read_word_attr(state, 1043, attr) & 0xff;
525 if ((size + len + 1) > MBX_MAX_WORDS && --tmp) {
526 dprintk("MBX: RISC mbx full, retrying");
527 msleep(100);
528 } else
529 break;
530 } while (1);
531
532 /*dprintk( "MBX: size: %d", size); */
533
534 if (tmp == 0) {
535 ret = -EINVAL;
536 goto out;
537 }
538#ifdef DUMP_MSG
539 dprintk("--> %02x %d ", id, len + 1);
540 for (i = 0; i < len; i++)
541 dprintk("%04x ", data[i]);
542 dprintk("\n");
543#endif
544
545 /* byte-order conversion - works on big (where it is not necessary) or little endian */
546 d = (u8 *) data;
547 for (i = 0; i < len; i++) {
548 tmp = data[i];
549 *d++ = tmp >> 8;
550 *d++ = tmp & 0xff;
551 }
552
553 /* write msg */
554 b[0] = id;
555 b[1] = len + 1;
556 if (dib9000_write16_noinc_attr(state, 1045, b, 2, attr) != 0 || dib9000_write16_noinc_attr(state, 1045, (u8 *) data, len * 2, attr) != 0) {
557 ret = -EIO;
558 goto out;
559 }
560
561 /* update register nb_mes_in_RX */
562 ret = (u8) dib9000_write_word_attr(state, 1043, 1 << 14, attr);
563
564out:
565 DibReleaseLock(&state->platform.risc.mbx_if_lock);
566
567 return ret;
568}
569
570static u8 dib9000_mbx_read(struct dib9000_state *state, u16 * data, u8 risc_id, u16 attr)
571{
572#ifdef DUMP_MSG
573 u16 *d = data;
574#endif
575
576 u16 tmp, i;
577 u8 size;
578 u8 mc_base;
579
580 if (!state->platform.risc.fw_is_running)
581 return 0;
582
583 DibAcquireLock(&state->platform.risc.mbx_if_lock);
584 if (risc_id == 1)
585 mc_base = 16;
586 else
587 mc_base = 0;
588
589 /* Length and type in the first word */
590 *data = dib9000_read_word_attr(state, 1029 + mc_base, attr);
591
592 size = *data & 0xff;
593 if (size <= MBX_MAX_WORDS) {
594 data++;
595 size--; /* Initial word already read */
596
597 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, size * 2, attr);
598
599 /* to word conversion */
600 for (i = 0; i < size; i++) {
601 tmp = *data;
602 *data = (tmp >> 8) | (tmp << 8);
603 data++;
604 }
605
606#ifdef DUMP_MSG
607 dprintk("<-- ");
608 for (i = 0; i < size + 1; i++)
609 dprintk("%04x ", d[i]);
610 dprintk("\n");
611#endif
612 } else {
613 dprintk("MBX: message is too big for message cache (%d), flushing message", size);
614 size--; /* Initial word already read */
615 while (size--)
616 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, 2, attr);
617 }
618 /* Update register nb_mes_in_TX */
619 dib9000_write_word_attr(state, 1028 + mc_base, 1 << 14, attr);
620
621 DibReleaseLock(&state->platform.risc.mbx_if_lock);
622
623 return size + 1;
624}
625
626static int dib9000_risc_debug_buf(struct dib9000_state *state, u16 * data, u8 size)
627{
628 u32 ts = data[1] << 16 | data[0];
629 char *b = (char *)&data[2];
630
631 b[2 * (size - 2) - 1] = '\0'; /* Bullet proof the buffer */
632 if (*b == '~') {
633 b++;
634 dprintk(b);
635 } else
636 dprintk("RISC%d: %d.%04d %s", state->fe_id, ts / 10000, ts % 10000, *b ? b : "<emtpy>");
637 return 1;
638}
639
640static int dib9000_mbx_fetch_to_cache(struct dib9000_state *state, u16 attr)
641{
642 int i;
643 u8 size;
644 u16 *block;
645 /* find a free slot */
646 for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
647 block = state->platform.risc.message_cache[i];
648 if (*block == 0) {
649 size = dib9000_mbx_read(state, block, 1, attr);
650
651/* dprintk( "MBX: fetched %04x message to cache", *block); */
652
653 switch (*block >> 8) {
654 case IN_MSG_DEBUG_BUF:
655 dib9000_risc_debug_buf(state, block + 1, size); /* debug-messages are going to be printed right away */
656 *block = 0; /* free the block */
657 break;
658#if 0
659 case IN_MSG_DATA: /* FE-TRACE */
660 dib9000_risc_data_process(state, block + 1, size);
661 *block = 0;
662 break;
663#endif
664 default:
665 break;
666 }
667
668 return 1;
669 }
670 }
671 dprintk("MBX: no free cache-slot found for new message...");
672 return -1;
673}
674
675static u8 dib9000_mbx_count(struct dib9000_state *state, u8 risc_id, u16 attr)
676{
677 if (risc_id == 0)
678 return (u8) (dib9000_read_word_attr(state, 1028, attr) >> 10) & 0x1f; /* 5 bit field */
679 else
680 return (u8) (dib9000_read_word_attr(state, 1044, attr) >> 8) & 0x7f; /* 7 bit field */
681}
682
683static int dib9000_mbx_process(struct dib9000_state *state, u16 attr)
684{
685 int ret = 0;
686 u16 tmp;
687
688 if (!state->platform.risc.fw_is_running)
689 return -1;
690
691 DibAcquireLock(&state->platform.risc.mbx_lock);
692
693 if (dib9000_mbx_count(state, 1, attr)) /* 1=RiscB */
694 ret = dib9000_mbx_fetch_to_cache(state, attr);
695
696 tmp = dib9000_read_word_attr(state, 1229, attr); /* Clear the IRQ */
697/* if (tmp) */
698/* dprintk( "cleared IRQ: %x", tmp); */
699 DibReleaseLock(&state->platform.risc.mbx_lock);
700
701 return ret;
702}
703
704static int dib9000_mbx_get_message_attr(struct dib9000_state *state, u16 id, u16 * msg, u8 * size, u16 attr)
705{
706 u8 i;
707 u16 *block;
708 u16 timeout = 30;
709
710 *msg = 0;
711 do {
712 /* dib9000_mbx_get_from_cache(); */
713 for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
714 block = state->platform.risc.message_cache[i];
715 if ((*block >> 8) == id) {
716 *size = (*block & 0xff) - 1;
717 memcpy(msg, block + 1, (*size) * 2);
718 *block = 0; /* free the block */
719 i = 0; /* signal that we found a message */
720 break;
721 }
722 }
723
724 if (i == 0)
725 break;
726
727 if (dib9000_mbx_process(state, attr) == -1) /* try to fetch one message - if any */
728 return -1;
729
730 } while (--timeout);
731
732 if (timeout == 0) {
733 dprintk("waiting for message %d timed out", id);
734 return -1;
735 }
736
737 return i == 0;
738}
739
740static int dib9000_risc_check_version(struct dib9000_state *state)
741{
742 u8 r[4];
743 u8 size;
744 u16 fw_version = 0;
745
746 if (dib9000_mbx_send(state, OUT_MSG_REQ_VERSION, &fw_version, 1) != 0)
747 return -EIO;
748
749 if (dib9000_mbx_get_message(state, IN_MSG_VERSION, (u16 *) r, &size) < 0)
750 return -EIO;
751
752 fw_version = (r[0] << 8) | r[1];
753 dprintk("RISC: ver: %d.%02d (IC: %d)", fw_version >> 10, fw_version & 0x3ff, (r[2] << 8) | r[3]);
754
755 if ((fw_version >> 10) != 7)
756 return -EINVAL;
757
758 switch (fw_version & 0x3ff) {
759 case 11:
760 case 12:
761 case 14:
762 case 15:
763 case 16:
764 case 17:
765 break;
766 default:
767 dprintk("RISC: invalid firmware version");
768 return -EINVAL;
769 }
770
771 dprintk("RISC: valid firmware version");
772 return 0;
773}
774
775static int dib9000_fw_boot(struct dib9000_state *state, const u8 * codeA, u32 lenA, const u8 * codeB, u32 lenB)
776{
777 /* Reconfig pool mac ram */
778 dib9000_write_word(state, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
779 dib9000_write_word(state, 1226, 0x05);
780
781 /* Toggles IP crypto to Host APB interface. */
782 dib9000_write_word(state, 1542, 1);
783
784 /* Set jump and no jump in the dma box */
785 dib9000_write_word(state, 1074, 0);
786 dib9000_write_word(state, 1075, 0);
787
788 /* Set MAC as APB Master. */
789 dib9000_write_word(state, 1237, 0);
790
791 /* Reset the RISCs */
792 if (codeA != NULL)
793 dib9000_write_word(state, 1024, 2);
794 else
795 dib9000_write_word(state, 1024, 15);
796 if (codeB != NULL)
797 dib9000_write_word(state, 1040, 2);
798
799 if (codeA != NULL)
800 dib9000_firmware_download(state, 0, 0x1234, codeA, lenA);
801 if (codeB != NULL)
802 dib9000_firmware_download(state, 1, 0x1234, codeB, lenB);
803
804 /* Run the RISCs */
805 if (codeA != NULL)
806 dib9000_write_word(state, 1024, 0);
807 if (codeB != NULL)
808 dib9000_write_word(state, 1040, 0);
809
810 if (codeA != NULL)
811 if (dib9000_mbx_host_init(state, 0) != 0)
812 return -EIO;
813 if (codeB != NULL)
814 if (dib9000_mbx_host_init(state, 1) != 0)
815 return -EIO;
816
817 msleep(100);
818 state->platform.risc.fw_is_running = 1;
819
820 if (dib9000_risc_check_version(state) != 0)
821 return -EINVAL;
822
823 state->platform.risc.memcmd = 0xff;
824 return 0;
825}
826
827static u16 dib9000_identify(struct i2c_device *client)
828{
829 u16 value;
830
831 value = dib9000_i2c_read16(client, 896);
832 if (value != 0x01b3) {
833 dprintk("wrong Vendor ID (0x%x)", value);
834 return 0;
835 }
836
837 value = dib9000_i2c_read16(client, 897);
838 if (value != 0x4000 && value != 0x4001 && value != 0x4002 && value != 0x4003 && value != 0x4004 && value != 0x4005) {
839 dprintk("wrong Device ID (0x%x)", value);
840 return 0;
841 }
842
843 /* protect this driver to be used with 7000PC */
844 if (value == 0x4000 && dib9000_i2c_read16(client, 769) == 0x4000) {
845 dprintk("this driver does not work with DiB7000PC");
846 return 0;
847 }
848
849 switch (value) {
850 case 0x4000:
851 dprintk("found DiB7000MA/PA/MB/PB");
852 break;
853 case 0x4001:
854 dprintk("found DiB7000HC");
855 break;
856 case 0x4002:
857 dprintk("found DiB7000MC");
858 break;
859 case 0x4003:
860 dprintk("found DiB9000A");
861 break;
862 case 0x4004:
863 dprintk("found DiB9000H");
864 break;
865 case 0x4005:
866 dprintk("found DiB9000M");
867 break;
868 }
869
870 return value;
871}
872
873static void dib9000_set_power_mode(struct dib9000_state *state, enum dib9000_power_mode mode)
874{
875 /* by default everything is going to be powered off */
876 u16 reg_903 = 0x3fff, reg_904 = 0xffff, reg_905 = 0xffff, reg_906;
877 u8 offset;
878
879 if (state->revision == 0x4003 || state->revision == 0x4004 || state->revision == 0x4005)
880 offset = 1;
881 else
882 offset = 0;
883
884 reg_906 = dib9000_read_word(state, 906 + offset) | 0x3; /* keep settings for RISC */
885
886 /* now, depending on the requested mode, we power on */
887 switch (mode) {
888 /* power up everything in the demod */
889 case DIB9000_POWER_ALL:
890 reg_903 = 0x0000;
891 reg_904 = 0x0000;
892 reg_905 = 0x0000;
893 reg_906 = 0x0000;
894 break;
895
896 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
897 case DIB9000_POWER_INTERFACE_ONLY: /* TODO power up either SDIO or I2C or SRAM */
898 reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
899 break;
900
901 case DIB9000_POWER_INTERF_ANALOG_AGC:
902 reg_903 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
903 reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
904 reg_906 &= ~((1 << 0));
905 break;
906
907 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD:
908 reg_903 = 0x0000;
909 reg_904 = 0x801f;
910 reg_905 = 0x0000;
911 reg_906 &= ~((1 << 0));
912 break;
913
914 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD:
915 reg_903 = 0x0000;
916 reg_904 = 0x8000;
917 reg_905 = 0x010b;
918 reg_906 &= ~((1 << 0));
919 break;
920 default:
921 case DIB9000_POWER_NO:
922 break;
923 }
924
925 /* always power down unused parts */
926 if (!state->platform.host.mobile_mode)
927 reg_904 |= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
928
929 /* P_sdio_select_clk = 0 on MC and after */
930 if (state->revision != 0x4000)
931 reg_906 <<= 1;
932
933 dib9000_write_word(state, 903 + offset, reg_903);
934 dib9000_write_word(state, 904 + offset, reg_904);
935 dib9000_write_word(state, 905 + offset, reg_905);
936 dib9000_write_word(state, 906 + offset, reg_906);
937}
938
939static int dib9000_fw_reset(struct dvb_frontend *fe)
940{
941 struct dib9000_state *state = fe->demodulator_priv;
942
943 dib9000_write_word(state, 1817, 0x0003);
944
945 dib9000_write_word(state, 1227, 1);
946 dib9000_write_word(state, 1227, 0);
947
948 switch ((state->revision = dib9000_identify(&state->i2c))) {
949 case 0x4003:
950 case 0x4004:
951 case 0x4005:
952 state->reg_offs = 1;
953 break;
954 default:
955 return -EINVAL;
956 }
957
958 /* reset the i2c-master to use the host interface */
959 dibx000_reset_i2c_master(&state->i2c_master);
960
961 dib9000_set_power_mode(state, DIB9000_POWER_ALL);
962
963 /* unforce divstr regardless whether i2c enumeration was done or not */
964 dib9000_write_word(state, 1794, dib9000_read_word(state, 1794) & ~(1 << 1));
965 dib9000_write_word(state, 1796, 0);
966 dib9000_write_word(state, 1805, 0x805);
967
968 /* restart all parts */
969 dib9000_write_word(state, 898, 0xffff);
970 dib9000_write_word(state, 899, 0xffff);
971 dib9000_write_word(state, 900, 0x0001);
972 dib9000_write_word(state, 901, 0xff19);
973 dib9000_write_word(state, 902, 0x003c);
974
975 dib9000_write_word(state, 898, 0);
976 dib9000_write_word(state, 899, 0);
977 dib9000_write_word(state, 900, 0);
978 dib9000_write_word(state, 901, 0);
979 dib9000_write_word(state, 902, 0);
980
981 dib9000_write_word(state, 911, state->chip.d9.cfg.if_drives);
982
983 dib9000_set_power_mode(state, DIB9000_POWER_INTERFACE_ONLY);
984
985 return 0;
986}
987
988static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len)
989{
990 u16 mb[10];
991 u8 i, s;
992
993 if (address >= 1024 || !state->platform.risc.fw_is_running)
994 return -EINVAL;
995
996 /* dprintk( "APB access thru rd fw %d %x", address, attribute); */
997
998 mb[0] = (u16) address;
999 mb[1] = len / 2;
1000 dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_R, mb, 2, attribute);
1001 switch (dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute)) {
1002 case 1:
1003 s--;
1004 for (i = 0; i < s; i++) {
1005 b[i * 2] = (mb[i + 1] >> 8) & 0xff;
1006 b[i * 2 + 1] = (mb[i + 1]) & 0xff;
1007 }
1008 return 0;
1009 default:
1010 return -EIO;
1011 }
1012 return -EIO;
1013}
1014
1015static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len)
1016{
1017 u16 mb[10];
1018 u8 s, i;
1019
1020 if (address >= 1024 || !state->platform.risc.fw_is_running)
1021 return -EINVAL;
1022
1023 /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1024
1025 mb[0] = (unsigned short)address;
1026 for (i = 0; i < len && i < 20; i += 2)
1027 mb[1 + (i / 2)] = (b[i] << 8 | b[i + 1]);
1028
1029 dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_W, mb, 1 + len / 2, attribute);
1030 return dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute) == 1 ? 0 : -EINVAL;
1031}
1032
1033static int dib9000_fw_memmbx_sync(struct dib9000_state *state, u8 i)
1034{
1035 u8 index_loop = 10;
1036
1037 if (!state->platform.risc.fw_is_running)
1038 return 0;
1039 dib9000_risc_mem_write(state, FE_MM_RW_SYNC, &i);
1040 do {
1041 dib9000_risc_mem_read(state, FE_MM_RW_SYNC, state->i2c_read_buffer, 1);
1042 } while (state->i2c_read_buffer[0] && index_loop--);
1043
1044 if (index_loop > 0)
1045 return 0;
1046 return -EIO;
1047}
1048
1049static int dib9000_fw_init(struct dib9000_state *state)
1050{
1051 struct dibGPIOFunction *f;
1052 u16 b[40] = { 0 };
1053 u8 i;
1054 u8 size;
1055
1056 if (dib9000_fw_boot(state, NULL, 0, state->chip.d9.cfg.microcode_B_fe_buffer, state->chip.d9.cfg.microcode_B_fe_size) != 0)
1057 return -EIO;
1058
1059 /* initialize the firmware */
1060 for (i = 0; i < ARRAY_SIZE(state->chip.d9.cfg.gpio_function); i++) {
1061 f = &state->chip.d9.cfg.gpio_function[i];
1062 if (f->mask) {
1063 switch (f->function) {
1064 case BOARD_GPIO_FUNCTION_COMPONENT_ON:
1065 b[0] = (u16) f->mask;
1066 b[1] = (u16) f->direction;
1067 b[2] = (u16) f->value;
1068 break;
1069 case BOARD_GPIO_FUNCTION_COMPONENT_OFF:
1070 b[3] = (u16) f->mask;
1071 b[4] = (u16) f->direction;
1072 b[5] = (u16) f->value;
1073 break;
1074 }
1075 }
1076 }
1077 if (dib9000_mbx_send(state, OUT_MSG_CONF_GPIO, b, 15) != 0)
1078 return -EIO;
1079
1080 /* subband */
1081 b[0] = state->chip.d9.cfg.subband.size; /* type == 0 -> GPIO - PWM not yet supported */
1082 for (i = 0; i < state->chip.d9.cfg.subband.size; i++) {
1083 b[1 + i * 4] = state->chip.d9.cfg.subband.subband[i].f_mhz;
1084 b[2 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.mask;
1085 b[3 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.direction;
1086 b[4 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.value;
1087 }
1088 b[1 + i * 4] = 0; /* fe_id */
1089 if (dib9000_mbx_send(state, OUT_MSG_SUBBAND_SEL, b, 2 + 4 * i) != 0)
1090 return -EIO;
1091
1092 /* 0 - id, 1 - no_of_frontends */
1093 b[0] = (0 << 8) | 1;
1094 /* 0 = i2c-address demod, 0 = tuner */
1095 b[1] = (0 << 8) | (0);
1096 b[2] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000) >> 16) & 0xffff);
1097 b[3] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000)) & 0xffff);
1098 b[4] = (u16) ((state->chip.d9.cfg.vcxo_timer >> 16) & 0xffff);
1099 b[5] = (u16) ((state->chip.d9.cfg.vcxo_timer) & 0xffff);
1100 b[6] = (u16) ((state->chip.d9.cfg.timing_frequency >> 16) & 0xffff);
1101 b[7] = (u16) ((state->chip.d9.cfg.timing_frequency) & 0xffff);
1102 b[29] = state->chip.d9.cfg.if_drives;
1103 if (dib9000_mbx_send(state, OUT_MSG_INIT_DEMOD, b, ARRAY_SIZE(b)) != 0)
1104 return -EIO;
1105
1106 if (dib9000_mbx_send(state, OUT_MSG_FE_FW_DL, NULL, 0) != 0)
1107 return -EIO;
1108
1109 if (dib9000_mbx_get_message(state, IN_MSG_FE_FW_DL_DONE, b, &size) < 0)
1110 return -EIO;
1111
1112 if (size > ARRAY_SIZE(b)) {
1113 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size,
1114 (int)ARRAY_SIZE(b));
1115 return -EINVAL;
1116 }
1117
1118 for (i = 0; i < size; i += 2) {
1119 state->platform.risc.fe_mm[i / 2].addr = b[i + 0];
1120 state->platform.risc.fe_mm[i / 2].size = b[i + 1];
1121 }
1122
1123 return 0;
1124}
1125
1126static void dib9000_fw_set_channel_head(struct dib9000_state *state, struct dvb_frontend_parameters *ch)
1127{
1128 u8 b[9];
1129 u32 freq = state->fe[0]->dtv_property_cache.frequency / 1000;
1130 if (state->fe_id % 2)
1131 freq += 101;
1132
1133 b[0] = (u8) ((freq >> 0) & 0xff);
1134 b[1] = (u8) ((freq >> 8) & 0xff);
1135 b[2] = (u8) ((freq >> 16) & 0xff);
1136 b[3] = (u8) ((freq >> 24) & 0xff);
1137 b[4] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 0) & 0xff);
1138 b[5] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 8) & 0xff);
1139 b[6] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 16) & 0xff);
1140 b[7] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 24) & 0xff);
1141 b[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1142 if (state->fe[0]->dtv_property_cache.delivery_system == SYS_DVBT)
1143 b[8] |= 1;
1144 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_HEAD, b);
1145}
1146
1147static int dib9000_fw_get_channel(struct dvb_frontend *fe, struct dvb_frontend_parameters *channel)
1148{
1149 struct dib9000_state *state = fe->demodulator_priv;
1150 struct dibDVBTChannel {
1151 s8 spectrum_inversion;
1152
1153 s8 nfft;
1154 s8 guard;
1155 s8 constellation;
1156
1157 s8 hrch;
1158 s8 alpha;
1159 s8 code_rate_hp;
1160 s8 code_rate_lp;
1161 s8 select_hp;
1162
1163 s8 intlv_native;
1164 };
1165 struct dibDVBTChannel *ch;
1166 int ret = 0;
1167
1168 DibAcquireLock(&state->platform.risc.mem_mbx_lock);
1169 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
1170 goto error;
1171 ret = -EIO;
1172 }
1173
1174 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_UNION,
1175 state->i2c_read_buffer, sizeof(struct dibDVBTChannel));
1176 ch = (struct dibDVBTChannel *)state->i2c_read_buffer;
1177
1178
1179 switch (ch->spectrum_inversion & 0x7) {
1180 case 1:
1181 state->fe[0]->dtv_property_cache.inversion = INVERSION_ON;
1182 break;
1183 case 0:
1184 state->fe[0]->dtv_property_cache.inversion = INVERSION_OFF;
1185 break;
1186 default:
1187 case -1:
1188 state->fe[0]->dtv_property_cache.inversion = INVERSION_AUTO;
1189 break;
1190 }
1191 switch (ch->nfft) {
1192 case 0:
1193 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
1194 break;
1195 case 2:
1196 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
1197 break;
1198 case 1:
1199 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
1200 break;
1201 default:
1202 case -1:
1203 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
1204 break;
1205 }
1206 switch (ch->guard) {
1207 case 0:
1208 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
1209 break;
1210 case 1:
1211 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
1212 break;
1213 case 2:
1214 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
1215 break;
1216 case 3:
1217 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
1218 break;
1219 default:
1220 case -1:
1221 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
1222 break;
1223 }
1224 switch (ch->constellation) {
1225 case 2:
1226 state->fe[0]->dtv_property_cache.modulation = QAM_64;
1227 break;
1228 case 1:
1229 state->fe[0]->dtv_property_cache.modulation = QAM_16;
1230 break;
1231 case 0:
1232 state->fe[0]->dtv_property_cache.modulation = QPSK;
1233 break;
1234 default:
1235 case -1:
1236 state->fe[0]->dtv_property_cache.modulation = QAM_AUTO;
1237 break;
1238 }
1239 switch (ch->hrch) {
1240 case 0:
1241 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_NONE;
1242 break;
1243 case 1:
1244 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_1;
1245 break;
1246 default:
1247 case -1:
1248 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
1249 break;
1250 }
1251 switch (ch->code_rate_hp) {
1252 case 1:
1253 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_1_2;
1254 break;
1255 case 2:
1256 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_2_3;
1257 break;
1258 case 3:
1259 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_3_4;
1260 break;
1261 case 5:
1262 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_5_6;
1263 break;
1264 case 7:
1265 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_7_8;
1266 break;
1267 default:
1268 case -1:
1269 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_AUTO;
1270 break;
1271 }
1272 switch (ch->code_rate_lp) {
1273 case 1:
1274 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_1_2;
1275 break;
1276 case 2:
1277 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_2_3;
1278 break;
1279 case 3:
1280 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_3_4;
1281 break;
1282 case 5:
1283 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_5_6;
1284 break;
1285 case 7:
1286 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_7_8;
1287 break;
1288 default:
1289 case -1:
1290 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_AUTO;
1291 break;
1292 }
1293
1294error:
1295 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
1296 return ret;
1297}
1298
1299static int dib9000_fw_set_channel_union(struct dvb_frontend *fe, struct dvb_frontend_parameters *channel)
1300{
1301 struct dib9000_state *state = fe->demodulator_priv;
1302 struct dibDVBTChannel {
1303 s8 spectrum_inversion;
1304
1305 s8 nfft;
1306 s8 guard;
1307 s8 constellation;
1308
1309 s8 hrch;
1310 s8 alpha;
1311 s8 code_rate_hp;
1312 s8 code_rate_lp;
1313 s8 select_hp;
1314
1315 s8 intlv_native;
1316 };
1317 struct dibDVBTChannel ch;
1318
1319 switch (state->fe[0]->dtv_property_cache.inversion) {
1320 case INVERSION_ON:
1321 ch.spectrum_inversion = 1;
1322 break;
1323 case INVERSION_OFF:
1324 ch.spectrum_inversion = 0;
1325 break;
1326 default:
1327 case INVERSION_AUTO:
1328 ch.spectrum_inversion = -1;
1329 break;
1330 }
1331 switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1332 case TRANSMISSION_MODE_2K:
1333 ch.nfft = 0;
1334 break;
1335 case TRANSMISSION_MODE_4K:
1336 ch.nfft = 2;
1337 break;
1338 case TRANSMISSION_MODE_8K:
1339 ch.nfft = 1;
1340 break;
1341 default:
1342 case TRANSMISSION_MODE_AUTO:
1343 ch.nfft = 1;
1344 break;
1345 }
1346 switch (state->fe[0]->dtv_property_cache.guard_interval) {
1347 case GUARD_INTERVAL_1_32:
1348 ch.guard = 0;
1349 break;
1350 case GUARD_INTERVAL_1_16:
1351 ch.guard = 1;
1352 break;
1353 case GUARD_INTERVAL_1_8:
1354 ch.guard = 2;
1355 break;
1356 case GUARD_INTERVAL_1_4:
1357 ch.guard = 3;
1358 break;
1359 default:
1360 case GUARD_INTERVAL_AUTO:
1361 ch.guard = -1;
1362 break;
1363 }
1364 switch (state->fe[0]->dtv_property_cache.modulation) {
1365 case QAM_64:
1366 ch.constellation = 2;
1367 break;
1368 case QAM_16:
1369 ch.constellation = 1;
1370 break;
1371 case QPSK:
1372 ch.constellation = 0;
1373 break;
1374 default:
1375 case QAM_AUTO:
1376 ch.constellation = -1;
1377 break;
1378 }
1379 switch (state->fe[0]->dtv_property_cache.hierarchy) {
1380 case HIERARCHY_NONE:
1381 ch.hrch = 0;
1382 break;
1383 case HIERARCHY_1:
1384 case HIERARCHY_2:
1385 case HIERARCHY_4:
1386 ch.hrch = 1;
1387 break;
1388 default:
1389 case HIERARCHY_AUTO:
1390 ch.hrch = -1;
1391 break;
1392 }
1393 ch.alpha = 1;
1394 switch (state->fe[0]->dtv_property_cache.code_rate_HP) {
1395 case FEC_1_2:
1396 ch.code_rate_hp = 1;
1397 break;
1398 case FEC_2_3:
1399 ch.code_rate_hp = 2;
1400 break;
1401 case FEC_3_4:
1402 ch.code_rate_hp = 3;
1403 break;
1404 case FEC_5_6:
1405 ch.code_rate_hp = 5;
1406 break;
1407 case FEC_7_8:
1408 ch.code_rate_hp = 7;
1409 break;
1410 default:
1411 case FEC_AUTO:
1412 ch.code_rate_hp = -1;
1413 break;
1414 }
1415 switch (state->fe[0]->dtv_property_cache.code_rate_LP) {
1416 case FEC_1_2:
1417 ch.code_rate_lp = 1;
1418 break;
1419 case FEC_2_3:
1420 ch.code_rate_lp = 2;
1421 break;
1422 case FEC_3_4:
1423 ch.code_rate_lp = 3;
1424 break;
1425 case FEC_5_6:
1426 ch.code_rate_lp = 5;
1427 break;
1428 case FEC_7_8:
1429 ch.code_rate_lp = 7;
1430 break;
1431 default:
1432 case FEC_AUTO:
1433 ch.code_rate_lp = -1;
1434 break;
1435 }
1436 ch.select_hp = 1;
1437 ch.intlv_native = 1;
1438
1439 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_UNION, (u8 *) &ch);
1440
1441 return 0;
1442}
1443
1444static int dib9000_fw_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *ch)
1445{
1446 struct dib9000_state *state = fe->demodulator_priv;
1447 int ret = 10, search = state->channel_status.status == CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1448 s8 i;
1449
1450 switch (state->tune_state) {
1451 case CT_DEMOD_START:
1452 dib9000_fw_set_channel_head(state, ch);
1453
1454 /* write the channel context - a channel is initialized to 0, so it is OK */
1455 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_CONTEXT, (u8 *) fe_info);
1456 dib9000_risc_mem_write(state, FE_MM_W_FE_INFO, (u8 *) fe_info);
1457
1458 if (search)
1459 dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_SEARCH, NULL, 0);
1460 else {
1461 dib9000_fw_set_channel_union(fe, ch);
1462 dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_TUNE, NULL, 0);
1463 }
1464 state->tune_state = CT_DEMOD_STEP_1;
1465 break;
1466 case CT_DEMOD_STEP_1:
1467 if (search)
1468 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_SEARCH_STATE, state->i2c_read_buffer, 1);
1469 else
1470 dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_TUNE_STATE, state->i2c_read_buffer, 1);
1471 i = (s8)state->i2c_read_buffer[0];
1472 switch (i) { /* something happened */
1473 case 0:
1474 break;
1475 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1476 if (search)
1477 state->status = FE_STATUS_DEMOD_SUCCESS;
1478 else {
1479 state->tune_state = CT_DEMOD_STOP;
1480 state->status = FE_STATUS_LOCKED;
1481 }
1482 break;
1483 default:
1484 state->status = FE_STATUS_TUNE_FAILED;
1485 state->tune_state = CT_DEMOD_STOP;
1486 break;
1487 }
1488 break;
1489 default:
1490 ret = FE_CALLBACK_TIME_NEVER;
1491 break;
1492 }
1493
1494 return ret;
1495}
1496
1497static int dib9000_fw_set_diversity_in(struct dvb_frontend *fe, int onoff)
1498{
1499 struct dib9000_state *state = fe->demodulator_priv;
1500 u16 mode = (u16) onoff;
1501 return dib9000_mbx_send(state, OUT_MSG_ENABLE_DIVERSITY, &mode, 1);
1502}
1503
1504static int dib9000_fw_set_output_mode(struct dvb_frontend *fe, int mode)
1505{
1506 struct dib9000_state *state = fe->demodulator_priv;
1507 u16 outreg, smo_mode;
1508
1509 dprintk("setting output mode for demod %p to %d", fe, mode);
1510
1511 switch (mode) {
1512 case OUTMODE_MPEG2_PAR_GATED_CLK:
1513 outreg = (1 << 10); /* 0x0400 */
1514 break;
1515 case OUTMODE_MPEG2_PAR_CONT_CLK:
1516 outreg = (1 << 10) | (1 << 6); /* 0x0440 */
1517 break;
1518 case OUTMODE_MPEG2_SERIAL:
1519 outreg = (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1520 break;
1521 case OUTMODE_DIVERSITY:
1522 outreg = (1 << 10) | (4 << 6); /* 0x0500 */
1523 break;
1524 case OUTMODE_MPEG2_FIFO:
1525 outreg = (1 << 10) | (5 << 6);
1526 break;
1527 case OUTMODE_HIGH_Z:
1528 outreg = 0;
1529 break;
1530 default:
1531 dprintk("Unhandled output_mode passed to be set for demod %p", &state->fe[0]);
1532 return -EINVAL;
1533 }
1534
1535 dib9000_write_word(state, 1795, outreg);
1536
1537 switch (mode) {
1538 case OUTMODE_MPEG2_PAR_GATED_CLK:
1539 case OUTMODE_MPEG2_PAR_CONT_CLK:
1540 case OUTMODE_MPEG2_SERIAL:
1541 case OUTMODE_MPEG2_FIFO:
1542 smo_mode = (dib9000_read_word(state, 295) & 0x0010) | (1 << 1);
1543 if (state->chip.d9.cfg.output_mpeg2_in_188_bytes)
1544 smo_mode |= (1 << 5);
1545 dib9000_write_word(state, 295, smo_mode);
1546 break;
1547 }
1548
1549 outreg = to_fw_output_mode(mode);
1550 return dib9000_mbx_send(state, OUT_MSG_SET_OUTPUT_MODE, &outreg, 1);
1551}
1552
1553static int dib9000_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1554{
1555 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1556 u16 i, len, t, index_msg;
1557
1558 for (index_msg = 0; index_msg < num; index_msg++) {
1559 if (msg[index_msg].flags & I2C_M_RD) { /* read */
1560 len = msg[index_msg].len;
1561 if (len > 16)
1562 len = 16;
1563
1564 if (dib9000_read_word(state, 790) != 0)
1565 dprintk("TunerITF: read busy");
1566
1567 dib9000_write_word(state, 784, (u16) (msg[index_msg].addr));
1568 dib9000_write_word(state, 787, (len / 2) - 1);
1569 dib9000_write_word(state, 786, 1); /* start read */
1570
1571 i = 1000;
1572 while (dib9000_read_word(state, 790) != (len / 2) && i)
1573 i--;
1574
1575 if (i == 0)
1576 dprintk("TunerITF: read failed");
1577
1578 for (i = 0; i < len; i += 2) {
1579 t = dib9000_read_word(state, 785);
1580 msg[index_msg].buf[i] = (t >> 8) & 0xff;
1581 msg[index_msg].buf[i + 1] = (t) & 0xff;
1582 }
1583 if (dib9000_read_word(state, 790) != 0)
1584 dprintk("TunerITF: read more data than expected");
1585 } else {
1586 i = 1000;
1587 while (dib9000_read_word(state, 789) && i)
1588 i--;
1589 if (i == 0)
1590 dprintk("TunerITF: write busy");
1591
1592 len = msg[index_msg].len;
1593 if (len > 16)
1594 len = 16;
1595
1596 for (i = 0; i < len; i += 2)
1597 dib9000_write_word(state, 785, (msg[index_msg].buf[i] << 8) | msg[index_msg].buf[i + 1]);
1598 dib9000_write_word(state, 784, (u16) msg[index_msg].addr);
1599 dib9000_write_word(state, 787, (len / 2) - 1);
1600 dib9000_write_word(state, 786, 0); /* start write */
1601
1602 i = 1000;
1603 while (dib9000_read_word(state, 791) > 0 && i)
1604 i--;
1605 if (i == 0)
1606 dprintk("TunerITF: write failed");
1607 }
1608 }
1609 return num;
1610}
1611
1612int dib9000_fw_set_component_bus_speed(struct dvb_frontend *fe, u16 speed)
1613{
1614 struct dib9000_state *state = fe->demodulator_priv;
1615
1616 state->component_bus_speed = speed;
1617 return 0;
1618}
1619EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed);
1620
1621static int dib9000_fw_component_bus_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1622{
1623 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1624 u8 type = 0; /* I2C */
1625 u8 port = DIBX000_I2C_INTERFACE_GPIO_3_4;
1626 u16 scl = state->component_bus_speed; /* SCL frequency */
1627 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[FE_MM_RW_COMPONENT_ACCESS_BUFFER];
1628 u8 p[13] = { 0 };
1629
1630 p[0] = type;
1631 p[1] = port;
1632 p[2] = msg[0].addr << 1;
1633
1634 p[3] = (u8) scl & 0xff; /* scl */
1635 p[4] = (u8) (scl >> 8);
1636
1637 p[7] = 0;
1638 p[8] = 0;
1639
1640 p[9] = (u8) (msg[0].len);
1641 p[10] = (u8) (msg[0].len >> 8);
1642 if ((num > 1) && (msg[1].flags & I2C_M_RD)) {
1643 p[11] = (u8) (msg[1].len);
1644 p[12] = (u8) (msg[1].len >> 8);
1645 } else {
1646 p[11] = 0;
1647 p[12] = 0;
1648 }
1649
1650 DibAcquireLock(&state->platform.risc.mem_mbx_lock);
1651
1652 dib9000_risc_mem_write(state, FE_MM_W_COMPONENT_ACCESS, p);
1653
1654 { /* write-part */
1655 dib9000_risc_mem_setup_cmd(state, m->addr, msg[0].len, 0);
1656 dib9000_risc_mem_write_chunks(state, msg[0].buf, msg[0].len);
1657 }
1658
1659 /* do the transaction */
1660 if (dib9000_fw_memmbx_sync(state, FE_SYNC_COMPONENT_ACCESS) < 0) {
1661 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
1662 return 0;
1663 }
1664
1665 /* read back any possible result */
1666 if ((num > 1) && (msg[1].flags & I2C_M_RD))
1667 dib9000_risc_mem_read(state, FE_MM_RW_COMPONENT_ACCESS_BUFFER, msg[1].buf, msg[1].len);
1668
1669 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
1670
1671 return num;
1672}
1673
1674static u32 dib9000_i2c_func(struct i2c_adapter *adapter)
1675{
1676 return I2C_FUNC_I2C;
1677}
1678
1679static struct i2c_algorithm dib9000_tuner_algo = {
1680 .master_xfer = dib9000_tuner_xfer,
1681 .functionality = dib9000_i2c_func,
1682};
1683
1684static struct i2c_algorithm dib9000_component_bus_algo = {
1685 .master_xfer = dib9000_fw_component_bus_xfer,
1686 .functionality = dib9000_i2c_func,
1687};
1688
1689struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe)
1690{
1691 struct dib9000_state *st = fe->demodulator_priv;
1692 return &st->tuner_adap;
1693}
1694EXPORT_SYMBOL(dib9000_get_tuner_interface);
1695
1696struct i2c_adapter *dib9000_get_component_bus_interface(struct dvb_frontend *fe)
1697{
1698 struct dib9000_state *st = fe->demodulator_priv;
1699 return &st->component_bus;
1700}
1701EXPORT_SYMBOL(dib9000_get_component_bus_interface);
1702
1703struct i2c_adapter *dib9000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
1704{
1705 struct dib9000_state *st = fe->demodulator_priv;
1706 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
1707}
1708EXPORT_SYMBOL(dib9000_get_i2c_master);
1709
1710int dib9000_set_i2c_adapter(struct dvb_frontend *fe, struct i2c_adapter *i2c)
1711{
1712 struct dib9000_state *st = fe->demodulator_priv;
1713
1714 st->i2c.i2c_adap = i2c;
1715 return 0;
1716}
1717EXPORT_SYMBOL(dib9000_set_i2c_adapter);
1718
1719static int dib9000_cfg_gpio(struct dib9000_state *st, u8 num, u8 dir, u8 val)
1720{
1721 st->gpio_dir = dib9000_read_word(st, 773);
1722 st->gpio_dir &= ~(1 << num); /* reset the direction bit */
1723 st->gpio_dir |= (dir & 0x1) << num; /* set the new direction */
1724 dib9000_write_word(st, 773, st->gpio_dir);
1725
1726 st->gpio_val = dib9000_read_word(st, 774);
1727 st->gpio_val &= ~(1 << num); /* reset the direction bit */
1728 st->gpio_val |= (val & 0x01) << num; /* set the new value */
1729 dib9000_write_word(st, 774, st->gpio_val);
1730
1731 dprintk("gpio dir: %04x: gpio val: %04x", st->gpio_dir, st->gpio_val);
1732
1733 return 0;
1734}
1735
1736int dib9000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
1737{
1738 struct dib9000_state *state = fe->demodulator_priv;
1739 return dib9000_cfg_gpio(state, num, dir, val);
1740}
1741EXPORT_SYMBOL(dib9000_set_gpio);
1742
1743int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1744{
1745 struct dib9000_state *state = fe->demodulator_priv;
1746 u16 val = dib9000_read_word(state, 294 + 1) & 0xffef;
1747 val |= (onoff & 0x1) << 4;
1748
1749 dprintk("PID filter enabled %d", onoff);
1750 return dib9000_write_word(state, 294 + 1, val);
1751}
1752EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
1753
1754int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1755{
1756 struct dib9000_state *state = fe->demodulator_priv;
1757 dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
1758 return dib9000_write_word(state, 300 + 1 + id, onoff ? (1 << 13) | pid : 0);
1759}
1760EXPORT_SYMBOL(dib9000_fw_pid_filter);
1761
1762int dib9000_firmware_post_pll_init(struct dvb_frontend *fe)
1763{
1764 struct dib9000_state *state = fe->demodulator_priv;
1765 return dib9000_fw_init(state);
1766}
1767EXPORT_SYMBOL(dib9000_firmware_post_pll_init);
1768
1769static void dib9000_release(struct dvb_frontend *demod)
1770{
1771 struct dib9000_state *st = demod->demodulator_priv;
1772 u8 index_frontend;
1773
1774 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
1775 dvb_frontend_detach(st->fe[index_frontend]);
1776
1777 DibFreeLock(&state->platform.risc.mbx_if_lock);
1778 DibFreeLock(&state->platform.risc.mbx_lock);
1779 DibFreeLock(&state->platform.risc.mem_lock);
1780 DibFreeLock(&state->platform.risc.mem_mbx_lock);
1781 dibx000_exit_i2c_master(&st->i2c_master);
1782
1783 i2c_del_adapter(&st->tuner_adap);
1784 i2c_del_adapter(&st->component_bus);
1785 kfree(st->fe[0]);
1786 kfree(st);
1787}
1788
1789static int dib9000_wakeup(struct dvb_frontend *fe)
1790{
1791 return 0;
1792}
1793
1794static int dib9000_sleep(struct dvb_frontend *fe)
1795{
1796 struct dib9000_state *state = fe->demodulator_priv;
1797 u8 index_frontend;
1798 int ret;
1799
1800 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1801 ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
1802 if (ret < 0)
1803 return ret;
1804 }
1805 return dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
1806}
1807
1808static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1809{
1810 tune->min_delay_ms = 1000;
1811 return 0;
1812}
1813
1814static int dib9000_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1815{
1816 struct dib9000_state *state = fe->demodulator_priv;
1817 u8 index_frontend, sub_index_frontend;
1818 fe_status_t stat;
1819 int ret;
1820
1821 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1822 state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
1823 if (stat & FE_HAS_SYNC) {
1824 dprintk("TPS lock on the slave%i", index_frontend);
1825
1826 /* synchronize the cache with the other frontends */
1827 state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], fep);
1828 for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL);
1829 sub_index_frontend++) {
1830 if (sub_index_frontend != index_frontend) {
1831 state->fe[sub_index_frontend]->dtv_property_cache.modulation =
1832 state->fe[index_frontend]->dtv_property_cache.modulation;
1833 state->fe[sub_index_frontend]->dtv_property_cache.inversion =
1834 state->fe[index_frontend]->dtv_property_cache.inversion;
1835 state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode =
1836 state->fe[index_frontend]->dtv_property_cache.transmission_mode;
1837 state->fe[sub_index_frontend]->dtv_property_cache.guard_interval =
1838 state->fe[index_frontend]->dtv_property_cache.guard_interval;
1839 state->fe[sub_index_frontend]->dtv_property_cache.hierarchy =
1840 state->fe[index_frontend]->dtv_property_cache.hierarchy;
1841 state->fe[sub_index_frontend]->dtv_property_cache.code_rate_HP =
1842 state->fe[index_frontend]->dtv_property_cache.code_rate_HP;
1843 state->fe[sub_index_frontend]->dtv_property_cache.code_rate_LP =
1844 state->fe[index_frontend]->dtv_property_cache.code_rate_LP;
1845 state->fe[sub_index_frontend]->dtv_property_cache.rolloff =
1846 state->fe[index_frontend]->dtv_property_cache.rolloff;
1847 }
1848 }
1849 return 0;
1850 }
1851 }
1852
1853 /* get the channel from master chip */
1854 ret = dib9000_fw_get_channel(fe, fep);
1855 if (ret != 0)
1856 return ret;
1857
1858 /* synchronize the cache with the other frontends */
1859 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1860 state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
1861 state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
1862 state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
1863 state->fe[index_frontend]->dtv_property_cache.modulation = fe->dtv_property_cache.modulation;
1864 state->fe[index_frontend]->dtv_property_cache.hierarchy = fe->dtv_property_cache.hierarchy;
1865 state->fe[index_frontend]->dtv_property_cache.code_rate_HP = fe->dtv_property_cache.code_rate_HP;
1866 state->fe[index_frontend]->dtv_property_cache.code_rate_LP = fe->dtv_property_cache.code_rate_LP;
1867 state->fe[index_frontend]->dtv_property_cache.rolloff = fe->dtv_property_cache.rolloff;
1868 }
1869
1870 return 0;
1871}
1872
1873static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1874{
1875 struct dib9000_state *state = fe->demodulator_priv;
1876 state->tune_state = tune_state;
1877 if (tune_state == CT_DEMOD_START)
1878 state->status = FE_STATUS_TUNE_PENDING;
1879
1880 return 0;
1881}
1882
1883static u32 dib9000_get_status(struct dvb_frontend *fe)
1884{
1885 struct dib9000_state *state = fe->demodulator_priv;
1886 return state->status;
1887}
1888
1889static int dib9000_set_channel_status(struct dvb_frontend *fe, struct dvb_frontend_parametersContext *channel_status)
1890{
1891 struct dib9000_state *state = fe->demodulator_priv;
1892
1893 memcpy(&state->channel_status, channel_status, sizeof(struct dvb_frontend_parametersContext));
1894 return 0;
1895}
1896
1897static int dib9000_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
1898{
1899 struct dib9000_state *state = fe->demodulator_priv;
1900 int sleep_time, sleep_time_slave;
1901 u32 frontend_status;
1902 u8 nbr_pending, exit_condition, index_frontend, index_frontend_success;
1903 struct dvb_frontend_parametersContext channel_status;
1904
1905 /* check that the correct parameters are set */
1906 if (state->fe[0]->dtv_property_cache.frequency == 0) {
1907 dprintk("dib9000: must specify frequency ");
1908 return 0;
1909 }
1910
1911 if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
1912 dprintk("dib9000: must specify bandwidth ");
1913 return 0;
1914 }
1915 fe->dtv_property_cache.delivery_system = SYS_DVBT;
1916
1917 /* set the master status */
1918 if (fep->u.ofdm.transmission_mode == TRANSMISSION_MODE_AUTO ||
1919 fep->u.ofdm.guard_interval == GUARD_INTERVAL_AUTO || fep->u.ofdm.constellation == QAM_AUTO || fep->u.ofdm.code_rate_HP == FEC_AUTO) {
1920 /* no channel specified, autosearch the channel */
1921 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1922 } else
1923 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
1924
1925 /* set mode and status for the different frontends */
1926 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1927 dib9000_fw_set_diversity_in(state->fe[index_frontend], 1);
1928
1929 /* synchronization of the cache */
1930 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
1931
1932 state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_DVBT;
1933 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_HIGH_Z);
1934
1935 dib9000_set_channel_status(state->fe[index_frontend], &state->channel_status);
1936 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
1937 }
1938
1939 /* actual tune */
1940 exit_condition = 0; /* 0: tune pending; 1: tune failed; 2:tune success */
1941 index_frontend_success = 0;
1942 do {
1943 sleep_time = dib9000_fw_tune(state->fe[0], NULL);
1944 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1945 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend], NULL);
1946 if (sleep_time == FE_CALLBACK_TIME_NEVER)
1947 sleep_time = sleep_time_slave;
1948 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
1949 sleep_time = sleep_time_slave;
1950 }
1951 if (sleep_time != FE_CALLBACK_TIME_NEVER)
1952 msleep(sleep_time / 10);
1953 else
1954 break;
1955
1956 nbr_pending = 0;
1957 exit_condition = 0;
1958 index_frontend_success = 0;
1959 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1960 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
1961 if (frontend_status > -FE_STATUS_TUNE_PENDING) {
1962 exit_condition = 2; /* tune success */
1963 index_frontend_success = index_frontend;
1964 break;
1965 }
1966 if (frontend_status == -FE_STATUS_TUNE_PENDING)
1967 nbr_pending++; /* some frontends are still tuning */
1968 }
1969 if ((exit_condition != 2) && (nbr_pending == 0))
1970 exit_condition = 1; /* if all tune are done and no success, exit: tune failed */
1971
1972 } while (exit_condition == 0);
1973
1974 /* check the tune result */
1975 if (exit_condition == 1) { /* tune failed */
1976 dprintk("tune failed");
1977 return 0;
1978 }
1979
1980 dprintk("tune success on frontend%i", index_frontend_success);
1981
1982 /* synchronize all the channel cache */
1983 dib9000_get_frontend(state->fe[0], fep);
1984
1985 /* retune the other frontends with the found channel */
1986 channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
1987 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1988 /* only retune the frontends which was not tuned success */
1989 if (index_frontend != index_frontend_success) {
1990 dib9000_set_channel_status(state->fe[index_frontend], &channel_status);
1991 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
1992 }
1993 }
1994 do {
1995 sleep_time = FE_CALLBACK_TIME_NEVER;
1996 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1997 if (index_frontend != index_frontend_success) {
1998 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend], NULL);
1999 if (sleep_time == FE_CALLBACK_TIME_NEVER)
2000 sleep_time = sleep_time_slave;
2001 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2002 sleep_time = sleep_time_slave;
2003 }
2004 }
2005 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2006 msleep(sleep_time / 10);
2007 else
2008 break;
2009
2010 nbr_pending = 0;
2011 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2012 if (index_frontend != index_frontend_success) {
2013 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2014 if ((index_frontend != index_frontend_success) && (frontend_status == -FE_STATUS_TUNE_PENDING))
2015 nbr_pending++; /* some frontends are still tuning */
2016 }
2017 }
2018 } while (nbr_pending != 0);
2019
2020 /* set the output mode */
2021 dib9000_fw_set_output_mode(state->fe[0], state->chip.d9.cfg.output_mode);
2022 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2023 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_DIVERSITY);
2024
2025 /* turn off the diversity for the last frontend */
2026 dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
2027
2028 return 0;
2029}
2030
2031static u16 dib9000_read_lock(struct dvb_frontend *fe)
2032{
2033 struct dib9000_state *state = fe->demodulator_priv;
2034
2035 return dib9000_read_word(state, 535);
2036}
2037
2038static int dib9000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
2039{
2040 struct dib9000_state *state = fe->demodulator_priv;
2041 u8 index_frontend;
2042 u16 lock = 0, lock_slave = 0;
2043
2044 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2045 lock_slave |= dib9000_read_lock(state->fe[index_frontend]);
2046
2047 lock = dib9000_read_word(state, 535);
2048
2049 *stat = 0;
2050
2051 if ((lock & 0x8000) || (lock_slave & 0x8000))
2052 *stat |= FE_HAS_SIGNAL;
2053 if ((lock & 0x3000) || (lock_slave & 0x3000))
2054 *stat |= FE_HAS_CARRIER;
2055 if ((lock & 0x0100) || (lock_slave & 0x0100))
2056 *stat |= FE_HAS_VITERBI;
2057 if (((lock & 0x0038) == 0x38) || ((lock_slave & 0x0038) == 0x38))
2058 *stat |= FE_HAS_SYNC;
2059 if ((lock & 0x0008) || (lock_slave & 0x0008))
2060 *stat |= FE_HAS_LOCK;
2061
2062 return 0;
2063}
2064
2065static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber)
2066{
2067 struct dib9000_state *state = fe->demodulator_priv;
2068 u16 *c;
2069
2070 DibAcquireLock(&state->platform.risc.mem_mbx_lock);
2071 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
2072 return -EIO;
2073 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR,
2074 state->i2c_read_buffer, 16 * 2);
2075 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
2076
2077 c = (u16 *)state->i2c_read_buffer;
2078
2079 *ber = c[10] << 16 | c[11];
2080 return 0;
2081}
2082
2083static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2084{
2085 struct dib9000_state *state = fe->demodulator_priv;
2086 u8 index_frontend;
2087 u16 *c = (u16 *)state->i2c_read_buffer;
2088 u16 val;
2089
2090 *strength = 0;
2091 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2092 state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
2093 if (val > 65535 - *strength)
2094 *strength = 65535;
2095 else
2096 *strength += val;
2097 }
2098
2099 DibAcquireLock(&state->platform.risc.mem_mbx_lock);
2100 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
2101 return -EIO;
2102 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2103 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
2104
2105 val = 65535 - c[4];
2106 if (val > 65535 - *strength)
2107 *strength = 65535;
2108 else
2109 *strength += val;
2110 return 0;
2111}
2112
2113static u32 dib9000_get_snr(struct dvb_frontend *fe)
2114{
2115 struct dib9000_state *state = fe->demodulator_priv;
2116 u16 *c = (u16 *)state->i2c_read_buffer;
2117 u32 n, s, exp;
2118 u16 val;
2119
2120 DibAcquireLock(&state->platform.risc.mem_mbx_lock);
2121 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
2122 return -EIO;
2123 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2124 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
2125
2126 val = c[7];
2127 n = (val >> 4) & 0xff;
2128 exp = ((val & 0xf) << 2);
2129 val = c[8];
2130 exp += ((val >> 14) & 0x3);
2131 if ((exp & 0x20) != 0)
2132 exp -= 0x40;
2133 n <<= exp + 16;
2134
2135 s = (val >> 6) & 0xFF;
2136 exp = (val & 0x3F);
2137 if ((exp & 0x20) != 0)
2138 exp -= 0x40;
2139 s <<= exp + 16;
2140
2141 if (n > 0) {
2142 u32 t = (s / n) << 16;
2143 return t + ((s << 16) - n * t) / n;
2144 }
2145 return 0xffffffff;
2146}
2147
2148static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr)
2149{
2150 struct dib9000_state *state = fe->demodulator_priv;
2151 u8 index_frontend;
2152 u32 snr_master;
2153
2154 snr_master = dib9000_get_snr(fe);
2155 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2156 snr_master += dib9000_get_snr(state->fe[index_frontend]);
2157
2158 if ((snr_master >> 16) != 0) {
2159 snr_master = 10 * intlog10(snr_master >> 16);
2160 *snr = snr_master / ((1 << 24) / 10);
2161 } else
2162 *snr = 0;
2163
2164 return 0;
2165}
2166
2167static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
2168{
2169 struct dib9000_state *state = fe->demodulator_priv;
2170 u16 *c = (u16 *)state->i2c_read_buffer;
2171
2172 DibAcquireLock(&state->platform.risc.mem_mbx_lock);
2173 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0)
2174 return -EIO;
2175 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2176 DibReleaseLock(&state->platform.risc.mem_mbx_lock);
2177
2178 *unc = c[12];
2179 return 0;
2180}
2181
2182int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
2183{
2184 int k = 0, ret = 0;
2185 u8 new_addr = 0;
2186 struct i2c_device client = {.i2c_adap = i2c };
2187
2188 client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
2189 if (!client.i2c_write_buffer) {
2190 dprintk("%s: not enough memory", __func__);
2191 return -ENOMEM;
2192 }
2193 client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
2194 if (!client.i2c_read_buffer) {
2195 dprintk("%s: not enough memory", __func__);
2196 ret = -ENOMEM;
2197 goto error_memory;
2198 }
2199
2200 client.i2c_addr = default_addr + 16;
2201 dib9000_i2c_write16(&client, 1796, 0x0);
2202
2203 for (k = no_of_demods - 1; k >= 0; k--) {
2204 /* designated i2c address */
2205 new_addr = first_addr + (k << 1);
2206 client.i2c_addr = default_addr;
2207
2208 dib9000_i2c_write16(&client, 1817, 3);
2209 dib9000_i2c_write16(&client, 1796, 0);
2210 dib9000_i2c_write16(&client, 1227, 1);
2211 dib9000_i2c_write16(&client, 1227, 0);
2212
2213 client.i2c_addr = new_addr;
2214 dib9000_i2c_write16(&client, 1817, 3);
2215 dib9000_i2c_write16(&client, 1796, 0);
2216 dib9000_i2c_write16(&client, 1227, 1);
2217 dib9000_i2c_write16(&client, 1227, 0);
2218
2219 if (dib9000_identify(&client) == 0) {
2220 client.i2c_addr = default_addr;
2221 if (dib9000_identify(&client) == 0) {
2222 dprintk("DiB9000 #%d: not identified", k);
2223 ret = -EIO;
2224 goto error;
2225 }
2226 }
2227
2228 dib9000_i2c_write16(&client, 1795, (1 << 10) | (4 << 6));
2229 dib9000_i2c_write16(&client, 1794, (new_addr << 2) | 2);
2230
2231 dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
2232 }
2233
2234 for (k = 0; k < no_of_demods; k++) {
2235 new_addr = first_addr | (k << 1);
2236 client.i2c_addr = new_addr;
2237
2238 dib9000_i2c_write16(&client, 1794, (new_addr << 2));
2239 dib9000_i2c_write16(&client, 1795, 0);
2240 }
2241
2242error:
2243 kfree(client.i2c_read_buffer);
2244error_memory:
2245 kfree(client.i2c_write_buffer);
2246
2247 return ret;
2248}
2249EXPORT_SYMBOL(dib9000_i2c_enumeration);
2250
2251int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
2252{
2253 struct dib9000_state *state = fe->demodulator_priv;
2254 u8 index_frontend = 1;
2255
2256 while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2257 index_frontend++;
2258 if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
2259 dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
2260 state->fe[index_frontend] = fe_slave;
2261 return 0;
2262 }
2263
2264 dprintk("too many slave frontend");
2265 return -ENOMEM;
2266}
2267EXPORT_SYMBOL(dib9000_set_slave_frontend);
2268
2269int dib9000_remove_slave_frontend(struct dvb_frontend *fe)
2270{
2271 struct dib9000_state *state = fe->demodulator_priv;
2272 u8 index_frontend = 1;
2273
2274 while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2275 index_frontend++;
2276 if (index_frontend != 1) {
2277 dprintk("remove slave fe %p (index %i)", state->fe[index_frontend - 1], index_frontend - 1);
2278 state->fe[index_frontend] = NULL;
2279 return 0;
2280 }
2281
2282 dprintk("no frontend to be removed");
2283 return -ENODEV;
2284}
2285EXPORT_SYMBOL(dib9000_remove_slave_frontend);
2286
2287struct dvb_frontend *dib9000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
2288{
2289 struct dib9000_state *state = fe->demodulator_priv;
2290
2291 if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
2292 return NULL;
2293 return state->fe[slave_index];
2294}
2295EXPORT_SYMBOL(dib9000_get_slave_frontend);
2296
2297static struct dvb_frontend_ops dib9000_ops;
2298struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg)
2299{
2300 struct dvb_frontend *fe;
2301 struct dib9000_state *st;
2302 st = kzalloc(sizeof(struct dib9000_state), GFP_KERNEL);
2303 if (st == NULL)
2304 return NULL;
2305 fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
2306 if (fe == NULL) {
2307 kfree(st);
2308 return NULL;
2309 }
2310
2311 memcpy(&st->chip.d9.cfg, cfg, sizeof(struct dib9000_config));
2312 st->i2c.i2c_adap = i2c_adap;
2313 st->i2c.i2c_addr = i2c_addr;
2314 st->i2c.i2c_write_buffer = st->i2c_write_buffer;
2315 st->i2c.i2c_read_buffer = st->i2c_read_buffer;
2316
2317 st->gpio_dir = DIB9000_GPIO_DEFAULT_DIRECTIONS;
2318 st->gpio_val = DIB9000_GPIO_DEFAULT_VALUES;
2319 st->gpio_pwm_pos = DIB9000_GPIO_DEFAULT_PWM_POS;
2320
2321 DibInitLock(&st->platform.risc.mbx_if_lock);
2322 DibInitLock(&st->platform.risc.mbx_lock);
2323 DibInitLock(&st->platform.risc.mem_lock);
2324 DibInitLock(&st->platform.risc.mem_mbx_lock);
2325
2326 st->fe[0] = fe;
2327 fe->demodulator_priv = st;
2328 memcpy(&st->fe[0]->ops, &dib9000_ops, sizeof(struct dvb_frontend_ops));
2329
2330 /* Ensure the output mode remains at the previous default if it's
2331 * not specifically set by the caller.
2332 */
2333 if ((st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2334 st->chip.d9.cfg.output_mode = OUTMODE_MPEG2_FIFO;
2335
2336 if (dib9000_identify(&st->i2c) == 0)
2337 goto error;
2338
2339 dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
2340
2341 st->tuner_adap.dev.parent = i2c_adap->dev.parent;
2342 strncpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS", sizeof(st->tuner_adap.name));
2343 st->tuner_adap.algo = &dib9000_tuner_algo;
2344 st->tuner_adap.algo_data = NULL;
2345 i2c_set_adapdata(&st->tuner_adap, st);
2346 if (i2c_add_adapter(&st->tuner_adap) < 0)
2347 goto error;
2348
2349 st->component_bus.dev.parent = i2c_adap->dev.parent;
2350 strncpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st->component_bus.name));
2351 st->component_bus.algo = &dib9000_component_bus_algo;
2352 st->component_bus.algo_data = NULL;
2353 st->component_bus_speed = 340;
2354 i2c_set_adapdata(&st->component_bus, st);
2355 if (i2c_add_adapter(&st->component_bus) < 0)
2356 goto component_bus_add_error;
2357
2358 dib9000_fw_reset(fe);
2359
2360 return fe;
2361
2362component_bus_add_error:
2363 i2c_del_adapter(&st->tuner_adap);
2364error:
2365 kfree(st);
2366 return NULL;
2367}
2368EXPORT_SYMBOL(dib9000_attach);
2369
2370static struct dvb_frontend_ops dib9000_ops = {
2371 .info = {
2372 .name = "DiBcom 9000",
2373 .type = FE_OFDM,
2374 .frequency_min = 44250000,
2375 .frequency_max = 867250000,
2376 .frequency_stepsize = 62500,
2377 .caps = FE_CAN_INVERSION_AUTO |
2378 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2379 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2380 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2381 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2382 },
2383
2384 .release = dib9000_release,
2385
2386 .init = dib9000_wakeup,
2387 .sleep = dib9000_sleep,
2388
2389 .set_frontend = dib9000_set_frontend,
2390 .get_tune_settings = dib9000_fe_get_tune_settings,
2391 .get_frontend = dib9000_get_frontend,
2392
2393 .read_status = dib9000_read_status,
2394 .read_ber = dib9000_read_ber,
2395 .read_signal_strength = dib9000_read_signal_strength,
2396 .read_snr = dib9000_read_snr,
2397 .read_ucblocks = dib9000_read_unc_blocks,
2398};
2399
2400MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
2401MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
2402MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2403MODULE_LICENSE("GPL");