From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net [217.70.183.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 791801B96E; Thu, 7 Mar 2024 14:39:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.196 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709822368; cv=none; b=Mp263hkAvLv78rWwUdPze7jM+Njf2sCRsp7JMQOTaoQOE/Ur7N0HHgax+MUZgbw25o1vccN8a1G6e8PaYDGv7CTAUwPMs/oTIY632VSJXzjOMZboWsGXLx7IE54tq+lzjhLpHgOBHOHtLyxaFcvAbCz10rRkwjf53BMA00yuIh8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709822368; c=relaxed/simple; bh=1wda9rVFemYUpjfFp/MVZ9nQg/5x5u0oC4XBV/jPWOA=; h=Mime-Version:Content-Type:Date:Message-Id:From:Subject:Cc:To: References:In-Reply-To; b=i3Kgy7IldpVvEL+PdXmRahd7U8im/McxGJ2wTzfu207IDseQQ+PAw//PrkauBGHI8fq8/3zFeMYM/WMzTjIcIGao2caHO0dVADbwrh7W7UcY0Y2T5NVwfiuqJoddbabkXIf/ZMFUQICybV1zb0OP5qHffKDCYilfG3xkMXqs5BY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=KUvVw+Y0; arc=none smtp.client-ip=217.70.183.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="KUvVw+Y0" Received: by mail.gandi.net (Postfix) with ESMTPSA id D65D3E000D; Thu, 7 Mar 2024 14:39:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1709822357; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DyyvLt3PFqGEcHS9MBOofH4aGB4ndkaOSLBfw95+8NY=; b=KUvVw+Y01jMAdb7/WuVobY4KF3yUKmM23k9AgcVjHc/v5OwMpPfYQ4ZgVXW3tRHpjZGuPi 938qrKHa+lMcaX+rAnjITZIzrZWJLGP0FI/6LyDu6CZdYfR3Ig9b3SzffXnNEDNyVmVKGi UUuO75aY3JPLLly0cdYMCCxDVzR+LQ8W+CPLo2J96wObP+emCBrFhPMEB/CUpC/zRf7sQ4 TSipvoVusU1LiQXGZw+6Et2ykxxFnvj689jZgGU/bsjVSy/iVgJn0Kz2AnXQf3dICGHhEe GtZrD40tK6eSXTpacy4F6dnwfRzpyhDXLI1i7c7AzPI7y0k48UOIbCKJQZA/BA== Precedence: bulk X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Thu, 07 Mar 2024 15:39:15 +0100 Message-Id: From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: Re: [PATCH v4 3/9] usb: cdns3-ti: move reg writes from probe into ->runtime_resume() Cc: "Thomas Petazzoni" , =?utf-8?q?Gr=C3=A9gory_Clement?= , "Kevin Hilman" , "Alan Stern" , , , , To: "Roger Quadros" , "Greg Kroah-Hartman" , "Rob Herring" , "Krzysztof Kozlowski" , "Conor Dooley" , "Peter Chen" , "Pawel Laszczak" , "Nishanth Menon" , "Vignesh Raghavendra" , "Tero Kristo" X-Mailer: aerc 0.15.2 References: <20240307-j7200-usb-suspend-v4-0-5ec7615431f3@bootlin.com> <20240307-j7200-usb-suspend-v4-3-5ec7615431f3@bootlin.com> In-Reply-To: X-GND-Sasl: theo.lebrun@bootlin.com Hello Roger, On Thu Mar 7, 2024 at 1:31 PM CET, Roger Quadros wrote: > Hi, > > On 07/03/2024 11:55, Th=C3=A9o Lebrun wrote: > > The hardware initialisation register write sequence is only used at > > probe. Move it from being done at explicitely at probe to being done > > implicitely by pm_runtime_get_sync() that calls ->runtime_resume(). > > explicitly / implicitly > > >=20 > > Keep devicetree parsing in probe and add a new field in the private > > struct to remember the USB2 refclk rate code computation result. > >=20 > > This opens the door to having the init sequence being executed later > > down the road, at system-wide resume for example. This is NOT currently > > happening because runtime PM is disabled at suspend without the > > refcount being affected. > >=20 > > Signed-off-by: Th=C3=A9o Lebrun > > --- > > drivers/usb/cdns3/cdns3-ti.c | 90 +++++++++++++++++++++++++-----------= -------- > > 1 file changed, 52 insertions(+), 38 deletions(-) > >=20 > > diff --git a/drivers/usb/cdns3/cdns3-ti.c b/drivers/usb/cdns3/cdns3-ti.= c > > index 5945c4b1e11f..4c8a557e6a6f 100644 > > --- a/drivers/usb/cdns3/cdns3-ti.c > > +++ b/drivers/usb/cdns3/cdns3-ti.c > > @@ -57,6 +57,7 @@ struct cdns_ti { > > unsigned vbus_divider:1; > > struct clk *usb2_refclk; > > struct clk *lpm_clk; > > + int usb2_refclk_rate_code; > > }; > > =20 > > static const int cdns_ti_rate_table[] =3D { /* in KHZ */ > > @@ -90,10 +91,8 @@ static int cdns_ti_probe(struct platform_device *pde= v) > > struct device *dev =3D &pdev->dev; > > struct device_node *node =3D pdev->dev.of_node; > > struct cdns_ti *data; > > - int error; > > - u32 reg; > > - int rate_code, i; > > unsigned long rate; > > + int error, i; > > =20 > > data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); > > if (!data) > > @@ -133,7 +132,9 @@ static int cdns_ti_probe(struct platform_device *pd= ev) > > return -EINVAL; > > } > > =20 > > - rate_code =3D i; > > + data->usb2_refclk_rate_code =3D i; > > + data->vbus_divider =3D device_property_read_bool(dev, "ti,vbus-divide= r"); > > + data->usb2_only =3D device_property_read_bool(dev, "ti,usb2-only"); > > =20 > > pm_runtime_enable(dev); > > error =3D pm_runtime_get_sync(dev); > > @@ -142,40 +143,6 @@ static int cdns_ti_probe(struct platform_device *p= dev) > > goto err; > > } > > =20 > > - /* assert RESET */ > > - reg =3D cdns_ti_readl(data, USBSS_W1); > > - reg &=3D ~USBSS_W1_PWRUP_RST; > > - cdns_ti_writel(data, USBSS_W1, reg); > > - > > - /* set static config */ > > - reg =3D cdns_ti_readl(data, USBSS_STATIC_CONFIG); > > - reg &=3D ~USBSS1_STATIC_PLL_REF_SEL_MASK; > > - reg |=3D rate_code << USBSS1_STATIC_PLL_REF_SEL_SHIFT; > > - > > - reg &=3D ~USBSS1_STATIC_VBUS_SEL_MASK; > > - data->vbus_divider =3D device_property_read_bool(dev, "ti,vbus-divide= r"); > > - if (data->vbus_divider) > > - reg |=3D 1 << USBSS1_STATIC_VBUS_SEL_SHIFT; > > - > > - cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg); > > - reg =3D cdns_ti_readl(data, USBSS_STATIC_CONFIG); > > - > > - /* set USB2_ONLY mode if requested */ > > - reg =3D cdns_ti_readl(data, USBSS_W1); > > - data->usb2_only =3D device_property_read_bool(dev, "ti,usb2-only"); > > - if (data->usb2_only) > > - reg |=3D USBSS_W1_USB2_ONLY; > > - > > - /* set default modestrap */ > > - reg |=3D USBSS_W1_MODESTRAP_SEL; > > - reg &=3D ~USBSS_W1_MODESTRAP_MASK; > > - reg |=3D USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT; > > - cdns_ti_writel(data, USBSS_W1, reg); > > - > > - /* de-assert RESET */ > > - reg |=3D USBSS_W1_PWRUP_RST; > > - cdns_ti_writel(data, USBSS_W1, reg); > > - > > error =3D of_platform_populate(node, NULL, NULL, dev); > > if (error) { > > dev_err(dev, "failed to create children: %d\n", error); > > @@ -211,6 +178,52 @@ static void cdns_ti_remove(struct platform_device = *pdev) > > platform_set_drvdata(pdev, NULL); > > } > > =20 > > +static int cdns_ti_runtime_resume(struct device *dev) > > +{ > > + struct cdns_ti *data =3D dev_get_drvdata(dev); > > + u32 reg; > > + > > + /* assert RESET */ > > + reg =3D cdns_ti_readl(data, USBSS_W1); > > + reg &=3D ~USBSS_W1_PWRUP_RST; > > + cdns_ti_writel(data, USBSS_W1, reg); > > + > > + /* set static config */ > > + reg =3D cdns_ti_readl(data, USBSS_STATIC_CONFIG); > > + reg &=3D ~USBSS1_STATIC_PLL_REF_SEL_MASK; > > + reg |=3D data->usb2_refclk_rate_code << USBSS1_STATIC_PLL_REF_SEL_SHI= FT; > > + > > + reg &=3D ~USBSS1_STATIC_VBUS_SEL_MASK; > > + > > + if (data->vbus_divider) > > + reg |=3D 1 << USBSS1_STATIC_VBUS_SEL_SHIFT; > > + > > + cdns_ti_writel(data, USBSS_STATIC_CONFIG, reg); > > + reg =3D cdns_ti_readl(data, USBSS_STATIC_CONFIG); > > + > > + /* set USB2_ONLY mode if requested */ > > + reg =3D cdns_ti_readl(data, USBSS_W1); > > + > > + if (data->usb2_only) > > + reg |=3D USBSS_W1_USB2_ONLY; > > + > > + /* set default modestrap */ > > + reg |=3D USBSS_W1_MODESTRAP_SEL; > > + reg &=3D ~USBSS_W1_MODESTRAP_MASK; > > + reg |=3D USBSS_MODESTRAP_MODE_NONE << USBSS_W1_MODESTRAP_SHIFT; > > + cdns_ti_writel(data, USBSS_W1, reg); > > + > > + /* de-assert RESET */ > > + reg |=3D USBSS_W1_PWRUP_RST; > > + cdns_ti_writel(data, USBSS_W1, reg); > > I don't think USB controller requires a reset and re-init between > runtime suspend/resume. > > What you need is reset/re-init during system Resume on certain platforms. > So you should move this part of code into a helper function and call it > from .probe() and .system_resume() Runtime resume is being called at probe() and system-wide resume. See our runtime_resume() implementation as that helper function you are describing. A previous revision did what you are recommending. We leaned towards the current version. See: https://lore.kernel.org/lkml/7h34wxfmwn.fsf@baylibre.com/ Also, assuming we enable runtime PM, a reset and re-init after runtime suspend would be the right thing to do anyways. My reading of drivers/pmdomain/core.c tells me that if our device goes to runtime suspend, domains will be shut down. Our controller will be reset and we'll need to re-init it. The GENPD_FLAG_RPM_ALWAYS_ON flag is of interest to avoid the PD to be shut down during runtime PM. Regards, -- Th=C3=A9o Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.com 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 1D282C48BF6 for ; Thu, 7 Mar 2024 14:39:35 +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:References:To:Cc:Subject: From:Message-Id:Date:Mime-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=u0g8DDCuXTW1Tjo1q7FIr1RUGqt6RYOrakaVHC4btyg=; b=Cww/Uah1FxGI4X nVkytGbZ+buCmpK0x9PGFKBIzvY5lnsZX1DQ5thoQEL2XzpxyGYiBTuoTE8u9VUbkeFgbqhdLYkTL 5joZj2iqawxH7ueV7V+ITSD/dA4Zpi3LYYQNXDiJS9NLpYtmxgKDezGRnYxSLXENnd7NbWxJpCCtH FtaXWH7vKIJMGL/HbXyjpC0tSGUNW+UZYpnXAhskgJnEdOzXBypYmfq/QTYmp0jrxx9sPcnSmoLno EP5FTDEUGheLjGniD+8yEoDauYvSeezz6mq/sOSJYMZZu5ocNBBSeJMCn6YeNCOizTUglSpdxAnFX Wo5bKb8kiRSAs6oMVHfw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1riEu4-000000055bv-3A3W; Thu, 07 Mar 2024 14:39:24 +0000 Received: from relay4-d.mail.gandi.net ([217.70.183.196]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1riEtz-000000055ZX-3rIh for linux-arm-kernel@lists.infradead.org; Thu, 07 Mar 2024 14:39:21 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id D65D3E000D; Thu, 7 Mar 2024 14:39:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1709822357; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DyyvLt3PFqGEcHS9MBOofH4aGB4ndkaOSLBfw95+8NY=; b=KUvVw+Y01jMAdb7/WuVobY4KF3yUKmM23k9AgcVjHc/v5OwMpPfYQ4ZgVXW3tRHpjZGuPi 938qrKHa+lMcaX+rAnjITZIzrZWJLGP0FI/6LyDu6CZdYfR3Ig9b3SzffXnNEDNyVmVKGi UUuO75aY3JPLLly0cdYMCCxDVzR+LQ8W+CPLo2J96wObP+emCBrFhPMEB/CUpC/zRf7sQ4 TSipvoVusU1LiQXGZw+6Et2ykxxFnvj689jZgGU/bsjVSy/iVgJn0Kz2AnXQf3dICGHhEe GtZrD40tK6eSXTpacy4F6dnwfRzpyhDXLI1i7c7AzPI7y0k48UOIbCKJQZA/BA== Mime-Version: 1.0 Date: Thu, 07 Mar 2024 15:39:15 +0100 Message-Id: From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: Re: [PATCH v4 3/9] usb: cdns3-ti: move reg writes from probe into ->runtime_resume() Cc: "Thomas Petazzoni" , =?utf-8?q?Gr=C3=A9gory_Clement?= , "Kevin Hilman" , "Alan Stern" , , , , To: "Roger Quadros" , "Greg Kroah-Hartman" , "Rob Herring" , "Krzysztof Kozlowski" , "Conor Dooley" , "Peter Chen" , "Pawel Laszczak" , "Nishanth Menon" , "Vignesh Raghavendra" , "Tero Kristo" X-Mailer: aerc 0.15.2 References: <20240307-j7200-usb-suspend-v4-0-5ec7615431f3@bootlin.com> <20240307-j7200-usb-suspend-v4-3-5ec7615431f3@bootlin.com> In-Reply-To: X-GND-Sasl: theo.lebrun@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240307_063920_435375_7211ECB5 X-CRM114-Status: GOOD ( 27.84 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGVsbG8gUm9nZXIsCgpPbiBUaHUgTWFyIDcsIDIwMjQgYXQgMTozMSBQTSBDRVQsIFJvZ2VyIFF1 YWRyb3Mgd3JvdGU6Cj4gSGksCj4KPiBPbiAwNy8wMy8yMDI0IDExOjU1LCBUaMOpbyBMZWJydW4g d3JvdGU6Cj4gPiBUaGUgaGFyZHdhcmUgaW5pdGlhbGlzYXRpb24gcmVnaXN0ZXIgd3JpdGUgc2Vx dWVuY2UgaXMgb25seSB1c2VkIGF0Cj4gPiBwcm9iZS4gTW92ZSBpdCBmcm9tIGJlaW5nIGRvbmUg YXQgZXhwbGljaXRlbHkgYXQgcHJvYmUgdG8gYmVpbmcgZG9uZQo+ID4gaW1wbGljaXRlbHkgYnkg cG1fcnVudGltZV9nZXRfc3luYygpIHRoYXQgY2FsbHMgLT5ydW50aW1lX3Jlc3VtZSgpLgo+Cj4g ZXhwbGljaXRseSAvIGltcGxpY2l0bHkKPgo+ID4gCj4gPiBLZWVwIGRldmljZXRyZWUgcGFyc2lu ZyBpbiBwcm9iZSBhbmQgYWRkIGEgbmV3IGZpZWxkIGluIHRoZSBwcml2YXRlCj4gPiBzdHJ1Y3Qg dG8gcmVtZW1iZXIgdGhlIFVTQjIgcmVmY2xrIHJhdGUgY29kZSBjb21wdXRhdGlvbiByZXN1bHQu Cj4gPiAKPiA+IFRoaXMgb3BlbnMgdGhlIGRvb3IgdG8gaGF2aW5nIHRoZSBpbml0IHNlcXVlbmNl IGJlaW5nIGV4ZWN1dGVkIGxhdGVyCj4gPiBkb3duIHRoZSByb2FkLCBhdCBzeXN0ZW0td2lkZSBy ZXN1bWUgZm9yIGV4YW1wbGUuIFRoaXMgaXMgTk9UIGN1cnJlbnRseQo+ID4gaGFwcGVuaW5nIGJl Y2F1c2UgcnVudGltZSBQTSBpcyBkaXNhYmxlZCBhdCBzdXNwZW5kIHdpdGhvdXQgdGhlCj4gPiBy ZWZjb3VudCBiZWluZyBhZmZlY3RlZC4KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogVGjDqW8gTGVi cnVuIDx0aGVvLmxlYnJ1bkBib290bGluLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvdXNiL2Nk bnMzL2NkbnMzLXRpLmMgfCA5MCArKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0t LS0tLS0tLQo+ID4gIDEgZmlsZSBjaGFuZ2VkLCA1MiBpbnNlcnRpb25zKCspLCAzOCBkZWxldGlv bnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NkbnMzL2NkbnMzLXRpLmMg Yi9kcml2ZXJzL3VzYi9jZG5zMy9jZG5zMy10aS5jCj4gPiBpbmRleCA1OTQ1YzRiMWUxMWYuLjRj OGE1NTdlNmE2ZiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvdXNiL2NkbnMzL2NkbnMzLXRpLmMK PiA+ICsrKyBiL2RyaXZlcnMvdXNiL2NkbnMzL2NkbnMzLXRpLmMKPiA+IEBAIC01Nyw2ICs1Nyw3 IEBAIHN0cnVjdCBjZG5zX3RpIHsKPiA+ICAJdW5zaWduZWQgdmJ1c19kaXZpZGVyOjE7Cj4gPiAg CXN0cnVjdCBjbGsgKnVzYjJfcmVmY2xrOwo+ID4gIAlzdHJ1Y3QgY2xrICpscG1fY2xrOwo+ID4g KwlpbnQgdXNiMl9yZWZjbGtfcmF0ZV9jb2RlOwo+ID4gIH07Cj4gPiAgCj4gPiAgc3RhdGljIGNv bnN0IGludCBjZG5zX3RpX3JhdGVfdGFibGVbXSA9IHsJLyogaW4gS0haICovCj4gPiBAQCAtOTAs MTAgKzkxLDggQEAgc3RhdGljIGludCBjZG5zX3RpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCj4gPiAgCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4gPiAgCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwo+ID4gIAlzdHJ1Y3Qg Y2Ruc190aSAqZGF0YTsKPiA+IC0JaW50IGVycm9yOwo+ID4gLQl1MzIgcmVnOwo+ID4gLQlpbnQg cmF0ZV9jb2RlLCBpOwo+ID4gIAl1bnNpZ25lZCBsb25nIHJhdGU7Cj4gPiArCWludCBlcnJvciwg aTsKPiA+ICAKPiA+ICAJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGF0YSksIEdG UF9LRVJORUwpOwo+ID4gIAlpZiAoIWRhdGEpCj4gPiBAQCAtMTMzLDcgKzEzMiw5IEBAIHN0YXRp YyBpbnQgY2Ruc190aV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gIAkJ cmV0dXJuIC1FSU5WQUw7Cj4gPiAgCX0KPiA+ICAKPiA+IC0JcmF0ZV9jb2RlID0gaTsKPiA+ICsJ ZGF0YS0+dXNiMl9yZWZjbGtfcmF0ZV9jb2RlID0gaTsKPiA+ICsJZGF0YS0+dmJ1c19kaXZpZGVy ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJ0aSx2YnVzLWRpdmlkZXIiKTsKPiA+ ICsJZGF0YS0+dXNiMl9vbmx5ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJ0aSx1 c2IyLW9ubHkiKTsKPiA+ICAKPiA+ICAJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKPiA+ICAJZXJy b3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRldik7Cj4gPiBAQCAtMTQyLDQwICsxNDMsNiBAQCBz dGF0aWMgaW50IGNkbnNfdGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ ICAJCWdvdG8gZXJyOwo+ID4gIAl9Cj4gPiAgCj4gPiAtCS8qIGFzc2VydCBSRVNFVCAqLwo+ID4g LQlyZWcgPSBjZG5zX3RpX3JlYWRsKGRhdGEsIFVTQlNTX1cxKTsKPiA+IC0JcmVnICY9IH5VU0JT U19XMV9QV1JVUF9SU1Q7Cj4gPiAtCWNkbnNfdGlfd3JpdGVsKGRhdGEsIFVTQlNTX1cxLCByZWcp Owo+ID4gLQo+ID4gLQkvKiBzZXQgc3RhdGljIGNvbmZpZyAqLwo+ID4gLQlyZWcgPSBjZG5zX3Rp X3JlYWRsKGRhdGEsIFVTQlNTX1NUQVRJQ19DT05GSUcpOwo+ID4gLQlyZWcgJj0gflVTQlNTMV9T VEFUSUNfUExMX1JFRl9TRUxfTUFTSzsKPiA+IC0JcmVnIHw9IHJhdGVfY29kZSA8PCBVU0JTUzFf U1RBVElDX1BMTF9SRUZfU0VMX1NISUZUOwo+ID4gLQo+ID4gLQlyZWcgJj0gflVTQlNTMV9TVEFU SUNfVkJVU19TRUxfTUFTSzsKPiA+IC0JZGF0YS0+dmJ1c19kaXZpZGVyID0gZGV2aWNlX3Byb3Bl cnR5X3JlYWRfYm9vbChkZXYsICJ0aSx2YnVzLWRpdmlkZXIiKTsKPiA+IC0JaWYgKGRhdGEtPnZi dXNfZGl2aWRlcikKPiA+IC0JCXJlZyB8PSAxIDw8IFVTQlNTMV9TVEFUSUNfVkJVU19TRUxfU0hJ RlQ7Cj4gPiAtCj4gPiAtCWNkbnNfdGlfd3JpdGVsKGRhdGEsIFVTQlNTX1NUQVRJQ19DT05GSUcs IHJlZyk7Cj4gPiAtCXJlZyA9IGNkbnNfdGlfcmVhZGwoZGF0YSwgVVNCU1NfU1RBVElDX0NPTkZJ Ryk7Cj4gPiAtCj4gPiAtCS8qIHNldCBVU0IyX09OTFkgbW9kZSBpZiByZXF1ZXN0ZWQgKi8KPiA+ IC0JcmVnID0gY2Ruc190aV9yZWFkbChkYXRhLCBVU0JTU19XMSk7Cj4gPiAtCWRhdGEtPnVzYjJf b25seSA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAidGksdXNiMi1vbmx5Iik7Cj4g PiAtCWlmIChkYXRhLT51c2IyX29ubHkpCj4gPiAtCQlyZWcgfD0gVVNCU1NfVzFfVVNCMl9PTkxZ Owo+ID4gLQo+ID4gLQkvKiBzZXQgZGVmYXVsdCBtb2Rlc3RyYXAgKi8KPiA+IC0JcmVnIHw9IFVT QlNTX1cxX01PREVTVFJBUF9TRUw7Cj4gPiAtCXJlZyAmPSB+VVNCU1NfVzFfTU9ERVNUUkFQX01B U0s7Cj4gPiAtCXJlZyB8PSBVU0JTU19NT0RFU1RSQVBfTU9ERV9OT05FIDw8IFVTQlNTX1cxX01P REVTVFJBUF9TSElGVDsKPiA+IC0JY2Ruc190aV93cml0ZWwoZGF0YSwgVVNCU1NfVzEsIHJlZyk7 Cj4gPiAtCj4gPiAtCS8qIGRlLWFzc2VydCBSRVNFVCAqLwo+ID4gLQlyZWcgfD0gVVNCU1NfVzFf UFdSVVBfUlNUOwo+ID4gLQljZG5zX3RpX3dyaXRlbChkYXRhLCBVU0JTU19XMSwgcmVnKTsKPiA+ IC0KPiA+ICAJZXJyb3IgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShub2RlLCBOVUxMLCBOVUxMLCBk ZXYpOwo+ID4gIAlpZiAoZXJyb3IpIHsKPiA+ICAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNy ZWF0ZSBjaGlsZHJlbjogJWRcbiIsIGVycm9yKTsKPiA+IEBAIC0yMTEsNiArMTc4LDUyIEBAIHN0 YXRpYyB2b2lkIGNkbnNfdGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4g PiAgCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwo+ID4gIH0KPiA+ICAKPiA+ICtz dGF0aWMgaW50IGNkbnNfdGlfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ID4g K3sKPiA+ICsJc3RydWN0IGNkbnNfdGkgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ ICsJdTMyIHJlZzsKPiA+ICsKPiA+ICsJLyogYXNzZXJ0IFJFU0VUICovCj4gPiArCXJlZyA9IGNk bnNfdGlfcmVhZGwoZGF0YSwgVVNCU1NfVzEpOwo+ID4gKwlyZWcgJj0gflVTQlNTX1cxX1BXUlVQ X1JTVDsKPiA+ICsJY2Ruc190aV93cml0ZWwoZGF0YSwgVVNCU1NfVzEsIHJlZyk7Cj4gPiArCj4g PiArCS8qIHNldCBzdGF0aWMgY29uZmlnICovCj4gPiArCXJlZyA9IGNkbnNfdGlfcmVhZGwoZGF0 YSwgVVNCU1NfU1RBVElDX0NPTkZJRyk7Cj4gPiArCXJlZyAmPSB+VVNCU1MxX1NUQVRJQ19QTExf UkVGX1NFTF9NQVNLOwo+ID4gKwlyZWcgfD0gZGF0YS0+dXNiMl9yZWZjbGtfcmF0ZV9jb2RlIDw8 IFVTQlNTMV9TVEFUSUNfUExMX1JFRl9TRUxfU0hJRlQ7Cj4gPiArCj4gPiArCXJlZyAmPSB+VVNC U1MxX1NUQVRJQ19WQlVTX1NFTF9NQVNLOwo+ID4gKwo+ID4gKwlpZiAoZGF0YS0+dmJ1c19kaXZp ZGVyKQo+ID4gKwkJcmVnIHw9IDEgPDwgVVNCU1MxX1NUQVRJQ19WQlVTX1NFTF9TSElGVDsKPiA+ ICsKPiA+ICsJY2Ruc190aV93cml0ZWwoZGF0YSwgVVNCU1NfU1RBVElDX0NPTkZJRywgcmVnKTsK PiA+ICsJcmVnID0gY2Ruc190aV9yZWFkbChkYXRhLCBVU0JTU19TVEFUSUNfQ09ORklHKTsKPiA+ ICsKPiA+ICsJLyogc2V0IFVTQjJfT05MWSBtb2RlIGlmIHJlcXVlc3RlZCAqLwo+ID4gKwlyZWcg PSBjZG5zX3RpX3JlYWRsKGRhdGEsIFVTQlNTX1cxKTsKPiA+ICsKPiA+ICsJaWYgKGRhdGEtPnVz YjJfb25seSkKPiA+ICsJCXJlZyB8PSBVU0JTU19XMV9VU0IyX09OTFk7Cj4gPiArCj4gPiArCS8q IHNldCBkZWZhdWx0IG1vZGVzdHJhcCAqLwo+ID4gKwlyZWcgfD0gVVNCU1NfVzFfTU9ERVNUUkFQ X1NFTDsKPiA+ICsJcmVnICY9IH5VU0JTU19XMV9NT0RFU1RSQVBfTUFTSzsKPiA+ICsJcmVnIHw9 IFVTQlNTX01PREVTVFJBUF9NT0RFX05PTkUgPDwgVVNCU1NfVzFfTU9ERVNUUkFQX1NISUZUOwo+ ID4gKwljZG5zX3RpX3dyaXRlbChkYXRhLCBVU0JTU19XMSwgcmVnKTsKPiA+ICsKPiA+ICsJLyog ZGUtYXNzZXJ0IFJFU0VUICovCj4gPiArCXJlZyB8PSBVU0JTU19XMV9QV1JVUF9SU1Q7Cj4gPiAr CWNkbnNfdGlfd3JpdGVsKGRhdGEsIFVTQlNTX1cxLCByZWcpOwo+Cj4gSSBkb24ndCB0aGluayBV U0IgY29udHJvbGxlciByZXF1aXJlcyBhIHJlc2V0IGFuZCByZS1pbml0IGJldHdlZW4KPiBydW50 aW1lIHN1c3BlbmQvcmVzdW1lLgo+Cj4gV2hhdCB5b3UgbmVlZCBpcyByZXNldC9yZS1pbml0IGR1 cmluZyBzeXN0ZW0gUmVzdW1lIG9uIGNlcnRhaW4gcGxhdGZvcm1zLgo+IFNvIHlvdSBzaG91bGQg bW92ZSB0aGlzIHBhcnQgb2YgY29kZSBpbnRvIGEgaGVscGVyIGZ1bmN0aW9uIGFuZCBjYWxsIGl0 Cj4gZnJvbSAucHJvYmUoKSBhbmQgLnN5c3RlbV9yZXN1bWUoKQoKUnVudGltZSByZXN1bWUgaXMg YmVpbmcgY2FsbGVkIGF0IHByb2JlKCkgYW5kIHN5c3RlbS13aWRlIHJlc3VtZS4gU2VlCm91ciBy dW50aW1lX3Jlc3VtZSgpIGltcGxlbWVudGF0aW9uIGFzIHRoYXQgaGVscGVyIGZ1bmN0aW9uIHlv dSBhcmUKZGVzY3JpYmluZy4KCkEgcHJldmlvdXMgcmV2aXNpb24gZGlkIHdoYXQgeW91IGFyZSBy ZWNvbW1lbmRpbmcuIFdlIGxlYW5lZCB0b3dhcmRzIHRoZQpjdXJyZW50IHZlcnNpb24uIFNlZToK aHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC83aDM0d3hmbXduLmZzZkBiYXlsaWJyZS5jb20v CgpBbHNvLCBhc3N1bWluZyB3ZSBlbmFibGUgcnVudGltZSBQTSwgYSByZXNldCBhbmQgcmUtaW5p dCBhZnRlciBydW50aW1lCnN1c3BlbmQgd291bGQgYmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGFu eXdheXMuIE15IHJlYWRpbmcgb2YKZHJpdmVycy9wbWRvbWFpbi9jb3JlLmMgdGVsbHMgbWUgdGhh dCBpZiBvdXIgZGV2aWNlIGdvZXMgdG8gcnVudGltZQpzdXNwZW5kLCBkb21haW5zIHdpbGwgYmUg c2h1dCBkb3duLiBPdXIgY29udHJvbGxlciB3aWxsIGJlIHJlc2V0IGFuZAp3ZSdsbCBuZWVkIHRv IHJlLWluaXQgaXQuIFRoZSBHRU5QRF9GTEFHX1JQTV9BTFdBWVNfT04gZmxhZyBpcyBvZgppbnRl cmVzdCB0byBhdm9pZCB0aGUgUEQgdG8gYmUgc2h1dCBkb3duIGR1cmluZyBydW50aW1lIFBNLgoK UmVnYXJkcywKCi0tClRow6lvIExlYnJ1biwgQm9vdGxpbgpFbWJlZGRlZCBMaW51eCBhbmQgS2Vy bmVsIGVuZ2luZWVyaW5nCmh0dHBzOi8vYm9vdGxpbi5jb20KCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlz dApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==