Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

watchdog: sama5d4: Cache MR instead of a partial config

.config is used to cache a part of WDT_MR at probe time and is not used
afterwards. Instead of doing that, actually cache MR and avoid reading it
every time it is modified.

Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>

authored by

Alexandre Belloni and committed by
Guenter Roeck
722ce635 8f8dc7bf

+19 -26
+19 -26
drivers/watchdog/sama5d4_wdt.c
··· 28 28 struct sama5d4_wdt { 29 29 struct watchdog_device wdd; 30 30 void __iomem *reg_base; 31 - u32 config; 31 + u32 mr; 32 32 }; 33 33 34 34 static int wdt_timeout = WDT_DEFAULT_TIMEOUT; ··· 53 53 static int sama5d4_wdt_start(struct watchdog_device *wdd) 54 54 { 55 55 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); 56 - u32 reg; 57 56 58 - reg = wdt_read(wdt, AT91_WDT_MR); 59 - reg &= ~AT91_WDT_WDDIS; 60 - wdt_write(wdt, AT91_WDT_MR, reg); 57 + wdt->mr &= ~AT91_WDT_WDDIS; 58 + wdt_write(wdt, AT91_WDT_MR, wdt->mr); 61 59 62 60 return 0; 63 61 } ··· 63 65 static int sama5d4_wdt_stop(struct watchdog_device *wdd) 64 66 { 65 67 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); 66 - u32 reg; 67 68 68 - reg = wdt_read(wdt, AT91_WDT_MR); 69 - reg |= AT91_WDT_WDDIS; 70 - wdt_write(wdt, AT91_WDT_MR, reg); 69 + wdt->mr |= AT91_WDT_WDDIS; 70 + wdt_write(wdt, AT91_WDT_MR, wdt->mr); 71 71 72 72 return 0; 73 73 } ··· 84 88 { 85 89 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); 86 90 u32 value = WDT_SEC2TICKS(timeout); 87 - u32 reg; 88 91 89 - reg = wdt_read(wdt, AT91_WDT_MR); 90 - reg &= ~AT91_WDT_WDV; 91 - reg &= ~AT91_WDT_WDD; 92 - reg |= AT91_WDT_SET_WDV(value); 93 - reg |= AT91_WDT_SET_WDD(value); 94 - wdt_write(wdt, AT91_WDT_MR, reg); 92 + wdt->mr &= ~AT91_WDT_WDV; 93 + wdt->mr &= ~AT91_WDT_WDD; 94 + wdt->mr |= AT91_WDT_SET_WDV(value); 95 + wdt->mr |= AT91_WDT_SET_WDD(value); 96 + wdt_write(wdt, AT91_WDT_MR, wdt->mr); 95 97 96 98 wdd->timeout = timeout; 97 99 ··· 126 132 { 127 133 const char *tmp; 128 134 129 - wdt->config = AT91_WDT_WDDIS; 135 + wdt->mr = AT91_WDT_WDDIS; 130 136 131 137 if (!of_property_read_string(np, "atmel,watchdog-type", &tmp) && 132 138 !strcmp(tmp, "software")) 133 - wdt->config |= AT91_WDT_WDFIEN; 139 + wdt->mr |= AT91_WDT_WDFIEN; 134 140 else 135 - wdt->config |= AT91_WDT_WDRSTEN; 141 + wdt->mr |= AT91_WDT_WDRSTEN; 136 142 137 143 if (of_property_read_bool(np, "atmel,idle-halt")) 138 - wdt->config |= AT91_WDT_WDIDLEHLT; 144 + wdt->mr |= AT91_WDT_WDIDLEHLT; 139 145 140 146 if (of_property_read_bool(np, "atmel,dbg-halt")) 141 - wdt->config |= AT91_WDT_WDDBGHLT; 147 + wdt->mr |= AT91_WDT_WDDBGHLT; 142 148 143 149 return 0; 144 150 } ··· 157 163 reg &= ~AT91_WDT_WDDIS; 158 164 wdt_write(wdt, AT91_WDT_MR, reg); 159 165 160 - reg = wdt->config; 161 - reg |= AT91_WDT_SET_WDD(value); 162 - reg |= AT91_WDT_SET_WDV(value); 166 + wdt->mr |= AT91_WDT_SET_WDD(value); 167 + wdt->mr |= AT91_WDT_SET_WDV(value); 163 168 164 - wdt_write(wdt, AT91_WDT_MR, reg); 169 + wdt_write(wdt, AT91_WDT_MR, wdt->mr); 165 170 166 171 return 0; 167 172 } ··· 204 211 return ret; 205 212 } 206 213 207 - if ((wdt->config & AT91_WDT_WDFIEN) && irq) { 214 + if ((wdt->mr & AT91_WDT_WDFIEN) && irq) { 208 215 ret = devm_request_irq(&pdev->dev, irq, sama5d4_wdt_irq_handler, 209 216 IRQF_SHARED | IRQF_IRQPOLL | 210 217 IRQF_NO_SUSPEND, pdev->name, pdev);