devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/7] ARM: davinci: add genpd support
@ 2018-02-07 13:45 Bartosz Golaszewski
  2018-02-07 13:45 ` [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd Bartosz Golaszewski
                   ` (7 more replies)
  0 siblings, 8 replies; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Hi Sekhar et al,

please take a look at the following patches. They add a simple genpd
driver and use it in DT mode on da850 boards.

I was trying to use genpd in legacy mode too, but couldn't find neither
any interfaces nor users that would do that. For now I added a check in
arch/arm/mach-davinci/pm_domain.c that disables the clock pm setup if
we're using genpd.

This series applies on top of and has been tested with David Lechner's
for-bartosz branch. It fixes the clock look-up issues we faced with
lcdc and emac.

Bartosz Golaszewski (7):
  dt-bindings: soc: new driver for DaVinci genpd
  soc: davinci: new genpd driver
  ARM: davinci: don't setup pm_clk if we're using genpd
  ARM: dts: da850: add power controller nodes
  ARM: dts: da850: add power-domains properties to device nodes
  ARM: davinci: select generic power domains for DaVinci in DT mode
  ARM: davinci_all_defconfig: select the DaVinci genpd driver in DT mode

 .../bindings/soc/ti,davinci-pm-domains.txt         |  13 +++
 arch/arm/boot/dts/da850.dtsi                       |  46 ++++++++
 arch/arm/configs/davinci_all_defconfig             |   2 +
 arch/arm/mach-davinci/Kconfig                      |   1 +
 arch/arm/mach-davinci/pm_domain.c                  |   9 +-
 drivers/soc/Kconfig                                |   1 +
 drivers/soc/Makefile                               |   1 +
 drivers/soc/davinci/Kconfig                        |  16 +++
 drivers/soc/davinci/Makefile                       |   1 +
 drivers/soc/davinci/davinci_pm_domains.c           | 125 +++++++++++++++++++++
 10 files changed, 214 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
 create mode 100644 drivers/soc/davinci/Kconfig
 create mode 100644 drivers/soc/davinci/Makefile
 create mode 100644 drivers/soc/davinci/davinci_pm_domains.c

-- 
2.16.1

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

