From: Guenter Roeck <linux@roeck-us.net>
To: Aaron Wu <aaron.wu@analog.com>
Cc: arnd@arndb.de, f.fainelli@gmail.com, linux-arch@vger.kernel.org,
kernel@vger.kernel.org, linux-hexagon@vger.kernel.org,
liqin.linux@gmail.com, lennox.wu@gmail.com, gxt@mprc.pku.edu.cn,
viro@zeniv.linux.org.uk, jhogan@kernel.org,
linux-metag@vger.kernel.org, jonas@southpole.se,
stefan.kristiansson@saunalahti.fi, shorne@gmail.com,
openrisc@lists.librecores.org, dhowells@redhat.com,
peterz@infradead.org
Subject: Re: [Blackfin removal] [PATCH 07/28] watchdog: Remove Blackfin watchdog support
Date: Thu, 15 Mar 2018 07:43:26 -0700 [thread overview]
Message-ID: <20180315144326.GA14166@roeck-us.net> (raw)
In-Reply-To: <1521111028-19856-7-git-send-email-aaron.wu@analog.com>
On Thu, Mar 15, 2018 at 06:50:07PM +0800, Aaron Wu wrote:
> Signed-off-by: Aaron Wu <aaron.wu@analog.com>
>
> Remove Blackfin watchdog support
Signed-off statement comes last.
Anyway, wasn't this already submitted by Arnd ?
Guenter
> ---
> drivers/watchdog/Kconfig | 13 --
> drivers/watchdog/Makefile | 3 -
> drivers/watchdog/bfin_wdt.c | 476 --------------------------------------------
> 3 files changed, 492 deletions(-)
> delete mode 100644 drivers/watchdog/bfin_wdt.c
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index 37460cd..6174e99 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -815,19 +815,6 @@ config SPRD_WATCHDOG
> Say Y here to include watchdog timer supported
> by Spreadtrum system.
>
> -# BLACKFIN Architecture
> -
> -config BFIN_WDT
> - tristate "Blackfin On-Chip Watchdog Timer"
> - depends on BLACKFIN
> - ---help---
> - If you say yes here you will get support for the Blackfin On-Chip
> - Watchdog Timer. If you have one of these processors and wish to
> - have watchdog support enabled, say Y, otherwise say N.
> -
> - To compile this driver as a module, choose M here: the
> - module will be called bfin_wdt.
> -
> # CRIS Architecture
>
> # FRV Architecture
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index 0474d38..1971f86 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -91,9 +91,6 @@ obj-$(CONFIG_UNIPHIER_WATCHDOG) += uniphier_wdt.o
> obj-$(CONFIG_RTD119X_WATCHDOG) += rtd119x_wdt.o
> obj-$(CONFIG_SPRD_WATCHDOG) += sprd_wdt.o
>
> -# BLACKFIN Architecture
> -obj-$(CONFIG_BFIN_WDT) += bfin_wdt.o
> -
> # CRIS Architecture
>
> # FRV Architecture
> diff --git a/drivers/watchdog/bfin_wdt.c b/drivers/watchdog/bfin_wdt.c
> deleted file mode 100644
> index aa4d2e8..0000000
> --- a/drivers/watchdog/bfin_wdt.c
> +++ /dev/null
> @@ -1,476 +0,0 @@
> -/*
> - * Blackfin On-Chip Watchdog Driver
> - *
> - * Originally based on softdog.c
> - * Copyright 2006-2010 Analog Devices Inc.
> - * Copyright 2006-2007 Michele d'Amico
> - * Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>
> - *
> - * Enter bugs at http://blackfin.uclinux.org/
> - *
> - * Licensed under the GPL-2 or later.
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include <linux/platform_device.h>
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/types.h>
> -#include <linux/timer.h>
> -#include <linux/miscdevice.h>
> -#include <linux/watchdog.h>
> -#include <linux/fs.h>
> -#include <linux/init.h>
> -#include <linux/interrupt.h>
> -#include <linux/uaccess.h>
> -#include <asm/blackfin.h>
> -#include <asm/bfin_watchdog.h>
> -
> -#define stamp(fmt, args...) \
> - pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args)
> -#define stampit() stamp("here i am")
> -
> -#define WATCHDOG_NAME "bfin-wdt"
> -
> -/* The BF561 has two watchdogs (one per core), but since Linux
> - * only runs on core A, we'll just work with that one.
> - */
> -#ifdef BF561_FAMILY
> -# define bfin_read_WDOG_CTL() bfin_read_WDOGA_CTL()
> -# define bfin_read_WDOG_CNT() bfin_read_WDOGA_CNT()
> -# define bfin_read_WDOG_STAT() bfin_read_WDOGA_STAT()
> -# define bfin_write_WDOG_CTL(x) bfin_write_WDOGA_CTL(x)
> -# define bfin_write_WDOG_CNT(x) bfin_write_WDOGA_CNT(x)
> -# define bfin_write_WDOG_STAT(x) bfin_write_WDOGA_STAT(x)
> -#endif
> -
> -/* some defaults */
> -#define WATCHDOG_TIMEOUT 20
> -
> -static unsigned int timeout = WATCHDOG_TIMEOUT;
> -static bool nowayout = WATCHDOG_NOWAYOUT;
> -static const struct watchdog_info bfin_wdt_info;
> -static unsigned long open_check;
> -static char expect_close;
> -static DEFINE_SPINLOCK(bfin_wdt_spinlock);
> -
> -/**
> - * bfin_wdt_keepalive - Keep the Userspace Watchdog Alive
> - *
> - * The Userspace watchdog got a KeepAlive: schedule the next timeout.
> - */
> -static int bfin_wdt_keepalive(void)
> -{
> - stampit();
> - bfin_write_WDOG_STAT(0);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_stop - Stop the Watchdog
> - *
> - * Stops the on-chip watchdog.
> - */
> -static int bfin_wdt_stop(void)
> -{
> - stampit();
> - bfin_write_WDOG_CTL(WDEN_DISABLE);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_start - Start the Watchdog
> - *
> - * Starts the on-chip watchdog. Automatically loads WDOG_CNT
> - * into WDOG_STAT for us.
> - */
> -static int bfin_wdt_start(void)
> -{
> - stampit();
> - bfin_write_WDOG_CTL(WDEN_ENABLE | ICTL_RESET);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_running - Check Watchdog status
> - *
> - * See if the watchdog is running.
> - */
> -static int bfin_wdt_running(void)
> -{
> - stampit();
> - return ((bfin_read_WDOG_CTL() & WDEN_MASK) != WDEN_DISABLE);
> -}
> -
> -/**
> - * bfin_wdt_set_timeout - Set the Userspace Watchdog timeout
> - * @t: new timeout value (in seconds)
> - *
> - * Translate the specified timeout in seconds into System Clock
> - * terms which is what the on-chip Watchdog requires.
> - */
> -static int bfin_wdt_set_timeout(unsigned long t)
> -{
> - u32 cnt, max_t, sclk;
> - unsigned long flags;
> -
> - sclk = get_sclk();
> - max_t = -1 / sclk;
> - cnt = t * sclk;
> - stamp("maxtimeout=%us newtimeout=%lus (cnt=%#x)", max_t, t, cnt);
> -
> - if (t > max_t) {
> - pr_warn("timeout value is too large\n");
> - return -EINVAL;
> - }
> -
> - spin_lock_irqsave(&bfin_wdt_spinlock, flags);
> - {
> - int run = bfin_wdt_running();
> - bfin_wdt_stop();
> - bfin_write_WDOG_CNT(cnt);
> - if (run)
> - bfin_wdt_start();
> - }
> - spin_unlock_irqrestore(&bfin_wdt_spinlock, flags);
> -
> - timeout = t;
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_open - Open the Device
> - * @inode: inode of device
> - * @file: file handle of device
> - *
> - * Watchdog device is opened and started.
> - */
> -static int bfin_wdt_open(struct inode *inode, struct file *file)
> -{
> - stampit();
> -
> - if (test_and_set_bit(0, &open_check))
> - return -EBUSY;
> -
> - if (nowayout)
> - __module_get(THIS_MODULE);
> -
> - bfin_wdt_keepalive();
> - bfin_wdt_start();
> -
> - return nonseekable_open(inode, file);
> -}
> -
> -/**
> - * bfin_wdt_close - Close the Device
> - * @inode: inode of device
> - * @file: file handle of device
> - *
> - * Watchdog device is closed and stopped.
> - */
> -static int bfin_wdt_release(struct inode *inode, struct file *file)
> -{
> - stampit();
> -
> - if (expect_close == 42)
> - bfin_wdt_stop();
> - else {
> - pr_crit("Unexpected close, not stopping watchdog!\n");
> - bfin_wdt_keepalive();
> - }
> - expect_close = 0;
> - clear_bit(0, &open_check);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_write - Write to Device
> - * @file: file handle of device
> - * @buf: buffer to write
> - * @count: length of buffer
> - * @ppos: offset
> - *
> - * Pings the watchdog on write.
> - */
> -static ssize_t bfin_wdt_write(struct file *file, const char __user *data,
> - size_t len, loff_t *ppos)
> -{
> - stampit();
> -
> - if (len) {
> - if (!nowayout) {
> - size_t i;
> -
> - /* In case it was set long ago */
> - expect_close = 0;
> -
> - for (i = 0; i != len; i++) {
> - char c;
> - if (get_user(c, data + i))
> - return -EFAULT;
> - if (c == 'V')
> - expect_close = 42;
> - }
> - }
> - bfin_wdt_keepalive();
> - }
> -
> - return len;
> -}
> -
> -/**
> - * bfin_wdt_ioctl - Query Device
> - * @file: file handle of device
> - * @cmd: watchdog command
> - * @arg: argument
> - *
> - * Query basic information from the device or ping it, as outlined by the
> - * watchdog API.
> - */
> -static long bfin_wdt_ioctl(struct file *file,
> - unsigned int cmd, unsigned long arg)
> -{
> - void __user *argp = (void __user *)arg;
> - int __user *p = argp;
> -
> - stampit();
> -
> - switch (cmd) {
> - case WDIOC_GETSUPPORT:
> - if (copy_to_user(argp, &bfin_wdt_info, sizeof(bfin_wdt_info)))
> - return -EFAULT;
> - else
> - return 0;
> - case WDIOC_GETSTATUS:
> - case WDIOC_GETBOOTSTATUS:
> - return put_user(!!(_bfin_swrst & SWRST_RESET_WDOG), p);
> - case WDIOC_SETOPTIONS: {
> - unsigned long flags;
> - int options, ret = -EINVAL;
> -
> - if (get_user(options, p))
> - return -EFAULT;
> -
> - spin_lock_irqsave(&bfin_wdt_spinlock, flags);
> - if (options & WDIOS_DISABLECARD) {
> - bfin_wdt_stop();
> - ret = 0;
> - }
> - if (options & WDIOS_ENABLECARD) {
> - bfin_wdt_start();
> - ret = 0;
> - }
> - spin_unlock_irqrestore(&bfin_wdt_spinlock, flags);
> - return ret;
> - }
> - case WDIOC_KEEPALIVE:
> - bfin_wdt_keepalive();
> - return 0;
> - case WDIOC_SETTIMEOUT: {
> - int new_timeout;
> -
> - if (get_user(new_timeout, p))
> - return -EFAULT;
> - if (bfin_wdt_set_timeout(new_timeout))
> - return -EINVAL;
> - }
> - /* Fall */
> - case WDIOC_GETTIMEOUT:
> - return put_user(timeout, p);
> - default:
> - return -ENOTTY;
> - }
> -}
> -
> -#ifdef CONFIG_PM
> -static int state_before_suspend;
> -
> -/**
> - * bfin_wdt_suspend - suspend the watchdog
> - * @pdev: device being suspended
> - * @state: requested suspend state
> - *
> - * Remember if the watchdog was running and stop it.
> - * TODO: is this even right? Doesn't seem to be any
> - * standard in the watchdog world ...
> - */
> -static int bfin_wdt_suspend(struct platform_device *pdev, pm_message_t state)
> -{
> - stampit();
> -
> - state_before_suspend = bfin_wdt_running();
> - bfin_wdt_stop();
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_resume - resume the watchdog
> - * @pdev: device being resumed
> - *
> - * If the watchdog was running, turn it back on.
> - */
> -static int bfin_wdt_resume(struct platform_device *pdev)
> -{
> - stampit();
> -
> - if (state_before_suspend) {
> - bfin_wdt_set_timeout(timeout);
> - bfin_wdt_start();
> - }
> -
> - return 0;
> -}
> -#else
> -# define bfin_wdt_suspend NULL
> -# define bfin_wdt_resume NULL
> -#endif
> -
> -static const struct file_operations bfin_wdt_fops = {
> - .owner = THIS_MODULE,
> - .llseek = no_llseek,
> - .write = bfin_wdt_write,
> - .unlocked_ioctl = bfin_wdt_ioctl,
> - .open = bfin_wdt_open,
> - .release = bfin_wdt_release,
> -};
> -
> -static struct miscdevice bfin_wdt_miscdev = {
> - .minor = WATCHDOG_MINOR,
> - .name = "watchdog",
> - .fops = &bfin_wdt_fops,
> -};
> -
> -static const struct watchdog_info bfin_wdt_info = {
> - .identity = "Blackfin Watchdog",
> - .options = WDIOF_SETTIMEOUT |
> - WDIOF_KEEPALIVEPING |
> - WDIOF_MAGICCLOSE,
> -};
> -
> -/**
> - * bfin_wdt_probe - Initialize module
> - *
> - * Registers the misc device. Actual device
> - * initialization is handled by bfin_wdt_open().
> - */
> -static int bfin_wdt_probe(struct platform_device *pdev)
> -{
> - int ret;
> -
> - ret = misc_register(&bfin_wdt_miscdev);
> - if (ret) {
> - pr_err("cannot register miscdev on minor=%d (err=%d)\n",
> - WATCHDOG_MINOR, ret);
> - return ret;
> - }
> -
> - pr_info("initialized: timeout=%d sec (nowayout=%d)\n",
> - timeout, nowayout);
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_remove - Initialize module
> - *
> - * Unregisters the misc device. Actual device
> - * deinitialization is handled by bfin_wdt_close().
> - */
> -static int bfin_wdt_remove(struct platform_device *pdev)
> -{
> - misc_deregister(&bfin_wdt_miscdev);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_shutdown - Soft Shutdown Handler
> - *
> - * Handles the soft shutdown event.
> - */
> -static void bfin_wdt_shutdown(struct platform_device *pdev)
> -{
> - stampit();
> -
> - bfin_wdt_stop();
> -}
> -
> -static struct platform_device *bfin_wdt_device;
> -
> -static struct platform_driver bfin_wdt_driver = {
> - .probe = bfin_wdt_probe,
> - .remove = bfin_wdt_remove,
> - .shutdown = bfin_wdt_shutdown,
> - .suspend = bfin_wdt_suspend,
> - .resume = bfin_wdt_resume,
> - .driver = {
> - .name = WATCHDOG_NAME,
> - },
> -};
> -
> -/**
> - * bfin_wdt_init - Initialize module
> - *
> - * Checks the module params and registers the platform device & driver.
> - * Real work is in the platform probe function.
> - */
> -static int __init bfin_wdt_init(void)
> -{
> - int ret;
> -
> - stampit();
> -
> - /* Check that the timeout value is within range */
> - if (bfin_wdt_set_timeout(timeout))
> - return -EINVAL;
> -
> - /* Since this is an on-chip device and needs no board-specific
> - * resources, we'll handle all the platform device stuff here.
> - */
> - ret = platform_driver_register(&bfin_wdt_driver);
> - if (ret) {
> - pr_err("unable to register driver\n");
> - return ret;
> - }
> -
> - bfin_wdt_device = platform_device_register_simple(WATCHDOG_NAME,
> - -1, NULL, 0);
> - if (IS_ERR(bfin_wdt_device)) {
> - pr_err("unable to register device\n");
> - platform_driver_unregister(&bfin_wdt_driver);
> - return PTR_ERR(bfin_wdt_device);
> - }
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_exit - Deinitialize module
> - *
> - * Back out the platform device & driver steps. Real work is in the
> - * platform remove function.
> - */
> -static void __exit bfin_wdt_exit(void)
> -{
> - platform_device_unregister(bfin_wdt_device);
> - platform_driver_unregister(&bfin_wdt_driver);
> -}
> -
> -module_init(bfin_wdt_init);
> -module_exit(bfin_wdt_exit);
> -
> -MODULE_AUTHOR("Michele d'Amico, Mike Frysinger <vapier@gentoo.org>");
> -MODULE_DESCRIPTION("Blackfin Watchdog Device Driver");
> -MODULE_LICENSE("GPL");
> -
> -module_param(timeout, uint, 0);
> -MODULE_PARM_DESC(timeout,
> - "Watchdog timeout in seconds. (1<=timeout<=((2^32)/SCLK), default="
> - __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
> -
> -module_param(nowayout, bool, 0);
> -MODULE_PARM_DESC(nowayout,
> - "Watchdog cannot be stopped once started (default="
> - __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
> --
> 2.7.4
>
WARNING: multiple messages have this Message-ID (diff)
From: Guenter Roeck <linux@roeck-us.net>
To: openrisc@lists.librecores.org
Subject: [OpenRISC] [Blackfin removal] [PATCH 07/28] watchdog: Remove Blackfin watchdog support
Date: Thu, 15 Mar 2018 07:43:26 -0700 [thread overview]
Message-ID: <20180315144326.GA14166@roeck-us.net> (raw)
In-Reply-To: <1521111028-19856-7-git-send-email-aaron.wu@analog.com>
On Thu, Mar 15, 2018 at 06:50:07PM +0800, Aaron Wu wrote:
> Signed-off-by: Aaron Wu <aaron.wu@analog.com>
>
> Remove Blackfin watchdog support
Signed-off statement comes last.
Anyway, wasn't this already submitted by Arnd ?
Guenter
> ---
> drivers/watchdog/Kconfig | 13 --
> drivers/watchdog/Makefile | 3 -
> drivers/watchdog/bfin_wdt.c | 476 --------------------------------------------
> 3 files changed, 492 deletions(-)
> delete mode 100644 drivers/watchdog/bfin_wdt.c
>
> diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
> index 37460cd..6174e99 100644
> --- a/drivers/watchdog/Kconfig
> +++ b/drivers/watchdog/Kconfig
> @@ -815,19 +815,6 @@ config SPRD_WATCHDOG
> Say Y here to include watchdog timer supported
> by Spreadtrum system.
>
> -# BLACKFIN Architecture
> -
> -config BFIN_WDT
> - tristate "Blackfin On-Chip Watchdog Timer"
> - depends on BLACKFIN
> - ---help---
> - If you say yes here you will get support for the Blackfin On-Chip
> - Watchdog Timer. If you have one of these processors and wish to
> - have watchdog support enabled, say Y, otherwise say N.
> -
> - To compile this driver as a module, choose M here: the
> - module will be called bfin_wdt.
> -
> # CRIS Architecture
>
> # FRV Architecture
> diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
> index 0474d38..1971f86 100644
> --- a/drivers/watchdog/Makefile
> +++ b/drivers/watchdog/Makefile
> @@ -91,9 +91,6 @@ obj-$(CONFIG_UNIPHIER_WATCHDOG) += uniphier_wdt.o
> obj-$(CONFIG_RTD119X_WATCHDOG) += rtd119x_wdt.o
> obj-$(CONFIG_SPRD_WATCHDOG) += sprd_wdt.o
>
> -# BLACKFIN Architecture
> -obj-$(CONFIG_BFIN_WDT) += bfin_wdt.o
> -
> # CRIS Architecture
>
> # FRV Architecture
> diff --git a/drivers/watchdog/bfin_wdt.c b/drivers/watchdog/bfin_wdt.c
> deleted file mode 100644
> index aa4d2e8..0000000
> --- a/drivers/watchdog/bfin_wdt.c
> +++ /dev/null
> @@ -1,476 +0,0 @@
> -/*
> - * Blackfin On-Chip Watchdog Driver
> - *
> - * Originally based on softdog.c
> - * Copyright 2006-2010 Analog Devices Inc.
> - * Copyright 2006-2007 Michele d'Amico
> - * Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>
> - *
> - * Enter bugs at http://blackfin.uclinux.org/
> - *
> - * Licensed under the GPL-2 or later.
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include <linux/platform_device.h>
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/types.h>
> -#include <linux/timer.h>
> -#include <linux/miscdevice.h>
> -#include <linux/watchdog.h>
> -#include <linux/fs.h>
> -#include <linux/init.h>
> -#include <linux/interrupt.h>
> -#include <linux/uaccess.h>
> -#include <asm/blackfin.h>
> -#include <asm/bfin_watchdog.h>
> -
> -#define stamp(fmt, args...) \
> - pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args)
> -#define stampit() stamp("here i am")
> -
> -#define WATCHDOG_NAME "bfin-wdt"
> -
> -/* The BF561 has two watchdogs (one per core), but since Linux
> - * only runs on core A, we'll just work with that one.
> - */
> -#ifdef BF561_FAMILY
> -# define bfin_read_WDOG_CTL() bfin_read_WDOGA_CTL()
> -# define bfin_read_WDOG_CNT() bfin_read_WDOGA_CNT()
> -# define bfin_read_WDOG_STAT() bfin_read_WDOGA_STAT()
> -# define bfin_write_WDOG_CTL(x) bfin_write_WDOGA_CTL(x)
> -# define bfin_write_WDOG_CNT(x) bfin_write_WDOGA_CNT(x)
> -# define bfin_write_WDOG_STAT(x) bfin_write_WDOGA_STAT(x)
> -#endif
> -
> -/* some defaults */
> -#define WATCHDOG_TIMEOUT 20
> -
> -static unsigned int timeout = WATCHDOG_TIMEOUT;
> -static bool nowayout = WATCHDOG_NOWAYOUT;
> -static const struct watchdog_info bfin_wdt_info;
> -static unsigned long open_check;
> -static char expect_close;
> -static DEFINE_SPINLOCK(bfin_wdt_spinlock);
> -
> -/**
> - * bfin_wdt_keepalive - Keep the Userspace Watchdog Alive
> - *
> - * The Userspace watchdog got a KeepAlive: schedule the next timeout.
> - */
> -static int bfin_wdt_keepalive(void)
> -{
> - stampit();
> - bfin_write_WDOG_STAT(0);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_stop - Stop the Watchdog
> - *
> - * Stops the on-chip watchdog.
> - */
> -static int bfin_wdt_stop(void)
> -{
> - stampit();
> - bfin_write_WDOG_CTL(WDEN_DISABLE);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_start - Start the Watchdog
> - *
> - * Starts the on-chip watchdog. Automatically loads WDOG_CNT
> - * into WDOG_STAT for us.
> - */
> -static int bfin_wdt_start(void)
> -{
> - stampit();
> - bfin_write_WDOG_CTL(WDEN_ENABLE | ICTL_RESET);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_running - Check Watchdog status
> - *
> - * See if the watchdog is running.
> - */
> -static int bfin_wdt_running(void)
> -{
> - stampit();
> - return ((bfin_read_WDOG_CTL() & WDEN_MASK) != WDEN_DISABLE);
> -}
> -
> -/**
> - * bfin_wdt_set_timeout - Set the Userspace Watchdog timeout
> - * @t: new timeout value (in seconds)
> - *
> - * Translate the specified timeout in seconds into System Clock
> - * terms which is what the on-chip Watchdog requires.
> - */
> -static int bfin_wdt_set_timeout(unsigned long t)
> -{
> - u32 cnt, max_t, sclk;
> - unsigned long flags;
> -
> - sclk = get_sclk();
> - max_t = -1 / sclk;
> - cnt = t * sclk;
> - stamp("maxtimeout=%us newtimeout=%lus (cnt=%#x)", max_t, t, cnt);
> -
> - if (t > max_t) {
> - pr_warn("timeout value is too large\n");
> - return -EINVAL;
> - }
> -
> - spin_lock_irqsave(&bfin_wdt_spinlock, flags);
> - {
> - int run = bfin_wdt_running();
> - bfin_wdt_stop();
> - bfin_write_WDOG_CNT(cnt);
> - if (run)
> - bfin_wdt_start();
> - }
> - spin_unlock_irqrestore(&bfin_wdt_spinlock, flags);
> -
> - timeout = t;
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_open - Open the Device
> - * @inode: inode of device
> - * @file: file handle of device
> - *
> - * Watchdog device is opened and started.
> - */
> -static int bfin_wdt_open(struct inode *inode, struct file *file)
> -{
> - stampit();
> -
> - if (test_and_set_bit(0, &open_check))
> - return -EBUSY;
> -
> - if (nowayout)
> - __module_get(THIS_MODULE);
> -
> - bfin_wdt_keepalive();
> - bfin_wdt_start();
> -
> - return nonseekable_open(inode, file);
> -}
> -
> -/**
> - * bfin_wdt_close - Close the Device
> - * @inode: inode of device
> - * @file: file handle of device
> - *
> - * Watchdog device is closed and stopped.
> - */
> -static int bfin_wdt_release(struct inode *inode, struct file *file)
> -{
> - stampit();
> -
> - if (expect_close == 42)
> - bfin_wdt_stop();
> - else {
> - pr_crit("Unexpected close, not stopping watchdog!\n");
> - bfin_wdt_keepalive();
> - }
> - expect_close = 0;
> - clear_bit(0, &open_check);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_write - Write to Device
> - * @file: file handle of device
> - * @buf: buffer to write
> - * @count: length of buffer
> - * @ppos: offset
> - *
> - * Pings the watchdog on write.
> - */
> -static ssize_t bfin_wdt_write(struct file *file, const char __user *data,
> - size_t len, loff_t *ppos)
> -{
> - stampit();
> -
> - if (len) {
> - if (!nowayout) {
> - size_t i;
> -
> - /* In case it was set long ago */
> - expect_close = 0;
> -
> - for (i = 0; i != len; i++) {
> - char c;
> - if (get_user(c, data + i))
> - return -EFAULT;
> - if (c == 'V')
> - expect_close = 42;
> - }
> - }
> - bfin_wdt_keepalive();
> - }
> -
> - return len;
> -}
> -
> -/**
> - * bfin_wdt_ioctl - Query Device
> - * @file: file handle of device
> - * @cmd: watchdog command
> - * @arg: argument
> - *
> - * Query basic information from the device or ping it, as outlined by the
> - * watchdog API.
> - */
> -static long bfin_wdt_ioctl(struct file *file,
> - unsigned int cmd, unsigned long arg)
> -{
> - void __user *argp = (void __user *)arg;
> - int __user *p = argp;
> -
> - stampit();
> -
> - switch (cmd) {
> - case WDIOC_GETSUPPORT:
> - if (copy_to_user(argp, &bfin_wdt_info, sizeof(bfin_wdt_info)))
> - return -EFAULT;
> - else
> - return 0;
> - case WDIOC_GETSTATUS:
> - case WDIOC_GETBOOTSTATUS:
> - return put_user(!!(_bfin_swrst & SWRST_RESET_WDOG), p);
> - case WDIOC_SETOPTIONS: {
> - unsigned long flags;
> - int options, ret = -EINVAL;
> -
> - if (get_user(options, p))
> - return -EFAULT;
> -
> - spin_lock_irqsave(&bfin_wdt_spinlock, flags);
> - if (options & WDIOS_DISABLECARD) {
> - bfin_wdt_stop();
> - ret = 0;
> - }
> - if (options & WDIOS_ENABLECARD) {
> - bfin_wdt_start();
> - ret = 0;
> - }
> - spin_unlock_irqrestore(&bfin_wdt_spinlock, flags);
> - return ret;
> - }
> - case WDIOC_KEEPALIVE:
> - bfin_wdt_keepalive();
> - return 0;
> - case WDIOC_SETTIMEOUT: {
> - int new_timeout;
> -
> - if (get_user(new_timeout, p))
> - return -EFAULT;
> - if (bfin_wdt_set_timeout(new_timeout))
> - return -EINVAL;
> - }
> - /* Fall */
> - case WDIOC_GETTIMEOUT:
> - return put_user(timeout, p);
> - default:
> - return -ENOTTY;
> - }
> -}
> -
> -#ifdef CONFIG_PM
> -static int state_before_suspend;
> -
> -/**
> - * bfin_wdt_suspend - suspend the watchdog
> - * @pdev: device being suspended
> - * @state: requested suspend state
> - *
> - * Remember if the watchdog was running and stop it.
> - * TODO: is this even right? Doesn't seem to be any
> - * standard in the watchdog world ...
> - */
> -static int bfin_wdt_suspend(struct platform_device *pdev, pm_message_t state)
> -{
> - stampit();
> -
> - state_before_suspend = bfin_wdt_running();
> - bfin_wdt_stop();
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_resume - resume the watchdog
> - * @pdev: device being resumed
> - *
> - * If the watchdog was running, turn it back on.
> - */
> -static int bfin_wdt_resume(struct platform_device *pdev)
> -{
> - stampit();
> -
> - if (state_before_suspend) {
> - bfin_wdt_set_timeout(timeout);
> - bfin_wdt_start();
> - }
> -
> - return 0;
> -}
> -#else
> -# define bfin_wdt_suspend NULL
> -# define bfin_wdt_resume NULL
> -#endif
> -
> -static const struct file_operations bfin_wdt_fops = {
> - .owner = THIS_MODULE,
> - .llseek = no_llseek,
> - .write = bfin_wdt_write,
> - .unlocked_ioctl = bfin_wdt_ioctl,
> - .open = bfin_wdt_open,
> - .release = bfin_wdt_release,
> -};
> -
> -static struct miscdevice bfin_wdt_miscdev = {
> - .minor = WATCHDOG_MINOR,
> - .name = "watchdog",
> - .fops = &bfin_wdt_fops,
> -};
> -
> -static const struct watchdog_info bfin_wdt_info = {
> - .identity = "Blackfin Watchdog",
> - .options = WDIOF_SETTIMEOUT |
> - WDIOF_KEEPALIVEPING |
> - WDIOF_MAGICCLOSE,
> -};
> -
> -/**
> - * bfin_wdt_probe - Initialize module
> - *
> - * Registers the misc device. Actual device
> - * initialization is handled by bfin_wdt_open().
> - */
> -static int bfin_wdt_probe(struct platform_device *pdev)
> -{
> - int ret;
> -
> - ret = misc_register(&bfin_wdt_miscdev);
> - if (ret) {
> - pr_err("cannot register miscdev on minor=%d (err=%d)\n",
> - WATCHDOG_MINOR, ret);
> - return ret;
> - }
> -
> - pr_info("initialized: timeout=%d sec (nowayout=%d)\n",
> - timeout, nowayout);
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_remove - Initialize module
> - *
> - * Unregisters the misc device. Actual device
> - * deinitialization is handled by bfin_wdt_close().
> - */
> -static int bfin_wdt_remove(struct platform_device *pdev)
> -{
> - misc_deregister(&bfin_wdt_miscdev);
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_shutdown - Soft Shutdown Handler
> - *
> - * Handles the soft shutdown event.
> - */
> -static void bfin_wdt_shutdown(struct platform_device *pdev)
> -{
> - stampit();
> -
> - bfin_wdt_stop();
> -}
> -
> -static struct platform_device *bfin_wdt_device;
> -
> -static struct platform_driver bfin_wdt_driver = {
> - .probe = bfin_wdt_probe,
> - .remove = bfin_wdt_remove,
> - .shutdown = bfin_wdt_shutdown,
> - .suspend = bfin_wdt_suspend,
> - .resume = bfin_wdt_resume,
> - .driver = {
> - .name = WATCHDOG_NAME,
> - },
> -};
> -
> -/**
> - * bfin_wdt_init - Initialize module
> - *
> - * Checks the module params and registers the platform device & driver.
> - * Real work is in the platform probe function.
> - */
> -static int __init bfin_wdt_init(void)
> -{
> - int ret;
> -
> - stampit();
> -
> - /* Check that the timeout value is within range */
> - if (bfin_wdt_set_timeout(timeout))
> - return -EINVAL;
> -
> - /* Since this is an on-chip device and needs no board-specific
> - * resources, we'll handle all the platform device stuff here.
> - */
> - ret = platform_driver_register(&bfin_wdt_driver);
> - if (ret) {
> - pr_err("unable to register driver\n");
> - return ret;
> - }
> -
> - bfin_wdt_device = platform_device_register_simple(WATCHDOG_NAME,
> - -1, NULL, 0);
> - if (IS_ERR(bfin_wdt_device)) {
> - pr_err("unable to register device\n");
> - platform_driver_unregister(&bfin_wdt_driver);
> - return PTR_ERR(bfin_wdt_device);
> - }
> -
> - return 0;
> -}
> -
> -/**
> - * bfin_wdt_exit - Deinitialize module
> - *
> - * Back out the platform device & driver steps. Real work is in the
> - * platform remove function.
> - */
> -static void __exit bfin_wdt_exit(void)
> -{
> - platform_device_unregister(bfin_wdt_device);
> - platform_driver_unregister(&bfin_wdt_driver);
> -}
> -
> -module_init(bfin_wdt_init);
> -module_exit(bfin_wdt_exit);
> -
> -MODULE_AUTHOR("Michele d'Amico, Mike Frysinger <vapier@gentoo.org>");
> -MODULE_DESCRIPTION("Blackfin Watchdog Device Driver");
> -MODULE_LICENSE("GPL");
> -
> -module_param(timeout, uint, 0);
> -MODULE_PARM_DESC(timeout,
> - "Watchdog timeout in seconds. (1<=timeout<=((2^32)/SCLK), default="
> - __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
> -
> -module_param(nowayout, bool, 0);
> -MODULE_PARM_DESC(nowayout,
> - "Watchdog cannot be stopped once started (default="
> - __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
> --
> 2.7.4
>
next prev parent reply other threads:[~2018-03-15 14:43 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-15 10:50 [OpenRISC] [Blackfin removal] [PATCH 01/28] Blackfin arch: Remove Blackfin CPU arch general support Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 02/28] net: Remove Blackfin Ethernet support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 03/28] media: Remove Blackfin media support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 04/28] tty: Remove Blackfin tty and uart support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 05/28] rtc: Remove Blackfin RTC support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 06/28] mmc: Remove Blackfin SD host support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 07/28] watchdog: Remove Blackfin watchdog support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 14:43 ` Guenter Roeck [this message]
2018-03-15 14:43 ` Guenter Roeck
2018-03-15 10:50 ` [OpenRISC] [Blackfin removal] [PATCH 08/28] Asoc: Remove Blackfin ASOC support Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 09/28] input: Remove Blackfin input support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 10/28] i2c: Remove Blackfin I2C bus support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 11/28] misc: Remove Blackfin DSP echo support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 15:54 ` Arnd Bergmann
2018-03-15 16:25 ` gregkh
2018-03-15 19:27 ` David Rowe
2018-03-15 10:50 ` [OpenRISC] [Blackfin removal] [PATCH 12/28] video: Remove Blackfin video support Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 13/28] cpufreq: Remove Blackfin CPU frequency support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 14/28] mtd: Remove Blackfin MTD support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 15/28] spi: Remove Blackfin SPI bus support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 16/28] irda: Remove Blackfin IRDA support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 17/28] usb: Remove Blackfin USB support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 18/28] crypto: Remove Blackfin crypto support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 14:49 ` Arnd Bergmann
2018-03-15 14:55 ` Herbert Xu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 19/28] ata: Remove Blackfin PATA support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 20/28] pwm: Remove Blackfin PWM support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 21/28] pcmcia: Remove Blackfin PCMCIA support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 22/28] can: Remove Blackfin CAN bus support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 23/28] char: Remove Blackfin OTP support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 24/28] pinctrl: Remove Blackfin pinctrl support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 25/28] staging: Remove Blackfin iio trigger timer support Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 26/28] samples: Remove Blackfin gptimers sample code Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 27/28] documentation: Remove Blackfin documentation Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
2018-03-15 10:50 ` [Blackfin removal] [PATCH 28/28] MAINTAINERS: Remove Blackfin from MAINTAINERS list Aaron Wu
2018-03-15 10:50 ` [OpenRISC] " Aaron Wu
-- strict thread matches above, loose matches on Subject: below --
2018-03-16 7:08 [Blackfin removal] [PATCH 03/28] media: Remove Blackfin media support Aaron Wu
2018-03-16 7:08 ` [Blackfin removal] [PATCH 07/28] watchdog: Remove Blackfin watchdog support Aaron Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180315144326.GA14166@roeck-us.net \
--to=linux@roeck-us.net \
--cc=aaron.wu@analog.com \
--cc=arnd@arndb.de \
--cc=dhowells@redhat.com \
--cc=f.fainelli@gmail.com \
--cc=gxt@mprc.pku.edu.cn \
--cc=jhogan@kernel.org \
--cc=jonas@southpole.se \
--cc=kernel@vger.kernel.org \
--cc=lennox.wu@gmail.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-hexagon@vger.kernel.org \
--cc=linux-metag@vger.kernel.org \
--cc=liqin.linux@gmail.com \
--cc=openrisc@lists.librecores.org \
--cc=peterz@infradead.org \
--cc=shorne@gmail.com \
--cc=stefan.kristiansson@saunalahti.fi \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.