Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed78c2da authored by Alan Cox's avatar Alan Cox Committed by Wim Van Sebroeck
Browse files

[WATCHDOG 28/57] mtx-1_wdt: clean up, coding style, unlocked ioctl



Review and switch to unlocked_ioctl

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent 83ab1a53
Loading
Loading
Loading
Loading
+52 −55
Original line number Diff line number Diff line
/*
 *      Driver for the MTX-1 Watchdog.
 *
 *      (C) Copyright 2005 4G Systems <info@4g-systems.biz>, All Rights Reserved.
 *      (C) Copyright 2005 4G Systems <info@4g-systems.biz>,
 *							All Rights Reserved.
 *                              http://www.4g-systems.biz
 *
 * 	(C) Copyright 2007 OpenWrt.org, Florian Fainelli <florian@openwrt.org>
@@ -46,12 +47,11 @@
#include <linux/jiffies.h>
#include <linux/watchdog.h>
#include <linux/platform_device.h>

#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/gpio.h>

#include <asm/mach-au1x00/au1000.h>
#include <asm/gpio.h>

#define MTX1_WDT_INTERVAL	(5 * HZ)

@@ -59,6 +59,7 @@ static int ticks = 100 * HZ;

static struct {
	struct completion stop;
	spinlock_t lock;
	int running;
	struct timer_list timer;
	int queue;
@@ -71,6 +72,7 @@ static void mtx1_wdt_trigger(unsigned long unused)
{
	u32 tmp;

	spin_lock(&mtx1_wdt_device.lock);
	if (mtx1_wdt_device.running)
		ticks--;
	/*
@@ -83,9 +85,9 @@ static void mtx1_wdt_trigger(unsigned long unused)

	if (mtx1_wdt_device.queue && ticks)
		mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL);
	else {
	else
		complete(&mtx1_wdt_device.stop);
	}
	spin_unlock(&mtx1_wdt_device.lock);
}

static void mtx1_wdt_reset(void)
@@ -96,23 +98,25 @@ static void mtx1_wdt_reset(void)

static void mtx1_wdt_start(void)
{
	spin_lock_irqsave(&mtx1_wdt_device.lock, flags);
	if (!mtx1_wdt_device.queue) {
		mtx1_wdt_device.queue = 1;
		gpio_set_value(mtx1_wdt_device.gpio, 1);
		mod_timer(&mtx1_wdt_device.timer, jiffies + MTX1_WDT_INTERVAL);
	}
	mtx1_wdt_device.running++;
	spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags);
}

static int mtx1_wdt_stop(void)
{
	spin_lock_irqsave(&mtx1_wdt_device.lock, flags);
	if (mtx1_wdt_device.queue) {
		mtx1_wdt_device.queue = 0;
		gpio_set_value(mtx1_wdt_device.gpio, 0);
	}

	ticks = mtx1_wdt_device.default_ticks;

	spin_unlock_irqrestore(&mtx1_wdt_device.lock, flags);
	return 0;
}

@@ -122,7 +126,6 @@ static int mtx1_wdt_open(struct inode *inode, struct file *file)
{
	if (test_and_set_bit(0, &mtx1_wdt_device.inuse))
		return -EBUSY;

	return nonseekable_open(inode, file);
}

@@ -133,12 +136,13 @@ static int mtx1_wdt_release(struct inode *inode, struct file *file)
	return 0;
}

static int mtx1_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
static long mtx1_wdt_ioctl(struct file *file, unsigned int cmd,
							unsigned long arg)
{
	void __user *argp = (void __user *)arg;
	int __user *p = (int __user *)argp;
	unsigned int value;
	static struct watchdog_info ident =
	{
	static const struct watchdog_info ident = {
		.options = WDIOF_CARDRESET,
		.identity = "MTX-1 WDT",
	};
@@ -149,26 +153,22 @@ static int mtx1_wdt_ioctl(struct inode *inode, struct file *file, unsigned int c
		break;
	case WDIOC_GETSTATUS:
	case WDIOC_GETBOOTSTATUS:
			if ( copy_to_user(argp, &value, sizeof(int)) )
				return -EFAULT;
		put_user(0, p);
		break;
	case WDIOC_GETSUPPORT:
		if (copy_to_user(argp, &ident, sizeof(ident)))
			return -EFAULT;
		break;
	case WDIOC_SETOPTIONS:
			if ( copy_from_user(&value, argp, sizeof(int)) )
		if (get_user(value, p))
			return -EFAULT;
			switch(value) {
				case WDIOS_ENABLECARD:
		if (value & WDIOS_ENABLECARD)
			mtx1_wdt_start();
					break;
				case WDIOS_DISABLECARD:
					return mtx1_wdt_stop();
				default:
		else if (value & WDIOS_DISABLECARD)
			mtx1_wdt_stop();
		else
			return -EINVAL;
			}
			break;
		return 0;
	default:
		return -ENOTTY;
	}
@@ -176,11 +176,11 @@ static int mtx1_wdt_ioctl(struct inode *inode, struct file *file, unsigned int c
}


static ssize_t mtx1_wdt_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
static ssize_t mtx1_wdt_write(struct file *file, const char *buf,
						size_t count, loff_t *ppos)
{
	if (!count)
		return -EIO;

	mtx1_wdt_reset();
	return count;
}
@@ -188,7 +188,7 @@ static ssize_t mtx1_wdt_write(struct file *file, const char *buf, size_t count,
static const struct file_operations mtx1_wdt_fops = {
	.owner 		= THIS_MODULE,
	.llseek		= no_llseek,
	.ioctl		= mtx1_wdt_ioctl,
	.unlocked_ioctl	= mtx1_wdt_ioctl,
	.open 		= mtx1_wdt_open,
	.write 		= mtx1_wdt_write,
	.release 	= mtx1_wdt_release
@@ -208,29 +208,26 @@ static int mtx1_wdt_probe(struct platform_device *pdev)

	mtx1_wdt_device.gpio = pdev->resource[0].start;

	if ((ret = misc_register(&mtx1_wdt_misc)) < 0) {
		printk(KERN_ERR " mtx-1_wdt : failed to register\n");
		return ret;
	}

	spin_lock_init(&mtx1_wdt_device.lock);
	init_completion(&mtx1_wdt_device.stop);
	mtx1_wdt_device.queue = 0;

	clear_bit(0, &mtx1_wdt_device.inuse);

	setup_timer(&mtx1_wdt_device.timer, mtx1_wdt_trigger, 0L);

	mtx1_wdt_device.default_ticks = ticks;

	ret = misc_register(&mtx1_wdt_misc);
	if (ret < 0) {
		printk(KERN_ERR " mtx-1_wdt : failed to register\n");
		return ret;
	}
	mtx1_wdt_start();

	printk(KERN_INFO "MTX-1 Watchdog driver\n");

	return 0;
}

static int mtx1_wdt_remove(struct platform_device *pdev)
{
	/* FIXME: do we need to lock this test ? */
	if (mtx1_wdt_device.queue) {
		mtx1_wdt_device.queue = 0;
		wait_for_completion(&mtx1_wdt_device.stop);