From 8c18675d85dd6bae0c5065b9bb39ae97dac5d0a0 Mon Sep 17 00:00:00 2001 From: Frodo Looijaard Date: Wed, 13 Jan 1999 20:47:52 +0000 Subject: [PATCH] i2c-dev is now working! You can now use i2cdump to dump SMBus device registers! git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@165 7894878c-1315-0410-8ee3-d5d059ff63e0 --- kernel/i2c-dev.c | 79 +++++++++++++++++++++++---------------------- kernel/i2c-proc.c | 3 +- prog/dump/i2cdump.c | 4 +-- src/i2c-dev.c | 79 +++++++++++++++++++++++---------------------- src/i2c-proc.c | 3 +- 5 files changed, 88 insertions(+), 80 deletions(-) diff --git a/kernel/i2c-dev.c b/kernel/i2c-dev.c index 7b8427cb..00e5f670 100644 --- a/kernel/i2c-dev.c +++ b/kernel/i2c-dev.c @@ -232,7 +232,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct i2c_client *client = (struct i2c_client *)file->private_data; - struct i2c_smbus_data *data_arg; + struct i2c_smbus_data data_arg; union smbus_data temp; int ver,datasize,res; @@ -254,53 +254,56 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, printk("i2c-dev.o: ioctl I2C_TENBIT not (yet) supported!\n"); return -EINVAL; case I2C_SMBUS: - if (! (data_arg = (struct i2c_smbus_data *) arg)) { + if (! arg) { #ifdef DEBUG printk("i2c-dev.o: NULL argument pointer in ioctl I2C_SMBUS.\n"); #endif return -EINVAL; } - if (verify_area(VERIFY_READ,data_arg,sizeof(struct i2c_smbus_data))) { + if (verify_area(VERIFY_READ,(struct i2c_smbus_data *) arg, + sizeof(struct i2c_smbus_data))) { #ifdef DEBUG - printk("i2c-dev.o: invalid argument pointer (%p) " - "in IOCTL I2C_SMBUS.\n", data_arg); + printk("i2c-dev.o: invalid argument pointer (%ld) " + "in IOCTL I2C_SMBUS.\n", arg); #endif return -EINVAL; } - if ((data_arg->size != SMBUS_BYTE) && - (data_arg->size != SMBUS_QUICK) && - (data_arg->size != SMBUS_BYTE_DATA) && - (data_arg->size != SMBUS_WORD_DATA) && - (data_arg->size != SMBUS_PROC_CALL) && - (data_arg->size != SMBUS_BLOCK_DATA)) { + copy_from_user(&data_arg,(struct i2c_smbus_data *) arg, + sizeof(struct i2c_smbus_data)); + if ((data_arg.size != SMBUS_BYTE) && + (data_arg.size != SMBUS_QUICK) && + (data_arg.size != SMBUS_BYTE_DATA) && + (data_arg.size != SMBUS_WORD_DATA) && + (data_arg.size != SMBUS_PROC_CALL) && + (data_arg.size != SMBUS_BLOCK_DATA)) { #ifdef DEBUG printk("i2c-dev.o: size out of range (%x) in ioctl I2C_SMBUS.\n", - data_arg->size); + data_arg.size); #endif return -EINVAL; } /* Note that SMBUS_READ and SMBUS_WRITE are 0 and 1, so the check is valid if size==SMBUS_QUICK too. */ - if ((data_arg->read_write != SMBUS_READ) && - (data_arg->read_write != SMBUS_WRITE)) { + if ((data_arg.read_write != SMBUS_READ) && + (data_arg.read_write != SMBUS_WRITE)) { #ifdef DEBUG printk("i2c-dev.o: read_write out of range (%x) in ioctl I2C_SMBUS.\n", - data_arg->read_write); + data_arg.read_write); #endif return -EINVAL; } /* Note that command values are always valid! */ - if ((data_arg->size == SMBUS_QUICK) || - ((data_arg->size == SMBUS_BYTE) && - (data_arg->read_write == SMBUS_WRITE))) + if ((data_arg.size == SMBUS_QUICK) || + ((data_arg.size == SMBUS_BYTE) && + (data_arg.read_write == SMBUS_WRITE))) /* These are special: we do not use data */ return smbus_access(client->adapter, client->addr, - data_arg->read_write, data_arg->command, - data_arg->size, NULL); + data_arg.read_write, data_arg.command, + data_arg.size, NULL); - if (data_arg->data == NULL) { + if (data_arg.data == NULL) { #ifdef DEBUG printk("i2c-dev.o: data is NULL pointer in ioctl I2C_SMBUS.\n"); #endif @@ -309,31 +312,31 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, /* This seems unlogical but it is not: if the user wants to read a value, we must write that value to user memory! */ - ver = (data_arg->read_write == SMBUS_WRITE)?VERIFY_READ:VERIFY_WRITE; + ver = (data_arg.read_write == SMBUS_WRITE)?VERIFY_READ:VERIFY_WRITE; - if ((data_arg->size == SMBUS_BYTE_DATA) || (data_arg->size == SMBUS_BYTE)) - datasize = sizeof(data_arg->data->byte); - else if (data_arg->size == SMBUS_WORD_DATA) - datasize = sizeof(data_arg->data->word); + if ((data_arg.size == SMBUS_BYTE_DATA) || (data_arg.size == SMBUS_BYTE)) + datasize = sizeof(data_arg.data->byte); + else if (data_arg.size == SMBUS_WORD_DATA) + datasize = sizeof(data_arg.data->word); else /* size == SMBUS_BLOCK_DATA */ - datasize = sizeof(data_arg->data->block); + datasize = sizeof(data_arg.data->block); - if (verify_area(ver,data_arg->data,datasize)) { + if (verify_area(ver,data_arg.data,datasize)) { #ifdef DEBUG printk("i2c-dev.o: invalid pointer data (%p) in ioctl I2C_SMBUS.\n", - data_arg->data); + data_arg.data); #endif return -EINVAL; } - if (data_arg->read_write == SMBUS_WRITE) { - copy_from_user(&temp,data_arg->data,datasize); - return smbus_access(client->adapter,client->addr,data_arg->read_write, - data_arg->command,data_arg->size,&temp); + if (data_arg.read_write == SMBUS_WRITE) { + copy_from_user(&temp,data_arg.data,datasize); + return smbus_access(client->adapter,client->addr,data_arg.read_write, + data_arg.command,data_arg.size,&temp); } else { - res = smbus_access(client->adapter,client->addr,data_arg->read_write, - data_arg->command,data_arg->size,&temp); + res = smbus_access(client->adapter,client->addr,data_arg.read_write, + data_arg.command,data_arg.size,&temp); if (!res) - copy_to_user(data_arg->data,&temp,datasize); + copy_to_user(data_arg.data,&temp,datasize); return res; } default: @@ -406,7 +409,7 @@ int i2cdev_attach_adapter(struct i2c_adapter *adap) } if (i2c_is_isa_adapter(adap)) { #ifdef DEBUG - printk("i2c-dev.o: Can't open ISA adapter!\n"); + printk("i2c-dev.o: Can't attach ISA adapter!\n"); #endif return 0; } @@ -422,7 +425,7 @@ int i2cdev_attach_adapter(struct i2c_adapter *adap) return res; } i2cdev_clients[i] = client; - printk("i2cdev.o: Registered '%s' as minor %d\n",adap->name,i); + printk("i2c-dev.o: Registered '%s' as minor %d\n",adap->name,i); return 0; } diff --git a/kernel/i2c-proc.c b/kernel/i2c-proc.c index b2bd460c..8b3046bd 100644 --- a/kernel/i2c-proc.c +++ b/kernel/i2c-proc.c @@ -301,7 +301,8 @@ int i2cproc_bus_read(struct inode * inode, struct file * file,char * buf, if ((client = i2cproc_adapters[i]->clients[j])) /* Filter out dummy clients */ #ifndef DEBUG - if (client->driver->id != I2C_DRIVERID_I2CPROC) + if ((client->driver->id != I2C_DRIVERID_I2CPROC) && + (client->driver->id != I2C_DRIVERID_I2CDEV)) #endif /* ndef DEBUG */ len += sprintf(kbuf+len,"%x\t%-32s\t%-32s\n", #ifdef DEBUG diff --git a/prog/dump/i2cdump.c b/prog/dump/i2cdump.c index 40ec4040..7de1e230 100644 --- a/prog/dump/i2cdump.c +++ b/prog/dump/i2cdump.c @@ -95,7 +95,7 @@ int main(int argc, char *argv[]) exit(1); } - fprintf(stderr," WARNING! Running this program can confuse your I2C bus, " + fprintf(stderr," WARNING! This program can confuse your I2C bus, " "cause data loss and worse!\n"); fprintf(stderr," I will probe file %s, address %x, mode %s\n", filename,address,size == SMBUS_BYTE_DATA?"byte":"word"); @@ -120,7 +120,7 @@ int main(int argc, char *argv[]) for (i = 0; i < 256; i+=8) { printf("%02x: ",i); for(j = 0; j < 8; j++) { - res = i2c_smbus_read_byte_data(file,i+j); + res = i2c_smbus_read_word_data(file,i+j); if (res < 0) printf("XXXX "); else diff --git a/src/i2c-dev.c b/src/i2c-dev.c index 7b8427cb..00e5f670 100644 --- a/src/i2c-dev.c +++ b/src/i2c-dev.c @@ -232,7 +232,7 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct i2c_client *client = (struct i2c_client *)file->private_data; - struct i2c_smbus_data *data_arg; + struct i2c_smbus_data data_arg; union smbus_data temp; int ver,datasize,res; @@ -254,53 +254,56 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, printk("i2c-dev.o: ioctl I2C_TENBIT not (yet) supported!\n"); return -EINVAL; case I2C_SMBUS: - if (! (data_arg = (struct i2c_smbus_data *) arg)) { + if (! arg) { #ifdef DEBUG printk("i2c-dev.o: NULL argument pointer in ioctl I2C_SMBUS.\n"); #endif return -EINVAL; } - if (verify_area(VERIFY_READ,data_arg,sizeof(struct i2c_smbus_data))) { + if (verify_area(VERIFY_READ,(struct i2c_smbus_data *) arg, + sizeof(struct i2c_smbus_data))) { #ifdef DEBUG - printk("i2c-dev.o: invalid argument pointer (%p) " - "in IOCTL I2C_SMBUS.\n", data_arg); + printk("i2c-dev.o: invalid argument pointer (%ld) " + "in IOCTL I2C_SMBUS.\n", arg); #endif return -EINVAL; } - if ((data_arg->size != SMBUS_BYTE) && - (data_arg->size != SMBUS_QUICK) && - (data_arg->size != SMBUS_BYTE_DATA) && - (data_arg->size != SMBUS_WORD_DATA) && - (data_arg->size != SMBUS_PROC_CALL) && - (data_arg->size != SMBUS_BLOCK_DATA)) { + copy_from_user(&data_arg,(struct i2c_smbus_data *) arg, + sizeof(struct i2c_smbus_data)); + if ((data_arg.size != SMBUS_BYTE) && + (data_arg.size != SMBUS_QUICK) && + (data_arg.size != SMBUS_BYTE_DATA) && + (data_arg.size != SMBUS_WORD_DATA) && + (data_arg.size != SMBUS_PROC_CALL) && + (data_arg.size != SMBUS_BLOCK_DATA)) { #ifdef DEBUG printk("i2c-dev.o: size out of range (%x) in ioctl I2C_SMBUS.\n", - data_arg->size); + data_arg.size); #endif return -EINVAL; } /* Note that SMBUS_READ and SMBUS_WRITE are 0 and 1, so the check is valid if size==SMBUS_QUICK too. */ - if ((data_arg->read_write != SMBUS_READ) && - (data_arg->read_write != SMBUS_WRITE)) { + if ((data_arg.read_write != SMBUS_READ) && + (data_arg.read_write != SMBUS_WRITE)) { #ifdef DEBUG printk("i2c-dev.o: read_write out of range (%x) in ioctl I2C_SMBUS.\n", - data_arg->read_write); + data_arg.read_write); #endif return -EINVAL; } /* Note that command values are always valid! */ - if ((data_arg->size == SMBUS_QUICK) || - ((data_arg->size == SMBUS_BYTE) && - (data_arg->read_write == SMBUS_WRITE))) + if ((data_arg.size == SMBUS_QUICK) || + ((data_arg.size == SMBUS_BYTE) && + (data_arg.read_write == SMBUS_WRITE))) /* These are special: we do not use data */ return smbus_access(client->adapter, client->addr, - data_arg->read_write, data_arg->command, - data_arg->size, NULL); + data_arg.read_write, data_arg.command, + data_arg.size, NULL); - if (data_arg->data == NULL) { + if (data_arg.data == NULL) { #ifdef DEBUG printk("i2c-dev.o: data is NULL pointer in ioctl I2C_SMBUS.\n"); #endif @@ -309,31 +312,31 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, /* This seems unlogical but it is not: if the user wants to read a value, we must write that value to user memory! */ - ver = (data_arg->read_write == SMBUS_WRITE)?VERIFY_READ:VERIFY_WRITE; + ver = (data_arg.read_write == SMBUS_WRITE)?VERIFY_READ:VERIFY_WRITE; - if ((data_arg->size == SMBUS_BYTE_DATA) || (data_arg->size == SMBUS_BYTE)) - datasize = sizeof(data_arg->data->byte); - else if (data_arg->size == SMBUS_WORD_DATA) - datasize = sizeof(data_arg->data->word); + if ((data_arg.size == SMBUS_BYTE_DATA) || (data_arg.size == SMBUS_BYTE)) + datasize = sizeof(data_arg.data->byte); + else if (data_arg.size == SMBUS_WORD_DATA) + datasize = sizeof(data_arg.data->word); else /* size == SMBUS_BLOCK_DATA */ - datasize = sizeof(data_arg->data->block); + datasize = sizeof(data_arg.data->block); - if (verify_area(ver,data_arg->data,datasize)) { + if (verify_area(ver,data_arg.data,datasize)) { #ifdef DEBUG printk("i2c-dev.o: invalid pointer data (%p) in ioctl I2C_SMBUS.\n", - data_arg->data); + data_arg.data); #endif return -EINVAL; } - if (data_arg->read_write == SMBUS_WRITE) { - copy_from_user(&temp,data_arg->data,datasize); - return smbus_access(client->adapter,client->addr,data_arg->read_write, - data_arg->command,data_arg->size,&temp); + if (data_arg.read_write == SMBUS_WRITE) { + copy_from_user(&temp,data_arg.data,datasize); + return smbus_access(client->adapter,client->addr,data_arg.read_write, + data_arg.command,data_arg.size,&temp); } else { - res = smbus_access(client->adapter,client->addr,data_arg->read_write, - data_arg->command,data_arg->size,&temp); + res = smbus_access(client->adapter,client->addr,data_arg.read_write, + data_arg.command,data_arg.size,&temp); if (!res) - copy_to_user(data_arg->data,&temp,datasize); + copy_to_user(data_arg.data,&temp,datasize); return res; } default: @@ -406,7 +409,7 @@ int i2cdev_attach_adapter(struct i2c_adapter *adap) } if (i2c_is_isa_adapter(adap)) { #ifdef DEBUG - printk("i2c-dev.o: Can't open ISA adapter!\n"); + printk("i2c-dev.o: Can't attach ISA adapter!\n"); #endif return 0; } @@ -422,7 +425,7 @@ int i2cdev_attach_adapter(struct i2c_adapter *adap) return res; } i2cdev_clients[i] = client; - printk("i2cdev.o: Registered '%s' as minor %d\n",adap->name,i); + printk("i2c-dev.o: Registered '%s' as minor %d\n",adap->name,i); return 0; } diff --git a/src/i2c-proc.c b/src/i2c-proc.c index b2bd460c..8b3046bd 100644 --- a/src/i2c-proc.c +++ b/src/i2c-proc.c @@ -301,7 +301,8 @@ int i2cproc_bus_read(struct inode * inode, struct file * file,char * buf, if ((client = i2cproc_adapters[i]->clients[j])) /* Filter out dummy clients */ #ifndef DEBUG - if (client->driver->id != I2C_DRIVERID_I2CPROC) + if ((client->driver->id != I2C_DRIVERID_I2CPROC) && + (client->driver->id != I2C_DRIVERID_I2CDEV)) #endif /* ndef DEBUG */ len += sprintf(kbuf+len,"%x\t%-32s\t%-32s\n", #ifdef DEBUG