]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
watchdog: iTCO: Drop driver-internal locking
authorGuenter Roeck <linux@roeck-us.net>
Sat, 17 May 2025 16:09:36 +0000 (09:09 -0700)
committerWim Van Sebroeck <wim@linux-watchdog.org>
Sun, 1 Jun 2025 11:16:25 +0000 (13:16 +0200)
The locking code in the iTCO watchdog driver has been carried along from
before the watchdog core existed. The watchdog core protects calls into
drivers since commit f4e9c82f64b5 ("watchdog: Add Locking support"),
making driver-internal locking unnecessary. Drop it.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Wim Van Sebroeck <wim@linux-watchdog.org>
Link: https://lore.kernel.org/r/20250517160936.3231017-1-linux@roeck-us.net
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
drivers/watchdog/iTCO_wdt.c

index 7672582fa407649285e78c26d46b188b8f24e0c4..30a8d72d84fa46215d32705d17008da4556db575 100644 (file)
@@ -58,7 +58,6 @@
 #include <linux/platform_device.h>     /* For platform_driver framework */
 #include <linux/pci.h>                 /* For pci functions */
 #include <linux/ioport.h>              /* For io-port access */
-#include <linux/spinlock.h>            /* For spin_lock/spin_unlock/... */
 #include <linux/uaccess.h>             /* For copy_to_user/put_user/... */
 #include <linux/io.h>                  /* For inb/outb/... */
 #include <linux/platform_data/itco_wdt.h>
@@ -102,8 +101,6 @@ struct iTCO_wdt_private {
         * or memory-mapped PMC register bit 4 (TCO version 3).
         */
        unsigned long __iomem *gcs_pmc;
-       /* the lock for io operations */
-       spinlock_t io_lock;
        /* the PCI-device */
        struct pci_dev *pci_dev;
        /* whether or not the watchdog has been suspended */
@@ -286,13 +283,10 @@ static int iTCO_wdt_start(struct watchdog_device *wd_dev)
        struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev);
        unsigned int val;
 
-       spin_lock(&p->io_lock);
-
        iTCO_vendor_pre_start(p->smi_res, wd_dev->timeout);
 
        /* disable chipset's NO_REBOOT bit */
        if (p->update_no_reboot_bit(p->no_reboot_priv, false)) {
-               spin_unlock(&p->io_lock);
                dev_err(wd_dev->parent, "failed to reset NO_REBOOT flag, reboot disabled by hardware/BIOS\n");
                return -EIO;
        }
@@ -309,7 +303,6 @@ static int iTCO_wdt_start(struct watchdog_device *wd_dev)
        val &= 0xf7ff;
        outw(val, TCO1_CNT(p));
        val = inw(TCO1_CNT(p));
-       spin_unlock(&p->io_lock);
 
        if (val & 0x0800)
                return -1;
@@ -321,8 +314,6 @@ static int iTCO_wdt_stop(struct watchdog_device *wd_dev)
        struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev);
        unsigned int val;
 
-       spin_lock(&p->io_lock);
-
        iTCO_vendor_pre_stop(p->smi_res);
 
        /* Bit 11: TCO Timer Halt -> 1 = The TCO timer is disabled */
@@ -334,8 +325,6 @@ static int iTCO_wdt_stop(struct watchdog_device *wd_dev)
        /* Set the NO_REBOOT bit to prevent later reboots, just for sure */
        p->update_no_reboot_bit(p->no_reboot_priv, true);
 
-       spin_unlock(&p->io_lock);
-
        if ((val & 0x0800) == 0)
                return -1;
        return 0;
@@ -345,8 +334,6 @@ static int iTCO_wdt_ping(struct watchdog_device *wd_dev)
 {
        struct iTCO_wdt_private *p = watchdog_get_drvdata(wd_dev);
 
-       spin_lock(&p->io_lock);
-
        /* Reload the timer by writing to the TCO Timer Counter register */
        if (p->iTCO_version >= 2) {
                outw(0x01, TCO_RLD(p));
@@ -358,7 +345,6 @@ static int iTCO_wdt_ping(struct watchdog_device *wd_dev)
                outb(0x01, TCO_RLD(p));
        }
 
-       spin_unlock(&p->io_lock);
        return 0;
 }
 
@@ -385,24 +371,20 @@ static int iTCO_wdt_set_timeout(struct watchdog_device *wd_dev, unsigned int t)
 
        /* Write new heartbeat to watchdog */
        if (p->iTCO_version >= 2) {
-               spin_lock(&p->io_lock);
                val16 = inw(TCOv2_TMR(p));
                val16 &= 0xfc00;
                val16 |= tmrval;
                outw(val16, TCOv2_TMR(p));
                val16 = inw(TCOv2_TMR(p));
-               spin_unlock(&p->io_lock);
 
                if ((val16 & 0x3ff) != tmrval)
                        return -EINVAL;
        } else if (p->iTCO_version == 1) {
-               spin_lock(&p->io_lock);
                val8 = inb(TCOv1_TMR(p));
                val8 &= 0xc0;
                val8 |= (tmrval & 0xff);
                outb(val8, TCOv1_TMR(p));
                val8 = inb(TCOv1_TMR(p));
-               spin_unlock(&p->io_lock);
 
                if ((val8 & 0x3f) != tmrval)
                        return -EINVAL;
@@ -421,19 +403,15 @@ static unsigned int iTCO_wdt_get_timeleft(struct watchdog_device *wd_dev)
 
        /* read the TCO Timer */
        if (p->iTCO_version >= 2) {
-               spin_lock(&p->io_lock);
                val16 = inw(TCO_RLD(p));
                val16 &= 0x3ff;
-               spin_unlock(&p->io_lock);
 
                time_left = ticks_to_seconds(p, val16);
        } else if (p->iTCO_version == 1) {
-               spin_lock(&p->io_lock);
                val8 = inb(TCO_RLD(p));
                val8 &= 0x3f;
                if (!(inw(TCO1_STS(p)) & 0x0008))
                        val8 += (inb(TCOv1_TMR(p)) & 0x3f);
-               spin_unlock(&p->io_lock);
 
                time_left = ticks_to_seconds(p, val8);
        }
@@ -493,8 +471,6 @@ static int iTCO_wdt_probe(struct platform_device *pdev)
        if (!p)
                return -ENOMEM;
 
-       spin_lock_init(&p->io_lock);
-
        p->tco_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_TCO);
        if (!p->tco_res)
                return -ENODEV;