xref: /linux/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c (revision da1d9caf95def6f0320819cf941c9fd1069ba9e1)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *
4  *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
5  */
6 
7 #include <linux/i2c.h>
8 #include <linux/module.h>
9 #include <media/i2c/ir-kbd-i2c.h>
10 #include "pvrusb2-i2c-core.h"
11 #include "pvrusb2-hdw-internal.h"
12 #include "pvrusb2-debug.h"
13 #include "pvrusb2-fx2-cmd.h"
14 #include "pvrusb2.h"
15 
16 #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
17 
18 /*
19 
20   This module attempts to implement a compliant I2C adapter for the pvrusb2
21   device.
22 
23 */
24 
25 static unsigned int i2c_scan;
26 module_param(i2c_scan, int, S_IRUGO|S_IWUSR);
27 MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
28 
29 static int ir_mode[PVR_NUM] = { [0 ... PVR_NUM-1] = 1 };
30 module_param_array(ir_mode, int, NULL, 0444);
31 MODULE_PARM_DESC(ir_mode,"specify: 0=disable IR reception, 1=normal IR");
32 
33 static int pvr2_disable_ir_video;
34 module_param_named(disable_autoload_ir_video, pvr2_disable_ir_video,
35 		   int, S_IRUGO|S_IWUSR);
36 MODULE_PARM_DESC(disable_autoload_ir_video,
37 		 "1=do not try to autoload ir_video IR receiver");
38 
39 static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
40 			  u8 i2c_addr,      /* I2C address we're talking to */
41 			  u8 *data,         /* Data to write */
42 			  u16 length)       /* Size of data to write */
43 {
44 	/* Return value - default 0 means success */
45 	int ret;
46 
47 
48 	if (!data) length = 0;
49 	if (length > (sizeof(hdw->cmd_buffer) - 3)) {
50 		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
51 			   "Killing an I2C write to %u that is too large (desired=%u limit=%u)",
52 			   i2c_addr,
53 			   length,(unsigned int)(sizeof(hdw->cmd_buffer) - 3));
54 		return -ENOTSUPP;
55 	}
56 
57 	LOCK_TAKE(hdw->ctl_lock);
58 
59 	/* Clear the command buffer (likely to be paranoia) */
60 	memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
61 
62 	/* Set up command buffer for an I2C write */
63 	hdw->cmd_buffer[0] = FX2CMD_I2C_WRITE;      /* write prefix */
64 	hdw->cmd_buffer[1] = i2c_addr;  /* i2c addr of chip */
65 	hdw->cmd_buffer[2] = length;    /* length of what follows */
66 	if (length) memcpy(hdw->cmd_buffer + 3, data, length);
67 
68 	/* Do the operation */
69 	ret = pvr2_send_request(hdw,
70 				hdw->cmd_buffer,
71 				length + 3,
72 				hdw->cmd_buffer,
73 				1);
74 	if (!ret) {
75 		if (hdw->cmd_buffer[0] != 8) {
76 			ret = -EIO;
77 			if (hdw->cmd_buffer[0] != 7) {
78 				trace_i2c("unexpected status from i2_write[%d]: %d",
79 					  i2c_addr,hdw->cmd_buffer[0]);
80 			}
81 		}
82 	}
83 
84 	LOCK_GIVE(hdw->ctl_lock);
85 
86 	return ret;
87 }
88 
89 static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */
90 			 u8 i2c_addr,       /* I2C address we're talking to */
91 			 u8 *data,          /* Data to write */
92 			 u16 dlen,          /* Size of data to write */
93 			 u8 *res,           /* Where to put data we read */
94 			 u16 rlen)          /* Amount of data to read */
95 {
96 	/* Return value - default 0 means success */
97 	int ret;
98 
99 
100 	if (!data) dlen = 0;
101 	if (dlen > (sizeof(hdw->cmd_buffer) - 4)) {
102 		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
103 			   "Killing an I2C read to %u that has wlen too large (desired=%u limit=%u)",
104 			   i2c_addr,
105 			   dlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 4));
106 		return -ENOTSUPP;
107 	}
108 	if (res && (rlen > (sizeof(hdw->cmd_buffer) - 1))) {
109 		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
110 			   "Killing an I2C read to %u that has rlen too large (desired=%u limit=%u)",
111 			   i2c_addr,
112 			   rlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 1));
113 		return -ENOTSUPP;
114 	}
115 
116 	LOCK_TAKE(hdw->ctl_lock);
117 
118 	/* Clear the command buffer (likely to be paranoia) */
119 	memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
120 
121 	/* Set up command buffer for an I2C write followed by a read */
122 	hdw->cmd_buffer[0] = FX2CMD_I2C_READ;  /* read prefix */
123 	hdw->cmd_buffer[1] = dlen;  /* arg length */
124 	hdw->cmd_buffer[2] = rlen;  /* answer length. Device will send one
125 				       more byte (status). */
126 	hdw->cmd_buffer[3] = i2c_addr;  /* i2c addr of chip */
127 	if (dlen) memcpy(hdw->cmd_buffer + 4, data, dlen);
128 
129 	/* Do the operation */
130 	ret = pvr2_send_request(hdw,
131 				hdw->cmd_buffer,
132 				4 + dlen,
133 				hdw->cmd_buffer,
134 				rlen + 1);
135 	if (!ret) {
136 		if (hdw->cmd_buffer[0] != 8) {
137 			ret = -EIO;
138 			if (hdw->cmd_buffer[0] != 7) {
139 				trace_i2c("unexpected status from i2_read[%d]: %d",
140 					  i2c_addr,hdw->cmd_buffer[0]);
141 			}
142 		}
143 	}
144 
145 	/* Copy back the result */
146 	if (res && rlen) {
147 		if (ret) {
148 			/* Error, just blank out the return buffer */
149 			memset(res, 0, rlen);
150 		} else {
151 			memcpy(res, hdw->cmd_buffer + 1, rlen);
152 		}
153 	}
154 
155 	LOCK_GIVE(hdw->ctl_lock);
156 
157 	return ret;
158 }
159 
160 /* This is the common low level entry point for doing I2C operations to the
161    hardware. */
162 static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
163 			     u8 i2c_addr,
164 			     u8 *wdata,
165 			     u16 wlen,
166 			     u8 *rdata,
167 			     u16 rlen)
168 {
169 	if (!rdata) rlen = 0;
170 	if (!wdata) wlen = 0;
171 	if (rlen || !wlen) {
172 		return pvr2_i2c_read(hdw,i2c_addr,wdata,wlen,rdata,rlen);
173 	} else {
174 		return pvr2_i2c_write(hdw,i2c_addr,wdata,wlen);
175 	}
176 }
177 
178 
179 /* This is a special entry point for cases of I2C transaction attempts to
180    the IR receiver.  The implementation here simulates the IR receiver by
181    issuing a command to the FX2 firmware and using that response to return
182    what the real I2C receiver would have returned.  We use this for 24xxx
183    devices, where the IR receiver chip has been removed and replaced with
184    FX2 related logic. */
185 static int i2c_24xxx_ir(struct pvr2_hdw *hdw,
186 			u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
187 {
188 	u8 dat[4];
189 	unsigned int stat;
190 
191 	if (!(rlen || wlen)) {
192 		/* This is a probe attempt.  Just let it succeed. */
193 		return 0;
194 	}
195 
196 	/* We don't understand this kind of transaction */
197 	if ((wlen != 0) || (rlen == 0)) return -EIO;
198 
199 	if (rlen < 3) {
200 		/* Mike Isely <isely@pobox.com> Appears to be a probe
201 		   attempt from lirc.  Just fill in zeroes and return.  If
202 		   we try instead to do the full transaction here, then bad
203 		   things seem to happen within the lirc driver module
204 		   (version 0.8.0-7 sources from Debian, when run under
205 		   vanilla 2.6.17.6 kernel) - and I don't have the patience
206 		   to chase it down. */
207 		if (rlen > 0) rdata[0] = 0;
208 		if (rlen > 1) rdata[1] = 0;
209 		return 0;
210 	}
211 
212 	/* Issue a command to the FX2 to read the IR receiver. */
213 	LOCK_TAKE(hdw->ctl_lock); do {
214 		hdw->cmd_buffer[0] = FX2CMD_GET_IR_CODE;
215 		stat = pvr2_send_request(hdw,
216 					 hdw->cmd_buffer,1,
217 					 hdw->cmd_buffer,4);
218 		dat[0] = hdw->cmd_buffer[0];
219 		dat[1] = hdw->cmd_buffer[1];
220 		dat[2] = hdw->cmd_buffer[2];
221 		dat[3] = hdw->cmd_buffer[3];
222 	} while (0); LOCK_GIVE(hdw->ctl_lock);
223 
224 	/* Give up if that operation failed. */
225 	if (stat != 0) return stat;
226 
227 	/* Mangle the results into something that looks like the real IR
228 	   receiver. */
229 	rdata[2] = 0xc1;
230 	if (dat[0] != 1) {
231 		/* No code received. */
232 		rdata[0] = 0;
233 		rdata[1] = 0;
234 	} else {
235 		u16 val;
236 		/* Mash the FX2 firmware-provided IR code into something
237 		   that the normal i2c chip-level driver expects. */
238 		val = dat[1];
239 		val <<= 8;
240 		val |= dat[2];
241 		val >>= 1;
242 		val &= ~0x0003;
243 		val |= 0x8000;
244 		rdata[0] = (val >> 8) & 0xffu;
245 		rdata[1] = val & 0xffu;
246 	}
247 
248 	return 0;
249 }
250 
251 /* This is a special entry point that is entered if an I2C operation is
252    attempted to a wm8775 chip on model 24xxx hardware.  Autodetect of this
253    part doesn't work, but we know it is really there.  So let's look for
254    the autodetect attempt and just return success if we see that. */
255 static int i2c_hack_wm8775(struct pvr2_hdw *hdw,
256 			   u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
257 {
258 	if (!(rlen || wlen)) {
259 		// This is a probe attempt.  Just let it succeed.
260 		return 0;
261 	}
262 	return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
263 }
264 
265 /* This is an entry point designed to always fail any attempt to perform a
266    transfer.  We use this to cause certain I2C addresses to not be
267    probed. */
268 static int i2c_black_hole(struct pvr2_hdw *hdw,
269 			   u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
270 {
271 	return -EIO;
272 }
273 
274 /* This is a special entry point that is entered if an I2C operation is
275    attempted to a cx25840 chip on model 24xxx hardware.  This chip can
276    sometimes wedge itself.  Worse still, when this happens msp3400 can
277    falsely detect this part and then the system gets hosed up after msp3400
278    gets confused and dies.  What we want to do here is try to keep msp3400
279    away and also try to notice if the chip is wedged and send a warning to
280    the system log. */
281 static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
282 			    u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
283 {
284 	int ret;
285 	unsigned int subaddr;
286 	u8 wbuf[2];
287 	int state = hdw->i2c_cx25840_hack_state;
288 
289 	if (!(rlen || wlen)) {
290 		// Probe attempt - always just succeed and don't bother the
291 		// hardware (this helps to make the state machine further
292 		// down somewhat easier).
293 		return 0;
294 	}
295 
296 	if (state == 3) {
297 		return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
298 	}
299 
300 	/* We're looking for the exact pattern where the revision register
301 	   is being read.  The cx25840 module will always look at the
302 	   revision register first.  Any other pattern of access therefore
303 	   has to be a probe attempt from somebody else so we'll reject it.
304 	   Normally we could just let each client just probe the part
305 	   anyway, but when the cx25840 is wedged, msp3400 will get a false
306 	   positive and that just screws things up... */
307 
308 	if (wlen == 0) {
309 		switch (state) {
310 		case 1: subaddr = 0x0100; break;
311 		case 2: subaddr = 0x0101; break;
312 		default: goto fail;
313 		}
314 	} else if (wlen == 2) {
315 		subaddr = (wdata[0] << 8) | wdata[1];
316 		switch (subaddr) {
317 		case 0x0100: state = 1; break;
318 		case 0x0101: state = 2; break;
319 		default: goto fail;
320 		}
321 	} else {
322 		goto fail;
323 	}
324 	if (!rlen) goto success;
325 	state = 0;
326 	if (rlen != 1) goto fail;
327 
328 	/* If we get to here then we have a legitimate read for one of the
329 	   two revision bytes, so pass it through. */
330 	wbuf[0] = subaddr >> 8;
331 	wbuf[1] = subaddr;
332 	ret = pvr2_i2c_basic_op(hdw,i2c_addr,wbuf,2,rdata,rlen);
333 
334 	if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) {
335 		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
336 			   "***WARNING*** Detected a wedged cx25840 chip; the device will not work.");
337 		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
338 			   "***WARNING*** Try power cycling the pvrusb2 device.");
339 		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
340 			   "***WARNING*** Disabling further access to the device to prevent other foul-ups.");
341 		// This blocks all further communication with the part.
342 		hdw->i2c_func[0x44] = NULL;
343 		pvr2_hdw_render_useless(hdw);
344 		goto fail;
345 	}
346 
347 	/* Success! */
348 	pvr2_trace(PVR2_TRACE_CHIPS,"cx25840 appears to be OK.");
349 	state = 3;
350 
351  success:
352 	hdw->i2c_cx25840_hack_state = state;
353 	return 0;
354 
355  fail:
356 	hdw->i2c_cx25840_hack_state = state;
357 	return -EIO;
358 }
359 
360 /* This is a very, very limited I2C adapter implementation.  We can only
361    support what we actually know will work on the device... */
362 static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
363 			 struct i2c_msg msgs[],
364 			 int num)
365 {
366 	int ret = -ENOTSUPP;
367 	pvr2_i2c_func funcp = NULL;
368 	struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
369 
370 	if (!num) {
371 		ret = -EINVAL;
372 		goto done;
373 	}
374 	if (msgs[0].addr < PVR2_I2C_FUNC_CNT) {
375 		funcp = hdw->i2c_func[msgs[0].addr];
376 	}
377 	if (!funcp) {
378 		ret = -EIO;
379 		goto done;
380 	}
381 
382 	if (num == 1) {
383 		if (msgs[0].flags & I2C_M_RD) {
384 			/* Simple read */
385 			u16 tcnt,bcnt,offs;
386 			if (!msgs[0].len) {
387 				/* Length == 0 read.  This is a probe. */
388 				if (funcp(hdw,msgs[0].addr,NULL,0,NULL,0)) {
389 					ret = -EIO;
390 					goto done;
391 				}
392 				ret = 1;
393 				goto done;
394 			}
395 			/* If the read is short enough we'll do the whole
396 			   thing atomically.  Otherwise we have no choice
397 			   but to break apart the reads. */
398 			tcnt = msgs[0].len;
399 			offs = 0;
400 			while (tcnt) {
401 				bcnt = tcnt;
402 				if (bcnt > sizeof(hdw->cmd_buffer)-1) {
403 					bcnt = sizeof(hdw->cmd_buffer)-1;
404 				}
405 				if (funcp(hdw,msgs[0].addr,NULL,0,
406 					  msgs[0].buf+offs,bcnt)) {
407 					ret = -EIO;
408 					goto done;
409 				}
410 				offs += bcnt;
411 				tcnt -= bcnt;
412 			}
413 			ret = 1;
414 			goto done;
415 		} else {
416 			/* Simple write */
417 			ret = 1;
418 			if (funcp(hdw,msgs[0].addr,
419 				  msgs[0].buf,msgs[0].len,NULL,0)) {
420 				ret = -EIO;
421 			}
422 			goto done;
423 		}
424 	} else if (num == 2) {
425 		if (msgs[0].addr != msgs[1].addr) {
426 			trace_i2c("i2c refusing 2 phase transfer with conflicting target addresses");
427 			ret = -ENOTSUPP;
428 			goto done;
429 		}
430 		if ((!((msgs[0].flags & I2C_M_RD))) &&
431 		    (msgs[1].flags & I2C_M_RD)) {
432 			u16 tcnt,bcnt,wcnt,offs;
433 			/* Write followed by atomic read.  If the read
434 			   portion is short enough we'll do the whole thing
435 			   atomically.  Otherwise we have no choice but to
436 			   break apart the reads. */
437 			tcnt = msgs[1].len;
438 			wcnt = msgs[0].len;
439 			offs = 0;
440 			while (tcnt || wcnt) {
441 				bcnt = tcnt;
442 				if (bcnt > sizeof(hdw->cmd_buffer)-1) {
443 					bcnt = sizeof(hdw->cmd_buffer)-1;
444 				}
445 				if (funcp(hdw,msgs[0].addr,
446 					  msgs[0].buf,wcnt,
447 					  msgs[1].buf+offs,bcnt)) {
448 					ret = -EIO;
449 					goto done;
450 				}
451 				offs += bcnt;
452 				tcnt -= bcnt;
453 				wcnt = 0;
454 			}
455 			ret = 2;
456 			goto done;
457 		} else {
458 			trace_i2c("i2c refusing complex transfer read0=%d read1=%d",
459 				  (msgs[0].flags & I2C_M_RD),
460 				  (msgs[1].flags & I2C_M_RD));
461 		}
462 	} else {
463 		trace_i2c("i2c refusing %d phase transfer",num);
464 	}
465 
466  done:
467 	if (pvrusb2_debug & PVR2_TRACE_I2C_TRAF) {
468 		unsigned int idx,offs,cnt;
469 		for (idx = 0; idx < num; idx++) {
470 			cnt = msgs[idx].len;
471 			pr_info("pvrusb2 i2c xfer %u/%u: addr=0x%x len=%d %s",
472 			       idx+1,num,
473 			       msgs[idx].addr,
474 			       cnt,
475 			       (msgs[idx].flags & I2C_M_RD ?
476 				"read" : "write"));
477 			if ((ret > 0) || !(msgs[idx].flags & I2C_M_RD)) {
478 				if (cnt > 8) cnt = 8;
479 				pr_cont(" [");
480 				for (offs = 0; offs < cnt; offs++) {
481 					if (offs) pr_cont(" ");
482 					pr_cont("%02x", msgs[idx].buf[offs]);
483 				}
484 				if (offs < cnt) pr_cont(" ...");
485 				pr_cont("]");
486 			}
487 			if (idx+1 == num) {
488 				pr_cont(" result=%d", ret);
489 			}
490 			pr_cont("\n");
491 		}
492 		if (!num) {
493 			pr_info("pvrusb2 i2c xfer null transfer result=%d\n",
494 			       ret);
495 		}
496 	}
497 	return ret;
498 }
499 
500 static u32 pvr2_i2c_functionality(struct i2c_adapter *adap)
501 {
502 	return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
503 }
504 
505 static const struct i2c_algorithm pvr2_i2c_algo_template = {
506 	.master_xfer   = pvr2_i2c_xfer,
507 	.functionality = pvr2_i2c_functionality,
508 };
509 
510 static const struct i2c_adapter pvr2_i2c_adap_template = {
511 	.owner         = THIS_MODULE,
512 	.class	       = 0,
513 };
514 
515 
516 /* Return true if device exists at given address */
517 static int do_i2c_probe(struct pvr2_hdw *hdw, int addr)
518 {
519 	struct i2c_msg msg[1];
520 	int rc;
521 	msg[0].addr = 0;
522 	msg[0].flags = I2C_M_RD;
523 	msg[0].len = 0;
524 	msg[0].buf = NULL;
525 	msg[0].addr = addr;
526 	rc = i2c_transfer(&hdw->i2c_adap, msg, ARRAY_SIZE(msg));
527 	return rc == 1;
528 }
529 
530 static void do_i2c_scan(struct pvr2_hdw *hdw)
531 {
532 	int i;
533 	pr_info("%s: i2c scan beginning\n", hdw->name);
534 	for (i = 0; i < 128; i++) {
535 		if (do_i2c_probe(hdw, i)) {
536 			pr_info("%s: i2c scan: found device @ 0x%x\n",
537 			       hdw->name, i);
538 		}
539 	}
540 	pr_info("%s: i2c scan done.\n", hdw->name);
541 }
542 
543 static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw)
544 {
545 	struct i2c_board_info info;
546 	struct IR_i2c_init_data *init_data = &hdw->ir_init_data;
547 	if (pvr2_disable_ir_video) {
548 		pvr2_trace(PVR2_TRACE_INFO,
549 			   "Automatic binding of ir_video has been disabled.");
550 		return;
551 	}
552 	memset(&info, 0, sizeof(struct i2c_board_info));
553 	switch (hdw->ir_scheme_active) {
554 	case PVR2_IR_SCHEME_24XXX: /* FX2-controlled IR */
555 	case PVR2_IR_SCHEME_29XXX: /* Original 29xxx device */
556 		init_data->ir_codes              = RC_MAP_HAUPPAUGE;
557 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP;
558 		init_data->type                  = RC_PROTO_BIT_RC5;
559 		init_data->name                  = hdw->hdw_desc->description;
560 		init_data->polling_interval      = 100; /* ms From ir-kbd-i2c */
561 		/* IR Receiver */
562 		info.addr          = 0x18;
563 		info.platform_data = init_data;
564 		strscpy(info.type, "ir_video", I2C_NAME_SIZE);
565 		pvr2_trace(PVR2_TRACE_INFO, "Binding %s to i2c address 0x%02x.",
566 			   info.type, info.addr);
567 		i2c_new_client_device(&hdw->i2c_adap, &info);
568 		break;
569 	case PVR2_IR_SCHEME_ZILOG:     /* HVR-1950 style */
570 	case PVR2_IR_SCHEME_24XXX_MCE: /* 24xxx MCE device */
571 		init_data->ir_codes = RC_MAP_HAUPPAUGE;
572 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
573 		init_data->type = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE |
574 							RC_PROTO_BIT_RC6_6A_32;
575 		init_data->name = hdw->hdw_desc->description;
576 		/* IR Transceiver */
577 		info.addr = 0x71;
578 		info.platform_data = init_data;
579 		strscpy(info.type, "ir_z8f0811_haup", I2C_NAME_SIZE);
580 		pvr2_trace(PVR2_TRACE_INFO, "Binding %s to i2c address 0x%02x.",
581 			   info.type, info.addr);
582 		i2c_new_client_device(&hdw->i2c_adap, &info);
583 		break;
584 	default:
585 		/* The device either doesn't support I2C-based IR or we
586 		   don't know (yet) how to operate IR on the device. */
587 		break;
588 	}
589 }
590 
591 void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
592 {
593 	unsigned int idx;
594 
595 	/* The default action for all possible I2C addresses is just to do
596 	   the transfer normally. */
597 	for (idx = 0; idx < PVR2_I2C_FUNC_CNT; idx++) {
598 		hdw->i2c_func[idx] = pvr2_i2c_basic_op;
599 	}
600 
601 	/* However, deal with various special cases for 24xxx hardware. */
602 	if (ir_mode[hdw->unit_number] == 0) {
603 		pr_info("%s: IR disabled\n", hdw->name);
604 		hdw->i2c_func[0x18] = i2c_black_hole;
605 	} else if (ir_mode[hdw->unit_number] == 1) {
606 		if (hdw->ir_scheme_active == PVR2_IR_SCHEME_24XXX) {
607 			/* Set up translation so that our IR looks like a
608 			   29xxx device */
609 			hdw->i2c_func[0x18] = i2c_24xxx_ir;
610 		}
611 	}
612 	if (hdw->hdw_desc->flag_has_cx25840) {
613 		hdw->i2c_func[0x44] = i2c_hack_cx25840;
614 	}
615 	if (hdw->hdw_desc->flag_has_wm8775) {
616 		hdw->i2c_func[0x1b] = i2c_hack_wm8775;
617 	}
618 
619 	// Configure the adapter and set up everything else related to it.
620 	hdw->i2c_adap = pvr2_i2c_adap_template;
621 	hdw->i2c_algo = pvr2_i2c_algo_template;
622 	strscpy(hdw->i2c_adap.name, hdw->name, sizeof(hdw->i2c_adap.name));
623 	hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev;
624 	hdw->i2c_adap.algo = &hdw->i2c_algo;
625 	hdw->i2c_adap.algo_data = hdw;
626 	hdw->i2c_linked = !0;
627 	i2c_set_adapdata(&hdw->i2c_adap, &hdw->v4l2_dev);
628 	i2c_add_adapter(&hdw->i2c_adap);
629 	if (hdw->i2c_func[0x18] == i2c_24xxx_ir) {
630 		/* Probe for a different type of IR receiver on this
631 		   device.  This is really the only way to differentiate
632 		   older 24xxx devices from 24xxx variants that include an
633 		   IR blaster.  If the IR blaster is present, the IR
634 		   receiver is part of that chip and thus we must disable
635 		   the emulated IR receiver. */
636 		if (do_i2c_probe(hdw, 0x71)) {
637 			pvr2_trace(PVR2_TRACE_INFO,
638 				   "Device has newer IR hardware; disabling unneeded virtual IR device");
639 			hdw->i2c_func[0x18] = NULL;
640 			/* Remember that this is a different device... */
641 			hdw->ir_scheme_active = PVR2_IR_SCHEME_24XXX_MCE;
642 		}
643 	}
644 	if (i2c_scan) do_i2c_scan(hdw);
645 
646 	pvr2_i2c_register_ir(hdw);
647 }
648 
649 void pvr2_i2c_core_done(struct pvr2_hdw *hdw)
650 {
651 	if (hdw->i2c_linked) {
652 		i2c_del_adapter(&hdw->i2c_adap);
653 		hdw->i2c_linked = 0;
654 	}
655 }
656