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