[go: nahoru, domu]

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