X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fchar%2Fds1620.c;h=4171ca18b62981c49f705a0058bbd91d1b7e780a;hb=5e3b93f248c98873cc843e83092bb8da92ac85a2;hp=e2c4ecac738117bf23a5efb1485b299eab2fe37a;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/drivers/char/ds1620.c b/drivers/char/ds1620.c index e2c4ecac7..4171ca18b 100644 --- a/drivers/char/ds1620.c +++ b/drivers/char/ds1620.c @@ -213,11 +213,15 @@ static void ds1620_read_state(struct therm *therm) } static ssize_t -ds1620_read(struct file *file, char __user *buf, size_t count, loff_t *ptr) +ds1620_read(struct file *file, char *buf, size_t count, loff_t *ptr) { signed int cur_temp; signed char cur_temp_degF; + /* Can't seek (pread) on this device */ + if (ptr != &file->f_pos) + return -ESPIPE; + cur_temp = cvt_9_to_int(ds1620_in(THERM_READ_TEMP, 9)) >> 1; /* convert to Fahrenheit, as per wdt.c */ @@ -233,14 +237,8 @@ static int ds1620_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct therm therm; - union { - struct therm __user *therm; - int __user *i; - } uarg; int i; - uarg.i = (int __user *)arg; - switch(cmd) { case CMD_SET_THERMOSTATE: case CMD_SET_THERMOSTATE2: @@ -248,11 +246,11 @@ ds1620_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned return -EPERM; if (cmd == CMD_SET_THERMOSTATE) { - if (get_user(therm.hi, uarg.i)) + if (get_user(therm.hi, (int *)arg)) return -EFAULT; therm.lo = therm.hi - 3; } else { - if (copy_from_user(&therm, uarg.therm, sizeof(therm))) + if (copy_from_user(&therm, (void *)arg, sizeof(therm))) return -EFAULT; } @@ -270,10 +268,10 @@ ds1620_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned therm.hi >>= 1; if (cmd == CMD_GET_THERMOSTATE) { - if (put_user(therm.hi, uarg.i)) + if (put_user(therm.hi, (int *)arg)) return -EFAULT; } else { - if (copy_to_user(uarg.therm, &therm, sizeof(therm))) + if (copy_to_user((void *)arg, &therm, sizeof(therm))) return -EFAULT; } break; @@ -285,23 +283,23 @@ ds1620_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned if (cmd == CMD_GET_TEMPERATURE) i >>= 1; - return put_user(i, uarg.i) ? -EFAULT : 0; + return put_user(i, (int *)arg) ? -EFAULT : 0; case CMD_GET_STATUS: i = ds1620_in(THERM_READ_CONFIG, 8) & 0xe3; - return put_user(i, uarg.i) ? -EFAULT : 0; + return put_user(i, (int *)arg) ? -EFAULT : 0; case CMD_GET_FAN: i = netwinder_get_fan(); - return put_user(i, uarg.i) ? -EFAULT : 0; + return put_user(i, (int *)arg) ? -EFAULT : 0; case CMD_SET_FAN: if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (get_user(i, uarg.i)) + if (get_user(i, (int *)arg)) return -EFAULT; netwinder_set_fan(i); @@ -340,7 +338,6 @@ static struct proc_dir_entry *proc_therm_ds1620; static struct file_operations ds1620_fops = { .owner = THIS_MODULE, - .open = nonseekable_open, .read = ds1620_read, .ioctl = ds1620_ioctl, }; @@ -383,7 +380,7 @@ static int __init ds1620_init(void) return ret; #ifdef THERM_USE_PROC - proc_therm_ds1620 = create_proc_entry("therm", 0, NULL); + proc_therm_ds1620 = create_proc_entry("therm", 0, 0); if (proc_therm_ds1620) proc_therm_ds1620->read_proc = proc_therm_ds1620_read; else