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