linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support
@ 2014-05-07 17:25 Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings Boris BREZILLON
                   ` (6 more replies)
  0 siblings, 7 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

Hello,

This patch series adds support for some functions provided by the PRCM
(Power/Reset/Clock Management) unit:
- AR100, AHB0 and APB0 clocks
- APB0 reset controller

These functions are needed to get the P2WI driver working, but more
subdevices might be added later.

Best Regards,

Boris

Changes since v1:
- fix prcm and prcm-clks DT documentation
- remove unneeded iounmap and kfree calls from sunxi_reset_remove function
- rework the AR100 clk implementation

Boris BREZILLON (7):
  reset: sunxi: document sunxi's reset controllers bindings
  reset: sunxi: allow MFD subdevices probe
  mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  mfd: sun6i-prcm: document DT bindings
  clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support
  clk: sunxi: document PRCM clock compatible strings
  ARM: sunxi: dt: add PRCM clk and reset controller subdevices

 Documentation/devicetree/bindings/clock/sunxi.txt  |   4 +
 .../devicetree/bindings/mfd/sun6i-prcm.txt         |  59 ++++
 .../bindings/reset/allwinner,sunxi-clock-reset.txt |  21 ++
 arch/arm/boot/dts/sun6i-a31.dtsi                   |  51 ++-
 drivers/clk/sunxi/Makefile                         |   2 +
 drivers/clk/sunxi/clk-sun6i-prcm.c                 | 343 +++++++++++++++++++++
 drivers/mfd/Kconfig                                |   8 +
 drivers/mfd/Makefile                               |   1 +
 drivers/mfd/sun6i-prcm.c                           | 151 +++++++++
 drivers/reset/reset-sunxi.c                        |  21 +-
 10 files changed, 657 insertions(+), 4 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mfd/sun6i-prcm.txt
 create mode 100644 Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt
 create mode 100644 drivers/clk/sunxi/clk-sun6i-prcm.c
 create mode 100644 drivers/mfd/sun6i-prcm.c

-- 
1.8.3.2


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

* [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-08  3:05   ` Maxime Ripard
  2014-05-07 17:25 ` [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe Boris BREZILLON
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

Add DT bindings documentation for sunxi's reset controllers.

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 .../bindings/reset/allwinner,sunxi-clock-reset.txt  | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt

diff --git a/Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt b/Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt
new file mode 100644
index 0000000..c8f7757
--- /dev/null
+++ b/Documentation/devicetree/bindings/reset/allwinner,sunxi-clock-reset.txt
@@ -0,0 +1,21 @@
+Allwinner sunxi Peripheral Reset Controller
+===========================================
+
+Please also refer to reset.txt in this directory for common reset
+controller binding usage.
+
+Required properties:
+- compatible: Should be one of the following:
+  "allwinner,sun6i-a31-ahb1-reset"
+  "allwinner,sun6i-a31-clock-reset"
+- reg: should be register base and length as documented in the
+  datasheet
+- #reset-cells: 1, see below
+
+example:
+
+ahb1_rst: reset@01c202c0 {
+	#reset-cells = <1>;
+	compatible = "allwinner,sun6i-a31-ahb1-reset";
+	reg = <0x01c202c0 0xc>;
+};
-- 
1.8.3.2


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

* [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-08  3:07   ` Maxime Ripard
  2014-05-07 17:25 ` [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit Boris BREZILLON
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

The current implementation uses sunxi_reset_init function for both early
init and platform device probe.

The sunxi_reset_init function uses DT to retrieve device resources, which
will be an issue if reset controllers are registered from an MFD device
that define resources from mfd_cell definition.

Moreover, we can make of devm functions when we're in the probe context.

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 drivers/reset/reset-sunxi.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c
index 695bd34..1b5fea6 100644
--- a/drivers/reset/reset-sunxi.c
+++ b/drivers/reset/reset-sunxi.c
@@ -145,7 +145,24 @@ MODULE_DEVICE_TABLE(of, sunxi_reset_dt_ids);
 
 static int sunxi_reset_probe(struct platform_device *pdev)
 {
-	return sunxi_reset_init(pdev->dev.of_node);
+	struct sunxi_reset_data *data;
+	struct resource *res;
+
+	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	data->membase = devm_request_and_ioremap(&pdev->dev, res);
+	if (!data->membase)
+		return -ENOMEM;
+
+	data->rcdev.owner = THIS_MODULE;
+	data->rcdev.nr_resets = resource_size(res) * 32;
+	data->rcdev.ops = &sunxi_reset_ops;
+	data->rcdev.of_node = pdev->dev.of_node;
+
+	return reset_controller_register(&data->rcdev);
 }
 
 static int sunxi_reset_remove(struct platform_device *pdev)
@@ -153,8 +170,6 @@ static int sunxi_reset_remove(struct platform_device *pdev)
 	struct sunxi_reset_data *data = platform_get_drvdata(pdev);
 
 	reset_controller_unregister(&data->rcdev);
-	iounmap(data->membase);
-	kfree(data);
 
 	return 0;
 }
-- 
1.8.3.2


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

* [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-08  3:09   ` Maxime Ripard
  2014-05-08 11:02   ` Lee Jones
  2014-05-07 17:25 ` [PATCH v2 4/7] mfd: sun6i-prcm: document DT bindings Boris BREZILLON
                   ` (3 subsequent siblings)
  6 siblings, 2 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

The PRCM (Power/Reset/Clock Management) block exposes several subdevices
in different subsystems (clk, reset ...)

Add basic support for the PRCM unit with clk (AR100, AHB0, and APB0 clks)
and reset controller subdevices.

Other subdevices might be added later (if needed).

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 drivers/mfd/Kconfig      |   8 +++
 drivers/mfd/Makefile     |   1 +
 drivers/mfd/sun6i-prcm.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 160 insertions(+)
 create mode 100644 drivers/mfd/sun6i-prcm.c

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 2d347c9..56794fe 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -731,6 +731,14 @@ config MFD_STA2X11
 	select MFD_CORE
 	select REGMAP_MMIO
 
+config MFD_SUN6I_PRCM
+	bool "Allwinner A31 PRCM controller"
+	depends on ARCH_SUNXI
+	select MFD_CORE
+	help
+	  Support for the PRCM (Power/Reset/Clock Management) unit available
+	  in A31 SoC.
+
 config MFD_SYSCON
 	bool "System Controller Register R/W Based on Regmap"
 	select REGMAP_MMIO
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 1efecf2..df7823c 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -29,6 +29,7 @@ obj-$(CONFIG_MFD_STA2X11)	+= sta2x11-mfd.o
 obj-$(CONFIG_MFD_STMPE)		+= stmpe.o
 obj-$(CONFIG_STMPE_I2C)		+= stmpe-i2c.o
 obj-$(CONFIG_STMPE_SPI)		+= stmpe-spi.o
+obj-$(CONFIG_MFD_SUN6I_PRCM)	+= sun6i-prcm.o
 obj-$(CONFIG_MFD_TC3589X)	+= tc3589x.o
 obj-$(CONFIG_MFD_T7L66XB)	+= t7l66xb.o tmio_core.o
 obj-$(CONFIG_MFD_TC6387XB)	+= tc6387xb.o tmio_core.o
diff --git a/drivers/mfd/sun6i-prcm.c b/drivers/mfd/sun6i-prcm.c
new file mode 100644
index 0000000..0156bcb
--- /dev/null
+++ b/drivers/mfd/sun6i-prcm.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2014 Free Electrons
+ *
+ * License Terms: GNU General Public License v2
+ * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
+ *
+ * Allwinner PRCM (Power/Reset/Clock Management) driver
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/err.h>
+#include <linux/spinlock.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/mutex.h>
+#include <linux/completion.h>
+#include <linux/irq.h>
+#include <linux/jiffies.h>
+#include <linux/bitops.h>
+#include <linux/fs.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/uaccess.h>
+#include <linux/mfd/core.h>
+
+struct prcm_data {
+	int nsubdevs;
+	const struct mfd_cell *subdevs;
+};
+
+static const struct resource sun6i_a31_ar100_clk_res[] = {
+	{
+		.start = 0x0,
+		.end = 0x3,
+		.flags = IORESOURCE_MEM,
+	},
+};
+
+static const struct resource sun6i_a31_apb0_clk_res[] = {
+	{
+		.start = 0xc,
+		.end = 0xf,
+		.flags = IORESOURCE_MEM,
+	},
+};
+
+static const struct resource sun6i_a31_apb0_gates_clk_res[] = {
+	{
+		.start = 0x28,
+		.end = 0x2b,
+		.flags = IORESOURCE_MEM,
+	},
+};
+
+static const struct resource sun6i_a31_apb0_rstc_res[] = {
+	{
+		.start = 0xb0,
+		.end = 0xb3,
+		.flags = IORESOURCE_MEM,
+	},
+};
+
+static const struct mfd_cell sun6i_a31_prcm_subdevs[] = {
+	{
+		.name = "sun6i-a31-ar100-clk",
+		.of_compatible = "allwinner,sun6i-a31-ar100-clk",
+		.num_resources = ARRAY_SIZE(sun6i_a31_ar100_clk_res),
+		.resources = sun6i_a31_ar100_clk_res,
+	},
+	{
+		.name = "sun6i-a31-apb0-clk",
+		.of_compatible = "allwinner,sun6i-a31-apb0-clk",
+		.num_resources = ARRAY_SIZE(sun6i_a31_apb0_clk_res),
+		.resources = sun6i_a31_apb0_clk_res,
+	},
+	{
+		.name = "sun6i-a31-apb0-gates-clk",
+		.of_compatible = "allwinner,sun6i-a31-apb0-gates-clk",
+		.num_resources = ARRAY_SIZE(sun6i_a31_apb0_gates_clk_res),
+		.resources = sun6i_a31_apb0_gates_clk_res,
+	},
+	{
+		.name = "sun6i-a31-apb0-clock-reset",
+		.of_compatible = "allwinner,sun6i-a31-clock-reset",
+		.num_resources = ARRAY_SIZE(sun6i_a31_apb0_rstc_res),
+		.resources = sun6i_a31_apb0_rstc_res,
+	},
+};
+
+static const struct prcm_data sun6i_a31_prcm_data = {
+	.nsubdevs = ARRAY_SIZE(sun6i_a31_prcm_subdevs),
+	.subdevs = sun6i_a31_prcm_subdevs,
+};
+
+static const struct of_device_id sun6i_prcm_dt_ids[] = {
+	{
+		.compatible = "allwinner,sun6i-a31-prcm",
+		.data = &sun6i_a31_prcm_data,
+	},
+	{ /* sentinel */ },
+};
+
+static int sun6i_prcm_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	const struct of_device_id *match;
+	const struct prcm_data *data;
+	struct resource *res;
+	int ret;
+
+	match = of_match_node(sun6i_prcm_dt_ids, np);
+	if (!match)
+		return -EINVAL;
+
+	data = match->data;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res) {
+		dev_err(&pdev->dev, "no prcm memory region provided\n");
+		return -ENOENT;
+	}
+
+	ret = mfd_add_devices(&pdev->dev, 0, data->subdevs, data->nsubdevs,
+			      res, -1, NULL);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to add subdevices\n");
+		return ret;
+	}
+
+	dev_info(&pdev->dev, "PRCM initialized\n");
+
+	return 0;
+}
+
+static struct platform_driver sun6i_prcm_driver = {
+	.driver = {
+		.name = "sun6i-prcm",
+		.owner = THIS_MODULE,
+		.of_match_table = sun6i_prcm_dt_ids,
+	},
+	.probe = sun6i_prcm_probe,
+};
+module_platform_driver(sun6i_prcm_driver);
+
+MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>");
+MODULE_DESCRIPTION("Allwinner sun6i PRCM driver");
+MODULE_LICENSE("GPL v2");
-- 
1.8.3.2


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

* [PATCH v2 4/7] mfd: sun6i-prcm: document DT bindings
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
                   ` (2 preceding siblings ...)
  2014-05-07 17:25 ` [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 5/7] clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support Boris BREZILLON
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

Document DT bindings of the PRCM (Power/Reset/Clock Management) unit.

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 .../devicetree/bindings/mfd/sun6i-prcm.txt         | 59 ++++++++++++++++++++++
 1 file changed, 59 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/sun6i-prcm.txt

diff --git a/Documentation/devicetree/bindings/mfd/sun6i-prcm.txt b/Documentation/devicetree/bindings/mfd/sun6i-prcm.txt
new file mode 100644
index 0000000..1f5a31f
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/sun6i-prcm.txt
@@ -0,0 +1,59 @@
+* Allwinner PRCM (Power/Reset/Clock Management) Multi-Functional Device
+
+PRCM is an MFD device exposing several Power Management related devices
+(like clks and reset controllers).
+
+Required properties:
+ - compatible: "allwinner,sun6i-a31-prcm"
+ - reg: The PRCM registers range
+
+The prcm node may contain several subdevices definitions:
+ - see Documentation/devicetree/clk/sunxi.txt for clock devices
+ - see Documentation/devicetree/reset/allwinner,sunxi-clock-reset.txt for reset
+   controller devices
+
+
+Example:
+
+	prcm: prcm@01f01400 {
+		compatible = "allwinner,sun6i-a31-prcm";
+		reg = <0x01f01400 0x200>;
+
+		/* Put subdevices here */
+		ar100: ar100_clk {
+			compatible = "allwinner,sun6i-a31-ar100-clk";
+			#clock-cells = <0>;
+			clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>;
+		};
+
+		ahb0: ahb0_clk {
+			compatible = "fixed-factor-clock";
+			#clock-cells = <0>;
+			clock-div = <1>;
+			clock-mult = <1>;
+			clocks = <&ar100_div>;
+			clock-output-names = "ahb0";
+		};
+
+		apb0: apb0_clk {
+			compatible = "allwinner,sun6i-a31-apb0-clk";
+			#clock-cells = <0>;
+			clocks = <&ahb0>;
+			clock-output-names = "apb0";
+		};
+
+		apb0_gates: apb0_gates_clk {
+			compatible = "allwinner,sun6i-a31-apb0-gates-clk";
+			#clock-cells = <1>;
+			clocks = <&apb0>;
+			clock-output-names = "apb0_pio", "apb0_ir",
+					"apb0_timer01", "apb0_p2wi",
+					"apb0_uart", "apb0_1wire",
+					"apb0_i2c";
+		};
+
+		apb0_rst: apb0_rst {
+			compatible = "allwinner,sun6i-a31-clock-reset";
+			#reset-cells = <1>;
+		};
+	};
-- 
1.8.3.2


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

* [PATCH v2 5/7] clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
                   ` (3 preceding siblings ...)
  2014-05-07 17:25 ` [PATCH v2 4/7] mfd: sun6i-prcm: document DT bindings Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-08  3:11   ` Maxime Ripard
  2014-05-07 17:25 ` [PATCH v2 6/7] clk: sunxi: document PRCM clock compatible strings Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices Boris BREZILLON
  6 siblings, 1 reply; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

The PRCM (Power/Reset/Clock Management) unit provides several clock
devices:
- AR100 clk: used to clock the Power Management co-processor
- AHB0 clk: used to clock the AHB0 bus
- APB0 clk and gates: used to clk peripherals connected to the APB0 bus

Add support for these clks in a separate driver so that they can be probed
as platform devices instead of registered during early init.
This is needed to be able to probe PRCM MFD subdevices.

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 drivers/clk/sunxi/Makefile         |   2 +
 drivers/clk/sunxi/clk-sun6i-prcm.c | 343 +++++++++++++++++++++++++++++++++++++
 2 files changed, 345 insertions(+)
 create mode 100644 drivers/clk/sunxi/clk-sun6i-prcm.c

diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile
index b5bac91..ef8cdc9 100644
--- a/drivers/clk/sunxi/Makefile
+++ b/drivers/clk/sunxi/Makefile
@@ -3,3 +3,5 @@
 #
 
 obj-y += clk-sunxi.o clk-factors.o
+
+obj-$(CONFIG_MFD_SUN6I_PRCM) += clk-sun6i-prcm.o
diff --git a/drivers/clk/sunxi/clk-sun6i-prcm.c b/drivers/clk/sunxi/clk-sun6i-prcm.c
new file mode 100644
index 0000000..3efaf8f
--- /dev/null
+++ b/drivers/clk/sunxi/clk-sun6i-prcm.c
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 2014 Free Electrons
+ *
+ * License Terms: GNU General Public License v2
+ * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
+ *
+ * Allwinner PRCM (Power/Reset/Clock Management) driver
+ *
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#define SUN6I_APB0_GATES_MAX_SIZE	32
+#define SUN6I_AR100_MAX_PARENTS		4
+#define SUN6I_AR100_SHIFT_MASK		0x3
+#define SUN6I_AR100_SHIFT_MAX		SUN6I_AR100_SHIFT_MASK
+#define SUN6I_AR100_SHIFT_SHIFT		4
+#define SUN6I_AR100_DIV_MASK		0x1f
+#define SUN6I_AR100_DIV_MAX		(SUN6I_AR100_DIV_MASK + 1)
+#define SUN6I_AR100_DIV_SHIFT		8
+#define SUN6I_AR100_MUX_MASK		0x3
+#define SUN6I_AR100_MUX_SHIFT		16
+
+struct ar100_clk {
+	struct clk_hw hw;
+	void __iomem *reg;
+};
+
+static inline struct ar100_clk *to_ar100_clk(struct clk_hw *hw)
+{
+	return container_of(hw, struct ar100_clk, hw);
+}
+
+static unsigned long ar100_recalc_rate(struct clk_hw *hw,
+				       unsigned long parent_rate)
+{
+	struct ar100_clk *clk = to_ar100_clk(hw);
+	u32 val = readl(clk->reg);
+	int shift = (val >> SUN6I_AR100_SHIFT_SHIFT) & SUN6I_AR100_SHIFT_MASK;
+	int div = (val >> SUN6I_AR100_DIV_SHIFT) & SUN6I_AR100_DIV_MASK;
+
+	return (parent_rate >> shift) / (div + 1);
+}
+
+static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate,
+				 unsigned long *best_parent_rate,
+				 struct clk **best_parent_clk)
+{
+	int nparents = __clk_get_num_parents(hw->clk);
+	long best_rate = -EINVAL;
+	int i;
+
+	*best_parent_clk = NULL;
+
+	for (i = 0; i < nparents; i++) {
+		unsigned long parent_rate;
+		unsigned long tmp_rate;
+		struct clk *parent;
+		unsigned long div;
+		int shift;
+
+		parent = clk_get_parent_by_index(hw->clk, i);
+		parent_rate = __clk_get_rate(parent);
+		div = DIV_ROUND_UP(parent_rate, rate);
+
+		shift = ffs(div) - 1;
+		if (shift > SUN6I_AR100_SHIFT_MAX)
+			shift = SUN6I_AR100_SHIFT_MAX;
+
+		div >>= shift;
+
+		while (div > SUN6I_AR100_DIV_MAX) {
+			shift++;
+			div >>= 1;
+			if (shift > SUN6I_AR100_SHIFT_MAX)
+				break;
+		}
+
+		if (shift > SUN6I_AR100_SHIFT_MAX)
+			continue;
+
+		tmp_rate = (parent_rate >> shift) / div;
+		if (!*best_parent_clk || tmp_rate > best_rate) {
+			*best_parent_clk = parent;
+			*best_parent_rate = parent_rate;
+			best_rate = tmp_rate;
+		}
+	}
+
+	return best_rate;
+}
+
+static int ar100_set_parent(struct clk_hw *hw, u8 index)
+{
+	struct ar100_clk *clk = to_ar100_clk(hw);
+	u32 val = readl(clk->reg);
+
+	if (index >= SUN6I_AR100_MAX_PARENTS)
+		return -EINVAL;
+
+	val &= ~(SUN6I_AR100_MUX_MASK << SUN6I_AR100_MUX_SHIFT);
+	val |= (index << SUN6I_AR100_MUX_SHIFT);
+	writel(val, clk->reg);
+
+	return 0;
+}
+
+static u8 ar100_get_parent(struct clk_hw *hw)
+{
+	struct ar100_clk *clk = to_ar100_clk(hw);
+	return (readl(clk->reg) >> SUN6I_AR100_MUX_SHIFT) &
+	       SUN6I_AR100_MUX_MASK;
+}
+
+static int ar100_set_rate(struct clk_hw *hw, unsigned long rate,
+			  unsigned long parent_rate)
+{
+	unsigned long div = parent_rate / rate;
+	struct ar100_clk *clk = to_ar100_clk(hw);
+	u32 val = readl(clk->reg);
+	int shift;
+
+	if (parent_rate % rate)
+		return -EINVAL;
+
+	shift = ffs(div) - 1;
+	if (shift > SUN6I_AR100_SHIFT_MAX)
+		shift = SUN6I_AR100_SHIFT_MAX;
+
+	div >>= shift;
+
+	if (div > SUN6I_AR100_DIV_MAX)
+		return -EINVAL;
+
+	val &= ~((SUN6I_AR100_SHIFT_MASK << SUN6I_AR100_SHIFT_SHIFT) |
+		 (SUN6I_AR100_DIV_MASK << SUN6I_AR100_DIV_SHIFT));
+	val |= (shift << SUN6I_AR100_SHIFT_SHIFT) |
+	       (div << SUN6I_AR100_DIV_SHIFT);
+	writel(val, clk->reg);
+
+	return 0;
+}
+
+struct clk_ops ar100_ops = {
+	.recalc_rate = ar100_recalc_rate,
+	.determine_rate = ar100_determine_rate,
+	.set_parent = ar100_set_parent,
+	.get_parent = ar100_get_parent,
+	.set_rate = ar100_set_rate,
+};
+
+static int sun6i_a31_ar100_clk_register(struct platform_device *pdev)
+{
+	const char *parents[SUN6I_AR100_MAX_PARENTS];
+	struct device_node *np = pdev->dev.of_node;
+	const char *clk_name = np->name;
+	struct clk_init_data init;
+	struct ar100_clk *ar100;
+	struct resource *r;
+	struct clk *clk;
+	int nparents;
+	int i;
+
+	ar100 = devm_kzalloc(&pdev->dev, sizeof(*ar100), GFP_KERNEL);
+	if (!ar100)
+		return -ENOMEM;
+
+	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	ar100->reg = devm_ioremap_resource(&pdev->dev, r);
+	if (IS_ERR(ar100->reg))
+		return PTR_ERR(ar100->reg);
+
+	nparents = of_clk_get_parent_count(np);
+	if (nparents > SUN6I_AR100_MAX_PARENTS)
+		nparents = SUN6I_AR100_MAX_PARENTS;
+
+	for (i = 0; i < nparents; i++)
+		parents[i] = of_clk_get_parent_name(np, i);
+
+	of_property_read_string(np, "clock-output-names", &clk_name);
+
+	init.name = clk_name;
+	init.ops = &ar100_ops;
+	init.parent_names = parents;
+	init.num_parents = nparents;
+	init.flags = 0;
+
+	ar100->hw.init = &init;
+
+	clk = clk_register(&pdev->dev, &ar100->hw);
+	if (IS_ERR(clk))
+		return PTR_ERR(clk);
+
+	return of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
+static const struct clk_div_table sun6i_a31_apb0_divs[] = {
+	{ .val = 0, .div = 2, },
+	{ .val = 1, .div = 2, },
+	{ .val = 2, .div = 4, },
+	{ .val = 3, .div = 8, },
+	{ /* sentinel */ },
+};
+
+static int sun6i_a31_apb0_clk_register(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	const char *clk_name = np->name;
+	const char *clk_parent;
+	struct resource *r;
+	void __iomem *reg;
+	struct clk *clk;
+
+	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	reg = devm_ioremap_resource(&pdev->dev, r);
+	if (IS_ERR(reg))
+		return PTR_ERR(reg);
+
+		clk_parent = of_clk_get_parent_name(np, 0);
+	if (!clk_parent)
+		return -EINVAL;
+
+	of_property_read_string(np, "clock-output-names", &clk_name);
+
+	clk = clk_register_divider_table(&pdev->dev, clk_name, clk_parent,
+					 0, reg, 0, 2, 0, sun6i_a31_apb0_divs,
+					 NULL);
+	if (IS_ERR(clk))
+		return PTR_ERR(clk);
+
+	return of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
+static int sun6i_a31_apb0_gates_clk_register(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct clk_onecell_data *clk_data;
+	const char *clk_parent;
+	const char *clk_name;
+	struct resource *r;
+	void __iomem *reg;
+	int gate_id;
+	int ngates;
+	int i;
+
+	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	reg = devm_ioremap_resource(&pdev->dev, r);
+	if (!reg)
+		return PTR_ERR(reg);
+
+	clk_parent = of_clk_get_parent_name(np, 0);
+	if (!clk_parent)
+		return -EINVAL;
+
+	ngates = of_property_count_strings(np, "clock-output-names");
+	if (ngates < 0)
+		return ngates;
+
+	if (!ngates || ngates > SUN6I_APB0_GATES_MAX_SIZE)
+		return -EINVAL;
+
+	clk_data = devm_kzalloc(&pdev->dev, sizeof(struct clk_onecell_data),
+				GFP_KERNEL);
+	if (!clk_data)
+		return -ENOMEM;
+
+	clk_data->clks = devm_kzalloc(&pdev->dev,
+				      SUN6I_APB0_GATES_MAX_SIZE *
+				      sizeof(struct clk *),
+				      GFP_KERNEL);
+	if (!clk_data->clks)
+		return -ENOMEM;
+
+	for (i = 0; i < ngates; i++) {
+		of_property_read_string_index(np, "clock-output-names",
+					      i, &clk_name);
+
+		gate_id = i;
+		of_property_read_u32_index(np, "clock-indices", i, &gate_id);
+
+		WARN_ON(gate_id >= SUN6I_APB0_GATES_MAX_SIZE);
+		if (gate_id >= SUN6I_APB0_GATES_MAX_SIZE)
+			continue;
+
+		clk_data->clks[gate_id] = clk_register_gate(&pdev->dev,
+							    clk_name,
+							    clk_parent, 0,
+							    reg, gate_id,
+							    0, NULL);
+		WARN_ON(IS_ERR(clk_data->clks[gate_id]));
+	}
+
+	clk_data->clk_num = ngates;
+
+	return of_clk_add_provider(np, of_clk_src_onecell_get, clk_data);
+}
+
+const struct of_device_id sun6i_a31_prcm_clk_dt_ids[] = {
+	{
+		.compatible = "allwinner,sun6i-a31-ar100-clk",
+		.data = sun6i_a31_ar100_clk_register,
+	},
+	{
+		.compatible = "allwinner,sun6i-a31-apb0-clk",
+		.data = sun6i_a31_apb0_clk_register,
+	},
+	{
+		.compatible = "allwinner,sun6i-a31-apb0-gates-clk",
+		.data = sun6i_a31_apb0_gates_clk_register,
+	},
+	{ /* sentinel */ }
+};
+
+static int sun6i_a31_prcm_clk_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	int (*register_func)(struct platform_device *pdev);
+	const struct of_device_id *match;
+
+	match = of_match_node(sun6i_a31_prcm_clk_dt_ids, np);
+	if (!match)
+		return -EINVAL;
+
+	register_func = match->data;
+	return register_func(pdev);
+}
+
+static struct platform_driver sun6i_a31_prcm_clk_driver = {
+	.driver = {
+		.name = "sun6i-a31-prcm-clk",
+		.owner = THIS_MODULE,
+		.of_match_table = sun6i_a31_prcm_clk_dt_ids,
+	},
+	.probe = sun6i_a31_prcm_clk_probe,
+};
+module_platform_driver(sun6i_a31_prcm_clk_driver);
+
+MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>");
+MODULE_DESCRIPTION("Allwinner PRCM clock Driver");
+MODULE_LICENSE("GPL v2");
-- 
1.8.3.2


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

* [PATCH v2 6/7] clk: sunxi: document PRCM clock compatible strings
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
                   ` (4 preceding siblings ...)
  2014-05-07 17:25 ` [PATCH v2 5/7] clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-07 17:25 ` [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices Boris BREZILLON
  6 siblings, 0 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

Document new compatible strings for clock provided by the PRCM
(Power/Reset/Clock Management) unit.

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 Documentation/devicetree/bindings/clock/sunxi.txt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt
index a5160d8..d154d9d 100644
--- a/Documentation/devicetree/bindings/clock/sunxi.txt
+++ b/Documentation/devicetree/bindings/clock/sunxi.txt
@@ -20,12 +20,16 @@ Required properties:
 	"allwinner,sun5i-a13-ahb-gates-clk" - for the AHB gates on A13
 	"allwinner,sun5i-a10s-ahb-gates-clk" - for the AHB gates on A10s
 	"allwinner,sun7i-a20-ahb-gates-clk" - for the AHB gates on A20
+	"allwinner,sun6i-a31-ar100-clk" - for the AR100 on A31
+	"allwinner,sun6i-a31-ahb0-clk" - for the AHB0 multiplexer on A31
 	"allwinner,sun6i-a31-ahb1-mux-clk" - for the AHB1 multiplexer on A31
 	"allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31
 	"allwinner,sun4i-a10-apb0-clk" - for the APB0 clock
+	"allwinner,sun6i-a31-apb0-clk" - for the APB0 clock on A31
 	"allwinner,sun4i-a10-apb0-gates-clk" - for the APB0 gates on A10
 	"allwinner,sun5i-a13-apb0-gates-clk" - for the APB0 gates on A13
 	"allwinner,sun5i-a10s-apb0-gates-clk" - for the APB0 gates on A10s
+	"allwinner,sun6i-a31-apb0-gates-clk" - for the APB0 gates on A31
 	"allwinner,sun7i-a20-apb0-gates-clk" - for the APB0 gates on A20
 	"allwinner,sun4i-a10-apb1-clk" - for the APB1 clock
 	"allwinner,sun4i-a10-apb1-mux-clk" - for the APB1 clock muxing
-- 
1.8.3.2


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

* [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices
  2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
                   ` (5 preceding siblings ...)
  2014-05-07 17:25 ` [PATCH v2 6/7] clk: sunxi: document PRCM clock compatible strings Boris BREZILLON
@ 2014-05-07 17:25 ` Boris BREZILLON
  2014-05-08  3:17   ` Maxime Ripard
  6 siblings, 1 reply; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-07 17:25 UTC (permalink / raw)
  To: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones
  Cc: Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev, Boris BREZILLON

Add DT definitions for PRCM (Power/Reset/Clock Management) clock and reset
controller subdevices.

Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
---
 arch/arm/boot/dts/sun6i-a31.dtsi | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi
index ec3253a..b69be0b 100644
--- a/arch/arm/boot/dts/sun6i-a31.dtsi
+++ b/arch/arm/boot/dts/sun6i-a31.dtsi
@@ -498,9 +498,46 @@
 			reg = <0x01f01c00 0x300>;
 		};
 
-		prcm@01f01c00 {
+		prcm@01f01400 {
 			compatible = "allwinner,sun6i-a31-prcm";
 			reg = <0x01f01400 0x200>;
+
+			ar100: ar100_clk {
+				compatible = "allwinner,sun6i-a31-ar100-clk";
+				#clock-cells = <0>;
+				clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>;
+			};
+
+			ahb0: ahb0_clk {
+				compatible = "fixed-factor-clock";
+				#clock-cells = <0>;
+				clock-div = <1>;
+				clock-mult = <1>;
+				clocks = <&ar100>;
+				clock-output-names = "ahb0";
+			};
+
+			apb0: apb0_clk {
+				compatible = "allwinner,sun6i-a31-apb0-clk";
+				#clock-cells = <0>;
+				clocks = <&ahb0>;
+				clock-output-names = "apb0";
+			};
+
+			apb0_gates: apb0_gates_clk {
+				compatible = "allwinner,sun6i-a31-apb0-gates-clk";
+				#clock-cells = <1>;
+				clocks = <&apb0>;
+				clock-output-names = "apb0_pio", "apb0_ir",
+						"apb0_timer01", "apb0_p2wi",
+						"apb0_uart", "apb0_1wire",
+						"apb0_i2c";
+			};
+
+			apb0_rst: apb0_rst {
+				compatible = "allwinner,sun6i-a31-clock-reset";
+				#reset-cells = <1>;
+			};
 		};
 	};
 };
