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.c2590
1 files changed, 2590 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..6201c59a78dd
--- /dev/null
+++ b/drivers/media/dvb-frontends/dib9000.c
@@ -0,0 +1,2590 @@
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
34struct 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;
41};
42
43struct dib9000_state {
44 struct i2c_device i2c;
45
46 struct dibx000_i2c_master i2c_master;
47 struct i2c_adapter tuner_adap;
48 struct i2c_adapter component_bus;
49
50 u16 revision;
51 u8 reg_offs;
52
53 enum frontend_tune_state tune_state;
54 u32 status;
55 struct dvb_frontend_parametersContext channel_status;
56
57 u8 fe_id;
58
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;
65
66 union { /* common for all chips */
67 struct {
68 u8 mobile_mode:1;
69 } host;
70
71 struct {
72 struct dib9000_fe_memory_map {
73 u16 addr;
74 u16 size;
75 } fe_mm[18];
76 u8 memcmd;
77
78 struct mutex mbx_if_lock; /* to protect read/write operations */
79 struct mutex mbx_lock; /* to protect the whole mailbox handling */
80
81 struct mutex mem_lock; /* to protect the memory accesses */
82 struct mutex mem_mbx_lock; /* to protect the memory-based mailbox */
83
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;
90
91 union { /* common for all platforms */
92 struct {
93 struct dib9000_config cfg;
94 } d9;
95 } chip;
96
97 struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
98 u16 component_bus_speed;
99
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 */
108};
109
110static 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
113};
114
115enum dib9000_power_mode {
116 DIB9000_POWER_ALL = 0,
117
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,
123};
124
125enum 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,
145
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,
154};
155
156enum 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,
174};
175
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
180
181#define FE_SYNC_CHANNEL 1
182#define FE_SYNC_W_GENERIC_MONIT 2
183#define FE_SYNC_COMPONENT_ACCESS 3
184
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
189
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
196
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
200
201#define FE_MM_W_COMPONENT_ACCESS 16
202#define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
203static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len);
204static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len);
205
206static u16 to_fw_output_mode(u16 mode)
207{
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;
225 }
226}
227
228static u16 dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 * b, u32 len, u16 attribute)
229{
230 u32 chunk_size = 126;
231 u32 l;
232 int ret;
233
234 if (state->platform.risc.fw_is_running && (reg < 1024))
235 return dib9000_risc_apb_access_read(state, reg, attribute, NULL, 0, b, len);
236
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;
246
247 state->i2c_write_buffer[0] = reg >> 8;
248 state->i2c_write_buffer[1] = reg & 0xff;
249
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);
254
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;
263 }
264
265 b += l;
266 len -= l;
267
268 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
269 reg += l / 2;
270 } while ((ret == 0) && len);
271
272 return 0;
273}
274
275static u16 dib9000_i2c_read16(struct i2c_device *i2c, u16 reg)
276{
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},
282 };
283
284 i2c->i2c_write_buffer[0] = reg >> 8;
285 i2c->i2c_write_buffer[1] = reg & 0xff;
286
287 if (i2c_transfer(i2c->i2c_adap, msg, 2) != 2) {
288 dprintk("read register %x error", reg);
289 return 0;
290 }
291
292 return (i2c->i2c_read_buffer[0] << 8) | i2c->i2c_read_buffer[1];
293}
294
295static inline u16 dib9000_read_word(struct dib9000_state *state, u16 reg)
296{
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];
300}
301
302static inline u16 dib9000_read_word_attr(struct dib9000_state *state, u16 reg, u16 attribute)
303{
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];
308}
309
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)
311
312static u16 dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 * buf, u32 len, u16 attribute)
313{
314 u32 chunk_size = 126;
315 u32 l;
316 int ret;
317
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;
323 }
324
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;
330
331 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
332 state->i2c_write_buffer[1] = (reg) & 0xff;
333
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);
338
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);
343
344 ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
345
346 buf += l;
347 len -= l;
348
349 if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
350 reg += l / 2;
351 } while ((ret == 0) && len);
352
353 return ret;
354}
355
356static int dib9000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
357{
358 struct i2c_msg msg = {
359 .addr = i2c->i2c_addr >> 1, .flags = 0,
360 .buf = i2c->i2c_write_buffer, .len = 4
361 };
362
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;
367
368 return i2c_transfer(i2c->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
369}
370
371static inline int dib9000_write_word(struct dib9000_state *state, u16 reg, u16 val)
372{
373 u8 b[2] = { val >> 8, val & 0xff };
374 return dib9000_write16_attr(state, reg, b, 2, 0);
375}
376
377static inline int dib9000_write_word_attr(struct dib9000_state *state, u16 reg, u16 val, u16 attribute)
378{
379 u8 b[2] = { val >> 8, val & 0xff };
380 return dib9000_write16_attr(state, reg, b, 2, attribute);
381}
382
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))
386
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)
389
390#define MAC_IRQ (1 << 1)
391#define IRQ_POL_MSK (1 << 4)
392
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)
395
396static void dib9000_risc_mem_setup_cmd(struct dib9000_state *state, u32 addr, u32 len, u8 reading)
397{
398 u8 b[14] = { 0 };
399
400/* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
401/* b[0] = 0 << 7; */
402 b[1] = 1;
403
404/* b[2] = 0; */
405/* b[3] = 0; */
406 b[4] = (u8) (addr >> 8);
407 b[5] = (u8) (addr & 0xff);
408
409/* b[10] = 0; */
410/* b[11] = 0; */
411 b[12] = (u8) (addr >> 8);
412 b[13] = (u8) (addr & 0xff);
413
414 addr += len;
415/* b[6] = 0; */
416/* b[7] = 0; */
417 b[8] = (u8) (addr >> 8);
418 b[9] = (u8) (addr & 0xff);
419
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 */
424}
425
426static void dib9000_risc_mem_setup(struct dib9000_state *state, u8 cmd)
427{
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;
435}
436
437static int dib9000_risc_mem_read(struct dib9000_state *state, u8 cmd, u8 * b, u16 len)
438{
439 if (!state->platform.risc.fw_is_running)
440 return -EIO;
441
442 if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
443 dprintk("could not get the lock");
444 return -EINTR;
445 }
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;
450}
451
452static int dib9000_risc_mem_write(struct dib9000_state *state, u8 cmd, const u8 * b)
453{
454 struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd];
455 if (!state->platform.risc.fw_is_running)
456 return -EIO;
457
458 if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
459 dprintk("could not get the lock");
460 return -EINTR;
461 }
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;
466}
467
468static int dib9000_firmware_download(struct dib9000_state *state, u8 risc_id, u16 key, const u8 * code, u32 len)
469{
470 u16 offs;
471
472 if (risc_id == 1)
473 offs = 16;
474 else
475 offs = 0;
476
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);
481
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;
486 }
487
488 dprintk("Microcode for RISC %c loaded", 'A' + risc_id);
489
490 return 0;
491}
492
493static int dib9000_mbx_host_init(struct dib9000_state *state, u8 risc_id)
494{
495 u16 mbox_offs;
496 u16 reset_reg;
497 u16 tries = 1000;
498
499 if (risc_id == 1)
500 mbox_offs = 16;
501 else
502 mbox_offs = 0;
503
504 /* Reset mailbox */
505 dib9000_write_word(state, 1027 + mbox_offs, 0x8000);
506
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);
512
513 if (reset_reg & 0x8000) {
514 dprintk("MBX: init ERROR, no response from RISC %c", 'A' + risc_id);
515 return -EIO;
516 }
517 dprintk("MBX: initialized");
518 return 0;
519}
520
521#define MAX_MAILBOX_TRY 100
522static int dib9000_mbx_send_attr(struct dib9000_state *state, u8 id, u16 * data, u8 len, u16 attr)
523{
524 u8 *d, b[2];
525 u16 tmp;
526 u16 size;
527 u32 i;
528 int ret = 0;
529
530 if (!state->platform.risc.fw_is_running)
531 return -EINVAL;
532
533 if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
534 dprintk("could not get the lock");
535 return -EINTR;
536 }
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);
546
547 /*dprintk( "MBX: size: %d", size); */
548
549 if (tmp == 0) {
550 ret = -EINVAL;
551 goto out;
552 }
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
559
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;
566 }
567
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;
574 }
575
576 /* update register nb_mes_in_RX */
577 ret = (u8) dib9000_write_word_attr(state, 1043, 1 << 14, attr);
578
579out:
580 mutex_unlock(&state->platform.risc.mbx_if_lock);
581
582 return ret;
583}
584
585static u8 dib9000_mbx_read(struct dib9000_state *state, u16 * data, u8 risc_id, u16 attr)
586{
587#ifdef DUMP_MSG
588 u16 *d = data;
589#endif
590
591 u16 tmp, i;
592 u8 size;
593 u8 mc_base;
594
595 if (!state->platform.risc.fw_is_running)
596 return 0;
597
598 if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
599 dprintk("could not get the lock");
600 return 0;
601 }
602 if (risc_id == 1)
603 mc_base = 16;
604 else
605 mc_base = 0;
606
607 /* Length and type in the first word */
608 *data = dib9000_read_word_attr(state, 1029 + mc_base, attr);
609
610 size = *data & 0xff;
611 if (size <= MBX_MAX_WORDS) {
612 data++;
613 size--; /* Initial word already read */
614
615 dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, size * 2, attr);
616
617 /* to word conversion */
618 for (i = 0; i < size; i++) {
619 tmp = *data;
620 *data = (tmp >> 8) | (tmp << 8);
621 data++;
622 }
623
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);
635 }
636 /* Update register nb_mes_in_TX */
637 dib9000_write_word_attr(state, 1028 + mc_base, 1 << 14, attr);
638
639 mutex_unlock(&state->platform.risc.mbx_if_lock);
640
641 return size + 1;
642}
643
644static int dib9000_risc_debug_buf(struct dib9000_state *state, u16 * data, u8 size)
645{
646 u32 ts = data[1] << 16 | data[0];
647 char *b = (char *)&data[2];
648
649 b[2 * (size - 2) - 1] = '\0'; /* Bullet proof the buffer */
650 if (*b == '~') {
651 b++;
652 dprintk(b);
653 } else
654 dprintk("RISC%d: %d.%04d %s", state->fe_id, ts / 10000, ts % 10000, *b ? b : "<emtpy>");
655 return 1;
656}
657
658static int dib9000_mbx_fetch_to_cache(struct dib9000_state *state, u16 attr)
659{
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);
668
669/* dprintk( "MBX: fetched %04x message to cache", *block); */
670
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;
684 }
685
686 return 1;
687 }
688 }
689 dprintk("MBX: no free cache-slot found for new message...");
690 return -1;
691}
692
693static u8 dib9000_mbx_count(struct dib9000_state *state, u8 risc_id, u16 attr)
694{
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 */
699}
700
701static int dib9000_mbx_process(struct dib9000_state *state, u16 attr)
702{
703 int ret = 0;
704
705 if (!state->platform.risc.fw_is_running)
706 return -1;
707
708 if (mutex_lock_interruptible(&state->platform.risc.mbx_lock) < 0) {
709 dprintk("could not get the lock");
710 return -1;
711 }
712
713 if (dib9000_mbx_count(state, 1, attr)) /* 1=RiscB */
714 ret = dib9000_mbx_fetch_to_cache(state, attr);
715
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);
720
721 return ret;
722}
723
724static int dib9000_mbx_get_message_attr(struct dib9000_state *state, u16 id, u16 * msg, u8 * size, u16 attr)
725{
726 u8 i;
727 u16 *block;
728 u16 timeout = 30;
729
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;
741 }
742 }
743
744 if (i == 0)
745 break;
746
747 if (dib9000_mbx_process(state, attr) == -1) /* try to fetch one message - if any */
748 return -1;
749
750 } while (--timeout);
751
752 if (timeout == 0) {
753 dprintk("waiting for message %d timed out", id);
754 return -1;
755 }
756
757 return i == 0;
758}
759
760static int dib9000_risc_check_version(struct dib9000_state *state)
761{
762 u8 r[4];
763 u8 size;
764 u16 fw_version = 0;
765
766 if (dib9000_mbx_send(state, OUT_MSG_REQ_VERSION, &fw_version, 1) != 0)
767 return -EIO;
768
769 if (dib9000_mbx_get_message(state, IN_MSG_VERSION, (u16 *) r, &size) < 0)
770 return -EIO;
771
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]);
774
775 if ((fw_version >> 10) != 7)
776 return -EINVAL;
777
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;
789 }
790
791 dprintk("RISC: valid firmware version");
792 return 0;
793}
794
795static int dib9000_fw_boot(struct dib9000_state *state, const u8 * codeA, u32 lenA, const u8 * codeB, u32 lenB)
796{
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);
800
801 /* Toggles IP crypto to Host APB interface. */
802 dib9000_write_word(state, 1542, 1);
803
804 /* Set jump and no jump in the dma box */
805 dib9000_write_word(state, 1074, 0);
806 dib9000_write_word(state, 1075, 0);
807
808 /* Set MAC as APB Master. */
809 dib9000_write_word(state, 1237, 0);
810
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);
818
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);
823
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);
829
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;
836
837 msleep(100);
838 state->platform.risc.fw_is_running = 1;
839
840 if (dib9000_risc_check_version(state) != 0)
841 return -EINVAL;
842
843 state->platform.risc.memcmd = 0xff;
844 return 0;
845}
846
847static u16 dib9000_identify(struct i2c_device *client)
848{
849 u16 value;
850
851 value = dib9000_i2c_read16(client, 896);
852 if (value != 0x01b3) {
853 dprintk("wrong Vendor ID (0x%x)", value);
854 return 0;
855 }
856
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;
861 }
862
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;
867 }
868
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;
888 }
889
890 return value;
891}
892
893static void dib9000_set_power_mode(struct dib9000_state *state, enum dib9000_power_mode mode)
894{
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;
898
899 if (state->revision == 0x4003 || state->revision == 0x4004 || state->revision == 0x4005)
900 offset = 1;
901 else
902 offset = 0;
903
904 reg_906 = dib9000_read_word(state, 906 + offset) | 0x3; /* keep settings for RISC */
905
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;
915
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;
920
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;
926
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;
933
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;
943 }
944
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);
948
949 /* P_sdio_select_clk = 0 on MC and after */
950 if (state->revision != 0x4000)
951 reg_906 <<= 1;
952
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);
957}
958
959static int dib9000_fw_reset(struct dvb_frontend *fe)
960{
961 struct dib9000_state *state = fe->demodulator_priv;
962
963 dib9000_write_word(state, 1817, 0x0003);
964
965 dib9000_write_word(state, 1227, 1);
966 dib9000_write_word(state, 1227, 0);
967
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;
976 }
977
978 /* reset the i2c-master to use the host interface */
979 dibx000_reset_i2c_master(&state->i2c_master);
980
981 dib9000_set_power_mode(state, DIB9000_POWER_ALL);
982
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);
987
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);
994
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);
1000
1001 dib9000_write_word(state, 911, state->chip.d9.cfg.if_drives);
1002
1003 dib9000_set_power_mode(state, DIB9000_POWER_INTERFACE_ONLY);
1004
1005 return 0;
1006}
1007
1008static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len)
1009{
1010 u16 mb[10];
1011 u8 i, s;
1012
1013 if (address >= 1024 || !state->platform.risc.fw_is_running)
1014 return -EINVAL;
1015
1016 /* dprintk( "APB access thru rd fw %d %x", address, attribute); */
1017
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;
1027 }
1028 return 0;
1029 default:
1030 return -EIO;
1031 }
1032 return -EIO;
1033}
1034
1035static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len)
1036{
1037 u16 mb[10];
1038 u8 s, i;
1039
1040 if (address >= 1024 || !state->platform.risc.fw_is_running)
1041 return -EINVAL;
1042
1043 /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1044
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]);
1048
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;
1051}
1052
1053static int dib9000_fw_memmbx_sync(struct dib9000_state *state, u8 i)
1054{
1055 u8 index_loop = 10;
1056
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--);
1063
1064 if (index_loop > 0)
1065 return 0;
1066 return -EIO;
1067}
1068
1069static int dib9000_fw_init(struct dib9000_state *state)
1070{
1071 struct dibGPIOFunction *f;
1072 u16 b[40] = { 0 };
1073 u8 i;
1074 u8 size;
1075
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;
1078
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;
1094 }
1095 }
1096 }
1097 if (dib9000_mbx_send(state, OUT_MSG_CONF_GPIO, b, 15) != 0)
1098 return -EIO;
1099
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;
1107 }
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;
1111
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;
1125
1126 if (dib9000_mbx_send(state, OUT_MSG_FE_FW_DL, NULL, 0) != 0)
1127 return -EIO;
1128
1129 if (dib9000_mbx_get_message(state, IN_MSG_FE_FW_DL_DONE, b, &size) < 0)
1130 return -EIO;
1131
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;
1136 }
1137
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];
1141 }
1142
1143 return 0;
1144}
1145
1146static void dib9000_fw_set_channel_head(struct dib9000_state *state)
1147{
1148 u8 b[9];
1149 u32 freq = state->fe[0]->dtv_property_cache.frequency / 1000;
1150 if (state->fe_id % 2)
1151 freq += 101;
1152
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);
1165}
1166
1167static int dib9000_fw_get_channel(struct dvb_frontend *fe)
1168{
1169 struct dib9000_state *state = fe->demodulator_priv;
1170 struct dibDVBTChannel {
1171 s8 spectrum_inversion;
1172
1173 s8 nfft;
1174 s8 guard;
1175 s8 constellation;
1176
1177 s8 hrch;
1178 s8 alpha;
1179 s8 code_rate_hp;
1180 s8 code_rate_lp;
1181 s8 select_hp;
1182
1183 s8 intlv_native;
1184 };
1185 struct dibDVBTChannel *ch;
1186 int ret = 0;
1187
1188 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1189 dprintk("could not get the lock");
1190 return -EINTR;
1191 }
1192 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
1193 ret = -EIO;
1194 goto error;
1195 }
1196
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;
1200
1201
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;
1213 }
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;
1228 }
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;
1246 }
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;
1261 }
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;
1273 }
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;
1294 }
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;
1315 }
1316
1317error:
1318 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1319 return ret;
1320}
1321
1322static int dib9000_fw_set_channel_union(struct dvb_frontend *fe)
1323{
1324 struct dib9000_state *state = fe->demodulator_priv;
1325 struct dibDVBTChannel {
1326 s8 spectrum_inversion;
1327
1328 s8 nfft;
1329 s8 guard;
1330 s8 constellation;
1331
1332 s8 hrch;
1333 s8 alpha;
1334 s8 code_rate_hp;
1335 s8 code_rate_lp;
1336 s8 select_hp;
1337
1338 s8 intlv_native;
1339 };
1340 struct dibDVBTChannel ch;
1341
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;
1353 }
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;
1368 }
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;
1386 }
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;
1401 }
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;
1415 }
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;
1437 }
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;
1458 }
1459 ch.select_hp = 1;
1460 ch.intlv_native = 1;
1461
1462 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_UNION, (u8 *) &ch);
1463
1464 return 0;
1465}
1466
1467static int dib9000_fw_tune(struct dvb_frontend *fe)
1468{
1469 struct dib9000_state *state = fe->demodulator_priv;
1470 int ret = 10, search = state->channel_status.status == CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1471 s8 i;
1472
1473 switch (state->tune_state) {
1474 case CT_DEMOD_START:
1475 dib9000_fw_set_channel_head(state);
1476
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);
1480
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);
1486 }
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;
1504 }
1505 break;
1506 default:
1507 state->status = FE_STATUS_TUNE_FAILED;
1508 state->tune_state = CT_DEMOD_STOP;
1509 break;
1510 }
1511 break;
1512 default:
1513 ret = FE_CALLBACK_TIME_NEVER;
1514 break;
1515 }
1516
1517 return ret;
1518}
1519
1520static int dib9000_fw_set_diversity_in(struct dvb_frontend *fe, int onoff)
1521{
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);
1525}
1526
1527static int dib9000_fw_set_output_mode(struct dvb_frontend *fe, int mode)
1528{
1529 struct dib9000_state *state = fe->demodulator_priv;
1530 u16 outreg, smo_mode;
1531
1532 dprintk("setting output mode for demod %p to %d", fe, mode);
1533
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;
1556 }
1557
1558 dib9000_write_word(state, 1795, outreg);
1559
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;
1570 }
1571
1572 outreg = to_fw_output_mode(mode);
1573 return dib9000_mbx_send(state, OUT_MSG_SET_OUTPUT_MODE, &outreg, 1);
1574}
1575
1576static int dib9000_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1577{
1578 struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1579 u16 i, len, t, index_msg;
1580
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;
1586
1587 if (dib9000_read_word(state, 790) != 0)
1588 dprintk("TunerITF: read busy");
1589
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 */
1593
1594 i = 1000;
1595 while (dib9000_read_word(state, 790) != (len / 2) && i)
1596 i--;
1597
1598 if (i == 0)
1599 dprintk("TunerITF: read failed");
1600
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;
1605 }
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");
1614
1615 len = msg[index_msg].len;
1616 if (len > 16)
1617 len = 16;
1618
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 */
1624
1625 i = 1000;
1626 while (dib9000_read_word(state, 791) > 0 && i)
1627 i--;
1628 if (i == 0)
1629 dprintk("TunerITF: write failed");
1630 }
1631 }
1632 return num;
1633}
1634
1635int dib9000_fw_set_component_bus_speed(struct dvb_frontend *fe, u16 speed)
1636{
1637 struct dib9000_state *state = fe->demodulator_priv;
1638
1639 state->component_bus_speed = speed;
1640 return 0;
1641}
1642EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed);
1643
1644static int dib9000_fw_component_bus_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1645{
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 };
1652
1653 p[0] = type;
1654 p[1] = port;
1655 p[2] = msg[0].addr << 1;
1656
1657 p[3] = (u8) scl & 0xff; /* scl */
1658 p[4] = (u8) (scl >> 8);
1659
1660 p[7] = 0;
1661 p[8] = 0;
1662
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;
1671 }
1672
1673 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1674 dprintk("could not get the lock");
1675 return 0;
1676 }
1677
1678 dib9000_risc_mem_write(state, FE_MM_W_COMPONENT_ACCESS, p);
1679
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);
1683 }
1684
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;
1689 }
1690
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);
1694
1695 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1696
1697 return num;
1698}
1699
1700static u32 dib9000_i2c_func(struct i2c_adapter *adapter)
1701{
1702 return I2C_FUNC_I2C;
1703}
1704
1705static struct i2c_algorithm dib9000_tuner_algo = {
1706 .master_xfer = dib9000_tuner_xfer,
1707 .functionality = dib9000_i2c_func,
1708};
1709
1710static struct i2c_algorithm dib9000_component_bus_algo = {
1711 .master_xfer = dib9000_fw_component_bus_xfer,
1712 .functionality = dib9000_i2c_func,
1713};
1714
1715struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe)
1716{
1717 struct dib9000_state *st = fe->demodulator_priv;
1718 return &st->tuner_adap;
1719}
1720EXPORT_SYMBOL(dib9000_get_tuner_interface);
1721
1722struct i2c_adapter *dib9000_get_component_bus_interface(struct dvb_frontend *fe)
1723{
1724 struct dib9000_state *st = fe->demodulator_priv;
1725 return &st->component_bus;
1726}
1727EXPORT_SYMBOL(dib9000_get_component_bus_interface);
1728
1729struct i2c_adapter *dib9000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
1730{
1731 struct dib9000_state *st = fe->demodulator_priv;
1732 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
1733}
1734EXPORT_SYMBOL(dib9000_get_i2c_master);
1735
1736int dib9000_set_i2c_adapter(struct dvb_frontend *fe, struct i2c_adapter *i2c)
1737{
1738 struct dib9000_state *st = fe->demodulator_priv;
1739
1740 st->i2c.i2c_adap = i2c;
1741 return 0;
1742}
1743EXPORT_SYMBOL(dib9000_set_i2c_adapter);
1744
1745static int dib9000_cfg_gpio(struct dib9000_state *st, u8 num, u8 dir, u8 val)
1746{
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);
1751
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);
1756
1757 dprintk("gpio dir: %04x: gpio val: %04x", st->gpio_dir, st->gpio_val);
1758
1759 return 0;
1760}
1761
1762int dib9000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
1763{
1764 struct dib9000_state *state = fe->demodulator_priv;
1765 return dib9000_cfg_gpio(state, num, dir, val);
1766}
1767EXPORT_SYMBOL(dib9000_set_gpio);
1768
1769int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1770{
1771 struct dib9000_state *state = fe->demodulator_priv;
1772 u16 val;
1773 int ret;
1774
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;
1782 }
1783
1784 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1785 dprintk("could not get the lock");
1786 return -EINTR;
1787 }
1788
1789 val = dib9000_read_word(state, 294 + 1) & 0xffef;
1790 val |= (onoff & 0x1) << 4;
1791
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;
1796
1797}
1798EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
1799
1800int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1801{
1802 struct dib9000_state *state = fe->demodulator_priv;
1803 int ret;
1804
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;
1817 }
1818
1819 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1820 dprintk("could not get the lock");
1821 return -EINTR;
1822 }
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;
1828}
1829EXPORT_SYMBOL(dib9000_fw_pid_filter);
1830
1831int dib9000_firmware_post_pll_init(struct dvb_frontend *fe)
1832{
1833 struct dib9000_state *state = fe->demodulator_priv;
1834 return dib9000_fw_init(state);
1835}
1836EXPORT_SYMBOL(dib9000_firmware_post_pll_init);
1837
1838static void dib9000_release(struct dvb_frontend *demod)
1839{
1840 struct dib9000_state *st = demod->demodulator_priv;
1841 u8 index_frontend;
1842
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]);
1845
1846 dibx000_exit_i2c_master(&st->i2c_master);
1847
1848 i2c_del_adapter(&st->tuner_adap);
1849 i2c_del_adapter(&st->component_bus);
1850 kfree(st->fe[0]);
1851 kfree(st);
1852}
1853
1854static int dib9000_wakeup(struct dvb_frontend *fe)
1855{
1856 return 0;
1857}
1858
1859static int dib9000_sleep(struct dvb_frontend *fe)
1860{
1861 struct dib9000_state *state = fe->demodulator_priv;
1862 u8 index_frontend;
1863 int ret = 0;
1864
1865 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1866 dprintk("could not get the lock");
1867 return -EINTR;
1868 }
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;
1873 }
1874 ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
1875
1876error:
1877 mutex_unlock(&state->demod_lock);
1878 return ret;
1879}
1880
1881static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1882{
1883 tune->min_delay_ms = 1000;
1884 return 0;
1885}
1886
1887static int dib9000_get_frontend(struct dvb_frontend *fe)
1888{
1889 struct dib9000_state *state = fe->demodulator_priv;
1890 u8 index_frontend, sub_index_frontend;
1891 fe_status_t stat;
1892 int ret = 0;
1893
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;
1898 }
1899 }
1900
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);
1905
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;
1927 }
1928 }
1929 ret = 0;
1930 goto return_value;
1931 }
1932 }
1933
1934 /* get the channel from master chip */
1935 ret = dib9000_fw_get_channel(fe);
1936 if (ret != 0)
1937 goto return_value;
1938
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;
1949 }
1950 ret = 0;
1951
1952return_value:
1953 if (state->get_frontend_internal == 0)
1954 mutex_unlock(&state->demod_lock);
1955 return ret;
1956}
1957
1958static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1959{
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;
1964
1965 return 0;
1966}
1967
1968static u32 dib9000_get_status(struct dvb_frontend *fe)
1969{
1970 struct dib9000_state *state = fe->demodulator_priv;
1971 return state->status;
1972}
1973
1974static int dib9000_set_channel_status(struct dvb_frontend *fe, struct dvb_frontend_parametersContext *channel_status)
1975{
1976 struct dib9000_state *state = fe->demodulator_priv;
1977
1978 memcpy(&state->channel_status, channel_status, sizeof(struct dvb_frontend_parametersContext));
1979 return 0;
1980}
1981
1982static int dib9000_set_frontend(struct dvb_frontend *fe)
1983{
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;
1989
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;
1994 }
1995
1996 if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
1997 dprintk("dib9000: must specify bandwidth ");
1998 return 0;
1999 }
2000
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;
2005 }
2006
2007 fe->dtv_property_cache.delivery_system = SYS_DVBT;
2008
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;
2018
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);
2022
2023 /* synchronization of the cache */
2024 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2025
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);
2028
2029 dib9000_set_channel_status(state->fe[index_frontend], &state->channel_status);
2030 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2031 }
2032
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;
2044 }
2045 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2046 msleep(sleep_time / 10);
2047 else
2048 break;
2049
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;
2059 }
2060 if (frontend_status == -FE_STATUS_TUNE_PENDING)
2061 nbr_pending++; /* some frontends are still tuning */
2062 }
2063 if ((exit_condition != 2) && (nbr_pending == 0))
2064 exit_condition = 1; /* if all tune are done and no success, exit: tune failed */
2065
2066 } while (exit_condition == 0);
2067
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;
2075 }
2076
2077 dprintk("tune success on frontend%i", index_frontend_success);
2078
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;
2083
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);
2091 }
2092 }
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;
2102 }
2103 }
2104 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2105 msleep(sleep_time / 10);
2106 else
2107 break;
2108
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 */
2115 }
2116 }
2117 } while (nbr_pending != 0);
2118
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);
2123
2124 /* turn off the diversity for the last frontend */
2125 dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
2126
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;
2131
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);
2144 }
2145 }
2146 /* do not postpone any more the pid filtering */
2147 state->pid_ctrl_index = -2;
2148
2149 return 0;
2150}
2151
2152static u16 dib9000_read_lock(struct dvb_frontend *fe)
2153{
2154 struct dib9000_state *state = fe->demodulator_priv;
2155
2156 return dib9000_read_word(state, 535);
2157}
2158
2159static int dib9000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
2160{
2161 struct dib9000_state *state = fe->demodulator_priv;
2162 u8 index_frontend;
2163 u16 lock = 0, lock_slave = 0;
2164
2165 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2166 dprintk("could not get the lock");
2167 return -EINTR;
2168 }
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]);
2171
2172 lock = dib9000_read_word(state, 535);
2173
2174 *stat = 0;
2175
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;
2186
2187 mutex_unlock(&state->demod_lock);
2188
2189 return 0;
2190}
2191
2192static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber)
2193{
2194 struct dib9000_state *state = fe->demodulator_priv;
2195 u16 *c;
2196 int ret = 0;
2197
2198 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2199 dprintk("could not get the lock");
2200 return -EINTR;
2201 }
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;
2206 }
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;
2211 }
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);
2215
2216 c = (u16 *)state->i2c_read_buffer;
2217
2218 *ber = c[10] << 16 | c[11];
2219
2220error:
2221 mutex_unlock(&state->demod_lock);
2222 return ret;
2223}
2224
2225static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2226{
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;
2232
2233 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2234 dprintk("could not get the lock");
2235 return -EINTR;
2236 }
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;
2244 }
2245
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;
2250 }
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;
2255 }
2256 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2257 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2258
2259 val = 65535 - c[4];
2260 if (val > 65535 - *strength)
2261 *strength = 65535;
2262 else
2263 *strength += val;
2264
2265error:
2266 mutex_unlock(&state->demod_lock);
2267 return ret;
2268}
2269
2270static u32 dib9000_get_snr(struct dvb_frontend *fe)
2271{
2272 struct dib9000_state *state = fe->demodulator_priv;
2273 u16 *c = (u16 *)state->i2c_read_buffer;
2274 u32 n, s, exp;
2275 u16 val;
2276
2277 if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2278 dprintk("could not get the lock");
2279 return 0;
2280 }
2281 if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2282 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2283 return 0;
2284 }
2285 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2286 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2287
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;
2296
2297 s = (val >> 6) & 0xFF;
2298 exp = (val & 0x3F);
2299 if ((exp & 0x20) != 0)
2300 exp -= 0x40;
2301 s <<= exp + 16;
2302
2303 if (n > 0) {
2304 u32 t = (s / n) << 16;
2305 return t + ((s << 16) - n * t) / n;
2306 }
2307 return 0xffffffff;
2308}
2309
2310static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr)
2311{
2312 struct dib9000_state *state = fe->demodulator_priv;
2313 u8 index_frontend;
2314 u32 snr_master;
2315
2316 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2317 dprintk("could not get the lock");
2318 return -EINTR;
2319 }
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]);
2323
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;
2329
2330 mutex_unlock(&state->demod_lock);
2331
2332 return 0;
2333}
2334
2335static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
2336{
2337 struct dib9000_state *state = fe->demodulator_priv;
2338 u16 *c = (u16 *)state->i2c_read_buffer;
2339 int ret = 0;
2340
2341 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2342 dprintk("could not get the lock");
2343 return -EINTR;
2344 }
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;
2349 }
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;
2354 }
2355 dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2356 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2357
2358 *unc = c[12];
2359
2360error:
2361 mutex_unlock(&state->demod_lock);
2362 return ret;
2363}
2364
2365int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
2366{
2367 int k = 0, ret = 0;
2368 u8 new_addr = 0;
2369 struct i2c_device client = {.i2c_adap = i2c };
2370
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;
2375 }
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;
2381 }
2382
2383 client.i2c_addr = default_addr + 16;
2384 dib9000_i2c_write16(&client, 1796, 0x0);
2385
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;
2390
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);
2395
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);
2401
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;
2408 }
2409 }
2410
2411 dib9000_i2c_write16(&client, 1795, (1 << 10) | (4 << 6));
2412 dib9000_i2c_write16(&client, 1794, (new_addr << 2) | 2);
2413
2414 dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
2415 }
2416
2417 for (k = 0; k < no_of_demods; k++) {
2418 new_addr = first_addr | (k << 1);
2419 client.i2c_addr = new_addr;
2420
2421 dib9000_i2c_write16(&client, 1794, (new_addr << 2));
2422 dib9000_i2c_write16(&client, 1795, 0);
2423 }
2424
2425error:
2426 kfree(client.i2c_read_buffer);
2427error_memory:
2428 kfree(client.i2c_write_buffer);
2429
2430 return ret;
2431}
2432EXPORT_SYMBOL(dib9000_i2c_enumeration);
2433
2434int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
2435{
2436 struct dib9000_state *state = fe->demodulator_priv;
2437 u8 index_frontend = 1;
2438
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;
2445 }
2446
2447 dprintk("too many slave frontend");
2448 return -ENOMEM;
2449}
2450EXPORT_SYMBOL(dib9000_set_slave_frontend);
2451
2452int dib9000_remove_slave_frontend(struct dvb_frontend *fe)
2453{
2454 struct dib9000_state *state = fe->demodulator_priv;
2455 u8 index_frontend = 1;
2456
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;
2463 }
2464
2465 dprintk("no frontend to be removed");
2466 return -ENODEV;
2467}
2468EXPORT_SYMBOL(dib9000_remove_slave_frontend);
2469
2470struct dvb_frontend *dib9000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
2471{
2472 struct dib9000_state *state = fe->demodulator_priv;
2473
2474 if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
2475 return NULL;
2476 return state->fe[slave_index];
2477}
2478EXPORT_SYMBOL(dib9000_get_slave_frontend);
2479
2480static struct dvb_frontend_ops dib9000_ops;
2481struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg)
2482{
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;
2492 }
2493
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;
2499
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;
2503
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;
2510
2511 st->pid_ctrl_index = -2;
2512
2513 st->fe[0] = fe;
2514 fe->demodulator_priv = st;
2515 memcpy(&st->fe[0]->ops, &dib9000_ops, sizeof(struct dvb_frontend_ops));
2516
2517 /* Ensure the output mode remains at the previous default if it's
2518 * not specifically set by the caller.
2519 */
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;
2522
2523 if (dib9000_identify(&st->i2c) == 0)
2524 goto error;
2525
2526 dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
2527
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;
2535
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;
2544
2545 dib9000_fw_reset(fe);
2546
2547 return fe;
2548
2549component_bus_add_error:
2550 i2c_del_adapter(&st->tuner_adap);
2551error:
2552 kfree(st);
2553 return NULL;
2554}
2555EXPORT_SYMBOL(dib9000_attach);
2556
2557static 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,
2569 },
2570
2571 .release = dib9000_release,
2572
2573 .init = dib9000_wakeup,
2574 .sleep = dib9000_sleep,
2575
2576 .set_frontend = dib9000_set_frontend,
2577 .get_tune_settings = dib9000_fe_get_tune_settings,
2578 .get_frontend = dib9000_get_frontend,
2579
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,
2585};
2586
2587MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
2588MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
2589MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2590MODULE_LICENSE("GPL");