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

mxl111sf-i2c.c (17842B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  mxl111sf-i2c.c - driver for the MaxLinear MXL111SF
      4 *
      5 *  Copyright (C) 2010-2014 Michael Krufky <mkrufky@linuxtv.org>
      6 */
      7
      8#include "mxl111sf-i2c.h"
      9#include "mxl111sf.h"
     10
     11/* SW-I2C ----------------------------------------------------------------- */
     12
     13#define SW_I2C_ADDR		0x1a
     14#define SW_I2C_EN		0x02
     15#define SW_SCL_OUT		0x04
     16#define SW_SDA_OUT		0x08
     17#define SW_SDA_IN		0x04
     18
     19#define SW_I2C_BUSY_ADDR	0x2f
     20#define SW_I2C_BUSY		0x02
     21
     22static int mxl111sf_i2c_bitbang_sendbyte(struct mxl111sf_state *state,
     23					 u8 byte)
     24{
     25	int i, ret;
     26	u8 data = 0;
     27
     28	mxl_i2c("(0x%02x)", byte);
     29
     30	ret = mxl111sf_read_reg(state, SW_I2C_BUSY_ADDR, &data);
     31	if (mxl_fail(ret))
     32		goto fail;
     33
     34	for (i = 0; i < 8; i++) {
     35
     36		data = (byte & (0x80 >> i)) ? SW_SDA_OUT : 0;
     37
     38		ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     39					 0x10 | SW_I2C_EN | data);
     40		if (mxl_fail(ret))
     41			goto fail;
     42
     43		ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     44					 0x10 | SW_I2C_EN | data | SW_SCL_OUT);
     45		if (mxl_fail(ret))
     46			goto fail;
     47
     48		ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     49					 0x10 | SW_I2C_EN | data);
     50		if (mxl_fail(ret))
     51			goto fail;
     52	}
     53
     54	/* last bit was 0 so we need to release SDA */
     55	if (!(byte & 1)) {
     56		ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     57					 0x10 | SW_I2C_EN | SW_SDA_OUT);
     58		if (mxl_fail(ret))
     59			goto fail;
     60	}
     61
     62	/* CLK high for ACK readback */
     63	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     64				 0x10 | SW_I2C_EN | SW_SCL_OUT | SW_SDA_OUT);
     65	if (mxl_fail(ret))
     66		goto fail;
     67
     68	ret = mxl111sf_read_reg(state, SW_I2C_BUSY_ADDR, &data);
     69	if (mxl_fail(ret))
     70		goto fail;
     71
     72	/* drop the CLK after getting ACK, SDA will go high right away */
     73	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     74				 0x10 | SW_I2C_EN | SW_SDA_OUT);
     75	if (mxl_fail(ret))
     76		goto fail;
     77
     78	if (data & SW_SDA_IN)
     79		ret = -EIO;
     80fail:
     81	return ret;
     82}
     83
     84static int mxl111sf_i2c_bitbang_recvbyte(struct mxl111sf_state *state,
     85					 u8 *pbyte)
     86{
     87	int i, ret;
     88	u8 byte = 0;
     89	u8 data = 0;
     90
     91	mxl_i2c("()");
     92
     93	*pbyte = 0;
     94
     95	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
     96				 0x10 | SW_I2C_EN | SW_SDA_OUT);
     97	if (mxl_fail(ret))
     98		goto fail;
     99
    100	for (i = 0; i < 8; i++) {
    101		ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    102					 0x10 | SW_I2C_EN |
    103					 SW_SCL_OUT | SW_SDA_OUT);
    104		if (mxl_fail(ret))
    105			goto fail;
    106
    107		ret = mxl111sf_read_reg(state, SW_I2C_BUSY_ADDR, &data);
    108		if (mxl_fail(ret))
    109			goto fail;
    110
    111		if (data & SW_SDA_IN)
    112			byte |= (0x80 >> i);
    113
    114		ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    115					 0x10 | SW_I2C_EN | SW_SDA_OUT);
    116		if (mxl_fail(ret))
    117			goto fail;
    118	}
    119	*pbyte = byte;
    120fail:
    121	return ret;
    122}
    123
    124static int mxl111sf_i2c_start(struct mxl111sf_state *state)
    125{
    126	int ret;
    127
    128	mxl_i2c("()");
    129
    130	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    131				 0x10 | SW_I2C_EN | SW_SCL_OUT | SW_SDA_OUT);
    132	if (mxl_fail(ret))
    133		goto fail;
    134
    135	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    136				 0x10 | SW_I2C_EN | SW_SCL_OUT);
    137	if (mxl_fail(ret))
    138		goto fail;
    139
    140	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    141				 0x10 | SW_I2C_EN); /* start */
    142	mxl_fail(ret);
    143fail:
    144	return ret;
    145}
    146
    147static int mxl111sf_i2c_stop(struct mxl111sf_state *state)
    148{
    149	int ret;
    150
    151	mxl_i2c("()");
    152
    153	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    154				 0x10 | SW_I2C_EN); /* stop */
    155	if (mxl_fail(ret))
    156		goto fail;
    157
    158	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    159				 0x10 | SW_I2C_EN | SW_SCL_OUT);
    160	if (mxl_fail(ret))
    161		goto fail;
    162
    163	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    164				 0x10 | SW_I2C_EN | SW_SCL_OUT | SW_SDA_OUT);
    165	if (mxl_fail(ret))
    166		goto fail;
    167
    168	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    169				 0x10 | SW_SCL_OUT | SW_SDA_OUT);
    170	mxl_fail(ret);
    171fail:
    172	return ret;
    173}
    174
    175static int mxl111sf_i2c_ack(struct mxl111sf_state *state)
    176{
    177	int ret;
    178	u8 b = 0;
    179
    180	mxl_i2c("()");
    181
    182	ret = mxl111sf_read_reg(state, SW_I2C_BUSY_ADDR, &b);
    183	if (mxl_fail(ret))
    184		goto fail;
    185
    186	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    187				 0x10 | SW_I2C_EN);
    188	if (mxl_fail(ret))
    189		goto fail;
    190
    191	/* pull SDA low */
    192	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    193				 0x10 | SW_I2C_EN | SW_SCL_OUT);
    194	if (mxl_fail(ret))
    195		goto fail;
    196
    197	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    198				 0x10 | SW_I2C_EN | SW_SDA_OUT);
    199	mxl_fail(ret);
    200fail:
    201	return ret;
    202}
    203
    204static int mxl111sf_i2c_nack(struct mxl111sf_state *state)
    205{
    206	int ret;
    207
    208	mxl_i2c("()");
    209
    210	/* SDA high to signal last byte read from slave */
    211	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    212				 0x10 | SW_I2C_EN | SW_SCL_OUT | SW_SDA_OUT);
    213	if (mxl_fail(ret))
    214		goto fail;
    215
    216	ret = mxl111sf_write_reg(state, SW_I2C_ADDR,
    217				 0x10 | SW_I2C_EN | SW_SDA_OUT);
    218	mxl_fail(ret);
    219fail:
    220	return ret;
    221}
    222
    223/* ------------------------------------------------------------------------ */
    224
    225static int mxl111sf_i2c_sw_xfer_msg(struct mxl111sf_state *state,
    226				    struct i2c_msg *msg)
    227{
    228	int i, ret;
    229
    230	mxl_i2c("()");
    231
    232	if (msg->flags & I2C_M_RD) {
    233
    234		ret = mxl111sf_i2c_start(state);
    235		if (mxl_fail(ret))
    236			goto fail;
    237
    238		ret = mxl111sf_i2c_bitbang_sendbyte(state,
    239						    (msg->addr << 1) | 0x01);
    240		if (mxl_fail(ret)) {
    241			mxl111sf_i2c_stop(state);
    242			goto fail;
    243		}
    244
    245		for (i = 0; i < msg->len; i++) {
    246			ret = mxl111sf_i2c_bitbang_recvbyte(state,
    247							    &msg->buf[i]);
    248			if (mxl_fail(ret)) {
    249				mxl111sf_i2c_stop(state);
    250				goto fail;
    251			}
    252
    253			if (i < msg->len - 1)
    254				mxl111sf_i2c_ack(state);
    255		}
    256
    257		mxl111sf_i2c_nack(state);
    258
    259		ret = mxl111sf_i2c_stop(state);
    260		if (mxl_fail(ret))
    261			goto fail;
    262
    263	} else {
    264
    265		ret = mxl111sf_i2c_start(state);
    266		if (mxl_fail(ret))
    267			goto fail;
    268
    269		ret = mxl111sf_i2c_bitbang_sendbyte(state,
    270						    (msg->addr << 1) & 0xfe);
    271		if (mxl_fail(ret)) {
    272			mxl111sf_i2c_stop(state);
    273			goto fail;
    274		}
    275
    276		for (i = 0; i < msg->len; i++) {
    277			ret = mxl111sf_i2c_bitbang_sendbyte(state,
    278							    msg->buf[i]);
    279			if (mxl_fail(ret)) {
    280				mxl111sf_i2c_stop(state);
    281				goto fail;
    282			}
    283		}
    284
    285		/* FIXME: we only want to do this on the last transaction */
    286		mxl111sf_i2c_stop(state);
    287	}
    288fail:
    289	return ret;
    290}
    291
    292/* HW-I2C ----------------------------------------------------------------- */
    293
    294#define USB_WRITE_I2C_CMD     0x99
    295#define USB_READ_I2C_CMD      0xdd
    296#define USB_END_I2C_CMD       0xfe
    297
    298#define USB_WRITE_I2C_CMD_LEN   26
    299#define USB_READ_I2C_CMD_LEN    24
    300
    301#define I2C_MUX_REG           0x30
    302#define I2C_CONTROL_REG       0x00
    303#define I2C_SLAVE_ADDR_REG    0x08
    304#define I2C_DATA_REG          0x0c
    305#define I2C_INT_STATUS_REG    0x10
    306
    307static int mxl111sf_i2c_send_data(struct mxl111sf_state *state,
    308				  u8 index, u8 *wdata)
    309{
    310	int ret = mxl111sf_ctrl_msg(state, wdata[0],
    311				    &wdata[1], 25, NULL, 0);
    312	mxl_fail(ret);
    313
    314	return ret;
    315}
    316
    317static int mxl111sf_i2c_get_data(struct mxl111sf_state *state,
    318				 u8 index, u8 *wdata, u8 *rdata)
    319{
    320	int ret = mxl111sf_ctrl_msg(state, wdata[0],
    321				    &wdata[1], 25, rdata, 24);
    322	mxl_fail(ret);
    323
    324	return ret;
    325}
    326
    327static u8 mxl111sf_i2c_check_status(struct mxl111sf_state *state)
    328{
    329	u8 status = 0;
    330	u8 buf[26];
    331
    332	mxl_i2c_adv("()");
    333
    334	buf[0] = USB_READ_I2C_CMD;
    335	buf[1] = 0x00;
    336
    337	buf[2] = I2C_INT_STATUS_REG;
    338	buf[3] = 0x00;
    339	buf[4] = 0x00;
    340
    341	buf[5] = USB_END_I2C_CMD;
    342
    343	mxl111sf_i2c_get_data(state, 0, buf, buf);
    344
    345	if (buf[1] & 0x04)
    346		status = 1;
    347
    348	return status;
    349}
    350
    351static u8 mxl111sf_i2c_check_fifo(struct mxl111sf_state *state)
    352{
    353	u8 status = 0;
    354	u8 buf[26];
    355
    356	mxl_i2c("()");
    357
    358	buf[0] = USB_READ_I2C_CMD;
    359	buf[1] = 0x00;
    360
    361	buf[2] = I2C_MUX_REG;
    362	buf[3] = 0x00;
    363	buf[4] = 0x00;
    364
    365	buf[5] = I2C_INT_STATUS_REG;
    366	buf[6] = 0x00;
    367	buf[7] = 0x00;
    368	buf[8] = USB_END_I2C_CMD;
    369
    370	mxl111sf_i2c_get_data(state, 0, buf, buf);
    371
    372	if (0x08 == (buf[1] & 0x08))
    373		status = 1;
    374
    375	if ((buf[5] & 0x02) == 0x02)
    376		mxl_i2c("(buf[5] & 0x02) == 0x02"); /* FIXME */
    377
    378	return status;
    379}
    380
    381static int mxl111sf_i2c_readagain(struct mxl111sf_state *state,
    382				  u8 count, u8 *rbuf)
    383{
    384	u8 i2c_w_data[26];
    385	u8 i2c_r_data[24];
    386	u8 i = 0;
    387	u8 fifo_status = 0;
    388	int status = 0;
    389
    390	mxl_i2c("read %d bytes", count);
    391
    392	while ((fifo_status == 0) && (i++ < 5))
    393		fifo_status = mxl111sf_i2c_check_fifo(state);
    394
    395	i2c_w_data[0] = 0xDD;
    396	i2c_w_data[1] = 0x00;
    397
    398	for (i = 2; i < 26; i++)
    399		i2c_w_data[i] = 0xFE;
    400
    401	for (i = 0; i < count; i++) {
    402		i2c_w_data[2+(i*3)] = 0x0C;
    403		i2c_w_data[3+(i*3)] = 0x00;
    404		i2c_w_data[4+(i*3)] = 0x00;
    405	}
    406
    407	mxl111sf_i2c_get_data(state, 0, i2c_w_data, i2c_r_data);
    408
    409	/* Check for I2C NACK status */
    410	if (mxl111sf_i2c_check_status(state) == 1) {
    411		mxl_i2c("error!");
    412	} else {
    413		for (i = 0; i < count; i++) {
    414			rbuf[i] = i2c_r_data[(i*3)+1];
    415			mxl_i2c("%02x\t %02x",
    416				i2c_r_data[(i*3)+1],
    417				i2c_r_data[(i*3)+2]);
    418		}
    419
    420		status = 1;
    421	}
    422
    423	return status;
    424}
    425
    426#define HWI2C400 1
    427static int mxl111sf_i2c_hw_xfer_msg(struct mxl111sf_state *state,
    428				    struct i2c_msg *msg)
    429{
    430	int i, k, ret = 0;
    431	u16 index = 0;
    432	u8 buf[26];
    433	u8 i2c_r_data[24];
    434	u16 block_len;
    435	u16 left_over_len;
    436	u8 rd_status[8];
    437	u8 ret_status;
    438	u8 readbuff[26];
    439
    440	mxl_i2c("addr: 0x%02x, read buff len: %d, write buff len: %d",
    441		msg->addr, (msg->flags & I2C_M_RD) ? msg->len : 0,
    442		(!(msg->flags & I2C_M_RD)) ? msg->len : 0);
    443
    444	for (index = 0; index < 26; index++)
    445		buf[index] = USB_END_I2C_CMD;
    446
    447	/* command to indicate data payload is destined for I2C interface */
    448	buf[0] = USB_WRITE_I2C_CMD;
    449	buf[1] = 0x00;
    450
    451	/* enable I2C interface */
    452	buf[2] = I2C_MUX_REG;
    453	buf[3] = 0x80;
    454	buf[4] = 0x00;
    455
    456	/* enable I2C interface */
    457	buf[5] = I2C_MUX_REG;
    458	buf[6] = 0x81;
    459	buf[7] = 0x00;
    460
    461	/* set Timeout register on I2C interface */
    462	buf[8] = 0x14;
    463	buf[9] = 0xff;
    464	buf[10] = 0x00;
    465#if 0
    466	/* enable Interrupts on I2C interface */
    467	buf[8] = 0x24;
    468	buf[9] = 0xF7;
    469	buf[10] = 0x00;
    470#endif
    471	buf[11] = 0x24;
    472	buf[12] = 0xF7;
    473	buf[13] = 0x00;
    474
    475	ret = mxl111sf_i2c_send_data(state, 0, buf);
    476
    477	/* write data on I2C bus */
    478	if (!(msg->flags & I2C_M_RD) && (msg->len > 0)) {
    479		mxl_i2c("%d\t%02x", msg->len, msg->buf[0]);
    480
    481		/* control register on I2C interface to initialize I2C bus */
    482		buf[2] = I2C_CONTROL_REG;
    483		buf[3] = 0x5E;
    484		buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    485
    486		/* I2C Slave device Address */
    487		buf[5] = I2C_SLAVE_ADDR_REG;
    488		buf[6] = (msg->addr);
    489		buf[7] = 0x00;
    490		buf[8] = USB_END_I2C_CMD;
    491		ret = mxl111sf_i2c_send_data(state, 0, buf);
    492
    493		/* check for slave device status */
    494		if (mxl111sf_i2c_check_status(state) == 1) {
    495			mxl_i2c("NACK writing slave address %02x",
    496				msg->addr);
    497			/* if NACK, stop I2C bus and exit */
    498			buf[2] = I2C_CONTROL_REG;
    499			buf[3] = 0x4E;
    500			buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    501			ret = -EIO;
    502			goto exit;
    503		}
    504
    505		/* I2C interface can do I2C operations in block of 8 bytes of
    506		   I2C data. calculation to figure out number of blocks of i2c
    507		   data required to program */
    508		block_len = (msg->len / 8);
    509		left_over_len = (msg->len % 8);
    510
    511		mxl_i2c("block_len %d, left_over_len %d",
    512			block_len, left_over_len);
    513
    514		for (index = 0; index < block_len; index++) {
    515			for (i = 0; i < 8; i++) {
    516				/* write data on I2C interface */
    517				buf[2+(i*3)] = I2C_DATA_REG;
    518				buf[3+(i*3)] = msg->buf[(index*8)+i];
    519				buf[4+(i*3)] = 0x00;
    520			}
    521
    522			ret = mxl111sf_i2c_send_data(state, 0, buf);
    523
    524			/* check for I2C NACK status */
    525			if (mxl111sf_i2c_check_status(state) == 1) {
    526				mxl_i2c("NACK writing slave address %02x",
    527					msg->addr);
    528
    529				/* if NACK, stop I2C bus and exit */
    530				buf[2] = I2C_CONTROL_REG;
    531				buf[3] = 0x4E;
    532				buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    533				ret = -EIO;
    534				goto exit;
    535			}
    536
    537		}
    538
    539		if (left_over_len) {
    540			for (k = 0; k < 26; k++)
    541				buf[k] = USB_END_I2C_CMD;
    542
    543			buf[0] = 0x99;
    544			buf[1] = 0x00;
    545
    546			for (i = 0; i < left_over_len; i++) {
    547				buf[2+(i*3)] = I2C_DATA_REG;
    548				buf[3+(i*3)] = msg->buf[(index*8)+i];
    549				mxl_i2c("index = %d %d data %d",
    550					index, i, msg->buf[(index*8)+i]);
    551				buf[4+(i*3)] = 0x00;
    552			}
    553			ret = mxl111sf_i2c_send_data(state, 0, buf);
    554
    555			/* check for I2C NACK status */
    556			if (mxl111sf_i2c_check_status(state) == 1) {
    557				mxl_i2c("NACK writing slave address %02x",
    558					msg->addr);
    559
    560				/* if NACK, stop I2C bus and exit */
    561				buf[2] = I2C_CONTROL_REG;
    562				buf[3] = 0x4E;
    563				buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    564				ret = -EIO;
    565				goto exit;
    566			}
    567
    568		}
    569
    570		/* issue I2C STOP after write */
    571		buf[2] = I2C_CONTROL_REG;
    572		buf[3] = 0x4E;
    573		buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    574
    575	}
    576
    577	/* read data from I2C bus */
    578	if ((msg->flags & I2C_M_RD) && (msg->len > 0)) {
    579		mxl_i2c("read buf len %d", msg->len);
    580
    581		/* command to indicate data payload is
    582		   destined for I2C interface */
    583		buf[2] = I2C_CONTROL_REG;
    584		buf[3] = 0xDF;
    585		buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    586
    587		/* I2C xfer length */
    588		buf[5] = 0x14;
    589		buf[6] = (msg->len & 0xFF);
    590		buf[7] = 0;
    591
    592		/* I2C slave device Address */
    593		buf[8] = I2C_SLAVE_ADDR_REG;
    594		buf[9] = msg->addr;
    595		buf[10] = 0x00;
    596		buf[11] = USB_END_I2C_CMD;
    597		ret = mxl111sf_i2c_send_data(state, 0, buf);
    598
    599		/* check for I2C NACK status */
    600		if (mxl111sf_i2c_check_status(state) == 1) {
    601			mxl_i2c("NACK reading slave address %02x",
    602				msg->addr);
    603
    604			/* if NACK, stop I2C bus and exit */
    605			buf[2] = I2C_CONTROL_REG;
    606			buf[3] = 0xC7;
    607			buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    608			ret = -EIO;
    609			goto exit;
    610		}
    611
    612		/* I2C interface can do I2C operations in block of 8 bytes of
    613		   I2C data. calculation to figure out number of blocks of
    614		   i2c data required to program */
    615		block_len = ((msg->len) / 8);
    616		left_over_len = ((msg->len) % 8);
    617		index = 0;
    618
    619		mxl_i2c("block_len %d, left_over_len %d",
    620			block_len, left_over_len);
    621
    622		/* command to read data from I2C interface */
    623		buf[0] = USB_READ_I2C_CMD;
    624		buf[1] = 0x00;
    625
    626		for (index = 0; index < block_len; index++) {
    627			/* setup I2C read request packet on I2C interface */
    628			for (i = 0; i < 8; i++) {
    629				buf[2+(i*3)] = I2C_DATA_REG;
    630				buf[3+(i*3)] = 0x00;
    631				buf[4+(i*3)] = 0x00;
    632			}
    633
    634			ret = mxl111sf_i2c_get_data(state, 0, buf, i2c_r_data);
    635
    636			/* check for I2C NACK status */
    637			if (mxl111sf_i2c_check_status(state) == 1) {
    638				mxl_i2c("NACK reading slave address %02x",
    639					msg->addr);
    640
    641				/* if NACK, stop I2C bus and exit */
    642				buf[2] = I2C_CONTROL_REG;
    643				buf[3] = 0xC7;
    644				buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    645				ret = -EIO;
    646				goto exit;
    647			}
    648
    649			/* copy data from i2c data payload to read buffer */
    650			for (i = 0; i < 8; i++) {
    651				rd_status[i] = i2c_r_data[(i*3)+2];
    652
    653				if (rd_status[i] == 0x04) {
    654					if (i < 7) {
    655						mxl_i2c("i2c fifo empty! @ %d",
    656							i);
    657						msg->buf[(index*8)+i] =
    658							i2c_r_data[(i*3)+1];
    659						/* read again */
    660						ret_status =
    661							mxl111sf_i2c_readagain(
    662								state, 8-(i+1),
    663								readbuff);
    664						if (ret_status == 1) {
    665							for (k = 0;
    666							     k < 8-(i+1);
    667							     k++) {
    668
    669					msg->buf[(index*8)+(k+i+1)] =
    670						readbuff[k];
    671					mxl_i2c("read data: %02x\t %02x",
    672						msg->buf[(index*8)+(k+i)],
    673						(index*8)+(k+i));
    674					mxl_i2c("read data: %02x\t %02x",
    675						msg->buf[(index*8)+(k+i+1)],
    676						readbuff[k]);
    677
    678							}
    679							goto stop_copy;
    680						} else {
    681							mxl_i2c("readagain ERROR!");
    682						}
    683					} else {
    684						msg->buf[(index*8)+i] =
    685							i2c_r_data[(i*3)+1];
    686					}
    687				} else {
    688					msg->buf[(index*8)+i] =
    689						i2c_r_data[(i*3)+1];
    690				}
    691			}
    692stop_copy:
    693			;
    694
    695		}
    696
    697		if (left_over_len) {
    698			for (k = 0; k < 26; k++)
    699				buf[k] = USB_END_I2C_CMD;
    700
    701			buf[0] = 0xDD;
    702			buf[1] = 0x00;
    703
    704			for (i = 0; i < left_over_len; i++) {
    705				buf[2+(i*3)] = I2C_DATA_REG;
    706				buf[3+(i*3)] = 0x00;
    707				buf[4+(i*3)] = 0x00;
    708			}
    709			ret = mxl111sf_i2c_get_data(state, 0, buf,
    710						    i2c_r_data);
    711
    712			/* check for I2C NACK status */
    713			if (mxl111sf_i2c_check_status(state) == 1) {
    714				mxl_i2c("NACK reading slave address %02x",
    715					msg->addr);
    716
    717				/* if NACK, stop I2C bus and exit */
    718				buf[2] = I2C_CONTROL_REG;
    719				buf[3] = 0xC7;
    720				buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    721				ret = -EIO;
    722				goto exit;
    723			}
    724
    725			for (i = 0; i < left_over_len; i++) {
    726				msg->buf[(block_len*8)+i] =
    727					i2c_r_data[(i*3)+1];
    728				mxl_i2c("read data: %02x\t %02x",
    729					i2c_r_data[(i*3)+1],
    730					i2c_r_data[(i*3)+2]);
    731			}
    732		}
    733
    734		/* indicate I2C interface to issue NACK
    735		   after next I2C read op */
    736		buf[0] = USB_WRITE_I2C_CMD;
    737		buf[1] = 0x00;
    738
    739		/* control register */
    740		buf[2] = I2C_CONTROL_REG;
    741		buf[3] = 0x17;
    742		buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    743
    744		buf[5] = USB_END_I2C_CMD;
    745		ret = mxl111sf_i2c_send_data(state, 0, buf);
    746
    747		/* control register */
    748		buf[2] = I2C_CONTROL_REG;
    749		buf[3] = 0xC7;
    750		buf[4] = (HWI2C400) ? 0x03 : 0x0D;
    751
    752	}
    753exit:
    754	/* STOP and disable I2C MUX */
    755	buf[0] = USB_WRITE_I2C_CMD;
    756	buf[1] = 0x00;
    757
    758	/* de-initilize I2C BUS */
    759	buf[5] = USB_END_I2C_CMD;
    760	mxl111sf_i2c_send_data(state, 0, buf);
    761
    762	/* Control Register */
    763	buf[2] = I2C_CONTROL_REG;
    764	buf[3] = 0xDF;
    765	buf[4] = 0x03;
    766
    767	/* disable I2C interface */
    768	buf[5] = I2C_MUX_REG;
    769	buf[6] = 0x00;
    770	buf[7] = 0x00;
    771
    772	/* de-initilize I2C BUS */
    773	buf[8] = USB_END_I2C_CMD;
    774	mxl111sf_i2c_send_data(state, 0, buf);
    775
    776	/* disable I2C interface */
    777	buf[2] = I2C_MUX_REG;
    778	buf[3] = 0x81;
    779	buf[4] = 0x00;
    780
    781	/* disable I2C interface */
    782	buf[5] = I2C_MUX_REG;
    783	buf[6] = 0x00;
    784	buf[7] = 0x00;
    785
    786	/* disable I2C interface */
    787	buf[8] = I2C_MUX_REG;
    788	buf[9] = 0x00;
    789	buf[10] = 0x00;
    790
    791	buf[11] = USB_END_I2C_CMD;
    792	mxl111sf_i2c_send_data(state, 0, buf);
    793
    794	return ret;
    795}
    796
    797/* ------------------------------------------------------------------------ */
    798
    799int mxl111sf_i2c_xfer(struct i2c_adapter *adap,
    800		      struct i2c_msg msg[], int num)
    801{
    802	struct dvb_usb_device *d = i2c_get_adapdata(adap);
    803	struct mxl111sf_state *state = d->priv;
    804	int hwi2c = (state->chip_rev > MXL111SF_V6);
    805	int i, ret;
    806
    807	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
    808		return -EAGAIN;
    809
    810	for (i = 0; i < num; i++) {
    811		ret = (hwi2c) ?
    812			mxl111sf_i2c_hw_xfer_msg(state, &msg[i]) :
    813			mxl111sf_i2c_sw_xfer_msg(state, &msg[i]);
    814		if (mxl_fail(ret)) {
    815			mxl_debug_adv("failed with error %d on i2c transaction %d of %d, %sing %d bytes to/from 0x%02x",
    816				      ret, i+1, num,
    817				      (msg[i].flags & I2C_M_RD) ?
    818				      "read" : "writ",
    819				      msg[i].len, msg[i].addr);
    820
    821			break;
    822		}
    823	}
    824
    825	mutex_unlock(&d->i2c_mutex);
    826
    827	return i == num ? num : -EREMOTEIO;
    828}