cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dib9000.c (72091B)


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