Linux Audio

Check our new training course

Loading...
v6.9.4
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3
  4    bttv-i2c.c  --  all the i2c code is here
  5
  6    bttv - Bt848 frame grabber driver
  7
  8    Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
  9			   & Marcus Metzler (mocm@thp.uni-koeln.de)
 10    (c) 1999-2003 Gerd Knorr <kraxel@bytesex.org>
 11
 12    (c) 2005 Mauro Carvalho Chehab <mchehab@kernel.org>
 13	- Multituner support and i2c address binding
 14
 
 
 
 
 
 
 
 
 
 
 
 
 
 15
 16*/
 17
 18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 19
 20#include <linux/module.h>
 21#include <linux/init.h>
 22#include <linux/delay.h>
 23
 24#include "bttvp.h"
 25#include <media/v4l2-common.h>
 26#include <linux/jiffies.h>
 27#include <asm/io.h>
 28
 29static int i2c_debug;
 30static int i2c_hw;
 31static int i2c_scan;
 32module_param(i2c_debug, int, 0644);
 33MODULE_PARM_DESC(i2c_debug, "configure i2c debug level");
 34module_param(i2c_hw,    int, 0444);
 35MODULE_PARM_DESC(i2c_hw, "force use of hardware i2c support, instead of software bitbang");
 36module_param(i2c_scan,  int, 0444);
 37MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
 38
 39static unsigned int i2c_udelay = 5;
 40module_param(i2c_udelay, int, 0444);
 41MODULE_PARM_DESC(i2c_udelay, "soft i2c delay at insmod time, in usecs (should be 5 or higher). Lower value means higher bus speed.");
 42
 43/* ----------------------------------------------------------------------- */
 44/* I2C functions - bitbanging adapter (software i2c)                       */
 45
 46static void bttv_bit_setscl(void *data, int state)
 47{
 48	struct bttv *btv = (struct bttv*)data;
 49
 50	if (state)
 51		btv->i2c_state |= 0x02;
 52	else
 53		btv->i2c_state &= ~0x02;
 54	btwrite(btv->i2c_state, BT848_I2C);
 55	btread(BT848_I2C);
 56}
 57
 58static void bttv_bit_setsda(void *data, int state)
 59{
 60	struct bttv *btv = (struct bttv*)data;
 61
 62	if (state)
 63		btv->i2c_state |= 0x01;
 64	else
 65		btv->i2c_state &= ~0x01;
 66	btwrite(btv->i2c_state, BT848_I2C);
 67	btread(BT848_I2C);
 68}
 69
 70static int bttv_bit_getscl(void *data)
 71{
 72	struct bttv *btv = (struct bttv*)data;
 73	int state;
 74
 75	state = btread(BT848_I2C) & 0x02 ? 1 : 0;
 76	return state;
 77}
 78
 79static int bttv_bit_getsda(void *data)
 80{
 81	struct bttv *btv = (struct bttv*)data;
 82	int state;
 83
 84	state = btread(BT848_I2C) & 0x01;
 85	return state;
 86}
 87
 88static const struct i2c_algo_bit_data bttv_i2c_algo_bit_template = {
 89	.setsda  = bttv_bit_setsda,
 90	.setscl  = bttv_bit_setscl,
 91	.getsda  = bttv_bit_getsda,
 92	.getscl  = bttv_bit_getscl,
 93	.udelay  = 16,
 94	.timeout = 200,
 95};
 96
 97/* ----------------------------------------------------------------------- */
 98/* I2C functions - hardware i2c                                            */
 99
