4 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
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
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.
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
21 #include <linux/i2c.h>
22 #include <linux/module.h>
23 #include <media/i2c/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"
30 #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
34 This module attempts to implement a compliant I2C adapter for the pvrusb2
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");
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");
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");
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 */
58 /* Return value - default 0 means success */
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)",
68 length
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 3));
72 LOCK_TAKE(hdw
->ctl_lock
);
74 /* Clear the command buffer (likely to be paranoia) */
75 memset(hdw
->cmd_buffer
, 0, sizeof(hdw
->cmd_buffer
));
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
);
83 /* Do the operation */
84 ret
= pvr2_send_request(hdw
,
90 if (hdw
->cmd_buffer
[0] != 8) {
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]);
100 LOCK_GIVE(hdw
->ctl_lock
);
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 */
112 /* Return value - default 0 means success */
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)",
122 dlen
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 4));
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)",
130 rlen
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 1));
134 LOCK_TAKE(hdw
->ctl_lock
);
136 /* Clear the command buffer (likely to be paranoia) */
137 memset(hdw
->cmd_buffer
, 0, sizeof(hdw
->cmd_buffer
));
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
);
147 /* Do the operation */
148 ret
= pvr2_send_request(hdw
,
154 if (hdw
->cmd_buffer
[0] != 8) {
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]);
164 /* Copy back the result */
167 /* Error, just blank out the return buffer */
168 memset(res
, 0, rlen
);
170 memcpy(res
, hdw
->cmd_buffer
+ 1, rlen
);
174 LOCK_GIVE(hdw
->ctl_lock
);
179 /* This is the common low level entry point for doing I2C operations to the
181 static int pvr2_i2c_basic_op(struct pvr2_hdw
*hdw
,
188 if (!rdata
) rlen
= 0;
189 if (!wdata
) wlen
= 0;
191 return pvr2_i2c_read(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
193 return pvr2_i2c_write(hdw
,i2c_addr
,wdata
,wlen
);
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
)
210 if (!(rlen
|| wlen
)) {
211 /* This is a probe attempt. Just let it succeed. */
215 /* We don't understand this kind of transaction */
216 if ((wlen
!= 0) || (rlen
== 0)) return -EIO
;
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
226 if (rlen
> 0) rdata
[0] = 0;
227 if (rlen
> 1) rdata
[1] = 0;
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
,
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
);
243 /* Give up if that operation failed. */
244 if (stat
!= 0) return stat
;
246 /* Mangle the results into something that looks like the real IR
250 /* No code received. */
255 /* Mash the FX2 firmware-provided IR code into something
256 that the normal i2c chip-level driver expects. */
263 rdata
[0] = (val
>> 8) & 0xffu
;
264 rdata
[1] = val
& 0xffu
;
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
)
277 if (!(rlen
|| wlen
)) {
278 // This is a probe attempt. Just let it succeed.
281 return pvr2_i2c_basic_op(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
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
287 static int i2c_black_hole(struct pvr2_hdw
*hdw
,
288 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
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
300 static int i2c_hack_cx25840(struct pvr2_hdw
*hdw
,
301 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
304 unsigned int subaddr
;
306 int state
= hdw
->i2c_cx25840_hack_state
;
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).
316 return pvr2_i2c_basic_op(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
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... */
329 case 1: subaddr
= 0x0100; break;
330 case 2: subaddr
= 0x0101; break;
333 } else if (wlen
== 2) {
334 subaddr
= (wdata
[0] << 8) | wdata
[1];
336 case 0x0100: state
= 1; break;
337 case 0x0101: state
= 2; break;
343 if (!rlen
) goto success
;
345 if (rlen
!= 1) goto fail
;
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;
351 ret
= pvr2_i2c_basic_op(hdw
,i2c_addr
,wbuf
,2,rdata
,rlen
);
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
);
369 pvr2_trace(PVR2_TRACE_CHIPS
,"cx25840 appears to be OK.");
373 hdw
->i2c_cx25840_hack_state
= state
;
377 hdw
->i2c_cx25840_hack_state
= state
;
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
[],
388 pvr2_i2c_func funcp
= NULL
;
389 struct pvr2_hdw
*hdw
= (struct pvr2_hdw
*)(i2c_adap
->algo_data
);
395 if (msgs
[0].addr
< PVR2_I2C_FUNC_CNT
) {
396 funcp
= hdw
->i2c_func
[msgs
[0].addr
];
404 if (msgs
[0].flags
& I2C_M_RD
) {
408 /* Length == 0 read. This is a probe. */
409 if (funcp(hdw
,msgs
[0].addr
,NULL
,0,NULL
,0)) {
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. */
423 if (bcnt
> sizeof(hdw
->cmd_buffer
)-1) {
424 bcnt
= sizeof(hdw
->cmd_buffer
)-1;
426 if (funcp(hdw
,msgs
[0].addr
,NULL
,0,
427 msgs
[0].buf
+offs
,bcnt
)) {
439 if (funcp(hdw
,msgs
[0].addr
,
440 msgs
[0].buf
,msgs
[0].len
,NULL
,0)) {
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");
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. */
462 while (tcnt
|| wcnt
) {
464 if (bcnt
> sizeof(hdw
->cmd_buffer
)-1) {
465 bcnt
= sizeof(hdw
->cmd_buffer
)-1;
467 if (funcp(hdw
,msgs
[0].addr
,
469 msgs
[1].buf
+offs
,bcnt
)) {
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
));
486 trace_i2c("i2c refusing %d phase transfer",num
);
490 if (pvrusb2_debug
& PVR2_TRACE_I2C_TRAF
) {
491 unsigned int idx
,offs
,cnt
;
492 for (idx
= 0; idx
< num
; idx
++) {
495 "pvrusb2 i2c xfer %u/%u:"
496 " addr=0x%x len=%d %s",
500 (msgs
[idx
].flags
& I2C_M_RD
?
502 if ((ret
> 0) || !(msgs
[idx
].flags
& I2C_M_RD
)) {
503 if (cnt
> 8) cnt
= 8;
505 for (offs
= 0; offs
< (cnt
>8?8:cnt
); offs
++) {
506 if (offs
) printk(" ");
507 printk("%02x",msgs
[idx
].buf
[offs
]);
509 if (offs
< cnt
) printk(" ...");
513 printk(" result=%d",ret
);
519 "pvrusb2 i2c xfer null transfer result=%d\n",
526 static u32
pvr2_i2c_functionality(struct i2c_adapter
*adap
)
528 return I2C_FUNC_SMBUS_EMUL
| I2C_FUNC_I2C
;
531 static struct i2c_algorithm pvr2_i2c_algo_template
= {
532 .master_xfer
= pvr2_i2c_xfer
,
533 .functionality
= pvr2_i2c_functionality
,
536 static struct i2c_adapter pvr2_i2c_adap_template
= {
537 .owner
= THIS_MODULE
,
542 /* Return true if device exists at given address */
543 static int do_i2c_probe(struct pvr2_hdw
*hdw
, int addr
)
545 struct i2c_msg msg
[1];
548 msg
[0].flags
= I2C_M_RD
;
552 rc
= i2c_transfer(&hdw
->i2c_adap
, msg
, ARRAY_SIZE(msg
));
556 static void do_i2c_scan(struct pvr2_hdw
*hdw
)
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",
566 printk(KERN_INFO
"%s: i2c scan done.\n", hdw
->name
);
569 static void pvr2_i2c_register_ir(struct pvr2_hdw
*hdw
)
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.");
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 */
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
);
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
| RC_BIT_RC6_MCE
|
601 init_data
->name
= hdw
->hdw_desc
->description
;
604 info
.platform_data
= init_data
;
605 strlcpy(info
.type
, "ir_rx_z8f0811_haup", I2C_NAME_SIZE
);
606 pvr2_trace(PVR2_TRACE_INFO
, "Binding %s to i2c address 0x%02x.",
607 info
.type
, info
.addr
);
608 i2c_new_device(&hdw
->i2c_adap
, &info
);
611 info
.platform_data
= init_data
;
612 strlcpy(info
.type
, "ir_tx_z8f0811_haup", I2C_NAME_SIZE
);
613 pvr2_trace(PVR2_TRACE_INFO
, "Binding %s to i2c address 0x%02x.",
614 info
.type
, info
.addr
);
615 i2c_new_device(&hdw
->i2c_adap
, &info
);
618 /* The device either doesn't support I2C-based IR or we
619 don't know (yet) how to operate IR on the device. */
624 void pvr2_i2c_core_init(struct pvr2_hdw
*hdw
)
628 /* The default action for all possible I2C addresses is just to do
629 the transfer normally. */
630 for (idx
= 0; idx
< PVR2_I2C_FUNC_CNT
; idx
++) {
631 hdw
->i2c_func
[idx
] = pvr2_i2c_basic_op
;
634 /* However, deal with various special cases for 24xxx hardware. */
635 if (ir_mode
[hdw
->unit_number
] == 0) {
636 printk(KERN_INFO
"%s: IR disabled\n",hdw
->name
);
637 hdw
->i2c_func
[0x18] = i2c_black_hole
;
638 } else if (ir_mode
[hdw
->unit_number
] == 1) {
639 if (hdw
->ir_scheme_active
== PVR2_IR_SCHEME_24XXX
) {
640 /* Set up translation so that our IR looks like a
642 hdw
->i2c_func
[0x18] = i2c_24xxx_ir
;
645 if (hdw
->hdw_desc
->flag_has_cx25840
) {
646 hdw
->i2c_func
[0x44] = i2c_hack_cx25840
;
648 if (hdw
->hdw_desc
->flag_has_wm8775
) {
649 hdw
->i2c_func
[0x1b] = i2c_hack_wm8775
;
652 // Configure the adapter and set up everything else related to it.
653 hdw
->i2c_adap
= pvr2_i2c_adap_template
;
654 hdw
->i2c_algo
= pvr2_i2c_algo_template
;
655 strlcpy(hdw
->i2c_adap
.name
,hdw
->name
,sizeof(hdw
->i2c_adap
.name
));
656 hdw
->i2c_adap
.dev
.parent
= &hdw
->usb_dev
->dev
;
657 hdw
->i2c_adap
.algo
= &hdw
->i2c_algo
;
658 hdw
->i2c_adap
.algo_data
= hdw
;
659 hdw
->i2c_linked
= !0;
660 i2c_set_adapdata(&hdw
->i2c_adap
, &hdw
->v4l2_dev
);
661 i2c_add_adapter(&hdw
->i2c_adap
);
662 if (hdw
->i2c_func
[0x18] == i2c_24xxx_ir
) {
663 /* Probe for a different type of IR receiver on this
664 device. This is really the only way to differentiate
665 older 24xxx devices from 24xxx variants that include an
666 IR blaster. If the IR blaster is present, the IR
667 receiver is part of that chip and thus we must disable
668 the emulated IR receiver. */
669 if (do_i2c_probe(hdw
, 0x71)) {
670 pvr2_trace(PVR2_TRACE_INFO
,
671 "Device has newer IR hardware;"
672 " disabling unneeded virtual IR device");
673 hdw
->i2c_func
[0x18] = NULL
;
674 /* Remember that this is a different device... */
675 hdw
->ir_scheme_active
= PVR2_IR_SCHEME_24XXX_MCE
;
678 if (i2c_scan
) do_i2c_scan(hdw
);
680 pvr2_i2c_register_ir(hdw
);
683 void pvr2_i2c_core_done(struct pvr2_hdw
*hdw
)
685 if (hdw
->i2c_linked
) {
686 i2c_del_adapter(&hdw
->i2c_adap
);