From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2B010187550; Tue, 3 Sep 2024 15:26:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725377164; cv=none; b=qrLSwMKIGxBo332seICicZe3KLrUzP13JKr7ARHdsC61nDMJOEIsBlrVmcsWi6Hxn1R2LpbMibtzodTdck+1WqNXaZZXEDF43ZkVoz5l3C3RxwdtkbuWA5lp+KjZzx/nSs/0hL3rO354LPMkrlaizhB87cFZsLQGhLNtKkDC50Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725377164; c=relaxed/simple; bh=mhK03MnhTEHTjGBACSOGAvkuomVlTl8JA2V0vN9yPGg=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=pnMG2as13ky3GFyBMBYqg0xeqpSg4Ule5b0OsjIlOhhA2iDT2o1unfO3NeOnx2er97OyknZhQfnHcSWGGbqx6PNMa1kncwoUXZELD/V2rCMGeB5ms/KNSAovPljqm/P3YUBB2arsxOHP+s4k/LfIwBWg7oYAaoKc6+ZpAhQBtII= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mehRt6N8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mehRt6N8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 74DC1C4CEC8; Tue, 3 Sep 2024 15:26:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1725377164; bh=mhK03MnhTEHTjGBACSOGAvkuomVlTl8JA2V0vN9yPGg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mehRt6N8loNfZUncUWHTovjLmeWHk/PsicmFx3VkWfynS7PifHBZTu56sjF0Ru2D8 sWsKBvnrDc2MYuk/YDFDHnudOrJNgQ6VEi5qUeaXX56Zx6yClG+hPdpoqsDSKJNeAt kTjeHzO4xuYoktB80kFKwi/Y7/OBIGdKfjA0fXlrAhmfWO7HXMho9DIVv5E0N736tM Wml+2/7OZuIxSPBy2qYnWVF5jXPMW/6u0lWjy4teDg1cLBAAe2EfK5RCaMHPBumYSS vJoyPHqHqPRtlisOsfbBISzBMlMQabIxtegWugfFeHjvldUQ1AUTwqk5HtadwGPlCF FR1bJwNWuXQ2A== Date: Tue, 3 Sep 2024 16:25:58 +0100 From: Lee Jones To: Chris Morgan Cc: linux-pm@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, broonie@kernel.org, lgirdwood@gmail.com, sre@kernel.org, heiko@sntech.de, conor+dt@kernel.org, krzk+dt@kernel.org, robh@kernel.org, Chris Morgan Subject: Re: [RFC 2/5] mfd: bq257xx: Add support for BQ25703 core driver Message-ID: <20240903152558.GY6858@google.com> References: <20240829213102.448047-1-macroalpha82@gmail.com> <20240829213102.448047-3-macroalpha82@gmail.com> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20240829213102.448047-3-macroalpha82@gmail.com> On Thu, 29 Aug 2024, Chris Morgan wrote: > From: Chris Morgan > > The Texas Instruments BQ25703A is an integrated charger manager and > boost converter. > > The MFD driver initalizes the device for the regulator driver > and power supply driver. > > Signed-off-by: Chris Morgan > --- > drivers/mfd/Kconfig | 11 ++++ > drivers/mfd/Makefile | 1 + > drivers/mfd/bq257xx.c | 118 +++++++++++++++++++++++++++++++++++ > include/linux/mfd/bq257xx.h | 120 ++++++++++++++++++++++++++++++++++++ > 4 files changed, 250 insertions(+) > create mode 100644 drivers/mfd/bq257xx.c > create mode 100644 include/linux/mfd/bq257xx.h > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index bc8be2e593b6..712951ae7341 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -1537,6 +1537,17 @@ config MFD_TI_LMU > LM36274. It consists of backlight, LED and regulator driver. > It provides consistent device controls for lighting functions. > > +config MFD_BQ257XX > + tristate "TI BQ257XX Buck/Boost Charge Controller" > + depends on I2C > + select MFD_CORE > + select REGMAP_I2C > + help > + Support Texas Instruments BQ25703 Buck/Boost converter with > + charge controller. It consists of regulators that provide > + system voltage and OTG voltage, and a charger manager for > + batteries containing one or more cells. > + > config MFD_OMAP_USB_HOST > bool "TI OMAP USBHS core and TLL driver" > depends on USB_EHCI_HCD_OMAP || USB_OHCI_HCD_OMAP3 > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 02b651cd7535..90bc65d83c5f 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -13,6 +13,7 @@ obj-$(CONFIG_MFD_SM501) += sm501.o > obj-$(CONFIG_ARCH_BCM2835) += bcm2835-pm.o > obj-$(CONFIG_MFD_BCM590XX) += bcm590xx.o > obj-$(CONFIG_MFD_BD9571MWV) += bd9571mwv.o > +obj-$(CONFIG_MFD_BQ257XX) += bq257xx.o > obj-$(CONFIG_MFD_CROS_EC_DEV) += cros_ec_dev.o > obj-$(CONFIG_MFD_CS42L43) += cs42l43.o > obj-$(CONFIG_MFD_CS42L43_I2C) += cs42l43-i2c.o > diff --git a/drivers/mfd/bq257xx.c b/drivers/mfd/bq257xx.c > new file mode 100644 > index 000000000000..c612262f9a1e > --- /dev/null > +++ b/drivers/mfd/bq257xx.c > @@ -0,0 +1,118 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* BQ257XX MFD Driver The top line of a multi-line comment should be empty. Please drop _all_ mentions of "MFD" - it's not a thing. > + * Copyright (C) 2024 Chris Morgan '\n' here. > + * Based off of BQ256XX Battery Charger Driver and > + * Rockchip RK808 MFD Driver You really don't have to mention this. 9 out of every 10 (I just made those figures up) drivers in the kernel take inspiration from existing ones. These sentences don't add anything IMHO. > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +static const struct regmap_range bq25703_readonly_reg_ranges[] = { > + regmap_reg_range(BQ25703_CHARGER_STATUS, BQ25703_MANUFACT_DEV_ID), > +}; > + > +static const struct regmap_access_table bq25703_writeable_regs = { > + .no_ranges = bq25703_readonly_reg_ranges, > + .n_no_ranges = ARRAY_SIZE(bq25703_readonly_reg_ranges), > +}; > + > +static const struct regmap_range bq25703_volatile_reg_ranges[] = { > + regmap_reg_range(BQ25703_CHARGE_OPTION_0, BQ25703_IIN_HOST), > + regmap_reg_range(BQ25703_CHARGER_STATUS, BQ25703_ADC_OPTION), > +}; > + > +static const struct regmap_access_table bq25703_volatile_regs = { > + .yes_ranges = bq25703_volatile_reg_ranges, > + .n_yes_ranges = ARRAY_SIZE(bq25703_volatile_reg_ranges), > +}; > + > +static const struct regmap_config bq25703_regmap_config = { > + .reg_bits = 8, > + .val_bits = 16, > + .max_register = BQ25703_ADC_OPTION, > + .cache_type = REGCACHE_RBTREE, > + .wr_table = &bq25703_writeable_regs, > + .volatile_table = &bq25703_volatile_regs, > + .val_format_endian = REGMAP_ENDIAN_LITTLE, > +}; > + > +static const struct mfd_cell bq25703_cells[] = { > + MFD_CELL_NAME("bq257xx-regulator"), > + MFD_CELL_NAME("bq257xx-charger"), > +}; > + > +static int bq257xx_probe(struct i2c_client *client) > +{ > + struct device *dev = &client->dev; > + struct bq257xx_device *bq; Call this ddata. > + const struct mfd_cell *cells; > + int nr_cells; > + int ret = 0; The pre-initialisation is redundant. > + bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL); > + if (!bq) > + return -ENOMEM; > + > + bq->client = client; > + bq->dev = dev; You don't need both. > + bq->variant = (long)i2c_get_match_data(client); Pretty sure this cast is not correct and maybe not even required. > + switch (bq->variant) { > + case BQ25703A: I wouldn't add all of this complexity until its needed. > + bq->regmap_cfg = &bq25703_regmap_config; Where is this consumed? > + cells = bq25703_cells; > + nr_cells = ARRAY_SIZE(bq25703_cells); > + break; > + default: > + dev_err(dev, "Unsupported BQ257XX ID %ld\n", bq->variant); > + return -EINVAL; > + } > + > + bq->regmap = devm_regmap_init_i2c(client, bq->regmap_cfg); > + Remove this line. > + if (IS_ERR(bq->regmap)) { > + dev_err(dev, "Failed to allocate register map\n"); > + return PTR_ERR(bq->regmap); > + } > + > + i2c_set_clientdata(client, bq); > + > + ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_AUTO, > + cells, nr_cells, NULL, 0, NULL); > + if (ret) { > + dev_err(&client->dev, "failed to add MFD devices %d\n", ret); No such thing. "Failed to register child devices" q > + return ret; > + } > + > + return ret; > +} > + > +static const struct i2c_device_id bq257xx_i2c_ids[] = { > + { "bq25703a" }, > + {} > +}; > +MODULE_DEVICE_TABLE(i2c, bq257xx_i2c_ids); > + > +static const struct of_device_id bq257xx_of_match[] = { > + { .compatible = "ti,bq25703a", .data = (void *)BQ25703A, }, Cast almost certainly not required. > + {} > +}; > +MODULE_DEVICE_TABLE(of, bq257xx_of_match); > + > +static struct i2c_driver bq257xx_driver = { > + .driver = { > + .name = "bq257xx", > + .of_match_table = bq257xx_of_match, > + }, > + .probe = bq257xx_probe, > + .id_table = bq257xx_i2c_ids, > +}; > +module_i2c_driver(bq257xx_driver); > + > +MODULE_DESCRIPTION("bq257xx buck/boost/charger MFD driver"); Not an "MFD driver" > +MODULE_AUTHOR("Chris Morgan "); > +MODULE_LICENSE("GPL"); > diff --git a/include/linux/mfd/bq257xx.h b/include/linux/mfd/bq257xx.h > new file mode 100644 > index 000000000000..51f6501c6441 > --- /dev/null > +++ b/include/linux/mfd/bq257xx.h > @@ -0,0 +1,120 @@ > +/* SPDX-License-Identifier: GPL-2.0 > + * Register definitions for TI BQ257XX > + * Heavily based off of BQ256XX Battery Charger Driver > + * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/ > + */ All as above. > +#define BQ257XX_MANUFACTURER "Texas Instruments" Errr, no thank you. Just use strings where you need them. > +#define BQ25703_CHARGE_OPTION_0 0x00 > +#define BQ25703_CHARGE_CURRENT 0x02 > +#define BQ25703_MAX_CHARGE_VOLT 0x04 > +#define BQ25703_OTG_VOLT 0x06 > +#define BQ25703_OTG_CURRENT 0x08 > +#define BQ25703_INPUT_VOLTAGE 0x0a > +#define BQ25703_MIN_VSYS 0x0c > +#define BQ25703_IIN_HOST 0x0e > +#define BQ25703_CHARGER_STATUS 0x20 > +#define BQ25703_PROCHOT_STATUS 0x22 > +#define BQ25703_IIN_DPM 0x24 > +#define BQ25703_ADCIBAT_CHG 0x28 > +#define BQ25703_ADCIINCMPIN 0x2a > +#define BQ25703_ADCVSYSVBAT 0x2c > +#define BQ25703_MANUFACT_DEV_ID 0x2e > +#define BQ25703_CHARGE_OPTION_1 0x30 > +#define BQ25703_CHARGE_OPTION_2 0x32 > +#define BQ25703_CHARGE_OPTION_3 0x34 > +#define BQ25703_ADC_OPTION 0x3a > + > +#define BQ25703_EN_LWPWR BIT(15) > +#define BQ25703_WDTMR_ADJ_MASK GENMASK(14, 13) > +#define BQ25703_WDTMR_DISABLE 0 > +#define BQ25703_WDTMR_5_SEC 1 > +#define BQ25703_WDTMR_88_SEC 2 > +#define BQ25703_WDTMR_175_SEC 3 > + > +#define BQ25703_ICHG_MASK GENMASK(12, 6) > +#define BQ25703_ICHG_STEP_UA 64000 > +#define BQ25703_ICHG_MIN_UA 64000 > +#define BQ25703_ICHG_MAX_UA 8128000 > + > +#define BQ25703_MAX_CHARGE_VOLT_MASK GENMASK(15, 4) > +#define BQ25703_VBATREG_STEP_UV 16000 > +#define BQ25703_VBATREG_MIN_UV 1024000 > +#define BQ25703_VBATREG_MAX_UV 19200000 > + > +#define BQ25703_OTG_VOLT_MASK GENMASK(13, 6) > +#define BQ25703_OTG_VOLT_STEP_UV 64000 > +#define BQ25703_OTG_VOLT_MIN_UV 4480000 > +#define BQ25703_OTG_VOLT_MAX_UV 20800000 > +#define BQ25703_OTG_VOLT_NUM_VOLT 256 > + > +#define BQ25703_OTG_CUR_MASK GENMASK(14, 8) > +#define BQ25703_OTG_CUR_STEP_UA 50000 > +#define BQ25703_OTG_CUR_MAX_UA 6350000 > + > +#define BQ25703_MINVSYS_MASK GENMASK(13, 8) > +#define BQ25703_MINVSYS_STEP_UV 256000 > +#define BQ25703_MINVSYS_MIN_UV 1024000 > +#define BQ25703_MINVSYS_MAX_UV 16128000 > + > +#define BQ25703_STS_AC_STAT BIT(15) > +#define BQ25703_STS_IN_FCHRG BIT(10) > +#define BQ25703_STS_IN_PCHRG BIT(9) > +#define BQ25703_STS_FAULT_ACOV BIT(7) > +#define BQ25703_STS_FAULT_BATOC BIT(6) > +#define BQ25703_STS_FAULT_ACOC BIT(5) > + > +#define BQ25703_IINDPM_MASK GENMASK(14, 8) > +#define BQ25703_IINDPM_STEP_UA 50000 > +#define BQ25703_IINDPM_MIN_UA 50000 > +#define BQ25703_IINDPM_MAX_UA 6400000 > +#define BQ25703_IINDPM_DEFAULT_UA 3300000 > +#define BQ25703_IINDPM_OFFSET_UA 50000 > + > +#define BQ25703_ADCIBAT_DISCHG_MASK GENMASK(6, 0) > +#define BQ25703_ADCIBAT_CHG_MASK GENMASK(14, 8) > +#define BQ25703_ADCIBAT_CHG_STEP_UA 64000 > +#define BQ25703_ADCIBAT_DIS_STEP_UA 256000 > + > +#define BQ25703_ADCIIN GENMASK(15, 8) > +#define BQ25703_ADCIINCMPIN_STEP 50000 > + > +#define BQ25703_ADCVSYS_MASK GENMASK(15, 8) > +#define BQ25703_ADCVBAT_MASK GENMASK(7, 0) > +#define BQ25703_ADCVSYSVBAT_OFFSET_UV 2880000 > +#define BQ25703_ADCVSYSVBAT_STEP 64000 > + > +#define BQ25703_ADC_CH_MASK GENMASK(7, 0) > +#define BQ25703_ADC_CONV_EN BIT(15) > +#define BQ25703_ADC_START BIT(14) > +#define BQ25703_ADC_FULL_SCALE BIT(13) > +#define BQ25703_ADC_CMPIN_EN BIT(7) > +#define BQ25703_ADC_VBUS_EN BIT(6) > +#define BQ25703_ADC_PSYS_EN BIT(5) > +#define BQ25703_ADC_IIN_EN BIT(4) > +#define BQ25703_ADC_IDCHG_EN BIT(3) > +#define BQ25703_ADC_ICHG_EN BIT(2) > +#define BQ25703_ADC_VSYS_EN BIT(1) > +#define BQ25703_ADC_VBAT_EN BIT(0) > + > +#define BQ25703_EN_OTG_MASK BIT(12) > + > +enum bq257xx_id { > + BQ25703A, > +}; > + > +/** Are you sure you want to use kernel-doc here? I would advise against it. > + * struct bq257xx_device - > + * @client: i2c client structure > + * @regmap: register map structure > + * @dev: device structure > + * @regmap_cfg: device specific regmap cfg It's also wrong. Did you test build with W=1? > + */ > +struct bq257xx_device { > + struct i2c_client *client; > + struct regmap *regmap; > + struct device *dev; > + const struct regmap_config *regmap_cfg; > + long variant; > +}; > -- > 2.34.1 > -- 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 17070CD3443 for ; Tue, 3 Sep 2024 15:34:04 +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=NmKFJWdegWRiyHy5C8WR0zWM2IkbhVcEfj7em9ZBnKs=; b=RPIsPRZFulB1uH bn762S0QOlofedqf+8YT0NSYSEQYGcU66653rt1Ro2hIpOiWe46epZoZWvslNL1dRjKC29v9qJigw AHcLckW9UxHtmrar6/dTmySKZEQO0pQv6J76w1soXLCE/M0YOn7ABMdqhLT9OEkrkWPRX4+pnmRIW Glzp3RXszt26Fii3wL4ERonJnN95Ws7l4llE7RDeHY7k7Ksz8YboBrx4v0857Sy7oiX7+zkkQUSKT hLd7Eqj4NFeLNxRmgUoOmkPRWek3+Vzb2K1CtLE/x1YYQlk4VXonl7JqzvpmxP2+78RZZA/6fFXmg HnZ11Qb+JSL480MJFGEQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1slVXd-00000000su6-1GrK; Tue, 03 Sep 2024 15:34:01 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1slVPx-00000000qG5-1LUJ for linux-rockchip@lists.infradead.org; Tue, 03 Sep 2024 15:26:07 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id DDA4D5C59F4; Tue, 3 Sep 2024 15:26:00 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 74DC1C4CEC8; Tue, 3 Sep 2024 15:26:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1725377164; bh=mhK03MnhTEHTjGBACSOGAvkuomVlTl8JA2V0vN9yPGg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mehRt6N8loNfZUncUWHTovjLmeWHk/PsicmFx3VkWfynS7PifHBZTu56sjF0Ru2D8 sWsKBvnrDc2MYuk/YDFDHnudOrJNgQ6VEi5qUeaXX56Zx6yClG+hPdpoqsDSKJNeAt kTjeHzO4xuYoktB80kFKwi/Y7/OBIGdKfjA0fXlrAhmfWO7HXMho9DIVv5E0N736tM Wml+2/7OZuIxSPBy2qYnWVF5jXPMW/6u0lWjy4teDg1cLBAAe2EfK5RCaMHPBumYSS vJoyPHqHqPRtlisOsfbBISzBMlMQabIxtegWugfFeHjvldUQ1AUTwqk5HtadwGPlCF FR1bJwNWuXQ2A== Date: Tue, 3 Sep 2024 16:25:58 +0100 From: Lee Jones To: Chris Morgan Cc: linux-pm@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, broonie@kernel.org, lgirdwood@gmail.com, sre@kernel.org, heiko@sntech.de, conor+dt@kernel.org, krzk+dt@kernel.org, robh@kernel.org, Chris Morgan Subject: Re: [RFC 2/5] mfd: bq257xx: Add support for BQ25703 core driver Message-ID: <20240903152558.GY6858@google.com> References: <20240829213102.448047-1-macroalpha82@gmail.com> <20240829213102.448047-3-macroalpha82@gmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240829213102.448047-3-macroalpha82@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240903_082605_637823_2DAB5C93 X-CRM114-Status: GOOD ( 34.86 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org T24gVGh1LCAyOSBBdWcgMjAyNCwgQ2hyaXMgTW9yZ2FuIHdyb3RlOgoKPiBGcm9tOiBDaHJpcyBN b3JnYW4gPG1hY3JvbW9yZ2FuQGhvdG1haWwuY29tPgo+IAo+IFRoZSBUZXhhcyBJbnN0cnVtZW50 cyBCUTI1NzAzQSBpcyBhbiBpbnRlZ3JhdGVkIGNoYXJnZXIgbWFuYWdlciBhbmQKPiBib29zdCBj b252ZXJ0ZXIuCj4gCj4gVGhlIE1GRCBkcml2ZXIgaW5pdGFsaXplcyB0aGUgZGV2aWNlIGZvciB0 aGUgcmVndWxhdG9yIGRyaXZlcgo+IGFuZCBwb3dlciBzdXBwbHkgZHJpdmVyLgo+IAo+IFNpZ25l ZC1vZmYtYnk6IENocmlzIE1vcmdhbiA8bWFjcm9tb3JnYW5AaG90bWFpbC5jb20+Cj4gLS0tCj4g IGRyaXZlcnMvbWZkL0tjb25maWcgICAgICAgICB8ICAxMSArKysrCj4gIGRyaXZlcnMvbWZkL01h a2VmaWxlICAgICAgICB8ICAgMSArCj4gIGRyaXZlcnMvbWZkL2JxMjU3eHguYyAgICAgICB8IDEx OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICBpbmNsdWRlL2xpbnV4L21m ZC9icTI1N3h4LmggfCAxMjAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g IDQgZmlsZXMgY2hhbmdlZCwgMjUwIGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvbWZkL2JxMjU3eHguYwo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9saW51 eC9tZmQvYnEyNTd4eC5oCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9k cml2ZXJzL21mZC9LY29uZmlnCj4gaW5kZXggYmM4YmUyZTU5M2I2Li43MTI5NTFhZTczNDEgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbWZkL0tjb25m aWcKPiBAQCAtMTUzNyw2ICsxNTM3LDE3IEBAIGNvbmZpZyBNRkRfVElfTE1VCj4gIAkgIExNMzYy NzQuICBJdCBjb25zaXN0cyBvZiBiYWNrbGlnaHQsIExFRCBhbmQgcmVndWxhdG9yIGRyaXZlci4K PiAgCSAgSXQgcHJvdmlkZXMgY29uc2lzdGVudCBkZXZpY2UgY29udHJvbHMgZm9yIGxpZ2h0aW5n IGZ1bmN0aW9ucy4KPiAgCj4gK2NvbmZpZyBNRkRfQlEyNTdYWAo+ICsJdHJpc3RhdGUgIlRJIEJR MjU3WFggQnVjay9Cb29zdCBDaGFyZ2UgQ29udHJvbGxlciIKPiArCWRlcGVuZHMgb24gSTJDCj4g KwlzZWxlY3QgTUZEX0NPUkUKPiArCXNlbGVjdCBSRUdNQVBfSTJDCj4gKwloZWxwCj4gKwkgIFN1 cHBvcnQgVGV4YXMgSW5zdHJ1bWVudHMgQlEyNTcwMyBCdWNrL0Jvb3N0IGNvbnZlcnRlciB3aXRo Cj4gKwkgIGNoYXJnZSBjb250cm9sbGVyLiBJdCBjb25zaXN0cyBvZiByZWd1bGF0b3JzIHRoYXQg cHJvdmlkZQo+ICsJICBzeXN0ZW0gdm9sdGFnZSBhbmQgT1RHIHZvbHRhZ2UsIGFuZCBhIGNoYXJn ZXIgbWFuYWdlciBmb3IKPiArCSAgYmF0dGVyaWVzIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgY2Vs bHMuCj4gKwo+ICBjb25maWcgTUZEX09NQVBfVVNCX0hPU1QKPiAgCWJvb2wgIlRJIE9NQVAgVVNC SFMgY29yZSBhbmQgVExMIGRyaXZlciIKPiAgCWRlcGVuZHMgb24gVVNCX0VIQ0lfSENEX09NQVAg fHwgVVNCX09IQ0lfSENEX09NQVAzCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxl IGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKPiBpbmRleCAwMmI2NTFjZDc1MzUuLjkwYmM2NWQ4M2M1 ZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvbWZk L01ha2VmaWxlCj4gQEAgLTEzLDYgKzEzLDcgQEAgb2JqLSQoQ09ORklHX01GRF9TTTUwMSkJCSs9 IHNtNTAxLm8KPiAgb2JqLSQoQ09ORklHX0FSQ0hfQkNNMjgzNSkJKz0gYmNtMjgzNS1wbS5vCj4g IG9iai0kKENPTkZJR19NRkRfQkNNNTkwWFgpCSs9IGJjbTU5MHh4Lm8KPiAgb2JqLSQoQ09ORklH X01GRF9CRDk1NzFNV1YpCSs9IGJkOTU3MW13di5vCj4gK29iai0kKENPTkZJR19NRkRfQlEyNTdY WCkJKz0gYnEyNTd4eC5vCj4gIG9iai0kKENPTkZJR19NRkRfQ1JPU19FQ19ERVYpCSs9IGNyb3Nf ZWNfZGV2Lm8KPiAgb2JqLSQoQ09ORklHX01GRF9DUzQyTDQzKQkrPSBjczQybDQzLm8KPiAgb2Jq LSQoQ09ORklHX01GRF9DUzQyTDQzX0kyQykJKz0gY3M0Mmw0My1pMmMubwo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL21mZC9icTI1N3h4LmMgYi9kcml2ZXJzL21mZC9icTI1N3h4LmMKPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uYzYxMjI2MmY5YTFlCj4gLS0tIC9k ZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvbWZkL2JxMjU3eHguYwo+IEBAIC0wLDAgKzEsMTE4IEBA Cj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gKy8qIEJRMjU3WFggTUZE IERyaXZlcgoKVGhlIHRvcCBsaW5lIG9mIGEgbXVsdGktbGluZSBjb21tZW50IHNob3VsZCBiZSBl bXB0eS4KClBsZWFzZSBkcm9wIF9hbGxfIG1lbnRpb25zIG9mICJNRkQiIC0gaXQncyBub3QgYSB0 aGluZy4KCj4gKyAqIENvcHlyaWdodCAoQykgMjAyNCBDaHJpcyBNb3JnYW4gPG1hY3JvbW9yZ2Fu QGhvdG1haWwuY29tPgoKJ1xuJyBoZXJlLgoKPiArICogQmFzZWQgb2ZmIG9mIEJRMjU2WFggQmF0 dGVyeSBDaGFyZ2VyIERyaXZlciBhbmQKPiArICogUm9ja2NoaXAgUks4MDggTUZEIERyaXZlcgoK WW91IHJlYWxseSBkb24ndCBoYXZlIHRvIG1lbnRpb24gdGhpcy4KCjkgb3V0IG9mIGV2ZXJ5IDEw IChJIGp1c3QgbWFkZSB0aG9zZSBmaWd1cmVzIHVwKSBkcml2ZXJzIGluIHRoZSBrZXJuZWwKdGFr ZSBpbnNwaXJhdGlvbiBmcm9tIGV4aXN0aW5nIG9uZXMuICBUaGVzZSBzZW50ZW5jZXMgZG9uJ3Qg YWRkCmFueXRoaW5nIElNSE8uCgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2Uu aD4KPiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ICsjaW5jbHVkZSA8bGludXgvbWZkL2JxMjU3 eHguaD4KPiArI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9y ZWdtYXAuaD4KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGJxMjU3MDNf cmVhZG9ubHlfcmVnX3Jhbmdlc1tdID0gewo+ICsJcmVnbWFwX3JlZ19yYW5nZShCUTI1NzAzX0NI QVJHRVJfU1RBVFVTLCBCUTI1NzAzX01BTlVGQUNUX0RFVl9JRCksCj4gK307Cj4gKwo+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgYnEyNTcwM193cml0ZWFibGVfcmVn cyA9IHsKPiArCS5ub19yYW5nZXMgPSBicTI1NzAzX3JlYWRvbmx5X3JlZ19yYW5nZXMsCj4gKwku bl9ub19yYW5nZXMgPSBBUlJBWV9TSVpFKGJxMjU3MDNfcmVhZG9ubHlfcmVnX3JhbmdlcyksCj4g K307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSBicTI1NzAzX3ZvbGF0 aWxlX3JlZ19yYW5nZXNbXSA9IHsKPiArCXJlZ21hcF9yZWdfcmFuZ2UoQlEyNTcwM19DSEFSR0Vf T1BUSU9OXzAsIEJRMjU3MDNfSUlOX0hPU1QpLAo+ICsJcmVnbWFwX3JlZ19yYW5nZShCUTI1NzAz X0NIQVJHRVJfU1RBVFVTLCBCUTI1NzAzX0FEQ19PUFRJT04pLAo+ICt9Owo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGJxMjU3MDNfdm9sYXRpbGVfcmVncyA9 IHsKPiArCS55ZXNfcmFuZ2VzID0gYnEyNTcwM192b2xhdGlsZV9yZWdfcmFuZ2VzLAo+ICsJLm5f eWVzX3JhbmdlcyA9IEFSUkFZX1NJWkUoYnEyNTcwM192b2xhdGlsZV9yZWdfcmFuZ2VzKSwKPiAr fTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBicTI1NzAzX3JlZ21h cF9jb25maWcgPSB7Cj4gKwkucmVnX2JpdHMgPSA4LAo+ICsJLnZhbF9iaXRzID0gMTYsCj4gKwku bWF4X3JlZ2lzdGVyID0gQlEyNTcwM19BRENfT1BUSU9OLAo+ICsJLmNhY2hlX3R5cGUgPSBSRUdD QUNIRV9SQlRSRUUsCj4gKwkud3JfdGFibGUgPSAmYnEyNTcwM193cml0ZWFibGVfcmVncywKPiAr CS52b2xhdGlsZV90YWJsZSA9ICZicTI1NzAzX3ZvbGF0aWxlX3JlZ3MsCj4gKwkudmFsX2Zvcm1h dF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX0xJVFRMRSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgbWZkX2NlbGwgYnEyNTcwM19jZWxsc1tdID0gewo+ICsJTUZEX0NFTExfTkFNRSgi YnEyNTd4eC1yZWd1bGF0b3IiKSwKPiArCU1GRF9DRUxMX05BTUUoImJxMjU3eHgtY2hhcmdlciIp LAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBicTI1N3h4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50 ICpjbGllbnQpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKPiAr CXN0cnVjdCBicTI1N3h4X2RldmljZSAqYnE7CgpDYWxsIHRoaXMgZGRhdGEuCgo+ICsJY29uc3Qg c3RydWN0IG1mZF9jZWxsICpjZWxsczsKPiArCWludCBucl9jZWxsczsKPiArCWludCByZXQgPSAw OwoKVGhlIHByZS1pbml0aWFsaXNhdGlvbiBpcyByZWR1bmRhbnQuCgo+ICsJYnEgPSBkZXZtX2t6 YWxsb2MoZGV2LCBzaXplb2YoKmJxKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIWJxKQo+ICsJCXJl dHVybiAtRU5PTUVNOwo+ICsKPiArCWJxLT5jbGllbnQgPSBjbGllbnQ7Cj4gKwlicS0+ZGV2ID0g ZGV2OwoKWW91IGRvbid0IG5lZWQgYm90aC4KCj4gKwlicS0+dmFyaWFudCA9IChsb25nKWkyY19n ZXRfbWF0Y2hfZGF0YShjbGllbnQpOwoKUHJldHR5IHN1cmUgdGhpcyBjYXN0IGlzIG5vdCBjb3Jy ZWN0IGFuZCBtYXliZSBub3QgZXZlbiByZXF1aXJlZC4KCj4gKwlzd2l0Y2ggKGJxLT52YXJpYW50 KSB7Cj4gKwljYXNlIEJRMjU3MDNBOgoKSSB3b3VsZG4ndCBhZGQgYWxsIG9mIHRoaXMgY29tcGxl eGl0eSB1bnRpbCBpdHMgbmVlZGVkLgoKPiArCQlicS0+cmVnbWFwX2NmZyA9ICZicTI1NzAzX3Jl Z21hcF9jb25maWc7CgpXaGVyZSBpcyB0aGlzIGNvbnN1bWVkPwoKPiArCQljZWxscyA9IGJxMjU3 MDNfY2VsbHM7Cj4gKwkJbnJfY2VsbHMgPSBBUlJBWV9TSVpFKGJxMjU3MDNfY2VsbHMpOwo+ICsJ CWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlkZXZfZXJyKGRldiwgIlVuc3VwcG9ydGVkIEJRMjU3 WFggSUQgJWxkXG4iLCBicS0+dmFyaWFudCk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4g Kwo+ICsJYnEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgYnEtPnJlZ21h cF9jZmcpOwo+ICsKClJlbW92ZSB0aGlzIGxpbmUuCgo+ICsJaWYgKElTX0VSUihicS0+cmVnbWFw KSkgewo+ICsJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxu Iik7Cj4gKwkJcmV0dXJuIFBUUl9FUlIoYnEtPnJlZ21hcCk7Cj4gKwl9Cj4gKwo+ICsJaTJjX3Nl dF9jbGllbnRkYXRhKGNsaWVudCwgYnEpOwo+ICsKPiArCXJldCA9IGRldm1fbWZkX2FkZF9kZXZp Y2VzKCZjbGllbnQtPmRldiwgUExBVEZPUk1fREVWSURfQVVUTywKPiArCQkJCSAgIGNlbGxzLCBu cl9jZWxscywgTlVMTCwgMCwgTlVMTCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycigmY2xp ZW50LT5kZXYsICJmYWlsZWQgdG8gYWRkIE1GRCBkZXZpY2VzICVkXG4iLCByZXQpOwoKTm8gc3Vj aCB0aGluZy4KCiJGYWlsZWQgdG8gcmVnaXN0ZXIgY2hpbGQgZGV2aWNlcyIKcQo+ICsJCXJldHVy biByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJxMjU3eHhfaTJjX2lkc1tdID0gewo+ICsJeyAiYnEyNTcw M2EiIH0sCj4gKwl7fQo+ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYnEyNTd4eF9p MmNfaWRzKTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJxMjU3eHhf b2ZfbWF0Y2hbXSA9IHsKPiArCXsgLmNvbXBhdGlibGUgPSAidGksYnEyNTcwM2EiLCAuZGF0YSA9 ICh2b2lkICopQlEyNTcwM0EsIH0sCgpDYXN0IGFsbW9zdCBjZXJ0YWlubHkgbm90IHJlcXVpcmVk LgoKPiArCXt9Cj4gK307Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJxMjU3eHhfb2ZfbWF0 Y2gpOwo+ICsKPiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJxMjU3eHhfZHJpdmVyID0gewo+ ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJicTI1N3h4IiwKPiArCQkub2ZfbWF0Y2hfdGFi bGUgPSBicTI1N3h4X29mX21hdGNoLAo+ICsJfSwKPiArCS5wcm9iZSA9IGJxMjU3eHhfcHJvYmUs Cj4gKwkuaWRfdGFibGUgPSBicTI1N3h4X2kyY19pZHMsCj4gK307Cj4gK21vZHVsZV9pMmNfZHJp dmVyKGJxMjU3eHhfZHJpdmVyKTsKPiArCj4gK01PRFVMRV9ERVNDUklQVElPTigiYnEyNTd4eCBi dWNrL2Jvb3N0L2NoYXJnZXIgTUZEIGRyaXZlciIpOwoKTm90IGFuICJNRkQgZHJpdmVyIgoKPiAr TU9EVUxFX0FVVEhPUigiQ2hyaXMgTW9yZ2FuIDxtYWNyb21vcmdhbkBob3RtYWlsLmNvbT4iKTsK PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21m ZC9icTI1N3h4LmggYi9pbmNsdWRlL2xpbnV4L21mZC9icTI1N3h4LmgKPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uNTFmNjUwMWM2NDQxCj4gLS0tIC9kZXYvbnVs bAo+ICsrKyBiL2luY2x1ZGUvbGludXgvbWZkL2JxMjU3eHguaAo+IEBAIC0wLDAgKzEsMTIwIEBA Cj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gKyAqIFJlZ2lzdGVyIGRl ZmluaXRpb25zIGZvciBUSSBCUTI1N1hYCj4gKyAqIEhlYXZpbHkgYmFzZWQgb2ZmIG9mIEJRMjU2 WFggQmF0dGVyeSBDaGFyZ2VyIERyaXZlcgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGV4YXMg SW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCj4gKyAqLwoKQWxs IGFzIGFib3ZlLgoKPiArI2RlZmluZSBCUTI1N1hYX01BTlVGQUNUVVJFUgkJCSJUZXhhcyBJbnN0 cnVtZW50cyIKCkVycnIsIG5vIHRoYW5rIHlvdS4gIEp1c3QgdXNlIHN0cmluZ3Mgd2hlcmUgeW91 IG5lZWQgdGhlbS4KCj4gKyNkZWZpbmUgQlEyNTcwM19DSEFSR0VfT1BUSU9OXzAJCQkweDAwCj4g KyNkZWZpbmUgQlEyNTcwM19DSEFSR0VfQ1VSUkVOVAkJCTB4MDIKPiArI2RlZmluZSBCUTI1NzAz X01BWF9DSEFSR0VfVk9MVAkJCTB4MDQKPiArI2RlZmluZSBCUTI1NzAzX09UR19WT0xUCQkJMHgw Ngo+ICsjZGVmaW5lIEJRMjU3MDNfT1RHX0NVUlJFTlQJCQkweDA4Cj4gKyNkZWZpbmUgQlEyNTcw M19JTlBVVF9WT0xUQUdFCQkJMHgwYQo+ICsjZGVmaW5lIEJRMjU3MDNfTUlOX1ZTWVMJCQkweDBj Cj4gKyNkZWZpbmUgQlEyNTcwM19JSU5fSE9TVAkJCTB4MGUKPiArI2RlZmluZSBCUTI1NzAzX0NI QVJHRVJfU1RBVFVTCQkJMHgyMAo+ICsjZGVmaW5lIEJRMjU3MDNfUFJPQ0hPVF9TVEFUVVMJCQkw eDIyCj4gKyNkZWZpbmUgQlEyNTcwM19JSU5fRFBNCQkJCTB4MjQKPiArI2RlZmluZSBCUTI1NzAz X0FEQ0lCQVRfQ0hHCQkJMHgyOAo+ICsjZGVmaW5lIEJRMjU3MDNfQURDSUlOQ01QSU4JCQkweDJh Cj4gKyNkZWZpbmUgQlEyNTcwM19BRENWU1lTVkJBVAkJCTB4MmMKPiArI2RlZmluZSBCUTI1NzAz X01BTlVGQUNUX0RFVl9JRAkJCTB4MmUKPiArI2RlZmluZSBCUTI1NzAzX0NIQVJHRV9PUFRJT05f MQkJCTB4MzAKPiArI2RlZmluZSBCUTI1NzAzX0NIQVJHRV9PUFRJT05fMgkJCTB4MzIKPiArI2Rl ZmluZSBCUTI1NzAzX0NIQVJHRV9PUFRJT05fMwkJCTB4MzQKPiArI2RlZmluZSBCUTI1NzAzX0FE Q19PUFRJT04JCQkweDNhCj4gKwo+ICsjZGVmaW5lIEJRMjU3MDNfRU5fTFdQV1IJCQlCSVQoMTUp Cj4gKyNkZWZpbmUgQlEyNTcwM19XRFRNUl9BREpfTUFTSwkJCUdFTk1BU0soMTQsIDEzKQo+ICsj ZGVmaW5lIEJRMjU3MDNfV0RUTVJfRElTQUJMRQkJCTAKPiArI2RlZmluZSBCUTI1NzAzX1dEVE1S XzVfU0VDCQkJMQo+ICsjZGVmaW5lIEJRMjU3MDNfV0RUTVJfODhfU0VDCQkJMgo+ICsjZGVmaW5l IEJRMjU3MDNfV0RUTVJfMTc1X1NFQwkJCTMKPiArCj4gKyNkZWZpbmUgQlEyNTcwM19JQ0hHX01B U0sJCQlHRU5NQVNLKDEyLCA2KQo+ICsjZGVmaW5lIEJRMjU3MDNfSUNIR19TVEVQX1VBCQkJNjQw MDAKPiArI2RlZmluZSBCUTI1NzAzX0lDSEdfTUlOX1VBCQkJNjQwMDAKPiArI2RlZmluZSBCUTI1 NzAzX0lDSEdfTUFYX1VBCQkJODEyODAwMAo+ICsKPiArI2RlZmluZSBCUTI1NzAzX01BWF9DSEFS R0VfVk9MVF9NQVNLCQlHRU5NQVNLKDE1LCA0KQo+ICsjZGVmaW5lIEJRMjU3MDNfVkJBVFJFR19T VEVQX1VWCQkJMTYwMDAKPiArI2RlZmluZSBCUTI1NzAzX1ZCQVRSRUdfTUlOX1VWCQkJMTAyNDAw MAo+ICsjZGVmaW5lIEJRMjU3MDNfVkJBVFJFR19NQVhfVVYJCQkxOTIwMDAwMAo+ICsKPiArI2Rl ZmluZSBCUTI1NzAzX09UR19WT0xUX01BU0sJCQlHRU5NQVNLKDEzLCA2KQo+ICsjZGVmaW5lIEJR MjU3MDNfT1RHX1ZPTFRfU1RFUF9VVgkJNjQwMDAKPiArI2RlZmluZSBCUTI1NzAzX09UR19WT0xU X01JTl9VVgkJCTQ0ODAwMDAKPiArI2RlZmluZSBCUTI1NzAzX09UR19WT0xUX01BWF9VVgkJCTIw ODAwMDAwCj4gKyNkZWZpbmUgQlEyNTcwM19PVEdfVk9MVF9OVU1fVk9MVAkJMjU2Cj4gKwo+ICsj ZGVmaW5lIEJRMjU3MDNfT1RHX0NVUl9NQVNLCQkJR0VOTUFTSygxNCwgOCkKPiArI2RlZmluZSBC UTI1NzAzX09UR19DVVJfU1RFUF9VQQkJCTUwMDAwCj4gKyNkZWZpbmUgQlEyNTcwM19PVEdfQ1VS X01BWF9VQQkJCTYzNTAwMDAKPiArCj4gKyNkZWZpbmUgQlEyNTcwM19NSU5WU1lTX01BU0sJCQlH RU5NQVNLKDEzLCA4KQo+ICsjZGVmaW5lIEJRMjU3MDNfTUlOVlNZU19TVEVQX1VWCQkJMjU2MDAw Cj4gKyNkZWZpbmUgQlEyNTcwM19NSU5WU1lTX01JTl9VVgkJCTEwMjQwMDAKPiArI2RlZmluZSBC UTI1NzAzX01JTlZTWVNfTUFYX1VWCQkJMTYxMjgwMDAKPiArCj4gKyNkZWZpbmUgQlEyNTcwM19T VFNfQUNfU1RBVAkJCUJJVCgxNSkKPiArI2RlZmluZSBCUTI1NzAzX1NUU19JTl9GQ0hSRwkJCUJJ VCgxMCkKPiArI2RlZmluZSBCUTI1NzAzX1NUU19JTl9QQ0hSRwkJCUJJVCg5KQo+ICsjZGVmaW5l IEJRMjU3MDNfU1RTX0ZBVUxUX0FDT1YJCQlCSVQoNykKPiArI2RlZmluZSBCUTI1NzAzX1NUU19G QVVMVF9CQVRPQwkJCUJJVCg2KQo+ICsjZGVmaW5lIEJRMjU3MDNfU1RTX0ZBVUxUX0FDT0MJCQlC SVQoNSkKPiArCj4gKyNkZWZpbmUgQlEyNTcwM19JSU5EUE1fTUFTSwkJCUdFTk1BU0soMTQsIDgp Cj4gKyNkZWZpbmUgQlEyNTcwM19JSU5EUE1fU1RFUF9VQQkJCTUwMDAwCj4gKyNkZWZpbmUgQlEy NTcwM19JSU5EUE1fTUlOX1VBCQkJNTAwMDAKPiArI2RlZmluZSBCUTI1NzAzX0lJTkRQTV9NQVhf VUEJCQk2NDAwMDAwCj4gKyNkZWZpbmUgQlEyNTcwM19JSU5EUE1fREVGQVVMVF9VQQkJMzMwMDAw MAo+ICsjZGVmaW5lIEJRMjU3MDNfSUlORFBNX09GRlNFVF9VQQkJNTAwMDAKPiArCj4gKyNkZWZp bmUgQlEyNTcwM19BRENJQkFUX0RJU0NIR19NQVNLCQlHRU5NQVNLKDYsIDApCj4gKyNkZWZpbmUg QlEyNTcwM19BRENJQkFUX0NIR19NQVNLCQlHRU5NQVNLKDE0LCA4KQo+ICsjZGVmaW5lIEJRMjU3 MDNfQURDSUJBVF9DSEdfU1RFUF9VQQkJNjQwMDAKPiArI2RlZmluZSBCUTI1NzAzX0FEQ0lCQVRf RElTX1NURVBfVUEJCTI1NjAwMAo+ICsKPiArI2RlZmluZSBCUTI1NzAzX0FEQ0lJTgkJCQlHRU5N QVNLKDE1LCA4KQo+ICsjZGVmaW5lIEJRMjU3MDNfQURDSUlOQ01QSU5fU1RFUAkJNTAwMDAKPiAr Cj4gKyNkZWZpbmUgQlEyNTcwM19BRENWU1lTX01BU0sJCQlHRU5NQVNLKDE1LCA4KQo+ICsjZGVm aW5lIEJRMjU3MDNfQURDVkJBVF9NQVNLCQkJR0VOTUFTSyg3LCAwKQo+ICsjZGVmaW5lIEJRMjU3 MDNfQURDVlNZU1ZCQVRfT0ZGU0VUX1VWCQkyODgwMDAwCj4gKyNkZWZpbmUgQlEyNTcwM19BRENW U1lTVkJBVF9TVEVQCQk2NDAwMAo+ICsKPiArI2RlZmluZSBCUTI1NzAzX0FEQ19DSF9NQVNLCQkJ R0VOTUFTSyg3LCAwKQo+ICsjZGVmaW5lIEJRMjU3MDNfQURDX0NPTlZfRU4JCQlCSVQoMTUpCj4g KyNkZWZpbmUgQlEyNTcwM19BRENfU1RBUlQJCQlCSVQoMTQpCj4gKyNkZWZpbmUgQlEyNTcwM19B RENfRlVMTF9TQ0FMRQkJCUJJVCgxMykKPiArI2RlZmluZSBCUTI1NzAzX0FEQ19DTVBJTl9FTgkJ CUJJVCg3KQo+ICsjZGVmaW5lIEJRMjU3MDNfQURDX1ZCVVNfRU4JCQlCSVQoNikKPiArI2RlZmlu ZSBCUTI1NzAzX0FEQ19QU1lTX0VOCQkJQklUKDUpCj4gKyNkZWZpbmUgQlEyNTcwM19BRENfSUlO X0VOCQkJQklUKDQpCj4gKyNkZWZpbmUgQlEyNTcwM19BRENfSURDSEdfRU4JCQlCSVQoMykKPiAr I2RlZmluZSBCUTI1NzAzX0FEQ19JQ0hHX0VOCQkJQklUKDIpCj4gKyNkZWZpbmUgQlEyNTcwM19B RENfVlNZU19FTgkJCUJJVCgxKQo+ICsjZGVmaW5lIEJRMjU3MDNfQURDX1ZCQVRfRU4JCQlCSVQo MCkKPiArCj4gKyNkZWZpbmUgQlEyNTcwM19FTl9PVEdfTUFTSwkJCUJJVCgxMikKPiArCj4gK2Vu dW0gYnEyNTd4eF9pZCB7Cj4gKwlCUTI1NzAzQSwKPiArfTsKPiArCj4gKy8qKgoKQXJlIHlvdSBz dXJlIHlvdSB3YW50IHRvIHVzZSBrZXJuZWwtZG9jIGhlcmU/CgpJIHdvdWxkIGFkdmlzZSBhZ2Fp bnN0IGl0LgoKPiArICogc3RydWN0IGJxMjU3eHhfZGV2aWNlIC0KPiArICogQGNsaWVudDogaTJj IGNsaWVudCBzdHJ1Y3R1cmUKPiArICogQHJlZ21hcDogcmVnaXN0ZXIgbWFwIHN0cnVjdHVyZQo+ ICsgKiBAZGV2OiBkZXZpY2Ugc3RydWN0dXJlCj4gKyAqIEByZWdtYXBfY2ZnOiBkZXZpY2Ugc3Bl Y2lmaWMgcmVnbWFwIGNmZwoKSXQncyBhbHNvIHdyb25nLiAgRGlkIHlvdSB0ZXN0IGJ1aWxkIHdp dGggVz0xPwoKPiArICovCj4gK3N0cnVjdCBicTI1N3h4X2RldmljZSB7Cj4gKwlzdHJ1Y3QgaTJj X2NsaWVudCAqY2xpZW50Owo+ICsJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwo+ICsJc3RydWN0IGRl dmljZSAqZGV2Owo+ICsJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcF9jZmc7Cj4g Kwlsb25nIHZhcmlhbnQ7Cj4gK307Cj4gLS0gCj4gMi4zNC4xCj4gCgotLSAKTGVlIEpvbmVzIFvm nY7nkLzmlq9dCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpMaW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LXJvY2tjaGlwCg==