From mboxrd@z Thu Jan 1 00:00:00 1970 From: mturquette@linaro.org (Mike Turquette) Date: Mon, 07 Oct 2013 14:23:54 -0700 Subject: [PATCH] clk: new driver for efm32 SoC In-Reply-To: <1376510693-12491-1-git-send-email-u.kleine-koenig@pengutronix.de> References: <1376510693-12491-1-git-send-email-u.kleine-koenig@pengutronix.de> Message-ID: <20131007212354.7445.84276@quantum> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Quoting Uwe Kleine-K?nig (2013-08-14 13:04:53) > Signed-off-by: Uwe Kleine-K?nig > --- > Hello, > > I'm not sure if there is a naming convention for #defines in headers below > dt-bindings. I named my clocks clk_$namefromreferencemanual to have some > namespacing. > > The clock stuff on the different variants of efm32 are similar, but > different enough to not be able to use the same driver, so this is only > for the Giant Gecko (efm32gg) variant, still I used "efm32" in some > places because the other variants would fit there, too. (For > include/dt-bindings/clock/efm32-cmu.h I would need some #ifdefs, is that > OK or should the name of the defines include efm32gg? (That would make > the names still longer and so more ugly.)) The DT experts should weigh in on having #ifdef's in the header, but I think we should avoid that. Better to explicitly list the clocks for the variant used. You can add "gg" to this or not, I don't care, but the future variants will need some suffix, or maybe their own header. I'm happy with this patch and can take it for 3.13. Care to add a changelog? Regards, Mike > > Best regards > Uwe > > .../devicetree/bindings/clock/efm32-clock.txt | 11 +++ > drivers/clk/Makefile | 1 + > drivers/clk/clk-efm32gg.c | 79 ++++++++++++++++++++++ > include/dt-bindings/clock/efm32-cmu.h | 42 ++++++++++++ > include/linux/clk/efm32.h | 6 ++ > 5 files changed, 139 insertions(+) > create mode 100644 Documentation/devicetree/bindings/clock/efm32-clock.txt > create mode 100644 drivers/clk/clk-efm32gg.c > create mode 100644 include/dt-bindings/clock/efm32-cmu.h > create mode 100644 include/linux/clk/efm32.h > > diff --git a/Documentation/devicetree/bindings/clock/efm32-clock.txt b/Documentation/devicetree/bindings/clock/efm32-clock.txt > new file mode 100644 > index 0000000..263d293 > --- /dev/null > +++ b/Documentation/devicetree/bindings/clock/efm32-clock.txt > @@ -0,0 +1,11 @@ > +* Clock bindings for Energy Micro efm32 Giant Gecko's Clock Management Unit > + > +Required properties: > +- compatible: Should be "efm32gg,cmu" > +- reg: Base address and length of the register set > +- interrupts: Interrupt used by the CMU > +- #clock-cells: Should be <1> > + > +The clock consumer should specify the desired clock by having the clock ID in > +its "clocks" phandle cell. The header efm32-clk.h contains a list of available > +IDs. > diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile > index 4038c2b..99d9ad0 100644 > --- a/drivers/clk/Makefile > +++ b/drivers/clk/Makefile > @@ -11,6 +11,7 @@ obj-$(CONFIG_COMMON_CLK) += clk-composite.o > > # SoCs specific > obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835.o > +obj-$(CONFIG_ARCH_EFM32) += clk-efm32gg.o > obj-$(CONFIG_ARCH_NOMADIK) += clk-nomadik.o > obj-$(CONFIG_ARCH_HIGHBANK) += clk-highbank.o > obj-$(CONFIG_ARCH_NSPIRE) += clk-nspire.o > diff --git a/drivers/clk/clk-efm32gg.c b/drivers/clk/clk-efm32gg.c > new file mode 100644 > index 0000000..2e63584 > --- /dev/null > +++ b/drivers/clk/clk-efm32gg.c > @@ -0,0 +1,79 @@ > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#define CMU_HFPERCLKEN0 0x44 > + > +static struct clk *clk[37]; > +static struct clk_onecell_data clk_data = { > + .clks = clk, > + .clk_num = ARRAY_SIZE(clk), > +}; > + > +int __init efm32gg_clk_init(void) > +{ > + int i; > + struct device_node *np; > + void __iomem *base; > + > + for (i = 0; i < ARRAY_SIZE(clk); ++i) > + clk[i] = ERR_PTR(-ENOENT); > + > + np = of_find_compatible_node(NULL, NULL, "efm32gg,cmu"); > + if (!np) { > + pr_warn("No efm32gg,cmu node found in device tree\n"); > + return -ENOENT; > + } > + > + base = of_iomap(np, 0); > + if (!base) { > + pr_warn("Failed to map address range for efm32gg,cmu node\n"); > + return -EADDRNOTAVAIL; > + } > + > + clk[clk_HFXO] = clk_register_fixed_rate(NULL, "HFXO", NULL, > + CLK_IS_ROOT, 48000000); > + > + clk[clk_HFPERCLKUSART0] = clk_register_gate(NULL, "HFPERCLK.USART0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 0, 0, NULL); > + clk[clk_HFPERCLKUSART1] = clk_register_gate(NULL, "HFPERCLK.USART1", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 1, 0, NULL); > + clk[clk_HFPERCLKUSART2] = clk_register_gate(NULL, "HFPERCLK.USART2", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 2, 0, NULL); > + clk[clk_HFPERCLKUART0] = clk_register_gate(NULL, "HFPERCLK.UART0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 3, 0, NULL); > + clk[clk_HFPERCLKUART1] = clk_register_gate(NULL, "HFPERCLK.UART1", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 4, 0, NULL); > + clk[clk_HFPERCLKTIMER0] = clk_register_gate(NULL, "HFPERCLK.TIMER0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 5, 0, NULL); > + clk[clk_HFPERCLKTIMER1] = clk_register_gate(NULL, "HFPERCLK.TIMER1", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 6, 0, NULL); > + clk[clk_HFPERCLKTIMER2] = clk_register_gate(NULL, "HFPERCLK.TIMER2", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 7, 0, NULL); > + clk[clk_HFPERCLKTIMER3] = clk_register_gate(NULL, "HFPERCLK.TIMER3", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 8, 0, NULL); > + clk[clk_HFPERCLKACMP0] = clk_register_gate(NULL, "HFPERCLK.ACMP0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 9, 0, NULL); > + clk[clk_HFPERCLKACMP1] = clk_register_gate(NULL, "HFPERCLK.ACMP1", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 10, 0, NULL); > + clk[clk_HFPERCLKI2C0] = clk_register_gate(NULL, "HFPERCLK.I2C0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 11, 0, NULL); > + clk[clk_HFPERCLKI2C1] = clk_register_gate(NULL, "HFPERCLK.I2C1", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 12, 0, NULL); > + clk[clk_HFPERCLKGPIO] = clk_register_gate(NULL, "HFPERCLK.GPIO", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 13, 0, NULL); > + clk[clk_HFPERCLKVCMP] = clk_register_gate(NULL, "HFPERCLK.VCMP", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 14, 0, NULL); > + clk[clk_HFPERCLKPRS] = clk_register_gate(NULL, "HFPERCLK.PRS", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 15, 0, NULL); > + clk[clk_HFPERCLKADC0] = clk_register_gate(NULL, "HFPERCLK.ADC0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 16, 0, NULL); > + clk[clk_HFPERCLKDAC0] = clk_register_gate(NULL, "HFPERCLK.DAC0", > + "HFXO", 0, base + CMU_HFPERCLKEN0, 17, 0, NULL); > + > + return of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); > +} > diff --git a/include/dt-bindings/clock/efm32-cmu.h b/include/dt-bindings/clock/efm32-cmu.h > new file mode 100644 > index 0000000..b21b91e > --- /dev/null > +++ b/include/dt-bindings/clock/efm32-cmu.h > @@ -0,0 +1,42 @@ > +#ifndef __DT_BINDINGS_CLOCK_EFM32_CMU_H > +#define __DT_BINDINGS_CLOCK_EFM32_CMU_H > + > +#define clk_HFXO 0 > +#define clk_HFRCO 1 > +#define clk_LFXO 2 > +#define clk_LFRCO 3 > +#define clk_ULFRCO 4 > +#define clk_AUXHFRCO 5 > +#define clk_HFCLKNODIV 6 > +#define clk_HFCLK 7 > +#define clk_HFPERCLK 8 > +#define clk_HFCORECLK 9 > +#define clk_LFACLK 10 > +#define clk_LFBCLK 11 > +#define clk_WDOGCLK 12 > +#define clk_HFCORECLKDMA 13 > +#define clk_HFCORECLKAES 14 > +#define clk_HFCORECLKUSBC 15 > +#define clk_HFCORECLKUSB 16 > +#define clk_HFCORECLKLE 17 > +#define clk_HFCORECLKEBI 18 > +#define clk_HFPERCLKUSART0 19 > +#define clk_HFPERCLKUSART1 20 > +#define clk_HFPERCLKUSART2 21 > +#define clk_HFPERCLKUART0 22 > +#define clk_HFPERCLKUART1 23 > +#define clk_HFPERCLKTIMER0 24 > +#define clk_HFPERCLKTIMER1 25 > +#define clk_HFPERCLKTIMER2 26 > +#define clk_HFPERCLKTIMER3 27 > +#define clk_HFPERCLKACMP0 28 > +#define clk_HFPERCLKACMP1 29 > +#define clk_HFPERCLKI2C0 30 > +#define clk_HFPERCLKI2C1 31 > +#define clk_HFPERCLKGPIO 32 > +#define clk_HFPERCLKVCMP 33 > +#define clk_HFPERCLKPRS 34 > +#define clk_HFPERCLKADC0 35 > +#define clk_HFPERCLKDAC0 36 > + > +#endif /* __DT_BINDINGS_CLOCK_EFM32_CMU_H */ > diff --git a/include/linux/clk/efm32.h b/include/linux/clk/efm32.h > new file mode 100644 > index 0000000..4032dc0 > --- /dev/null > +++ b/include/linux/clk/efm32.h > @@ -0,0 +1,6 @@ > +#ifndef __LINUX_CLK_EFM32_H__ > +#define __LINUX_CLK_EFM32_H__ > + > +int efm32gg_clk_init(void); > + > +#endif /* __LINUX_CLK_EFM32_H__ */ > -- > 1.8.4.rc0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mike Turquette Subject: Re: [PATCH] clk: new driver for efm32 SoC Date: Mon, 07 Oct 2013 14:23:54 -0700 Message-ID: <20131007212354.7445.84276@quantum> References: <1376510693-12491-1-git-send-email-u.kleine-koenig@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1376510693-12491-1-git-send-email-u.kleine-koenig@pengutronix.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= Cc: devicetree@vger.kernel.org, kernel@pengutronix.de, linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org UXVvdGluZyBVd2UgS2xlaW5lLUvDtm5pZyAoMjAxMy0wOC0xNCAxMzowNDo1MykKPiBTaWduZWQt b2ZmLWJ5OiBVd2UgS2xlaW5lLUvDtm5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRl Pgo+IC0tLQo+IEhlbGxvLAo+IAo+IEknbSBub3Qgc3VyZSBpZiB0aGVyZSBpcyBhIG5hbWluZyBj b252ZW50aW9uIGZvciAjZGVmaW5lcyBpbiBoZWFkZXJzIGJlbG93Cj4gZHQtYmluZGluZ3MuIEkg bmFtZWQgbXkgY2xvY2tzIGNsa18kbmFtZWZyb21yZWZlcmVuY2VtYW51YWwgdG8gaGF2ZSBzb21l Cj4gbmFtZXNwYWNpbmcuCj4gCj4gVGhlIGNsb2NrIHN0dWZmIG9uIHRoZSBkaWZmZXJlbnQgdmFy aWFudHMgb2YgZWZtMzIgYXJlIHNpbWlsYXIsIGJ1dAo+IGRpZmZlcmVudCBlbm91Z2ggdG8gbm90 IGJlIGFibGUgdG8gdXNlIHRoZSBzYW1lIGRyaXZlciwgc28gdGhpcyBpcyBvbmx5Cj4gZm9yIHRo ZSBHaWFudCBHZWNrbyAoZWZtMzJnZykgdmFyaWFudCwgc3RpbGwgSSB1c2VkICJlZm0zMiIgaW4g c29tZQo+IHBsYWNlcyBiZWNhdXNlIHRoZSBvdGhlciB2YXJpYW50cyB3b3VsZCBmaXQgdGhlcmUs IHRvby4gKEZvcgo+IGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZWZtMzItY211LmggSSB3b3Vs ZCBuZWVkIHNvbWUgI2lmZGVmcywgaXMgdGhhdAo+IE9LIG9yIHNob3VsZCB0aGUgbmFtZSBvZiB0 aGUgZGVmaW5lcyBpbmNsdWRlIGVmbTMyZ2c/IChUaGF0IHdvdWxkIG1ha2UKPiB0aGUgbmFtZXMg c3RpbGwgbG9uZ2VyIGFuZCBzbyBtb3JlIHVnbHkuKSkKClRoZSBEVCBleHBlcnRzIHNob3VsZCB3 ZWlnaCBpbiBvbiBoYXZpbmcgI2lmZGVmJ3MgaW4gdGhlIGhlYWRlciwgYnV0IEkKdGhpbmsgd2Ug c2hvdWxkIGF2b2lkIHRoYXQuIEJldHRlciB0byBleHBsaWNpdGx5IGxpc3QgdGhlIGNsb2NrcyBm b3IgdGhlCnZhcmlhbnQgdXNlZC4gWW91IGNhbiBhZGQgImdnIiB0byB0aGlzIG9yIG5vdCwgSSBk b24ndCBjYXJlLCBidXQgdGhlCmZ1dHVyZSB2YXJpYW50cyB3aWxsIG5lZWQgc29tZSBzdWZmaXgs IG9yIG1heWJlIHRoZWlyIG93biBoZWFkZXIuCgpJJ20gaGFwcHkgd2l0aCB0aGlzIHBhdGNoIGFu ZCBjYW4gdGFrZSBpdCBmb3IgMy4xMy4gQ2FyZSB0byBhZGQgYQpjaGFuZ2Vsb2c/CgpSZWdhcmRz LApNaWtlCgo+IAo+IEJlc3QgcmVnYXJkcwo+IFV3ZQo+IAo+ICAuLi4vZGV2aWNldHJlZS9iaW5k aW5ncy9jbG9jay9lZm0zMi1jbG9jay50eHQgICAgICB8IDExICsrKwo+ICBkcml2ZXJzL2Nsay9N YWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxICsKPiAgZHJpdmVycy9j bGsvY2xrLWVmbTMyZ2cuYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3OSArKysrKysrKysr KysrKysrKysrKysrCj4gIGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZWZtMzItY211LmggICAg ICAgICAgICAgIHwgNDIgKysrKysrKysrKysrCj4gIGluY2x1ZGUvbGludXgvY2xrL2VmbTMyLmgg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYgKysKPiAgNSBmaWxlcyBjaGFuZ2VkLCAxMzkg aW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9kZXZpY2V0 cmVlL2JpbmRpbmdzL2Nsb2NrL2VmbTMyLWNsb2NrLnR4dAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9jbGsvY2xrLWVmbTMyZ2cuYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9k dC1iaW5kaW5ncy9jbG9jay9lZm0zMi1jbXUuaAo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVk ZS9saW51eC9jbGsvZWZtMzIuaAo+IAo+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldmlj ZXRyZWUvYmluZGluZ3MvY2xvY2svZWZtMzItY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZp Y2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2VmbTMyLWNsb2NrLnR4dAo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMC4uMjYzZDI5Mwo+IC0tLSAvZGV2L251bGwKPiArKysgYi9Eb2N1 bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZWZtMzItY2xvY2sudHh0Cj4gQEAg LTAsMCArMSwxMSBAQAo+ICsqIENsb2NrIGJpbmRpbmdzIGZvciBFbmVyZ3kgTWljcm8gZWZtMzIg R2lhbnQgR2Vja28ncyBDbG9jayBNYW5hZ2VtZW50IFVuaXQKPiArCj4gK1JlcXVpcmVkIHByb3Bl cnRpZXM6Cj4gKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJlZm0zMmdnLGNtdSIKPiArLSByZWc6 IEJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQKPiArLSBpbnRlcnJ1 cHRzOiBJbnRlcnJ1cHQgdXNlZCBieSB0aGUgQ01VCj4gKy0gI2Nsb2NrLWNlbGxzOiBTaG91bGQg YmUgPDE+Cj4gKwo+ICtUaGUgY2xvY2sgY29uc3VtZXIgc2hvdWxkIHNwZWNpZnkgdGhlIGRlc2ly ZWQgY2xvY2sgYnkgaGF2aW5nIHRoZSBjbG9jayBJRCBpbgo+ICtpdHMgImNsb2NrcyIgcGhhbmRs ZSBjZWxsLiBUaGUgaGVhZGVyIGVmbTMyLWNsay5oIGNvbnRhaW5zIGEgbGlzdCBvZiBhdmFpbGFi bGUKPiArSURzLgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9NYWtlZmlsZSBiL2RyaXZlcnMv Y2xrL01ha2VmaWxlCj4gaW5kZXggNDAzOGMyYi4uOTlkOWFkMCAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL2Nsay9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvY2xrL01ha2VmaWxlCj4gQEAgLTExLDYg KzExLDcgQEAgb2JqLSQoQ09ORklHX0NPTU1PTl9DTEspICAgICAgKz0gY2xrLWNvbXBvc2l0ZS5v Cj4gIAo+ICAjIFNvQ3Mgc3BlY2lmaWMKPiAgb2JqLSQoQ09ORklHX0FSQ0hfQkNNMjgzNSkgICAg ICs9IGNsay1iY20yODM1Lm8KPiArb2JqLSQoQ09ORklHX0FSQ0hfRUZNMzIpICAgICAgICs9IGNs ay1lZm0zMmdnLm8KPiAgb2JqLSQoQ09ORklHX0FSQ0hfTk9NQURJSykgICAgICs9IGNsay1ub21h ZGlrLm8KPiAgb2JqLSQoQ09ORklHX0FSQ0hfSElHSEJBTkspICAgICs9IGNsay1oaWdoYmFuay5v Cj4gIG9iai0kKENPTkZJR19BUkNIX05TUElSRSkgICAgICArPSBjbGstbnNwaXJlLm8KPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWVmbTMyZ2cuYyBiL2RyaXZlcnMvY2xrL2Nsay1lZm0z MmdnLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjJlNjM1ODQKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9jbGsvY2xrLWVmbTMyZ2cuYwo+IEBAIC0wLDAg KzEsNzkgQEAKPiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW8u aD4KPiArI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgo+ICsjaW5jbHVkZSA8bGludXgv b2YuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KPiArCj4gKyNpbmNsdWRlIDxk dC1iaW5kaW5ncy9jbG9jay9lZm0zMi1jbXUuaD4KPiArCj4gKyNkZWZpbmUgQ01VX0hGUEVSQ0xL RU4wICAgICAgICAgICAgICAgIDB4NDQKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtbMzdd Owo+ICtzdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGEgPSB7Cj4gKyAgICAg ICAuY2xrcyA9IGNsaywKPiArICAgICAgIC5jbGtfbnVtID0gQVJSQVlfU0laRShjbGspLAo+ICt9 Owo+ICsKPiAraW50IF9faW5pdCBlZm0zMmdnX2Nsa19pbml0KHZvaWQpCj4gK3sKPiArICAgICAg IGludCBpOwo+ICsgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucDsKPiArICAgICAgIHZvaWQg X19pb21lbSAqYmFzZTsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShj bGspOyArK2kpCj4gKyAgICAgICAgICAgICAgIGNsa1tpXSA9IEVSUl9QVFIoLUVOT0VOVCk7Cj4g Kwo+ICsgICAgICAgbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZWZt MzJnZyxjbXUiKTsKPiArICAgICAgIGlmICghbnApIHsKPiArICAgICAgICAgICAgICAgcHJfd2Fy bigiTm8gZWZtMzJnZyxjbXUgbm9kZSBmb3VuZCBpbiBkZXZpY2UgdHJlZVxuIik7Cj4gKyAgICAg ICAgICAgICAgIHJldHVybiAtRU5PRU5UOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIGJhc2Ug PSBvZl9pb21hcChucCwgMCk7Cj4gKyAgICAgICBpZiAoIWJhc2UpIHsKPiArICAgICAgICAgICAg ICAgcHJfd2FybigiRmFpbGVkIHRvIG1hcCBhZGRyZXNzIHJhbmdlIGZvciBlZm0zMmdnLGNtdSBu b2RlXG4iKTsKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FQUREUk5PVEFWQUlMOwo+ICsgICAg ICAgfQo+ICsKPiArICAgICAgIGNsa1tjbGtfSEZYT10gPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0 ZShOVUxMLCAiSEZYTyIsIE5VTEwsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgQ0xLX0lTX1JP T1QsIDQ4MDAwMDAwKTsKPiArCj4gKyAgICAgICBjbGtbY2xrX0hGUEVSQ0xLVVNBUlQwXSA9IGNs a19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDAiLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMCwgMCwgTlVMTCk7 Cj4gKyAgICAgICBjbGtbY2xrX0hGUEVSQ0xLVVNBUlQxXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5V TEwsICJIRlBFUkNMSy5VU0FSVDEiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICJIRlhPIiwg MCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMSwgMCwgTlVMTCk7Cj4gKyAgICAgICBjbGtbY2xr X0hGUEVSQ0xLVVNBUlQyXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FS VDIiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBF UkNMS0VOMCwgMiwgMCwgTlVMTCk7Cj4gKyAgICAgICBjbGtbY2xrX0hGUEVSQ0xLVUFSVDBdID0g Y2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVBUlQwIiwKPiArICAgICAgICAgICAg ICAgICAgICAgICAiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDMsIDAsIE5VTEwp Owo+ICsgICAgICAgY2xrW2Nsa19IRlBFUkNMS1VBUlQxXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5V TEwsICJIRlBFUkNMSy5VQVJUMSIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkhGWE8iLCAw LCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA0LCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tjbGtf SEZQRVJDTEtUSU1FUjBdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVS MCIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVS Q0xLRU4wLCA1LCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tjbGtfSEZQRVJDTEtUSU1FUjFdID0g Y2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMSIsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA2LCAwLCBOVUxM KTsKPiArICAgICAgIGNsa1tjbGtfSEZQRVJDTEtUSU1FUjJdID0gY2xrX3JlZ2lzdGVyX2dhdGUo TlVMTCwgIkhGUEVSQ0xLLlRJTUVSMiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkhGWE8i LCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA3LCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tj bGtfSEZQRVJDTEtUSU1FUjNdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJ TUVSMyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hG UEVSQ0xLRU4wLCA4LCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tjbGtfSEZQRVJDTEtBQ01QMF0g PSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQUNNUDAiLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgOSwgMCwgTlVM TCk7Cj4gKyAgICAgICBjbGtbY2xrX0hGUEVSQ0xLQUNNUDFdID0gY2xrX3JlZ2lzdGVyX2dhdGUo TlVMTCwgIkhGUEVSQ0xLLkFDTVAxIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAiSEZYTyIs IDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEwLCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tj bGtfSEZQRVJDTEtJMkMwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5JMkMw IiwKPiArICAgICAgICAgICAgICAgICAgICAgICAiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJD TEtFTjAsIDExLCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tjbGtfSEZQRVJDTEtJMkMxXSA9IGNs a19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5JMkMxIiwKPiArICAgICAgICAgICAgICAg ICAgICAgICAiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEyLCAwLCBOVUxMKTsK PiArICAgICAgIGNsa1tjbGtfSEZQRVJDTEtHUElPXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEws ICJIRlBFUkNMSy5HUElPIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAiSEZYTyIsIDAsIGJh c2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEzLCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tjbGtfSEZQ RVJDTEtWQ01QXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5WQ01QIiwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAs IDE0LCAwLCBOVUxMKTsKPiArICAgICAgIGNsa1tjbGtfSEZQRVJDTEtQUlNdID0gY2xrX3JlZ2lz dGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlBSUyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg IkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxNSwgMCwgTlVMTCk7Cj4gKyAgICAg ICBjbGtbY2xrX0hGUEVSQ0xLQURDMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJD TEsuQURDMCIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkhGWE8iLCAwLCBiYXNlICsgQ01V X0hGUEVSQ0xLRU4wLCAxNiwgMCwgTlVMTCk7Cj4gKyAgICAgICBjbGtbY2xrX0hGUEVSQ0xLREFD MF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuREFDMCIsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxNywgMCwg TlVMTCk7Cj4gKwo+ICsgICAgICAgcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Ns a19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9kdC1iaW5kaW5ncy9jbG9jay9lZm0zMi1jbXUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xv Y2svZWZtMzItY211LmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmIy MWI5MWUKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9l Zm0zMi1jbXUuaAo+IEBAIC0wLDAgKzEsNDIgQEAKPiArI2lmbmRlZiBfX0RUX0JJTkRJTkdTX0NM T0NLX0VGTTMyX0NNVV9ICj4gKyNkZWZpbmUgX19EVF9CSU5ESU5HU19DTE9DS19FRk0zMl9DTVVf SAo+ICsKPiArI2RlZmluZSBjbGtfSEZYTyAgICAgICAgICAgICAgIDAKPiArI2RlZmluZSBjbGtf SEZSQ08gICAgICAgICAgICAgIDEKPiArI2RlZmluZSBjbGtfTEZYTyAgICAgICAgICAgICAgIDIK PiArI2RlZmluZSBjbGtfTEZSQ08gICAgICAgICAgICAgIDMKPiArI2RlZmluZSBjbGtfVUxGUkNP ICAgICAgICAgICAgIDQKPiArI2RlZmluZSBjbGtfQVVYSEZSQ08gICAgICAgICAgIDUKPiArI2Rl ZmluZSBjbGtfSEZDTEtOT0RJViAgICAgICAgIDYKPiArI2RlZmluZSBjbGtfSEZDTEsgICAgICAg ICAgICAgIDcKPiArI2RlZmluZSBjbGtfSEZQRVJDTEsgICAgICAgICAgIDgKPiArI2RlZmluZSBj bGtfSEZDT1JFQ0xLICAgICAgICAgIDkKPiArI2RlZmluZSBjbGtfTEZBQ0xLICAgICAgICAgICAg IDEwCj4gKyNkZWZpbmUgY2xrX0xGQkNMSyAgICAgICAgICAgICAxMQo+ICsjZGVmaW5lIGNsa19X RE9HQ0xLICAgICAgICAgICAgMTIKPiArI2RlZmluZSBjbGtfSEZDT1JFQ0xLRE1BICAgICAgIDEz Cj4gKyNkZWZpbmUgY2xrX0hGQ09SRUNMS0FFUyAgICAgICAxNAo+ICsjZGVmaW5lIGNsa19IRkNP UkVDTEtVU0JDICAgICAgMTUKPiArI2RlZmluZSBjbGtfSEZDT1JFQ0xLVVNCICAgICAgIDE2Cj4g KyNkZWZpbmUgY2xrX0hGQ09SRUNMS0xFICAgICAgICAgICAgICAgIDE3Cj4gKyNkZWZpbmUgY2xr X0hGQ09SRUNMS0VCSSAgICAgICAxOAo+ICsjZGVmaW5lIGNsa19IRlBFUkNMS1VTQVJUMCAgICAg MTkKPiArI2RlZmluZSBjbGtfSEZQRVJDTEtVU0FSVDEgICAgIDIwCj4gKyNkZWZpbmUgY2xrX0hG UEVSQ0xLVVNBUlQyICAgICAyMQo+ICsjZGVmaW5lIGNsa19IRlBFUkNMS1VBUlQwICAgICAgMjIK PiArI2RlZmluZSBjbGtfSEZQRVJDTEtVQVJUMSAgICAgIDIzCj4gKyNkZWZpbmUgY2xrX0hGUEVS Q0xLVElNRVIwICAgICAyNAo+ICsjZGVmaW5lIGNsa19IRlBFUkNMS1RJTUVSMSAgICAgMjUKPiAr I2RlZmluZSBjbGtfSEZQRVJDTEtUSU1FUjIgICAgIDI2Cj4gKyNkZWZpbmUgY2xrX0hGUEVSQ0xL VElNRVIzICAgICAyNwo+ICsjZGVmaW5lIGNsa19IRlBFUkNMS0FDTVAwICAgICAgMjgKPiArI2Rl ZmluZSBjbGtfSEZQRVJDTEtBQ01QMSAgICAgIDI5Cj4gKyNkZWZpbmUgY2xrX0hGUEVSQ0xLSTJD MCAgICAgICAzMAo+ICsjZGVmaW5lIGNsa19IRlBFUkNMS0kyQzEgICAgICAgMzEKPiArI2RlZmlu ZSBjbGtfSEZQRVJDTEtHUElPICAgICAgIDMyCj4gKyNkZWZpbmUgY2xrX0hGUEVSQ0xLVkNNUCAg ICAgICAzMwo+ICsjZGVmaW5lIGNsa19IRlBFUkNMS1BSUyAgICAgICAgICAgICAgICAzNAo+ICsj ZGVmaW5lIGNsa19IRlBFUkNMS0FEQzAgICAgICAgMzUKPiArI2RlZmluZSBjbGtfSEZQRVJDTEtE QUMwICAgICAgIDM2Cj4gKwo+ICsjZW5kaWYgLyogX19EVF9CSU5ESU5HU19DTE9DS19FRk0zMl9D TVVfSCAqLwo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsay9lZm0zMi5oIGIvaW5jbHVk ZS9saW51eC9jbGsvZWZtMzIuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MC4uNDAzMmRjMAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9pbmNsdWRlL2xpbnV4L2Nsay9lZm0z Mi5oCj4gQEAgLTAsMCArMSw2IEBACj4gKyNpZm5kZWYgX19MSU5VWF9DTEtfRUZNMzJfSF9fCj4g KyNkZWZpbmUgX19MSU5VWF9DTEtfRUZNMzJfSF9fCj4gKwo+ICtpbnQgZWZtMzJnZ19jbGtfaW5p dCh2b2lkKTsKPiArCj4gKyNlbmRpZiAvKiBfX0xJTlVYX0NMS19FRk0zMl9IX18gKi8KPiAtLSAK PiAxLjguNC5yYzAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK