From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AIpwx4/NV/VCYKD7ZJWStaHJHOMPwVGat8mipesizTVEoQrfox/ix66lJm7IlTZK8rVbngXtkui3 ARC-Seal: i=1; a=rsa-sha256; t=1524135877; cv=none; d=google.com; s=arc-20160816; b=b7tHueCVpaYlFUaFQZJgPiFsgiJZSGImfovub6Lcy33hoy9FHJ38kb1sl49N6A1h3r ELXjWrWc97W+7zRBIfkdmeTIEV/o95fSYTdMsYnEu1JxAsop+CLvY4saqcS3wV+6sNfM h25TseOOMyjm12avUzs8By8leNOmQe4vyigYK6AnhHtyOe1oKoqqQGmU4wA88b/8yWCm JFm9caCD7W1wTXed6PGznJaj442yk+W4ZBWNRYpcDNWCRLdoefuxFY0FhrkPDTp7ZYl8 hp7a3nsN+NAPbv+GodDRXCzaV79MLm+V8oF7G9grEvQmGZ1MllaeeIzzz39fWkIw0eAZ mq/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-filter:arc-authentication-results; bh=XOhdjxxnobuxpEtybpk81F84gRJ4Z7rS7l8ZmVyxYEw=; b=f02uxvz8K4LDzEKtm3r38347vmKEpEK5tuI8jKlHuFdZ+R5GMuI9dNBhsMbpKA18SI DAAmxh/NZXkGJOU4UfqJ3b1oVY+zenMgZ07qK78Qr6OeKjUIANpZBZLGOJpPIpksWLgx CR+GDq99Un+9ZTNNAj+e4Ii67J3iceq4FqryzSqZwaBcWaR1nFJErJWAIoYf/2EAeLo5 PPUHrigKGERS7574HMhF12+BAq9rekQ0YMlijV5CHHiC8eDmbST7GoViMnv8AG+kxJJa Mu+HoFLwFemtzfopaA0FrttqHlcKe9WqqkyU3Xgfgnlz5YVe2u+Gih90ruNzXvO9KoBo VSHQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=bdXAf2nv; spf=softfail (google.com: domain of transitioning yamada.masahiro@socionext.com does not designate 210.131.2.78 as permitted sender) smtp.mailfrom=yamada.masahiro@socionext.com Authentication-Results: mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=bdXAf2nv; spf=softfail (google.com: domain of transitioning yamada.masahiro@socionext.com does not designate 210.131.2.78 as permitted sender) smtp.mailfrom=yamada.masahiro@socionext.com DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-11.nifty.com w3JB42us024223 X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: linux-usb@vger.kernel.org, Felipe Balbi Cc: Rob Herring , Roger Quadros , Martin Blumenstingl , Masami Hiramatsu , Jassi Brar , Kunihiko Hayashi , Masahiro Yamada , devicetree@vger.kernel.org, Felipe Balbi , linux-kernel@vger.kernel.org, Rob Herring , Greg Kroah-Hartman , Mark Rutland Subject: [PATCH v2 2/2] usb: dwc3: support clocks and resets for DWC3 core Date: Thu, 19 Apr 2018 20:03:38 +0900 Message-Id: <1524135818-14825-3-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524135818-14825-1-git-send-email-yamada.masahiro@socionext.com> References: <1524135818-14825-1-git-send-email-yamada.masahiro@socionext.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1598172301797892822?= X-GMAIL-MSGID: =?utf-8?q?1598172301797892822?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Historically, the clocks and resets are handled on the glue layer side instead of the DWC3 core. For simple cases, dwc3-of-simple.c takes care of arbitrary number of clocks and resets. The DT node structure typically looks like as follows: dwc3-glue { compatible = "foo,dwc3"; clocks = ...; resets = ...; ... dwc3 { compatible = "snps,dwc3"; ... }; } By supporting the clocks and the reset in the dwc3/core.c, it will be turned into a single node: dwc3 { compatible = "foo,dwc3", "snps,dwc3"; clocks = ...; resets = ...; ... } This commit adds the binding of clocks and resets specific to this IP. The number of clocks should generally be the same across SoCs, it is just some SoCs either tie clocks together or do not provide software control of some of the clocks. I took the clock names from the Synopsys datasheet: "ref" (ref_clk), "bus_early" (bus_clk_early), and "suspend" (suspend_clk). I found only one reset line in the datasheet, hence the reset-names property is omitted. Supporting those clocks and resets is the requirement for new platforms. Enforcing the new binding breaks existing platforms since they specify clocks and resets in their glue layer node, but nothing in the core node. I listed such exceptional cases in the DT binding. The driver code is loosened up to accept no clock/reset. This change is based on the discussion [1]. I inserted reset_control_deassert() and clk_bulk_enable() before the first register access, i.e. dwc3_cache_hwparams(). [1] https://patchwork.kernel.org/patch/10284265/ Signed-off-by: Masahiro Yamada --- Changes in v2: - Make clocks specific to this IP based on Synopsys datasheet - Use clk_bulk API - Add description to struct header Documentation/devicetree/bindings/usb/dwc3.txt | 21 ++++++ drivers/usb/dwc3/core.c | 89 +++++++++++++++++++++++++- drivers/usb/dwc3/core.h | 8 +++ 3 files changed, 116 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt index 0dbd308..feb1cc33 100644 --- a/Documentation/devicetree/bindings/usb/dwc3.txt +++ b/Documentation/devicetree/bindings/usb/dwc3.txt @@ -7,6 +7,27 @@ Required properties: - compatible: must be "snps,dwc3" - reg : Address and length of the register set for the device - interrupts: Interrupts used by the dwc3 controller. + - clock-names: should contain "ref", "bus_early", "suspend" + - clocks: list of phandle and clock specifier pairs corresponding to + entries in the clock-names property. + - resets: a single pair of phandle and reset specifier + +Exception for clocks and resets: + clocks and resets are optional if the parent node (i.e. glue-layer) + is compatible to one of the following: + "amlogic,meson-axg-dwc3" + "amlogic,meson-gxl-dwc3" + "cavium,octeon-7130-usb-uctl" + "qcom,dwc3" + "samsung,exynos5250-dwusb3" + "samsung,exynos7-dwusb3" + "sprd,sc9860-dwc3" + "st,stih407-dwc3" + "ti,am437x-dwc3" + "ti,dwc3" + "ti,keystone-dwc3" + "rockchip,rk3399-dwc3" + "xlnx,zynqmp-dwc3" Optional properties: - usb-phy : array of phandle for the PHY device. The first element diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 8e66edd..15e1613 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 @@ -266,6 +268,12 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc) return 0; } +static const struct clk_bulk_data dwc3_core_clks[] = { + { .id = "ref" }, + { .id = "bus_early" }, + { .id = "suspend" }, +}; + /* * dwc3_frame_length_adjustment - Adjusts frame length if required * @dwc3: Pointer to our controller context structure @@ -667,6 +675,9 @@ 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); + clk_bulk_disable(dwc->num_clks, dwc->clks); + clk_bulk_unprepare(dwc->num_clks, dwc->clks); + reset_control_assert(dwc->reset); } static bool dwc3_core_is_valid(struct dwc3 *dwc) @@ -1256,6 +1267,12 @@ static int dwc3_probe(struct platform_device *pdev) if (!dwc) return -ENOMEM; + dwc->clks = devm_kmemdup(dev, dwc3_core_clks, sizeof(dwc3_core_clks), + GFP_KERNEL); + if (!dwc->clks) + return -ENOMEM; + + dwc->num_clks = ARRAY_SIZE(dwc3_core_clks); dwc->dev = dev; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -1286,6 +1303,33 @@ static int dwc3_probe(struct platform_device *pdev) dwc3_get_properties(dwc); + /* Reset is optional to save existing platforms. */ + dwc->reset = devm_reset_control_get_optional_shared(dev, NULL); + if (IS_ERR(dwc->reset)) + return PTR_ERR(dwc->reset); + + ret = clk_bulk_get(dev, dwc->num_clks, dwc->clks); + if (ret == -EPROBE_DEFER) + return ret; + /* + * Clocks are optional to save existing platforms. New platforms should + * support all clocks as required by the DT-binding. + */ + if (ret) + dwc->num_clks = 0; + + ret = reset_control_deassert(dwc->reset); + if (ret) + goto put_clks; + + ret = clk_bulk_prepare(dwc->num_clks, dwc->clks); + if (ret) + goto assert_reset; + + ret = clk_bulk_enable(dwc->num_clks, dwc->clks); + if (ret) + goto unprepare_clks; + platform_set_drvdata(pdev, dwc); dwc3_cache_hwparams(dwc); @@ -1349,6 +1393,14 @@ static int dwc3_probe(struct platform_device *pdev) pm_runtime_put_sync(&pdev->dev); pm_runtime_disable(&pdev->dev); + clk_bulk_disable(dwc->num_clks, dwc->clks); +unprepare_clks: + clk_bulk_unprepare(dwc->num_clks, dwc->clks); +assert_reset: + reset_control_assert(dwc->reset); +put_clks: + clk_bulk_put(dwc->num_clks, dwc->clks); + return ret; } @@ -1370,11 +1422,44 @@ static int dwc3_remove(struct platform_device *pdev) dwc3_free_event_buffers(dwc); dwc3_free_scratch_buffers(dwc); + clk_bulk_put(dwc->num_clks, dwc->clks); return 0; } #ifdef CONFIG_PM +static int dwc3_core_init_for_resume(struct dwc3 *dwc) +{ + int ret; + + ret = reset_control_deassert(dwc->reset); + if (ret) + return ret; + + ret = clk_bulk_prepare(dwc->num_clks, dwc->clks); + if (ret) + goto assert_reset; + + ret = clk_bulk_enable(dwc->num_clks, dwc->clks); + if (ret) + goto unprepare_clks; + + ret = dwc3_core_init(dwc); + if (ret) + goto disable_clks; + + return 0; + +disable_clks: + clk_bulk_disable(dwc->num_clks, dwc->clks); +unprepare_clks: + clk_bulk_unprepare(dwc->num_clks, dwc->clks); +assert_reset: + reset_control_assert(dwc->reset); + + return ret; +} + static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) { unsigned long flags; @@ -1420,7 +1505,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; @@ -1432,7 +1517,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; dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 4f3b438..1765e01 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -891,6 +891,9 @@ struct dwc3_scratchpad_array { * @eps: endpoint array * @gadget: device side representation of the peripheral controller * @gadget_driver: pointer to the gadget driver + * @clks: array of clocks + * @num_clks: number of clocks + * @reset: reset control * @regs: base address for our registers * @regs_size: address space size * @fladj: frame length adjustment @@ -1013,6 +1016,11 @@ struct dwc3 { struct usb_gadget gadget; struct usb_gadget_driver *gadget_driver; + struct clk_bulk_data *clks; + int num_clks; + + struct reset_control *reset; + 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: [v2,2/2] usb: dwc3: support clocks and resets for DWC3 core From: Masahiro Yamada Message-Id: <1524135818-14825-3-git-send-email-yamada.masahiro@socionext.com> Date: Thu, 19 Apr 2018 20:03:38 +0900 To: linux-usb@vger.kernel.org, Felipe Balbi Cc: Rob Herring , Roger Quadros , Martin Blumenstingl , Masami Hiramatsu , Jassi Brar , Kunihiko Hayashi , Masahiro Yamada , devicetree@vger.kernel.org, Felipe Balbi , linux-kernel@vger.kernel.org, Rob Herring , Greg Kroah-Hartman , Mark Rutland List-ID: SGlzdG9yaWNhbGx5LCB0aGUgY2xvY2tzIGFuZCByZXNldHMgYXJlIGhhbmRsZWQgb24gdGhlIGds dWUgbGF5ZXIKc2lkZSBpbnN0ZWFkIG9mIHRoZSBEV0MzIGNvcmUuICBGb3Igc2ltcGxlIGNhc2Vz LCBkd2MzLW9mLXNpbXBsZS5jCnRha2VzIGNhcmUgb2YgYXJiaXRyYXJ5IG51bWJlciBvZiBjbG9j a3MgYW5kIHJlc2V0cy4gIFRoZSBEVCBub2RlCnN0cnVjdHVyZSB0eXBpY2FsbHkgbG9va3MgbGlr ZSBhcyBmb2xsb3dzOgoKICBkd2MzLWdsdWUgewogICAgICAgICAgY29tcGF0aWJsZSA9ICJmb28s ZHdjMyI7CiAgICAgICAgICBjbG9ja3MgPSAuLi47CiAgICAgICAgICByZXNldHMgPSAuLi47CiAg ICAgICAgICAuLi4KCiAgICAgICAgICBkd2MzIHsKICAgICAgICAgICAgICAgICAgY29tcGF0aWJs ZSA9ICJzbnBzLGR3YzMiOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH07CiAgfQoK Qnkgc3VwcG9ydGluZyB0aGUgY2xvY2tzIGFuZCB0aGUgcmVzZXQgaW4gdGhlIGR3YzMvY29yZS5j LCBpdCB3aWxsCmJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIG5vZGU6CgogIGR3YzMgewogICAgICAg ICAgY29tcGF0aWJsZSA9ICJmb28sZHdjMyIsICJzbnBzLGR3YzMiOwogICAgICAgICAgY2xvY2tz ID0gLi4uOwogICAgICAgICAgcmVzZXRzID0gLi4uOwogICAgICAgICAgLi4uCiAgfQoKVGhpcyBj b21taXQgYWRkcyB0aGUgYmluZGluZyBvZiBjbG9ja3MgYW5kIHJlc2V0cyBzcGVjaWZpYyB0byB0 aGlzIElQLgpUaGUgbnVtYmVyIG9mIGNsb2NrcyBzaG91bGQgZ2VuZXJhbGx5IGJlIHRoZSBzYW1l IGFjcm9zcyBTb0NzLCBpdCBpcwpqdXN0IHNvbWUgU29DcyBlaXRoZXIgdGllIGNsb2NrcyB0b2dl dGhlciBvciBkbyBub3QgcHJvdmlkZSBzb2Z0d2FyZQpjb250cm9sIG9mIHNvbWUgb2YgdGhlIGNs b2Nrcy4KCkkgdG9vayB0aGUgY2xvY2sgbmFtZXMgZnJvbSB0aGUgU3lub3BzeXMgZGF0YXNoZWV0 OiAicmVmIiAocmVmX2NsayksCiJidXNfZWFybHkiIChidXNfY2xrX2Vhcmx5KSwgYW5kICJzdXNw ZW5kIiAoc3VzcGVuZF9jbGspLgoKSSBmb3VuZCBvbmx5IG9uZSByZXNldCBsaW5lIGluIHRoZSBk YXRhc2hlZXQsIGhlbmNlIHRoZSByZXNldC1uYW1lcwpwcm9wZXJ0eSBpcyBvbWl0dGVkLgoKU3Vw cG9ydGluZyB0aG9zZSBjbG9ja3MgYW5kIHJlc2V0cyBpcyB0aGUgcmVxdWlyZW1lbnQgZm9yIG5l dyBwbGF0Zm9ybXMuCkVuZm9yY2luZyB0aGUgbmV3IGJpbmRpbmcgYnJlYWtzIGV4aXN0aW5nIHBs YXRmb3JtcyBzaW5jZSB0aGV5IHNwZWNpZnkKY2xvY2tzIGFuZCByZXNldHMgaW4gdGhlaXIgZ2x1 ZSBsYXllciBub2RlLCBidXQgbm90aGluZyBpbiB0aGUgY29yZQpub2RlLiAgSSBsaXN0ZWQgc3Vj aCBleGNlcHRpb25hbCBjYXNlcyBpbiB0aGUgRFQgYmluZGluZy4gIFRoZSBkcml2ZXIKY29kZSBp cyBsb29zZW5lZCB1cCB0byBhY2NlcHQgbm8gY2xvY2svcmVzZXQuICBUaGlzIGNoYW5nZSBpcyBi YXNlZApvbiB0aGUgZGlzY3Vzc2lvbiBbMV0uCgpJIGluc2VydGVkIHJlc2V0X2NvbnRyb2xfZGVh c3NlcnQoKSBhbmQgY2xrX2J1bGtfZW5hYmxlKCkgYmVmb3JlIHRoZQpmaXJzdCByZWdpc3RlciBh Y2Nlc3MsIGkuZS4gZHdjM19jYWNoZV9od3BhcmFtcygpLgoKWzFdIGh0dHBzOi8vcGF0Y2h3b3Jr Lmtlcm5lbC5vcmcvcGF0Y2gvMTAyODQyNjUvCgpTaWduZWQtb2ZmLWJ5OiBNYXNhaGlybyBZYW1h ZGEgPHlhbWFkYS5tYXNhaGlyb0Bzb2Npb25leHQuY29tPgotLS0KCkNoYW5nZXMgaW4gdjI6CiAg LSBNYWtlIGNsb2NrcyBzcGVjaWZpYyB0byB0aGlzIElQIGJhc2VkIG9uIFN5bm9wc3lzIGRhdGFz aGVldAogIC0gVXNlIGNsa19idWxrIEFQSQogIC0gQWRkIGRlc2NyaXB0aW9uIHRvIHN0cnVjdCBo ZWFkZXIKCiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0IHwg MjEgKysrKysrCiBkcml2ZXJzL3VzYi9kd2MzL2NvcmUuYyAgICAgICAgICAgICAgICAgICAgICAg IHwgODkgKysrKysrKysrKysrKysrKysrKysrKysrKy0KIGRyaXZlcnMvdXNiL2R3YzMvY29yZS5o ICAgICAgICAgICAgICAgICAgICAgICAgfCAgOCArKysKIDMgZmlsZXMgY2hhbmdlZCwgMTE2IGlu c2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9k ZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJl ZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKaW5kZXggMGRiZDMwOC4uZmViMWNjMzMgMTAwNjQ0Ci0t LSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKKysrIGIv RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dApAQCAtNyw2ICs3 LDI3IEBAIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAgLSBjb21wYXRpYmxlOiBtdXN0IGJlICJzbnBz LGR3YzMiCiAgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBm b3IgdGhlIGRldmljZQogIC0gaW50ZXJydXB0czogSW50ZXJydXB0cyB1c2VkIGJ5IHRoZSBkd2Mz IGNvbnRyb2xsZXIuCisgLSBjbG9jay1uYW1lczogc2hvdWxkIGNvbnRhaW4gInJlZiIsICJidXNf ZWFybHkiLCAic3VzcGVuZCIKKyAtIGNsb2NrczogbGlzdCBvZiBwaGFuZGxlIGFuZCBjbG9jayBz cGVjaWZpZXIgcGFpcnMgY29ycmVzcG9uZGluZyB0bworICAgICAgICAgICBlbnRyaWVzIGluIHRo ZSBjbG9jay1uYW1lcyBwcm9wZXJ0eS4KKyAtIHJlc2V0czogYSBzaW5nbGUgcGFpciBvZiBwaGFu ZGxlIGFuZCByZXNldCBzcGVjaWZpZXIKKworRXhjZXB0aW9uIGZvciBjbG9ja3MgYW5kIHJlc2V0 czoKKyAgY2xvY2tzIGFuZCByZXNldHMgYXJlIG9wdGlvbmFsIGlmIHRoZSBwYXJlbnQgbm9kZSAo aS5lLiBnbHVlLWxheWVyKQorICBpcyBjb21wYXRpYmxlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5n OgorICAgICJhbWxvZ2ljLG1lc29uLWF4Zy1kd2MzIgorICAgICJhbWxvZ2ljLG1lc29uLWd4bC1k d2MzIgorICAgICJjYXZpdW0sb2N0ZW9uLTcxMzAtdXNiLXVjdGwiCisgICAgInFjb20sZHdjMyIK KyAgICAic2Ftc3VuZyxleHlub3M1MjUwLWR3dXNiMyIKKyAgICAic2Ftc3VuZyxleHlub3M3LWR3 dXNiMyIKKyAgICAic3ByZCxzYzk4NjAtZHdjMyIKKyAgICAic3Qsc3RpaDQwNy1kd2MzIgorICAg ICJ0aSxhbTQzN3gtZHdjMyIKKyAgICAidGksZHdjMyIKKyAgICAidGksa2V5c3RvbmUtZHdjMyIK KyAgICAicm9ja2NoaXAscmszMzk5LWR3YzMiCisgICAgInhsbngsenlucW1wLWR3YzMiCiAKIE9w dGlvbmFsIHByb3BlcnRpZXM6CiAgLSB1c2ItcGh5IDogYXJyYXkgb2YgcGhhbmRsZSBmb3IgdGhl IFBIWSBkZXZpY2UuICBUaGUgZmlyc3QgZWxlbWVudApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv ZHdjMy9jb3JlLmMgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYwppbmRleCA4ZTY2ZWRkLi4xNWUx NjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYworKysgYi9kcml2ZXJzL3Vz Yi9kd2MzL2NvcmUuYwpAQCAtOCw2ICs4LDcgQEAKICAqCSAgICBTZWJhc3RpYW4gQW5kcnplaiBT aWV3aW9yIDxiaWdlYXN5QGxpbnV0cm9uaXguZGU+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Ns ay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUu aD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI0LDYgKzI1LDcgQEAKICNpbmNsdWRl IDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9w aW5jdHJsL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KIAogI2luY2x1ZGUg PGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CkBAIC0yNjYs NiArMjY4LDEyIEBAIHN0YXRpYyBpbnQgZHdjM19jb3JlX3NvZnRfcmVzZXQoc3RydWN0IGR3YzMg KmR3YykKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfYnVsa19kYXRh IGR3YzNfY29yZV9jbGtzW10gPSB7CisJeyAuaWQgPSAicmVmIiB9LAorCXsgLmlkID0gImJ1c19l YXJseSIgfSwKKwl7IC5pZCA9ICJzdXNwZW5kIiB9LAorfTsKKwogLyoKICAqIGR3YzNfZnJhbWVf bGVuZ3RoX2FkanVzdG1lbnQgLSBBZGp1c3RzIGZyYW1lIGxlbmd0aCBpZiByZXF1aXJlZAogICog QGR3YzM6IFBvaW50ZXIgdG8gb3VyIGNvbnRyb2xsZXIgY29udGV4dCBzdHJ1Y3R1cmUKQEAgLTY2 Nyw2ICs2NzUsOSBAQCBzdGF0aWMgdm9pZCBkd2MzX2NvcmVfZXhpdChzdHJ1Y3QgZHdjMyAqZHdj KQogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IzX3BoeSwgMSk7CiAJcGh5X3Bvd2VyX29m Zihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOwogCXBoeV9wb3dlcl9vZmYoZHdjLT51c2IzX2dlbmVy aWNfcGh5KTsKKwljbGtfYnVsa19kaXNhYmxlKGR3Yy0+bnVtX2Nsa3MsIGR3Yy0+Y2xrcyk7CisJ Y2xrX2J1bGtfdW5wcmVwYXJlKGR3Yy0+bnVtX2Nsa3MsIGR3Yy0+Y2xrcyk7CisJcmVzZXRfY29u dHJvbF9hc3NlcnQoZHdjLT5yZXNldCk7CiB9CiAKIHN0YXRpYyBib29sIGR3YzNfY29yZV9pc192 YWxpZChzdHJ1Y3QgZHdjMyAqZHdjKQpAQCAtMTI1Niw2ICsxMjY3LDEyIEBAIHN0YXRpYyBpbnQg ZHdjM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCWlmICghZHdjKQogCQly ZXR1cm4gLUVOT01FTTsKIAorCWR3Yy0+Y2xrcyA9IGRldm1fa21lbWR1cChkZXYsIGR3YzNfY29y ZV9jbGtzLCBzaXplb2YoZHdjM19jb3JlX2Nsa3MpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAo IWR3Yy0+Y2xrcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkd2MtPm51bV9jbGtzID0gQVJSQVlf U0laRShkd2MzX2NvcmVfY2xrcyk7CiAJZHdjLT5kZXYgPSBkZXY7CiAKIAlyZXMgPSBwbGF0Zm9y bV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwpAQCAtMTI4Niw2ICsxMzAz LDMzIEBAIHN0YXRpYyBpbnQgZHdjM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQogCiAJZHdjM19nZXRfcHJvcGVydGllcyhkd2MpOwogCisJLyogUmVzZXQgaXMgb3B0aW9uYWwg dG8gc2F2ZSBleGlzdGluZyBwbGF0Zm9ybXMuICovCisJZHdjLT5yZXNldCA9IGRldm1fcmVzZXRf Y29udHJvbF9nZXRfb3B0aW9uYWxfc2hhcmVkKGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihkd2Mt PnJlc2V0KSkKKwkJcmV0dXJuIFBUUl9FUlIoZHdjLT5yZXNldCk7CisKKwlyZXQgPSBjbGtfYnVs a19nZXQoZGV2LCBkd2MtPm51bV9jbGtzLCBkd2MtPmNsa3MpOworCWlmIChyZXQgPT0gLUVQUk9C RV9ERUZFUikKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIENsb2NrcyBhcmUgb3B0aW9uYWwgdG8g c2F2ZSBleGlzdGluZyBwbGF0Zm9ybXMuIE5ldyBwbGF0Zm9ybXMgc2hvdWxkCisJICogc3VwcG9y dCBhbGwgY2xvY2tzIGFzIHJlcXVpcmVkIGJ5IHRoZSBEVC1iaW5kaW5nLgorCSAqLworCWlmIChy ZXQpCisJCWR3Yy0+bnVtX2Nsa3MgPSAwOworCisJcmV0ID0gcmVzZXRfY29udHJvbF9kZWFzc2Vy dChkd2MtPnJlc2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIHB1dF9jbGtzOworCisJcmV0ID0gY2xr X2J1bGtfcHJlcGFyZShkd2MtPm51bV9jbGtzLCBkd2MtPmNsa3MpOworCWlmIChyZXQpCisJCWdv dG8gYXNzZXJ0X3Jlc2V0OworCisJcmV0ID0gY2xrX2J1bGtfZW5hYmxlKGR3Yy0+bnVtX2Nsa3Ms IGR3Yy0+Y2xrcyk7CisJaWYgKHJldCkKKwkJZ290byB1bnByZXBhcmVfY2xrczsKKwogCXBsYXRm b3JtX3NldF9kcnZkYXRhKHBkZXYsIGR3Yyk7CiAJZHdjM19jYWNoZV9od3BhcmFtcyhkd2MpOwog CkBAIC0xMzQ5LDYgKzEzOTMsMTQgQEAgc3RhdGljIGludCBkd2MzX3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlw bV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKKwljbGtfYnVsa19kaXNhYmxlKGR3Yy0+ bnVtX2Nsa3MsIGR3Yy0+Y2xrcyk7Cit1bnByZXBhcmVfY2xrczoKKwljbGtfYnVsa191bnByZXBh cmUoZHdjLT5udW1fY2xrcywgZHdjLT5jbGtzKTsKK2Fzc2VydF9yZXNldDoKKwlyZXNldF9jb250 cm9sX2Fzc2VydChkd2MtPnJlc2V0KTsKK3B1dF9jbGtzOgorCWNsa19idWxrX3B1dChkd2MtPm51 bV9jbGtzLCBkd2MtPmNsa3MpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM3MCwxMSArMTQy Miw0NCBAQCBzdGF0aWMgaW50IGR3YzNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpCiAKIAlkd2MzX2ZyZWVfZXZlbnRfYnVmZmVycyhkd2MpOwogCWR3YzNfZnJlZV9zY3JhdGNo X2J1ZmZlcnMoZHdjKTsKKwljbGtfYnVsa19wdXQoZHdjLT5udW1fY2xrcywgZHdjLT5jbGtzKTsK IAogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGR3YzNfY29y ZV9pbml0X2Zvcl9yZXN1bWUoc3RydWN0IGR3YzMgKmR3YykKK3sKKwlpbnQgcmV0OworCisJcmV0 ID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChkd2MtPnJlc2V0KTsKKwlpZiAocmV0KQorCQlyZXR1 cm4gcmV0OworCisJcmV0ID0gY2xrX2J1bGtfcHJlcGFyZShkd2MtPm51bV9jbGtzLCBkd2MtPmNs a3MpOworCWlmIChyZXQpCisJCWdvdG8gYXNzZXJ0X3Jlc2V0OworCisJcmV0ID0gY2xrX2J1bGtf ZW5hYmxlKGR3Yy0+bnVtX2Nsa3MsIGR3Yy0+Y2xrcyk7CisJaWYgKHJldCkKKwkJZ290byB1bnBy ZXBhcmVfY2xrczsKKworCXJldCA9IGR3YzNfY29yZV9pbml0KGR3Yyk7CisJaWYgKHJldCkKKwkJ Z290byBkaXNhYmxlX2Nsa3M7CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9jbGtzOgorCWNsa19i dWxrX2Rpc2FibGUoZHdjLT5udW1fY2xrcywgZHdjLT5jbGtzKTsKK3VucHJlcGFyZV9jbGtzOgor CWNsa19idWxrX3VucHJlcGFyZShkd2MtPm51bV9jbGtzLCBkd2MtPmNsa3MpOworYXNzZXJ0X3Jl c2V0OgorCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGR3Yy0+cmVzZXQpOworCisJcmV0dXJuIHJldDsK K30KKwogc3RhdGljIGludCBkd2MzX3N1c3BlbmRfY29tbW9uKHN0cnVjdCBkd2MzICpkd2MsIHBt X21lc3NhZ2VfdCBtc2cpCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKQEAgLTE0MjAsNyArMTUw NSw3IEBAIHN0YXRpYyBpbnQgZHdjM19yZXN1bWVfY29tbW9uKHN0cnVjdCBkd2MzICpkd2MsIHBt X21lc3NhZ2VfdCBtc2cpCiAKIAlzd2l0Y2ggKGR3Yy0+Y3VycmVudF9kcl9yb2xlKSB7CiAJY2Fz ZSBEV0MzX0dDVExfUFJUQ0FQX0RFVklDRToKLQkJcmV0ID0gZHdjM19jb3JlX2luaXQoZHdjKTsK KwkJcmV0ID0gZHdjM19jb3JlX2luaXRfZm9yX3Jlc3VtZShkd2MpOwogCQlpZiAocmV0KQogCQkJ cmV0dXJuIHJldDsKIApAQCAtMTQzMiw3ICsxNTE3LDcgQEAgc3RhdGljIGludCBkd2MzX3Jlc3Vt ZV9jb21tb24oc3RydWN0IGR3YzMgKmR3YywgcG1fbWVzc2FnZV90IG1zZykKIAljYXNlIERXQzNf R0NUTF9QUlRDQVBfSE9TVDoKIAkJLyogbm90aGluZyB0byBkbyBvbiBob3N0IHJ1bnRpbWVfcmVz dW1lICovCiAJCWlmICghUE1TR19JU19BVVRPKG1zZykpIHsKLQkJCXJldCA9IGR3YzNfY29yZV9p bml0KGR3Yyk7CisJCQlyZXQgPSBkd2MzX2NvcmVfaW5pdF9mb3JfcmVzdW1lKGR3Yyk7CiAJCQlp ZiAocmV0KQogCQkJCXJldHVybiByZXQ7CiAJCQlkd2MzX3NldF9wcnRjYXAoZHdjLCBEV0MzX0dD VExfUFJUQ0FQX0hPU1QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmggYi9k cml2ZXJzL3VzYi9kd2MzL2NvcmUuaAppbmRleCA0ZjNiNDM4Li4xNzY1ZTAxIDEwMDY0NAotLS0g YS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaApA QCAtODkxLDYgKzg5MSw5IEBAIHN0cnVjdCBkd2MzX3NjcmF0Y2hwYWRfYXJyYXkgewogICogQGVw czogZW5kcG9pbnQgYXJyYXkKICAqIEBnYWRnZXQ6IGRldmljZSBzaWRlIHJlcHJlc2VudGF0aW9u IG9mIHRoZSBwZXJpcGhlcmFsIGNvbnRyb2xsZXIKICAqIEBnYWRnZXRfZHJpdmVyOiBwb2ludGVy IHRvIHRoZSBnYWRnZXQgZHJpdmVyCisgKiBAY2xrczogYXJyYXkgb2YgY2xvY2tzCisgKiBAbnVt X2Nsa3M6IG51bWJlciBvZiBjbG9ja3MKKyAqIEByZXNldDogcmVzZXQgY29udHJvbAogICogQHJl Z3M6IGJhc2UgYWRkcmVzcyBmb3Igb3VyIHJlZ2lzdGVycwogICogQHJlZ3Nfc2l6ZTogYWRkcmVz cyBzcGFjZSBzaXplCiAgKiBAZmxhZGo6IGZyYW1lIGxlbmd0aCBhZGp1c3RtZW50CkBAIC0xMDEz LDYgKzEwMTYsMTEgQEAgc3RydWN0IGR3YzMgewogCXN0cnVjdCB1c2JfZ2FkZ2V0CWdhZGdldDsK IAlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmdhZGdldF9kcml2ZXI7CiAKKwlzdHJ1Y3QgY2xr X2J1bGtfZGF0YQkqY2xrczsKKwlpbnQJCQludW1fY2xrczsKKworCXN0cnVjdCByZXNldF9jb250 cm9sCSpyZXNldDsKKwogCXN0cnVjdCB1c2JfcGh5CQkqdXNiMl9waHk7CiAJc3RydWN0IHVzYl9w aHkJCSp1c2IzX3BoeTsKIAo=