100static u32 functionality(struct i2c_adapter *adap)
101{
102	return I2C_FUNC_SMBUS_EMUL;
103}
104
105static int
106bttv_i2c_wait_done(struct bttv *btv)
107{
108	int rc = 0;
109
110	/* timeout */
111	if (wait_event_interruptible_timeout(btv->i2c_queue,
112	    btv->i2c_done, msecs_to_jiffies(85)) == -ERESTARTSYS)
113		rc = -EIO;
114
115	if (btv->i2c_done & BT848_INT_RACK)
116		rc = 1;
117	btv->i2c_done = 0;
118	return rc;
119}
120
121#define I2C_HW (BT878_I2C_MODE  | BT848_I2C_SYNC |\
122		BT848_I2C_SCL | BT848_I2C_SDA)
123
124static int
125bttv_i2c_sendbytes(struct bttv *btv, const struct i2c_msg *msg, int last)
126{
127	u32 xmit;
128	int retval,cnt;
129
130	/* sanity checks */
131	if (0 == msg->len)
132		return -EINVAL;
133
134	/* start, address + first byte */
135	xmit = (msg->addr << 25) | (msg->buf[0] << 16) | I2C_HW;
136	if (msg->len > 1 || !last)
137		xmit |= BT878_I2C_NOSTOP;
138	btwrite(xmit, BT848_I2C);
139	retval = bttv_i2c_wait_done(btv);
140	if (retval < 0)
141		goto err;
142	if (retval == 0)
143		goto eio;
144	if (i2c_debug) {
145		pr_cont(" <W %02x %02x", msg->addr << 1, msg->buf[0]);
146	}
147
148	for (cnt = 1; cnt < msg->len; cnt++ ) {
149		/* following bytes */
150		xmit = (msg->buf[cnt] << 24) | I2C_HW | BT878_I2C_NOSTART;
151		if (cnt < msg->len-1 || !last)
152			xmit |= BT878_I2C_NOSTOP;
153		btwrite(xmit, BT848_I2C);
154		retval = bttv_i2c_wait_done(btv);
155		if (retval < 0)
156			goto err;
157		if (retval == 0)
158			goto eio;
159		if (i2c_debug)
160			pr_cont(" %02x", msg->buf[cnt]);
161	}
162	if (i2c_debug && !(xmit & BT878_I2C_NOSTOP))
163		pr_cont(">\n");
164	return msg->len;
165
166 eio:
167	retval = -EIO;
168 err:
169	if (i2c_debug)
170		pr_cont(" ERR: %d\n",retval);
171	return retval;
172}
173
174static int
175bttv_i2c_readbytes(struct bttv *btv, const struct i2c_msg *msg, int last)
176{
177	u32 xmit;
178	u32 cnt;
179	int retval;
180
181	for (cnt = 0; cnt < msg->len; cnt++) {
182		xmit = (msg->addr << 25) | (1 << 24) | I2C_HW;
183		if (cnt < msg->len-1)
184			xmit |= BT848_I2C_W3B;
185		if (cnt < msg->len-1 || !last)
186			xmit |= BT878_I2C_NOSTOP;
187		if (cnt)
188			xmit |= BT878_I2C_NOSTART;
189
190		if (i2c_debug) {
191			if (!(xmit & BT878_I2C_NOSTART))
192				pr_cont(" <R %02x", (msg->addr << 1) +1);
193		}
194
195		btwrite(xmit, BT848_I2C);
196		retval = bttv_i2c_wait_done(btv);
197		if (retval < 0)
198			goto err;
199		if (retval == 0)
200			goto eio;
201		msg->buf[cnt] = ((u32)btread(BT848_I2C) >> 8) & 0xff;
202		if (i2c_debug) {
203			pr_cont(" =%02x", msg->buf[cnt]);
204		}
205		if (i2c_debug && !(xmit & BT878_I2C_NOSTOP))
206			pr_cont(" >\n");
207	}
208
209
210	return msg->len;
211
212 eio:
213	retval = -EIO;
214 err:
215	if (i2c_debug)
216		pr_cont(" ERR: %d\n",retval);
217	return retval;
218}
219
220static int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num)
221{
222	struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap);
223	struct bttv *btv = to_bttv(v4l2_dev);
224	int retval = 0;
225	int i;
226
227	if (i2c_debug)
228		pr_debug("bt-i2c:");
229
230	btwrite(BT848_INT_I2CDONE|BT848_INT_RACK, BT848_INT_STAT);
231	for (i = 0 ; i < num; i++) {
232		if (msgs[i].flags & I2C_M_RD) {
233			/* read */
234			retval = bttv_i2c_readbytes(btv, &msgs[i], i+1 == num);
235			if (retval < 0)
236				goto err;
237		} else {
238			/* write */
239			retval = bttv_i2c_sendbytes(btv, &msgs[i], i+1 == num);
240			if (retval < 0)
241				goto err;
242		}
243	}
244	return num;
245
246 err:
247	return retval;
248}
249
250static const struct i2c_algorithm bttv_algo = {
251	.master_xfer   = bttv_i2c_xfer,
252	.functionality = functionality,
253};
254
255/* ----------------------------------------------------------------------- */
256/* I2C functions - common stuff                                            */
257
258/* read I2C */
259int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for)
260{
261	unsigned char buffer = 0;
262
263	if (0 != btv->i2c_rc)
264		return -1;
265	if (bttv_verbose && NULL != probe_for)
266		pr_info("%d: i2c: checking for %s @ 0x%02x... ",
267			btv->c.nr, probe_for, addr);
268	btv->i2c_client.addr = addr >> 1;
269	if (1 != i2c_master_recv(&btv->i2c_client, &buffer, 1)) {
270		if (NULL != probe_for) {
271			if (bttv_verbose)
272				pr_cont("not found\n");
273		} else
274			pr_warn("%d: i2c read 0x%x: error\n",
275				btv->c.nr, addr);
276		return -1;
277	}
278	if (bttv_verbose && NULL != probe_for)
279		pr_cont("found\n");
280	return buffer;
281}
282
283/* write I2C */
284int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1,
285		    unsigned char b2, int both)
286{
287	unsigned char buffer[2];
288	int bytes = both ? 2 : 1;
289
290	if (0 != btv->i2c_rc)
291		return -1;
292	btv->i2c_client.addr = addr >> 1;
293	buffer[0] = b1;
294	buffer[1] = b2;
295	if (bytes != i2c_master_send(&btv->i2c_client, buffer, bytes))
296		return -1;
297	return 0;
298}
299
300/* read EEPROM content */
301void bttv_readee(struct bttv *btv, unsigned char *eedata, int addr)
302{
303	memset(eedata, 0, 256);
304	if (0 != btv->i2c_rc)
305		return;
306	btv->i2c_client.addr = addr >> 1;
307	tveeprom_read(&btv->i2c_client, eedata, 256);
308}
309
310static char *i2c_devs[128] = {
311	[ 0x1c >> 1 ] = "lgdt330x",
312	[ 0x30 >> 1 ] = "IR (hauppauge)",
313	[ 0x80 >> 1 ] = "msp34xx",
314	[ 0x86 >> 1 ] = "tda9887",
315	[ 0xa0 >> 1 ] = "eeprom",
316	[ 0xc0 >> 1 ] = "tuner (analog)",
317	[ 0xc2 >> 1 ] = "tuner (analog)",
318};
319
320static void do_i2c_scan(char *name, struct i2c_client *c)
321{
322	unsigned char buf;
323	int i,rc;
324
325	for (i = 0; i < ARRAY_SIZE(i2c_devs); i++) {
326		c->addr = i;
327		rc = i2c_master_recv(c,&buf,0);
328		if (rc < 0)
329			continue;
330		pr_info("%s: i2c scan: found device @ 0x%x  [%s]\n",
331			name, i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
332	}
333}
334
335/* init + register i2c adapter */
336int init_bttv_i2c(struct bttv *btv)
337{
338	strscpy(btv->i2c_client.name, "bttv internal", I2C_NAME_SIZE);
339
340	if (i2c_hw)
341		btv->use_i2c_hw = 1;
342	if (btv->use_i2c_hw) {
343		/* bt878 */
344		strscpy(btv->c.i2c_adap.name, "bt878",
345			sizeof(btv->c.i2c_adap.name));
346		btv->c.i2c_adap.algo = &bttv_algo;
347	} else {
348		/* bt848 */
349	/* Prevents usage of invalid delay values */
350		if (i2c_udelay<5)
351			i2c_udelay=5;
352
353		strscpy(btv->c.i2c_adap.name, "bttv",
354			sizeof(btv->c.i2c_adap.name));
355		btv->i2c_algo = bttv_i2c_algo_bit_template;
356		btv->i2c_algo.udelay = i2c_udelay;
357		btv->i2c_algo.data = btv;
358		btv->c.i2c_adap.algo_data = &btv->i2c_algo;
359	}
360	btv->c.i2c_adap.owner = THIS_MODULE;
361
362	btv->c.i2c_adap.dev.parent = &btv->c.pci->dev;
363	snprintf(btv->c.i2c_adap.name, sizeof(btv->c.i2c_adap.name),
364		 "bt%d #%d [%s]", btv->id, btv->c.nr,
365		 btv->use_i2c_hw ? "hw" : "sw");
366
367	i2c_set_adapdata(&btv->c.i2c_adap, &btv->c.v4l2_dev);
368	btv->i2c_client.adapter = &btv->c.i2c_adap;
369
370
371	if (btv->use_i2c_hw) {
372		btv->i2c_rc = i2c_add_adapter(&btv->c.i2c_adap);
373	} else {
374		bttv_bit_setscl(btv,1);
375		bttv_bit_setsda(btv,1);
376		btv->i2c_rc = i2c_bit_add_bus(&btv->c.i2c_adap);
377	}
378	if (0 == btv->i2c_rc && i2c_scan)
379		do_i2c_scan(btv->c.v4l2_dev.name, &btv->i2c_client);
380
381	return btv->i2c_rc;
382}
383
384int fini_bttv_i2c(struct bttv *btv)
385{
386	if (btv->i2c_rc == 0)
387		i2c_del_adapter(&btv->c.i2c_adap);
388
389	return 0;
390}
v4.10.11
 
  1/*
  2
  3    bttv-i2c.c  --  all the i2c code is here
  4
  5    bttv - Bt848 frame grabber driver
  6
  7    Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
  8			   & Marcus Metzler (mocm@thp.uni-koeln.de)
  9    (c) 1999-2003 Gerd Knorr <kraxel@bytesex.org>
 10
 11    (c) 2005 Mauro Carvalho Chehab <mchehab@infradead.org>
 12	- Multituner support and i2c address binding
 13
 14    This program is free software; you can redistribute it and/or modify
 15    it under the terms of the GNU General Public License as published by
 16    the Free Software Foundation; either version 2 of the License, or
 17    (at your option) any later version.
 18
 19    This program is distributed in the hope that it will be useful,
 20    but WITHOUT ANY WARRANTY; without even the implied warranty of
 21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 22    GNU General Public License for more details.
 23
 24    You should have received a copy of the GNU General Public License
 25    along with this program; if not, write to the Free Software
 26    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 27
 28*/
 29
 30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 31
 32#include <linux/module.h>
 33#include <linux/init.h>
 34#include <linux/delay.h>
 35
 36#include "bttvp.h"
 37#include <media/v4l2-common.h>
 38#include <linux/jiffies.h>
 39#include <asm/io.h>
 40
 41static int i2c_debug;
 42static int i2c_hw;
 43static int i2c_scan;
 44module_param(i2c_debug, int, 0644);
 45MODULE_PARM_DESC(i2c_debug, "configure i2c debug level");
 46module_param(i2c_hw,    int, 0444);
 47MODULE_PARM_DESC(i2c_hw, "force use of hardware i2c support, instead of software bitbang");
 48module_param(i2c_scan,  int, 0444);
 49MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
 50
 51static unsigned int i2c_udelay = 5;
 52module_param(i2c_udelay, int, 0444);
 53MODULE_PARM_DESC(i2c_udelay, "soft i2c delay at insmod time, in usecs (should be 5 or higher). Lower value means higher bus speed.");
 54
 55/* ----------------------------------------------------------------------- */
 56/* I2C functions - bitbanging adapter (software i2c)                       */
 57
 58static void bttv_bit_setscl(void *data, int state)
 59{
 60	struct bttv *btv = (struct bttv*)data;
 61
 62	if (state)
 63		btv->i2c_state |= 0x02;
 64	else
 65		btv->i2c_state &= ~0x02;
 66	btwrite(btv->i2c_state, BT848_I2C);
 67	btread(BT848_I2C);
 68}
 69
 70static void bttv_bit_setsda(void *data, int state)
 71{
 72	struct bttv *btv = (struct bttv*)data;
 73
 74	if (state)
 75		btv->i2c_state |= 0x01;
 76	else
 77		btv->i2c_state &= ~0x01;
 78	btwrite(btv->i2c_state, BT848_I2C);
 79	btread(BT848_I2C);
 80}
 81
 82static int bttv_bit_getscl(void *data)
 83{
 84	struct bttv *btv = (struct bttv*)data;
 85	int state;
 86
 87	state = btread(BT848_I2C) & 0x02 ? 1 : 0;
 88	return state;
 89}
 90
 91static int bttv_bit_getsda(void *data)
 92{
 93	struct bttv *btv = (struct bttv*)data;
 94	int state;
 95
 96	state = btread(BT848_I2C) & 0x01;
 97	return state;
 98}
 99
100static struct i2c_algo_bit_data bttv_i2c_algo_bit_template = {
101	.setsda  = bttv_bit_setsda,
102	.setscl  = bttv_bit_setscl,
103	.getsda  = bttv_bit_getsda,
104	.getscl  = bttv_bit_getscl,
105	.udelay  = 16,
106	.timeout = 200,
107};
108
109/* ----------------------------------------------------------------------- */
110/* I2C functions - hardware i2c                                            */
111
112static u32 functionality(struct i2c_adapter *adap)
113{
114	return I2C_FUNC_SMBUS_EMUL;
115}
116
117static int
118bttv_i2c_wait_done(struct bttv *btv)
119{
120	int rc = 0;
121
122	/* timeout */
123	if (wait_event_interruptible_timeout(btv->i2c_queue,
124	    btv->i2c_done, msecs_to_jiffies(85)) == -ERESTARTSYS)
125		rc = -EIO;
126
127	if (btv->i2c_done & BT848_INT_RACK)
128		rc = 1;
129	btv->i2c_done = 0;
130	return rc;
131}
132
133#define I2C_HW (BT878_I2C_MODE  | BT848_I2C_SYNC |\
134		BT848_I2C_SCL | BT848_I2C_SDA)
135
136static int
137bttv_i2c_sendbytes(struct bttv *btv, const struct i2c_msg *msg, int last)
138{
139	u32 xmit;
140	int retval,cnt;
141
142	/* sanity checks */
143	if (0 == msg->len)
144		return -EINVAL;
145
146	/* start, address + first byte */
147	xmit = (msg->addr << 25) | (msg->buf[0] << 16) | I2C_HW;
148	if (msg->len > 1 || !last)
149		xmit |= BT878_I2C_NOSTOP;
150	btwrite(xmit, BT848_I2C);
151	retval = bttv_i2c_wait_done(btv);
152	if (retval < 0)
153		goto err;
154	if (retval == 0)
155		goto eio;
156	if (i2c_debug) {
157		pr_cont(" <W %02x %02x", msg->addr << 1, msg->buf[0]);
158	}
159
160	for (cnt = 1; cnt < msg->len; cnt++ ) {
161		/* following bytes */
162		xmit = (msg->buf[cnt] << 24) | I2C_HW | BT878_I2C_NOSTART;
163		if (cnt < msg->len-1 || !last)
164			xmit |= BT878_I2C_NOSTOP;
165		btwrite(xmit, BT848_I2C);
166		retval = bttv_i2c_wait_done(btv);
167		if (retval < 0)
168			goto err;
169		if (retval == 0)
170			goto eio;
171		if (i2c_debug)
172			pr_cont(" %02x", msg->buf[cnt]);
173	}
174	if (i2c_debug && !(xmit & BT878_I2C_NOSTOP))
175		pr_cont(">\n");
176	return msg->len;
177
178 eio:
179	retval = -EIO;
180 err:
181	if (i2c_debug)
182		pr_cont(" ERR: %d\n",retval);
183	return retval;
184}
185
186static int
187bttv_i2c_readbytes(struct bttv *btv, const struct i2c_msg *msg, int last)
188{
189	u32 xmit;
190	u32 cnt;
191	int retval;
192
193	for (cnt = 0; cnt < msg->len; cnt++) {
194		xmit = (msg->addr << 25) | (1 << 24) | I2C_HW;
195		if (cnt < msg->len-1)
196			xmit |= BT848_I2C_W3B;
197		if (cnt < msg->len-1 || !last)
198			xmit |= BT878_I2C_NOSTOP;
199		if (cnt)
200			xmit |= BT878_I2C_NOSTART;
201
202		if (i2c_debug) {
203			if (!(xmit & BT878_I2C_NOSTART))
204				pr_cont(" <R %02x", (msg->addr << 1) +1);
205		}
206
207		btwrite(xmit, BT848_I2C);
208		retval = bttv_i2c_wait_done(btv);
209		if (retval < 0)
210			goto err;
211		if (retval == 0)
212			goto eio;
213		msg->buf[cnt] = ((u32)btread(BT848_I2C) >> 8) & 0xff;
214		if (i2c_debug) {
215			pr_cont(" =%02x", msg->buf[cnt]);
216		}
217		if (i2c_debug && !(xmit & BT878_I2C_NOSTOP))
218			pr_cont(" >\n");
219	}
220
221
222	return msg->len;
223
224 eio:
225	retval = -EIO;
226 err:
227	if (i2c_debug)
228		pr_cont(" ERR: %d\n",retval);
229	return retval;
230}
231
232static int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num)
233{
234	struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap);
235	struct bttv *btv = to_bttv(v4l2_dev);
236	int retval = 0;
237	int i;
238
239	if (i2c_debug)
240		pr_debug("bt-i2c:");
241
242	btwrite(BT848_INT_I2CDONE|BT848_INT_RACK, BT848_INT_STAT);
243	for (i = 0 ; i < num; i++) {
244		if (msgs[i].flags & I2C_M_RD) {
245			/* read */
246			retval = bttv_i2c_readbytes(btv, &msgs[i], i+1 == num);
247			if (retval < 0)
248				goto err;
249		} else {
250			/* write */
251			retval = bttv_i2c_sendbytes(btv, &msgs[i], i+1 == num);
252			if (retval < 0)
253				goto err;
254		}
255	}
256	return num;
257
258 err:
259	return retval;
260}
261
262static const struct i2c_algorithm bttv_algo = {
263	.master_xfer   = bttv_i2c_xfer,
264	.functionality = functionality,
265};
266
267/* ----------------------------------------------------------------------- */
268/* I2C functions - common stuff                                            */
269
270/* read I2C */
271int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for)
272{
273	unsigned char buffer = 0;
274
275	if (0 != btv->i2c_rc)
276		return -1;
277	if (bttv_verbose && NULL != probe_for)
278		pr_info("%d: i2c: checking for %s @ 0x%02x... ",
279			btv->c.nr, probe_for, addr);
280	btv->i2c_client.addr = addr >> 1;
281	if (1 != i2c_master_recv(&btv->i2c_client, &buffer, 1)) {
282		if (NULL != probe_for) {
283			if (bttv_verbose)
284				pr_cont("not found\n");
285		} else
286			pr_warn("%d: i2c read 0x%x: error\n",
287				btv->c.nr, addr);
288		return -1;
289	}
290	if (bttv_verbose && NULL != probe_for)
291		pr_cont("found\n");
292	return buffer;
293}
294
295/* write I2C */
296int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1,
297		    unsigned char b2, int both)
298{
299	unsigned char buffer[2];
300	int bytes = both ? 2 : 1;
301
302	if (0 != btv->i2c_rc)
303		return -1;
304	btv->i2c_client.addr = addr >> 1;
305	buffer[0] = b1;
306	buffer[1] = b2;
307	if (bytes != i2c_master_send(&btv->i2c_client, buffer, bytes))
308		return -1;
309	return 0;
310}
311
312/* read EEPROM content */
313void bttv_readee(struct bttv *btv, unsigned char *eedata, int addr)
314{
315	memset(eedata, 0, 256);
316	if (0 != btv->i2c_rc)
317		return;
318	btv->i2c_client.addr = addr >> 1;
319	tveeprom_read(&btv->i2c_client, eedata, 256);
320}
321
322static char *i2c_devs[128] = {
323	[ 0x1c >> 1 ] = "lgdt330x",
324	[ 0x30 >> 1 ] = "IR (hauppauge)",
325	[ 0x80 >> 1 ] = "msp34xx",
326	[ 0x86 >> 1 ] = "tda9887",
327	[ 0xa0 >> 1 ] = "eeprom",
328	[ 0xc0 >> 1 ] = "tuner (analog)",
329	[ 0xc2 >> 1 ] = "tuner (analog)",
330};
331
332static void do_i2c_scan(char *name, struct i2c_client *c)
333{
334	unsigned char buf;
335	int i,rc;
336
337	for (i = 0; i < ARRAY_SIZE(i2c_devs); i++) {
338		c->addr = i;
339		rc = i2c_master_recv(c,&buf,0);
340		if (rc < 0)
341			continue;
342		pr_info("%s: i2c scan: found device @ 0x%x  [%s]\n",
343			name, i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
344	}
345}
346
347/* init + register i2c adapter */
348int init_bttv_i2c(struct bttv *btv)
349{
350	strlcpy(btv->i2c_client.name, "bttv internal", I2C_NAME_SIZE);
351
352	if (i2c_hw)
353		btv->use_i2c_hw = 1;
354	if (btv->use_i2c_hw) {
355		/* bt878 */
356		strlcpy(btv->c.i2c_adap.name, "bt878",
357			sizeof(btv->c.i2c_adap.name));
358		btv->c.i2c_adap.algo = &bttv_algo;
359	} else {
360		/* bt848 */
361	/* Prevents usage of invalid delay values */
362		if (i2c_udelay<5)
363			i2c_udelay=5;
364
365		strlcpy(btv->c.i2c_adap.name, "bttv",
366			sizeof(btv->c.i2c_adap.name));
367		btv->i2c_algo = bttv_i2c_algo_bit_template;
368		btv->i2c_algo.udelay = i2c_udelay;
369		btv->i2c_algo.data = btv;
370		btv->c.i2c_adap.algo_data = &btv->i2c_algo;
371	}
372	btv->c.i2c_adap.owner = THIS_MODULE;
373
374	btv->c.i2c_adap.dev.parent = &btv->c.pci->dev;
375	snprintf(btv->c.i2c_adap.name, sizeof(btv->c.i2c_adap.name),
376		 "bt%d #%d [%s]", btv->id, btv->c.nr,
377		 btv->use_i2c_hw ? "hw" : "sw");
378
379	i2c_set_adapdata(&btv->c.i2c_adap, &btv->c.v4l2_dev);
380	btv->i2c_client.adapter = &btv->c.i2c_adap;
381
382
383	if (btv->use_i2c_hw) {
384		btv->i2c_rc = i2c_add_adapter(&btv->c.i2c_adap);
385	} else {
386		bttv_bit_setscl(btv,1);
387		bttv_bit_setsda(btv,1);
388		btv->i2c_rc = i2c_bit_add_bus(&btv->c.i2c_adap);
389	}
390	if (0 == btv->i2c_rc && i2c_scan)
391		do_i2c_scan(btv->c.v4l2_dev.name, &btv->i2c_client);
392
393	return btv->i2c_rc;
394}
395
396int fini_bttv_i2c(struct bttv *btv)
397{
398	if (btv->i2c_rc == 0)
399		i2c_del_adapter(&btv->c.i2c_adap);
400
401	return 0;
402}