From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B08D614F6C for ; Tue, 14 May 2024 07:51:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715673071; cv=none; b=lwwnvlcCjXvv+islSIusTDjqNqpTrdQUVp4Y6LMIdxHYVWFs3plj1e0aL/fLm22DgM4XeE2QWIw4SOPpcP9VJPWtJbYxm0TP3AAmcD3pvg21olvlMzfs137a1WF5REjvcIYpIpnpR2p0THFPS/NUwW383U0Rj5NbIYbRrURpIUY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715673071; c=relaxed/simple; bh=krG1zVaK3l/29Cmol8z1CCc8GFVbvQaFOBN40o6k7w0=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=X60C0Azlb+HN8xFFihUCf5wbrJTCIdDt0TqX/Rhld1912r6a7NCpbWFh7xXT4+e8gMpC3nTcofkYGeTVgv1QaNvEv0CuiEaneQSoCug/6unNf+eSqs0ulgBD20WaS5yhEhO6eFRuKzeajsDu5fZ4J0U7FVrO/S/IDslcPKb0P2U= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=n+02EKDX; arc=none smtp.client-ip=209.85.218.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="n+02EKDX" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-a5a88339780so59088966b.0 for ; Tue, 14 May 2024 00:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1715673066; x=1716277866; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=8BO15yDmXpBmEarxhd2q42jHVox3qmbWZ3jkNFDgX8g=; b=n+02EKDX4aYaz2vVM7OUNUQ+1V7r/lcX/XwTeiBbBKfnCzZE+iA18MGFbt3X3+YGV2 Ywa9AYXw0TUmiQ00NH3nOdM7GiPIzJLf4/uCjUM5OwQ3Oj3WcDVB4Eis62AmX15/oTGy 5DtCfvEcSn+eDxLxxfVHke1yfsbVCe2vFmQkevx7uI0hOd2qDdBKbRTIBhsP3EhZaFnq 5V71v6GI9oZv48tiaHV1918k7LQ8WPLmhKd4rzVjkou7E8ypbhFEbTIfhkJl51Fv5ctA r1BzZ0qLvDEXOBnwfL1KiCLetTIALWIwDHIUdSjevkZJA6GgAhge+iGC1DmQi6gYwNqA +bKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715673066; x=1716277866; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8BO15yDmXpBmEarxhd2q42jHVox3qmbWZ3jkNFDgX8g=; b=s3zg4/z5UGrgTCOfwdHDqLimwyZbTE5X86TWUOoE/mcNDH6l5NDQqEZuaZnJ2CBvF3 k89HLE3G0Fsxpxj3P3xKgwJ70a1lkMUx5MdzSEZO+5lbiOysASDtkWB3B+G4htKGf5bH 5XwuYtCYHnVXHeHMFnfQHwVALqqcX6Mcc8zTUPL/X4VGT4G7NH6Y4ZLymAZQd9gagK4I aR0tcHAMg3qiB1iDF1sgfAA5PkBXihJ/IjABVJhr0m6ZDhBnrK4eRnPYuHBflY2fHMMN Uorcs4ob1Fg5UBuh7X1tOXe4ElYNj7oqeiNSNxHI4M+HqvbHFHY+qFB2fbNk7V2lKvxr ABDg== X-Forwarded-Encrypted: i=1; AJvYcCW82lvhKfnY4i+ed3bjH/MmyZpAv6Mxle1nBOWz3B+9uMjYQZn+pv8oPOjS0nlrzL9GRXx75V7tDBAl0UN3P8cO/BmsqJM/85K4ggjUZw== X-Gm-Message-State: AOJu0YwMRX9xkyhGM0C2Y/BsE6S4jPvvkx5O4LssC4ewSelkRxFqyMov 16gytviR3/lB4ckwbW2HU4MLtwfgas25RJkPEGUtFvmqNHUYHMLQZwGUDBvO6w== X-Google-Smtp-Source: AGHT+IHUaJLFnIiuyoFrpGYTc0NWLuj5PD6zueiu7Svp/b7aCdLGs7X2LzBVH8yZwX48aFr540/JLA== X-Received: by 2002:a50:d516:0:b0:56f:e75b:83aa with SMTP id 4fb4d7f45d1cf-5734d5c17b7mr8876915a12.6.1715673065886; Tue, 14 May 2024 00:51:05 -0700 (PDT) Received: from thinkpad ([149.14.240.163]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5733bed000esm7215529a12.54.2024.05.14.00.51.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 May 2024 00:51:05 -0700 (PDT) Date: Tue, 14 May 2024 09:51:04 +0200 From: Manivannan Sadhasivam To: Alexandru Gagniuc Cc: Bjorn Andersson , Konrad Dybcio , Lorenzo Pieralisi , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Rob Herring , Bjorn Helgaas , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Michael Turquette , Stephen Boyd , linux-arm-msm@vger.kernel.org, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-clk@vger.kernel.org Subject: Re: [PATCH v4 RESEND 4/8] PCI: qcom: Switch to devm_clk_bulk_get_all() API to get the clocks from Devicetree Message-ID: <20240514075104.GC2463@thinkpad> References: <20240501042847.1545145-1-mr.nuke.me@gmail.com> <20240501042847.1545145-5-mr.nuke.me@gmail.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20240501042847.1545145-5-mr.nuke.me@gmail.com> On Tue, Apr 30, 2024 at 11:28:43PM -0500, Alexandru Gagniuc wrote: > From: Manivannan Sadhasivam > > There is no need for the device drivers to validate the clocks defined in > Devicetree. The validation should be performed by the DT schema and the > drivers should just get all the clocks from DT. Right now the driver > hardcodes the clock info and validates them against DT which is redundant. > > So use devm_clk_bulk_get_all() that just gets all the clocks defined in DT > and get rid of all static clocks info from the driver. This simplifies the > driver. > > Signed-off-by: Manivannan Sadhasivam > Signed-off-by: Alexandru Gagniuc > [moved clks to struct qcom_pcie to reduce code duplication] This patch is already applied to pci tree. So hopefully you can just rebase it on top of pci/next for next version (it should get updated soon). - Mani > --- > drivers/pci/controller/dwc/pcie-qcom.c | 163 ++++--------------------- > 1 file changed, 25 insertions(+), 138 deletions(-) > > diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c > index 14772edcf0d3..ea81ff68d433 100644 > --- a/drivers/pci/controller/dwc/pcie-qcom.c > +++ b/drivers/pci/controller/dwc/pcie-qcom.c > @@ -154,58 +154,42 @@ > #define QCOM_PCIE_LINK_SPEED_TO_BW(speed) \ > Mbps_to_icc(PCIE_SPEED2MBS_ENC(pcie_link_speed[speed])) > > -#define QCOM_PCIE_1_0_0_MAX_CLOCKS 4 > struct qcom_pcie_resources_1_0_0 { > - struct clk_bulk_data clks[QCOM_PCIE_1_0_0_MAX_CLOCKS]; > struct reset_control *core; > struct regulator *vdda; > }; > > -#define QCOM_PCIE_2_1_0_MAX_CLOCKS 5 > #define QCOM_PCIE_2_1_0_MAX_RESETS 6 > #define QCOM_PCIE_2_1_0_MAX_SUPPLY 3 > struct qcom_pcie_resources_2_1_0 { > - struct clk_bulk_data clks[QCOM_PCIE_2_1_0_MAX_CLOCKS]; > struct reset_control_bulk_data resets[QCOM_PCIE_2_1_0_MAX_RESETS]; > int num_resets; > struct regulator_bulk_data supplies[QCOM_PCIE_2_1_0_MAX_SUPPLY]; > }; > > -#define QCOM_PCIE_2_3_2_MAX_CLOCKS 4 > #define QCOM_PCIE_2_3_2_MAX_SUPPLY 2 > struct qcom_pcie_resources_2_3_2 { > - struct clk_bulk_data clks[QCOM_PCIE_2_3_2_MAX_CLOCKS]; > struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY]; > }; > > -#define QCOM_PCIE_2_3_3_MAX_CLOCKS 5 > #define QCOM_PCIE_2_3_3_MAX_RESETS 7 > struct qcom_pcie_resources_2_3_3 { > - struct clk_bulk_data clks[QCOM_PCIE_2_3_3_MAX_CLOCKS]; > struct reset_control_bulk_data rst[QCOM_PCIE_2_3_3_MAX_RESETS]; > }; > > -#define QCOM_PCIE_2_4_0_MAX_CLOCKS 4 > #define QCOM_PCIE_2_4_0_MAX_RESETS 12 > struct qcom_pcie_resources_2_4_0 { > - struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS]; > - int num_clks; > struct reset_control_bulk_data resets[QCOM_PCIE_2_4_0_MAX_RESETS]; > int num_resets; > }; > > -#define QCOM_PCIE_2_7_0_MAX_CLOCKS 15 > #define QCOM_PCIE_2_7_0_MAX_SUPPLIES 2 > struct qcom_pcie_resources_2_7_0 { > - struct clk_bulk_data clks[QCOM_PCIE_2_7_0_MAX_CLOCKS]; > - int num_clks; > struct regulator_bulk_data supplies[QCOM_PCIE_2_7_0_MAX_SUPPLIES]; > struct reset_control *rst; > }; > > -#define QCOM_PCIE_2_9_0_MAX_CLOCKS 5 > struct qcom_pcie_resources_2_9_0 { > - struct clk_bulk_data clks[QCOM_PCIE_2_9_0_MAX_CLOCKS]; > struct reset_control *rst; > }; > > @@ -247,6 +231,8 @@ struct qcom_pcie { > struct icc_path *icc_mem; > const struct qcom_pcie_cfg *cfg; > struct dentry *debugfs; > + struct clk_bulk_data *clks; > + int num_clks; > bool suspended; > }; > > @@ -337,22 +323,6 @@ static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie) > if (ret) > return ret; > > - res->clks[0].id = "iface"; > - res->clks[1].id = "core"; > - res->clks[2].id = "phy"; > - res->clks[3].id = "aux"; > - res->clks[4].id = "ref"; > - > - /* iface, core, phy are required */ > - ret = devm_clk_bulk_get(dev, 3, res->clks); > - if (ret < 0) > - return ret; > - > - /* aux, ref are optional */ > - ret = devm_clk_bulk_get_optional(dev, 2, res->clks + 3); > - if (ret < 0) > - return ret; > - > res->resets[0].id = "pci"; > res->resets[1].id = "axi"; > res->resets[2].id = "ahb"; > @@ -373,7 +343,7 @@ static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie) > { > struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; > > - clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > reset_control_bulk_assert(res->num_resets, res->resets); > > writel(1, pcie->parf + PARF_PHY_CTRL); > @@ -413,7 +383,6 @@ static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie) > > static int qcom_pcie_post_init_2_1_0(struct qcom_pcie *pcie) > { > - struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0; > struct dw_pcie *pci = pcie->pci; > struct device *dev = pci->dev; > struct device_node *node = dev->of_node; > @@ -425,7 +394,7 @@ static int qcom_pcie_post_init_2_1_0(struct qcom_pcie *pcie) > val &= ~PHY_TEST_PWR_DOWN; > writel(val, pcie->parf + PARF_PHY_CTRL); > > - ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); > + ret = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > if (ret) > return ret; > > @@ -476,21 +445,11 @@ static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie) > struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; > struct dw_pcie *pci = pcie->pci; > struct device *dev = pci->dev; > - int ret; > > res->vdda = devm_regulator_get(dev, "vdda"); > if (IS_ERR(res->vdda)) > return PTR_ERR(res->vdda); > > - res->clks[0].id = "iface"; > - res->clks[1].id = "aux"; > - res->clks[2].id = "master_bus"; > - res->clks[3].id = "slave_bus"; > - > - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks); > - if (ret < 0) > - return ret; > - > res->core = devm_reset_control_get_exclusive(dev, "core"); > return PTR_ERR_OR_ZERO(res->core); > } > @@ -500,7 +459,7 @@ static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie) > struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0; > > reset_control_assert(res->core); > - clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > regulator_disable(res->vdda); > } > > @@ -517,7 +476,7 @@ static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie) > return ret; > } > > - ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); > + ret = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > if (ret) { > dev_err(dev, "cannot prepare/enable clocks\n"); > goto err_assert_reset; > @@ -532,7 +491,7 @@ static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie) > return 0; > > err_disable_clks: > - clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > err_assert_reset: > reset_control_assert(res->core); > > @@ -580,15 +539,6 @@ static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie) > if (ret) > return ret; > > - res->clks[0].id = "aux"; > - res->clks[1].id = "cfg"; > - res->clks[2].id = "bus_master"; > - res->clks[3].id = "bus_slave"; > - > - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks); > - if (ret < 0) > - return ret; > - > return 0; > } > > @@ -596,7 +546,7 @@ static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie) > { > struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2; > > - clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); > } > > @@ -613,7 +563,7 @@ static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie) > return ret; > } > > - ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); > + ret = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > if (ret) { > dev_err(dev, "cannot prepare/enable clocks\n"); > regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); > @@ -661,18 +611,6 @@ static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie) > bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019"); > int ret; > > - res->clks[0].id = "aux"; > - res->clks[1].id = "master_bus"; > - res->clks[2].id = "slave_bus"; > - res->clks[3].id = "iface"; > - > - /* qcom,pcie-ipq4019 is defined without "iface" */ > - res->num_clks = is_ipq ? 3 : 4; > - > - ret = devm_clk_bulk_get(dev, res->num_clks, res->clks); > - if (ret < 0) > - return ret; > - > res->resets[0].id = "axi_m"; > res->resets[1].id = "axi_s"; > res->resets[2].id = "axi_m_sticky"; > @@ -700,7 +638,7 @@ static void qcom_pcie_deinit_2_4_0(struct qcom_pcie *pcie) > struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0; > > reset_control_bulk_assert(res->num_resets, res->resets); > - clk_bulk_disable_unprepare(res->num_clks, res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > } > > static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie) > @@ -726,7 +664,7 @@ static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie) > > usleep_range(10000, 12000); > > - ret = clk_bulk_prepare_enable(res->num_clks, res->clks); > + ret = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > if (ret) { > reset_control_bulk_assert(res->num_resets, res->resets); > return ret; > @@ -742,16 +680,6 @@ static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie) > struct device *dev = pci->dev; > int ret; > > - res->clks[0].id = "iface"; > - res->clks[1].id = "axi_m"; > - res->clks[2].id = "axi_s"; > - res->clks[3].id = "ahb"; > - res->clks[4].id = "aux"; > - > - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks); > - if (ret < 0) > - return ret; > - > res->rst[0].id = "axi_m"; > res->rst[1].id = "axi_s"; > res->rst[2].id = "pipe"; > @@ -769,9 +697,7 @@ static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie) > > static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie) > { > - struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3; > - > - clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > } > > static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie) > @@ -801,7 +727,7 @@ static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie) > */ > usleep_range(2000, 2500); > > - ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); > + ret = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > if (ret) { > dev_err(dev, "cannot prepare/enable clocks\n"); > goto err_assert_resets; > @@ -862,8 +788,6 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie) > struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; > struct dw_pcie *pci = pcie->pci; > struct device *dev = pci->dev; > - unsigned int num_clks, num_opt_clks; > - unsigned int idx; > int ret; > > res->rst = devm_reset_control_array_get_exclusive(dev); > @@ -877,37 +801,6 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie) > if (ret) > return ret; > > - idx = 0; > - res->clks[idx++].id = "aux"; > - res->clks[idx++].id = "cfg"; > - res->clks[idx++].id = "bus_master"; > - res->clks[idx++].id = "bus_slave"; > - res->clks[idx++].id = "slave_q2a"; > - > - num_clks = idx; > - > - ret = devm_clk_bulk_get(dev, num_clks, res->clks); > - if (ret < 0) > - return ret; > - > - res->clks[idx++].id = "tbu"; > - res->clks[idx++].id = "ddrss_sf_tbu"; > - res->clks[idx++].id = "aggre0"; > - res->clks[idx++].id = "aggre1"; > - res->clks[idx++].id = "noc_aggr"; > - res->clks[idx++].id = "noc_aggr_4"; > - res->clks[idx++].id = "noc_aggr_south_sf"; > - res->clks[idx++].id = "cnoc_qx"; > - res->clks[idx++].id = "sleep"; > - res->clks[idx++].id = "cnoc_sf_axi"; > - > - num_opt_clks = idx - num_clks; > - res->num_clks = idx; > - > - ret = devm_clk_bulk_get_optional(dev, num_opt_clks, res->clks + num_clks); > - if (ret < 0) > - return ret; > - > return 0; > } > > @@ -925,7 +818,7 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie) > return ret; > } > > - ret = clk_bulk_prepare_enable(res->num_clks, res->clks); > + ret = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > if (ret < 0) > goto err_disable_regulators; > > @@ -977,7 +870,7 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie) > > return 0; > err_disable_clocks: > - clk_bulk_disable_unprepare(res->num_clks, res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > err_disable_regulators: > regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); > > @@ -1015,7 +908,7 @@ static void qcom_pcie_deinit_2_7_0(struct qcom_pcie *pcie) > { > struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0; > > - clk_bulk_disable_unprepare(res->num_clks, res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > > regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies); > } > @@ -1101,17 +994,6 @@ static int qcom_pcie_get_resources_2_9_0(struct qcom_pcie *pcie) > struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0; > struct dw_pcie *pci = pcie->pci; > struct device *dev = pci->dev; > - int ret; > - > - res->clks[0].id = "iface"; > - res->clks[1].id = "axi_m"; > - res->clks[2].id = "axi_s"; > - res->clks[3].id = "axi_bridge"; > - res->clks[4].id = "rchng"; > - > - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks); > - if (ret < 0) > - return ret; > > res->rst = devm_reset_control_array_get_exclusive(dev); > if (IS_ERR(res->rst)) > @@ -1122,9 +1004,7 @@ static int qcom_pcie_get_resources_2_9_0(struct qcom_pcie *pcie) > > static void qcom_pcie_deinit_2_9_0(struct qcom_pcie *pcie) > { > - struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0; > - > - clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks); > + clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks); > } > > static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie) > @@ -1153,7 +1033,7 @@ static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie) > > usleep_range(2000, 2500); > > - return clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks); > + return clk_bulk_prepare_enable(pcie->num_clks, pcie->clks); > } > > static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie) > @@ -1561,6 +1441,13 @@ static int qcom_pcie_probe(struct platform_device *pdev) > goto err_pm_runtime_put; > } > > + pcie->num_clks = devm_clk_bulk_get_all(dev, &pcie->clks); > + if (pcie->num_clks < 0) { > + ret = pcie->num_clks; > + dev_err(dev, "Failed to get clocks\n"); > + goto err_pm_runtime_put; > + } > + > ret = qcom_pcie_icc_init(pcie); > if (ret) > goto err_pm_runtime_put; > -- > 2.40.1 > -- மணிவண்ணன் சதாசிவம் 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6A3F8C04FFE for ; Tue, 14 May 2024 07:51:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=PFU/QwsK/NNpc2n+XlcPxMyA5HHU6hTJKUkHBRfRsgk=; b=QkdG9NbRmxjtgB PD7oIg/GHLrVE7wqK5PQWzkbB6bzKgzfeWUzVWDFzNaoK7XBeBsqxFPNt0pu9CyeZL4kRAVp1p3kk KzwOvjy8sEL2uwI4uGrr/I5lm9mft1TiVGDzrIaaysuKPWfHTU9Glim/HH1GXq8ZtnwPC2zAMypBh CS8Lih1GnUG0ZSiUAi6hdTApHUknPU8gQ9KIi0QeIKzVQ8P0r+cZtu3F9mv116whPDqShRciEgyjQ fv373j3MbmTeav3DgDUCMkr1g4jgqxuzEVMqdjArlPGudbLxBWGmOdsjnZPS36A9p5BmehvTMMW+T wI6gfupy7tSeZ8vrTiTg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s6mwL-0000000FHKQ-08cG; Tue, 14 May 2024 07:51:13 +0000 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s6mwH-0000000FHJx-0xCu for linux-phy@lists.infradead.org; Tue, 14 May 2024 07:51:11 +0000 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-a59cf8140d0so1197451466b.3 for ; Tue, 14 May 2024 00:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1715673066; x=1716277866; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=8BO15yDmXpBmEarxhd2q42jHVox3qmbWZ3jkNFDgX8g=; b=p91Mw+Fm9hepfizCCMFguzJobs1X07SuM/0oiOLQWMVXrbj9v/W7WyEGiAYgRv/3eW 5l0sCJw+Qc68bDUejpsQFGtjtJyrSICqrjBcaLshlRsiYpBUDx7+LzCmSCAJR0j7U6/k ygNHknyFlbgMPReSmdssluJxZkoGkBse8xigEhiXPIMJboQ4AkryheLvcuc8PESaRRPB xLPspRscds/ZPIzTNKNlWO3glxOM208LVDdvwwKEvdMOOsCPeIkjiURscws9WgE9OeNk k0W8uYPDTm3PMJ6hkqEvhOrdX6+JjmXdCydsQ2IBHGR4gD1pcVoaC0PAnHQ7+fZac4cT C70Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715673066; x=1716277866; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8BO15yDmXpBmEarxhd2q42jHVox3qmbWZ3jkNFDgX8g=; b=RjHHPslalA60IothWxyYexQP4cDZm9MIX1wH3QxaSq6MLvNsHPCe0jMHNsT4vAF5i+ X48Sev8igxQW681ya2NhH0ZQt7k93Wan5VMeAffELX8/RgWlU6gcOmX2mej2cqkSEuG3 EAuspNKPgYUNU/07jtivrRgiVY/2imnHNZ1KUf4719QScUhORW1QPgMsS/NKGEOgtKKX hke0ufKh6wdSlp5QW5km1OZ/bp+fdYuiGqojAzOMjF+FYapNI/9QPkDaxDg8P0X1fHeL mx+UnPmBoogOIitVFSeXlERuxTd1M0RiTLYti4OR3i28nmg5IK7o446fAHyIKZaBjvJn OMqg== X-Forwarded-Encrypted: i=1; AJvYcCXmWviyOC3879GsSEFJ0SRaVV8QtYQwHkqt7NbSqMYP/Xy0rFhEvRVGvQYWD646qezqIkS8W1beFBDWqXlK7HNfGMT0quO7fL/NUFg8OA== X-Gm-Message-State: AOJu0YyKjJjGjFgK3WSVbGmMz802lCSBVG4UHLVWrnu4D6y70IYnXKN/ yRPYCDSiUEbOw7ttmvzNJvclRvPQjHXAZR1GPC0Fz5JjYWYzW7/ad9uSds64+w== X-Google-Smtp-Source: AGHT+IHUaJLFnIiuyoFrpGYTc0NWLuj5PD6zueiu7Svp/b7aCdLGs7X2LzBVH8yZwX48aFr540/JLA== X-Received: by 2002:a50:d516:0:b0:56f:e75b:83aa with SMTP id 4fb4d7f45d1cf-5734d5c17b7mr8876915a12.6.1715673065886; Tue, 14 May 2024 00:51:05 -0700 (PDT) Received: from thinkpad ([149.14.240.163]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5733bed000esm7215529a12.54.2024.05.14.00.51.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 May 2024 00:51:05 -0700 (PDT) Date: Tue, 14 May 2024 09:51:04 +0200 From: Manivannan Sadhasivam To: Alexandru Gagniuc Cc: Bjorn Andersson , Konrad Dybcio , Lorenzo Pieralisi , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Rob Herring , Bjorn Helgaas , Krzysztof Kozlowski , Conor Dooley , Vinod Koul , Kishon Vijay Abraham I , Michael Turquette , Stephen Boyd , linux-arm-msm@vger.kernel.org, linux-pci@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-clk@vger.kernel.org Subject: Re: [PATCH v4 RESEND 4/8] PCI: qcom: Switch to devm_clk_bulk_get_all() API to get the clocks from Devicetree Message-ID: <20240514075104.GC2463@thinkpad> References: <20240501042847.1545145-1-mr.nuke.me@gmail.com> <20240501042847.1545145-5-mr.nuke.me@gmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240501042847.1545145-5-mr.nuke.me@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240514_005109_318338_567D55CB X-CRM114-Status: GOOD ( 29.17 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org T24gVHVlLCBBcHIgMzAsIDIwMjQgYXQgMTE6Mjg6NDNQTSAtMDUwMCwgQWxleGFuZHJ1IEdhZ25p dWMgd3JvdGU6Cj4gRnJvbTogTWFuaXZhbm5hbiBTYWRoYXNpdmFtIDxtYW5pdmFubmFuLnNhZGhh c2l2YW1AbGluYXJvLm9yZz4KPiAKPiBUaGVyZSBpcyBubyBuZWVkIGZvciB0aGUgZGV2aWNlIGRy aXZlcnMgdG8gdmFsaWRhdGUgdGhlIGNsb2NrcyBkZWZpbmVkIGluCj4gRGV2aWNldHJlZS4gVGhl IHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBieSB0aGUgRFQgc2NoZW1hIGFuZCB0aGUK PiBkcml2ZXJzIHNob3VsZCBqdXN0IGdldCBhbGwgdGhlIGNsb2NrcyBmcm9tIERULiBSaWdodCBu b3cgdGhlIGRyaXZlcgo+IGhhcmRjb2RlcyB0aGUgY2xvY2sgaW5mbyBhbmQgdmFsaWRhdGVzIHRo ZW0gYWdhaW5zdCBEVCB3aGljaCBpcyByZWR1bmRhbnQuCj4gCj4gU28gdXNlIGRldm1fY2xrX2J1 bGtfZ2V0X2FsbCgpIHRoYXQganVzdCBnZXRzIGFsbCB0aGUgY2xvY2tzIGRlZmluZWQgaW4gRFQK PiBhbmQgZ2V0IHJpZCBvZiBhbGwgc3RhdGljIGNsb2NrcyBpbmZvIGZyb20gdGhlIGRyaXZlci4g VGhpcyBzaW1wbGlmaWVzIHRoZQo+IGRyaXZlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBNYW5pdmFu bmFuIFNhZGhhc2l2YW0gPG1hbml2YW5uYW4uc2FkaGFzaXZhbUBsaW5hcm8ub3JnPgo+IFNpZ25l ZC1vZmYtYnk6IEFsZXhhbmRydSBHYWduaXVjIDxtci5udWtlLm1lQGdtYWlsLmNvbT4KPiBbbW92 ZWQgY2xrcyB0byBzdHJ1Y3QgcWNvbV9wY2llIHRvIHJlZHVjZSBjb2RlIGR1cGxpY2F0aW9uXQoK VGhpcyBwYXRjaCBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gcGNpIHRyZWUuIFNvIGhvcGVmdWxseSB5 b3UgY2FuIGp1c3QgcmViYXNlIGl0Cm9uIHRvcCBvZiBwY2kvbmV4dCBmb3IgbmV4dCB2ZXJzaW9u IChpdCBzaG91bGQgZ2V0IHVwZGF0ZWQgc29vbikuCgotIE1hbmkKCj4gLS0tCj4gIGRyaXZlcnMv cGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtcWNvbS5jIHwgMTYzICsrKystLS0tLS0tLS0tLS0tLS0t LS0tLS0KPiAgMSBmaWxlIGNoYW5nZWQsIDI1IGluc2VydGlvbnMoKyksIDEzOCBkZWxldGlvbnMo LSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpZS1xY29t LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLXFjb20uYwo+IGluZGV4IDE0Nzcy ZWRjZjBkMy4uZWE4MWZmNjhkNDMzIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xs ZXIvZHdjL3BjaWUtcWNvbS5jCj4gKysrIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNp ZS1xY29tLmMKPiBAQCAtMTU0LDU4ICsxNTQsNDIgQEAKPiAgI2RlZmluZSBRQ09NX1BDSUVfTElO S19TUEVFRF9UT19CVyhzcGVlZCkgXAo+ICAJCU1icHNfdG9faWNjKFBDSUVfU1BFRUQyTUJTX0VO QyhwY2llX2xpbmtfc3BlZWRbc3BlZWRdKSkKPiAgCj4gLSNkZWZpbmUgUUNPTV9QQ0lFXzFfMF8w X01BWF9DTE9DS1MJCTQKPiAgc3RydWN0IHFjb21fcGNpZV9yZXNvdXJjZXNfMV8wXzAgewo+IC0J c3RydWN0IGNsa19idWxrX2RhdGEgY2xrc1tRQ09NX1BDSUVfMV8wXzBfTUFYX0NMT0NLU107Cj4g IAlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqY29yZTsKPiAgCXN0cnVjdCByZWd1bGF0b3IgKnZkZGE7 Cj4gIH07Cj4gIAo+IC0jZGVmaW5lIFFDT01fUENJRV8yXzFfMF9NQVhfQ0xPQ0tTCQk1Cj4gICNk ZWZpbmUgUUNPTV9QQ0lFXzJfMV8wX01BWF9SRVNFVFMJCTYKPiAgI2RlZmluZSBRQ09NX1BDSUVf Ml8xXzBfTUFYX1NVUFBMWQkJMwo+ICBzdHJ1Y3QgcWNvbV9wY2llX3Jlc291cmNlc18yXzFfMCB7 Cj4gLQlzdHJ1Y3QgY2xrX2J1bGtfZGF0YSBjbGtzW1FDT01fUENJRV8yXzFfMF9NQVhfQ0xPQ0tT XTsKPiAgCXN0cnVjdCByZXNldF9jb250cm9sX2J1bGtfZGF0YSByZXNldHNbUUNPTV9QQ0lFXzJf MV8wX01BWF9SRVNFVFNdOwo+ICAJaW50IG51bV9yZXNldHM7Cj4gIAlzdHJ1Y3QgcmVndWxhdG9y X2J1bGtfZGF0YSBzdXBwbGllc1tRQ09NX1BDSUVfMl8xXzBfTUFYX1NVUFBMWV07Cj4gIH07Cj4g IAo+IC0jZGVmaW5lIFFDT01fUENJRV8yXzNfMl9NQVhfQ0xPQ0tTCQk0Cj4gICNkZWZpbmUgUUNP TV9QQ0lFXzJfM18yX01BWF9TVVBQTFkJCTIKPiAgc3RydWN0IHFjb21fcGNpZV9yZXNvdXJjZXNf Ml8zXzIgewo+IC0Jc3RydWN0IGNsa19idWxrX2RhdGEgY2xrc1tRQ09NX1BDSUVfMl8zXzJfTUFY X0NMT0NLU107Cj4gIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tRQ09NX1BD SUVfMl8zXzJfTUFYX1NVUFBMWV07Cj4gIH07Cj4gIAo+IC0jZGVmaW5lIFFDT01fUENJRV8yXzNf M19NQVhfQ0xPQ0tTCQk1Cj4gICNkZWZpbmUgUUNPTV9QQ0lFXzJfM18zX01BWF9SRVNFVFMJCTcK PiAgc3RydWN0IHFjb21fcGNpZV9yZXNvdXJjZXNfMl8zXzMgewo+IC0Jc3RydWN0IGNsa19idWxr X2RhdGEgY2xrc1tRQ09NX1BDSUVfMl8zXzNfTUFYX0NMT0NLU107Cj4gIAlzdHJ1Y3QgcmVzZXRf Y29udHJvbF9idWxrX2RhdGEgcnN0W1FDT01fUENJRV8yXzNfM19NQVhfUkVTRVRTXTsKPiAgfTsK PiAgCj4gLSNkZWZpbmUgUUNPTV9QQ0lFXzJfNF8wX01BWF9DTE9DS1MJCTQKPiAgI2RlZmluZSBR Q09NX1BDSUVfMl80XzBfTUFYX1JFU0VUUwkJMTIKPiAgc3RydWN0IHFjb21fcGNpZV9yZXNvdXJj ZXNfMl80XzAgewo+IC0Jc3RydWN0IGNsa19idWxrX2RhdGEgY2xrc1tRQ09NX1BDSUVfMl80XzBf TUFYX0NMT0NLU107Cj4gLQlpbnQgbnVtX2Nsa3M7Cj4gIAlzdHJ1Y3QgcmVzZXRfY29udHJvbF9i dWxrX2RhdGEgcmVzZXRzW1FDT01fUENJRV8yXzRfMF9NQVhfUkVTRVRTXTsKPiAgCWludCBudW1f cmVzZXRzOwo+ICB9Owo+ICAKPiAtI2RlZmluZSBRQ09NX1BDSUVfMl83XzBfTUFYX0NMT0NLUwkJ MTUKPiAgI2RlZmluZSBRQ09NX1BDSUVfMl83XzBfTUFYX1NVUFBMSUVTCQkyCj4gIHN0cnVjdCBx Y29tX3BjaWVfcmVzb3VyY2VzXzJfN18wIHsKPiAtCXN0cnVjdCBjbGtfYnVsa19kYXRhIGNsa3Nb UUNPTV9QQ0lFXzJfN18wX01BWF9DTE9DS1NdOwo+IC0JaW50IG51bV9jbGtzOwo+ICAJc3RydWN0 IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbUUNPTV9QQ0lFXzJfN18wX01BWF9TVVBQTElF U107Cj4gIAlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcnN0Owo+ICB9Owo+ICAKPiAtI2RlZmluZSBR Q09NX1BDSUVfMl85XzBfTUFYX0NMT0NLUwkJNQo+ICBzdHJ1Y3QgcWNvbV9wY2llX3Jlc291cmNl c18yXzlfMCB7Cj4gLQlzdHJ1Y3QgY2xrX2J1bGtfZGF0YSBjbGtzW1FDT01fUENJRV8yXzlfMF9N QVhfQ0xPQ0tTXTsKPiAgCXN0cnVjdCByZXNldF9jb250cm9sICpyc3Q7Cj4gIH07Cj4gIAo+IEBA IC0yNDcsNiArMjMxLDggQEAgc3RydWN0IHFjb21fcGNpZSB7Cj4gIAlzdHJ1Y3QgaWNjX3BhdGgg KmljY19tZW07Cj4gIAljb25zdCBzdHJ1Y3QgcWNvbV9wY2llX2NmZyAqY2ZnOwo+ICAJc3RydWN0 IGRlbnRyeSAqZGVidWdmczsKPiArCXN0cnVjdCBjbGtfYnVsa19kYXRhICpjbGtzOwo+ICsJaW50 IG51bV9jbGtzOwo+ICAJYm9vbCBzdXNwZW5kZWQ7Cj4gIH07Cj4gIAo+IEBAIC0zMzcsMjIgKzMy Myw2IEBAIHN0YXRpYyBpbnQgcWNvbV9wY2llX2dldF9yZXNvdXJjZXNfMl8xXzAoc3RydWN0IHFj b21fcGNpZSAqcGNpZSkKPiAgCWlmIChyZXQpCj4gIAkJcmV0dXJuIHJldDsKPiAgCj4gLQlyZXMt PmNsa3NbMF0uaWQgPSAiaWZhY2UiOwo+IC0JcmVzLT5jbGtzWzFdLmlkID0gImNvcmUiOwo+IC0J cmVzLT5jbGtzWzJdLmlkID0gInBoeSI7Cj4gLQlyZXMtPmNsa3NbM10uaWQgPSAiYXV4IjsKPiAt CXJlcy0+Y2xrc1s0XS5pZCA9ICJyZWYiOwo+IC0KPiAtCS8qIGlmYWNlLCBjb3JlLCBwaHkgYXJl IHJlcXVpcmVkICovCj4gLQlyZXQgPSBkZXZtX2Nsa19idWxrX2dldChkZXYsIDMsIHJlcy0+Y2xr cyk7Cj4gLQlpZiAocmV0IDwgMCkKPiAtCQlyZXR1cm4gcmV0Owo+IC0KPiAtCS8qIGF1eCwgcmVm IGFyZSBvcHRpb25hbCAqLwo+IC0JcmV0ID0gZGV2bV9jbGtfYnVsa19nZXRfb3B0aW9uYWwoZGV2 LCAyLCByZXMtPmNsa3MgKyAzKTsKPiAtCWlmIChyZXQgPCAwKQo+IC0JCXJldHVybiByZXQ7Cj4g LQo+ICAJcmVzLT5yZXNldHNbMF0uaWQgPSAicGNpIjsKPiAgCXJlcy0+cmVzZXRzWzFdLmlkID0g ImF4aSI7Cj4gIAlyZXMtPnJlc2V0c1syXS5pZCA9ICJhaGIiOwo+IEBAIC0zNzMsNyArMzQzLDcg QEAgc3RhdGljIHZvaWQgcWNvbV9wY2llX2RlaW5pdF8yXzFfMChzdHJ1Y3QgcWNvbV9wY2llICpw Y2llKQo+ICB7Cj4gIAlzdHJ1Y3QgcWNvbV9wY2llX3Jlc291cmNlc18yXzFfMCAqcmVzID0gJnBj aWUtPnJlcy52Ml8xXzA7Cj4gIAo+IC0JY2xrX2J1bGtfZGlzYWJsZV91bnByZXBhcmUoQVJSQVlf U0laRShyZXMtPmNsa3MpLCByZXMtPmNsa3MpOwo+ICsJY2xrX2J1bGtfZGlzYWJsZV91bnByZXBh cmUocGNpZS0+bnVtX2Nsa3MsIHBjaWUtPmNsa3MpOwo+ICAJcmVzZXRfY29udHJvbF9idWxrX2Fz c2VydChyZXMtPm51bV9yZXNldHMsIHJlcy0+cmVzZXRzKTsKPiAgCj4gIAl3cml0ZWwoMSwgcGNp ZS0+cGFyZiArIFBBUkZfUEhZX0NUUkwpOwo+IEBAIC00MTMsNyArMzgzLDYgQEAgc3RhdGljIGlu dCBxY29tX3BjaWVfaW5pdF8yXzFfMChzdHJ1Y3QgcWNvbV9wY2llICpwY2llKQo+ICAKPiAgc3Rh dGljIGludCBxY29tX3BjaWVfcG9zdF9pbml0XzJfMV8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUp Cj4gIHsKPiAtCXN0cnVjdCBxY29tX3BjaWVfcmVzb3VyY2VzXzJfMV8wICpyZXMgPSAmcGNpZS0+ cmVzLnYyXzFfMDsKPiAgCXN0cnVjdCBkd19wY2llICpwY2kgPSBwY2llLT5wY2k7Cj4gIAlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSBwY2ktPmRldjsKPiAgCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9 IGRldi0+b2Zfbm9kZTsKPiBAQCAtNDI1LDcgKzM5NCw3IEBAIHN0YXRpYyBpbnQgcWNvbV9wY2ll X3Bvc3RfaW5pdF8yXzFfMChzdHJ1Y3QgcWNvbV9wY2llICpwY2llKQo+ICAJdmFsICY9IH5QSFlf VEVTVF9QV1JfRE9XTjsKPiAgCXdyaXRlbCh2YWwsIHBjaWUtPnBhcmYgKyBQQVJGX1BIWV9DVFJM KTsKPiAgCj4gLQlyZXQgPSBjbGtfYnVsa19wcmVwYXJlX2VuYWJsZShBUlJBWV9TSVpFKHJlcy0+ Y2xrcyksIHJlcy0+Y2xrcyk7Cj4gKwlyZXQgPSBjbGtfYnVsa19wcmVwYXJlX2VuYWJsZShwY2ll LT5udW1fY2xrcywgcGNpZS0+Y2xrcyk7Cj4gIAlpZiAocmV0KQo+ICAJCXJldHVybiByZXQ7Cj4g IAo+IEBAIC00NzYsMjEgKzQ0NSwxMSBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVzb3Vy Y2VzXzFfMF8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAlzdHJ1Y3QgcWNvbV9wY2llX3Jl c291cmNlc18xXzBfMCAqcmVzID0gJnBjaWUtPnJlcy52MV8wXzA7Cj4gIAlzdHJ1Y3QgZHdfcGNp ZSAqcGNpID0gcGNpZS0+cGNpOwo+ICAJc3RydWN0IGRldmljZSAqZGV2ID0gcGNpLT5kZXY7Cj4g LQlpbnQgcmV0Owo+ICAKPiAgCXJlcy0+dmRkYSA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJ2 ZGRhIik7Cj4gIAlpZiAoSVNfRVJSKHJlcy0+dmRkYSkpCj4gIAkJcmV0dXJuIFBUUl9FUlIocmVz LT52ZGRhKTsKPiAgCj4gLQlyZXMtPmNsa3NbMF0uaWQgPSAiaWZhY2UiOwo+IC0JcmVzLT5jbGtz WzFdLmlkID0gImF1eCI7Cj4gLQlyZXMtPmNsa3NbMl0uaWQgPSAibWFzdGVyX2J1cyI7Cj4gLQly ZXMtPmNsa3NbM10uaWQgPSAic2xhdmVfYnVzIjsKPiAtCj4gLQlyZXQgPSBkZXZtX2Nsa19idWxr X2dldChkZXYsIEFSUkFZX1NJWkUocmVzLT5jbGtzKSwgcmVzLT5jbGtzKTsKPiAtCWlmIChyZXQg PCAwKQo+IC0JCXJldHVybiByZXQ7Cj4gLQo+ICAJcmVzLT5jb3JlID0gZGV2bV9yZXNldF9jb250 cm9sX2dldF9leGNsdXNpdmUoZGV2LCAiY29yZSIpOwo+ICAJcmV0dXJuIFBUUl9FUlJfT1JfWkVS TyhyZXMtPmNvcmUpOwo+ICB9Cj4gQEAgLTUwMCw3ICs0NTksNyBAQCBzdGF0aWMgdm9pZCBxY29t X3BjaWVfZGVpbml0XzFfMF8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAlzdHJ1Y3QgcWNv bV9wY2llX3Jlc291cmNlc18xXzBfMCAqcmVzID0gJnBjaWUtPnJlcy52MV8wXzA7Cj4gIAo+ICAJ cmVzZXRfY29udHJvbF9hc3NlcnQocmVzLT5jb3JlKTsKPiAtCWNsa19idWxrX2Rpc2FibGVfdW5w cmVwYXJlKEFSUkFZX1NJWkUocmVzLT5jbGtzKSwgcmVzLT5jbGtzKTsKPiArCWNsa19idWxrX2Rp c2FibGVfdW5wcmVwYXJlKHBjaWUtPm51bV9jbGtzLCBwY2llLT5jbGtzKTsKPiAgCXJlZ3VsYXRv cl9kaXNhYmxlKHJlcy0+dmRkYSk7Cj4gIH0KPiAgCj4gQEAgLTUxNyw3ICs0NzYsNyBAQCBzdGF0 aWMgaW50IHFjb21fcGNpZV9pbml0XzFfMF8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAkJ cmV0dXJuIHJldDsKPiAgCX0KPiAgCj4gLQlyZXQgPSBjbGtfYnVsa19wcmVwYXJlX2VuYWJsZShB UlJBWV9TSVpFKHJlcy0+Y2xrcyksIHJlcy0+Y2xrcyk7Cj4gKwlyZXQgPSBjbGtfYnVsa19wcmVw YXJlX2VuYWJsZShwY2llLT5udW1fY2xrcywgcGNpZS0+Y2xrcyk7Cj4gIAlpZiAocmV0KSB7Cj4g IAkJZGV2X2VycihkZXYsICJjYW5ub3QgcHJlcGFyZS9lbmFibGUgY2xvY2tzXG4iKTsKPiAgCQln b3RvIGVycl9hc3NlcnRfcmVzZXQ7Cj4gQEAgLTUzMiw3ICs0OTEsNyBAQCBzdGF0aWMgaW50IHFj b21fcGNpZV9pbml0XzFfMF8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAlyZXR1cm4gMDsK PiAgCj4gIGVycl9kaXNhYmxlX2Nsa3M6Cj4gLQljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShB UlJBWV9TSVpFKHJlcy0+Y2xrcyksIHJlcy0+Y2xrcyk7Cj4gKwljbGtfYnVsa19kaXNhYmxlX3Vu cHJlcGFyZShwY2llLT5udW1fY2xrcywgcGNpZS0+Y2xrcyk7Cj4gIGVycl9hc3NlcnRfcmVzZXQ6 Cj4gIAlyZXNldF9jb250cm9sX2Fzc2VydChyZXMtPmNvcmUpOwo+ICAKPiBAQCAtNTgwLDE1ICs1 MzksNiBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVzb3VyY2VzXzJfM18yKHN0cnVjdCBx Y29tX3BjaWUgKnBjaWUpCj4gIAlpZiAocmV0KQo+ICAJCXJldHVybiByZXQ7Cj4gIAo+IC0JcmVz LT5jbGtzWzBdLmlkID0gImF1eCI7Cj4gLQlyZXMtPmNsa3NbMV0uaWQgPSAiY2ZnIjsKPiAtCXJl cy0+Y2xrc1syXS5pZCA9ICJidXNfbWFzdGVyIjsKPiAtCXJlcy0+Y2xrc1szXS5pZCA9ICJidXNf c2xhdmUiOwo+IC0KPiAtCXJldCA9IGRldm1fY2xrX2J1bGtfZ2V0KGRldiwgQVJSQVlfU0laRShy ZXMtPmNsa3MpLCByZXMtPmNsa3MpOwo+IC0JaWYgKHJldCA8IDApCj4gLQkJcmV0dXJuIHJldDsK PiAtCj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiBAQCAtNTk2LDcgKzU0Niw3IEBAIHN0YXRpYyB2 b2lkIHFjb21fcGNpZV9kZWluaXRfMl8zXzIoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiAgewo+ ICAJc3RydWN0IHFjb21fcGNpZV9yZXNvdXJjZXNfMl8zXzIgKnJlcyA9ICZwY2llLT5yZXMudjJf M18yOwo+ICAKPiAtCWNsa19idWxrX2Rpc2FibGVfdW5wcmVwYXJlKEFSUkFZX1NJWkUocmVzLT5j bGtzKSwgcmVzLT5jbGtzKTsKPiArCWNsa19idWxrX2Rpc2FibGVfdW5wcmVwYXJlKHBjaWUtPm51 bV9jbGtzLCBwY2llLT5jbGtzKTsKPiAgCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0la RShyZXMtPnN1cHBsaWVzKSwgcmVzLT5zdXBwbGllcyk7Cj4gIH0KPiAgCj4gQEAgLTYxMyw3ICs1 NjMsNyBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9pbml0XzJfM18yKHN0cnVjdCBxY29tX3BjaWUg KnBjaWUpCj4gIAkJcmV0dXJuIHJldDsKPiAgCX0KPiAgCj4gLQlyZXQgPSBjbGtfYnVsa19wcmVw YXJlX2VuYWJsZShBUlJBWV9TSVpFKHJlcy0+Y2xrcyksIHJlcy0+Y2xrcyk7Cj4gKwlyZXQgPSBj bGtfYnVsa19wcmVwYXJlX2VuYWJsZShwY2llLT5udW1fY2xrcywgcGNpZS0+Y2xrcyk7Cj4gIAlp ZiAocmV0KSB7Cj4gIAkJZGV2X2VycihkZXYsICJjYW5ub3QgcHJlcGFyZS9lbmFibGUgY2xvY2tz XG4iKTsKPiAgCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUocmVzLT5zdXBwbGll cyksIHJlcy0+c3VwcGxpZXMpOwo+IEBAIC02NjEsMTggKzYxMSw2IEBAIHN0YXRpYyBpbnQgcWNv bV9wY2llX2dldF9yZXNvdXJjZXNfMl80XzAoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiAgCWJv b2wgaXNfaXBxID0gb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5vZl9ub2RlLCAicWNvbSxw Y2llLWlwcTQwMTkiKTsKPiAgCWludCByZXQ7Cj4gIAo+IC0JcmVzLT5jbGtzWzBdLmlkID0gImF1 eCI7Cj4gLQlyZXMtPmNsa3NbMV0uaWQgPSAibWFzdGVyX2J1cyI7Cj4gLQlyZXMtPmNsa3NbMl0u aWQgPSAic2xhdmVfYnVzIjsKPiAtCXJlcy0+Y2xrc1szXS5pZCA9ICJpZmFjZSI7Cj4gLQo+IC0J LyogcWNvbSxwY2llLWlwcTQwMTkgaXMgZGVmaW5lZCB3aXRob3V0ICJpZmFjZSIgKi8KPiAtCXJl cy0+bnVtX2Nsa3MgPSBpc19pcHEgPyAzIDogNDsKPiAtCj4gLQlyZXQgPSBkZXZtX2Nsa19idWxr X2dldChkZXYsIHJlcy0+bnVtX2Nsa3MsIHJlcy0+Y2xrcyk7Cj4gLQlpZiAocmV0IDwgMCkKPiAt CQlyZXR1cm4gcmV0Owo+IC0KPiAgCXJlcy0+cmVzZXRzWzBdLmlkID0gImF4aV9tIjsKPiAgCXJl cy0+cmVzZXRzWzFdLmlkID0gImF4aV9zIjsKPiAgCXJlcy0+cmVzZXRzWzJdLmlkID0gImF4aV9t X3N0aWNreSI7Cj4gQEAgLTcwMCw3ICs2MzgsNyBAQCBzdGF0aWMgdm9pZCBxY29tX3BjaWVfZGVp bml0XzJfNF8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAlzdHJ1Y3QgcWNvbV9wY2llX3Jl c291cmNlc18yXzRfMCAqcmVzID0gJnBjaWUtPnJlcy52Ml80XzA7Cj4gIAo+ICAJcmVzZXRfY29u dHJvbF9idWxrX2Fzc2VydChyZXMtPm51bV9yZXNldHMsIHJlcy0+cmVzZXRzKTsKPiAtCWNsa19i dWxrX2Rpc2FibGVfdW5wcmVwYXJlKHJlcy0+bnVtX2Nsa3MsIHJlcy0+Y2xrcyk7Cj4gKwljbGtf YnVsa19kaXNhYmxlX3VucHJlcGFyZShwY2llLT5udW1fY2xrcywgcGNpZS0+Y2xrcyk7Cj4gIH0K PiAgCj4gIHN0YXRpYyBpbnQgcWNvbV9wY2llX2luaXRfMl80XzAoc3RydWN0IHFjb21fcGNpZSAq cGNpZSkKPiBAQCAtNzI2LDcgKzY2NCw3IEBAIHN0YXRpYyBpbnQgcWNvbV9wY2llX2luaXRfMl80 XzAoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiAgCj4gIAl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEy MDAwKTsKPiAgCj4gLQlyZXQgPSBjbGtfYnVsa19wcmVwYXJlX2VuYWJsZShyZXMtPm51bV9jbGtz LCByZXMtPmNsa3MpOwo+ICsJcmV0ID0gY2xrX2J1bGtfcHJlcGFyZV9lbmFibGUocGNpZS0+bnVt X2Nsa3MsIHBjaWUtPmNsa3MpOwo+ICAJaWYgKHJldCkgewo+ICAJCXJlc2V0X2NvbnRyb2xfYnVs a19hc3NlcnQocmVzLT5udW1fcmVzZXRzLCByZXMtPnJlc2V0cyk7Cj4gIAkJcmV0dXJuIHJldDsK PiBAQCAtNzQyLDE2ICs2ODAsNiBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVzb3VyY2Vz XzJfM18zKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBw Y2ktPmRldjsKPiAgCWludCByZXQ7Cj4gIAo+IC0JcmVzLT5jbGtzWzBdLmlkID0gImlmYWNlIjsK PiAtCXJlcy0+Y2xrc1sxXS5pZCA9ICJheGlfbSI7Cj4gLQlyZXMtPmNsa3NbMl0uaWQgPSAiYXhp X3MiOwo+IC0JcmVzLT5jbGtzWzNdLmlkID0gImFoYiI7Cj4gLQlyZXMtPmNsa3NbNF0uaWQgPSAi YXV4IjsKPiAtCj4gLQlyZXQgPSBkZXZtX2Nsa19idWxrX2dldChkZXYsIEFSUkFZX1NJWkUocmVz LT5jbGtzKSwgcmVzLT5jbGtzKTsKPiAtCWlmIChyZXQgPCAwKQo+IC0JCXJldHVybiByZXQ7Cj4g LQo+ICAJcmVzLT5yc3RbMF0uaWQgPSAiYXhpX20iOwo+ICAJcmVzLT5yc3RbMV0uaWQgPSAiYXhp X3MiOwo+ICAJcmVzLT5yc3RbMl0uaWQgPSAicGlwZSI7Cj4gQEAgLTc2OSw5ICs2OTcsNyBAQCBz dGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVzb3VyY2VzXzJfM18zKHN0cnVjdCBxY29tX3BjaWUg KnBjaWUpCj4gIAo+ICBzdGF0aWMgdm9pZCBxY29tX3BjaWVfZGVpbml0XzJfM18zKHN0cnVjdCBx Y29tX3BjaWUgKnBjaWUpCj4gIHsKPiAtCXN0cnVjdCBxY29tX3BjaWVfcmVzb3VyY2VzXzJfM18z ICpyZXMgPSAmcGNpZS0+cmVzLnYyXzNfMzsKPiAtCj4gLQljbGtfYnVsa19kaXNhYmxlX3VucHJl cGFyZShBUlJBWV9TSVpFKHJlcy0+Y2xrcyksIHJlcy0+Y2xrcyk7Cj4gKwljbGtfYnVsa19kaXNh YmxlX3VucHJlcGFyZShwY2llLT5udW1fY2xrcywgcGNpZS0+Y2xrcyk7Cj4gIH0KPiAgCj4gIHN0 YXRpYyBpbnQgcWNvbV9wY2llX2luaXRfMl8zXzMoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiBA QCAtODAxLDcgKzcyNyw3IEBAIHN0YXRpYyBpbnQgcWNvbV9wY2llX2luaXRfMl8zXzMoc3RydWN0 IHFjb21fcGNpZSAqcGNpZSkKPiAgCSAqLwo+ICAJdXNsZWVwX3JhbmdlKDIwMDAsIDI1MDApOwo+ ICAKPiAtCXJldCA9IGNsa19idWxrX3ByZXBhcmVfZW5hYmxlKEFSUkFZX1NJWkUocmVzLT5jbGtz KSwgcmVzLT5jbGtzKTsKPiArCXJldCA9IGNsa19idWxrX3ByZXBhcmVfZW5hYmxlKHBjaWUtPm51 bV9jbGtzLCBwY2llLT5jbGtzKTsKPiAgCWlmIChyZXQpIHsKPiAgCQlkZXZfZXJyKGRldiwgImNh bm5vdCBwcmVwYXJlL2VuYWJsZSBjbG9ja3NcbiIpOwo+ICAJCWdvdG8gZXJyX2Fzc2VydF9yZXNl dHM7Cj4gQEAgLTg2Miw4ICs3ODgsNiBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVzb3Vy Y2VzXzJfN18wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAlzdHJ1Y3QgcWNvbV9wY2llX3Jl c291cmNlc18yXzdfMCAqcmVzID0gJnBjaWUtPnJlcy52Ml83XzA7Cj4gIAlzdHJ1Y3QgZHdfcGNp ZSAqcGNpID0gcGNpZS0+cGNpOwo+ICAJc3RydWN0IGRldmljZSAqZGV2ID0gcGNpLT5kZXY7Cj4g LQl1bnNpZ25lZCBpbnQgbnVtX2Nsa3MsIG51bV9vcHRfY2xrczsKPiAtCXVuc2lnbmVkIGludCBp ZHg7Cj4gIAlpbnQgcmV0Owo+ICAKPiAgCXJlcy0+cnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2Fy cmF5X2dldF9leGNsdXNpdmUoZGV2KTsKPiBAQCAtODc3LDM3ICs4MDEsNiBAQCBzdGF0aWMgaW50 IHFjb21fcGNpZV9nZXRfcmVzb3VyY2VzXzJfN18wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4g IAlpZiAocmV0KQo+ICAJCXJldHVybiByZXQ7Cj4gIAo+IC0JaWR4ID0gMDsKPiAtCXJlcy0+Y2xr c1tpZHgrK10uaWQgPSAiYXV4IjsKPiAtCXJlcy0+Y2xrc1tpZHgrK10uaWQgPSAiY2ZnIjsKPiAt CXJlcy0+Y2xrc1tpZHgrK10uaWQgPSAiYnVzX21hc3RlciI7Cj4gLQlyZXMtPmNsa3NbaWR4Kytd LmlkID0gImJ1c19zbGF2ZSI7Cj4gLQlyZXMtPmNsa3NbaWR4KytdLmlkID0gInNsYXZlX3EyYSI7 Cj4gLQo+IC0JbnVtX2Nsa3MgPSBpZHg7Cj4gLQo+IC0JcmV0ID0gZGV2bV9jbGtfYnVsa19nZXQo ZGV2LCBudW1fY2xrcywgcmVzLT5jbGtzKTsKPiAtCWlmIChyZXQgPCAwKQo+IC0JCXJldHVybiBy ZXQ7Cj4gLQo+IC0JcmVzLT5jbGtzW2lkeCsrXS5pZCA9ICJ0YnUiOwo+IC0JcmVzLT5jbGtzW2lk eCsrXS5pZCA9ICJkZHJzc19zZl90YnUiOwo+IC0JcmVzLT5jbGtzW2lkeCsrXS5pZCA9ICJhZ2dy ZTAiOwo+IC0JcmVzLT5jbGtzW2lkeCsrXS5pZCA9ICJhZ2dyZTEiOwo+IC0JcmVzLT5jbGtzW2lk eCsrXS5pZCA9ICJub2NfYWdnciI7Cj4gLQlyZXMtPmNsa3NbaWR4KytdLmlkID0gIm5vY19hZ2dy XzQiOwo+IC0JcmVzLT5jbGtzW2lkeCsrXS5pZCA9ICJub2NfYWdncl9zb3V0aF9zZiI7Cj4gLQly ZXMtPmNsa3NbaWR4KytdLmlkID0gImNub2NfcXgiOwo+IC0JcmVzLT5jbGtzW2lkeCsrXS5pZCA9 ICJzbGVlcCI7Cj4gLQlyZXMtPmNsa3NbaWR4KytdLmlkID0gImNub2Nfc2ZfYXhpIjsKPiAtCj4g LQludW1fb3B0X2Nsa3MgPSBpZHggLSBudW1fY2xrczsKPiAtCXJlcy0+bnVtX2Nsa3MgPSBpZHg7 Cj4gLQo+IC0JcmV0ID0gZGV2bV9jbGtfYnVsa19nZXRfb3B0aW9uYWwoZGV2LCBudW1fb3B0X2Ns a3MsIHJlcy0+Y2xrcyArIG51bV9jbGtzKTsKPiAtCWlmIChyZXQgPCAwKQo+IC0JCXJldHVybiBy ZXQ7Cj4gLQo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gQEAgLTkyNSw3ICs4MTgsNyBAQCBzdGF0 aWMgaW50IHFjb21fcGNpZV9pbml0XzJfN18wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAkJ cmV0dXJuIHJldDsKPiAgCX0KPiAgCj4gLQlyZXQgPSBjbGtfYnVsa19wcmVwYXJlX2VuYWJsZShy ZXMtPm51bV9jbGtzLCByZXMtPmNsa3MpOwo+ICsJcmV0ID0gY2xrX2J1bGtfcHJlcGFyZV9lbmFi bGUocGNpZS0+bnVtX2Nsa3MsIHBjaWUtPmNsa3MpOwo+ICAJaWYgKHJldCA8IDApCj4gIAkJZ290 byBlcnJfZGlzYWJsZV9yZWd1bGF0b3JzOwo+ICAKPiBAQCAtOTc3LDcgKzg3MCw3IEBAIHN0YXRp YyBpbnQgcWNvbV9wY2llX2luaXRfMl83XzAoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiAgCj4g IAlyZXR1cm4gMDsKPiAgZXJyX2Rpc2FibGVfY2xvY2tzOgo+IC0JY2xrX2J1bGtfZGlzYWJsZV91 bnByZXBhcmUocmVzLT5udW1fY2xrcywgcmVzLT5jbGtzKTsKPiArCWNsa19idWxrX2Rpc2FibGVf dW5wcmVwYXJlKHBjaWUtPm51bV9jbGtzLCBwY2llLT5jbGtzKTsKPiAgZXJyX2Rpc2FibGVfcmVn dWxhdG9yczoKPiAgCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShyZXMtPnN1cHBs aWVzKSwgcmVzLT5zdXBwbGllcyk7Cj4gIAo+IEBAIC0xMDE1LDcgKzkwOCw3IEBAIHN0YXRpYyB2 b2lkIHFjb21fcGNpZV9kZWluaXRfMl83XzAoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiAgewo+ ICAJc3RydWN0IHFjb21fcGNpZV9yZXNvdXJjZXNfMl83XzAgKnJlcyA9ICZwY2llLT5yZXMudjJf N18wOwo+ICAKPiAtCWNsa19idWxrX2Rpc2FibGVfdW5wcmVwYXJlKHJlcy0+bnVtX2Nsa3MsIHJl cy0+Y2xrcyk7Cj4gKwljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShwY2llLT5udW1fY2xrcywg cGNpZS0+Y2xrcyk7Cj4gIAo+ICAJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHJl cy0+c3VwcGxpZXMpLCByZXMtPnN1cHBsaWVzKTsKPiAgfQo+IEBAIC0xMTAxLDE3ICs5OTQsNiBA QCBzdGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVzb3VyY2VzXzJfOV8wKHN0cnVjdCBxY29tX3Bj aWUgKnBjaWUpCj4gIAlzdHJ1Y3QgcWNvbV9wY2llX3Jlc291cmNlc18yXzlfMCAqcmVzID0gJnBj aWUtPnJlcy52Ml85XzA7Cj4gIAlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0gcGNpZS0+cGNpOwo+ICAJ c3RydWN0IGRldmljZSAqZGV2ID0gcGNpLT5kZXY7Cj4gLQlpbnQgcmV0Owo+IC0KPiAtCXJlcy0+ Y2xrc1swXS5pZCA9ICJpZmFjZSI7Cj4gLQlyZXMtPmNsa3NbMV0uaWQgPSAiYXhpX20iOwo+IC0J cmVzLT5jbGtzWzJdLmlkID0gImF4aV9zIjsKPiAtCXJlcy0+Y2xrc1szXS5pZCA9ICJheGlfYnJp ZGdlIjsKPiAtCXJlcy0+Y2xrc1s0XS5pZCA9ICJyY2huZyI7Cj4gLQo+IC0JcmV0ID0gZGV2bV9j bGtfYnVsa19nZXQoZGV2LCBBUlJBWV9TSVpFKHJlcy0+Y2xrcyksIHJlcy0+Y2xrcyk7Cj4gLQlp ZiAocmV0IDwgMCkKPiAtCQlyZXR1cm4gcmV0Owo+ICAKPiAgCXJlcy0+cnN0ID0gZGV2bV9yZXNl dF9jb250cm9sX2FycmF5X2dldF9leGNsdXNpdmUoZGV2KTsKPiAgCWlmIChJU19FUlIocmVzLT5y c3QpKQo+IEBAIC0xMTIyLDkgKzEwMDQsNyBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9nZXRfcmVz b3VyY2VzXzJfOV8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIAo+ICBzdGF0aWMgdm9pZCBx Y29tX3BjaWVfZGVpbml0XzJfOV8wKHN0cnVjdCBxY29tX3BjaWUgKnBjaWUpCj4gIHsKPiAtCXN0 cnVjdCBxY29tX3BjaWVfcmVzb3VyY2VzXzJfOV8wICpyZXMgPSAmcGNpZS0+cmVzLnYyXzlfMDsK PiAtCj4gLQljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShBUlJBWV9TSVpFKHJlcy0+Y2xrcyks IHJlcy0+Y2xrcyk7Cj4gKwljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShwY2llLT5udW1fY2xr cywgcGNpZS0+Y2xrcyk7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgcWNvbV9wY2llX2luaXRfMl85 XzAoc3RydWN0IHFjb21fcGNpZSAqcGNpZSkKPiBAQCAtMTE1Myw3ICsxMDMzLDcgQEAgc3RhdGlj IGludCBxY29tX3BjaWVfaW5pdF8yXzlfMChzdHJ1Y3QgcWNvbV9wY2llICpwY2llKQo+ICAKPiAg CXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKPiAgCj4gLQlyZXR1cm4gY2xrX2J1bGtfcHJlcGFy ZV9lbmFibGUoQVJSQVlfU0laRShyZXMtPmNsa3MpLCByZXMtPmNsa3MpOwo+ICsJcmV0dXJuIGNs a19idWxrX3ByZXBhcmVfZW5hYmxlKHBjaWUtPm51bV9jbGtzLCBwY2llLT5jbGtzKTsKPiAgfQo+ ICAKPiAgc3RhdGljIGludCBxY29tX3BjaWVfcG9zdF9pbml0XzJfOV8wKHN0cnVjdCBxY29tX3Bj aWUgKnBjaWUpCj4gQEAgLTE1NjEsNiArMTQ0MSwxMyBAQCBzdGF0aWMgaW50IHFjb21fcGNpZV9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJCWdvdG8gZXJyX3BtX3J1bnRp bWVfcHV0Owo+ICAJfQo+ICAKPiArCXBjaWUtPm51bV9jbGtzID0gZGV2bV9jbGtfYnVsa19nZXRf YWxsKGRldiwgJnBjaWUtPmNsa3MpOwo+ICsJaWYgKHBjaWUtPm51bV9jbGtzIDwgMCkgewo+ICsJ CXJldCA9IHBjaWUtPm51bV9jbGtzOwo+ICsJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBj bG9ja3NcbiIpOwo+ICsJCWdvdG8gZXJyX3BtX3J1bnRpbWVfcHV0Owo+ICsJfQo+ICsKPiAgCXJl dCA9IHFjb21fcGNpZV9pY2NfaW5pdChwY2llKTsKPiAgCWlmIChyZXQpCj4gIAkJZ290byBlcnJf cG1fcnVudGltZV9wdXQ7Cj4gLS0gCj4gMi40MC4xCj4gCgotLSAK4K6u4K6j4K6/4K614K6j4K+N 4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQoKLS0gCmxpbnV4LXBoeSBtYWlsaW5n IGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==