devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V4 0/3] Add watchdog DT nodes and use syscon regmap interfac to configure pmu registers
@ 2013-10-30  9:51 Leela Krishna Amudala
  2013-10-30  9:51 ` [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file Leela Krishna Amudala
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-30  9:51 UTC (permalink / raw)
  To: linux-samsung-soc, kgene.kim, wim
  Cc: t.figa, devicetree, dianders, linux-watchdog, cpgs, sachin.kamat

This patchset does the following things
	- Adds pmusysreg device node to exynos5.dtsi file
	- Adds watchdog DT nodes to Exynos5250 and 5420
	- Uses syscon regmap interface to configure pmu registers
	  to mask/unmask enable/disable of watchdog.
	
This patch set is rebased on Kgene's for-next branch and tested on SMDK5420

Changes since V3:
	- changed the compatible strings for watchdog node
	- splitted up adding pmusysreg node and made it separate patch
	- Addressed comments given by Sachin Kamat <sachin.kamat@linaro.org>

Changes since V2:
	- used syscon regmap interface to configure pmu registers in WDT driver
	  (suggested by Tomasz Figa <t.figa@samsung.com>)

Changes since V1:
        - Added new compatible string for Exynos5 SoCs
        - Introduced quirk mechanism to program PMU registers
        - Addressed comments given by Tomasz Figa <t.figa@samsung.com>

Leela Krishna Amudala (3):
  ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  ARM: dts: add watchdog device nodes for Exynos5250 and Exynos5420
  watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu
    register

 .../devicetree/bindings/watchdog/samsung-wdt.txt   |   19 +++-
 arch/arm/boot/dts/exynos5.dtsi                     |   12 +--
 arch/arm/boot/dts/exynos5250.dtsi                  |    7 +-
 arch/arm/boot/dts/exynos5420.dtsi                  |   10 ++
 drivers/watchdog/s3c2410_wdt.c                     |  112 ++++++++++++++++++--
 5 files changed, 143 insertions(+), 17 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30  9:51 [PATCH V4 0/3] Add watchdog DT nodes and use syscon regmap interfac to configure pmu registers Leela Krishna Amudala
@ 2013-10-30  9:51 ` Leela Krishna Amudala
  2013-10-30  9:52   ` Sachin Kamat
  2013-10-30 14:42   ` Tomasz Figa
  2013-10-30  9:51 ` [PATCH V4 2/3] ARM: dts: add watchdog device nodes for Exynos5250 and Exynos5420 Leela Krishna Amudala
  2013-10-30  9:51 ` [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register Leela Krishna Amudala
  2 siblings, 2 replies; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-30  9:51 UTC (permalink / raw)
  To: linux-samsung-soc, kgene.kim, wim
  Cc: t.figa, devicetree, dianders, linux-watchdog, cpgs, sachin.kamat

This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
register accesses in a centralized way using syscon driver

Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
---
 arch/arm/boot/dts/exynos5.dtsi |    5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
index e52b038..918e732 100644
--- a/arch/arm/boot/dts/exynos5.dtsi
+++ b/arch/arm/boot/dts/exynos5.dtsi
@@ -106,4 +106,9 @@
 		#size-cells = <0>;
 		status = "disabled";
 	};