* [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
@ 2018-02-07 13:45 ` Bartosz Golaszewski
  2018-02-07 21:47   ` David Lechner
  2018-02-07 13:45 ` [PATCH 2/7] soc: davinci: new genpd driver Bartosz Golaszewski
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Add a simple document for the DaVinci genpd driver. We use clock pm
exclusively hence no reg property.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 .../devicetree/bindings/soc/ti,davinci-pm-domains.txt       | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt

diff --git a/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
new file mode 100644
index 000000000000..935d063c7b35
--- /dev/null
+++ b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
@@ -0,0 +1,13 @@
+Device tree bindings for the genpd driver for Texas Instruments DaVinci SoCs
+
+Required properties:
+
+- compatible:           must be "ti,davinci-pm-domains"
+- #power-domain-cells:  must be 0
+
+Example:
+
+pwc1: power-controller@227000 {
+	compatible = "ti,davinci-pm-domains";
+	#power-domain-cells = <0>;
+};
-- 
2.16.1

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

* [PATCH 2/7] soc: davinci: new genpd driver
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
  2018-02-07 13:45 ` [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd Bartosz Golaszewski
@ 2018-02-07 13:45 ` Bartosz Golaszewski
       [not found]   ` <20180207134553.13510-3-brgl-ARrdPY/1zhM@public.gmane.org>
  2018-02-08  9:30   ` Sekhar Nori
  2018-02-07 13:45 ` [PATCH 3/7] ARM: davinci: don't setup pm_clk if we're using genpd Bartosz Golaszewski
                   ` (5 subsequent siblings)
  7 siblings, 2 replies; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Add a simple clock_pm-based driver for DaVinci SoCs. This is required
to complete the transision to using the common clock framework for this
architecture.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 drivers/soc/Kconfig                      |   1 +
 drivers/soc/Makefile                     |   1 +
 drivers/soc/davinci/Kconfig              |  16 ++++
 drivers/soc/davinci/Makefile             |   1 +
 drivers/soc/davinci/davinci_pm_domains.c | 125 +++++++++++++++++++++++++++++++
 5 files changed, 144 insertions(+)
 create mode 100644 drivers/soc/davinci/Kconfig
 create mode 100644 drivers/soc/davinci/Makefile
 create mode 100644 drivers/soc/davinci/davinci_pm_domains.c

diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index fc9e98047421..f318899a6cf6 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -4,6 +4,7 @@ source "drivers/soc/actions/Kconfig"
 source "drivers/soc/amlogic/Kconfig"
 source "drivers/soc/atmel/Kconfig"
 source "drivers/soc/bcm/Kconfig"
+source "drivers/soc/davinci/Kconfig"
 source "drivers/soc/fsl/Kconfig"
 source "drivers/soc/imx/Kconfig"
 source "drivers/soc/mediatek/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index deecb16e7256..8e5fe23d6678 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_ARCH_AT91)		+= atmel/
 obj-y				+= bcm/
 obj-$(CONFIG_ARCH_DOVE)		+= dove/
 obj-$(CONFIG_MACH_DOVE)		+= dove/
+obj-$(CONFIG_ARCH_DAVINCI)	+= davinci/
 obj-y				+= fsl/
 obj-$(CONFIG_ARCH_MXC)		+= imx/
 obj-$(CONFIG_SOC_XWAY)		+= lantiq/
diff --git a/drivers/soc/davinci/Kconfig b/drivers/soc/davinci/Kconfig
new file mode 100644
index 000000000000..7ee44f4ff41e
--- /dev/null
+++ b/drivers/soc/davinci/Kconfig
@@ -0,0 +1,16 @@
+#
+# TI DaVinci SOC drivers
+#
+menuconfig SOC_DAVINCI
+	bool "TI DaVinci SOC drivers support"
+
+if SOC_DAVINCI
+
+config DAVINCI_PM_DOMAINS
+	tristate "TI DaVinci PM Domains Driver"
+	depends on ARCH_DAVINCI
+	depends on PM_GENERIC_DOMAINS
+	help
+	  Generic power domains driver for TI DaVinci family of SoCs.
+
+endif # SOC_DAVINCI
diff --git a/drivers/soc/davinci/Makefile b/drivers/soc/davinci/Makefile
new file mode 100644
index 000000000000..822b03c18260
--- /dev/null
+++ b/drivers/soc/davinci/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_DAVINCI_PM_DOMAINS)        += davinci_pm_domains.o
diff --git a/drivers/soc/davinci/davinci_pm_domains.c b/drivers/soc/davinci/davinci_pm_domains.c
new file mode 100644
index 000000000000..c27d4c404d52
--- /dev/null
+++ b/drivers/soc/davinci/davinci_pm_domains.c
@@ -0,0 +1,125 @@
+/*
+ * TI DaVinci Generic Power Domain Driver
+ *
+ * Copyright (C) 2018 BayLibre SAS
+ *         Bartosz Golaszewski <bgolaszewski@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+#include <linux/pm_domain.h>
+#include <linux/pm_clock.h>
+
+struct davinci_genpd_ctx {
+	struct device *dev;
+	struct generic_pm_domain pd;
+	struct clk *pm_clk;
+};
+
+static int davinci_genpd_attach_dev(struct generic_pm_domain *domain,
+				    struct device *dev)
+{
+	struct davinci_genpd_ctx *ctx;
+	struct clk *clk;
+	int rv;
+
+	ctx = container_of(domain, struct davinci_genpd_ctx, pd);
+
+	if (dev->pm_domain)
+		return -EEXIST;
+
+	/*
+	 * DaVinci always uses a single clock for power-management. We assume
+	 * it's the first one in the clocks property.
+	 */
+	clk = of_clk_get(dev->of_node, 0);
+	if (IS_ERR(clk))
+		return PTR_ERR(clk);
+
+	rv = pm_clk_create(dev);
+	if (rv) {
+		clk_put(clk);
+		return rv;
+	}
+
+	rv = pm_clk_add_clk(dev, clk);
+	if (rv) {
+		pm_clk_destroy(dev);
+		return rv;
+	}
+
+	dev_pm_domain_set(dev, &domain->domain);
+	ctx->pm_clk = clk;
+
+	return 0;
+}
+
+static void davinci_genpd_detach_dev(struct generic_pm_domain *domain,
+				     struct device *dev)
+{
+	struct davinci_genpd_ctx *ctx;
+
+	ctx = container_of(domain, struct davinci_genpd_ctx, pd);
+
+	pm_clk_remove_clk(dev, ctx->pm_clk);
+	pm_clk_destroy(dev);
+}
+
+static const struct of_device_id davinci_genpd_matches[] = {
+	{ .compatible = "ti,davinci-pm-domains", },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, davinci_genpd_matches);
+
+static int davinci_genpd_probe(struct platform_device *pdev)
+{
+	struct davinci_genpd_ctx *pd;
+	struct device_node *np;
+	struct device *dev;
+
+	dev = &pdev->dev;
+	np = dev->of_node;
+
+	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
+	if (!pd)
+		return -ENOMEM;
+
+	pd->pd.name = devm_kasprintf(dev, GFP_KERNEL,
+				     "davinci_pwc_pd%d",
+				     of_alias_get_id(np, "pwc"));
+	if (!pd->pd.name)
+		return -ENOMEM;
+
+	pd->dev = dev;
+	pd->pd.attach_dev = davinci_genpd_attach_dev;
+	pd->pd.detach_dev = davinci_genpd_detach_dev;
+	pd->pd.flags |= GENPD_FLAG_PM_CLK;
+
+	pm_genpd_init(&pd->pd, NULL, true);
+
+	return of_genpd_add_provider_simple(np, &pd->pd);
+}
+
+static struct platform_driver davinci_genpd_driver = {
+	.probe = davinci_genpd_probe,
+	.driver = {
+		.name = "davinci_genpd",
+		.of_match_table = davinci_genpd_matches,
+	},
+};
+module_platform_driver(davinci_genpd_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("TI DaVinci Generic Power Domains driver");
+MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski@baylibre.com>");
-- 
2.16.1

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

* [PATCH 3/7] ARM: davinci: don't setup pm_clk if we're using genpd
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
  2018-02-07 13:45 ` [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd Bartosz Golaszewski
  2018-02-07 13:45 ` [PATCH 2/7] soc: davinci: new genpd driver Bartosz Golaszewski
@ 2018-02-07 13:45 ` Bartosz Golaszewski
  2018-02-07 13:45 ` [PATCH 4/7] ARM: dts: da850: add power controller nodes Bartosz Golaszewski
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

As the first step in switching to using the genpd driver in DT mode,
check if a relevant genpd node exists and don't setup the clock pm in
this case.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 arch/arm/mach-davinci/pm_domain.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-davinci/pm_domain.c b/arch/arm/mach-davinci/pm_domain.c
index 78eac2c0c146..98a4f3fcba50 100644
--- a/arch/arm/mach-davinci/pm_domain.c
+++ b/arch/arm/mach-davinci/pm_domain.c
@@ -13,6 +13,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/pm_clock.h>
 #include <linux/platform_device.h>
+#include <linux/of.h>
 
 static struct dev_pm_domain davinci_pm_domain = {
 	.ops = {
@@ -28,7 +29,13 @@ static struct pm_clk_notifier_block platform_bus_notifier = {
 
 static int __init davinci_pm_runtime_init(void)
 {
-	pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
+	struct device_node *np;
+
+	/* Use pm_clk as fallback if we're not using genpd. */
+	np = of_find_compatible_node(NULL, NULL, "ti,davinci-pm-domains");
+	if (!np)
+		pm_clk_add_notifier(&platform_bus_type,
+				    &platform_bus_notifier);
 
 	return 0;
 }
-- 
2.16.1

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

* [PATCH 4/7] ARM: dts: da850: add power controller nodes
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
                   ` (2 preceding siblings ...)
  2018-02-07 13:45 ` [PATCH 3/7] ARM: davinci: don't setup pm_clk if we're using genpd Bartosz Golaszewski
@ 2018-02-07 13:45 ` Bartosz Golaszewski
       [not found]   ` <20180207134553.13510-5-brgl-ARrdPY/1zhM@public.gmane.org>
  2018-02-07 13:45 ` [PATCH 5/7] ARM: dts: da850: add power-domains properties to device nodes Bartosz Golaszewski
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Add two power controller nodes corresponding with the two PSC modules
present on the da850 SoC.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 arch/arm/boot/dts/da850.dtsi | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/arch/arm/boot/dts/da850.dtsi b/arch/arm/boot/dts/da850.dtsi
index 3a1f2ced05ca..ac2eef4e6b7c 100644
--- a/arch/arm/boot/dts/da850.dtsi
+++ b/arch/arm/boot/dts/da850.dtsi
@@ -24,6 +24,11 @@
 		};
 	};
 
+	aliases {
+		pwc0 = &pwc0;
+		pwc1 = &pwc1;
+	};
+
 	opp_table: opp-table {
 		compatible = "operating-points-v2";
 
@@ -141,6 +146,10 @@
 				      "pll0_sysclk4", "pll0_sysclk6",
 				      "async1";
 		};
+		pwc0: power-controller@10000 {
+			compatible = "ti,davinci-pm-domains";
+			#power-domain-cells = <0>;
+		};
 		pll0: clock-controller@11000 {
 			compatible = "ti,da850-pll0";
 			reg = <0x11000 0x1000>;
@@ -757,6 +766,10 @@
 				 <&async3_clk>;
 			clock-names = "pll0_sysclk2", "pll0_sysclk4", "async3";
 		};
+		pwc1: power-controller@227000 {
+			compatible = "ti,davinci-pm-domains";
+			#power-domain-cells = <0>;
+		};
 		pinconf: pin-controller@22c00c {
 			compatible = "ti,da850-pupd";
 			reg = <0x22c00c 0x8>;
-- 
2.16.1

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

* [PATCH 5/7] ARM: dts: da850: add power-domains properties to device nodes
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
                   ` (3 preceding siblings ...)
  2018-02-07 13:45 ` [PATCH 4/7] ARM: dts: da850: add power controller nodes Bartosz Golaszewski
@ 2018-02-07 13:45 ` Bartosz Golaszewski
  2018-02-07 22:21   ` David Lechner
       [not found] ` <20180207134553.13510-1-brgl-ARrdPY/1zhM@public.gmane.org>
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Make all devices managed by PSCs use the genpd driver.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 arch/arm/boot/dts/da850.dtsi | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/arch/arm/boot/dts/da850.dtsi b/arch/arm/boot/dts/da850.dtsi
index ac2eef4e6b7c..a2a1a3b7de3c 100644
--- a/arch/arm/boot/dts/da850.dtsi
+++ b/arch/arm/boot/dts/da850.dtsi
@@ -83,6 +83,7 @@
 			ti,intc-size = <101>;
 			reg = <0xfffee000 0x2000>;
 			clocks = <&psc0 6>;
+			power-domains = <&pwc0>;
 		};
 	};
 	clocks: clocks {
@@ -125,6 +126,7 @@
 		interrupt-parent = <&intc>;
 		interrupts = <28>;
 		clocks = <&psc0 15>;
+		power-domains = <&pwc0>;
 		status = "disabled";
 	};
 	soc@1c00000 {
@@ -400,12 +402,14 @@
 				clocks = <&psc1 1>, <&usb_refclkin>,
 					 <&pll0_auxclk>;
 				clock-names = "fck", "usb_refclkin", "auxclk";
+				power-domains = <&pwc1>;
 			};
 			ehrpwm_tbclk: ehrpwm_tbclk {
 				compatible = "ti,da830-tbclksync";
 				#clock-cells = <0>;
 				clocks = <&psc1 17>;
 				clock-names = "fck";
+				power-domains = <&pwc1>;
 			};
 			div4p5_clk: div4.5 {
 				compatible = "ti,da830-div4p5ena";
@@ -439,6 +443,7 @@
 
 			ti,tptcs = <&edma0_tptc0 7>, <&edma0_tptc1 0>;
 			clocks = <&psc0 0>;
+			power-domains = <&pwc0>;
 		};
 		edma0_tptc0: tptc@8000 {
 			compatible = "ti,edma3-tptc";
@@ -446,6 +451,7 @@
 			interrupts = <13>;
 			interrupt-names = "edm3_tcerrint";
 			clocks = <&psc0 1>;
+			power-domains = <&pwc0>;
 		};
 		edma0_tptc1: tptc@8400 {
 			compatible = "ti,edma3-tptc";
@@ -453,6 +459,7 @@
 			interrupts = <32>;
 			interrupt-names = "edm3_tcerrint";
 			clocks = <&psc0 2>;
+			power-domains = <&pwc0>;
 		};
 		edma1: edma@230000 {
 			compatible = "ti,edma3-tpcc";
@@ -465,6 +472,7 @@
 
 			ti,tptcs = <&edma1_tptc0 7>;
 			clocks = <&psc1 0>;
+			power-domains = <&pwc1>;
 		};
 		edma1_tptc0: tptc@238000 {
 			compatible = "ti,edma3-tptc";
@@ -472,6 +480,7 @@
 			interrupts = <95>;
 			interrupt-names = "edm3_tcerrint";
 			clocks = <&psc1 21>;
+			power-domains = <&pwc1>;
 		};
 		serial0: serial@42000 {
 			compatible = "ti,da830-uart", "ns16550a";
@@ -480,6 +489,7 @@
 			reg-shift = <2>;
 			interrupts = <25>;
 			clocks = <&psc0 9>;
+			power-domains = <&pwc0>;
 			status = "disabled";
 		};
 		serial1: serial@10c000 {
@@ -489,6 +499,7 @@
 			reg-shift = <2>;
 			interrupts = <53>;
 			clocks = <&psc1 12>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		serial2: serial@10d000 {
@@ -498,6 +509,7 @@
 			reg-shift = <2>;
 			interrupts = <61>;
 			clocks = <&psc1 13>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		rtc0: rtc@23000 {
@@ -523,6 +535,7 @@
 			#address-cells = <1>;
 			#size-cells = <0>;
 			clocks = <&psc1 11>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		clocksource: timer@20000 {
@@ -545,6 +558,7 @@
 			dmas = <&edma0 16 0>, <&edma0 17 0>;
 			dma-names = "rx", "tx";
 			clocks = <&psc0 5>;
+			power-domains = <&pwc0>;
 			status = "disabled";
 		};
 		vpif: video@217000 {
@@ -552,6 +566,7 @@
 			reg = <0x217000 0x1000>;
 			interrupts = <92>;
 			clocks = <&psc1 9>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 
 			/* VPIF capture port */
@@ -575,6 +590,7 @@
 			dmas = <&edma1 28 0>, <&edma1 29 0>;
 			dma-names = "rx", "tx";
 			clocks = <&psc1 18>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		ehrpwm0: pwm@300000 {
@@ -585,6 +601,7 @@
 			clocks = <&psc1 17>, <&ehrpwm_tbclk>;
 			clock-names = "fck", "tbclk";
 			status = "disabled";
+			power-domains = <&pwc1>;
 		};
 		ehrpwm1: pwm@302000 {
 			compatible = "ti,da850-ehrpwm", "ti,am3352-ehrpwm",
@@ -592,6 +609,7 @@
 			#pwm-cells = <3>;
 			reg = <0x302000 0x2000>;
 			clocks = <&psc1 17>, <&ehrpwm_tbclk>;
+			power-domains = <&pwc1>;
 			clock-names = "fck", "tbclk";
 			status = "disabled";
 		};
@@ -601,6 +619,7 @@
 			#pwm-cells = <3>;
 			reg = <0x306000 0x80>;
 			clocks = <&psc1 20>;
+			power-domains = <&pwc1>;
 			clock-names = "fck";
 			status = "disabled";
 		};
@@ -610,6 +629,7 @@
 			#pwm-cells = <3>;
 			reg = <0x307000 0x80>;
 			clocks = <&psc1 20>;
+			power-domains = <&pwc1>;
 			clock-names = "fck";
 			status = "disabled";
 		};
@@ -619,6 +639,7 @@
 			#pwm-cells = <3>;
 			reg = <0x308000 0x80>;
 			clocks = <&psc1 20>;
+			power-domains = <&pwc1>;
 			clock-names = "fck";
 			status = "disabled";
 		};
@@ -633,6 +654,7 @@
 			dmas = <&edma0 14 0>, <&edma0 15 0>;
 			dma-names = "rx", "tx";
 			clocks = <&psc0 4>;
+			power-domains = <&pwc0>;
 			status = "disabled";
 		};
 		spi1: spi@30e000 {
@@ -646,6 +668,7 @@
 			dmas = <&edma0 18 0>, <&edma0 19 0>;
 			dma-names = "rx", "tx";
 			clocks = <&psc1 10>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		usb0: usb@200000 {
@@ -658,6 +681,7 @@
 			phys = <&usb_phy 0>;
 			phy-names = "usb-phy";
 			clocks = <&psc1 1>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 
 			#address-cells = <1>;
@@ -682,6 +706,7 @@
 				#dma-cells = <2>;
 				#dma-channels = <4>;
 				clocks = <&psc1 1>;
+				power-domains = <&pwc1>;
 				status = "okay";
 			};
 		};
@@ -690,6 +715,7 @@
 			reg = <0x218000 0x2000>, <0x22c018 0x4>;
 			interrupts = <67>;
 			clocks = <&psc1 8>, <&sata_refclk>;
+			power-domains = <&pwc1>;
 			clock-names = "fck", "refclk";
 			status = "disabled";
 		};
@@ -713,6 +739,7 @@
 			reg = <0x224000 0x1000>;
 			clocks = <&psc1 5>;
 			clock-names = "fck";
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		eth0: ethernet@220000 {
@@ -729,6 +756,7 @@
 					36
 					>;
 			clocks = <&psc1 5>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		usb1: usb@225000 {
@@ -738,6 +766,7 @@
 			phys = <&usb_phy 1>;
 			phy-names = "usb-phy";
 			clocks = <&psc1 2>;
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 		gpio: gpio@226000 {
@@ -756,6 +785,7 @@
 			interrupt-controller;
 			#interrupt-cells = <2>;
 			clocks = <&psc1 3>;
+			power-domains = <&pwc1>;
 			clock-names = "gpio";
 		};
 		psc1: clock-controller@227000 {
@@ -788,6 +818,7 @@
 				<&edma0 0 1>;
 			dma-names = "tx", "rx";
 			clocks = <&psc1 7>;
+			power-domains = <&pwc1>;
 		};
 
 		lcdc: display@213000 {
@@ -797,6 +828,7 @@
 			max-pixelclock = <37500>;
 			clocks = <&psc1 16>;
 			clock-names = "fck";
+			power-domains = <&pwc1>;
 			status = "disabled";
 		};
 	};
@@ -809,6 +841,7 @@
 		ranges = <0 0 0x60000000 0x08000000
 			  1 0 0x68000000 0x00008000>;
 		clocks = <&psc0 3>;
+		power-domains = <&pwc0>;
 		status = "disabled";
 	};
 	memctrl: memory-controller@b0000000 {
-- 
2.16.1

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

* [PATCH 6/7] ARM: davinci: select generic power domains for DaVinci in DT mode
       [not found] ` <20180207134553.13510-1-brgl-ARrdPY/1zhM@public.gmane.org>
@ 2018-02-07 13:45   ` Bartosz Golaszewski
  0 siblings, 0 replies; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>

Automatically select the genpd framework in DT mode.

Signed-off-by: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
---
 arch/arm/mach-davinci/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig
index da8a039d65f9..cb5dd239e375 100644
--- a/arch/arm/mach-davinci/Kconfig
+++ b/arch/arm/mach-davinci/Kconfig
@@ -60,6 +60,7 @@ config MACH_DA8XX_DT
 	depends on ARCH_DAVINCI_DA850
 	select PINCTRL
 	select TIMER_OF
+	select PM_GENERIC_DOMAINS if PM
 	help
 	  Say y here to include support for TI DaVinci DA850 based using
 	  Flattened Device Tree. More information at Documentation/devicetree
-- 
2.16.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH 7/7] ARM: davinci_all_defconfig: select the DaVinci genpd driver in DT mode
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
                   ` (5 preceding siblings ...)
       [not found] ` <20180207134553.13510-1-brgl-ARrdPY/1zhM@public.gmane.org>
@ 2018-02-07 13:45 ` Bartosz Golaszewski
  2018-02-07 22:43 ` [PATCH 0/7] ARM: davinci: add genpd support David Lechner
  7 siblings, 0 replies; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-07 13:45 UTC (permalink / raw)
  To: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

From: Bartosz Golaszewski <bgolaszewski@baylibre.com>

We can now use the generic power domains driver in DT mode. Reflect
that in the defconfig.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 arch/arm/configs/davinci_all_defconfig | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig
index a5d9fcd9dd9c..3bff3b78b0c3 100644
--- a/arch/arm/configs/davinci_all_defconfig
+++ b/arch/arm/configs/davinci_all_defconfig
@@ -211,6 +211,8 @@ CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_OMAP=m
 CONFIG_DMADEVICES=y
 CONFIG_TI_EDMA=y
+CONFIG_SOC_DAVINCI=y
+CONFIG_DAVINCI_PM_DOMAINS=y
 CONFIG_MEMORY=y
 CONFIG_TI_AEMIF=m
 CONFIG_DA8XX_DDRCTL=y
-- 
2.16.1

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

* Re: [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd
  2018-02-07 13:45 ` [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd Bartosz Golaszewski
@ 2018-02-07 21:47   ` David Lechner
       [not found]     ` <36aebdca-2a7d-07a3-8632-95992d74cae6-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: David Lechner @ 2018-02-07 21:47 UTC (permalink / raw)
  To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Sekhar Nori,
	Kevin Hilman, Russell King
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> 
> Add a simple document for the DaVinci genpd driver. We use clock pm
> exclusively hence no reg property.
> 
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
>   .../devicetree/bindings/soc/ti,davinci-pm-domains.txt       | 13 +++++++++++++
>   1 file changed, 13 insertions(+)
>   create mode 100644 Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
> 
> diff --git a/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
> new file mode 100644
> index 000000000000..935d063c7b35
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
> @@ -0,0 +1,13 @@
> +Device tree bindings for the genpd driver for Texas Instruments DaVinci SoCs
> +
> +Required properties:
> +
> +- compatible:           must be "ti,davinci-pm-domains"
> +- #power-domain-cells:  must be 0
> +
> +Example:
> +
> +pwc1: power-controller@227000 {
> +	compatible = "ti,davinci-pm-domains";
> +	#power-domain-cells = <0>;
> +};
> 


We already have the PSC @227000. Why not just add
#power-domain-cells = <0>; to that node instead of creating
a new "device" when this is really the same device?

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

* Re: [PATCH 2/7] soc: davinci: new genpd driver
       [not found]   ` <20180207134553.13510-3-brgl-ARrdPY/1zhM@public.gmane.org>
@ 2018-02-07 21:49     ` David Lechner
  0 siblings, 0 replies; 23+ messages in thread
From: David Lechner @ 2018-02-07 21:49 UTC (permalink / raw)
  To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Sekhar Nori,
	Kevin Hilman, Russell King
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Bartosz Golaszewski

On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
> 
> Add a simple clock_pm-based driver for DaVinci SoCs. This is required
> to complete the transision to using the common clock framework for this
> architecture.
> 
> Signed-off-by: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
> ---
>   drivers/soc/Kconfig                      |   1 +
>   drivers/soc/Makefile                     |   1 +
>   drivers/soc/davinci/Kconfig              |  16 ++++
>   drivers/soc/davinci/Makefile             |   1 +
>   drivers/soc/davinci/davinci_pm_domains.c | 125 +++++++++++++++++++++++++++++++
>   5 files changed, 144 insertions(+)
>   create mode 100644 drivers/soc/davinci/Kconfig
>   create mode 100644 drivers/soc/davinci/Makefile
>   create mode 100644 drivers/soc/davinci/davinci_pm_domains.c
> 
> diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
> index fc9e98047421..f318899a6cf6 100644
> --- a/drivers/soc/Kconfig
> +++ b/drivers/soc/Kconfig
> @@ -4,6 +4,7 @@ source "drivers/soc/actions/Kconfig"
>   source "drivers/soc/amlogic/Kconfig"
>   source "drivers/soc/atmel/Kconfig"
>   source "drivers/soc/bcm/Kconfig"
> +source "drivers/soc/davinci/Kconfig"
>   source "drivers/soc/fsl/Kconfig"
>   source "drivers/soc/imx/Kconfig"
>   source "drivers/soc/mediatek/Kconfig"
> diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
> index deecb16e7256..8e5fe23d6678 100644
> --- a/drivers/soc/Makefile
> +++ b/drivers/soc/Makefile
> @@ -8,6 +8,7 @@ obj-$(CONFIG_ARCH_AT91)		+= atmel/
>   obj-y				+= bcm/
>   obj-$(CONFIG_ARCH_DOVE)		+= dove/
>   obj-$(CONFIG_MACH_DOVE)		+= dove/
> +obj-$(CONFIG_ARCH_DAVINCI)	+= davinci/
>   obj-y				+= fsl/
>   obj-$(CONFIG_ARCH_MXC)		+= imx/
>   obj-$(CONFIG_SOC_XWAY)		+= lantiq/
> diff --git a/drivers/soc/davinci/Kconfig b/drivers/soc/davinci/Kconfig
> new file mode 100644
> index 000000000000..7ee44f4ff41e
> --- /dev/null
> +++ b/drivers/soc/davinci/Kconfig
> @@ -0,0 +1,16 @@
> +#
> +# TI DaVinci SOC drivers
> +#
> +menuconfig SOC_DAVINCI
> +	bool "TI DaVinci SOC drivers support"
> +
> +if SOC_DAVINCI
> +
> +config DAVINCI_PM_DOMAINS
> +	tristate "TI DaVinci PM Domains Driver"
> +	depends on ARCH_DAVINCI
> +	depends on PM_GENERIC_DOMAINS
> +	help
> +	  Generic power domains driver for TI DaVinci family of SoCs.
> +
> +endif # SOC_DAVINCI
> diff --git a/drivers/soc/davinci/Makefile b/drivers/soc/davinci/Makefile
> new file mode 100644
> index 000000000000..822b03c18260
> --- /dev/null
> +++ b/drivers/soc/davinci/Makefile
> @@ -0,0 +1 @@
> +obj-$(CONFIG_DAVINCI_PM_DOMAINS)        += davinci_pm_domains.o
> diff --git a/drivers/soc/davinci/davinci_pm_domains.c b/drivers/soc/davinci/davinci_pm_domains.c
> new file mode 100644
> index 000000000000..c27d4c404d52
> --- /dev/null
> +++ b/drivers/soc/davinci/davinci_pm_domains.c
> @@ -0,0 +1,125 @@
> +/*
> + * TI DaVinci Generic Power Domain Driver
> + *
> + * Copyright (C) 2018 BayLibre SAS
> + *         Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/clk.h>
> +#include <linux/pm_domain.h>
> +#include <linux/pm_clock.h>
> +
> +struct davinci_genpd_ctx {
> +	struct device *dev;
> +	struct generic_pm_domain pd;
> +	struct clk *pm_clk;
> +};
> +
> +static int davinci_genpd_attach_dev(struct generic_pm_domain *domain,
> +				    struct device *dev)
> +{
> +	struct davinci_genpd_ctx *ctx;
> +	struct clk *clk;
> +	int rv;
> +
> +	ctx = container_of(domain, struct davinci_genpd_ctx, pd);
> +
> +	if (dev->pm_domain)
> +		return -EEXIST;
> +
> +	/*
> +	 * DaVinci always uses a single clock for power-management. We assume
> +	 * it's the first one in the clocks property.
> +	 */
> +	clk = of_clk_get(dev->of_node, 0);
> +	if (IS_ERR(clk))
> +		return PTR_ERR(clk);
> +
> +	rv = pm_clk_create(dev);
> +	if (rv) {
> +		clk_put(clk);
> +		return rv;
> +	}
> +
> +	rv = pm_clk_add_clk(dev, clk);
> +	if (rv) {
> +		pm_clk_destroy(dev);
> +		return rv;
> +	}
> +
> +	dev_pm_domain_set(dev, &domain->domain);
> +	ctx->pm_clk = clk;
> +
> +	return 0;
> +}
> +
> +static void davinci_genpd_detach_dev(struct generic_pm_domain *domain,
> +				     struct device *dev)
> +{
> +	struct davinci_genpd_ctx *ctx;
> +
> +	ctx = container_of(domain, struct davinci_genpd_ctx, pd);
> +
> +	pm_clk_remove_clk(dev, ctx->pm_clk);
> +	pm_clk_destroy(dev);
> +}
> +
> +static const struct of_device_id davinci_genpd_matches[] = {
> +	{ .compatible = "ti,davinci-pm-domains", },
> +	{ },
> +};
> +MODULE_DEVICE_TABLE(of, davinci_genpd_matches);
> +
> +static int davinci_genpd_probe(struct platform_device *pdev)
> +{
> +	struct davinci_genpd_ctx *pd;
> +	struct device_node *np;
> +	struct device *dev;
> +
> +	dev = &pdev->dev;
> +	np = dev->of_node;
> +
> +	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
> +	if (!pd)
> +		return -ENOMEM;
> +
> +	pd->pd.name = devm_kasprintf(dev, GFP_KERNEL,
> +				     "davinci_pwc_pd%d",
> +				     of_alias_get_id(np, "pwc"));
> +	if (!pd->pd.name)
> +		return -ENOMEM;
> +
> +	pd->dev = dev;
> +	pd->pd.attach_dev = davinci_genpd_attach_dev;
> +	pd->pd.detach_dev = davinci_genpd_detach_dev;
> +	pd->pd.flags |= GENPD_FLAG_PM_CLK;
> +
> +	pm_genpd_init(&pd->pd, NULL, true);
> +
> +	return of_genpd_add_provider_simple(np, &pd->pd);
> +}
> +
> +static struct platform_driver davinci_genpd_driver = {
> +	.probe = davinci_genpd_probe,
> +	.driver = {
> +		.name = "davinci_genpd",
> +		.of_match_table = davinci_genpd_matches,
> +	},
> +};
> +module_platform_driver(davinci_genpd_driver);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("TI DaVinci Generic Power Domains driver");
> +MODULE_AUTHOR("Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>");
> 

Likewise, I don't think we need a separate driver for this. Just
register a genpd provider from the PSC clock driver.

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 4/7] ARM: dts: da850: add power controller nodes
       [not found]   ` <20180207134553.13510-5-brgl-ARrdPY/1zhM@public.gmane.org>
@ 2018-02-07 21:58     ` David Lechner
  0 siblings, 0 replies; 23+ messages in thread
From: David Lechner @ 2018-02-07 21:58 UTC (permalink / raw)
  To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Sekhar Nori,
	Kevin Hilman, Russell King
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Bartosz Golaszewski

On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
> 
> Add two power controller nodes corresponding with the two PSC modules
> present on the da850 SoC.
> 
> Signed-off-by: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
> ---
>   arch/arm/boot/dts/da850.dtsi | 13 +++++++++++++
>   1 file changed, 13 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/da850.dtsi b/arch/arm/boot/dts/da850.dtsi
> index 3a1f2ced05ca..ac2eef4e6b7c 100644
> --- a/arch/arm/boot/dts/da850.dtsi
> +++ b/arch/arm/boot/dts/da850.dtsi
> @@ -24,6 +24,11 @@
>   		};
>   	};
>   
> +	aliases {
> +		pwc0 = &pwc0;
> +		pwc1 = &pwc1;
> +	};

