2 cx231xx-i2c.c - driver for Conexant Cx23100/101/102 USB video capture devices
4 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
6 Based on Cx23885 driver
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <linux/module.h>
24 #include <linux/kernel.h>
25 #include <linux/usb.h>
26 #include <linux/i2c.h>
27 #include <media/v4l2-common.h>
28 #include <media/tuner.h>
32 /* ----------------------------------------------------------- */
34 static unsigned int i2c_scan
;
35 module_param(i2c_scan
, int, 0444);
36 MODULE_PARM_DESC(i2c_scan
, "scan i2c bus at insmod time");
38 static unsigned int i2c_debug
;
39 module_param(i2c_debug
, int, 0644);
40 MODULE_PARM_DESC(i2c_debug
, "enable debug messages [i2c]");
42 #define dprintk1(lvl, fmt, args...) \
44 if (i2c_debug >= lvl) { \
45 printk(fmt, ##args); \
49 #define dprintk2(lvl, fmt, args...) \
51 if (i2c_debug >= lvl) { \
52 printk(KERN_DEBUG "%s at %s: " fmt, \
53 dev->name, __func__ , ##args); \
58 * cx231xx_i2c_send_bytes()
60 int cx231xx_i2c_send_bytes(struct i2c_adapter
*i2c_adap
,
61 const struct i2c_msg
*msg
)
63 struct cx231xx_i2c
*bus
= i2c_adap
->algo_data
;
64 struct cx231xx
*dev
= bus
->dev
;
65 struct cx231xx_i2c_xfer_data req_data
;
74 if ((bus
->nr
== 1) && (msg
->addr
== 0x61)
75 && (dev
->tuner_type
== TUNER_XC5000
)) {
79 if (size
== 2) { /* register write sub addr */
80 /* Just writing sub address will cause problem
81 * to XC5000. So ignore the request */
83 } else if (size
== 4) { /* register write with sub addr */
85 saddr
= msg
->buf
[0] << 8 | msg
->buf
[1];
86 else if (msg
->len
== 1)
90 case 0x0000: /* start tuner calibration mode */
92 /* FW Loading is done */
93 dev
->xc_fw_load_done
= 1;
95 case 0x000D: /* Set signal source */
96 case 0x0001: /* Set TV standard - Video */
97 case 0x0002: /* Set TV standard - Audio */
98 case 0x0003: /* Set RF Frequency */
102 if (dev
->xc_fw_load_done
)
109 "GPIO WRITE: addr 0x%x, len %d, saddr 0x%x\n",
110 msg
->addr
, msg
->len
, saddr
);
112 return dev
->cx231xx_gpio_i2c_write(dev
,
119 /* special case for Xc5000 tuner case */
122 /* adjust the length to correct length */
124 buf_ptr
= (u8
*) (msg
->buf
+ 1);
127 /* prepare xfer_data struct */
128 req_data
.dev_addr
= msg
->addr
;
129 req_data
.direction
= msg
->flags
;
130 req_data
.saddr_len
= saddr_len
;
131 req_data
.saddr_dat
= msg
->buf
[0];
132 req_data
.buf_size
= size
> 16 ? 16 : size
;
133 req_data
.p_buffer
= (u8
*) (buf_ptr
+ loop
* 16);
135 bus
->i2c_nostop
= (size
> 16) ? 1 : 0;
136 bus
->i2c_reserve
= (loop
== 0) ? 0 : 1;
138 /* usb send command */
139 status
= dev
->cx231xx_send_usb_command(bus
, &req_data
);
150 bus
->i2c_reserve
= 0;
152 } else { /* regular case */
154 /* prepare xfer_data struct */
155 req_data
.dev_addr
= msg
->addr
;
156 req_data
.direction
= msg
->flags
;
157 req_data
.saddr_len
= 0;
158 req_data
.saddr_dat
= 0;
159 req_data
.buf_size
= msg
->len
;
160 req_data
.p_buffer
= msg
->buf
;
162 /* usb send command */
163 status
= dev
->cx231xx_send_usb_command(bus
, &req_data
);
166 return status
< 0 ? status
: 0;
170 * cx231xx_i2c_recv_bytes()
171 * read a byte from the i2c device
173 static int cx231xx_i2c_recv_bytes(struct i2c_adapter
*i2c_adap
,
174 const struct i2c_msg
*msg
)
176 struct cx231xx_i2c
*bus
= i2c_adap
->algo_data
;
177 struct cx231xx
*dev
= bus
->dev
;
178 struct cx231xx_i2c_xfer_data req_data
;
183 if ((bus
->nr
== 1) && (msg
->addr
== 0x61)
184 && dev
->tuner_type
== TUNER_XC5000
) {
187 saddr
= msg
->buf
[0] << 8 | msg
->buf
[1];
188 else if (msg
->len
== 1)
191 if (dev
->xc_fw_load_done
) {
194 case 0x0009: /* BUSY check */
196 "GPIO R E A D: Special case BUSY check \n");
197 /*Try read BUSY register, just set it to zero*/
202 case 0x0004: /* read Lock status */
209 /* this is a special case to handle Xceive tuner
210 clock stretch issue with gpio based I2C */
213 "GPIO R E A D: addr 0x%x, len %d, saddr 0x%x\n",
215 msg
->buf
[0] << 8 | msg
->buf
[1]);
218 dev
->cx231xx_gpio_i2c_write(dev
, msg
->addr
,
222 dev
->cx231xx_gpio_i2c_read(dev
, msg
->addr
,
229 /* prepare xfer_data struct */
230 req_data
.dev_addr
= msg
->addr
;
231 req_data
.direction
= msg
->flags
;
232 req_data
.saddr_len
= msg
->len
;
233 req_data
.saddr_dat
= msg
->buf
[0] << 8 | msg
->buf
[1];
234 req_data
.buf_size
= msg
->len
;
235 req_data
.p_buffer
= msg
->buf
;
237 /* usb send command */
238 status
= dev
->cx231xx_send_usb_command(bus
, &req_data
);
242 /* prepare xfer_data struct */
243 req_data
.dev_addr
= msg
->addr
;
244 req_data
.direction
= msg
->flags
;
245 req_data
.saddr_len
= 0;
246 req_data
.saddr_dat
= 0;
247 req_data
.buf_size
= msg
->len
;
248 req_data
.p_buffer
= msg
->buf
;
250 /* usb send command */
251 status
= dev
->cx231xx_send_usb_command(bus
, &req_data
);
254 return status
< 0 ? status
: 0;
258 * cx231xx_i2c_recv_bytes_with_saddr()
259 * read a byte from the i2c device
261 static int cx231xx_i2c_recv_bytes_with_saddr(struct i2c_adapter
*i2c_adap
,
262 const struct i2c_msg
*msg1
,
263 const struct i2c_msg
*msg2
)
265 struct cx231xx_i2c
*bus
= i2c_adap
->algo_data
;
266 struct cx231xx
*dev
= bus
->dev
;
267 struct cx231xx_i2c_xfer_data req_data
;
273 saddr
= msg1
->buf
[0] << 8 | msg1
->buf
[1];
274 else if (msg1
->len
== 1)
275 saddr
= msg1
->buf
[0];
277 if ((bus
->nr
== 1) && (msg2
->addr
== 0x61)
278 && dev
->tuner_type
== TUNER_XC5000
) {
280 if ((msg2
->len
< 16)) {
283 "i2c_read: addr 0x%x, len %d, saddr 0x%x, len %d\n",
284 msg2
->addr
, msg2
->len
, saddr
, msg1
->len
);
287 case 0x0008: /* read FW load status */
290 case 0x0004: /* read Lock status */
297 dev
->cx231xx_gpio_i2c_write(dev
, msg1
->addr
,
301 dev
->cx231xx_gpio_i2c_read(dev
, msg2
->addr
,
309 /* prepare xfer_data struct */
310 req_data
.dev_addr
= msg2
->addr
;
311 req_data
.direction
= msg2
->flags
;
312 req_data
.saddr_len
= msg1
->len
;
313 req_data
.saddr_dat
= saddr
;
314 req_data
.buf_size
= msg2
->len
;
315 req_data
.p_buffer
= msg2
->buf
;
317 /* usb send command */
318 status
= dev
->cx231xx_send_usb_command(bus
, &req_data
);
320 return status
< 0 ? status
: 0;
324 * cx231xx_i2c_check_for_device()
325 * check if there is a i2c_device at the supplied address
327 static int cx231xx_i2c_check_for_device(struct i2c_adapter
*i2c_adap
,
328 const struct i2c_msg
*msg
)
330 struct cx231xx_i2c
*bus
= i2c_adap
->algo_data
;
331 struct cx231xx
*dev
= bus
->dev
;
332 struct cx231xx_i2c_xfer_data req_data
;
335 /* prepare xfer_data struct */
336 req_data
.dev_addr
= msg
->addr
;
337 req_data
.direction
= msg
->flags
;
338 req_data
.saddr_len
= 0;
339 req_data
.saddr_dat
= 0;
340 req_data
.buf_size
= 0;
341 req_data
.p_buffer
= NULL
;
343 /* usb send command */
344 status
= dev
->cx231xx_send_usb_command(bus
, &req_data
);
346 return status
< 0 ? status
: 0;
351 * the main i2c transfer function
353 static int cx231xx_i2c_xfer(struct i2c_adapter
*i2c_adap
,
354 struct i2c_msg msgs
[], int num
)
356 struct cx231xx_i2c
*bus
= i2c_adap
->algo_data
;
357 struct cx231xx
*dev
= bus
->dev
;
358 int addr
, rc
, i
, byte
;
362 mutex_lock(&dev
->i2c_lock
);
363 for (i
= 0; i
< num
; i
++) {
365 addr
= msgs
[i
].addr
>> 1;
367 dprintk2(2, "%s %s addr=%x len=%d:",
368 (msgs
[i
].flags
& I2C_M_RD
) ? "read" : "write",
369 i
== num
- 1 ? "stop" : "nonstop", addr
, msgs
[i
].len
);
371 /* no len: check only for device presence */
372 rc
= cx231xx_i2c_check_for_device(i2c_adap
, &msgs
[i
]);
374 dprintk2(2, " no device\n");
375 mutex_unlock(&dev
->i2c_lock
);
379 } else if (msgs
[i
].flags
& I2C_M_RD
) {
381 rc
= cx231xx_i2c_recv_bytes(i2c_adap
, &msgs
[i
]);
382 if (i2c_debug
>= 2) {
383 for (byte
= 0; byte
< msgs
[i
].len
; byte
++)
384 printk(" %02x", msgs
[i
].buf
[byte
]);
386 } else if (i
+ 1 < num
&& (msgs
[i
+ 1].flags
& I2C_M_RD
) &&
387 msgs
[i
].addr
== msgs
[i
+ 1].addr
388 && (msgs
[i
].len
<= 2) && (bus
->nr
< 3)) {
390 rc
= cx231xx_i2c_recv_bytes_with_saddr(i2c_adap
,
393 if (i2c_debug
>= 2) {
394 for (byte
= 0; byte
< msgs
[i
].len
; byte
++)
395 printk(" %02x", msgs
[i
].buf
[byte
]);
400 if (i2c_debug
>= 2) {
401 for (byte
= 0; byte
< msgs
[i
].len
; byte
++)
402 printk(" %02x", msgs
[i
].buf
[byte
]);
404 rc
= cx231xx_i2c_send_bytes(i2c_adap
, &msgs
[i
]);
411 mutex_unlock(&dev
->i2c_lock
);
414 dprintk2(2, " ERROR: %i\n", rc
);
415 mutex_unlock(&dev
->i2c_lock
);
419 /* ----------------------------------------------------------- */
424 static u32
functionality(struct i2c_adapter
*adap
)
426 return I2C_FUNC_SMBUS_EMUL
| I2C_FUNC_I2C
;
429 static struct i2c_algorithm cx231xx_algo
= {
430 .master_xfer
= cx231xx_i2c_xfer
,
431 .functionality
= functionality
,
434 static struct i2c_adapter cx231xx_adap_template
= {
435 .owner
= THIS_MODULE
,
437 .algo
= &cx231xx_algo
,
440 static struct i2c_client cx231xx_client_template
= {
441 .name
= "cx231xx internal",
444 /* ----------------------------------------------------------- */
448 * incomplete list of known devices
450 static char *i2c_devs
[128] = {
451 [0x60 >> 1] = "colibri",
452 [0x88 >> 1] = "hammerhead",
454 [0x32 >> 1] = "GeminiIII",
455 [0x02 >> 1] = "Aquarius",
456 [0xa0 >> 1] = "eeprom",
457 [0xc0 >> 1] = "tuner/XC3028",
458 [0xc2 >> 1] = "tuner/XC5000",
462 * cx231xx_do_i2c_scan()
463 * check i2c address range for devices
465 void cx231xx_do_i2c_scan(struct cx231xx
*dev
, struct i2c_client
*c
)
470 cx231xx_info(": Checking for I2C devices ..\n");
471 for (i
= 0; i
< 128; i
++) {
473 rc
= i2c_master_recv(c
, &buf
, 0);
476 cx231xx_info("%s: i2c scan: found device @ 0x%x [%s]\n",
478 i2c_devs
[i
] ? i2c_devs
[i
] : "???");
480 cx231xx_info(": Completed Checking for I2C devices.\n");
484 * cx231xx_i2c_register()
487 int cx231xx_i2c_register(struct cx231xx_i2c
*bus
)
489 struct cx231xx
*dev
= bus
->dev
;
491 BUG_ON(!dev
->cx231xx_send_usb_command
);
493 memcpy(&bus
->i2c_adap
, &cx231xx_adap_template
, sizeof(bus
->i2c_adap
));
494 memcpy(&bus
->i2c_algo
, &cx231xx_algo
, sizeof(bus
->i2c_algo
));
495 memcpy(&bus
->i2c_client
, &cx231xx_client_template
,
496 sizeof(bus
->i2c_client
));
498 bus
->i2c_adap
.dev
.parent
= &dev
->udev
->dev
;
500 strlcpy(bus
->i2c_adap
.name
, bus
->dev
->name
, sizeof(bus
->i2c_adap
.name
));
502 bus
->i2c_algo
.data
= bus
;
503 bus
->i2c_adap
.algo_data
= bus
;
504 i2c_set_adapdata(&bus
->i2c_adap
, &dev
->v4l2_dev
);
505 i2c_add_adapter(&bus
->i2c_adap
);
507 bus
->i2c_client
.adapter
= &bus
->i2c_adap
;
509 if (0 == bus
->i2c_rc
) {
511 cx231xx_do_i2c_scan(dev
, &bus
->i2c_client
);
513 cx231xx_warn("%s: i2c bus %d register FAILED\n",
520 * cx231xx_i2c_unregister()
523 int cx231xx_i2c_unregister(struct cx231xx_i2c
*bus
)
525 i2c_del_adapter(&bus
->i2c_adap
);