From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-4103974-1521377797-2-13170299737455087264 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, ME_NOAUTH 0.01, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES enro, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='CN', FromHeader='org', MailFrom='org' X-Spam-charsets: plain='us-ascii' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: linux-usb-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1521377797; b=WhBJviilL9dN09txKneKtE9nL7MmmU1dZ1zTFTsXxGr1Vyu mLepuS1u4gY9Ku6l8kSAh/vV/Itro3hB3u1wyI8ZnqXG/b2+fl4oszM4/If6deYY UeQwmJzIS5OoZNzDCwC7Q6G7ah+GUkVfKZQECYZpiSsC57MMN1AyTJnQVEHnuiMO T0E37JOPjhzMIYDG3UIPU0aOz5WAROvtSBUqxbh+/6rU9LZTgLBZ89BcfcCvoTJk spqYIdWg85lBMayYSFlxmWPUoLJoUs0wc6NO/gdDviAp/vvz7urJZu10jQc/A2Mc KOGqrH3zPvP0vqCkfLbREDtbMN4HRLubNK87vuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=date:from:to:cc:subject:message-id :references:mime-version:content-type:in-reply-to:sender :list-id; s=arctest; t=1521377797; bh=YTpplPsuixX4hDTz/9tfCTmSWK s9heQDjxIA7pGyfx0=; b=Z4gWLYlS23xIq4Mi2+J1DXsvWmChUKYEIu9XTzMqbW vtfUH95ucPqzfRJuS50bZeWCi8CWvlgADUK0Ei4wVdh8XioJVkwOKMYvo5ChVP4/ nbDXMDYExHdljQzLHgdwwMIUuKWOtUXfidtTqsvSRMxKrhhi6P5HrM78VmDwMFiw zdDEfe24HTfLf4dY6nspumrvtIh6Gn35LzBLJhWI0AX5bqaUXu0G0qCEuWjedE+M 8Wb2ShhXUu0SyvQmkVZiAOCFQjz8/QDFBxKUmtpe28kZriF4ubOd9QaWbi8IKl2r Na0OoimU6nuYVtL26vtLBQniIY3WmXUEyrNJ2KXvpyvg== ARC-Authentication-Results: i=1; mx5.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-usb-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=orgdomain_pass; x-category=clean score=-100 state=0; x-google-dkim=fail (body has been altered; 2048-bit rsa key) header.d=1e100.net header.i=@1e100.net header.b=iaUQm9Z3; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=kernel.org header.result=pass header_is_org_domain=yes Authentication-Results: mx5.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=linux-usb-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=orgdomain_pass; x-category=clean score=-100 state=0; x-google-dkim=fail (body has been altered; 2048-bit rsa key) header.d=1e100.net header.i=@1e100.net header.b=iaUQm9Z3; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=kernel.org header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754512AbeCRMwT (ORCPT ); Sun, 18 Mar 2018 08:52:19 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:42883 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754505AbeCRMwM (ORCPT ); Sun, 18 Mar 2018 08:52:12 -0400 X-Google-Smtp-Source: AG47ELuKs9L3VAdPPbz4NSEiy5GBsl9N09Kdjqe5lxEm1O+aaEuGLt1zkchfS3jLQ/KmhN+EK1I1Eg== Date: Sun, 18 Mar 2018 07:52:09 -0500 From: Rob Herring To: Masahiro Yamada Cc: Felipe Balbi , linux-usb@vger.kernel.org, Masami Hiramatsu , Jassi Brar , Kunihiko Hayashi , devicetree@vger.kernel.org, Felipe Balbi , linux-kernel@vger.kernel.org, Greg Kroah-Hartman , Mark Rutland Subject: Re: [PATCH 2/2] usb: dwc3: add clock and resets Message-ID: <20180318125209.juoa3gkgdv2djciw@rob-hp-laptop> References: <1521113998-25052-1-git-send-email-yamada.masahiro@socionext.com> <1521113998-25052-2-git-send-email-yamada.masahiro@socionext.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1521113998-25052-2-git-send-email-yamada.masahiro@socionext.com> User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-usb-owner@vger.kernel.org X-Mailing-List: linux-usb@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: On Thu, Mar 15, 2018 at 08:39:58PM +0900, Masahiro Yamada wrote: > dwc3-of-simple.c only handles arbitrary number of clocks and resets. > They are both generic enough to be put into the dwc3 core. For simple > cases, a nested node structure like follows: > > dwc3-glue { > compatible = "foo,dwc3"; > clocks = ...; > resets = ...; > ... > > dwc3 { > compatible = "snps,dwc3"; > ... > }; I'm not a fan of how this was done. > } > > would be turned into a single node: > > dwc3 { > compatible = "foo,dwc3", "snps,dwc3"; > clocks = ...; > resets = ...; > ... > } And yes, this is what I'd prefer. > > I inserted reset_control_deassert() and clk_enable() before the first > register access, i.e. dwc3_cache_hwparams(). > > Signed-off-by: Masahiro Yamada > --- > > Documentation/devicetree/bindings/usb/dwc3.txt | 2 + > drivers/usb/dwc3/core.c | 127 ++++++++++++++++++++++++- > drivers/usb/dwc3/core.h | 5 + > 3 files changed, 132 insertions(+), 2 deletions(-) > > diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt > index 44e8bab..67e9cfb 100644 > --- a/Documentation/devicetree/bindings/usb/dwc3.txt > +++ b/Documentation/devicetree/bindings/usb/dwc3.txt > @@ -9,12 +9,14 @@ Required properties: > - interrupts: Interrupts used by the dwc3 controller. > > Optional properties: > + - clocks: list of phandle and clock specifier pairs However, this should be specific as to how many clocks and their function. This should be readily available to someone with access to Synopsys datasheet. The number of clocks should generally be the same across SoCs, it is just some SoCs either tie clocks together or don't provide s/w control of some of the clocks. > - usb-phy : array of phandle for the PHY device. The first element > in the array is expected to be a handle to the USB2/HS PHY and > the second element is expected to be a handle to the USB3/SS PHY > - phys: from the *Generic PHY* bindings > - phy-names: from the *Generic PHY* bindings; supported names are "usb2-phy" > or "usb3-phy". > + - resets: list of phandle and reset specifier pairs ditto > - snps,usb3_lpm_capable: determines if platform is USB3 LPM capable > - snps,disable_scramble_quirk: true when SW should disable data scrambling. > Only really useful for FPGA builds. > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index e9083a3..f17e4a9 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -8,6 +8,7 @@ > * Sebastian Andrzej Siewior > */ > > +#include > #include > #include > #include > @@ -24,6 +25,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -240,6 +242,74 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc) > return -ETIMEDOUT; > } > > +static int dwc3_core_get_clks(struct dwc3 *dwc) > +{ > + struct device *dev = dwc->dev; > + struct device_node *node = dev->of_node; > + struct clk *clk; > + int num_clks, i; > + > + num_clks = of_count_phandle_with_args(node, "clocks", "#clock-cells"); > + if (num_clks <= 0) > + return 0; > + > + dwc->num_clks = num_clks; > + > + dwc->clks = devm_kcalloc(dev, num_clks, sizeof(*dwc->clks), GFP_KERNEL); > + if (!dwc->clks) > + return -ENOMEM; > + > + for (i = 0; i < num_clks; i++) { > + clk = of_clk_get(node, i); > + if (IS_ERR(clk)) > + goto put_clks; > + dwc->clks[i] = clk; > + } > + > + return 0; > + > +put_clks: > + while (--i >= 0) > + clk_put(dwc->clks[i]); > + > + return PTR_ERR(clk); > +} > + > +static void dwc3_core_put_clks(struct dwc3 *dwc) > +{ > + int i; > + > + for (i = dwc->num_clks - 1; i >= 0; i--) > + clk_put(dwc->clks[i]); > +} > + > +static int dwc3_core_enable_clks(struct dwc3 *dwc) > +{ > + int ret, i; > + > + for (i = 0; i < dwc->num_clks; i++) { > + ret = clk_prepare_enable(dwc->clks[i]); > + if (ret) > + goto disable_clks; > + } > + > + return 0; > + > +disable_clks: > + while (--i >= 0) > + clk_disable_unprepare(dwc->clks[i]); > + > + return ret; > +} > + > +static void dwc3_core_disable_clks(struct dwc3 *dwc) > +{ > + int i; > + > + for (i = dwc->num_clks - 1; i >= 0; i--) > + clk_disable_unprepare(dwc->clks[i]); > +} > + > /* > * dwc3_frame_length_adjustment - Adjusts frame length if required > * @dwc3: Pointer to our controller context structure > @@ -641,6 +711,8 @@ static void dwc3_core_exit(struct dwc3 *dwc) > usb_phy_set_suspend(dwc->usb3_phy, 1); > phy_power_off(dwc->usb2_generic_phy); > phy_power_off(dwc->usb3_generic_phy); > + dwc3_core_disable_clks(dwc); > + reset_control_assert(dwc->resets); > } > > static bool dwc3_core_is_valid(struct dwc3 *dwc) > @@ -1205,6 +1277,22 @@ static int dwc3_probe(struct platform_device *pdev) > > dwc3_get_properties(dwc); > > + dwc->resets = devm_reset_control_array_get_optional_shared(dev); > + if (IS_ERR(dwc->resets)) > + return PTR_ERR(dwc->resets); > + > + ret = dwc3_core_get_clks(dwc); > + if (ret) > + return ret; > + > + ret = reset_control_deassert(dwc->resets); > + if (ret) > + goto put_clks; > + > + ret = dwc3_core_enable_clks(dwc); > + if (ret) > + goto assert_resets; > + > platform_set_drvdata(pdev, dwc); > dwc3_cache_hwparams(dwc); > > @@ -1268,6 +1356,14 @@ static int dwc3_probe(struct platform_device *pdev) > pm_runtime_put_sync(&pdev->dev); > pm_runtime_disable(&pdev->dev); > > + dwc3_core_disable_clks(dwc); > + > +assert_resets: > + reset_control_assert(dwc->resets); > + > +put_clks: > + dwc3_core_put_clks(dwc); > + > return ret; > } > > @@ -1289,11 +1385,38 @@ static int dwc3_remove(struct platform_device *pdev) > > dwc3_free_event_buffers(dwc); > dwc3_free_scratch_buffers(dwc); > + dwc3_core_put_clks(dwc); > > return 0; > } > > #ifdef CONFIG_PM > +static int dwc3_core_init_for_resume(struct dwc3 *dwc) > +{ > + int ret; > + > + ret = reset_control_deassert(dwc->resets); > + if (ret) > + return ret; > + > + ret = dwc3_core_enable_clks(dwc); > + if (ret) > + goto assert_resets; > + > + ret = dwc3_core_init(dwc); > + if (ret) > + goto disable_clks; > + > + return 0; > + > +disable_clks: > + dwc3_core_disable_clks(dwc); > +assert_resets: > + reset_control_assert(dwc->resets); > + > + return ret; > +} > + > static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) > { > unsigned long flags; > @@ -1325,7 +1448,7 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg) > > switch (dwc->current_dr_role) { > case DWC3_GCTL_PRTCAP_DEVICE: > - ret = dwc3_core_init(dwc); > + ret = dwc3_core_init_for_resume(dwc); > if (ret) > return ret; > > @@ -1336,7 +1459,7 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg) > case DWC3_GCTL_PRTCAP_HOST: > /* nothing to do on host runtime_resume */ > if (!PMSG_IS_AUTO(msg)) { > - ret = dwc3_core_init(dwc); > + ret = dwc3_core_init_for_resume(dwc); > if (ret) > return ret; > } > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index 860d2bc..14cd335 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -891,6 +891,11 @@ struct dwc3 { > struct usb_gadget gadget; > struct usb_gadget_driver *gadget_driver; > > + struct clk **clks; > + int num_clks; > + > + struct reset_control *resets; > + > struct usb_phy *usb2_phy; > struct usb_phy *usb3_phy; > > -- > 2.7.4 > From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [2/2] usb: dwc3: add clock and resets From: Rob Herring Message-Id: <20180318125209.juoa3gkgdv2djciw@rob-hp-laptop> Date: Sun, 18 Mar 2018 07:52:09 -0500 To: Masahiro Yamada Cc: Felipe Balbi , linux-usb@vger.kernel.org, Masami Hiramatsu , Jassi Brar , Kunihiko Hayashi , devicetree@vger.kernel.org, Felipe Balbi , linux-kernel@vger.kernel.org, Greg Kroah-Hartman , Mark Rutland List-ID: T24gVGh1LCBNYXIgMTUsIDIwMTggYXQgMDg6Mzk6NThQTSArMDkwMCwgTWFzYWhpcm8gWWFtYWRh IHdyb3RlOgo+IGR3YzMtb2Ytc2ltcGxlLmMgb25seSBoYW5kbGVzIGFyYml0cmFyeSBudW1iZXIg b2YgY2xvY2tzIGFuZCByZXNldHMuCj4gVGhleSBhcmUgYm90aCBnZW5lcmljIGVub3VnaCB0byBi ZSBwdXQgaW50byB0aGUgZHdjMyBjb3JlLiAgRm9yIHNpbXBsZQo+IGNhc2VzLCBhIG5lc3RlZCBu b2RlIHN0cnVjdHVyZSBsaWtlIGZvbGxvd3M6Cj4gCj4gICBkd2MzLWdsdWUgewo+ICAgICAgICAg ICBjb21wYXRpYmxlID0gImZvbyxkd2MzIjsKPiAgICAgICAgICAgY2xvY2tzID0gLi4uOwo+ICAg ICAgICAgICByZXNldHMgPSAuLi47Cj4gICAgICAgICAgIC4uLgo+IAo+ICAgICAgICAgICBkd2Mz IHsKPiAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInNucHMsZHdjMyI7Cj4gICAgICAg ICAgICAgICAgICAgLi4uCj4gICAgICAgICAgIH07CgpJJ20gbm90IGEgZmFuIG9mIGhvdyB0aGlz IHdhcyBkb25lLgoKCj4gICB9Cj4gCj4gd291bGQgYmUgdHVybmVkIGludG8gYSBzaW5nbGUgbm9k ZToKPiAKPiAgIGR3YzMgewo+ICAgICAgICAgICBjb21wYXRpYmxlID0gImZvbyxkd2MzIiwgInNu cHMsZHdjMyI7Cj4gICAgICAgICAgIGNsb2NrcyA9IC4uLjsKPiAgICAgICAgICAgcmVzZXRzID0g Li4uOwo+ICAgICAgICAgICAuLi4KPiAgIH0KCkFuZCB5ZXMsIHRoaXMgaXMgd2hhdCBJJ2QgcHJl ZmVyLgoKPiAKPiBJIGluc2VydGVkIHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoKSBhbmQgY2xrX2Vu YWJsZSgpIGJlZm9yZSB0aGUgZmlyc3QKPiByZWdpc3RlciBhY2Nlc3MsIGkuZS4gZHdjM19jYWNo ZV9od3BhcmFtcygpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRh Lm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+Cj4gLS0tCj4gCj4gIERvY3VtZW50YXRpb24vZGV2aWNl dHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQgfCAgIDIgKwo+ICBkcml2ZXJzL3VzYi9kd2MzL2Nv cmUuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgMTI3ICsrKysrKysrKysrKysrKysrKysrKysr Ky0KPiAgZHJpdmVycy91c2IvZHdjMy9jb3JlLmggICAgICAgICAgICAgICAgICAgICAgICB8ICAg NSArCj4gIDMgZmlsZXMgY2hhbmdlZCwgMTMyIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0p Cj4gCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Iv ZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0 Cj4gaW5kZXggNDRlOGJhYi4uNjdlOWNmYiAxMDA2NDQKPiAtLS0gYS9Eb2N1bWVudGF0aW9uL2Rl dmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0Cj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZp Y2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dAo+IEBAIC05LDEyICs5LDE0IEBAIFJlcXVpcmVk IHByb3BlcnRpZXM6Cj4gICAtIGludGVycnVwdHM6IEludGVycnVwdHMgdXNlZCBieSB0aGUgZHdj MyBjb250cm9sbGVyLgo+ICAKPiAgT3B0aW9uYWwgcHJvcGVydGllczoKPiArIC0gY2xvY2tzOiBs aXN0IG9mIHBoYW5kbGUgYW5kIGNsb2NrIHNwZWNpZmllciBwYWlycwoKSG93ZXZlciwgdGhpcyBz aG91bGQgYmUgc3BlY2lmaWMgYXMgdG8gaG93IG1hbnkgY2xvY2tzIGFuZCB0aGVpciAKZnVuY3Rp b24uIFRoaXMgc2hvdWxkIGJlIHJlYWRpbHkgYXZhaWxhYmxlIHRvIHNvbWVvbmUgd2l0aCBhY2Nl c3MgdG8gClN5bm9wc3lzIGRhdGFzaGVldC4gVGhlIG51bWJlciBvZiBjbG9ja3Mgc2hvdWxkIGdl bmVyYWxseSBiZSB0aGUgc2FtZSAKYWNyb3NzIFNvQ3MsIGl0IGlzIGp1c3Qgc29tZSBTb0NzIGVp dGhlciB0aWUgY2xvY2tzIHRvZ2V0aGVyIG9yIGRvbid0IApwcm92aWRlIHMvdyBjb250cm9sIG9m IHNvbWUgb2YgdGhlIGNsb2Nrcy4KCj4gICAtIHVzYi1waHkgOiBhcnJheSBvZiBwaGFuZGxlIGZv ciB0aGUgUEhZIGRldmljZS4gIFRoZSBmaXJzdCBlbGVtZW50Cj4gICAgIGluIHRoZSBhcnJheSBp cyBleHBlY3RlZCB0byBiZSBhIGhhbmRsZSB0byB0aGUgVVNCMi9IUyBQSFkgYW5kCj4gICAgIHRo ZSBzZWNvbmQgZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGhhbmRsZSB0byB0aGUgVVNCMy9T UyBQSFkKPiAgIC0gcGh5czogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncwo+ICAgLSBw aHktbmFtZXM6IGZyb20gdGhlICpHZW5lcmljIFBIWSogYmluZGluZ3M7IHN1cHBvcnRlZCBuYW1l cyBhcmUgInVzYjItcGh5Igo+ICAJb3IgInVzYjMtcGh5Ii4KPiArIC0gcmVzZXRzOiBsaXN0IG9m IHBoYW5kbGUgYW5kIHJlc2V0IHNwZWNpZmllciBwYWlycwoKZGl0dG8KCj4gICAtIHNucHMsdXNi M19scG1fY2FwYWJsZTogZGV0ZXJtaW5lcyBpZiBwbGF0Zm9ybSBpcyBVU0IzIExQTSBjYXBhYmxl Cj4gICAtIHNucHMsZGlzYWJsZV9zY3JhbWJsZV9xdWlyazogdHJ1ZSB3aGVuIFNXIHNob3VsZCBk aXNhYmxlIGRhdGEgc2NyYW1ibGluZy4KPiAgCU9ubHkgcmVhbGx5IHVzZWZ1bCBmb3IgRlBHQSBi dWlsZHMuCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jIGIvZHJpdmVycy91 c2IvZHdjMy9jb3JlLmMKPiBpbmRleCBlOTA4M2EzLi5mMTdlNGE5IDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvdXNiL2R3YzMvY29yZS5jCj4gKysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKPiBA QCAtOCw2ICs4LDcgQEAKPiAgICoJICAgIFNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vh c3lAbGludXRyb25peC5kZT4KPiAgICovCj4gIAo+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4g ICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K PiAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+IEBAIC0yNCw2ICsyNSw3IEBACj4gICNpbmNs dWRlIDxsaW51eC9vZi5oPgo+ICAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgo+ICAjaW5jbHVkZSA8 bGludXgvcGluY3RybC9jb25zdW1lci5oPgo+ICsjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KPiAg Cj4gICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC91c2IvZ2Fk Z2V0Lmg+Cj4gQEAgLTI0MCw2ICsyNDIsNzQgQEAgc3RhdGljIGludCBkd2MzX2NvcmVfc29mdF9y ZXNldChzdHJ1Y3QgZHdjMyAqZHdjKQo+ICAJcmV0dXJuIC1FVElNRURPVVQ7Cj4gIH0KPiAgCj4g K3N0YXRpYyBpbnQgZHdjM19jb3JlX2dldF9jbGtzKHN0cnVjdCBkd2MzICpkd2MpCj4gK3sKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9IGR3Yy0+ZGV2Owo+ICsJc3RydWN0IGRldmljZV9ub2RlICpu b2RlID0gZGV2LT5vZl9ub2RlOwo+ICsJc3RydWN0IGNsayAqY2xrOwo+ICsJaW50IG51bV9jbGtz LCBpOwo+ICsKPiArCW51bV9jbGtzID0gb2ZfY291bnRfcGhhbmRsZV93aXRoX2FyZ3Mobm9kZSwg ImNsb2NrcyIsICIjY2xvY2stY2VsbHMiKTsKPiArCWlmIChudW1fY2xrcyA8PSAwKQo+ICsJCXJl dHVybiAwOwo+ICsKPiArCWR3Yy0+bnVtX2Nsa3MgPSBudW1fY2xrczsKPiArCj4gKwlkd2MtPmNs a3MgPSBkZXZtX2tjYWxsb2MoZGV2LCBudW1fY2xrcywgc2l6ZW9mKCpkd2MtPmNsa3MpLCBHRlBf S0VSTkVMKTsKPiArCWlmICghZHdjLT5jbGtzKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiAr CWZvciAoaSA9IDA7IGkgPCBudW1fY2xrczsgaSsrKSB7Cj4gKwkJY2xrID0gb2ZfY2xrX2dldChu b2RlLCBpKTsKPiArCQlpZiAoSVNfRVJSKGNsaykpCj4gKwkJCWdvdG8gcHV0X2Nsa3M7Cj4gKwkJ ZHdjLT5jbGtzW2ldID0gY2xrOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArcHV0X2Ns a3M6Cj4gKwl3aGlsZSAoLS1pID49IDApCj4gKwkJY2xrX3B1dChkd2MtPmNsa3NbaV0pOwo+ICsK PiArCXJldHVybiBQVFJfRVJSKGNsayk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGR3YzNfY29y ZV9wdXRfY2xrcyhzdHJ1Y3QgZHdjMyAqZHdjKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3Ig KGkgPSBkd2MtPm51bV9jbGtzIC0gMTsgaSA+PSAwOyBpLS0pCj4gKwkJY2xrX3B1dChkd2MtPmNs a3NbaV0pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGR3YzNfY29yZV9lbmFibGVfY2xrcyhzdHJ1 Y3QgZHdjMyAqZHdjKQo+ICt7Cj4gKwlpbnQgcmV0LCBpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkg PCBkd2MtPm51bV9jbGtzOyBpKyspIHsKPiArCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHdj LT5jbGtzW2ldKTsKPiArCQlpZiAocmV0KQo+ICsJCQlnb3RvIGRpc2FibGVfY2xrczsKPiArCX0K PiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2Rpc2FibGVfY2xrczoKPiArCXdoaWxlICgtLWkgPj0g MCkKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHdjLT5jbGtzW2ldKTsKPiArCj4gKwlyZXR1 cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkd2MzX2NvcmVfZGlzYWJsZV9jbGtzKHN0 cnVjdCBkd2MzICpkd2MpCj4gK3sKPiArCWludCBpOwo+ICsKPiArCWZvciAoaSA9IGR3Yy0+bnVt X2Nsa3MgLSAxOyBpID49IDA7IGktLSkKPiArCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHdjLT5j bGtzW2ldKTsKPiArfQo+ICsKPiAgLyoKPiAgICogZHdjM19mcmFtZV9sZW5ndGhfYWRqdXN0bWVu dCAtIEFkanVzdHMgZnJhbWUgbGVuZ3RoIGlmIHJlcXVpcmVkCj4gICAqIEBkd2MzOiBQb2ludGVy IHRvIG91ciBjb250cm9sbGVyIGNvbnRleHQgc3RydWN0dXJlCj4gQEAgLTY0MSw2ICs3MTEsOCBA QCBzdGF0aWMgdm9pZCBkd2MzX2NvcmVfZXhpdChzdHJ1Y3QgZHdjMyAqZHdjKQo+ICAJdXNiX3Bo eV9zZXRfc3VzcGVuZChkd2MtPnVzYjNfcGh5LCAxKTsKPiAgCXBoeV9wb3dlcl9vZmYoZHdjLT51 c2IyX2dlbmVyaWNfcGh5KTsKPiAgCXBoeV9wb3dlcl9vZmYoZHdjLT51c2IzX2dlbmVyaWNfcGh5 KTsKPiArCWR3YzNfY29yZV9kaXNhYmxlX2Nsa3MoZHdjKTsKPiArCXJlc2V0X2NvbnRyb2xfYXNz ZXJ0KGR3Yy0+cmVzZXRzKTsKPiAgfQo+ICAKPiAgc3RhdGljIGJvb2wgZHdjM19jb3JlX2lzX3Zh bGlkKHN0cnVjdCBkd2MzICpkd2MpCj4gQEAgLTEyMDUsNiArMTI3NywyMiBAQCBzdGF0aWMgaW50 IGR3YzNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgCj4gIAlkd2MzX2dl dF9wcm9wZXJ0aWVzKGR3Yyk7Cj4gIAo+ICsJZHdjLT5yZXNldHMgPSBkZXZtX3Jlc2V0X2NvbnRy b2xfYXJyYXlfZ2V0X29wdGlvbmFsX3NoYXJlZChkZXYpOwo+ICsJaWYgKElTX0VSUihkd2MtPnJl c2V0cykpCj4gKwkJcmV0dXJuIFBUUl9FUlIoZHdjLT5yZXNldHMpOwo+ICsKPiArCXJldCA9IGR3 YzNfY29yZV9nZXRfY2xrcyhkd2MpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsK PiArCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoZHdjLT5yZXNldHMpOwo+ICsJaWYgKHJl dCkKPiArCQlnb3RvIHB1dF9jbGtzOwo+ICsKPiArCXJldCA9IGR3YzNfY29yZV9lbmFibGVfY2xr cyhkd2MpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGFzc2VydF9yZXNldHM7Cj4gKwo+ICAJcGxh dGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHdjKTsKPiAgCWR3YzNfY2FjaGVfaHdwYXJhbXMoZHdj KTsKPiAgCj4gQEAgLTEyNjgsNiArMTM1NiwxNCBAQCBzdGF0aWMgaW50IGR3YzNfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYt PmRldik7Cj4gIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Cj4gIAo+ICsJZHdjM19j b3JlX2Rpc2FibGVfY2xrcyhkd2MpOwo+ICsKPiArYXNzZXJ0X3Jlc2V0czoKPiArCXJlc2V0X2Nv bnRyb2xfYXNzZXJ0KGR3Yy0+cmVzZXRzKTsKPiArCj4gK3B1dF9jbGtzOgo+ICsJZHdjM19jb3Jl X3B1dF9jbGtzKGR3Yyk7Cj4gKwo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiBAQCAtMTI4OSwx MSArMTM4NSwzOCBAQCBzdGF0aWMgaW50IGR3YzNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCj4gIAo+ICAJZHdjM19mcmVlX2V2ZW50X2J1ZmZlcnMoZHdjKTsKPiAgCWR3YzNf ZnJlZV9zY3JhdGNoX2J1ZmZlcnMoZHdjKTsKPiArCWR3YzNfY29yZV9wdXRfY2xrcyhkd2MpOwo+ ICAKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICAjaWZkZWYgQ09ORklHX1BNCj4gK3N0YXRpYyBp bnQgZHdjM19jb3JlX2luaXRfZm9yX3Jlc3VtZShzdHJ1Y3QgZHdjMyAqZHdjKQo+ICt7Cj4gKwlp bnQgcmV0Owo+ICsKPiArCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoZHdjLT5yZXNldHMp Owo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCXJldCA9IGR3YzNfY29yZV9l bmFibGVfY2xrcyhkd2MpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGFzc2VydF9yZXNldHM7Cj4g Kwo+ICsJcmV0ID0gZHdjM19jb3JlX2luaXQoZHdjKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBk aXNhYmxlX2Nsa3M7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtkaXNhYmxlX2Nsa3M6Cj4gKwlk d2MzX2NvcmVfZGlzYWJsZV9jbGtzKGR3Yyk7Cj4gK2Fzc2VydF9yZXNldHM6Cj4gKwlyZXNldF9j b250cm9sX2Fzc2VydChkd2MtPnJlc2V0cyk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsK PiAgc3RhdGljIGludCBkd2MzX3N1c3BlbmRfY29tbW9uKHN0cnVjdCBkd2MzICpkd2MsIHBtX21l c3NhZ2VfdCBtc2cpCj4gIHsKPiAgCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Cj4gQEAgLTEzMjUsNyAr MTQ0OCw3IEBAIHN0YXRpYyBpbnQgZHdjM19yZXN1bWVfY29tbW9uKHN0cnVjdCBkd2MzICpkd2Ms IHBtX21lc3NhZ2VfdCBtc2cpCj4gIAo+ICAJc3dpdGNoIChkd2MtPmN1cnJlbnRfZHJfcm9sZSkg ewo+ICAJY2FzZSBEV0MzX0dDVExfUFJUQ0FQX0RFVklDRToKPiAtCQlyZXQgPSBkd2MzX2NvcmVf aW5pdChkd2MpOwo+ICsJCXJldCA9IGR3YzNfY29yZV9pbml0X2Zvcl9yZXN1bWUoZHdjKTsKPiAg CQlpZiAocmV0KQo+ICAJCQlyZXR1cm4gcmV0Owo+ICAKPiBAQCAtMTMzNiw3ICsxNDU5LDcgQEAg c3RhdGljIGludCBkd2MzX3Jlc3VtZV9jb21tb24oc3RydWN0IGR3YzMgKmR3YywgcG1fbWVzc2Fn ZV90IG1zZykKPiAgCWNhc2UgRFdDM19HQ1RMX1BSVENBUF9IT1NUOgo+ICAJCS8qIG5vdGhpbmcg dG8gZG8gb24gaG9zdCBydW50aW1lX3Jlc3VtZSAqLwo+ICAJCWlmICghUE1TR19JU19BVVRPKG1z ZykpIHsKPiAtCQkJcmV0ID0gZHdjM19jb3JlX2luaXQoZHdjKTsKPiArCQkJcmV0ID0gZHdjM19j b3JlX2luaXRfZm9yX3Jlc3VtZShkd2MpOwo+ICAJCQlpZiAocmV0KQo+ICAJCQkJcmV0dXJuIHJl dDsKPiAgCQl9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oIGIvZHJpdmVy cy91c2IvZHdjMy9jb3JlLmgKPiBpbmRleCA4NjBkMmJjLi4xNGNkMzM1IDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCj4gKysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgK PiBAQCAtODkxLDYgKzg5MSwxMSBAQCBzdHJ1Y3QgZHdjMyB7Cj4gIAlzdHJ1Y3QgdXNiX2dhZGdl dAlnYWRnZXQ7Cj4gIAlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmdhZGdldF9kcml2ZXI7Cj4g IAo+ICsJc3RydWN0IGNsawkJKipjbGtzOwo+ICsJaW50CQkJbnVtX2Nsa3M7Cj4gKwo+ICsJc3Ry dWN0IHJlc2V0X2NvbnRyb2wJKnJlc2V0czsKPiArCj4gIAlzdHJ1Y3QgdXNiX3BoeQkJKnVzYjJf cGh5Owo+ICAJc3RydWN0IHVzYl9waHkJCSp1c2IzX3BoeTsKPiAgCj4gLS0gCj4gMi43LjQKPgot LS0KVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2Ny aWJlIGxpbnV4LXVzYiIgaW4KdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2Vy Lmtlcm5lbC5vcmcKTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9y Zy9tYWpvcmRvbW8taW5mby5odG1sCg==