Why do we need aliases? (would be nice to have the reason in the commit
message if there is a good reason)

> +
>   	opp_table: opp-table {
>   		compatible = "operating-points-v2";
>   
> @@ -141,6 +146,10 @@
>   				      "pll0_sysclk4", "pll0_sysclk6",
>   				      "async1";
>   		};
> +		pwc0: power-controller@10000 {
> +			compatible = "ti,davinci-pm-domains";
> +			#power-domain-cells = <0>;
> +		};
>   		pll0: clock-controller@11000 {
>   			compatible = "ti,da850-pll0";
>   			reg = <0x11000 0x1000>;
> @@ -757,6 +766,10 @@
>   				 <&async3_clk>;
>   			clock-names = "pll0_sysclk2", "pll0_sysclk4", "async3";
>   		};
> +		pwc1: power-controller@227000 {
> +			compatible = "ti,davinci-pm-domains";
> +			#power-domain-cells = <0>;
> +		};
>   		pinconf: pin-controller@22c00c {
>   			compatible = "ti,da850-pupd";
>   			reg = <0x22c00c 0x8>;
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 5/7] ARM: dts: da850: add power-domains properties to device nodes
  2018-02-07 13:45 ` [PATCH 5/7] ARM: dts: da850: add power-domains properties to device nodes Bartosz Golaszewski
@ 2018-02-07 22:21   ` David Lechner
  0 siblings, 0 replies; 23+ messages in thread
