linux/drivers/watchdog/wdt_pci.c
<<
>>
Prefs
   1/*
   2 *      Industrial Computer Source PCI-WDT500/501 driver
   3 *
   4 *      (c) Copyright 1996-1997 Alan Cox <alan@lxorguk.ukuu.org.uk>,
   5 *                                              All Rights Reserved.
   6 *
   7 *      This program is free software; you can redistribute it and/or
   8 *      modify it under the terms of the GNU General Public License
   9 *      as published by the Free Software Foundation; either version
  10 *      2 of the License, or (at your option) any later version.
  11 *
  12 *      Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
  13 *      warranty for any of this software. This material is provided
  14 *      "AS-IS" and at no charge.
  15 *
  16 *      (c) Copyright 1995    Alan Cox <alan@lxorguk.ukuu.org.uk>
  17 *
  18 *      Release 0.10.
  19 *
  20 *      Fixes
  21 *              Dave Gregorich  :       Modularisation and minor bugs
  22 *              Alan Cox        :       Added the watchdog ioctl() stuff
  23 *              Alan Cox        :       Fixed the reboot problem (as noted by
  24 *                                      Matt Crocker).
  25 *              Alan Cox        :       Added wdt= boot option
  26 *              Alan Cox        :       Cleaned up copy/user stuff
  27 *              Tim Hockin      :       Added insmod parameters, comment cleanup
  28 *                                      Parameterized timeout
  29 *              JP Nollmann     :       Added support for PCI wdt501p
  30 *              Alan Cox        :       Split ISA and PCI cards into two drivers
  31 *              Jeff Garzik     :       PCI cleanups
  32 *              Tigran Aivazian :       Restructured wdtpci_init_one() to handle
  33 *                                      failures
  34 *              Joel Becker     :       Added WDIOC_GET/SETTIMEOUT
  35 *              Zwane Mwaikambo :       Magic char closing, locking changes,
  36 *                                      cleanups
  37 *              Matt Domsch     :       nowayout module option
  38 */
  39
  40#include <linux/interrupt.h>
  41#include <linux/module.h>
  42#include <linux/moduleparam.h>
  43#include <linux/types.h>
  44#include <linux/miscdevice.h>
  45#include <linux/watchdog.h>
  46#include <linux/ioport.h>
  47#include <linux/delay.h>
  48#include <linux/notifier.h>
  49#include <linux/reboot.h>
  50#include <linux/init.h>
  51#include <linux/fs.h>
  52#include <linux/pci.h>
  53#include <linux/io.h>
  54#include <linux/uaccess.h>
  55
  56#include <asm/system.h>
  57
  58#define WDT_IS_PCI
  59#include "wd501p.h"
  60
  61#define PFX "wdt_pci: "
  62
  63/* We can only use 1 card due to the /dev/watchdog restriction */
  64static int dev_count;
  65
  66static unsigned long open_lock;
  67static DEFINE_SPINLOCK(wdtpci_lock);
  68static char expect_close;
  69
  70static resource_size_t io;
  71static int irq;
  72
  73/* Default timeout */
  74#define WD_TIMO 60                      /* Default heartbeat = 60 seconds */
  75
  76static int heartbeat = WD_TIMO;
  77static int wd_heartbeat;
  78module_param(heartbeat, int, 0);
  79MODULE_PARM_DESC(heartbeat,
  80                "Watchdog heartbeat in seconds. (0<heartbeat<65536, default="
  81                                __MODULE_STRING(WD_TIMO) ")");
  82
  83static int nowayout = WATCHDOG_NOWAYOUT;
  84module_param(nowayout, int, 0);
  85MODULE_PARM_DESC(nowayout,
  86                "Watchdog cannot be stopped once started (default="
  87                                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
  88
  89/* Support for the Fan Tachometer on the PCI-WDT501 */
  90static int tachometer;
  91module_param(tachometer, int, 0);
  92MODULE_PARM_DESC(tachometer,
  93                "PCI-WDT501 Fan Tachometer support (0=disable, default=0)");
  94
  95static int type = 500;
  96module_param(type, int, 0);
  97MODULE_PARM_DESC(type,
  98                "PCI-WDT501 Card type (500 or 501 , default=500)");
  99
 100/*
 101 *      Programming support
 102 */
 103
 104static void wdtpci_ctr_mode(int ctr, int mode)
 105{
 106        ctr <<= 6;
 107        ctr |= 0x30;
 108        ctr |= (mode << 1);
 109        outb(ctr, WDT_CR);
 110        udelay(8);
 111}
 112
 113static void wdtpci_ctr_load(int ctr, int val)
 114{
 115        outb(val & 0xFF, WDT_COUNT0 + ctr);
 116        udelay(8);
 117        outb(val >> 8, WDT_COUNT0 + ctr);
 118        udelay(8);
 119}
 120
 121/**
 122 *      wdtpci_start:
 123 *
 124 *      Start the watchdog driver.
 125 */
 126
 127static int wdtpci_start(void)
 128{
 129        unsigned long flags;
 130
 131        spin_lock_irqsave(&wdtpci_lock, flags);
 132
 133        /*
 134         * "pet" the watchdog, as Access says.
 135         * This resets the clock outputs.
 136         */
 137        inb(WDT_DC);                    /* Disable watchdog */
 138        udelay(8);
 139        wdtpci_ctr_mode(2, 0);          /* Program CTR2 for Mode 0:
 140                                                Pulse on Terminal Count */
 141        outb(0, WDT_DC);                /* Enable watchdog */
 142        udelay(8);
 143        inb(WDT_DC);                    /* Disable watchdog */
 144        udelay(8);
 145        outb(0, WDT_CLOCK);             /* 2.0833MHz clock */
 146        udelay(8);
 147        inb(WDT_BUZZER);                /* disable */
 148        udelay(8);
 149        inb(WDT_OPTONOTRST);            /* disable */
 150        udelay(8);
 151        inb(WDT_OPTORST);               /* disable */
 152        udelay(8);
 153        inb(WDT_PROGOUT);               /* disable */
 154        udelay(8);
 155        wdtpci_ctr_mode(0, 3);          /* Program CTR0 for Mode 3:
 156                                                Square Wave Generator */
 157        wdtpci_ctr_mode(1, 2);          /* Program CTR1 for Mode 2:
 158                                                Rate Generator */
 159        wdtpci_ctr_mode(2, 1);          /* Program CTR2 for Mode 1:
 160                                                Retriggerable One-Shot */
 161        wdtpci_ctr_load(0, 20833);      /* count at 100Hz */
 162        wdtpci_ctr_load(1, wd_heartbeat);/* Heartbeat */
 163        /* DO NOT LOAD CTR2 on PCI card! -- JPN */
 164        outb(0, WDT_DC);                /* Enable watchdog */
 165        udelay(8);
 166
 167        spin_unlock_irqrestore(&wdtpci_lock, flags);
 168        return 0;
 169}
 170
 171/**
 172 *      wdtpci_stop:
 173 *
 174 *      Stop the watchdog driver.
 175 */
 176
 177static int wdtpci_stop(void)
 178{
 179        unsigned long flags;
 180
 181        /* Turn the card off */
 182        spin_lock_irqsave(&wdtpci_lock, flags);
 183        inb(WDT_DC);                    /* Disable watchdog */
 184        udelay(8);
 185        wdtpci_ctr_load(2, 0);          /* 0 length reset pulses now */
 186        spin_unlock_irqrestore(&wdtpci_lock, flags);
 187        return 0;
 188}
 189
 190/**
 191 *      wdtpci_ping:
 192 *
 193 *      Reload counter one with the watchdog heartbeat. We don't bother
 194 *      reloading the cascade counter.
 195 */
 196
 197static int wdtpci_ping(void)
 198{
 199        unsigned long flags;
 200
 201        spin_lock_irqsave(&wdtpci_lock, flags);
 202        /* Write a watchdog value */
 203        inb(WDT_DC);                    /* Disable watchdog */
 204        udelay(8);
 205        wdtpci_ctr_mode(1, 2);          /* Re-Program CTR1 for Mode 2:
 206                                                        Rate Generator */
 207        wdtpci_ctr_load(1, wd_heartbeat);/* Heartbeat */
 208        outb(0, WDT_DC);                /* Enable watchdog */
 209        udelay(8);
 210        spin_unlock_irqrestore(&wdtpci_lock, flags);
 211        return 0;
 212}
 213
 214/**
 215 *      wdtpci_set_heartbeat:
 216 *      @t:             the new heartbeat value that needs to be set.
 217 *
 218 *      Set a new heartbeat value for the watchdog device. If the heartbeat
 219 *      value is incorrect we keep the old value and return -EINVAL.
 220 *      If successful we return 0.
 221 */
 222static int wdtpci_set_heartbeat(int t)
 223{
 224        /* Arbitrary, can't find the card's limits */
 225        if (t < 1 || t > 65535)
 226                return -EINVAL;
 227
 228        heartbeat = t;
 229        wd_heartbeat = t * 100;
 230        return 0;
 231}
 232
 233/**
 234 *      wdtpci_get_status:
 235 *      @status:                the new status.
 236 *
 237 *      Extract the status information from a WDT watchdog device. There are
 238 *      several board variants so we have to know which bits are valid. Some
 239 *      bits default to one and some to zero in order to be maximally painful.
 240 *
 241 *      we then map the bits onto the status ioctl flags.
 242 */
 243
 244static int wdtpci_get_status(int *status)
 245{
 246        unsigned char new_status;
 247        unsigned long flags;
 248
 249        spin_lock_irqsave(&wdtpci_lock, flags);
 250        new_status = inb(WDT_SR);
 251        spin_unlock_irqrestore(&wdtpci_lock, flags);
 252
 253        *status = 0;
 254        if (new_status & WDC_SR_ISOI0)
 255                *status |= WDIOF_EXTERN1;
 256        if (new_status & WDC_SR_ISII1)
 257                *status |= WDIOF_EXTERN2;
 258        if (type == 501) {
 259                if (!(new_status & WDC_SR_TGOOD))
 260                        *status |= WDIOF_OVERHEAT;
 261                if (!(new_status & WDC_SR_PSUOVER))
 262                        *status |= WDIOF_POWEROVER;
 263                if (!(new_status & WDC_SR_PSUUNDR))
 264                        *status |= WDIOF_POWERUNDER;
 265                if (tachometer) {
 266                        if (!(new_status & WDC_SR_FANGOOD))
 267                                *status |= WDIOF_FANFAULT;
 268                }
 269        }
 270        return 0;
 271}
 272
 273/**
 274 *      wdtpci_get_temperature:
 275 *
 276 *      Reports the temperature in degrees Fahrenheit. The API is in
 277 *      farenheit. It was designed by an imperial measurement luddite.
 278 */
 279
 280static int wdtpci_get_temperature(int *temperature)
 281{
 282        unsigned short c;
 283        unsigned long flags;
 284        spin_lock_irqsave(&wdtpci_lock, flags);
 285        c = inb(WDT_RT);
 286        udelay(8);
 287        spin_unlock_irqrestore(&wdtpci_lock, flags);
 288        *temperature = (c * 11 / 15) + 7;
 289        return 0;
 290}
 291
 292/**
 293 *      wdtpci_interrupt:
 294 *      @irq:           Interrupt number
 295 *      @dev_id:        Unused as we don't allow multiple devices.
 296 *
 297 *      Handle an interrupt from the board. These are raised when the status
 298 *      map changes in what the board considers an interesting way. That means
 299 *      a failure condition occurring.
 300 */
 301
 302static irqreturn_t wdtpci_interrupt(int irq, void *dev_id)
 303{
 304        /*
 305         *      Read the status register see what is up and
 306         *      then printk it.
 307         */
 308        unsigned char status;
 309
 310        spin_lock(&wdtpci_lock);
 311
 312        status = inb(WDT_SR);
 313        udelay(8);
 314
 315        printk(KERN_CRIT PFX "status %d\n", status);
 316
 317        if (type == 501) {
 318                if (!(status & WDC_SR_TGOOD)) {
 319                        printk(KERN_CRIT PFX "Overheat alarm.(%d)\n",
 320                                                                inb(WDT_RT));
 321                        udelay(8);
 322                }
 323                if (!(status & WDC_SR_PSUOVER))
 324                        printk(KERN_CRIT PFX "PSU over voltage.\n");
 325                if (!(status & WDC_SR_PSUUNDR))
 326                        printk(KERN_CRIT PFX "PSU under voltage.\n");
 327                if (tachometer) {
 328                        if (!(status & WDC_SR_FANGOOD))
 329                                printk(KERN_CRIT PFX "Possible fan fault.\n");
 330                }
 331        }
 332        if (!(status & WDC_SR_WCCR)) {
 333#ifdef SOFTWARE_REBOOT
 334#ifdef ONLY_TESTING
 335                printk(KERN_CRIT PFX "Would Reboot.\n");
 336#else
 337                printk(KERN_CRIT PFX "Initiating system reboot.\n");
 338                emergency_restart(NULL);
 339#endif
 340#else
 341                printk(KERN_CRIT PFX "Reset in 5ms.\n");
 342#endif
 343        }
 344        spin_unlock(&wdtpci_lock);
 345        return IRQ_HANDLED;
 346}
 347
 348
 349/**
 350 *      wdtpci_write:
 351 *      @file: file handle to the watchdog
 352 *      @buf: buffer to write (unused as data does not matter here
 353 *      @count: count of bytes
 354 *      @ppos: pointer to the position to write. No seeks allowed
 355 *
 356 *      A write to a watchdog device is defined as a keepalive signal. Any
 357 *      write of data will do, as we we don't define content meaning.
 358 */
 359
 360static ssize_t wdtpci_write(struct file *file, const char __user *buf,
 361                                                size_t count, loff_t *ppos)
 362{
 363        if (count) {
 364                if (!nowayout) {
 365                        size_t i;
 366
 367                        /* In case it was set long ago */
 368                        expect_close = 0;
 369
 370                        for (i = 0; i != count; i++) {
 371                                char c;
 372                                if (get_user(c, buf + i))
 373                                        return -EFAULT;
 374                                if (c == 'V')
 375                                        expect_close = 42;
 376                        }
 377                }
 378                wdtpci_ping();
 379        }
 380        return count;
 381}
 382
 383/**
 384 *      wdtpci_ioctl:
 385 *      @file: file handle to the device
 386 *      @cmd: watchdog command
 387 *      @arg: argument pointer
 388 *
 389 *      The watchdog API defines a common set of functions for all watchdogs
 390 *      according to their available features. We only actually usefully support
 391 *      querying capabilities and current status.
 392 */
 393
 394static long wdtpci_ioctl(struct file *file, unsigned int cmd,
 395                                                        unsigned long arg)
 396{
 397        void __user *argp = (void __user *)arg;
 398        int __user *p = argp;
 399        int new_heartbeat;
 400        int status;
 401
 402        struct watchdog_info ident = {
 403                .options =              WDIOF_SETTIMEOUT|
 404                                        WDIOF_MAGICCLOSE|
 405                                        WDIOF_KEEPALIVEPING,
 406                .firmware_version =     1,
 407                .identity =             "PCI-WDT500/501",
 408        };
 409
 410        /* Add options according to the card we have */
 411        ident.options |= (WDIOF_EXTERN1|WDIOF_EXTERN2);
 412        if (type == 501) {
 413                ident.options |= (WDIOF_OVERHEAT|WDIOF_POWERUNDER|
 414                                                        WDIOF_POWEROVER);
 415                if (tachometer)
 416                        ident.options |= WDIOF_FANFAULT;
 417        }
 418
 419        switch (cmd) {
 420        case WDIOC_GETSUPPORT:
 421                return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
 422        case WDIOC_GETSTATUS:
 423                wdtpci_get_status(&status);
 424                return put_user(status, p);
 425        case WDIOC_GETBOOTSTATUS:
 426                return put_user(0, p);
 427        case WDIOC_KEEPALIVE:
 428                wdtpci_ping();
 429                return 0;
 430        case WDIOC_SETTIMEOUT:
 431                if (get_user(new_heartbeat, p))
 432                        return -EFAULT;
 433                if (wdtpci_set_heartbeat(new_heartbeat))
 434                        return -EINVAL;
 435                wdtpci_ping();
 436                /* Fall */
 437        case WDIOC_GETTIMEOUT:
 438                return put_user(heartbeat, p);
 439        default:
 440                return -ENOTTY;
 441        }
 442}
 443
 444/**
 445 *      wdtpci_open:
 446 *      @inode: inode of device
 447 *      @file: file handle to device
 448 *
 449 *      The watchdog device has been opened. The watchdog device is single
 450 *      open and on opening we load the counters. Counter zero is a 100Hz
 451 *      cascade, into counter 1 which downcounts to reboot. When the counter
 452 *      triggers counter 2 downcounts the length of the reset pulse which
 453 *      set set to be as long as possible.
 454 */
 455
 456static int wdtpci_open(struct inode *inode, struct file *file)
 457{
 458        if (test_and_set_bit(0, &open_lock))
 459                return -EBUSY;
 460
 461        if (nowayout)
 462                __module_get(THIS_MODULE);
 463        /*
 464         *      Activate
 465         */
 466        wdtpci_start();
 467        return nonseekable_open(inode, file);
 468}
 469
 470/**
 471 *      wdtpci_release:
 472 *      @inode: inode to board
 473 *      @file: file handle to board
 474 *
 475 *      The watchdog has a configurable API. There is a religious dispute
 476 *      between people who want their watchdog to be able to shut down and
 477 *      those who want to be sure if the watchdog manager dies the machine
 478 *      reboots. In the former case we disable the counters, in the latter
 479 *      case you have to open it again very soon.
 480 */
 481
 482static int wdtpci_release(struct inode *inode, struct file *file)
 483{
 484        if (expect_close == 42) {
 485                wdtpci_stop();
 486        } else {
 487                printk(KERN_CRIT PFX "Unexpected close, not stopping timer!");
 488                wdtpci_ping();
 489        }
 490        expect_close = 0;
 491        clear_bit(0, &open_lock);
 492        return 0;
 493}
 494
 495/**
 496 *      wdtpci_temp_read:
 497 *      @file: file handle to the watchdog board
 498 *      @buf: buffer to write 1 byte into
 499 *      @count: length of buffer
 500 *      @ptr: offset (no seek allowed)
 501 *
 502 *      Read reports the temperature in degrees Fahrenheit. The API is in
 503 *      fahrenheit. It was designed by an imperial measurement luddite.
 504 */
 505
 506static ssize_t wdtpci_temp_read(struct file *file, char __user *buf,
 507                                                size_t count, loff_t *ptr)
 508{
 509        int temperature;
 510
 511        if (wdtpci_get_temperature(&temperature))
 512                return -EFAULT;
 513
 514        if (copy_to_user(buf, &temperature, 1))
 515                return -EFAULT;
 516
 517        return 1;
 518}
 519
 520/**
 521 *      wdtpci_temp_open:
 522 *      @inode: inode of device
 523 *      @file: file handle to device
 524 *
 525 *      The temperature device has been opened.
 526 */
 527
 528static int wdtpci_temp_open(struct inode *inode, struct file *file)
 529{
 530        return nonseekable_open(inode, file);
 531}
 532
 533/**
 534 *      wdtpci_temp_release:
 535 *      @inode: inode to board
 536 *      @file: file handle to board
 537 *
 538 *      The temperature device has been closed.
 539 */
 540
 541static int wdtpci_temp_release(struct inode *inode, struct file *file)
 542{
 543        return 0;
 544}
 545
 546/**
 547 *      notify_sys:
 548 *      @this: our notifier block
 549 *      @code: the event being reported
 550 *      @unused: unused
 551 *
 552 *      Our notifier is called on system shutdowns. We want to turn the card
 553 *      off at reboot otherwise the machine will reboot again during memory
 554 *      test or worse yet during the following fsck. This would suck, in fact
 555 *      trust me - if it happens it does suck.
 556 */
 557
 558static int wdtpci_notify_sys(struct notifier_block *this, unsigned long code,
 559                                                        void *unused)
 560{
 561        if (code == SYS_DOWN || code == SYS_HALT)
 562                wdtpci_stop();
 563        return NOTIFY_DONE;
 564}
 565
 566/*
 567 *      Kernel Interfaces
 568 */
 569
 570
 571static const struct file_operations wdtpci_fops = {
 572        .owner          = THIS_MODULE,
 573        .llseek         = no_llseek,
 574        .write          = wdtpci_write,
 575        .unlocked_ioctl = wdtpci_ioctl,
 576        .open           = wdtpci_open,
 577        .release        = wdtpci_release,
 578};
 579
 580static struct miscdevice wdtpci_miscdev = {
 581        .minor  = WATCHDOG_MINOR,
 582        .name   = "watchdog",
 583        .fops   = &wdtpci_fops,
 584};
 585
 586static const struct file_operations wdtpci_temp_fops = {
 587        .owner          = THIS_MODULE,
 588        .llseek         = no_llseek,
 589        .read           = wdtpci_temp_read,
 590        .open           = wdtpci_temp_open,
 591        .release        = wdtpci_temp_release,
 592};
 593
 594static struct miscdevice temp_miscdev = {
 595        .minor  = TEMP_MINOR,
 596        .name   = "temperature",
 597        .fops   = &wdtpci_temp_fops,
 598};
 599
 600/*
 601 *      The WDT card needs to learn about soft shutdowns in order to
 602 *      turn the timebomb registers off.
 603 */
 604
 605static struct notifier_block wdtpci_notifier = {
 606        .notifier_call = wdtpci_notify_sys,
 607};
 608
 609
 610static int __devinit wdtpci_init_one(struct pci_dev *dev,
 611                                        const struct pci_device_id *ent)
 612{
 613        int ret = -EIO;
 614
 615        dev_count++;
 616        if (dev_count > 1) {
 617                printk(KERN_ERR PFX "This driver only supports one device\n");
 618                return -ENODEV;
 619        }
 620
 621        if (type != 500 && type != 501) {
 622                printk(KERN_ERR PFX "unknown card type '%d'.\n", type);
 623                return -ENODEV;
 624        }
 625
 626        if (pci_enable_device(dev)) {
 627                printk(KERN_ERR PFX "Not possible to enable PCI Device\n");
 628                return -ENODEV;
 629        }
 630
 631        if (pci_resource_start(dev, 2) == 0x0000) {
 632                printk(KERN_ERR PFX "No I/O-Address for card detected\n");
 633                ret = -ENODEV;
 634                goto out_pci;
 635        }
 636
 637        if (pci_request_region(dev, 2, "wdt_pci")) {
 638                printk(KERN_ERR PFX "I/O address 0x%llx already in use\n",
 639                        (unsigned long long)pci_resource_start(dev, 2));
 640                goto out_pci;
 641        }
 642
 643        irq = dev->irq;
 644        io = pci_resource_start(dev, 2);
 645
 646        if (request_irq(irq, wdtpci_interrupt, IRQF_DISABLED | IRQF_SHARED,
 647                         "wdt_pci", &wdtpci_miscdev)) {
 648                printk(KERN_ERR PFX "IRQ %d is not free\n", irq);
 649                goto out_reg;
 650        }
 651
 652        printk(KERN_INFO
 653         "PCI-WDT500/501 (PCI-WDG-CSM) driver 0.10 at 0x%llx (Interrupt %d)\n",
 654                                        (unsigned long long)io, irq);
 655
 656        /* Check that the heartbeat value is within its range;
 657           if not reset to the default */
 658        if (wdtpci_set_heartbeat(heartbeat)) {
 659                wdtpci_set_heartbeat(WD_TIMO);
 660                printk(KERN_INFO PFX
 661                  "heartbeat value must be 0 < heartbeat < 65536, using %d\n",
 662                                                                WD_TIMO);
 663        }
 664
 665        ret = register_reboot_notifier(&wdtpci_notifier);
 666        if (ret) {
 667                printk(KERN_ERR PFX
 668                        "cannot register reboot notifier (err=%d)\n", ret);
 669                goto out_irq;
 670        }
 671
 672        if (type == 501) {
 673                ret = misc_register(&temp_miscdev);
 674                if (ret) {
 675                        printk(KERN_ERR PFX
 676                        "cannot register miscdev on minor=%d (err=%d)\n",
 677                                                        TEMP_MINOR, ret);
 678                        goto out_rbt;
 679                }
 680        }
 681
 682        ret = misc_register(&wdtpci_miscdev);
 683        if (ret) {
 684                printk(KERN_ERR PFX
 685                        "cannot register miscdev on minor=%d (err=%d)\n",
 686                                                WATCHDOG_MINOR, ret);
 687                goto out_misc;
 688        }
 689
 690        printk(KERN_INFO PFX "initialized. heartbeat=%d sec (nowayout=%d)\n",
 691                heartbeat, nowayout);
 692        if (type == 501)
 693                printk(KERN_INFO "wdt: Fan Tachometer is %s\n",
 694                                (tachometer ? "Enabled" : "Disabled"));
 695
 696        ret = 0;
 697out:
 698        return ret;
 699
 700out_misc:
 701        if (type == 501)
 702                misc_deregister(&temp_miscdev);
 703out_rbt:
 704        unregister_reboot_notifier(&wdtpci_notifier);
 705out_irq:
 706        free_irq(irq, &wdtpci_miscdev);
 707out_reg:
 708        pci_release_region(dev, 2);
 709out_pci:
 710        pci_disable_device(dev);
 711        goto out;
 712}
 713
 714
 715static void __devexit wdtpci_remove_one(struct pci_dev *pdev)
 716{
 717        /* here we assume only one device will ever have
 718         * been picked up and registered by probe function */
 719        misc_deregister(&wdtpci_miscdev);
 720        if (type == 501)
 721                misc_deregister(&temp_miscdev);
 722        unregister_reboot_notifier(&wdtpci_notifier);
 723        free_irq(irq, &wdtpci_miscdev);
 724        pci_release_region(pdev, 2);
 725        pci_disable_device(pdev);
 726        dev_count--;
 727}
 728
 729
 730static struct pci_device_id wdtpci_pci_tbl[] = {
 731        {
 732                .vendor    = PCI_VENDOR_ID_ACCESSIO,
 733                .device    = PCI_DEVICE_ID_ACCESSIO_WDG_CSM,
 734                .subvendor = PCI_ANY_ID,
 735                .subdevice = PCI_ANY_ID,
 736        },
 737        { 0, }, /* terminate list */
 738};
 739MODULE_DEVICE_TABLE(pci, wdtpci_pci_tbl);
 740
 741
 742static struct pci_driver wdtpci_driver = {
 743        .name           = "wdt_pci",
 744        .id_table       = wdtpci_pci_tbl,
 745        .probe          = wdtpci_init_one,
 746        .remove         = __devexit_p(wdtpci_remove_one),
 747};
 748
 749
 750/**
 751 *      wdtpci_cleanup:
 752 *
 753 *      Unload the watchdog. You cannot do this with any file handles open.
 754 *      If your watchdog is set to continue ticking on close and you unload
 755 *      it, well it keeps ticking. We won't get the interrupt but the board
 756 *      will not touch PC memory so all is fine. You just have to load a new
 757 *      module in xx seconds or reboot.
 758 */
 759
 760static void __exit wdtpci_cleanup(void)
 761{
 762        pci_unregister_driver(&wdtpci_driver);
 763}
 764
 765
 766/**
 767 *      wdtpci_init:
 768 *
 769 *      Set up the WDT watchdog board. All we have to do is grab the
 770 *      resources we require and bitch if anyone beat us to them.
 771 *      The open() function will actually kick the board off.
 772 */
 773
 774static int __init wdtpci_init(void)
 775{
 776        return pci_register_driver(&wdtpci_driver);
 777}
 778
 779
 780module_init(wdtpci_init);
 781module_exit(wdtpci_cleanup);
 782
 783MODULE_AUTHOR("JP Nollmann, Alan Cox");
 784MODULE_DESCRIPTION("Driver for the ICS PCI-WDT500/501 watchdog cards");
 785MODULE_LICENSE("GPL");
 786MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
 787MODULE_ALIAS_MISCDEV(TEMP_MINOR);
 788