diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-09 01:37:34 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-09 01:37:34 -0500 |
commit | 8006fdd6dc387abaa4b683bda4868c879fd76070 (patch) | |
tree | 314b08f4923dd9ab24930e6b2ac75889c244b154 /drivers/sbus | |
parent | 18ce920a6eba05c0d55cdc95fbbadf7e4c4b457b (diff) | |
parent | 7c3983357fdaef3ae71a0d7081a4b6dcfd869d39 (diff) |
Merge branch 'upstream'
Diffstat (limited to 'drivers/sbus')
-rw-r--r-- | drivers/sbus/char/cpwatchdog.c | 24 | ||||
-rw-r--r-- | drivers/sbus/char/display7seg.c | 32 | ||||
-rw-r--r-- | drivers/sbus/char/envctrl.c | 31 | ||||
-rw-r--r-- | drivers/sbus/char/openprom.c | 36 |
4 files changed, 95 insertions, 28 deletions
diff --git a/drivers/sbus/char/cpwatchdog.c b/drivers/sbus/char/cpwatchdog.c index c82abeb59d3a..071ae24be892 100644 --- a/drivers/sbus/char/cpwatchdog.c +++ b/drivers/sbus/char/cpwatchdog.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/ioport.h> | 27 | #include <linux/ioport.h> |
28 | #include <linux/timer.h> | 28 | #include <linux/timer.h> |
29 | #include <linux/smp_lock.h> | ||
29 | #include <asm/irq.h> | 30 | #include <asm/irq.h> |
30 | #include <asm/ebus.h> | 31 | #include <asm/ebus.h> |
31 | #include <asm/oplib.h> | 32 | #include <asm/oplib.h> |
@@ -394,6 +395,28 @@ static int wd_ioctl(struct inode *inode, struct file *file, | |||
394 | return(0); | 395 | return(0); |
395 | } | 396 | } |
396 | 397 | ||
398 | static long wd_compat_ioctl(struct file *file, unsigned int cmd, | ||
399 | unsigned long arg) | ||
400 | { | ||
401 | int rval = -ENOIOCTLCMD; | ||
402 | |||
403 | switch (cmd) { | ||
404 | /* solaris ioctls are specific to this driver */ | ||
405 | case WIOCSTART: | ||
406 | case WIOCSTOP: | ||
407 | case WIOCGSTAT: | ||
408 | lock_kernel(); | ||
409 | rval = wd_ioctl(file->f_dentry->d_inode, file, cmd, arg); | ||
410 | lock_kernel(); | ||
411 | break; | ||
412 | /* everything else is handled by the generic compat layer */ | ||
413 | default: | ||
414 | break; | ||
415 | } | ||
416 | |||
417 | return rval; | ||
418 | } | ||
419 | |||
397 | static ssize_t wd_write(struct file *file, | 420 | static ssize_t wd_write(struct file *file, |
398 | const char __user *buf, | 421 | const char __user *buf, |
399 | size_t count, | 422 | size_t count, |
@@ -441,6 +464,7 @@ static irqreturn_t wd_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
441 | static struct file_operations wd_fops = { | 464 | static struct file_operations wd_fops = { |
442 | .owner = THIS_MODULE, | 465 | .owner = THIS_MODULE, |
443 | .ioctl = wd_ioctl, | 466 | .ioctl = wd_ioctl, |
467 | .compat_ioctl = wd_compat_ioctl, | ||
444 | .open = wd_open, | 468 | .open = wd_open, |
445 | .write = wd_write, | 469 | .write = wd_write, |
446 | .read = wd_read, | 470 | .read = wd_read, |
diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index 24ed5893b4f0..39f54213a6d5 100644 --- a/drivers/sbus/char/display7seg.c +++ b/drivers/sbus/char/display7seg.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/miscdevice.h> | 16 | #include <linux/miscdevice.h> |
17 | #include <linux/ioport.h> /* request_region */ | 17 | #include <linux/ioport.h> /* request_region */ |
18 | #include <linux/smp_lock.h> | ||
18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
19 | #include <asm/ebus.h> /* EBus device */ | 20 | #include <asm/ebus.h> /* EBus device */ |
20 | #include <asm/oplib.h> /* OpenProm Library */ | 21 | #include <asm/oplib.h> /* OpenProm Library */ |
@@ -114,22 +115,25 @@ static int d7s_release(struct inode *inode, struct file *f) | |||
114 | return 0; | 115 | return 0; |
115 | } | 116 | } |
116 | 117 | ||
117 | static int d7s_ioctl(struct inode *inode, struct file *f, | 118 | static long d7s_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
118 | unsigned int cmd, unsigned long arg) | ||
119 | { | 119 | { |
120 | __u8 regs = readb(d7s_regs); | 120 | __u8 regs = readb(d7s_regs); |
121 | __u8 ireg = 0; | 121 | __u8 ireg = 0; |
122 | int error = 0 | ||
122 | 123 | ||
123 | if (D7S_MINOR != iminor(inode)) | 124 | if (D7S_MINOR != iminor(file->f_dentry->d_inode)) |
124 | return -ENODEV; | 125 | return -ENODEV; |
125 | 126 | ||
127 | lock_kernel(); | ||
126 | switch (cmd) { | 128 | switch (cmd) { |
127 | case D7SIOCWR: | 129 | case D7SIOCWR: |
128 | /* assign device register values | 130 | /* assign device register values |
129 | * we mask-out D7S_FLIP if in sol_compat mode | 131 | * we mask-out D7S_FLIP if in sol_compat mode |
130 | */ | 132 | */ |
131 | if (get_user(ireg, (int __user *) arg)) | 133 | if (get_user(ireg, (int __user *) arg)) { |
132 | return -EFAULT; | 134 | error = -EFAULT; |
135 | break; | ||
136 | } | ||
133 | if (0 != sol_compat) { | 137 | if (0 != sol_compat) { |
134 | (regs & D7S_FLIP) ? | 138 | (regs & D7S_FLIP) ? |
135 | (ireg |= D7S_FLIP) : (ireg &= ~D7S_FLIP); | 139 | (ireg |= D7S_FLIP) : (ireg &= ~D7S_FLIP); |
@@ -144,8 +148,10 @@ static int d7s_ioctl(struct inode *inode, struct file *f, | |||
144 | * This driver will not misinform you about the state | 148 | * This driver will not misinform you about the state |
145 | * of your hardware while in sol_compat mode | 149 | * of your hardware while in sol_compat mode |
146 | */ | 150 | */ |
147 | if (put_user(regs, (int __user *) arg)) | 151 | if (put_user(regs, (int __user *) arg)) { |
148 | return -EFAULT; | 152 | error = -EFAULT; |
153 | break; | ||
154 | } | ||
149 | break; | 155 | break; |
150 | 156 | ||
151 | case D7SIOCTM: | 157 | case D7SIOCTM: |
@@ -155,15 +161,17 @@ static int d7s_ioctl(struct inode *inode, struct file *f, | |||
155 | writeb(regs, d7s_regs); | 161 | writeb(regs, d7s_regs); |
156 | break; | 162 | break; |
157 | }; | 163 | }; |
164 | lock_kernel(); | ||
158 | 165 | ||
159 | return 0; | 166 | return error; |
160 | } | 167 | } |
161 | 168 | ||
162 | static struct file_operations d7s_fops = { | 169 | static struct file_operations d7s_fops = { |
163 | .owner = THIS_MODULE, | 170 | .owner = THIS_MODULE, |
164 | .ioctl = d7s_ioctl, | 171 | .unlocked_ioctl = d7s_ioctl, |
165 | .open = d7s_open, | 172 | .compat_ioctl = d7s_ioctl, |
166 | .release = d7s_release, | 173 | .open = d7s_open, |
174 | .release = d7s_release, | ||
167 | }; | 175 | }; |
168 | 176 | ||
169 | static struct miscdevice d7s_miscdev = { D7S_MINOR, D7S_DEVNAME, &d7s_fops }; | 177 | static struct miscdevice d7s_miscdev = { D7S_MINOR, D7S_DEVNAME, &d7s_fops }; |
diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index b0cc3c2588fd..19e8eddf887a 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c | |||
@@ -654,9 +654,8 @@ envctrl_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) | |||
654 | /* Function Description: Command what to read. Mapped to user ioctl(). | 654 | /* Function Description: Command what to read. Mapped to user ioctl(). |
655 | * Return: Gives 0 for implemented commands, -EINVAL otherwise. | 655 | * Return: Gives 0 for implemented commands, -EINVAL otherwise. |
656 | */ | 656 | */ |
657 | static int | 657 | static long |
658 | envctrl_ioctl(struct inode *inode, struct file *file, | 658 | envctrl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
659 | unsigned int cmd, unsigned long arg) | ||
660 | { | 659 | { |
661 | char __user *infobuf; | 660 | char __user *infobuf; |
662 | 661 | ||
@@ -715,11 +714,14 @@ envctrl_release(struct inode *inode, struct file *file) | |||
715 | } | 714 | } |
716 | 715 | ||
717 | static struct file_operations envctrl_fops = { | 716 | static struct file_operations envctrl_fops = { |
718 | .owner = THIS_MODULE, | 717 | .owner = THIS_MODULE, |
719 | .read = envctrl_read, | 718 | .read = envctrl_read, |
720 | .ioctl = envctrl_ioctl, | 719 | .unlocked_ioctl = envctrl_ioctl, |
721 | .open = envctrl_open, | 720 | #ifdef CONFIG_COMPAT |
722 | .release = envctrl_release, | 721 | .compat_ioctl = envctrl_ioctl, |
722 | #endif | ||
723 | .open = envctrl_open, | ||
724 | .release = envctrl_release, | ||
723 | }; | 725 | }; |
724 | 726 | ||
725 | static struct miscdevice envctrl_dev = { | 727 | static struct miscdevice envctrl_dev = { |
@@ -1125,10 +1127,9 @@ out_deregister: | |||
1125 | misc_deregister(&envctrl_dev); | 1127 | misc_deregister(&envctrl_dev); |
1126 | out_iounmap: | 1128 | out_iounmap: |
1127 | iounmap(i2c); | 1129 | iounmap(i2c); |
1128 | for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) { | 1130 | for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) |
1129 | if (i2c_childlist[i].tables) | 1131 | kfree(i2c_childlist[i].tables); |
1130 | kfree(i2c_childlist[i].tables); | 1132 | |
1131 | } | ||
1132 | return err; | 1133 | return err; |
1133 | } | 1134 | } |
1134 | 1135 | ||
@@ -1141,10 +1142,8 @@ static void __exit envctrl_cleanup(void) | |||
1141 | iounmap(i2c); | 1142 | iounmap(i2c); |
1142 | misc_deregister(&envctrl_dev); | 1143 | misc_deregister(&envctrl_dev); |
1143 | 1144 | ||
1144 | for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) { | 1145 | for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) |
1145 | if (i2c_childlist[i].tables) | 1146 | kfree(i2c_childlist[i].tables); |
1146 | kfree(i2c_childlist[i].tables); | ||
1147 | } | ||
1148 | } | 1147 | } |
1149 | 1148 | ||
1150 | module_init(envctrl_init); | 1149 | module_init(envctrl_init); |
diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index 58ed33749571..383a95f34a0d 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
40 | #include <linux/string.h> | 40 | #include <linux/string.h> |
41 | #include <linux/miscdevice.h> | 41 | #include <linux/miscdevice.h> |
42 | #include <linux/smp_lock.h> | ||
42 | #include <linux/init.h> | 43 | #include <linux/init.h> |
43 | #include <linux/fs.h> | 44 | #include <linux/fs.h> |
44 | #include <asm/oplib.h> | 45 | #include <asm/oplib.h> |
@@ -565,6 +566,40 @@ static int openprom_ioctl(struct inode * inode, struct file * file, | |||
565 | } | 566 | } |
566 | } | 567 | } |
567 | 568 | ||
569 | static long openprom_compat_ioctl(struct file *file, unsigned int cmd, | ||
570 | unsigned long arg) | ||
571 | { | ||
572 | long rval = -ENOTTY; | ||
573 | |||
574 | /* | ||
575 | * SunOS/Solaris only, the NetBSD one's have embedded pointers in | ||
576 | * the arg which we'd need to clean up... | ||
577 | */ | ||
578 | switch (cmd) { | ||
579 | case OPROMGETOPT: | ||
580 | case OPROMSETOPT: | ||
581 | case OPROMNXTOPT: | ||
582 | case OPROMSETOPT2: | ||
583 | case OPROMNEXT: | ||
584 | case OPROMCHILD: | ||
585 | case OPROMGETPROP: | ||
586 | case OPROMNXTPROP: | ||
587 | case OPROMU2P: | ||
588 | case OPROMGETCONS: | ||
589 | case OPROMGETFBNAME: | ||
590 | case OPROMGETBOOTARGS: | ||
591 | case OPROMSETCUR: | ||
592 | case OPROMPCI2NODE: | ||
593 | case OPROMPATH2NODE: | ||
594 | lock_kernel(); | ||
595 | rval = openprom_ioctl(file->f_dentry->d_inode, file, cmd, arg); | ||
596 | lock_kernel(); | ||
597 | break; | ||
598 | } | ||
599 | |||
600 | return rval; | ||
601 | } | ||
602 | |||
568 | static int openprom_open(struct inode * inode, struct file * file) | 603 | static int openprom_open(struct inode * inode, struct file * file) |
569 | { | 604 | { |
570 | DATA *data; | 605 | DATA *data; |
@@ -590,6 +625,7 @@ static struct file_operations openprom_fops = { | |||
590 | .owner = THIS_MODULE, | 625 | .owner = THIS_MODULE, |
591 | .llseek = no_llseek, | 626 | .llseek = no_llseek, |
592 | .ioctl = openprom_ioctl, | 627 | .ioctl = openprom_ioctl, |
628 | .compat_ioctl = openprom_compat_ioctl, | ||
593 | .open = openprom_open, | 629 | .open = openprom_open, |
594 | .release = openprom_release, | 630 | .release = openprom_release, |
595 | }; | 631 | }; |