From: David Lechner @ 2018-02-07 22:21 UTC (permalink / raw)
  To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Sekhar Nori,
	Kevin Hilman, Russell King
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> 
> Make all devices managed by PSCs use the genpd driver.
> 
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> ---
>   arch/arm/boot/dts/da850.dtsi | 33 +++++++++++++++++++++++++++++++++
>   1 file changed, 33 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/da850.dtsi b/arch/arm/boot/dts/da850.dtsi
> index ac2eef4e6b7c..a2a1a3b7de3c 100644
> --- a/arch/arm/boot/dts/da850.dtsi
> +++ b/arch/arm/boot/dts/da850.dtsi
> @@ -83,6 +83,7 @@
>   			ti,intc-size = <101>;
>   			reg = <0xfffee000 0x2000>;
>   			clocks = <&psc0 6>;
> +			power-domains = <&pwc0>;

If we are making this a power domain consumer, we can probably drop the
clock property.

>   		};
>   	};
>   	clocks: clocks {
> @@ -125,6 +126,7 @@
>   		interrupt-parent = <&intc>;
>   		interrupts = <28>;
>   		clocks = <&psc0 15>;
> +		power-domains = <&pwc0>;
>   		status = "disabled";
>   	};
>   	soc@1c00000 {
> @@ -400,12 +402,14 @@
>   				clocks = <&psc1 1>, <&usb_refclkin>,
>   					 <&pll0_auxclk>;
>   				clock-names = "fck", "usb_refclkin", "auxclk";
> +				power-domains = <&pwc1>;

If we are going to use a power domain here, this driver will need to be re-written.

>   			};
>   			ehrpwm_tbclk: ehrpwm_tbclk {
>   				compatible = "ti,da830-tbclksync";
>   				#clock-cells = <0>;
>   				clocks = <&psc1 17>;
>   				clock-names = "fck";
> +				power-domains = <&pwc1>;

This is a clock node, not a (platform) device node, so I am not sure having
a power domain here makes sense.

>   			};
>   			div4p5_clk: div4.5 {
>   				compatible = "ti,da830-div4p5ena";
> @@ -439,6 +443,7 @@
>   
>   			ti,tptcs = <&edma0_tptc0 7>, <&edma0_tptc1 0>;
>   			clocks = <&psc0 0>;
> +			power-domains = <&pwc0>;

We really just need power-domains here, not clocks. Same applies to
the rest of the edma* nodes below.

>   		};
>   		edma0_tptc0: tptc@8000 {
>   			compatible = "ti,edma3-tptc";
> @@ -446,6 +451,7 @@
>   			interrupts = <13>;
>   			interrupt-names = "edm3_tcerrint";
>   			clocks = <&psc0 1>;
> +			power-domains = <&pwc0>;
>   		};
>   		edma0_tptc1: tptc@8400 {
>   			compatible = "ti,edma3-tptc";
> @@ -453,6 +459,7 @@
>   			interrupts = <32>;
>   			interrupt-names = "edm3_tcerrint";
>   			clocks = <&psc0 2>;
> +			power-domains = <&pwc0>;
>   		};
>   		edma1: edma@230000 {
>   			compatible = "ti,edma3-tpcc";
> @@ -465,6 +472,7 @@
>   
>   			ti,tptcs = <&edma1_tptc0 7>;
>   			clocks = <&psc1 0>;
> +			power-domains = <&pwc1>;
>   		};
>   		edma1_tptc0: tptc@238000 {
>   			compatible = "ti,edma3-tptc";
> @@ -472,6 +480,7 @@
>   			interrupts = <95>;
>   			interrupt-names = "edm3_tcerrint";
>   			clocks = <&psc1 21>;
> +			power-domains = <&pwc1>;
>   		};
>   		serial0: serial@42000 {
>   			compatible = "ti,da830-uart", "ns16550a";
> @@ -480,6 +489,7 @@
>   			reg-shift = <2>;
>   			interrupts = <25>;
>   			clocks = <&psc0 9>;
> +			power-domains = <&pwc0>;
>   			status = "disabled";
>   		};
>   		serial1: serial@10c000 {
> @@ -489,6 +499,7 @@
>   			reg-shift = <2>;
>   			interrupts = <53>;
>   			clocks = <&psc1 12>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		serial2: serial@10d000 {
> @@ -498,6 +509,7 @@
>   			reg-shift = <2>;
>   			interrupts = <61>;
>   			clocks = <&psc1 13>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		rtc0: rtc@23000 {
> @@ -523,6 +535,7 @@
>   			#address-cells = <1>;
>   			#size-cells = <0>;
>   			clocks = <&psc1 11>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		clocksource: timer@20000 {
> @@ -545,6 +558,7 @@
>   			dmas = <&edma0 16 0>, <&edma0 17 0>;
>   			dma-names = "rx", "tx";
>   			clocks = <&psc0 5>;
> +			power-domains = <&pwc0>;
>   			status = "disabled";
>   		};
>   		vpif: video@217000 {
> @@ -552,6 +566,7 @@
>   			reg = <0x217000 0x1000>;
>   			interrupts = <92>;
>   			clocks = <&psc1 9>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   
>   			/* VPIF capture port */
> @@ -575,6 +590,7 @@
>   			dmas = <&edma1 28 0>, <&edma1 29 0>;
>   			dma-names = "rx", "tx";
>   			clocks = <&psc1 18>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		ehrpwm0: pwm@300000 {
> @@ -585,6 +601,7 @@
>   			clocks = <&psc1 17>, <&ehrpwm_tbclk>;
>   			clock-names = "fck", "tbclk";
>   			status = "disabled";
> +			power-domains = <&pwc1>;

nit picking: it would be nice to have power-domains before status just
to be consistent in the order.

>   		};
>   		ehrpwm1: pwm@302000 {
>   			compatible = "ti,da850-ehrpwm", "ti,am3352-ehrpwm",
> @@ -592,6 +609,7 @@
>   			#pwm-cells = <3>;
>   			reg = <0x302000 0x2000>;
>   			clocks = <&psc1 17>, <&ehrpwm_tbclk>;
> +			power-domains = <&pwc1>;
>   			clock-names = "fck", "tbclk";

nit picking: it would be nice to keep clocks and clock-names next to each
other. Also several places below.

>   			status = "disabled";
>   		};
> @@ -601,6 +619,7 @@
>   			#pwm-cells = <3>;
>   			reg = <0x306000 0x80>;
>   			clocks = <&psc1 20>;
> +			power-domains = <&pwc1>;
>   			clock-names = "fck";
>   			status = "disabled";
>   		};
> @@ -610,6 +629,7 @@
>   			#pwm-cells = <3>;
>   			reg = <0x307000 0x80>;
>   			clocks = <&psc1 20>;
> +			power-domains = <&pwc1>;
>   			clock-names = "fck";
>   			status = "disabled";
>   		};
> @@ -619,6 +639,7 @@
>   			#pwm-cells = <3>;
>   			reg = <0x308000 0x80>;
>   			clocks = <&psc1 20>;
> +			power-domains = <&pwc1>;
>   			clock-names = "fck";
>   			status = "disabled";
>   		};
> @@ -633,6 +654,7 @@
>   			dmas = <&edma0 14 0>, <&edma0 15 0>;
>   			dma-names = "rx", "tx";
>   			clocks = <&psc0 4>;
> +			power-domains = <&pwc0>;
>   			status = "disabled";
>   		};
>   		spi1: spi@30e000 {
> @@ -646,6 +668,7 @@
>   			dmas = <&edma0 18 0>, <&edma0 19 0>;
>   			dma-names = "rx", "tx";
>   			clocks = <&psc1 10>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		usb0: usb@200000 {
> @@ -658,6 +681,7 @@
>   			phys = <&usb_phy 0>;
>   			phy-names = "usb-phy";
>   			clocks = <&psc1 1>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   
>   			#address-cells = <1>;
> @@ -682,6 +706,7 @@
>   				#dma-cells = <2>;
>   				#dma-channels = <4>;
>   				clocks = <&psc1 1>;
> +				power-domains = <&pwc1>;

This node should not have clocks or power-domains since it is
a child node. Instead, the parent node should have clock-ranges.
I have already fixed this in my v7 branch.

>   				status = "okay";
>   			};
>   		};
> @@ -690,6 +715,7 @@
>   			reg = <0x218000 0x2000>, <0x22c018 0x4>;
>   			interrupts = <67>;
>   			clocks = <&psc1 8>, <&sata_refclk>;
> +			power-domains = <&pwc1>;
>   			clock-names = "fck", "refclk";
>   			status = "disabled";
>   		};
> @@ -713,6 +739,7 @@
>   			reg = <0x224000 0x1000>;
>   			clocks = <&psc1 5>;
>   			clock-names = "fck";
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		eth0: ethernet@220000 {
> @@ -729,6 +756,7 @@
>   					36
>   					>;
>   			clocks = <&psc1 5>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		usb1: usb@225000 {
> @@ -738,6 +766,7 @@
>   			phys = <&usb_phy 1>;
>   			phy-names = "usb-phy";
>   			clocks = <&psc1 2>;
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   		gpio: gpio@226000 {
> @@ -756,6 +785,7 @@
>   			interrupt-controller;
>   			#interrupt-cells = <2>;
>   			clocks = <&psc1 3>;
> +			power-domains = <&pwc1>;
>   			clock-names = "gpio";
>   		};
>   		psc1: clock-controller@227000 {
> @@ -788,6 +818,7 @@
>   				<&edma0 0 1>;
>   			dma-names = "tx", "rx";
>   			clocks = <&psc1 7>;
> +			power-domains = <&pwc1>;
>   		};
>   
>   		lcdc: display@213000 {
> @@ -797,6 +828,7 @@
>   			max-pixelclock = <37500>;
>   			clocks = <&psc1 16>;
>   			clock-names = "fck";
> +			power-domains = <&pwc1>;
>   			status = "disabled";
>   		};
>   	};
> @@ -809,6 +841,7 @@
>   		ranges = <0 0 0x60000000 0x08000000
>   			  1 0 0x68000000 0x00008000>;
>   		clocks = <&psc0 3>;
> +		power-domains = <&pwc0>;
>   		status = "disabled";
>   	};
>   	memctrl: memory-controller@b0000000 {
> 

Bigger picture question: what is the benefit of adding
power-domain nodes to all of these devices if they are
already working?

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

* Re: [PATCH 0/7] ARM: davinci: add genpd support
  2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
                   ` (6 preceding siblings ...)
  2018-02-07 13:45 ` [PATCH 7/7] ARM: davinci_all_defconfig: select the DaVinci genpd driver " Bartosz Golaszewski
@ 2018-02-07 22:43 ` David Lechner
       [not found]   ` <4dbc57ec-3506-eb1d-e00d-adfe75c3b39b-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
  7 siblings, 1 reply; 23+ messages in thread
From: David Lechner @ 2018-02-07 22:43 UTC (permalink / raw)
  To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Sekhar Nori,
	Kevin Hilman, Russell King
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
> 
> Hi Sekhar et al,
> 
> please take a look at the following patches. They add a simple genpd
> driver and use it in DT mode on da850 boards.
> 
> I was trying to use genpd in legacy mode too, but couldn't find neither
> any interfaces nor users that would do that. For now I added a check in
> arch/arm/mach-davinci/pm_domain.c that disables the clock pm setup if
> we're using genpd.
> 
> This series applies on top of and has been tested with David Lechner's
> for-bartosz branch. It fixes the clock look-up issues we faced with
> lcdc and emac.

I'm starting to think that it makes more sense to just make the PSC driver
a power-domain and reset provider rather than a clock provider. It is
unfortunate that genpd is DT only.

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

* Re: [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd
       [not found]     ` <36aebdca-2a7d-07a3-8632-95992d74cae6-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
@ 2018-02-08  8:56       ` Bartosz Golaszewski
       [not found]         ` <CAMRc=Me5Qckp=_KpbPYprKb23Ujz1C9Um6FrHK59wY=XA2Jcvg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-08  8:56 UTC (permalink / raw)
  To: David Lechner
  Cc: Rob Herring, Mark Rutland, Sekhar Nori, Kevin Hilman,
	Russell King, devicetree, Linux Kernel Mailing List, Linux ARM,
	Bartosz Golaszewski

2018-02-07 22:47 GMT+01:00 David Lechner <david-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>:
> On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
>>
>> From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>>
>> Add a simple document for the DaVinci genpd driver. We use clock pm
>> exclusively hence no reg property.
>>
>> Signed-off-by: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>> ---
>>   .../devicetree/bindings/soc/ti,davinci-pm-domains.txt       | 13
>> +++++++++++++
>>   1 file changed, 13 insertions(+)
>>   create mode 100644
>> Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>>
>> diff --git
>> a/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>> b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>> new file mode 100644
>> index 000000000000..935d063c7b35
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>> @@ -0,0 +1,13 @@
>> +Device tree bindings for the genpd driver for Texas Instruments DaVinci
>> SoCs
>> +
>> +Required properties:
>> +
>> +- compatible:           must be "ti,davinci-pm-domains"
>> +- #power-domain-cells:  must be 0
>> +
>> +Example:
>> +
>> +pwc1: power-controller@227000 {
>> +       compatible = "ti,davinci-pm-domains";
>> +       #power-domain-cells = <0>;
>> +};
>>
>
>
> We already have the PSC @227000. Why not just add
> #power-domain-cells = <0>; to that node instead of creating
> a new "device" when this is really the same device?

I thought about it too, but then noticed that most architectures do
use a separate genpd driver even if it only calls routines placed in
their respective clock driver.

Let me prepare a v2 with this approach though.

Thanks,
Bartosz
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 2/7] soc: davinci: new genpd driver
  2018-02-07 13:45 ` [PATCH 2/7] soc: davinci: new genpd driver Bartosz Golaszewski
       [not found]   ` <20180207134553.13510-3-brgl-ARrdPY/1zhM@public.gmane.org>
@ 2018-02-08  9:30   ` Sekhar Nori
  2018-02-08  9:54     ` Bartosz Golaszewski
  1 sibling, 1 reply; 23+ messages in thread
From: Sekhar Nori @ 2018-02-08  9:30 UTC (permalink / raw)
  To: Bartosz Golaszewski, Rob Herring, Mark Rutland, Kevin Hilman,
	Russell King, David Lechner
  Cc: devicetree, linux-kernel, linux-arm-kernel, Bartosz Golaszewski

On Wednesday 07 February 2018 07:15 PM, Bartosz Golaszewski wrote:
> +	/*
> +	 * DaVinci always uses a single clock for power-management. We assume
> +	 * it's the first one in the clocks property.
> +	 */
> +	clk = of_clk_get(dev->of_node, 0);
> +	if (IS_ERR(clk))
> +		return PTR_ERR(clk);

We already get this today with drivers/base/power/clock_ops.c once
.con_ids list is dropped from pm_clk_notifier_block (which I think it
should).

If there is no reason to introduce thus functionality at this stage,
perhaps we should wait till such a time when its clearly needed?

Thanks,
Sekhar

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

* Re: [PATCH 2/7] soc: davinci: new genpd driver
  2018-02-08  9:30   ` Sekhar Nori
@ 2018-02-08  9:54     ` Bartosz Golaszewski
       [not found]       ` <CAMRc=Mf+S3k_wfhUWEx2-39AZx1szkgy-u-bsZQUMiaY06UKww-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-08  9:54 UTC (permalink / raw)
  To: Sekhar Nori
  Cc: Rob Herring, Mark Rutland, Kevin Hilman, Russell King,
	David Lechner, devicetree, Linux Kernel Mailing List, Linux ARM,
	Bartosz Golaszewski

2018-02-08 10:30 GMT+01:00 Sekhar Nori <nsekhar@ti.com>:
> On Wednesday 07 February 2018 07:15 PM, Bartosz Golaszewski wrote:
>> +     /*
>> +      * DaVinci always uses a single clock for power-management. We assume
>> +      * it's the first one in the clocks property.
>> +      */
>> +     clk = of_clk_get(dev->of_node, 0);
>> +     if (IS_ERR(clk))
>> +             return PTR_ERR(clk);
>
> We already get this today with drivers/base/power/clock_ops.c once
> .con_ids list is dropped from pm_clk_notifier_block (which I think it
> should).
>
> If there is no reason to introduce thus functionality at this stage,
> perhaps we should wait till such a time when its clearly needed?
>
> Thanks,
> Sekhar

If I understand correctly: once we drop the con_ids list, we end up
calling clk_get(dev, NULL) from pm_clk_acquire(), which matches
against the clock with NULL con_id, which may not necessarily be the
first clock in the list.

I'm working on extending the psc driver with the power-domain code (as
suggested by David), which should be much smaller and simplier - how
about that?

Thanks,
Bartosz

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

* Re: [PATCH 2/7] soc: davinci: new genpd driver
       [not found]       ` <CAMRc=Mf+S3k_wfhUWEx2-39AZx1szkgy-u-bsZQUMiaY06UKww-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2018-02-08 12:56         ` Sekhar Nori
       [not found]           ` <34d3980b-2c94-1540-94f0-dc0c86743475-l0cyMroinI0@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: Sekhar Nori @ 2018-02-08 12:56 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Rob Herring, Mark Rutland, Kevin Hilman, Russell King,
	David Lechner, devicetree, Linux Kernel Mailing List, Linux ARM,
	Bartosz Golaszewski

On Thursday 08 February 2018 03:24 PM, Bartosz Golaszewski wrote:
> 2018-02-08 10:30 GMT+01:00 Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>:
>> On Wednesday 07 February 2018 07:15 PM, Bartosz Golaszewski wrote:
>>> +     /*
>>> +      * DaVinci always uses a single clock for power-management. We assume
>>> +      * it's the first one in the clocks property.
>>> +      */
>>> +     clk = of_clk_get(dev->of_node, 0);
>>> +     if (IS_ERR(clk))
>>> +             return PTR_ERR(clk);
>>
>> We already get this today with drivers/base/power/clock_ops.c once
>> .con_ids list is dropped from pm_clk_notifier_block (which I think it
>> should).
>>
>> If there is no reason to introduce thus functionality at this stage,
>> perhaps we should wait till such a time when its clearly needed?
>>
>> Thanks,
>> Sekhar
> 
> If I understand correctly: once we drop the con_ids list, we end up
> calling clk_get(dev, NULL) from pm_clk_acquire(), which matches
> against the clock with NULL con_id, which may not necessarily be the
> first clock in the list.

Hmm, not sure of this. In __of_clk_get_by_name() called by clk_get():

int index = 0;

/*
 * For named clocks, first look up the name in the
 * "clock-names" property.  If it cannot be found, then
 * index will be an error code, and of_clk_get() will fail.
 */
if (name)
	index = of_property_match_string(np, "clock-names", name);

So, if no con_id is provided (name == NULL), then index is set to 0
which will always get the first clock in clocks = list.

Thanks,
Sekhar
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 2/7] soc: davinci: new genpd driver
       [not found]           ` <34d3980b-2c94-1540-94f0-dc0c86743475-l0cyMroinI0@public.gmane.org>
@ 2018-02-08 13:27             ` Bartosz Golaszewski
       [not found]               ` <CAMRc=MeQUdzWfAgUCX5k5iwmyyVeCvjhw0CKauSY_1F0+SBPBQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-08 13:27 UTC (permalink / raw)
  To: Sekhar Nori
  Cc: Rob Herring, Mark Rutland, Kevin Hilman, Russell King,
	David Lechner, devicetree, Linux Kernel Mailing List, Linux ARM,
	Bartosz Golaszewski

2018-02-08 13:56 GMT+01:00 Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>:
> On Thursday 08 February 2018 03:24 PM, Bartosz Golaszewski wrote:
>> 2018-02-08 10:30 GMT+01:00 Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>:
>>> On Wednesday 07 February 2018 07:15 PM, Bartosz Golaszewski wrote:
>>>> +     /*
>>>> +      * DaVinci always uses a single clock for power-management. We assume
>>>> +      * it's the first one in the clocks property.
>>>> +      */
>>>> +     clk = of_clk_get(dev->of_node, 0);
>>>> +     if (IS_ERR(clk))
>>>> +             return PTR_ERR(clk);
>>>
>>> We already get this today with drivers/base/power/clock_ops.c once
>>> .con_ids list is dropped from pm_clk_notifier_block (which I think it
>>> should).
>>>
>>> If there is no reason to introduce thus functionality at this stage,
>>> perhaps we should wait till such a time when its clearly needed?
>>>
>>> Thanks,
>>> Sekhar
>>
>> If I understand correctly: once we drop the con_ids list, we end up
>> calling clk_get(dev, NULL) from pm_clk_acquire(), which matches
>> against the clock with NULL con_id, which may not necessarily be the
>> first clock in the list.
>
> Hmm, not sure of this. In __of_clk_get_by_name() called by clk_get():
>
> int index = 0;
>
> /*
>  * For named clocks, first look up the name in the
>  * "clock-names" property.  If it cannot be found, then
>  * index will be an error code, and of_clk_get() will fail.
>  */
> if (name)
>         index = of_property_match_string(np, "clock-names", name);
>
> So, if no con_id is provided (name == NULL), then index is set to 0
> which will always get the first clock in clocks = list.
>

But we're talking here about device tree mode. In legacy mode the
device_node pointer will be NULL, __of_clk_get_by_name() will return
-ENOENT and we'll end up calling clk_get_sys() -> clk_find(). We'll
then iterate over the clock entries and check the following:

(...)
152                 if (p->con_id) {
153                         if (!con_id || strcmp(p->con_id, con_id))
154                                 continue;
155                         match += 1;
156                 }
(...)

So we'll skip the first clock if it has a con_id and we passed an
empty con_id to clk_get().

Bartosz
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 2/7] soc: davinci: new genpd driver
       [not found]               ` <CAMRc=MeQUdzWfAgUCX5k5iwmyyVeCvjhw0CKauSY_1F0+SBPBQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2018-02-08 14:43                 ` Sekhar Nori
  0 siblings, 0 replies; 23+ messages in thread
