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