ivtv-i2c.c revision 84d0d4f0674c55d0625bd1b6eb91dba4ef3948f9
11a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/*
21a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    I2C functions
31a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
41a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
51a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
61a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    This program is free software; you can redistribute it and/or modify
71a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    it under the terms of the GNU General Public License as published by
81a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    the Free Software Foundation; either version 2 of the License, or
91a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    (at your option) any later version.
101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    This program is distributed in the hope that it will be useful,
121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    but WITHOUT ANY WARRANTY; without even the implied warranty of
131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    GNU General Public License for more details.
151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    You should have received a copy of the GNU General Public License
171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    along with this program; if not, write to the Free Software
181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */
201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/*
221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    This file includes an i2c implementation that was reverse engineered
231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    from the Hauppauge windows driver.  Older ivtv versions used i2c-algo-bit,
241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    which whilst fine under most circumstances, had trouble with the Zilog
251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    CPU on the PVR-150 which handles IR functions (occasional inability to
261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    communicate with the chip until it was reset) and also with the i2c
271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    bus being completely unreachable when multiple PVR cards were present.
281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    The implementation is very similar to i2c-algo-bit, but there are enough
301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    subtle differences that the two are hard to merge.  The general strategy
311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    employed by i2c-algo-bit is to use udelay() to implement the timing
321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    when putting out bits on the scl/sda lines.  The general strategy taken
331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    here is to poll the lines for state changes (see ivtv_waitscl and
341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    ivtv_waitsda).  In addition there are small delays at various locations
351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    which poll the SCL line 5 times (ivtv_scldelay).  I would guess that
361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    since this is memory mapped I/O that the length of those delays is tied
371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    to the PCI bus clock.  There is some extra code to do with recovery
381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    and retries.  Since it is not known what causes the actual i2c problems
391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    in the first place, the only goal if one was to attempt to use
401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    i2c-algo-bit would be to try to make it follow the same code path.
411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    This would be a lot of work, and I'm also not convinced that it would
421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    provide a generic benefit to i2c-algo-bit.  Therefore consider this
431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    an engineering solution -- not pretty, but it works.
441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    Some more general comments about what we are doing:
461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    The i2c bus is a 2 wire serial bus, with clock (SCL) and data (SDA)
481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    lines.  To communicate on the bus (as a master, we don't act as a slave),
491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    we first initiate a start condition (ivtv_start).  We then write the
501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    address of the device that we want to communicate with, along with a flag
511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    that indicates whether this is a read or a write.  The slave then issues
521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    an ACK signal (ivtv_ack), which tells us that it is ready for reading /
531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    writing.  We then proceed with reading or writing (ivtv_read/ivtv_write),
541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    and finally issue a stop condition (ivtv_stop) to make the bus available
551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    to other masters.
561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    There is an additional form of transaction where a write may be
581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    immediately followed by a read.  In this case, there is no intervening
591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil    stop condition.  (Only the msp3400 chip uses this method of data transfer).
601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */
611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-driver.h"
631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-cards.h"
641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-gpio.h"
6583df8e7b0d7b319f9ce9773eaf4b1da324ae17d7Hans Verkuil#include "ivtv-i2c.h"
6672c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil#include <media/cx25840.h>
671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* i2c implementation for cx23415/6 chip, ivtv project.
691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil * Author: Kevin Thayer (nufan_wfk at yahoo.com)
701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */
711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* i2c stuff */
721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_SETSCL_OFFSET 0x7000
731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_SETSDA_OFFSET 0x7004
741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_GETSCL_OFFSET 0x7008
751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_GETSDA_OFFSET 0x700c
761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_CS53L32A_I2C_ADDR		0x11
78e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil#define IVTV_M52790_I2C_ADDR		0x48
791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_CX25840_I2C_ADDR 		0x44
801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_SAA7115_I2C_ADDR 		0x21
811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_SAA7127_I2C_ADDR 		0x44
821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_SAA717x_I2C_ADDR 		0x21
831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_MSP3400_I2C_ADDR 		0x40
841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_HAUPPAUGE_I2C_ADDR 	0x50
851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_WM8739_I2C_ADDR 		0x1a
861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_WM8775_I2C_ADDR		0x1b
871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_TEA5767_I2C_ADDR		0x60
881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_UPD64031A_I2C_ADDR 	0x12
891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_UPD64083_I2C_ADDR 		0x5c
90d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil#define IVTV_VP27SMPX_I2C_ADDR      	0x5b
91d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil#define IVTV_M52790_I2C_ADDR      	0x48
92ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls#define IVTV_AVERMEDIA_IR_RX_I2C_ADDR	0x40
937ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_HAUP_EXT_IR_RX_I2C_ADDR 	0x1a
947ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_HAUP_INT_IR_RX_I2C_ADDR 	0x18
957ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_Z8F0811_IR_TX_I2C_ADDR	0x70
967ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_Z8F0811_IR_RX_I2C_ADDR	0x71
971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* This array should match the IVTV_HW_ defines */
99d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuilstatic const u8 hw_addrs[] = {
100d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_CX25840_I2C_ADDR,
101d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_SAA7115_I2C_ADDR,
102d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_SAA7127_I2C_ADDR,
103d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_MSP3400_I2C_ADDR,
104d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	0,
105d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_WM8775_I2C_ADDR,
106d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_CS53L32A_I2C_ADDR,
107d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	0,
108d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_SAA7115_I2C_ADDR,
109d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_UPD64031A_I2C_ADDR,
110d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_UPD64083_I2C_ADDR,
111d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_SAA717x_I2C_ADDR,
112d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_WM8739_I2C_ADDR,
113d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_VP27SMPX_I2C_ADDR,
114d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	IVTV_M52790_I2C_ADDR,
115ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	0,				/* IVTV_HW_GPIO dummy driver ID */
1167ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	IVTV_AVERMEDIA_IR_RX_I2C_ADDR,	/* IVTV_HW_I2C_IR_RX_AVER */
1177ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	IVTV_HAUP_EXT_IR_RX_I2C_ADDR,	/* IVTV_HW_I2C_IR_RX_HAUP_EXT */
1187ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	IVTV_HAUP_INT_IR_RX_I2C_ADDR,	/* IVTV_HW_I2C_IR_RX_HAUP_INT */
1197ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	IVTV_Z8F0811_IR_TX_I2C_ADDR,	/* IVTV_HW_Z8F0811_IR_TX_HAUP */
1207ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	IVTV_Z8F0811_IR_RX_I2C_ADDR,	/* IVTV_HW_Z8F0811_IR_RX_HAUP */
121d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil};
122d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil
123d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil/* This array should match the IVTV_HW_ defines */
124af294867a52bf718df835a688e8c786d550bee26Jean Delvarestatic const char * const hw_devicenames[] = {
125d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	"cx25840",
1261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"saa7115",
1275daed07401ed27bb2684e803f3f01e3a424ea282Jean Delvare	"saa7127_auto",	/* saa7127 or saa7129 */
1281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"msp3400",
1291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"tuner",
1301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"wm8775",
1311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"cs53l32a",
1321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"tveeprom",
133af294867a52bf718df835a688e8c786d550bee26Jean Delvare	"saa7114",
1341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"upd64031a",
1351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"upd64083",
1361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"saa717x",
1371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"wm8739",
138ac247433fe205acf460f05de64a30ee71ea307f2Hans Verkuil	"vp27smpx",
139e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil	"m52790",
1401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	"gpio",
1417ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	"ir_video",		/* IVTV_HW_I2C_IR_RX_AVER */
1427ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	"ir_video",		/* IVTV_HW_I2C_IR_RX_HAUP_EXT */
1437ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	"ir_video",		/* IVTV_HW_I2C_IR_RX_HAUP_INT */
1447ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	"ir_tx_z8f0811_haup",	/* IVTV_HW_Z8F0811_IR_TX_HAUP */
1457ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	"ir_rx_z8f0811_haup",	/* IVTV_HW_Z8F0811_IR_RX_HAUP */
1461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil};
1471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
148ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Wallsstatic int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr)
149ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls{
150ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	struct i2c_board_info info;
151ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	struct i2c_adapter *adap = &itv->i2c_adap;
152ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	struct IR_i2c_init_data *init_data = &itv->ir_i2c_init_data;
153ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	unsigned short addr_list[2] = { addr, I2C_CLIENT_END };
154ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
1557ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	/* Only allow one IR transmitter to be registered per board */
1567ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	if (hw & IVTV_HW_IR_TX_ANY) {
1577ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		if (itv->hw_flags & IVTV_HW_IR_TX_ANY)
1587ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls			return -1;
1597ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		memset(&info, 0, sizeof(struct i2c_board_info));
1607ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		strlcpy(info.type, type, I2C_NAME_SIZE);
1619a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare		return i2c_new_probed_device(adap, &info, addr_list, NULL)
1629a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare							   == NULL ? -1 : 0;
1637ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	}
1647ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls
1657ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	/* Only allow one IR receiver to be registered per board */
1667ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	if (itv->hw_flags & IVTV_HW_IR_RX_ANY)
1677ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		return -1;
1687ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls
169ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	/* Our default information for ir-kbd-i2c.c to use */
170ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	switch (hw) {
171ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	case IVTV_HW_I2C_IR_RX_AVER:
17202858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab		init_data->ir_codes = RC_MAP_AVERMEDIA_CARDBUS;
173ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls		init_data->internal_get_key_func =
174ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls					IR_KBD_GET_KEY_AVERMEDIA_CARDBUS;
175ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls		init_data->type = IR_TYPE_OTHER;
176ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls		init_data->name = "AVerMedia AVerTV card";
177ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls		break;
1787ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	case IVTV_HW_I2C_IR_RX_HAUP_EXT:
1797ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	case IVTV_HW_I2C_IR_RX_HAUP_INT:
1807ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		/* Default to old black remote */
18102858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab		init_data->ir_codes = RC_MAP_RC5_TV;
1827ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP;
1837ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		init_data->type = IR_TYPE_RC5;
1847ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		init_data->name = itv->card_name;
1857ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		break;
1867ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls	case IVTV_HW_Z8F0811_IR_RX_HAUP:
1877ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		/* Default to grey remote */
18802858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab		init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
1897ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
1907ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		init_data->type = IR_TYPE_RC5;
1917ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		init_data->name = itv->card_name;
1927ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls		break;
193ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	}
194ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
195ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	memset(&info, 0, sizeof(struct i2c_board_info));
196ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	info.platform_data = init_data;
197ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	strlcpy(info.type, type, I2C_NAME_SIZE);
198ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
1999a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare	return i2c_new_probed_device(adap, &info, addr_list, NULL) == NULL ?
2009a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare	       -1 : 0;
201ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls}
202ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
203bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls/* Instantiate the IR receiver device using probing -- undesirable */
204bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Wallsstruct i2c_client *ivtv_i2c_new_ir_legacy(struct ivtv *itv)
205bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls{
206bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	struct i2c_board_info info;
207bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	/*
208bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * The external IR receiver is at i2c address 0x34.
209bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * The internal IR receiver is at i2c address 0x30.
210bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 *
211bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * In theory, both can be fitted, and Hauppauge suggests an external
212bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * overrides an internal.  That's why we probe 0x1a (~0x34) first. CB
213bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 *
214bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * Some of these addresses we probe may collide with other i2c address
215bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * allocations, so this function must be called after all other i2c
216bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 * devices we care about are registered.
217bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	 */
218bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	const unsigned short addr_list[] = {
219bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls		0x1a,	/* Hauppauge IR external - collides with WM8739 */
220bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls		0x18,	/* Hauppauge IR internal */
221bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls		0x71,	/* Hauppauge IR (PVR150) */
222bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls		0x6b,	/* Adaptec IR */
223bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls		I2C_CLIENT_END
224bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	};
225bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls
226bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	memset(&info, 0, sizeof(struct i2c_board_info));
227bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls	strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
2289a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare	return i2c_new_probed_device(&itv->i2c_adap, &info, addr_list, NULL);
229bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls}
230bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls
231d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuilint ivtv_i2c_register(struct ivtv *itv, unsigned idx)
2321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
23367ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	struct v4l2_subdev *sd;
23467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	struct i2c_adapter *adap = &itv->i2c_adap;
23567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	const char *type = hw_devicenames[idx];
23667ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	u32 hw = 1 << idx;
2371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
23867ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	if (idx >= ARRAY_SIZE(hw_addrs))
239d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil		return -1;
24067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	if (hw == IVTV_HW_TUNER) {
24167ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		/* special tuner handling */
24253dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
24384d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				adap, NULL, type,
24453dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil				0, itv->card_i2c->radio);
24567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		if (sd)
24667ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil			sd->grp_id = 1 << idx;
24753dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
24884d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				adap, NULL, type,
24953dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil				0, itv->card_i2c->demod);
25067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		if (sd)
25167ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil			sd->grp_id = 1 << idx;
25253dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
25384d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				adap, NULL, type,
25453dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil				0, itv->card_i2c->tv);
25567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		if (sd)
25667ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil			sd->grp_id = 1 << idx;
25767ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		return sd ? 0 : -1;
2581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
259ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
260ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	if (hw & IVTV_HW_IR_ANY)
261ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls		return ivtv_i2c_new_ir(itv, hw, type, hw_addrs[idx]);
262ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
263ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	/* Is it not an I2C device or one we do not wish to register? */
26467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	if (!hw_addrs[idx])
26567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		return -1;
266ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls
267ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	/* It's an I2C device other than an analog tuner or IR chip */
26867ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) {
26953dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
27084d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				adap, NULL, type, 0, I2C_ADDRS(hw_addrs[idx]));
27172c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil	} else if (hw == IVTV_HW_CX25840) {
27272c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil		struct cx25840_platform_data pdata;
27372c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil
27472c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil		pdata.pvr150_workaround = itv->pvr150_workaround;
27572c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil		sd = v4l2_i2c_new_subdev_cfg(&itv->v4l2_dev,
27684d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				adap, NULL, type, 0, &pdata, hw_addrs[idx],
27784d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				NULL);
27867ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	} else {
279e6574f2fbecdb8af807169d345c10131ae060a88Hans Verkuil		sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
28084d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart				adap, NULL, type, hw_addrs[idx], NULL);
281d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	}
28267ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	if (sd)
28367ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		sd->grp_id = 1 << idx;
28467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	return sd ? 0 : -1;
2851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
2861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
28767ec09fdf5e05d4670b617256c696348b5df080bHans Verkuilstruct v4l2_subdev *ivtv_find_hw(struct ivtv *itv, u32 hw)
2881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
28967ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	struct v4l2_subdev *result = NULL;
29067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	struct v4l2_subdev *sd;
2911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
2928ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	spin_lock(&itv->v4l2_dev.lock);
2938ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	v4l2_device_for_each_subdev(sd, &itv->v4l2_dev) {
29467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		if (sd->grp_id == hw) {
29567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil			result = sd;
2961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			break;
2971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
2981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
2998ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	spin_unlock(&itv->v4l2_dev.lock);
30067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil	return result;
3011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Set the serial clock line to the desired state */
3041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setscl(struct ivtv *itv, int state)
3051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write them out */
3071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write bits are inverted */
3081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	write_reg(~state, IVTV_REG_I2C_SETSCL_OFFSET);
3091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Set the serial data line to the desired state */
3121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setsda(struct ivtv *itv, int state)
3131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write them out */
3151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write bits are inverted */
3161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	write_reg(~state & 1, IVTV_REG_I2C_SETSDA_OFFSET);
3171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read the serial clock line */
3201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getscl(struct ivtv *itv)
3211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return read_reg(IVTV_REG_I2C_GETSCL_OFFSET) & 1;
3231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read the serial data line */
3261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getsda(struct ivtv *itv)
3271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return read_reg(IVTV_REG_I2C_GETSDA_OFFSET) & 1;
3291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Implement a short delay by polling the serial clock line */
3321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_scldelay(struct ivtv *itv)
3331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i;
3351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (i = 0; i < 5; ++i)
3371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_getscl(itv);
3381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Wait for the serial clock line to become set to a specific value */
3411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_waitscl(struct ivtv *itv, int val)
3421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i;
3441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
3461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (i = 0; i < 1000; ++i) {
3471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (ivtv_getscl(itv) == val)
3481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return 1;
3491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
3501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return 0;
3511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Wait for the serial data line to become set to a specific value */
3541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_waitsda(struct ivtv *itv, int val)
3551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i;
3571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
3591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (i = 0; i < 1000; ++i) {
3601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (ivtv_getsda(itv) == val)
3611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return 1;
3621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
3631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return 0;
3641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3651a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3661a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Wait for the slave to issue an ACK */
3671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_ack(struct ivtv *itv)
3681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int ret = 0;
3701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (ivtv_getscl(itv) == 1) {
37211d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil		IVTV_DEBUG_HI_I2C("SCL was high starting an ack\n");
3731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 0);
3741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitscl(itv, 0)) {
3751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("Could not set SCL low starting an ack\n");
3761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
3771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
3781a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
3791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, 1);
3801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
3811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 1);
3821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (!ivtv_waitsda(itv, 0)) {
3831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("Slave did not ack\n");
3841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ret = -EREMOTEIO;
3851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
3861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 0);
3871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (!ivtv_waitscl(itv, 0)) {
3881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("Failed to set SCL low after ACK\n");
3891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ret = -EREMOTEIO;
3901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
3911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return ret;
3921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
3931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
3941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Write a single byte to the i2c bus and wait for the slave to ACK */
3951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_sendbyte(struct ivtv *itv, unsigned char byte)
3961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
3971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i, bit;
3981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
39911d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil	IVTV_DEBUG_HI_I2C("write %x\n",byte);
4001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (i = 0; i < 8; ++i, byte<<=1) {
4011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 0);
4021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitscl(itv, 0)) {
4031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("Error setting SCL low\n");
4041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
4051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		bit = (byte>>7)&1;
4071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setsda(itv, bit);
4081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitsda(itv, bit)) {
4091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("Error setting SDA\n");
4101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
4111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 1);
4131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitscl(itv, 1)) {
4141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("Slave not ready for bit\n");
4151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
4161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
4181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 0);
4191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (!ivtv_waitscl(itv, 0)) {
4201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("Error setting SCL low\n");
4211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		return -EREMOTEIO;
4221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
4231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return ivtv_ack(itv);
4241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
4251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read a byte from the i2c bus and send a NACK if applicable (i.e. for the
4271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil   final byte) */
4281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_readbyte(struct ivtv *itv, unsigned char *byte, int nack)
4291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
4301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i;
4311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	*byte = 0;
4331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, 1);
4351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
4361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (i = 0; i < 8; ++i) {
4371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 0);
4381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_scldelay(itv);
4391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 1);
4401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitscl(itv, 1)) {
4411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("Error setting SCL high\n");
4421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
4431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		*byte = ((*byte)<<1)|ivtv_getsda(itv);
4451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
4461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 0);
4471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
4481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, nack);
4491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
4501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 1);
4511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
4521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 0);
4531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
45411d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil	IVTV_DEBUG_HI_I2C("read %x\n",*byte);
4551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return 0;
4561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
4571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Issue a start condition on the i2c bus to alert slaves to prepare for
4591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil   an address write */
4601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_start(struct ivtv *itv)
4611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
4621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int sda;
4631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	sda = ivtv_getsda(itv);
4651a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (sda != 1) {
46611d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil		IVTV_DEBUG_HI_I2C("SDA was low at start\n");
4671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setsda(itv, 1);
4681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitsda(itv, 1)) {
4691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("SDA stuck low\n");
4701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
4711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
4731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (ivtv_getscl(itv) != 1) {
4741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 1);
4751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitscl(itv, 1)) {
4761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("SCL stuck low at start\n");
4771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			return -EREMOTEIO;
4781a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
4801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, 0);
4811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
4821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return 0;
4831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
4841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Issue a stop condition on the i2c bus to release it */
4861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_stop(struct ivtv *itv)
4871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
4881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i;
4891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
4901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (ivtv_getscl(itv) != 0) {
49111d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil		IVTV_DEBUG_HI_I2C("SCL not low when stopping\n");
4921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_setscl(itv, 0);
4931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (!ivtv_waitscl(itv, 0)) {
4941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			IVTV_DEBUG_I2C("SCL could not be set low\n");
4951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
4961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
4971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, 0);
4981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
4991a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 1);
5001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (!ivtv_waitscl(itv, 1)) {
5011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("SCL could not be set high\n");
5021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		return -EREMOTEIO;
5031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
5041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_scldelay(itv);
5051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, 1);
5061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (!ivtv_waitsda(itv, 1)) {
5071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("resetting I2C\n");
5081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		for (i = 0; i < 16; ++i) {
5091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ivtv_setscl(itv, 0);
5101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ivtv_scldelay(itv);
5111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ivtv_setscl(itv, 1);
5121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ivtv_scldelay(itv);
5131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ivtv_setsda(itv, 1);
5141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
5151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_waitsda(itv, 1);
5161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		return -EREMOTEIO;
5171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
5181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return 0;
5191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
5201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Write a message to the given i2c slave.  do_stop may be 0 to prevent
5221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil   issuing the i2c stop condition (when following with a read) */
5231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_write(struct ivtv *itv, unsigned char addr, unsigned char *data, u32 len, int do_stop)
5241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
5251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int retry, ret = -EREMOTEIO;
5261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	u32 i;
5271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (retry = 0; ret != 0 && retry < 8; ++retry) {
5291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ret = ivtv_start(itv);
5301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (ret == 0) {
5321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ret = ivtv_sendbyte(itv, addr<<1);
5331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			for (i = 0; ret == 0 && i < len; ++i)
5341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil				ret = ivtv_sendbyte(itv, data[i]);
5351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
5361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (ret != 0 || do_stop) {
5371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ivtv_stop(itv);
5381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
5391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
5401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (ret)
5411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("i2c write to %x failed\n", addr);
5421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return ret;
5431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
5441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read data from the given i2c slave.  A stop condition is always issued. */
5461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_read(struct ivtv *itv, unsigned char addr, unsigned char *data, u32 len)
5471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
5481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int retry, ret = -EREMOTEIO;
5491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	u32 i;
5501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (retry = 0; ret != 0 && retry < 8; ++retry) {
5521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ret = ivtv_start(itv);
5531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (ret == 0)
5541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ret = ivtv_sendbyte(itv, (addr << 1) | 1);
5551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		for (i = 0; ret == 0 && i < len; ++i) {
5561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			ret = ivtv_readbyte(itv, &data[i], i == len - 1);
5571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
5581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		ivtv_stop(itv);
5591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
5601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (ret)
5611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		IVTV_DEBUG_I2C("i2c read from %x failed\n", addr);
5621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return ret;
5631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
5641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5651a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Kernel i2c transfer implementation.  Takes a number of messages to be read
5661a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil   or written.  If a read follows a write, this will occur without an
5671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil   intervening stop condition */
5681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num)
5691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
5708ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap);
5718ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	struct ivtv *itv = to_ivtv(v4l2_dev);
5721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int retval;
5731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	int i;
5741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	mutex_lock(&itv->i2c_bus_lock);
5761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	for (i = retval = 0; retval == 0 && i < num; i++) {
5771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		if (msgs[i].flags & I2C_M_RD)
5781a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			retval = ivtv_read(itv, msgs[i].addr, msgs[i].buf, msgs[i].len);
5791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		else {
5801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			/* if followed by a read, don't stop */
5811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			int stop = !(i + 1 < num && msgs[i + 1].flags == I2C_M_RD);
5821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil			retval = ivtv_write(itv, msgs[i].addr, msgs[i].buf, msgs[i].len, stop);
5841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		}
5851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
5861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	mutex_unlock(&itv->i2c_bus_lock);
5871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return retval ? retval : num;
5881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
5891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Kernel i2c capabilities */
5911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic u32 ivtv_functionality(struct i2c_adapter *adap)
5921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
5931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
5941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
5951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
5961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_algorithm ivtv_algo = {
5971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.master_xfer   = ivtv_xfer,
5981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.functionality = ivtv_functionality,
5991a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil};
6001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* template for our-bit banger */
6021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_adapter ivtv_i2c_adap_hw_template = {
6031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.name = "ivtv i2c driver",
6041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.algo = &ivtv_algo,
6051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.algo_data = NULL,			/* filled from template */
6061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.owner = THIS_MODULE,
6071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil};
6081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setscl_old(void *data, int state)
6101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
6111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	struct ivtv *itv = (struct ivtv *)data;
6121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (state)
6141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		itv->i2c_state |= 0x01;
6151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	else
6161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		itv->i2c_state &= ~0x01;
6171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write them out */
6191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write bits are inverted */
6201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	write_reg(~itv->i2c_state, IVTV_REG_I2C_SETSCL_OFFSET);
6211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
6221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setsda_old(void *data, int state)
6241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
6251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	struct ivtv *itv = (struct ivtv *)data;
6261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (state)
6281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		itv->i2c_state |= 0x01;
6291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	else
6301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		itv->i2c_state &= ~0x01;
6311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write them out */
6331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	/* write bits are inverted */
6341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	write_reg(~itv->i2c_state, IVTV_REG_I2C_SETSDA_OFFSET);
6351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
6361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getscl_old(void *data)
6381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
6391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	struct ivtv *itv = (struct ivtv *)data;
6401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return read_reg(IVTV_REG_I2C_GETSCL_OFFSET) & 1;
6421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
6431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getsda_old(void *data)
6451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
6461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	struct ivtv *itv = (struct ivtv *)data;
6471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	return read_reg(IVTV_REG_I2C_GETSDA_OFFSET) & 1;
6491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
6501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* template for i2c-bit-algo */
6521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_adapter ivtv_i2c_adap_template = {
6531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.name = "ivtv i2c driver",
6541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.algo = NULL,                   /* set by i2c-algo-bit */
6551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.algo_data = NULL,              /* filled from template */
6561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	.owner = THIS_MODULE,
6571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil};
6581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
659f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls#define IVTV_ALGO_BIT_TIMEOUT	(2)	/* seconds */
660f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls
661aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvarestatic const struct i2c_algo_bit_data ivtv_i2c_algo_template = {
662aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare	.setsda		= ivtv_setsda_old,
663aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare	.setscl		= ivtv_setscl_old,
664aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare	.getsda		= ivtv_getsda_old,
665aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare	.getscl		= ivtv_getscl_old,
666f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls	.udelay		= IVTV_DEFAULT_I2C_CLOCK_PERIOD / 2,  /* microseconds */
667f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls	.timeout	= IVTV_ALGO_BIT_TIMEOUT * HZ,         /* jiffies */
6681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil};
6691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
6701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_client ivtv_i2c_client_template = {
671a415783bbb9fba7be2eeaeb5e3e08262bd3d64a1Andrew Morton	.name = "ivtv internal",
6721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil};
6731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
674bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls/* init + register i2c adapter */
675056827a49ce65a8d10197d35468500b501d1eec1Adrian Bunkint init_ivtv_i2c(struct ivtv *itv)
6761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
677c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare	int retval;
678c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare
6791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	IVTV_DEBUG_I2C("i2c init\n");
6801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
681d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	/* Sanity checks for the I2C hardware arrays. They must be the
682ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls	 * same size.
683d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	 */
68484d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart	if (ARRAY_SIZE(hw_devicenames) != ARRAY_SIZE(hw_addrs)) {
685d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil		IVTV_ERR("Mismatched I2C hardware arrays\n");
686d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil		return -ENODEV;
687d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil	}
6881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (itv->options.newi2c > 0) {
6891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		memcpy(&itv->i2c_adap, &ivtv_i2c_adap_hw_template,
6901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		       sizeof(struct i2c_adapter));
6911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	} else {
6921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		memcpy(&itv->i2c_adap, &ivtv_i2c_adap_template,
6931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		       sizeof(struct i2c_adapter));
6941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		memcpy(&itv->i2c_algo, &ivtv_i2c_algo_template,
6951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil		       sizeof(struct i2c_algo_bit_data));
6961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	}
697f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls	itv->i2c_algo.udelay = itv->options.i2c_clock_period / 2;
6980e614cd1a5a09b36a3b6d0fff8a08a97800d3cceHans Verkuil	itv->i2c_algo.data = itv;
6990e614cd1a5a09b36a3b6d0fff8a08a97800d3cceHans Verkuil	itv->i2c_adap.algo_data = &itv->i2c_algo;
7001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
7011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	sprintf(itv->i2c_adap.name + strlen(itv->i2c_adap.name), " #%d",
70267ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil		itv->instance);
7038ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	i2c_set_adapdata(&itv->i2c_adap, &itv->v4l2_dev);
7041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
7051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	memcpy(&itv->i2c_client, &ivtv_i2c_client_template,
7061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	       sizeof(struct i2c_client));
7071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	itv->i2c_client.adapter = &itv->i2c_adap;
7088ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil	itv->i2c_adap.dev.parent = &itv->pdev->dev;
7091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
7101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	IVTV_DEBUG_I2C("setting scl and sda to 1\n");
7111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setscl(itv, 1);
7121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	ivtv_setsda(itv, 1);
7131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
7141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	if (itv->options.newi2c > 0)
715c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare		retval = i2c_add_adapter(&itv->i2c_adap);
7161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	else
717c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare		retval = i2c_bit_add_bus(&itv->i2c_adap);
718c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare
719c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare	return retval;
7201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
7211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
722bb374b7b938f73666c403b201b3dd48ec9fe118aDavid Millervoid exit_ivtv_i2c(struct ivtv *itv)
7231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{
7241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	IVTV_DEBUG_I2C("i2c exit\n");
7251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil
7261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil	i2c_del_adapter(&itv->i2c_adap);
7271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}
728