From: Sekhar Nori @ 2018-02-08 14:43 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: Rob Herring, Mark Rutland, Kevin Hilman, Russell King,
	David Lechner, devicetree, Linux Kernel Mailing List, Linux ARM,
	Bartosz Golaszewski

On Thursday 08 February 2018 06:57 PM, Bartosz Golaszewski wrote:
> 2018-02-08 13:56 GMT+01:00 Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>:
>> On Thursday 08 February 2018 03:24 PM, Bartosz Golaszewski wrote:
>>> 2018-02-08 10:30 GMT+01:00 Sekhar Nori <nsekhar-l0cyMroinI0@public.gmane.org>:
>>>> On Wednesday 07 February 2018 07:15 PM, Bartosz Golaszewski wrote:
>>>>> +     /*
>>>>> +      * DaVinci always uses a single clock for power-management. We assume
>>>>> +      * it's the first one in the clocks property.
>>>>> +      */
>>>>> +     clk = of_clk_get(dev->of_node, 0);
>>>>> +     if (IS_ERR(clk))
>>>>> +             return PTR_ERR(clk);
>>>>
>>>> We already get this today with drivers/base/power/clock_ops.c once
>>>> .con_ids list is dropped from pm_clk_notifier_block (which I think it
>>>> should).
>>>>
>>>> If there is no reason to introduce thus functionality at this stage,
>>>> perhaps we should wait till such a time when its clearly needed?
>>>>
>>>> Thanks,
>>>> Sekhar
>>>
>>> If I understand correctly: once we drop the con_ids list, we end up
>>> calling clk_get(dev, NULL) from pm_clk_acquire(), which matches
>>> against the clock with NULL con_id, which may not necessarily be the
>>> first clock in the list.
>>
>> Hmm, not sure of this. In __of_clk_get_by_name() called by clk_get():
>>
>> int index = 0;
>>
>> /*
>>  * For named clocks, first look up the name in the
>>  * "clock-names" property.  If it cannot be found, then
>>  * index will be an error code, and of_clk_get() will fail.
>>  */
>> if (name)
>>         index = of_property_match_string(np, "clock-names", name);
>>
>> So, if no con_id is provided (name == NULL), then index is set to 0
>> which will always get the first clock in clocks = list.
>>
> 
> But we're talking here about device tree mode. In legacy mode the
> device_node pointer will be NULL, __of_clk_get_by_name() will return
> -ENOENT and we'll end up calling clk_get_sys() -> clk_find(). We'll
> then iterate over the clock entries and check the following:
> 
> (...)
> 152                 if (p->con_id) {
> 153                         if (!con_id || strcmp(p->con_id, con_id))
> 154                                 continue;
> 155                         match += 1;
> 156                 }
> (...)
> 
> So we'll skip the first clock if it has a con_id and we passed an
> empty con_id to clk_get().