-- 
1.8.3.2


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

* Re: [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings
  2014-05-07 17:25 ` [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings Boris BREZILLON
@ 2014-05-08  3:05   ` Maxime Ripard
  0 siblings, 0 replies; 26+ messages in thread
From: Maxime Ripard @ 2014-05-08  3:05 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Chen-Yu Tsai, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

[-- Attachment #1: Type: text/plain, Size: 399 bytes --]

On Wed, May 07, 2014 at 07:25:48PM +0200, Boris BREZILLON wrote:
> Add DT bindings documentation for sunxi's reset controllers.
> 
> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>

Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Thanks,
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe
  2014-05-07 17:25 ` [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe Boris BREZILLON
@ 2014-05-08  3:07   ` Maxime Ripard
  2014-05-08 20:05     ` Boris BREZILLON
  0 siblings, 1 reply; 26+ messages in thread
From: Maxime Ripard @ 2014-05-08  3:07 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Chen-Yu Tsai, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

[-- Attachment #1: Type: text/plain, Size: 1708 bytes --]

On Wed, May 07, 2014 at 07:25:49PM +0200, Boris BREZILLON wrote:
> The current implementation uses sunxi_reset_init function for both early
> init and platform device probe.
> 
> The sunxi_reset_init function uses DT to retrieve device resources, which
> will be an issue if reset controllers are registered from an MFD device
> that define resources from mfd_cell definition.
> 
> Moreover, we can make of devm functions when we're in the probe context.
> 
> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
> ---
>  drivers/reset/reset-sunxi.c | 21 ++++++++++++++++++---
>  1 file changed, 18 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c
> index 695bd34..1b5fea6 100644
> --- a/drivers/reset/reset-sunxi.c
> +++ b/drivers/reset/reset-sunxi.c
> @@ -145,7 +145,24 @@ MODULE_DEVICE_TABLE(of, sunxi_reset_dt_ids);
>  
>  static int sunxi_reset_probe(struct platform_device *pdev)
>  {
> -	return sunxi_reset_init(pdev->dev.of_node);
> +	struct sunxi_reset_data *data;
> +	struct resource *res;
> +
> +	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
> +	if (!data)
> +		return -ENOMEM;
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	data->membase = devm_request_and_ioremap(&pdev->dev, res);
> +	if (!data->membase)
> +		return -ENOMEM;

You'd probably be better off using devm_ioremap_resource so that you
get a meaningful error code.

Apart from this, you have my 
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-07 17:25 ` [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit Boris BREZILLON
@ 2014-05-08  3:09   ` Maxime Ripard
  2014-05-08 11:02   ` Lee Jones
  1 sibling, 0 replies; 26+ messages in thread
From: Maxime Ripard @ 2014-05-08  3:09 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Chen-Yu Tsai, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

[-- Attachment #1: Type: text/plain, Size: 611 bytes --]

On Wed, May 07, 2014 at 07:25:50PM +0200, Boris BREZILLON wrote:
> The PRCM (Power/Reset/Clock Management) block exposes several subdevices
> in different subsystems (clk, reset ...)
> 
> Add basic support for the PRCM unit with clk (AR100, AHB0, and APB0 clks)
> and reset controller subdevices.
> 
> Other subdevices might be added later (if needed).
> 
> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>

Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCH v2 5/7] clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support
  2014-05-07 17:25 ` [PATCH v2 5/7] clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support Boris BREZILLON
@ 2014-05-08  3:11   ` Maxime Ripard
  0 siblings, 0 replies; 26+ messages in thread
From: Maxime Ripard @ 2014-05-08  3:11 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Chen-Yu Tsai, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

[-- Attachment #1: Type: text/plain, Size: 804 bytes --]

On Wed, May 07, 2014 at 07:25:52PM +0200, Boris BREZILLON wrote:
> The PRCM (Power/Reset/Clock Management) unit provides several clock
> devices:
> - AR100 clk: used to clock the Power Management co-processor
> - AHB0 clk: used to clock the AHB0 bus
> - APB0 clk and gates: used to clk peripherals connected to the APB0 bus
> 
> Add support for these clks in a separate driver so that they can be probed
> as platform devices instead of registered during early init.
> This is needed to be able to probe PRCM MFD subdevices.
> 
> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>

Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices
  2014-05-07 17:25 ` [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices Boris BREZILLON
@ 2014-05-08  3:17   ` Maxime Ripard
  2014-05-08  3:40     ` Chen-Yu Tsai
  0 siblings, 1 reply; 26+ messages in thread
From: Maxime Ripard @ 2014-05-08  3:17 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Chen-Yu Tsai, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

[-- Attachment #1: Type: text/plain, Size: 2048 bytes --]

On Wed, May 07, 2014 at 07:25:54PM +0200, Boris BREZILLON wrote:
> Add DT definitions for PRCM (Power/Reset/Clock Management) clock and reset
> controller subdevices.
> 
> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
> ---
>  arch/arm/boot/dts/sun6i-a31.dtsi | 39 ++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 38 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi
> index ec3253a..b69be0b 100644
> --- a/arch/arm/boot/dts/sun6i-a31.dtsi
> +++ b/arch/arm/boot/dts/sun6i-a31.dtsi
> @@ -498,9 +498,46 @@
>  			reg = <0x01f01c00 0x300>;
>  		};
>  
> -		prcm@01f01c00 {
> +		prcm@01f01400 {

This has already been fixed by Hans.

>  			compatible = "allwinner,sun6i-a31-prcm";
>  			reg = <0x01f01400 0x200>;
> +
> +			ar100: ar100_clk {
> +				compatible = "allwinner,sun6i-a31-ar100-clk";
> +				#clock-cells = <0>;
> +				clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>;
> +			};
> +
> +			ahb0: ahb0_clk {
> +				compatible = "fixed-factor-clock";
> +				#clock-cells = <0>;
> +				clock-div = <1>;
> +				clock-mult = <1>;
> +				clocks = <&ar100>;
> +				clock-output-names = "ahb0";
> +			};
> +
> +			apb0: apb0_clk {
> +				compatible = "allwinner,sun6i-a31-apb0-clk";
> +				#clock-cells = <0>;
> +				clocks = <&ahb0>;
> +				clock-output-names = "apb0";
> +			};
> +
> +			apb0_gates: apb0_gates_clk {
> +				compatible = "allwinner,sun6i-a31-apb0-gates-clk";
> +				#clock-cells = <1>;
> +				clocks = <&apb0>;
> +				clock-output-names = "apb0_pio", "apb0_ir",
> +						"apb0_timer01", "apb0_p2wi",

timer01 ? is this a typo?

> +						"apb0_uart", "apb0_1wire",
> +						"apb0_i2c";
> +			};
> +
> +			apb0_rst: apb0_rst {
> +				compatible = "allwinner,sun6i-a31-clock-reset";
> +				#reset-cells = <1>;
> +			};
>  		};
>  	};
>  };
> -- 
> 1.8.3.2
> 

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices
  2014-05-08  3:17   ` Maxime Ripard
@ 2014-05-08  3:40     ` Chen-Yu Tsai
  2014-05-08 14:29       ` Maxime Ripard
  0 siblings, 1 reply; 26+ messages in thread
From: Chen-Yu Tsai @ 2014-05-08  3:40 UTC (permalink / raw)
  To: Maxime Ripard
  Cc: Boris BREZILLON, Emilio López, Mike Turquette, Samuel Ortiz,
	Lee Jones, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

On Thu, May 8, 2014 at 11:17 AM, Maxime Ripard
<maxime.ripard@free-electrons.com> wrote:
> On Wed, May 07, 2014 at 07:25:54PM +0200, Boris BREZILLON wrote:
>> Add DT definitions for PRCM (Power/Reset/Clock Management) clock and reset
>> controller subdevices.
>>
>> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
>> ---
>>  arch/arm/boot/dts/sun6i-a31.dtsi | 39 ++++++++++++++++++++++++++++++++++++++-
>>  1 file changed, 38 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi
>> index ec3253a..b69be0b 100644
>> --- a/arch/arm/boot/dts/sun6i-a31.dtsi
>> +++ b/arch/arm/boot/dts/sun6i-a31.dtsi
>> @@ -498,9 +498,46 @@
>>                       reg = <0x01f01c00 0x300>;
>>               };
>>
>> -             prcm@01f01c00 {
>> +             prcm@01f01400 {
>
> This has already been fixed by Hans.
>
>>                       compatible = "allwinner,sun6i-a31-prcm";
>>                       reg = <0x01f01400 0x200>;
>> +
>> +                     ar100: ar100_clk {
>> +                             compatible = "allwinner,sun6i-a31-ar100-clk";
>> +                             #clock-cells = <0>;
>> +                             clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>;
>> +                     };
>> +
>> +                     ahb0: ahb0_clk {
>> +                             compatible = "fixed-factor-clock";
>> +                             #clock-cells = <0>;
>> +                             clock-div = <1>;
>> +                             clock-mult = <1>;
>> +                             clocks = <&ar100>;
>> +                             clock-output-names = "ahb0";
>> +                     };
>> +
>> +                     apb0: apb0_clk {
>> +                             compatible = "allwinner,sun6i-a31-apb0-clk";
>> +                             #clock-cells = <0>;
>> +                             clocks = <&ahb0>;
>> +                             clock-output-names = "apb0";
>> +                     };
>> +
>> +                     apb0_gates: apb0_gates_clk {
>> +                             compatible = "allwinner,sun6i-a31-apb0-gates-clk";
>> +                             #clock-cells = <1>;
>> +                             clocks = <&apb0>;
>> +                             clock-output-names = "apb0_pio", "apb0_ir",
>> +                                             "apb0_timer01", "apb0_p2wi",
>
> timer01 ? is this a typo?

A23 manual lists the clock gate as "r_timer0_1", so I put the name on the wiki.
Allwinner sun6i code uses "r_tmr" or just "tmr". I see no problem naming this
clock output as "apb0_timer" though.

>> +                                             "apb0_uart", "apb0_1wire",
>> +                                             "apb0_i2c";
>> +                     };
>> +
>> +                     apb0_rst: apb0_rst {
>> +                             compatible = "allwinner,sun6i-a31-clock-reset";
>> +                             #reset-cells = <1>;
>> +                     };
>>               };
>>       };
>>  };
>> --
>> 1.8.3.2
>>

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-07 17:25 ` [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit Boris BREZILLON
  2014-05-08  3:09   ` Maxime Ripard
@ 2014-05-08 11:02   ` Lee Jones
  2014-05-08 20:04     ` Boris BREZILLON
  1 sibling, 1 reply; 26+ messages in thread
From: Lee Jones @ 2014-05-08 11:02 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Chen-Yu Tsai,
	Maxime Ripard, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

> The PRCM (Power/Reset/Clock Management) block exposes several subdevices
> in different subsystems (clk, reset ...)
> 
> Add basic support for the PRCM unit with clk (AR100, AHB0, and APB0 clks)
> and reset controller subdevices.
> 
> Other subdevices might be added later (if needed).
> 
> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
> ---
>  drivers/mfd/Kconfig      |   8 +++
>  drivers/mfd/Makefile     |   1 +
>  drivers/mfd/sun6i-prcm.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 160 insertions(+)
>  create mode 100644 drivers/mfd/sun6i-prcm.c

[...]

> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/errno.h>
> +#include <linux/err.h>
> +#include <linux/spinlock.h>
> +#include <linux/io.h>
> +#include <linux/slab.h>
> +#include <linux/mutex.h>
> +#include <linux/completion.h>
> +#include <linux/irq.h>
> +#include <linux/jiffies.h>
> +#include <linux/bitops.h>
> +#include <linux/fs.h>
> +#include <linux/of.h>
> +#include <linux/of_irq.h>
> +#include <linux/platform_device.h>
> +#include <linux/uaccess.h>
> +#include <linux/mfd/core.h>

I'm pretty sure you don't need half of these.  Please only add the
ones you make use of.

[...]

> +	dev_info(&pdev->dev, "PRCM initialized\n");

Please remove this from here.

[...]

> +static struct platform_driver sun6i_prcm_driver = {
> +	.driver = {
> +		.name = "sun6i-prcm",
> +		.owner = THIS_MODULE,
> +		.of_match_table = sun6i_prcm_dt_ids,
> +	},
> +	.probe = sun6i_prcm_probe,

You need a .remove() call-back.

> +};
> +module_platform_driver(sun6i_prcm_driver);
> +
> +MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>");
> +MODULE_DESCRIPTION("Allwinner sun6i PRCM driver");
> +MODULE_LICENSE("GPL v2");

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices
  2014-05-08  3:40     ` Chen-Yu Tsai
@ 2014-05-08 14:29       ` Maxime Ripard
  2014-05-08 20:08         ` Boris BREZILLON
  0 siblings, 1 reply; 26+ messages in thread
From: Maxime Ripard @ 2014-05-08 14:29 UTC (permalink / raw)
  To: Chen-Yu Tsai
  Cc: Boris BREZILLON, Emilio López, Mike Turquette, Samuel Ortiz,
	Lee Jones, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

[-- Attachment #1: Type: text/plain, Size: 870 bytes --]

On Thu, May 08, 2014 at 11:40:59AM +0800, Chen-Yu Tsai wrote:
> >> +                     apb0_gates: apb0_gates_clk {
> >> +                             compatible = "allwinner,sun6i-a31-apb0-gates-clk";
> >> +                             #clock-cells = <1>;
> >> +                             clocks = <&apb0>;
> >> +                             clock-output-names = "apb0_pio", "apb0_ir",
> >> +                                             "apb0_timer01", "apb0_p2wi",
> >
> > timer01 ? is this a typo?
> 
> A23 manual lists the clock gate as "r_timer0_1", so I put the name on the wiki.
> Allwinner sun6i code uses "r_tmr" or just "tmr". I see no problem naming this
> clock output as "apb0_timer" though.

Yep, it seems better.

Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-08 11:02   ` Lee Jones
@ 2014-05-08 20:04     ` Boris BREZILLON
  2014-05-09  5:05       ` [linux-sunxi] " Priit Laes
  2014-05-09  7:12       ` Lee Jones
  0 siblings, 2 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-08 20:04 UTC (permalink / raw)
  To: Lee Jones
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Chen-Yu Tsai,
	Maxime Ripard, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev


On 08/05/2014 13:02, Lee Jones wrote:
>> The PRCM (Power/Reset/Clock Management) block exposes several subdevices
>> in different subsystems (clk, reset ...)
>>
>> Add basic support for the PRCM unit with clk (AR100, AHB0, and APB0 clks)
>> and reset controller subdevices.
>>
>> Other subdevices might be added later (if needed).
>>
>> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
>> ---
>>  drivers/mfd/Kconfig      |   8 +++
>>  drivers/mfd/Makefile     |   1 +
>>  drivers/mfd/sun6i-prcm.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 160 insertions(+)
>>  create mode 100644 drivers/mfd/sun6i-prcm.c
> [...]
>
>> +#include <linux/module.h>
>> +#include <linux/kernel.h>
>> +#include <linux/errno.h>
>> +#include <linux/err.h>
>> +#include <linux/spinlock.h>
>> +#include <linux/io.h>
>> +#include <linux/slab.h>
>> +#include <linux/mutex.h>
>> +#include <linux/completion.h>
>> +#include <linux/irq.h>
>> +#include <linux/jiffies.h>
>> +#include <linux/bitops.h>
>> +#include <linux/fs.h>
>> +#include <linux/of.h>
>> +#include <linux/of_irq.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/uaccess.h>
>> +#include <linux/mfd/core.h>
> I'm pretty sure you don't need half of these.  Please only add the
> ones you make use of.

Sure (this is what happens when you copy/paste from another driver :-))

>
> [...]
>
>> +	dev_info(&pdev->dev, "PRCM initialized\n");
> Please remove this from here.

Okay.

>
> [...]
>
>> +static struct platform_driver sun6i_prcm_driver = {
>> +	.driver = {
>> +		.name = "sun6i-prcm",
>> +		.owner = THIS_MODULE,
>> +		.of_match_table = sun6i_prcm_dt_ids,
>> +	},
>> +	.probe = sun6i_prcm_probe,
> You need a .remove() call-back.

This driver cannot be compiled as module (see the Kconfig definition)
and the devices are not hotpluggable, as a result a probed device will
never be removed.

Do you still want me to implement the remove function ?

>
>> +};
>> +module_platform_driver(sun6i_prcm_driver);
>> +
>> +MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>");
>> +MODULE_DESCRIPTION("Allwinner sun6i PRCM driver");
>> +MODULE_LICENSE("GPL v2");

-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


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

* Re: [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe
  2014-05-08  3:07   ` Maxime Ripard
@ 2014-05-08 20:05     ` Boris BREZILLON
  0 siblings, 0 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-08 20:05 UTC (permalink / raw)
  To: Maxime Ripard
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Chen-Yu Tsai, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev


On 08/05/2014 05:07, Maxime Ripard wrote:
> On Wed, May 07, 2014 at 07:25:49PM +0200, Boris BREZILLON wrote:
>> The current implementation uses sunxi_reset_init function for both early
>> init and platform device probe.
>>
>> The sunxi_reset_init function uses DT to retrieve device resources, which
>> will be an issue if reset controllers are registered from an MFD device
>> that define resources from mfd_cell definition.
>>
>> Moreover, we can make of devm functions when we're in the probe context.
>>
>> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
>> ---
>>  drivers/reset/reset-sunxi.c | 21 ++++++++++++++++++---
>>  1 file changed, 18 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c
>> index 695bd34..1b5fea6 100644
>> --- a/drivers/reset/reset-sunxi.c
>> +++ b/drivers/reset/reset-sunxi.c
>> @@ -145,7 +145,24 @@ MODULE_DEVICE_TABLE(of, sunxi_reset_dt_ids);
>>  
>>  static int sunxi_reset_probe(struct platform_device *pdev)
>>  {
>> -	return sunxi_reset_init(pdev->dev.of_node);
>> +	struct sunxi_reset_data *data;
>> +	struct resource *res;
>> +
>> +	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
>> +	if (!data)
>> +		return -ENOMEM;
>> +
>> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> +	data->membase = devm_request_and_ioremap(&pdev->dev, res);
>> +	if (!data->membase)
>> +		return -ENOMEM;
> You'd probably be better off using devm_ioremap_resource so that you
> get a meaningful error code.

Oh, I missed this one. I'll fix it for the next version.

> Apart from this, you have my 
> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
>
> Thanks!
> Maxime
>

-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


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

* Re: [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices
  2014-05-08 14:29       ` Maxime Ripard
@ 2014-05-08 20:08         ` Boris BREZILLON
  0 siblings, 0 replies; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-08 20:08 UTC (permalink / raw)
  To: Maxime Ripard, Chen-Yu Tsai
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Lee Jones,
	Philipp Zabel, Shuge, kevin, Hans de Goede, Randy Dunlap,
	devicetree, linux-doc, linux-arm-kernel, linux-kernel, dev


On 08/05/2014 16:29, Maxime Ripard wrote:
> On Thu, May 08, 2014 at 11:40:59AM +0800, Chen-Yu Tsai wrote:
>>>> +                     apb0_gates: apb0_gates_clk {
>>>> +                             compatible = "allwinner,sun6i-a31-apb0-gates-clk";
>>>> +                             #clock-cells = <1>;
>>>> +                             clocks = <&apb0>;
>>>> +                             clock-output-names = "apb0_pio", "apb0_ir",
>>>> +                                             "apb0_timer01", "apb0_p2wi",
>>> timer01 ? is this a typo?
>> A23 manual lists the clock gate as "r_timer0_1", so I put the name on the wiki.
>> Allwinner sun6i code uses "r_tmr" or just "tmr". I see no problem naming this
>> clock output as "apb0_timer" though.
> Yep, it seems better.

Fair enough, I'll change the name for the next version.

>
> Maxime
>

-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


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

* Re: [linux-sunxi] Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-08 20:04     ` Boris BREZILLON
@ 2014-05-09  5:05       ` Priit Laes
  2014-05-09  7:11         ` Lee Jones
  2014-05-09  7:12       ` Lee Jones
  1 sibling, 1 reply; 26+ messages in thread
From: Priit Laes @ 2014-05-09  5:05 UTC (permalink / raw)
  To: linux-sunxi
  Cc: Lee Jones, Emilio López, Mike Turquette, Samuel Ortiz,
	Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev

Ühel kenal päeval, N, 08.05.2014 kell 22:04, kirjutas Boris BREZILLON:
> On 08/05/2014 13:02, Lee Jones wrote:
> >> The PRCM (Power/Reset/Clock Management) block exposes several subdevices
> >> in different subsystems (clk, reset ...)
> >>
> >> Add basic support for the PRCM unit with clk (AR100, AHB0, and APB0 clks)
> >> and reset controller subdevices.
> >>
> >> Other subdevices might be added later (if needed).
> >>
> >> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
> >> ---
> >>  drivers/mfd/Kconfig      |   8 +++
> >>  drivers/mfd/Makefile     |   1 +
> >>  drivers/mfd/sun6i-prcm.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++
> >>  3 files changed, 160 insertions(+)
> >>  create mode 100644 drivers/mfd/sun6i-prcm.c
> > [...]
> >
> >> +#include <linux/module.h>
> >> +#include <linux/kernel.h>
> >> +#include <linux/errno.h>
> >> +#include <linux/err.h>
> >> +#include <linux/spinlock.h>
> >> +#include <linux/io.h>
> >> +#include <linux/slab.h>
> >> +#include <linux/mutex.h>
> >> +#include <linux/completion.h>
> >> +#include <linux/irq.h>
> >> +#include <linux/jiffies.h>
> >> +#include <linux/bitops.h>
> >> +#include <linux/fs.h>
> >> +#include <linux/of.h>
> >> +#include <linux/of_irq.h>
> >> +#include <linux/platform_device.h>
> >> +#include <linux/uaccess.h>
> >> +#include <linux/mfd/core.h>
> > I'm pretty sure you don't need half of these.  Please only add the
> > ones you make use of.
> 
> Sure (this is what happens when you copy/paste from another driver :-))

Also, alphabetic order would be nice.

Päikest,
Priit Laes :)

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

* Re: [linux-sunxi] Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-09  5:05       ` [linux-sunxi] " Priit Laes
@ 2014-05-09  7:11         ` Lee Jones
  0 siblings, 0 replies; 26+ messages in thread
From: Lee Jones @ 2014-05-09  7:11 UTC (permalink / raw)
  To: Priit Laes
  Cc: linux-sunxi, Emilio López, Mike Turquette, Samuel Ortiz,
	Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Hans de Goede, Randy Dunlap, devicetree, linux-doc,
	linux-arm-kernel, linux-kernel, dev

> > >> The PRCM (Power/Reset/Clock Management) block exposes several subdevices
> > >> in different subsystems (clk, reset ...)
> > >>
> > >> Add basic support for the PRCM unit with clk (AR100, AHB0, and APB0 clks)
> > >> and reset controller subdevices.
> > >>
> > >> Other subdevices might be added later (if needed).
> > >>
> > >> Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
> > >> ---
> > >>  drivers/mfd/Kconfig      |   8 +++
> > >>  drivers/mfd/Makefile     |   1 +
> > >>  drivers/mfd/sun6i-prcm.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++
> > >>  3 files changed, 160 insertions(+)
> > >>  create mode 100644 drivers/mfd/sun6i-prcm.c
> > > [...]
> > >
> > >> +#include <linux/module.h>
> > >> +#include <linux/kernel.h>
> > >> +#include <linux/errno.h>
> > >> +#include <linux/err.h>
> > >> +#include <linux/spinlock.h>
> > >> +#include <linux/io.h>
> > >> +#include <linux/slab.h>
> > >> +#include <linux/mutex.h>
> > >> +#include <linux/completion.h>
> > >> +#include <linux/irq.h>
> > >> +#include <linux/jiffies.h>
> > >> +#include <linux/bitops.h>
> > >> +#include <linux/fs.h>
> > >> +#include <linux/of.h>
> > >> +#include <linux/of_irq.h>
> > >> +#include <linux/platform_device.h>
> > >> +#include <linux/uaccess.h>
> > >> +#include <linux/mfd/core.h>
> > > I'm pretty sure you don't need half of these.  Please only add the
> > > ones you make use of.
> > 
> > Sure (this is what happens when you copy/paste from another driver :-))
> 
> Also, alphabetic order would be nice.

No, please don't do that, it's a waste of time.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-08 20:04     ` Boris BREZILLON
  2014-05-09  5:05       ` [linux-sunxi] " Priit Laes
@ 2014-05-09  7:12       ` Lee Jones
  2014-05-09  7:34         ` Hans de Goede
  1 sibling, 1 reply; 26+ messages in thread
From: Lee Jones @ 2014-05-09  7:12 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Chen-Yu Tsai,
	Maxime Ripard, Philipp Zabel, Shuge, kevin, Hans de Goede,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

> >> +static struct platform_driver sun6i_prcm_driver = {
> >> +	.driver = {
> >> +		.name = "sun6i-prcm",
> >> +		.owner = THIS_MODULE,
> >> +		.of_match_table = sun6i_prcm_dt_ids,
> >> +	},
> >> +	.probe = sun6i_prcm_probe,
> > You need a .remove() call-back.
> 
> This driver cannot be compiled as module (see the Kconfig definition)
> and the devices are not hotpluggable, as a result a probed device will
> never be removed.
> 
> Do you still want me to implement the remove function ?

.remove() also be run on shut down.  It's best practice to have one.

> >> +module_platform_driver(sun6i_prcm_driver);
> >> +
> >> +MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>");
> >> +MODULE_DESCRIPTION("Allwinner sun6i PRCM driver");
> >> +MODULE_LICENSE("GPL v2");
> 

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-09  7:12       ` Lee Jones
@ 2014-05-09  7:34         ` Hans de Goede
  2014-05-09  8:08           ` Lee Jones
  0 siblings, 1 reply; 26+ messages in thread
From: Hans de Goede @ 2014-05-09  7:34 UTC (permalink / raw)
  To: Lee Jones, Boris BREZILLON
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Chen-Yu Tsai,
	Maxime Ripard, Philipp Zabel, Shuge, kevin, Randy Dunlap,
	devicetree, linux-doc, linux-arm-kernel, linux-kernel, dev

Hi,

On 05/09/2014 09:12 AM, Lee Jones wrote:
>>>> +static struct platform_driver sun6i_prcm_driver = {
>>>> +	.driver = {
>>>> +		.name = "sun6i-prcm",
>>>> +		.owner = THIS_MODULE,
>>>> +		.of_match_table = sun6i_prcm_dt_ids,
>>>> +	},
>>>> +	.probe = sun6i_prcm_probe,
>>> You need a .remove() call-back.
>>
>> This driver cannot be compiled as module (see the Kconfig definition)
>> and the devices are not hotpluggable, as a result a probed device will
>> never be removed.
>>
>> Do you still want me to implement the remove function ?
> 
> .remove() also be run on shut down.

That is not true, if your device needs to do anything special at shutdown
you need to add a shutdown callback. Devices are kept as is (not torn down)
on shutdown.

> It's best practice to have one.
> 
>>>> +module_platform_driver(sun6i_prcm_driver);
>>>> +
>>>> +MODULE_AUTHOR("Boris BREZILLON <boris.brezillon@free-electrons.com>");
>>>> +MODULE_DESCRIPTION("Allwinner sun6i PRCM driver");
>>>> +MODULE_LICENSE("GPL v2");
>>
> 

Regards,

Hans

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-09  7:34         ` Hans de Goede
@ 2014-05-09  8:08           ` Lee Jones
       [not found]             ` <536C8F71.5040604@redhat.com>
  0 siblings, 1 reply; 26+ messages in thread
From: Lee Jones @ 2014-05-09  8:08 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Boris BREZILLON, Emilio López, Mike Turquette, Samuel Ortiz,
	Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

> >>>> +static struct platform_driver sun6i_prcm_driver = {
> >>>> +	.driver = {
> >>>> +		.name = "sun6i-prcm",
> >>>> +		.owner = THIS_MODULE,
> >>>> +		.of_match_table = sun6i_prcm_dt_ids,
> >>>> +	},
> >>>> +	.probe = sun6i_prcm_probe,
> >>> You need a .remove() call-back.
> >>
> >> This driver cannot be compiled as module (see the Kconfig definition)
> >> and the devices are not hotpluggable, as a result a probed device will
> >> never be removed.
> >>
> >> Do you still want me to implement the remove function ?
> > 
> > .remove() also be run on shut down.
> 
> That is not true, if your device needs to do anything special at shutdown
> you need to add a shutdown callback. Devices are kept as is (not torn down)
> on shutdown.

Ah okay, I'll bow to your knowledge.  So there's no reason for this
driver to ever call mfd_remove_devices() then?

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
       [not found]             ` <536C8F71.5040604@redhat.com>
@ 2014-05-09  8:28               ` Boris BREZILLON
  2014-05-09  8:59                 ` Lee Jones
  0 siblings, 1 reply; 26+ messages in thread
From: Boris BREZILLON @ 2014-05-09  8:28 UTC (permalink / raw)
  To: Hans de Goede, Lee Jones
  Cc: Emilio López, Mike Turquette, Samuel Ortiz, Chen-Yu Tsai,
	Maxime Ripard, Philipp Zabel, Shuge, kevin, Randy Dunlap,
	devicetree, linux-doc, linux-arm-kernel, linux-kernel, dev


On 09/05/2014 10:18, Hans de Goede wrote:
> Hi,
>
> On 05/09/2014 10:08 AM, Lee Jones wrote:
>>>>>>> +static struct platform_driver sun6i_prcm_driver = {
>>>>>>> +	.driver = {
>>>>>>> +		.name = "sun6i-prcm",
>>>>>>> +		.owner = THIS_MODULE,
>>>>>>> +		.of_match_table = sun6i_prcm_dt_ids,
>>>>>>> +	},
>>>>>>> +	.probe = sun6i_prcm_probe,
>>>>>> You need a .remove() call-back.
>>>>> This driver cannot be compiled as module (see the Kconfig definition)
>>>>> and the devices are not hotpluggable, as a result a probed device will
>>>>> never be removed.
>>>>>
>>>>> Do you still want me to implement the remove function ?
>>>> .remove() also be run on shut down.
>>> That is not true, if your device needs to do anything special at shutdown
>>> you need to add a shutdown callback. Devices are kept as is (not torn down)
>>> on shutdown.
>> Ah okay, I'll bow to your knowledge.  So there's no reason for this
>> driver to ever call mfd_remove_devices() then?
> No, this is an integral part of the SOC, which never gets removed in any way.

Lee, I'm about to send a 3rd version of this series, is it okay for you
if I leave the remove function unimplemented ?

>
> Regards,
>
> Hans

-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


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

* Re: [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit
  2014-05-09  8:28               ` Boris BREZILLON
@ 2014-05-09  8:59                 ` Lee Jones
  0 siblings, 0 replies; 26+ messages in thread
From: Lee Jones @ 2014-05-09  8:59 UTC (permalink / raw)
  To: Boris BREZILLON
  Cc: Hans de Goede, Emilio López, Mike Turquette, Samuel Ortiz,
	Chen-Yu Tsai, Maxime Ripard, Philipp Zabel, Shuge, kevin,
	Randy Dunlap, devicetree, linux-doc, linux-arm-kernel,
	linux-kernel, dev

> >>>>>>> +static struct platform_driver sun6i_prcm_driver = {
> >>>>>>> +	.driver = {
> >>>>>>> +		.name = "sun6i-prcm",
> >>>>>>> +		.owner = THIS_MODULE,
> >>>>>>> +		.of_match_table = sun6i_prcm_dt_ids,
> >>>>>>> +	},
> >>>>>>> +	.probe = sun6i_prcm_probe,
> >>>>>> You need a .remove() call-back.
> >>>>> This driver cannot be compiled as module (see the Kconfig definition)
> >>>>> and the devices are not hotpluggable, as a result a probed device will
> >>>>> never be removed.
> >>>>>
> >>>>> Do you still want me to implement the remove function ?
> >>>> .remove() also be run on shut down.
> >>> That is not true, if your device needs to do anything special at shutdown
> >>> you need to add a shutdown callback. Devices are kept as is (not torn down)
> >>> on shutdown.
> >> Ah okay, I'll bow to your knowledge.  So there's no reason for this
> >> driver to ever call mfd_remove_devices() then?
> > No, this is an integral part of the SOC, which never gets removed in any way.
> 
> Lee, I'm about to send a 3rd version of this series, is it okay for you
> if I leave the remove function unimplemented ?

It is.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

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

end of thread, other threads:[~2014-05-09  8:59 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-07 17:25 [PATCH v2 0/7] mfd: add basic sun6i A31 PRCM support Boris BREZILLON
2014-05-07 17:25 ` [PATCH v2 1/7] reset: sunxi: document sunxi's reset controllers bindings Boris BREZILLON
2014-05-08  3:05   ` Maxime Ripard
2014-05-07 17:25 ` [PATCH v2 2/7] reset: sunxi: allow MFD subdevices probe Boris BREZILLON
2014-05-08  3:07   ` Maxime Ripard
2014-05-08 20:05     ` Boris BREZILLON
2014-05-07 17:25 ` [PATCH v2 3/7] mfd: add support for sun6i PRCM (Power/Reset/Clock Management) unit Boris BREZILLON
2014-05-08  3:09   ` Maxime Ripard
2014-05-08 11:02   ` Lee Jones
2014-05-08 20:04     ` Boris BREZILLON
2014-05-09  5:05       ` [linux-sunxi] " Priit Laes
2014-05-09  7:11         ` Lee Jones
2014-05-09  7:12       ` Lee Jones
2014-05-09  7:34         ` Hans de Goede
2014-05-09  8:08           ` Lee Jones
     [not found]             ` <536C8F71.5040604@redhat.com>
2014-05-09  8:28               ` Boris BREZILLON
2014-05-09  8:59                 ` Lee Jones
2014-05-07 17:25 ` [PATCH v2 4/7] mfd: sun6i-prcm: document DT bindings Boris BREZILLON
2014-05-07 17:25 ` [PATCH v2 5/7] clk: sunxi: add PRCM (Power/Reset/Clock Management) clks support Boris BREZILLON
2014-05-08  3:11   ` Maxime Ripard
2014-05-07 17:25 ` [PATCH v2 6/7] clk: sunxi: document PRCM clock compatible strings Boris BREZILLON
2014-05-07 17:25 ` [PATCH v2 7/7] ARM: sunxi: dt: add PRCM clk and reset controller subdevices Boris BREZILLON
2014-05-08  3:17   ` Maxime Ripard
2014-05-08  3:40     ` Chen-Yu Tsai
2014-05-08 14:29       ` Maxime Ripard
2014-05-08 20:08         ` Boris BREZILLON

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