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