You are right. I missed taking the effect on legacy boot into
consideration. Please send v2 then, and consider this objection withdrawn.

Thanks,
Sekhar
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd
       [not found]         ` <CAMRc=Me5Qckp=_KpbPYprKb23Ujz1C9Um6FrHK59wY=XA2Jcvg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2018-02-09  0:40           ` Kevin Hilman
  0 siblings, 0 replies; 23+ messages in thread
From: Kevin Hilman @ 2018-02-09  0:40 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: David Lechner, Rob Herring, Mark Rutland, Sekhar Nori,
	Russell King, devicetree, Linux Kernel Mailing List, Linux ARM,
	Bartosz Golaszewski

Bartosz Golaszewski <brgl-ARrdPY/1zhM@public.gmane.org> writes:

> 2018-02-07 22:47 GMT+01:00 David Lechner <david-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>:
>> On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
>>>
>>> From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>>>
>>> Add a simple document for the DaVinci genpd driver. We use clock pm
>>> exclusively hence no reg property.
>>>
>>> Signed-off-by: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>>> ---
>>>   .../devicetree/bindings/soc/ti,davinci-pm-domains.txt       | 13
>>> +++++++++++++
>>>   1 file changed, 13 insertions(+)
>>>   create mode 100644
>>> Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>>>
>>> diff --git
>>> a/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>>> b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>>> new file mode 100644
>>> index 000000000000..935d063c7b35
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/soc/ti,davinci-pm-domains.txt
>>> @@ -0,0 +1,13 @@
>>> +Device tree bindings for the genpd driver for Texas Instruments DaVinci
>>> SoCs
>>> +
>>> +Required properties:
>>> +
>>> +- compatible:           must be "ti,davinci-pm-domains"
>>> +- #power-domain-cells:  must be 0
>>> +
>>> +Example:
>>> +
>>> +pwc1: power-controller@227000 {
>>> +       compatible = "ti,davinci-pm-domains";
>>> +       #power-domain-cells = <0>;
>>> +};
>>>
>>
>>
>> We already have the PSC @227000. Why not just add
>> #power-domain-cells = <0>; to that node instead of creating
>> a new "device" when this is really the same device?
>
> I thought about it too, but then noticed that most architectures do
> use a separate genpd driver even if it only calls routines placed in
> their respective clock driver.
>
> Let me prepare a v2 with this approach though.

