From mboxrd@z Thu Jan 1 00:00:00 1970 From: mturquette@linaro.org (Mike Turquette) Date: Thu, 20 Jun 2013 16:29:03 -0700 Subject: [PATCH v4 1/4] clk: add support for Rockchip gate clocks In-Reply-To: <201306131659.40802.heiko@sntech.de> References: <201306131658.36584.heiko@sntech.de> <201306131659.40802.heiko@sntech.de> Message-ID: <20130620232903.9136.70323@quantum> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Quoting Heiko St?bner (2013-06-13 07:59:40) > This adds basic support for gate-clocks on Rockchip SoCs. > There are 16 gates in each register and use the HIWORD_MASK > mechanism for changing gate settings. > > The gate registers form a continuos block which makes the dt node > structure a matter of taste, as either all 160 gates can be put into > one gate clock spanning all registers or they can be divided into > the 10 individual gates containing 16 clocks each. > The code supports both approaches. > > Signed-off-by: Heiko Stuebner I've taken this patch into clk-next for 3.11. Perhaps in the future the gate-clock binding can be enhanced to allow for this kind of clock globbing and this driver can disappear entirely. Regards, Mike > --- > .../devicetree/bindings/clock/rockchip.txt | 74 +++++++++++++++ > drivers/clk/Makefile | 1 + > drivers/clk/rockchip/Makefile | 5 ++ > drivers/clk/rockchip/clk-rockchip.c | 94 ++++++++++++++++++++ > 4 files changed, 174 insertions(+) > create mode 100644 Documentation/devicetree/bindings/clock/rockchip.txt > create mode 100644 drivers/clk/rockchip/Makefile > create mode 100644 drivers/clk/rockchip/clk-rockchip.c > > diff --git a/Documentation/devicetree/bindings/clock/rockchip.txt b/Documentation/devicetree/bindings/clock/rockchip.txt > new file mode 100644 > index 0000000..a891c82 > --- /dev/null > +++ b/Documentation/devicetree/bindings/clock/rockchip.txt > @@ -0,0 +1,74 @@ > +Device Tree Clock bindings for arch-rockchip > + > +This binding uses the common clock binding[1]. > + > +[1] Documentation/devicetree/bindings/clock/clock-bindings.txt > + > +== Gate clocks == > + > +The gate registers form a continuos block which makes the dt node > +structure a matter of taste, as either all gates can be put into > +one gate clock spanning all registers or they can be divided into > +the 10 individual gates containing 16 clocks each. > +The code supports both approaches. > + > +Required properties: > +- compatible : "rockchip,rk2928-gate-clk" > +- reg : shall be the control register address(es) for the clock. > +- #clock-cells : from common clock binding; shall be set to 1 > +- clock-output-names : the corresponding gate names that the clock controls > +- clocks : should contain the parent clock for each individual gate, > + therefore the number of clocks elements should match the number of > + clock-output-names > + > +Example using multiple gate clocks: > + > + clk_gates0: gate-clk at 200000d0 { > + compatible = "rockchip,rk2928-gate-clk"; > + reg = <0x200000d0 0x4>; > + clocks = <&dummy>, <&dummy>, > + <&dummy>, <&dummy>, > + <&dummy>, <&dummy>, > + <&dummy>, <&dummy>, > + <&dummy>, <&dummy>, > + <&dummy>, <&dummy>, > + <&dummy>, <&dummy>, > + <&dummy>, <&dummy>; > + > + clock-output-names = > + "gate_core_periph", "gate_cpu_gpll", > + "gate_ddrphy", "gate_aclk_cpu", > + "gate_hclk_cpu", "gate_pclk_cpu", > + "gate_atclk_cpu", "gate_i2s0", > + "gate_i2s0_frac", "gate_i2s1", > + "gate_i2s1_frac", "gate_i2s2", > + "gate_i2s2_frac", "gate_spdif", > + "gate_spdif_frac", "gate_testclk"; > + > + #clock-cells = <1>; > + }; > + > + clk_gates1: gate-clk at 200000d4 { > + compatible = "rockchip,rk2928-gate-clk"; > + reg = <0x200000d4 0x4>; > + clocks = <&xin24m>, <&xin24m>, > + <&xin24m>, <&dummy>, > + <&dummy>, <&xin24m>, > + <&xin24m>, <&dummy>, > + <&xin24m>, <&dummy>, > + <&xin24m>, <&dummy>, > + <&xin24m>, <&dummy>, > + <&xin24m>, <&dummy>; > + > + clock-output-names = > + "gate_timer0", "gate_timer1", > + "gate_timer2", "gate_jtag", > + "gate_aclk_lcdc1_src", "gate_otgphy0", > + "gate_otgphy1", "gate_ddr_gpll", > + "gate_uart0", "gate_frac_uart0", > + "gate_uart1", "gate_frac_uart1", > + "gate_uart2", "gate_frac_uart2", > + "gate_uart3", "gate_frac_uart3"; > + > + #clock-cells = <1>; > + }; > diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile > index f51b52b..2e2e957 100644 > --- a/drivers/clk/Makefile > +++ b/drivers/clk/Makefile > @@ -25,6 +25,7 @@ ifeq ($(CONFIG_COMMON_CLK), y) > obj-$(CONFIG_ARCH_MMP) += mmp/ > endif > obj-$(CONFIG_MACH_LOONGSON1) += clk-ls1x.o > +obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/ > obj-$(CONFIG_ARCH_SUNXI) += sunxi/ > obj-$(CONFIG_ARCH_U8500) += ux500/ > obj-$(CONFIG_ARCH_VT8500) += clk-vt8500.o > diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile > new file mode 100644 > index 0000000..8d3aefa > --- /dev/null > +++ b/drivers/clk/rockchip/Makefile > @@ -0,0 +1,5 @@ > +# > +# Rockchip Clock specific Makefile > +# > + > +obj-y += clk-rockchip.o > diff --git a/drivers/clk/rockchip/clk-rockchip.c b/drivers/clk/rockchip/clk-rockchip.c > new file mode 100644 > index 0000000..ff990c4 > --- /dev/null > +++ b/drivers/clk/rockchip/clk-rockchip.c > @@ -0,0 +1,94 @@ > +/* > + * Copyright (c) 2013 MundoReader S.L. > + * Author: Heiko Stuebner > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include > +#include > +#include > +#include > + > +static DEFINE_SPINLOCK(clk_lock); > + > +/* > + * Gate clocks > + */ > + > +static void __init rk2928_gate_clk_init(struct device_node *node, > + void *data) > +{ > + struct clk_onecell_data *clk_data; > + const char *clk_parent; > + const char *clk_name; > + void __iomem *reg; > + void __iomem *reg_idx; > + int flags; > + int qty; > + int reg_bit; > + int clkflags = CLK_SET_RATE_PARENT; > + int i; > + > + qty = of_property_count_strings(node, "clock-output-names"); > + if (qty < 0) { > + pr_err("%s: error in clock-output-names %d\n", __func__, qty); > + return; > + } > + > + if (qty == 0) { > + pr_info("%s: nothing to do\n", __func__); > + return; > + } > + > + reg = of_iomap(node, 0); > + > + clk_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL); > + if (!clk_data) > + return; > + > + clk_data->clks = kzalloc(qty * sizeof(struct clk *), GFP_KERNEL); > + if (!clk_data->clks) { > + kfree(clk_data); > + return; > + } > + > + flags = CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE; > + > + for (i = 0; i < qty; i++) { > + of_property_read_string_index(node, "clock-output-names", > + i, &clk_name); > + > + /* ignore empty slots */ > + if (!strcmp("reserved", clk_name)) > + continue; > + > + clk_parent = of_clk_get_parent_name(node, i); > + > + /* keep all gates untouched for now */ > + clkflags |= CLK_IGNORE_UNUSED; > + > + reg_idx = reg + (4 * (i / 16)); > + reg_bit = (i % 16); > + > + clk_data->clks[i] = clk_register_gate(NULL, clk_name, > + clk_parent, clkflags, > + reg_idx, reg_bit, > + flags, > + &clk_lock); > + WARN_ON(IS_ERR(clk_data->clks[i])); > + } > + > + clk_data->clk_num = qty; > + > + of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); > +} > +CLK_OF_DECLARE(rk2928_gate, "rockchip,rk2928-gate-clk", rk2928_gate_clk_init); > -- > 1.7.10.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mike Turquette Subject: Re: [PATCH v4 1/4] clk: add support for Rockchip gate clocks Date: Thu, 20 Jun 2013 16:29:03 -0700 Message-ID: <20130620232903.9136.70323@quantum> References: <201306131658.36584.heiko@sntech.de> <201306131659.40802.heiko@sntech.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <201306131659.40802.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: "devicetree-discuss" To: =?utf-8?q?Heiko_St=C3=BCbner?= , "linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org" Cc: Grant Likely , devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, Rob Herring List-Id: devicetree@vger.kernel.org UXVvdGluZyBIZWlrbyBTdMO8Ym5lciAoMjAxMy0wNi0xMyAwNzo1OTo0MCkKPiBUaGlzIGFkZHMg YmFzaWMgc3VwcG9ydCBmb3IgZ2F0ZS1jbG9ja3Mgb24gUm9ja2NoaXAgU29Dcy4KPiBUaGVyZSBh cmUgMTYgZ2F0ZXMgaW4gZWFjaCByZWdpc3RlciBhbmQgdXNlIHRoZSBISVdPUkRfTUFTSwo+IG1l Y2hhbmlzbSBmb3IgY2hhbmdpbmcgZ2F0ZSBzZXR0aW5ncy4KPiAKPiBUaGUgZ2F0ZSByZWdpc3Rl cnMgZm9ybSBhIGNvbnRpbnVvcyBibG9jayB3aGljaCBtYWtlcyB0aGUgZHQgbm9kZQo+IHN0cnVj dHVyZSBhIG1hdHRlciBvZiB0YXN0ZSwgYXMgZWl0aGVyIGFsbCAxNjAgZ2F0ZXMgY2FuIGJlIHB1 dCBpbnRvCj4gb25lIGdhdGUgY2xvY2sgc3Bhbm5pbmcgYWxsIHJlZ2lzdGVycyBvciB0aGV5IGNh biBiZSBkaXZpZGVkIGludG8KPiB0aGUgMTAgaW5kaXZpZHVhbCBnYXRlcyBjb250YWluaW5nIDE2 IGNsb2NrcyBlYWNoLgo+IFRoZSBjb2RlIHN1cHBvcnRzIGJvdGggYXBwcm9hY2hlcy4KPiAKPiBT aWduZWQtb2ZmLWJ5OiBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPgoKSSd2ZSB0YWtl biB0aGlzIHBhdGNoIGludG8gY2xrLW5leHQgZm9yIDMuMTEuIFBlcmhhcHMgaW4gdGhlIGZ1dHVy ZSB0aGUKZ2F0ZS1jbG9jayBiaW5kaW5nIGNhbiBiZSBlbmhhbmNlZCB0byBhbGxvdyBmb3IgdGhp cyBraW5kIG9mIGNsb2NrCmdsb2JiaW5nIGFuZCB0aGlzIGRyaXZlciBjYW4gZGlzYXBwZWFyIGVu dGlyZWx5LgoKUmVnYXJkcywKTWlrZQoKPiAtLS0KPiAgLi4uL2RldmljZXRyZWUvYmluZGluZ3Mv Y2xvY2svcm9ja2NoaXAudHh0ICAgICAgICAgfCAgIDc0ICsrKysrKysrKysrKysrKwo+ICBkcml2 ZXJzL2Nsay9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwo+ ICBkcml2ZXJzL2Nsay9yb2NrY2hpcC9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICB8ICAg IDUgKysKPiAgZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJvY2tjaGlwLmMgICAgICAgICAgICAg ICAgfCAgIDk0ICsrKysrKysrKysrKysrKysrKysrCj4gIDQgZmlsZXMgY2hhbmdlZCwgMTc0IGlu c2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vZGV2aWNldHJl ZS9iaW5kaW5ncy9jbG9jay9yb2NrY2hpcC50eHQKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Ns ay9yb2NrY2hpcC9jbGstcm9ja2NoaXAuYwo+IAo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u L2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcm9ja2NoaXAudHh0IGIvRG9jdW1lbnRhdGlvbi9k ZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3JvY2tjaGlwLnR4dAo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMC4uYTg5MWM4Mgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9Eb2N1 bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcm9ja2NoaXAudHh0Cj4gQEAgLTAs MCArMSw3NCBAQAo+ICtEZXZpY2UgVHJlZSBDbG9jayBiaW5kaW5ncyBmb3IgYXJjaC1yb2NrY2hp cAo+ICsKPiArVGhpcyBiaW5kaW5nIHVzZXMgdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgo+ ICsKPiArWzFdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1i aW5kaW5ncy50eHQKPiArCj4gKz09IEdhdGUgY2xvY2tzID09Cj4gKwo+ICtUaGUgZ2F0ZSByZWdp c3RlcnMgZm9ybSBhIGNvbnRpbnVvcyBibG9jayB3aGljaCBtYWtlcyB0aGUgZHQgbm9kZQo+ICtz dHJ1Y3R1cmUgYSBtYXR0ZXIgb2YgdGFzdGUsIGFzIGVpdGhlciBhbGwgZ2F0ZXMgY2FuIGJlIHB1 dCBpbnRvCj4gK29uZSBnYXRlIGNsb2NrIHNwYW5uaW5nIGFsbCByZWdpc3RlcnMgb3IgdGhleSBj YW4gYmUgZGl2aWRlZCBpbnRvCj4gK3RoZSAxMCBpbmRpdmlkdWFsIGdhdGVzIGNvbnRhaW5pbmcg MTYgY2xvY2tzIGVhY2guCj4gK1RoZSBjb2RlIHN1cHBvcnRzIGJvdGggYXBwcm9hY2hlcy4KPiAr Cj4gK1JlcXVpcmVkIHByb3BlcnRpZXM6Cj4gKy0gY29tcGF0aWJsZSA6ICJyb2NrY2hpcCxyazI5 MjgtZ2F0ZS1jbGsiCj4gKy0gcmVnIDogc2hhbGwgYmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgYWRk cmVzcyhlcykgZm9yIHRoZSBjbG9jay4KPiArLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBj bG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMQo+ICstIGNsb2NrLW91dHB1dC1uYW1lcyA6 IHRoZSBjb3JyZXNwb25kaW5nIGdhdGUgbmFtZXMgdGhhdCB0aGUgY2xvY2sgY29udHJvbHMKPiAr LSBjbG9ja3MgOiBzaG91bGQgY29udGFpbiB0aGUgcGFyZW50IGNsb2NrIGZvciBlYWNoIGluZGl2 aWR1YWwgZ2F0ZSwKPiArICB0aGVyZWZvcmUgdGhlIG51bWJlciBvZiBjbG9ja3MgZWxlbWVudHMg c2hvdWxkIG1hdGNoIHRoZSBudW1iZXIgb2YKPiArICBjbG9jay1vdXRwdXQtbmFtZXMKPiArCj4g K0V4YW1wbGUgdXNpbmcgbXVsdGlwbGUgZ2F0ZSBjbG9ja3M6Cj4gKwo+ICsgICAgICAgICAgICAg ICBjbGtfZ2F0ZXMwOiBnYXRlLWNsa0AyMDAwMDBkMCB7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtZ2F0ZS1jbGsiOwo+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJlZyA9IDwweDIwMDAwMGQwIDB4ND47Cj4gKyAgICAgICAgICAgICAgICAg ICAgICAgY2xvY2tzID0gPCZkdW1teT4sIDwmZHVtbXk+LAo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDwmZHVtbXk+LCA8JmR1bW15PiwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8JmR1bW15PiwgPCZkdW1teT4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPCZkdW1teT4sIDwmZHVtbXk+LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDwmZHVtbXk+LCA8JmR1bW15PiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8JmR1bW15PiwgPCZkdW1teT4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPCZkdW1teT4sIDwmZHVtbXk+LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDwmZHVtbXk+LCA8JmR1bW15PjsKPiArCj4gKyAgICAgICAgICAgICAgICAgICAgICAgY2xvY2st b3V0cHV0LW5hbWVzID0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYXRlX2Nv cmVfcGVyaXBoIiwgImdhdGVfY3B1X2dwbGwiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgImdhdGVfZGRycGh5IiwgImdhdGVfYWNsa19jcHUiLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImdhdGVfaGNsa19jcHUiLCAiZ2F0ZV9wY2xrX2NwdSIsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2F0ZV9hdGNsa19jcHUiLCAiZ2F0ZV9pMnMwIiwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYXRlX2kyczBfZnJhYyIsICJnYXRl X2kyczEiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhdGVfaTJzMV9mcmFj IiwgImdhdGVfaTJzMiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2F0ZV9p MnMyX2ZyYWMiLCAiZ2F0ZV9zcGRpZiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiZ2F0ZV9zcGRpZl9mcmFjIiwgImdhdGVfdGVzdGNsayI7Cj4gKwo+ICsgICAgICAgICAgICAg ICAgICAgICAgICNjbG9jay1jZWxscyA9IDwxPjsKPiArICAgICAgICAgICAgICAgfTsKPiArCj4g KyAgICAgICAgICAgICAgIGNsa19nYXRlczE6IGdhdGUtY2xrQDIwMDAwMGQ0IHsKPiArICAgICAg ICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMjkyOC1nYXRlLWNsayI7 Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDB4MjAwMDAwZDQgMHg0PjsKPiArICAg ICAgICAgICAgICAgICAgICAgICBjbG9ja3MgPSA8JnhpbjI0bT4sIDwmeGluMjRtPiwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JnhpbjI0bT4sIDwmZHVtbXk+LAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwmZHVtbXk+LCA8JnhpbjI0bT4sCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPCZ4aW4yNG0+LCA8JmR1bW15PiwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8JnhpbjI0bT4sIDwmZHVtbXk+LAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDwmeGluMjRtPiwgPCZkdW1teT4sCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgPCZ4aW4yNG0+LCA8JmR1bW15PiwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA8JnhpbjI0bT4sIDwmZHVtbXk+Owo+ICsKPiArICAgICAg ICAgICAgICAgICAgICAgICBjbG9jay1vdXRwdXQtbmFtZXMgPQo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImdhdGVfdGltZXIwIiwgImdhdGVfdGltZXIxIiwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICJnYXRlX3RpbWVyMiIsICJnYXRlX2p0YWciLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhdGVfYWNsa19sY2RjMV9zcmMiLCAiZ2F0ZV9v dGdwaHkwIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYXRlX290Z3BoeTEi LCAiZ2F0ZV9kZHJfZ3BsbCIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2F0 ZV91YXJ0MCIsICJnYXRlX2ZyYWNfdWFydDAiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgImdhdGVfdWFydDEiLCAiZ2F0ZV9mcmFjX3VhcnQxIiwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJnYXRlX3VhcnQyIiwgImdhdGVfZnJhY191YXJ0MiIsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2F0ZV91YXJ0MyIsICJnYXRlX2ZyYWNfdWFydDMi Owo+ICsKPiArICAgICAgICAgICAgICAgICAgICAgICAjY2xvY2stY2VsbHMgPSA8MT47Cj4gKyAg ICAgICAgICAgICAgIH07Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL01ha2VmaWxlIGIvZHJp dmVycy9jbGsvTWFrZWZpbGUKPiBpbmRleCBmNTFiNTJiLi4yZTJlOTU3IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvY2xrL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9jbGsvTWFrZWZpbGUKPiBAQCAt MjUsNiArMjUsNyBAQCBpZmVxICgkKENPTkZJR19DT01NT05fQ0xLKSwgeSkKPiAgb2JqLSQoQ09O RklHX0FSQ0hfTU1QKSAgICAgICAgICs9IG1tcC8KPiAgZW5kaWYKPiAgb2JqLSQoQ09ORklHX01B Q0hfTE9PTkdTT04xKSAgICs9IGNsay1sczF4Lm8KPiArb2JqLSQoQ09ORklHX0FSQ0hfUk9DS0NI SVApICAgICs9IHJvY2tjaGlwLwo+ICBvYmotJChDT05GSUdfQVJDSF9TVU5YSSkgICAgICAgKz0g c3VueGkvCj4gIG9iai0kKENPTkZJR19BUkNIX1U4NTAwKSAgICAgICArPSB1eDUwMC8KPiAgb2Jq LSQoQ09ORklHX0FSQ0hfVlQ4NTAwKSAgICAgICs9IGNsay12dDg1MDAubwo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL01h a2VmaWxlCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi44ZDNhZWZhCj4g LS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlCj4gQEAg LTAsMCArMSw1IEBACj4gKyMKPiArIyBSb2NrY2hpcCBDbG9jayBzcGVjaWZpYyBNYWtlZmlsZQo+ ICsjCj4gKwo+ICtvYmoteSAgKz0gY2xrLXJvY2tjaGlwLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9jbGsvcm9ja2NoaXAvY2xrLXJvY2tjaGlwLmMgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGst cm9ja2NoaXAuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uZmY5OTBj NAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcm9ja2No aXAuYwo+IEBAIC0wLDAgKzEsOTQgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDEzIE11 bmRvUmVhZGVyIFMuTC4KPiArICogQXV0aG9yOiBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNo LmRlPgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQo+ICsgKiB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl LCBvcgo+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ICsgKgo+ICsg KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl IHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9j bGstcHJvdmlkZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgo+ICsjaW5jbHVkZSA8 bGludXgvb2YuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KPiArCj4gK3N0YXRp YyBERUZJTkVfU1BJTkxPQ0soY2xrX2xvY2spOwo+ICsKPiArLyoKPiArICogR2F0ZSBjbG9ja3MK PiArICovCj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcmsyOTI4X2dhdGVfY2xrX2luaXQoc3Ry dWN0IGRldmljZV9ub2RlICpub2RlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdm9pZCAqZGF0YSkKPiArewo+ICsgICAgICAgc3RydWN0IGNsa19vbmVjZWxsX2Rh dGEgKmNsa19kYXRhOwo+ICsgICAgICAgY29uc3QgY2hhciAqY2xrX3BhcmVudDsKPiArICAgICAg IGNvbnN0IGNoYXIgKmNsa19uYW1lOwo+ICsgICAgICAgdm9pZCBfX2lvbWVtICpyZWc7Cj4gKyAg ICAgICB2b2lkIF9faW9tZW0gKnJlZ19pZHg7Cj4gKyAgICAgICBpbnQgZmxhZ3M7Cj4gKyAgICAg ICBpbnQgcXR5Owo+ICsgICAgICAgaW50IHJlZ19iaXQ7Cj4gKyAgICAgICBpbnQgY2xrZmxhZ3Mg PSBDTEtfU0VUX1JBVEVfUEFSRU5UOwo+ICsgICAgICAgaW50IGk7Cj4gKwo+ICsgICAgICAgcXR5 ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIik7 Cj4gKyAgICAgICBpZiAocXR5IDwgMCkgewo+ICsgICAgICAgICAgICAgICBwcl9lcnIoIiVzOiBl cnJvciBpbiBjbG9jay1vdXRwdXQtbmFtZXMgJWRcbiIsIF9fZnVuY19fLCBxdHkpOwo+ICsgICAg ICAgICAgICAgICByZXR1cm47Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgaWYgKHF0eSA9PSAw KSB7Cj4gKyAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBub3RoaW5nIHRvIGRvXG4iLCBfX2Z1 bmNfXyk7Cj4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiArICAgICAgIH0KPiArCj4gKyAgICAg ICByZWcgPSBvZl9pb21hcChub2RlLCAwKTsKPiArCj4gKyAgICAgICBjbGtfZGF0YSA9IGt6YWxs b2Moc2l6ZW9mKHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhKSwgR0ZQX0tFUk5FTCk7Cj4gKyAgICAg ICBpZiAoIWNsa19kYXRhKQo+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gKwo+ICsgICAgICAg Y2xrX2RhdGEtPmNsa3MgPSBremFsbG9jKHF0eSAqIHNpemVvZihzdHJ1Y3QgY2xrICopLCBHRlBf S0VSTkVMKTsKPiArICAgICAgIGlmICghY2xrX2RhdGEtPmNsa3MpIHsKPiArICAgICAgICAgICAg ICAga2ZyZWUoY2xrX2RhdGEpOwo+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gKyAgICAgICB9 Cj4gKwo+ICsgICAgICAgZmxhZ3MgPSBDTEtfR0FURV9ISVdPUkRfTUFTSyB8IENMS19HQVRFX1NF VF9UT19ESVNBQkxFOwo+ICsKPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCBxdHk7IGkrKykgewo+ ICsgICAgICAgICAgICAgICBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChub2RlLCAiY2xv Y2stb3V0cHV0LW5hbWVzIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaSwgJmNsa19uYW1lKTsKPiArCj4gKyAgICAgICAgICAgICAgIC8qIGlnbm9yZSBl bXB0eSBzbG90cyAqLwo+ICsgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgicmVzZXJ2ZWQiLCBj bGtfbmFtZSkpCj4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gKwo+ICsgICAg ICAgICAgICAgICBjbGtfcGFyZW50ID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShub2RlLCBpKTsK PiArCj4gKyAgICAgICAgICAgICAgIC8qIGtlZXAgYWxsIGdhdGVzIHVudG91Y2hlZCBmb3Igbm93 ICovCj4gKyAgICAgICAgICAgICAgIGNsa2ZsYWdzIHw9IENMS19JR05PUkVfVU5VU0VEOwo+ICsK PiArICAgICAgICAgICAgICAgcmVnX2lkeCA9IHJlZyArICg0ICogKGkgLyAxNikpOwo+ICsgICAg ICAgICAgICAgICByZWdfYml0ID0gKGkgJSAxNik7Cj4gKwo+ICsgICAgICAgICAgICAgICBjbGtf ZGF0YS0+Y2xrc1tpXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIGNsa19uYW1lLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsa19wYXJl bnQsIGNsa2ZsYWdzLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlZ19pZHgsIHJlZ19iaXQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsa19sb2NrKTsKPiArICAgICAg ICAgICAgICAgV0FSTl9PTihJU19FUlIoY2xrX2RhdGEtPmNsa3NbaV0pKTsKPiArICAgICAgIH0K PiArCj4gKyAgICAgICBjbGtfZGF0YS0+Y2xrX251bSA9IHF0eTsKPiArCj4gKyAgICAgICBvZl9j bGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsK PiArfQo+ICtDTEtfT0ZfREVDTEFSRShyazI5MjhfZ2F0ZSwgInJvY2tjaGlwLHJrMjkyOC1nYXRl LWNsayIsIHJrMjkyOF9nYXRlX2Nsa19pbml0KTsKPiAtLSAKPiAxLjcuMTAuNApfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkZXZpY2V0cmVlLWRpc2N1c3Mg bWFpbGluZyBsaXN0CmRldmljZXRyZWUtZGlzY3Vzc0BsaXN0cy5vemxhYnMub3JnCmh0dHBzOi8v bGlzdHMub3psYWJzLm9yZy9saXN0aW5mby9kZXZpY2V0cmVlLWRpc2N1c3MK