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 "pvrusb2-i2c-core.h"
22 #include "pvrusb2-hdw-internal.h"
23 #include "pvrusb2-debug.h"
24 #include "pvrusb2-fx2-cmd.h"
27 #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
31 This module attempts to implement a compliant I2C adapter for the pvrusb2
32 device. By doing this we can then make use of existing functionality in
33 V4L (e.g. tuner.c) rather than rolling our own.
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 unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
47 char *buf,unsigned int maxlen);
49 static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
50 u8 i2c_addr, /* I2C address we're talking to */
51 u8 *data, /* Data to write */
52 u16 length) /* Size of data to write */
54 /* Return value - default 0 means success */
58 if (!data) length = 0;
59 if (length > (sizeof(hdw->cmd_buffer) - 3)) {
60 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
61 "Killing an I2C write to %u that is too large"
62 " (desired=%u limit=%u)",
64 length,(unsigned int)(sizeof(hdw->cmd_buffer) - 3));
68 LOCK_TAKE(hdw->ctl_lock);
70 /* Clear the command buffer (likely to be paranoia) */
71 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
73 /* Set up command buffer for an I2C write */
74 hdw->cmd_buffer[0] = FX2CMD_I2C_WRITE; /* write prefix */
75 hdw->cmd_buffer[1] = i2c_addr; /* i2c addr of chip */
76 hdw->cmd_buffer[2] = length; /* length of what follows */
77 if (length) memcpy(hdw->cmd_buffer + 3, data, length);
79 /* Do the operation */
80 ret = pvr2_send_request(hdw,
86 if (hdw->cmd_buffer[0] != 8) {
88 if (hdw->cmd_buffer[0] != 7) {
89 trace_i2c("unexpected status"
90 " from i2_write[%d]: %d",
91 i2c_addr,hdw->cmd_buffer[0]);
96 LOCK_GIVE(hdw->ctl_lock);
101 static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */
102 u8 i2c_addr, /* I2C address we're talking to */
103 u8 *data, /* Data to write */
104 u16 dlen, /* Size of data to write */
105 u8 *res, /* Where to put data we read */
106 u16 rlen) /* Amount of data to read */
108 /* Return value - default 0 means success */
113 if (dlen > (sizeof(hdw->cmd_buffer) - 4)) {
114 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
115 "Killing an I2C read to %u that has wlen too large"
116 " (desired=%u limit=%u)",
118 dlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 4));
121 if (res && (rlen > (sizeof(hdw->cmd_buffer) - 1))) {
122 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
123 "Killing an I2C read to %u that has rlen too large"
124 " (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"
154 " from i2_read[%d]: %d",
155 i2c_addr,hdw->cmd_buffer[0]);
160 /* Copy back the result */
163 /* Error, just blank out the return buffer */
164 memset(res, 0, rlen);
166 memcpy(res, hdw->cmd_buffer + 1, rlen);
170 LOCK_GIVE(hdw->ctl_lock);
175 /* This is the common low level entry point for doing I2C operations to the
177 static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
184 if (!rdata) rlen = 0;
185 if (!wdata) wlen = 0;
187 return pvr2_i2c_read(hdw,i2c_addr,wdata,wlen,rdata,rlen);
189 return pvr2_i2c_write(hdw,i2c_addr,wdata,wlen);
194 /* This is a special entry point for cases of I2C transaction attempts to
195 the IR receiver. The implementation here simulates the IR receiver by
196 issuing a command to the FX2 firmware and using that response to return
197 what the real I2C receiver would have returned. We use this for 24xxx
198 devices, where the IR receiver chip has been removed and replaced with
199 FX2 related logic. */
200 static int i2c_24xxx_ir(struct pvr2_hdw *hdw,
201 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
206 if (!(rlen || wlen)) {
207 /* This is a probe attempt. Just let it succeed. */
211 /* We don't understand this kind of transaction */
212 if ((wlen != 0) || (rlen == 0)) return -EIO;
215 /* Mike Isely <isely@pobox.com> Appears to be a probe
216 attempt from lirc. Just fill in zeroes and return. If
217 we try instead to do the full transaction here, then bad
218 things seem to happen within the lirc driver module
219 (version 0.8.0-7 sources from Debian, when run under
220 vanilla 2.6.17.6 kernel) - and I don't have the patience
222 if (rlen > 0) rdata[0] = 0;
223 if (rlen > 1) rdata[1] = 0;
227 /* Issue a command to the FX2 to read the IR receiver. */
228 LOCK_TAKE(hdw->ctl_lock); do {
229 hdw->cmd_buffer[0] = FX2CMD_GET_IR_CODE;
230 stat = pvr2_send_request(hdw,
233 dat[0] = hdw->cmd_buffer[0];
234 dat[1] = hdw->cmd_buffer[1];
235 dat[2] = hdw->cmd_buffer[2];
236 dat[3] = hdw->cmd_buffer[3];
237 } while (0); LOCK_GIVE(hdw->ctl_lock);
239 /* Give up if that operation failed. */
240 if (stat != 0) return stat;
242 /* Mangle the results into something that looks like the real IR
246 /* No code received. */
251 /* Mash the FX2 firmware-provided IR code into something
252 that the normal i2c chip-level driver expects. */
259 rdata[0] = (val >> 8) & 0xffu;
260 rdata[1] = val & 0xffu;
266 /* This is a special entry point that is entered if an I2C operation is
267 attempted to a wm8775 chip on model 24xxx hardware. Autodetect of this
268 part doesn't work, but we know it is really there. So let's look for
269 the autodetect attempt and just return success if we see that. */
270 static int i2c_hack_wm8775(struct pvr2_hdw *hdw,
271 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
273 if (!(rlen || wlen)) {
274 // This is a probe attempt. Just let it succeed.
277 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
280 /* This is an entry point designed to always fail any attempt to perform a
281 transfer. We use this to cause certain I2C addresses to not be
283 static int i2c_black_hole(struct pvr2_hdw *hdw,
284 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
289 /* This is a special entry point that is entered if an I2C operation is
290 attempted to a cx25840 chip on model 24xxx hardware. This chip can
291 sometimes wedge itself. Worse still, when this happens msp3400 can
292 falsely detect this part and then the system gets hosed up after msp3400
293 gets confused and dies. What we want to do here is try to keep msp3400
294 away and also try to notice if the chip is wedged and send a warning to
296 static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
297 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
300 unsigned int subaddr;
302 int state = hdw->i2c_cx25840_hack_state;
304 if (!(rlen || wlen)) {
305 // Probe attempt - always just succeed and don't bother the
306 // hardware (this helps to make the state machine further
307 // down somewhat easier).
312 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
315 /* We're looking for the exact pattern where the revision register
316 is being read. The cx25840 module will always look at the
317 revision register first. Any other pattern of access therefore
318 has to be a probe attempt from somebody else so we'll reject it.
319 Normally we could just let each client just probe the part
320 anyway, but when the cx25840 is wedged, msp3400 will get a false
321 positive and that just screws things up... */
325 case 1: subaddr = 0x0100; break;
326 case 2: subaddr = 0x0101; break;
329 } else if (wlen == 2) {
330 subaddr = (wdata[0] << 8) | wdata[1];
332 case 0x0100: state = 1; break;
333 case 0x0101: state = 2; break;
339 if (!rlen) goto success;
341 if (rlen != 1) goto fail;
343 /* If we get to here then we have a legitimate read for one of the
344 two revision bytes, so pass it through. */
345 wbuf[0] = subaddr >> 8;
347 ret = pvr2_i2c_basic_op(hdw,i2c_addr,wbuf,2,rdata,rlen);
349 if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) {
350 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
351 "WARNING: Detected a wedged cx25840 chip;"
352 " the device will not work.");
353 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
354 "WARNING: Try power cycling the pvrusb2 device.");
355 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
356 "WARNING: Disabling further access to the device"
357 " to prevent other foul-ups.");
358 // This blocks all further communication with the part.
359 hdw->i2c_func[0x44] = NULL;
360 pvr2_hdw_render_useless(hdw);
365 pvr2_trace(PVR2_TRACE_CHIPS,"cx25840 appears to be OK.");
369 hdw->i2c_cx25840_hack_state = state;
373 hdw->i2c_cx25840_hack_state = state;
377 /* This is a very, very limited I2C adapter implementation. We can only
378 support what we actually know will work on the device... */
379 static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
380 struct i2c_msg msgs[],
384 pvr2_i2c_func funcp = NULL;
385 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
391 if (msgs[0].addr < PVR2_I2C_FUNC_CNT) {
392 funcp = hdw->i2c_func[msgs[0].addr];
400 if (msgs[0].flags & I2C_M_RD) {
404 /* Length == 0 read. This is a probe. */
405 if (funcp(hdw,msgs[0].addr,NULL,0,NULL,0)) {
412 /* If the read is short enough we'll do the whole
413 thing atomically. Otherwise we have no choice
414 but to break apart the reads. */
419 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
420 bcnt = sizeof(hdw->cmd_buffer)-1;
422 if (funcp(hdw,msgs[0].addr,NULL,0,
423 msgs[0].buf+offs,bcnt)) {
435 if (funcp(hdw,msgs[0].addr,
436 msgs[0].buf,msgs[0].len,NULL,0)) {
441 } else if (num == 2) {
442 if (msgs[0].addr != msgs[1].addr) {
443 trace_i2c("i2c refusing 2 phase transfer with"
444 " conflicting target addresses");
448 if ((!((msgs[0].flags & I2C_M_RD))) &&
449 (msgs[1].flags & I2C_M_RD)) {
450 u16 tcnt,bcnt,wcnt,offs;
451 /* Write followed by atomic read. If the read
452 portion is short enough we'll do the whole thing
453 atomically. Otherwise we have no choice but to
454 break apart the reads. */
458 while (tcnt || wcnt) {
460 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
461 bcnt = sizeof(hdw->cmd_buffer)-1;
463 if (funcp(hdw,msgs[0].addr,
465 msgs[1].buf+offs,bcnt)) {
476 trace_i2c("i2c refusing complex transfer"
477 " read0=%d read1=%d",
478 (msgs[0].flags & I2C_M_RD),
479 (msgs[1].flags & I2C_M_RD));
482 trace_i2c("i2c refusing %d phase transfer",num);
486 if (pvrusb2_debug & PVR2_TRACE_I2C_TRAF) {
487 unsigned int idx,offs,cnt;
488 for (idx = 0; idx < num; idx++) {
491 "pvrusb2 i2c xfer %u/%u:"
492 " addr=0x%x len=%d %s",
496 (msgs[idx].flags & I2C_M_RD ?
498 if ((ret > 0) || !(msgs[idx].flags & I2C_M_RD)) {
499 if (cnt > 8) cnt = 8;
501 for (offs = 0; offs < (cnt>8?8:cnt); offs++) {
502 if (offs) printk(" ");
503 printk("%02x",msgs[idx].buf[offs]);
505 if (offs < cnt) printk(" ...");
509 printk(" result=%d",ret);
515 "pvrusb2 i2c xfer null transfer result=%d\n",
522 static u32 pvr2_i2c_functionality(struct i2c_adapter *adap)
524 return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
527 static int pvr2_i2c_core_singleton(struct i2c_client *cp,
528 unsigned int cmd,void *arg)
531 if (!cp) return -EINVAL;
532 if (!(cp->driver)) return -EINVAL;
533 if (!(cp->driver->command)) return -EINVAL;
534 if (!try_module_get(cp->driver->driver.owner)) return -EAGAIN;
535 stat = cp->driver->command(cp,cmd,arg);
536 module_put(cp->driver->driver.owner);
540 int pvr2_i2c_client_cmd(struct pvr2_i2c_client *cp,unsigned int cmd,void *arg)
543 if (pvrusb2_debug & PVR2_TRACE_I2C_CMD) {
546 cnt = pvr2_i2c_client_describe(cp,PVR2_I2C_DETAIL_DEBUG,
548 pvr2_trace(PVR2_TRACE_I2C_CMD,
549 "i2c COMMAND (code=%u 0x%x) to %.*s",
552 stat = pvr2_i2c_core_singleton(cp->client,cmd,arg);
553 if (pvrusb2_debug & PVR2_TRACE_I2C_CMD) {
556 cnt = pvr2_i2c_client_describe(cp,PVR2_I2C_DETAIL_DEBUG,
558 pvr2_trace(PVR2_TRACE_I2C_CMD,
559 "i2c COMMAND to %.*s (ret=%d)",cnt,buf,stat);
564 int pvr2_i2c_core_cmd(struct pvr2_hdw *hdw,unsigned int cmd,void *arg)
566 struct pvr2_i2c_client *cp, *ncp;
569 if (!hdw) return stat;
571 mutex_lock(&hdw->i2c_list_lock);
572 list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) {
573 if (!cp->recv_enable) continue;
574 mutex_unlock(&hdw->i2c_list_lock);
575 stat = pvr2_i2c_client_cmd(cp,cmd,arg);
576 mutex_lock(&hdw->i2c_list_lock);
578 mutex_unlock(&hdw->i2c_list_lock);
583 static int handler_check(struct pvr2_i2c_client *cp)
585 struct pvr2_i2c_handler *hp = cp->handler;
587 if (!hp->func_table->check) return 0;
588 return hp->func_table->check(hp->func_data) != 0;
594 void pvr2_i2c_core_status_poll(struct pvr2_hdw *hdw)
596 struct pvr2_i2c_client *cp;
597 mutex_lock(&hdw->i2c_list_lock); do {
598 struct v4l2_tuner *vtp = &hdw->tuner_signal_info;
599 memset(vtp,0,sizeof(*vtp));
600 list_for_each_entry(cp, &hdw->i2c_clients, list) {
601 if (!cp->detected_flag) continue;
602 if (!cp->status_poll) continue;
605 hdw->tuner_signal_stale = 0;
606 pvr2_trace(PVR2_TRACE_CHIPS,"i2c status poll"
607 " type=%u strength=%u audio=0x%x cap=0x%x"
610 vtp->signal,vtp->rxsubchans,vtp->capability,
611 vtp->rangelow,vtp->rangehigh);
612 } while (0); mutex_unlock(&hdw->i2c_list_lock);
616 /* Issue various I2C operations to bring chip-level drivers into sync with
617 state stored in this driver. */
618 void pvr2_i2c_core_sync(struct pvr2_hdw *hdw)
622 struct pvr2_i2c_client *cp, *ncp;
624 if (!hdw->i2c_linked) return;
625 if (!(hdw->i2c_pend_types & PVR2_I2C_PEND_ALL)) {
628 mutex_lock(&hdw->i2c_list_lock); do {
629 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: core_sync BEGIN");
630 if (hdw->i2c_pend_types & PVR2_I2C_PEND_DETECT) {
631 /* One or more I2C clients have attached since we
632 last synced. So scan the list and identify the
636 unsigned long amask = 0;
637 buf = kmalloc(BUFSIZE,GFP_KERNEL);
638 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_DETECT");
639 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_DETECT;
640 list_for_each_entry(cp, &hdw->i2c_clients, list) {
641 if (!cp->detected_flag) {
643 pvr2_i2c_probe(hdw,cp);
644 cp->detected_flag = !0;
648 cnt = pvr2_i2c_client_describe(
653 trace_i2c("Probed: %.*s",cnt,buf);
654 if (handler_check(cp)) {
655 hdw->i2c_pend_types |=
656 PVR2_I2C_PEND_CLIENT;
659 hdw->i2c_pend_mask |= msk;
660 hdw->i2c_pend_types |=
661 PVR2_I2C_PEND_REFRESH;
663 amask |= cp->ctl_mask;
665 hdw->i2c_active_mask = amask;
668 if (hdw->i2c_pend_types & PVR2_I2C_PEND_STALE) {
669 /* Need to do one or more global updates. Arrange
670 for this to happen. */
672 pvr2_trace(PVR2_TRACE_I2C_CORE,
673 "i2c: PEND_STALE (0x%lx)",
674 hdw->i2c_stale_mask);
675 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_STALE;
676 list_for_each_entry(cp, &hdw->i2c_clients, list) {
677 m2 = hdw->i2c_stale_mask;
679 m2 &= ~cp->pend_mask;
681 pvr2_trace(PVR2_TRACE_I2C_CORE,
682 "i2c: cp=%p setting 0x%lx",
687 hdw->i2c_pend_mask |= hdw->i2c_stale_mask;
688 hdw->i2c_stale_mask = 0;
689 hdw->i2c_pend_types |= PVR2_I2C_PEND_REFRESH;
691 if (hdw->i2c_pend_types & PVR2_I2C_PEND_CLIENT) {
692 /* One or more client handlers are asking for an
693 update. Run through the list of known clients
694 and update each one. */
695 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_CLIENT");
696 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_CLIENT;
697 list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients,
699 if (!cp->handler) continue;
700 if (!cp->handler->func_table->update) continue;
701 pvr2_trace(PVR2_TRACE_I2C_CORE,
702 "i2c: cp=%p update",cp);
703 mutex_unlock(&hdw->i2c_list_lock);
704 cp->handler->func_table->update(
705 cp->handler->func_data);
706 mutex_lock(&hdw->i2c_list_lock);
707 /* If client's update function set some
708 additional pending bits, account for that
710 if (cp->pend_mask & ~hdw->i2c_pend_mask) {
711 hdw->i2c_pend_mask |= cp->pend_mask;
712 hdw->i2c_pend_types |=
713 PVR2_I2C_PEND_REFRESH;
717 if (hdw->i2c_pend_types & PVR2_I2C_PEND_REFRESH) {
718 const struct pvr2_i2c_op *opf;
720 /* Some actual updates are pending. Walk through
721 each update type and perform it. */
722 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_REFRESH"
723 " (0x%lx)",hdw->i2c_pend_mask);
724 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_REFRESH;
725 pm = hdw->i2c_pend_mask;
726 hdw->i2c_pend_mask = 0;
727 for (idx = 0, msk = 1; pm; idx++, msk <<= 1) {
728 if (!(pm & msk)) continue;
730 list_for_each_entry(cp, &hdw->i2c_clients,
732 if (cp->pend_mask & msk) {
733 cp->pend_mask &= ~msk;
734 cp->recv_enable = !0;
739 opf = pvr2_i2c_get_op(idx);
741 mutex_unlock(&hdw->i2c_list_lock);
743 mutex_lock(&hdw->i2c_list_lock);
746 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: core_sync END");
747 } while (0); mutex_unlock(&hdw->i2c_list_lock);
750 int pvr2_i2c_core_check_stale(struct pvr2_hdw *hdw)
752 unsigned long msk,sm,pm;
754 const struct pvr2_i2c_op *opf;
755 struct pvr2_i2c_client *cp;
758 pvr2_trace(PVR2_TRACE_I2C_CORE,"pvr2_i2c_core_check_stale BEGIN");
760 pm = hdw->i2c_active_mask;
762 for (idx = 0, msk = 1; pm; idx++, msk <<= 1) {
763 if (!(msk & pm)) continue;
765 opf = pvr2_i2c_get_op(idx);
767 if (opf->check(hdw)) {
771 if (sm) pt |= PVR2_I2C_PEND_STALE;
773 list_for_each_entry(cp, &hdw->i2c_clients, list)
774 if (handler_check(cp))
775 pt |= PVR2_I2C_PEND_CLIENT;
778 mutex_lock(&hdw->i2c_list_lock); do {
779 hdw->i2c_pend_types |= pt;
780 hdw->i2c_stale_mask |= sm;
781 hdw->i2c_pend_mask |= hdw->i2c_stale_mask;
782 } while (0); mutex_unlock(&hdw->i2c_list_lock);
785 pvr2_trace(PVR2_TRACE_I2C_CORE,
786 "i2c: types=0x%x stale=0x%lx pend=0x%lx",
790 pvr2_trace(PVR2_TRACE_I2C_CORE,"pvr2_i2c_core_check_stale END");
792 return (hdw->i2c_pend_types & PVR2_I2C_PEND_ALL) != 0;
795 static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
797 char *buf,unsigned int maxlen)
799 unsigned int ccnt,bcnt;
801 const struct pvr2_i2c_op *opf;
804 if (detail & PVR2_I2C_DETAIL_DEBUG) {
805 bcnt = scnprintf(buf,maxlen,
806 "ctxt=%p ctl_mask=0x%lx",
808 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
811 bcnt = scnprintf(buf,maxlen,
816 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
817 if ((detail & PVR2_I2C_DETAIL_HANDLER) &&
818 cp->handler && cp->handler->func_table->describe) {
819 bcnt = scnprintf(buf,maxlen," (");
820 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
821 bcnt = cp->handler->func_table->describe(
822 cp->handler->func_data,buf,maxlen);
823 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
824 bcnt = scnprintf(buf,maxlen,")");
825 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
827 if ((detail & PVR2_I2C_DETAIL_CTLMASK) && cp->ctl_mask) {
829 unsigned long msk,sm;
831 bcnt = scnprintf(buf,maxlen," [");
832 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
835 for (idx = 0, msk = 1; msk; idx++, msk <<= 1) {
836 if (!(cp->ctl_mask & msk)) continue;
837 opf = pvr2_i2c_get_op(idx);
839 bcnt = scnprintf(buf,maxlen,"%s%s",
842 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
849 bcnt = scnprintf(buf,maxlen,"%s%lx",
850 idx != 0 ? " " : "",sm);
851 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
853 bcnt = scnprintf(buf,maxlen,"]");
854 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
859 unsigned int pvr2_i2c_report(struct pvr2_hdw *hdw,
860 char *buf,unsigned int maxlen)
862 unsigned int ccnt,bcnt;
863 struct pvr2_i2c_client *cp;
865 mutex_lock(&hdw->i2c_list_lock); do {
866 list_for_each_entry(cp, &hdw->i2c_clients, list) {
867 bcnt = pvr2_i2c_client_describe(
869 (PVR2_I2C_DETAIL_HANDLER|
870 PVR2_I2C_DETAIL_CTLMASK),
872 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
873 bcnt = scnprintf(buf,maxlen,"\n");
874 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
876 } while (0); mutex_unlock(&hdw->i2c_list_lock);
880 static int pvr2_i2c_attach_inform(struct i2c_client *client)
882 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data);
883 struct pvr2_i2c_client *cp;
884 int fl = !(hdw->i2c_pend_types & PVR2_I2C_PEND_ALL);
885 cp = kzalloc(sizeof(*cp),GFP_KERNEL);
886 trace_i2c("i2c_attach [client=%s @ 0x%x ctxt=%p]",
889 if (!cp) return -ENOMEM;
891 INIT_LIST_HEAD(&cp->list);
893 mutex_lock(&hdw->i2c_list_lock); do {
894 list_add_tail(&cp->list,&hdw->i2c_clients);
895 hdw->i2c_pend_types |= PVR2_I2C_PEND_DETECT;
896 } while (0); mutex_unlock(&hdw->i2c_list_lock);
897 if (fl) queue_work(hdw->workqueue,&hdw->worki2csync);
901 static int pvr2_i2c_detach_inform(struct i2c_client *client)
903 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data);
904 struct pvr2_i2c_client *cp, *ncp;
905 unsigned long amask = 0;
907 mutex_lock(&hdw->i2c_list_lock); do {
908 list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) {
909 if (cp->client == client) {
910 trace_i2c("pvr2_i2c_detach"
911 " [client=%s @ 0x%x ctxt=%p]",
915 cp->handler->func_table->detach) {
916 cp->handler->func_table->detach(
917 cp->handler->func_data);
924 amask |= cp->ctl_mask;
926 hdw->i2c_active_mask = amask;
927 } while (0); mutex_unlock(&hdw->i2c_list_lock);
929 trace_i2c("pvr2_i2c_detach [client=%s @ 0x%x ctxt=<unknown>]",
936 static struct i2c_algorithm pvr2_i2c_algo_template = {
937 .master_xfer = pvr2_i2c_xfer,
938 .functionality = pvr2_i2c_functionality,
941 static struct i2c_adapter pvr2_i2c_adap_template = {
942 .owner = THIS_MODULE,
943 .class = I2C_CLASS_TV_ANALOG,
944 .id = I2C_HW_B_BT848,
945 .client_register = pvr2_i2c_attach_inform,
946 .client_unregister = pvr2_i2c_detach_inform,
949 static void do_i2c_scan(struct pvr2_hdw *hdw)
951 struct i2c_msg msg[1];
954 msg[0].flags = I2C_M_RD;
957 printk("%s: i2c scan beginning\n",hdw->name);
958 for (i = 0; i < 128; i++) {
960 rc = i2c_transfer(&hdw->i2c_adap,msg, ARRAY_SIZE(msg));
961 if (rc != 1) continue;
962 printk("%s: i2c scan: found device @ 0x%x\n",hdw->name,i);
964 printk("%s: i2c scan done.\n",hdw->name);
967 void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
971 /* The default action for all possible I2C addresses is just to do
972 the transfer normally. */
973 for (idx = 0; idx < PVR2_I2C_FUNC_CNT; idx++) {
974 hdw->i2c_func[idx] = pvr2_i2c_basic_op;
977 /* However, deal with various special cases for 24xxx hardware. */
978 if (ir_mode[hdw->unit_number] == 0) {
979 printk(KERN_INFO "%s: IR disabled\n",hdw->name);
980 hdw->i2c_func[0x18] = i2c_black_hole;
981 } else if (ir_mode[hdw->unit_number] == 1) {
982 if (hdw->hdw_desc->ir_scheme == PVR2_IR_SCHEME_24XXX) {
983 /* This comment is present PURELY to get
984 checkpatch.pl to STFU. Lovely, eh? */
985 hdw->i2c_func[0x18] = i2c_24xxx_ir;
988 if (hdw->hdw_desc->flag_has_cx25840) {
989 hdw->i2c_func[0x44] = i2c_hack_cx25840;
991 if (hdw->hdw_desc->flag_has_wm8775) {
992 hdw->i2c_func[0x1b] = i2c_hack_wm8775;
995 // Configure the adapter and set up everything else related to it.
996 memcpy(&hdw->i2c_adap,&pvr2_i2c_adap_template,sizeof(hdw->i2c_adap));
997 memcpy(&hdw->i2c_algo,&pvr2_i2c_algo_template,sizeof(hdw->i2c_algo));
998 strlcpy(hdw->i2c_adap.name,hdw->name,sizeof(hdw->i2c_adap.name));
999 hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev;
1000 hdw->i2c_adap.algo = &hdw->i2c_algo;
1001 hdw->i2c_adap.algo_data = hdw;
1002 hdw->i2c_pend_mask = 0;
1003 hdw->i2c_stale_mask = 0;
1004 hdw->i2c_active_mask = 0;
1005 INIT_LIST_HEAD(&hdw->i2c_clients);
1006 mutex_init(&hdw->i2c_list_lock);
1007 hdw->i2c_linked = !0;
1008 i2c_add_adapter(&hdw->i2c_adap);
1009 if (i2c_scan) do_i2c_scan(hdw);
1012 void pvr2_i2c_core_done(struct pvr2_hdw *hdw)
1014 if (hdw->i2c_linked) {
1015 i2c_del_adapter(&hdw->i2c_adap);
1016 hdw->i2c_linked = 0;
1021 Stuff for Emacs to see, in order to encourage consistent editing style:
1022 *** Local Variables: ***
1024 *** fill-column: 75 ***
1025 *** tab-width: 8 ***
1026 *** c-basic-offset: 8 ***