source: trunk/target/linux/atheros/patches-2.6.37/130-watchdog.patch @ 25914

Last change on this file since 25914 was 25914, checked in by nbd, 5 years ago

atheros: add gpio_set_debounce(), refresh patches

File size: 5.6 KB
  • new file drivers/watchdog/ar2315-wtd.c

    - +  
     1/* 
     2 * This program is free software; you can redistribute it and/or modify 
     3 * it under the terms of the GNU General Public License as published by 
     4 * the Free Software Foundation; either version 2 of the License, or 
     5 * (at your option) any later version. 
     6 * 
     7 * This program is distributed in the hope that it will be useful, 
     8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
     9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     10 * GNU General Public License for more details. 
     11 * 
     12 * You should have received a copy of the GNU General Public License 
     13 * along with this program; if not, write to the Free Software 
     14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
     15 * 
     16 * Copyright (C) 2008 John Crispin <blogic@openwrt.org> 
     17 * Based on EP93xx and ifxmips wdt driver 
     18 */ 
     19 
     20#include <linux/interrupt.h> 
     21#include <linux/module.h> 
     22#include <linux/moduleparam.h> 
     23#include <linux/types.h> 
     24#include <linux/miscdevice.h> 
     25#include <linux/watchdog.h> 
     26#include <linux/fs.h> 
     27#include <linux/ioport.h> 
     28#include <linux/notifier.h> 
     29#include <linux/reboot.h> 
     30#include <linux/init.h> 
     31#include <linux/platform_device.h> 
     32 
     33#include <asm/io.h> 
     34#include <asm/uaccess.h> 
     35#include <asm/system.h> 
     36#include <asm/addrspace.h> 
     37#include <ar231x_platform.h> 
     38#include <ar2315_regs.h> 
     39#include <ar231x.h> 
     40 
     41#define CLOCK_RATE 40000000 
     42#define HEARTBEAT(x) (x < 1 || x > 90)?(20):(x) 
     43 
     44static int wdt_timeout = 20; 
     45static int started = 0; 
     46static int in_use = 0; 
     47 
     48static void 
     49ar2315_wdt_enable(void) 
     50{ 
     51        ar231x_write_reg(AR2315_WD, wdt_timeout * CLOCK_RATE); 
     52        ar231x_write_reg(AR2315_ISR, 0x80); 
     53} 
     54 
     55static ssize_t 
     56ar2315_wdt_write(struct file *file, const char __user *data, size_t len, loff_t *ppos) 
     57{ 
     58        if(len) 
     59                ar2315_wdt_enable(); 
     60        return len; 
     61} 
     62 
     63static int 
     64ar2315_wdt_open(struct inode *inode, struct file *file) 
     65{ 
     66        if(in_use) 
     67                return -EBUSY; 
     68        ar2315_wdt_enable(); 
     69        in_use = started = 1; 
     70        return nonseekable_open(inode, file); 
     71} 
     72 
     73static int 
     74ar2315_wdt_release(struct inode *inode, struct file *file) 
     75{ 
     76        in_use = 0; 
     77        return 0; 
     78} 
     79 
     80static irqreturn_t 
     81ar2315_wdt_interrupt(int irq, void *dev_id) 
     82{ 
     83        if(started) 
     84        { 
     85                printk(KERN_CRIT "watchdog expired, rebooting system\n"); 
     86                emergency_restart(); 
     87        } else { 
     88                ar231x_write_reg(AR2315_WDC, 0); 
     89                ar231x_write_reg(AR2315_WD, 0); 
     90                ar231x_write_reg(AR2315_ISR, 0x80); 
     91        } 
     92        return IRQ_HANDLED; 
     93} 
     94 
     95static struct watchdog_info ident = { 
     96        .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, 
     97        .identity = "ar2315 Watchdog", 
     98}; 
     99 
     100static int 
     101ar2315_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 
     102{ 
     103        int new_wdt_timeout; 
     104        int ret = -ENOIOCTLCMD; 
     105 
     106        switch(cmd) 
     107        { 
     108                case WDIOC_GETSUPPORT: 
     109                        ret = copy_to_user((struct watchdog_info __user *)arg, &ident, sizeof(ident)) ? -EFAULT : 0; 
     110                        break; 
     111 
     112                case WDIOC_KEEPALIVE: 
     113                        ar2315_wdt_enable(); 
     114                        ret = 0; 
     115                        break; 
     116 
     117                case WDIOC_SETTIMEOUT: 
     118                        if((ret = get_user(new_wdt_timeout, (int __user *)arg))) 
     119                                break; 
     120                        wdt_timeout = HEARTBEAT(new_wdt_timeout); 
     121                        ar2315_wdt_enable(); 
     122                        break; 
     123 
     124                case WDIOC_GETTIMEOUT: 
     125                        ret = put_user(wdt_timeout, (int __user *)arg); 
     126                        break; 
     127        } 
     128        return ret; 
     129} 
     130 
     131static struct file_operations ar2315_wdt_fops = { 
     132        .owner          = THIS_MODULE, 
     133        .llseek         = no_llseek, 
     134        .write          = ar2315_wdt_write, 
     135        .ioctl          = ar2315_wdt_ioctl, 
     136        .open           = ar2315_wdt_open, 
     137        .release        = ar2315_wdt_release, 
     138}; 
     139 
     140static struct miscdevice ar2315_wdt_miscdev = { 
     141        .minor  = WATCHDOG_MINOR, 
     142        .name   = "watchdog", 
     143        .fops   = &ar2315_wdt_fops, 
     144}; 
     145 
     146static int 
     147ar2315_wdt_probe(struct platform_device *dev) 
     148{ 
     149        int ret = 0; 
     150 
     151        ar2315_wdt_enable(); 
     152        ret = request_irq(AR531X_MISC_IRQ_WATCHDOG, ar2315_wdt_interrupt, IRQF_DISABLED, "ar2315_wdt", NULL); 
     153        if(ret) 
     154        { 
     155                printk(KERN_ERR "ar2315wdt: failed to register inetrrupt\n"); 
     156                goto out; 
     157        } 
     158 
     159        ret = misc_register(&ar2315_wdt_miscdev); 
     160        if(ret) 
     161                printk(KERN_ERR "ar2315wdt: failed to register miscdev\n"); 
     162 
     163out: 
     164        return ret; 
     165} 
     166 
     167static int 
     168ar2315_wdt_remove(struct platform_device *dev) 
     169{ 
     170        misc_deregister(&ar2315_wdt_miscdev); 
     171        free_irq(AR531X_MISC_IRQ_WATCHDOG, NULL); 
     172        return 0; 
     173} 
     174 
     175static struct platform_driver ar2315_wdt_driver = { 
     176        .probe = ar2315_wdt_probe, 
     177        .remove = ar2315_wdt_remove, 
     178        .driver = { 
     179                .name = "ar2315_wdt", 
     180                .owner = THIS_MODULE, 
     181        }, 
     182}; 
     183 
     184static int __init 
     185init_ar2315_wdt(void) 
     186{ 
     187        int ret = platform_driver_register(&ar2315_wdt_driver); 
     188        if(ret) 
     189                printk(KERN_INFO "ar2315_wdt: error registering platfom driver!"); 
     190        return ret; 
     191} 
     192 
     193static void __exit 
     194exit_ar2315_wdt(void) 
     195{ 
     196        platform_driver_unregister(&ar2315_wdt_driver); 
     197} 
     198 
     199module_init(init_ar2315_wdt); 
     200module_exit(exit_ar2315_wdt); 
  • drivers/watchdog/Kconfig

    a b config BCM63XX_WDT 
    930930          To compile this driver as a loadable module, choose M here. 
    931931          The module will be called bcm63xx_wdt. 
    932932 
     933config ATHEROS_WDT 
     934        tristate "Atheros wisoc Watchdog Timer" 
     935        depends on ATHEROS_AR231X 
     936        help 
     937          Hardware driver for the Atheros wisoc Watchdog Timer. 
     938 
    933939# PARISC Architecture 
    934940 
    935941# POWERPC Architecture 
  • drivers/watchdog/Makefile

    a b obj-$(CONFIG_WDT_MTX1) += mtx-1_wdt.o 
    116116obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt.o 
    117117obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o 
    118118obj-$(CONFIG_AR7_WDT) += ar7_wdt.o 
     119obj-$(CONFIG_ATHEROS_WDT) += ar2315-wtd.o 
    119120obj-$(CONFIG_TXX9_WDT) += txx9wdt.o 
    120121obj-$(CONFIG_OCTEON_WDT) += octeon-wdt.o 
    121122octeon-wdt-y := octeon-wdt-main.o octeon-wdt-nmi.o 
Note: See TracBrowser for help on using the repository browser.