Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / media / dvb-frontends / dib9000.c
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
20 static int debug;
21 module_param(debug, int, 0644);
22 MODULE_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
27 struct 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 struct dib9000_pid_ctrl {
35 #define DIB9000_PID_FILTER_CTRL 0
36 #define DIB9000_PID_FILTER      1
37         u8 cmd;
38         u8 id;
39         u16 pid;
40         u8 onoff;
41 };
42
43 struct 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
110 static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112         0, 0, 0, 0, 0, 0, 0, 0
113 };
114
115 enum 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
125 enum dib9000_out_messages {
126         OUT_MSG_HBM_ACK,
127         OUT_MSG_HOST_BUF_FAIL,
128         OUT_MSG_REQ_VERSION,
129         OUT_MSG_BRIDGE_I2C_W,
130         OUT_MSG_BRIDGE_I2C_R,
131         OUT_MSG_BRIDGE_APB_W,
132         OUT_MSG_BRIDGE_APB_R,
133         OUT_MSG_SCAN_CHANNEL,
134         OUT_MSG_MONIT_DEMOD,
135         OUT_MSG_CONF_GPIO,
136         OUT_MSG_DEBUG_HELP,
137         OUT_MSG_SUBBAND_SEL,
138         OUT_MSG_ENABLE_TIME_SLICE,
139         OUT_MSG_FE_FW_DL,
140         OUT_MSG_FE_CHANNEL_SEARCH,
141         OUT_MSG_FE_CHANNEL_TUNE,
142         OUT_MSG_FE_SLEEP,
143         OUT_MSG_FE_SYNC,
144         OUT_MSG_CTL_MONIT,
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
156 enum dib9000_in_messages {
157         IN_MSG_DATA,
158         IN_MSG_FRAME_INFO,
159         IN_MSG_CTL_MONIT,
160         IN_MSG_ACK_FREE_ITEM,
161         IN_MSG_DEBUG_BUF,
162         IN_MSG_MPE_MONITOR,
163         IN_MSG_RAWTS_MONITOR,
164         IN_MSG_END_BRIDGE_I2C_RW,
165         IN_MSG_END_BRIDGE_APB_RW,
166         IN_MSG_VERSION,
167         IN_MSG_END_OF_SCAN,
168         IN_MSG_MONIT_DEMOD,
169         IN_MSG_ERROR,
170         IN_MSG_FE_FW_DL_DONE,
171         IN_MSG_EVENT,
172         IN_MSG_ACK_CHANGE_SVC,
173         IN_MSG_HBM_PROF,
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
203 static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len);
204 static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len);
205
206 static 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
228 static 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
275 static 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
295 static 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
302 static 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
312 static 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
356 static 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
371 static 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
377 static 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
396 static 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
426 static 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
437 static 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
452 static 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
468 static 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
493 static 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
522 static 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
579 out:
580         mutex_unlock(&state->platform.risc.mbx_if_lock);
581
582         return ret;
583 }
584
585 static 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
644 static 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("%s", b);
653         } else
654                 dprintk("RISC%d: %d.%04d %s", state->fe_id, ts / 10000, ts % 10000, *b ? b : "<empty>");
655         return 1;
656 }
657
658 static 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
693 static 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
701 static 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
724 static 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
760 static 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
795 static 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
847 static 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
893 static 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
959 static 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
1008 static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len)
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
1035 static 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         if (len > 18)
1044                 return -EINVAL;
1045
1046         /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1047
1048         mb[0] = (u16)address;
1049         for (i = 0; i + 1 < len; i += 2)
1050                 mb[1 + i / 2] = b[i] << 8 | b[i + 1];
1051         if (len & 1)
1052                 mb[1 + len / 2] = b[len - 1] << 8;
1053
1054         dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_W, mb, (3 + len) / 2, attribute);
1055         return dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute) == 1 ? 0 : -EINVAL;
1056 }
1057
1058 static int dib9000_fw_memmbx_sync(struct dib9000_state *state, u8 i)
1059 {
1060         u8 index_loop = 10;
1061
1062         if (!state->platform.risc.fw_is_running)
1063                 return 0;
1064         dib9000_risc_mem_write(state, FE_MM_RW_SYNC, &i);
1065         do {
1066                 dib9000_risc_mem_read(state, FE_MM_RW_SYNC, state->i2c_read_buffer, 1);
1067         } while (state->i2c_read_buffer[0] && index_loop--);
1068
1069         if (index_loop > 0)
1070                 return 0;
1071         return -EIO;
1072 }
1073
1074 static int dib9000_fw_init(struct dib9000_state *state)
1075 {
1076         struct dibGPIOFunction *f;
1077         u16 b[40] = { 0 };
1078         u8 i;
1079         u8 size;
1080
1081         if (dib9000_fw_boot(state, NULL, 0, state->chip.d9.cfg.microcode_B_fe_buffer, state->chip.d9.cfg.microcode_B_fe_size) != 0)
1082                 return -EIO;
1083
1084         /* initialize the firmware */
1085         for (i = 0; i < ARRAY_SIZE(state->chip.d9.cfg.gpio_function); i++) {
1086                 f = &state->chip.d9.cfg.gpio_function[i];
1087                 if (f->mask) {
1088                         switch (f->function) {
1089                         case BOARD_GPIO_FUNCTION_COMPONENT_ON:
1090                                 b[0] = (u16) f->mask;
1091                                 b[1] = (u16) f->direction;
1092                                 b[2] = (u16) f->value;
1093                                 break;
1094                         case BOARD_GPIO_FUNCTION_COMPONENT_OFF:
1095                                 b[3] = (u16) f->mask;
1096                                 b[4] = (u16) f->direction;
1097                                 b[5] = (u16) f->value;
1098                                 break;
1099                         }
1100                 }
1101         }
1102         if (dib9000_mbx_send(state, OUT_MSG_CONF_GPIO, b, 15) != 0)
1103                 return -EIO;
1104
1105         /* subband */
1106         b[0] = state->chip.d9.cfg.subband.size; /* type == 0 -> GPIO - PWM not yet supported */
1107         for (i = 0; i < state->chip.d9.cfg.subband.size; i++) {
1108                 b[1 + i * 4] = state->chip.d9.cfg.subband.subband[i].f_mhz;
1109                 b[2 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.mask;
1110                 b[3 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.direction;
1111                 b[4 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.value;
1112         }
1113         b[1 + i * 4] = 0;       /* fe_id */
1114         if (dib9000_mbx_send(state, OUT_MSG_SUBBAND_SEL, b, 2 + 4 * i) != 0)
1115                 return -EIO;
1116
1117         /* 0 - id, 1 - no_of_frontends */
1118         b[0] = (0 << 8) | 1;
1119         /* 0 = i2c-address demod, 0 = tuner */
1120         b[1] = (0 << 8) | (0);
1121         b[2] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000) >> 16) & 0xffff);
1122         b[3] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000)) & 0xffff);
1123         b[4] = (u16) ((state->chip.d9.cfg.vcxo_timer >> 16) & 0xffff);
1124         b[5] = (u16) ((state->chip.d9.cfg.vcxo_timer) & 0xffff);
1125         b[6] = (u16) ((state->chip.d9.cfg.timing_frequency >> 16) & 0xffff);
1126         b[7] = (u16) ((state->chip.d9.cfg.timing_frequency) & 0xffff);
1127         b[29] = state->chip.d9.cfg.if_drives;
1128         if (dib9000_mbx_send(state, OUT_MSG_INIT_DEMOD, b, ARRAY_SIZE(b)) != 0)
1129                 return -EIO;
1130
1131         if (dib9000_mbx_send(state, OUT_MSG_FE_FW_DL, NULL, 0) != 0)
1132                 return -EIO;
1133
1134         if (dib9000_mbx_get_message(state, IN_MSG_FE_FW_DL_DONE, b, &size) < 0)
1135                 return -EIO;
1136
1137         if (size > ARRAY_SIZE(b)) {
1138                 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size,
1139                         (int)ARRAY_SIZE(b));
1140                 return -EINVAL;
1141         }
1142
1143         for (i = 0; i < size; i += 2) {
1144                 state->platform.risc.fe_mm[i / 2].addr = b[i + 0];
1145                 state->platform.risc.fe_mm[i / 2].size = b[i + 1];
1146         }
1147
1148         return 0;
1149 }
1150
1151 static void dib9000_fw_set_channel_head(struct dib9000_state *state)
1152 {
1153         u8 b[9];
1154         u32 freq = state->fe[0]->dtv_property_cache.frequency / 1000;
1155         if (state->fe_id % 2)
1156                 freq += 101;
1157
1158         b[0] = (u8) ((freq >> 0) & 0xff);
1159         b[1] = (u8) ((freq >> 8) & 0xff);
1160         b[2] = (u8) ((freq >> 16) & 0xff);
1161         b[3] = (u8) ((freq >> 24) & 0xff);
1162         b[4] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 0) & 0xff);
1163         b[5] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 8) & 0xff);
1164         b[6] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 16) & 0xff);
1165         b[7] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 24) & 0xff);
1166         b[8] = 0x80;            /* do not wait for CELL ID when doing autosearch */
1167         if (state->fe[0]->dtv_property_cache.delivery_system == SYS_DVBT)
1168                 b[8] |= 1;
1169         dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_HEAD, b);
1170 }
1171
1172 static int dib9000_fw_get_channel(struct dvb_frontend *fe)
1173 {
1174         struct dib9000_state *state = fe->demodulator_priv;
1175         struct dibDVBTChannel {
1176                 s8 spectrum_inversion;
1177
1178                 s8 nfft;
1179                 s8 guard;
1180                 s8 constellation;
1181
1182                 s8 hrch;
1183                 s8 alpha;
1184                 s8 code_rate_hp;
1185                 s8 code_rate_lp;
1186                 s8 select_hp;
1187
1188                 s8 intlv_native;
1189         };
1190         struct dibDVBTChannel *ch;
1191         int ret = 0;
1192
1193         if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1194                 dprintk("could not get the lock");
1195                 return -EINTR;
1196         }
1197         if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
1198                 ret = -EIO;
1199                 goto error;
1200         }
1201
1202         dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_UNION,
1203                         state->i2c_read_buffer, sizeof(struct dibDVBTChannel));
1204         ch = (struct dibDVBTChannel *)state->i2c_read_buffer;
1205
1206
1207         switch (ch->spectrum_inversion & 0x7) {
1208         case 1:
1209                 state->fe[0]->dtv_property_cache.inversion = INVERSION_ON;
1210                 break;
1211         case 0:
1212                 state->fe[0]->dtv_property_cache.inversion = INVERSION_OFF;
1213                 break;
1214         default:
1215         case -1:
1216                 state->fe[0]->dtv_property_cache.inversion = INVERSION_AUTO;
1217                 break;
1218         }
1219         switch (ch->nfft) {
1220         case 0:
1221                 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
1222                 break;
1223         case 2:
1224                 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
1225                 break;
1226         case 1:
1227                 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
1228                 break;
1229         default:
1230         case -1:
1231                 state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
1232                 break;
1233         }
1234         switch (ch->guard) {
1235         case 0:
1236                 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
1237                 break;
1238         case 1:
1239                 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
1240                 break;
1241         case 2:
1242                 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
1243                 break;
1244         case 3:
1245                 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
1246                 break;
1247         default:
1248         case -1:
1249                 state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
1250                 break;
1251         }
1252         switch (ch->constellation) {
1253         case 2:
1254                 state->fe[0]->dtv_property_cache.modulation = QAM_64;
1255                 break;
1256         case 1:
1257                 state->fe[0]->dtv_property_cache.modulation = QAM_16;
1258                 break;
1259         case 0:
1260                 state->fe[0]->dtv_property_cache.modulation = QPSK;
1261                 break;
1262         default:
1263         case -1:
1264                 state->fe[0]->dtv_property_cache.modulation = QAM_AUTO;
1265                 break;
1266         }
1267         switch (ch->hrch) {
1268         case 0:
1269                 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_NONE;
1270                 break;
1271         case 1:
1272                 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_1;
1273                 break;
1274         default:
1275         case -1:
1276                 state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
1277                 break;
1278         }
1279         switch (ch->code_rate_hp) {
1280         case 1:
1281                 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_1_2;
1282                 break;
1283         case 2:
1284                 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_2_3;
1285                 break;
1286         case 3:
1287                 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_3_4;
1288                 break;
1289         case 5:
1290                 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_5_6;
1291                 break;
1292         case 7:
1293                 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_7_8;
1294                 break;
1295         default:
1296         case -1:
1297                 state->fe[0]->dtv_property_cache.code_rate_HP = FEC_AUTO;
1298                 break;
1299         }
1300         switch (ch->code_rate_lp) {
1301         case 1:
1302                 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_1_2;
1303                 break;
1304         case 2:
1305                 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_2_3;
1306                 break;
1307         case 3:
1308                 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_3_4;
1309                 break;
1310         case 5:
1311                 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_5_6;
1312                 break;
1313         case 7:
1314                 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_7_8;
1315                 break;
1316         default:
1317         case -1:
1318                 state->fe[0]->dtv_property_cache.code_rate_LP = FEC_AUTO;
1319                 break;
1320         }
1321
1322 error:
1323         mutex_unlock(&state->platform.risc.mem_mbx_lock);
1324         return ret;
1325 }
1326
1327 static int dib9000_fw_set_channel_union(struct dvb_frontend *fe)
1328 {
1329         struct dib9000_state *state = fe->demodulator_priv;
1330         struct dibDVBTChannel {
1331                 s8 spectrum_inversion;
1332
1333                 s8 nfft;
1334                 s8 guard;
1335                 s8 constellation;
1336
1337                 s8 hrch;
1338                 s8 alpha;
1339                 s8 code_rate_hp;
1340                 s8 code_rate_lp;
1341                 s8 select_hp;
1342
1343                 s8 intlv_native;
1344         };
1345         struct dibDVBTChannel ch;
1346
1347         switch (state->fe[0]->dtv_property_cache.inversion) {
1348         case INVERSION_ON:
1349                 ch.spectrum_inversion = 1;
1350                 break;
1351         case INVERSION_OFF:
1352                 ch.spectrum_inversion = 0;
1353                 break;
1354         default:
1355         case INVERSION_AUTO:
1356                 ch.spectrum_inversion = -1;
1357                 break;
1358         }
1359         switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1360         case TRANSMISSION_MODE_2K:
1361                 ch.nfft = 0;
1362                 break;
1363         case TRANSMISSION_MODE_4K:
1364                 ch.nfft = 2;
1365                 break;
1366         case TRANSMISSION_MODE_8K:
1367                 ch.nfft = 1;
1368                 break;
1369         default:
1370         case TRANSMISSION_MODE_AUTO:
1371                 ch.nfft = 1;
1372                 break;
1373         }
1374         switch (state->fe[0]->dtv_property_cache.guard_interval) {
1375         case GUARD_INTERVAL_1_32:
1376                 ch.guard = 0;
1377                 break;
1378         case GUARD_INTERVAL_1_16:
1379                 ch.guard = 1;
1380                 break;
1381         case GUARD_INTERVAL_1_8:
1382                 ch.guard = 2;
1383                 break;
1384         case GUARD_INTERVAL_1_4:
1385                 ch.guard = 3;
1386                 break;
1387         default:
1388         case GUARD_INTERVAL_AUTO:
1389                 ch.guard = -1;
1390                 break;
1391         }
1392         switch (state->fe[0]->dtv_property_cache.modulation) {
1393         case QAM_64:
1394                 ch.constellation = 2;
1395                 break;
1396         case QAM_16:
1397                 ch.constellation = 1;
1398                 break;
1399         case QPSK:
1400                 ch.constellation = 0;
1401                 break;
1402         default:
1403         case QAM_AUTO:
1404                 ch.constellation = -1;
1405                 break;
1406         }
1407         switch (state->fe[0]->dtv_property_cache.hierarchy) {
1408         case HIERARCHY_NONE:
1409                 ch.hrch = 0;
1410                 break;
1411         case HIERARCHY_1:
1412         case HIERARCHY_2:
1413         case HIERARCHY_4:
1414                 ch.hrch = 1;
1415                 break;
1416         default:
1417         case HIERARCHY_AUTO:
1418                 ch.hrch = -1;
1419                 break;
1420         }
1421         ch.alpha = 1;
1422         switch (state->fe[0]->dtv_property_cache.code_rate_HP) {
1423         case FEC_1_2:
1424                 ch.code_rate_hp = 1;
1425                 break;
1426         case FEC_2_3:
1427                 ch.code_rate_hp = 2;
1428                 break;
1429         case FEC_3_4:
1430                 ch.code_rate_hp = 3;
1431                 break;
1432         case FEC_5_6:
1433                 ch.code_rate_hp = 5;
1434                 break;
1435         case FEC_7_8:
1436                 ch.code_rate_hp = 7;
1437                 break;
1438         default:
1439         case FEC_AUTO:
1440                 ch.code_rate_hp = -1;
1441                 break;
1442         }
1443         switch (state->fe[0]->dtv_property_cache.code_rate_LP) {
1444         case FEC_1_2:
1445                 ch.code_rate_lp = 1;
1446                 break;
1447         case FEC_2_3:
1448                 ch.code_rate_lp = 2;
1449                 break;
1450         case FEC_3_4:
1451                 ch.code_rate_lp = 3;
1452                 break;
1453         case FEC_5_6:
1454                 ch.code_rate_lp = 5;
1455                 break;
1456         case FEC_7_8:
1457                 ch.code_rate_lp = 7;
1458                 break;
1459         default:
1460         case FEC_AUTO:
1461                 ch.code_rate_lp = -1;
1462                 break;
1463         }
1464         ch.select_hp = 1;
1465         ch.intlv_native = 1;
1466
1467         dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_UNION, (u8 *) &ch);
1468
1469         return 0;
1470 }
1471
1472 static int dib9000_fw_tune(struct dvb_frontend *fe)
1473 {
1474         struct dib9000_state *state = fe->demodulator_priv;
1475         int ret = 10, search = state->channel_status.status == CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1476         s8 i;
1477
1478         switch (state->tune_state) {
1479         case CT_DEMOD_START:
1480                 dib9000_fw_set_channel_head(state);
1481
1482                 /* write the channel context - a channel is initialized to 0, so it is OK */
1483                 dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_CONTEXT, (u8 *) fe_info);
1484                 dib9000_risc_mem_write(state, FE_MM_W_FE_INFO, (u8 *) fe_info);
1485
1486                 if (search)
1487                         dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_SEARCH, NULL, 0);
1488                 else {
1489                         dib9000_fw_set_channel_union(fe);
1490                         dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_TUNE, NULL, 0);
1491                 }
1492                 state->tune_state = CT_DEMOD_STEP_1;
1493                 break;
1494         case CT_DEMOD_STEP_1:
1495                 if (search)
1496                         dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_SEARCH_STATE, state->i2c_read_buffer, 1);
1497                 else
1498                         dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_TUNE_STATE, state->i2c_read_buffer, 1);
1499                 i = (s8)state->i2c_read_buffer[0];
1500                 switch (i) {    /* something happened */
1501                 case 0:
1502                         break;
1503                 case -2:        /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1504                         if (search)
1505                                 state->status = FE_STATUS_DEMOD_SUCCESS;
1506                         else {
1507                                 state->tune_state = CT_DEMOD_STOP;
1508                                 state->status = FE_STATUS_LOCKED;
1509                         }
1510                         break;
1511                 default:
1512                         state->status = FE_STATUS_TUNE_FAILED;
1513                         state->tune_state = CT_DEMOD_STOP;
1514                         break;
1515                 }
1516                 break;
1517         default:
1518                 ret = FE_CALLBACK_TIME_NEVER;
1519                 break;
1520         }
1521
1522         return ret;
1523 }
1524
1525 static int dib9000_fw_set_diversity_in(struct dvb_frontend *fe, int onoff)
1526 {
1527         struct dib9000_state *state = fe->demodulator_priv;
1528         u16 mode = (u16) onoff;
1529         return dib9000_mbx_send(state, OUT_MSG_ENABLE_DIVERSITY, &mode, 1);
1530 }
1531
1532 static int dib9000_fw_set_output_mode(struct dvb_frontend *fe, int mode)
1533 {
1534         struct dib9000_state *state = fe->demodulator_priv;
1535         u16 outreg, smo_mode;
1536
1537         dprintk("setting output mode for demod %p to %d", fe, mode);
1538
1539         switch (mode) {
1540         case OUTMODE_MPEG2_PAR_GATED_CLK:
1541                 outreg = (1 << 10);     /* 0x0400 */
1542                 break;
1543         case OUTMODE_MPEG2_PAR_CONT_CLK:
1544                 outreg = (1 << 10) | (1 << 6);  /* 0x0440 */
1545                 break;
1546         case OUTMODE_MPEG2_SERIAL:
1547                 outreg = (1 << 10) | (2 << 6) | (0 << 1);       /* 0x0482 */
1548                 break;
1549         case OUTMODE_DIVERSITY:
1550                 outreg = (1 << 10) | (4 << 6);  /* 0x0500 */
1551                 break;
1552         case OUTMODE_MPEG2_FIFO:
1553                 outreg = (1 << 10) | (5 << 6);
1554                 break;
1555         case OUTMODE_HIGH_Z:
1556                 outreg = 0;
1557                 break;
1558         default:
1559                 dprintk("Unhandled output_mode passed to be set for demod %p", &state->fe[0]);
1560                 return -EINVAL;
1561         }
1562
1563         dib9000_write_word(state, 1795, outreg);
1564
1565         switch (mode) {
1566         case OUTMODE_MPEG2_PAR_GATED_CLK:
1567         case OUTMODE_MPEG2_PAR_CONT_CLK:
1568         case OUTMODE_MPEG2_SERIAL:
1569         case OUTMODE_MPEG2_FIFO:
1570                 smo_mode = (dib9000_read_word(state, 295) & 0x0010) | (1 << 1);
1571                 if (state->chip.d9.cfg.output_mpeg2_in_188_bytes)
1572                         smo_mode |= (1 << 5);
1573                 dib9000_write_word(state, 295, smo_mode);
1574                 break;
1575         }
1576
1577         outreg = to_fw_output_mode(mode);
1578         return dib9000_mbx_send(state, OUT_MSG_SET_OUTPUT_MODE, &outreg, 1);
1579 }
1580
1581 static int dib9000_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1582 {
1583         struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1584         u16 i, len, t, index_msg;
1585
1586         for (index_msg = 0; index_msg < num; index_msg++) {
1587                 if (msg[index_msg].flags & I2C_M_RD) {  /* read */
1588                         len = msg[index_msg].len;
1589                         if (len > 16)
1590                                 len = 16;
1591
1592                         if (dib9000_read_word(state, 790) != 0)
1593                                 dprintk("TunerITF: read busy");
1594
1595                         dib9000_write_word(state, 784, (u16) (msg[index_msg].addr));
1596                         dib9000_write_word(state, 787, (len / 2) - 1);
1597                         dib9000_write_word(state, 786, 1);      /* start read */
1598
1599                         i = 1000;
1600                         while (dib9000_read_word(state, 790) != (len / 2) && i)
1601                                 i--;
1602
1603                         if (i == 0)
1604                                 dprintk("TunerITF: read failed");
1605
1606                         for (i = 0; i < len; i += 2) {
1607                                 t = dib9000_read_word(state, 785);
1608                                 msg[index_msg].buf[i] = (t >> 8) & 0xff;
1609                                 msg[index_msg].buf[i + 1] = (t) & 0xff;
1610                         }
1611                         if (dib9000_read_word(state, 790) != 0)
1612                                 dprintk("TunerITF: read more data than expected");
1613                 } else {
1614                         i = 1000;
1615                         while (dib9000_read_word(state, 789) && i)
1616                                 i--;
1617                         if (i == 0)
1618                                 dprintk("TunerITF: write busy");
1619
1620                         len = msg[index_msg].len;
1621                         if (len > 16)
1622                                 len = 16;
1623
1624                         for (i = 0; i < len; i += 2)
1625                                 dib9000_write_word(state, 785, (msg[index_msg].buf[i] << 8) | msg[index_msg].buf[i + 1]);
1626                         dib9000_write_word(state, 784, (u16) msg[index_msg].addr);
1627                         dib9000_write_word(state, 787, (len / 2) - 1);
1628                         dib9000_write_word(state, 786, 0);      /* start write */
1629
1630                         i = 1000;
1631                         while (dib9000_read_word(state, 791) > 0 && i)
1632                                 i--;
1633                         if (i == 0)
1634                                 dprintk("TunerITF: write failed");
1635                 }
1636         }
1637         return num;
1638 }
1639
1640 int dib9000_fw_set_component_bus_speed(struct dvb_frontend *fe, u16 speed)
1641 {
1642         struct dib9000_state *state = fe->demodulator_priv;
1643
1644         state->component_bus_speed = speed;
1645         return 0;
1646 }
1647 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed);
1648
1649 static int dib9000_fw_component_bus_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1650 {
1651         struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1652         u8 type = 0;            /* I2C */
1653         u8 port = DIBX000_I2C_INTERFACE_GPIO_3_4;
1654         u16 scl = state->component_bus_speed;   /* SCL frequency */
1655         struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[FE_MM_RW_COMPONENT_ACCESS_BUFFER];
1656         u8 p[13] = { 0 };
1657
1658         p[0] = type;
1659         p[1] = port;
1660         p[2] = msg[0].addr << 1;
1661
1662         p[3] = (u8) scl & 0xff; /* scl */
1663         p[4] = (u8) (scl >> 8);
1664
1665         p[7] = 0;
1666         p[8] = 0;
1667
1668         p[9] = (u8) (msg[0].len);
1669         p[10] = (u8) (msg[0].len >> 8);
1670         if ((num > 1) && (msg[1].flags & I2C_M_RD)) {
1671                 p[11] = (u8) (msg[1].len);
1672                 p[12] = (u8) (msg[1].len >> 8);
1673         } else {
1674                 p[11] = 0;
1675                 p[12] = 0;
1676         }
1677
1678         if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1679                 dprintk("could not get the lock");
1680                 return 0;
1681         }
1682
1683         dib9000_risc_mem_write(state, FE_MM_W_COMPONENT_ACCESS, p);
1684
1685         {                       /* write-part */
1686                 dib9000_risc_mem_setup_cmd(state, m->addr, msg[0].len, 0);
1687                 dib9000_risc_mem_write_chunks(state, msg[0].buf, msg[0].len);
1688         }
1689
1690         /* do the transaction */
1691         if (dib9000_fw_memmbx_sync(state, FE_SYNC_COMPONENT_ACCESS) < 0) {
1692                 mutex_unlock(&state->platform.risc.mem_mbx_lock);
1693                 return 0;
1694         }
1695
1696         /* read back any possible result */
1697         if ((num > 1) && (msg[1].flags & I2C_M_RD))
1698                 dib9000_risc_mem_read(state, FE_MM_RW_COMPONENT_ACCESS_BUFFER, msg[1].buf, msg[1].len);
1699
1700         mutex_unlock(&state->platform.risc.mem_mbx_lock);
1701
1702         return num;
1703 }
1704
1705 static u32 dib9000_i2c_func(struct i2c_adapter *adapter)
1706 {
1707         return I2C_FUNC_I2C;
1708 }
1709
1710 static struct i2c_algorithm dib9000_tuner_algo = {
1711         .master_xfer = dib9000_tuner_xfer,
1712         .functionality = dib9000_i2c_func,
1713 };
1714
1715 static struct i2c_algorithm dib9000_component_bus_algo = {
1716         .master_xfer = dib9000_fw_component_bus_xfer,
1717         .functionality = dib9000_i2c_func,
1718 };
1719
1720 struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe)
1721 {
1722         struct dib9000_state *st = fe->demodulator_priv;
1723         return &st->tuner_adap;
1724 }
1725 EXPORT_SYMBOL(dib9000_get_tuner_interface);
1726
1727 struct i2c_adapter *dib9000_get_component_bus_interface(struct dvb_frontend *fe)
1728 {
1729         struct dib9000_state *st = fe->demodulator_priv;
1730         return &st->component_bus;
1731 }
1732 EXPORT_SYMBOL(dib9000_get_component_bus_interface);
1733
1734 struct i2c_adapter *dib9000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
1735 {
1736         struct dib9000_state *st = fe->demodulator_priv;
1737         return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
1738 }
1739 EXPORT_SYMBOL(dib9000_get_i2c_master);
1740
1741 int dib9000_set_i2c_adapter(struct dvb_frontend *fe, struct i2c_adapter *i2c)
1742 {
1743         struct dib9000_state *st = fe->demodulator_priv;
1744
1745         st->i2c.i2c_adap = i2c;
1746         return 0;
1747 }
1748 EXPORT_SYMBOL(dib9000_set_i2c_adapter);
1749
1750 static int dib9000_cfg_gpio(struct dib9000_state *st, u8 num, u8 dir, u8 val)
1751 {
1752         st->gpio_dir = dib9000_read_word(st, 773);
1753         st->gpio_dir &= ~(1 << num);    /* reset the direction bit */
1754         st->gpio_dir |= (dir & 0x1) << num;     /* set the new direction */
1755         dib9000_write_word(st, 773, st->gpio_dir);
1756
1757         st->gpio_val = dib9000_read_word(st, 774);
1758         st->gpio_val &= ~(1 << num);    /* reset the direction bit */
1759         st->gpio_val |= (val & 0x01) << num;    /* set the new value */
1760         dib9000_write_word(st, 774, st->gpio_val);
1761
1762         dprintk("gpio dir: %04x: gpio val: %04x", st->gpio_dir, st->gpio_val);
1763
1764         return 0;
1765 }
1766
1767 int dib9000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
1768 {
1769         struct dib9000_state *state = fe->demodulator_priv;
1770         return dib9000_cfg_gpio(state, num, dir, val);
1771 }
1772 EXPORT_SYMBOL(dib9000_set_gpio);
1773
1774 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1775 {
1776         struct dib9000_state *state = fe->demodulator_priv;
1777         u16 val;
1778         int ret;
1779
1780         if ((state->pid_ctrl_index != -2) && (state->pid_ctrl_index < 9)) {
1781                 /* postpone the pid filtering cmd */
1782                 dprintk("pid filter cmd postpone");
1783                 state->pid_ctrl_index++;
1784                 state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER_CTRL;
1785                 state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1786                 return 0;
1787         }
1788
1789         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1790                 dprintk("could not get the lock");
1791                 return -EINTR;
1792         }
1793
1794         val = dib9000_read_word(state, 294 + 1) & 0xffef;
1795         val |= (onoff & 0x1) << 4;
1796
1797         dprintk("PID filter enabled %d", onoff);
1798         ret = dib9000_write_word(state, 294 + 1, val);
1799         mutex_unlock(&state->demod_lock);
1800         return ret;
1801
1802 }
1803 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
1804
1805 int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1806 {
1807         struct dib9000_state *state = fe->demodulator_priv;
1808         int ret;
1809
1810         if (state->pid_ctrl_index != -2) {
1811                 /* postpone the pid filtering cmd */
1812                 dprintk("pid filter postpone");
1813                 if (state->pid_ctrl_index < 9) {
1814                         state->pid_ctrl_index++;
1815                         state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER;
1816                         state->pid_ctrl[state->pid_ctrl_index].id = id;
1817                         state->pid_ctrl[state->pid_ctrl_index].pid = pid;
1818                         state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1819                 } else
1820                         dprintk("can not add any more pid ctrl cmd");
1821                 return 0;
1822         }
1823
1824         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1825                 dprintk("could not get the lock");
1826                 return -EINTR;
1827         }
1828         dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
1829         ret = dib9000_write_word(state, 300 + 1 + id,
1830                         onoff ? (1 << 13) | pid : 0);
1831         mutex_unlock(&state->demod_lock);
1832         return ret;
1833 }
1834 EXPORT_SYMBOL(dib9000_fw_pid_filter);
1835
1836 int dib9000_firmware_post_pll_init(struct dvb_frontend *fe)
1837 {
1838         struct dib9000_state *state = fe->demodulator_priv;
1839         return dib9000_fw_init(state);
1840 }
1841 EXPORT_SYMBOL(dib9000_firmware_post_pll_init);
1842
1843 static void dib9000_release(struct dvb_frontend *demod)
1844 {
1845         struct dib9000_state *st = demod->demodulator_priv;
1846         u8 index_frontend;
1847
1848         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
1849                 dvb_frontend_detach(st->fe[index_frontend]);
1850
1851         dibx000_exit_i2c_master(&st->i2c_master);
1852
1853         i2c_del_adapter(&st->tuner_adap);
1854         i2c_del_adapter(&st->component_bus);
1855         kfree(st->fe[0]);
1856         kfree(st);
1857 }
1858
1859 static int dib9000_wakeup(struct dvb_frontend *fe)
1860 {
1861         return 0;
1862 }
1863
1864 static int dib9000_sleep(struct dvb_frontend *fe)
1865 {
1866         struct dib9000_state *state = fe->demodulator_priv;
1867         u8 index_frontend;
1868         int ret = 0;
1869
1870         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1871                 dprintk("could not get the lock");
1872                 return -EINTR;
1873         }
1874         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1875                 ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
1876                 if (ret < 0)
1877                         goto error;
1878         }
1879         ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
1880
1881 error:
1882         mutex_unlock(&state->demod_lock);
1883         return ret;
1884 }
1885
1886 static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1887 {
1888         tune->min_delay_ms = 1000;
1889         return 0;
1890 }
1891
1892 static int dib9000_get_frontend(struct dvb_frontend *fe)
1893 {
1894         struct dib9000_state *state = fe->demodulator_priv;
1895         u8 index_frontend, sub_index_frontend;
1896         fe_status_t stat;
1897         int ret = 0;
1898
1899         if (state->get_frontend_internal == 0) {
1900                 if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1901                         dprintk("could not get the lock");
1902                         return -EINTR;
1903                 }
1904         }
1905
1906         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1907                 state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
1908                 if (stat & FE_HAS_SYNC) {
1909                         dprintk("TPS lock on the slave%i", index_frontend);
1910
1911                         /* synchronize the cache with the other frontends */
1912                         state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
1913                         for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL);
1914                              sub_index_frontend++) {
1915                                 if (sub_index_frontend != index_frontend) {
1916                                         state->fe[sub_index_frontend]->dtv_property_cache.modulation =
1917                                             state->fe[index_frontend]->dtv_property_cache.modulation;
1918                                         state->fe[sub_index_frontend]->dtv_property_cache.inversion =
1919                                             state->fe[index_frontend]->dtv_property_cache.inversion;
1920                                         state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode =
1921                                             state->fe[index_frontend]->dtv_property_cache.transmission_mode;
1922                                         state->fe[sub_index_frontend]->dtv_property_cache.guard_interval =
1923                                             state->fe[index_frontend]->dtv_property_cache.guard_interval;
1924                                         state->fe[sub_index_frontend]->dtv_property_cache.hierarchy =
1925                                             state->fe[index_frontend]->dtv_property_cache.hierarchy;
1926                                         state->fe[sub_index_frontend]->dtv_property_cache.code_rate_HP =
1927                                             state->fe[index_frontend]->dtv_property_cache.code_rate_HP;
1928                                         state->fe[sub_index_frontend]->dtv_property_cache.code_rate_LP =
1929                                             state->fe[index_frontend]->dtv_property_cache.code_rate_LP;
1930                                         state->fe[sub_index_frontend]->dtv_property_cache.rolloff =
1931                                             state->fe[index_frontend]->dtv_property_cache.rolloff;
1932                                 }
1933                         }
1934                         ret = 0;
1935                         goto return_value;
1936                 }
1937         }
1938
1939         /* get the channel from master chip */
1940         ret = dib9000_fw_get_channel(fe);
1941         if (ret != 0)
1942                 goto return_value;
1943
1944         /* synchronize the cache with the other frontends */
1945         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1946                 state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
1947                 state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
1948                 state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
1949                 state->fe[index_frontend]->dtv_property_cache.modulation = fe->dtv_property_cache.modulation;
1950                 state->fe[index_frontend]->dtv_property_cache.hierarchy = fe->dtv_property_cache.hierarchy;
1951                 state->fe[index_frontend]->dtv_property_cache.code_rate_HP = fe->dtv_property_cache.code_rate_HP;
1952                 state->fe[index_frontend]->dtv_property_cache.code_rate_LP = fe->dtv_property_cache.code_rate_LP;
1953                 state->fe[index_frontend]->dtv_property_cache.rolloff = fe->dtv_property_cache.rolloff;
1954         }
1955         ret = 0;
1956
1957 return_value:
1958         if (state->get_frontend_internal == 0)
1959                 mutex_unlock(&state->demod_lock);
1960         return ret;
1961 }
1962
1963 static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1964 {
1965         struct dib9000_state *state = fe->demodulator_priv;
1966         state->tune_state = tune_state;
1967         if (tune_state == CT_DEMOD_START)
1968                 state->status = FE_STATUS_TUNE_PENDING;
1969
1970         return 0;
1971 }
1972
1973 static u32 dib9000_get_status(struct dvb_frontend *fe)
1974 {
1975         struct dib9000_state *state = fe->demodulator_priv;
1976         return state->status;
1977 }
1978
1979 static int dib9000_set_channel_status(struct dvb_frontend *fe, struct dvb_frontend_parametersContext *channel_status)
1980 {
1981         struct dib9000_state *state = fe->demodulator_priv;
1982
1983         memcpy(&state->channel_status, channel_status, sizeof(struct dvb_frontend_parametersContext));
1984         return 0;
1985 }
1986
1987 static int dib9000_set_frontend(struct dvb_frontend *fe)
1988 {
1989         struct dib9000_state *state = fe->demodulator_priv;
1990         int sleep_time, sleep_time_slave;
1991         u32 frontend_status;
1992         u8 nbr_pending, exit_condition, index_frontend, index_frontend_success;
1993         struct dvb_frontend_parametersContext channel_status;
1994
1995         /* check that the correct parameters are set */
1996         if (state->fe[0]->dtv_property_cache.frequency == 0) {
1997                 dprintk("dib9000: must specify frequency ");
1998                 return 0;
1999         }
2000
2001         if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
2002                 dprintk("dib9000: must specify bandwidth ");
2003                 return 0;
2004         }
2005
2006         state->pid_ctrl_index = -1; /* postpone the pid filtering cmd */
2007         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2008                 dprintk("could not get the lock");
2009                 return 0;
2010         }
2011
2012         fe->dtv_property_cache.delivery_system = SYS_DVBT;
2013
2014         /* set the master status */
2015         if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO ||
2016             state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO ||
2017             state->fe[0]->dtv_property_cache.modulation == QAM_AUTO ||
2018             state->fe[0]->dtv_property_cache.code_rate_HP == FEC_AUTO) {
2019                 /* no channel specified, autosearch the channel */
2020                 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_UNKNOWN;
2021         } else
2022                 state->channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2023
2024         /* set mode and status for the different frontends */
2025         for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2026                 dib9000_fw_set_diversity_in(state->fe[index_frontend], 1);
2027
2028                 /* synchronization of the cache */
2029                 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2030
2031                 state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_DVBT;
2032                 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_HIGH_Z);
2033
2034                 dib9000_set_channel_status(state->fe[index_frontend], &state->channel_status);
2035                 dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2036         }
2037
2038         /* actual tune */
2039         exit_condition = 0;     /* 0: tune pending; 1: tune failed; 2:tune success */
2040         index_frontend_success = 0;
2041         do {
2042                 sleep_time = dib9000_fw_tune(state->fe[0]);
2043                 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2044                         sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2045                         if (sleep_time == FE_CALLBACK_TIME_NEVER)
2046                                 sleep_time = sleep_time_slave;
2047                         else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2048                                 sleep_time = sleep_time_slave;
2049                 }
2050                 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2051                         msleep(sleep_time / 10);
2052                 else
2053                         break;
2054
2055                 nbr_pending = 0;
2056                 exit_condition = 0;
2057                 index_frontend_success = 0;
2058                 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2059                         frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2060                         if (frontend_status > -FE_STATUS_TUNE_PENDING) {
2061                                 exit_condition = 2;     /* tune success */
2062                                 index_frontend_success = index_frontend;
2063                                 break;
2064                         }
2065                         if (frontend_status == -FE_STATUS_TUNE_PENDING)
2066                                 nbr_pending++;  /* some frontends are still tuning */
2067                 }
2068                 if ((exit_condition != 2) && (nbr_pending == 0))
2069                         exit_condition = 1;     /* if all tune are done and no success, exit: tune failed */
2070
2071         } while (exit_condition == 0);
2072
2073         /* check the tune result */
2074         if (exit_condition == 1) {      /* tune failed */
2075                 dprintk("tune failed");
2076                 mutex_unlock(&state->demod_lock);
2077                 /* tune failed; put all the pid filtering cmd to junk */
2078                 state->pid_ctrl_index = -1;
2079                 return 0;
2080         }
2081
2082         dprintk("tune success on frontend%i", index_frontend_success);
2083
2084         /* synchronize all the channel cache */
2085         state->get_frontend_internal = 1;
2086         dib9000_get_frontend(state->fe[0]);
2087         state->get_frontend_internal = 0;
2088
2089         /* retune the other frontends with the found channel */
2090         channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2091         for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2092                 /* only retune the frontends which was not tuned success */
2093                 if (index_frontend != index_frontend_success) {
2094                         dib9000_set_channel_status(state->fe[index_frontend], &channel_status);
2095                         dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2096                 }
2097         }
2098         do {
2099                 sleep_time = FE_CALLBACK_TIME_NEVER;
2100                 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2101                         if (index_frontend != index_frontend_success) {
2102                                 sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2103                                 if (sleep_time == FE_CALLBACK_TIME_NEVER)
2104                                         sleep_time = sleep_time_slave;
2105                                 else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2106                                         sleep_time = sleep_time_slave;
2107                         }
2108                 }
2109                 if (sleep_time != FE_CALLBACK_TIME_NEVER)
2110                         msleep(sleep_time / 10);
2111                 else
2112                         break;
2113
2114                 nbr_pending = 0;
2115                 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2116                         if (index_frontend != index_frontend_success) {
2117                                 frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2118                                 if ((index_frontend != index_frontend_success) && (frontend_status == -FE_STATUS_TUNE_PENDING))
2119                                         nbr_pending++;  /* some frontends are still tuning */
2120                         }
2121                 }
2122         } while (nbr_pending != 0);
2123
2124         /* set the output mode */
2125         dib9000_fw_set_output_mode(state->fe[0], state->chip.d9.cfg.output_mode);
2126         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2127                 dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_DIVERSITY);
2128
2129         /* turn off the diversity for the last frontend */
2130         dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
2131
2132         mutex_unlock(&state->demod_lock);
2133         if (state->pid_ctrl_index >= 0) {
2134                 u8 index_pid_filter_cmd;
2135                 u8 pid_ctrl_index = state->pid_ctrl_index;
2136
2137                 state->pid_ctrl_index = -2;
2138                 for (index_pid_filter_cmd = 0;
2139                                 index_pid_filter_cmd <= pid_ctrl_index;
2140                                 index_pid_filter_cmd++) {
2141                         if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER_CTRL)
2142                                 dib9000_fw_pid_filter_ctrl(state->fe[0],
2143                                                 state->pid_ctrl[index_pid_filter_cmd].onoff);
2144                         else if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER)
2145                                 dib9000_fw_pid_filter(state->fe[0],
2146                                                 state->pid_ctrl[index_pid_filter_cmd].id,
2147                                                 state->pid_ctrl[index_pid_filter_cmd].pid,
2148                                                 state->pid_ctrl[index_pid_filter_cmd].onoff);
2149                 }
2150         }
2151         /* do not postpone any more the pid filtering */
2152         state->pid_ctrl_index = -2;
2153
2154         return 0;
2155 }
2156
2157 static u16 dib9000_read_lock(struct dvb_frontend *fe)
2158 {
2159         struct dib9000_state *state = fe->demodulator_priv;
2160
2161         return dib9000_read_word(state, 535);
2162 }
2163
2164 static int dib9000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
2165 {
2166         struct dib9000_state *state = fe->demodulator_priv;
2167         u8 index_frontend;
2168         u16 lock = 0, lock_slave = 0;
2169
2170         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2171                 dprintk("could not get the lock");
2172                 return -EINTR;
2173         }
2174         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2175                 lock_slave |= dib9000_read_lock(state->fe[index_frontend]);
2176
2177         lock = dib9000_read_word(state, 535);
2178
2179         *stat = 0;
2180
2181         if ((lock & 0x8000) || (lock_slave & 0x8000))
2182                 *stat |= FE_HAS_SIGNAL;
2183         if ((lock & 0x3000) || (lock_slave & 0x3000))
2184                 *stat |= FE_HAS_CARRIER;
2185         if ((lock & 0x0100) || (lock_slave & 0x0100))
2186                 *stat |= FE_HAS_VITERBI;
2187         if (((lock & 0x0038) == 0x38) || ((lock_slave & 0x0038) == 0x38))
2188                 *stat |= FE_HAS_SYNC;
2189         if ((lock & 0x0008) || (lock_slave & 0x0008))
2190                 *stat |= FE_HAS_LOCK;
2191
2192         mutex_unlock(&state->demod_lock);
2193
2194         return 0;
2195 }
2196
2197 static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber)
2198 {
2199         struct dib9000_state *state = fe->demodulator_priv;
2200         u16 *c;
2201         int ret = 0;
2202
2203         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2204                 dprintk("could not get the lock");
2205                 return -EINTR;
2206         }
2207         if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2208                 dprintk("could not get the lock");
2209                 ret = -EINTR;
2210                 goto error;
2211         }
2212         if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2213                 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2214                 ret = -EIO;
2215                 goto error;
2216         }
2217         dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR,
2218                         state->i2c_read_buffer, 16 * 2);
2219         mutex_unlock(&state->platform.risc.mem_mbx_lock);
2220
2221         c = (u16 *)state->i2c_read_buffer;
2222
2223         *ber = c[10] << 16 | c[11];
2224
2225 error:
2226         mutex_unlock(&state->demod_lock);
2227         return ret;
2228 }
2229
2230 static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2231 {
2232         struct dib9000_state *state = fe->demodulator_priv;
2233         u8 index_frontend;
2234         u16 *c = (u16 *)state->i2c_read_buffer;
2235         u16 val;
2236         int ret = 0;
2237
2238         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2239                 dprintk("could not get the lock");
2240                 return -EINTR;
2241         }
2242         *strength = 0;
2243         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2244                 state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
2245                 if (val > 65535 - *strength)
2246                         *strength = 65535;
2247                 else
2248                         *strength += val;
2249         }
2250
2251         if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2252                 dprintk("could not get the lock");
2253                 ret = -EINTR;
2254                 goto error;
2255         }
2256         if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2257                 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2258                 ret = -EIO;
2259                 goto error;
2260         }
2261         dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2262         mutex_unlock(&state->platform.risc.mem_mbx_lock);
2263
2264         val = 65535 - c[4];
2265         if (val > 65535 - *strength)
2266                 *strength = 65535;
2267         else
2268                 *strength += val;
2269
2270 error:
2271         mutex_unlock(&state->demod_lock);
2272         return ret;
2273 }
2274
2275 static u32 dib9000_get_snr(struct dvb_frontend *fe)
2276 {
2277         struct dib9000_state *state = fe->demodulator_priv;
2278         u16 *c = (u16 *)state->i2c_read_buffer;
2279         u32 n, s, exp;
2280         u16 val;
2281
2282         if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2283                 dprintk("could not get the lock");
2284                 return 0;
2285         }
2286         if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2287                 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2288                 return 0;
2289         }
2290         dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2291         mutex_unlock(&state->platform.risc.mem_mbx_lock);
2292
2293         val = c[7];
2294         n = (val >> 4) & 0xff;
2295         exp = ((val & 0xf) << 2);
2296         val = c[8];
2297         exp += ((val >> 14) & 0x3);
2298         if ((exp & 0x20) != 0)
2299                 exp -= 0x40;
2300         n <<= exp + 16;
2301
2302         s = (val >> 6) & 0xFF;
2303         exp = (val & 0x3F);
2304         if ((exp & 0x20) != 0)
2305                 exp -= 0x40;
2306         s <<= exp + 16;
2307
2308         if (n > 0) {
2309                 u32 t = (s / n) << 16;
2310                 return t + ((s << 16) - n * t) / n;
2311         }
2312         return 0xffffffff;
2313 }
2314
2315 static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr)
2316 {
2317         struct dib9000_state *state = fe->demodulator_priv;
2318         u8 index_frontend;
2319         u32 snr_master;
2320
2321         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2322                 dprintk("could not get the lock");
2323                 return -EINTR;
2324         }
2325         snr_master = dib9000_get_snr(fe);
2326         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2327                 snr_master += dib9000_get_snr(state->fe[index_frontend]);
2328
2329         if ((snr_master >> 16) != 0) {
2330                 snr_master = 10 * intlog10(snr_master >> 16);
2331                 *snr = snr_master / ((1 << 24) / 10);
2332         } else
2333                 *snr = 0;
2334
2335         mutex_unlock(&state->demod_lock);
2336
2337         return 0;
2338 }
2339
2340 static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
2341 {
2342         struct dib9000_state *state = fe->demodulator_priv;
2343         u16 *c = (u16 *)state->i2c_read_buffer;
2344         int ret = 0;
2345
2346         if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2347                 dprintk("could not get the lock");
2348                 return -EINTR;
2349         }
2350         if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2351                 dprintk("could not get the lock");
2352                 ret = -EINTR;
2353                 goto error;
2354         }
2355         if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2356                 mutex_unlock(&state->platform.risc.mem_mbx_lock);
2357                 ret = -EIO;
2358                 goto error;
2359         }
2360         dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2361         mutex_unlock(&state->platform.risc.mem_mbx_lock);
2362
2363         *unc = c[12];
2364
2365 error:
2366         mutex_unlock(&state->demod_lock);
2367         return ret;
2368 }
2369
2370 int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
2371 {
2372         int k = 0, ret = 0;
2373         u8 new_addr = 0;
2374         struct i2c_device client = {.i2c_adap = i2c };
2375
2376         client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
2377         if (!client.i2c_write_buffer) {
2378                 dprintk("%s: not enough memory", __func__);
2379                 return -ENOMEM;
2380         }
2381         client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
2382         if (!client.i2c_read_buffer) {
2383                 dprintk("%s: not enough memory", __func__);
2384                 ret = -ENOMEM;
2385                 goto error_memory;
2386         }
2387
2388         client.i2c_addr = default_addr + 16;
2389         dib9000_i2c_write16(&client, 1796, 0x0);
2390
2391         for (k = no_of_demods - 1; k >= 0; k--) {
2392                 /* designated i2c address */
2393                 new_addr = first_addr + (k << 1);
2394                 client.i2c_addr = default_addr;
2395
2396                 dib9000_i2c_write16(&client, 1817, 3);
2397                 dib9000_i2c_write16(&client, 1796, 0);
2398                 dib9000_i2c_write16(&client, 1227, 1);
2399                 dib9000_i2c_write16(&client, 1227, 0);
2400
2401                 client.i2c_addr = new_addr;
2402                 dib9000_i2c_write16(&client, 1817, 3);
2403                 dib9000_i2c_write16(&client, 1796, 0);
2404                 dib9000_i2c_write16(&client, 1227, 1);
2405                 dib9000_i2c_write16(&client, 1227, 0);
2406
2407                 if (dib9000_identify(&client) == 0) {
2408                         client.i2c_addr = default_addr;
2409                         if (dib9000_identify(&client) == 0) {
2410                                 dprintk("DiB9000 #%d: not identified", k);
2411                                 ret = -EIO;
2412                                 goto error;
2413                         }
2414                 }
2415
2416                 dib9000_i2c_write16(&client, 1795, (1 << 10) | (4 << 6));
2417                 dib9000_i2c_write16(&client, 1794, (new_addr << 2) | 2);
2418
2419                 dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
2420         }
2421
2422         for (k = 0; k < no_of_demods; k++) {
2423                 new_addr = first_addr | (k << 1);
2424                 client.i2c_addr = new_addr;
2425
2426                 dib9000_i2c_write16(&client, 1794, (new_addr << 2));
2427                 dib9000_i2c_write16(&client, 1795, 0);
2428         }
2429
2430 error:
2431         kfree(client.i2c_read_buffer);
2432 error_memory:
2433         kfree(client.i2c_write_buffer);
2434
2435         return ret;
2436 }
2437 EXPORT_SYMBOL(dib9000_i2c_enumeration);
2438
2439 int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
2440 {
2441         struct dib9000_state *state = fe->demodulator_priv;
2442         u8 index_frontend = 1;
2443
2444         while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2445                 index_frontend++;
2446         if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
2447                 dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
2448                 state->fe[index_frontend] = fe_slave;
2449                 return 0;
2450         }
2451
2452         dprintk("too many slave frontend");
2453         return -ENOMEM;
2454 }
2455 EXPORT_SYMBOL(dib9000_set_slave_frontend);
2456
2457 int dib9000_remove_slave_frontend(struct dvb_frontend *fe)
2458 {
2459         struct dib9000_state *state = fe->demodulator_priv;
2460         u8 index_frontend = 1;
2461
2462         while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2463                 index_frontend++;
2464         if (index_frontend != 1) {
2465                 dprintk("remove slave fe %p (index %i)", state->fe[index_frontend - 1], index_frontend - 1);
2466                 state->fe[index_frontend] = NULL;
2467                 return 0;
2468         }
2469
2470         dprintk("no frontend to be removed");
2471         return -ENODEV;
2472 }
2473 EXPORT_SYMBOL(dib9000_remove_slave_frontend);
2474
2475 struct dvb_frontend *dib9000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
2476 {
2477         struct dib9000_state *state = fe->demodulator_priv;
2478
2479         if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
2480                 return NULL;
2481         return state->fe[slave_index];
2482 }
2483 EXPORT_SYMBOL(dib9000_get_slave_frontend);
2484
2485 static struct dvb_frontend_ops dib9000_ops;
2486 struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg)
2487 {
2488         struct dvb_frontend *fe;
2489         struct dib9000_state *st;
2490         st = kzalloc(sizeof(struct dib9000_state), GFP_KERNEL);
2491         if (st == NULL)
2492                 return NULL;
2493         fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
2494         if (fe == NULL) {
2495                 kfree(st);
2496                 return NULL;
2497         }
2498
2499         memcpy(&st->chip.d9.cfg, cfg, sizeof(struct dib9000_config));
2500         st->i2c.i2c_adap = i2c_adap;
2501         st->i2c.i2c_addr = i2c_addr;
2502         st->i2c.i2c_write_buffer = st->i2c_write_buffer;
2503         st->i2c.i2c_read_buffer = st->i2c_read_buffer;
2504
2505         st->gpio_dir = DIB9000_GPIO_DEFAULT_DIRECTIONS;
2506         st->gpio_val = DIB9000_GPIO_DEFAULT_VALUES;
2507         st->gpio_pwm_pos = DIB9000_GPIO_DEFAULT_PWM_POS;
2508
2509         mutex_init(&st->platform.risc.mbx_if_lock);
2510         mutex_init(&st->platform.risc.mbx_lock);
2511         mutex_init(&st->platform.risc.mem_lock);
2512         mutex_init(&st->platform.risc.mem_mbx_lock);
2513         mutex_init(&st->demod_lock);
2514         st->get_frontend_internal = 0;
2515
2516         st->pid_ctrl_index = -2;
2517
2518         st->fe[0] = fe;
2519         fe->demodulator_priv = st;
2520         memcpy(&st->fe[0]->ops, &dib9000_ops, sizeof(struct dvb_frontend_ops));
2521
2522         /* Ensure the output mode remains at the previous default if it's
2523          * not specifically set by the caller.
2524          */
2525         if ((st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2526                 st->chip.d9.cfg.output_mode = OUTMODE_MPEG2_FIFO;
2527
2528         if (dib9000_identify(&st->i2c) == 0)
2529                 goto error;
2530
2531         dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
2532
2533         st->tuner_adap.dev.parent = i2c_adap->dev.parent;
2534         strncpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS", sizeof(st->tuner_adap.name));
2535         st->tuner_adap.algo = &dib9000_tuner_algo;
2536         st->tuner_adap.algo_data = NULL;
2537         i2c_set_adapdata(&st->tuner_adap, st);
2538         if (i2c_add_adapter(&st->tuner_adap) < 0)
2539                 goto error;
2540
2541         st->component_bus.dev.parent = i2c_adap->dev.parent;
2542         strncpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st->component_bus.name));
2543         st->component_bus.algo = &dib9000_component_bus_algo;
2544         st->component_bus.algo_data = NULL;
2545         st->component_bus_speed = 340;
2546         i2c_set_adapdata(&st->component_bus, st);
2547         if (i2c_add_adapter(&st->component_bus) < 0)
2548                 goto component_bus_add_error;
2549
2550         dib9000_fw_reset(fe);
2551
2552         return fe;
2553
2554 component_bus_add_error:
2555         i2c_del_adapter(&st->tuner_adap);
2556 error:
2557         kfree(st);
2558         return NULL;
2559 }
2560 EXPORT_SYMBOL(dib9000_attach);
2561
2562 static struct dvb_frontend_ops dib9000_ops = {
2563         .delsys = { SYS_DVBT },
2564         .info = {
2565                  .name = "DiBcom 9000",
2566                  .frequency_min = 44250000,
2567                  .frequency_max = 867250000,
2568                  .frequency_stepsize = 62500,
2569                  .caps = FE_CAN_INVERSION_AUTO |
2570                  FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2571                  FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2572                  FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2573                  FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2574                  },
2575
2576         .release = dib9000_release,
2577
2578         .init = dib9000_wakeup,
2579         .sleep = dib9000_sleep,
2580
2581         .set_frontend = dib9000_set_frontend,
2582         .get_tune_settings = dib9000_fe_get_tune_settings,
2583         .get_frontend = dib9000_get_frontend,
2584
2585         .read_status = dib9000_read_status,
2586         .read_ber = dib9000_read_ber,
2587         .read_signal_strength = dib9000_read_signal_strength,
2588         .read_snr = dib9000_read_snr,
2589         .read_ucblocks = dib9000_read_unc_blocks,
2590 };
2591
2592 MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
2593 MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
2594 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2595 MODULE_LICENSE("GPL");