From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Osipenko Subject: Re: [PATCH v3 08/15] ASoC: tegra: Add audio mclk control through clk_out_1 and extern1 Date: Sat, 7 Dec 2019 17:58:36 +0300 Message-ID: <0ce2e83b-800c-da1e-7a3c-3cf1427cfe20@gmail.com> References: <1575600535-26877-1-git-send-email-skomatineni@nvidia.com> <1575600535-26877-9-git-send-email-skomatineni@nvidia.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <1575600535-26877-9-git-send-email-skomatineni@nvidia.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: Sowjanya Komatineni , thierry.reding@gmail.com, jonathanh@nvidia.com, mperttunen@nvidia.com, gregkh@linuxfoundation.org, sboyd@kernel.org, tglx@linutronix.de, robh+dt@kernel.org, mark.rutland@arm.com Cc: allison@lohutok.net, pdeschrijver@nvidia.com, pgaikwad@nvidia.com, mturquette@baylibre.com, horms+renesas@verge.net.au, Jisheng.Zhang@synaptics.com, krzk@kernel.org, arnd@arndb.de, spujar@nvidia.com, josephl@nvidia.com, vidyas@nvidia.com, daniel.lezcano@linaro.org, mmaddireddy@nvidia.com, markz@nvidia.com, devicetree@vger.kernel.org, linux-clk@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, alexios.zavras@intel.com, alsa-devel@alsa-project.org List-Id: linux-tegra@vger.kernel.org 06.12.2019 05:48, Sowjanya Komatineni пишет: > Current ASoC driver uses extern1 as cdev1 clock from Tegra30 onwards > through device tree. > > Actual audio mclk is clk_out_1 and to use PLLA for mclk rate control, > need to clk_out_1_mux parent to extern1 and extern1 parent to PLLA_OUT0. > > Currently Tegra clock driver init sets the parents and enables both > clk_out_1 and extern1 clocks. But these clocks parent and enables should > be controlled by ASoC driver. > > Clock parents can be specified in device tree using assigned-clocks > and assigned-clock-parents. > > To enable audio mclk, both clk_out_1 and extern1 clocks need to be > enabled. > > This patch configures parents for clk_out_1 and extern1 clocks if device > tree does not specify clock parents inorder to support old device tree > and controls mclk using both clk_out_1 and extern1 clocks. > > Signed-off-by: Sowjanya Komatineni > --- > sound/soc/tegra/tegra_asoc_utils.c | 66 ++++++++++++++++++++++++++++++++++++++ > sound/soc/tegra/tegra_asoc_utils.h | 1 + > 2 files changed, 67 insertions(+) > > diff --git a/sound/soc/tegra/tegra_asoc_utils.c b/sound/soc/tegra/tegra_asoc_utils.c > index 536a578e9512..8e3a3740df7c 100644 > --- a/sound/soc/tegra/tegra_asoc_utils.c > +++ b/sound/soc/tegra/tegra_asoc_utils.c > @@ -60,6 +60,7 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate, > data->set_mclk = 0; > > clk_disable_unprepare(data->clk_cdev1); > + clk_disable_unprepare(data->clk_extern1); > clk_disable_unprepare(data->clk_pll_a_out0); > clk_disable_unprepare(data->clk_pll_a); > > @@ -89,6 +90,14 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate, > return err; > } > > + if (!IS_ERR_OR_NULL(data->clk_extern1)) { > + err = clk_prepare_enable(data->clk_extern1); > + if (err) { > + dev_err(data->dev, "Can't enable extern1: %d\n", err); > + return err; > + } > + } > + > err = clk_prepare_enable(data->clk_cdev1); > if (err) { > dev_err(data->dev, "Can't enable cdev1: %d\n", err); > @@ -109,6 +118,7 @@ int tegra_asoc_utils_set_ac97_rate(struct tegra_asoc_utils_data *data) > int err; > > clk_disable_unprepare(data->clk_cdev1); > + clk_disable_unprepare(data->clk_extern1); > clk_disable_unprepare(data->clk_pll_a_out0); > clk_disable_unprepare(data->clk_pll_a); > > @@ -142,6 +152,14 @@ int tegra_asoc_utils_set_ac97_rate(struct tegra_asoc_utils_data *data) > return err; > } > > + if (!IS_ERR_OR_NULL(data->clk_extern1)) { > + err = clk_prepare_enable(data->clk_extern1); > + if (err) { > + dev_err(data->dev, "Can't enable extern1: %d\n", err); > + return err; > + } > + } Why this is needed given that clk_extern1 is either a child of MCLK or MCLK itself (on T20)? The child clocks are enabled when the parent is enabled. > err = clk_prepare_enable(data->clk_cdev1); > if (err) { > dev_err(data->dev, "Can't enable cdev1: %d\n", err); > @@ -158,6 +176,7 @@ EXPORT_SYMBOL_GPL(tegra_asoc_utils_set_ac97_rate); > int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, > struct device *dev) > { > + struct clk *clk_out_1_mux; > int ret; > > data->dev = dev; > @@ -196,6 +215,51 @@ int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data, > goto err_put_pll_a_out0; > } In a previous patch you added fallback to EXTPERIPH when clk_get(MCLK) fails. This will work perfectly fine for the older kernels which have all clocks in the same single CaR driver, but this may not work that great for the newer kernels because PMC driver isn't registered early during boot and thus it is possible to get a legit -EPROBE_DEFER which shouldn't be ignored. In other words, you need to add into this patch a check for the error code returned by clk_get(MCLK) and fallback only for -EINVAL. > + /* > + * If clock parents are not set in DT, configure here to use clk_out_1 > + * as mclk and extern1 as parent for Tegra30 and higher. > + */ > + if (!of_find_property(dev->of_node, "assigned-clock-parents", NULL) && > + data->soc > TEGRA_ASOC_UTILS_SOC_TEGRA20) { > + data->clk_extern1 = clk_get_sys("clk_out_1", "extern1"); > + if (IS_ERR(data->clk_extern1)) { > + dev_err(data->dev, "Can't retrieve clk extern1\n"); > + ret = PTR_ERR(data->clk_extern1); > + goto err_put_cdev1; > + } > + > + ret = clk_set_parent(data->clk_extern1, data->clk_pll_a_out0); > + if (ret < 0) { > + dev_err(data->dev, > + "Set parent failed for clk extern1: %d\n", > + ret); > + goto err_put_cdev1; > + } > + > + clk_out_1_mux = clk_get_sys(NULL, "clk_out_1_mux"); Note1: clk_get(dev, "clk_out_1_mux") should work here by letting clk core to fall back to the clk_get_sys() by itself. Either way should be good. Note2: devm_clk_get() could be used everywhere here. Maybe it won't hurt to convert tegra_asoc_utils to use managed resources to keep code a bit cleaner. It should be a separate patch. > + if (IS_ERR(clk_out_1_mux)) { > + dev_err(data->dev, "Can't retrieve clk clk_out_1_mux\n"); > + ret = PTR_ERR(clk_out_1_mux); > + goto err_put_cdev1; > + } > + > + ret = clk_set_parent(clk_out_1_mux, data->clk_extern1); > + if (ret < 0) { > + dev_err(data->dev, > + "Set parent failed for clk_out_1_mux: %d\n", > + ret); > + clk_put(clk_out_1_mux); > + goto err_put_cdev1; > + } clk_put(clk_cdev1); > + data->clk_cdev1 = clk_get_sys(NULL, "clk_out_1"); > + if (IS_ERR(data->clk_cdev1)) { > + dev_err(data->dev, "Can't retrieve clk clk_out_1\n"); > + ret = PTR_ERR(data->clk_cdev1); > + goto err_put_cdev1; goto err_put_pll_a_out0; > + } > + } > + > ret = tegra_asoc_utils_set_rate(data, 44100, 256 * 44100); > if (ret) > goto err_put_cdev1; > @@ -215,6 +279,8 @@ EXPORT_SYMBOL_GPL(tegra_asoc_utils_init); > > void tegra_asoc_utils_fini(struct tegra_asoc_utils_data *data) > { > + if (!IS_ERR_OR_NULL(data->clk_extern1)) > + clk_put(data->clk_extern1); > clk_put(data->clk_cdev1); > clk_put(data->clk_pll_a_out0); > clk_put(data->clk_pll_a); > diff --git a/sound/soc/tegra/tegra_asoc_utils.h b/sound/soc/tegra/tegra_asoc_utils.h > index 0c13818dee75..5f2b96478caf 100644 > --- a/sound/soc/tegra/tegra_asoc_utils.h > +++ b/sound/soc/tegra/tegra_asoc_utils.h > @@ -25,6 +25,7 @@ struct tegra_asoc_utils_data { > struct clk *clk_pll_a; > struct clk *clk_pll_a_out0; > struct clk *clk_cdev1; > + struct clk *clk_extern1; > int set_baseclock; > int set_mclk; > }; > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A684C43603 for ; Mon, 9 Dec 2019 10:21:08 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8497320726 for ; Mon, 9 Dec 2019 10:21:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="CnT1pboB"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="E0pCaH3v" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8497320726 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id D1BA9169F; Mon, 9 Dec 2019 11:20:15 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz D1BA9169F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1575886865; bh=6MBfI5tHcss22tsB8RZGGAgpIfShmceOq8Y7Xx3w0xA=; h=To:References:From:Date:In-Reply-To:Cc:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CnT1pboB5eQaFD4PUKMPumOYvix+4mHfSBnCytro9zJfaNRnSW64dU/R9zlXSKWls 4F4BqIalYjzSuCifeTYkrcxy1TMNs7mGlb8V6vTvX/Gy3U/LdjTra/GcNPItHQhG1X +rMoSC/fJABeDhBMClWHUUuUPJC//IUZtnqyRQ0s= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 1DB9DF80490; Mon, 9 Dec 2019 10:52:15 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 2B412F801F7; Sat, 7 Dec 2019 15:58:43 +0100 (CET) Received: from mail-lj1-x241.google.com (mail-lj1-x241.google.com [IPv6:2a00:1450:4864:20::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3854BF8010F for ; Sat, 7 Dec 2019 15:58:39 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3854BF8010F Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="E0pCaH3v" Received: by mail-lj1-x241.google.com with SMTP id e10so10788136ljj.6 for ; Sat, 07 Dec 2019 06:58:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=/imZWgogkJNGBucbjtRZxaPGtt1kBLD7qb/xwoDYS4s=; b=E0pCaH3vDxnkefhjjUyBMVa4eElOa5Ckdy/LKrGLf8aXx/78+uraTf92N9AHGwQB5K hyEvipNxohqsJzHbwNst34qs4SmotSI/epy4iUFAzh4rd2EmFPM2IUm2dAz4dAMHLA0v NHylNprU48EV2Dlqnl/G1Ioj7tcd+4EvHo91C6aH1X9NUwNSj4SoSCBhIGihZYq2jvUN pCW4snFb63egiiIKdU3/7/2JxanwVcgG6pVF8u2UiGLbKXmCrSS+502dNPLCbNtrujc7 fC9F455QEqDCSJwdHv34KfM0s9hJuRONXClLAiIJOenkW+ZX8k7bdhUMOEaJGHvit5yl Flvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=/imZWgogkJNGBucbjtRZxaPGtt1kBLD7qb/xwoDYS4s=; b=dkx9lxzjqGFycDrJ5XAt5PHlMjDJTGSdA6Ghudf3h8bwn5LjSo2pU8mAeNvOqLUjc0 SRAWHjyjIajagQfgSRmLwx4UnDdkDZTalqYPvxe6QGlLXM6hUGRseATs2Pfn6OU4P1Ip 1x7D/wL8ldmS8ej4dnD0UfQ0KfefyKTg/j/h0mNMvpRxwdP4FL67qQ2g9XjLmbjeOfte 1cH6Md63LM3zMl4hXgo7PhAiliI3//2sR8yj0Qiw+zY1xBgHCjWn20rVogTfV+OAcyVN y+cElkz22tZrWrVkXKCXuVeuICUzplFoIRy7oCbGz56+AtnjnppieIktuy/MDcQQY5Cq Q3jQ== X-Gm-Message-State: APjAAAXtD2N46vZcaZHafV+6xPlE3GXM+j61TcKnNz81/6bcWH/gyQPo mxfwC6Qg4QV3a1/qno8X6RF3vLf3 X-Google-Smtp-Source: APXvYqzCLFcB+qy6VVeu0N85TcceEA4RmU7DjZYPsLQ2KXJoTz0NBamVyczhKjzphiPt1EQX73AN/Q== X-Received: by 2002:a2e:7d01:: with SMTP id y1mr12036901ljc.100.1575730718710; Sat, 07 Dec 2019 06:58:38 -0800 (PST) Received: from [192.168.2.145] (79-139-233-37.dynamic.spd-mgts.ru. [79.139.233.37]) by smtp.googlemail.com with ESMTPSA id q27sm1158561ljc.65.2019.12.07.06.58.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 07 Dec 2019 06:58:37 -0800 (PST) To: Sowjanya Komatineni , thierry.reding@gmail.com, jonathanh@nvidia.com, mperttunen@nvidia.com, gregkh@linuxfoundation.org, sboyd@kernel.org, tglx@linutronix.de, robh+dt@kernel.org, mark.rutland@arm.com References: <1575600535-26877-1-git-send-email-skomatineni@nvidia.com> <1575600535-26877-9-git-send-email-skomatineni@nvidia.com> From: Dmitry Osipenko Message-ID: <0ce2e83b-800c-da1e-7a3c-3cf1427cfe20@gmail.com> Date: Sat, 7 Dec 2019 17:58:36 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <1575600535-26877-9-git-send-email-skomatineni@nvidia.com> Content-Language: en-US X-Mailman-Approved-At: Mon, 09 Dec 2019 10:51:21 +0100 Cc: alsa-devel@alsa-project.org, pgaikwad@nvidia.com, spujar@nvidia.com, linux-kernel@vger.kernel.org, josephl@nvidia.com, linux-clk@vger.kernel.org, arnd@arndb.de, daniel.lezcano@linaro.org, krzk@kernel.org, mturquette@baylibre.com, devicetree@vger.kernel.org, mmaddireddy@nvidia.com, markz@nvidia.com, alexios.zavras@intel.com, broonie@kernel.org, linux-tegra@vger.kernel.org, horms+renesas@verge.net.au, tiwai@suse.com, allison@lohutok.net, pdeschrijver@nvidia.com, lgirdwood@gmail.com, vidyas@nvidia.com, Jisheng.Zhang@synaptics.com Subject: Re: [alsa-devel] [PATCH v3 08/15] ASoC: tegra: Add audio mclk control through clk_out_1 and extern1 X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" MDYuMTIuMjAxOSAwNTo0OCwgU293amFueWEgS29tYXRpbmVuaSDQv9C40YjQtdGCOgo+IEN1cnJl bnQgQVNvQyBkcml2ZXIgdXNlcyBleHRlcm4xIGFzIGNkZXYxIGNsb2NrIGZyb20gVGVncmEzMCBv bndhcmRzCj4gdGhyb3VnaCBkZXZpY2UgdHJlZS4KPiAKPiBBY3R1YWwgYXVkaW8gbWNsayBpcyBj bGtfb3V0XzEgYW5kIHRvIHVzZSBQTExBIGZvciBtY2xrIHJhdGUgY29udHJvbCwKPiBuZWVkIHRv IGNsa19vdXRfMV9tdXggcGFyZW50IHRvIGV4dGVybjEgYW5kIGV4dGVybjEgcGFyZW50IHRvIFBM TEFfT1VUMC4KPiAKPiBDdXJyZW50bHkgVGVncmEgY2xvY2sgZHJpdmVyIGluaXQgc2V0cyB0aGUg cGFyZW50cyBhbmQgZW5hYmxlcyBib3RoCj4gY2xrX291dF8xIGFuZCBleHRlcm4xIGNsb2Nrcy4g QnV0IHRoZXNlIGNsb2NrcyBwYXJlbnQgYW5kIGVuYWJsZXMgc2hvdWxkCj4gYmUgY29udHJvbGxl ZCBieSBBU29DIGRyaXZlci4KPiAKPiBDbG9jayBwYXJlbnRzIGNhbiBiZSBzcGVjaWZpZWQgaW4g ZGV2aWNlIHRyZWUgdXNpbmcgYXNzaWduZWQtY2xvY2tzCj4gYW5kIGFzc2lnbmVkLWNsb2NrLXBh cmVudHMuCj4gCj4gVG8gZW5hYmxlIGF1ZGlvIG1jbGssIGJvdGggY2xrX291dF8xIGFuZCBleHRl cm4xIGNsb2NrcyBuZWVkIHRvIGJlCj4gZW5hYmxlZC4KPiAKPiBUaGlzIHBhdGNoIGNvbmZpZ3Vy ZXMgcGFyZW50cyBmb3IgY2xrX291dF8xIGFuZCBleHRlcm4xIGNsb2NrcyBpZiBkZXZpY2UKPiB0 cmVlIGRvZXMgbm90IHNwZWNpZnkgY2xvY2sgcGFyZW50cyBpbm9yZGVyIHRvIHN1cHBvcnQgb2xk IGRldmljZSB0cmVlCj4gYW5kIGNvbnRyb2xzIG1jbGsgdXNpbmcgYm90aCBjbGtfb3V0XzEgYW5k IGV4dGVybjEgY2xvY2tzLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFNvd2phbnlhIEtvbWF0aW5lbmkg PHNrb21hdGluZW5pQG52aWRpYS5jb20+Cj4gLS0tCj4gIHNvdW5kL3NvYy90ZWdyYS90ZWdyYV9h c29jX3V0aWxzLmMgfCA2NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ ICBzb3VuZC9zb2MvdGVncmEvdGVncmFfYXNvY191dGlscy5oIHwgIDEgKwo+ICAyIGZpbGVzIGNo YW5nZWQsIDY3IGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3Jh L3RlZ3JhX2Fzb2NfdXRpbHMuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hc29jX3V0aWxzLmMK PiBpbmRleCA1MzZhNTc4ZTk1MTIuLjhlM2EzNzQwZGY3YyAxMDA2NDQKPiAtLS0gYS9zb3VuZC9z b2MvdGVncmEvdGVncmFfYXNvY191dGlscy5jCj4gKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3Jh X2Fzb2NfdXRpbHMuYwo+IEBAIC02MCw2ICs2MCw3IEBAIGludCB0ZWdyYV9hc29jX3V0aWxzX3Nl dF9yYXRlKHN0cnVjdCB0ZWdyYV9hc29jX3V0aWxzX2RhdGEgKmRhdGEsIGludCBzcmF0ZSwKPiAg CWRhdGEtPnNldF9tY2xrID0gMDsKPiAgCj4gIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YS0+ Y2xrX2NkZXYxKTsKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYXRhLT5jbGtfZXh0ZXJuMSk7 Cj4gIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YS0+Y2xrX3BsbF9hX291dDApOwo+ICAJY2xr X2Rpc2FibGVfdW5wcmVwYXJlKGRhdGEtPmNsa19wbGxfYSk7Cj4gIAo+IEBAIC04OSw2ICs5MCwx NCBAQCBpbnQgdGVncmFfYXNvY191dGlsc19zZXRfcmF0ZShzdHJ1Y3QgdGVncmFfYXNvY191dGls c19kYXRhICpkYXRhLCBpbnQgc3JhdGUsCj4gIAkJcmV0dXJuIGVycjsKPiAgCX0KPiAgCj4gKwlp ZiAoIUlTX0VSUl9PUl9OVUxMKGRhdGEtPmNsa19leHRlcm4xKSkgewo+ICsJCWVyciA9IGNsa19w cmVwYXJlX2VuYWJsZShkYXRhLT5jbGtfZXh0ZXJuMSk7Cj4gKwkJaWYgKGVycikgewo+ICsJCQlk ZXZfZXJyKGRhdGEtPmRldiwgIkNhbid0IGVuYWJsZSBleHRlcm4xOiAlZFxuIiwgZXJyKTsKPiAr CQkJcmV0dXJuIGVycjsKPiArCQl9Cj4gKwl9Cj4gKwo+ICAJZXJyID0gY2xrX3ByZXBhcmVfZW5h YmxlKGRhdGEtPmNsa19jZGV2MSk7Cj4gIAlpZiAoZXJyKSB7Cj4gIAkJZGV2X2VycihkYXRhLT5k ZXYsICJDYW4ndCBlbmFibGUgY2RldjE6ICVkXG4iLCBlcnIpOwo+IEBAIC0xMDksNiArMTE4LDcg QEAgaW50IHRlZ3JhX2Fzb2NfdXRpbHNfc2V0X2FjOTdfcmF0ZShzdHJ1Y3QgdGVncmFfYXNvY191 dGlsc19kYXRhICpkYXRhKQo+ICAJaW50IGVycjsKPiAgCj4gIAljbGtfZGlzYWJsZV91bnByZXBh cmUoZGF0YS0+Y2xrX2NkZXYxKTsKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYXRhLT5jbGtf ZXh0ZXJuMSk7Cj4gIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YS0+Y2xrX3BsbF9hX291dDAp Owo+ICAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhdGEtPmNsa19wbGxfYSk7Cj4gIAo+IEBAIC0x NDIsNiArMTUyLDE0IEBAIGludCB0ZWdyYV9hc29jX3V0aWxzX3NldF9hYzk3X3JhdGUoc3RydWN0 IHRlZ3JhX2Fzb2NfdXRpbHNfZGF0YSAqZGF0YSkKPiAgCQlyZXR1cm4gZXJyOwo+ICAJfQo+ICAK PiArCWlmICghSVNfRVJSX09SX05VTEwoZGF0YS0+Y2xrX2V4dGVybjEpKSB7Cj4gKwkJZXJyID0g Y2xrX3ByZXBhcmVfZW5hYmxlKGRhdGEtPmNsa19leHRlcm4xKTsKPiArCQlpZiAoZXJyKSB7Cj4g KwkJCWRldl9lcnIoZGF0YS0+ZGV2LCAiQ2FuJ3QgZW5hYmxlIGV4dGVybjE6ICVkXG4iLCBlcnIp Owo+ICsJCQlyZXR1cm4gZXJyOwo+ICsJCX0KPiArCX0KCldoeSB0aGlzIGlzIG5lZWRlZCBnaXZl biB0aGF0IGNsa19leHRlcm4xIGlzIGVpdGhlciBhIGNoaWxkIG9mIE1DTEsgb3IKTUNMSyBpdHNl bGYgKG9uIFQyMCk/IFRoZSBjaGlsZCBjbG9ja3MgYXJlIGVuYWJsZWQgd2hlbiB0aGUgcGFyZW50 IGlzCmVuYWJsZWQuCgo+ICAJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhdGEtPmNsa19jZGV2 MSk7Cj4gIAlpZiAoZXJyKSB7Cj4gIAkJZGV2X2VycihkYXRhLT5kZXYsICJDYW4ndCBlbmFibGUg Y2RldjE6ICVkXG4iLCBlcnIpOwo+IEBAIC0xNTgsNiArMTc2LDcgQEAgRVhQT1JUX1NZTUJPTF9H UEwodGVncmFfYXNvY191dGlsc19zZXRfYWM5N19yYXRlKTsKPiAgaW50IHRlZ3JhX2Fzb2NfdXRp bHNfaW5pdChzdHJ1Y3QgdGVncmFfYXNvY191dGlsc19kYXRhICpkYXRhLAo+ICAJCQkgIHN0cnVj dCBkZXZpY2UgKmRldikKPiAgewo+ICsJc3RydWN0IGNsayAqY2xrX291dF8xX211eDsKPiAgCWlu dCByZXQ7Cj4gIAo+ICAJZGF0YS0+ZGV2ID0gZGV2Owo+IEBAIC0xOTYsNiArMjE1LDUxIEBAIGlu dCB0ZWdyYV9hc29jX3V0aWxzX2luaXQoc3RydWN0IHRlZ3JhX2Fzb2NfdXRpbHNfZGF0YSAqZGF0 YSwKPiAgCQlnb3RvIGVycl9wdXRfcGxsX2Ffb3V0MDsKPiAgCX0KSW4gYSBwcmV2aW91cyBwYXRj aCB5b3UgYWRkZWQgZmFsbGJhY2sgdG8gRVhUUEVSSVBIIHdoZW4gY2xrX2dldChNQ0xLKQpmYWls cy4gVGhpcyB3aWxsIHdvcmsgcGVyZmVjdGx5IGZpbmUgZm9yIHRoZSBvbGRlciBrZXJuZWxzIHdo aWNoIGhhdmUKYWxsIGNsb2NrcyBpbiB0aGUgc2FtZSBzaW5nbGUgQ2FSIGRyaXZlciwgYnV0IHRo aXMgbWF5IG5vdCB3b3JrIHRoYXQKZ3JlYXQgZm9yIHRoZSBuZXdlciBrZXJuZWxzIGJlY2F1c2Ug UE1DIGRyaXZlciBpc24ndCByZWdpc3RlcmVkIGVhcmx5CmR1cmluZyBib290IGFuZCB0aHVzIGl0 IGlzIHBvc3NpYmxlIHRvIGdldCBhIGxlZ2l0IC1FUFJPQkVfREVGRVIgd2hpY2gKc2hvdWxkbid0 IGJlIGlnbm9yZWQuIEluIG90aGVyIHdvcmRzLCB5b3UgbmVlZCB0byBhZGQgaW50byB0aGlzIHBh dGNoIGEKY2hlY2sgZm9yIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGNsa19nZXQoTUNMSykg YW5kIGZhbGxiYWNrIG9ubHkgZm9yCi1FSU5WQUwuCgo+ICsJLyoKPiArCSAqIElmIGNsb2NrIHBh cmVudHMgYXJlIG5vdCBzZXQgaW4gRFQsIGNvbmZpZ3VyZSBoZXJlIHRvIHVzZSBjbGtfb3V0XzEK PiArCSAqIGFzIG1jbGsgYW5kIGV4dGVybjEgYXMgcGFyZW50IGZvciBUZWdyYTMwIGFuZCBoaWdo ZXIuCj4gKwkgKi8KPiArCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJhc3Np Z25lZC1jbG9jay1wYXJlbnRzIiwgTlVMTCkgJiYKPiArCSAgICBkYXRhLT5zb2MgPiBURUdSQV9B U09DX1VUSUxTX1NPQ19URUdSQTIwKSB7Cj4gKwkJZGF0YS0+Y2xrX2V4dGVybjEgPSBjbGtfZ2V0 X3N5cygiY2xrX291dF8xIiwgImV4dGVybjEiKTsKPiArCQlpZiAoSVNfRVJSKGRhdGEtPmNsa19l eHRlcm4xKSkgewo+ICsJCQlkZXZfZXJyKGRhdGEtPmRldiwgIkNhbid0IHJldHJpZXZlIGNsayBl eHRlcm4xXG4iKTsKPiArCQkJcmV0ID0gUFRSX0VSUihkYXRhLT5jbGtfZXh0ZXJuMSk7Cj4gKwkJ CWdvdG8gZXJyX3B1dF9jZGV2MTsKPiArCQl9Cj4gKwo+ICsJCXJldCA9IGNsa19zZXRfcGFyZW50 KGRhdGEtPmNsa19leHRlcm4xLCBkYXRhLT5jbGtfcGxsX2Ffb3V0MCk7Cj4gKwkJaWYgKHJldCA8 IDApIHsKPiArCQkJZGV2X2VycihkYXRhLT5kZXYsCj4gKwkJCQkiU2V0IHBhcmVudCBmYWlsZWQg Zm9yIGNsayBleHRlcm4xOiAlZFxuIiwKPiArCQkJCXJldCk7Cj4gKwkJCWdvdG8gZXJyX3B1dF9j ZGV2MTsKPiArCQl9Cj4gKwo+ICsJCWNsa19vdXRfMV9tdXggPSBjbGtfZ2V0X3N5cyhOVUxMLCAi Y2xrX291dF8xX211eCIpOwoKTm90ZTE6IGNsa19nZXQoZGV2LCAiY2xrX291dF8xX211eCIpIHNo b3VsZCB3b3JrIGhlcmUgYnkgbGV0dGluZyBjbGsKY29yZSB0byBmYWxsIGJhY2sgdG8gdGhlIGNs a19nZXRfc3lzKCkgYnkgaXRzZWxmLiBFaXRoZXIgd2F5IHNob3VsZCBiZSBnb29kLgoKTm90ZTI6 IGRldm1fY2xrX2dldCgpIGNvdWxkIGJlIHVzZWQgZXZlcnl3aGVyZSBoZXJlLiBNYXliZSBpdCB3 b24ndCBodXJ0CnRvIGNvbnZlcnQgdGVncmFfYXNvY191dGlscyB0byB1c2UgbWFuYWdlZCByZXNv dXJjZXMgdG8ga2VlcCBjb2RlIGEgYml0CmNsZWFuZXIuIEl0IHNob3VsZCBiZSBhIHNlcGFyYXRl IHBhdGNoLgoKPiArCQlpZiAoSVNfRVJSKGNsa19vdXRfMV9tdXgpKSB7Cj4gKwkJCWRldl9lcnIo ZGF0YS0+ZGV2LCAiQ2FuJ3QgcmV0cmlldmUgY2xrIGNsa19vdXRfMV9tdXhcbiIpOwo+ICsJCQly ZXQgPSBQVFJfRVJSKGNsa19vdXRfMV9tdXgpOwo+ICsJCQlnb3RvIGVycl9wdXRfY2RldjE7Cj4g KwkJfQo+ICsKPiArCQlyZXQgPSBjbGtfc2V0X3BhcmVudChjbGtfb3V0XzFfbXV4LCBkYXRhLT5j bGtfZXh0ZXJuMSk7Cj4gKwkJaWYgKHJldCA8IDApIHsKPiArCQkJZGV2X2VycihkYXRhLT5kZXYs Cj4gKwkJCQkiU2V0IHBhcmVudCBmYWlsZWQgZm9yIGNsa19vdXRfMV9tdXg6ICVkXG4iLAo+ICsJ CQkJcmV0KTsKPiArCQkJY2xrX3B1dChjbGtfb3V0XzFfbXV4KTsKPiArCQkJZ290byBlcnJfcHV0 X2NkZXYxOwo+ICsJCX0KCmNsa19wdXQoY2xrX2NkZXYxKTsKCj4gKwkJZGF0YS0+Y2xrX2NkZXYx ID0gY2xrX2dldF9zeXMoTlVMTCwgImNsa19vdXRfMSIpOwo+ICsJCWlmIChJU19FUlIoZGF0YS0+ Y2xrX2NkZXYxKSkgewo+ICsJCQlkZXZfZXJyKGRhdGEtPmRldiwgIkNhbid0IHJldHJpZXZlIGNs ayBjbGtfb3V0XzFcbiIpOwo+ICsJCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmNsa19jZGV2MSk7Cj4g KwkJCWdvdG8gZXJyX3B1dF9jZGV2MTsKCmdvdG8gZXJyX3B1dF9wbGxfYV9vdXQwOwoKPiArCQl9 Cj4gKwl9Cj4gKwo+ICAJcmV0ID0gdGVncmFfYXNvY191dGlsc19zZXRfcmF0ZShkYXRhLCA0NDEw MCwgMjU2ICogNDQxMDApOwo+ICAJaWYgKHJldCkKPiAgCQlnb3RvIGVycl9wdXRfY2RldjE7Cj4g QEAgLTIxNSw2ICsyNzksOCBAQCBFWFBPUlRfU1lNQk9MX0dQTCh0ZWdyYV9hc29jX3V0aWxzX2lu aXQpOwo+ICAKPiAgdm9pZCB0ZWdyYV9hc29jX3V0aWxzX2Zpbmkoc3RydWN0IHRlZ3JhX2Fzb2Nf dXRpbHNfZGF0YSAqZGF0YSkKPiAgewo+ICsJaWYgKCFJU19FUlJfT1JfTlVMTChkYXRhLT5jbGtf ZXh0ZXJuMSkpCj4gKwkJY2xrX3B1dChkYXRhLT5jbGtfZXh0ZXJuMSk7Cj4gIAljbGtfcHV0KGRh dGEtPmNsa19jZGV2MSk7Cj4gIAljbGtfcHV0KGRhdGEtPmNsa19wbGxfYV9vdXQwKTsKPiAgCWNs a19wdXQoZGF0YS0+Y2xrX3BsbF9hKTsKPiBkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3Rl Z3JhX2Fzb2NfdXRpbHMuaCBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hc29jX3V0aWxzLmgKPiBp bmRleCAwYzEzODE4ZGVlNzUuLjVmMmI5NjQ3OGNhZiAxMDA2NDQKPiAtLS0gYS9zb3VuZC9zb2Mv dGVncmEvdGVncmFfYXNvY191dGlscy5oCj4gKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2Fz b2NfdXRpbHMuaAo+IEBAIC0yNSw2ICsyNSw3IEBAIHN0cnVjdCB0ZWdyYV9hc29jX3V0aWxzX2Rh dGEgewo+ICAJc3RydWN0IGNsayAqY2xrX3BsbF9hOwo+ICAJc3RydWN0IGNsayAqY2xrX3BsbF9h X291dDA7Cj4gIAlzdHJ1Y3QgY2xrICpjbGtfY2RldjE7Cj4gKwlzdHJ1Y3QgY2xrICpjbGtfZXh0 ZXJuMTsKPiAgCWludCBzZXRfYmFzZWNsb2NrOwo+ICAJaW50IHNldF9tY2xrOwo+ICB9Owo+IAoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWxzYS1kZXZl bCBtYWlsaW5nIGxpc3QKQWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCmh0dHBzOi8vbWFpbG1h bi5hbHNhLXByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8vYWxzYS1kZXZlbAo=