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