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

ivtv-i2c.c (20469B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3    I2C functions
      4    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
      5    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
      6
      7 */
      8
      9/*
     10    This file includes an i2c implementation that was reverse engineered
     11    from the Hauppauge windows driver.  Older ivtv versions used i2c-algo-bit,
     12    which whilst fine under most circumstances, had trouble with the Zilog
     13    CPU on the PVR-150 which handles IR functions (occasional inability to
     14    communicate with the chip until it was reset) and also with the i2c
     15    bus being completely unreachable when multiple PVR cards were present.
     16
     17    The implementation is very similar to i2c-algo-bit, but there are enough
     18    subtle differences that the two are hard to merge.  The general strategy
     19    employed by i2c-algo-bit is to use udelay() to implement the timing
     20    when putting out bits on the scl/sda lines.  The general strategy taken
     21    here is to poll the lines for state changes (see ivtv_waitscl and
     22    ivtv_waitsda).  In addition there are small delays at various locations
     23    which poll the SCL line 5 times (ivtv_scldelay).  I would guess that
     24    since this is memory mapped I/O that the length of those delays is tied
     25    to the PCI bus clock.  There is some extra code to do with recovery
     26    and retries.  Since it is not known what causes the actual i2c problems
     27    in the first place, the only goal if one was to attempt to use
     28    i2c-algo-bit would be to try to make it follow the same code path.
     29    This would be a lot of work, and I'm also not convinced that it would
     30    provide a generic benefit to i2c-algo-bit.  Therefore consider this
     31    an engineering solution -- not pretty, but it works.
     32
     33    Some more general comments about what we are doing:
     34
     35    The i2c bus is a 2 wire serial bus, with clock (SCL) and data (SDA)
     36    lines.  To communicate on the bus (as a master, we don't act as a slave),
     37    we first initiate a start condition (ivtv_start).  We then write the
     38    address of the device that we want to communicate with, along with a flag
     39    that indicates whether this is a read or a write.  The slave then issues
     40    an ACK signal (ivtv_ack), which tells us that it is ready for reading /
     41    writing.  We then proceed with reading or writing (ivtv_read/ivtv_write),
     42    and finally issue a stop condition (ivtv_stop) to make the bus available
     43    to other masters.
     44
     45    There is an additional form of transaction where a write may be
     46    immediately followed by a read.  In this case, there is no intervening
     47    stop condition.  (Only the msp3400 chip uses this method of data transfer).
     48 */
     49
     50#include "ivtv-driver.h"
     51#include "ivtv-cards.h"
     52#include "ivtv-gpio.h"
     53#include "ivtv-i2c.h"
     54#include <media/drv-intf/cx25840.h>
     55
     56/* i2c implementation for cx23415/6 chip, ivtv project.
     57 * Author: Kevin Thayer (nufan_wfk at yahoo.com)
     58 */
     59/* i2c stuff */
     60#define IVTV_REG_I2C_SETSCL_OFFSET 0x7000
     61#define IVTV_REG_I2C_SETSDA_OFFSET 0x7004
     62#define IVTV_REG_I2C_GETSCL_OFFSET 0x7008
     63#define IVTV_REG_I2C_GETSDA_OFFSET 0x700c
     64
     65#define IVTV_CS53L32A_I2C_ADDR		0x11
     66#define IVTV_M52790_I2C_ADDR		0x48
     67#define IVTV_CX25840_I2C_ADDR		0x44
     68#define IVTV_SAA7115_I2C_ADDR		0x21
     69#define IVTV_SAA7127_I2C_ADDR		0x44
     70#define IVTV_SAA717x_I2C_ADDR		0x21
     71#define IVTV_MSP3400_I2C_ADDR		0x40
     72#define IVTV_HAUPPAUGE_I2C_ADDR		0x50
     73#define IVTV_WM8739_I2C_ADDR		0x1a
     74#define IVTV_WM8775_I2C_ADDR		0x1b
     75#define IVTV_TEA5767_I2C_ADDR		0x60
     76#define IVTV_UPD64031A_I2C_ADDR		0x12
     77#define IVTV_UPD64083_I2C_ADDR		0x5c
     78#define IVTV_VP27SMPX_I2C_ADDR		0x5b
     79#define IVTV_M52790_I2C_ADDR		0x48
     80#define IVTV_AVERMEDIA_IR_RX_I2C_ADDR	0x40
     81#define IVTV_HAUP_EXT_IR_RX_I2C_ADDR	0x1a
     82#define IVTV_HAUP_INT_IR_RX_I2C_ADDR	0x18
     83#define IVTV_Z8F0811_IR_TX_I2C_ADDR	0x70
     84#define IVTV_Z8F0811_IR_RX_I2C_ADDR	0x71
     85#define IVTV_ADAPTEC_IR_ADDR		0x6b
     86
     87/* This array should match the IVTV_HW_ defines */
     88static const u8 hw_addrs[IVTV_HW_MAX_BITS] = {
     89	IVTV_CX25840_I2C_ADDR,
     90	IVTV_SAA7115_I2C_ADDR,
     91	IVTV_SAA7127_I2C_ADDR,
     92	IVTV_MSP3400_I2C_ADDR,
     93	0,
     94	IVTV_WM8775_I2C_ADDR,
     95	IVTV_CS53L32A_I2C_ADDR,
     96	0,
     97	IVTV_SAA7115_I2C_ADDR,
     98	IVTV_UPD64031A_I2C_ADDR,
     99	IVTV_UPD64083_I2C_ADDR,
    100	IVTV_SAA717x_I2C_ADDR,
    101	IVTV_WM8739_I2C_ADDR,
    102	IVTV_VP27SMPX_I2C_ADDR,
    103	IVTV_M52790_I2C_ADDR,
    104	0,				/* IVTV_HW_GPIO dummy driver ID */
    105	IVTV_AVERMEDIA_IR_RX_I2C_ADDR,	/* IVTV_HW_I2C_IR_RX_AVER */
    106	IVTV_HAUP_EXT_IR_RX_I2C_ADDR,	/* IVTV_HW_I2C_IR_RX_HAUP_EXT */
    107	IVTV_HAUP_INT_IR_RX_I2C_ADDR,	/* IVTV_HW_I2C_IR_RX_HAUP_INT */
    108	IVTV_Z8F0811_IR_RX_I2C_ADDR,	/* IVTV_HW_Z8F0811_IR_HAUP */
    109	IVTV_ADAPTEC_IR_ADDR,		/* IVTV_HW_I2C_IR_RX_ADAPTEC */
    110};
    111
    112/* This array should match the IVTV_HW_ defines */
    113static const char * const hw_devicenames[IVTV_HW_MAX_BITS] = {
    114	"cx25840",
    115	"saa7115",
    116	"saa7127_auto",	/* saa7127 or saa7129 */
    117	"msp3400",
    118	"tuner",
    119	"wm8775",
    120	"cs53l32a",
    121	"tveeprom",
    122	"saa7114",
    123	"upd64031a",
    124	"upd64083",
    125	"saa717x",
    126	"wm8739",
    127	"vp27smpx",
    128	"m52790",
    129	"gpio",
    130	"ir_video",		/* IVTV_HW_I2C_IR_RX_AVER */
    131	"ir_video",		/* IVTV_HW_I2C_IR_RX_HAUP_EXT */
    132	"ir_video",		/* IVTV_HW_I2C_IR_RX_HAUP_INT */
    133	"ir_z8f0811_haup",	/* IVTV_HW_Z8F0811_IR_HAUP */
    134	"ir_video",		/* IVTV_HW_I2C_IR_RX_ADAPTEC */
    135};
    136
    137static int get_key_adaptec(struct IR_i2c *ir, enum rc_proto *protocol,
    138			   u32 *scancode, u8 *toggle)
    139{
    140	unsigned char keybuf[4];
    141
    142	keybuf[0] = 0x00;
    143	i2c_master_send(ir->c, keybuf, 1);
    144	/* poll IR chip */
    145	if (i2c_master_recv(ir->c, keybuf, sizeof(keybuf)) != sizeof(keybuf)) {
    146		return 0;
    147	}
    148
    149	/* key pressed ? */
    150	if (keybuf[2] == 0xff)
    151		return 0;
    152
    153	/* remove repeat bit */
    154	keybuf[2] &= 0x7f;
    155	keybuf[3] |= 0x80;
    156
    157	*protocol = RC_PROTO_UNKNOWN;
    158	*scancode = keybuf[3] | keybuf[2] << 8 | keybuf[1] << 16 |keybuf[0] << 24;
    159	*toggle = 0;
    160	return 1;
    161}
    162
    163static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr)
    164{
    165	struct i2c_board_info info;
    166	struct i2c_adapter *adap = &itv->i2c_adap;
    167	struct IR_i2c_init_data *init_data = &itv->ir_i2c_init_data;
    168	unsigned short addr_list[2] = { addr, I2C_CLIENT_END };
    169
    170	/* Only allow one IR receiver to be registered per board */
    171	if (itv->hw_flags & IVTV_HW_IR_ANY)
    172		return -1;
    173
    174	/* Our default information for ir-kbd-i2c.c to use */
    175	switch (hw) {
    176	case IVTV_HW_I2C_IR_RX_AVER:
    177		init_data->ir_codes = RC_MAP_AVERMEDIA_CARDBUS;
    178		init_data->internal_get_key_func =
    179					IR_KBD_GET_KEY_AVERMEDIA_CARDBUS;
    180		init_data->type = RC_PROTO_BIT_OTHER;
    181		init_data->name = "AVerMedia AVerTV card";
    182		break;
    183	case IVTV_HW_I2C_IR_RX_HAUP_EXT:
    184	case IVTV_HW_I2C_IR_RX_HAUP_INT:
    185		init_data->ir_codes = RC_MAP_HAUPPAUGE;
    186		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP;
    187		init_data->type = RC_PROTO_BIT_RC5;
    188		init_data->name = itv->card_name;
    189		break;
    190	case IVTV_HW_Z8F0811_IR_HAUP:
    191		/* Default to grey remote */
    192		init_data->ir_codes = RC_MAP_HAUPPAUGE;
    193		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
    194		init_data->type = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE |
    195							RC_PROTO_BIT_RC6_6A_32;
    196		init_data->name = itv->card_name;
    197		break;
    198	case IVTV_HW_I2C_IR_RX_ADAPTEC:
    199		init_data->get_key = get_key_adaptec;
    200		init_data->name = itv->card_name;
    201		/* FIXME: The protocol and RC_MAP needs to be corrected */
    202		init_data->ir_codes = RC_MAP_EMPTY;
    203		init_data->type = RC_PROTO_BIT_UNKNOWN;
    204		break;
    205	}
    206
    207	memset(&info, 0, sizeof(struct i2c_board_info));
    208	info.platform_data = init_data;
    209	strscpy(info.type, type, I2C_NAME_SIZE);
    210
    211	return IS_ERR(i2c_new_scanned_device(adap, &info, addr_list, NULL)) ?
    212	       -1 : 0;
    213}
    214
    215/* Instantiate the IR receiver device using probing -- undesirable */
    216void ivtv_i2c_new_ir_legacy(struct ivtv *itv)
    217{
    218	struct i2c_board_info info;
    219	/*
    220	 * The external IR receiver is at i2c address 0x34.
    221	 * The internal IR receiver is at i2c address 0x30.
    222	 *
    223	 * In theory, both can be fitted, and Hauppauge suggests an external
    224	 * overrides an internal.  That's why we probe 0x1a (~0x34) first. CB
    225	 *
    226	 * Some of these addresses we probe may collide with other i2c address
    227	 * allocations, so this function must be called after all other i2c
    228	 * devices we care about are registered.
    229	 */
    230	static const unsigned short addr_list[] = {
    231		0x1a,	/* Hauppauge IR external - collides with WM8739 */
    232		0x18,	/* Hauppauge IR internal */
    233		I2C_CLIENT_END
    234	};
    235
    236	memset(&info, 0, sizeof(struct i2c_board_info));
    237	strscpy(info.type, "ir_video", I2C_NAME_SIZE);
    238	i2c_new_scanned_device(&itv->i2c_adap, &info, addr_list, NULL);
    239}
    240
    241int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
    242{
    243	struct i2c_adapter *adap = &itv->i2c_adap;
    244	struct v4l2_subdev *sd;
    245	const char *type;
    246	u32 hw;
    247
    248	if (idx >= IVTV_HW_MAX_BITS)
    249		return -ENODEV;
    250
    251	type = hw_devicenames[idx];
    252	hw = 1 << idx;
    253
    254	if (hw == IVTV_HW_TUNER) {
    255		/* special tuner handling */
    256		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, adap, type, 0,
    257				itv->card_i2c->radio);
    258		if (sd)
    259			sd->grp_id = 1 << idx;
    260		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, adap, type, 0,
    261				itv->card_i2c->demod);
    262		if (sd)
    263			sd->grp_id = 1 << idx;
    264		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, adap, type, 0,
    265				itv->card_i2c->tv);
    266		if (sd)
    267			sd->grp_id = 1 << idx;
    268		return sd ? 0 : -1;
    269	}
    270
    271	if (hw & IVTV_HW_IR_ANY)
    272		return ivtv_i2c_new_ir(itv, hw, type, hw_addrs[idx]);
    273
    274	/* Is it not an I2C device or one we do not wish to register? */
    275	if (!hw_addrs[idx])
    276		return -1;
    277
    278	/* It's an I2C device other than an analog tuner or IR chip */
    279	if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) {
    280		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
    281				adap, type, 0, I2C_ADDRS(hw_addrs[idx]));
    282	} else if (hw == IVTV_HW_CX25840) {
    283		struct cx25840_platform_data pdata;
    284		struct i2c_board_info cx25840_info = {
    285			.type = "cx25840",
    286			.addr = hw_addrs[idx],
    287			.platform_data = &pdata,
    288		};
    289
    290		memset(&pdata, 0, sizeof(pdata));
    291		pdata.pvr150_workaround = itv->pvr150_workaround;
    292		sd = v4l2_i2c_new_subdev_board(&itv->v4l2_dev, adap,
    293				&cx25840_info, NULL);
    294	} else {
    295		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
    296				adap, type, hw_addrs[idx], NULL);
    297	}
    298	if (sd)
    299		sd->grp_id = 1 << idx;
    300	return sd ? 0 : -1;
    301}
    302
    303struct v4l2_subdev *ivtv_find_hw(struct ivtv *itv, u32 hw)
    304{
    305	struct v4l2_subdev *result = NULL;
    306	struct v4l2_subdev *sd;
    307
    308	spin_lock(&itv->v4l2_dev.lock);
    309	v4l2_device_for_each_subdev(sd, &itv->v4l2_dev) {
    310		if (sd->grp_id == hw) {
    311			result = sd;
    312			break;
    313		}
    314	}
    315	spin_unlock(&itv->v4l2_dev.lock);
    316	return result;
    317}
    318
    319/* Set the serial clock line to the desired state */
    320static void ivtv_setscl(struct ivtv *itv, int state)
    321{
    322	/* write them out */
    323	/* write bits are inverted */
    324	write_reg(~state, IVTV_REG_I2C_SETSCL_OFFSET);
    325}
    326
    327/* Set the serial data line to the desired state */
    328static void ivtv_setsda(struct ivtv *itv, int state)
    329{
    330	/* write them out */
    331	/* write bits are inverted */
    332	write_reg(~state & 1, IVTV_REG_I2C_SETSDA_OFFSET);
    333}
    334
    335/* Read the serial clock line */
    336static int ivtv_getscl(struct ivtv *itv)
    337{
    338	return read_reg(IVTV_REG_I2C_GETSCL_OFFSET) & 1;
    339}
    340
    341/* Read the serial data line */
    342static int ivtv_getsda(struct ivtv *itv)
    343{
    344	return read_reg(IVTV_REG_I2C_GETSDA_OFFSET) & 1;
    345}
    346
    347/* Implement a short delay by polling the serial clock line */
    348static void ivtv_scldelay(struct ivtv *itv)
    349{
    350	int i;
    351
    352	for (i = 0; i < 5; ++i)
    353		ivtv_getscl(itv);
    354}
    355
    356/* Wait for the serial clock line to become set to a specific value */
    357static int ivtv_waitscl(struct ivtv *itv, int val)
    358{
    359	int i;
    360
    361	ivtv_scldelay(itv);
    362	for (i = 0; i < 1000; ++i) {
    363		if (ivtv_getscl(itv) == val)
    364			return 1;
    365	}
    366	return 0;
    367}
    368
    369/* Wait for the serial data line to become set to a specific value */
    370static int ivtv_waitsda(struct ivtv *itv, int val)
    371{
    372	int i;
    373
    374	ivtv_scldelay(itv);
    375	for (i = 0; i < 1000; ++i) {
    376		if (ivtv_getsda(itv) == val)
    377			return 1;
    378	}
    379	return 0;
    380}
    381
    382/* Wait for the slave to issue an ACK */
    383static int ivtv_ack(struct ivtv *itv)
    384{
    385	int ret = 0;
    386
    387	if (ivtv_getscl(itv) == 1) {
    388		IVTV_DEBUG_HI_I2C("SCL was high starting an ack\n");
    389		ivtv_setscl(itv, 0);
    390		if (!ivtv_waitscl(itv, 0)) {
    391			IVTV_DEBUG_I2C("Could not set SCL low starting an ack\n");
    392			return -EREMOTEIO;
    393		}
    394	}
    395	ivtv_setsda(itv, 1);
    396	ivtv_scldelay(itv);
    397	ivtv_setscl(itv, 1);
    398	if (!ivtv_waitsda(itv, 0)) {
    399		IVTV_DEBUG_I2C("Slave did not ack\n");
    400		ret = -EREMOTEIO;
    401	}
    402	ivtv_setscl(itv, 0);
    403	if (!ivtv_waitscl(itv, 0)) {
    404		IVTV_DEBUG_I2C("Failed to set SCL low after ACK\n");
    405		ret = -EREMOTEIO;
    406	}
    407	return ret;
    408}
    409
    410/* Write a single byte to the i2c bus and wait for the slave to ACK */
    411static int ivtv_sendbyte(struct ivtv *itv, unsigned char byte)
    412{
    413	int i, bit;
    414
    415	IVTV_DEBUG_HI_I2C("write %x\n",byte);
    416	for (i = 0; i < 8; ++i, byte<<=1) {
    417		ivtv_setscl(itv, 0);
    418		if (!ivtv_waitscl(itv, 0)) {
    419			IVTV_DEBUG_I2C("Error setting SCL low\n");
    420			return -EREMOTEIO;
    421		}
    422		bit = (byte>>7)&1;
    423		ivtv_setsda(itv, bit);
    424		if (!ivtv_waitsda(itv, bit)) {
    425			IVTV_DEBUG_I2C("Error setting SDA\n");
    426			return -EREMOTEIO;
    427		}
    428		ivtv_setscl(itv, 1);
    429		if (!ivtv_waitscl(itv, 1)) {
    430			IVTV_DEBUG_I2C("Slave not ready for bit\n");
    431			return -EREMOTEIO;
    432		}
    433	}
    434	ivtv_setscl(itv, 0);
    435	if (!ivtv_waitscl(itv, 0)) {
    436		IVTV_DEBUG_I2C("Error setting SCL low\n");
    437		return -EREMOTEIO;
    438	}
    439	return ivtv_ack(itv);
    440}
    441
    442/* Read a byte from the i2c bus and send a NACK if applicable (i.e. for the
    443   final byte) */
    444static int ivtv_readbyte(struct ivtv *itv, unsigned char *byte, int nack)
    445{
    446	int i;
    447
    448	*byte = 0;
    449
    450	ivtv_setsda(itv, 1);
    451	ivtv_scldelay(itv);
    452	for (i = 0; i < 8; ++i) {
    453		ivtv_setscl(itv, 0);
    454		ivtv_scldelay(itv);
    455		ivtv_setscl(itv, 1);
    456		if (!ivtv_waitscl(itv, 1)) {
    457			IVTV_DEBUG_I2C("Error setting SCL high\n");
    458			return -EREMOTEIO;
    459		}
    460		*byte = ((*byte)<<1)|ivtv_getsda(itv);
    461	}
    462	ivtv_setscl(itv, 0);
    463	ivtv_scldelay(itv);
    464	ivtv_setsda(itv, nack);
    465	ivtv_scldelay(itv);
    466	ivtv_setscl(itv, 1);
    467	ivtv_scldelay(itv);
    468	ivtv_setscl(itv, 0);
    469	ivtv_scldelay(itv);
    470	IVTV_DEBUG_HI_I2C("read %x\n",*byte);
    471	return 0;
    472}
    473
    474/* Issue a start condition on the i2c bus to alert slaves to prepare for
    475   an address write */
    476static int ivtv_start(struct ivtv *itv)
    477{
    478	int sda;
    479
    480	sda = ivtv_getsda(itv);
    481	if (sda != 1) {
    482		IVTV_DEBUG_HI_I2C("SDA was low at start\n");
    483		ivtv_setsda(itv, 1);
    484		if (!ivtv_waitsda(itv, 1)) {
    485			IVTV_DEBUG_I2C("SDA stuck low\n");
    486			return -EREMOTEIO;
    487		}
    488	}
    489	if (ivtv_getscl(itv) != 1) {
    490		ivtv_setscl(itv, 1);
    491		if (!ivtv_waitscl(itv, 1)) {
    492			IVTV_DEBUG_I2C("SCL stuck low at start\n");
    493			return -EREMOTEIO;
    494		}
    495	}
    496	ivtv_setsda(itv, 0);
    497	ivtv_scldelay(itv);
    498	return 0;
    499}
    500
    501/* Issue a stop condition on the i2c bus to release it */
    502static int ivtv_stop(struct ivtv *itv)
    503{
    504	int i;
    505
    506	if (ivtv_getscl(itv) != 0) {
    507		IVTV_DEBUG_HI_I2C("SCL not low when stopping\n");
    508		ivtv_setscl(itv, 0);
    509		if (!ivtv_waitscl(itv, 0)) {
    510			IVTV_DEBUG_I2C("SCL could not be set low\n");
    511		}
    512	}
    513	ivtv_setsda(itv, 0);
    514	ivtv_scldelay(itv);
    515	ivtv_setscl(itv, 1);
    516	if (!ivtv_waitscl(itv, 1)) {
    517		IVTV_DEBUG_I2C("SCL could not be set high\n");
    518		return -EREMOTEIO;
    519	}
    520	ivtv_scldelay(itv);
    521	ivtv_setsda(itv, 1);
    522	if (!ivtv_waitsda(itv, 1)) {
    523		IVTV_DEBUG_I2C("resetting I2C\n");
    524		for (i = 0; i < 16; ++i) {
    525			ivtv_setscl(itv, 0);
    526			ivtv_scldelay(itv);
    527			ivtv_setscl(itv, 1);
    528			ivtv_scldelay(itv);
    529			ivtv_setsda(itv, 1);
    530		}
    531		ivtv_waitsda(itv, 1);
    532		return -EREMOTEIO;
    533	}
    534	return 0;
    535}
    536
    537/* Write a message to the given i2c slave.  do_stop may be 0 to prevent
    538   issuing the i2c stop condition (when following with a read) */
    539static int ivtv_write(struct ivtv *itv, unsigned char addr, unsigned char *data, u32 len, int do_stop)
    540{
    541	int retry, ret = -EREMOTEIO;
    542	u32 i;
    543
    544	for (retry = 0; ret != 0 && retry < 8; ++retry) {
    545		ret = ivtv_start(itv);
    546
    547		if (ret == 0) {
    548			ret = ivtv_sendbyte(itv, addr<<1);
    549			for (i = 0; ret == 0 && i < len; ++i)
    550				ret = ivtv_sendbyte(itv, data[i]);
    551		}
    552		if (ret != 0 || do_stop) {
    553			ivtv_stop(itv);
    554		}
    555	}
    556	if (ret)
    557		IVTV_DEBUG_I2C("i2c write to %x failed\n", addr);
    558	return ret;
    559}
    560
    561/* Read data from the given i2c slave.  A stop condition is always issued. */
    562static int ivtv_read(struct ivtv *itv, unsigned char addr, unsigned char *data, u32 len)
    563{
    564	int retry, ret = -EREMOTEIO;
    565	u32 i;
    566
    567	for (retry = 0; ret != 0 && retry < 8; ++retry) {
    568		ret = ivtv_start(itv);
    569		if (ret == 0)
    570			ret = ivtv_sendbyte(itv, (addr << 1) | 1);
    571		for (i = 0; ret == 0 && i < len; ++i) {
    572			ret = ivtv_readbyte(itv, &data[i], i == len - 1);
    573		}
    574		ivtv_stop(itv);
    575	}
    576	if (ret)
    577		IVTV_DEBUG_I2C("i2c read from %x failed\n", addr);
    578	return ret;
    579}
    580
    581/* Kernel i2c transfer implementation.  Takes a number of messages to be read
    582   or written.  If a read follows a write, this will occur without an
    583   intervening stop condition */
    584static int ivtv_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num)
    585{
    586	struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap);
    587	struct ivtv *itv = to_ivtv(v4l2_dev);
    588	int retval;
    589	int i;
    590
    591	mutex_lock(&itv->i2c_bus_lock);
    592	for (i = retval = 0; retval == 0 && i < num; i++) {
    593		if (msgs[i].flags & I2C_M_RD)
    594			retval = ivtv_read(itv, msgs[i].addr, msgs[i].buf, msgs[i].len);
    595		else {
    596			/* if followed by a read, don't stop */
    597			int stop = !(i + 1 < num && msgs[i + 1].flags == I2C_M_RD);
    598
    599			retval = ivtv_write(itv, msgs[i].addr, msgs[i].buf, msgs[i].len, stop);
    600		}
    601	}
    602	mutex_unlock(&itv->i2c_bus_lock);
    603	return retval ? retval : num;
    604}
    605
    606/* Kernel i2c capabilities */
    607static u32 ivtv_functionality(struct i2c_adapter *adap)
    608{
    609	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
    610}
    611
    612static const struct i2c_algorithm ivtv_algo = {
    613	.master_xfer   = ivtv_xfer,
    614	.functionality = ivtv_functionality,
    615};
    616
    617/* template for our-bit banger */
    618static const struct i2c_adapter ivtv_i2c_adap_hw_template = {
    619	.name = "ivtv i2c driver",
    620	.algo = &ivtv_algo,
    621	.algo_data = NULL,			/* filled from template */
    622	.owner = THIS_MODULE,
    623};
    624
    625static void ivtv_setscl_old(void *data, int state)
    626{
    627	struct ivtv *itv = (struct ivtv *)data;
    628
    629	if (state)
    630		itv->i2c_state |= 0x01;
    631	else
    632		itv->i2c_state &= ~0x01;
    633
    634	/* write them out */
    635	/* write bits are inverted */
    636	write_reg(~itv->i2c_state, IVTV_REG_I2C_SETSCL_OFFSET);
    637}
    638
    639static void ivtv_setsda_old(void *data, int state)
    640{
    641	struct ivtv *itv = (struct ivtv *)data;
    642
    643	if (state)
    644		itv->i2c_state |= 0x01;
    645	else
    646		itv->i2c_state &= ~0x01;
    647
    648	/* write them out */
    649	/* write bits are inverted */
    650	write_reg(~itv->i2c_state, IVTV_REG_I2C_SETSDA_OFFSET);
    651}
    652
    653static int ivtv_getscl_old(void *data)
    654{
    655	struct ivtv *itv = (struct ivtv *)data;
    656
    657	return read_reg(IVTV_REG_I2C_GETSCL_OFFSET) & 1;
    658}
    659
    660static int ivtv_getsda_old(void *data)
    661{
    662	struct ivtv *itv = (struct ivtv *)data;
    663
    664	return read_reg(IVTV_REG_I2C_GETSDA_OFFSET) & 1;
    665}
    666
    667/* template for i2c-bit-algo */
    668static const struct i2c_adapter ivtv_i2c_adap_template = {
    669	.name = "ivtv i2c driver",
    670	.algo = NULL,                   /* set by i2c-algo-bit */
    671	.algo_data = NULL,              /* filled from template */
    672	.owner = THIS_MODULE,
    673};
    674
    675#define IVTV_ALGO_BIT_TIMEOUT	(2)	/* seconds */
    676
    677static const struct i2c_algo_bit_data ivtv_i2c_algo_template = {
    678	.setsda		= ivtv_setsda_old,
    679	.setscl		= ivtv_setscl_old,
    680	.getsda		= ivtv_getsda_old,
    681	.getscl		= ivtv_getscl_old,
    682	.udelay		= IVTV_DEFAULT_I2C_CLOCK_PERIOD / 2,  /* microseconds */
    683	.timeout	= IVTV_ALGO_BIT_TIMEOUT * HZ,         /* jiffies */
    684};
    685
    686static const struct i2c_client ivtv_i2c_client_template = {
    687	.name = "ivtv internal",
    688};
    689
    690/* init + register i2c adapter */
    691int init_ivtv_i2c(struct ivtv *itv)
    692{
    693	int retval;
    694
    695	IVTV_DEBUG_I2C("i2c init\n");
    696
    697	/* Sanity checks for the I2C hardware arrays. They must be the
    698	 * same size.
    699	 */
    700	if (ARRAY_SIZE(hw_devicenames) != ARRAY_SIZE(hw_addrs)) {
    701		IVTV_ERR("Mismatched I2C hardware arrays\n");
    702		return -ENODEV;
    703	}
    704	if (itv->options.newi2c > 0) {
    705		itv->i2c_adap = ivtv_i2c_adap_hw_template;
    706	} else {
    707		itv->i2c_adap = ivtv_i2c_adap_template;
    708		itv->i2c_algo = ivtv_i2c_algo_template;
    709	}
    710	itv->i2c_algo.udelay = itv->options.i2c_clock_period / 2;
    711	itv->i2c_algo.data = itv;
    712	itv->i2c_adap.algo_data = &itv->i2c_algo;
    713
    714	sprintf(itv->i2c_adap.name + strlen(itv->i2c_adap.name), " #%d",
    715		itv->instance);
    716	i2c_set_adapdata(&itv->i2c_adap, &itv->v4l2_dev);
    717
    718	itv->i2c_client = ivtv_i2c_client_template;
    719	itv->i2c_client.adapter = &itv->i2c_adap;
    720	itv->i2c_adap.dev.parent = &itv->pdev->dev;
    721
    722	IVTV_DEBUG_I2C("setting scl and sda to 1\n");
    723	ivtv_setscl(itv, 1);
    724	ivtv_setsda(itv, 1);
    725
    726	if (itv->options.newi2c > 0)
    727		retval = i2c_add_adapter(&itv->i2c_adap);
    728	else
    729		retval = i2c_bit_add_bus(&itv->i2c_adap);
    730
    731	return retval;
    732}
    733
    734void exit_ivtv_i2c(struct ivtv *itv)
    735{
    736	IVTV_DEBUG_I2C("i2c exit\n");
    737
    738	i2c_del_adapter(&itv->i2c_adap);
    739}