mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-11-07 16:01:34 +00:00
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
This commit is contained in:
1 parent
50573c910d
commit
8c18675d85
5 files changed
+88
-80
No files matched your search
+41
-38
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
+41
-38
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
Reference in new issue
Block a user