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 "pvrusb2-i2c-core.h"
23 #include "pvrusb2-hdw-internal.h"
24 #include "pvrusb2-debug.h"
25 #include "pvrusb2-fx2-cmd.h"
28 #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
32 This module attempts to implement a compliant I2C adapter for the pvrusb2
37 static unsigned int i2c_scan;
38 module_param(i2c_scan, int, S_IRUGO|S_IWUSR);
39 MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
41 static int ir_mode[PVR_NUM] = { [0 ... PVR_NUM-1] = 1 };
42 module_param_array(ir_mode, int, NULL, 0444);
43 MODULE_PARM_DESC(ir_mode,"specify: 0=disable IR reception, 1=normal IR");
45 static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
46 u8 i2c_addr, /* I2C address we're talking to */
47 u8 *data, /* Data to write */
48 u16 length) /* Size of data to write */
50 /* Return value - default 0 means success */
54 if (!data) length = 0;
55 if (length > (sizeof(hdw->cmd_buffer) - 3)) {
56 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
57 "Killing an I2C write to %u that is too large"
58 " (desired=%u limit=%u)",
60 length,(unsigned int)(sizeof(hdw->cmd_buffer) - 3));
64 LOCK_TAKE(hdw->ctl_lock);
66 /* Clear the command buffer (likely to be paranoia) */
67 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
69 /* Set up command buffer for an I2C write */
70 hdw->cmd_buffer[0] = FX2CMD_I2C_WRITE; /* write prefix */
71 hdw->cmd_buffer[1] = i2c_addr; /* i2c addr of chip */
72 hdw->cmd_buffer[2] = length; /* length of what follows */
73 if (length) memcpy(hdw->cmd_buffer + 3, data, length);
75 /* Do the operation */
76 ret = pvr2_send_request(hdw,
82 if (hdw->cmd_buffer[0] != 8) {
84 if (hdw->cmd_buffer[0] != 7) {
85 trace_i2c("unexpected status"
86 " from i2_write[%d]: %d",
87 i2c_addr,hdw->cmd_buffer[0]);
92 LOCK_GIVE(hdw->ctl_lock);
97 static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */
98 u8 i2c_addr, /* I2C address we're talking to */
99 u8 *data, /* Data to write */
100 u16 dlen, /* Size of data to write */
101 u8 *res, /* Where to put data we read */
102 u16 rlen) /* Amount of data to read */
104 /* Return value - default 0 means success */
109 if (dlen > (sizeof(hdw->cmd_buffer) - 4)) {
110 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
111 "Killing an I2C read to %u that has wlen too large"
112 " (desired=%u limit=%u)",
114 dlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 4));
117 if (res && (rlen > (sizeof(hdw->cmd_buffer) - 1))) {
118 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
119 "Killing an I2C read to %u that has rlen too large"
120 " (desired=%u limit=%u)",
122 rlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 1));
126 LOCK_TAKE(hdw->ctl_lock);
128 /* Clear the command buffer (likely to be paranoia) */
129 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
131 /* Set up command buffer for an I2C write followed by a read */
132 hdw->cmd_buffer[0] = FX2CMD_I2C_READ; /* read prefix */
133 hdw->cmd_buffer[1] = dlen; /* arg length */
134 hdw->cmd_buffer[2] = rlen; /* answer length. Device will send one
135 more byte (status). */
136 hdw->cmd_buffer[3] = i2c_addr; /* i2c addr of chip */
137 if (dlen) memcpy(hdw->cmd_buffer + 4, data, dlen);
139 /* Do the operation */
140 ret = pvr2_send_request(hdw,
146 if (hdw->cmd_buffer[0] != 8) {
148 if (hdw->cmd_buffer[0] != 7) {
149 trace_i2c("unexpected status"
150 " from i2_read[%d]: %d",
151 i2c_addr,hdw->cmd_buffer[0]);
156 /* Copy back the result */
159 /* Error, just blank out the return buffer */
160 memset(res, 0, rlen);
162 memcpy(res, hdw->cmd_buffer + 1, rlen);
166 LOCK_GIVE(hdw->ctl_lock);
171 /* This is the common low level entry point for doing I2C operations to the
173 static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
180 if (!rdata) rlen = 0;
181 if (!wdata) wlen = 0;
183 return pvr2_i2c_read(hdw,i2c_addr,wdata,wlen,rdata,rlen);
185 return pvr2_i2c_write(hdw,i2c_addr,wdata,wlen);
190 /* This is a special entry point for cases of I2C transaction attempts to
191 the IR receiver. The implementation here simulates the IR receiver by
192 issuing a command to the FX2 firmware and using that response to return
193 what the real I2C receiver would have returned. We use this for 24xxx
194 devices, where the IR receiver chip has been removed and replaced with
195 FX2 related logic. */
196 static int i2c_24xxx_ir(struct pvr2_hdw *hdw,
197 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
202 if (!(rlen || wlen)) {
203 /* This is a probe attempt. Just let it succeed. */
207 /* We don't understand this kind of transaction */
208 if ((wlen != 0) || (rlen == 0)) return -EIO;
211 /* Mike Isely <isely@pobox.com> Appears to be a probe
212 attempt from lirc. Just fill in zeroes and return. If
213 we try instead to do the full transaction here, then bad
214 things seem to happen within the lirc driver module
215 (version 0.8.0-7 sources from Debian, when run under
216 vanilla 2.6.17.6 kernel) - and I don't have the patience
218 if (rlen > 0) rdata[0] = 0;
219 if (rlen > 1) rdata[1] = 0;
223 /* Issue a command to the FX2 to read the IR receiver. */
224 LOCK_TAKE(hdw->ctl_lock); do {
225 hdw->cmd_buffer[0] = FX2CMD_GET_IR_CODE;
226 stat = pvr2_send_request(hdw,
229 dat[0] = hdw->cmd_buffer[0];
230 dat[1] = hdw->cmd_buffer[1];
231 dat[2] = hdw->cmd_buffer[2];
232 dat[3] = hdw->cmd_buffer[3];
233 } while (0); LOCK_GIVE(hdw->ctl_lock);
235 /* Give up if that operation failed. */
236 if (stat != 0) return stat;
238 /* Mangle the results into something that looks like the real IR
242 /* No code received. */
247 /* Mash the FX2 firmware-provided IR code into something
248 that the normal i2c chip-level driver expects. */
255 rdata[0] = (val >> 8) & 0xffu;
256 rdata[1] = val & 0xffu;
262 /* This is a special entry point that is entered if an I2C operation is
263 attempted to a wm8775 chip on model 24xxx hardware. Autodetect of this
264 part doesn't work, but we know it is really there. So let's look for
265 the autodetect attempt and just return success if we see that. */
266 static int i2c_hack_wm8775(struct pvr2_hdw *hdw,
267 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
269 if (!(rlen || wlen)) {
270 // This is a probe attempt. Just let it succeed.
273 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
276 /* This is an entry point designed to always fail any attempt to perform a
277 transfer. We use this to cause certain I2C addresses to not be
279 static int i2c_black_hole(struct pvr2_hdw *hdw,
280 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
285 /* This is a special entry point that is entered if an I2C operation is
286 attempted to a cx25840 chip on model 24xxx hardware. This chip can
287 sometimes wedge itself. Worse still, when this happens msp3400 can
288 falsely detect this part and then the system gets hosed up after msp3400
289 gets confused and dies. What we want to do here is try to keep msp3400
290 away and also try to notice if the chip is wedged and send a warning to
292 static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
293 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
296 unsigned int subaddr;
298 int state = hdw->i2c_cx25840_hack_state;
300 if (!(rlen || wlen)) {
301 // Probe attempt - always just succeed and don't bother the
302 // hardware (this helps to make the state machine further
303 // down somewhat easier).
308 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
311 /* We're looking for the exact pattern where the revision register
312 is being read. The cx25840 module will always look at the
313 revision register first. Any other pattern of access therefore
314 has to be a probe attempt from somebody else so we'll reject it.
315 Normally we could just let each client just probe the part
316 anyway, but when the cx25840 is wedged, msp3400 will get a false
317 positive and that just screws things up... */
321 case 1: subaddr = 0x0100; break;
322 case 2: subaddr = 0x0101; break;
325 } else if (wlen == 2) {
326 subaddr = (wdata[0] << 8) | wdata[1];
328 case 0x0100: state = 1; break;
329 case 0x0101: state = 2; break;
335 if (!rlen) goto success;
337 if (rlen != 1) goto fail;
339 /* If we get to here then we have a legitimate read for one of the
340 two revision bytes, so pass it through. */
341 wbuf[0] = subaddr >> 8;
343 ret = pvr2_i2c_basic_op(hdw,i2c_addr,wbuf,2,rdata,rlen);
345 if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) {
346 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
347 "WARNING: Detected a wedged cx25840 chip;"
348 " the device will not work.");
349 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
350 "WARNING: Try power cycling the pvrusb2 device.");
351 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
352 "WARNING: Disabling further access to the device"
353 " to prevent other foul-ups.");
354 // This blocks all further communication with the part.
355 hdw->i2c_func[0x44] = NULL;
356 pvr2_hdw_render_useless(hdw);
361 pvr2_trace(PVR2_TRACE_CHIPS,"cx25840 appears to be OK.");
365 hdw->i2c_cx25840_hack_state = state;
369 hdw->i2c_cx25840_hack_state = state;
373 /* This is a very, very limited I2C adapter implementation. We can only
374 support what we actually know will work on the device... */
375 static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
376 struct i2c_msg msgs[],
380 pvr2_i2c_func funcp = NULL;
381 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
387 if (msgs[0].addr < PVR2_I2C_FUNC_CNT) {
388 funcp = hdw->i2c_func[msgs[0].addr];
396 if (msgs[0].flags & I2C_M_RD) {
400 /* Length == 0 read. This is a probe. */
401 if (funcp(hdw,msgs[0].addr,NULL,0,NULL,0)) {
408 /* If the read is short enough we'll do the whole
409 thing atomically. Otherwise we have no choice
410 but to break apart the reads. */
415 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
416 bcnt = sizeof(hdw->cmd_buffer)-1;
418 if (funcp(hdw,msgs[0].addr,NULL,0,
419 msgs[0].buf+offs,bcnt)) {
431 if (funcp(hdw,msgs[0].addr,
432 msgs[0].buf,msgs[0].len,NULL,0)) {
437 } else if (num == 2) {
438 if (msgs[0].addr != msgs[1].addr) {
439 trace_i2c("i2c refusing 2 phase transfer with"
440 " 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"
473 " read0=%d read1=%d",
474 (msgs[0].flags & I2C_M_RD),
475 (msgs[1].flags & I2C_M_RD));
478 trace_i2c("i2c refusing %d phase transfer",num);
482 if (pvrusb2_debug & PVR2_TRACE_I2C_TRAF) {
483 unsigned int idx,offs,cnt;
484 for (idx = 0; idx < num; idx++) {
487 "pvrusb2 i2c xfer %u/%u:"
488 " addr=0x%x len=%d %s",
492 (msgs[idx].flags & I2C_M_RD ?
494 if ((ret > 0) || !(msgs[idx].flags & I2C_M_RD)) {
495 if (cnt > 8) cnt = 8;
497 for (offs = 0; offs < (cnt>8?8:cnt); offs++) {
498 if (offs) printk(" ");
499 printk("%02x",msgs[idx].buf[offs]);
501 if (offs < cnt) printk(" ...");
505 printk(" result=%d",ret);
511 "pvrusb2 i2c xfer null transfer result=%d\n",
518 static u32 pvr2_i2c_functionality(struct i2c_adapter *adap)
520 return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
523 static int pvr2_i2c_attach_inform(struct i2c_client *client)
528 static int pvr2_i2c_detach_inform(struct i2c_client *client)
533 static struct i2c_algorithm pvr2_i2c_algo_template = {
534 .master_xfer = pvr2_i2c_xfer,
535 .functionality = pvr2_i2c_functionality,
538 static struct i2c_adapter pvr2_i2c_adap_template = {
539 .owner = THIS_MODULE,
541 .id = I2C_HW_B_BT848,
542 .client_register = pvr2_i2c_attach_inform,
543 .client_unregister = pvr2_i2c_detach_inform,
547 /* Return true if device exists at given address */
548 static int do_i2c_probe(struct pvr2_hdw *hdw, int addr)
550 struct i2c_msg msg[1];
553 msg[0].flags = I2C_M_RD;
557 rc = i2c_transfer(&hdw->i2c_adap, msg, ARRAY_SIZE(msg));
561 static void do_i2c_scan(struct pvr2_hdw *hdw)
564 printk(KERN_INFO "%s: i2c scan beginning\n", hdw->name);
565 for (i = 0; i < 128; i++) {
566 if (do_i2c_probe(hdw, i)) {
567 printk(KERN_INFO "%s: i2c scan: found device @ 0x%x\n",
571 printk(KERN_INFO "%s: i2c scan done.\n", hdw->name);
574 void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
578 /* The default action for all possible I2C addresses is just to do
579 the transfer normally. */
580 for (idx = 0; idx < PVR2_I2C_FUNC_CNT; idx++) {
581 hdw->i2c_func[idx] = pvr2_i2c_basic_op;
584 /* However, deal with various special cases for 24xxx hardware. */
585 if (ir_mode[hdw->unit_number] == 0) {
586 printk(KERN_INFO "%s: IR disabled\n",hdw->name);
587 hdw->i2c_func[0x18] = i2c_black_hole;
588 } else if (ir_mode[hdw->unit_number] == 1) {
589 if (hdw->hdw_desc->ir_scheme == PVR2_IR_SCHEME_24XXX) {
590 hdw->i2c_func[0x18] = i2c_24xxx_ir;
593 if (hdw->hdw_desc->flag_has_cx25840) {
594 hdw->i2c_func[0x44] = i2c_hack_cx25840;
596 if (hdw->hdw_desc->flag_has_wm8775) {
597 hdw->i2c_func[0x1b] = i2c_hack_wm8775;
600 // Configure the adapter and set up everything else related to it.
601 memcpy(&hdw->i2c_adap,&pvr2_i2c_adap_template,sizeof(hdw->i2c_adap));
602 memcpy(&hdw->i2c_algo,&pvr2_i2c_algo_template,sizeof(hdw->i2c_algo));
603 strlcpy(hdw->i2c_adap.name,hdw->name,sizeof(hdw->i2c_adap.name));
604 hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev;
605 hdw->i2c_adap.algo = &hdw->i2c_algo;
606 hdw->i2c_adap.algo_data = hdw;
607 hdw->i2c_linked = !0;
608 i2c_set_adapdata(&hdw->i2c_adap, &hdw->v4l2_dev);
609 i2c_add_adapter(&hdw->i2c_adap);
610 if (hdw->i2c_func[0x18] == i2c_24xxx_ir) {
611 /* Probe for a different type of IR receiver on this
612 device. If present, disable the emulated IR receiver. */
613 if (do_i2c_probe(hdw, 0x71)) {
614 pvr2_trace(PVR2_TRACE_INFO,
615 "Device has newer IR hardware;"
616 " disabling unneeded virtual IR device");
617 hdw->i2c_func[0x18] = NULL;
620 if (i2c_scan) do_i2c_scan(hdw);
623 void pvr2_i2c_core_done(struct pvr2_hdw *hdw)
625 if (hdw->i2c_linked) {
626 i2c_del_adapter(&hdw->i2c_adap);
632 Stuff for Emacs to see, in order to encourage consistent editing style:
633 *** Local Variables: ***
635 *** fill-column: 75 ***
637 *** c-basic-offset: 8 ***