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