summaryrefslogtreecommitdiff
path: root/arch/sparc/kernel/apc.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-07-21 09:40:26 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-21 09:40:26 -0700
commitf8b71a3a92d69cb1c9c2162f9235d3dd550e4aa0 (patch)
treed0853186f33314a6e45903876d0e94d1619fcca9 /arch/sparc/kernel/apc.c
parent42a77a1b8fe4fd78cf8d8fccbaac918bbe888192 (diff)
parente4f25060b87a627f5cda84b8134911d43c919458 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6: (44 commits) sparc: Remove Sparc's asm-offsets for sclow.S sparc64: Update defconfig. sparc64: Add Niagara2 RNG driver. sparc64: Add missing hypervisor service group numbers. sparc64: Remove 4MB and 512K base page size options. sparc64: Convert to generic helpers for IPI function calls. sparc: Use new '%pS' infrastructure to print symbols. sparc32: fix init.c allnoconfig build error sparc64: Config category "Processor type and features" absent sparc: arch/sparc/kernel/apc.c to unlocked_ioctl sparc: join the remaining header files sparc: merge header files with trivial differences sparc: when header files are equal use asm-sparc version sparc: copy sparc64 specific files to asm-sparc sparc: Merge asm-sparc{,64}/asi.h sparc: export openprom.h to userspace sparc: Merge asm-sparc{,64}/types.h sparc: Merge asm-sparc{,64}/termios.h sparc: Merge asm-sparc{,64}/termbits.h sparc: Merge asm-sparc{,64}/setup.h ...
Diffstat (limited to 'arch/sparc/kernel/apc.c')
-rw-r--r--arch/sparc/kernel/apc.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/arch/sparc/kernel/apc.c b/arch/sparc/kernel/apc.c
index 6707422c9847..5267d48fb2c6 100644
--- a/arch/sparc/kernel/apc.c
+++ b/arch/sparc/kernel/apc.c
@@ -56,7 +56,7 @@ __setup("apc=", apc_setup);
* CPU idle callback function
* See .../arch/sparc/kernel/process.c
*/
-void apc_swift_idle(void)
+static void apc_swift_idle(void)
{
#ifdef APC_DEBUG_LED
set_auxio(0x00, AUXIO_LED);
@@ -85,54 +85,70 @@ static int apc_release(struct inode *inode, struct file *f)
return 0;
}
-static int apc_ioctl(struct inode *inode, struct file *f,
- unsigned int cmd, unsigned long __arg)
+static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg)
{
__u8 inarg, __user *arg;
arg = (__u8 __user *) __arg;
+
+ lock_kernel();
+
switch (cmd) {
case APCIOCGFANCTL:
- if (put_user(apc_readb(APC_FANCTL_REG) & APC_REGMASK, arg))
- return -EFAULT;
+ if (put_user(apc_readb(APC_FANCTL_REG) & APC_REGMASK, arg)) {
+ unlock_kernel();
+ return -EFAULT;
+ }
break;
case APCIOCGCPWR:
- if (put_user(apc_readb(APC_CPOWER_REG) & APC_REGMASK, arg))
+ if (put_user(apc_readb(APC_CPOWER_REG) & APC_REGMASK, arg)) {
+ unlock_kernel();
return -EFAULT;
+ }
break;
case APCIOCGBPORT:
- if (put_user(apc_readb(APC_BPORT_REG) & APC_BPMASK, arg))
+ if (put_user(apc_readb(APC_BPORT_REG) & APC_BPMASK, arg)) {
+ unlock_kernel();
return -EFAULT;
+ }
break;
case APCIOCSFANCTL:
- if (get_user(inarg, arg))
+ if (get_user(inarg, arg)) {
+ unlock_kernel();
return -EFAULT;
+ }
apc_writeb(inarg & APC_REGMASK, APC_FANCTL_REG);
break;
case APCIOCSCPWR:
- if (get_user(inarg, arg))
+ if (get_user(inarg, arg)) {
+ unlock_kernel();
return -EFAULT;
+ }
apc_writeb(inarg & APC_REGMASK, APC_CPOWER_REG);
break;
case APCIOCSBPORT:
- if (get_user(inarg, arg))
+ if (get_user(inarg, arg)) {
+ unlock_kernel();
return -EFAULT;
+ }
apc_writeb(inarg & APC_BPMASK, APC_BPORT_REG);
break;
default:
+ unlock_kernel();
return -EINVAL;
};
+ unlock_kernel();
return 0;
}
static const struct file_operations apc_fops = {
- .ioctl = apc_ioctl,
- .open = apc_open,
- .release = apc_release,
+ .unlocked_ioctl = apc_ioctl,
+ .open = apc_open,
+ .release = apc_release,
};
static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops };