diff options
author | Gerd Knorr <devnull@localhost> | 2004-02-22 01:59:34 +0000 |
---|---|---|
committer | Gerd Knorr <devnull@localhost> | 2004-02-22 01:59:34 +0000 |
commit | 229b130306c830b9f1c410ccd6060b65aa68dcec (patch) | |
tree | 0ad687a6c45ad1481a208419b017f2c7cf6c520c /linux/drivers/media/video/cx88/cx88-i2c.c | |
parent | 0f99a89ea0a04d80bd283fdfd2c8141a763e2de3 (diff) | |
download | mediapointer-dvb-s2-229b130306c830b9f1c410ccd6060b65aa68dcec.tar.gz mediapointer-dvb-s2-229b130306c830b9f1c410ccd6060b65aa68dcec.tar.bz2 |
Initial revision
Diffstat (limited to 'linux/drivers/media/video/cx88/cx88-i2c.c')
-rw-r--r-- | linux/drivers/media/video/cx88/cx88-i2c.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/linux/drivers/media/video/cx88/cx88-i2c.c b/linux/drivers/media/video/cx88/cx88-i2c.c new file mode 100644 index 000000000..2de607e1f --- /dev/null +++ b/linux/drivers/media/video/cx88/cx88-i2c.c @@ -0,0 +1,174 @@ +/* + cx88-i2c.c -- all the i2c code is here + + Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) + & Marcus Metzler (mocm@thp.uni-koeln.de) + (c) 2002 Yurij Sysoev <yurij@naturesoft.net> + (c) 1999-2003 Gerd Knorr <kraxel@bytesex.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#define __NO_VERSION__ 1 + +#include <linux/module.h> +#include <linux/init.h> + +#include <asm/io.h> + +#include "cx88.h" + +/* ----------------------------------------------------------------------- */ + +void cx8800_bit_setscl(void *data, int state) +{ + struct cx8800_dev *dev = data; + + if (state) + dev->i2c_state |= 0x02; + else + dev->i2c_state &= ~0x02; + cx_write(MO_I2C, dev->i2c_state); + cx_read(MO_I2C); +} + +void cx8800_bit_setsda(void *data, int state) +{ + struct cx8800_dev *dev = data; + + if (state) + dev->i2c_state |= 0x01; + else + dev->i2c_state &= ~0x01; + cx_write(MO_I2C, dev->i2c_state); + cx_read(MO_I2C); +} + +static int cx8800_bit_getscl(void *data) +{ + struct cx8800_dev *dev = data; + u32 state; + + state = cx_read(MO_I2C); + return state & 0x02 ? 1 : 0; +} + +static int cx8800_bit_getsda(void *data) +{ + struct cx8800_dev *dev = data; + u32 state; + + state = cx_read(MO_I2C); + return state & 0x01; +} + +/* ----------------------------------------------------------------------- */ + +#ifndef I2C_PEC +static void cx8800_inc_use(struct i2c_adapter *adap) +{ + MOD_INC_USE_COUNT; +} + +static void cx8800_dec_use(struct i2c_adapter *adap) +{ + MOD_DEC_USE_COUNT; +} +#endif + +static int attach_inform(struct i2c_client *client) +{ + struct cx8800_dev *dev = i2c_get_adapdata(client->adapter); + + if (dev->tuner_type != UNSET) + cx8800_call_i2c_clients(dev,TUNER_SET_TYPE,&dev->tuner_type); + + if (1 /* fixme: debug */) + printk("%s: i2c attach [client=%s]\n", + dev->name, i2c_clientname(client)); + return 0; +} + +void cx8800_call_i2c_clients(struct cx8800_dev *dev, unsigned int cmd, void *arg) +{ + if (0 != dev->i2c_rc) + return; + i2c_clients_command(&dev->i2c_adap, cmd, arg); +} + +static struct i2c_algo_bit_data cx8800_i2c_algo_template = { + .setsda = cx8800_bit_setsda, + .setscl = cx8800_bit_setscl, + .getsda = cx8800_bit_getsda, + .getscl = cx8800_bit_getscl, + .udelay = 16, + .mdelay = 10, + .timeout = 200, +}; + +/* ----------------------------------------------------------------------- */ + +static struct i2c_adapter cx8800_i2c_adap_template = { +#ifdef I2C_PEC + .owner = THIS_MODULE, +#else + .inc_use = cx8800_inc_use, + .dec_use = cx8800_dec_use, +#endif +#ifdef I2C_ADAP_CLASS_TV_ANALOG + .class = I2C_ADAP_CLASS_TV_ANALOG, +#endif + I2C_DEVNAME("cx2388x"), + .id = I2C_HW_B_BT848, + .client_register = attach_inform, +}; + +static struct i2c_client cx8800_i2c_client_template = { + I2C_DEVNAME("cx88xx internal"), + .id = -1, +}; + +/* init + register i2c algo-bit adapter */ +int __devinit cx8800_i2c_init(struct cx8800_dev *dev) +{ + memcpy(&dev->i2c_adap, &cx8800_i2c_adap_template, + sizeof(dev->i2c_adap)); + memcpy(&dev->i2c_algo, &cx8800_i2c_algo_template, + sizeof(dev->i2c_algo)); + memcpy(&dev->i2c_client, &cx8800_i2c_client_template, + sizeof(dev->i2c_client)); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,54) + dev->i2c_adap.dev.parent = &dev->pci->dev; +#endif + strcpy(dev->i2c_adap.name,dev->name); + dev->i2c_algo.data = dev; + i2c_set_adapdata(&dev->i2c_adap,dev); + dev->i2c_adap.algo_data = &dev->i2c_algo; + dev->i2c_client.adapter = &dev->i2c_adap; + + cx8800_bit_setscl(dev,1); + cx8800_bit_setsda(dev,1); + + dev->i2c_rc = i2c_bit_add_bus(&dev->i2c_adap); + return dev->i2c_rc; +} + +/* + * Local variables: + * c-basic-offset: 8 + * End: + */ |