X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fchar%2Fds1620.c;h=48cb8f0e8ebf8000e5dcc697d1d20383ae7cfd50;hb=refs%2Fheads%2Fvserver;hp=4171ca18b62981c49f705a0058bbd91d1b7e780a;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/char/ds1620.c b/drivers/char/ds1620.c index 4171ca18b..48cb8f0e8 100644 --- a/drivers/char/ds1620.c +++ b/drivers/char/ds1620.c @@ -2,7 +2,6 @@ * linux/drivers/char/ds1620.c: Dallas Semiconductors DS1620 * thermometer driver (as used in the Rebel.com NetWinder) */ -#include #include #include #include @@ -163,8 +162,7 @@ static void ds1620_out(int cmd, int bits, int value) netwinder_ds1620_reset(); netwinder_unlock(&flags); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(2); + msleep(20); } static unsigned int ds1620_in(int cmd, int bits) @@ -213,15 +211,11 @@ static void ds1620_read_state(struct therm *therm) } static ssize_t -ds1620_read(struct file *file, char *buf, size_t count, loff_t *ptr) +ds1620_read(struct file *file, char __user *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 */ @@ -237,8 +231,14 @@ 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: @@ -246,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, (int *)arg)) + if (get_user(therm.hi, uarg.i)) return -EFAULT; therm.lo = therm.hi - 3; } else { - if (copy_from_user(&therm, (void *)arg, sizeof(therm))) + if (copy_from_user(&therm, uarg.therm, sizeof(therm))) return -EFAULT; } @@ -268,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, (int *)arg)) + if (put_user(therm.hi, uarg.i)) return -EFAULT; } else { - if (copy_to_user((void *)arg, &therm, sizeof(therm))) + if (copy_to_user(uarg.therm, &therm, sizeof(therm))) return -EFAULT; } break; @@ -283,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, (int *)arg) ? -EFAULT : 0; + return put_user(i, uarg.i) ? -EFAULT : 0; case CMD_GET_STATUS: i = ds1620_in(THERM_READ_CONFIG, 8) & 0xe3; - return put_user(i, (int *)arg) ? -EFAULT : 0; + return put_user(i, uarg.i) ? -EFAULT : 0; case CMD_GET_FAN: i = netwinder_get_fan(); - return put_user(i, (int *)arg) ? -EFAULT : 0; + return put_user(i, uarg.i) ? -EFAULT : 0; case CMD_SET_FAN: if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (get_user(i, (int *)arg)) + if (get_user(i, uarg.i)) return -EFAULT; netwinder_set_fan(i); @@ -336,8 +336,9 @@ proc_therm_ds1620_read(char *buf, char **start, off_t offset, static struct proc_dir_entry *proc_therm_ds1620; #endif -static struct file_operations ds1620_fops = { +static const struct file_operations ds1620_fops = { .owner = THIS_MODULE, + .open = nonseekable_open, .read = ds1620_read, .ioctl = ds1620_ioctl, }; @@ -370,8 +371,7 @@ static int __init ds1620_init(void) th_start.hi = 1; ds1620_write_state(&th_start); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(2*HZ); + msleep(2000); ds1620_write_state(&th); @@ -380,7 +380,7 @@ static int __init ds1620_init(void) return ret; #ifdef THERM_USE_PROC - proc_therm_ds1620 = create_proc_entry("therm", 0, 0); + proc_therm_ds1620 = create_proc_entry("therm", 0, NULL); if (proc_therm_ds1620) proc_therm_ds1620->read_proc = proc_therm_ds1620_read; else