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"
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
33 device. By doing this we can then make use of existing functionality in
34 V4L (e.g. tuner.c) rather than rolling our own.
38 static unsigned int i2c_scan
= 0;
39 module_param(i2c_scan
, int, S_IRUGO
|S_IWUSR
);
40 MODULE_PARM_DESC(i2c_scan
,"scan i2c bus at insmod time");
42 static int ir_mode
[PVR_NUM
] = { [0 ... PVR_NUM
-1] = 1 };
43 module_param_array(ir_mode
, int, NULL
, 0444);
44 MODULE_PARM_DESC(ir_mode
,"specify: 0=disable IR reception, 1=normal IR");
46 static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client
*cp
,
48 char *buf
,unsigned int maxlen
);
50 static int pvr2_i2c_write(struct pvr2_hdw
*hdw
, /* Context */
51 u8 i2c_addr
, /* I2C address we're talking to */
52 u8
*data
, /* Data to write */
53 u16 length
) /* Size of data to write */
55 /* Return value - default 0 means success */
59 if (!data
) length
= 0;
60 if (length
> (sizeof(hdw
->cmd_buffer
) - 3)) {
61 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
62 "Killing an I2C write to %u that is too large"
63 " (desired=%u limit=%u)",
65 length
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 3));
69 LOCK_TAKE(hdw
->ctl_lock
);
71 /* Clear the command buffer (likely to be paranoia) */
72 memset(hdw
->cmd_buffer
, 0, sizeof(hdw
->cmd_buffer
));
74 /* Set up command buffer for an I2C write */
75 hdw
->cmd_buffer
[0] = FX2CMD_I2C_WRITE
; /* write prefix */
76 hdw
->cmd_buffer
[1] = i2c_addr
; /* i2c addr of chip */
77 hdw
->cmd_buffer
[2] = length
; /* length of what follows */
78 if (length
) memcpy(hdw
->cmd_buffer
+ 3, data
, length
);
80 /* Do the operation */
81 ret
= pvr2_send_request(hdw
,
87 if (hdw
->cmd_buffer
[0] != 8) {
89 if (hdw
->cmd_buffer
[0] != 7) {
90 trace_i2c("unexpected status"
91 " from i2_write[%d]: %d",
92 i2c_addr
,hdw
->cmd_buffer
[0]);
97 LOCK_GIVE(hdw
->ctl_lock
);
102 static int pvr2_i2c_read(struct pvr2_hdw
*hdw
, /* Context */
103 u8 i2c_addr
, /* I2C address we're talking to */
104 u8
*data
, /* Data to write */
105 u16 dlen
, /* Size of data to write */
106 u8
*res
, /* Where to put data we read */
107 u16 rlen
) /* Amount of data to read */
109 /* Return value - default 0 means success */
114 if (dlen
> (sizeof(hdw
->cmd_buffer
) - 4)) {
115 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
116 "Killing an I2C read to %u that has wlen too large"
117 " (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"
125 " (desired=%u limit=%u)",
127 rlen
,(unsigned int)(sizeof(hdw
->cmd_buffer
) - 1));
131 LOCK_TAKE(hdw
->ctl_lock
);
133 /* Clear the command buffer (likely to be paranoia) */
134 memset(hdw
->cmd_buffer
, 0, sizeof(hdw
->cmd_buffer
));
136 /* Set up command buffer for an I2C write followed by a read */
137 hdw
->cmd_buffer
[0] = FX2CMD_I2C_READ
; /* read prefix */
138 hdw
->cmd_buffer
[1] = dlen
; /* arg length */
139 hdw
->cmd_buffer
[2] = rlen
; /* answer length. Device will send one
140 more byte (status). */
141 hdw
->cmd_buffer
[3] = i2c_addr
; /* i2c addr of chip */
142 if (dlen
) memcpy(hdw
->cmd_buffer
+ 4, data
, dlen
);
144 /* Do the operation */
145 ret
= pvr2_send_request(hdw
,
151 if (hdw
->cmd_buffer
[0] != 8) {
153 if (hdw
->cmd_buffer
[0] != 7) {
154 trace_i2c("unexpected status"
155 " from i2_read[%d]: %d",
156 i2c_addr
,hdw
->cmd_buffer
[0]);
161 /* Copy back the result */
164 /* Error, just blank out the return buffer */
165 memset(res
, 0, rlen
);
167 memcpy(res
, hdw
->cmd_buffer
+ 1, rlen
);
171 LOCK_GIVE(hdw
->ctl_lock
);
176 /* This is the common low level entry point for doing I2C operations to the
178 static int pvr2_i2c_basic_op(struct pvr2_hdw
*hdw
,
185 if (!rdata
) rlen
= 0;
186 if (!wdata
) wlen
= 0;
188 return pvr2_i2c_read(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
190 return pvr2_i2c_write(hdw
,i2c_addr
,wdata
,wlen
);
195 /* This is a special entry point for cases of I2C transaction attempts to
196 the IR receiver. The implementation here simulates the IR receiver by
197 issuing a command to the FX2 firmware and using that response to return
198 what the real I2C receiver would have returned. We use this for 24xxx
199 devices, where the IR receiver chip has been removed and replaced with
200 FX2 related logic. */
201 static int i2c_24xxx_ir(struct pvr2_hdw
*hdw
,
202 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
207 if (!(rlen
|| wlen
)) {
208 /* This is a probe attempt. Just let it succeed. */
212 /* We don't understand this kind of transaction */
213 if ((wlen
!= 0) || (rlen
== 0)) return -EIO
;
216 /* Mike Isely <isely@pobox.com> Appears to be a probe
217 attempt from lirc. Just fill in zeroes and return. If
218 we try instead to do the full transaction here, then bad
219 things seem to happen within the lirc driver module
220 (version 0.8.0-7 sources from Debian, when run under
221 vanilla 2.6.17.6 kernel) - and I don't have the patience
223 if (rlen
> 0) rdata
[0] = 0;
224 if (rlen
> 1) rdata
[1] = 0;
228 /* Issue a command to the FX2 to read the IR receiver. */
229 LOCK_TAKE(hdw
->ctl_lock
); do {
230 hdw
->cmd_buffer
[0] = FX2CMD_GET_IR_CODE
;
231 stat
= pvr2_send_request(hdw
,
234 dat
[0] = hdw
->cmd_buffer
[0];
235 dat
[1] = hdw
->cmd_buffer
[1];
236 dat
[2] = hdw
->cmd_buffer
[2];
237 dat
[3] = hdw
->cmd_buffer
[3];
238 } while (0); LOCK_GIVE(hdw
->ctl_lock
);
240 /* Give up if that operation failed. */
241 if (stat
!= 0) return stat
;
243 /* Mangle the results into something that looks like the real IR
247 /* No code received. */
252 /* Mash the FX2 firmware-provided IR code into something
253 that the normal i2c chip-level driver expects. */
260 rdata
[0] = (val
>> 8) & 0xffu
;
261 rdata
[1] = val
& 0xffu
;
267 /* This is a special entry point that is entered if an I2C operation is
268 attempted to a wm8775 chip on model 24xxx hardware. Autodetect of this
269 part doesn't work, but we know it is really there. So let's look for
270 the autodetect attempt and just return success if we see that. */
271 static int i2c_hack_wm8775(struct pvr2_hdw
*hdw
,
272 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
274 if (!(rlen
|| wlen
)) {
275 // This is a probe attempt. Just let it succeed.
278 return pvr2_i2c_basic_op(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
281 /* This is an entry point designed to always fail any attempt to perform a
282 transfer. We use this to cause certain I2C addresses to not be
284 static int i2c_black_hole(struct pvr2_hdw
*hdw
,
285 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
290 /* This is a special entry point that is entered if an I2C operation is
291 attempted to a cx25840 chip on model 24xxx hardware. This chip can
292 sometimes wedge itself. Worse still, when this happens msp3400 can
293 falsely detect this part and then the system gets hosed up after msp3400
294 gets confused and dies. What we want to do here is try to keep msp3400
295 away and also try to notice if the chip is wedged and send a warning to
297 static int i2c_hack_cx25840(struct pvr2_hdw
*hdw
,
298 u8 i2c_addr
,u8
*wdata
,u16 wlen
,u8
*rdata
,u16 rlen
)
301 unsigned int subaddr
;
303 int state
= hdw
->i2c_cx25840_hack_state
;
305 if (!(rlen
|| wlen
)) {
306 // Probe attempt - always just succeed and don't bother the
307 // hardware (this helps to make the state machine further
308 // down somewhat easier).
313 return pvr2_i2c_basic_op(hdw
,i2c_addr
,wdata
,wlen
,rdata
,rlen
);
316 /* We're looking for the exact pattern where the revision register
317 is being read. The cx25840 module will always look at the
318 revision register first. Any other pattern of access therefore
319 has to be a probe attempt from somebody else so we'll reject it.
320 Normally we could just let each client just probe the part
321 anyway, but when the cx25840 is wedged, msp3400 will get a false
322 positive and that just screws things up... */
326 case 1: subaddr
= 0x0100; break;
327 case 2: subaddr
= 0x0101; break;
330 } else if (wlen
== 2) {
331 subaddr
= (wdata
[0] << 8) | wdata
[1];
333 case 0x0100: state
= 1; break;
334 case 0x0101: state
= 2; break;
340 if (!rlen
) goto success
;
342 if (rlen
!= 1) goto fail
;
344 /* If we get to here then we have a legitimate read for one of the
345 two revision bytes, so pass it through. */
346 wbuf
[0] = subaddr
>> 8;
348 ret
= pvr2_i2c_basic_op(hdw
,i2c_addr
,wbuf
,2,rdata
,rlen
);
350 if ((ret
!= 0) || (*rdata
== 0x04) || (*rdata
== 0x0a)) {
351 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
352 "WARNING: Detected a wedged cx25840 chip;"
353 " the device will not work.");
354 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
355 "WARNING: Try power cycling the pvrusb2 device.");
356 pvr2_trace(PVR2_TRACE_ERROR_LEGS
,
357 "WARNING: Disabling further access to the device"
358 " to prevent other foul-ups.");
359 // This blocks all further communication with the part.
360 hdw
->i2c_func
[0x44] = NULL
;
361 pvr2_hdw_render_useless(hdw
);
366 pvr2_trace(PVR2_TRACE_CHIPS
,"cx25840 appears to be OK.");
370 hdw
->i2c_cx25840_hack_state
= state
;
374 hdw
->i2c_cx25840_hack_state
= state
;
378 /* This is a very, very limited I2C adapter implementation. We can only
379 support what we actually know will work on the device... */
380 static int pvr2_i2c_xfer(struct i2c_adapter
*i2c_adap
,
381 struct i2c_msg msgs
[],
385 pvr2_i2c_func funcp
= NULL
;
386 struct pvr2_hdw
*hdw
= (struct pvr2_hdw
*)(i2c_adap
->algo_data
);
392 if (msgs
[0].addr
< PVR2_I2C_FUNC_CNT
) {
393 funcp
= hdw
->i2c_func
[msgs
[0].addr
];
401 if (msgs
[0].flags
& I2C_M_RD
) {
405 /* Length == 0 read. This is a probe. */
406 if (funcp(hdw
,msgs
[0].addr
,NULL
,0,NULL
,0)) {
413 /* If the read is short enough we'll do the whole
414 thing atomically. Otherwise we have no choice
415 but to break apart the reads. */
420 if (bcnt
> sizeof(hdw
->cmd_buffer
)-1) {
421 bcnt
= sizeof(hdw
->cmd_buffer
)-1;
423 if (funcp(hdw
,msgs
[0].addr
,NULL
,0,
424 msgs
[0].buf
+offs
,bcnt
)) {
436 if (funcp(hdw
,msgs
[0].addr
,
437 msgs
[0].buf
,msgs
[0].len
,NULL
,0)) {
442 } else if (num
== 2) {
443 if (msgs
[0].addr
!= msgs
[1].addr
) {
444 trace_i2c("i2c refusing 2 phase transfer with"
445 " conflicting target addresses");
449 if ((!((msgs
[0].flags
& I2C_M_RD
))) &&
450 (msgs
[1].flags
& I2C_M_RD
)) {
451 u16 tcnt
,bcnt
,wcnt
,offs
;
452 /* Write followed by atomic read. If the read
453 portion is short enough we'll do the whole thing
454 atomically. Otherwise we have no choice but to
455 break apart the reads. */
459 while (tcnt
|| wcnt
) {
461 if (bcnt
> sizeof(hdw
->cmd_buffer
)-1) {
462 bcnt
= sizeof(hdw
->cmd_buffer
)-1;
464 if (funcp(hdw
,msgs
[0].addr
,
466 msgs
[1].buf
+offs
,bcnt
)) {
477 trace_i2c("i2c refusing complex transfer"
478 " read0=%d read1=%d",
479 (msgs
[0].flags
& I2C_M_RD
),
480 (msgs
[1].flags
& I2C_M_RD
));
483 trace_i2c("i2c refusing %d phase transfer",num
);
487 if (pvrusb2_debug
& PVR2_TRACE_I2C_TRAF
) {
488 unsigned int idx
,offs
,cnt
;
489 for (idx
= 0; idx
< num
; idx
++) {
492 "pvrusb2 i2c xfer %u/%u:"
493 " addr=0x%x len=%d %s",
497 (msgs
[idx
].flags
& I2C_M_RD
?
499 if ((ret
> 0) || !(msgs
[idx
].flags
& I2C_M_RD
)) {
500 if (cnt
> 8) cnt
= 8;
502 for (offs
= 0; offs
< (cnt
>8?8:cnt
); offs
++) {
503 if (offs
) printk(" ");
504 printk("%02x",msgs
[idx
].buf
[offs
]);
506 if (offs
< cnt
) printk(" ...");
510 printk(" result=%d",ret
);
516 "pvrusb2 i2c xfer null transfer result=%d\n",
523 static u32
pvr2_i2c_functionality(struct i2c_adapter
*adap
)
525 return I2C_FUNC_SMBUS_EMUL
| I2C_FUNC_I2C
;
528 static int pvr2_i2c_core_singleton(struct i2c_client
*cp
,
529 unsigned int cmd
,void *arg
)
532 if (!cp
) return -EINVAL
;
533 if (!(cp
->driver
)) return -EINVAL
;
534 if (!(cp
->driver
->command
)) return -EINVAL
;
535 if (!try_module_get(cp
->driver
->driver
.owner
)) return -EAGAIN
;
536 stat
= cp
->driver
->command(cp
,cmd
,arg
);
537 module_put(cp
->driver
->driver
.owner
);
541 int pvr2_i2c_client_cmd(struct pvr2_i2c_client
*cp
,unsigned int cmd
,void *arg
)
544 if (pvrusb2_debug
& PVR2_TRACE_I2C_CMD
) {
547 cnt
= pvr2_i2c_client_describe(cp
,PVR2_I2C_DETAIL_DEBUG
,
549 pvr2_trace(PVR2_TRACE_I2C_CMD
,
550 "i2c COMMAND (code=%u 0x%x) to %.*s",
553 stat
= pvr2_i2c_core_singleton(cp
->client
,cmd
,arg
);
554 if (pvrusb2_debug
& PVR2_TRACE_I2C_CMD
) {
557 cnt
= pvr2_i2c_client_describe(cp
,PVR2_I2C_DETAIL_DEBUG
,
559 pvr2_trace(PVR2_TRACE_I2C_CMD
,
560 "i2c COMMAND to %.*s (ret=%d)",cnt
,buf
,stat
);
565 int pvr2_i2c_core_cmd(struct pvr2_hdw
*hdw
,unsigned int cmd
,void *arg
)
567 struct pvr2_i2c_client
*cp
, *ncp
;
570 if (!hdw
) return stat
;
572 mutex_lock(&hdw
->i2c_list_lock
);
573 list_for_each_entry_safe(cp
, ncp
, &hdw
->i2c_clients
, list
) {
574 if (!cp
->recv_enable
) continue;
575 mutex_unlock(&hdw
->i2c_list_lock
);
576 stat
= pvr2_i2c_client_cmd(cp
,cmd
,arg
);
577 mutex_lock(&hdw
->i2c_list_lock
);
579 mutex_unlock(&hdw
->i2c_list_lock
);
584 static int handler_check(struct pvr2_i2c_client
*cp
)
586 struct pvr2_i2c_handler
*hp
= cp
->handler
;
588 if (!hp
->func_table
->check
) return 0;
589 return hp
->func_table
->check(hp
->func_data
) != 0;
595 void pvr2_i2c_core_status_poll(struct pvr2_hdw
*hdw
)
597 struct pvr2_i2c_client
*cp
;
598 mutex_lock(&hdw
->i2c_list_lock
); do {
599 struct v4l2_tuner
*vtp
= &hdw
->tuner_signal_info
;
600 memset(vtp
,0,sizeof(*vtp
));
601 list_for_each_entry(cp
, &hdw
->i2c_clients
, list
) {
602 if (!cp
->detected_flag
) continue;
603 if (!cp
->status_poll
) continue;
606 hdw
->tuner_signal_stale
= 0;
607 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c status poll"
608 " type=%u strength=%u audio=0x%x cap=0x%x"
611 vtp
->signal
,vtp
->rxsubchans
,vtp
->capability
,
612 vtp
->rangelow
,vtp
->rangehigh
);
613 } while (0); mutex_unlock(&hdw
->i2c_list_lock
);
617 /* Issue various I2C operations to bring chip-level drivers into sync with
618 state stored in this driver. */
619 void pvr2_i2c_core_sync(struct pvr2_hdw
*hdw
)
623 struct pvr2_i2c_client
*cp
, *ncp
;
625 if (!hdw
->i2c_linked
) return;
626 if (!(hdw
->i2c_pend_types
& PVR2_I2C_PEND_ALL
)) {
629 mutex_lock(&hdw
->i2c_list_lock
); do {
630 pvr2_trace(PVR2_TRACE_I2C_CORE
,"i2c: core_sync BEGIN");
631 if (hdw
->i2c_pend_types
& PVR2_I2C_PEND_DETECT
) {
632 /* One or more I2C clients have attached since we
633 last synced. So scan the list and identify the
637 unsigned long amask
= 0;
638 buf
= kmalloc(BUFSIZE
,GFP_KERNEL
);
639 pvr2_trace(PVR2_TRACE_I2C_CORE
,"i2c: PEND_DETECT");
640 hdw
->i2c_pend_types
&= ~PVR2_I2C_PEND_DETECT
;
641 list_for_each_entry(cp
, &hdw
->i2c_clients
, list
) {
642 if (!cp
->detected_flag
) {
644 pvr2_i2c_probe(hdw
,cp
);
645 cp
->detected_flag
= !0;
649 cnt
= pvr2_i2c_client_describe(
654 trace_i2c("Probed: %.*s",cnt
,buf
);
655 if (handler_check(cp
)) {
656 hdw
->i2c_pend_types
|=
657 PVR2_I2C_PEND_CLIENT
;
660 hdw
->i2c_pend_mask
|= msk
;
661 hdw
->i2c_pend_types
|=
662 PVR2_I2C_PEND_REFRESH
;
664 amask
|= cp
->ctl_mask
;
666 hdw
->i2c_active_mask
= amask
;
669 if (hdw
->i2c_pend_types
& PVR2_I2C_PEND_STALE
) {
670 /* Need to do one or more global updates. Arrange
671 for this to happen. */
673 pvr2_trace(PVR2_TRACE_I2C_CORE
,
674 "i2c: PEND_STALE (0x%lx)",
675 hdw
->i2c_stale_mask
);
676 hdw
->i2c_pend_types
&= ~PVR2_I2C_PEND_STALE
;
677 list_for_each_entry(cp
, &hdw
->i2c_clients
, list
) {
678 m2
= hdw
->i2c_stale_mask
;
680 m2
&= ~cp
->pend_mask
;
682 pvr2_trace(PVR2_TRACE_I2C_CORE
,
683 "i2c: cp=%p setting 0x%lx",
688 hdw
->i2c_pend_mask
|= hdw
->i2c_stale_mask
;
689 hdw
->i2c_stale_mask
= 0;
690 hdw
->i2c_pend_types
|= PVR2_I2C_PEND_REFRESH
;
692 if (hdw
->i2c_pend_types
& PVR2_I2C_PEND_CLIENT
) {
693 /* One or more client handlers are asking for an
694 update. Run through the list of known clients
695 and update each one. */
696 pvr2_trace(PVR2_TRACE_I2C_CORE
,"i2c: PEND_CLIENT");
697 hdw
->i2c_pend_types
&= ~PVR2_I2C_PEND_CLIENT
;
698 list_for_each_entry_safe(cp
, ncp
, &hdw
->i2c_clients
,
700 if (!cp
->handler
) continue;
701 if (!cp
->handler
->func_table
->update
) continue;
702 pvr2_trace(PVR2_TRACE_I2C_CORE
,
703 "i2c: cp=%p update",cp
);
704 mutex_unlock(&hdw
->i2c_list_lock
);
705 cp
->handler
->func_table
->update(
706 cp
->handler
->func_data
);
707 mutex_lock(&hdw
->i2c_list_lock
);
708 /* If client's update function set some
709 additional pending bits, account for that
711 if (cp
->pend_mask
& ~hdw
->i2c_pend_mask
) {
712 hdw
->i2c_pend_mask
|= cp
->pend_mask
;
713 hdw
->i2c_pend_types
|=
714 PVR2_I2C_PEND_REFRESH
;
718 if (hdw
->i2c_pend_types
& PVR2_I2C_PEND_REFRESH
) {
719 const struct pvr2_i2c_op
*opf
;
721 /* Some actual updates are pending. Walk through
722 each update type and perform it. */
723 pvr2_trace(PVR2_TRACE_I2C_CORE
,"i2c: PEND_REFRESH"
724 " (0x%lx)",hdw
->i2c_pend_mask
);
725 hdw
->i2c_pend_types
&= ~PVR2_I2C_PEND_REFRESH
;
726 pm
= hdw
->i2c_pend_mask
;
727 hdw
->i2c_pend_mask
= 0;
728 for (idx
= 0, msk
= 1; pm
; idx
++, msk
<<= 1) {
729 if (!(pm
& msk
)) continue;
731 list_for_each_entry(cp
, &hdw
->i2c_clients
,
733 if (cp
->pend_mask
& msk
) {
734 cp
->pend_mask
&= ~msk
;
735 cp
->recv_enable
= !0;
740 opf
= pvr2_i2c_get_op(idx
);
742 mutex_unlock(&hdw
->i2c_list_lock
);
744 mutex_lock(&hdw
->i2c_list_lock
);
747 pvr2_trace(PVR2_TRACE_I2C_CORE
,"i2c: core_sync END");
748 } while (0); mutex_unlock(&hdw
->i2c_list_lock
);
751 int pvr2_i2c_core_check_stale(struct pvr2_hdw
*hdw
)
753 unsigned long msk
,sm
,pm
;
755 const struct pvr2_i2c_op
*opf
;
756 struct pvr2_i2c_client
*cp
;
759 pvr2_trace(PVR2_TRACE_I2C_CORE
,"pvr2_i2c_core_check_stale BEGIN");
761 pm
= hdw
->i2c_active_mask
;
763 for (idx
= 0, msk
= 1; pm
; idx
++, msk
<<= 1) {
764 if (!(msk
& pm
)) continue;
766 opf
= pvr2_i2c_get_op(idx
);
768 if (opf
->check(hdw
)) {
772 if (sm
) pt
|= PVR2_I2C_PEND_STALE
;
774 list_for_each_entry(cp
, &hdw
->i2c_clients
, list
)
775 if (handler_check(cp
))
776 pt
|= PVR2_I2C_PEND_CLIENT
;
779 mutex_lock(&hdw
->i2c_list_lock
); do {
780 hdw
->i2c_pend_types
|= pt
;
781 hdw
->i2c_stale_mask
|= sm
;
782 hdw
->i2c_pend_mask
|= hdw
->i2c_stale_mask
;
783 } while (0); mutex_unlock(&hdw
->i2c_list_lock
);
786 pvr2_trace(PVR2_TRACE_I2C_CORE
,
787 "i2c: types=0x%x stale=0x%lx pend=0x%lx",
791 pvr2_trace(PVR2_TRACE_I2C_CORE
,"pvr2_i2c_core_check_stale END");
793 return (hdw
->i2c_pend_types
& PVR2_I2C_PEND_ALL
) != 0;
796 static unsigned int pvr2_i2c_client_describe(struct pvr2_i2c_client
*cp
,
798 char *buf
,unsigned int maxlen
)
800 unsigned int ccnt
,bcnt
;
802 const struct pvr2_i2c_op
*opf
;
805 if (detail
& PVR2_I2C_DETAIL_DEBUG
) {
806 bcnt
= scnprintf(buf
,maxlen
,
807 "ctxt=%p ctl_mask=0x%lx",
809 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
812 bcnt
= scnprintf(buf
,maxlen
,
817 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
818 if ((detail
& PVR2_I2C_DETAIL_HANDLER
) &&
819 cp
->handler
&& cp
->handler
->func_table
->describe
) {
820 bcnt
= scnprintf(buf
,maxlen
," (");
821 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
822 bcnt
= cp
->handler
->func_table
->describe(
823 cp
->handler
->func_data
,buf
,maxlen
);
824 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
825 bcnt
= scnprintf(buf
,maxlen
,")");
826 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
828 if ((detail
& PVR2_I2C_DETAIL_CTLMASK
) && cp
->ctl_mask
) {
830 unsigned long msk
,sm
;
832 bcnt
= scnprintf(buf
,maxlen
," [");
833 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
836 for (idx
= 0, msk
= 1; msk
; idx
++, msk
<<= 1) {
837 if (!(cp
->ctl_mask
& msk
)) continue;
838 opf
= pvr2_i2c_get_op(idx
);
840 bcnt
= scnprintf(buf
,maxlen
,"%s%s",
843 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
850 bcnt
= scnprintf(buf
,maxlen
,"%s%lx",
851 idx
!= 0 ? " " : "",sm
);
852 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
854 bcnt
= scnprintf(buf
,maxlen
,"]");
855 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
860 unsigned int pvr2_i2c_report(struct pvr2_hdw
*hdw
,
861 char *buf
,unsigned int maxlen
)
863 unsigned int ccnt
,bcnt
;
864 struct pvr2_i2c_client
*cp
;
866 mutex_lock(&hdw
->i2c_list_lock
); do {
867 list_for_each_entry(cp
, &hdw
->i2c_clients
, list
) {
868 bcnt
= pvr2_i2c_client_describe(
870 (PVR2_I2C_DETAIL_HANDLER
|
871 PVR2_I2C_DETAIL_CTLMASK
),
873 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
874 bcnt
= scnprintf(buf
,maxlen
,"\n");
875 ccnt
+= bcnt
; buf
+= bcnt
; maxlen
-= bcnt
;
877 } while (0); mutex_unlock(&hdw
->i2c_list_lock
);
881 static int pvr2_i2c_attach_inform(struct i2c_client
*client
)
883 struct pvr2_hdw
*hdw
= (struct pvr2_hdw
*)(client
->adapter
->algo_data
);
884 struct pvr2_i2c_client
*cp
;
885 int fl
= !(hdw
->i2c_pend_types
& PVR2_I2C_PEND_ALL
);
886 cp
= kzalloc(sizeof(*cp
),GFP_KERNEL
);
887 trace_i2c("i2c_attach [client=%s @ 0x%x ctxt=%p]",
890 if (!cp
) return -ENOMEM
;
892 INIT_LIST_HEAD(&cp
->list
);
894 mutex_lock(&hdw
->i2c_list_lock
); do {
895 list_add_tail(&cp
->list
,&hdw
->i2c_clients
);
896 hdw
->i2c_pend_types
|= PVR2_I2C_PEND_DETECT
;
897 } while (0); mutex_unlock(&hdw
->i2c_list_lock
);
898 if (fl
) queue_work(hdw
->workqueue
,&hdw
->worki2csync
);
902 static int pvr2_i2c_detach_inform(struct i2c_client
*client
)
904 struct pvr2_hdw
*hdw
= (struct pvr2_hdw
*)(client
->adapter
->algo_data
);
905 struct pvr2_i2c_client
*cp
, *ncp
;
906 unsigned long amask
= 0;
908 mutex_lock(&hdw
->i2c_list_lock
); do {
909 list_for_each_entry_safe(cp
, ncp
, &hdw
->i2c_clients
, list
) {
910 if (cp
->client
== client
) {
911 trace_i2c("pvr2_i2c_detach"
912 " [client=%s @ 0x%x ctxt=%p]",
916 cp
->handler
->func_table
->detach
) {
917 cp
->handler
->func_table
->detach(
918 cp
->handler
->func_data
);
925 amask
|= cp
->ctl_mask
;
927 hdw
->i2c_active_mask
= amask
;
928 } while (0); mutex_unlock(&hdw
->i2c_list_lock
);
930 trace_i2c("pvr2_i2c_detach [client=%s @ 0x%x ctxt=<unknown>]",
937 static struct i2c_algorithm pvr2_i2c_algo_template
= {
938 .master_xfer
= pvr2_i2c_xfer
,
939 .functionality
= pvr2_i2c_functionality
,
942 static struct i2c_adapter pvr2_i2c_adap_template
= {
943 .owner
= THIS_MODULE
,
944 .class = I2C_CLASS_TV_ANALOG
,
945 .id
= I2C_HW_B_BT848
,
946 .client_register
= pvr2_i2c_attach_inform
,
947 .client_unregister
= pvr2_i2c_detach_inform
,
950 static void do_i2c_scan(struct pvr2_hdw
*hdw
)
952 struct i2c_msg msg
[1];
955 msg
[0].flags
= I2C_M_RD
;
958 printk("%s: i2c scan beginning\n",hdw
->name
);
959 for (i
= 0; i
< 128; i
++) {
961 rc
= i2c_transfer(&hdw
->i2c_adap
,msg
, ARRAY_SIZE(msg
));
962 if (rc
!= 1) continue;
963 printk("%s: i2c scan: found device @ 0x%x\n",hdw
->name
,i
);
965 printk("%s: i2c scan done.\n",hdw
->name
);
968 void pvr2_i2c_core_init(struct pvr2_hdw
*hdw
)
972 /* The default action for all possible I2C addresses is just to do
973 the transfer normally. */
974 for (idx
= 0; idx
< PVR2_I2C_FUNC_CNT
; idx
++) {
975 hdw
->i2c_func
[idx
] = pvr2_i2c_basic_op
;
978 /* However, deal with various special cases for 24xxx hardware. */
979 if (ir_mode
[hdw
->unit_number
] == 0) {
980 printk(KERN_INFO
"%s: IR disabled\n",hdw
->name
);
981 hdw
->i2c_func
[0x18] = i2c_black_hole
;
982 } else if (ir_mode
[hdw
->unit_number
] == 1) {
983 if (hdw
->hdw_desc
->flag_has_hauppauge_custom_ir
) {
984 hdw
->i2c_func
[0x18] = i2c_24xxx_ir
;
987 if (hdw
->hdw_desc
->flag_has_cx25840
) {
988 hdw
->i2c_func
[0x44] = i2c_hack_cx25840
;
990 if (hdw
->hdw_desc
->flag_has_wm8775
) {
991 hdw
->i2c_func
[0x1b] = i2c_hack_wm8775
;
994 // Configure the adapter and set up everything else related to it.
995 memcpy(&hdw
->i2c_adap
,&pvr2_i2c_adap_template
,sizeof(hdw
->i2c_adap
));
996 memcpy(&hdw
->i2c_algo
,&pvr2_i2c_algo_template
,sizeof(hdw
->i2c_algo
));
997 strlcpy(hdw
->i2c_adap
.name
,hdw
->name
,sizeof(hdw
->i2c_adap
.name
));
998 hdw
->i2c_adap
.dev
.parent
= &hdw
->usb_dev
->dev
;
999 hdw
->i2c_adap
.algo
= &hdw
->i2c_algo
;
1000 hdw
->i2c_adap
.algo_data
= hdw
;
1001 hdw
->i2c_pend_mask
= 0;
1002 hdw
->i2c_stale_mask
= 0;
1003 hdw
->i2c_active_mask
= 0;
1004 INIT_LIST_HEAD(&hdw
->i2c_clients
);
1005 mutex_init(&hdw
->i2c_list_lock
);
1006 hdw
->i2c_linked
= !0;
1007 i2c_add_adapter(&hdw
->i2c_adap
);
1008 if (i2c_scan
) do_i2c_scan(hdw
);
1011 void pvr2_i2c_core_done(struct pvr2_hdw
*hdw
)
1013 if (hdw
->i2c_linked
) {
1014 i2c_del_adapter(&hdw
->i2c_adap
);
1015 hdw
->i2c_linked
= 0;
1020 Stuff for Emacs to see, in order to encourage consistent editing style:
1021 *** Local Variables: ***
1023 *** fill-column: 75 ***
1024 *** tab-width: 8 ***
1025 *** c-basic-offset: 8 ***