Yes, I agree with David.  Just making the PSC be a power-controller is a
good approach.

Kevin
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 0/7] ARM: davinci: add genpd support
       [not found]   ` <4dbc57ec-3506-eb1d-e00d-adfe75c3b39b-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
@ 2018-02-09 12:42     ` Sekhar Nori
       [not found]       ` <a736d727-5805-94ea-3e40-34fc4a6267ef-l0cyMroinI0@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: Sekhar Nori @ 2018-02-09 12:42 UTC (permalink / raw)
  To: David Lechner, Bartosz Golaszewski, Rob Herring, Mark Rutland,
	Kevin Hilman, Russell King
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Bartosz Golaszewski

Hi David,

On Thursday 08 February 2018 04:13 AM, David Lechner wrote:
> On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
>> From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>>
>> Hi Sekhar et al,
>>
>> please take a look at the following patches. They add a simple genpd
>> driver and use it in DT mode on da850 boards.
>>
>> I was trying to use genpd in legacy mode too, but couldn't find neither
>> any interfaces nor users that would do that. For now I added a check in
>> arch/arm/mach-davinci/pm_domain.c that disables the clock pm setup if
>> we're using genpd.
>>
>> This series applies on top of and has been tested with David Lechner's
>> for-bartosz branch. It fixes the clock look-up issues we faced with
>> lcdc and emac.
> 
> I'm starting to think that it makes more sense to just make the PSC driver
> a power-domain and reset provider rather than a clock provider. It is
> unfortunate that genpd is DT only.

This will mean that the only way to enable clocks on DaVinci is to use
pm_runtime() calls. We do still have drivers which depend on clk api for
enabling clocks, so I am not sure its feasible just yet.

I think a question like this can arise for any gate clock.

Thanks,
Sekhar
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 0/7] ARM: davinci: add genpd support
       [not found]       ` <a736d727-5805-94ea-3e40-34fc4a6267ef-l0cyMroinI0@public.gmane.org>
