[PATCH 2/2] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register
The syscon regmap interface is used to configure AUTOMATIC_WDT_RESET_DISABLE and MASK_WDT_RESET_REQUEST registers of PMU to mask/unmask enable/disable of watchdog in probe and s2r scenarios. Signed-off-by: Leela Krishna Amudala l.kris...@samsung.com --- .../devicetree/bindings/watchdog/samsung-wdt.txt | 13 ++- drivers/watchdog/s3c2410_wdt.c | 114 ++-- 2 files changed, 118 insertions(+), 9 deletions(-) diff --git a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt index 2aa486c..c46c7ce 100644 --- a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt +++ b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt @@ -5,10 +5,21 @@ after a preset amount of time during which the WDT reset event has not occurred. Required properties: -- compatible : should be samsung,s3c2410-wdt +- compatible : should be samsung,s3c2410-wdt or samsung,s3c5250-wdt or samsung,s3c5420-wdt - reg : base physical address of the controller and length of memory mapped region. - interrupts : interrupt number to the cpu. +- samsung,pmusysreg : reference node to pmu sysreg (required only in case of Exynos5250 and 5420) Optional properties: - timeout-sec : contains the watchdog timeout in seconds. + +watchdog@101D { + compatible = samsung,s3c5250-wdt; + reg = 0x101D 0x100; + interrupts = 0 42 0; + clocks = clock 336; + clock-names = watchdog; + samsung,sysreg = pmu_sys_reg; + status = okay; +}; diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 23aad7c..2a3429c 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c @@ -41,6 +41,8 @@ #include linux/slab.h #include linux/err.h #include linux/of.h +#include linux/mfd/syscon.h +#include linux/regmap.h #define S3C2410_WTCON 0x00 #define S3C2410_WTDAT 0x04 @@ -61,6 +63,10 @@ #define CONFIG_S3C2410_WATCHDOG_ATBOOT (0) #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (15) +#define WDT_DISABLE_REG_OFFSET 0x0408 +#define WDT_MASK_RESET_REG_OFFSET 0x040c +#define QUIRK_NEEDS_PMU_CONFIG (1 0) + static bool nowayout = WATCHDOG_NOWAYOUT; static int tmr_margin; static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT; @@ -84,6 +90,12 @@ MODULE_PARM_DESC(soft_noboot, Watchdog action, set to 1 to ignore reboots, 0 to reboot (default 0)); MODULE_PARM_DESC(debug, Watchdog debug, set to 1 for debug (default 0)); +struct pmu_config { + int disable_reg; + int mask_reset_reg; + int mask_bit; +}; + struct s3c2410_wdt { struct device *dev; struct clk *clock; @@ -94,7 +106,34 @@ struct s3c2410_wdt { unsigned long wtdat_save; struct watchdog_device wdt_device; struct notifier_block freq_transition; + struct pmu_config *wdt_pmu_config; + struct regmap *pmureg; + unsigned intquirks; +}; + +static struct pmu_config pmu_config_5250 = { + .disable_reg = WDT_DISABLE_REG_OFFSET, + .mask_reset_reg = WDT_MASK_RESET_REG_OFFSET, + .mask_bit = 20 +}; + +static struct pmu_config pmu_config_5420 = { + .disable_reg = WDT_DISABLE_REG_OFFSET, + .mask_reset_reg = WDT_MASK_RESET_REG_OFFSET, + .mask_bit = 0 +}; + +#ifdef CONFIG_OF +static const struct of_device_id s3c2410_wdt_match[] = { + { .compatible = samsung,s3c2410-wdt }, + { .compatible = samsung,s3c5250-wdt, + .data = (struct pmu_config *) pmu_config_5250 }, + { .compatible = samsung,s3c5420-wdt, + .data = (struct pmu_config *) pmu_config_5420 }, + {}, }; +MODULE_DEVICE_TABLE(of, s3c2410_wdt_match); +#endif /* watchdog control routines */ @@ -111,6 +150,40 @@ static inline struct s3c2410_wdt *freq_to_wdt(struct notifier_block *nb) return container_of(nb, struct s3c2410_wdt, freq_transition); } +static void s3c2410wdt_mask_and_disable_reset(int mask, struct s3c2410_wdt *wdt) +{ + unsigned int disable, mask_reset; + int ret; + + ret = regmap_read(wdt-pmureg, wdt-wdt_pmu_config-disable_reg, + disable); + if (ret 0) { + dev_err(wdt-dev, %s:%d fail to read disable reg(%d)\n, + __func__, __LINE__, ret); + return; + } + + ret = regmap_read(wdt-pmureg, wdt-wdt_pmu_config-mask_reset_reg, + mask_reset); + if (ret 0) { + dev_err(wdt-dev, %s:%d fail to read mask reset reg(%d)\n, + __func__, __LINE__, ret); + return; + } + + if (mask) { + disable |= (1 wdt-wdt_pmu_config-mask_bit); +
Re: [PATCH 2/2] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register
On 30 October 2013 12:23, Leela Krishna Amudala l.kris...@samsung.com wrote: The syscon regmap interface is used to configure AUTOMATIC_WDT_RESET_DISABLE and MASK_WDT_RESET_REQUEST registers of PMU to mask/unmask enable/disable of watchdog in probe and s2r scenarios. Signed-off-by: Leela Krishna Amudala l.kris...@samsung.com --- .../devicetree/bindings/watchdog/samsung-wdt.txt | 13 ++- drivers/watchdog/s3c2410_wdt.c | 114 ++-- 2 files changed, 118 insertions(+), 9 deletions(-) diff --git a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt index 2aa486c..c46c7ce 100644 --- a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt +++ b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt @@ -5,10 +5,21 @@ after a preset amount of time during which the WDT reset event has not occurred. Required properties: -- compatible : should be samsung,s3c2410-wdt +- compatible : should be samsung,s3c2410-wdt or samsung,s3c5250-wdt or samsung,s3c5420-wdt This should be written as should be one among the following: (a) samsung,s3c2410-wdt for xyz SoC (b) (c) ... - reg : base physical address of the controller and length of memory mapped region. - interrupts : interrupt number to the cpu. +- samsung,pmusysreg : reference node to pmu sysreg (required only in case of Exynos5250 and 5420) This property is samsung,sysreg. Optional properties: - timeout-sec : contains the watchdog timeout in seconds. + +watchdog@101D { + compatible = samsung,s3c5250-wdt; + reg = 0x101D 0x100; + interrupts = 0 42 0; + clocks = clock 336; + clock-names = watchdog; + samsung,sysreg = pmu_sys_reg; + status = okay; +}; diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 23aad7c..2a3429c 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c @@ -41,6 +41,8 @@ #include linux/slab.h #include linux/err.h #include linux/of.h +#include linux/mfd/syscon.h +#include linux/regmap.h #define S3C2410_WTCON 0x00 #define S3C2410_WTDAT 0x04 @@ -61,6 +63,10 @@ #define CONFIG_S3C2410_WATCHDOG_ATBOOT (0) #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (15) +#define WDT_DISABLE_REG_OFFSET 0x0408 +#define WDT_MASK_RESET_REG_OFFSET 0x040c +#define QUIRK_NEEDS_PMU_CONFIG (1 0) + static bool nowayout = WATCHDOG_NOWAYOUT; static int tmr_margin; static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT; @@ -84,6 +90,12 @@ MODULE_PARM_DESC(soft_noboot, Watchdog action, set to 1 to ignore reboots, 0 to reboot (default 0)); MODULE_PARM_DESC(debug, Watchdog debug, set to 1 for debug (default 0)); +struct pmu_config { + int disable_reg; + int mask_reset_reg; + int mask_bit; +}; + struct s3c2410_wdt { struct device *dev; struct clk *clock; @@ -94,7 +106,34 @@ struct s3c2410_wdt { unsigned long wtdat_save; struct watchdog_device wdt_device; struct notifier_block freq_transition; + struct pmu_config *wdt_pmu_config; + struct regmap *pmureg; + unsigned intquirks; +}; + +static struct pmu_config pmu_config_5250 = { + .disable_reg = WDT_DISABLE_REG_OFFSET, + .mask_reset_reg = WDT_MASK_RESET_REG_OFFSET, + .mask_bit = 20 +}; + +static struct pmu_config pmu_config_5420 = { + .disable_reg = WDT_DISABLE_REG_OFFSET, + .mask_reset_reg = WDT_MASK_RESET_REG_OFFSET, + .mask_bit = 0 +}; + The above 2 structures could also be under ifdef CONFIG_OF +#ifdef CONFIG_OF +static const struct of_device_id s3c2410_wdt_match[] = { + { .compatible = samsung,s3c2410-wdt }, + { .compatible = samsung,s3c5250-wdt, + .data = (struct pmu_config *) pmu_config_5250 }, + { .compatible = samsung,s3c5420-wdt, + .data = (struct pmu_config *) pmu_config_5420 }, + {}, }; +MODULE_DEVICE_TABLE(of, s3c2410_wdt_match); +#endif /* watchdog control routines */ @@ -111,6 +150,40 @@ static inline struct s3c2410_wdt *freq_to_wdt(struct notifier_block *nb) return container_of(nb, struct s3c2410_wdt, freq_transition); } +static void s3c2410wdt_mask_and_disable_reset(int mask, struct s3c2410_wdt *wdt) +{ + unsigned int disable, mask_reset; + int ret; + + ret = regmap_read(wdt-pmureg, wdt-wdt_pmu_config-disable_reg, + disable); + if (ret 0) { + dev_err(wdt-dev, %s:%d fail to read disable reg(%d)\n, + __func__, __LINE__, ret); func and LINE does not
Re: [PATCH 2/2] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register
Hi Sachin, Thanks for reviewing the patch On Wed, Oct 30, 2013 at 12:33 PM, Sachin Kamat sachin.ka...@linaro.org wrote: On 30 October 2013 12:23, Leela Krishna Amudala l.kris...@samsung.com wrote: The syscon regmap interface is used to configure AUTOMATIC_WDT_RESET_DISABLE and MASK_WDT_RESET_REQUEST registers of PMU to mask/unmask enable/disable of watchdog in probe and s2r scenarios. Signed-off-by: Leela Krishna Amudala l.kris...@samsung.com --- .../devicetree/bindings/watchdog/samsung-wdt.txt | 13 ++- drivers/watchdog/s3c2410_wdt.c | 114 ++-- 2 files changed, 118 insertions(+), 9 deletions(-) diff --git a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt index 2aa486c..c46c7ce 100644 --- a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt +++ b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt @@ -5,10 +5,21 @@ after a preset amount of time during which the WDT reset event has not occurred. Required properties: -- compatible : should be samsung,s3c2410-wdt +- compatible : should be samsung,s3c2410-wdt or samsung,s3c5250-wdt or samsung,s3c5420-wdt This should be written as should be one among the following: (a) samsung,s3c2410-wdt for xyz SoC (b) (c) ... Okay, will change it. - reg : base physical address of the controller and length of memory mapped region. - interrupts : interrupt number to the cpu. +- samsung,pmusysreg : reference node to pmu sysreg (required only in case of Exynos5250 and 5420) This property is samsung,sysreg. Okay, will keep this as it is and take care in driver Optional properties: - timeout-sec : contains the watchdog timeout in seconds. + +watchdog@101D { + compatible = samsung,s3c5250-wdt; + reg = 0x101D 0x100; + interrupts = 0 42 0; + clocks = clock 336; + clock-names = watchdog; + samsung,sysreg = pmu_sys_reg; + status = okay; +}; diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 23aad7c..2a3429c 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c @@ -41,6 +41,8 @@ #include linux/slab.h #include linux/err.h #include linux/of.h +#include linux/mfd/syscon.h +#include linux/regmap.h #define S3C2410_WTCON 0x00 #define S3C2410_WTDAT 0x04 @@ -61,6 +63,10 @@ #define CONFIG_S3C2410_WATCHDOG_ATBOOT (0) #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (15) +#define WDT_DISABLE_REG_OFFSET 0x0408 +#define WDT_MASK_RESET_REG_OFFSET 0x040c +#define QUIRK_NEEDS_PMU_CONFIG (1 0) + static bool nowayout = WATCHDOG_NOWAYOUT; static int tmr_margin; static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT; @@ -84,6 +90,12 @@ MODULE_PARM_DESC(soft_noboot, Watchdog action, set to 1 to ignore reboots, 0 to reboot (default 0)); MODULE_PARM_DESC(debug, Watchdog debug, set to 1 for debug (default 0)); +struct pmu_config { + int disable_reg; + int mask_reset_reg; + int mask_bit; +}; + struct s3c2410_wdt { struct device *dev; struct clk *clock; @@ -94,7 +106,34 @@ struct s3c2410_wdt { unsigned long wtdat_save; struct watchdog_device wdt_device; struct notifier_block freq_transition; + struct pmu_config *wdt_pmu_config; + struct regmap *pmureg; + unsigned intquirks; +}; + +static struct pmu_config pmu_config_5250 = { + .disable_reg = WDT_DISABLE_REG_OFFSET, + .mask_reset_reg = WDT_MASK_RESET_REG_OFFSET, + .mask_bit = 20 +}; + +static struct pmu_config pmu_config_5420 = { + .disable_reg = WDT_DISABLE_REG_OFFSET, + .mask_reset_reg = WDT_MASK_RESET_REG_OFFSET, + .mask_bit = 0 +}; + The above 2 structures could also be under ifdef CONFIG_OF Okay, will move it +#ifdef CONFIG_OF +static const struct of_device_id s3c2410_wdt_match[] = { + { .compatible = samsung,s3c2410-wdt }, + { .compatible = samsung,s3c5250-wdt, + .data = (struct pmu_config *) pmu_config_5250 }, + { .compatible = samsung,s3c5420-wdt, + .data = (struct pmu_config *) pmu_config_5420 }, + {}, }; +MODULE_DEVICE_TABLE(of, s3c2410_wdt_match); +#endif /* watchdog control routines */ @@ -111,6 +150,40 @@ static inline struct s3c2410_wdt *freq_to_wdt(struct notifier_block *nb) return container_of(nb, struct s3c2410_wdt, freq_transition); } +static void s3c2410wdt_mask_and_disable_reset(int mask, struct s3c2410_wdt *wdt) +{ + unsigned int disable, mask_reset; + int ret; + + ret = regmap_read(wdt-pmureg, wdt-wdt_pmu_config-disable_reg, +