ngene: split out i2c code into a separate file
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Sat Mar 13 15:10:24 2010 -0500 (2 years ago)
changeset 14438fa2835f9340c
parent 144372bde778fd681
child 1443930fa7a54edb3
ngene: split out i2c code into a separate file

From: Devin Heitmueller <dheitmueller@kernellabs.com>

Split out the i2c related code from the ngene-core.c into a new file called
ngene-i2c.c. This is part of a larger refactoring of the driver in preparation
for adding analog support.

Note that this patch makes *no* functional change - all I did was cut/paste the
code and add the function prototypes to ngene.h as needed.

Priority: normal

Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
linux/drivers/media/dvb/ngene/Makefile
linux/drivers/media/dvb/ngene/ngene-core.c
linux/drivers/media/dvb/ngene/ngene-i2c.c
linux/drivers/media/dvb/ngene/ngene.h
       1 --- a/linux/drivers/media/dvb/ngene/Makefile	Sat Mar 13 14:43:18 2010 -0500
       2 +++ b/linux/drivers/media/dvb/ngene/Makefile	Sat Mar 13 15:10:24 2010 -0500
       3 @@ -2,7 +2,7 @@
       4  # Makefile for the nGene device driver
       5  #
       6  
       7 -ngene-objs := ngene-core.o
       8 +ngene-objs := ngene-core.o ngene-i2c.o
       9  
      10  obj-$(CONFIG_DVB_NGENE) += ngene.o
      11  
     1.1 --- a/linux/drivers/media/dvb/ngene/ngene-core.c	Sat Mar 13 14:43:18 2010 -0500
     1.2 +++ b/linux/drivers/media/dvb/ngene/ngene-core.c	Sat Mar 13 15:10:24 2010 -0500
     1.3 @@ -392,7 +392,7 @@
     1.4  	return 0;
     1.5  }
     1.6  
     1.7 -static int ngene_command(struct ngene *dev, struct ngene_command *com)
     1.8 +int ngene_command(struct ngene *dev, struct ngene_command *com)
     1.9  {
    1.10  	int result;
    1.11  
    1.12 @@ -415,60 +415,6 @@
    1.13  	return ngene_command(dev, &com);
    1.14  }
    1.15  #endif
    1.16 -
    1.17 -static int ngene_command_i2c_read(struct ngene *dev, u8 adr,
    1.18 -			   u8 *out, u8 outlen, u8 *in, u8 inlen, int flag)
    1.19 -{
    1.20 -	struct ngene_command com;
    1.21 -
    1.22 -	com.cmd.hdr.Opcode = CMD_I2C_READ;
    1.23 -	com.cmd.hdr.Length = outlen + 3;
    1.24 -	com.cmd.I2CRead.Device = adr << 1;
    1.25 -	memcpy(com.cmd.I2CRead.Data, out, outlen);
    1.26 -	com.cmd.I2CRead.Data[outlen] = inlen;
    1.27 -	com.cmd.I2CRead.Data[outlen + 1] = 0;
    1.28 -	com.in_len = outlen + 3;
    1.29 -	com.out_len = inlen + 1;
    1.30 -
    1.31 -	if (ngene_command(dev, &com) < 0)
    1.32 -		return -EIO;
    1.33 -
    1.34 -	if ((com.cmd.raw8[0] >> 1) != adr)
    1.35 -		return -EIO;
    1.36 -
    1.37 -	if (flag)
    1.38 -		memcpy(in, com.cmd.raw8, inlen + 1);
    1.39 -	else
    1.40 -		memcpy(in, com.cmd.raw8 + 1, inlen);
    1.41 -	return 0;
    1.42 -}
    1.43 -
    1.44 -static int ngene_command_i2c_write(struct ngene *dev, u8 adr,
    1.45 -				   u8 *out, u8 outlen)
    1.46 -{
    1.47 -	struct ngene_command com;
    1.48 -
    1.49 -#if 0
    1.50 -	/* Probing by writing 0 bytes does not work */
    1.51 -	if (!outlen)
    1.52 -		outlen++;
    1.53 -#endif
    1.54 -
    1.55 -	com.cmd.hdr.Opcode = CMD_I2C_WRITE;
    1.56 -	com.cmd.hdr.Length = outlen + 1;
    1.57 -	com.cmd.I2CRead.Device = adr << 1;
    1.58 -	memcpy(com.cmd.I2CRead.Data, out, outlen);
    1.59 -	com.in_len = outlen + 1;
    1.60 -	com.out_len = 1;
    1.61 -
    1.62 -	if (ngene_command(dev, &com) < 0)
    1.63 -		return -EIO;
    1.64 -
    1.65 -	if (com.cmd.raw8[0] == 1)
    1.66 -		return -EIO;
    1.67 -
    1.68 -	return 0;
    1.69 -}
    1.70  
    1.71  static int ngene_command_load_firmware(struct ngene *dev,
    1.72  				       u8 *ngene_fw, u32 size)
    1.73 @@ -612,7 +558,7 @@
    1.74  	return 0;
    1.75  }
    1.76  
    1.77 -static int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level)
    1.78 +int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level)
    1.79  {
    1.80  	struct ngene_command com;
    1.81  
    1.82 @@ -952,212 +898,9 @@
    1.83  #endif
    1.84  
    1.85  /****************************************************************************/
    1.86 -/* I2C **********************************************************************/
    1.87 -/****************************************************************************/
    1.88 -
    1.89 -static void ngene_i2c_set_bus(struct ngene *dev, int bus)
    1.90 -{
    1.91 -	if (!(dev->card_info->i2c_access & 2))
    1.92 -		return;
    1.93 -	if (dev->i2c_current_bus == bus)
    1.94 -		return;
    1.95 -
    1.96 -	switch (bus) {
    1.97 -	case 0:
    1.98 -		ngene_command_gpio_set(dev, 3, 0);
    1.99 -		ngene_command_gpio_set(dev, 2, 1);
   1.100 -		break;
   1.101 -
   1.102 -	case 1:
   1.103 -		ngene_command_gpio_set(dev, 2, 0);
   1.104 -		ngene_command_gpio_set(dev, 3, 1);
   1.105 -		break;
   1.106 -	}
   1.107 -	dev->i2c_current_bus = bus;
   1.108 -}
   1.109 -
   1.110 -static int ngene_i2c_master_xfer(struct i2c_adapter *adapter,
   1.111 -				 struct i2c_msg msg[], int num)
   1.112 -{
   1.113 -	struct ngene_channel *chan =
   1.114 -		(struct ngene_channel *)i2c_get_adapdata(adapter);
   1.115 -	struct ngene *dev = chan->dev;
   1.116 -
   1.117 -	down(&dev->i2c_switch_mutex);
   1.118 -	ngene_i2c_set_bus(dev, chan->number);
   1.119 -
   1.120 -	if (num == 2 && msg[1].flags & I2C_M_RD && !(msg[0].flags & I2C_M_RD))
   1.121 -		if (!ngene_command_i2c_read(dev, msg[0].addr,
   1.122 -					    msg[0].buf, msg[0].len,
   1.123 -					    msg[1].buf, msg[1].len, 0))
   1.124 -			goto done;
   1.125 -
   1.126 -	if (num == 1 && !(msg[0].flags & I2C_M_RD))
   1.127 -		if (!ngene_command_i2c_write(dev, msg[0].addr,
   1.128 -					     msg[0].buf, msg[0].len))
   1.129 -			goto done;
   1.130 -	if (num == 1 && (msg[0].flags & I2C_M_RD))
   1.131 -		if (!ngene_command_i2c_read(dev, msg[0].addr, NULL, 0,
   1.132 -					    msg[0].buf, msg[0].len, 0))
   1.133 -			goto done;
   1.134 -
   1.135 -	up(&dev->i2c_switch_mutex);
   1.136 -	return -EIO;
   1.137 -
   1.138 -done:
   1.139 -	up(&dev->i2c_switch_mutex);
   1.140 -	return num;
   1.141 -}
   1.142 -
   1.143 -#if 0
   1.144 -static int ngene_i2c_algo_control(struct i2c_adapter *adap,
   1.145 -				  unsigned int cmd, unsigned long arg)
   1.146 -{
   1.147 -	struct ngene_channel *chan =
   1.148 -		(struct ngene_channel *)i2c_get_adapdata(adap);
   1.149 -
   1.150 -	switch (cmd) {
   1.151 -	case IOCTL_MIC_TUN_RDY:
   1.152 -		chan->tun_rdy = 1;
   1.153 -		if (chan->dec_rdy == 1)
   1.154 -			chan->tun_dec_rdy = 1;
   1.155 -		break;
   1.156 -
   1.157 -	case IOCTL_MIC_DEC_RDY:
   1.158 -		chan->dec_rdy = 1;
   1.159 -		if (chan->tun_rdy == 1)
   1.160 -			chan->tun_dec_rdy = 1;
   1.161 -		break;
   1.162 -
   1.163 -	case IOCTL_MIC_TUN_DETECT:
   1.164 -		{
   1.165 -			int *palorbtsc = (int *)arg;
   1.166 -			*palorbtsc = chan->dev->card_info->ntsc;
   1.167 -			break;
   1.168 -		}
   1.169 -
   1.170 -	default:
   1.171 -		break;
   1.172 -	}
   1.173 -	return 0;
   1.174 -}
   1.175 -#endif
   1.176 -
   1.177 -static u32 ngene_i2c_functionality(struct i2c_adapter *adap)
   1.178 -{
   1.179 -	return I2C_FUNC_SMBUS_EMUL;
   1.180 -}
   1.181 -
   1.182 -static struct i2c_algorithm ngene_i2c_algo = {
   1.183 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
   1.184 -	.name = "nGene",
   1.185 -#endif
   1.186 -	.master_xfer = ngene_i2c_master_xfer,
   1.187 -#if 0
   1.188 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
   1.189 -	.algo_control = ngene_i2c_algo_control,
   1.190 -#endif
   1.191 -#endif
   1.192 -	.functionality = ngene_i2c_functionality,
   1.193 -};
   1.194 -
   1.195 -static int ngene_i2c_init(struct ngene *dev, int dev_nr)
   1.196 -{
   1.197 -	struct i2c_adapter *adap = &(dev->channel[dev_nr].i2c_adapter);
   1.198 -
   1.199 -	i2c_set_adapdata(adap, &(dev->channel[dev_nr]));
   1.200 -#ifdef I2C_CLASS_TV_DIGITAL
   1.201 -	adap->class = I2C_CLASS_TV_DIGITAL | I2C_CLASS_TV_ANALOG;
   1.202 -#else
   1.203 -	adap->class = I2C_CLASS_TV_ANALOG;
   1.204 -#endif
   1.205 -
   1.206 -	strcpy(adap->name, "nGene");
   1.207 -
   1.208 -	adap->algo = &ngene_i2c_algo;
   1.209 -	adap->algo_data = (void *)&(dev->channel[dev_nr]);
   1.210 -	adap->dev.parent = &dev->pci_dev->dev;
   1.211 -
   1.212 -	return i2c_add_adapter(adap);
   1.213 -}
   1.214 -
   1.215 -#if 0
   1.216 -int i2c_write(struct i2c_adapter *adapter, u8 adr, u8 data)
   1.217 -{
   1.218 -	u8 m[1] = {data};
   1.219 -	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 1};
   1.220 -
   1.221 -	if (i2c_transfer(adapter, &msg, 1) != 1) {
   1.222 -		printk(KERN_ERR DEVICE_NAME
   1.223 -		       ": Failed to write to I2C adr %02x!\n", adr);
   1.224 -		return -1;
   1.225 -	}
   1.226 -	return 0;
   1.227 -}
   1.228 -
   1.229 -static int i2c_write_register(struct i2c_adapter *adapter,
   1.230 -			      u8 adr, u8 reg, u8 data)
   1.231 -{
   1.232 -	u8 m[2] = {reg, data};
   1.233 -	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 2};
   1.234 -
   1.235 -	if (i2c_transfer(adapter, &msg, 1) != 1) {
   1.236 -		printk(KERN_ERR DEVICE_NAME
   1.237 -		       ": Failed to write to I2C register %02x@%02x!\n",
   1.238 -		       reg, adr);
   1.239 -		return -1;
   1.240 -	}
   1.241 -	return 0;
   1.242 -}
   1.243 -
   1.244 -static int i2c_write_read(struct i2c_adapter *adapter,
   1.245 -			  u8 adr, u8 *w, u8 wlen, u8 *r, u8 rlen)
   1.246 -{
   1.247 -	struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0,
   1.248 -				   .buf = w, .len = wlen},
   1.249 -				  {.addr = adr, .flags = I2C_M_RD,
   1.250 -				   .buf = r, .len = rlen} };
   1.251 -
   1.252 -	if (i2c_transfer(adapter, msgs, 2) != 2) {
   1.253 -		printk(KERN_ERR DEVICE_NAME ": error in i2c_write_read\n");
   1.254 -		return -1;
   1.255 -	}
   1.256 -	return 0;
   1.257 -}
   1.258 -
   1.259 -static int test_dec_i2c(struct i2c_adapter *adapter, int reg)
   1.260 -{
   1.261 -	u8 data[256] = { reg, 0x00, 0x93, 0x78, 0x43, 0x45 };
   1.262 -	u8 data2[256];
   1.263 -	int i;
   1.264 -
   1.265 -	memset(data2, 0, 256);
   1.266 -	i2c_write_read(adapter, 0x66, data, 2, data2, 4);
   1.267 -	for (i = 0; i < 4; i++)
   1.268 -		printk("%02x ", data2[i]);
   1.269 -	printk("\n");
   1.270 -
   1.271 -	return 0;
   1.272 -}
   1.273 -
   1.274 -static int i2c_write_msp_register(struct i2c_adapter *adapter,
   1.275 -				  u8 adr, u8 reg, u16 data)
   1.276 -{
   1.277 -	u8 m[3] = {reg, (data >> 8) & 0xff, data & 0xff};
   1.278 -	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 3 };
   1.279 -
   1.280 -	if (i2c_transfer(adapter, &msg, 1) != 1) {
   1.281 -		printk(KERN_ERR DEVICE_NAME
   1.282 -		       ": Failed to write to I2C register %02x@%02x!\n",
   1.283 -		       reg, adr);
   1.284 -		return -1;
   1.285 -	}
   1.286 -	return 0;
   1.287 -}
   1.288 -
   1.289 -/****************************************************************************/
   1.290  /* EEPROM TAGS **************************************************************/
   1.291  /****************************************************************************/
   1.292 +#if 0
   1.293  
   1.294  #define MICNG_EE_START      0x0100
   1.295  #define MICNG_EE_END        0x0FF0
     2.1 --- a/linux/drivers/media/dvb/ngene/ngene.h	Sat Mar 13 14:43:18 2010 -0500
     2.2 +++ b/linux/drivers/media/dvb/ngene/ngene.h	Sat Mar 13 15:10:24 2010 -0500
     2.3 @@ -889,6 +889,13 @@
     2.4  struct i2c_client *avf4910a_attach(struct i2c_adapter *adap, int addr);
     2.5  #endif
     2.6  
     2.7 +/* Provided by ngene-core.c */
     2.8 +int ngene_command(struct ngene *dev, struct ngene_command *com);
     2.9 +int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
    2.10 +
    2.11 +/* Provided by ngene-i2c.c */
    2.12 +int ngene_i2c_init(struct ngene *dev, int dev_nr);
    2.13 +
    2.14  #endif
    2.15  
    2.16  /*  LocalWords:  Endif
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/linux/drivers/media/dvb/ngene/ngene-i2c.c	Sat Mar 13 15:10:24 2010 -0500
     3.3 @@ -0,0 +1,305 @@
     3.4 +/*
     3.5 + * ngene-i2c.c: nGene PCIe bridge driver i2c functions
     3.6 + *
     3.7 + * Copyright (C) 2005-2007 Micronas
     3.8 + *
     3.9 + * Copyright (C) 2008-2009 Ralph Metzler <rjkm@metzlerbros.de>
    3.10 + *                         Modifications for new nGene firmware,
    3.11 + *                         support for EEPROM-copying,
    3.12 + *                         support for new dual DVB-S2 card prototype
    3.13 + *
    3.14 + *
    3.15 + * This program is free software; you can redistribute it and/or
    3.16 + * modify it under the terms of the GNU General Public License
    3.17 + * version 2 only, as published by the Free Software Foundation.
    3.18 + *
    3.19 + *
    3.20 + * This program is distributed in the hope that it will be useful,
    3.21 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    3.22 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    3.23 + * GNU General Public License for more details.
    3.24 + *
    3.25 + *
    3.26 + * You should have received a copy of the GNU General Public License
    3.27 + * along with this program; if not, write to the Free Software
    3.28 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    3.29 + * 02110-1301, USA
    3.30 + * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
    3.31 + */
    3.32 +
    3.33 +/* FIXME - some of these can probably be removed */
    3.34 +#include <linux/module.h>
    3.35 +#include <linux/init.h>
    3.36 +#include <linux/delay.h>
    3.37 +#include <linux/slab.h>
    3.38 +#include <linux/poll.h>
    3.39 +#include <linux/io.h>
    3.40 +#include <asm/div64.h>
    3.41 +#include <linux/pci.h>
    3.42 +#include <linux/pci_ids.h>
    3.43 +#include <linux/smp_lock.h>
    3.44 +#include <linux/timer.h>
    3.45 +#include <linux/version.h>
    3.46 +#include <linux/byteorder/generic.h>
    3.47 +#include <linux/firmware.h>
    3.48 +#include <linux/vmalloc.h>
    3.49 +#include "compat.h"
    3.50 +
    3.51 +#include "ngene.h"
    3.52 +
    3.53 +/* Firmware command for i2c operations */
    3.54 +static int ngene_command_i2c_read(struct ngene *dev, u8 adr,
    3.55 +			   u8 *out, u8 outlen, u8 *in, u8 inlen, int flag)
    3.56 +{
    3.57 +	struct ngene_command com;
    3.58 +
    3.59 +	com.cmd.hdr.Opcode = CMD_I2C_READ;
    3.60 +	com.cmd.hdr.Length = outlen + 3;
    3.61 +	com.cmd.I2CRead.Device = adr << 1;
    3.62 +	memcpy(com.cmd.I2CRead.Data, out, outlen);
    3.63 +	com.cmd.I2CRead.Data[outlen] = inlen;
    3.64 +	com.cmd.I2CRead.Data[outlen + 1] = 0;
    3.65 +	com.in_len = outlen + 3;
    3.66 +	com.out_len = inlen + 1;
    3.67 +
    3.68 +	if (ngene_command(dev, &com) < 0)
    3.69 +		return -EIO;
    3.70 +
    3.71 +	if ((com.cmd.raw8[0] >> 1) != adr)
    3.72 +		return -EIO;
    3.73 +
    3.74 +	if (flag)
    3.75 +		memcpy(in, com.cmd.raw8, inlen + 1);
    3.76 +	else
    3.77 +		memcpy(in, com.cmd.raw8 + 1, inlen);
    3.78 +	return 0;
    3.79 +}
    3.80 +
    3.81 +static int ngene_command_i2c_write(struct ngene *dev, u8 adr,
    3.82 +				   u8 *out, u8 outlen)
    3.83 +{
    3.84 +	struct ngene_command com;
    3.85 +
    3.86 +#if 0
    3.87 +	/* Probing by writing 0 bytes does not work */
    3.88 +	if (!outlen)
    3.89 +		outlen++;
    3.90 +#endif
    3.91 +
    3.92 +	com.cmd.hdr.Opcode = CMD_I2C_WRITE;
    3.93 +	com.cmd.hdr.Length = outlen + 1;
    3.94 +	com.cmd.I2CRead.Device = adr << 1;
    3.95 +	memcpy(com.cmd.I2CRead.Data, out, outlen);
    3.96 +	com.in_len = outlen + 1;
    3.97 +	com.out_len = 1;
    3.98 +
    3.99 +	if (ngene_command(dev, &com) < 0)
   3.100 +		return -EIO;
   3.101 +
   3.102 +	if (com.cmd.raw8[0] == 1)
   3.103 +		return -EIO;
   3.104 +
   3.105 +	return 0;
   3.106 +}
   3.107 +
   3.108 +static void ngene_i2c_set_bus(struct ngene *dev, int bus)
   3.109 +{
   3.110 +	if (!(dev->card_info->i2c_access & 2))
   3.111 +		return;
   3.112 +	if (dev->i2c_current_bus == bus)
   3.113 +		return;
   3.114 +
   3.115 +	switch (bus) {
   3.116 +	case 0:
   3.117 +		ngene_command_gpio_set(dev, 3, 0);
   3.118 +		ngene_command_gpio_set(dev, 2, 1);
   3.119 +		break;
   3.120 +
   3.121 +	case 1:
   3.122 +		ngene_command_gpio_set(dev, 2, 0);
   3.123 +		ngene_command_gpio_set(dev, 3, 1);
   3.124 +		break;
   3.125 +	}
   3.126 +	dev->i2c_current_bus = bus;
   3.127 +}
   3.128 +
   3.129 +static int ngene_i2c_master_xfer(struct i2c_adapter *adapter,
   3.130 +				 struct i2c_msg msg[], int num)
   3.131 +{
   3.132 +	struct ngene_channel *chan =
   3.133 +		(struct ngene_channel *)i2c_get_adapdata(adapter);
   3.134 +	struct ngene *dev = chan->dev;
   3.135 +
   3.136 +	down(&dev->i2c_switch_mutex);
   3.137 +	ngene_i2c_set_bus(dev, chan->number);
   3.138 +
   3.139 +	if (num == 2 && msg[1].flags & I2C_M_RD && !(msg[0].flags & I2C_M_RD))
   3.140 +		if (!ngene_command_i2c_read(dev, msg[0].addr,
   3.141 +					    msg[0].buf, msg[0].len,
   3.142 +					    msg[1].buf, msg[1].len, 0))
   3.143 +			goto done;
   3.144 +
   3.145 +	if (num == 1 && !(msg[0].flags & I2C_M_RD))
   3.146 +		if (!ngene_command_i2c_write(dev, msg[0].addr,
   3.147 +					     msg[0].buf, msg[0].len))
   3.148 +			goto done;
   3.149 +	if (num == 1 && (msg[0].flags & I2C_M_RD))
   3.150 +		if (!ngene_command_i2c_read(dev, msg[0].addr, NULL, 0,
   3.151 +					    msg[0].buf, msg[0].len, 0))
   3.152 +			goto done;
   3.153 +
   3.154 +	up(&dev->i2c_switch_mutex);
   3.155 +	return -EIO;
   3.156 +
   3.157 +done:
   3.158 +	up(&dev->i2c_switch_mutex);
   3.159 +	return num;
   3.160 +}
   3.161 +
   3.162 +#if 0
   3.163 +static int ngene_i2c_algo_control(struct i2c_adapter *adap,
   3.164 +				  unsigned int cmd, unsigned long arg)
   3.165 +{
   3.166 +	struct ngene_channel *chan =
   3.167 +		(struct ngene_channel *)i2c_get_adapdata(adap);
   3.168 +
   3.169 +	switch (cmd) {
   3.170 +	case IOCTL_MIC_TUN_RDY:
   3.171 +		chan->tun_rdy = 1;
   3.172 +		if (chan->dec_rdy == 1)
   3.173 +			chan->tun_dec_rdy = 1;
   3.174 +		break;
   3.175 +
   3.176 +	case IOCTL_MIC_DEC_RDY:
   3.177 +		chan->dec_rdy = 1;
   3.178 +		if (chan->tun_rdy == 1)
   3.179 +			chan->tun_dec_rdy = 1;
   3.180 +		break;
   3.181 +
   3.182 +	case IOCTL_MIC_TUN_DETECT:
   3.183 +		{
   3.184 +			int *palorbtsc = (int *)arg;
   3.185 +			*palorbtsc = chan->dev->card_info->ntsc;
   3.186 +			break;
   3.187 +		}
   3.188 +
   3.189 +	default:
   3.190 +		break;
   3.191 +	}
   3.192 +	return 0;
   3.193 +}
   3.194 +#endif
   3.195 +
   3.196 +static u32 ngene_i2c_functionality(struct i2c_adapter *adap)
   3.197 +{
   3.198 +	return I2C_FUNC_SMBUS_EMUL;
   3.199 +}
   3.200 +
   3.201 +static struct i2c_algorithm ngene_i2c_algo = {
   3.202 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14)
   3.203 +	.name = "nGene",
   3.204 +#endif
   3.205 +	.master_xfer = ngene_i2c_master_xfer,
   3.206 +#if 0
   3.207 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
   3.208 +	.algo_control = ngene_i2c_algo_control,
   3.209 +#endif
   3.210 +#endif
   3.211 +	.functionality = ngene_i2c_functionality,
   3.212 +};
   3.213 +
   3.214 +int ngene_i2c_init(struct ngene *dev, int dev_nr)
   3.215 +{
   3.216 +	struct i2c_adapter *adap = &(dev->channel[dev_nr].i2c_adapter);
   3.217 +
   3.218 +	i2c_set_adapdata(adap, &(dev->channel[dev_nr]));
   3.219 +#ifdef I2C_CLASS_TV_DIGITAL
   3.220 +	adap->class = I2C_CLASS_TV_DIGITAL | I2C_CLASS_TV_ANALOG;
   3.221 +#else
   3.222 +	adap->class = I2C_CLASS_TV_ANALOG;
   3.223 +#endif
   3.224 +
   3.225 +	strcpy(adap->name, "nGene");
   3.226 +
   3.227 +	adap->algo = &ngene_i2c_algo;
   3.228 +	adap->algo_data = (void *)&(dev->channel[dev_nr]);
   3.229 +	adap->dev.parent = &dev->pci_dev->dev;
   3.230 +
   3.231 +	return i2c_add_adapter(adap);
   3.232 +}
   3.233 +
   3.234 +#if 0
   3.235 +int i2c_write(struct i2c_adapter *adapter, u8 adr, u8 data)
   3.236 +{
   3.237 +	u8 m[1] = {data};
   3.238 +	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 1};
   3.239 +
   3.240 +	if (i2c_transfer(adapter, &msg, 1) != 1) {
   3.241 +		printk(KERN_ERR DEVICE_NAME
   3.242 +		       ": Failed to write to I2C adr %02x!\n", adr);
   3.243 +		return -1;
   3.244 +	}
   3.245 +	return 0;
   3.246 +}
   3.247 +
   3.248 +static int i2c_write_register(struct i2c_adapter *adapter,
   3.249 +			      u8 adr, u8 reg, u8 data)
   3.250 +{
   3.251 +	u8 m[2] = {reg, data};
   3.252 +	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 2};
   3.253 +
   3.254 +	if (i2c_transfer(adapter, &msg, 1) != 1) {
   3.255 +		printk(KERN_ERR DEVICE_NAME
   3.256 +		       ": Failed to write to I2C register %02x@%02x!\n",
   3.257 +		       reg, adr);
   3.258 +		return -1;
   3.259 +	}
   3.260 +	return 0;
   3.261 +}
   3.262 +
   3.263 +static int i2c_write_read(struct i2c_adapter *adapter,
   3.264 +			  u8 adr, u8 *w, u8 wlen, u8 *r, u8 rlen)
   3.265 +{
   3.266 +	struct i2c_msg msgs[2] = {{.addr = adr, .flags = 0,
   3.267 +				   .buf = w, .len = wlen},
   3.268 +				  {.addr = adr, .flags = I2C_M_RD,
   3.269 +				   .buf = r, .len = rlen} };
   3.270 +
   3.271 +	if (i2c_transfer(adapter, msgs, 2) != 2) {
   3.272 +		printk(KERN_ERR DEVICE_NAME ": error in i2c_write_read\n");
   3.273 +		return -1;
   3.274 +	}
   3.275 +	return 0;
   3.276 +}
   3.277 +
   3.278 +static int test_dec_i2c(struct i2c_adapter *adapter, int reg)
   3.279 +{
   3.280 +	u8 data[256] = { reg, 0x00, 0x93, 0x78, 0x43, 0x45 };
   3.281 +	u8 data2[256];
   3.282 +	int i;
   3.283 +
   3.284 +	memset(data2, 0, 256);
   3.285 +	i2c_write_read(adapter, 0x66, data, 2, data2, 4);
   3.286 +	for (i = 0; i < 4; i++)
   3.287 +		printk(KERN_DEBUG "%02x ", data2[i]);
   3.288 +	printk(KERN_DEBUG "\n");
   3.289 +
   3.290 +	return 0;
   3.291 +}
   3.292 +
   3.293 +static int i2c_write_msp_register(struct i2c_adapter *adapter,
   3.294 +				  u8 adr, u8 reg, u16 data)
   3.295 +{
   3.296 +	u8 m[3] = {reg, (data >> 8) & 0xff, data & 0xff};
   3.297 +	struct i2c_msg msg = {.addr = adr, .flags = 0, .buf = m, .len = 3 };
   3.298 +
   3.299 +	if (i2c_transfer(adapter, &msg, 1) != 1) {
   3.300 +		printk(KERN_ERR DEVICE_NAME
   3.301 +		       ": Failed to write to I2C register %02x@%02x!\n",
   3.302 +		       reg, adr);
   3.303 +		return -1;
   3.304 +	}
   3.305 +	return 0;
   3.306 +}
   3.307 +
   3.308 +#endif