From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933214AbdBPTbB (ORCPT ); Thu, 16 Feb 2017 14:31:01 -0500 Received: from mail.free-electrons.com ([62.4.15.54]:52745 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932882AbdBPTa7 (ORCPT ); Thu, 16 Feb 2017 14:30:59 -0500 From: Alexandre Belloni To: Guenter Roeck Cc: Wim Van Sebroeck , Nicolas Ferre , linux-watchdog@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Alexandre Belloni Subject: [PATCH v2 1/3] watchdog: sama5d4: Cleanup init Date: Thu, 16 Feb 2017 20:30:51 +0100 Message-Id: <20170216193053.5546-1-alexandre.belloni@free-electrons.com> X-Mailer: git-send-email 2.11.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org .config is used to cache a part of WDT_MR at probe time and is not used afterwards. Also functions are used while they always return 0. Simplify the flow by having everything in .probe(). Signed-off-by: Alexandre Belloni --- Changes in v2: - completely get rid of .config instead of caching it - merge init functions in probe() drivers/watchdog/sama5d4_wdt.c | 92 ++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 58 deletions(-) diff --git a/drivers/watchdog/sama5d4_wdt.c b/drivers/watchdog/sama5d4_wdt.c index a49634cdc1cc..2c6f5a70ae67 100644 --- a/drivers/watchdog/sama5d4_wdt.c +++ b/drivers/watchdog/sama5d4_wdt.c @@ -28,7 +28,6 @@ struct sama5d4_wdt { struct watchdog_device wdd; void __iomem *reg_base; - u32 config; }; static int wdt_timeout = WDT_DEFAULT_TIMEOUT; @@ -128,57 +127,15 @@ static irqreturn_t sama5d4_wdt_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static int of_sama5d4_wdt_init(struct device_node *np, struct sama5d4_wdt *wdt) -{ - const char *tmp; - - wdt->config = AT91_WDT_WDDIS; - - if (!of_property_read_string(np, "atmel,watchdog-type", &tmp) && - !strcmp(tmp, "software")) - wdt->config |= AT91_WDT_WDFIEN; - else - wdt->config |= AT91_WDT_WDRSTEN; - - if (of_property_read_bool(np, "atmel,idle-halt")) - wdt->config |= AT91_WDT_WDIDLEHLT; - - if (of_property_read_bool(np, "atmel,dbg-halt")) - wdt->config |= AT91_WDT_WDDBGHLT; - - return 0; -} - -static int sama5d4_wdt_init(struct sama5d4_wdt *wdt) -{ - struct watchdog_device *wdd = &wdt->wdd; - u32 value = WDT_SEC2TICKS(wdd->timeout); - u32 reg; - - /* - * Because the fields WDV and WDD must not be modified when the WDDIS - * bit is set, so clear the WDDIS bit before writing the WDT_MR. - */ - reg = wdt_read(wdt, AT91_WDT_MR); - reg &= ~AT91_WDT_WDDIS; - wdt_write(wdt, AT91_WDT_MR, reg); - - reg = wdt->config; - reg |= AT91_WDT_SET_WDD(value); - reg |= AT91_WDT_SET_WDV(value); - - wdt_write(wdt, AT91_WDT_MR, reg); - - return 0; -} - static int sama5d4_wdt_probe(struct platform_device *pdev) { struct watchdog_device *wdd; struct sama5d4_wdt *wdt; struct resource *res; void __iomem *regs; - u32 irq = 0; + struct device_node *np = pdev->dev.of_node; + const char *tmp; + u32 mr, reg, irq = 0; int ret; wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); @@ -201,17 +158,26 @@ static int sama5d4_wdt_probe(struct platform_device *pdev) wdt->reg_base = regs; - if (pdev->dev.of_node) { - irq = irq_of_parse_and_map(pdev->dev.of_node, 0); - if (!irq) - dev_warn(&pdev->dev, "failed to get IRQ from DT\n"); + irq = irq_of_parse_and_map(np, 0); + if (!irq) + dev_warn(&pdev->dev, "failed to get IRQ from DT\n"); - ret = of_sama5d4_wdt_init(pdev->dev.of_node, wdt); - if (ret) - return ret; - } - if ((wdt->config & AT91_WDT_WDFIEN) && irq) { + mr = AT91_WDT_WDDIS; + + if (!of_property_read_string(np, "atmel,watchdog-type", &tmp) && + !strcmp(tmp, "software")) + mr |= AT91_WDT_WDFIEN; + else + mr |= AT91_WDT_WDRSTEN; + + if (of_property_read_bool(np, "atmel,idle-halt")) + mr |= AT91_WDT_WDIDLEHLT; + + if (of_property_read_bool(np, "atmel,dbg-halt")) + mr |= AT91_WDT_WDDBGHLT; + + if ((mr & AT91_WDT_WDFIEN) && irq) { ret = devm_request_irq(&pdev->dev, irq, sama5d4_wdt_irq_handler, IRQF_SHARED | IRQF_IRQPOLL | IRQF_NO_SUSPEND, pdev->name, pdev); @@ -228,9 +194,19 @@ static int sama5d4_wdt_probe(struct platform_device *pdev) return ret; } - ret = sama5d4_wdt_init(wdt); - if (ret) - return ret; + /* + * WDV and WDD must not be modified when the WDDIS bit is set, so clear + * the WDDIS bit before writing the WDT_MR. + */ + reg = wdt_read(wdt, AT91_WDT_MR); + reg &= ~AT91_WDT_WDDIS; + wdt_write(wdt, AT91_WDT_MR, reg); + + reg = mr; + reg |= AT91_WDT_SET_WDD(WDT_SEC2TICKS(wdd->timeout)); + reg |= AT91_WDT_SET_WDV(WDT_SEC2TICKS(wdd->timeout)); + + wdt_write(wdt, AT91_WDT_MR, reg); watchdog_set_nowayout(wdd, nowayout); -- 2.11.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: alexandre.belloni@free-electrons.com (Alexandre Belloni) Date: Thu, 16 Feb 2017 20:30:51 +0100 Subject: [PATCH v2 1/3] watchdog: sama5d4: Cleanup init Message-ID: <20170216193053.5546-1-alexandre.belloni@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org .config is used to cache a part of WDT_MR at probe time and is not used afterwards. Also functions are used while they always return 0. Simplify the flow by having everything in .probe(). Signed-off-by: Alexandre Belloni --- Changes in v2: - completely get rid of .config instead of caching it - merge init functions in probe() drivers/watchdog/sama5d4_wdt.c | 92 ++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 58 deletions(-) diff --git a/drivers/watchdog/sama5d4_wdt.c b/drivers/watchdog/sama5d4_wdt.c index a49634cdc1cc..2c6f5a70ae67 100644 --- a/drivers/watchdog/sama5d4_wdt.c +++ b/drivers/watchdog/sama5d4_wdt.c @@ -28,7 +28,6 @@ struct sama5d4_wdt { struct watchdog_device wdd; void __iomem *reg_base; - u32 config; }; static int wdt_timeout = WDT_DEFAULT_TIMEOUT; @@ -128,57 +127,15 @@ static irqreturn_t sama5d4_wdt_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static int of_sama5d4_wdt_init(struct device_node *np, struct sama5d4_wdt *wdt) -{ - const char *tmp; - - wdt->config = AT91_WDT_WDDIS; - - if (!of_property_read_string(np, "atmel,watchdog-type", &tmp) && - !strcmp(tmp, "software")) - wdt->config |= AT91_WDT_WDFIEN; - else - wdt->config |= AT91_WDT_WDRSTEN; - - if (of_property_read_bool(np, "atmel,idle-halt")) - wdt->config |= AT91_WDT_WDIDLEHLT; - - if (of_property_read_bool(np, "atmel,dbg-halt")) - wdt->config |= AT91_WDT_WDDBGHLT; - - return 0; -} - -static int sama5d4_wdt_init(struct sama5d4_wdt *wdt) -{ - struct watchdog_device *wdd = &wdt->wdd; - u32 value = WDT_SEC2TICKS(wdd->timeout); - u32 reg; - - /* - * Because the fields WDV and WDD must not be modified when the WDDIS - * bit is set, so clear the WDDIS bit before writing the WDT_MR. - */ - reg = wdt_read(wdt, AT91_WDT_MR); - reg &= ~AT91_WDT_WDDIS; - wdt_write(wdt, AT91_WDT_MR, reg); - - reg = wdt->config; - reg |= AT91_WDT_SET_WDD(value); - reg |= AT91_WDT_SET_WDV(value); - - wdt_write(wdt, AT91_WDT_MR, reg); - - return 0; -} - static int sama5d4_wdt_probe(struct platform_device *pdev) { struct watchdog_device *wdd; struct sama5d4_wdt *wdt; struct resource *res; void __iomem *regs; - u32 irq = 0; + struct device_node *np = pdev->dev.of_node; + const char *tmp; + u32 mr, reg, irq = 0; int ret; wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL); @@ -201,17 +158,26 @@ static int sama5d4_wdt_probe(struct platform_device *pdev) wdt->reg_base = regs; - if (pdev->dev.of_node) { - irq = irq_of_parse_and_map(pdev->dev.of_node, 0); - if (!irq) - dev_warn(&pdev->dev, "failed to get IRQ from DT\n"); + irq = irq_of_parse_and_map(np, 0); + if (!irq) + dev_warn(&pdev->dev, "failed to get IRQ from DT\n"); - ret = of_sama5d4_wdt_init(pdev->dev.of_node, wdt); - if (ret) - return ret; - } - if ((wdt->config & AT91_WDT_WDFIEN) && irq) { + mr = AT91_WDT_WDDIS; + + if (!of_property_read_string(np, "atmel,watchdog-type", &tmp) && + !strcmp(tmp, "software")) + mr |= AT91_WDT_WDFIEN; + else + mr |= AT91_WDT_WDRSTEN; + + if (of_property_read_bool(np, "atmel,idle-halt")) + mr |= AT91_WDT_WDIDLEHLT; + + if (of_property_read_bool(np, "atmel,dbg-halt")) + mr |= AT91_WDT_WDDBGHLT; + + if ((mr & AT91_WDT_WDFIEN) && irq) { ret = devm_request_irq(&pdev->dev, irq, sama5d4_wdt_irq_handler, IRQF_SHARED | IRQF_IRQPOLL | IRQF_NO_SUSPEND, pdev->name, pdev); @@ -228,9 +194,19 @@ static int sama5d4_wdt_probe(struct platform_device *pdev) return ret; } - ret = sama5d4_wdt_init(wdt); - if (ret) - return ret; + /* + * WDV and WDD must not be modified when the WDDIS bit is set, so clear + * the WDDIS bit before writing the WDT_MR. + */ + reg = wdt_read(wdt, AT91_WDT_MR); + reg &= ~AT91_WDT_WDDIS; + wdt_write(wdt, AT91_WDT_MR, reg); + + reg = mr; + reg |= AT91_WDT_SET_WDD(WDT_SEC2TICKS(wdd->timeout)); + reg |= AT91_WDT_SET_WDV(WDT_SEC2TICKS(wdd->timeout)); + + wdt_write(wdt, AT91_WDT_MR, reg); watchdog_set_nowayout(wdd, nowayout); -- 2.11.0