@ 2018-02-18  3:41         ` David Lechner
  2018-02-19 10:49           ` Bartosz Golaszewski
  0 siblings, 1 reply; 23+ messages in thread
From: David Lechner @ 2018-02-18  3:41 UTC (permalink / raw)
  To: Sekhar Nori, Bartosz Golaszewski, Rob Herring, Mark Rutland,
	Kevin Hilman, Russell King
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Bartosz Golaszewski

On 02/09/2018 06:42 AM, Sekhar Nori wrote:
> Hi David,
> 
> On Thursday 08 February 2018 04:13 AM, David Lechner wrote:
>> On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
>>> From: Bartosz Golaszewski <bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
>>>
>>> Hi Sekhar et al,
>>>
>>> please take a look at the following patches. They add a simple genpd
>>> driver and use it in DT mode on da850 boards.
>>>
>>> I was trying to use genpd in legacy mode too, but couldn't find neither
>>> any interfaces nor users that would do that. For now I added a check in
>>> arch/arm/mach-davinci/pm_domain.c that disables the clock pm setup if
>>> we're using genpd.
>>>
>>> This series applies on top of and has been tested with David Lechner's
>>> for-bartosz branch. It fixes the clock look-up issues we faced with
>>> lcdc and emac.
>>
>> I'm starting to think that it makes more sense to just make the PSC driver
>> a power-domain and reset provider rather than a clock provider. It is
>> unfortunate that genpd is DT only.
> 
> This will mean that the only way to enable clocks on DaVinci is to use
> pm_runtime() calls. We do still have drivers which depend on clk api for
> enabling clocks, so I am not sure its feasible just yet.
> 
> I think a question like this can arise for any gate clock.
> 

I've incorporated parts of this series into my v7 work in progress
using the suggestions I made about using the existing PSC device
as the power domain provider.

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 0/7] ARM: davinci: add genpd support
  2018-02-18  3:41         ` David Lechner
@ 2018-02-19 10:49           ` Bartosz Golaszewski
  0 siblings, 0 replies; 23+ messages in thread
From: Bartosz Golaszewski @ 2018-02-19 10:49 UTC (permalink / raw)
  To: David Lechner
  Cc: Mark Rutland, linux-devicetree, Kevin Hilman,
	Bartosz Golaszewski, Sekhar Nori, Russell King, LKML,
	Rob Herring, arm-soc

2018-02-18 4:41 GMT+01:00 David Lechner <david@lechnology.com>:
> On 02/09/2018 06:42 AM, Sekhar Nori wrote:
>>
>> Hi David,
>>
>> On Thursday 08 February 2018 04:13 AM, David Lechner wrote:
>>>
>>> On 02/07/2018 07:45 AM, Bartosz Golaszewski wrote:
>>>>
>>>> From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
>>>>
>>>> Hi Sekhar et al,
>>>>
>>>> please take a look at the following patches. They add a simple genpd
>>>> driver and use it in DT mode on da850 boards.
>>>>
>>>> I was trying to use genpd in legacy mode too, but couldn't find neither
>>>> any interfaces nor users that would do that. For now I added a check in
>>>> arch/arm/mach-davinci/pm_domain.c that disables the clock pm setup if
>>>> we're using genpd.
>>>>
>>>> This series applies on top of and has been tested with David Lechner's
>>>> for-bartosz branch. It fixes the clock look-up issues we faced with
>>>> lcdc and emac.
>>>
>>>
>>> I'm starting to think that it makes more sense to just make the PSC
>>> driver
>>> a power-domain and reset provider rather than a clock provider. It is
>>> unfortunate that genpd is DT only.
>>
>>
>> This will mean that the only way to enable clocks on DaVinci is to use
>> pm_runtime() calls. We do still have drivers which depend on clk api for
>> enabling clocks, so I am not sure its feasible just yet.
>>
>> I think a question like this can arise for any gate clock.
>>
>
> I've incorporated parts of this series into my v7 work in progress
> using the suggestions I made about using the existing PSC device
> as the power domain provider.
>

FYI I had added the power domain functionality to the v6 PSC driver
here: https://github.com/brgl/linux/commits/topic/davinci-genpd-final-v2

Thanks,
Bartosz

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

end of thread, other threads:[~2018-02-19 10:49 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-07 13:45 [PATCH 0/7] ARM: davinci: add genpd support Bartosz Golaszewski
2018-02-07 13:45 ` [PATCH 1/7] dt-bindings: soc: new driver for DaVinci genpd Bartosz Golaszewski
2018-02-07 21:47   ` David Lechner
     [not found]     ` <36aebdca-2a7d-07a3-8632-95992d74cae6-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
2018-02-08  8:56       ` Bartosz Golaszewski
     [not found]         ` <CAMRc=Me5Qckp=_KpbPYprKb23Ujz1C9Um6FrHK59wY=XA2Jcvg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-02-09  0:40           ` Kevin Hilman
2018-02-07 13:45 ` [PATCH 2/7] soc: davinci: new genpd driver Bartosz Golaszewski
     [not found]   ` <20180207134553.13510-3-brgl-ARrdPY/1zhM@public.gmane.org>
2018-02-07 21:49     ` David Lechner
2018-02-08  9:30   ` Sekhar Nori
2018-02-08  9:54     ` Bartosz Golaszewski
     [not found]       ` <CAMRc=Mf+S3k_wfhUWEx2-39AZx1szkgy-u-bsZQUMiaY06UKww-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-02-08 12:56         ` Sekhar Nori
     [not found]           ` <34d3980b-2c94-1540-94f0-dc0c86743475-l0cyMroinI0@public.gmane.org>
2018-02-08 13:27             ` Bartosz Golaszewski
     [not found]               ` <CAMRc=MeQUdzWfAgUCX5k5iwmyyVeCvjhw0CKauSY_1F0+SBPBQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2018-02-08 14:43                 ` Sekhar Nori
2018-02-07 13:45 ` [PATCH 3/7] ARM: davinci: don't setup pm_clk if we're using genpd Bartosz Golaszewski
2018-02-07 13:45 ` [PATCH 4/7] ARM: dts: da850: add power controller nodes Bartosz Golaszewski
     [not found]   ` <20180207134553.13510-5-brgl-ARrdPY/1zhM@public.gmane.org>
2018-02-07 21:58     ` David Lechner
2018-02-07 13:45 ` [PATCH 5/7] ARM: dts: da850: add power-domains properties to device nodes Bartosz Golaszewski
2018-02-07 22:21   ` David Lechner
     [not found] ` <20180207134553.13510-1-brgl-ARrdPY/1zhM@public.gmane.org>
2018-02-07 13:45   ` [PATCH 6/7] ARM: davinci: select generic power domains for DaVinci in DT mode Bartosz Golaszewski
2018-02-07 13:45 ` [PATCH 7/7] ARM: davinci_all_defconfig: select the DaVinci genpd driver " Bartosz Golaszewski
2018-02-07 22:43 ` [PATCH 0/7] ARM: davinci: add genpd support David Lechner
     [not found]   ` <4dbc57ec-3506-eb1d-e00d-adfe75c3b39b-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
2018-02-09 12:42     ` Sekhar Nori
     [not found]       ` <a736d727-5805-94ea-3e40-34fc4a6267ef-l0cyMroinI0@public.gmane.org>
2018-02-18  3:41         ` David Lechner
2018-02-19 10:49           ` Bartosz Golaszewski

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).