| From 6d28120c50699cf55dff35451c93dfa0fa244d5b Mon Sep 17 00:00:00 2001 |
| From: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Date: Wed, 26 Feb 2020 16:21:21 +0300 |
| Subject: [PATCH] watchdog: iTCO_wdt: Make ICH_RES_IO_SMI optional |
| |
| commit e42b0c24389d5a1602e77db4f6def0d5a19e3e43 upstream. |
| |
| The iTCO_wdt driver only needs ICH_RES_IO_SMI I/O resource when either |
| turn_SMI_watchdog_clear_off module parameter is set to match ->iTCO_version |
| (or higher), and when legacy iTCO_vendorsupport is set. Modify the driver |
| so that ICH_RES_IO_SMI is optional if the two conditions are not met. |
| |
| Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c |
| index 89cea6ce9a08..d21e9761e4ac 100644 |
| --- a/drivers/watchdog/iTCO_wdt.c |
| +++ b/drivers/watchdog/iTCO_wdt.c |
| @@ -443,13 +443,25 @@ static int iTCO_wdt_probe(struct platform_device *pdev) |
| if (!p->tco_res) |
| return -ENODEV; |
| |
| - p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); |
| - if (!p->smi_res) |
| - return -ENODEV; |
| - |
| p->iTCO_version = pdata->version; |
| p->pci_dev = to_pci_dev(dev->parent); |
| |
| + p->smi_res = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_IO_SMI); |
| + if (p->smi_res) { |
| + /* The TCO logic uses the TCO_EN bit in the SMI_EN register */ |
| + if (!devm_request_region(dev, p->smi_res->start, |
| + resource_size(p->smi_res), |
| + pdev->name)) { |
| + pr_err("I/O address 0x%04llx already in use, device disabled\n", |
| + (u64)SMI_EN(p)); |
| + return -EBUSY; |
| + } |
| + } else if (iTCO_vendorsupport || |
| + turn_SMI_watchdog_clear_off >= p->iTCO_version) { |
| + pr_err("SMI I/O resource is missing\n"); |
| + return -ENODEV; |
| + } |
| + |
| iTCO_wdt_no_reboot_bit_setup(p, pdata); |
| |
| /* |
| @@ -475,14 +487,6 @@ static int iTCO_wdt_probe(struct platform_device *pdev) |
| /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ |
| p->update_no_reboot_bit(p->no_reboot_priv, true); |
| |
| - /* The TCO logic uses the TCO_EN bit in the SMI_EN register */ |
| - if (!devm_request_region(dev, p->smi_res->start, |
| - resource_size(p->smi_res), |
| - pdev->name)) { |
| - pr_err("I/O address 0x%04llx already in use, device disabled\n", |
| - (u64)SMI_EN(p)); |
| - return -EBUSY; |
| - } |
| if (turn_SMI_watchdog_clear_off >= p->iTCO_version) { |
| /* |
| * Bit 13: TCO_EN -> 0 |
| -- |
| 2.7.4 |
| |