+
+	pmu_sys_reg: pmusysreg@1004000 {
+		compatible = "syscon";
+		reg = <0x10040000 0x5000>;
+	};
 };
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V4 2/3] ARM: dts: add watchdog device nodes for Exynos5250 and Exynos5420
  2013-10-30  9:51 [PATCH V4 0/3] Add watchdog DT nodes and use syscon regmap interfac to configure pmu registers Leela Krishna Amudala
  2013-10-30  9:51 ` [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file Leela Krishna Amudala
@ 2013-10-30  9:51 ` Leela Krishna Amudala
  2013-10-30  9:51 ` [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register Leela Krishna Amudala
  2 siblings, 0 replies; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-30  9:51 UTC (permalink / raw)
  To: linux-samsung-soc, kgene.kim, wim
  Cc: t.figa, devicetree, dianders, linux-watchdog, cpgs, sachin.kamat

Adds watchdog device nodes to the DT device list for Exynos5250 and Exynos5420

Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
---
 arch/arm/boot/dts/exynos5.dtsi    |    7 -------
 arch/arm/boot/dts/exynos5250.dtsi |    7 ++++++-
 arch/arm/boot/dts/exynos5420.dtsi |   10 ++++++++++
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
index 918e732..fec8aa7 100644
--- a/arch/arm/boot/dts/exynos5.dtsi
+++ b/arch/arm/boot/dts/exynos5.dtsi
@@ -81,13 +81,6 @@
 		status = "disabled";
 	};
 
-	watchdog {
-		compatible = "samsung,s3c2410-wdt";
-		reg = <0x101D0000 0x100>;
-		interrupts = <0 42 0>;
-		status = "disabled";
-	};
-
 	fimd@14400000 {
 		compatible = "samsung,exynos5250-fimd";
 		interrupt-parent = <&combiner>;
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi
index c4a8662..e46b5d9 100644
--- a/arch/arm/boot/dts/exynos5250.dtsi
+++ b/arch/arm/boot/dts/exynos5250.dtsi
@@ -158,9 +158,14 @@
 		interrupts = <0 47 0>;
 	};
 
-	watchdog {
+	watchdog@101D0000 {
+		compatible = "samsung,exynos5250-wdt";
+		reg = <0x101D0000 0x100>;
+		interrupts = <0 42 0>;
 		clocks = <&clock 336>;
 		clock-names = "watchdog";
+		samsung,pmusysreg = <&pmu_sys_reg>;
+		status = "okay";
 	};
 
 	g2d@10850000 {
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi
index 6ffefd1..c95385b 100644
--- a/arch/arm/boot/dts/exynos5420.dtsi
+++ b/arch/arm/boot/dts/exynos5420.dtsi
@@ -369,4 +369,14 @@
 		clock-names = "gscl";
 		samsung,power-domain = <&gsc_pd>;
 	};
+
+        watchdog@101D0000 {
+		compatible = "samsung,exynos5420-wdt";
+		reg = <0x101D0000 0x100>;
+		interrupts = <0 42 0>;
+		clocks = <&clock 316>;
+		clock-names = "watchdog";
+		samsung,pmusysreg = <&pmu_sys_reg>;
+		status = "okay";
+        };
 };
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register
  2013-10-30  9:51 [PATCH V4 0/3] Add watchdog DT nodes and use syscon regmap interfac to configure pmu registers Leela Krishna Amudala
  2013-10-30  9:51 ` [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file Leela Krishna Amudala
  2013-10-30  9:51 ` [PATCH V4 2/3] ARM: dts: add watchdog device nodes for Exynos5250 and Exynos5420 Leela Krishna Amudala
@ 2013-10-30  9:51 ` Leela Krishna Amudala
  2013-10-30 14:39   ` Tomasz Figa
  2 siblings, 1 reply; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-30  9:51 UTC (permalink / raw)
  To: linux-samsung-soc, kgene.kim, wim
  Cc: t.figa, devicetree, dianders, linux-watchdog, cpgs, sachin.kamat

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.krishna@samsung.com>
---
 .../devicetree/bindings/watchdog/samsung-wdt.txt   |   19 +++-
 drivers/watchdog/s3c2410_wdt.c                     |  112 ++++++++++++++++++--
 2 files changed, 122 insertions(+), 9 deletions(-)

diff --git a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
index 2aa486c..5a9889b 100644
--- a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
+++ b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
@@ -5,10 +5,27 @@ 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 one among the following
+	(a) "samsung,s3c2410-wdt" for Exynos4 and previous SoCs
+	(b) "samsung,exynos5250-wdt" for Exynos5250
+	(c) "samsung,exynos5420-wdt" for Exynos5420
+
 - 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.
+
+Example:
+
+watchdog@101D0000 {
+	compatible = "samsung,exynos5250-wdt";
+	reg = <0x101D0000 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..d8aefef 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 int		quirks;
+};
+
+#ifdef CONFIG_OF
+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
+};
+
+static const struct of_device_id s3c2410_wdt_match[] = {
+	{ .compatible = "samsung,s3c2410-wdt" },
+	{ .compatible = "samsung,exynos5250-wdt",
+	  .data = (struct pmu_config *) &pmu_config_5250 },
+	{ .compatible = "samsung,exynos5420-wdt",
+	  .data = (struct pmu_config *) &pmu_config_5420 },
+	{},
 };
+MODULE_DEVICE_TABLE(of, s3c2410_wdt_match);
+#endif
 
 /* watchdog control routines */
 
@@ -111,6 +150,38 @@ 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, "failed to read disable reg(%d)\n", ret);
+		return;
+	}
+
+	ret = regmap_read(wdt->pmureg, wdt->wdt_pmu_config->mask_reset_reg,
+								&mask_reset);
+	if (ret < 0) {
+		dev_err(wdt->dev, "failed to read mask reset reg(%d)\n", ret);
+		return;
+	}
+
+	if (mask) {
+		disable |= (1 << wdt->wdt_pmu_config->mask_bit);
+		mask_reset |= (1 << wdt->wdt_pmu_config->mask_bit);
+	} else {
+		disable &= ~(1 << wdt->wdt_pmu_config->mask_bit);
+		mask_reset &= ~(1 << wdt->wdt_pmu_config->mask_bit);
+	}
+
+	regmap_write(wdt->pmureg, wdt->wdt_pmu_config->disable_reg, disable);
+	regmap_write(wdt->pmureg, wdt->wdt_pmu_config->mask_reset_reg,
+								mask_reset);
+}
+
 static int s3c2410wdt_keepalive(struct watchdog_device *wdd)
 {
 	struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd);
@@ -332,6 +403,14 @@ static inline void s3c2410wdt_cpufreq_deregister(struct s3c2410_wdt *wdt)
 }
 #endif
 
+/* s3c2410_get_wdt_driver_data */
+static inline unsigned int get_wdt_driver_data(struct platform_device *pdev)
+{
+	const struct of_device_id *match;
+	match = of_match_node(s3c2410_wdt_match, pdev->dev.of_node);
+	return (unsigned int)match->data;
+}
+
 static int s3c2410wdt_probe(struct platform_device *pdev)
 {
 	struct device *dev;
@@ -354,6 +433,17 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
 	spin_lock_init(&wdt->lock);
 	wdt->wdt_device = s3c2410_wdd;
 
+	wdt->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
+						"samsung,pmusysreg");
+	if (IS_ERR(wdt->pmureg)) {
+		dev_err(dev, "syscon regmap lookup failed.\n");
+		return PTR_ERR(wdt->pmureg);
+	}
+
+	wdt->wdt_pmu_config = (struct pmu_config *) get_wdt_driver_data(pdev);
+	if (wdt->wdt_pmu_config)
+		wdt->quirks = QUIRK_NEEDS_PMU_CONFIG;
+
 	wdt_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 	if (wdt_irq == NULL) {
 		dev_err(dev, "no irq resource specified\n");
@@ -444,6 +534,8 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
 		 (wtcon & S3C2410_WTCON_RSTEN) ? "en" : "dis",
 		 (wtcon & S3C2410_WTCON_INTEN) ? "en" : "dis");
 
+	if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
+		s3c2410wdt_mask_and_disable_reset(0, wdt);
 	return 0;
 
  err_cpufreq:
@@ -461,6 +553,9 @@ static int s3c2410wdt_remove(struct platform_device *dev)
 {
 	struct s3c2410_wdt *wdt = platform_get_drvdata(dev);
 
+	if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
+		s3c2410wdt_mask_and_disable_reset(1, wdt);
+
 	watchdog_unregister_device(&wdt->wdt_device);
 
 	s3c2410wdt_cpufreq_deregister(wdt);
@@ -475,6 +570,9 @@ static void s3c2410wdt_shutdown(struct platform_device *dev)
 {
 	struct s3c2410_wdt *wdt = platform_get_drvdata(dev);
 
+	if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
+		s3c2410wdt_mask_and_disable_reset(1, wdt);
+
 	s3c2410wdt_stop(&wdt->wdt_device);
 }
 
@@ -488,6 +586,9 @@ static int s3c2410wdt_suspend(struct device *dev)
 	wdt->wtcon_save = readl(wdt->reg_base + S3C2410_WTCON);
 	wdt->wtdat_save = readl(wdt->reg_base + S3C2410_WTDAT);
 
+	if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
+		s3c2410wdt_mask_and_disable_reset(1, wdt);
+
 	/* Note that WTCNT doesn't need to be saved. */
 	s3c2410wdt_stop(&wdt->wdt_device);
 
@@ -503,6 +604,9 @@ static int s3c2410wdt_resume(struct device *dev)
 	writel(wdt->wtdat_save, wdt->reg_base + S3C2410_WTCNT);/* Reset count */
 	writel(wdt->wtcon_save, wdt->reg_base + S3C2410_WTCON);
 
+	if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
+		s3c2410wdt_mask_and_disable_reset(0, wdt);
+
 	dev_info(dev, "watchdog %sabled\n",
 		(wdt->wtcon_save & S3C2410_WTCON_ENABLE) ? "en" : "dis");
 
@@ -513,14 +617,6 @@ static int s3c2410wdt_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(s3c2410wdt_pm_ops, s3c2410wdt_suspend,
 			s3c2410wdt_resume);
 
-#ifdef CONFIG_OF
-static const struct of_device_id s3c2410_wdt_match[] = {
-	{ .compatible = "samsung,s3c2410-wdt" },
-	{},
-};
-MODULE_DEVICE_TABLE(of, s3c2410_wdt_match);
-#endif
-
 static struct platform_driver s3c2410wdt_driver = {
 	.probe		= s3c2410wdt_probe,
 	.remove		= s3c2410wdt_remove,
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30  9:51 ` [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file Leela Krishna Amudala
@ 2013-10-30  9:52   ` Sachin Kamat
  2013-10-30 10:09     ` Leela Krishna Amudala
  2013-10-30 14:42   ` Tomasz Figa
  1 sibling, 1 reply; 13+ messages in thread
From: Sachin Kamat @ 2013-10-30  9:52 UTC (permalink / raw)
  To: Leela Krishna Amudala
  Cc: linux-samsung-soc, Kukjin Kim, Wim Van Sebroeck, Tomasz Figa,
	devicetree, Doug Anderson, linux-watchdog, cpgs

Hi Leela,

On 30 October 2013 15:21, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
> register accesses in a centralized way using syscon driver
>
> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
> ---
>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
> index e52b038..918e732 100644
> --- a/arch/arm/boot/dts/exynos5.dtsi
> +++ b/arch/arm/boot/dts/exynos5.dtsi
> @@ -106,4 +106,9 @@
>                 #size-cells = <0>;
>                 status = "disabled";
>         };
> +
> +       pmu_sys_reg: pmusysreg@1004000 {
> +               compatible = "syscon";
> +               reg = <0x10040000 0x5000>;
> +       };
>  };

Had a look at this in a bit detail and found the following.
The register base address for this block on 5250 and 5420 as per the
TRM is 0x10050000.

Also, the binding document specifies the naming convention. According
to it this node
should like:

sys_reg: sysreg@10050000 {
           compatible = "samsung,exynos5-sysreg", "syscon";
           reg = <0x10050000 0x500>;
};

-- 
With warm regards,
Sachin

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30  9:52   ` Sachin Kamat
@ 2013-10-30 10:09     ` Leela Krishna Amudala
  2013-10-30 10:13       ` Sachin Kamat
  0 siblings, 1 reply; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-30 10:09 UTC (permalink / raw)
  To: Sachin Kamat
  Cc: Leela Krishna Amudala, linux-samsung-soc, Kukjin Kim,
	Wim Van Sebroeck, Tomasz Figa, devicetree, Doug Anderson,
	linux-watchdog, cpgs

Hi,

On Wed, Oct 30, 2013 at 3:22 PM, Sachin Kamat <sachin.kamat@linaro.org> wrote:
> Hi Leela,
>
> On 30 October 2013 15:21, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
>> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
>> register accesses in a centralized way using syscon driver
>>
>> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
>> ---
>>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
>> index e52b038..918e732 100644
>> --- a/arch/arm/boot/dts/exynos5.dtsi
>> +++ b/arch/arm/boot/dts/exynos5.dtsi
>> @@ -106,4 +106,9 @@
>>                 #size-cells = <0>;
>>                 status = "disabled";
>>         };
>> +
>> +       pmu_sys_reg: pmusysreg@1004000 {
>> +               compatible = "syscon";
>> +               reg = <0x10040000 0x5000>;
>> +       };
>>  };
>
> Had a look at this in a bit detail and found the following.
> The register base address for this block on 5250 and 5420 as per the
> TRM is 0x10050000.
>
> Also, the binding document specifies the naming convention. According
> to it this node
> should like:
>
> sys_reg: sysreg@10050000 {
>            compatible = "samsung,exynos5-sysreg", "syscon";
>            reg = <0x10050000 0x500>;
> };
>

