5 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "pvrusb2-i2c-core.h"
23 #include "pvrusb2-hdw-internal.h"
24 #include "pvrusb2-debug.h"
26 #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
30 This module attempts to implement a compliant I2C adapter for the pvrusb2
31 device. By doing this we can then make use of existing functionality in
32 V4L (e.g. tuner.c) rather than rolling our own.
36 static unsigned int i2c_scan = 0;
37 module_param(i2c_scan, int, S_IRUGO|S_IWUSR);
38 MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
40 static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
42 char *buf,unsigned int maxlen);
44 static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
45 u8 i2c_addr, /* I2C address we're talking to */
46 u8 *data, /* Data to write */
47 u16 length) /* Size of data to write */
49 /* Return value - default 0 means success */
53 if (!data) length = 0;
54 if (length > (sizeof(hdw->cmd_buffer) - 3)) {
55 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
56 "Killing an I2C write to %u that is too large"
57 " (desired=%u limit=%u)",
59 length,(unsigned int)(sizeof(hdw->cmd_buffer) - 3));
63 LOCK_TAKE(hdw->ctl_lock);
65 /* Clear the command buffer (likely to be paranoia) */
66 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
68 /* Set up command buffer for an I2C write */
69 hdw->cmd_buffer[0] = 0x08; /* write prefix */
70 hdw->cmd_buffer[1] = i2c_addr; /* i2c addr of chip */
71 hdw->cmd_buffer[2] = length; /* length of what follows */
72 if (length) memcpy(hdw->cmd_buffer + 3, data, length);
74 /* Do the operation */
75 ret = pvr2_send_request(hdw,
81 if (hdw->cmd_buffer[0] != 8) {
83 if (hdw->cmd_buffer[0] != 7) {
84 trace_i2c("unexpected status"
85 " from i2_write[%d]: %d",
86 i2c_addr,hdw->cmd_buffer[0]);
91 LOCK_GIVE(hdw->ctl_lock);
96 static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */
97 u8 i2c_addr, /* I2C address we're talking to */
98 u8 *data, /* Data to write */
99 u16 dlen, /* Size of data to write */
100 u8 *res, /* Where to put data we read */
101 u16 rlen) /* Amount of data to read */
103 /* Return value - default 0 means success */
108 if (dlen > (sizeof(hdw->cmd_buffer) - 4)) {
109 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
110 "Killing an I2C read to %u that has wlen too large"
111 " (desired=%u limit=%u)",
113 dlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 4));
116 if (res && (rlen > (sizeof(hdw->cmd_buffer) - 1))) {
117 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
118 "Killing an I2C read to %u that has rlen too large"
119 " (desired=%u limit=%u)",
121 rlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 1));
125 LOCK_TAKE(hdw->ctl_lock);
127 /* Clear the command buffer (likely to be paranoia) */
128 memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
130 /* Set up command buffer for an I2C write followed by a read */
131 hdw->cmd_buffer[0] = 0x09; /* read prefix */
132 hdw->cmd_buffer[1] = dlen; /* arg length */
133 hdw->cmd_buffer[2] = rlen; /* answer length. Device will send one
134 more byte (status). */
135 hdw->cmd_buffer[3] = i2c_addr; /* i2c addr of chip */
136 if (dlen) memcpy(hdw->cmd_buffer + 4, data, dlen);
138 /* Do the operation */
139 ret = pvr2_send_request(hdw,
145 if (hdw->cmd_buffer[0] != 8) {
147 if (hdw->cmd_buffer[0] != 7) {
148 trace_i2c("unexpected status"
149 " from i2_read[%d]: %d",
150 i2c_addr,hdw->cmd_buffer[0]);
155 /* Copy back the result */
158 /* Error, just blank out the return buffer */
159 memset(res, 0, rlen);
161 memcpy(res, hdw->cmd_buffer + 1, rlen);
165 LOCK_GIVE(hdw->ctl_lock);
170 /* This is the common low level entry point for doing I2C operations to the
172 static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
179 if (!rdata) rlen = 0;
180 if (!wdata) wlen = 0;
182 return pvr2_i2c_read(hdw,i2c_addr,wdata,wlen,rdata,rlen);
184 return pvr2_i2c_write(hdw,i2c_addr,wdata,wlen);
188 /* This is a special entry point that is entered if an I2C operation is
189 attempted to a wm8775 chip on model 24xxx hardware. Autodetect of this
190 part doesn't work, but we know it is really there. So let's look for
191 the autodetect attempt and just return success if we see that. */
192 static int i2c_hack_wm8775(struct pvr2_hdw *hdw,
193 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
195 if (!(rlen || wlen)) {
196 // This is a probe attempt. Just let it succeed.
199 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
202 /* This is a special entry point that is entered if an I2C operation is
203 attempted to a cx25840 chip on model 24xxx hardware. This chip can
204 sometimes wedge itself. Worse still, when this happens msp3400 can
205 falsely detect this part and then the system gets hosed up after msp3400
206 gets confused and dies. What we want to do here is try to keep msp3400
207 away and also try to notice if the chip is wedged and send a warning to
209 static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
210 u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
213 unsigned int subaddr;
215 int state = hdw->i2c_cx25840_hack_state;
217 if (!(rlen || wlen)) {
218 // Probe attempt - always just succeed and don't bother the
219 // hardware (this helps to make the state machine further
220 // down somewhat easier).
225 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
228 /* We're looking for the exact pattern where the revision register
229 is being read. The cx25840 module will always look at the
230 revision register first. Any other pattern of access therefore
231 has to be a probe attempt from somebody else so we'll reject it.
232 Normally we could just let each client just probe the part
233 anyway, but when the cx25840 is wedged, msp3400 will get a false
234 positive and that just screws things up... */
238 case 1: subaddr = 0x0100; break;
239 case 2: subaddr = 0x0101; break;
242 } else if (wlen == 2) {
243 subaddr = (wdata[0] << 8) | wdata[1];
245 case 0x0100: state = 1; break;
246 case 0x0101: state = 2; break;
252 if (!rlen) goto success;
254 if (rlen != 1) goto fail;
256 /* If we get to here then we have a legitimate read for one of the
257 two revision bytes, so pass it through. */
258 wbuf[0] = subaddr >> 8;
260 ret = pvr2_i2c_basic_op(hdw,i2c_addr,wbuf,2,rdata,rlen);
262 if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) {
263 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
264 "WARNING: Detected a wedged cx25840 chip;"
265 " the device will not work.");
266 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
267 "WARNING: Try power cycling the pvrusb2 device.");
268 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
269 "WARNING: Disabling further access to the device"
270 " to prevent other foul-ups.");
271 // This blocks all further communication with the part.
272 hdw->i2c_func[0x44] = NULL;
273 pvr2_hdw_render_useless(hdw);
278 pvr2_trace(PVR2_TRACE_CHIPS,"cx25840 appears to be OK.");
282 hdw->i2c_cx25840_hack_state = state;
286 hdw->i2c_cx25840_hack_state = state;
290 /* This is a very, very limited I2C adapter implementation. We can only
291 support what we actually know will work on the device... */
292 static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
293 struct i2c_msg msgs[],
297 pvr2_i2c_func funcp = NULL;
298 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
304 if ((msgs[0].flags & I2C_M_NOSTART)) {
305 trace_i2c("i2c refusing I2C_M_NOSTART");
308 if (msgs[0].addr < PVR2_I2C_FUNC_CNT) {
309 funcp = hdw->i2c_func[msgs[0].addr];
317 if (msgs[0].flags & I2C_M_RD) {
321 /* Length == 0 read. This is a probe. */
322 if (funcp(hdw,msgs[0].addr,NULL,0,NULL,0)) {
329 /* If the read is short enough we'll do the whole
330 thing atomically. Otherwise we have no choice
331 but to break apart the reads. */
336 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
337 bcnt = sizeof(hdw->cmd_buffer)-1;
339 if (funcp(hdw,msgs[0].addr,NULL,0,
340 msgs[0].buf+offs,bcnt)) {
352 if (funcp(hdw,msgs[0].addr,
353 msgs[0].buf,msgs[0].len,NULL,0)) {
358 } else if (num == 2) {
359 if (msgs[0].addr != msgs[1].addr) {
360 trace_i2c("i2c refusing 2 phase transfer with"
361 " conflicting target addresses");
365 if ((!((msgs[0].flags & I2C_M_RD))) &&
366 (msgs[1].flags & I2C_M_RD)) {
367 u16 tcnt,bcnt,wcnt,offs;
368 /* Write followed by atomic read. If the read
369 portion is short enough we'll do the whole thing
370 atomically. Otherwise we have no choice but to
371 break apart the reads. */
375 while (tcnt || wcnt) {
377 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
378 bcnt = sizeof(hdw->cmd_buffer)-1;
380 if (funcp(hdw,msgs[0].addr,
382 msgs[1].buf+offs,bcnt)) {
393 trace_i2c("i2c refusing complex transfer"
394 " read0=%d read1=%d",
395 (msgs[0].flags & I2C_M_RD),
396 (msgs[1].flags & I2C_M_RD));
399 trace_i2c("i2c refusing %d phase transfer",num);
403 if (pvrusb2_debug & PVR2_TRACE_I2C_TRAF) {
404 unsigned int idx,offs,cnt;
405 for (idx = 0; idx < num; idx++) {
408 "pvrusb2 i2c xfer %u/%u:"
409 " addr=0x%x len=%d %s%s",
413 (msgs[idx].flags & I2C_M_RD ?
415 (msgs[idx].flags & I2C_M_NOSTART ?
417 if ((ret > 0) || !(msgs[idx].flags & I2C_M_RD)) {
418 if (cnt > 8) cnt = 8;
420 for (offs = 0; offs < (cnt>8?8:cnt); offs++) {
421 if (offs) printk(" ");
422 printk("%02x",msgs[idx].buf[offs]);
424 if (offs < cnt) printk(" ...");
428 printk(" result=%d",ret);
434 "pvrusb2 i2c xfer null transfer result=%d\n",
441 static int pvr2_i2c_control(struct i2c_adapter *adapter,
442 unsigned int cmd, unsigned long arg)
447 static u32 pvr2_i2c_functionality(struct i2c_adapter *adap)
449 return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE_DATA;
452 static int pvr2_i2c_core_singleton(struct i2c_client *cp,
453 unsigned int cmd,void *arg)
456 if (!cp) return -EINVAL;
457 if (!(cp->driver)) return -EINVAL;
458 if (!(cp->driver->command)) return -EINVAL;
459 if (!try_module_get(cp->driver->driver.owner)) return -EAGAIN;
460 stat = cp->driver->command(cp,cmd,arg);
461 module_put(cp->driver->driver.owner);
465 int pvr2_i2c_client_cmd(struct pvr2_i2c_client *cp,unsigned int cmd,void *arg)
468 if (pvrusb2_debug & PVR2_TRACE_I2C_CMD) {
471 cnt = pvr2_i2c_client_describe(cp,PVR2_I2C_DETAIL_DEBUG,
473 pvr2_trace(PVR2_TRACE_I2C_CMD,
474 "i2c COMMAND (code=%u 0x%x) to %.*s",
477 stat = pvr2_i2c_core_singleton(cp->client,cmd,arg);
478 if (pvrusb2_debug & PVR2_TRACE_I2C_CMD) {
481 cnt = pvr2_i2c_client_describe(cp,PVR2_I2C_DETAIL_DEBUG,
483 pvr2_trace(PVR2_TRACE_I2C_CMD,
484 "i2c COMMAND to %.*s (ret=%d)",cnt,buf,stat);
489 int pvr2_i2c_core_cmd(struct pvr2_hdw *hdw,unsigned int cmd,void *arg)
491 struct list_head *item,*nc;
492 struct pvr2_i2c_client *cp;
495 if (!hdw) return stat;
497 mutex_lock(&hdw->i2c_list_lock);
498 list_for_each_safe(item,nc,&hdw->i2c_clients) {
499 cp = list_entry(item,struct pvr2_i2c_client,list);
500 if (!cp->recv_enable) continue;
501 mutex_unlock(&hdw->i2c_list_lock);
502 stat = pvr2_i2c_client_cmd(cp,cmd,arg);
503 mutex_lock(&hdw->i2c_list_lock);
505 mutex_unlock(&hdw->i2c_list_lock);
510 static int handler_check(struct pvr2_i2c_client *cp)
512 struct pvr2_i2c_handler *hp = cp->handler;
514 if (!hp->func_table->check) return 0;
515 return hp->func_table->check(hp->func_data) != 0;
520 void pvr2_i2c_core_sync(struct pvr2_hdw *hdw)
524 struct list_head *item,*nc;
525 struct pvr2_i2c_client *cp;
527 if (!hdw->i2c_linked) return;
528 if (!(hdw->i2c_pend_types & PVR2_I2C_PEND_ALL)) {
531 mutex_lock(&hdw->i2c_list_lock); do {
532 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: core_sync BEGIN");
533 if (hdw->i2c_pend_types & PVR2_I2C_PEND_DETECT) {
534 /* One or more I2C clients have attached since we
535 last synced. So scan the list and identify the
539 unsigned long amask = 0;
540 buf = kmalloc(BUFSIZE,GFP_KERNEL);
541 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_DETECT");
542 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_DETECT;
543 list_for_each(item,&hdw->i2c_clients) {
544 cp = list_entry(item,struct pvr2_i2c_client,
546 if (!cp->detected_flag) {
548 pvr2_i2c_probe(hdw,cp);
549 cp->detected_flag = !0;
553 cnt = pvr2_i2c_client_describe(
558 trace_i2c("Probed: %.*s",cnt,buf);
559 if (handler_check(cp)) {
560 hdw->i2c_pend_types |=
561 PVR2_I2C_PEND_CLIENT;
564 hdw->i2c_pend_mask |= msk;
565 hdw->i2c_pend_types |=
566 PVR2_I2C_PEND_REFRESH;
568 amask |= cp->ctl_mask;
570 hdw->i2c_active_mask = amask;
573 if (hdw->i2c_pend_types & PVR2_I2C_PEND_STALE) {
574 /* Need to do one or more global updates. Arrange
575 for this to happen. */
577 pvr2_trace(PVR2_TRACE_I2C_CORE,
578 "i2c: PEND_STALE (0x%lx)",
579 hdw->i2c_stale_mask);
580 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_STALE;
581 list_for_each(item,&hdw->i2c_clients) {
582 cp = list_entry(item,struct pvr2_i2c_client,
584 m2 = hdw->i2c_stale_mask;
586 m2 &= ~cp->pend_mask;
588 pvr2_trace(PVR2_TRACE_I2C_CORE,
589 "i2c: cp=%p setting 0x%lx",
594 hdw->i2c_pend_mask |= hdw->i2c_stale_mask;
595 hdw->i2c_stale_mask = 0;
596 hdw->i2c_pend_types |= PVR2_I2C_PEND_REFRESH;
598 if (hdw->i2c_pend_types & PVR2_I2C_PEND_CLIENT) {
599 /* One or more client handlers are asking for an
600 update. Run through the list of known clients
601 and update each one. */
602 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_CLIENT");
603 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_CLIENT;
604 list_for_each_safe(item,nc,&hdw->i2c_clients) {
605 cp = list_entry(item,struct pvr2_i2c_client,
607 if (!cp->handler) continue;
608 if (!cp->handler->func_table->update) continue;
609 pvr2_trace(PVR2_TRACE_I2C_CORE,
610 "i2c: cp=%p update",cp);
611 mutex_unlock(&hdw->i2c_list_lock);
612 cp->handler->func_table->update(
613 cp->handler->func_data);
614 mutex_lock(&hdw->i2c_list_lock);
615 /* If client's update function set some
616 additional pending bits, account for that
618 if (cp->pend_mask & ~hdw->i2c_pend_mask) {
619 hdw->i2c_pend_mask |= cp->pend_mask;
620 hdw->i2c_pend_types |=
621 PVR2_I2C_PEND_REFRESH;
625 if (hdw->i2c_pend_types & PVR2_I2C_PEND_REFRESH) {
626 const struct pvr2_i2c_op *opf;
628 /* Some actual updates are pending. Walk through
629 each update type and perform it. */
630 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: PEND_REFRESH"
631 " (0x%lx)",hdw->i2c_pend_mask);
632 hdw->i2c_pend_types &= ~PVR2_I2C_PEND_REFRESH;
633 pm = hdw->i2c_pend_mask;
634 hdw->i2c_pend_mask = 0;
635 for (idx = 0, msk = 1; pm; idx++, msk <<= 1) {
636 if (!(pm & msk)) continue;
638 list_for_each(item,&hdw->i2c_clients) {
639 cp = list_entry(item,
640 struct pvr2_i2c_client,
642 if (cp->pend_mask & msk) {
643 cp->pend_mask &= ~msk;
644 cp->recv_enable = !0;
649 opf = pvr2_i2c_get_op(idx);
651 mutex_unlock(&hdw->i2c_list_lock);
653 mutex_lock(&hdw->i2c_list_lock);
656 pvr2_trace(PVR2_TRACE_I2C_CORE,"i2c: core_sync END");
657 } while (0); mutex_unlock(&hdw->i2c_list_lock);
660 int pvr2_i2c_core_check_stale(struct pvr2_hdw *hdw)
662 unsigned long msk,sm,pm;
664 const struct pvr2_i2c_op *opf;
665 struct list_head *item;
666 struct pvr2_i2c_client *cp;
669 pvr2_trace(PVR2_TRACE_I2C_CORE,"pvr2_i2c_core_check_stale BEGIN");
671 pm = hdw->i2c_active_mask;
673 for (idx = 0, msk = 1; pm; idx++, msk <<= 1) {
674 if (!(msk & pm)) continue;
676 opf = pvr2_i2c_get_op(idx);
678 if (opf->check(hdw)) {
682 if (sm) pt |= PVR2_I2C_PEND_STALE;
684 list_for_each(item,&hdw->i2c_clients) {
685 cp = list_entry(item,struct pvr2_i2c_client,list);
686 if (!handler_check(cp)) continue;
687 pt |= PVR2_I2C_PEND_CLIENT;
691 mutex_lock(&hdw->i2c_list_lock); do {
692 hdw->i2c_pend_types |= pt;
693 hdw->i2c_stale_mask |= sm;
694 hdw->i2c_pend_mask |= hdw->i2c_stale_mask;
695 } while (0); mutex_unlock(&hdw->i2c_list_lock);
698 pvr2_trace(PVR2_TRACE_I2C_CORE,
699 "i2c: types=0x%x stale=0x%lx pend=0x%lx",
703 pvr2_trace(PVR2_TRACE_I2C_CORE,"pvr2_i2c_core_check_stale END");
705 return (hdw->i2c_pend_types & PVR2_I2C_PEND_ALL) != 0;
708 static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client *cp,
710 char *buf,unsigned int maxlen)
712 unsigned int ccnt,bcnt;
714 const struct pvr2_i2c_op *opf;
717 if (detail & PVR2_I2C_DETAIL_DEBUG) {
718 bcnt = scnprintf(buf,maxlen,
719 "ctxt=%p ctl_mask=0x%lx",
721 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
724 bcnt = scnprintf(buf,maxlen,
729 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
730 if ((detail & PVR2_I2C_DETAIL_HANDLER) &&
731 cp->handler && cp->handler->func_table->describe) {
732 bcnt = scnprintf(buf,maxlen," (");
733 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
734 bcnt = cp->handler->func_table->describe(
735 cp->handler->func_data,buf,maxlen);
736 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
737 bcnt = scnprintf(buf,maxlen,")");
738 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
740 if ((detail & PVR2_I2C_DETAIL_CTLMASK) && cp->ctl_mask) {
742 unsigned long msk,sm;
744 bcnt = scnprintf(buf,maxlen," [");
745 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
748 for (idx = 0, msk = 1; msk; idx++, msk <<= 1) {
749 if (!(cp->ctl_mask & msk)) continue;
750 opf = pvr2_i2c_get_op(idx);
752 bcnt = scnprintf(buf,maxlen,"%s%s",
755 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
762 bcnt = scnprintf(buf,maxlen,"%s%lx",
763 idx != 0 ? " " : "",sm);
764 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
766 bcnt = scnprintf(buf,maxlen,"]");
767 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
772 unsigned int pvr2_i2c_report(struct pvr2_hdw *hdw,
773 char *buf,unsigned int maxlen)
775 unsigned int ccnt,bcnt;
776 struct list_head *item;
777 struct pvr2_i2c_client *cp;
779 mutex_lock(&hdw->i2c_list_lock); do {
780 list_for_each(item,&hdw->i2c_clients) {
781 cp = list_entry(item,struct pvr2_i2c_client,list);
782 bcnt = pvr2_i2c_client_describe(
784 (PVR2_I2C_DETAIL_HANDLER|
785 PVR2_I2C_DETAIL_CTLMASK),
787 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
788 bcnt = scnprintf(buf,maxlen,"\n");
789 ccnt += bcnt; buf += bcnt; maxlen -= bcnt;
791 } while (0); mutex_unlock(&hdw->i2c_list_lock);
795 static int pvr2_i2c_attach_inform(struct i2c_client *client)
797 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data);
798 struct pvr2_i2c_client *cp;
799 int fl = !(hdw->i2c_pend_types & PVR2_I2C_PEND_ALL);
800 cp = kmalloc(sizeof(*cp),GFP_KERNEL);
801 trace_i2c("i2c_attach [client=%s @ 0x%x ctxt=%p]",
804 if (!cp) return -ENOMEM;
805 memset(cp,0,sizeof(*cp));
806 INIT_LIST_HEAD(&cp->list);
808 mutex_lock(&hdw->i2c_list_lock); do {
809 list_add_tail(&cp->list,&hdw->i2c_clients);
810 hdw->i2c_pend_types |= PVR2_I2C_PEND_DETECT;
811 } while (0); mutex_unlock(&hdw->i2c_list_lock);
812 if (fl) pvr2_hdw_poll_trigger_unlocked(hdw);
816 static int pvr2_i2c_detach_inform(struct i2c_client *client)
818 struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data);
819 struct pvr2_i2c_client *cp;
820 struct list_head *item,*nc;
821 unsigned long amask = 0;
823 mutex_lock(&hdw->i2c_list_lock); do {
824 list_for_each_safe(item,nc,&hdw->i2c_clients) {
825 cp = list_entry(item,struct pvr2_i2c_client,list);
826 if (cp->client == client) {
827 trace_i2c("pvr2_i2c_detach"
828 " [client=%s @ 0x%x ctxt=%p]",
832 cp->handler->func_table->detach) {
833 cp->handler->func_table->detach(
834 cp->handler->func_data);
841 amask |= cp->ctl_mask;
843 hdw->i2c_active_mask = amask;
844 } while (0); mutex_unlock(&hdw->i2c_list_lock);
846 trace_i2c("pvr2_i2c_detach [client=%s @ 0x%x ctxt=<unknown>]",
853 static struct i2c_algorithm pvr2_i2c_algo_template = {
854 .master_xfer = pvr2_i2c_xfer,
855 .algo_control = pvr2_i2c_control,
856 .functionality = pvr2_i2c_functionality,
859 static struct i2c_adapter pvr2_i2c_adap_template = {
860 .owner = THIS_MODULE,
861 .class = I2C_CLASS_TV_ANALOG,
862 .id = I2C_HW_B_BT848,
863 .client_register = pvr2_i2c_attach_inform,
864 .client_unregister = pvr2_i2c_detach_inform,
867 static void do_i2c_scan(struct pvr2_hdw *hdw)
869 struct i2c_msg msg[1];
872 msg[0].flags = I2C_M_RD;
875 printk("%s: i2c scan beginning\n",hdw->name);
876 for (i = 0; i < 128; i++) {
878 rc = i2c_transfer(&hdw->i2c_adap,msg,
879 sizeof(msg)/sizeof(msg[0]));
880 if (rc != 1) continue;
881 printk("%s: i2c scan: found device @ 0x%x\n",hdw->name,i);
883 printk("%s: i2c scan done.\n",hdw->name);
886 void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
890 // The default action for all possible I2C addresses is just to do
891 // the transfer normally.
892 for (idx = 0; idx < PVR2_I2C_FUNC_CNT; idx++) {
893 hdw->i2c_func[idx] = pvr2_i2c_basic_op;
896 // If however we're dealing with new hardware, insert some hacks in
897 // the I2C transfer stack to let things work better.
898 if (hdw->hdw_type == PVR2_HDW_TYPE_24XXX) {
899 hdw->i2c_func[0x1b] = i2c_hack_wm8775;
900 hdw->i2c_func[0x44] = i2c_hack_cx25840;
903 // Configure the adapter and set up everything else related to it.
904 memcpy(&hdw->i2c_adap,&pvr2_i2c_adap_template,sizeof(hdw->i2c_adap));
905 memcpy(&hdw->i2c_algo,&pvr2_i2c_algo_template,sizeof(hdw->i2c_algo));
906 strlcpy(hdw->i2c_adap.name,hdw->name,sizeof(hdw->i2c_adap.name));
907 hdw->i2c_adap.algo = &hdw->i2c_algo;
908 hdw->i2c_adap.algo_data = hdw;
909 hdw->i2c_pend_mask = 0;
910 hdw->i2c_stale_mask = 0;
911 hdw->i2c_active_mask = 0;
912 INIT_LIST_HEAD(&hdw->i2c_clients);
913 mutex_init(&hdw->i2c_list_lock);
914 hdw->i2c_linked = !0;
915 i2c_add_adapter(&hdw->i2c_adap);
916 if (i2c_scan) do_i2c_scan(hdw);
919 void pvr2_i2c_core_done(struct pvr2_hdw *hdw)
921 if (hdw->i2c_linked) {
922 i2c_del_adapter(&hdw->i2c_adap);
928 Stuff for Emacs to see, in order to encourage consistent editing style:
929 *** Local Variables: ***
931 *** fill-column: 75 ***
933 *** c-basic-offset: 8 ***