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=-12.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 4619DC4363D for ; Fri, 25 Sep 2020 12:28:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CB047221EC for ; Fri, 25 Sep 2020 12:28:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1601036928; bh=oAGOSMRMsQU8yJoQm1DZP2F8qfoZz3uwgR4UJ81S1UI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:List-ID:From; b=05bcwTXemErsiC+Sfn1Qggp5+RltRn8kbVODm+9WjgmaQCMJmJ1WbKVe3P5eaMEOh s9bmNmgUEf8KdkxqJS5S3L5iFoQ131Yda53uvgAspQjx+/SfKmhKcfrsGU9BtjR/ig 9j2Ak0fq07vm9oFxf2tI2iSG82sCU1HIl4A/4wsI= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728148AbgIYM2s (ORCPT ); Fri, 25 Sep 2020 08:28:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:42488 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726368AbgIYM2s (ORCPT ); Fri, 25 Sep 2020 08:28:48 -0400 Received: from archlinux (cpc149474-cmbg20-2-0-cust94.5-4.cable.virginm.net [82.4.196.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 33ED721D7A; Fri, 25 Sep 2020 12:28:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1601036927; bh=oAGOSMRMsQU8yJoQm1DZP2F8qfoZz3uwgR4UJ81S1UI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Y1oS3uluNIPh0wJdYOGx7Y2K/UPH/uoFuFKGe9MzXO0oOJ/i2Kx9Ko5cku91pKDbT Zaz5EvHR+ewNrOL9+W9vUGQToQW8taKgUu88IXiEwoblGlD6d2KfLsI4rXa26V2oVH uP2GCoWcyutLPqTVKGay1AyuOdqZkB98Fu7SgK78= Date: Fri, 25 Sep 2020 13:28:40 +0100 From: Jonathan Cameron To: Gene Chen Cc: robh+dt@kernel.org, matthias.bgg@gmail.com, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, devicetree@vger.kernel.org, linux-iio@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, gene_chen@richtek.com, Wilma.Wu@mediatek.com, shufan_lee@richtek.com, cy_huang@richtek.com, benjamin.chao@mediatek.com Subject: Re: [PATCH v5 3/3] iio: adc: mt6360: Add ADC driver for MT6360 Message-ID: <20200925132840.513bf214@archlinux> In-Reply-To: <1600687442-23658-4-git-send-email-gene.chen.richtek@gmail.com> References: <1600687442-23658-1-git-send-email-gene.chen.richtek@gmail.com> <1600687442-23658-4-git-send-email-gene.chen.richtek@gmail.com> X-Mailer: Claws Mail 3.17.6 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-iio@vger.kernel.org On Mon, 21 Sep 2020 19:24:02 +0800 Gene Chen wrote: > From: Gene Chen >=20 > Add MT6360 ADC driver include Charger Current, Voltage, and > Temperature. >=20 > Signed-off-by: Gene Chen Hi Gene, A few things inline that need fixing or tidying up. Looking good otherwise. Jonathan > --- > drivers/iio/adc/Kconfig | 11 ++ > drivers/iio/adc/Makefile | 1 + > drivers/iio/adc/mt6360-adc.c | 363 +++++++++++++++++++++++++++++++++++++= ++++++ > 3 files changed, 375 insertions(+) > create mode 100644 drivers/iio/adc/mt6360-adc.c >=20 > diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig > index d94dc80..a135ada 100644 > --- a/drivers/iio/adc/Kconfig > +++ b/drivers/iio/adc/Kconfig > @@ -703,6 +703,17 @@ config MCP3911 > This driver can also be built as a module. If so, the module will be > called mcp3911. > =20 > +config MEDIATEK_MT6360_ADC > + tristate "Mediatek MT6360 ADC driver" > + depends on MFD_MT6360 > + select IIO_BUFFER > + select IIO_TRIGGERED_BUFFER > + help > + Say Y here to enable MT6360 ADC support. > + Integrated for System Monitoring includes > + is used in smartphones and tablets and supports a 11 channel > + general purpose ADC. > + > config MEDIATEK_MT6577_AUXADC > tristate "MediaTek AUXADC driver" > depends on ARCH_MEDIATEK || COMPILE_TEST > diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile > index 90f94ad..5fca90a 100644 > --- a/drivers/iio/adc/Makefile > +++ b/drivers/iio/adc/Makefile > @@ -65,6 +65,7 @@ obj-$(CONFIG_MAX9611) +=3D max9611.o > obj-$(CONFIG_MCP320X) +=3D mcp320x.o > obj-$(CONFIG_MCP3422) +=3D mcp3422.o > obj-$(CONFIG_MCP3911) +=3D mcp3911.o > +obj-$(CONFIG_MEDIATEK_MT6360_ADC) +=3D mt6360-adc.o > obj-$(CONFIG_MEDIATEK_MT6577_AUXADC) +=3D mt6577_auxadc.o > obj-$(CONFIG_MEN_Z188_ADC) +=3D men_z188_adc.o > obj-$(CONFIG_MESON_SARADC) +=3D meson_saradc.o > diff --git a/drivers/iio/adc/mt6360-adc.c b/drivers/iio/adc/mt6360-adc.c > new file mode 100644 > index 0000000..a1a01e5 > --- /dev/null > +++ b/drivers/iio/adc/mt6360-adc.c > @@ -0,0 +1,363 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > + > +#define MT6360_REG_PMUCHGCTRL3 0x313 > +#define MT6360_REG_PMUADCCFG 0x356 > +#define MT6360_REG_PMUADCIDLET 0x358 > +#define MT6360_REG_PMUADCRPT1 0x35A > + > +/* PMUCHGCTRL3 0x313 */ > +#define MT6360_AICR_MASK GENMASK(7, 2) > +#define MT6360_AICR_SHFT 2 > +#define MT6360_AICR_400MA 0x6 > +/* PMUADCCFG 0x356 */ > +#define MT6360_ADCEN_MASK 0x8000 > +/* PMUADCRPT1 0x35A */ > +#define MT6360_PREFERCH_MASK GENMASK(7, 4) > +#define MT6360_PREFERCH_SHFT 4 > +#define MT6360_RPTCH_MASK GENMASK(3, 0) > +#define MT6360_NO_PREFER 15 > + > +/* Time in ms */ > +#define ADC_WAIT_TIME_MS 25 > + > +enum { > + MT6360_CHAN_USBID =3D 0, > + MT6360_CHAN_VBUSDIV5, > + MT6360_CHAN_VBUSDIV2, > + MT6360_CHAN_VSYS, > + MT6360_CHAN_VBAT, > + MT6360_CHAN_IBUS, > + MT6360_CHAN_IBAT, > + MT6360_CHAN_CHG_VDDP, > + MT6360_CHAN_TEMP_JC, > + MT6360_CHAN_VREF_TS, > + MT6360_CHAN_TS, > + MT6360_CHAN_MAX > +}; > + > +struct mt6360_adc_data { > + struct device *dev; > + struct regmap *regmap; > + /* Due to only one set of ADC control, this lock is used to prevent the= race condition */ > + struct mutex adc_lock; > + ktime_t last_off_timestamps[MT6360_CHAN_MAX]; > +}; > + > +static int mt6360_adc_read_channel(struct mt6360_adc_data *mad, int chan= nel, int *val) > +{ > + __be16 adc_enable; > + u8 rpt[3]; > + ktime_t start_t, predict_end_t; > + unsigned int pre_wait_time; > + int ret; > + > + mutex_lock(&mad->adc_lock); > + > + /* Select the preferred ADC channel */ > + ret =3D regmap_update_bits(mad->regmap, MT6360_REG_PMUADCRPT1, MT6360_P= REFERCH_MASK, > + channel << MT6360_PREFERCH_SHFT); > + if (ret) > + goto out_adc_lock; > + > + adc_enable =3D cpu_to_be16(MT6360_ADCEN_MASK | BIT(channel)); > + ret =3D regmap_raw_write(mad->regmap, MT6360_REG_PMUADCCFG, &adc_enable= , sizeof(adc_enable)); > + if (ret) > + goto out_adc_lock; > + > + start_t =3D ktime_get(); > + predict_end_t =3D ktime_add_ms(mad->last_off_timestamps[channel], 2 * A= DC_WAIT_TIME_MS); > + > + if (ktime_after(start_t, predict_end_t)) > + pre_wait_time =3D ADC_WAIT_TIME_MS; > + else > + pre_wait_time =3D 3 * ADC_WAIT_TIME_MS; > + > + msleep(pre_wait_time); > + > + while (true) { > + ret =3D regmap_raw_read(mad->regmap, MT6360_REG_PMUADCRPT1, rpt, sizeo= f(rpt)); > + if (ret) > + goto out_adc_conv; > + > + /* > + * There are two functions, ZCV and TypeC OTP, running ADC VBAT and TS= in > + * background, and ADC samples are taken on a fixed frequency no matte= r read the > + * previous one or not. > + * To avoid conflict, We set minimum time threshold after enable ADC a= nd > + * check report channel is the same. > + * The worst case is run the same ADC twice and background function is= also running, > + * ADC conversion sequence is desire channel before start ADC, backgro= und ADC, > + * desire channel after start ADC. > + * So the minimum correct data is three times of typical conversion ti= me. > + */ > + if ((rpt[0] & MT6360_RPTCH_MASK) =3D=3D channel) > + break; > + > + msleep(ADC_WAIT_TIME_MS); > + } > + > + /* rpt[1]: ADC_HI_BYTE, rpt[2]: ADC_LOW_BYTE */ > + *val =3D rpt[1] << 8 | rpt[2]; > + ret =3D IIO_VAL_INT; > + > +out_adc_conv: > + /* Only keep ADC enable */ > + adc_enable =3D cpu_to_be16(MT6360_ADCEN_MASK); > + regmap_raw_write(mad->regmap, MT6360_REG_PMUADCCFG, &adc_enable, sizeof= (adc_enable)); > + mad->last_off_timestamps[channel] =3D ktime_get(); > + /* Config prefer channel to NO_PREFER */ > + regmap_update_bits(mad->regmap, MT6360_REG_PMUADCRPT1, MT6360_PREFERCH_= MASK, > + MT6360_NO_PREFER << MT6360_PREFERCH_SHFT); > +out_adc_lock: > + mutex_unlock(&mad->adc_lock); > + > + return ret; > +} > + > +static int mt6360_adc_read_scale(struct mt6360_adc_data *mad, int channe= l, int *val, int *val2) > +{ > + unsigned int regval; > + int ret; > + > + switch (channel) { > + case MT6360_CHAN_USBID: > + case MT6360_CHAN_VSYS: > + case MT6360_CHAN_VBAT: > + case MT6360_CHAN_CHG_VDDP: > + case MT6360_CHAN_VREF_TS: > + case MT6360_CHAN_TS: > + *val =3D 1250; > + return IIO_VAL_INT; > + case MT6360_CHAN_VBUSDIV5: > + *val =3D 6250; > + return IIO_VAL_INT; > + case MT6360_CHAN_VBUSDIV2: > + case MT6360_CHAN_IBUS: > + case MT6360_CHAN_IBAT: > + *val =3D 2500; > + > + if (channel =3D=3D MT6360_CHAN_IBUS) { > + /* IBUS will be affected by input current limit for the different Ron= */ > + /* Check whether the config is <400mA or not */ > + ret =3D regmap_read(mad->regmap, MT6360_REG_PMUCHGCTRL3, ®val); > + if (ret) > + return ret; > + > + regval =3D (regval & MT6360_AICR_MASK) >> MT6360_AICR_SHFT; > + if (regval < MT6360_AICR_400MA) > + *val =3D 1900; > + } > + > + return IIO_VAL_INT; > + case MT6360_CHAN_TEMP_JC: > + *val =3D 105; > + *val2 =3D 100; > + return IIO_VAL_FRACTIONAL; > + } > + > + return -EINVAL; > +} > + > +static int mt6360_adc_read_offset(struct mt6360_adc_data *mad, int chann= el, int *val) > +{ > + *val =3D (channel =3D=3D MT6360_CHAN_TEMP_JC) ? -80 : 0; > + return IIO_VAL_INT; > + > +} > + > +static int mt6360_adc_read_raw(struct iio_dev *iio_dev, const struct iio= _chan_spec *chan, > + int *val, int *val2, long mask) > +{ > + struct mt6360_adc_data *mad =3D iio_priv(iio_dev); > + > + switch (mask) { > + case IIO_CHAN_INFO_RAW: > + return mt6360_adc_read_channel(mad, chan->channel, val); > + case IIO_CHAN_INFO_SCALE: > + return mt6360_adc_read_scale(mad, chan->channel, val, val2); > + case IIO_CHAN_INFO_OFFSET: > + return mt6360_adc_read_offset(mad, chan->channel, val); > + } > + > + return -EINVAL; > +} > + > +static const char *mt6360_channel_labels[MT6360_CHAN_MAX] =3D { > + "usbid", "vbusdiv5", "vbusdiv2", "vsys", "vbat", "ibus", "ibat", "chg_v= ddp", "temp_jc", > + "vref_ts", "ts" > +}; > + > +static int mt6360_adc_read_label(struct iio_dev *iio_dev, const struct i= io_chan_spec *chan, > + char *label) > +{ > + return snprintf(label, PAGE_SIZE, "%s\n", mt6360_channel_labels[chan->c= hannel]); > +} Very nice. The patch series adding this callback will hopefully be finaliz= ed shortly. > + > +static const struct iio_info mt6360_adc_iio_info =3D { > + .read_raw =3D mt6360_adc_read_raw, > + .read_label =3D mt6360_adc_read_label, > +}; > + > +#define MT6360_ADC_CHAN(_idx, _type) { \ > + .type =3D _type, \ > + .channel =3D MT6360_CHAN_##_idx, \ > + .scan_index =3D MT6360_CHAN_##_idx, \ > + .datasheet_name =3D #_idx, \ > + .scan_type =3D { \ > + .sign =3D 'u', \ > + .realbits =3D 16, \ > + .storagebits =3D 16, \ > + .endianness =3D IIO_CPU, \ > + }, \ > + .indexed =3D 1, \ > + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | \ > + BIT(IIO_CHAN_INFO_SCALE) | \ > + BIT(IIO_CHAN_INFO_OFFSET), \ > +} > + > +static const struct iio_chan_spec mt6360_adc_channels[] =3D { > + MT6360_ADC_CHAN(USBID, IIO_VOLTAGE), > + MT6360_ADC_CHAN(VBUSDIV5, IIO_VOLTAGE), > + MT6360_ADC_CHAN(VBUSDIV2, IIO_VOLTAGE), > + MT6360_ADC_CHAN(VSYS, IIO_VOLTAGE), > + MT6360_ADC_CHAN(VBAT, IIO_VOLTAGE), > + MT6360_ADC_CHAN(IBUS, IIO_CURRENT), > + MT6360_ADC_CHAN(IBAT, IIO_CURRENT), > + MT6360_ADC_CHAN(CHG_VDDP, IIO_VOLTAGE), > + MT6360_ADC_CHAN(TEMP_JC, IIO_TEMP), > + MT6360_ADC_CHAN(VREF_TS, IIO_VOLTAGE), > + MT6360_ADC_CHAN(TS, IIO_VOLTAGE), > + IIO_CHAN_SOFT_TIMESTAMP(MT6360_CHAN_MAX), > +}; > + > +static irqreturn_t mt6360_adc_trigger_handler(int irq, void *p) > +{ > + struct iio_poll_func *pf =3D p; > + struct iio_dev *indio_dev =3D pf->indio_dev; > + struct mt6360_adc_data *mad =3D iio_priv(indio_dev); > + struct { > + u16 values[MT6360_CHAN_MAX]; > + int64_t timestamp; > + } data __aligned(8) =3D {0}; I don't think that is sufficient to force the gap to be set to 0. The c99 spec says in 6.7.8.21 "If there are fewer initializers in a brace-enclosed list than there are el= ements or members of an aggregate, or fewer characters in a string literal used to initialize= an array of known size than there are elements in the array, the remainder of the aggregate s= hall be initialized implicitly the same as objects that have static storage duratio= n." The static case is covered by 6.7.8.10 "If an object that has automatic storage duration is not initialized explic= itly, its value is indeterminate. If an object that has static storage duration is not initial= ized explicitly, then: =E2=80=94 if it has pointer type, it is initialized to a null pointer; =E2=80=94 if it has arithmetic type, it is initialized to (positive or unsi= gned) zero; =E2=80=94 if it is an aggregate, every member is initialized (recursively) = according to these rules; =E2=80=94 if it isaunion, the first named member is initialized (recursivel= y) according to these rules " Structure is an aggregate,s every member is initialized. Unfortunately tha= t doesn't have any impact on gaps. So it 'might' zero it, but there are no guarantee= s. As such, I think you need to use memset which will just fill the memory wit= h zeros without caring about the structure. Or cheeky route is to add elements to fill the gap and just call them pad[]= or similar. > + int i =3D 0, bit, val, ret; > + > + > + for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklengt= h) { > + ret =3D mt6360_adc_read_channel(mad, bit, &val); > + if (ret < 0) { > + dev_warn(&indio_dev->dev, "Failed to get channel %d conversion val\n"= , bit); > + goto out; > + } > + > + data.values[i++] =3D val; > + } > + iio_push_to_buffers_with_timestamp(indio_dev, &data, iio_get_time_ns(in= dio_dev)); > +out: > + iio_trigger_notify_done(indio_dev->trig); > + > + return IRQ_HANDLED; > +} > + > +static inline int mt6360_adc_reset(struct mt6360_adc_data *info) > +{ > + __be16 adc_enable; > + ktime_t all_off_time; > + int i, ret; > + > + /* Clear ADC idle wait time to 0 */ > + ret =3D regmap_write(info->regmap, MT6360_REG_PMUADCIDLET, 0); > + if (ret) > + return ret; > + > + /* Only keep ADC enable, but keep all channels off */ > + adc_enable =3D cpu_to_be16(MT6360_ADCEN_MASK); > + ret =3D regmap_raw_write(info->regmap, MT6360_REG_PMUADCCFG, (void *)&a= dc_enable, Why are we casting to a void *? That shouldn't be necessary. Am I missing s= omething? > + sizeof(__be16)); Slight preference for sizeof(adc_enable) as then I don't have to sanity che= ckit is the right type whilst reviewing. > + if (ret) > + return ret; > + > + /* Reset all channel off time to the current one */ > + all_off_time =3D ktime_get(); > + for (i =3D 0; i < MT6360_CHAN_MAX; i++) > + info->last_off_timestamps[i] =3D all_off_time; > + > + return 0; > +} > + > +static int mt6360_adc_probe(struct platform_device *pdev) > +{ > + struct mt6360_adc_data *mad; > + struct regmap *regmap; > + struct iio_dev *indio_dev; > + int ret; > + > + regmap =3D dev_get_regmap(pdev->dev.parent, NULL); > + if (!regmap) { > + dev_err(&pdev->dev, "Failed to get parent regmap\n"); > + return -ENODEV; > + } > + > + indio_dev =3D devm_iio_device_alloc(&pdev->dev, sizeof(*mad)); > + if (!indio_dev) > + return -ENOMEM; > + > + mad =3D iio_priv(indio_dev); > + mad->dev =3D &pdev->dev; > + mad->regmap =3D regmap; > + mutex_init(&mad->adc_lock); > + > + ret =3D mt6360_adc_reset(mad); > + if (ret < 0) { > + dev_err(&pdev->dev, "Failed to reset adc\n"); > + return ret; > + } > + > + indio_dev->name =3D dev_name(&pdev->dev); > + indio_dev->dev.parent =3D &pdev->dev; > + indio_dev->info =3D &mt6360_adc_iio_info; > + indio_dev->modes =3D INDIO_DIRECT_MODE; > + indio_dev->channels =3D mt6360_adc_channels; > + indio_dev->num_channels =3D ARRAY_SIZE(mt6360_adc_channels); > + > + ret =3D devm_iio_triggered_buffer_setup(&pdev->dev, indio_dev, NULL, > + mt6360_adc_trigger_handler, NULL); > + if (ret) { > + dev_err(&pdev->dev, "Failed to allocate iio trigger buffer\n"); > + return ret; > + } > + > + return devm_iio_device_register(&pdev->dev, indio_dev); > +} > + > +static const struct of_device_id __maybe_unused mt6360_adc_of_id[] =3D { > + { .compatible =3D "mediatek,mt6360-adc", }, > + {} > +}; > +MODULE_DEVICE_TABLE(of, mt6360_adc_of_id); > + > +static struct platform_driver mt6360_adc_driver =3D { > + .driver =3D { > + .name =3D "mt6360-adc", > + .of_match_table =3D mt6360_adc_of_id, > + }, > + .probe =3D mt6360_adc_probe, > +}; > +module_platform_driver(mt6360_adc_driver); > + > +MODULE_AUTHOR("Gene Chen "); > +MODULE_DESCRIPTION("MT6360 ADC Driver"); > +MODULE_LICENSE("GPL v2"); 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=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 ABFDEC4727C for ; Fri, 25 Sep 2020 12:29:03 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 2EF1721D91 for ; Fri, 25 Sep 2020 12:29:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="SZX20ovy"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y1oS3ulu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2EF1721D91 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID: Subject: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=Zfr7HuKPFMyzNmJAgm+D0gFAvhUoCsX89q/JWbHyDME=; b=SZX20ovyCOdQ1ZQshJWAmpKht NhDljkHEwT9e+U1/NTTO5+4mclPjxzW3yOYSqxLtrhwAM742Cc1PXFWmtkHQPdFo551rhYufY1R8J r8QZde7+0ToD988vRIiuvmkouWavo9IhuTMpygFhy80TsWZCYP4ohEkmfR8mkSMYoaIhQoQNAty4J HwX+CzBS/9Zqu8FpCXiVoOGuyOOAEhnUKw8npOs0qHV3kCpbpVv8X6/YpEdEEUCx19mW2vrQOAgIq pucYvIC1EtwRjRIpVcjFOHJA9wQzyrrZn5+0cxt11QrAEs7v+dFrxyODw5Xjgrd6M+dsgiQMQqGw7 oxKRbnTEQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLmqK-0007wr-MK; Fri, 25 Sep 2020 12:28:52 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLmqG-0007w7-7D; Fri, 25 Sep 2020 12:28:49 +0000 Received: from archlinux (cpc149474-cmbg20-2-0-cust94.5-4.cable.virginm.net [82.4.196.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 33ED721D7A; Fri, 25 Sep 2020 12:28:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1601036927; bh=oAGOSMRMsQU8yJoQm1DZP2F8qfoZz3uwgR4UJ81S1UI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Y1oS3uluNIPh0wJdYOGx7Y2K/UPH/uoFuFKGe9MzXO0oOJ/i2Kx9Ko5cku91pKDbT Zaz5EvHR+ewNrOL9+W9vUGQToQW8taKgUu88IXiEwoblGlD6d2KfLsI4rXa26V2oVH uP2GCoWcyutLPqTVKGay1AyuOdqZkB98Fu7SgK78= Date: Fri, 25 Sep 2020 13:28:40 +0100 From: Jonathan Cameron To: Gene Chen Subject: Re: [PATCH v5 3/3] iio: adc: mt6360: Add ADC driver for MT6360 Message-ID: <20200925132840.513bf214@archlinux> In-Reply-To: <1600687442-23658-4-git-send-email-gene.chen.richtek@gmail.com> References: <1600687442-23658-1-git-send-email-gene.chen.richtek@gmail.com> <1600687442-23658-4-git-send-email-gene.chen.richtek@gmail.com> X-Mailer: Claws Mail 3.17.6 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200925_082848_409432_8BC387D8 X-CRM114-Status: GOOD ( 42.47 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gene_chen@richtek.com, devicetree@vger.kernel.org, lars@metafoo.de, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, cy_huang@richtek.com, benjamin.chao@mediatek.com, robh+dt@kernel.org, linux-mediatek@lists.infradead.org, pmeerw@pmeerw.net, knaack.h@gmx.de, matthias.bgg@gmail.com, Wilma.Wu@mediatek.com, linux-arm-kernel@lists.infradead.org, shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org T24gTW9uLCAyMSBTZXAgMjAyMCAxOToyNDowMiArMDgwMApHZW5lIENoZW4gPGdlbmUuY2hlbi5y aWNodGVrQGdtYWlsLmNvbT4gd3JvdGU6Cgo+IEZyb206IEdlbmUgQ2hlbiA8Z2VuZV9jaGVuQHJp Y2h0ZWsuY29tPgo+IAo+IEFkZCBNVDYzNjAgQURDIGRyaXZlciBpbmNsdWRlIENoYXJnZXIgQ3Vy cmVudCwgVm9sdGFnZSwgYW5kCj4gVGVtcGVyYXR1cmUuCj4gCj4gU2lnbmVkLW9mZi1ieTogR2Vu ZSBDaGVuIDxnZW5lX2NoZW5AcmljaHRlay5jb20+CgpIaSBHZW5lLAoKQSBmZXcgdGhpbmdzIGlu bGluZSB0aGF0IG5lZWQgZml4aW5nIG9yIHRpZHlpbmcgdXAuCgpMb29raW5nIGdvb2Qgb3RoZXJ3 aXNlLgoKSm9uYXRoYW4KPiAtLS0KPiAgZHJpdmVycy9paW8vYWRjL0tjb25maWcgICAgICB8ICAx MSArKwo+ICBkcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUgICAgIHwgICAxICsKPiAgZHJpdmVycy9p aW8vYWRjL210NjM2MC1hZGMuYyB8IDM2MyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMzc1IGluc2VydGlvbnMoKykKPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMKPiAKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwo+ IGluZGV4IGQ5NGRjODAuLmExMzVhZGEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9paW8vYWRjL0tj b25maWcKPiArKysgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwo+IEBAIC03MDMsNiArNzAzLDE3 IEBAIGNvbmZpZyBNQ1AzOTExCj4gIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFz IGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCj4gIAkgIGNhbGxlZCBtY3AzOTEx Lgo+ICAKPiArY29uZmlnIE1FRElBVEVLX01UNjM2MF9BREMKPiArCXRyaXN0YXRlICJNZWRpYXRl ayBNVDYzNjAgQURDIGRyaXZlciIKPiArCWRlcGVuZHMgb24gTUZEX01UNjM2MAo+ICsJc2VsZWN0 IElJT19CVUZGRVIKPiArCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgo+ICsJaGVscAo+ICsJ ICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNVDYzNjAgQURDIHN1cHBvcnQuCj4gKwkgIEludGVncmF0 ZWQgZm9yIFN5c3RlbSBNb25pdG9yaW5nIGluY2x1ZGVzCj4gKwkgIGlzIHVzZWQgaW4gc21hcnRw aG9uZXMgYW5kIHRhYmxldHMgYW5kIHN1cHBvcnRzIGEgMTEgY2hhbm5lbAo+ICsJICBnZW5lcmFs IHB1cnBvc2UgQURDLgo+ICsKPiAgY29uZmlnIE1FRElBVEVLX01UNjU3N19BVVhBREMKPiAgCXRy aXN0YXRlICJNZWRpYVRlayBBVVhBREMgZHJpdmVyIgo+ICAJZGVwZW5kcyBvbiBBUkNIX01FRElB VEVLIHx8IENPTVBJTEVfVEVTVAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZp bGUgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKPiBpbmRleCA5MGY5NGFkLi41ZmNhOTBhIDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvaWlv L2FkYy9NYWtlZmlsZQo+IEBAIC02NSw2ICs2NSw3IEBAIG9iai0kKENPTkZJR19NQVg5NjExKSAr PSBtYXg5NjExLm8KPiAgb2JqLSQoQ09ORklHX01DUDMyMFgpICs9IG1jcDMyMHgubwo+ICBvYmot JChDT05GSUdfTUNQMzQyMikgKz0gbWNwMzQyMi5vCj4gIG9iai0kKENPTkZJR19NQ1AzOTExKSAr PSBtY3AzOTExLm8KPiArb2JqLSQoQ09ORklHX01FRElBVEVLX01UNjM2MF9BREMpICs9IG10NjM2 MC1hZGMubwo+ICBvYmotJChDT05GSUdfTUVESUFURUtfTVQ2NTc3X0FVWEFEQykgKz0gbXQ2NTc3 X2F1eGFkYy5vCj4gIG9iai0kKENPTkZJR19NRU5fWjE4OF9BREMpICs9IG1lbl96MTg4X2FkYy5v Cj4gIG9iai0kKENPTkZJR19NRVNPTl9TQVJBREMpICs9IG1lc29uX3NhcmFkYy5vCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvbXQ2 MzYwLWFkYy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5hMWEwMWU1 Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMKPiBA QCAtMCwwICsxLDM2MyBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ ICsKPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4K PiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgva3RpbWUuaD4K PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4K PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgv cmVnbWFwLmg+Cj4gKwo+ICsjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgo+ICsjaW5jbHVk ZSA8bGludXgvaWlvL2lpby5oPgo+ICsjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3Vt ZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+Cj4gKwo+ICsj ZGVmaW5lIE1UNjM2MF9SRUdfUE1VQ0hHQ1RSTDMJMHgzMTMKPiArI2RlZmluZSBNVDYzNjBfUkVH X1BNVUFEQ0NGRwkweDM1Ngo+ICsjZGVmaW5lIE1UNjM2MF9SRUdfUE1VQURDSURMRVQJMHgzNTgK PiArI2RlZmluZSBNVDYzNjBfUkVHX1BNVUFEQ1JQVDEJMHgzNUEKPiArCj4gKy8qIFBNVUNIR0NU UkwzIDB4MzEzICovCj4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFTSwlHRU5NQVNLKDcsIDIpCj4g KyNkZWZpbmUgTVQ2MzYwX0FJQ1JfU0hGVAkyCj4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfNDAwTUEJ MHg2Cj4gKy8qIFBNVUFEQ0NGRyAweDM1NiAqLwo+ICsjZGVmaW5lIE1UNjM2MF9BRENFTl9NQVNL CTB4ODAwMAo+ICsvKiBQTVVBRENSUFQxIDB4MzVBICovCj4gKyNkZWZpbmUgTVQ2MzYwX1BSRUZF UkNIX01BU0sJR0VOTUFTSyg3LCA0KQo+ICsjZGVmaW5lIE1UNjM2MF9QUkVGRVJDSF9TSEZUCTQK PiArI2RlZmluZSBNVDYzNjBfUlBUQ0hfTUFTSwlHRU5NQVNLKDMsIDApCj4gKyNkZWZpbmUgTVQ2 MzYwX05PX1BSRUZFUgkxNQo+ICsKPiArLyogVGltZSBpbiBtcyAqLwo+ICsjZGVmaW5lIEFEQ19X QUlUX1RJTUVfTVMJMjUKPiArCj4gK2VudW0gewo+ICsJTVQ2MzYwX0NIQU5fVVNCSUQgPSAwLAo+ ICsJTVQ2MzYwX0NIQU5fVkJVU0RJVjUsCj4gKwlNVDYzNjBfQ0hBTl9WQlVTRElWMiwKPiArCU1U NjM2MF9DSEFOX1ZTWVMsCj4gKwlNVDYzNjBfQ0hBTl9WQkFULAo+ICsJTVQ2MzYwX0NIQU5fSUJV UywKPiArCU1UNjM2MF9DSEFOX0lCQVQsCj4gKwlNVDYzNjBfQ0hBTl9DSEdfVkREUCwKPiArCU1U NjM2MF9DSEFOX1RFTVBfSkMsCj4gKwlNVDYzNjBfQ0hBTl9WUkVGX1RTLAo+ICsJTVQ2MzYwX0NI QU5fVFMsCj4gKwlNVDYzNjBfQ0hBTl9NQVgKPiArfTsKPiArCj4gK3N0cnVjdCBtdDYzNjBfYWRj X2RhdGEgewo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ICsJc3RydWN0IHJlZ21hcCAqcmVnbWFw Owo+ICsJLyogRHVlIHRvIG9ubHkgb25lIHNldCBvZiBBREMgY29udHJvbCwgdGhpcyBsb2NrIGlz IHVzZWQgdG8gcHJldmVudCB0aGUgcmFjZSBjb25kaXRpb24gKi8KPiArCXN0cnVjdCBtdXRleCBh ZGNfbG9jazsKPiArCWt0aW1lX3QgbGFzdF9vZmZfdGltZXN0YW1wc1tNVDYzNjBfQ0hBTl9NQVhd Owo+ICt9Owo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfYWRjX3JlYWRfY2hhbm5lbChzdHJ1Y3Qg bXQ2MzYwX2FkY19kYXRhICptYWQsIGludCBjaGFubmVsLCBpbnQgKnZhbCkKPiArewo+ICsJX19i ZTE2IGFkY19lbmFibGU7Cj4gKwl1OCBycHRbM107Cj4gKwlrdGltZV90IHN0YXJ0X3QsIHByZWRp Y3RfZW5kX3Q7Cj4gKwl1bnNpZ25lZCBpbnQgcHJlX3dhaXRfdGltZTsKPiArCWludCByZXQ7Cj4g Kwo+ICsJbXV0ZXhfbG9jaygmbWFkLT5hZGNfbG9jayk7Cj4gKwo+ICsJLyogU2VsZWN0IHRoZSBw cmVmZXJyZWQgQURDIGNoYW5uZWwgKi8KPiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtYWQt PnJlZ21hcCwgTVQ2MzYwX1JFR19QTVVBRENSUFQxLCBNVDYzNjBfUFJFRkVSQ0hfTUFTSywKPiAr CQkJCSBjaGFubmVsIDw8IE1UNjM2MF9QUkVGRVJDSF9TSEZUKTsKPiArCWlmIChyZXQpCj4gKwkJ Z290byBvdXRfYWRjX2xvY2s7Cj4gKwo+ICsJYWRjX2VuYWJsZSA9IGNwdV90b19iZTE2KE1UNjM2 MF9BRENFTl9NQVNLIHwgQklUKGNoYW5uZWwpKTsKPiArCXJldCA9IHJlZ21hcF9yYXdfd3JpdGUo bWFkLT5yZWdtYXAsIE1UNjM2MF9SRUdfUE1VQURDQ0ZHLCAmYWRjX2VuYWJsZSwgc2l6ZW9mKGFk Y19lbmFibGUpKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBvdXRfYWRjX2xvY2s7Cj4gKwo+ICsJ c3RhcnRfdCA9IGt0aW1lX2dldCgpOwo+ICsJcHJlZGljdF9lbmRfdCA9IGt0aW1lX2FkZF9tcyht YWQtPmxhc3Rfb2ZmX3RpbWVzdGFtcHNbY2hhbm5lbF0sIDIgKiBBRENfV0FJVF9USU1FX01TKTsK PiArCj4gKwlpZiAoa3RpbWVfYWZ0ZXIoc3RhcnRfdCwgcHJlZGljdF9lbmRfdCkpCj4gKwkJcHJl X3dhaXRfdGltZSA9IEFEQ19XQUlUX1RJTUVfTVM7Cj4gKwllbHNlCj4gKwkJcHJlX3dhaXRfdGlt ZSA9IDMgKiBBRENfV0FJVF9USU1FX01TOwo+ICsKPiArCW1zbGVlcChwcmVfd2FpdF90aW1lKTsK PiArCj4gKwl3aGlsZSAodHJ1ZSkgewo+ICsJCXJldCA9IHJlZ21hcF9yYXdfcmVhZChtYWQtPnJl Z21hcCwgTVQ2MzYwX1JFR19QTVVBRENSUFQxLCBycHQsIHNpemVvZihycHQpKTsKPiArCQlpZiAo cmV0KQo+ICsJCQlnb3RvIG91dF9hZGNfY29udjsKPiArCj4gKwkJLyoKPiArCQkgKiBUaGVyZSBh cmUgdHdvIGZ1bmN0aW9ucywgWkNWIGFuZCBUeXBlQyBPVFAsIHJ1bm5pbmcgQURDIFZCQVQgYW5k IFRTIGluCj4gKwkJICogYmFja2dyb3VuZCwgYW5kIEFEQyBzYW1wbGVzIGFyZSB0YWtlbiBvbiBh IGZpeGVkIGZyZXF1ZW5jeSBubyBtYXR0ZXIgcmVhZCB0aGUKPiArCQkgKiBwcmV2aW91cyBvbmUg b3Igbm90Lgo+ICsJCSAqIFRvIGF2b2lkIGNvbmZsaWN0LCBXZSBzZXQgbWluaW11bSB0aW1lIHRo cmVzaG9sZCBhZnRlciBlbmFibGUgQURDIGFuZAo+ICsJCSAqIGNoZWNrIHJlcG9ydCBjaGFubmVs IGlzIHRoZSBzYW1lLgo+ICsJCSAqIFRoZSB3b3JzdCBjYXNlIGlzIHJ1biB0aGUgc2FtZSBBREMg dHdpY2UgYW5kIGJhY2tncm91bmQgZnVuY3Rpb24gaXMgYWxzbyBydW5uaW5nLAo+ICsJCSAqIEFE QyBjb252ZXJzaW9uIHNlcXVlbmNlIGlzIGRlc2lyZSBjaGFubmVsIGJlZm9yZSBzdGFydCBBREMs IGJhY2tncm91bmQgQURDLAo+ICsJCSAqIGRlc2lyZSBjaGFubmVsIGFmdGVyIHN0YXJ0IEFEQy4K PiArCQkgKiBTbyB0aGUgbWluaW11bSBjb3JyZWN0IGRhdGEgaXMgdGhyZWUgdGltZXMgb2YgdHlw aWNhbCBjb252ZXJzaW9uIHRpbWUuCj4gKwkJICovCj4gKwkJaWYgKChycHRbMF0gJiBNVDYzNjBf UlBUQ0hfTUFTSykgPT0gY2hhbm5lbCkKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCW1zbGVlcChBRENf V0FJVF9USU1FX01TKTsKPiArCX0KPiArCj4gKwkvKiBycHRbMV06IEFEQ19ISV9CWVRFLCBycHRb Ml06IEFEQ19MT1dfQllURSAqLwo+ICsJKnZhbCA9IHJwdFsxXSA8PCA4IHwgcnB0WzJdOwo+ICsJ cmV0ID0gSUlPX1ZBTF9JTlQ7Cj4gKwo+ICtvdXRfYWRjX2NvbnY6Cj4gKwkvKiBPbmx5IGtlZXAg QURDIGVuYWJsZSAqLwo+ICsJYWRjX2VuYWJsZSA9IGNwdV90b19iZTE2KE1UNjM2MF9BRENFTl9N QVNLKTsKPiArCXJlZ21hcF9yYXdfd3JpdGUobWFkLT5yZWdtYXAsIE1UNjM2MF9SRUdfUE1VQURD Q0ZHLCAmYWRjX2VuYWJsZSwgc2l6ZW9mKGFkY19lbmFibGUpKTsKPiArCW1hZC0+bGFzdF9vZmZf dGltZXN0YW1wc1tjaGFubmVsXSA9IGt0aW1lX2dldCgpOwo+ICsJLyogQ29uZmlnIHByZWZlciBj aGFubmVsIHRvIE5PX1BSRUZFUiAqLwo+ICsJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hZC0+cmVnbWFw LCBNVDYzNjBfUkVHX1BNVUFEQ1JQVDEsIE1UNjM2MF9QUkVGRVJDSF9NQVNLLAo+ICsJCQkgICBN VDYzNjBfTk9fUFJFRkVSIDw8IE1UNjM2MF9QUkVGRVJDSF9TSEZUKTsKPiArb3V0X2FkY19sb2Nr Ogo+ICsJbXV0ZXhfdW5sb2NrKCZtYWQtPmFkY19sb2NrKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9hZGNfcmVhZF9zY2FsZShzdHJ1Y3QgbXQ2MzYw X2FkY19kYXRhICptYWQsIGludCBjaGFubmVsLCBpbnQgKnZhbCwgaW50ICp2YWwyKQo+ICt7Cj4g Kwl1bnNpZ25lZCBpbnQgcmVndmFsOwo+ICsJaW50IHJldDsKPiArCj4gKwlzd2l0Y2ggKGNoYW5u ZWwpIHsKPiArCWNhc2UgTVQ2MzYwX0NIQU5fVVNCSUQ6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX1ZT WVM6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX1ZCQVQ6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX0NIR19W RERQOgo+ICsJY2FzZSBNVDYzNjBfQ0hBTl9WUkVGX1RTOgo+ICsJY2FzZSBNVDYzNjBfQ0hBTl9U UzoKPiArCQkqdmFsID0gMTI1MDsKPiArCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cj4gKwljYXNlIE1U NjM2MF9DSEFOX1ZCVVNESVY1Ogo+ICsJCSp2YWwgPSA2MjUwOwo+ICsJCXJldHVybiBJSU9fVkFM X0lOVDsKPiArCWNhc2UgTVQ2MzYwX0NIQU5fVkJVU0RJVjI6Cj4gKwljYXNlIE1UNjM2MF9DSEFO X0lCVVM6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX0lCQVQ6Cj4gKwkJKnZhbCA9IDI1MDA7Cj4gKwo+ ICsJCWlmIChjaGFubmVsID09IE1UNjM2MF9DSEFOX0lCVVMpIHsKPiArCQkJLyogSUJVUyB3aWxs IGJlIGFmZmVjdGVkIGJ5IGlucHV0IGN1cnJlbnQgbGltaXQgZm9yIHRoZSBkaWZmZXJlbnQgUm9u ICovCj4gKwkJCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbmZpZyBpcyA8NDAwbUEgb3Igbm90ICov Cj4gKwkJCXJldCA9IHJlZ21hcF9yZWFkKG1hZC0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUNIR0NU UkwzLCAmcmVndmFsKTsKPiArCQkJaWYgKHJldCkKPiArCQkJCXJldHVybiByZXQ7Cj4gKwo+ICsJ CQlyZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0FJQ1JfTUFTSykgPj4gTVQ2MzYwX0FJQ1JfU0hG VDsKPiArCQkJaWYgKHJlZ3ZhbCA8IE1UNjM2MF9BSUNSXzQwME1BKQo+ICsJCQkJKnZhbCA9IDE5 MDA7Cj4gKwkJfQo+ICsKPiArCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cj4gKwljYXNlIE1UNjM2MF9D SEFOX1RFTVBfSkM6Cj4gKwkJKnZhbCA9IDEwNTsKPiArCQkqdmFsMiA9IDEwMDsKPiArCQlyZXR1 cm4gSUlPX1ZBTF9GUkFDVElPTkFMOwo+ICsJfQo+ICsKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9hZGNfcmVhZF9vZmZzZXQoc3RydWN0IG10NjM2MF9h ZGNfZGF0YSAqbWFkLCBpbnQgY2hhbm5lbCwgaW50ICp2YWwpCj4gK3sKPiArCSp2YWwgPSAoY2hh bm5lbCA9PSBNVDYzNjBfQ0hBTl9URU1QX0pDKSA/IC04MCA6IDA7Cj4gKwlyZXR1cm4gSUlPX1ZB TF9JTlQ7Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9hZGNfcmVhZF9yYXcoc3Ry dWN0IGlpb19kZXYgKmlpb19kZXYsIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAo+ ICsJCQkgICAgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQo+ICt7Cj4gKwlzdHJ1 Y3QgbXQ2MzYwX2FkY19kYXRhICptYWQgPSBpaW9fcHJpdihpaW9fZGV2KTsKPiArCj4gKwlzd2l0 Y2ggKG1hc2spIHsKPiArCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Cj4gKwkJcmV0dXJuIG10NjM2 MF9hZGNfcmVhZF9jaGFubmVsKG1hZCwgY2hhbi0+Y2hhbm5lbCwgdmFsKTsKPiArCWNhc2UgSUlP X0NIQU5fSU5GT19TQ0FMRToKPiArCQlyZXR1cm4gbXQ2MzYwX2FkY19yZWFkX3NjYWxlKG1hZCwg Y2hhbi0+Y2hhbm5lbCwgdmFsLCB2YWwyKTsKPiArCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6 Cj4gKwkJcmV0dXJuIG10NjM2MF9hZGNfcmVhZF9vZmZzZXQobWFkLCBjaGFuLT5jaGFubmVsLCB2 YWwpOwo+ICsJfQo+ICsKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29u c3QgY2hhciAqbXQ2MzYwX2NoYW5uZWxfbGFiZWxzW01UNjM2MF9DSEFOX01BWF0gPSB7Cj4gKwki dXNiaWQiLCAidmJ1c2RpdjUiLCAidmJ1c2RpdjIiLCAidnN5cyIsICJ2YmF0IiwgImlidXMiLCAi aWJhdCIsICJjaGdfdmRkcCIsICJ0ZW1wX2pjIiwKPiArCSJ2cmVmX3RzIiwgInRzIgo+ICt9Owo+ ICsKPiArc3RhdGljIGludCBtdDYzNjBfYWRjX3JlYWRfbGFiZWwoc3RydWN0IGlpb19kZXYgKmlp b19kZXYsIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAo+ICsJCQkJIGNoYXIgKmxh YmVsKQo+ICt7Cj4gKwlyZXR1cm4gc25wcmludGYobGFiZWwsIFBBR0VfU0laRSwgIiVzXG4iLCBt dDYzNjBfY2hhbm5lbF9sYWJlbHNbY2hhbi0+Y2hhbm5lbF0pOwo+ICt9CgpWZXJ5IG5pY2UuICBU aGUgcGF0Y2ggc2VyaWVzIGFkZGluZyB0aGlzIGNhbGxiYWNrIHdpbGwgaG9wZWZ1bGx5IGJlIGZp bmFsaXplZApzaG9ydGx5LgoKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbXQ2 MzYwX2FkY19paW9faW5mbyA9IHsKPiArCS5yZWFkX3JhdyA9IG10NjM2MF9hZGNfcmVhZF9yYXcs Cj4gKwkucmVhZF9sYWJlbCA9IG10NjM2MF9hZGNfcmVhZF9sYWJlbCwKPiArfTsKPiArCj4gKyNk ZWZpbmUgTVQ2MzYwX0FEQ19DSEFOKF9pZHgsIF90eXBlKSB7CQkJCVwKPiArCS50eXBlID0gX3R5 cGUsCQkJCQkJXAo+ICsJLmNoYW5uZWwgPSBNVDYzNjBfQ0hBTl8jI19pZHgsCQkJCVwKPiArCS5z Y2FuX2luZGV4ID0gTVQ2MzYwX0NIQU5fIyNfaWR4LAkJCVwKPiArCS5kYXRhc2hlZXRfbmFtZSA9 ICNfaWR4LAkJCQlcCj4gKwkuc2Nhbl90eXBlID0gIHsJCQkJCQlcCj4gKwkJLnNpZ24gPSAndScs CQkJCQlcCj4gKwkJLnJlYWxiaXRzID0gMTYsCQkJCQlcCj4gKwkJLnN0b3JhZ2ViaXRzID0gMTYs CQkJCVwKPiArCQkuZW5kaWFubmVzcyA9IElJT19DUFUsCQkJCVwKPiArCX0sCQkJCQkJCVwKPiAr CS5pbmRleGVkID0gMSwJCQkJCQlcCj4gKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19D SEFOX0lORk9fUkFXKSB8CQlcCj4gKwkJCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAlcCj4g KwkJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCj4gK30KPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtdDYzNjBfYWRjX2NoYW5uZWxzW10gPSB7Cj4gKwlNVDYz NjBfQURDX0NIQU4oVVNCSUQsIElJT19WT0xUQUdFKSwKPiArCU1UNjM2MF9BRENfQ0hBTihWQlVT RElWNSwgSUlPX1ZPTFRBR0UpLAo+ICsJTVQ2MzYwX0FEQ19DSEFOKFZCVVNESVYyLCBJSU9fVk9M VEFHRSksCj4gKwlNVDYzNjBfQURDX0NIQU4oVlNZUywgSUlPX1ZPTFRBR0UpLAo+ICsJTVQ2MzYw X0FEQ19DSEFOKFZCQVQsIElJT19WT0xUQUdFKSwKPiArCU1UNjM2MF9BRENfQ0hBTihJQlVTLCBJ SU9fQ1VSUkVOVCksCj4gKwlNVDYzNjBfQURDX0NIQU4oSUJBVCwgSUlPX0NVUlJFTlQpLAo+ICsJ TVQ2MzYwX0FEQ19DSEFOKENIR19WRERQLCBJSU9fVk9MVEFHRSksCj4gKwlNVDYzNjBfQURDX0NI QU4oVEVNUF9KQywgSUlPX1RFTVApLAo+ICsJTVQ2MzYwX0FEQ19DSEFOKFZSRUZfVFMsIElJT19W T0xUQUdFKSwKPiArCU1UNjM2MF9BRENfQ0hBTihUUywgSUlPX1ZPTFRBR0UpLAo+ICsJSUlPX0NI QU5fU09GVF9USU1FU1RBTVAoTVQ2MzYwX0NIQU5fTUFYKSwKPiArfTsKPiArCj4gK3N0YXRpYyBp cnFyZXR1cm5fdCBtdDYzNjBfYWRjX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQo+ ICt7Cj4gKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOwo+ICsJc3RydWN0IGlpb19kZXYg KmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7Cj4gKwlzdHJ1Y3QgbXQ2MzYwX2FkY19kYXRhICpt YWQgPSBpaW9fcHJpdihpbmRpb19kZXYpOwo+ICsJc3RydWN0IHsKPiArCQl1MTYgdmFsdWVzW01U NjM2MF9DSEFOX01BWF07Cj4gKwkJaW50NjRfdCB0aW1lc3RhbXA7Cj4gKwl9IGRhdGEgX19hbGln bmVkKDgpID0gezB9OwoKSSBkb24ndCB0aGluayB0aGF0IGlzIHN1ZmZpY2llbnQgdG8gZm9yY2Ug dGhlIGdhcCB0byBiZSBzZXQgdG8gMC4KVGhlIGM5OSBzcGVjIHNheXMgaW4gNi43LjguMjEKIklm IHRoZXJlIGFyZSBmZXdlciBpbml0aWFsaXplcnMgaW4gYSBicmFjZS1lbmNsb3NlZCBsaXN0IHRo YW4gdGhlcmUgYXJlIGVsZW1lbnRzIG9yIG1lbWJlcnMKb2YgYW4gYWdncmVnYXRlLCBvciBmZXdl ciBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nIGxpdGVyYWwgdXNlZCB0byBpbml0aWFsaXplIGFuIGFy cmF5IG9mIGtub3duCnNpemUgdGhhbiB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB0 aGUgcmVtYWluZGVyIG9mIHRoZSBhZ2dyZWdhdGUgc2hhbGwgYmUKaW5pdGlhbGl6ZWQgaW1wbGlj aXRseSB0aGUgc2FtZSBhcyBvYmplY3RzIHRoYXQgaGF2ZSBzdGF0aWMgc3RvcmFnZSBkdXJhdGlv bi4iCgpUaGUgc3RhdGljIGNhc2UgaXMgY292ZXJlZCBieSA2LjcuOC4xMAoiSWYgYW4gb2JqZWN0 IHRoYXQgaGFzIGF1dG9tYXRpYyBzdG9yYWdlIGR1cmF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCBl eHBsaWNpdGx5LCBpdHMgdmFsdWUgaXMKaW5kZXRlcm1pbmF0ZS4gSWYgYW4gb2JqZWN0IHRoYXQg aGFzIHN0YXRpYyBzdG9yYWdlIGR1cmF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCBleHBsaWNpdGx5 LAp0aGVuOgrigJQgaWYgaXQgaGFzIHBvaW50ZXIgdHlwZSwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8g YSBudWxsIHBvaW50ZXI7CuKAlCBpZiBpdCBoYXMgYXJpdGhtZXRpYyB0eXBlLCBpdCBpcyBpbml0 aWFsaXplZCB0byAocG9zaXRpdmUgb3IgdW5zaWduZWQpIHplcm87CuKAlCBpZiBpdCBpcyBhbiBh Z2dyZWdhdGUsIGV2ZXJ5IG1lbWJlciBpcyBpbml0aWFsaXplZCAocmVjdXJzaXZlbHkpIGFjY29y ZGluZyB0byB0aGVzZSBydWxlczsK4oCUIGlmIGl0IGlzYXVuaW9uLCB0aGUgZmlyc3QgbmFtZWQg bWVtYmVyIGlzIGluaXRpYWxpemVkIChyZWN1cnNpdmVseSkgYWNjb3JkaW5nIHRvIHRoZXNlCiAg cnVsZXMKIgpTdHJ1Y3R1cmUgaXMgYW4gYWdncmVnYXRlLHMgZXZlcnkgbWVtYmVyIGlzIGluaXRp YWxpemVkLiAgVW5mb3J0dW5hdGVseSB0aGF0IGRvZXNuJ3QKaGF2ZSBhbnkgaW1wYWN0IG9uIGdh cHMuICBTbyBpdCAnbWlnaHQnIHplcm8gaXQsIGJ1dCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcy4K CkFzIHN1Y2gsIEkgdGhpbmsgeW91IG5lZWQgdG8gdXNlIG1lbXNldCB3aGljaCB3aWxsIGp1c3Qg ZmlsbCB0aGUgbWVtb3J5IHdpdGggemVyb3MKd2l0aG91dCBjYXJpbmcgYWJvdXQgdGhlIHN0cnVj dHVyZS4KT3IgY2hlZWt5IHJvdXRlIGlzIHRvIGFkZCBlbGVtZW50cyB0byBmaWxsIHRoZSBnYXAg YW5kIGp1c3QgY2FsbCB0aGVtIHBhZFtdIG9yIHNpbWlsYXIuCgoKPiArCWludCBpID0gMCwgYml0 LCB2YWwsIHJldDsKPiArCj4gKwo+ICsJZm9yX2VhY2hfc2V0X2JpdChiaXQsIGluZGlvX2Rldi0+ YWN0aXZlX3NjYW5fbWFzaywgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7Cj4gKwkJcmV0ID0gbXQ2 MzYwX2FkY19yZWFkX2NoYW5uZWwobWFkLCBiaXQsICZ2YWwpOwo+ICsJCWlmIChyZXQgPCAwKSB7 Cj4gKwkJCWRldl93YXJuKCZpbmRpb19kZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCAl ZCBjb252ZXJzaW9uIHZhbFxuIiwgYml0KTsKPiArCQkJZ290byBvdXQ7Cj4gKwkJfQo+ICsKPiAr CQlkYXRhLnZhbHVlc1tpKytdID0gdmFsOwo+ICsJfQo+ICsJaWlvX3B1c2hfdG9fYnVmZmVyc193 aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsICZkYXRhLCBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2 KSk7Cj4gK291dDoKPiArCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7 Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGlu dCBtdDYzNjBfYWRjX3Jlc2V0KHN0cnVjdCBtdDYzNjBfYWRjX2RhdGEgKmluZm8pCj4gK3sKPiAr CV9fYmUxNiBhZGNfZW5hYmxlOwo+ICsJa3RpbWVfdCBhbGxfb2ZmX3RpbWU7Cj4gKwlpbnQgaSwg cmV0Owo+ICsKPiArCS8qIENsZWFyIEFEQyBpZGxlIHdhaXQgdGltZSB0byAwICovCj4gKwlyZXQg PSByZWdtYXBfd3JpdGUoaW5mby0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUFEQ0lETEVULCAwKTsK PiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBPbmx5IGtlZXAgQURDIGVu YWJsZSwgYnV0IGtlZXAgYWxsIGNoYW5uZWxzIG9mZiAqLwo+ICsJYWRjX2VuYWJsZSA9IGNwdV90 b19iZTE2KE1UNjM2MF9BRENFTl9NQVNLKTsKPiArCXJldCA9IHJlZ21hcF9yYXdfd3JpdGUoaW5m by0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUFEQ0NGRywgKHZvaWQgKikmYWRjX2VuYWJsZSwKV2h5 IGFyZSB3ZSBjYXN0aW5nIHRvIGEgdm9pZCAqPyBUaGF0IHNob3VsZG4ndCBiZSBuZWNlc3Nhcnku IEFtIEkgbWlzc2luZyBzb21ldGhpbmc/Cgo+ICsJCQkgICAgICAgc2l6ZW9mKF9fYmUxNikpOwoK U2xpZ2h0IHByZWZlcmVuY2UgZm9yIHNpemVvZihhZGNfZW5hYmxlKSBhcyB0aGVuIEkgZG9uJ3Qg aGF2ZSB0byBzYW5pdHkgY2hlY2tpdAppcyB0aGUgcmlnaHQgdHlwZSB3aGlsc3QgcmV2aWV3aW5n LgoKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBSZXNldCBhbGwgY2hh bm5lbCBvZmYgdGltZSB0byB0aGUgY3VycmVudCBvbmUgKi8KPiArCWFsbF9vZmZfdGltZSA9IGt0 aW1lX2dldCgpOwo+ICsJZm9yIChpID0gMDsgaSA8IE1UNjM2MF9DSEFOX01BWDsgaSsrKQo+ICsJ CWluZm8tPmxhc3Rfb2ZmX3RpbWVzdGFtcHNbaV0gPSBhbGxfb2ZmX3RpbWU7Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FkY19wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgbXQ2MzYwX2FkY19kYXRhICptYWQ7 Cj4gKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Cj4gKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2 Owo+ICsJaW50IHJldDsKPiArCj4gKwlyZWdtYXAgPSBkZXZfZ2V0X3JlZ21hcChwZGV2LT5kZXYu cGFyZW50LCBOVUxMKTsKPiArCWlmICghcmVnbWFwKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiRmFpbGVkIHRvIGdldCBwYXJlbnQgcmVnbWFwXG4iKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsK PiArCX0KPiArCj4gKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnBkZXYtPmRl diwgc2l6ZW9mKCptYWQpKTsKPiArCWlmICghaW5kaW9fZGV2KQo+ICsJCXJldHVybiAtRU5PTUVN Owo+ICsKPiArCW1hZCA9IGlpb19wcml2KGluZGlvX2Rldik7Cj4gKwltYWQtPmRldiA9ICZwZGV2 LT5kZXY7Cj4gKwltYWQtPnJlZ21hcCA9IHJlZ21hcDsKPiArCW11dGV4X2luaXQoJm1hZC0+YWRj X2xvY2spOwo+ICsKPiArCXJldCA9IG10NjM2MF9hZGNfcmVzZXQobWFkKTsKPiArCWlmIChyZXQg PCAwKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGFkY1xuIik7 Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFt ZSgmcGRldi0+ZGV2KTsKPiArCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Cj4g KwlpbmRpb19kZXYtPmluZm8gPSAmbXQ2MzYwX2FkY19paW9faW5mbzsKPiArCWluZGlvX2Rldi0+ bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKPiArCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtdDYz NjBfYWRjX2NoYW5uZWxzOwo+ICsJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpF KG10NjM2MF9hZGNfY2hhbm5lbHMpOwo+ICsKPiArCXJldCA9IGRldm1faWlvX3RyaWdnZXJlZF9i dWZmZXJfc2V0dXAoJnBkZXYtPmRldiwgaW5kaW9fZGV2LCBOVUxMLAo+ICsJCQkJCSAgICAgIG10 NjM2MF9hZGNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZf ZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaWlvIHRyaWdnZXIgYnVmZmVyXG4i KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVybiBkZXZtX2lpb19kZXZpY2Vf cmVnaXN0ZXIoJnBkZXYtPmRldiwgaW5kaW9fZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBvZl9kZXZpY2VfaWQgX19tYXliZV91bnVzZWQgbXQ2MzYwX2FkY19vZl9pZFtdID0g ewo+ICsJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzNjAtYWRjIiwgfSwKPiArCXt9Cj4g K307Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10NjM2MF9hZGNfb2ZfaWQpOwo+ICsKPiAr c3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXQ2MzYwX2FkY19kcml2ZXIgPSB7Cj4gKwku ZHJpdmVyID0gewo+ICsJCS5uYW1lID0gIm10NjM2MC1hZGMiLAo+ICsJCS5vZl9tYXRjaF90YWJs ZSA9IG10NjM2MF9hZGNfb2ZfaWQsCj4gKwl9LAo+ICsJLnByb2JlID0gbXQ2MzYwX2FkY19wcm9i ZSwKPiArfTsKPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdDYzNjBfYWRjX2RyaXZlcik7Cj4g Kwo+ICtNT0RVTEVfQVVUSE9SKCJHZW5lIENoZW4gPGdlbmVfY2hlbkByaWNodGVrLmNvbT4iKTsK PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJNVDYzNjAgQURDIERyaXZlciIpOwo+ICtNT0RVTEVfTElD RU5TRSgiR1BMIHYyIik7CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KTGludXgtbWVkaWF0ZWsgbWFpbGluZyBsaXN0CkxpbnV4LW1lZGlhdGVrQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1tZWRpYXRlawo= 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=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=unavailable 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 4236DC4363D for ; Fri, 25 Sep 2020 12:30:35 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 CF65821D7A for ; Fri, 25 Sep 2020 12:30:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="py7C0/C8"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y1oS3ulu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CF65821D7A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID: Subject: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=YZ1FalnBPhTzjDgbsp3V3jm8F9VlEkKnI9sCS491was=; b=py7C0/C8wKwdiSNlaZB3YQM3m 94yRnO2du381BujqQg99K2a+RfyArUYcr8ZXrU6DSR42xGPo6S+adCPsT0BuvYvjPqF9y3ifgpc8z 5x1+5rETbiwUfIPDsapHBKznouhmJzmct2mQ6KvLXmLpcnQxij3wmr1szW596AseP001LTOFPfxCj SQWMVRDwZXPAe+4oHKqYK8oNdiqGh+Q4XqoSDELo6kyoDAhEBb/1GGtHlHNaWwIuAuQ69v2vxBWms CEKM/21alFAjfS5Kn9lrxHwkqE0+8SKYdrxAIupH+rghvEWnARoI2hMkpXyXbML5G3wtxWnz3B+P3 lvBgVZIXg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLmqJ-0007wf-Bk; Fri, 25 Sep 2020 12:28:51 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLmqG-0007w7-7D; Fri, 25 Sep 2020 12:28:49 +0000 Received: from archlinux (cpc149474-cmbg20-2-0-cust94.5-4.cable.virginm.net [82.4.196.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 33ED721D7A; Fri, 25 Sep 2020 12:28:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1601036927; bh=oAGOSMRMsQU8yJoQm1DZP2F8qfoZz3uwgR4UJ81S1UI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Y1oS3uluNIPh0wJdYOGx7Y2K/UPH/uoFuFKGe9MzXO0oOJ/i2Kx9Ko5cku91pKDbT Zaz5EvHR+ewNrOL9+W9vUGQToQW8taKgUu88IXiEwoblGlD6d2KfLsI4rXa26V2oVH uP2GCoWcyutLPqTVKGay1AyuOdqZkB98Fu7SgK78= Date: Fri, 25 Sep 2020 13:28:40 +0100 From: Jonathan Cameron To: Gene Chen Subject: Re: [PATCH v5 3/3] iio: adc: mt6360: Add ADC driver for MT6360 Message-ID: <20200925132840.513bf214@archlinux> In-Reply-To: <1600687442-23658-4-git-send-email-gene.chen.richtek@gmail.com> References: <1600687442-23658-1-git-send-email-gene.chen.richtek@gmail.com> <1600687442-23658-4-git-send-email-gene.chen.richtek@gmail.com> X-Mailer: Claws Mail 3.17.6 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200925_082848_409432_8BC387D8 X-CRM114-Status: GOOD ( 42.47 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gene_chen@richtek.com, devicetree@vger.kernel.org, lars@metafoo.de, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, cy_huang@richtek.com, benjamin.chao@mediatek.com, robh+dt@kernel.org, linux-mediatek@lists.infradead.org, pmeerw@pmeerw.net, knaack.h@gmx.de, matthias.bgg@gmail.com, Wilma.Wu@mediatek.com, linux-arm-kernel@lists.infradead.org, shufan_lee@richtek.com 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 T24gTW9uLCAyMSBTZXAgMjAyMCAxOToyNDowMiArMDgwMApHZW5lIENoZW4gPGdlbmUuY2hlbi5y aWNodGVrQGdtYWlsLmNvbT4gd3JvdGU6Cgo+IEZyb206IEdlbmUgQ2hlbiA8Z2VuZV9jaGVuQHJp Y2h0ZWsuY29tPgo+IAo+IEFkZCBNVDYzNjAgQURDIGRyaXZlciBpbmNsdWRlIENoYXJnZXIgQ3Vy cmVudCwgVm9sdGFnZSwgYW5kCj4gVGVtcGVyYXR1cmUuCj4gCj4gU2lnbmVkLW9mZi1ieTogR2Vu ZSBDaGVuIDxnZW5lX2NoZW5AcmljaHRlay5jb20+CgpIaSBHZW5lLAoKQSBmZXcgdGhpbmdzIGlu bGluZSB0aGF0IG5lZWQgZml4aW5nIG9yIHRpZHlpbmcgdXAuCgpMb29raW5nIGdvb2Qgb3RoZXJ3 aXNlLgoKSm9uYXRoYW4KPiAtLS0KPiAgZHJpdmVycy9paW8vYWRjL0tjb25maWcgICAgICB8ICAx MSArKwo+ICBkcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUgICAgIHwgICAxICsKPiAgZHJpdmVycy9p aW8vYWRjL210NjM2MC1hZGMuYyB8IDM2MyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMzc1IGluc2VydGlvbnMoKykKPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMKPiAKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwo+ IGluZGV4IGQ5NGRjODAuLmExMzVhZGEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9paW8vYWRjL0tj b25maWcKPiArKysgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwo+IEBAIC03MDMsNiArNzAzLDE3 IEBAIGNvbmZpZyBNQ1AzOTExCj4gIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFz IGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCj4gIAkgIGNhbGxlZCBtY3AzOTEx Lgo+ICAKPiArY29uZmlnIE1FRElBVEVLX01UNjM2MF9BREMKPiArCXRyaXN0YXRlICJNZWRpYXRl ayBNVDYzNjAgQURDIGRyaXZlciIKPiArCWRlcGVuZHMgb24gTUZEX01UNjM2MAo+ICsJc2VsZWN0 IElJT19CVUZGRVIKPiArCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgo+ICsJaGVscAo+ICsJ ICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNVDYzNjAgQURDIHN1cHBvcnQuCj4gKwkgIEludGVncmF0 ZWQgZm9yIFN5c3RlbSBNb25pdG9yaW5nIGluY2x1ZGVzCj4gKwkgIGlzIHVzZWQgaW4gc21hcnRw aG9uZXMgYW5kIHRhYmxldHMgYW5kIHN1cHBvcnRzIGEgMTEgY2hhbm5lbAo+ICsJICBnZW5lcmFs IHB1cnBvc2UgQURDLgo+ICsKPiAgY29uZmlnIE1FRElBVEVLX01UNjU3N19BVVhBREMKPiAgCXRy aXN0YXRlICJNZWRpYVRlayBBVVhBREMgZHJpdmVyIgo+ICAJZGVwZW5kcyBvbiBBUkNIX01FRElB VEVLIHx8IENPTVBJTEVfVEVTVAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZp bGUgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKPiBpbmRleCA5MGY5NGFkLi41ZmNhOTBhIDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvaWlv L2FkYy9NYWtlZmlsZQo+IEBAIC02NSw2ICs2NSw3IEBAIG9iai0kKENPTkZJR19NQVg5NjExKSAr PSBtYXg5NjExLm8KPiAgb2JqLSQoQ09ORklHX01DUDMyMFgpICs9IG1jcDMyMHgubwo+ICBvYmot JChDT05GSUdfTUNQMzQyMikgKz0gbWNwMzQyMi5vCj4gIG9iai0kKENPTkZJR19NQ1AzOTExKSAr PSBtY3AzOTExLm8KPiArb2JqLSQoQ09ORklHX01FRElBVEVLX01UNjM2MF9BREMpICs9IG10NjM2 MC1hZGMubwo+ICBvYmotJChDT05GSUdfTUVESUFURUtfTVQ2NTc3X0FVWEFEQykgKz0gbXQ2NTc3 X2F1eGFkYy5vCj4gIG9iai0kKENPTkZJR19NRU5fWjE4OF9BREMpICs9IG1lbl96MTg4X2FkYy5v Cj4gIG9iai0kKENPTkZJR19NRVNPTl9TQVJBREMpICs9IG1lc29uX3NhcmFkYy5vCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvbXQ2 MzYwLWFkYy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5hMWEwMWU1 Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9tdDYzNjAtYWRjLmMKPiBA QCAtMCwwICsxLDM2MyBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ ICsKPiArI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4K PiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgva3RpbWUuaD4K PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4K PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgv cmVnbWFwLmg+Cj4gKwo+ICsjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgo+ICsjaW5jbHVk ZSA8bGludXgvaWlvL2lpby5oPgo+ICsjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3Vt ZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+Cj4gKwo+ICsj ZGVmaW5lIE1UNjM2MF9SRUdfUE1VQ0hHQ1RSTDMJMHgzMTMKPiArI2RlZmluZSBNVDYzNjBfUkVH X1BNVUFEQ0NGRwkweDM1Ngo+ICsjZGVmaW5lIE1UNjM2MF9SRUdfUE1VQURDSURMRVQJMHgzNTgK PiArI2RlZmluZSBNVDYzNjBfUkVHX1BNVUFEQ1JQVDEJMHgzNUEKPiArCj4gKy8qIFBNVUNIR0NU UkwzIDB4MzEzICovCj4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFTSwlHRU5NQVNLKDcsIDIpCj4g KyNkZWZpbmUgTVQ2MzYwX0FJQ1JfU0hGVAkyCj4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfNDAwTUEJ MHg2Cj4gKy8qIFBNVUFEQ0NGRyAweDM1NiAqLwo+ICsjZGVmaW5lIE1UNjM2MF9BRENFTl9NQVNL CTB4ODAwMAo+ICsvKiBQTVVBRENSUFQxIDB4MzVBICovCj4gKyNkZWZpbmUgTVQ2MzYwX1BSRUZF UkNIX01BU0sJR0VOTUFTSyg3LCA0KQo+ICsjZGVmaW5lIE1UNjM2MF9QUkVGRVJDSF9TSEZUCTQK PiArI2RlZmluZSBNVDYzNjBfUlBUQ0hfTUFTSwlHRU5NQVNLKDMsIDApCj4gKyNkZWZpbmUgTVQ2 MzYwX05PX1BSRUZFUgkxNQo+ICsKPiArLyogVGltZSBpbiBtcyAqLwo+ICsjZGVmaW5lIEFEQ19X QUlUX1RJTUVfTVMJMjUKPiArCj4gK2VudW0gewo+ICsJTVQ2MzYwX0NIQU5fVVNCSUQgPSAwLAo+ ICsJTVQ2MzYwX0NIQU5fVkJVU0RJVjUsCj4gKwlNVDYzNjBfQ0hBTl9WQlVTRElWMiwKPiArCU1U NjM2MF9DSEFOX1ZTWVMsCj4gKwlNVDYzNjBfQ0hBTl9WQkFULAo+ICsJTVQ2MzYwX0NIQU5fSUJV UywKPiArCU1UNjM2MF9DSEFOX0lCQVQsCj4gKwlNVDYzNjBfQ0hBTl9DSEdfVkREUCwKPiArCU1U NjM2MF9DSEFOX1RFTVBfSkMsCj4gKwlNVDYzNjBfQ0hBTl9WUkVGX1RTLAo+ICsJTVQ2MzYwX0NI QU5fVFMsCj4gKwlNVDYzNjBfQ0hBTl9NQVgKPiArfTsKPiArCj4gK3N0cnVjdCBtdDYzNjBfYWRj X2RhdGEgewo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ICsJc3RydWN0IHJlZ21hcCAqcmVnbWFw Owo+ICsJLyogRHVlIHRvIG9ubHkgb25lIHNldCBvZiBBREMgY29udHJvbCwgdGhpcyBsb2NrIGlz IHVzZWQgdG8gcHJldmVudCB0aGUgcmFjZSBjb25kaXRpb24gKi8KPiArCXN0cnVjdCBtdXRleCBh ZGNfbG9jazsKPiArCWt0aW1lX3QgbGFzdF9vZmZfdGltZXN0YW1wc1tNVDYzNjBfQ0hBTl9NQVhd Owo+ICt9Owo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfYWRjX3JlYWRfY2hhbm5lbChzdHJ1Y3Qg bXQ2MzYwX2FkY19kYXRhICptYWQsIGludCBjaGFubmVsLCBpbnQgKnZhbCkKPiArewo+ICsJX19i ZTE2IGFkY19lbmFibGU7Cj4gKwl1OCBycHRbM107Cj4gKwlrdGltZV90IHN0YXJ0X3QsIHByZWRp Y3RfZW5kX3Q7Cj4gKwl1bnNpZ25lZCBpbnQgcHJlX3dhaXRfdGltZTsKPiArCWludCByZXQ7Cj4g Kwo+ICsJbXV0ZXhfbG9jaygmbWFkLT5hZGNfbG9jayk7Cj4gKwo+ICsJLyogU2VsZWN0IHRoZSBw cmVmZXJyZWQgQURDIGNoYW5uZWwgKi8KPiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtYWQt PnJlZ21hcCwgTVQ2MzYwX1JFR19QTVVBRENSUFQxLCBNVDYzNjBfUFJFRkVSQ0hfTUFTSywKPiAr CQkJCSBjaGFubmVsIDw8IE1UNjM2MF9QUkVGRVJDSF9TSEZUKTsKPiArCWlmIChyZXQpCj4gKwkJ Z290byBvdXRfYWRjX2xvY2s7Cj4gKwo+ICsJYWRjX2VuYWJsZSA9IGNwdV90b19iZTE2KE1UNjM2 MF9BRENFTl9NQVNLIHwgQklUKGNoYW5uZWwpKTsKPiArCXJldCA9IHJlZ21hcF9yYXdfd3JpdGUo bWFkLT5yZWdtYXAsIE1UNjM2MF9SRUdfUE1VQURDQ0ZHLCAmYWRjX2VuYWJsZSwgc2l6ZW9mKGFk Y19lbmFibGUpKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBvdXRfYWRjX2xvY2s7Cj4gKwo+ICsJ c3RhcnRfdCA9IGt0aW1lX2dldCgpOwo+ICsJcHJlZGljdF9lbmRfdCA9IGt0aW1lX2FkZF9tcyht YWQtPmxhc3Rfb2ZmX3RpbWVzdGFtcHNbY2hhbm5lbF0sIDIgKiBBRENfV0FJVF9USU1FX01TKTsK PiArCj4gKwlpZiAoa3RpbWVfYWZ0ZXIoc3RhcnRfdCwgcHJlZGljdF9lbmRfdCkpCj4gKwkJcHJl X3dhaXRfdGltZSA9IEFEQ19XQUlUX1RJTUVfTVM7Cj4gKwllbHNlCj4gKwkJcHJlX3dhaXRfdGlt ZSA9IDMgKiBBRENfV0FJVF9USU1FX01TOwo+ICsKPiArCW1zbGVlcChwcmVfd2FpdF90aW1lKTsK PiArCj4gKwl3aGlsZSAodHJ1ZSkgewo+ICsJCXJldCA9IHJlZ21hcF9yYXdfcmVhZChtYWQtPnJl Z21hcCwgTVQ2MzYwX1JFR19QTVVBRENSUFQxLCBycHQsIHNpemVvZihycHQpKTsKPiArCQlpZiAo cmV0KQo+ICsJCQlnb3RvIG91dF9hZGNfY29udjsKPiArCj4gKwkJLyoKPiArCQkgKiBUaGVyZSBh cmUgdHdvIGZ1bmN0aW9ucywgWkNWIGFuZCBUeXBlQyBPVFAsIHJ1bm5pbmcgQURDIFZCQVQgYW5k IFRTIGluCj4gKwkJICogYmFja2dyb3VuZCwgYW5kIEFEQyBzYW1wbGVzIGFyZSB0YWtlbiBvbiBh IGZpeGVkIGZyZXF1ZW5jeSBubyBtYXR0ZXIgcmVhZCB0aGUKPiArCQkgKiBwcmV2aW91cyBvbmUg b3Igbm90Lgo+ICsJCSAqIFRvIGF2b2lkIGNvbmZsaWN0LCBXZSBzZXQgbWluaW11bSB0aW1lIHRo cmVzaG9sZCBhZnRlciBlbmFibGUgQURDIGFuZAo+ICsJCSAqIGNoZWNrIHJlcG9ydCBjaGFubmVs IGlzIHRoZSBzYW1lLgo+ICsJCSAqIFRoZSB3b3JzdCBjYXNlIGlzIHJ1biB0aGUgc2FtZSBBREMg dHdpY2UgYW5kIGJhY2tncm91bmQgZnVuY3Rpb24gaXMgYWxzbyBydW5uaW5nLAo+ICsJCSAqIEFE QyBjb252ZXJzaW9uIHNlcXVlbmNlIGlzIGRlc2lyZSBjaGFubmVsIGJlZm9yZSBzdGFydCBBREMs IGJhY2tncm91bmQgQURDLAo+ICsJCSAqIGRlc2lyZSBjaGFubmVsIGFmdGVyIHN0YXJ0IEFEQy4K PiArCQkgKiBTbyB0aGUgbWluaW11bSBjb3JyZWN0IGRhdGEgaXMgdGhyZWUgdGltZXMgb2YgdHlw aWNhbCBjb252ZXJzaW9uIHRpbWUuCj4gKwkJICovCj4gKwkJaWYgKChycHRbMF0gJiBNVDYzNjBf UlBUQ0hfTUFTSykgPT0gY2hhbm5lbCkKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCW1zbGVlcChBRENf V0FJVF9USU1FX01TKTsKPiArCX0KPiArCj4gKwkvKiBycHRbMV06IEFEQ19ISV9CWVRFLCBycHRb Ml06IEFEQ19MT1dfQllURSAqLwo+ICsJKnZhbCA9IHJwdFsxXSA8PCA4IHwgcnB0WzJdOwo+ICsJ cmV0ID0gSUlPX1ZBTF9JTlQ7Cj4gKwo+ICtvdXRfYWRjX2NvbnY6Cj4gKwkvKiBPbmx5IGtlZXAg QURDIGVuYWJsZSAqLwo+ICsJYWRjX2VuYWJsZSA9IGNwdV90b19iZTE2KE1UNjM2MF9BRENFTl9N QVNLKTsKPiArCXJlZ21hcF9yYXdfd3JpdGUobWFkLT5yZWdtYXAsIE1UNjM2MF9SRUdfUE1VQURD Q0ZHLCAmYWRjX2VuYWJsZSwgc2l6ZW9mKGFkY19lbmFibGUpKTsKPiArCW1hZC0+bGFzdF9vZmZf dGltZXN0YW1wc1tjaGFubmVsXSA9IGt0aW1lX2dldCgpOwo+ICsJLyogQ29uZmlnIHByZWZlciBj aGFubmVsIHRvIE5PX1BSRUZFUiAqLwo+ICsJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hZC0+cmVnbWFw LCBNVDYzNjBfUkVHX1BNVUFEQ1JQVDEsIE1UNjM2MF9QUkVGRVJDSF9NQVNLLAo+ICsJCQkgICBN VDYzNjBfTk9fUFJFRkVSIDw8IE1UNjM2MF9QUkVGRVJDSF9TSEZUKTsKPiArb3V0X2FkY19sb2Nr Ogo+ICsJbXV0ZXhfdW5sb2NrKCZtYWQtPmFkY19sb2NrKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9hZGNfcmVhZF9zY2FsZShzdHJ1Y3QgbXQ2MzYw X2FkY19kYXRhICptYWQsIGludCBjaGFubmVsLCBpbnQgKnZhbCwgaW50ICp2YWwyKQo+ICt7Cj4g Kwl1bnNpZ25lZCBpbnQgcmVndmFsOwo+ICsJaW50IHJldDsKPiArCj4gKwlzd2l0Y2ggKGNoYW5u ZWwpIHsKPiArCWNhc2UgTVQ2MzYwX0NIQU5fVVNCSUQ6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX1ZT WVM6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX1ZCQVQ6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX0NIR19W RERQOgo+ICsJY2FzZSBNVDYzNjBfQ0hBTl9WUkVGX1RTOgo+ICsJY2FzZSBNVDYzNjBfQ0hBTl9U UzoKPiArCQkqdmFsID0gMTI1MDsKPiArCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cj4gKwljYXNlIE1U NjM2MF9DSEFOX1ZCVVNESVY1Ogo+ICsJCSp2YWwgPSA2MjUwOwo+ICsJCXJldHVybiBJSU9fVkFM X0lOVDsKPiArCWNhc2UgTVQ2MzYwX0NIQU5fVkJVU0RJVjI6Cj4gKwljYXNlIE1UNjM2MF9DSEFO X0lCVVM6Cj4gKwljYXNlIE1UNjM2MF9DSEFOX0lCQVQ6Cj4gKwkJKnZhbCA9IDI1MDA7Cj4gKwo+ ICsJCWlmIChjaGFubmVsID09IE1UNjM2MF9DSEFOX0lCVVMpIHsKPiArCQkJLyogSUJVUyB3aWxs IGJlIGFmZmVjdGVkIGJ5IGlucHV0IGN1cnJlbnQgbGltaXQgZm9yIHRoZSBkaWZmZXJlbnQgUm9u ICovCj4gKwkJCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbmZpZyBpcyA8NDAwbUEgb3Igbm90ICov Cj4gKwkJCXJldCA9IHJlZ21hcF9yZWFkKG1hZC0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUNIR0NU UkwzLCAmcmVndmFsKTsKPiArCQkJaWYgKHJldCkKPiArCQkJCXJldHVybiByZXQ7Cj4gKwo+ICsJ CQlyZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0FJQ1JfTUFTSykgPj4gTVQ2MzYwX0FJQ1JfU0hG VDsKPiArCQkJaWYgKHJlZ3ZhbCA8IE1UNjM2MF9BSUNSXzQwME1BKQo+ICsJCQkJKnZhbCA9IDE5 MDA7Cj4gKwkJfQo+ICsKPiArCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cj4gKwljYXNlIE1UNjM2MF9D SEFOX1RFTVBfSkM6Cj4gKwkJKnZhbCA9IDEwNTsKPiArCQkqdmFsMiA9IDEwMDsKPiArCQlyZXR1 cm4gSUlPX1ZBTF9GUkFDVElPTkFMOwo+ICsJfQo+ICsKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9hZGNfcmVhZF9vZmZzZXQoc3RydWN0IG10NjM2MF9h ZGNfZGF0YSAqbWFkLCBpbnQgY2hhbm5lbCwgaW50ICp2YWwpCj4gK3sKPiArCSp2YWwgPSAoY2hh bm5lbCA9PSBNVDYzNjBfQ0hBTl9URU1QX0pDKSA/IC04MCA6IDA7Cj4gKwlyZXR1cm4gSUlPX1ZB TF9JTlQ7Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9hZGNfcmVhZF9yYXcoc3Ry dWN0IGlpb19kZXYgKmlpb19kZXYsIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAo+ ICsJCQkgICAgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQo+ICt7Cj4gKwlzdHJ1 Y3QgbXQ2MzYwX2FkY19kYXRhICptYWQgPSBpaW9fcHJpdihpaW9fZGV2KTsKPiArCj4gKwlzd2l0 Y2ggKG1hc2spIHsKPiArCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Cj4gKwkJcmV0dXJuIG10NjM2 MF9hZGNfcmVhZF9jaGFubmVsKG1hZCwgY2hhbi0+Y2hhbm5lbCwgdmFsKTsKPiArCWNhc2UgSUlP X0NIQU5fSU5GT19TQ0FMRToKPiArCQlyZXR1cm4gbXQ2MzYwX2FkY19yZWFkX3NjYWxlKG1hZCwg Y2hhbi0+Y2hhbm5lbCwgdmFsLCB2YWwyKTsKPiArCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6 Cj4gKwkJcmV0dXJuIG10NjM2MF9hZGNfcmVhZF9vZmZzZXQobWFkLCBjaGFuLT5jaGFubmVsLCB2 YWwpOwo+ICsJfQo+ICsKPiArCXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29u c3QgY2hhciAqbXQ2MzYwX2NoYW5uZWxfbGFiZWxzW01UNjM2MF9DSEFOX01BWF0gPSB7Cj4gKwki dXNiaWQiLCAidmJ1c2RpdjUiLCAidmJ1c2RpdjIiLCAidnN5cyIsICJ2YmF0IiwgImlidXMiLCAi aWJhdCIsICJjaGdfdmRkcCIsICJ0ZW1wX2pjIiwKPiArCSJ2cmVmX3RzIiwgInRzIgo+ICt9Owo+ ICsKPiArc3RhdGljIGludCBtdDYzNjBfYWRjX3JlYWRfbGFiZWwoc3RydWN0IGlpb19kZXYgKmlp b19kZXYsIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAo+ICsJCQkJIGNoYXIgKmxh YmVsKQo+ICt7Cj4gKwlyZXR1cm4gc25wcmludGYobGFiZWwsIFBBR0VfU0laRSwgIiVzXG4iLCBt dDYzNjBfY2hhbm5lbF9sYWJlbHNbY2hhbi0+Y2hhbm5lbF0pOwo+ICt9CgpWZXJ5IG5pY2UuICBU aGUgcGF0Y2ggc2VyaWVzIGFkZGluZyB0aGlzIGNhbGxiYWNrIHdpbGwgaG9wZWZ1bGx5IGJlIGZp bmFsaXplZApzaG9ydGx5LgoKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbXQ2 MzYwX2FkY19paW9faW5mbyA9IHsKPiArCS5yZWFkX3JhdyA9IG10NjM2MF9hZGNfcmVhZF9yYXcs Cj4gKwkucmVhZF9sYWJlbCA9IG10NjM2MF9hZGNfcmVhZF9sYWJlbCwKPiArfTsKPiArCj4gKyNk ZWZpbmUgTVQ2MzYwX0FEQ19DSEFOKF9pZHgsIF90eXBlKSB7CQkJCVwKPiArCS50eXBlID0gX3R5 cGUsCQkJCQkJXAo+ICsJLmNoYW5uZWwgPSBNVDYzNjBfQ0hBTl8jI19pZHgsCQkJCVwKPiArCS5z Y2FuX2luZGV4ID0gTVQ2MzYwX0NIQU5fIyNfaWR4LAkJCVwKPiArCS5kYXRhc2hlZXRfbmFtZSA9 ICNfaWR4LAkJCQlcCj4gKwkuc2Nhbl90eXBlID0gIHsJCQkJCQlcCj4gKwkJLnNpZ24gPSAndScs CQkJCQlcCj4gKwkJLnJlYWxiaXRzID0gMTYsCQkJCQlcCj4gKwkJLnN0b3JhZ2ViaXRzID0gMTYs CQkJCVwKPiArCQkuZW5kaWFubmVzcyA9IElJT19DUFUsCQkJCVwKPiArCX0sCQkJCQkJCVwKPiAr CS5pbmRleGVkID0gMSwJCQkJCQlcCj4gKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19D SEFOX0lORk9fUkFXKSB8CQlcCj4gKwkJCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAlcCj4g KwkJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCj4gK30KPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtdDYzNjBfYWRjX2NoYW5uZWxzW10gPSB7Cj4gKwlNVDYz NjBfQURDX0NIQU4oVVNCSUQsIElJT19WT0xUQUdFKSwKPiArCU1UNjM2MF9BRENfQ0hBTihWQlVT RElWNSwgSUlPX1ZPTFRBR0UpLAo+ICsJTVQ2MzYwX0FEQ19DSEFOKFZCVVNESVYyLCBJSU9fVk9M VEFHRSksCj4gKwlNVDYzNjBfQURDX0NIQU4oVlNZUywgSUlPX1ZPTFRBR0UpLAo+ICsJTVQ2MzYw X0FEQ19DSEFOKFZCQVQsIElJT19WT0xUQUdFKSwKPiArCU1UNjM2MF9BRENfQ0hBTihJQlVTLCBJ SU9fQ1VSUkVOVCksCj4gKwlNVDYzNjBfQURDX0NIQU4oSUJBVCwgSUlPX0NVUlJFTlQpLAo+ICsJ TVQ2MzYwX0FEQ19DSEFOKENIR19WRERQLCBJSU9fVk9MVEFHRSksCj4gKwlNVDYzNjBfQURDX0NI QU4oVEVNUF9KQywgSUlPX1RFTVApLAo+ICsJTVQ2MzYwX0FEQ19DSEFOKFZSRUZfVFMsIElJT19W T0xUQUdFKSwKPiArCU1UNjM2MF9BRENfQ0hBTihUUywgSUlPX1ZPTFRBR0UpLAo+ICsJSUlPX0NI QU5fU09GVF9USU1FU1RBTVAoTVQ2MzYwX0NIQU5fTUFYKSwKPiArfTsKPiArCj4gK3N0YXRpYyBp cnFyZXR1cm5fdCBtdDYzNjBfYWRjX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQo+ ICt7Cj4gKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOwo+ICsJc3RydWN0IGlpb19kZXYg KmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7Cj4gKwlzdHJ1Y3QgbXQ2MzYwX2FkY19kYXRhICpt YWQgPSBpaW9fcHJpdihpbmRpb19kZXYpOwo+ICsJc3RydWN0IHsKPiArCQl1MTYgdmFsdWVzW01U NjM2MF9DSEFOX01BWF07Cj4gKwkJaW50NjRfdCB0aW1lc3RhbXA7Cj4gKwl9IGRhdGEgX19hbGln bmVkKDgpID0gezB9OwoKSSBkb24ndCB0aGluayB0aGF0IGlzIHN1ZmZpY2llbnQgdG8gZm9yY2Ug dGhlIGdhcCB0byBiZSBzZXQgdG8gMC4KVGhlIGM5OSBzcGVjIHNheXMgaW4gNi43LjguMjEKIklm IHRoZXJlIGFyZSBmZXdlciBpbml0aWFsaXplcnMgaW4gYSBicmFjZS1lbmNsb3NlZCBsaXN0IHRo YW4gdGhlcmUgYXJlIGVsZW1lbnRzIG9yIG1lbWJlcnMKb2YgYW4gYWdncmVnYXRlLCBvciBmZXdl ciBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nIGxpdGVyYWwgdXNlZCB0byBpbml0aWFsaXplIGFuIGFy cmF5IG9mIGtub3duCnNpemUgdGhhbiB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB0 aGUgcmVtYWluZGVyIG9mIHRoZSBhZ2dyZWdhdGUgc2hhbGwgYmUKaW5pdGlhbGl6ZWQgaW1wbGlj aXRseSB0aGUgc2FtZSBhcyBvYmplY3RzIHRoYXQgaGF2ZSBzdGF0aWMgc3RvcmFnZSBkdXJhdGlv bi4iCgpUaGUgc3RhdGljIGNhc2UgaXMgY292ZXJlZCBieSA2LjcuOC4xMAoiSWYgYW4gb2JqZWN0 IHRoYXQgaGFzIGF1dG9tYXRpYyBzdG9yYWdlIGR1cmF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCBl eHBsaWNpdGx5LCBpdHMgdmFsdWUgaXMKaW5kZXRlcm1pbmF0ZS4gSWYgYW4gb2JqZWN0IHRoYXQg aGFzIHN0YXRpYyBzdG9yYWdlIGR1cmF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCBleHBsaWNpdGx5 LAp0aGVuOgrigJQgaWYgaXQgaGFzIHBvaW50ZXIgdHlwZSwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8g YSBudWxsIHBvaW50ZXI7CuKAlCBpZiBpdCBoYXMgYXJpdGhtZXRpYyB0eXBlLCBpdCBpcyBpbml0 aWFsaXplZCB0byAocG9zaXRpdmUgb3IgdW5zaWduZWQpIHplcm87CuKAlCBpZiBpdCBpcyBhbiBh Z2dyZWdhdGUsIGV2ZXJ5IG1lbWJlciBpcyBpbml0aWFsaXplZCAocmVjdXJzaXZlbHkpIGFjY29y ZGluZyB0byB0aGVzZSBydWxlczsK4oCUIGlmIGl0IGlzYXVuaW9uLCB0aGUgZmlyc3QgbmFtZWQg bWVtYmVyIGlzIGluaXRpYWxpemVkIChyZWN1cnNpdmVseSkgYWNjb3JkaW5nIHRvIHRoZXNlCiAg cnVsZXMKIgpTdHJ1Y3R1cmUgaXMgYW4gYWdncmVnYXRlLHMgZXZlcnkgbWVtYmVyIGlzIGluaXRp YWxpemVkLiAgVW5mb3J0dW5hdGVseSB0aGF0IGRvZXNuJ3QKaGF2ZSBhbnkgaW1wYWN0IG9uIGdh cHMuICBTbyBpdCAnbWlnaHQnIHplcm8gaXQsIGJ1dCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcy4K CkFzIHN1Y2gsIEkgdGhpbmsgeW91IG5lZWQgdG8gdXNlIG1lbXNldCB3aGljaCB3aWxsIGp1c3Qg ZmlsbCB0aGUgbWVtb3J5IHdpdGggemVyb3MKd2l0aG91dCBjYXJpbmcgYWJvdXQgdGhlIHN0cnVj dHVyZS4KT3IgY2hlZWt5IHJvdXRlIGlzIHRvIGFkZCBlbGVtZW50cyB0byBmaWxsIHRoZSBnYXAg YW5kIGp1c3QgY2FsbCB0aGVtIHBhZFtdIG9yIHNpbWlsYXIuCgoKPiArCWludCBpID0gMCwgYml0 LCB2YWwsIHJldDsKPiArCj4gKwo+ICsJZm9yX2VhY2hfc2V0X2JpdChiaXQsIGluZGlvX2Rldi0+ YWN0aXZlX3NjYW5fbWFzaywgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7Cj4gKwkJcmV0ID0gbXQ2 MzYwX2FkY19yZWFkX2NoYW5uZWwobWFkLCBiaXQsICZ2YWwpOwo+ICsJCWlmIChyZXQgPCAwKSB7 Cj4gKwkJCWRldl93YXJuKCZpbmRpb19kZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCAl ZCBjb252ZXJzaW9uIHZhbFxuIiwgYml0KTsKPiArCQkJZ290byBvdXQ7Cj4gKwkJfQo+ICsKPiAr CQlkYXRhLnZhbHVlc1tpKytdID0gdmFsOwo+ICsJfQo+ICsJaWlvX3B1c2hfdG9fYnVmZmVyc193 aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsICZkYXRhLCBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2 KSk7Cj4gK291dDoKPiArCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7 Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGlu dCBtdDYzNjBfYWRjX3Jlc2V0KHN0cnVjdCBtdDYzNjBfYWRjX2RhdGEgKmluZm8pCj4gK3sKPiAr CV9fYmUxNiBhZGNfZW5hYmxlOwo+ICsJa3RpbWVfdCBhbGxfb2ZmX3RpbWU7Cj4gKwlpbnQgaSwg cmV0Owo+ICsKPiArCS8qIENsZWFyIEFEQyBpZGxlIHdhaXQgdGltZSB0byAwICovCj4gKwlyZXQg PSByZWdtYXBfd3JpdGUoaW5mby0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUFEQ0lETEVULCAwKTsK PiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBPbmx5IGtlZXAgQURDIGVu YWJsZSwgYnV0IGtlZXAgYWxsIGNoYW5uZWxzIG9mZiAqLwo+ICsJYWRjX2VuYWJsZSA9IGNwdV90 b19iZTE2KE1UNjM2MF9BRENFTl9NQVNLKTsKPiArCXJldCA9IHJlZ21hcF9yYXdfd3JpdGUoaW5m by0+cmVnbWFwLCBNVDYzNjBfUkVHX1BNVUFEQ0NGRywgKHZvaWQgKikmYWRjX2VuYWJsZSwKV2h5 IGFyZSB3ZSBjYXN0aW5nIHRvIGEgdm9pZCAqPyBUaGF0IHNob3VsZG4ndCBiZSBuZWNlc3Nhcnku IEFtIEkgbWlzc2luZyBzb21ldGhpbmc/Cgo+ICsJCQkgICAgICAgc2l6ZW9mKF9fYmUxNikpOwoK U2xpZ2h0IHByZWZlcmVuY2UgZm9yIHNpemVvZihhZGNfZW5hYmxlKSBhcyB0aGVuIEkgZG9uJ3Qg aGF2ZSB0byBzYW5pdHkgY2hlY2tpdAppcyB0aGUgcmlnaHQgdHlwZSB3aGlsc3QgcmV2aWV3aW5n LgoKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBSZXNldCBhbGwgY2hh bm5lbCBvZmYgdGltZSB0byB0aGUgY3VycmVudCBvbmUgKi8KPiArCWFsbF9vZmZfdGltZSA9IGt0 aW1lX2dldCgpOwo+ICsJZm9yIChpID0gMDsgaSA8IE1UNjM2MF9DSEFOX01BWDsgaSsrKQo+ICsJ CWluZm8tPmxhc3Rfb2ZmX3RpbWVzdGFtcHNbaV0gPSBhbGxfb2ZmX3RpbWU7Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FkY19wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgbXQ2MzYwX2FkY19kYXRhICptYWQ7 Cj4gKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Cj4gKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2 Owo+ICsJaW50IHJldDsKPiArCj4gKwlyZWdtYXAgPSBkZXZfZ2V0X3JlZ21hcChwZGV2LT5kZXYu cGFyZW50LCBOVUxMKTsKPiArCWlmICghcmVnbWFwKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiRmFpbGVkIHRvIGdldCBwYXJlbnQgcmVnbWFwXG4iKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsK PiArCX0KPiArCj4gKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnBkZXYtPmRl diwgc2l6ZW9mKCptYWQpKTsKPiArCWlmICghaW5kaW9fZGV2KQo+ICsJCXJldHVybiAtRU5PTUVN Owo+ICsKPiArCW1hZCA9IGlpb19wcml2KGluZGlvX2Rldik7Cj4gKwltYWQtPmRldiA9ICZwZGV2 LT5kZXY7Cj4gKwltYWQtPnJlZ21hcCA9IHJlZ21hcDsKPiArCW11dGV4X2luaXQoJm1hZC0+YWRj X2xvY2spOwo+ICsKPiArCXJldCA9IG10NjM2MF9hZGNfcmVzZXQobWFkKTsKPiArCWlmIChyZXQg PCAwKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGFkY1xuIik7 Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFt ZSgmcGRldi0+ZGV2KTsKPiArCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Cj4g KwlpbmRpb19kZXYtPmluZm8gPSAmbXQ2MzYwX2FkY19paW9faW5mbzsKPiArCWluZGlvX2Rldi0+ bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKPiArCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtdDYz NjBfYWRjX2NoYW5uZWxzOwo+ICsJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpF KG10NjM2MF9hZGNfY2hhbm5lbHMpOwo+ICsKPiArCXJldCA9IGRldm1faWlvX3RyaWdnZXJlZF9i dWZmZXJfc2V0dXAoJnBkZXYtPmRldiwgaW5kaW9fZGV2LCBOVUxMLAo+ICsJCQkJCSAgICAgIG10 NjM2MF9hZGNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKPiArCWlmIChyZXQpIHsKPiArCQlkZXZf ZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaWlvIHRyaWdnZXIgYnVmZmVyXG4i KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVybiBkZXZtX2lpb19kZXZpY2Vf cmVnaXN0ZXIoJnBkZXYtPmRldiwgaW5kaW9fZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBvZl9kZXZpY2VfaWQgX19tYXliZV91bnVzZWQgbXQ2MzYwX2FkY19vZl9pZFtdID0g ewo+ICsJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzNjAtYWRjIiwgfSwKPiArCXt9Cj4g K307Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10NjM2MF9hZGNfb2ZfaWQpOwo+ICsKPiAr c3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXQ2MzYwX2FkY19kcml2ZXIgPSB7Cj4gKwku ZHJpdmVyID0gewo+ICsJCS5uYW1lID0gIm10NjM2MC1hZGMiLAo+ICsJCS5vZl9tYXRjaF90YWJs ZSA9IG10NjM2MF9hZGNfb2ZfaWQsCj4gKwl9LAo+ICsJLnByb2JlID0gbXQ2MzYwX2FkY19wcm9i ZSwKPiArfTsKPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdDYzNjBfYWRjX2RyaXZlcik7Cj4g Kwo+ICtNT0RVTEVfQVVUSE9SKCJHZW5lIENoZW4gPGdlbmVfY2hlbkByaWNodGVrLmNvbT4iKTsK PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJNVDYzNjAgQURDIERyaXZlciIpOwo+ICtNT0RVTEVfTElD RU5TRSgiR1BMIHYyIik7CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtYXJtLWtlcm5lbAo=