I know, but here my intention is not to regmap system register (0x10050000),
but instead PMU register (0x10040000), Hence created this node.

~Leela Krishna

> --
> With warm regards,
> Sachin
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30 10:09     ` Leela Krishna Amudala
@ 2013-10-30 10:13       ` Sachin Kamat
  2013-10-30 11:22         ` Tomasz Figa
  0 siblings, 1 reply; 13+ messages in thread
From: Sachin Kamat @ 2013-10-30 10:13 UTC (permalink / raw)
  To: Leela Krishna Amudala
  Cc: linux-samsung-soc, Kukjin Kim, Wim Van Sebroeck, Tomasz Figa,
	devicetree, Doug Anderson, linux-watchdog, cpgs

On 30 October 2013 15:39, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
> Hi,
>
> On Wed, Oct 30, 2013 at 3:22 PM, Sachin Kamat <sachin.kamat@linaro.org> wrote:
>> Hi Leela,
>>
>> On 30 October 2013 15:21, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
>>> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
>>> register accesses in a centralized way using syscon driver
>>>
>>> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
>>> ---
>>>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
>>>  1 file changed, 5 insertions(+)
>>>
>>> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
>>> index e52b038..918e732 100644
>>> --- a/arch/arm/boot/dts/exynos5.dtsi
>>> +++ b/arch/arm/boot/dts/exynos5.dtsi
>>> @@ -106,4 +106,9 @@
>>>                 #size-cells = <0>;
>>>                 status = "disabled";
>>>         };
>>> +
>>> +       pmu_sys_reg: pmusysreg@1004000 {
>>> +               compatible = "syscon";
>>> +               reg = <0x10040000 0x5000>;
>>> +       };
>>>  };
>>
>> Had a look at this in a bit detail and found the following.
>> The register base address for this block on 5250 and 5420 as per the
>> TRM is 0x10050000.
>>
>> Also, the binding document specifies the naming convention. According
>> to it this node
>> should like:
>>
>> sys_reg: sysreg@10050000 {
>>            compatible = "samsung,exynos5-sysreg", "syscon";
>>            reg = <0x10050000 0x500>;
>> };
>>
>
> I know, but here my intention is not to regmap system register (0x10050000),
> but instead PMU register (0x10040000), Hence created this node.

This clashes with the existing binding for this type of node. Probably
you will need to
define it differently?

-- 
With warm regards,
Sachin

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30 10:13       ` Sachin Kamat
@ 2013-10-30 11:22         ` Tomasz Figa
  2013-10-30 15:26           ` Guenter Roeck
  0 siblings, 1 reply; 13+ messages in thread
