blob: 8551998dbaece786fcda37955abcb75d54c55816 [file] [log] [blame]
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001/*
2 em2820-i2c.c - driver for Empia EM2820/2840 USB video capture devices
3
4 Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
5 Ludovico Cavedon <cavedon@sssup.it>
6 Mauro Carvalho Chehab <mchehab@brturbo.com.br>
7
8 Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/usb.h>
28#include <linux/i2c.h>
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080029#include <media/tuner.h>
30#include <linux/video_decoder.h>
31
32/* To be moved to compat.h */
33#if !defined(I2C_HW_B_EM2820)
34#define I2C_HW_B_EM2820 I2C_HW_B_BT848
35#endif
36
37#include "em2820.h"
38
39/* ----------------------------------------------------------- */
40
41static unsigned int i2c_scan = 0;
42module_param(i2c_scan, int, 0444);
43MODULE_PARM_DESC(i2c_scan, "scan i2c bus at insmod time");
44
45static unsigned int i2c_debug = 0;
46module_param(i2c_debug, int, 0644);
47MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
48
49#define dprintk(fmt, args...) if (i2c_debug) do {\
50 printk(KERN_DEBUG "%s: %s: " fmt "\n",\
51 dev->name, __FUNCTION__ , ##args); } while (0)
52#define dprintk1(fmt, args...) if (i2c_debug) do{ \
53 printk(KERN_DEBUG "%s: %s: " fmt, \
54 dev->name, __FUNCTION__ , ##args); } while (0)
55#define dprintk2(fmt, args...) if (i2c_debug) do {\
56 printk(fmt , ##args); } while (0)
57
58/*
59 * i2c_send_bytes()
60 * untested for more than 4 bytes
61 */
62static int i2c_send_bytes(void *data, unsigned char addr, char *buf, short len,
63 int stop)
64{
65 int wrcount = 0;
66 struct em2820 *dev = (struct em2820 *)data;
67
68 wrcount = dev->em2820_write_regs_req(dev, stop ? 2 : 3, addr, buf, len);
69
70 return wrcount;
71}
72
73/*
74 * i2c_recv_byte()
75 * read a byte from the i2c device
76 */
77static int i2c_recv_bytes(struct em2820 *dev, unsigned char addr, char *buf,
78 int len)
79{
80 int ret;
81 ret = dev->em2820_read_reg_req_len(dev, 2, addr, buf, len);
82 if (ret < 0) {
83 em2820_warn("reading i2c device failed (error=%i)\n", ret);
84 return ret;
85 }
86 if (dev->em2820_read_reg(dev, 0x5) != 0)
87 return -ENODEV;
88 return ret;
89}
90
91/*
92 * i2c_check_for_device()
93 * check if there is a i2c_device at the supplied address
94 */
95static int i2c_check_for_device(struct em2820 *dev, unsigned char addr)
96{
97 char msg;
98 int ret;
99 msg = addr;
100
101 ret = dev->em2820_read_reg_req(dev, 2, addr);
102 if (ret < 0) {
103 em2820_warn("reading from i2c device failed (error=%i)\n", ret);
104 return ret;
105 }
106 if (dev->em2820_read_reg(dev, 0x5) != 0)
107 return -ENODEV;
108 return 0;
109}
110
111/*
112 * em2820_i2c_xfer()
113 * the main i2c transfer function
114 */
115static int em2820_i2c_xfer(struct i2c_adapter *i2c_adap,
116 struct i2c_msg msgs[], int num)
117{
118 struct em2820 *dev = i2c_adap->algo_data;
119 int addr, rc, i, byte;
120
121 if (num <= 0)
122 return 0;
123 for (i = 0; i < num; i++) {
124 addr = msgs[i].addr << 1;
125 dprintk1("%s %s addr=%x len=%d:",
126 (msgs[i].flags & I2C_M_RD) ? "read" : "write",
127 i == num - 1 ? "stop" : "nonstop", addr, msgs[i].len);
128 if (!msgs[i].len) { /* no len: check only for device presence */
129 rc = i2c_check_for_device(dev, addr);
130 if (rc < 0) {
131 dprintk2(" no device\n");
132 return rc;
133 }
134
135 }
136 if (msgs[i].flags & I2C_M_RD) {
137 /* read bytes */
138
139 rc = i2c_recv_bytes(dev, addr, msgs[i].buf,
140 msgs[i].len);
141 if (i2c_debug) {
142 for (byte = 0; byte < msgs[i].len; byte++) {
143 printk(" %02x", msgs[i].buf[byte]);
144 }
145 }
146 } else {
147 /* write bytes */
148 if (i2c_debug) {
149 for (byte = 0; byte < msgs[i].len; byte++)
150 printk(" %02x", msgs[i].buf[byte]);
151 }
152 rc = i2c_send_bytes(dev, addr, msgs[i].buf, msgs[i].len,
153 i == num - 1);
154 if (rc < 0)
155 goto err;
156 }
157 if (i2c_debug)
158 printk("\n");
159 }
160
161 return num;
162 err:
163 dprintk2(" ERROR: %i\n", rc);
164 return rc;
165}
166
167static int em2820_i2c_eeprom(struct em2820 *dev, unsigned char *eedata, int len)
168{
169 unsigned char buf, *p = eedata;
170 struct em2820_eeprom *em_eeprom = (void *)eedata;
171 int i, err, size = len, block;
172
173 dev->i2c_client.addr = 0xa0 >> 1;
174 buf = 0;
175 if (1 != (err = i2c_master_send(&dev->i2c_client, &buf, 1))) {
176 printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n",
177 dev->name, err);
178 return -1;
179 }
180 while (size > 0) {
181 if (size > 16)
182 block = 16;
183 else
184 block = size;
185
186 if (block !=
187 (err = i2c_master_recv(&dev->i2c_client, p, block))) {
188 printk(KERN_WARNING
189 "%s: i2c eeprom read error (err=%d)\n",
190 dev->name, err);
191 return -1;
192 }
193 size -= block;
194 p += block;
195 }
196 for (i = 0; i < len; i++) {
197 if (0 == (i % 16))
198 printk(KERN_INFO "%s: i2c eeprom %02x:", dev->name, i);
199 printk(" %02x", eedata[i]);
200 if (15 == (i % 16))
201 printk("\n");
202 }
203
204 printk(KERN_INFO "EEPROM ID= 0x%08x\n", em_eeprom->id);
205 printk(KERN_INFO "Vendor/Product ID= %04x:%04x\n", em_eeprom->vendor_ID,
206 em_eeprom->product_ID);
207
208 switch (em_eeprom->chip_conf >> 4 & 0x3) {
209 case 0:
210 printk(KERN_INFO "No audio on board.\n");
211 break;
212 case 1:
213 printk(KERN_INFO "AC97 audio (5 sample rates)\n");
214 break;
215 case 2:
216 printk(KERN_INFO "I2S audio, sample rate=32k\n");
217 break;
218 case 3:
219 printk(KERN_INFO "I2S audio, 3 sample rates\n");
220 break;
221 }
222
223 if (em_eeprom->chip_conf & 1 << 3)
224 printk(KERN_INFO "USB Remote wakeup capable\n");
225
226 if (em_eeprom->chip_conf & 1 << 2)
227 printk(KERN_INFO "USB Self power capable\n");
228
229 switch (em_eeprom->chip_conf & 0x3) {
230 case 0:
231 printk(KERN_INFO "500mA max power\n");
232 break;
233 case 1:
234 printk(KERN_INFO "400mA max power\n");
235 break;
236 case 2:
237 printk(KERN_INFO "300mA max power\n");
238 break;
239 case 3:
240 printk(KERN_INFO "200mA max power\n");
241 break;
242 }
243
244 return 0;
245}
246
247/* ----------------------------------------------------------- */
248
249/*
250 * algo_control()
251 */
252static int algo_control(struct i2c_adapter *adapter,
253 unsigned int cmd, unsigned long arg)
254{
255 return 0;
256}
257
258/*
259 * functionality()
260 */
261static u32 functionality(struct i2c_adapter *adap)
262{
263 return I2C_FUNC_SMBUS_EMUL;
264}
265
266#ifndef I2C_PEC
267static void inc_use(struct i2c_adapter *adap)
268{
269 MOD_INC_USE_COUNT;
270}
271
272static void dec_use(struct i2c_adapter *adap)
273{
274 MOD_DEC_USE_COUNT;
275}
276#endif
277
278static int em2820_set_tuner(int check_eeprom, struct i2c_client *client)
279{
280 struct em2820 *dev = client->adapter->algo_data;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800281 struct tuner_setup tun_setup;
282
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800283 if (dev->has_tuner) {
284 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
285 tun_setup.type = dev->tuner_type;
286 tun_setup.addr = dev->tuner_addr;
287
288 em2820_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
289 }
Nickolay V. Shmyrevfd35a6b2005-11-08 21:37:09 -0800290
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800291 return (0);
292}
293
294/*
295 * attach_inform()
296 * gets called when a device attaches to the i2c bus
297 * does some basic configuration
298 */
299static int attach_inform(struct i2c_client *client)
300{
301 struct em2820 *dev = client->adapter->algo_data;
302
303 dprintk("address %x", client->addr << 1);
304 switch (client->addr << 1) {
Markus Rechbergera9ae9fb2005-11-08 21:37:20 -0800305 case 0x86:
306 em2820_i2c_call_clients(dev, TDA9887_SET_CONFIG, &dev->tda9887_conf);
307 break;
308 case 0x4a:
309 dprintk1("attach_inform: saa7113 detected.\n");
310 break;
311 case 0xa0:
312 dprintk1("attach_inform: eeprom detected.\n");
313 break;
314 case 0x80:
315 case 0x88:
316 dprintk1("attach_inform: msp34xx detected.\n");
317 break;
318 case 0xb8:
319 case 0xba:
320 dprintk1("attach_inform: tvp5150 detected.\n");
321 break;
322 default:
323 dev->tuner_addr = client->addr;
324 em2820_set_tuner(-1, client);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800325 }
326
327 return 0;
328}
329
330static struct i2c_algorithm em2820_algo = {
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800331 .master_xfer = em2820_i2c_xfer,
332 .algo_control = algo_control,
333 .functionality = functionality,
334};
335
336static struct i2c_adapter em2820_adap_template = {
337#ifdef I2C_PEC
338 .owner = THIS_MODULE,
339#else
340 .inc_use = inc_use,
341 .dec_use = dec_use,
342#endif
343#ifdef I2C_CLASS_TV_ANALOG
344 .class = I2C_CLASS_TV_ANALOG,
345#endif
346 .name = "em2820",
347 .id = I2C_HW_B_EM2820,
348 .algo = &em2820_algo,
349 .client_register = attach_inform,
350};
351
352static struct i2c_client em2820_client_template = {
353 .name = "em2820 internal",
354 .flags = I2C_CLIENT_ALLOW_USE,
355};
356
357/* ----------------------------------------------------------- */
358
359/*
360 * i2c_devs
361 * incomplete list of known devices
362 */
363static char *i2c_devs[128] = {
364 [0x4a >> 1] = "saa7113h",
365 [0x60 >> 1] = "remote IR sensor",
366 [0x86 >> 1] = "tda9887",
367 [0x80 >> 1] = "msp34xx",
368 [0x88 >> 1] = "msp34xx",
369 [0xa0 >> 1] = "eeprom",
370 [0xb8 >> 1] = "tvp5150a",
371 [0xba >> 1] = "tvp5150a",
372 [0xc0 >> 1] = "tuner (analog)",
373 [0xc2 >> 1] = "tuner (analog)",
374 [0xc4 >> 1] = "tuner (analog)",
375 [0xc6 >> 1] = "tuner (analog)",
376};
377
378/*
379 * do_i2c_scan()
380 * check i2c address range for devices
381 */
382static void do_i2c_scan(char *name, struct i2c_client *c)
383{
384 unsigned char buf;
385 int i, rc;
386
387 for (i = 0; i < 128; i++) {
388 c->addr = i;
389 rc = i2c_master_recv(c, &buf, 0);
390 if (rc < 0)
391 continue;
392 printk(KERN_INFO "%s: found device @ 0x%x [%s]", name,
393 i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
394 }
395}
396
397/*
398 * em2820_i2c_call_clients()
399 * send commands to all attached i2c devices
400 */
401void em2820_i2c_call_clients(struct em2820 *dev, unsigned int cmd, void *arg)
402{
403 BUG_ON(NULL == dev->i2c_adap.algo_data);
404 i2c_clients_command(&dev->i2c_adap, cmd, arg);
405}
406
407/*
408 * em2820_i2c_register()
409 * register i2c bus
410 */
411int em2820_i2c_register(struct em2820 *dev)
412{
413 BUG_ON(!dev->em2820_write_regs || !dev->em2820_read_reg);
414 BUG_ON(!dev->em2820_write_regs_req || !dev->em2820_read_reg_req);
415 dev->i2c_adap = em2820_adap_template;
416 dev->i2c_adap.dev.parent = &dev->udev->dev;
417 strcpy(dev->i2c_adap.name, dev->name);
418 dev->i2c_adap.algo_data = dev;
419 i2c_add_adapter(&dev->i2c_adap);
420
421 dev->i2c_client = em2820_client_template;
422 dev->i2c_client.adapter = &dev->i2c_adap;
423
424 em2820_i2c_eeprom(dev, dev->eedata, sizeof(dev->eedata));
425
426 if (i2c_scan)
427 do_i2c_scan(dev->name, &dev->i2c_client);
428 return 0;
429}
430
431/*
432 * em2820_i2c_unregister()
433 * unregister i2c_bus
434 */
435int em2820_i2c_unregister(struct em2820 *dev)
436{
437 i2c_del_adapter(&dev->i2c_adap);
438 return 0;
439}