linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] clk: add PowerPC corenet clock driver support
@ 2013-04-09  8:46 Yuantian.Tang
  2013-04-09  8:46 ` [PATCH] powerpc/mpc85xx: Update the clock device tree nodes Yuantian.Tang
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Yuantian.Tang @ 2013-04-09  8:46 UTC (permalink / raw)
  To: mturquette
  Cc: ulf.hansson, linux-doc, viresh.kumar, devicetree-discuss,
	linux-kernel, Tang Yuantian, shawn.guo, linuxppc-dev,
	linus.walleij

From: Tang Yuantian <yuantian.tang@freescale.com>

This adds the clock driver for Freescale PowerPC corenet
series SoCs using common clock infrastructure.

Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com>
Signed-off-by: Li Yang <leoli@freescale.com>
---
v3:
	- remove the module author and description
v2:
	- add the document for device tree clock bindings

 arch/powerpc/platforms/Kconfig.cputype |   1 +
 drivers/clk/Kconfig                    |   7 +
 drivers/clk/Makefile                   |   1 +
 drivers/clk/clk-ppc-corenet.c          | 280 +++++++++++++++++++++++++++++++++
 4 files changed, 289 insertions(+)
 create mode 100644 drivers/clk/clk-ppc-corenet.c

diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
index 18e3b76..cf065b8 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -158,6 +158,7 @@ config E500
 config PPC_E500MC
 	bool "e500mc Support"
 	select PPC_FPU
+	select COMMON_CLK
 	depends on E500
 	help
 	  This must be enabled for running on e500mc (and derivatives
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index a47e6ee..6e2fd9c 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -63,6 +63,13 @@ config CLK_TWL6040
 	  McPDM. McPDM module is using the external bit clock on the McPDM bus
 	  as functional clock.
 
+config CLK_PPC_CORENET
+	bool "Clock driver for PowerPC corenet platforms"
+	depends on PPC_E500MC && OF
+	---help---
+	  This adds the clock driver support for Freescale PowerPC corenet
+	  platforms using common clock framework.
+
 endmenu
 
 source "drivers/clk/mvebu/Kconfig"
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 300d477..6720319 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -34,3 +34,4 @@ obj-$(CONFIG_X86)		+= x86/
 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
 obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
 obj-$(CONFIG_CLK_TWL6040)	+= clk-twl6040.o
+obj-$(CONFIG_CLK_PPC_CORENET)	+= clk-ppc-corenet.o
diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
new file mode 100644
index 0000000..a2d483f
--- /dev/null
+++ b/drivers/clk/clk-ppc-corenet.c
@@ -0,0 +1,280 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ *
+ * clock driver for Freescale PowerPC corenet SoCs.
+ */
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+
+struct cmux_clk {
+	struct clk_hw hw;
+	void __iomem *reg;
+	u32 flags;
+};
+
+#define PLL_KILL			BIT(31)
+#define	CLKSEL_SHIFT		27
+#define CLKSEL_ADJUST		BIT(0)
+#define to_cmux_clk(p)		container_of(p, struct cmux_clk, hw)
+
+static void __iomem *base;
+static unsigned int clocks_per_pll;
+
+static int cmux_set_parent(struct clk_hw *hw, u8 idx)
+{
+	struct cmux_clk *clk = to_cmux_clk(hw);
+	u32 clksel;
+
+	clksel = ((idx / clocks_per_pll) << 2) + idx % clocks_per_pll;
+	if (clk->flags & CLKSEL_ADJUST)
+		clksel += 8;
+	clksel = (clksel & 0xf) << CLKSEL_SHIFT;
+	iowrite32be(clksel, clk->reg);
+
+	return 0;
+}
+
+static u8 cmux_get_parent(struct clk_hw *hw)
+{
+	struct cmux_clk *clk = to_cmux_clk(hw);
+	u32 clksel;
+
+	clksel = ioread32be(clk->reg);
+	clksel = (clksel >> CLKSEL_SHIFT) & 0xf;
+	if (clk->flags & CLKSEL_ADJUST)
+		clksel -= 8;
+	clksel = (clksel >> 2) * clocks_per_pll + clksel % 4;
+
+	return clksel;
+}
+
+const struct clk_ops cmux_ops = {
+	.get_parent = cmux_get_parent,
+	.set_parent = cmux_set_parent,
+};
+
+static void __init core_mux_init(struct device_node *np)
+{
+	struct clk *clk;
+	struct clk_init_data init;
+	struct cmux_clk *cmux_clk;
+	struct device_node *node;
+	int rc, count, i;
+	u32	offset;
+	const char *clk_name;
+	const char **parent_names;
+
+	rc = of_property_read_u32(np, "reg", &offset);
+	if (rc) {
+		pr_err("%s: could not get reg property\n", np->name);
+		return;
+	}
+
+	/* get the input clock source count */
+	count = of_property_count_strings(np, "clock-names");
+	if (count < 0) {
+		pr_err("%s: get clock count error\n", np->name);
+		return;
+	}
+	parent_names = kzalloc((sizeof(char *) * count), GFP_KERNEL);
+	if (!parent_names) {
+		pr_err("%s: could not allocate parent_names\n", __func__);
+		return;
+	}
+
+	for (i = 0; i < count; i++)
+		parent_names[i] = of_clk_get_parent_name(np, i);
+
+	cmux_clk = kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);
+	if (!cmux_clk) {
+		pr_err("%s: could not allocate cmux_clk\n", __func__);
+		goto err_name;
+	}
+	cmux_clk->reg = base + offset;
+
+	node = of_find_compatible_node(NULL, NULL, "fsl,p4080-clockgen");
+	if (node && (offset >= 0x80))
+		cmux_clk->flags = CLKSEL_ADJUST;
+
+	rc = of_property_read_string_index(np, "clock-output-names",
+			0, &clk_name);
+	if (rc) {
+		pr_err("%s: read clock names error\n", np->name);
+		goto err_clk;
+	}
+
+	init.name = clk_name;
+	init.ops = &cmux_ops;
+	init.parent_names = parent_names;
+	init.num_parents = count;
+	init.flags = 0;
+	cmux_clk->hw.init = &init;
+
+	clk = clk_register(NULL, &cmux_clk->hw);
+	if (IS_ERR(clk)) {
+		pr_err("%s: could not register clock\n", clk_name);
+		goto err_clk;
+	}
+
+	rc = of_clk_add_provider(np, of_clk_src_simple_get, clk);
+	if (rc) {
+		pr_err("Could not register clock provider for node:%s\n",
+			 np->name);
+		goto err_clk;
+	}
+	goto err_name;
+
+err_clk:
+	kfree(cmux_clk);
+err_name:
+	/* free *_names because they are reallocated when registered */
+	kfree(parent_names);
+}
+
+static void __init core_pll_init(struct device_node *np)
+{
+	u32 offset, mult;
+	int i, rc, count;
+	const char *clk_name, *parent_name;
+	struct clk_onecell_data *onecell_data;
+	struct clk      **subclks;
+
+	rc = of_property_read_u32(np, "reg", &offset);
+	if (rc) {
+		pr_err("%s: could not get reg property\n", np->name);
+		return;
+	}
+
+	/* get the multiple of PLL */
+	mult = ioread32be(base + offset);
+
+	/* check if this PLL is disabled */
+	if (mult & PLL_KILL) {
+		pr_debug("PLL:%s is disabled\n", np->name);
+		return;
+	}
+	mult = (mult >> 1) & 0x3f;
+
+	parent_name = of_clk_get_parent_name(np, 0);
+	if (!parent_name) {
+		pr_err("PLL: %s must have a parent\n", np->name);
+		return;
+	}
+
+	count = of_property_count_strings(np, "clock-output-names");
+	if (count < 0 || count > 4) {
+		pr_err("%s: clock is not supported\n", np->name);
+		return;
+	}
+
+	/* output clock number per PLL */
+	clocks_per_pll = count;
+
+	subclks = kzalloc(sizeof(struct clk *) * count, GFP_KERNEL);
+	if (!subclks) {
+		pr_err("%s: could not allocate subclks\n", __func__);
+		return;
+	}
+
+	onecell_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);
+	if (!onecell_data) {
+		pr_err("%s: could not allocate onecell_data\n", __func__);
+		goto err_clks;
+	}
+
+	for (i = 0; i < count; i++) {
+		rc = of_property_read_string_index(np, "clock-output-names",
+				i, &clk_name);
+		if (rc) {
+			pr_err("%s: could not get clock names\n", np->name);
+			goto err_cell;
+		}
+
+		/*
+		 * when count == 4, there are 4 output clocks:
+		 * /1, /2, /3, /4 respectively
+		 * when count < 4, there are at least 2 output clocks:
+		 * /1, /2, (/4, if count == 3) respectively.
+		 */
+		if (count == 4)
+			subclks[i] = clk_register_fixed_factor(NULL, clk_name,
+					parent_name, 0, mult, 1 + i);
+		else
+
+			subclks[i] = clk_register_fixed_factor(NULL, clk_name,
+					parent_name, 0, mult, 1 << i);
+
+		if (IS_ERR(subclks[i])) {
+			pr_err("%s: could not register clock\n", clk_name);
+			goto err_cell;
+		}
+	}
+
+	onecell_data->clks = subclks;
+	onecell_data->clk_num = count;
+
+	rc = of_clk_add_provider(np, of_clk_src_onecell_get, onecell_data);
+	if (rc) {
+		pr_err("Could not register clk provider for node:%s\n",
+			 np->name);
+		goto err_cell;
+	}
+
+	return;
+err_cell:
+	kfree(onecell_data);
+err_clks:
+	kfree(subclks);
+}
+
+static const struct of_device_id clk_match[] __initconst = {
+	{ .compatible = "fixed-clock", .data = of_fixed_clk_setup, },
+	{ .compatible = "fsl,core-pll-clock", .data = core_pll_init, },
+	{ .compatible = "fsl,core-mux-clock", .data = core_mux_init, },
+	{}
+};
+
+static int __init ppc_corenet_clk_probe(struct platform_device *pdev)
+{
+	struct device_node *np;
+
+	np = pdev->dev.of_node;
+	base = of_iomap(np, 0);
+	if (!base) {
+		dev_err(&pdev->dev, "iomap error\n");
+		return -ENOMEM;
+	}
+	of_clk_init(clk_match);
+
+	return 0;
+}
+
+static const struct of_device_id ppc_clk_ids[] __initconst = {
+	{ .compatible = "fsl,qoriq-clockgen-1.0", },
+	{ .compatible = "fsl,qoriq-clockgen-2", },
+	{}
+};
+
+static struct platform_driver ppc_corenet_clk_driver = {
+	.driver = {
+		.name = "ppc_corenet_clock",
+		.owner = THIS_MODULE,
+		.of_match_table = ppc_clk_ids,
+	},
+	.probe = ppc_corenet_clk_probe,
+};
+
+static int __init ppc_corenet_clk_init(void)
+{
+	return platform_driver_register(&ppc_corenet_clk_driver);
+}
+subsys_initcall(ppc_corenet_clk_init);
-- 
1.8.0

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

* [PATCH] powerpc/mpc85xx: Update the clock device tree nodes
  2013-04-09  8:46 [PATCH v3] clk: add PowerPC corenet clock driver support Yuantian.Tang
@ 2013-04-09  8:46 ` Yuantian.Tang
  2013-04-16  6:59 ` [PATCH v3] clk: add PowerPC corenet clock driver support Tang Yuantian-B29983
  2013-05-13 19:25 ` Mike Turquette
  2 siblings, 0 replies; 6+ messages in thread
From: Yuantian.Tang @ 2013-04-09  8:46 UTC (permalink / raw)
  To: mturquette
  Cc: ulf.hansson, linux-doc, viresh.kumar, devicetree-discuss,
	linux-kernel, Tang Yuantian, shawn.guo, linuxppc-dev,
	linus.walleij

From: Tang Yuantian <yuantian.tang@freescale.com>

The following SoCs will be affected: p2041, p3041, p4080,
p5020, p5040

Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com>
Signed-off-by: Li Yang <leoli@freescale.com>
---
* resend for review

 arch/powerpc/boot/dts/fsl/p2041si-post.dtsi |  62 ++++++++++++++++-
 arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p3041si-post.dtsi |  62 ++++++++++++++++-
 arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi  |   4 ++
 arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | 100 +++++++++++++++++++++++++++-
 arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi  |   8 +++
 arch/powerpc/boot/dts/fsl/p5020si-post.dtsi |  42 +++++++++++-
 arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi  |   2 +
 arch/powerpc/boot/dts/fsl/p5040si-post.dtsi |  54 ++++++++++++++-
 arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi  |   4 ++
 10 files changed, 337 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
index 69ac1ac..d83de62 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
@@ -305,9 +305,69 @@
 	};
 
 	clockgen: global-utilities@e1000 {
-		compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0";
+		compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0",
+				   "fixed-clock";
 		reg = <0xe1000 0x1000>;
 		clock-frequency = <0>;
+		clock-output-names = "sysclk";
+		#clock-cells = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+		pll0: pll0@800 {
+			#clock-cells = <1>;
+			reg = <0x800>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+		};
+		pll1: pll1@820 {
+			#clock-cells = <1>;
+			reg = <0x820>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+		};
+		mux0: mux0@0 {
+			#clock-cells = <0>;
+			reg = <0x0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				   <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux0";
+		};
+		mux1: mux1@20 {
+			#clock-cells = <0>;
+			reg = <0x20>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				   <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux1";
+		};
+		mux2: mux2@40 {
+			#clock-cells = <0>;
+			reg = <0x40>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				   <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux2";
+		};
+		mux3: mux3@60 {
+			#clock-cells = <0>;
+			reg = <0x60>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				   <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux3";
+		};
 	};
 
 	rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