From: Tomasz Figa @ 2013-10-30 11:22 UTC (permalink / raw)
  To: Sachin Kamat
  Cc: Leela Krishna Amudala, linux-samsung-soc, Kukjin Kim,
	Wim Van Sebroeck, devicetree, Doug Anderson, linux-watchdog, cpgs

On Wednesday 30 of October 2013 15:43:19 Sachin Kamat wrote:
> On 30 October 2013 15:39, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
> > Hi,
> >
> > On Wed, Oct 30, 2013 at 3:22 PM, Sachin Kamat <sachin.kamat@linaro.org> wrote:
> >> Hi Leela,
> >>
> >> On 30 October 2013 15:21, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
> >>> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
> >>> register accesses in a centralized way using syscon driver
> >>>
> >>> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
> >>> ---
> >>>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
> >>>  1 file changed, 5 insertions(+)
> >>>
> >>> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
> >>> index e52b038..918e732 100644
> >>> --- a/arch/arm/boot/dts/exynos5.dtsi
> >>> +++ b/arch/arm/boot/dts/exynos5.dtsi
> >>> @@ -106,4 +106,9 @@
> >>>                 #size-cells = <0>;
> >>>                 status = "disabled";
> >>>         };
> >>> +
> >>> +       pmu_sys_reg: pmusysreg@1004000 {
> >>> +               compatible = "syscon";
> >>> +               reg = <0x10040000 0x5000>;
> >>> +       };
> >>>  };
> >>
> >> Had a look at this in a bit detail and found the following.
> >> The register base address for this block on 5250 and 5420 as per the
> >> TRM is 0x10050000.
> >>
> >> Also, the binding document specifies the naming convention. According
> >> to it this node
> >> should like:
> >>
> >> sys_reg: sysreg@10050000 {
> >>            compatible = "samsung,exynos5-sysreg", "syscon";
> >>            reg = <0x10050000 0x500>;
> >> };
> >>
> >
> > I know, but here my intention is not to regmap system register (0x10050000),
> > but instead PMU register (0x10040000), Hence created this node.
> 
> This clashes with the existing binding for this type of node. Probably
> you will need to
> define it differently?

