mirror of
https://github.com/lm-sensors/lm-sensors
synced 2025-09-01 06:45:24 +00:00
PROC_CALL ioctl hook in i2c-dev added
git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@190 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
@@ -312,11 +312,13 @@ 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
|
/* This seems unlogical but it is not: if the user wants to read a
|
||||||
value, we must write that value to user memory! */
|
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) &&
|
||||||
|
(data_arg.size != SMBUS_PROC_CALL))?VERIFY_READ:VERIFY_WRITE;
|
||||||
|
|
||||||
if ((data_arg.size == SMBUS_BYTE_DATA) || (data_arg.size == SMBUS_BYTE))
|
if ((data_arg.size == SMBUS_BYTE_DATA) || (data_arg.size == SMBUS_BYTE))
|
||||||
datasize = sizeof(data_arg.data->byte);
|
datasize = sizeof(data_arg.data->byte);
|
||||||
else if (data_arg.size == SMBUS_WORD_DATA)
|
else if ((data_arg.size == SMBUS_WORD_DATA) ||
|
||||||
|
(data_arg.size == SMBUS_PROC_CALL))
|
||||||
datasize = sizeof(data_arg.data->word);
|
datasize = sizeof(data_arg.data->word);
|
||||||
else /* size == SMBUS_BLOCK_DATA */
|
else /* size == SMBUS_BLOCK_DATA */
|
||||||
datasize = sizeof(data_arg.data->block);
|
datasize = sizeof(data_arg.data->block);
|
||||||
@@ -328,17 +330,17 @@ int i2cdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd,
|
|||||||
#endif
|
#endif
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (data_arg.read_write == SMBUS_WRITE) {
|
|
||||||
|
if ((data_arg.size == SMBUS_PROC_CALL) ||
|
||||||
|
(data_arg.read_write == SMBUS_WRITE))
|
||||||
copy_from_user(&temp,data_arg.data,datasize);
|
copy_from_user(&temp,data_arg.data,datasize);
|
||||||
return smbus_access(client->adapter,client->addr,data_arg.read_write,
|
res = smbus_access(client->adapter,client->addr,data_arg.read_write,
|
||||||
data_arg.command,data_arg.size,&temp);
|
data_arg.command,data_arg.size,&temp);
|
||||||
} else {
|
if (! res && ((data_arg.size == SMBUS_PROC_CALL) ||
|
||||||
res = smbus_access(client->adapter,client->addr,data_arg.read_write,
|
(data_arg.read_write == SMBUS_READ)))
|
||||||
data_arg.command,data_arg.size,&temp);
|
copy_to_user(data_arg.data,&temp,datasize);
|
||||||
if (!res)
|
return res;
|
||||||
copy_to_user(data_arg.data,&temp,datasize);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return i2c_control(client,cmd,arg);
|
return i2c_control(client,cmd,arg);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user