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 (desired=%u limit=%u)",
67 length
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 3));
71 LOCK_TAKE(hdw
->ctl_lock
);
73 /* Clear the command buffer (likely to be paranoia) */
74 memset(hdw
->cmd_buffer
, 0, sizeof(hdw
->cmd_buffer
));
76 /* Set up command buffer for an I2C write */
77 hdw
->cmd_buffer
[0] = FX2CMD_I2C_WRITE
; /* write prefix */
78 hdw
->cmd_buffer
[1] = i2c_addr
; /* i2c addr of chip */
79 hdw
->cmd_buffer
[2] = length
; /* length of what follows */
80 if (length
) memcpy(hdw
->cmd_buffer
+ 3, data
, length
);
82 /* Do the operation */
83 ret
= pvr2_send_request(hdw
,
89 if (hdw
->cmd_buffer
[0] != 8) {
91 if (hdw
->cmd_buffer
[0] != 7) {
92 trace_i2c("unexpected status from i2_write[%d]: %d",
93 i2c_addr
,hdw
->cmd_buffer
[0]);
98 LOCK_GIVE(hdw
->ctl_lock
);
103 static int pvr2_i2c_read(struct pvr2_hdw
*hdw
, /* Context */
104 u8 i2c_addr
, /* I2C address we're talking to */
105 u8
*data
, /* Data to write */
106 u16 dlen
, /* Size of data to write */
107 u8
*res
, /* Where to put data we read */
108 u16 rlen
) /* Amount of data to read */
110 /* Return value - default 0 means success */
115 if (dlen
> (sizeof(hdw
->cmd_buffer
) - 4)) {
116 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
117 "Killing an I2C read to %u that has wlen too large (desired=%u limit=%u)",
119 dlen
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 4));
122 if (res
&& (rlen
> (sizeof(hdw
->cmd_buffer
) - 1))) {
123 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
124 "Killing an I2C read to %u that has rlen too large (desired=%u limit=%u)",
126 rlen
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 1));
130 LOCK_TAKE(hdw
->ctl_lock
);
132 /* Clear the command buffer (likely to be paranoia) */
133 memset(hdw
->cmd_buffer
, 0, sizeof(hdw
->cmd_buffer
));
135 /* Set up command buffer for an I2C write followed by a read */
136 hdw
->cmd_buffer
[0] = FX2CMD_I2C_READ
; /* read prefix */
137 hdw
->cmd_buffer
[1] = dlen
; /* arg length */
138 hdw
->cmd_buffer
[2] = rlen
; /* answer length. Device will send one
139 more byte (status). */
140 hdw
->cmd_buffer
[3] = i2c_addr
; /* i2c addr of chip */
141 if (dlen
) memcpy(hdw
->cmd_buffer
+ 4, data
, dlen
);
143 /* Do the operation */
144 ret
= pvr2_send_request(hdw
,
150 if (hdw
->cmd_buffer
[0] != 8) {
152 if (hdw
->cmd_buffer
[0] != 7) {
153 trace_i2c("unexpected status from i2_read[%d]: %d",
154 i2c_addr
,hdw
->cmd_buffer
[0]);
159 /* Copy back the result */
162 /* Error, just blank out the return buffer */
163 memset(res
, 0, rlen
);
165 memcpy(res
, hdw
->cmd_buffer
+ 1, rlen
);
169 LOCK_GIVE(hdw
->ctl_lock
);
174 /* This is the common low level entry point for doing I2C operations to the
176 static int pvr2_i2c_basic_op(struct pvr2_hdw
*hdw
,
183 if (!rdata
) rlen
= 0;
184 if (!wdata
) wlen
= 0;
186 return pvr2_i2c_read(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
188 return pvr2_i2c_write(hdw
,i2c_addr
,wdata
,wlen
);
193 /* This is a special entry point for cases of I2C transaction attempts to
194 the IR receiver. The implementation here simulates the IR receiver by
195 issuing a command to the FX2 firmware and using that response to return
196 what the real I2C receiver would have returned. We use this for 24xxx
197 devices, where the IR receiver chip has been removed and replaced with
198 FX2 related logic. */
199 static int i2c_24xxx_ir(struct pvr2_hdw
*hdw
,
200 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
205 if (!(rlen
|| wlen
)) {
206 /* This is a probe attempt. Just let it succeed. */
210 /* We don't understand this kind of transaction */
211 if ((wlen
!= 0) || (rlen
== 0)) return -EIO
;
214 /* Mike Isely <isely@pobox.com> Appears to be a probe
215 attempt from lirc. Just fill in zeroes and return. If
216 we try instead to do the full transaction here, then bad
217 things seem to happen within the lirc driver module
218 (version 0.8.0-7 sources from Debian, when run under
219 vanilla 2.6.17.6 kernel) - and I don't have the patience
221 if (rlen
> 0) rdata
[0] = 0;
222 if (rlen
> 1) rdata
[1] = 0;
226 /* Issue a command to the FX2 to read the IR receiver. */
227 LOCK_TAKE(hdw
->ctl_lock
); do {
228 hdw
->cmd_buffer
[0] = FX2CMD_GET_IR_CODE
;
229 stat
= pvr2_send_request(hdw
,
232 dat
[0] = hdw
->cmd_buffer
[0];
233 dat
[1] = hdw
->cmd_buffer
[1];
234 dat
[2] = hdw
->cmd_buffer
[2];
235 dat
[3] = hdw
->cmd_buffer
[3];
236 } while (0); LOCK_GIVE(hdw
->ctl_lock
);
238 /* Give up if that operation failed. */
239 if (stat
!= 0) return stat
;
241 /* Mangle the results into something that looks like the real IR
245 /* No code received. */
250 /* Mash the FX2 firmware-provided IR code into something
251 that the normal i2c chip-level driver expects. */
258 rdata
[0] = (val
>> 8) & 0xffu
;
259 rdata
[1] = val
& 0xffu
;
265 /* This is a special entry point that is entered if an I2C operation is
266 attempted to a wm8775 chip on model 24xxx hardware. Autodetect of this
267 part doesn't work, but we know it is really there. So let's look for
268 the autodetect attempt and just return success if we see that. */
269 static int i2c_hack_wm8775(struct pvr2_hdw
*hdw
,
270 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
272 if (!(rlen
|| wlen
)) {
273 // This is a probe attempt. Just let it succeed.
276 return pvr2_i2c_basic_op(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
279 /* This is an entry point designed to always fail any attempt to perform a
280 transfer. We use this to cause certain I2C addresses to not be
282 static int i2c_black_hole(struct pvr2_hdw
*hdw
,
283 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
288 /* This is a special entry point that is entered if an I2C operation is
289 attempted to a cx25840 chip on model 24xxx hardware. This chip can
290 sometimes wedge itself. Worse still, when this happens msp3400 can
291 falsely detect this part and then the system gets hosed up after msp3400
292 gets confused and dies. What we want to do here is try to keep msp3400
293 away and also try to notice if the chip is wedged and send a warning to
295 static int i2c_hack_cx25840(struct pvr2_hdw
*hdw
,
296 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
299 unsigned int subaddr
;
301 int state
= hdw
->i2c_cx25840_hack_state
;
303 if (!(rlen
|| wlen
)) {
304 // Probe attempt - always just succeed and don't bother the
305 // hardware (this helps to make the state machine further
306 // down somewhat easier).
311 return pvr2_i2c_basic_op(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
314 /* We're looking for the exact pattern where the revision register
315 is being read. The cx25840 module will always look at the
316 revision register first. Any other pattern of access therefore
317 has to be a probe attempt from somebody else so we'll reject it.
318 Normally we could just let each client just probe the part
319 anyway, but when the cx25840 is wedged, msp3400 will get a false
320 positive and that just screws things up... */
324 case 1: subaddr
= 0x0100; break;
325 case 2: subaddr
= 0x0101; break;
328 } else if (wlen
== 2) {
329 subaddr
= (wdata
[0] << 8) | wdata
[1];
331 case 0x0100: state
= 1; break;
332 case 0x0101: state
= 2; break;
338 if (!rlen
) goto success
;
340 if (rlen
!= 1) goto fail
;
342 /* If we get to here then we have a legitimate read for one of the
343 two revision bytes, so pass it through. */
344 wbuf
[0] = subaddr
>> 8;
346 ret
= pvr2_i2c_basic_op(hdw
,i2c_addr
,wbuf
,2,rdata
,rlen
);
348 if ((ret
!= 0) || (*rdata
== 0x04) || (*rdata
== 0x0a)) {
349 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
350 "WARNING: Detected a wedged cx25840 chip; the device will not work.");
351 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
352 "WARNING: Try power cycling the pvrusb2 device.");
353 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
354 "WARNING: Disabling further access to the device to prevent other foul-ups.");
355 // This blocks all further communication with the part.
356 hdw
->i2c_func
[0x44] = NULL
;
357 pvr2_hdw_render_useless(hdw
);
362 pvr2_trace(PVR2_TRACE_CHIPS
,"cx25840 appears to be OK.");
366 hdw
->i2c_cx25840_hack_state
= state
;
370 hdw
->i2c_cx25840_hack_state
= state
;
374 /* This is a very, very limited I2C adapter implementation. We can only
375 support what we actually know will work on the device... */
376 static int pvr2_i2c_xfer(struct i2c_adapter
*i2c_adap
,
377 struct i2c_msg msgs
[],
381 pvr2_i2c_func funcp
= NULL
;
382 struct pvr2_hdw
*hdw
= (struct pvr2_hdw
*)(i2c_adap
->algo_data
);
388 if (msgs
[0].addr
< PVR2_I2C_FUNC_CNT
) {
389 funcp
= hdw
->i2c_func
[msgs
[0].addr
];
397 if (msgs
[0].flags
& I2C_M_RD
) {
401 /* Length == 0 read. This is a probe. */
402 if (funcp(hdw
,msgs
[0].addr
,NULL
,0,NULL
,0)) {
409 /* If the read is short enough we'll do the whole
410 thing atomically. Otherwise we have no choice
411 but to break apart the reads. */
416 if (bcnt
> sizeof(hdw
->cmd_buffer
)-1) {
417 bcnt
= sizeof(hdw
->cmd_buffer
)-1;
419 if (funcp(hdw
,msgs
[0].addr
,NULL
,0,
420 msgs
[0].buf
+offs
,bcnt
)) {
432 if (funcp(hdw
,msgs
[0].addr
,
433 msgs
[0].buf
,msgs
[0].len
,NULL
,0)) {
438 } else if (num
== 2) {
439 if (msgs
[0].addr
!= msgs
[1].addr
) {
440 trace_i2c("i2c refusing 2 phase transfer with conflicting target addresses");
444 if ((!((msgs
[0].flags
& I2C_M_RD
))) &&
445 (msgs
[1].flags
& I2C_M_RD
)) {
446 u16 tcnt
,bcnt
,wcnt
,offs
;
447 /* Write followed by atomic read. If the read
448 portion is short enough we'll do the whole thing
449 atomically. Otherwise we have no choice but to
450 break apart the reads. */
454 while (tcnt
|| wcnt
) {
456 if (bcnt
> sizeof(hdw
->cmd_buffer
)-1) {
457 bcnt
= sizeof(hdw
->cmd_buffer
)-1;
459 if (funcp(hdw
,msgs
[0].addr
,
461 msgs
[1].buf
+offs
,bcnt
)) {
472 trace_i2c("i2c refusing complex transfer read0=%d read1=%d",
473 (msgs
[0].flags
& I2C_M_RD
),
474 (msgs
[1].flags
& I2C_M_RD
));
477 trace_i2c("i2c refusing %d phase transfer",num
);
481 if (pvrusb2_debug
& PVR2_TRACE_I2C_TRAF
) {
482 unsigned int idx
,offs
,cnt
;
483 for (idx
= 0; idx
< num
; idx
++) {
486 "pvrusb2 i2c xfer %u/%u: addr=0x%x len=%d %s",
490 (msgs
[idx
].flags
& I2C_M_RD
?
492 if ((ret
> 0) || !(msgs
[idx
].flags
& I2C_M_RD
)) {
493 if (cnt
> 8) cnt
= 8;
494 printk(KERN_CONT
" [");
495 for (offs
= 0; offs
< (cnt
>8?8:cnt
); offs
++) {
496 if (offs
) printk(KERN_CONT
" ");
497 printk(KERN_CONT
"%02x",msgs
[idx
].buf
[offs
]);
499 if (offs
< cnt
) printk(KERN_CONT
" ...");
500 printk(KERN_CONT
"]");
503 printk(KERN_CONT
" result=%d",ret
);
505 printk(KERN_CONT
"\n");
509 "pvrusb2 i2c xfer null transfer result=%d\n",
516 static u32
pvr2_i2c_functionality(struct i2c_adapter
*adap
)
518 return I2C_FUNC_SMBUS_EMUL
| I2C_FUNC_I2C
;
521 static struct i2c_algorithm pvr2_i2c_algo_template
= {
522 .master_xfer
= pvr2_i2c_xfer
,
523 .functionality
= pvr2_i2c_functionality
,
526 static struct i2c_adapter pvr2_i2c_adap_template
= {
527 .owner
= THIS_MODULE
,
532 /* Return true if device exists at given address */
533 static int do_i2c_probe(struct pvr2_hdw
*hdw
, int addr
)
535 struct i2c_msg msg
[1];
538 msg
[0].flags
= I2C_M_RD
;
542 rc
= i2c_transfer(&hdw
->i2c_adap
, msg
, ARRAY_SIZE(msg
));
546 static void do_i2c_scan(struct pvr2_hdw
*hdw
)
549 printk(KERN_INFO
"%s: i2c scan beginning\n", hdw
->name
);
550 for (i
= 0; i
< 128; i
++) {
551 if (do_i2c_probe(hdw
, i
)) {
552 printk(KERN_INFO
"%s: i2c scan: found device @ 0x%x\n",
556 printk(KERN_INFO
"%s: i2c scan done.\n", hdw
->name
);
559 static void pvr2_i2c_register_ir(struct pvr2_hdw
*hdw
)
561 struct i2c_board_info info
;
562 struct IR_i2c_init_data
*init_data
= &hdw
->ir_init_data
;
563 if (pvr2_disable_ir_video
) {
564 pvr2_trace(PVR2_TRACE_INFO
,
565 "Automatic binding of ir_video has been disabled.");
568 memset(&info
, 0, sizeof(struct i2c_board_info
));
569 switch (hdw
->ir_scheme_active
) {
570 case PVR2_IR_SCHEME_24XXX
: /* FX2-controlled IR */
571 case PVR2_IR_SCHEME_29XXX
: /* Original 29xxx device */
572 init_data
->ir_codes
= RC_MAP_HAUPPAUGE
;
573 init_data
->internal_get_key_func
= IR_KBD_GET_KEY_HAUP
;
574 init_data
->type
= RC_BIT_RC5
;
575 init_data
->name
= hdw
->hdw_desc
->description
;
576 init_data
->polling_interval
= 100; /* ms From ir-kbd-i2c */
579 info
.platform_data
= init_data
;
580 strlcpy(info
.type
, "ir_video", I2C_NAME_SIZE
);
581 pvr2_trace(PVR2_TRACE_INFO
, "Binding %s to i2c address 0x%02x.",
582 info
.type
, info
.addr
);
583 i2c_new_device(&hdw
->i2c_adap
, &info
);
585 case PVR2_IR_SCHEME_ZILOG
: /* HVR-1950 style */
586 case PVR2_IR_SCHEME_24XXX_MCE
: /* 24xxx MCE device */
587 init_data
->ir_codes
= RC_MAP_HAUPPAUGE
;
588 init_data
->internal_get_key_func
= IR_KBD_GET_KEY_HAUP_XVR
;
589 init_data
->type
= RC_BIT_RC5
| RC_BIT_RC6_MCE
|
591 init_data
->name
= hdw
->hdw_desc
->description
;
594 info
.platform_data
= init_data
;
595 strlcpy(info
.type
, "ir_rx_z8f0811_haup", I2C_NAME_SIZE
);
596 pvr2_trace(PVR2_TRACE_INFO
, "Binding %s to i2c address 0x%02x.",
597 info
.type
, info
.addr
);
598 i2c_new_device(&hdw
->i2c_adap
, &info
);
601 info
.platform_data
= init_data
;
602 strlcpy(info
.type
, "ir_tx_z8f0811_haup", I2C_NAME_SIZE
);
603 pvr2_trace(PVR2_TRACE_INFO
, "Binding %s to i2c address 0x%02x.",
604 info
.type
, info
.addr
);
605 i2c_new_device(&hdw
->i2c_adap
, &info
);
608 /* The device either doesn't support I2C-based IR or we
609 don't know (yet) how to operate IR on the device. */
614 void pvr2_i2c_core_init(struct pvr2_hdw
*hdw
)
618 /* The default action for all possible I2C addresses is just to do
619 the transfer normally. */
620 for (idx
= 0; idx
< PVR2_I2C_FUNC_CNT
; idx
++) {
621 hdw
->i2c_func
[idx
] = pvr2_i2c_basic_op
;
624 /* However, deal with various special cases for 24xxx hardware. */
625 if (ir_mode
[hdw
->unit_number
] == 0) {
626 printk(KERN_INFO
"%s: IR disabled\n",hdw
->name
);
627 hdw
->i2c_func
[0x18] = i2c_black_hole
;
628 } else if (ir_mode
[hdw
->unit_number
] == 1) {
629 if (hdw
->ir_scheme_active
== PVR2_IR_SCHEME_24XXX
) {
630 /* Set up translation so that our IR looks like a
632 hdw
->i2c_func
[0x18] = i2c_24xxx_ir
;
635 if (hdw
->hdw_desc
->flag_has_cx25840
) {
636 hdw
->i2c_func
[0x44] = i2c_hack_cx25840
;
638 if (hdw
->hdw_desc
->flag_has_wm8775
) {
639 hdw
->i2c_func
[0x1b] = i2c_hack_wm8775
;
642 // Configure the adapter and set up everything else related to it.
643 hdw
->i2c_adap
= pvr2_i2c_adap_template
;
644 hdw
->i2c_algo
= pvr2_i2c_algo_template
;
645 strlcpy(hdw
->i2c_adap
.name
,hdw
->name
,sizeof(hdw
->i2c_adap
.name
));
646 hdw
->i2c_adap
.dev
.parent
= &hdw
->usb_dev
->dev
;
647 hdw
->i2c_adap
.algo
= &hdw
->i2c_algo
;
648 hdw
->i2c_adap
.algo_data
= hdw
;
649 hdw
->i2c_linked
= !0;
650 i2c_set_adapdata(&hdw
->i2c_adap
, &hdw
->v4l2_dev
);
651 i2c_add_adapter(&hdw
->i2c_adap
);
652 if (hdw
->i2c_func
[0x18] == i2c_24xxx_ir
) {
653 /* Probe for a different type of IR receiver on this
654 device. This is really the only way to differentiate
655 older 24xxx devices from 24xxx variants that include an
656 IR blaster. If the IR blaster is present, the IR
657 receiver is part of that chip and thus we must disable
658 the emulated IR receiver. */
659 if (do_i2c_probe(hdw
, 0x71)) {
660 pvr2_trace(PVR2_TRACE_INFO
,
661 "Device has newer IR hardware; disabling unneeded virtual IR device");
662 hdw
->i2c_func
[0x18] = NULL
;
663 /* Remember that this is a different device... */
664 hdw
->ir_scheme_active
= PVR2_IR_SCHEME_24XXX_MCE
;
667 if (i2c_scan
) do_i2c_scan(hdw
);
669 pvr2_i2c_register_ir(hdw
);
672 void pvr2_i2c_core_done(struct pvr2_hdw
*hdw
)
674 if (hdw
->i2c_linked
) {
675 i2c_del_adapter(&hdw
->i2c_adap
);