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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2715C61DA4 for ; Thu, 9 Mar 2023 17:25:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230101AbjCIRY7 (ORCPT ); Thu, 9 Mar 2023 12:24:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46072 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229910AbjCIRY6 (ORCPT ); Thu, 9 Mar 2023 12:24:58 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35EFDF31D0; Thu, 9 Mar 2023 09:24:56 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id BC21661CA0; Thu, 9 Mar 2023 17:24:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2853FC433EF; Thu, 9 Mar 2023 17:24:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678382695; bh=gVhrjCj77/5J/qbJXsvZbwaLDnI4v1jfu9FIPhCu3LE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=H9kaqCxri1hR1og1XvbopPSB+mRwmy6wXii0Zh5sZBdMMPn7jsliwFZyDY9Ldp33V DEcKJPHhIhYsNZ40RRnpJ1Xl6qw38jSTxdQ+J7kbdwb7ImWyij0qAnS3paNk5OsNjV 0MfpkVxFgAKyMQAttlr+jPPqjBLjtEtRZ6b/e+ex8Y7AqYGO41o9PSrmHMsASZhbpm x97ITw9xwFNIzLAeWIOSg7hpaYLTQJTWRRcSsjQrfCIkFWqYhCSwylImOdA3dS7CZz 3JWPNUeUdkxYjj1PC5BhR5AeBYhUEo2smPQrKM6v7wqqmf4bgTzQ3/T8ld/6wvkDpB 7K5sGj1tgH3eA== Date: Thu, 9 Mar 2023 17:24:48 +0000 From: Lee Jones To: ChiYuan Huang Cc: ChiaEn Wu , corbet@lwn.net, pavel@ucw.cz, matthias.bgg@gmail.com, andriy.shevchenko@linux.intel.com, jacek.anaszewski@gmail.com, angelogioacchino.delregno@collabora.com, linux-doc@vger.kernel.org, peterwu.pub@gmail.com, linux-leds@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, szunichen@gmail.com Subject: Re: [PATCH v17 RESEND 2/3] leds: flash: mt6370: Add MediaTek MT6370 flashlight support Message-ID: <20230309172448.GU9667@google.com> References: <20230305100608.GD2574592@google.com> <20230307034433.GA10739@linuxcarl2.richtek.com> <20230308135433.GL9667@google.com> <20230309014927.GA12537@linuxcarl2.richtek.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230309014927.GA12537@linuxcarl2.richtek.com> Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org On Thu, 09 Mar 2023, ChiYuan Huang wrote: > On Wed, Mar 08, 2023 at 01:54:33PM +0000, Lee Jones wrote: > Hi, Lee: > > On Tue, 07 Mar 2023, ChiYuan Huang wrote: > > > > > Hi, Lee: > > > Reply below the comments. > > > > > > On Sun, Mar 05, 2023 at 10:06:08AM +0000, Lee Jones wrote: > > > > On Thu, 23 Feb 2023, ChiaEn Wu wrote: > > > > > > > > > From: ChiYuan Huang > > > > > > > > > > The MediaTek MT6370 is a highly-integrated smart power management IC, > > > > > which includes a single cell Li-Ion/Li-Polymer switching battery > > > > > charger, a USB Type-C & Power Delivery (PD) controller, dual Flash > > > > > LED current sources, a RGB LED driver, a backlight WLED driver, > > > > > a display bias driver and a general LDO for portable devices. > > > > > > > > > > Add support for the MT6370 Flash LED driver. Flash LED in MT6370 > > > > > has 2 channels and support torch/strobe mode. > > > > > > > > > > Acked-by: Jacek Anaszewski > > > > > Co-developed-by: Alice Chen > > > > > Signed-off-by: Alice Chen > > > > > Signed-off-by: ChiYuan Huang > > > > > Signed-off-by: ChiaEn Wu > > > > > --- > > > > > v17 > > > > > - Update the year of Copyright from 2022 to 2023 > > > > > > > > > > --- > > > > > drivers/leds/flash/Kconfig | 13 + > > > > > drivers/leds/flash/Makefile | 1 + > > > > > drivers/leds/flash/leds-mt6370-flash.c | 596 +++++++++++++++++++++++++++++++++ > > > > > 3 files changed, 610 insertions(+) > > > > > create mode 100644 drivers/leds/flash/leds-mt6370-flash.c > > > > [...] > > > > > > > +static int _mt6370_flash_brightness_set(struct led_classdev_flash *fl_cdev, > > > > > + u32 brightness) > > > > > +{ > > > > > + struct mt6370_led *led = to_mt6370_led(fl_cdev, flash); > > > > > + struct mt6370_priv *priv = led->priv; > > > > > + struct led_flash_setting *setting = &fl_cdev->brightness; > > > > > + u32 val = (brightness - setting->min) / setting->step; > > > > > + int ret, i; > > > > > + > > > > > + if (led->led_no == MT6370_LED_JOINT) { > > > > > > > > What is a "JOINT"? > > > > > > > Since MT6370 has two flash led channels. Per channel can drive the current up to 1.5A. > > > 'JOINT' case is used if 1.5A driving current is not enough, like as flash current 2A. > > > They can use two channels to drive 'one' flash led by the HW application. > > > This will make the driving current larger than the capability of one channel. > > > > Is "joint" the term used in the datasheet? > > > Nope, this term is not clearly defined in the datasheet. but this kind of HW application is > allowed. > > Please make this definition clear in the code. > > > > If I'm asking, others are likely to too. > > > Thanks, I'll add more comments to clearly describe what the 'JOINT' code did. > > [...] > > > > > > > +static int mt6370_init_flash_properties(struct device *dev, > > > > > + struct mt6370_led *led, > > > > > + struct fwnode_handle *fwnode) > > > > > +{ > > > > > + struct led_classdev_flash *flash = &led->flash; > > > > > + struct led_classdev *lcdev = &flash->led_cdev; > > > > > + struct mt6370_priv *priv = led->priv; > > > > > + struct led_flash_setting *s; > > > > > + u32 sources[MT6370_MAX_LEDS]; > > > > > + u32 max_ua, val; > > > > > + int i, ret, num; > > > > > + > > > > > + num = fwnode_property_count_u32(fwnode, "led-sources"); > > > > > + if (num < 1) > > > > > + return dev_err_probe(dev, -EINVAL, > > > > > + "Not specified or wrong number of led-sources\n"); > > > > > + > > > > > + ret = fwnode_property_read_u32_array(fwnode, "led-sources", sources, num); > > > > > + if (ret) > > > > > + return ret; > > > > > + > > > > > + for (i = 0; i < num; i++) { > > > > > + if (sources[i] >= MT6370_MAX_LEDS) > > > > > + return -EINVAL; > > > > > + if (priv->leds_active & BIT(sources[i])) > > > > > + return -EINVAL; > > > > > + priv->leds_active |= BIT(sources[i]); > > > > > + } > > > > > + > > > > > + led->led_no = num == 2 ? MT6370_LED_JOINT : sources[0]; > > > > > + > > > > > + max_ua = num == 2 ? MT6370_ITORCH_DOUBLE_MAX_uA : MT6370_ITORCH_MAX_uA; > > > > > + val = MT6370_ITORCH_MIN_uA; > > > > > > > > In what scenario does this not get overwritten? > > > > > > > Only if the property is missing. This will make the value keep in minimum. > > > > If the property is missing, fwnode_property_read_u32() returns an errno, no? > > > > If that's the case, val will be over-written in the if() clause? > > > In this funciton, three properties needs to be paresed from DT. Each one need to clamp the value. > There're two ways to write the code. > > [Option 1] > ret = fwnode_property_read_u32(...) > if (ret) > val = MIM_uA; > > val = mt6370_clamp(val, MIN, MAX); > > [Option 2] > val = MIN_uA; > if (!ret) > val = mt6370_clamp(val, MIN, MAX); > > > From the above, the sencond one can save more LOC, no? > But it seems the first one is more preferable by you, right? I see now that 'val' is used in clamp() before being overwritten now. -- Lee Jones [李琼斯] 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 5E213C6FD19 for ; Thu, 9 Mar 2023 17:26:03 +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=B/NT2Z71YrknsMG4pSOjpWu/YGRPoLF2B2H8egMQG2Q=; b=cAEj/IzbYgFAhN D1vqN8q2cYmYNp3bGF2VejWCq0SC6W7Ingzlx6G1y4x3XZb+Iza29HYyFTMWJtCPcVgnCiWOqlbPU b4L6hGTXGnCU7bAqKAgTZ6SWQh8hUVrGQIxFAPFqdwhMfvSgwe76GKHj769xHmALOL8m273TKjgUp Yg7rZhybP+vGoU95HJkH+CWjvqv7xKKbiC1sEGmYBhVFSlLKbs8AmoirEoSZc+MeWzjUbP2ngw3JZ OTY4snwpsf3D6kz6a5vDkU0OFX+OKMsxq/+wGIpOHrkoy5VjCGJf3dVFJRonJcywPNUYa/VtHRqNf 3hasWgDlISFgMfwrUqhg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1paK0k-00BQHy-Og; Thu, 09 Mar 2023 17:25:02 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1paK0e-00BQG4-6e; Thu, 09 Mar 2023 17:24:57 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C00BC61C9C; Thu, 9 Mar 2023 17:24:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2853FC433EF; Thu, 9 Mar 2023 17:24:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678382695; bh=gVhrjCj77/5J/qbJXsvZbwaLDnI4v1jfu9FIPhCu3LE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=H9kaqCxri1hR1og1XvbopPSB+mRwmy6wXii0Zh5sZBdMMPn7jsliwFZyDY9Ldp33V DEcKJPHhIhYsNZ40RRnpJ1Xl6qw38jSTxdQ+J7kbdwb7ImWyij0qAnS3paNk5OsNjV 0MfpkVxFgAKyMQAttlr+jPPqjBLjtEtRZ6b/e+ex8Y7AqYGO41o9PSrmHMsASZhbpm x97ITw9xwFNIzLAeWIOSg7hpaYLTQJTWRRcSsjQrfCIkFWqYhCSwylImOdA3dS7CZz 3JWPNUeUdkxYjj1PC5BhR5AeBYhUEo2smPQrKM6v7wqqmf4bgTzQ3/T8ld/6wvkDpB 7K5sGj1tgH3eA== Date: Thu, 9 Mar 2023 17:24:48 +0000 From: Lee Jones To: ChiYuan Huang Cc: ChiaEn Wu , corbet@lwn.net, pavel@ucw.cz, matthias.bgg@gmail.com, andriy.shevchenko@linux.intel.com, jacek.anaszewski@gmail.com, angelogioacchino.delregno@collabora.com, linux-doc@vger.kernel.org, peterwu.pub@gmail.com, linux-leds@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, szunichen@gmail.com Subject: Re: [PATCH v17 RESEND 2/3] leds: flash: mt6370: Add MediaTek MT6370 flashlight support Message-ID: <20230309172448.GU9667@google.com> References: <20230305100608.GD2574592@google.com> <20230307034433.GA10739@linuxcarl2.richtek.com> <20230308135433.GL9667@google.com> <20230309014927.GA12537@linuxcarl2.richtek.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20230309014927.GA12537@linuxcarl2.richtek.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230309_092456_340673_F2C48605 X-CRM114-Status: GOOD ( 40.61 ) 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 T24gVGh1LCAwOSBNYXIgMjAyMywgQ2hpWXVhbiBIdWFuZyB3cm90ZToKCj4gT24gV2VkLCBNYXIg MDgsIDIwMjMgYXQgMDE6NTQ6MzNQTSArMDAwMCwgTGVlIEpvbmVzIHdyb3RlOgo+IEhpLCBMZWU6 Cj4gPiBPbiBUdWUsIDA3IE1hciAyMDIzLCBDaGlZdWFuIEh1YW5nIHdyb3RlOgo+ID4KPiA+ID4g SGksIExlZToKPiA+ID4gICAgUmVwbHkgYmVsb3cgdGhlIGNvbW1lbnRzLgo+ID4gPgo+ID4gPiBP biBTdW4sIE1hciAwNSwgMjAyMyBhdCAxMDowNjowOEFNICswMDAwLCBMZWUgSm9uZXMgd3JvdGU6 Cj4gPiA+ID4gT24gVGh1LCAyMyBGZWIgMjAyMywgQ2hpYUVuIFd1IHdyb3RlOgo+ID4gPiA+Cj4g PiA+ID4gPiBGcm9tOiBDaGlZdWFuIEh1YW5nIDxjeV9odWFuZ0ByaWNodGVrLmNvbT4KPiA+ID4g PiA+Cj4gPiA+ID4gPiBUaGUgTWVkaWFUZWsgTVQ2MzcwIGlzIGEgaGlnaGx5LWludGVncmF0ZWQg c21hcnQgcG93ZXIgbWFuYWdlbWVudCBJQywKPiA+ID4gPiA+IHdoaWNoIGluY2x1ZGVzIGEgc2lu Z2xlIGNlbGwgTGktSW9uL0xpLVBvbHltZXIgc3dpdGNoaW5nIGJhdHRlcnkKPiA+ID4gPiA+IGNo YXJnZXIsIGEgVVNCIFR5cGUtQyAmIFBvd2VyIERlbGl2ZXJ5IChQRCkgY29udHJvbGxlciwgZHVh bCBGbGFzaAo+ID4gPiA+ID4gTEVEIGN1cnJlbnQgc291cmNlcywgYSBSR0IgTEVEIGRyaXZlciwg YSBiYWNrbGlnaHQgV0xFRCBkcml2ZXIsCj4gPiA+ID4gPiBhIGRpc3BsYXkgYmlhcyBkcml2ZXIg YW5kIGEgZ2VuZXJhbCBMRE8gZm9yIHBvcnRhYmxlIGRldmljZXMuCj4gPiA+ID4gPgo+ID4gPiA+ ID4gQWRkIHN1cHBvcnQgZm9yIHRoZSBNVDYzNzAgRmxhc2ggTEVEIGRyaXZlci4gRmxhc2ggTEVE IGluIE1UNjM3MAo+ID4gPiA+ID4gaGFzIDIgY2hhbm5lbHMgYW5kIHN1cHBvcnQgdG9yY2gvc3Ry b2JlIG1vZGUuCj4gPiA+ID4gPgo+ID4gPiA+ID4gQWNrZWQtYnk6IEphY2VrIEFuYXN6ZXdza2kg PGphY2VrLmFuYXN6ZXdza2lAZ21haWwuY29tPgo+ID4gPiA+ID4gQ28tZGV2ZWxvcGVkLWJ5OiBB bGljZSBDaGVuIDxhbGljZV9jaGVuQHJpY2h0ZWsuY29tPgo+ID4gPiA+ID4gU2lnbmVkLW9mZi1i eTogQWxpY2UgQ2hlbiA8YWxpY2VfY2hlbkByaWNodGVrLmNvbT4KPiA+ID4gPiA+IFNpZ25lZC1v ZmYtYnk6IENoaVl1YW4gSHVhbmcgPGN5X2h1YW5nQHJpY2h0ZWsuY29tPgo+ID4gPiA+ID4gU2ln bmVkLW9mZi1ieTogQ2hpYUVuIFd1IDxjaGlhZW5fd3VAcmljaHRlay5jb20+Cj4gPiA+ID4gPiAt LS0KPiA+ID4gPiA+IHYxNwo+ID4gPiA+ID4gLSBVcGRhdGUgdGhlIHllYXIgb2YgQ29weXJpZ2h0 IGZyb20gMjAyMiB0byAyMDIzCj4gPiA+ID4gPgo+ID4gPiA+ID4gLS0tCj4gPiA+ID4gPiAgZHJp dmVycy9sZWRzL2ZsYXNoL0tjb25maWcgICAgICAgICAgICAgfCAgMTMgKwo+ID4gPiA+ID4gIGRy aXZlcnMvbGVkcy9mbGFzaC9NYWtlZmlsZSAgICAgICAgICAgIHwgICAxICsKPiA+ID4gPiA+ICBk cml2ZXJzL2xlZHMvZmxhc2gvbGVkcy1tdDYzNzAtZmxhc2guYyB8IDU5NiArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKPiA+ID4gPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDYxMCBpbnNl cnRpb25zKCspCj4gPiA+ID4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbGVkcy9mbGFz aC9sZWRzLW10NjM3MC1mbGFzaC5jCj4gPgo+ID4gWy4uLl0KPiA+Cj4gPiA+ID4gPiArc3RhdGlj IGludCBfbXQ2MzcwX2ZsYXNoX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxh c2ggKmZsX2NkZXYsCj4gPiA+ID4gPiArCQkJCQl1MzIgYnJpZ2h0bmVzcykKPiA+ID4gPiA+ICt7 Cj4gPiA+ID4gPiArCXN0cnVjdCBtdDYzNzBfbGVkICpsZWQgPSB0b19tdDYzNzBfbGVkKGZsX2Nk ZXYsIGZsYXNoKTsKPiA+ID4gPiA+ICsJc3RydWN0IG10NjM3MF9wcml2ICpwcml2ID0gbGVkLT5w cml2Owo+ID4gPiA+ID4gKwlzdHJ1Y3QgbGVkX2ZsYXNoX3NldHRpbmcgKnNldHRpbmcgPSAmZmxf Y2Rldi0+YnJpZ2h0bmVzczsKPiA+ID4gPiA+ICsJdTMyIHZhbCA9IChicmlnaHRuZXNzIC0gc2V0 dGluZy0+bWluKSAvIHNldHRpbmctPnN0ZXA7Cj4gPiA+ID4gPiArCWludCByZXQsIGk7Cj4gPiA+ ID4gPiArCj4gPiA+ID4gPiArCWlmIChsZWQtPmxlZF9ubyA9PSBNVDYzNzBfTEVEX0pPSU5UKSB7 Cj4gPiA+ID4KPiA+ID4gPiBXaGF0IGlzIGEgIkpPSU5UIj8KPiA+ID4gPgo+ID4gPiBTaW5jZSBN VDYzNzAgaGFzIHR3byBmbGFzaCBsZWQgY2hhbm5lbHMuIFBlciBjaGFubmVsIGNhbiBkcml2ZSB0 aGUgY3VycmVudCB1cCB0byAxLjVBLgo+ID4gPiAnSk9JTlQnIGNhc2UgaXMgdXNlZCBpZiAxLjVB IGRyaXZpbmcgY3VycmVudCBpcyBub3QgZW5vdWdoLCBsaWtlIGFzIGZsYXNoIGN1cnJlbnQgMkEu Cj4gPiA+IFRoZXkgY2FuIHVzZSB0d28gY2hhbm5lbHMgdG8gZHJpdmUgJ29uZScgZmxhc2ggbGVk IGJ5IHRoZSBIVyBhcHBsaWNhdGlvbi4KPiA+ID4gVGhpcyB3aWxsIG1ha2UgdGhlIGRyaXZpbmcg Y3VycmVudCBsYXJnZXIgdGhhbiB0aGUgY2FwYWJpbGl0eSBvZiBvbmUgY2hhbm5lbC4KPiA+Cj4g PiBJcyAiam9pbnQiIHRoZSB0ZXJtIHVzZWQgaW4gdGhlIGRhdGFzaGVldD8KPiA+Cj4gTm9wZSwg dGhpcyB0ZXJtIGlzIG5vdCBjbGVhcmx5IGRlZmluZWQgaW4gdGhlIGRhdGFzaGVldC4gYnV0IHRo aXMga2luZCBvZiBIVyBhcHBsaWNhdGlvbiBpcwo+IGFsbG93ZWQuCj4gPiBQbGVhc2UgbWFrZSB0 aGlzIGRlZmluaXRpb24gY2xlYXIgaW4gdGhlIGNvZGUuCj4gPgo+ID4gSWYgSSdtIGFza2luZywg b3RoZXJzIGFyZSBsaWtlbHkgdG8gdG9vLgo+ID4KPiBUaGFua3MsIEknbGwgYWRkIG1vcmUgY29t bWVudHMgdG8gY2xlYXJseSBkZXNjcmliZSB3aGF0IHRoZSAnSk9JTlQnIGNvZGUgZGlkLgo+ID4g Wy4uLl0KPiA+Cj4gPiA+ID4gPiArc3RhdGljIGludCBtdDYzNzBfaW5pdF9mbGFzaF9wcm9wZXJ0 aWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+ID4gPiA+ICsJCQkJCXN0cnVjdCBtdDYzNzBfbGVk ICpsZWQsCj4gPiA+ID4gPiArCQkJCQlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKQo+ID4g PiA+ID4gK3sKPiA+ID4gPiA+ICsJc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmxhc2ggPSAm bGVkLT5mbGFzaDsKPiA+ID4gPiA+ICsJc3RydWN0IGxlZF9jbGFzc2RldiAqbGNkZXYgPSAmZmxh c2gtPmxlZF9jZGV2Owo+ID4gPiA+ID4gKwlzdHJ1Y3QgbXQ2MzcwX3ByaXYgKnByaXYgPSBsZWQt PnByaXY7Cj4gPiA+ID4gPiArCXN0cnVjdCBsZWRfZmxhc2hfc2V0dGluZyAqczsKPiA+ID4gPiA+ ICsJdTMyIHNvdXJjZXNbTVQ2MzcwX01BWF9MRURTXTsKPiA+ID4gPiA+ICsJdTMyIG1heF91YSwg dmFsOwo+ID4gPiA+ID4gKwlpbnQgaSwgcmV0LCBudW07Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiAr CW51bSA9IGZ3bm9kZV9wcm9wZXJ0eV9jb3VudF91MzIoZndub2RlLCAibGVkLXNvdXJjZXMiKTsK PiA+ID4gPiA+ICsJaWYgKG51bSA8IDEpCj4gPiA+ID4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9i ZShkZXYsIC1FSU5WQUwsCj4gPiA+ID4gPiArCQkJCSAgICAgIk5vdCBzcGVjaWZpZWQgb3Igd3Jv bmcgbnVtYmVyIG9mIGxlZC1zb3VyY2VzXG4iKTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsJcmV0 ID0gZndub2RlX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGZ3bm9kZSwgImxlZC1zb3VyY2VzIiwg c291cmNlcywgbnVtKTsKPiA+ID4gPiA+ICsJaWYgKHJldCkKPiA+ID4gPiA+ICsJCXJldHVybiBy ZXQ7Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiArCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewo+ ID4gPiA+ID4gKwkJaWYgKHNvdXJjZXNbaV0gPj0gTVQ2MzcwX01BWF9MRURTKQo+ID4gPiA+ID4g KwkJCXJldHVybiAtRUlOVkFMOwo+ID4gPiA+ID4gKwkJaWYgKHByaXYtPmxlZHNfYWN0aXZlICYg QklUKHNvdXJjZXNbaV0pKQo+ID4gPiA+ID4gKwkJCXJldHVybiAtRUlOVkFMOwo+ID4gPiA+ID4g KwkJcHJpdi0+bGVkc19hY3RpdmUgfD0gQklUKHNvdXJjZXNbaV0pOwo+ID4gPiA+ID4gKwl9Cj4g PiA+ID4gPiArCj4gPiA+ID4gPiArCWxlZC0+bGVkX25vID0gbnVtID09IDIgPyBNVDYzNzBfTEVE X0pPSU5UIDogc291cmNlc1swXTsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsJbWF4X3VhID0gbnVt ID09IDIgPyBNVDYzNzBfSVRPUkNIX0RPVUJMRV9NQVhfdUEgOiBNVDYzNzBfSVRPUkNIX01BWF91 QTsKPiA+ID4gPiA+ICsJdmFsID0gTVQ2MzcwX0lUT1JDSF9NSU5fdUE7Cj4gPiA+ID4KPiA+ID4g PiBJbiB3aGF0IHNjZW5hcmlvIGRvZXMgdGhpcyBub3QgZ2V0IG92ZXJ3cml0dGVuPwo+ID4gPiA+ Cj4gPiA+IE9ubHkgaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcuIFRoaXMgd2lsbCBtYWtlIHRo ZSB2YWx1ZSBrZWVwIGluIG1pbmltdW0uCj4gPgo+ID4gSWYgdGhlIHByb3BlcnR5IGlzIG1pc3Np bmcsIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMigpIHJldHVybnMgYW4gZXJybm8sIG5vPwo+ID4K PiA+IElmIHRoYXQncyB0aGUgY2FzZSwgdmFsIHdpbGwgYmUgb3Zlci13cml0dGVuIGluIHRoZSBp ZigpIGNsYXVzZT8KPiA+Cj4gSW4gdGhpcyBmdW5jaXRvbiwgdGhyZWUgcHJvcGVydGllcyBuZWVk cyB0byBiZSBwYXJlc2VkIGZyb20gRFQuIEVhY2ggb25lIG5lZWQgdG8gY2xhbXAgdGhlIHZhbHVl Lgo+IFRoZXJlJ3JlIHR3byB3YXlzIHRvIHdyaXRlIHRoZSBjb2RlLgo+Cj4gW09wdGlvbiAxXQo+ IHJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMiguLi4pCj4gaWYgKHJldCkKPiAgICAgdmFs ID0gTUlNX3VBOwo+Cj4gdmFsID0gbXQ2MzcwX2NsYW1wKHZhbCwgTUlOLCBNQVgpOwo+Cj4gW09w dGlvbiAyXQo+IHZhbCA9IE1JTl91QTsKPiBpZiAoIXJldCkKPiAgICAgdmFsID0gbXQ2MzcwX2Ns YW1wKHZhbCwgTUlOLCBNQVgpOwo+Cj4KPiBGcm9tIHRoZSBhYm92ZSwgdGhlIHNlbmNvbmQgb25l IGNhbiBzYXZlIG1vcmUgTE9DLCBubz8KPiBCdXQgaXQgc2VlbXMgdGhlIGZpcnN0IG9uZSBpcyBt b3JlIHByZWZlcmFibGUgYnkgeW91LCByaWdodD8KCkkgc2VlIG5vdyB0aGF0ICd2YWwnIGlzIHVz ZWQgaW4gY2xhbXAoKSBiZWZvcmUgYmVpbmcgb3ZlcndyaXR0ZW4gbm93LgoKLS0KTGVlIEpvbmVz IFvmnY7nkLzmlq9dCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1hcm0ta2VybmVsCg==