mirror of https://github.com/hak5/openwrt-owl.git
151 lines
4.5 KiB
Diff
151 lines
4.5 KiB
Diff
The RDC321x MFD southbridge driver will pass a reference to the southbridge
|
|
PCI device which should be used by the watchdog driver for its operations.
|
|
This patch converts the watchdog driver to use the pci_dev pointer and make use
|
|
of the base register resource which is passed along with the platform device.
|
|
|
|
Acked-by: Wim Van Sebroeck <wim@iguana.be>
|
|
Signed-off-by: Florian Fainelli <florian@openwrt.org>
|
|
---
|
|
Changes from v2:
|
|
- replaced rdc321x_pci_{read,write}
|
|
- use the pci_dev pointer passed as platform_data
|
|
|
|
Index: linux-2.6.32.10/drivers/watchdog/rdc321x_wdt.c
|
|
===================================================================
|
|
--- linux-2.6.32.10.orig/drivers/watchdog/rdc321x_wdt.c 2010-05-15 22:14:28.000000000 +0200
|
|
+++ linux-2.6.32.10/drivers/watchdog/rdc321x_wdt.c 2010-05-15 22:15:24.000000000 +0200
|
|
@@ -1,7 +1,7 @@
|
|
/*
|
|
* RDC321x watchdog driver
|
|
*
|
|
- * Copyright (C) 2007 Florian Fainelli <florian@openwrt.org>
|
|
+ * Copyright (C) 2007-2010 Florian Fainelli <florian@openwrt.org>
|
|
*
|
|
* This driver is highly inspired from the cpu5_wdt driver
|
|
*
|
|
@@ -36,8 +36,7 @@
|
|
#include <linux/watchdog.h>
|
|
#include <linux/io.h>
|
|
#include <linux/uaccess.h>
|
|
-
|
|
-#include <asm/rdc321x_defs.h>
|
|
+#include <linux/mfd/rdc321x.h>
|
|
|
|
#define RDC_WDT_MASK 0x80000000 /* Mask */
|
|
#define RDC_WDT_EN 0x00800000 /* Enable bit */
|
|
@@ -63,6 +62,8 @@
|
|
int default_ticks;
|
|
unsigned long inuse;
|
|
spinlock_t lock;
|
|
+ struct pci_dev *sb_pdev;
|
|
+ int base_reg;
|
|
} rdc321x_wdt_device;
|
|
|
|
/* generic helper functions */
|
|
@@ -70,14 +71,18 @@
|
|
static void rdc321x_wdt_trigger(unsigned long unused)
|
|
{
|
|
unsigned long flags;
|
|
+ u32 val;
|
|
|
|
if (rdc321x_wdt_device.running)
|
|
ticks--;
|
|
|
|
/* keep watchdog alive */
|
|
spin_lock_irqsave(&rdc321x_wdt_device.lock, flags);
|
|
- outl(RDC_WDT_EN | inl(RDC3210_CFGREG_DATA),
|
|
- RDC3210_CFGREG_DATA);
|
|
+ pci_read_config_dword(rdc321x_wdt_device.sb_pdev,
|
|
+ rdc321x_wdt_device.base_reg, &val);
|
|
+ val |= RDC_WDT_EN;
|
|
+ pci_write_config_dword(rdc321x_wdt_device.sb_pdev,
|
|
+ rdc321x_wdt_device.base_reg, val);
|
|
spin_unlock_irqrestore(&rdc321x_wdt_device.lock, flags);
|
|
|
|
/* requeue?? */
|
|
@@ -105,10 +110,13 @@
|
|
|
|
/* Clear the timer */
|
|
spin_lock_irqsave(&rdc321x_wdt_device.lock, flags);
|
|
- outl(RDC_CLS_TMR, RDC3210_CFGREG_ADDR);
|
|
+ pci_write_config_dword(rdc321x_wdt_device.sb_pdev,
|
|
+ rdc321x_wdt_device.base_reg, RDC_CLS_TMR);
|
|
|
|
/* Enable watchdog and set the timeout to 81.92 us */
|
|
- outl(RDC_WDT_EN | RDC_WDT_CNT, RDC3210_CFGREG_DATA);
|
|
+ pci_write_config_dword(rdc321x_wdt_device.sb_pdev,
|
|
+ rdc321x_wdt_device.base_reg,
|
|
+ RDC_WDT_EN | RDC_WDT_CNT);
|
|
spin_unlock_irqrestore(&rdc321x_wdt_device.lock, flags);
|
|
|
|
mod_timer(&rdc321x_wdt_device.timer,
|
|
@@ -148,7 +156,7 @@
|
|
unsigned long arg)
|
|
{
|
|
void __user *argp = (void __user *)arg;
|
|
- unsigned int value;
|
|
+ u32 value;
|
|
static struct watchdog_info ident = {
|
|
.options = WDIOF_CARDRESET,
|
|
.identity = "RDC321x WDT",
|
|
@@ -162,9 +170,10 @@
|
|
case WDIOC_GETSTATUS:
|
|
/* Read the value from the DATA register */
|
|
spin_lock_irqsave(&rdc321x_wdt_device.lock, flags);
|
|
- value = inl(RDC3210_CFGREG_DATA);
|
|
+ pci_read_config_dword(rdc321x_wdt_device.sb_pdev,
|
|
+ rdc321x_wdt_device.base_reg, &value);
|
|
spin_unlock_irqrestore(&rdc321x_wdt_device.lock, flags);
|
|
- if (copy_to_user(argp, &value, sizeof(int)))
|
|
+ if (copy_to_user(argp, &value, sizeof(u32)))
|
|
return -EFAULT;
|
|
break;
|
|
case WDIOC_GETSUPPORT:
|
|
@@ -219,17 +228,35 @@
|
|
static int __devinit rdc321x_wdt_probe(struct platform_device *pdev)
|
|
{
|
|
int err;
|
|
+ struct resource *r;
|
|
+ struct rdc321x_wdt_pdata *pdata;
|
|
+
|
|
+ pdata = platform_get_drvdata(pdev);
|
|
+ if (!pdata) {
|
|
+ dev_err(&pdev->dev, "no platform data supplied\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ r = platform_get_resource_byname(pdev, IORESOURCE_IO, "wdt-reg");
|
|
+ if (!r) {
|
|
+ dev_err(&pdev->dev, "failed to get wdt-reg resource\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ rdc321x_wdt_device.sb_pdev = pdata->sb_pdev;
|
|
+ rdc321x_wdt_device.base_reg = r->start;
|
|
|
|
err = misc_register(&rdc321x_wdt_misc);
|
|
if (err < 0) {
|
|
- printk(KERN_ERR PFX "watchdog misc_register failed\n");
|
|
+ dev_err(&pdev->dev, "misc_register failed\n");
|
|
return err;
|
|
}
|
|
|
|
spin_lock_init(&rdc321x_wdt_device.lock);
|
|
|
|
/* Reset the watchdog */
|
|
- outl(RDC_WDT_RST, RDC3210_CFGREG_DATA);
|
|
+ pci_write_config_dword(rdc321x_wdt_device.sb_pdev,
|
|
+ rdc321x_wdt_device.base_reg, RDC_WDT_RST);
|
|
|
|
init_completion(&rdc321x_wdt_device.stop);
|
|
rdc321x_wdt_device.queue = 0;
|
|
@@ -240,7 +267,7 @@
|
|
|
|
rdc321x_wdt_device.default_ticks = ticks;
|
|
|
|
- printk(KERN_INFO PFX "watchdog init success\n");
|
|
+ dev_info(&pdev->dev, "watchdog init success\n");
|
|
|
|
return 0;
|
|
}
|