index 7a2697d..22f3b14 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
@@ -81,6 +81,7 @@
 		cpu0: PowerPC,e500mc@0 {
 			device_type = "cpu";
 			reg = <0>;
+			clocks = <&mux0>;
 			next-level-cache = <&L2_0>;
 			L2_0: l2-cache {
 				next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
 		cpu1: PowerPC,e500mc@1 {
 			device_type = "cpu";
 			reg = <1>;
+			clocks = <&mux1>;
 			next-level-cache = <&L2_1>;
 			L2_1: l2-cache {
 				next-level-cache = <&cpc>;
@@ -97,6 +99,7 @@
 		cpu2: PowerPC,e500mc@2 {
 			device_type = "cpu";
 			reg = <2>;
+			clocks = <&mux2>;
 			next-level-cache = <&L2_2>;
 			L2_2: l2-cache {
 				next-level-cache = <&cpc>;
@@ -105,6 +108,7 @@
 		cpu3: PowerPC,e500mc@3 {
 			device_type = "cpu";
 			reg = <3>;
+			clocks = <&mux3>;
 			next-level-cache = <&L2_3>;
 			L2_3: l2-cache {
 				next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
index 9b5a81a..25b19cc 100644
--- a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
@@ -332,9 +332,69 @@
 	};
 
 	clockgen: global-utilities@e1000 {
-		compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0";
+		compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0",
+				   "fixed-clock";
 		reg = <0xe1000 0x1000>;
 		clock-frequency = <0>;
+		clock-output-names = "sysclk";
+		#clock-cells = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+		pll0: pll1@800 {
+			#clock-cells = <1>;
+			reg = <0x800>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+		};
+		pll1: pll1@820 {
+			#clock-cells = <1>;
+			reg = <0x820>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+		};
+		mux0: mux0@0 {
+			#clock-cells = <0>;
+			reg = <0x0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				 <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux0";
+		};
+		mux1: mux1@20 {
+			#clock-cells = <0>;
+			reg = <0x20>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				 <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux1";
+		};
+		mux2: mux2@40 {
+			#clock-cells = <0>;
+			reg = <0x40>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				 <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux2";
+		};
+		mux3: mux3@60 {
+			#clock-cells = <0>;
+			reg = <0x60>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				 <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux3";
+		};
 	};
 
 	rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
index c9ca2c3..468e8be 100644
--- a/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
@@ -82,6 +82,7 @@
 		cpu0: PowerPC,e500mc@0 {
 			device_type = "cpu";
 			reg = <0>;
+			clocks = <&mux0>;
 			next-level-cache = <&L2_0>;
 			L2_0: l2-cache {
 				next-level-cache = <&cpc>;
@@ -90,6 +91,7 @@
 		cpu1: PowerPC,e500mc@1 {
 			device_type = "cpu";
 			reg = <1>;
+			clocks = <&mux1>;
 			next-level-cache = <&L2_1>;
 			L2_1: l2-cache {
 				next-level-cache = <&cpc>;
@@ -98,6 +100,7 @@
 		cpu2: PowerPC,e500mc@2 {
 			device_type = "cpu";
 			reg = <2>;
+			clocks = <&mux2>;
 			next-level-cache = <&L2_2>;
 			L2_2: l2-cache {
 				next-level-cache = <&cpc>;
@@ -106,6 +109,7 @@
 		cpu3: PowerPC,e500mc@3 {
 			device_type = "cpu";
 			reg = <3>;
+			clocks = <&mux3>;
 			next-level-cache = <&L2_3>;
 			L2_3: l2-cache {
 				next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
index 19859ad..3596f05 100644
--- a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
@@ -352,9 +352,107 @@
 	};
 
 	clockgen: global-utilities@e1000 {
-		compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0";
+		compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0",
+				   "fixed-clock";
 		reg = <0xe1000 0x1000>;
 		clock-frequency = <0>;
+		clock-output-names = "sysclk";
+		#clock-cells = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+		pll0: pll0@800 {
+			#clock-cells = <1>;
+			reg = <0x800>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll0", "pll0-div2";
+		};
+		pll1: pll1@820 {
+			#clock-cells = <1>;
+			reg = <0x820>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll1", "pll1-div2";
+		};
+		pll2: pll2@840 {
+			#clock-cells = <1>;
+			reg = <0x840>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll2", "pll2-div2";
+		};
+		pll3: pll2@860 {
+			#clock-cells = <1>;
+			reg = <0x860>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll3", "pll3-div2";
+		};
+		mux0: mux0@0 {
+			#clock-cells = <0>;
+			reg = <0x0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux0";
+		};
+		mux1: mux1@20 {
+			#clock-cells = <0>;
+			reg = <0x20>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux1";
+		};
+		mux2: mux2@40 {
+			#clock-cells = <0>;
+			reg = <0x40>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux2";
+		};
+		mux3: mux3@60 {
+			#clock-cells = <0>;
+			reg = <0x60>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux3";
+		};
+		mux4: mux4@80 {
+			#clock-cells = <0>;
+			reg = <0x80>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
+			clock-names = "pll2_0", "pll2_1", "pll3_0", "pll3_1";
+			clock-output-names = "cmux4";
+		};
+		mux5: mux5@a0 {
+			#clock-cells = <0>;
+			reg = <0xa0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
+			clock-names = "pll2_0", "pll2_1", "pll3_0", "pll3_1";
+			clock-output-names = "cmux5";
+		};
+		mux6: mux6@c0 {
+			#clock-cells = <0>;
+			reg = <0xc0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
+			clock-names = "pll2_0", "pll2_1", "pll3_0", "pll3_1";
+			clock-output-names = "cmux6";
+		};
+		mux7: mux7@e0 {
+			#clock-cells = <0>;
+			reg = <0xe0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
+			clock-names = "pll2_0", "pll2_1", "pll3_0", "pll3_1";
+			clock-output-names = "cmux7";
+		};
 	};
 
 	rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
index 493d9a0..0040b5a 100644
--- a/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
@@ -81,6 +81,7 @@
 		cpu0: PowerPC,e500mc@0 {
 			device_type = "cpu";
 			reg = <0>;
+			clocks = <&mux0>;
 			next-level-cache = <&L2_0>;
 			L2_0: l2-cache {
 				next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
 		cpu1: PowerPC,e500mc@1 {
 			device_type = "cpu";
 			reg = <1>;
+			clocks = <&mux1>;
 			next-level-cache = <&L2_1>;
 			L2_1: l2-cache {
 				next-level-cache = <&cpc>;
@@ -97,6 +99,7 @@
 		cpu2: PowerPC,e500mc@2 {
 			device_type = "cpu";
 			reg = <2>;
+			clocks = <&mux2>;
 			next-level-cache = <&L2_2>;
 			L2_2: l2-cache {
 				next-level-cache = <&cpc>;
@@ -105,6 +108,7 @@
 		cpu3: PowerPC,e500mc@3 {
 			device_type = "cpu";
 			reg = <3>;
+			clocks = <&mux3>;
 			next-level-cache = <&L2_3>;
 			L2_3: l2-cache {
 				next-level-cache = <&cpc>;
@@ -113,6 +117,7 @@
 		cpu4: PowerPC,e500mc@4 {
 			device_type = "cpu";
 			reg = <4>;
+			clocks = <&mux4>;
 			next-level-cache = <&L2_4>;
 			L2_4: l2-cache {
 				next-level-cache = <&cpc>;
@@ -121,6 +126,7 @@
 		cpu5: PowerPC,e500mc@5 {
 			device_type = "cpu";
 			reg = <5>;
+			clocks = <&mux5>;
 			next-level-cache = <&L2_5>;
 			L2_5: l2-cache {
 				next-level-cache = <&cpc>;
@@ -129,6 +135,7 @@
 		cpu6: PowerPC,e500mc@6 {
 			device_type = "cpu";
 			reg = <6>;
+			clocks = <&mux6>;
 			next-level-cache = <&L2_6>;
 			L2_6: l2-cache {
 				next-level-cache = <&cpc>;
@@ -137,6 +144,7 @@
 		cpu7: PowerPC,e500mc@7 {
 			device_type = "cpu";
 			reg = <7>;
+			clocks = <&mux7>;
 			next-level-cache = <&L2_7>;
 			L2_7: l2-cache {
 				next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
index 9ea77c3..3c662bd 100644
--- a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
@@ -337,9 +337,49 @@
 	};
 
 	clockgen: global-utilities@e1000 {
-		compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
+		compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0",
+				   "fixed-clock";
 		reg = <0xe1000 0x1000>;
 		clock-frequency = <0>;
+		clock-output-names = "sysclk";
+		#clock-cells = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+		pll0: pll0@800 {
+			#clock-cells = <1>;
+			reg = <0x800>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll0", "pll0-div2", "pll0-div4";
+		};
+		pll1: pll1@820 {
+			#clock-cells = <1>;
+			reg = <0x820>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll1", "pll1-div2", "pll1-div4";
+		};
+		mux0: mux0@0 {
+			#clock-cells = <0>;
+			reg = <0x0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				 <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux0";
+		};
+		mux1: mux1@20 {
+			#clock-cells = <0>;
+			reg = <0x20>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
+				 <&pll1 0>, <&pll1 1>, <&pll1 2>;
+			clock-names = "pll0_0", "pll0_1", "pll0_2",
+				"pll1_0", "pll1_1", "pll1_2";
+			clock-output-names = "cmux1";
+		};
 	};
 
 	rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
index 8df47fc..fe1a2e6 100644
--- a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
@@ -88,6 +88,7 @@
 		cpu0: PowerPC,e5500@0 {
 			device_type = "cpu";
 			reg = <0>;
+			clocks = <&mux0>;
 			next-level-cache = <&L2_0>;
 			L2_0: l2-cache {
 				next-level-cache = <&cpc>;
@@ -96,6 +97,7 @@
 		cpu1: PowerPC,e5500@1 {
 			device_type = "cpu";
 			reg = <1>;
+			clocks = <&mux1>;
 			next-level-cache = <&L2_1>;
 			L2_1: l2-cache {
 				next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
index 97f8c26..3870b22 100644
--- a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
@@ -297,9 +297,61 @@
 	};
 
 	clockgen: global-utilities@e1000 {
-		compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0";
+		compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0",
+				   "fixed-clock";
 		reg = <0xe1000 0x1000>;
 		clock-frequency = <0>;
+		clock-output-names = "sysclk";
+		#clock-cells = <0>;
+
+		#address-cells = <1>;
+		#size-cells = <0>;
+		pll0: pll0@800 {
+			#clock-cells = <1>;
+			reg = <0x800>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll0", "pll0-div2";
+		};
+		pll1: pll1@820 {
+			#clock-cells = <1>;
+			reg = <0x820>;
+			compatible = "fsl,core-pll-clock";
+			clocks = <&clockgen>;
+			clock-output-names = "pll1", "pll1-div2";
+		};
+		mux0: mux0@0 {
+			#clock-cells = <0>;
+			reg = <0x0>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux0";
+		};
+		mux1: mux1@20 {
+			#clock-cells = <0>;
+			reg = <0x20>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux1";
+		};
+		mux2: mux2@40 {
+			#clock-cells = <0>;
+			reg = <0x40>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux2";
+		};
+		mux3: mux3@60 {
+			#clock-cells = <0>;
+			reg = <0x60>;
+			compatible = "fsl,core-mux-clock";
+			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
+			clock-names = "pll0_0", "pll0_1", "pll1_0", "pll1_1";
+			clock-output-names = "cmux3";
+		};
 	};
 
 	rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
index 40ca943..3674686 100644
--- a/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
@@ -81,6 +81,7 @@
 		cpu0: PowerPC,e5500@0 {
 			device_type = "cpu";
 			reg = <0>;
+			clocks = <&mux0>;
 			next-level-cache = <&L2_0>;
 			L2_0: l2-cache {
 				next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
 		cpu1: PowerPC,e5500@1 {
 			device_type = "cpu";
 			reg = <1>;
+			clocks = <&mux1>;
 			next-level-cache = <&L2_1>;
 			L2_1: l2-cache {
 				next-level-cache = <&cpc>;
@@ -97,6 +99,7 @@
 		cpu2: PowerPC,e5500@2 {
 			device_type = "cpu";
 			reg = <2>;
+			clocks = <&mux2>;
 			next-level-cache = <&L2_2>;
 			L2_2: l2-cache {
 				next-level-cache = <&cpc>;
@@ -105,6 +108,7 @@
 		cpu3: PowerPC,e5500@3 {
 			device_type = "cpu";
 			reg = <3>;
+			clocks = <&mux3>;
 			next-level-cache = <&L2_3>;
 			L2_3: l2-cache {
 				next-level-cache = <&cpc>;
-- 
1.8.0

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

* RE: [PATCH v3] clk: add PowerPC corenet clock driver support
  2013-04-09  8:46 [PATCH v3] clk: add PowerPC corenet clock driver support Yuantian.Tang
  2013-04-09  8:46 ` [PATCH] powerpc/mpc85xx: Update the clock device tree nodes Yuantian.Tang
@ 2013-04-16  6:59 ` Tang Yuantian-B29983
  2013-04-16 22:27   ` Mike Turquette
  2013-05-13 19:25 ` Mike Turquette
  2 siblings, 1 reply; 6+ messages in thread
From: Tang Yuantian-B29983 @ 2013-04-16  6:59 UTC (permalink / raw)
  To: Tang Yuantian-B29983, mturquette@linaro.org
  Cc: ulf.hansson@linaro.org, Li Yang-R58472, linux-doc@vger.kernel.org,
	viresh.kumar@linaro.org, devicetree-discuss@lists.ozlabs.org,
	linux-kernel@vger.kernel.org, shawn.guo@linaro.org,
	linuxppc-dev@lists.ozlabs.org, linus.walleij@linaro.org

SGkgTWlrZSwNCg0KSSByZWFsbHkgYXBwcmVjaWF0ZSBpZiB5b3UgY2FuIHNwZW5kIHNvbWUgdGlt
ZXMgdG8gcmV2aWV3IHRoaXMgcGF0Y2guDQoNClRoYW5rcywNCll1YW50aWFuDQoNCg0KPiAtLS0t
LU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBUYW5nIFl1YW50aWFuLUIyOTk4Mw0KPiBT
ZW50OiAyMDEzxOo01MI5yNUgMTY6NDYNCj4gVG86IG10dXJxdWV0dGVAbGluYXJvLm9yZw0KPiBD
YzogbGludXMud2FsbGVpakBsaW5hcm8ub3JnOyB2aXJlc2gua3VtYXJAbGluYXJvLm9yZzsNCj4g
c2hhd24uZ3VvQGxpbmFyby5vcmc7IHVsZi5oYW5zc29uQGxpbmFyby5vcmc7IGxpbnV4LQ0KPiBr
ZXJuZWxAdmdlci5rZXJuZWwub3JnOyBkZXZpY2V0cmVlLWRpc2N1c3NAbGlzdHMub3psYWJzLm9y
ZzsgbGludXhwcGMtDQo+IGRldkBsaXN0cy5vemxhYnMub3JnOyBsaW51eC1kb2NAdmdlci5rZXJu
ZWwub3JnOyBUYW5nIFl1YW50aWFuLUIyOTk4MzsNCj4gVGFuZyBZdWFudGlhbi1CMjk5ODM7IExp
IFlhbmctUjU4NDcyDQo+IFN1YmplY3Q6IFtQQVRDSCB2M10gY2xrOiBhZGQgUG93ZXJQQyBjb3Jl
bmV0IGNsb2NrIGRyaXZlciBzdXBwb3J0DQo+IA0KPiBGcm9tOiBUYW5nIFl1YW50aWFuIDx5dWFu
dGlhbi50YW5nQGZyZWVzY2FsZS5jb20+DQo+IA0KPiBUaGlzIGFkZHMgdGhlIGNsb2NrIGRyaXZl
ciBmb3IgRnJlZXNjYWxlIFBvd2VyUEMgY29yZW5ldCBzZXJpZXMgU29Dcw0KPiB1c2luZyBjb21t
b24gY2xvY2sgaW5mcmFzdHJ1Y3R1cmUuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBUYW5nIFl1YW50
aWFuIDxZdWFudGlhbi5UYW5nQGZyZWVzY2FsZS5jb20+DQo+IFNpZ25lZC1vZmYtYnk6IExpIFlh
bmcgPGxlb2xpQGZyZWVzY2FsZS5jb20+DQo+IC0tLQ0KPiB2MzoNCj4gCS0gcmVtb3ZlIHRoZSBt
b2R1bGUgYXV0aG9yIGFuZCBkZXNjcmlwdGlvbg0KPiB2MjoNCj4gCS0gYWRkIHRoZSBkb2N1bWVu
dCBmb3IgZGV2aWNlIHRyZWUgY2xvY2sgYmluZGluZ3MNCj4gDQo+ICBhcmNoL3Bvd2VycGMvcGxh
dGZvcm1zL0tjb25maWcuY3B1dHlwZSB8ICAgMSArDQo+ICBkcml2ZXJzL2Nsay9LY29uZmlnICAg
ICAgICAgICAgICAgICAgICB8ICAgNyArDQo+ICBkcml2ZXJzL2Nsay9NYWtlZmlsZSAgICAgICAg
ICAgICAgICAgICB8ICAgMSArDQo+ICBkcml2ZXJzL2Nsay9jbGstcHBjLWNvcmVuZXQuYyAgICAg
ICAgICB8IDI4MA0KPiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4gIDQgZmls
ZXMgY2hhbmdlZCwgMjg5IGluc2VydGlvbnMoKykNCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2
ZXJzL2Nsay9jbGstcHBjLWNvcmVuZXQuYw0KPiANCj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJw
Yy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlDQo+IGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9L
Y29uZmlnLmNwdXR5cGUNCj4gaW5kZXggMThlM2I3Ni4uY2YwNjViOCAxMDA2NDQNCj4gLS0tIGEv
YXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUNCj4gKysrIGIvYXJjaC9wb3dl
cnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUNCj4gQEAgLTE1OCw2ICsxNTgsNyBAQCBjb25m
aWcgRTUwMA0KPiAgY29uZmlnIFBQQ19FNTAwTUMNCj4gIAlib29sICJlNTAwbWMgU3VwcG9ydCIN
Cj4gIAlzZWxlY3QgUFBDX0ZQVQ0KPiArCXNlbGVjdCBDT01NT05fQ0xLDQo+ICAJZGVwZW5kcyBv
biBFNTAwDQo+ICAJaGVscA0KPiAgCSAgVGhpcyBtdXN0IGJlIGVuYWJsZWQgZm9yIHJ1bm5pbmcg
b24gZTUwMG1jIChhbmQgZGVyaXZhdGl2ZXMgZGlmZg0KPiAtLWdpdCBhL2RyaXZlcnMvY2xrL0tj
b25maWcgYi9kcml2ZXJzL2Nsay9LY29uZmlnIGluZGV4IGE0N2U2ZWUuLjZlMmZkOWMNCj4gMTAw
NjQ0DQo+IC0tLSBhL2RyaXZlcnMvY2xrL0tjb25maWcNCj4gKysrIGIvZHJpdmVycy9jbGsvS2Nv
bmZpZw0KPiBAQCAtNjMsNiArNjMsMTMgQEAgY29uZmlnIENMS19UV0w2MDQwDQo+ICAJICBNY1BE
TS4gTWNQRE0gbW9kdWxlIGlzIHVzaW5nIHRoZSBleHRlcm5hbCBiaXQgY2xvY2sgb24gdGhlIE1j
UERNDQo+IGJ1cw0KPiAgCSAgYXMgZnVuY3Rpb25hbCBjbG9jay4NCj4gDQo+ICtjb25maWcgQ0xL
X1BQQ19DT1JFTkVUDQo+ICsJYm9vbCAiQ2xvY2sgZHJpdmVyIGZvciBQb3dlclBDIGNvcmVuZXQg
cGxhdGZvcm1zIg0KPiArCWRlcGVuZHMgb24gUFBDX0U1MDBNQyAmJiBPRg0KPiArCS0tLWhlbHAt
LS0NCj4gKwkgIFRoaXMgYWRkcyB0aGUgY2xvY2sgZHJpdmVyIHN1cHBvcnQgZm9yIEZyZWVzY2Fs
ZSBQb3dlclBDIGNvcmVuZXQNCj4gKwkgIHBsYXRmb3JtcyB1c2luZyBjb21tb24gY2xvY2sgZnJh
bWV3b3JrLg0KPiArDQo+ICBlbmRtZW51DQo+IA0KPiAgc291cmNlICJkcml2ZXJzL2Nsay9tdmVi
dS9LY29uZmlnIg0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvTWFrZWZpbGUgYi9kcml2ZXJz
L2Nsay9NYWtlZmlsZSBpbmRleA0KPiAzMDBkNDc3Li42NzIwMzE5IDEwMDY0NA0KPiAtLS0gYS9k
cml2ZXJzL2Nsay9NYWtlZmlsZQ0KPiArKysgYi9kcml2ZXJzL2Nsay9NYWtlZmlsZQ0KPiBAQCAt
MzQsMyArMzQsNCBAQCBvYmotJChDT05GSUdfWDg2KQkJKz0geDg2Lw0KPiAgb2JqLSQoQ09ORklH
X0NPTU1PTl9DTEtfV004MzFYKSArPSBjbGstd204MzF4Lm8NCj4gIG9iai0kKENPTkZJR19DT01N
T05fQ0xLX01BWDc3Njg2KSArPSBjbGstbWF4Nzc2ODYubw0KPiAgb2JqLSQoQ09ORklHX0NMS19U
V0w2MDQwKQkrPSBjbGstdHdsNjA0MC5vDQo+ICtvYmotJChDT05GSUdfQ0xLX1BQQ19DT1JFTkVU
KQkrPSBjbGstcHBjLWNvcmVuZXQubw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXBw
Yy1jb3JlbmV0LmMgYi9kcml2ZXJzL2Nsay9jbGstcHBjLQ0KPiBjb3JlbmV0LmMgbmV3IGZpbGUg
bW9kZSAxMDA2NDQgaW5kZXggMDAwMDAwMC4uYTJkNDgzZg0KPiAtLS0gL2Rldi9udWxsDQo+ICsr
KyBiL2RyaXZlcnMvY2xrL2Nsay1wcGMtY29yZW5ldC5jDQo+IEBAIC0wLDAgKzEsMjgwIEBADQo+
ICsvKg0KPiArICogQ29weXJpZ2h0IDIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4N
Cj4gKyAqDQo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCj4gKyAqIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KPiArICoNCj4gKyAqIGNsb2NrIGRy
aXZlciBmb3IgRnJlZXNjYWxlIFBvd2VyUEMgY29yZW5ldCBTb0NzLg0KPiArICovDQo+ICsjaW5j
bHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+DQo+ICsjaW5jbHVkZSA8bGludXgvaW8uaD4NCj4g
KyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4N
Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L29m
Lmg+DQo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KPiArDQo+ICtzdHJ1Y3QgY211eF9jbGsg
ew0KPiArCXN0cnVjdCBjbGtfaHcgaHc7DQo+ICsJdm9pZCBfX2lvbWVtICpyZWc7DQo+ICsJdTMy
IGZsYWdzOw0KPiArfTsNCj4gKw0KPiArI2RlZmluZSBQTExfS0lMTAkJCUJJVCgzMSkNCj4gKyNk
ZWZpbmUJQ0xLU0VMX1NISUZUCQkyNw0KPiArI2RlZmluZSBDTEtTRUxfQURKVVNUCQlCSVQoMCkN
Cj4gKyNkZWZpbmUgdG9fY211eF9jbGsocCkJCWNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgY211eF9j
bGssIGh3KQ0KPiArDQo+ICtzdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlOw0KPiArc3RhdGljIHVu
c2lnbmVkIGludCBjbG9ja3NfcGVyX3BsbDsNCj4gKw0KPiArc3RhdGljIGludCBjbXV4X3NldF9w
YXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGlkeCkgew0KPiArCXN0cnVjdCBjbXV4X2NsayAq
Y2xrID0gdG9fY211eF9jbGsoaHcpOw0KPiArCXUzMiBjbGtzZWw7DQo+ICsNCj4gKwljbGtzZWwg
PSAoKGlkeCAvIGNsb2Nrc19wZXJfcGxsKSA8PCAyKSArIGlkeCAlIGNsb2Nrc19wZXJfcGxsOw0K
PiArCWlmIChjbGstPmZsYWdzICYgQ0xLU0VMX0FESlVTVCkNCj4gKwkJY2xrc2VsICs9IDg7DQo+
ICsJY2xrc2VsID0gKGNsa3NlbCAmIDB4ZikgPDwgQ0xLU0VMX1NISUZUOw0KPiArCWlvd3JpdGUz
MmJlKGNsa3NlbCwgY2xrLT5yZWcpOw0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4g
K3N0YXRpYyB1OCBjbXV4X2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpIHsNCj4gKwlzdHJ1
Y3QgY211eF9jbGsgKmNsayA9IHRvX2NtdXhfY2xrKGh3KTsNCj4gKwl1MzIgY2xrc2VsOw0KPiAr
DQo+ICsJY2xrc2VsID0gaW9yZWFkMzJiZShjbGstPnJlZyk7DQo+ICsJY2xrc2VsID0gKGNsa3Nl
bCA+PiBDTEtTRUxfU0hJRlQpICYgMHhmOw0KPiArCWlmIChjbGstPmZsYWdzICYgQ0xLU0VMX0FE
SlVTVCkNCj4gKwkJY2xrc2VsIC09IDg7DQo+ICsJY2xrc2VsID0gKGNsa3NlbCA+PiAyKSAqIGNs
b2Nrc19wZXJfcGxsICsgY2xrc2VsICUgNDsNCj4gKw0KPiArCXJldHVybiBjbGtzZWw7DQo+ICt9
DQo+ICsNCj4gK2NvbnN0IHN0cnVjdCBjbGtfb3BzIGNtdXhfb3BzID0gew0KPiArCS5nZXRfcGFy
ZW50ID0gY211eF9nZXRfcGFyZW50LA0KPiArCS5zZXRfcGFyZW50ID0gY211eF9zZXRfcGFyZW50
LA0KPiArfTsNCj4gKw0KPiArc3RhdGljIHZvaWQgX19pbml0IGNvcmVfbXV4X2luaXQoc3RydWN0
IGRldmljZV9ub2RlICpucCkgew0KPiArCXN0cnVjdCBjbGsgKmNsazsNCj4gKwlzdHJ1Y3QgY2xr
X2luaXRfZGF0YSBpbml0Ow0KPiArCXN0cnVjdCBjbXV4X2NsayAqY211eF9jbGs7DQo+ICsJc3Ry
dWN0IGRldmljZV9ub2RlICpub2RlOw0KPiArCWludCByYywgY291bnQsIGk7DQo+ICsJdTMyCW9m
ZnNldDsNCj4gKwljb25zdCBjaGFyICpjbGtfbmFtZTsNCj4gKwljb25zdCBjaGFyICoqcGFyZW50
X25hbWVzOw0KPiArDQo+ICsJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIsICZv
ZmZzZXQpOw0KPiArCWlmIChyYykgew0KPiArCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHJl
ZyBwcm9wZXJ0eVxuIiwgbnAtPm5hbWUpOw0KPiArCQlyZXR1cm47DQo+ICsJfQ0KPiArDQo+ICsJ
LyogZ2V0IHRoZSBpbnB1dCBjbG9jayBzb3VyY2UgY291bnQgKi8NCj4gKwljb3VudCA9IG9mX3By
b3BlcnR5X2NvdW50X3N0cmluZ3MobnAsICJjbG9jay1uYW1lcyIpOw0KPiArCWlmIChjb3VudCA8
IDApIHsNCj4gKwkJcHJfZXJyKCIlczogZ2V0IGNsb2NrIGNvdW50IGVycm9yXG4iLCBucC0+bmFt
ZSk7DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsJcGFyZW50X25hbWVzID0ga3phbGxvYygoc2l6
ZW9mKGNoYXIgKikgKiBjb3VudCksIEdGUF9LRVJORUwpOw0KPiArCWlmICghcGFyZW50X25hbWVz
KSB7DQo+ICsJCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBwYXJlbnRfbmFtZXNcbiIs
IF9fZnVuY19fKTsNCj4gKwkJcmV0dXJuOw0KPiArCX0NCj4gKw0KPiArCWZvciAoaSA9IDA7IGkg
PCBjb3VudDsgaSsrKQ0KPiArCQlwYXJlbnRfbmFtZXNbaV0gPSBvZl9jbGtfZ2V0X3BhcmVudF9u
YW1lKG5wLCBpKTsNCj4gKw0KPiArCWNtdXhfY2xrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNt
dXhfY2xrKSwgR0ZQX0tFUk5FTCk7DQo+ICsJaWYgKCFjbXV4X2Nsaykgew0KPiArCQlwcl9lcnIo
IiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgY211eF9jbGtcbiIsIF9fZnVuY19fKTsNCj4gKwkJZ290
byBlcnJfbmFtZTsNCj4gKwl9DQo+ICsJY211eF9jbGstPnJlZyA9IGJhc2UgKyBvZmZzZXQ7DQo+
ICsNCj4gKwlub2RlID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxw
NDA4MC1jbG9ja2dlbiIpOw0KPiArCWlmIChub2RlICYmIChvZmZzZXQgPj0gMHg4MCkpDQo+ICsJ
CWNtdXhfY2xrLT5mbGFncyA9IENMS1NFTF9BREpVU1Q7DQo+ICsNCj4gKwlyYyA9IG9mX3Byb3Bl
cnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwNCj4gKwkJCTAs
ICZjbGtfbmFtZSk7DQo+ICsJaWYgKHJjKSB7DQo+ICsJCXByX2VycigiJXM6IHJlYWQgY2xvY2sg
bmFtZXMgZXJyb3JcbiIsIG5wLT5uYW1lKTsNCj4gKwkJZ290byBlcnJfY2xrOw0KPiArCX0NCj4g
Kw0KPiArCWluaXQubmFtZSA9IGNsa19uYW1lOw0KPiArCWluaXQub3BzID0gJmNtdXhfb3BzOw0K
PiArCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWVzOw0KPiArCWluaXQubnVtX3BhcmVu
dHMgPSBjb3VudDsNCj4gKwlpbml0LmZsYWdzID0gMDsNCj4gKwljbXV4X2Nsay0+aHcuaW5pdCA9
ICZpbml0Ow0KPiArDQo+ICsJY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZjbXV4X2Nsay0+aHcp
Ow0KPiArCWlmIChJU19FUlIoY2xrKSkgew0KPiArCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgcmVn
aXN0ZXIgY2xvY2tcbiIsIGNsa19uYW1lKTsNCj4gKwkJZ290byBlcnJfY2xrOw0KPiArCX0NCj4g
Kw0KPiArCXJjID0gb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0
LCBjbGspOw0KPiArCWlmIChyYykgew0KPiArCQlwcl9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciBj
bG9jayBwcm92aWRlciBmb3Igbm9kZTolc1xuIiwNCj4gKwkJCSBucC0+bmFtZSk7DQo+ICsJCWdv
dG8gZXJyX2NsazsNCj4gKwl9DQo+ICsJZ290byBlcnJfbmFtZTsNCj4gKw0KPiArZXJyX2NsazoN
Cj4gKwlrZnJlZShjbXV4X2Nsayk7DQo+ICtlcnJfbmFtZToNCj4gKwkvKiBmcmVlICpfbmFtZXMg
YmVjYXVzZSB0aGV5IGFyZSByZWFsbG9jYXRlZCB3aGVuIHJlZ2lzdGVyZWQgKi8NCj4gKwlrZnJl
ZShwYXJlbnRfbmFtZXMpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgY29yZV9w
bGxfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKSB7DQo+ICsJdTMyIG9mZnNldCwgbXVsdDsN
Cj4gKwlpbnQgaSwgcmMsIGNvdW50Ow0KPiArCWNvbnN0IGNoYXIgKmNsa19uYW1lLCAqcGFyZW50
X25hbWU7DQo+ICsJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKm9uZWNlbGxfZGF0YTsNCj4gKwlz
dHJ1Y3QgY2xrICAgICAgKipzdWJjbGtzOw0KPiArDQo+ICsJcmMgPSBvZl9wcm9wZXJ0eV9yZWFk
X3UzMihucCwgInJlZyIsICZvZmZzZXQpOw0KPiArCWlmIChyYykgew0KPiArCQlwcl9lcnIoIiVz
OiBjb3VsZCBub3QgZ2V0IHJlZyBwcm9wZXJ0eVxuIiwgbnAtPm5hbWUpOw0KPiArCQlyZXR1cm47
DQo+ICsJfQ0KPiArDQo+ICsJLyogZ2V0IHRoZSBtdWx0aXBsZSBvZiBQTEwgKi8NCj4gKwltdWx0
ID0gaW9yZWFkMzJiZShiYXNlICsgb2Zmc2V0KTsNCj4gKw0KPiArCS8qIGNoZWNrIGlmIHRoaXMg
UExMIGlzIGRpc2FibGVkICovDQo+ICsJaWYgKG11bHQgJiBQTExfS0lMTCkgew0KPiArCQlwcl9k
ZWJ1ZygiUExMOiVzIGlzIGRpc2FibGVkXG4iLCBucC0+bmFtZSk7DQo+ICsJCXJldHVybjsNCj4g
Kwl9DQo+ICsJbXVsdCA9IChtdWx0ID4+IDEpICYgMHgzZjsNCj4gKw0KPiArCXBhcmVudF9uYW1l
ID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7DQo+ICsJaWYgKCFwYXJlbnRfbmFtZSkg
ew0KPiArCQlwcl9lcnIoIlBMTDogJXMgbXVzdCBoYXZlIGEgcGFyZW50XG4iLCBucC0+bmFtZSk7
DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsNCj4gKwljb3VudCA9IG9mX3Byb3BlcnR5X2NvdW50
X3N0cmluZ3MobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiKTsNCj4gKwlpZiAoY291bnQgPCAwIHx8
IGNvdW50ID4gNCkgew0KPiArCQlwcl9lcnIoIiVzOiBjbG9jayBpcyBub3Qgc3VwcG9ydGVkXG4i
LCBucC0+bmFtZSk7DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsNCj4gKwkvKiBvdXRwdXQgY2xv
Y2sgbnVtYmVyIHBlciBQTEwgKi8NCj4gKwljbG9ja3NfcGVyX3BsbCA9IGNvdW50Ow0KPiArDQo+
ICsJc3ViY2xrcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGsgKikgKiBjb3VudCwgR0ZQX0tF
Uk5FTCk7DQo+ICsJaWYgKCFzdWJjbGtzKSB7DQo+ICsJCXByX2VycigiJXM6IGNvdWxkIG5vdCBh
bGxvY2F0ZSBzdWJjbGtzXG4iLCBfX2Z1bmNfXyk7DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsN
Cj4gKwlvbmVjZWxsX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0
YSksIEdGUF9LRVJORUwpOw0KPiArCWlmICghb25lY2VsbF9kYXRhKSB7DQo+ICsJCXByX2Vycigi
JXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBvbmVjZWxsX2RhdGFcbiIsIF9fZnVuY19fKTsNCj4gKwkJ
Z290byBlcnJfY2xrczsNCj4gKwl9DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkr
Kykgew0KPiArCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2st
b3V0cHV0LW5hbWVzIiwNCj4gKwkJCQlpLCAmY2xrX25hbWUpOw0KPiArCQlpZiAocmMpIHsNCj4g
KwkJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2xvY2sgbmFtZXNcbiIsIG5wLT5uYW1lKTsN
Cj4gKwkJCWdvdG8gZXJyX2NlbGw7DQo+ICsJCX0NCj4gKw0KPiArCQkvKg0KPiArCQkgKiB3aGVu
IGNvdW50ID09IDQsIHRoZXJlIGFyZSA0IG91dHB1dCBjbG9ja3M6DQo+ICsJCSAqIC8xLCAvMiwg
LzMsIC80IHJlc3BlY3RpdmVseQ0KPiArCQkgKiB3aGVuIGNvdW50IDwgNCwgdGhlcmUgYXJlIGF0
IGxlYXN0IDIgb3V0cHV0IGNsb2NrczoNCj4gKwkJICogLzEsIC8yLCAoLzQsIGlmIGNvdW50ID09
IDMpIHJlc3BlY3RpdmVseS4NCj4gKwkJICovDQo+ICsJCWlmIChjb3VudCA9PSA0KQ0KPiArCQkJ
c3ViY2xrc1tpXSA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgY2xrX25hbWUsDQo+
ICsJCQkJCXBhcmVudF9uYW1lLCAwLCBtdWx0LCAxICsgaSk7DQo+ICsJCWVsc2UNCj4gKw0KPiAr
CQkJc3ViY2xrc1tpXSA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgY2xrX25hbWUs
DQo+ICsJCQkJCXBhcmVudF9uYW1lLCAwLCBtdWx0LCAxIDw8IGkpOw0KPiArDQo+ICsJCWlmIChJ
U19FUlIoc3ViY2xrc1tpXSkpIHsNCj4gKwkJCXByX2VycigiJXM6IGNvdWxkIG5vdCByZWdpc3Rl
ciBjbG9ja1xuIiwgY2xrX25hbWUpOw0KPiArCQkJZ290byBlcnJfY2VsbDsNCj4gKwkJfQ0KPiAr
CX0NCj4gKw0KPiArCW9uZWNlbGxfZGF0YS0+Y2xrcyA9IHN1YmNsa3M7DQo+ICsJb25lY2VsbF9k
YXRhLT5jbGtfbnVtID0gY291bnQ7DQo+ICsNCj4gKwlyYyA9IG9mX2Nsa19hZGRfcHJvdmlkZXIo
bnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIG9uZWNlbGxfZGF0YSk7DQo+ICsJaWYgKHJjKSB7
DQo+ICsJCXByX2VycigiQ291bGQgbm90IHJlZ2lzdGVyIGNsayBwcm92aWRlciBmb3Igbm9kZTol
c1xuIiwNCj4gKwkJCSBucC0+bmFtZSk7DQo+ICsJCWdvdG8gZXJyX2NlbGw7DQo+ICsJfQ0KPiAr
DQo+ICsJcmV0dXJuOw0KPiArZXJyX2NlbGw6DQo+ICsJa2ZyZWUob25lY2VsbF9kYXRhKTsNCj4g
K2Vycl9jbGtzOg0KPiArCWtmcmVlKHN1YmNsa3MpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgY29u
c3Qgc3RydWN0IG9mX2RldmljZV9pZCBjbGtfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsNCj4gKwl7
IC5jb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIiwgLmRhdGEgPSBvZl9maXhlZF9jbGtfc2V0dXAs
IH0sDQo+ICsJeyAuY29tcGF0aWJsZSA9ICJmc2wsY29yZS1wbGwtY2xvY2siLCAuZGF0YSA9IGNv
cmVfcGxsX2luaXQsIH0sDQo+ICsJeyAuY29tcGF0aWJsZSA9ICJmc2wsY29yZS1tdXgtY2xvY2si
LCAuZGF0YSA9IGNvcmVfbXV4X2luaXQsIH0sDQo+ICsJe30NCj4gK307DQo+ICsNCj4gK3N0YXRp
YyBpbnQgX19pbml0IHBwY19jb3JlbmV0X2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl
ICpwZGV2KSB7DQo+ICsJc3RydWN0IGRldmljZV9ub2RlICpucDsNCj4gKw0KPiArCW5wID0gcGRl
di0+ZGV2Lm9mX25vZGU7DQo+ICsJYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsNCj4gKwlpZiAoIWJh
c2UpIHsNCj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9tYXAgZXJyb3JcbiIpOw0KPiArCQly
ZXR1cm4gLUVOT01FTTsNCj4gKwl9DQo+ICsJb2ZfY2xrX2luaXQoY2xrX21hdGNoKTsNCj4gKw0K
PiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rldmlj
ZV9pZCBwcGNfY2xrX2lkc1tdIF9faW5pdGNvbnN0ID0gew0KPiArCXsgLmNvbXBhdGlibGUgPSAi
ZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCIsIH0sDQo+ICsJeyAuY29tcGF0aWJsZSA9ICJmc2wscW9y
aXEtY2xvY2tnZW4tMiIsIH0sDQo+ICsJe30NCj4gK307DQo+ICsNCj4gK3N0YXRpYyBzdHJ1Y3Qg
cGxhdGZvcm1fZHJpdmVyIHBwY19jb3JlbmV0X2Nsa19kcml2ZXIgPSB7DQo+ICsJLmRyaXZlciA9
IHsNCj4gKwkJLm5hbWUgPSAicHBjX2NvcmVuZXRfY2xvY2siLA0KPiArCQkub3duZXIgPSBUSElT
X01PRFVMRSwNCj4gKwkJLm9mX21hdGNoX3RhYmxlID0gcHBjX2Nsa19pZHMsDQo+ICsJfSwNCj4g
KwkucHJvYmUgPSBwcGNfY29yZW5ldF9jbGtfcHJvYmUsDQo+ICt9Ow0KPiArDQo+ICtzdGF0aWMg
aW50IF9faW5pdCBwcGNfY29yZW5ldF9jbGtfaW5pdCh2b2lkKSB7DQo+ICsJcmV0dXJuIHBsYXRm
b3JtX2RyaXZlcl9yZWdpc3RlcigmcHBjX2NvcmVuZXRfY2xrX2RyaXZlcik7DQo+ICt9DQo+ICtz
dWJzeXNfaW5pdGNhbGwocHBjX2NvcmVuZXRfY2xrX2luaXQpOw0KPiAtLQ0KPiAxLjguMA0KDQo=

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

* Re: RE: [PATCH v3] clk: add PowerPC corenet clock driver support
  2013-04-16  6:59 ` [PATCH v3] clk: add PowerPC corenet clock driver support Tang Yuantian-B29983
@ 2013-04-16 22:27   ` Mike Turquette
  2013-04-17  2:12     ` Tang Yuantian-B29983
  0 siblings, 1 reply; 6+ messages in thread
From: Mike Turquette @ 2013-04-16 22:27 UTC (permalink / raw)
  To: Tang Yuantian-B29983, Tang Yuantian-B29983
  Cc: ulf.hansson@linaro.org, Li Yang-R58472, linux-doc@vger.kernel.org,
	viresh.kumar@linaro.org, devicetree-discuss@lists.ozlabs.org,
	linux-kernel@vger.kernel.org, shawn.guo@linaro.org,
	linuxppc-dev@lists.ozlabs.org, linus.walleij@linaro.org

Quoting Tang Yuantian-B29983 (2013-04-15 23:59:34)
> Hi Mike,
> =

> I really appreciate if you can spend some times to review this patch.
> =


Yauntian,

Thanks for submitting this patch.  I have frozen the changes I plan to
submit for 3.10, with the exception of any last-minute fixes.  I'll take
a closer look at this after the merge window.

Regards,
Mike

> Thanks,
> Yuantian
> =

> =

> > -----Original Message-----
> > From: Tang Yuantian-B29983
> > Sent: 2013=E5=B9=B44=E6=9C=889=E6=97=A5 16:46
> > To: mturquette@linaro.org
> > Cc: linus.walleij@linaro.org; viresh.kumar@linaro.org;
> > shawn.guo@linaro.org; ulf.hansson@linaro.org; linux-
> > kernel@vger.kernel.org; devicetree-discuss@lists.ozlabs.org; linuxppc-
> > dev@lists.ozlabs.org; linux-doc@vger.kernel.org; Tang Yuantian-B29983;
> > Tang Yuantian-B29983; Li Yang-R58472
> > Subject: [PATCH v3] clk: add PowerPC corenet clock driver support
> > =

> > From: Tang Yuantian <yuantian.tang@freescale.com>
> > =

> > This adds the clock driver for Freescale PowerPC corenet series SoCs
> > using common clock infrastructure.
> > =

> > Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com>
> > Signed-off-by: Li Yang <leoli@freescale.com>
> > ---
> > v3:
> >       - remove the module author and description
> > v2:
> >       - add the document for device tree clock bindings
> > =

> >  arch/powerpc/platforms/Kconfig.cputype |   1 +
> >  drivers/clk/Kconfig                    |   7 +
> >  drivers/clk/Makefile                   |   1 +
> >  drivers/clk/clk-ppc-corenet.c          | 280
> > +++++++++++++++++++++++++++++++++
> >  4 files changed, 289 insertions(+)
> >  create mode 100644 drivers/clk/clk-ppc-corenet.c
> > =

> > diff --git a/arch/powerpc/platforms/Kconfig.cputype
> > b/arch/powerpc/platforms/Kconfig.cputype
> > index 18e3b76..cf065b8 100644
> > --- a/arch/powerpc/platforms/Kconfig.cputype
> > +++ b/arch/powerpc/platforms/Kconfig.cputype
> > @@ -158,6 +158,7 @@ config E500
> >  config PPC_E500MC
> >       bool "e500mc Support"
> >       select PPC_FPU
> > +     select COMMON_CLK
> >       depends on E500
> >       help
> >         This must be enabled for running on e500mc (and derivatives diff
> > --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index a47e6ee..6e2fd9c
> > 100644
> > --- a/drivers/clk/Kconfig
> > +++ b/drivers/clk/Kconfig
> > @@ -63,6 +63,13 @@ config CLK_TWL6040
> >         McPDM. McPDM module is using the external bit clock on the McPDM
> > bus
> >         as functional clock.
> > =

> > +config CLK_PPC_CORENET
> > +     bool "Clock driver for PowerPC corenet platforms"
> > +     depends on PPC_E500MC && OF
> > +     ---help---
> > +       This adds the clock driver support for Freescale PowerPC corenet
> > +       platforms using common clock framework.
> > +
> >  endmenu
> > =

> >  source "drivers/clk/mvebu/Kconfig"
> > diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index
> > 300d477..6720319 100644
> > --- a/drivers/clk/Makefile
> > +++ b/drivers/clk/Makefile
> > @@ -34,3 +34,4 @@ obj-$(CONFIG_X86)           +=3D x86/
> >  obj-$(CONFIG_COMMON_CLK_WM831X) +=3D clk-wm831x.o
> >  obj-$(CONFIG_COMMON_CLK_MAX77686) +=3D clk-max77686.o
> >  obj-$(CONFIG_CLK_TWL6040)    +=3D clk-twl6040.o
> > +obj-$(CONFIG_CLK_PPC_CORENET)        +=3D clk-ppc-corenet.o
> > diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-
> > corenet.c new file mode 100644 index 0000000..a2d483f
> > --- /dev/null
> > +++ b/drivers/clk/clk-ppc-corenet.c
> > @@ -0,0 +1,280 @@
> > +/*
> > + * Copyright 2013 Freescale Semiconductor, Inc.
> > + *
> > + * 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.
> > + *
> > + * clock driver for Freescale PowerPC corenet SoCs.
> > + */
> > +#include <linux/clk-provider.h>
> > +#include <linux/io.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/of_platform.h>
> > +#include <linux/of.h>
> > +#include <linux/slab.h>
> > +
> > +struct cmux_clk {
> > +     struct clk_hw hw;
> > +     void __iomem *reg;
> > +     u32 flags;
> > +};
> > +
> > +#define PLL_KILL                     BIT(31)
> > +#define      CLKSEL_SHIFT            27
> > +#define CLKSEL_ADJUST                BIT(0)
> > +#define to_cmux_clk(p)               container_of(p, struct cmux_clk, =
hw)
> > +
> > +static void __iomem *base;
> > +static unsigned int clocks_per_pll;
> > +
> > +static int cmux_set_parent(struct clk_hw *hw, u8 idx) {
> > +     struct cmux_clk *clk =3D to_cmux_clk(hw);
> > +     u32 clksel;
> > +
> > +     clksel =3D ((idx / clocks_per_pll) << 2) + idx % clocks_per_pll;
> > +     if (clk->flags & CLKSEL_ADJUST)
> > +             clksel +=3D 8;
> > +     clksel =3D (clksel & 0xf) << CLKSEL_SHIFT;
> > +     iowrite32be(clksel, clk->reg);
> > +
> > +     return 0;
> > +}
> > +
> > +static u8 cmux_get_parent(struct clk_hw *hw) {
> > +     struct cmux_clk *clk =3D to_cmux_clk(hw);
> > +     u32 clksel;
> > +
> > +     clksel =3D ioread32be(clk->reg);
> > +     clksel =3D (clksel >> CLKSEL_SHIFT) & 0xf;
> > +     if (clk->flags & CLKSEL_ADJUST)
> > +             clksel -=3D 8;
> > +     clksel =3D (clksel >> 2) * clocks_per_pll + clksel % 4;
> > +
> > +     return clksel;
> > +}
> > +
> > +const struct clk_ops cmux_ops =3D {
> > +     .get_parent =3D cmux_get_parent,
> > +     .set_parent =3D cmux_set_parent,
> > +};
> > +
> > +static void __init core_mux_init(struct device_node *np) {
> > +     struct clk *clk;
> > +     struct clk_init_data init;
> > +     struct cmux_clk *cmux_clk;
> > +     struct device_node *node;
> > +     int rc, count, i;
> > +     u32     offset;
> > +     const char *clk_name;
> > +     const char **parent_names;
> > +
> > +     rc =3D of_property_read_u32(np, "reg", &offset);
> > +     if (rc) {
> > +             pr_err("%s: could not get reg property\n", np->name);
> > +             return;
> > +     }
> > +
> > +     /* get the input clock source count */
> > +     count =3D of_property_count_strings(np, "clock-names");
> > +     if (count < 0) {
> > +             pr_err("%s: get clock count error\n", np->name);
> > +             return;
> > +     }
> > +     parent_names =3D kzalloc((sizeof(char *) * count), GFP_KERNEL);
> > +     if (!parent_names) {
> > +             pr_err("%s: could not allocate parent_names\n", __func__);
> > +             return;
> > +     }
> > +
> > +     for (i =3D 0; i < count; i++)
> > +             parent_names[i] =3D of_clk_get_parent_name(np, i);
> > +
> > +     cmux_clk =3D kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);
> > +     if (!cmux_clk) {
> > +             pr_err("%s: could not allocate cmux_clk\n", __func__);
> > +             goto err_name;
> > +     }
> > +     cmux_clk->reg =3D base + offset;
> > +
> > +     node =3D of_find_compatible_node(NULL, NULL, "fsl,p4080-clockgen"=
);
> > +     if (node && (offset >=3D 0x80))
> > +             cmux_clk->flags =3D CLKSEL_ADJUST;
> > +
> > +     rc =3D of_property_read_string_index(np, "clock-output-names",
> > +                     0, &clk_name);
> > +     if (rc) {
> > +             pr_err("%s: read clock names error\n", np->name);
> > +             goto err_clk;
> > +     }
> > +
> > +     init.name =3D clk_name;
> > +     init.ops =3D &cmux_ops;
> > +     init.parent_names =3D parent_names;
> > +     init.num_parents =3D count;
> > +     init.flags =3D 0;
> > +     cmux_clk->hw.init =3D &init;
> > +
> > +     clk =3D clk_register(NULL, &cmux_clk->hw);
> > +     if (IS_ERR(clk)) {
> > +             pr_err("%s: could not register clock\n", clk_name);
> > +             goto err_clk;
> > +     }
> > +
> > +     rc =3D of_clk_add_provider(np, of_clk_src_simple_get, clk);
> > +     if (rc) {
> > +             pr_err("Could not register clock provider for node:%s\n",
> > +                      np->name);
> > +             goto err_clk;
> > +     }
> > +     goto err_name;
> > +
> > +err_clk:
> > +     kfree(cmux_clk);
> > +err_name:
> > +     /* free *_names because they are reallocated when registered */
> > +     kfree(parent_names);
> > +}
> > +
> > +static void __init core_pll_init(struct device_node *np) {
> > +     u32 offset, mult;
> > +     int i, rc, count;
> > +     const char *clk_name, *parent_name;
> > +     struct clk_onecell_data *onecell_data;
> > +     struct clk      **subclks;
> > +
> > +     rc =3D of_property_read_u32(np, "reg", &offset);
> > +     if (rc) {
> > +             pr_err("%s: could not get reg property\n", np->name);
> > +             return;
> > +     }
> > +
> > +     /* get the multiple of PLL */
> > +     mult =3D ioread32be(base + offset);
> > +
> > +     /* check if this PLL is disabled */
> > +     if (mult & PLL_KILL) {
> > +             pr_debug("PLL:%s is disabled\n", np->name);
> > +             return;
> > +     }
> > +     mult =3D (mult >> 1) & 0x3f;
> > +
> > +     parent_name =3D of_clk_get_parent_name(np, 0);
> > +     if (!parent_name) {
> > +             pr_err("PLL: %s must have a parent\n", np->name);
> > +             return;
> > +     }
> > +
> > +     count =3D of_property_count_strings(np, "clock-output-names");
> > +     if (count < 0 || count > 4) {
> > +             pr_err("%s: clock is not supported\n", np->name);
> > +             return;
> > +     }
> > +
> > +     /* output clock number per PLL */
> > +     clocks_per_pll =3D count;
> > +
> > +     subclks =3D kzalloc(sizeof(struct clk *) * count, GFP_KERNEL);
> > +     if (!subclks) {
> > +             pr_err("%s: could not allocate subclks\n", __func__);
> > +             return;
> > +     }
> > +
> > +     onecell_data =3D kzalloc(sizeof(struct clk_onecell_data), GFP_KER=
NEL);
> > +     if (!onecell_data) {
> > +             pr_err("%s: could not allocate onecell_data\n", __func__);
> > +             goto err_clks;
> > +     }
> > +
> > +     for (i =3D 0; i < count; i++) {
> > +             rc =3D of_property_read_string_index(np, "clock-output-na=
mes",
> > +                             i, &clk_name);
> > +             if (rc) {
> > +                     pr_err("%s: could not get clock names\n", np->nam=
e);
> > +                     goto err_cell;
> > +             }
> > +
> > +             /*
> > +              * when count =3D=3D 4, there are 4 output clocks:
> > +              * /1, /2, /3, /4 respectively
> > +              * when count < 4, there are at least 2 output clocks:
> > +              * /1, /2, (/4, if count =3D=3D 3) respectively.
> > +              */
> > +             if (count =3D=3D 4)
> > +                     subclks[i] =3D clk_register_fixed_factor(NULL, cl=
k_name,
> > +                                     parent_name, 0, mult, 1 + i);
> > +             else
> > +
> > +                     subclks[i] =3D clk_register_fixed_factor(NULL, cl=
k_name,
> > +                                     parent_name, 0, mult, 1 << i);
> > +
> > +             if (IS_ERR(subclks[i])) {
> > +                     pr_err("%s: could not register clock\n", clk_name=
);
> > +                     goto err_cell;
> > +             }
> > +     }
> > +
> > +     onecell_data->clks =3D subclks;
> > +     onecell_data->clk_num =3D count;
> > +
> > +     rc =3D of_clk_add_provider(np, of_clk_src_onecell_get, onecell_da=
ta);
> > +     if (rc) {
> > +             pr_err("Could not register clk provider for node:%s\n",
> > +                      np->name);
> > +             goto err_cell;
> > +     }
> > +
> > +     return;
> > +err_cell:
> > +     kfree(onecell_data);
> > +err_clks:
> > +     kfree(subclks);
> > +}
> > +
> > +static const struct of_device_id clk_match[] __initconst =3D {
> > +     { .compatible =3D "fixed-clock", .data =3D of_fixed_clk_setup, },
> > +     { .compatible =3D "fsl,core-pll-clock", .data =3D core_pll_init, =
},
> > +     { .compatible =3D "fsl,core-mux-clock", .data =3D core_mux_init, =
},
> > +     {}
> > +};
> > +
> > +static int __init ppc_corenet_clk_probe(struct platform_device *pdev) {
> > +     struct device_node *np;
> > +
> > +     np =3D pdev->dev.of_node;
> > +     base =3D of_iomap(np, 0);
> > +     if (!base) {
> > +             dev_err(&pdev->dev, "iomap error\n");
> > +             return -ENOMEM;
> > +     }
> > +     of_clk_init(clk_match);
> > +
> > +     return 0;
> > +}
> > +
> > +static const struct of_device_id ppc_clk_ids[] __initconst =3D {
> > +     { .compatible =3D "fsl,qoriq-clockgen-1.0", },
> > +     { .compatible =3D "fsl,qoriq-clockgen-2", },
> > +     {}
> > +};
> > +
> > +static struct platform_driver ppc_corenet_clk_driver =3D {
> > +     .driver =3D {
> > +             .name =3D "ppc_corenet_clock",
> > +             .owner =3D THIS_MODULE,
> > +             .of_match_table =3D ppc_clk_ids,
> > +     },
> > +     .probe =3D ppc_corenet_clk_probe,
> > +};
> > +
> > +static int __init ppc_corenet_clk_init(void) {
> > +     return platform_driver_register(&ppc_corenet_clk_driver);
> > +}
> > +subsys_initcall(ppc_corenet_clk_init);
> > --
> > 1.8.0

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

* RE: RE: [PATCH v3] clk: add PowerPC corenet clock driver support
  2013-04-16 22:27   ` Mike Turquette
@ 2013-04-17  2:12     ` Tang Yuantian-B29983
  0 siblings, 0 replies; 6+ messages in thread
From: Tang Yuantian-B29983 @ 2013-04-17  2:12 UTC (permalink / raw)
  To: Mike Turquette
  Cc: ulf.hansson@linaro.org, Li Yang-R58472, linux-doc@vger.kernel.org,
	viresh.kumar@linaro.org, devicetree-discuss@lists.ozlabs.org,
	linux-kernel@vger.kernel.org, shawn.guo@linaro.org,
	linuxppc-dev@lists.ozlabs.org, linus.walleij@linaro.org

T0ssIHRoYW5rcy4NCg0KVGhhbmtzLA0KWXVhbnRpYW4NCg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVz
c2FnZS0tLS0tDQo+IEZyb206IE1pa2UgVHVycXVldHRlIFttYWlsdG86bXR1cnF1ZXR0ZUBsaW5h
cm8ub3JnXQ0KPiBTZW50OiAyMDEz5bm0NOaciDE35pelIDY6MjcNCj4gVG86IFRhbmcgWXVhbnRp
YW4tQjI5OTgzOyBUYW5nIFl1YW50aWFuLUIyOTk4Mw0KPiBDYzogbGludXMud2FsbGVpakBsaW5h
cm8ub3JnOyB2aXJlc2gua3VtYXJAbGluYXJvLm9yZzsNCj4gc2hhd24uZ3VvQGxpbmFyby5vcmc7
IHVsZi5oYW5zc29uQGxpbmFyby5vcmc7IGxpbnV4LQ0KPiBrZXJuZWxAdmdlci5rZXJuZWwub3Jn
OyBkZXZpY2V0cmVlLWRpc2N1c3NAbGlzdHMub3psYWJzLm9yZzsgbGludXhwcGMtDQo+IGRldkBs
aXN0cy5vemxhYnMub3JnOyBsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnOyBMaSBZYW5nLVI1ODQ3
Mg0KPiBTdWJqZWN0OiBSZTogUkU6IFtQQVRDSCB2M10gY2xrOiBhZGQgUG93ZXJQQyBjb3JlbmV0
IGNsb2NrIGRyaXZlciBzdXBwb3J0DQo+IA0KPiBRdW90aW5nIFRhbmcgWXVhbnRpYW4tQjI5OTgz
ICgyMDEzLTA0LTE1IDIzOjU5OjM0KQ0KPiA+IEhpIE1pa2UsDQo+ID4NCj4gPiBJIHJlYWxseSBh
cHByZWNpYXRlIGlmIHlvdSBjYW4gc3BlbmQgc29tZSB0aW1lcyB0byByZXZpZXcgdGhpcyBwYXRj
aC4NCj4gPg0KPiANCj4gWWF1bnRpYW4sDQo+IA0KPiBUaGFua3MgZm9yIHN1Ym1pdHRpbmcgdGhp
cyBwYXRjaC4gIEkgaGF2ZSBmcm96ZW4gdGhlIGNoYW5nZXMgSSBwbGFuIHRvDQo+IHN1Ym1pdCBm
b3IgMy4xMCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFueSBsYXN0LW1pbnV0ZSBmaXhlcy4gIEkn
bGwgdGFrZQ0KPiBhIGNsb3NlciBsb29rIGF0IHRoaXMgYWZ0ZXIgdGhlIG1lcmdlIHdpbmRvdy4N
Cj4gDQo+IFJlZ2FyZHMsDQo+IE1pa2UNCj4gDQo+ID4gVGhhbmtzLA0KPiA+IFl1YW50aWFuDQo+
ID4NCj4gPg0KPiA+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gPiA+IEZyb206IFRh
bmcgWXVhbnRpYW4tQjI5OTgzDQo+ID4gPiBTZW50OiAyMDEz5bm0NOaciDnml6UgMTY6NDYNCj4g
PiA+IFRvOiBtdHVycXVldHRlQGxpbmFyby5vcmcNCj4gPiA+IENjOiBsaW51cy53YWxsZWlqQGxp
bmFyby5vcmc7IHZpcmVzaC5rdW1hckBsaW5hcm8ub3JnOw0KPiA+ID4gc2hhd24uZ3VvQGxpbmFy
by5vcmc7IHVsZi5oYW5zc29uQGxpbmFyby5vcmc7IGxpbnV4LQ0KPiA+ID4ga2VybmVsQHZnZXIu
a2VybmVsLm9yZzsgZGV2aWNldHJlZS1kaXNjdXNzQGxpc3RzLm96bGFicy5vcmc7DQo+ID4gPiBs
aW51eHBwYy0gZGV2QGxpc3RzLm96bGFicy5vcmc7IGxpbnV4LWRvY0B2Z2VyLmtlcm5lbC5vcmc7
IFRhbmcNCj4gPiA+IFl1YW50aWFuLUIyOTk4MzsgVGFuZyBZdWFudGlhbi1CMjk5ODM7IExpIFlh
bmctUjU4NDcyDQo+ID4gPiBTdWJqZWN0OiBbUEFUQ0ggdjNdIGNsazogYWRkIFBvd2VyUEMgY29y
ZW5ldCBjbG9jayBkcml2ZXIgc3VwcG9ydA0KPiA+ID4NCj4gPiA+IEZyb206IFRhbmcgWXVhbnRp
YW4gPHl1YW50aWFuLnRhbmdAZnJlZXNjYWxlLmNvbT4NCj4gPiA+DQo+ID4gPiBUaGlzIGFkZHMg
dGhlIGNsb2NrIGRyaXZlciBmb3IgRnJlZXNjYWxlIFBvd2VyUEMgY29yZW5ldCBzZXJpZXMgU29D
cw0KPiA+ID4gdXNpbmcgY29tbW9uIGNsb2NrIGluZnJhc3RydWN0dXJlLg0KPiA+ID4NCj4gPiA+
IFNpZ25lZC1vZmYtYnk6IFRhbmcgWXVhbnRpYW4gPFl1YW50aWFuLlRhbmdAZnJlZXNjYWxlLmNv
bT4NCj4gPiA+IFNpZ25lZC1vZmYtYnk6IExpIFlhbmcgPGxlb2xpQGZyZWVzY2FsZS5jb20+DQo+
ID4gPiAtLS0NCj4gPiA+IHYzOg0KPiA+ID4gICAgICAgLSByZW1vdmUgdGhlIG1vZHVsZSBhdXRo
b3IgYW5kIGRlc2NyaXB0aW9uDQo+ID4gPiB2MjoNCj4gPiA+ICAgICAgIC0gYWRkIHRoZSBkb2N1
bWVudCBmb3IgZGV2aWNlIHRyZWUgY2xvY2sgYmluZGluZ3MNCj4gPiA+DQo+ID4gPiAgYXJjaC9w
b3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgfCAgIDEgKw0KPiA+ID4gIGRyaXZlcnMv
Y2xrL0tjb25maWcgICAgICAgICAgICAgICAgICAgIHwgICA3ICsNCj4gPiA+ICBkcml2ZXJzL2Ns
ay9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICB8ICAgMSArDQo+ID4gPiAgZHJpdmVycy9jbGsv
Y2xrLXBwYy1jb3JlbmV0LmMgICAgICAgICAgfCAyODANCj4gPiA+ICsrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKw0KPiA+ID4gIDQgZmlsZXMgY2hhbmdlZCwgMjg5IGluc2VydGlvbnMo
KykNCj4gPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvY2xrLXBwYy1jb3JlbmV0
LmMNCj4gPiA+DQo+ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29u
ZmlnLmNwdXR5cGUNCj4gPiA+IGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5
cGUNCj4gPiA+IGluZGV4IDE4ZTNiNzYuLmNmMDY1YjggMTAwNjQ0DQo+ID4gPiAtLS0gYS9hcmNo
L3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQ0KPiA+ID4gKysrIGIvYXJjaC9wb3dl
cnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUNCj4gPiA+IEBAIC0xNTgsNiArMTU4LDcgQEAg
Y29uZmlnIEU1MDANCj4gPiA+ICBjb25maWcgUFBDX0U1MDBNQw0KPiA+ID4gICAgICAgYm9vbCAi
ZTUwMG1jIFN1cHBvcnQiDQo+ID4gPiAgICAgICBzZWxlY3QgUFBDX0ZQVQ0KPiA+ID4gKyAgICAg
c2VsZWN0IENPTU1PTl9DTEsNCj4gPiA+ICAgICAgIGRlcGVuZHMgb24gRTUwMA0KPiA+ID4gICAg
ICAgaGVscA0KPiA+ID4gICAgICAgICBUaGlzIG11c3QgYmUgZW5hYmxlZCBmb3IgcnVubmluZyBv
biBlNTAwbWMgKGFuZCBkZXJpdmF0aXZlcw0KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xr
L0tjb25maWcgYi9kcml2ZXJzL2Nsay9LY29uZmlnIGluZGV4DQo+ID4gPiBhNDdlNmVlLi42ZTJm
ZDljDQo+ID4gPiAxMDA2NDQNCj4gPiA+IC0tLSBhL2RyaXZlcnMvY2xrL0tjb25maWcNCj4gPiA+
ICsrKyBiL2RyaXZlcnMvY2xrL0tjb25maWcNCj4gPiA+IEBAIC02Myw2ICs2MywxMyBAQCBjb25m
aWcgQ0xLX1RXTDYwNDANCj4gPiA+ICAgICAgICAgTWNQRE0uIE1jUERNIG1vZHVsZSBpcyB1c2lu
ZyB0aGUgZXh0ZXJuYWwgYml0IGNsb2NrIG9uIHRoZQ0KPiA+ID4gTWNQRE0gYnVzDQo+ID4gPiAg
ICAgICAgIGFzIGZ1bmN0aW9uYWwgY2xvY2suDQo+ID4gPg0KPiA+ID4gK2NvbmZpZyBDTEtfUFBD
X0NPUkVORVQNCj4gPiA+ICsgICAgIGJvb2wgIkNsb2NrIGRyaXZlciBmb3IgUG93ZXJQQyBjb3Jl
bmV0IHBsYXRmb3JtcyINCj4gPiA+ICsgICAgIGRlcGVuZHMgb24gUFBDX0U1MDBNQyAmJiBPRg0K
PiA+ID4gKyAgICAgLS0taGVscC0tLQ0KPiA+ID4gKyAgICAgICBUaGlzIGFkZHMgdGhlIGNsb2Nr
IGRyaXZlciBzdXBwb3J0IGZvciBGcmVlc2NhbGUgUG93ZXJQQw0KPiBjb3JlbmV0DQo+ID4gPiAr
ICAgICAgIHBsYXRmb3JtcyB1c2luZyBjb21tb24gY2xvY2sgZnJhbWV3b3JrLg0KPiA+ID4gKw0K
PiA+ID4gIGVuZG1lbnUNCj4gPiA+DQo+ID4gPiAgc291cmNlICJkcml2ZXJzL2Nsay9tdmVidS9L
Y29uZmlnIg0KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL01ha2VmaWxlIGIvZHJpdmVy
cy9jbGsvTWFrZWZpbGUgaW5kZXgNCj4gPiA+IDMwMGQ0NzcuLjY3MjAzMTkgMTAwNjQ0DQo+ID4g
PiAtLS0gYS9kcml2ZXJzL2Nsay9NYWtlZmlsZQ0KPiA+ID4gKysrIGIvZHJpdmVycy9jbGsvTWFr
ZWZpbGUNCj4gPiA+IEBAIC0zNCwzICszNCw0IEBAIG9iai0kKENPTkZJR19YODYpICAgICAgICAg
ICArPSB4ODYvDQo+ID4gPiAgb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfV004MzFYKSArPSBjbGst
d204MzF4Lm8NCj4gPiA+ICBvYmotJChDT05GSUdfQ09NTU9OX0NMS19NQVg3NzY4NikgKz0gY2xr
LW1heDc3Njg2Lm8NCj4gPiA+ICBvYmotJChDT05GSUdfQ0xLX1RXTDYwNDApICAgICs9IGNsay10
d2w2MDQwLm8NCj4gPiA+ICtvYmotJChDT05GSUdfQ0xLX1BQQ19DT1JFTkVUKSAgICAgICAgKz0g
Y2xrLXBwYy1jb3JlbmV0Lm8NCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstcHBj
LWNvcmVuZXQuYyBiL2RyaXZlcnMvY2xrL2Nsay1wcGMtDQo+ID4gPiBjb3JlbmV0LmMgbmV3IGZp
bGUgbW9kZSAxMDA2NDQgaW5kZXggMDAwMDAwMC4uYTJkNDgzZg0KPiA+ID4gLS0tIC9kZXYvbnVs
bA0KPiA+ID4gKysrIGIvZHJpdmVycy9jbGsvY2xrLXBwYy1jb3JlbmV0LmMNCj4gPiA+IEBAIC0w
LDAgKzEsMjgwIEBADQo+ID4gPiArLyoNCj4gPiA+ICsgKiBDb3B5cmlnaHQgMjAxMyBGcmVlc2Nh
bGUgU2VtaWNvbmR1Y3RvciwgSW5jLg0KPiA+ID4gKyAqDQo+ID4gPiArICogVGhpcyBwcm9ncmFt
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KPiA+ID4g
K21vZGlmeQ0KPiA+ID4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgdmVyc2lvbiAyDQo+ID4gPiArYXMNCj4gPiA+ICsgKiBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4NCj4gPiA+ICsgKg0KPiA+ID4gKyAqIGNs
b2NrIGRyaXZlciBmb3IgRnJlZXNjYWxlIFBvd2VyUEMgY29yZW5ldCBTb0NzLg0KPiA+ID4gKyAq
Lw0KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4NCj4gPiA+ICsjaW5jbHVk
ZSA8bGludXgvaW8uaD4NCj4gPiA+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQo+ID4gPiAr
I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0
Zm9ybS5oPg0KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9vZi5oPg0KPiA+ID4gKyNpbmNsdWRlIDxs
aW51eC9zbGFiLmg+DQo+ID4gPiArDQo+ID4gPiArc3RydWN0IGNtdXhfY2xrIHsNCj4gPiA+ICsg
ICAgIHN0cnVjdCBjbGtfaHcgaHc7DQo+ID4gPiArICAgICB2b2lkIF9faW9tZW0gKnJlZzsNCj4g
PiA+ICsgICAgIHUzMiBmbGFnczsNCj4gPiA+ICt9Ow0KPiA+ID4gKw0KPiA+ID4gKyNkZWZpbmUg
UExMX0tJTEwgICAgICAgICAgICAgICAgICAgICBCSVQoMzEpDQo+ID4gPiArI2RlZmluZSAgICAg
IENMS1NFTF9TSElGVCAgICAgICAgICAgIDI3DQo+ID4gPiArI2RlZmluZSBDTEtTRUxfQURKVVNU
ICAgICAgICAgICAgICAgIEJJVCgwKQ0KPiA+ID4gKyNkZWZpbmUgdG9fY211eF9jbGsocCkgICAg
ICAgICAgICAgICBjb250YWluZXJfb2YocCwgc3RydWN0IGNtdXhfY2xrLA0KPiBodykNCj4gPiA+
ICsNCj4gPiA+ICtzdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlOw0KPiA+ID4gK3N0YXRpYyB1bnNp
Z25lZCBpbnQgY2xvY2tzX3Blcl9wbGw7DQo+ID4gPiArDQo+ID4gPiArc3RhdGljIGludCBjbXV4
X3NldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGlkeCkgew0KPiA+ID4gKyAgICAgc3Ry
dWN0IGNtdXhfY2xrICpjbGsgPSB0b19jbXV4X2Nsayhodyk7DQo+ID4gPiArICAgICB1MzIgY2xr
c2VsOw0KPiA+ID4gKw0KPiA+ID4gKyAgICAgY2xrc2VsID0gKChpZHggLyBjbG9ja3NfcGVyX3Bs
bCkgPDwgMikgKyBpZHggJSBjbG9ja3NfcGVyX3BsbDsNCj4gPiA+ICsgICAgIGlmIChjbGstPmZs
YWdzICYgQ0xLU0VMX0FESlVTVCkNCj4gPiA+ICsgICAgICAgICAgICAgY2xrc2VsICs9IDg7DQo+
ID4gPiArICAgICBjbGtzZWwgPSAoY2xrc2VsICYgMHhmKSA8PCBDTEtTRUxfU0hJRlQ7DQo+ID4g
PiArICAgICBpb3dyaXRlMzJiZShjbGtzZWwsIGNsay0+cmVnKTsNCj4gPiA+ICsNCj4gPiA+ICsg
ICAgIHJldHVybiAwOw0KPiA+ID4gK30NCj4gPiA+ICsNCj4gPiA+ICtzdGF0aWMgdTggY211eF9n
ZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KSB7DQo+ID4gPiArICAgICBzdHJ1Y3QgY211eF9j
bGsgKmNsayA9IHRvX2NtdXhfY2xrKGh3KTsNCj4gPiA+ICsgICAgIHUzMiBjbGtzZWw7DQo+ID4g
PiArDQo+ID4gPiArICAgICBjbGtzZWwgPSBpb3JlYWQzMmJlKGNsay0+cmVnKTsNCj4gPiA+ICsg
ICAgIGNsa3NlbCA9IChjbGtzZWwgPj4gQ0xLU0VMX1NISUZUKSAmIDB4ZjsNCj4gPiA+ICsgICAg
IGlmIChjbGstPmZsYWdzICYgQ0xLU0VMX0FESlVTVCkNCj4gPiA+ICsgICAgICAgICAgICAgY2xr
c2VsIC09IDg7DQo+ID4gPiArICAgICBjbGtzZWwgPSAoY2xrc2VsID4+IDIpICogY2xvY2tzX3Bl
cl9wbGwgKyBjbGtzZWwgJSA0Ow0KPiA+ID4gKw0KPiA+ID4gKyAgICAgcmV0dXJuIGNsa3NlbDsN
Cj4gPiA+ICt9DQo+ID4gPiArDQo+ID4gPiArY29uc3Qgc3RydWN0IGNsa19vcHMgY211eF9vcHMg
PSB7DQo+ID4gPiArICAgICAuZ2V0X3BhcmVudCA9IGNtdXhfZ2V0X3BhcmVudCwNCj4gPiA+ICsg
ICAgIC5zZXRfcGFyZW50ID0gY211eF9zZXRfcGFyZW50LCB9Ow0KPiA+ID4gKw0KPiA+ID4gK3N0
YXRpYyB2b2lkIF9faW5pdCBjb3JlX211eF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApIHsN
Cj4gPiA+ICsgICAgIHN0cnVjdCBjbGsgKmNsazsNCj4gPiA+ICsgICAgIHN0cnVjdCBjbGtfaW5p
dF9kYXRhIGluaXQ7DQo+ID4gPiArICAgICBzdHJ1Y3QgY211eF9jbGsgKmNtdXhfY2xrOw0KPiA+
ID4gKyAgICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlOw0KPiA+ID4gKyAgICAgaW50IHJjLCBj
b3VudCwgaTsNCj4gPiA+ICsgICAgIHUzMiAgICAgb2Zmc2V0Ow0KPiA+ID4gKyAgICAgY29uc3Qg
Y2hhciAqY2xrX25hbWU7DQo+ID4gPiArICAgICBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzOw0K
PiA+ID4gKw0KPiA+ID4gKyAgICAgcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIs
ICZvZmZzZXQpOw0KPiA+ID4gKyAgICAgaWYgKHJjKSB7DQo+ID4gPiArICAgICAgICAgICAgIHBy
X2VycigiJXM6IGNvdWxkIG5vdCBnZXQgcmVnIHByb3BlcnR5XG4iLCBucC0+bmFtZSk7DQo+ID4g
PiArICAgICAgICAgICAgIHJldHVybjsNCj4gPiA+ICsgICAgIH0NCj4gPiA+ICsNCj4gPiA+ICsg
ICAgIC8qIGdldCB0aGUgaW5wdXQgY2xvY2sgc291cmNlIGNvdW50ICovDQo+ID4gPiArICAgICBj
b3VudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MobnAsICJjbG9jay1uYW1lcyIpOw0KPiA+
ID4gKyAgICAgaWYgKGNvdW50IDwgMCkgew0KPiA+ID4gKyAgICAgICAgICAgICBwcl9lcnIoIiVz
OiBnZXQgY2xvY2sgY291bnQgZXJyb3JcbiIsIG5wLT5uYW1lKTsNCj4gPiA+ICsgICAgICAgICAg
ICAgcmV0dXJuOw0KPiA+ID4gKyAgICAgfQ0KPiA+ID4gKyAgICAgcGFyZW50X25hbWVzID0ga3ph
bGxvYygoc2l6ZW9mKGNoYXIgKikgKiBjb3VudCksIEdGUF9LRVJORUwpOw0KPiA+ID4gKyAgICAg
aWYgKCFwYXJlbnRfbmFtZXMpIHsNCj4gPiA+ICsgICAgICAgICAgICAgcHJfZXJyKCIlczogY291
bGQgbm90IGFsbG9jYXRlIHBhcmVudF9uYW1lc1xuIiwNCj4gX19mdW5jX18pOw0KPiA+ID4gKyAg
ICAgICAgICAgICByZXR1cm47DQo+ID4gPiArICAgICB9DQo+ID4gPiArDQo+ID4gPiArICAgICBm
b3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykNCj4gPiA+ICsgICAgICAgICAgICAgcGFyZW50X25h
bWVzW2ldID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgaSk7DQo+ID4gPiArDQo+ID4gPiAr
ICAgICBjbXV4X2NsayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbXV4X2NsayksIEdGUF9LRVJO
RUwpOw0KPiA+ID4gKyAgICAgaWYgKCFjbXV4X2Nsaykgew0KPiA+ID4gKyAgICAgICAgICAgICBw
cl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgY211eF9jbGtcbiIsIF9fZnVuY19fKTsNCj4g
PiA+ICsgICAgICAgICAgICAgZ290byBlcnJfbmFtZTsNCj4gPiA+ICsgICAgIH0NCj4gPiA+ICsg
ICAgIGNtdXhfY2xrLT5yZWcgPSBiYXNlICsgb2Zmc2V0Ow0KPiA+ID4gKw0KPiA+ID4gKyAgICAg
bm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscDQwODAtDQo+
IGNsb2NrZ2VuIik7DQo+ID4gPiArICAgICBpZiAobm9kZSAmJiAob2Zmc2V0ID49IDB4ODApKQ0K
PiA+ID4gKyAgICAgICAgICAgICBjbXV4X2Nsay0+ZmxhZ3MgPSBDTEtTRUxfQURKVVNUOw0KPiA+
ID4gKw0KPiA+ID4gKyAgICAgcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwg
ImNsb2NrLW91dHB1dC1uYW1lcyIsDQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgMCwgJmNs
a19uYW1lKTsNCj4gPiA+ICsgICAgIGlmIChyYykgew0KPiA+ID4gKyAgICAgICAgICAgICBwcl9l
cnIoIiVzOiByZWFkIGNsb2NrIG5hbWVzIGVycm9yXG4iLCBucC0+bmFtZSk7DQo+ID4gPiArICAg
ICAgICAgICAgIGdvdG8gZXJyX2NsazsNCj4gPiA+ICsgICAgIH0NCj4gPiA+ICsNCj4gPiA+ICsg
ICAgIGluaXQubmFtZSA9IGNsa19uYW1lOw0KPiA+ID4gKyAgICAgaW5pdC5vcHMgPSAmY211eF9v
cHM7DQo+ID4gPiArICAgICBpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsNCj4gPiA+
ICsgICAgIGluaXQubnVtX3BhcmVudHMgPSBjb3VudDsNCj4gPiA+ICsgICAgIGluaXQuZmxhZ3Mg
PSAwOw0KPiA+ID4gKyAgICAgY211eF9jbGstPmh3LmluaXQgPSAmaW5pdDsNCj4gPiA+ICsNCj4g
PiA+ICsgICAgIGNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmY211eF9jbGstPmh3KTsNCj4gPiA+
ICsgICAgIGlmIChJU19FUlIoY2xrKSkgew0KPiA+ID4gKyAgICAgICAgICAgICBwcl9lcnIoIiVz
OiBjb3VsZCBub3QgcmVnaXN0ZXIgY2xvY2tcbiIsIGNsa19uYW1lKTsNCj4gPiA+ICsgICAgICAg
ICAgICAgZ290byBlcnJfY2xrOw0KPiA+ID4gKyAgICAgfQ0KPiA+ID4gKw0KPiA+ID4gKyAgICAg
cmMgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7
DQo+ID4gPiArICAgICBpZiAocmMpIHsNCj4gPiA+ICsgICAgICAgICAgICAgcHJfZXJyKCJDb3Vs
ZCBub3QgcmVnaXN0ZXIgY2xvY2sgcHJvdmlkZXIgZm9yDQo+IG5vZGU6JXNcbiIsDQo+ID4gPiAr
ICAgICAgICAgICAgICAgICAgICAgIG5wLT5uYW1lKTsNCj4gPiA+ICsgICAgICAgICAgICAgZ290
byBlcnJfY2xrOw0KPiA+ID4gKyAgICAgfQ0KPiA+ID4gKyAgICAgZ290byBlcnJfbmFtZTsNCj4g
PiA+ICsNCj4gPiA+ICtlcnJfY2xrOg0KPiA+ID4gKyAgICAga2ZyZWUoY211eF9jbGspOw0KPiA+
ID4gK2Vycl9uYW1lOg0KPiA+ID4gKyAgICAgLyogZnJlZSAqX25hbWVzIGJlY2F1c2UgdGhleSBh
cmUgcmVhbGxvY2F0ZWQgd2hlbiByZWdpc3RlcmVkICovDQo+ID4gPiArICAgICBrZnJlZShwYXJl
bnRfbmFtZXMpOw0KPiA+ID4gK30NCj4gPiA+ICsNCj4gPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg
Y29yZV9wbGxfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKSB7DQo+ID4gPiArICAgICB1MzIg
b2Zmc2V0LCBtdWx0Ow0KPiA+ID4gKyAgICAgaW50IGksIHJjLCBjb3VudDsNCj4gPiA+ICsgICAg
IGNvbnN0IGNoYXIgKmNsa19uYW1lLCAqcGFyZW50X25hbWU7DQo+ID4gPiArICAgICBzdHJ1Y3Qg
Y2xrX29uZWNlbGxfZGF0YSAqb25lY2VsbF9kYXRhOw0KPiA+ID4gKyAgICAgc3RydWN0IGNsayAg
ICAgICoqc3ViY2xrczsNCj4gPiA+ICsNCj4gPiA+ICsgICAgIHJjID0gb2ZfcHJvcGVydHlfcmVh
ZF91MzIobnAsICJyZWciLCAmb2Zmc2V0KTsNCj4gPiA+ICsgICAgIGlmIChyYykgew0KPiA+ID4g
KyAgICAgICAgICAgICBwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHJlZyBwcm9wZXJ0eVxuIiwg
bnAtPm5hbWUpOw0KPiA+ID4gKyAgICAgICAgICAgICByZXR1cm47DQo+ID4gPiArICAgICB9DQo+
ID4gPiArDQo+ID4gPiArICAgICAvKiBnZXQgdGhlIG11bHRpcGxlIG9mIFBMTCAqLw0KPiA+ID4g
KyAgICAgbXVsdCA9IGlvcmVhZDMyYmUoYmFzZSArIG9mZnNldCk7DQo+ID4gPiArDQo+ID4gPiAr
ICAgICAvKiBjaGVjayBpZiB0aGlzIFBMTCBpcyBkaXNhYmxlZCAqLw0KPiA+ID4gKyAgICAgaWYg
KG11bHQgJiBQTExfS0lMTCkgew0KPiA+ID4gKyAgICAgICAgICAgICBwcl9kZWJ1ZygiUExMOiVz
IGlzIGRpc2FibGVkXG4iLCBucC0+bmFtZSk7DQo+ID4gPiArICAgICAgICAgICAgIHJldHVybjsN
Cj4gPiA+ICsgICAgIH0NCj4gPiA+ICsgICAgIG11bHQgPSAobXVsdCA+PiAxKSAmIDB4M2Y7DQo+
ID4gPiArDQo+ID4gPiArICAgICBwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUo
bnAsIDApOw0KPiA+ID4gKyAgICAgaWYgKCFwYXJlbnRfbmFtZSkgew0KPiA+ID4gKyAgICAgICAg
ICAgICBwcl9lcnIoIlBMTDogJXMgbXVzdCBoYXZlIGEgcGFyZW50XG4iLCBucC0+bmFtZSk7DQo+
ID4gPiArICAgICAgICAgICAgIHJldHVybjsNCj4gPiA+ICsgICAgIH0NCj4gPiA+ICsNCj4gPiA+
ICsgICAgIGNvdW50ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhucCwgImNsb2NrLW91dHB1
dC1uYW1lcyIpOw0KPiA+ID4gKyAgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IDQpIHsNCj4g
PiA+ICsgICAgICAgICAgICAgcHJfZXJyKCIlczogY2xvY2sgaXMgbm90IHN1cHBvcnRlZFxuIiwg
bnAtPm5hbWUpOw0KPiA+ID4gKyAgICAgICAgICAgICByZXR1cm47DQo+ID4gPiArICAgICB9DQo+
ID4gPiArDQo+ID4gPiArICAgICAvKiBvdXRwdXQgY2xvY2sgbnVtYmVyIHBlciBQTEwgKi8NCj4g
PiA+ICsgICAgIGNsb2Nrc19wZXJfcGxsID0gY291bnQ7DQo+ID4gPiArDQo+ID4gPiArICAgICBz
dWJjbGtzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNsayAqKSAqIGNvdW50LCBHRlBfS0VSTkVM
KTsNCj4gPiA+ICsgICAgIGlmICghc3ViY2xrcykgew0KPiA+ID4gKyAgICAgICAgICAgICBwcl9l
cnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgc3ViY2xrc1xuIiwgX19mdW5jX18pOw0KPiA+ID4g
KyAgICAgICAgICAgICByZXR1cm47DQo+ID4gPiArICAgICB9DQo+ID4gPiArDQo+ID4gPiArICAg
ICBvbmVjZWxsX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSks
DQo+IEdGUF9LRVJORUwpOw0KPiA+ID4gKyAgICAgaWYgKCFvbmVjZWxsX2RhdGEpIHsNCj4gPiA+
ICsgICAgICAgICAgICAgcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIG9uZWNlbGxfZGF0
YVxuIiwNCj4gX19mdW5jX18pOw0KPiA+ID4gKyAgICAgICAgICAgICBnb3RvIGVycl9jbGtzOw0K
PiA+ID4gKyAgICAgfQ0KPiA+ID4gKw0KPiA+ID4gKyAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50
OyBpKyspIHsNCj4gPiA+ICsgICAgICAgICAgICAgcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmlu
Z19pbmRleChucCwgImNsb2NrLW91dHB1dC0NCj4gbmFtZXMiLA0KPiA+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaSwgJmNsa19uYW1lKTsNCj4gPiA+ICsgICAgICAgICAgICAgaWYg
KHJjKSB7DQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcHJfZXJyKCIlczogY291bGQgbm90
IGdldCBjbG9jayBuYW1lc1xuIiwgbnAtDQo+ID5uYW1lKTsNCj4gPiA+ICsgICAgICAgICAgICAg
ICAgICAgICBnb3RvIGVycl9jZWxsOw0KPiA+ID4gKyAgICAgICAgICAgICB9DQo+ID4gPiArDQo+
ID4gPiArICAgICAgICAgICAgIC8qDQo+ID4gPiArICAgICAgICAgICAgICAqIHdoZW4gY291bnQg
PT0gNCwgdGhlcmUgYXJlIDQgb3V0cHV0IGNsb2NrczoNCj4gPiA+ICsgICAgICAgICAgICAgICog
LzEsIC8yLCAvMywgLzQgcmVzcGVjdGl2ZWx5DQo+ID4gPiArICAgICAgICAgICAgICAqIHdoZW4g
Y291bnQgPCA0LCB0aGVyZSBhcmUgYXQgbGVhc3QgMiBvdXRwdXQgY2xvY2tzOg0KPiA+ID4gKyAg
ICAgICAgICAgICAgKiAvMSwgLzIsICgvNCwgaWYgY291bnQgPT0gMykgcmVzcGVjdGl2ZWx5Lg0K
PiA+ID4gKyAgICAgICAgICAgICAgKi8NCj4gPiA+ICsgICAgICAgICAgICAgaWYgKGNvdW50ID09
IDQpDQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgc3ViY2xrc1tpXSA9IGNsa19yZWdpc3Rl
cl9maXhlZF9mYWN0b3IoTlVMTCwNCj4gY2xrX25hbWUsDQo+ID4gPiArICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9uYW1lLCAwLCBtdWx0LCAxICsgaSk7DQo+ID4g
PiArICAgICAgICAgICAgIGVsc2UNCj4gPiA+ICsNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAg
ICBzdWJjbGtzW2ldID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLA0KPiBjbGtfbmFt
ZSwNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X25h
bWUsIDAsIG11bHQsIDEgPDwgaSk7DQo+ID4gPiArDQo+ID4gPiArICAgICAgICAgICAgIGlmIChJ
U19FUlIoc3ViY2xrc1tpXSkpIHsNCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBwcl9lcnIo
IiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgY2xvY2tcbiIsDQo+IGNsa19uYW1lKTsNCj4gPiA+ICsg
ICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9jZWxsOw0KPiA+ID4gKyAgICAgICAgICAgICB9
DQo+ID4gPiArICAgICB9DQo+ID4gPiArDQo+ID4gPiArICAgICBvbmVjZWxsX2RhdGEtPmNsa3Mg
PSBzdWJjbGtzOw0KPiA+ID4gKyAgICAgb25lY2VsbF9kYXRhLT5jbGtfbnVtID0gY291bnQ7DQo+
ID4gPiArDQo+ID4gPiArICAgICByYyA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19z
cmNfb25lY2VsbF9nZXQsDQo+IG9uZWNlbGxfZGF0YSk7DQo+ID4gPiArICAgICBpZiAocmMpIHsN
Cj4gPiA+ICsgICAgICAgICAgICAgcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgY2xrIHByb3Zp
ZGVyIGZvciBub2RlOiVzXG4iLA0KPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICBucC0+bmFt
ZSk7DQo+ID4gPiArICAgICAgICAgICAgIGdvdG8gZXJyX2NlbGw7DQo+ID4gPiArICAgICB9DQo+
ID4gPiArDQo+ID4gPiArICAgICByZXR1cm47DQo+ID4gPiArZXJyX2NlbGw6DQo+ID4gPiArICAg
ICBrZnJlZShvbmVjZWxsX2RhdGEpOw0KPiA+ID4gK2Vycl9jbGtzOg0KPiA+ID4gKyAgICAga2Zy
ZWUoc3ViY2xrcyk7DQo+ID4gPiArfQ0KPiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1
Y3Qgb2ZfZGV2aWNlX2lkIGNsa19tYXRjaFtdIF9faW5pdGNvbnN0ID0gew0KPiA+ID4gKyAgICAg
eyAuY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayIsIC5kYXRhID0gb2ZfZml4ZWRfY2xrX3NldHVw
LCB9LA0KPiA+ID4gKyAgICAgeyAuY29tcGF0aWJsZSA9ICJmc2wsY29yZS1wbGwtY2xvY2siLCAu
ZGF0YSA9IGNvcmVfcGxsX2luaXQsIH0sDQo+ID4gPiArICAgICB7IC5jb21wYXRpYmxlID0gImZz
bCxjb3JlLW11eC1jbG9jayIsIC5kYXRhID0gY29yZV9tdXhfaW5pdCwgfSwNCj4gPiA+ICsgICAg
IHt9DQo+ID4gPiArfTsNCj4gPiA+ICsNCj4gPiA+ICtzdGF0aWMgaW50IF9faW5pdCBwcGNfY29y
ZW5ldF9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCj4gew0KPiA+ID4g
KyAgICAgc3RydWN0IGRldmljZV9ub2RlICpucDsNCj4gPiA+ICsNCj4gPiA+ICsgICAgIG5wID0g
cGRldi0+ZGV2Lm9mX25vZGU7DQo+ID4gPiArICAgICBiYXNlID0gb2ZfaW9tYXAobnAsIDApOw0K
PiA+ID4gKyAgICAgaWYgKCFiYXNlKSB7DQo+ID4gPiArICAgICAgICAgICAgIGRldl9lcnIoJnBk
ZXYtPmRldiwgImlvbWFwIGVycm9yXG4iKTsNCj4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1F
Tk9NRU07DQo+ID4gPiArICAgICB9DQo+ID4gPiArICAgICBvZl9jbGtfaW5pdChjbGtfbWF0Y2gp
Ow0KPiA+ID4gKw0KPiA+ID4gKyAgICAgcmV0dXJuIDA7DQo+ID4gPiArfQ0KPiA+ID4gKw0KPiA+
ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBwY19jbGtfaWRzW10gX19pbml0
Y29uc3QgPSB7DQo+ID4gPiArICAgICB7IC5jb21wYXRpYmxlID0gImZzbCxxb3JpcS1jbG9ja2dl
bi0xLjAiLCB9LA0KPiA+ID4gKyAgICAgeyAuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY2xvY2tn
ZW4tMiIsIH0sDQo+ID4gPiArICAgICB7fQ0KPiA+ID4gK307DQo+ID4gPiArDQo+ID4gPiArc3Rh
dGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHBjX2NvcmVuZXRfY2xrX2RyaXZlciA9IHsNCj4g
PiA+ICsgICAgIC5kcml2ZXIgPSB7DQo+ID4gPiArICAgICAgICAgICAgIC5uYW1lID0gInBwY19j
b3JlbmV0X2Nsb2NrIiwNCj4gPiA+ICsgICAgICAgICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUs
DQo+ID4gPiArICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJsZSA9IHBwY19jbGtfaWRzLA0KPiA+
ID4gKyAgICAgfSwNCj4gPiA+ICsgICAgIC5wcm9iZSA9IHBwY19jb3JlbmV0X2Nsa19wcm9iZSwg
fTsNCj4gPiA+ICsNCj4gPiA+ICtzdGF0aWMgaW50IF9faW5pdCBwcGNfY29yZW5ldF9jbGtfaW5p
dCh2b2lkKSB7DQo+ID4gPiArICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZw
cGNfY29yZW5ldF9jbGtfZHJpdmVyKTsNCj4gPiA+ICt9DQo+ID4gPiArc3Vic3lzX2luaXRjYWxs
KHBwY19jb3JlbmV0X2Nsa19pbml0KTsNCj4gPiA+IC0tDQo+ID4gPiAxLjguMA0KDQo=

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

* Re: [PATCH v3] clk: add PowerPC corenet clock driver support
  2013-04-09  8:46 [PATCH v3] clk: add PowerPC corenet clock driver support Yuantian.Tang
  2013-04-09  8:46 ` [PATCH] powerpc/mpc85xx: Update the clock device tree nodes Yuantian.Tang
  2013-04-16  6:59 ` [PATCH v3] clk: add PowerPC corenet clock driver support Tang Yuantian-B29983
@ 2013-05-13 19:25 ` Mike Turquette
  2 siblings, 0 replies; 6+ messages in thread
From: Mike Turquette @ 2013-05-13 19:25 UTC (permalink / raw)
  To: Yuantian.Tang
  Cc: ulf.hansson, linux-doc, viresh.kumar, devicetree-discuss,
	linux-kernel, Tang Yuantian, shawn.guo, linuxppc-dev,
	linus.walleij

Quoting Yuantian.Tang@freescale.com (2013-04-09 01:46:26)
> From: Tang Yuantian <yuantian.tang@freescale.com>
> =

> This adds the clock driver for Freescale PowerPC corenet
> series SoCs using common clock infrastructure.
> =

> Signed-off-by: Tang Yuantian <Yuantian.Tang@freescale.com>
> Signed-off-by: Li Yang <leoli@freescale.com>

Patch #1 looks good to me.  I've taken it into clk-next for now, but by
aware that I'll be rebasing that branch until at least -rc3 comes out,
so don't use it for a stable branch.

I did not take in patch #2, I guess you'll send that through a PPC tree?

Regards,
Mike

> ---
> v3:
>         - remove the module author and description
> v2:
>         - add the document for device tree clock bindings
> =

>  arch/powerpc/platforms/Kconfig.cputype |   1 +
>  drivers/clk/Kconfig                    |   7 +
>  drivers/clk/Makefile                   |   1 +
>  drivers/clk/clk-ppc-corenet.c          | 280 +++++++++++++++++++++++++++=
++++++
>  4 files changed, 289 insertions(+)
>  create mode 100644 drivers/clk/clk-ppc-corenet.c
> =

> diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platfo=
rms/Kconfig.cputype
> index 18e3b76..cf065b8 100644
> --- a/arch/powerpc/platforms/Kconfig.cputype
> +++ b/arch/powerpc/platforms/Kconfig.cputype
> @@ -158,6 +158,7 @@ config E500
>  config PPC_E500MC
>         bool "e500mc Support"
>         select PPC_FPU
> +       select COMMON_CLK
>         depends on E500
>         help
>           This must be enabled for running on e500mc (and derivatives
> diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
> index a47e6ee..6e2fd9c 100644
> --- a/drivers/clk/Kconfig
> +++ b/drivers/clk/Kconfig
> @@ -63,6 +63,13 @@ config CLK_TWL6040
>           McPDM. McPDM module is using the external bit clock on the McPD=
M bus
>           as functional clock.
>  =

> +config CLK_PPC_CORENET
> +       bool "Clock driver for PowerPC corenet platforms"
> +       depends on PPC_E500MC && OF
> +       ---help---
> +         This adds the clock driver support for Freescale PowerPC corenet
> +         platforms using common clock framework.
> +
>  endmenu
>  =

>  source "drivers/clk/mvebu/Kconfig"
> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
> index 300d477..6720319 100644
> --- a/drivers/clk/Makefile
> +++ b/drivers/clk/Makefile
> @@ -34,3 +34,4 @@ obj-$(CONFIG_X86)             +=3D x86/
>  obj-$(CONFIG_COMMON_CLK_WM831X) +=3D clk-wm831x.o
>  obj-$(CONFIG_COMMON_CLK_MAX77686) +=3D clk-max77686.o
>  obj-$(CONFIG_CLK_TWL6040)      +=3D clk-twl6040.o
> +obj-$(CONFIG_CLK_PPC_CORENET)  +=3D clk-ppc-corenet.o
> diff --git a/drivers/clk/clk-ppc-corenet.c b/drivers/clk/clk-ppc-corenet.c
> new file mode 100644
> index 0000000..a2d483f
> --- /dev/null
> +++ b/drivers/clk/clk-ppc-corenet.c
> @@ -0,0 +1,280 @@
> +/*
> + * Copyright 2013 Freescale Semiconductor, Inc.
> + *
> + * 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.
> + *
> + * clock driver for Freescale PowerPC corenet SoCs.
> + */
> +#include <linux/clk-provider.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/of_platform.h>
> +#include <linux/of.h>
> +#include <linux/slab.h>
> +
> +struct cmux_clk {
> +       struct clk_hw hw;
> +       void __iomem *reg;
> +       u32 flags;
> +};
> +
> +#define PLL_KILL                       BIT(31)
> +#define        CLKSEL_SHIFT            27
> +#define CLKSEL_ADJUST          BIT(0)
> +#define to_cmux_clk(p)         container_of(p, struct cmux_clk, hw)
> +
> +static void __iomem *base;
> +static unsigned int clocks_per_pll;
> +
> +static int cmux_set_parent(struct clk_hw *hw, u8 idx)
> +{
> +       struct cmux_clk *clk =3D to_cmux_clk(hw);
> +       u32 clksel;
> +
> +       clksel =3D ((idx / clocks_per_pll) << 2) + idx % clocks_per_pll;
> +       if (clk->flags & CLKSEL_ADJUST)
> +               clksel +=3D 8;
> +       clksel =3D (clksel & 0xf) << CLKSEL_SHIFT;
> +       iowrite32be(clksel, clk->reg);
> +
> +       return 0;
> +}
> +
> +static u8 cmux_get_parent(struct clk_hw *hw)
> +{
> +       struct cmux_clk *clk =3D to_cmux_clk(hw);
> +       u32 clksel;
> +
> +       clksel =3D ioread32be(clk->reg);
> +       clksel =3D (clksel >> CLKSEL_SHIFT) & 0xf;
> +       if (clk->flags & CLKSEL_ADJUST)
> +               clksel -=3D 8;
> +       clksel =3D (clksel >> 2) * clocks_per_pll + clksel % 4;
> +
> +       return clksel;
> +}
> +
> +const struct clk_ops cmux_ops =3D {
> +       .get_parent =3D cmux_get_parent,
> +       .set_parent =3D cmux_set_parent,
> +};
> +
> +static void __init core_mux_init(struct device_node *np)
> +{
> +       struct clk *clk;
> +       struct clk_init_data init;
> +       struct cmux_clk *cmux_clk;
> +       struct device_node *node;
> +       int rc, count, i;
> +       u32     offset;
> +       const char *clk_name;
> +       const char **parent_names;
> +
> +       rc =3D of_property_read_u32(np, "reg", &offset);
> +       if (rc) {
> +               pr_err("%s: could not get reg property\n", np->name);
> +               return;
> +       }
> +
> +       /* get the input clock source count */
> +       count =3D of_property_count_strings(np, "clock-names");
> +       if (count < 0) {
> +               pr_err("%s: get clock count error\n", np->name);
> +               return;
> +       }
> +       parent_names =3D kzalloc((sizeof(char *) * count), GFP_KERNEL);
> +       if (!parent_names) {
> +               pr_err("%s: could not allocate parent_names\n", __func__);
> +               return;
> +       }
> +
> +       for (i =3D 0; i < count; i++)
> +               parent_names[i] =3D of_clk_get_parent_name(np, i);
> +
> +       cmux_clk =3D kzalloc(sizeof(struct cmux_clk), GFP_KERNEL);
> +       if (!cmux_clk) {
> +               pr_err("%s: could not allocate cmux_clk\n", __func__);
> +               goto err_name;
> +       }
> +       cmux_clk->reg =3D base + offset;
> +
> +       node =3D of_find_compatible_node(NULL, NULL, "fsl,p4080-clockgen"=
);
> +       if (node && (offset >=3D 0x80))
> +               cmux_clk->flags =3D CLKSEL_ADJUST;
> +
> +       rc =3D of_property_read_string_index(np, "clock-output-names",
> +                       0, &clk_name);
> +       if (rc) {
> +               pr_err("%s: read clock names error\n", np->name);
> +               goto err_clk;
> +       }
> +
> +       init.name =3D clk_name;
> +       init.ops =3D &cmux_ops;
> +       init.parent_names =3D parent_names;
> +       init.num_parents =3D count;
> +       init.flags =3D 0;
> +       cmux_clk->hw.init =3D &init;
> +
> +       clk =3D clk_register(NULL, &cmux_clk->hw);
> +       if (IS_ERR(clk)) {
> +               pr_err("%s: could not register clock\n", clk_name);
> +               goto err_clk;
> +       }
> +
> +       rc =3D of_clk_add_provider(np, of_clk_src_simple_get, clk);
> +       if (rc) {
> +               pr_err("Could not register clock provider for node:%s\n",
> +                        np->name);
> +               goto err_clk;
> +       }
> +       goto err_name;
> +
> +err_clk:
> +       kfree(cmux_clk);
> +err_name:
> +       /* free *_names because they are reallocated when registered */
> +       kfree(parent_names);
> +}
> +
> +static void __init core_pll_init(struct device_node *np)
> +{
> +       u32 offset, mult;
> +       int i, rc, count;
> +       const char *clk_name, *parent_name;
> +       struct clk_onecell_data *onecell_data;
> +       struct clk      **subclks;
> +
> +       rc =3D of_property_read_u32(np, "reg", &offset);
> +       if (rc) {
> +               pr_err("%s: could not get reg property\n", np->name);
> +               return;
> +       }
> +
> +       /* get the multiple of PLL */
> +       mult =3D ioread32be(base + offset);
> +
> +       /* check if this PLL is disabled */
> +       if (mult & PLL_KILL) {
> +               pr_debug("PLL:%s is disabled\n", np->name);
> +               return;
> +       }
> +       mult =3D (mult >> 1) & 0x3f;
> +
> +       parent_name =3D of_clk_get_parent_name(np, 0);
> +       if (!parent_name) {
> +               pr_err("PLL: %s must have a parent\n", np->name);
> +               return;
> +       }
> +
> +       count =3D of_property_count_strings(np, "clock-output-names");
> +       if (count < 0 || count > 4) {
> +               pr_err("%s: clock is not supported\n", np->name);
> +               return;
> +       }
> +
> +       /* output clock number per PLL */
> +       clocks_per_pll =3D count;
> +
> +       subclks =3D kzalloc(sizeof(struct clk *) * count, GFP_KERNEL);
> +       if (!subclks) {
> +               pr_err("%s: could not allocate subclks\n", __func__);
> +               return;
> +       }
> +
> +       onecell_data =3D kzalloc(sizeof(struct clk_onecell_data), GFP_KER=
NEL);
> +       if (!onecell_data) {
> +               pr_err("%s: could not allocate onecell_data\n", __func__);
> +               goto err_clks;
> +       }
> +
> +       for (i =3D 0; i < count; i++) {
> +               rc =3D of_property_read_string_index(np, "clock-output-na=
mes",
> +                               i, &clk_name);
> +               if (rc) {
> +                       pr_err("%s: could not get clock names\n", np->nam=
e);
> +                       goto err_cell;
> +               }
> +
> +               /*
> +                * when count =3D=3D 4, there are 4 output clocks:
> +                * /1, /2, /3, /4 respectively
> +                * when count < 4, there are at least 2 output clocks:
> +                * /1, /2, (/4, if count =3D=3D 3) respectively.
> +                */
> +               if (count =3D=3D 4)
> +                       subclks[i] =3D clk_register_fixed_factor(NULL, cl=
k_name,
> +                                       parent_name, 0, mult, 1 + i);
> +               else
> +
> +                       subclks[i] =3D clk_register_fixed_factor(NULL, cl=
k_name,
> +                                       parent_name, 0, mult, 1 << i);
> +
> +               if (IS_ERR(subclks[i])) {
> +                       pr_err("%s: could not register clock\n", clk_name=
);
> +                       goto err_cell;
> +               }
> +       }
> +
> +       onecell_data->clks =3D subclks;
> +       onecell_data->clk_num =3D count;
> +
> +       rc =3D of_clk_add_provider(np, of_clk_src_onecell_get, onecell_da=
ta);
> +       if (rc) {
> +               pr_err("Could not register clk provider for node:%s\n",
> +                        np->name);
> +               goto err_cell;
> +       }
> +
> +       return;
> +err_cell:
> +       kfree(onecell_data);
> +err_clks:
> +       kfree(subclks);
> +}
> +
> +static const struct of_device_id clk_match[] __initconst =3D {
> +       { .compatible =3D "fixed-clock", .data =3D of_fixed_clk_setup, },
> +       { .compatible =3D "fsl,core-pll-clock", .data =3D core_pll_init, =
},
> +       { .compatible =3D "fsl,core-mux-clock", .data =3D core_mux_init, =
},
> +       {}
> +};
> +
> +static int __init ppc_corenet_clk_probe(struct platform_device *pdev)
> +{
> +       struct device_node *np;
> +
> +       np =3D pdev->dev.of_node;
> +       base =3D of_iomap(np, 0);
> +       if (!base) {
> +               dev_err(&pdev->dev, "iomap error\n");
> +               return -ENOMEM;
> +       }
> +       of_clk_init(clk_match);
> +
> +       return 0;
> +}
> +
> +static const struct of_device_id ppc_clk_ids[] __initconst =3D {
> +       { .compatible =3D "fsl,qoriq-clockgen-1.0", },
> +       { .compatible =3D "fsl,qoriq-clockgen-2", },
> +       {}
> +};
> +
> +static struct platform_driver ppc_corenet_clk_driver =3D {
> +       .driver =3D {
> +               .name =3D "ppc_corenet_clock",
> +               .owner =3D THIS_MODULE,
> +               .of_match_table =3D ppc_clk_ids,
> +       },
> +       .probe =3D ppc_corenet_clk_probe,
> +};
> +
> +static int __init ppc_corenet_clk_init(void)
> +{
> +       return platform_driver_register(&ppc_corenet_clk_driver);
> +}
> +subsys_initcall(ppc_corenet_clk_init);
> -- =

> 1.8.0

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

end of thread, other threads:[~2013-05-13 19:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-09  8:46 [PATCH v3] clk: add PowerPC corenet clock driver support Yuantian.Tang
2013-04-09  8:46 ` [PATCH] powerpc/mpc85xx: Update the clock device tree nodes Yuantian.Tang
2013-04-16  6:59 ` [PATCH v3] clk: add PowerPC corenet clock driver support Tang Yuantian-B29983
2013-04-16 22:27   ` Mike Turquette
2013-04-17  2:12     ` Tang Yuantian-B29983
2013-05-13 19:25 ` Mike Turquette

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