PMU and System Registers are two completely separate entities. However
a generic syscon binding can be used to represent both, because they are
just collections of registers shared by multiple IPs.

Best regards,
Tomasz

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register
  2013-10-30  9:51 ` [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register Leela Krishna Amudala
@ 2013-10-30 14:39   ` Tomasz Figa
  2013-10-31  5:31     ` Leela Krishna Amudala
  0 siblings, 1 reply; 13+ messages in thread
From: Tomasz Figa @ 2013-10-30 14:39 UTC (permalink / raw)
  To: Leela Krishna Amudala
  Cc: linux-samsung-soc, kgene.kim, wim, devicetree, dianders,
	linux-watchdog, cpgs, sachin.kamat

Hi Leela,

On Wednesday 30 of October 2013 15:21:13 Leela Krishna Amudala 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.krishna@samsung.com>
> ---
>  .../devicetree/bindings/watchdog/samsung-wdt.txt   |   19 +++-
>  drivers/watchdog/s3c2410_wdt.c                     |  112 ++++++++++++++++++--
>  2 files changed, 122 insertions(+), 9 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
> index 2aa486c..5a9889b 100644
> --- a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
> +++ b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
> @@ -5,10 +5,27 @@ 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 one among the following
> +	(a) "samsung,s3c2410-wdt" for Exynos4 and previous SoCs
> +	(b) "samsung,exynos5250-wdt" for Exynos5250
> +	(c) "samsung,exynos5420-wdt" for Exynos5420
> +
>  - 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)

I don't really like the name of this property. Maybe
samsung,syscon-phandle would be better?

I'm not sure if this property should be tied to PMU, as on future SoCs
those registers might be located in another syscon-style IP. The
description should note that in case of Exynos 5250 and 5420 this should
point to the PMU node, though.

>  
>  Optional properties:
>  - timeout-sec : contains the watchdog timeout in seconds.
> +
> +Example:
> +
> +watchdog@101D0000 {
> +	compatible = "samsung,exynos5250-wdt";
> +	reg = <0x101D0000 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..d8aefef 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 {

For the sake of future extensibility I'd rename this struct to
s3c2410_wdt_variant and add an u32 quirks field, which would has
the QUIRK_NEEDS_PMU_CONFIG set for 5250 and 5420 variants.

> +	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 int		quirks;

Quirks should be a static per-variant property.

> +};
> +
> +#ifdef CONFIG_OF
> +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
> +};
> +
> +static const struct of_device_id s3c2410_wdt_match[] = {
> +	{ .compatible = "samsung,s3c2410-wdt" },

If you follow what I suggested above, the basic variant would also have
a variant struct associated with it, which would be more consistent.

> +	{ .compatible = "samsung,exynos5250-wdt",
> +	  .data = (struct pmu_config *) &pmu_config_5250 },
> +	{ .compatible = "samsung,exynos5420-wdt",
> +	  .data = (struct pmu_config *) &pmu_config_5420 },
> +	{},
>  };
> +MODULE_DEVICE_TABLE(of, s3c2410_wdt_match);
> +#endif
>  
>  /* watchdog control routines */
>  
> @@ -111,6 +150,38 @@ 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, "failed to read disable reg(%d)\n", ret);
> +		return;
> +	}
> +
> +	ret = regmap_read(wdt->pmureg, wdt->wdt_pmu_config->mask_reset_reg,
> +								&mask_reset);
> +	if (ret < 0) {
> +		dev_err(wdt->dev, "failed to read mask reset reg(%d)\n", ret);
> +		return;
> +	}
> +
> +	if (mask) {
> +		disable |= (1 << wdt->wdt_pmu_config->mask_bit);
> +		mask_reset |= (1 << wdt->wdt_pmu_config->mask_bit);
> +	} else {
> +		disable &= ~(1 << wdt->wdt_pmu_config->mask_bit);
> +		mask_reset &= ~(1 << wdt->wdt_pmu_config->mask_bit);
> +	}
> +
> +	regmap_write(wdt->pmureg, wdt->wdt_pmu_config->disable_reg, disable);
> +	regmap_write(wdt->pmureg, wdt->wdt_pmu_config->mask_reset_reg,
> +								mask_reset);

I believe you can (and on some SoCs even have to, due to other bits in the
registers being used for other purposes) use regmap_update_bits() for
read-modify-write sequences above.

> +}
> +
>  static int s3c2410wdt_keepalive(struct watchdog_device *wdd)
>  {
>  	struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd);
> @@ -332,6 +403,14 @@ static inline void s3c2410wdt_cpufreq_deregister(struct s3c2410_wdt *wdt)
>  }
>  #endif
>  
> +/* s3c2410_get_wdt_driver_data */
> +static inline unsigned int get_wdt_driver_data(struct platform_device *pdev)
> +{
> +	const struct of_device_id *match;
> +	match = of_match_node(s3c2410_wdt_match, pdev->dev.of_node);
> +	return (unsigned int)match->data;

Why do you need this cast? I believe this function should simply return
(const struct pmu_config *) or (const struct s3c2410_wdt_variant *) when
my comments above get addressed.

> +}
> +
>  static int s3c2410wdt_probe(struct platform_device *pdev)
>  {
>  	struct device *dev;
> @@ -354,6 +433,17 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
>  	spin_lock_init(&wdt->lock);
>  	wdt->wdt_device = s3c2410_wdd;
>  
> +	wdt->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
> +						"samsung,pmusysreg");
> +	if (IS_ERR(wdt->pmureg)) {
> +		dev_err(dev, "syscon regmap lookup failed.\n");
> +		return PTR_ERR(wdt->pmureg);
> +	}

This should be performed only if given variant has the
QUIRK_NEEDS_PMU_CONFIG flag set in its variant data. Otherwise you don't
have any distinction between cases when PMU is not needed (and so
unspecified) and PMU is needed, but unspecified.

> +
> +	wdt->wdt_pmu_config = (struct pmu_config *) get_wdt_driver_data(pdev);
> +	if (wdt->wdt_pmu_config)
> +		wdt->quirks = QUIRK_NEEDS_PMU_CONFIG;

See my comment on quirks above.

> +
>  	wdt_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
>  	if (wdt_irq == NULL) {
>  		dev_err(dev, "no irq resource specified\n");
> @@ -444,6 +534,8 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
>  		 (wtcon & S3C2410_WTCON_RSTEN) ? "en" : "dis",
>  		 (wtcon & S3C2410_WTCON_INTEN) ? "en" : "dis");
>  
> +	if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
> +		s3c2410wdt_mask_and_disable_reset(0, wdt);

nit: Blank line here would be nice.

Best regards,
Tomasz

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30  9:51 ` [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file Leela Krishna Amudala
  2013-10-30  9:52   ` Sachin Kamat
@ 2013-10-30 14:42   ` Tomasz Figa
  2013-10-31  5:29     ` Leela Krishna Amudala
  1 sibling, 1 reply; 13+ messages in thread
From: Tomasz Figa @ 2013-10-30 14:42 UTC (permalink / raw)
  To: Leela Krishna Amudala
  Cc: linux-samsung-soc, kgene.kim, wim, devicetree, dianders,
	linux-watchdog, cpgs, sachin.kamat

Hi Leela,

On Wednesday 30 of October 2013 15:21:11 Leela Krishna Amudala wrote:
> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
> register accesses in a centralized way using syscon driver
> 
> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
> ---
>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
> index e52b038..918e732 100644
> --- a/arch/arm/boot/dts/exynos5.dtsi
> +++ b/arch/arm/boot/dts/exynos5.dtsi
> @@ -106,4 +106,9 @@
>  		#size-cells = <0>;
>  		status = "disabled";
>  	};
> +
> +	pmu_sys_reg: pmusysreg@1004000 {

Please keep the node name generic, syscon should be fine. Also there is
a typo in unit-address suffix. The label could also have a better name,
like pmu_syscon.

Best regards,
Tomasz

> +		compatible = "syscon";
> +		reg = <0x10040000 0x5000>;
> +	};
>  };
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30 11:22         ` Tomasz Figa
@ 2013-10-30 15:26           ` Guenter Roeck
  0 siblings, 0 replies; 13+ messages in thread
From: Guenter Roeck @ 2013-10-30 15:26 UTC (permalink / raw)
  To: Tomasz Figa
  Cc: Sachin Kamat, Leela Krishna Amudala, linux-samsung-soc,
	Kukjin Kim, Wim Van Sebroeck, devicetree, Doug Anderson,
	linux-watchdog, cpgs

On Wed, Oct 30, 2013 at 12:22:09PM +0100, Tomasz Figa wrote:
> On Wednesday 30 of October 2013 15:43:19 Sachin Kamat wrote:
> > On 30 October 2013 15:39, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
> > > Hi,
> > >
> > > On Wed, Oct 30, 2013 at 3:22 PM, Sachin Kamat <sachin.kamat@linaro.org> wrote:
> > >> Hi Leela,
> > >>
> > >> On 30 October 2013 15:21, Leela Krishna Amudala <l.krishna@samsung.com> wrote:
> > >>> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
> > >>> register accesses in a centralized way using syscon driver
> > >>>
> > >>> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
> > >>> ---
> > >>>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
> > >>>  1 file changed, 5 insertions(+)
> > >>>
> > >>> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
> > >>> index e52b038..918e732 100644
> > >>> --- a/arch/arm/boot/dts/exynos5.dtsi
> > >>> +++ b/arch/arm/boot/dts/exynos5.dtsi
> > >>> @@ -106,4 +106,9 @@
> > >>>                 #size-cells = <0>;
> > >>>                 status = "disabled";
> > >>>         };
> > >>> +
> > >>> +       pmu_sys_reg: pmusysreg@1004000 {
> > >>> +               compatible = "syscon";
> > >>> +               reg = <0x10040000 0x5000>;
> > >>> +       };
> > >>>  };
> > >>
> > >> Had a look at this in a bit detail and found the following.
> > >> The register base address for this block on 5250 and 5420 as per the
> > >> TRM is 0x10050000.
> > >>
> > >> Also, the binding document specifies the naming convention. According
> > >> to it this node
> > >> should like:
> > >>
> > >> sys_reg: sysreg@10050000 {
> > >>            compatible = "samsung,exynos5-sysreg", "syscon";
> > >>            reg = <0x10050000 0x500>;
> > >> };
> > >>
> > >
> > > I know, but here my intention is not to regmap system register (0x10050000),
> > > but instead PMU register (0x10040000), Hence created this node.
> > 
> > This clashes with the existing binding for this type of node. Probably
> > you will need to
> > define it differently?
> 
> PMU and System Registers are two completely separate entities. However
> a generic syscon binding can be used to represent both, because they are
> just collections of registers shared by multiple IPs.
> 

I would suggest for the participants in this discussion to send Reviewed-by:
or Acked-by: feedback once you are happy with the patches. I am sure this
would help Wim tremendously when deciding if the series is ready for
integration.

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file
  2013-10-30 14:42   ` Tomasz Figa
@ 2013-10-31  5:29     ` Leela Krishna Amudala
  0 siblings, 0 replies; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-31  5:29 UTC (permalink / raw)
  To: Tomasz Figa
  Cc: Leela Krishna Amudala, linux-samsung-soc, Kukjin Kim,
	Wim Van Sebroeck, devicetree, Douglas Anderson, linux-watchdog,
	cpgs, Sachin Kamat

Hi Tomasz,

On Wed, Oct 30, 2013 at 8:12 PM, Tomasz Figa <t.figa@samsung.com> wrote:
> Hi Leela,
>
> On Wednesday 30 of October 2013 15:21:11 Leela Krishna Amudala wrote:
>> This patch adds pmusysreg node to Exynos5 dtsi file to handle PMU
>> register accesses in a centralized way using syscon driver
>>
>> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com>
>> ---
>>  arch/arm/boot/dts/exynos5.dtsi |    5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
>> index e52b038..918e732 100644
>> --- a/arch/arm/boot/dts/exynos5.dtsi
>> +++ b/arch/arm/boot/dts/exynos5.dtsi
>> @@ -106,4 +106,9 @@
>>               #size-cells = <0>;
>>               status = "disabled";
>>       };
>> +
>> +     pmu_sys_reg: pmusysreg@1004000 {
>
> Please keep the node name generic, syscon should be fine. Also there is
> a typo in unit-address suffix. The label could also have a better name,
> like pmu_syscon.
>

Okay, will change it.
/Leela Krishna

> Best regards,
> Tomasz
>
>> +             compatible = "syscon";
>> +             reg = <0x10040000 0x5000>;
>> +     };
>>  };
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register
  2013-10-30 14:39   ` Tomasz Figa
@ 2013-10-31  5:31     ` Leela Krishna Amudala
  0 siblings, 0 replies; 13+ messages in thread
From: Leela Krishna Amudala @ 2013-10-31  5:31 UTC (permalink / raw)
  To: Tomasz Figa
  Cc: Leela Krishna Amudala, linux-samsung-soc, Kukjin Kim,
	Wim Van Sebroeck, devicetree, Douglas Anderson, linux-watchdog,
	cpgs, Sachin Kamat

Hi Tomasz,

On Wed, Oct 30, 2013 at 8:09 PM, Tomasz Figa <t.figa@samsung.com> wrote:
> Hi Leela,
>
> On Wednesday 30 of October 2013 15:21:13 Leela Krishna Amudala 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.krishna@samsung.com>
>> ---
>>  .../devicetree/bindings/watchdog/samsung-wdt.txt   |   19 +++-
>>  drivers/watchdog/s3c2410_wdt.c                     |  112 ++++++++++++++++++--
>>  2 files changed, 122 insertions(+), 9 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
>> index 2aa486c..5a9889b 100644
>> --- a/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
>> +++ b/Documentation/devicetree/bindings/watchdog/samsung-wdt.txt
>> @@ -5,10 +5,27 @@ 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 one among the following
>> +     (a) "samsung,s3c2410-wdt" for Exynos4 and previous SoCs
>> +     (b) "samsung,exynos5250-wdt" for Exynos5250
>> +     (c) "samsung,exynos5420-wdt" for Exynos5420
>> +
>>  - 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)
>
> I don't really like the name of this property. Maybe
> samsung,syscon-phandle would be better?
>
Okay, changed.

> I'm not sure if this property should be tied to PMU, as on future SoCs
> those registers might be located in another syscon-style IP. The
> description should note that in case of Exynos 5250 and 5420 this should
> point to the PMU node, though.
>

Added

>>
>>  Optional properties:
>>  - timeout-sec : contains the watchdog timeout in seconds.
>> +
>> +Example:
>> +
>> +watchdog@101D0000 {
>> +     compatible = "samsung,exynos5250-wdt";
>> +     reg = <0x101D0000 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..d8aefef 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 {
>
> For the sake of future extensibility I'd rename this struct to
> s3c2410_wdt_variant and add an u32 quirks field, which would has
> the QUIRK_NEEDS_PMU_CONFIG set for 5250 and 5420 variants.
>

Modified

>> +     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 int            quirks;
>
> Quirks should be a static per-variant property.
>

Taken care

>> +};
>> +
>> +#ifdef CONFIG_OF
>> +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
>> +};
>> +
>> +static const struct of_device_id s3c2410_wdt_match[] = {
>> +     { .compatible = "samsung,s3c2410-wdt" },
>
> If you follow what I suggested above, the basic variant would also have
> a variant struct associated with it, which would be more consistent.
>
>> +     { .compatible = "samsung,exynos5250-wdt",
>> +       .data = (struct pmu_config *) &pmu_config_5250 },
>> +     { .compatible = "samsung,exynos5420-wdt",
>> +       .data = (struct pmu_config *) &pmu_config_5420 },
>> +     {},
>>  };
>> +MODULE_DEVICE_TABLE(of, s3c2410_wdt_match);
>> +#endif
>>
>>  /* watchdog control routines */
>>
>> @@ -111,6 +150,38 @@ 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, "failed to read disable reg(%d)\n", ret);
>> +             return;
>> +     }
>> +
>> +     ret = regmap_read(wdt->pmureg, wdt->wdt_pmu_config->mask_reset_reg,
>> +                                                             &mask_reset);
>> +     if (ret < 0) {
>> +             dev_err(wdt->dev, "failed to read mask reset reg(%d)\n", ret);
>> +             return;
>> +     }
>> +
>> +     if (mask) {
>> +             disable |= (1 << wdt->wdt_pmu_config->mask_bit);
>> +             mask_reset |= (1 << wdt->wdt_pmu_config->mask_bit);
>> +     } else {
>> +             disable &= ~(1 << wdt->wdt_pmu_config->mask_bit);
>> +             mask_reset &= ~(1 << wdt->wdt_pmu_config->mask_bit);
>> +     }
>> +
>> +     regmap_write(wdt->pmureg, wdt->wdt_pmu_config->disable_reg, disable);
>> +     regmap_write(wdt->pmureg, wdt->wdt_pmu_config->mask_reset_reg,
>> +                                                             mask_reset);
>
> I believe you can (and on some SoCs even have to, due to other bits in the
> registers being used for other purposes) use regmap_update_bits() for
> read-modify-write sequences above.
>

Okay, Modified

>> +}
>> +
>>  static int s3c2410wdt_keepalive(struct watchdog_device *wdd)
>>  {
>>       struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd);
>> @@ -332,6 +403,14 @@ static inline void s3c2410wdt_cpufreq_deregister(struct s3c2410_wdt *wdt)
>>  }
>>  #endif
>>
>> +/* s3c2410_get_wdt_driver_data */
>> +static inline unsigned int get_wdt_driver_data(struct platform_device *pdev)
>> +{
>> +     const struct of_device_id *match;
>> +     match = of_match_node(s3c2410_wdt_match, pdev->dev.of_node);
>> +     return (unsigned int)match->data;
>
> Why do you need this cast? I believe this function should simply return
> (const struct pmu_config *) or (const struct s3c2410_wdt_variant *) when
> my comments above get addressed.
>

My mistake, Changed

>> +}
>> +
>>  static int s3c2410wdt_probe(struct platform_device *pdev)
>>  {
>>       struct device *dev;
>> @@ -354,6 +433,17 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
>>       spin_lock_init(&wdt->lock);
>>       wdt->wdt_device = s3c2410_wdd;
>>
>> +     wdt->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
>> +                                             "samsung,pmusysreg");
>> +     if (IS_ERR(wdt->pmureg)) {
>> +             dev_err(dev, "syscon regmap lookup failed.\n");
>> +             return PTR_ERR(wdt->pmureg);
>> +     }
>
> This should be performed only if given variant has the
> QUIRK_NEEDS_PMU_CONFIG flag set in its variant data. Otherwise you don't
> have any distinction between cases when PMU is not needed (and so
> unspecified) and PMU is needed, but unspecified.
>

Okay, Taken care

>> +
>> +     wdt->wdt_pmu_config = (struct pmu_config *) get_wdt_driver_data(pdev);
>> +     if (wdt->wdt_pmu_config)
>> +             wdt->quirks = QUIRK_NEEDS_PMU_CONFIG;
>
> See my comment on quirks above.
>
>> +
>>       wdt_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
>>       if (wdt_irq == NULL) {
>>               dev_err(dev, "no irq resource specified\n");
>> @@ -444,6 +534,8 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
>>                (wtcon & S3C2410_WTCON_RSTEN) ? "en" : "dis",
>>                (wtcon & S3C2410_WTCON_INTEN) ? "en" : "dis");
>>
>> +     if (wdt->quirks & QUIRK_NEEDS_PMU_CONFIG)
>> +             s3c2410wdt_mask_and_disable_reset(0, wdt);
>
> nit: Blank line here would be nice.
>

Done.

Best Wishes,
Leela Krishna

> Best regards,
> Tomasz
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2013-10-31  5:31 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-30  9:51 [PATCH V4 0/3] Add watchdog DT nodes and use syscon regmap interfac to configure pmu registers Leela Krishna Amudala
2013-10-30  9:51 ` [PATCH V4 1/3] ARM: dts: Add pmu sysreg node to Exynos5 dtsi file Leela Krishna Amudala
2013-10-30  9:52   ` Sachin Kamat
2013-10-30 10:09     ` Leela Krishna Amudala
2013-10-30 10:13       ` Sachin Kamat
2013-10-30 11:22         ` Tomasz Figa
2013-10-30 15:26           ` Guenter Roeck
2013-10-30 14:42   ` Tomasz Figa
2013-10-31  5:29     ` Leela Krishna Amudala
2013-10-30  9:51 ` [PATCH V4 2/3] ARM: dts: add watchdog device nodes for Exynos5250 and Exynos5420 Leela Krishna Amudala
2013-10-30  9:51 ` [PATCH V4 3/3] watchdog: s3c2410_wdt: use syscon regmap interface to configure pmu register Leela Krishna Amudala
2013-10-30 14:39   ` Tomasz Figa
2013-10-31  5:31     ` Leela Krishna Amudala

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).