From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E8487FA3744 for ; Mon, 31 Oct 2022 11:01:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230249AbiJaLBC (ORCPT ); Mon, 31 Oct 2022 07:01:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49778 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229787AbiJaLBA (ORCPT ); Mon, 31 Oct 2022 07:01:00 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2BF1865AD; Mon, 31 Oct 2022 04:00:54 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id BEFB9B815DA; Mon, 31 Oct 2022 11:00:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 48F4AC433D6; Mon, 31 Oct 2022 11:00:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667214051; bh=oe52KmRAKiUPs37/+XSeVSdnVohHwzo299SLBQkw8/0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ugI3HBGXaVTd6MUKyBYRaFc4Ig5vhpvNIQUd8qNo9gx9bwn5G302mxGt6mKQzFUnJ l2T00isAU9tioqIazAWFjd3OgZ7ve+IPQddQ5m/BLCgikLdneHZTGvavxvpezcYw+e CForyxzyNIzKTXM9oNL55H2Nrk8CBJPk4P7g8Ig1RnOHTkb5wt98mwzNPW5Jy5M6fD cSkrMtSFaML6HdR2XESXREAY/yxtu9ecFv7ACKJfmKrbrIT4xDieTUGMjOHfVQEpOW BISmBJ5/PHMd/KmYFkVYCYa55t0jFrVtBAm6yyLn2ZxUddpxFbaMEPTiM7wXytmOMi QlUTjfdrEvBDw== Date: Mon, 31 Oct 2022 11:00:41 +0000 From: Lee Jones To: Jerome Neanne Cc: lgirdwood@gmail.com, broonie@kernel.org, robh+dt@kernel.org, nm@ti.com, kristo@kernel.org, dmitry.torokhov@gmail.com, krzysztof.kozlowski+dt@linaro.org, catalin.marinas@arm.com, will@kernel.org, tony@atomide.com, vigneshr@ti.com, bjorn.andersson@linaro.org, shawnguo@kernel.org, geert+renesas@glider.be, dmitry.baryshkov@linaro.org, marcel.ziswiler@toradex.com, vkoul@kernel.org, biju.das.jz@bp.renesas.com, arnd@arndb.de, jeff@labundy.com, afd@ti.com, khilman@baylibre.com, narmstrong@baylibre.com, msp@baylibre.com, j-keerthy@ti.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-input@vger.kernel.org, linux-omap@vger.kernel.org Subject: Re: [PATCH v6 4/6] mfd: tps65219: Add driver for TI TPS65219 PMIC Message-ID: References: <20221011140549.16761-1-jneanne@baylibre.com> <20221011140549.16761-5-jneanne@baylibre.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20221011140549.16761-5-jneanne@baylibre.com> Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org On Tue, 11 Oct 2022, Jerome Neanne wrote: > The TPS65219 is a power management IC PMIC designed to supply a wide > range of SoCs in both portable and stationary applications. Any SoC can > control TPS65219 over a standard I2C interface. > > It contains the following components: > - Regulators. > - Over Temperature warning and Shut down. > - GPIOs > - Multi Function Pins (MFP) > - power-button > > This patch adds support for tps65219 PMIC. At this time only > the functionalities listed below are made available: > > - Regulators probe and functionalities > - warm and cold reset support > - SW shutdown support > - Regulator warnings via IRQs > - Power-button via IRQ > > Signed-off-by: Jerome Neanne > Signed-off-by: Markus Schneider-Pargmann > --- v6 and no change-log? Please ensure you keep a change-log here in the future. Else reviewers are essentially forced to conduct full reviews over and over. > MAINTAINERS | 1 + > drivers/mfd/Kconfig | 14 ++ > drivers/mfd/Makefile | 1 + > drivers/mfd/tps65219.c | 320 ++++++++++++++++++++++++++++++++ > include/linux/mfd/tps65219.h | 345 +++++++++++++++++++++++++++++++++++ > 5 files changed, 681 insertions(+) > create mode 100644 drivers/mfd/tps65219.c > create mode 100644 include/linux/mfd/tps65219.h Just a few nits going forward. It's shaping up nicely. Once fixed, please submit with this added: For my own reference (apply this as-is to your sign-off block): Acked-for-MFD-by: Lee Jones > diff --git a/MAINTAINERS b/MAINTAINERS > index 14edacfeb1d4..f89e77959536 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -14931,6 +14931,7 @@ F: drivers/mfd/menelaus.c > F: drivers/mfd/palmas.c > F: drivers/mfd/tps65217.c > F: drivers/mfd/tps65218.c > +F: drivers/mfd/tps65219.c > F: drivers/mfd/tps65910.c > F: drivers/mfd/twl-core.[ch] > F: drivers/mfd/twl4030*.c > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index abb58ab1a1a4..1a846c7dd0c2 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -1576,6 +1576,20 @@ config MFD_TPS65218 > This driver can also be built as a module. If so, the module > will be called tps65218. > > +config MFD_TPS65219 > + tristate "TI TPS65219 Power Management IC" > + depends on I2C && OF > + select MFD_CORE > + select REGMAP_I2C > + select REGMAP_IRQ > + help > + If you say yes here you get support for the TPS65219 series of Power > + Management ICs. These include voltage regulators, GPIOs and > + push/power button that are often used in portable devices. Nit: buttons > + This driver can also be built as a module. If so, the module > + will be called tps65219. > + > config MFD_TPS6586X > bool "TI TPS6586x Power Management chips" > depends on I2C=y > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 858cacf659d6..a8ff3d6ea3ab 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -101,6 +101,7 @@ obj-$(CONFIG_TPS6507X) += tps6507x.o > obj-$(CONFIG_MFD_TPS65086) += tps65086.o > obj-$(CONFIG_MFD_TPS65217) += tps65217.o > obj-$(CONFIG_MFD_TPS65218) += tps65218.o > +obj-$(CONFIG_MFD_TPS65219) += tps65219.o > obj-$(CONFIG_MFD_TPS65910) += tps65910.o > obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o > obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o > diff --git a/drivers/mfd/tps65219.c b/drivers/mfd/tps65219.c > new file mode 100644 > index 000000000000..c1638483e069 > --- /dev/null > +++ b/drivers/mfd/tps65219.c > @@ -0,0 +1,320 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +// Driver for TPS65219 Integrated Power Management Integrated Chips (PMIC) > +// > +// Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +static int tps65219_warm_reset(struct tps65219 *tps) > +{ > + return regmap_update_bits(tps->regmap, TPS65219_REG_MFP_CTRL, > + TPS65219_MFP_WARM_RESET_I2C_CTRL_MASK, > + TPS65219_MFP_WARM_RESET_I2C_CTRL_MASK); > +} > + > +static int tps65219_cold_reset(struct tps65219 *tps) > +{ > + return regmap_update_bits(tps->regmap, TPS65219_REG_MFP_CTRL, > + TPS65219_MFP_COLD_RESET_I2C_CTRL_MASK, > + TPS65219_MFP_COLD_RESET_I2C_CTRL_MASK); > +} > + > +static int tps65219_soft_shutdown(struct tps65219 *tps) > +{ > + return regmap_update_bits(tps->regmap, TPS65219_REG_MFP_CTRL, > + TPS65219_MFP_I2C_OFF_REQ_MASK, > + TPS65219_MFP_I2C_OFF_REQ_MASK); > +} > + > +static int tps65219_restart(struct notifier_block *this, > + unsigned long reboot_mode, void *cmd) > +{ > + struct tps65219 *tps; > + > + tps = container_of(this, struct tps65219, nb); > + if (!tps) { > + pr_err("tps65219: Restarting failed because the pointer to tps65219 is invalid\n"); > + return -ENODEV; > + } Nit: '\n' > + if (reboot_mode == REBOOT_WARM) > + tps65219_warm_reset(tps); > + else > + tps65219_cold_reset(tps); Nit: '\n' > + return NOTIFY_DONE; > +} > + > +static struct notifier_block pmic_rst_restart_nb = { > + .notifier_call = tps65219_restart, > + .priority = 200, > +}; > + > +static const struct resource tps65219_pwrbutton_resources[] = { > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_PB_FALLING_EDGE_DETECT, "falling"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_PB_RISING_EDGE_DETECT, "rising"), > +}; > + > +static const struct resource tps65219_regulator_resources[] = { > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_SCG, "LDO3_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_OC, "LDO3_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_UV, "LDO3_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO4_SCG, "LDO4_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO4_OC, "LDO4_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO4_UV, "LDO4_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_SCG, "LDO1_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_OC, "LDO1_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_UV, "LDO1_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_SCG, "LDO2_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_OC, "LDO2_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_UV, "LDO2_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_SCG, "BUCK3_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_OC, "BUCK3_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_NEG_OC, "BUCK3_NEG_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_UV, "BUCK3_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_SCG, "BUCK1_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_OC, "BUCK1_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_NEG_OC, "BUCK1_NEG_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_UV, "BUCK1_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_SCG, "BUCK2_SCG"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_OC, "BUCK2_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_NEG_OC, "BUCK2_NEG_OC"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_UV, "BUCK2_UV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_RV, "BUCK1_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_RV, "BUCK2_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_RV, "BUCK3_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_RV, "LDO1_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_RV, "LDO2_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_RV, "LDO3_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO4_RV, "LDO4_RV"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_RV_SD, "BUCK1_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_RV_SD, "BUCK2_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_RV_SD, "BUCK3_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_RV_SD, "LDO1_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_RV_SD, "LDO2_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_RV_SD, "LDO3_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO4_RV_SD, "LDO4_RV_SD"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_TIMEOUT, "TIMEOUT"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_3_WARM, "SENSOR_3_WARM"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_2_WARM, "SENSOR_2_WARM"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_1_WARM, "SENSOR_1_WARM"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_WARM, "SENSOR_0_WARM"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_3_HOT, "SENSOR_3_HOT"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_2_HOT, "SENSOR_2_HOT"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_1_HOT, "SENSOR_1_HOT"), > + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_HOT, "SENSOR_0_HOT"), > +}; > + > +static const struct mfd_cell tps65219_cells[] = { > + { > + .name = "tps65219-regulator", > + .resources = tps65219_regulator_resources, > + .num_resources = ARRAY_SIZE(tps65219_regulator_resources), > + }, { > + .name = "tps65219-gpios", > + }, Nit: Like this please: { .name = "tps65219-gpios", }, > +}; > + > +static const struct mfd_cell tps65219_pwrbutton_cell = { > + .name = "tps65219-pwrbutton", > + .resources = tps65219_pwrbutton_resources, > + .num_resources = ARRAY_SIZE(tps65219_pwrbutton_resources), > +}; > + > +static const struct regmap_config tps65219_regmap_config = { > + .reg_bits = 8, > + .val_bits = 8, > + .max_register = TPS65219_REG_FACTORY_CONFIG_2, > +}; > + > +/* > + * Mapping of main IRQ register bits to sub-IRQ register offsets so that we can > + * access corect sub-IRQ registers based on bits that are set in main IRQ > + * register. > + */ > +/* Timeout Residual Voltage Shutdown */ > +static unsigned int bit0_offsets[] = { TPS65219_REG_INT_TO_RV_POS }; > +static unsigned int bit1_offsets[] = { TPS65219_REG_INT_RV_POS }; /* Residual Voltage */ > +static unsigned int bit2_offsets[] = { TPS65219_REG_INT_SYS_POS }; /* System */ > +static unsigned int bit3_offsets[] = { TPS65219_REG_INT_BUCK_1_2_POS }; /* Buck 1-2 */ > +static unsigned int bit4_offsets[] = { TPS65219_REG_INT_BUCK_3_POS }; /* Buck 3 */ > +static unsigned int bit5_offsets[] = { TPS65219_REG_INT_LDO_1_2_POS }; /* LDO 1-2 */ > +static unsigned int bit6_offsets[] = { TPS65219_REG_INT_LDO_3_4_POS }; /* LDO 3-4 */ > +static unsigned int bit7_offsets[] = { TPS65219_REG_INT_PB_POS }; /* Power Button */ > + > +static struct regmap_irq_sub_irq_map tps65219_sub_irq_offsets[] = { > + REGMAP_IRQ_MAIN_REG_OFFSET(bit0_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit1_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit2_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit3_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit4_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit5_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit6_offsets), > + REGMAP_IRQ_MAIN_REG_OFFSET(bit7_offsets), > +}; > + > +#define TPS65219_REGMAP_IRQ_REG(int_name, register_position) \ > + REGMAP_IRQ_REG(int_name, register_position, int_name##_MASK) > + > +static struct regmap_irq tps65219_irqs[] = { > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO3_SCG, TPS65219_REG_INT_LDO_3_4_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO3_OC, TPS65219_REG_INT_LDO_3_4_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO3_UV, TPS65219_REG_INT_LDO_3_4_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO4_SCG, TPS65219_REG_INT_LDO_3_4_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO4_OC, TPS65219_REG_INT_LDO_3_4_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO4_UV, TPS65219_REG_INT_LDO_3_4_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_SCG, TPS65219_REG_INT_LDO_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_OC, TPS65219_REG_INT_LDO_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_UV, TPS65219_REG_INT_LDO_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_SCG, TPS65219_REG_INT_LDO_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_OC, TPS65219_REG_INT_LDO_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_UV, TPS65219_REG_INT_LDO_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_SCG, TPS65219_REG_INT_BUCK_3_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_OC, TPS65219_REG_INT_BUCK_3_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_NEG_OC, TPS65219_REG_INT_BUCK_3_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_UV, TPS65219_REG_INT_BUCK_3_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_SCG, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_OC, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_NEG_OC, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_UV, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_SCG, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_OC, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_NEG_OC, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_UV, TPS65219_REG_INT_BUCK_1_2_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_3_WARM, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_2_WARM, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_1_WARM, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_0_WARM, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_3_HOT, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_2_HOT, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_1_HOT, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_0_HOT, TPS65219_REG_INT_SYS_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO3_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO4_RV, TPS65219_REG_INT_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO3_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO4_RV_SD, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_TIMEOUT, TPS65219_REG_INT_TO_RV_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_FALLING_EDGE_DETECT, TPS65219_REG_INT_PB_POS), > + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_RISING_EDGE_DETECT, TPS65219_REG_INT_PB_POS), > +}; > + > +static struct regmap_irq_chip tps65219_irq_chip = { > + .name = "tps65219_irq", > + .main_status = TPS65219_REG_INT_SOURCE, > + .num_main_regs = 1, > + .num_main_status_bits = 8, > + .irqs = tps65219_irqs, > + .num_irqs = ARRAY_SIZE(tps65219_irqs), > + .status_base = TPS65219_REG_INT_LDO_3_4, > + .ack_base = TPS65219_REG_INT_LDO_3_4, > + .clear_ack = 1, > + .num_regs = 8, > + .sub_reg_offsets = tps65219_sub_irq_offsets, > +}; > + > +static int tps65219_probe(struct i2c_client *client) > +{ > + struct tps65219 *tps; > + unsigned int chipid; > + bool pwr_button; > + int ret; > + > + tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); > + if (!tps) > + return -ENOMEM; > + > + i2c_set_clientdata(client, tps); > + > + tps->dev = &client->dev; > + > + tps->regmap = devm_regmap_init_i2c(client, &tps65219_regmap_config); > + if (IS_ERR(tps->regmap)) { > + ret = PTR_ERR(tps->regmap); > + dev_err(tps->dev, "Failed to allocate register map: %d\n", ret); > + return ret; > + } > + > + ret = devm_regmap_add_irq_chip(&client->dev, tps->regmap, client->irq, > + IRQF_ONESHOT, 0, &tps65219_irq_chip, > + &tps->irq_data); > + if (ret) > + return ret; > + > + ret = regmap_read(tps->regmap, TPS65219_REG_TI_DEV_ID, &chipid); > + if (ret) { > + dev_err(tps->dev, "Failed to read device ID: %d\n", ret); > + return ret; > + } > + > + ret = devm_mfd_add_devices(tps->dev, PLATFORM_DEVID_AUTO, > + tps65219_cells, ARRAY_SIZE(tps65219_cells), > + NULL, 0, regmap_irq_get_domain(tps->irq_data)); > + if (ret) { > + dev_err(tps->dev, "Failed to add child devices: %d\n", ret); > + return ret; > + } > + > + pwr_button = of_property_read_bool(tps->dev->of_node, "ti,power-button"); > + if (pwr_button) { > + ret = devm_mfd_add_devices(tps->dev, PLATFORM_DEVID_AUTO, > + &tps65219_pwrbutton_cell, 1, NULL, 0, > + regmap_irq_get_domain(tps->irq_data)); > + if (ret) { > + dev_err(tps->dev, "Failed to add power-button: %d\n", ret); > + return ret; > + } > + } > + > + tps->nb = pmic_rst_restart_nb; > + ret = register_restart_handler(&tps->nb); > + if (ret) { > + dev_err(tps->dev, "cannot register restart handler, %d\n", ret); > + return ret; > + } > + > + return 0; > +} > + > +static const struct of_device_id of_tps65219_match_table[] = { > + { .compatible = "ti,tps65219", }, > + {} > +}; > +MODULE_DEVICE_TABLE(of, of_tps65219_match_table); > + > +static struct i2c_driver tps65219_driver = { > + .driver = { > + .name = "tps65219", > + .of_match_table = of_tps65219_match_table, > + }, > + .probe_new = tps65219_probe, > +}; > +module_i2c_driver(tps65219_driver); > + > +MODULE_AUTHOR("Jerome Neanne "); > +MODULE_DESCRIPTION("TPS65219 power management IC driver"); > +MODULE_LICENSE("GPL"); > diff --git a/include/linux/mfd/tps65219.h b/include/linux/mfd/tps65219.h > new file mode 100644 > index 000000000000..2c1cf92e92ac > --- /dev/null > +++ b/include/linux/mfd/tps65219.h > @@ -0,0 +1,345 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Functions to access TPS65219 power management IC. Nit: Power Management IC > + * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/ > + */ > + > +#ifndef MFD_TPS65219_H > +#define MFD_TPS65219_H > + > +#include > +#include > +#include > + > +struct regmap; > +struct regmap_irq_chip_data; > + > +#define TPS65219_1V35 1350000 > +#define TPS65219_1V8 1800000 > + > +/* TPS chip id list */ > +#define TPS65219 0xF0 > + > +/* I2C ID for TPS65219 part */ > +#define TPS65219_I2C_ID 0x24 > + > +/* All register addresses */ > +#define TPS65219_REG_TI_DEV_ID 0x00 > +#define TPS65219_REG_NVM_ID 0x01 > +#define TPS65219_REG_ENABLE_CTRL 0x02 > +#define TPS65219_REG_BUCKS_CONFIG 0x03 > +#define TPS65219_REG_LDO4_VOUT 0x04 > +#define TPS65219_REG_LDO3_VOUT 0x05 > +#define TPS65219_REG_LDO2_VOUT 0x06 > +#define TPS65219_REG_LDO1_VOUT 0x07 > +#define TPS65219_REG_BUCK3_VOUT 0x8 > +#define TPS65219_REG_BUCK2_VOUT 0x9 > +#define TPS65219_REG_BUCK1_VOUT 0xA > +#define TPS65219_REG_LDO4_SEQUENCE_SLOT 0xB > +#define TPS65219_REG_LDO3_SEQUENCE_SLOT 0xC > +#define TPS65219_REG_LDO2_SEQUENCE_SLOT 0xD > +#define TPS65219_REG_LDO1_SEQUENCE_SLOT 0xE > +#define TPS65219_REG_BUCK3_SEQUENCE_SLOT 0xF > +#define TPS65219_REG_BUCK2_SEQUENCE_SLOT 0x10 > +#define TPS65219_REG_BUCK1_SEQUENCE_SLOT 0x11 > +#define TPS65219_REG_nRST_SEQUENCE_SLOT 0x12 > +#define TPS65219_REG_GPIO_SEQUENCE_SLOT 0x13 > +#define TPS65219_REG_GPO2_SEQUENCE_SLOT 0x14 > +#define TPS65219_REG_GPO1_SEQUENCE_SLOT 0x15 > +#define TPS65219_REG_POWER_UP_SLOT_DURATION_1 0x16 > +#define TPS65219_REG_POWER_UP_SLOT_DURATION_2 0x17 > +#define TPS65219_REG_POWER_UP_SLOT_DURATION_3 0x18 > +#define TPS65219_REG_POWER_UP_SLOT_DURATION_4 0x19 > +#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_1 0x1A > +#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_2 0x1B > +#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_3 0x1C > +#define TPS65219_REG_POWER_DOWN_SLOT_DURATION_4 0x1D > +#define TPS65219_REG_GENERAL_CONFIG 0x1E > +#define TPS65219_REG_MFP_1_CONFIG 0x1F > +#define TPS65219_REG_MFP_2_CONFIG 0x20 > +#define TPS65219_REG_STBY_1_CONFIG 0x21 > +#define TPS65219_REG_STBY_2_CONFIG 0x22 > +#define TPS65219_REG_OC_DEGL_CONFIG 0x23 > +/* 'sub irq' MASK registers */ > +#define TPS65219_REG_INT_MASK_UV 0x24 > +#define TPS65219_REG_MASK_CONFIG 0x25 > + > +#define TPS65219_REG_I2C_ADDRESS_REG 0x26 > +#define TPS65219_REG_USER_GENERAL_NVM_STORAGE 0x27 > +#define TPS65219_REG_MANUFACTURING_VER 0x28 > +#define TPS65219_REG_MFP_CTRL 0x29 > +#define TPS65219_REG_DISCHARGE_CONFIG 0x2A > +/* main irq registers */ > +#define TPS65219_REG_INT_SOURCE 0x2B > +/* 'sub irq' registers */ > +#define TPS65219_REG_INT_LDO_3_4 0x2C > +#define TPS65219_REG_INT_LDO_1_2 0x2D > +#define TPS65219_REG_INT_BUCK_3 0x2E > +#define TPS65219_REG_INT_BUCK_1_2 0x2F > +#define TPS65219_REG_INT_SYSTEM 0x30 > +#define TPS65219_REG_INT_RV 0x31 > +#define TPS65219_REG_INT_TIMEOUT_RV_SD 0x32 > +#define TPS65219_REG_INT_PB 0x33 > + > +#define TPS65219_REG_INT_LDO_3_4_POS 0 > +#define TPS65219_REG_INT_LDO_1_2_POS 1 > +#define TPS65219_REG_INT_BUCK_3_POS 2 > +#define TPS65219_REG_INT_BUCK_1_2_POS 3 > +#define TPS65219_REG_INT_SYS_POS 4 > +#define TPS65219_REG_INT_RV_POS 5 > +#define TPS65219_REG_INT_TO_RV_POS 6 > +#define TPS65219_REG_INT_PB_POS 7 > + > +#define TPS65219_REG_USER_NVM_CMD 0x34 > +#define TPS65219_REG_POWER_UP_STATUS 0x35 > +#define TPS65219_REG_SPARE_2 0x36 > +#define TPS65219_REG_SPARE_3 0x37 > +#define TPS65219_REG_FACTORY_CONFIG_2 0x41 > + > +/* Register field definitions */ > +#define TPS65219_DEVID_REV_MASK GENMASK(7, 0) > +#define TPS65219_BUCKS_LDOS_VOUT_VSET_MASK GENMASK(5, 0) > +#define TPS65219_BUCKS_UV_THR_SEL_MASK BIT(6) > +#define TPS65219_BUCKS_BW_SEL_MASK BIT(7) > +#define LDO_BYP_SHIFT 6 > +#define TPS65219_LDOS_BYP_CONFIG_MASK BIT(LDO_BYP_SHIFT) > +#define TPS65219_LDOS_LSW_CONFIG_MASK BIT(7) > +/* Regulators enable control */ > +#define TPS65219_ENABLE_BUCK1_EN_MASK BIT(0) > +#define TPS65219_ENABLE_BUCK2_EN_MASK BIT(1) > +#define TPS65219_ENABLE_BUCK3_EN_MASK BIT(2) > +#define TPS65219_ENABLE_LDO1_EN_MASK BIT(3) > +#define TPS65219_ENABLE_LDO2_EN_MASK BIT(4) > +#define TPS65219_ENABLE_LDO3_EN_MASK BIT(5) > +#define TPS65219_ENABLE_LDO4_EN_MASK BIT(6) > +/* power ON-OFF sequence slot */ > +#define TPS65219_BUCKS_LDOS_SEQUENCE_OFF_SLOT_MASK GENMASK(3, 0) > +#define TPS65219_BUCKS_LDOS_SEQUENCE_ON_SLOT_MASK GENMASK(7, 4) > +/* TODO: Not needed, same mapping as TPS65219_ENABLE_REGNAME_EN, factorize */ > +#define TPS65219_STBY1_BUCK1_STBY_EN_MASK BIT(0) > +#define TPS65219_STBY1_BUCK2_STBY_EN_MASK BIT(1) > +#define TPS65219_STBY1_BUCK3_STBY_EN_MASK BIT(2) > +#define TPS65219_STBY1_LDO1_STBY_EN_MASK BIT(3) > +#define TPS65219_STBY1_LDO2_STBY_EN_MASK BIT(4) > +#define TPS65219_STBY1_LDO3_STBY_EN_MASK BIT(5) > +#define TPS65219_STBY1_LDO4_STBY_EN_MASK BIT(6) > +/* STBY_2 config */ > +#define TPS65219_STBY2_GPO1_STBY_EN_MASK BIT(0) > +#define TPS65219_STBY2_GPO2_STBY_EN_MASK BIT(1) > +#define TPS65219_STBY2_GPIO_STBY_EN_MASK BIT(2) > +/* MFP Control */ > +#define TPS65219_MFP_I2C_OFF_REQ_MASK BIT(0) > +#define TPS65219_MFP_STBY_I2C_CTRL_MASK BIT(1) > +#define TPS65219_MFP_COLD_RESET_I2C_CTRL_MASK BIT(2) > +#define TPS65219_MFP_WARM_RESET_I2C_CTRL_MASK BIT(3) > +#define TPS65219_MFP_GPIO_STATUS_MASK BIT(4) > +/* MFP_1 Config */ > +#define TPS65219_MFP_1_VSEL_DDR_SEL_MASK BIT(0) > +#define TPS65219_MFP_1_VSEL_SD_POL_MASK BIT(1) > +#define TPS65219_MFP_1_VSEL_RAIL_MASK BIT(2) > +/* MFP_2 Config */ > +#define TPS65219_MFP_2_MODE_STBY_MASK GENMASK(1, 0) > +#define TPS65219_MFP_2_MODE_RESET_MASK BIT(2) > +#define TPS65219_MFP_2_EN_PB_VSENSE_DEGL_MASK BIT(3) > +#define TPS65219_MFP_2_EN_PB_VSENSE_MASK GENMASK(5, 4) > +#define TPS65219_MFP_2_WARM_COLD_RESET_MASK BIT(6) > +#define TPS65219_MFP_2_PU_ON_FSD_MASK BIT(7) > +#define TPS65219_MFP_2_EN 0 > +#define TPS65219_MFP_2_PB BIT(4) > +#define TPS65219_MFP_2_VSENSE BIT(5) > +/* MASK_UV Config */ > +#define TPS65219_REG_MASK_UV_LDO1_UV_MASK BIT(0) > +#define TPS65219_REG_MASK_UV_LDO2_UV_MASK BIT(1) > +#define TPS65219_REG_MASK_UV_LDO3_UV_MASK BIT(2) > +#define TPS65219_REG_MASK_UV_LDO4_UV_MASK BIT(3) > +#define TPS65219_REG_MASK_UV_BUCK1_UV_MASK BIT(4) > +#define TPS65219_REG_MASK_UV_BUCK2_UV_MASK BIT(5) > +#define TPS65219_REG_MASK_UV_BUCK3_UV_MASK BIT(6) > +#define TPS65219_REG_MASK_UV_RETRY_MASK BIT(7) > +/* MASK Config */ > +// SENSOR_N_WARM_MASK already defined in Thermal > +#define TPS65219_REG_MASK_INT_FOR_RV_MASK BIT(4) > +#define TPS65219_REG_MASK_EFFECT_MASK GENMASK(2, 1) > +#define TPS65219_REG_MASK_INT_FOR_PB_MASK BIT(7) > +/* UnderVoltage - Short to GND - OverCurrent*/ > +/* LDO3-4 */ > +#define TPS65219_INT_LDO3_SCG_MASK BIT(0) > +#define TPS65219_INT_LDO3_OC_MASK BIT(1) > +#define TPS65219_INT_LDO3_UV_MASK BIT(2) > +#define TPS65219_INT_LDO4_SCG_MASK BIT(3) > +#define TPS65219_INT_LDO4_OC_MASK BIT(4) > +#define TPS65219_INT_LDO4_UV_MASK BIT(5) > +/* LDO1-2 */ > +#define TPS65219_INT_LDO1_SCG_MASK BIT(0) > +#define TPS65219_INT_LDO1_OC_MASK BIT(1) > +#define TPS65219_INT_LDO1_UV_MASK BIT(2) > +#define TPS65219_INT_LDO2_SCG_MASK BIT(3) > +#define TPS65219_INT_LDO2_OC_MASK BIT(4) > +#define TPS65219_INT_LDO2_UV_MASK BIT(5) > +/* BUCK3 */ > +#define TPS65219_INT_BUCK3_SCG_MASK BIT(0) > +#define TPS65219_INT_BUCK3_OC_MASK BIT(1) > +#define TPS65219_INT_BUCK3_NEG_OC_MASK BIT(2) > +#define TPS65219_INT_BUCK3_UV_MASK BIT(3) > +/* BUCK1-2 */ > +#define TPS65219_INT_BUCK1_SCG_MASK BIT(0) > +#define TPS65219_INT_BUCK1_OC_MASK BIT(1) > +#define TPS65219_INT_BUCK1_NEG_OC_MASK BIT(2) > +#define TPS65219_INT_BUCK1_UV_MASK BIT(3) > +#define TPS65219_INT_BUCK2_SCG_MASK BIT(4) > +#define TPS65219_INT_BUCK2_OC_MASK BIT(5) > +#define TPS65219_INT_BUCK2_NEG_OC_MASK BIT(6) > +#define TPS65219_INT_BUCK2_UV_MASK BIT(7) > +/* Thermal Sensor */ > +#define TPS65219_INT_SENSOR_3_WARM_MASK BIT(0) > +#define TPS65219_INT_SENSOR_2_WARM_MASK BIT(1) > +#define TPS65219_INT_SENSOR_1_WARM_MASK BIT(2) > +#define TPS65219_INT_SENSOR_0_WARM_MASK BIT(3) > +#define TPS65219_INT_SENSOR_3_HOT_MASK BIT(4) > +#define TPS65219_INT_SENSOR_2_HOT_MASK BIT(5) > +#define TPS65219_INT_SENSOR_1_HOT_MASK BIT(6) > +#define TPS65219_INT_SENSOR_0_HOT_MASK BIT(7) > +/* Residual Voltage */ > +#define TPS65219_INT_BUCK1_RV_MASK BIT(0) > +#define TPS65219_INT_BUCK2_RV_MASK BIT(1) > +#define TPS65219_INT_BUCK3_RV_MASK BIT(2) > +#define TPS65219_INT_LDO1_RV_MASK BIT(3) > +#define TPS65219_INT_LDO2_RV_MASK BIT(4) > +#define TPS65219_INT_LDO3_RV_MASK BIT(5) > +#define TPS65219_INT_LDO4_RV_MASK BIT(6) > +/* Residual Voltage ShutDown */ > +#define TPS65219_INT_BUCK1_RV_SD_MASK BIT(0) > +#define TPS65219_INT_BUCK2_RV_SD_MASK BIT(1) > +#define TPS65219_INT_BUCK3_RV_SD_MASK BIT(2) > +#define TPS65219_INT_LDO1_RV_SD_MASK BIT(3) > +#define TPS65219_INT_LDO2_RV_SD_MASK BIT(4) > +#define TPS65219_INT_LDO3_RV_SD_MASK BIT(5) > +#define TPS65219_INT_LDO4_RV_SD_MASK BIT(6) > +#define TPS65219_INT_TIMEOUT_MASK BIT(7) > +/* Power Button */ > +#define TPS65219_INT_PB_FALLING_EDGE_DETECT_MASK BIT(0) > +#define TPS65219_INT_PB_RISING_EDGE_DETECT_MASK BIT(1) > +#define TPS65219_INT_PB_REAL_TIME_STATUS_MASK BIT(2) > + > +#define TPS65219_PB_POS 7 > +#define TPS65219_TO_RV_POS 6 > +#define TPS65219_RV_POS 5 > +#define TPS65219_SYS_POS 4 > +#define TPS65219_BUCK_1_2_POS 3 > +#define TPS65219_BUCK_3_POS 2 > +#define TPS65219_LDO_1_2_POS 1 > +#define TPS65219_LDO_3_4_POS 0 > + > +/* IRQs */ > +enum { > + /* LDO3-4 register IRQs */ > + TPS65219_INT_LDO3_SCG, > + TPS65219_INT_LDO3_OC, > + TPS65219_INT_LDO3_UV, > + TPS65219_INT_LDO4_SCG, > + TPS65219_INT_LDO4_OC, > + TPS65219_INT_LDO4_UV, > + /* LDO1-2 */ > + TPS65219_INT_LDO1_SCG, > + TPS65219_INT_LDO1_OC, > + TPS65219_INT_LDO1_UV, > + TPS65219_INT_LDO2_SCG, > + TPS65219_INT_LDO2_OC, > + TPS65219_INT_LDO2_UV, > + /* BUCK3 */ > + TPS65219_INT_BUCK3_SCG, > + TPS65219_INT_BUCK3_OC, > + TPS65219_INT_BUCK3_NEG_OC, > + TPS65219_INT_BUCK3_UV, > + /* BUCK1-2 */ > + TPS65219_INT_BUCK1_SCG, > + TPS65219_INT_BUCK1_OC, > + TPS65219_INT_BUCK1_NEG_OC, > + TPS65219_INT_BUCK1_UV, > + TPS65219_INT_BUCK2_SCG, > + TPS65219_INT_BUCK2_OC, > + TPS65219_INT_BUCK2_NEG_OC, > + TPS65219_INT_BUCK2_UV, > + /* Thermal Sensor */ > + TPS65219_INT_SENSOR_3_WARM, > + TPS65219_INT_SENSOR_2_WARM, > + TPS65219_INT_SENSOR_1_WARM, > + TPS65219_INT_SENSOR_0_WARM, > + TPS65219_INT_SENSOR_3_HOT, > + TPS65219_INT_SENSOR_2_HOT, > + TPS65219_INT_SENSOR_1_HOT, > + TPS65219_INT_SENSOR_0_HOT, > + /* Residual Voltage */ > + TPS65219_INT_BUCK1_RV, > + TPS65219_INT_BUCK2_RV, > + TPS65219_INT_BUCK3_RV, > + TPS65219_INT_LDO1_RV, > + TPS65219_INT_LDO2_RV, > + TPS65219_INT_LDO3_RV, > + TPS65219_INT_LDO4_RV, > + /* Residual Voltage ShutDown */ > + TPS65219_INT_BUCK1_RV_SD, > + TPS65219_INT_BUCK2_RV_SD, > + TPS65219_INT_BUCK3_RV_SD, > + TPS65219_INT_LDO1_RV_SD, > + TPS65219_INT_LDO2_RV_SD, > + TPS65219_INT_LDO3_RV_SD, > + TPS65219_INT_LDO4_RV_SD, > + TPS65219_INT_TIMEOUT, > + /* Power Button */ > + TPS65219_INT_PB_FALLING_EDGE_DETECT, > + TPS65219_INT_PB_RISING_EDGE_DETECT, > +}; > + > +enum tps65219_regulator_id { > + /* DCDC's */ > + TPS65219_BUCK_1, > + TPS65219_BUCK_2, > + TPS65219_BUCK_3, > + /* LDOs */ > + TPS65219_LDO_1, > + TPS65219_LDO_2, > + TPS65219_LDO_3, > + TPS65219_LDO_4, > +}; > + > +/* Number of step-down converters available */ > +#define TPS65219_NUM_DCDC 3 > +/* Number of LDO voltage regulators available */ > +#define TPS65219_NUM_LDO 4 > +/* Number of total regulators available */ > +#define TPS65219_NUM_REGULATOR (TPS65219_NUM_DCDC + TPS65219_NUM_LDO) > + > +/* Define the TPS65219 IRQ numbers */ > +enum tps65219_irqs { > + /* INT source registers */ > + TPS65219_TO_RV_SD_SET_IRQ, > + TPS65219_RV_SET_IRQ, > + TPS65219_SYS_SET_IRQ, > + TPS65219_BUCK_1_2_SET_IRQ, > + TPS65219_BUCK_3_SET_IRQ, > + TPS65219_LDO_1_2_SET_IRQ, > + TPS65219_LDO_3_4_SET_IRQ, > + TPS65219_PB_SET_IRQ, > +}; > + > +/** > + * struct tps65219 - tps65219 sub-driver chip access routines > + * > + * Device data may be used to access the TPS65219 chip > + * > + * @dev MFD device > + * @regmap Regmap for accessing the device registers > + * @irq_data Regmap irq data used for the irq chip > + * @nb notifier block for the restart handler > + */ This header needs work. Can you try an compile with W=1 please. > +struct tps65219 { > + struct device *dev; > + struct regmap *regmap; > + > + struct regmap_irq_chip_data *irq_data; > + struct notifier_block nb; > +}; > + > +#endif /* MFD_TPS65219_H */ Superfluous " ". -- 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 49D5AC38A02 for ; Mon, 31 Oct 2022 11:02:24 +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=N/dhuemRoORWKFT78k7RUfNyA3o1T6C4SS3J97frGqc=; b=WIzwhUukfAYyTA BgeS+7tNhj6AaiJVHeLqqBMKpkL9ZMWuDWaVLZHOntr84t1M+shaOG9pwqKHOX/ihNWQu/LL+aRBY mvfaPNiTO5i8TRgZ3MCmGZLufWRK3OFSVdBtARRWGgyiOcue7hsb1J3z8UlricsivSRd6vza11Ai6 4/0xFBUYGbADczShh6OM+5JoR5BR0RR36346mMpDWbrLcjhBc0Go2ot3AdbBnjheDqhKxWvSq8d+O UKN9SHfl/PGrwKD+G3OFV3JBRHvXeCA+H7n6bEwLew6BOSDdtbt8bhQ3jw27wsWZu8TrNa8ljZDgQ vjmrfj9vUCpSJSO6euBg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1opSXT-00B1K1-4B; Mon, 31 Oct 2022 11:01:07 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1opSXH-00B1HQ-V6 for linux-arm-kernel@lists.infradead.org; Mon, 31 Oct 2022 11:00:59 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A1EFD611CE; Mon, 31 Oct 2022 11:00:51 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 48F4AC433D6; Mon, 31 Oct 2022 11:00:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667214051; bh=oe52KmRAKiUPs37/+XSeVSdnVohHwzo299SLBQkw8/0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ugI3HBGXaVTd6MUKyBYRaFc4Ig5vhpvNIQUd8qNo9gx9bwn5G302mxGt6mKQzFUnJ l2T00isAU9tioqIazAWFjd3OgZ7ve+IPQddQ5m/BLCgikLdneHZTGvavxvpezcYw+e CForyxzyNIzKTXM9oNL55H2Nrk8CBJPk4P7g8Ig1RnOHTkb5wt98mwzNPW5Jy5M6fD cSkrMtSFaML6HdR2XESXREAY/yxtu9ecFv7ACKJfmKrbrIT4xDieTUGMjOHfVQEpOW BISmBJ5/PHMd/KmYFkVYCYa55t0jFrVtBAm6yyLn2ZxUddpxFbaMEPTiM7wXytmOMi QlUTjfdrEvBDw== Date: Mon, 31 Oct 2022 11:00:41 +0000 From: Lee Jones To: Jerome Neanne Cc: lgirdwood@gmail.com, broonie@kernel.org, robh+dt@kernel.org, nm@ti.com, kristo@kernel.org, dmitry.torokhov@gmail.com, krzysztof.kozlowski+dt@linaro.org, catalin.marinas@arm.com, will@kernel.org, tony@atomide.com, vigneshr@ti.com, bjorn.andersson@linaro.org, shawnguo@kernel.org, geert+renesas@glider.be, dmitry.baryshkov@linaro.org, marcel.ziswiler@toradex.com, vkoul@kernel.org, biju.das.jz@bp.renesas.com, arnd@arndb.de, jeff@labundy.com, afd@ti.com, khilman@baylibre.com, narmstrong@baylibre.com, msp@baylibre.com, j-keerthy@ti.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-input@vger.kernel.org, linux-omap@vger.kernel.org Subject: Re: [PATCH v6 4/6] mfd: tps65219: Add driver for TI TPS65219 PMIC Message-ID: References: <20221011140549.16761-1-jneanne@baylibre.com> <20221011140549.16761-5-jneanne@baylibre.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20221011140549.16761-5-jneanne@baylibre.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221031_040056_122907_77AC031D X-CRM114-Status: GOOD ( 33.25 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVHVlLCAxMSBPY3QgMjAyMiwgSmVyb21lIE5lYW5uZSB3cm90ZToKCj4gVGhlIFRQUzY1MjE5 IGlzIGEgcG93ZXIgbWFuYWdlbWVudCBJQyBQTUlDIGRlc2lnbmVkIHRvIHN1cHBseSBhIHdpZGUK PiByYW5nZSBvZiBTb0NzIGluIGJvdGggcG9ydGFibGUgYW5kIHN0YXRpb25hcnkgYXBwbGljYXRp b25zLiBBbnkgU29DIGNhbgo+IGNvbnRyb2wgVFBTNjUyMTkgb3ZlciBhIHN0YW5kYXJkIEkyQyBp bnRlcmZhY2UuCj4gCj4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOgo+IC0g UmVndWxhdG9ycy4KPiAtIE92ZXIgVGVtcGVyYXR1cmUgd2FybmluZyBhbmQgU2h1dCBkb3duLgo+ IC0gR1BJT3MKPiAtIE11bHRpIEZ1bmN0aW9uIFBpbnMgKE1GUCkKPiAtIHBvd2VyLWJ1dHRvbgo+ IAo+IFRoaXMgcGF0Y2ggYWRkcyBzdXBwb3J0IGZvciB0cHM2NTIxOSBQTUlDLiBBdCB0aGlzIHRp bWUgb25seQo+IHRoZSBmdW5jdGlvbmFsaXRpZXMgbGlzdGVkIGJlbG93IGFyZSBtYWRlIGF2YWls YWJsZToKPiAKPiAtIFJlZ3VsYXRvcnMgcHJvYmUgYW5kIGZ1bmN0aW9uYWxpdGllcwo+IC0gd2Fy bSBhbmQgY29sZCByZXNldCBzdXBwb3J0Cj4gLSBTVyBzaHV0ZG93biBzdXBwb3J0Cj4gLSBSZWd1 bGF0b3Igd2FybmluZ3MgdmlhIElSUXMKPiAtIFBvd2VyLWJ1dHRvbiB2aWEgSVJRCj4gCj4gU2ln bmVkLW9mZi1ieTogSmVyb21lIE5lYW5uZSA8am5lYW5uZUBiYXlsaWJyZS5jb20+Cj4gU2lnbmVk LW9mZi1ieTogTWFya3VzIFNjaG5laWRlci1QYXJnbWFubiA8bXNwQGJheWxpYnJlLmNvbT4KPiAt LS0KCnY2IGFuZCBubyBjaGFuZ2UtbG9nPyAgUGxlYXNlIGVuc3VyZSB5b3Uga2VlcCBhIGNoYW5n ZS1sb2cgaGVyZSBpbiB0aGUKZnV0dXJlLiAgRWxzZSByZXZpZXdlcnMgYXJlIGVzc2VudGlhbGx5 IGZvcmNlZCB0byBjb25kdWN0IGZ1bGwgcmV2aWV3cwpvdmVyIGFuZCBvdmVyLgoKPiAgTUFJTlRB SU5FUlMgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gIGRyaXZlcnMvbWZkL0tjb25maWcgICAg ICAgICAgfCAgMTQgKysKPiAgZHJpdmVycy9tZmQvTWFrZWZpbGUgICAgICAgICB8ICAgMSArCj4g IGRyaXZlcnMvbWZkL3RwczY1MjE5LmMgICAgICAgfCAzMjAgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKPiAgaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTkuaCB8IDM0NSArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICA1IGZpbGVzIGNoYW5nZWQsIDY4MSBpbnNl cnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21mZC90cHM2NTIxOS5jCj4g IGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L21mZC90cHM2NTIxOS5oCgpKdXN0IGEg ZmV3IG5pdHMgZ29pbmcgZm9yd2FyZC4gIEl0J3Mgc2hhcGluZyB1cCBuaWNlbHkuCgpPbmNlIGZp eGVkLCBwbGVhc2Ugc3VibWl0IHdpdGggdGhpcyBhZGRlZDoKCkZvciBteSBvd24gcmVmZXJlbmNl IChhcHBseSB0aGlzIGFzLWlzIHRvIHlvdXIgc2lnbi1vZmYgYmxvY2spOgoKICBBY2tlZC1mb3It TUZELWJ5OiBMZWUgSm9uZXMgPGxlZUBrZXJuZWwub3JnPgoKPiBkaWZmIC0tZ2l0IGEvTUFJTlRB SU5FUlMgYi9NQUlOVEFJTkVSUwo+IGluZGV4IDE0ZWRhY2ZlYjFkNC4uZjg5ZTc3OTU5NTM2IDEw MDY0NAo+IC0tLSBhL01BSU5UQUlORVJTCj4gKysrIGIvTUFJTlRBSU5FUlMKPiBAQCAtMTQ5MzEs NiArMTQ5MzEsNyBAQCBGOglkcml2ZXJzL21mZC9tZW5lbGF1cy5jCj4gIEY6CWRyaXZlcnMvbWZk L3BhbG1hcy5jCj4gIEY6CWRyaXZlcnMvbWZkL3RwczY1MjE3LmMKPiAgRjoJZHJpdmVycy9tZmQv dHBzNjUyMTguYwo+ICtGOglkcml2ZXJzL21mZC90cHM2NTIxOS5jCj4gIEY6CWRyaXZlcnMvbWZk L3RwczY1OTEwLmMKPiAgRjoJZHJpdmVycy9tZmQvdHdsLWNvcmUuW2NoXQo+ICBGOglkcml2ZXJz L21mZC90d2w0MDMwKi5jCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2 ZXJzL21mZC9LY29uZmlnCj4gaW5kZXggYWJiNThhYjFhMWE0Li4xYTg0NmM3ZGQwYzIgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcK PiBAQCAtMTU3Niw2ICsxNTc2LDIwIEBAIGNvbmZpZyBNRkRfVFBTNjUyMTgKPiAgCSAgVGhpcyBk cml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQo+ ICAJICB3aWxsIGJlIGNhbGxlZCB0cHM2NTIxOC4KPiAgCj4gK2NvbmZpZyBNRkRfVFBTNjUyMTkK PiArCXRyaXN0YXRlICJUSSBUUFM2NTIxOSBQb3dlciBNYW5hZ2VtZW50IElDIgo+ICsJZGVwZW5k cyBvbiBJMkMgJiYgT0YKPiArCXNlbGVjdCBNRkRfQ09SRQo+ICsJc2VsZWN0IFJFR01BUF9JMkMK PiArCXNlbGVjdCBSRUdNQVBfSVJRCj4gKwloZWxwCj4gKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUg eW91IGdldCBzdXBwb3J0IGZvciB0aGUgVFBTNjUyMTkgc2VyaWVzIG9mIFBvd2VyCj4gKwkgIE1h bmFnZW1lbnQgSUNzLiBUaGVzZSBpbmNsdWRlIHZvbHRhZ2UgcmVndWxhdG9ycywgR1BJT3MgYW5k Cj4gKwkgIHB1c2gvcG93ZXIgYnV0dG9uIHRoYXQgYXJlIG9mdGVuIHVzZWQgaW4gcG9ydGFibGUg ZGV2aWNlcy4KCk5pdDogYnV0dG9ucwoKPiArCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVp bHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCj4gKwkgIHdpbGwgYmUgY2FsbGVkIHRw czY1MjE5Lgo+ICsKPiAgY29uZmlnIE1GRF9UUFM2NTg2WAo+ICAJYm9vbCAiVEkgVFBTNjU4Nngg UG93ZXIgTWFuYWdlbWVudCBjaGlwcyIKPiAgCWRlcGVuZHMgb24gSTJDPXkKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQo+IGluZGV4IDg1 OGNhY2Y2NTlkNi4uYThmZjNkNmVhM2FiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbWZkL01ha2Vm aWxlCj4gKysrIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKPiBAQCAtMTAxLDYgKzEwMSw3IEBAIG9i ai0kKENPTkZJR19UUFM2NTA3WCkJCSs9IHRwczY1MDd4Lm8KPiAgb2JqLSQoQ09ORklHX01GRF9U UFM2NTA4NikJKz0gdHBzNjUwODYubwo+ICBvYmotJChDT05GSUdfTUZEX1RQUzY1MjE3KQkrPSB0 cHM2NTIxNy5vCj4gIG9iai0kKENPTkZJR19NRkRfVFBTNjUyMTgpCSs9IHRwczY1MjE4Lm8KPiAr b2JqLSQoQ09ORklHX01GRF9UUFM2NTIxOSkJKz0gdHBzNjUyMTkubwo+ICBvYmotJChDT05GSUdf TUZEX1RQUzY1OTEwKQkrPSB0cHM2NTkxMC5vCj4gIG9iai0kKENPTkZJR19NRkRfVFBTNjU5MTIp CSs9IHRwczY1OTEyLWNvcmUubwo+ICBvYmotJChDT05GSUdfTUZEX1RQUzY1OTEyX0kyQykJKz0g dHBzNjU5MTItaTJjLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjUyMTkuYyBiL2Ry aXZlcnMvbWZkL3RwczY1MjE5LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAw MDAwMDAwMC4uYzE2Mzg0ODNlMDY5Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvbWZk L3RwczY1MjE5LmMKPiBAQCAtMCwwICsxLDMyMCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMAo+ICsvLwo+ICsvLyBEcml2ZXIgZm9yIFRQUzY1MjE5IEludGVncmF0ZWQg UG93ZXIgTWFuYWdlbWVudCBJbnRlZ3JhdGVkIENoaXBzIChQTUlDKQo+ICsvLwo+ICsvLyBDb3B5 cmlnaHQgKEMpIDIwMjIgQmF5TGlicmUgSW5jb3Jwb3JhdGVkIC0gaHR0cHM6Ly93d3cuYmF5bGli cmUuY29tLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvZXJyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lu aXQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8bGludXgv aXJxLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51 eC9vZi5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gKyNpbmNsdWRl IDxsaW51eC9yZWJvb3QuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+ICsjaW5jbHVk ZSA8bGludXgvc2xhYi5oPgo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9tZmQvdHBzNjUyMTkuaD4KPiArCj4gK3N0YXRpYyBpbnQgdHBzNjUyMTlf d2FybV9yZXNldChzdHJ1Y3QgdHBzNjUyMTkgKnRwcykKPiArewo+ICsJcmV0dXJuIHJlZ21hcF91 cGRhdGVfYml0cyh0cHMtPnJlZ21hcCwgVFBTNjUyMTlfUkVHX01GUF9DVFJMLAo+ICsJCQkJICBU UFM2NTIxOV9NRlBfV0FSTV9SRVNFVF9JMkNfQ1RSTF9NQVNLLAo+ICsJCQkJICBUUFM2NTIxOV9N RlBfV0FSTV9SRVNFVF9JMkNfQ1RSTF9NQVNLKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0cHM2 NTIxOV9jb2xkX3Jlc2V0KHN0cnVjdCB0cHM2NTIxOSAqdHBzKQo+ICt7Cj4gKwlyZXR1cm4gcmVn bWFwX3VwZGF0ZV9iaXRzKHRwcy0+cmVnbWFwLCBUUFM2NTIxOV9SRUdfTUZQX0NUUkwsCj4gKwkJ CQkgIFRQUzY1MjE5X01GUF9DT0xEX1JFU0VUX0kyQ19DVFJMX01BU0ssCj4gKwkJCQkgIFRQUzY1 MjE5X01GUF9DT0xEX1JFU0VUX0kyQ19DVFJMX01BU0spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IHRwczY1MjE5X3NvZnRfc2h1dGRvd24oc3RydWN0IHRwczY1MjE5ICp0cHMpCj4gK3sKPiArCXJl dHVybiByZWdtYXBfdXBkYXRlX2JpdHModHBzLT5yZWdtYXAsIFRQUzY1MjE5X1JFR19NRlBfQ1RS TCwKPiArCQkJCSAgVFBTNjUyMTlfTUZQX0kyQ19PRkZfUkVRX01BU0ssCj4gKwkJCQkgIFRQUzY1 MjE5X01GUF9JMkNfT0ZGX1JFUV9NQVNLKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0cHM2NTIx OV9yZXN0YXJ0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKPiArCQkJICAgIHVuc2lnbmVk IGxvbmcgcmVib290X21vZGUsIHZvaWQgKmNtZCkKPiArewo+ICsJc3RydWN0IHRwczY1MjE5ICp0 cHM7Cj4gKwo+ICsJdHBzID0gY29udGFpbmVyX29mKHRoaXMsIHN0cnVjdCB0cHM2NTIxOSwgbmIp Owo+ICsJaWYgKCF0cHMpIHsKPiArCQlwcl9lcnIoInRwczY1MjE5OiBSZXN0YXJ0aW5nIGZhaWxl ZCBiZWNhdXNlIHRoZSBwb2ludGVyIHRvIHRwczY1MjE5IGlzIGludmFsaWRcbiIpOwo+ICsJCXJl dHVybiAtRU5PREVWOwo+ICsJfQoKTml0OiAnXG4nCgo+ICsJaWYgKHJlYm9vdF9tb2RlID09IFJF Qk9PVF9XQVJNKQo+ICsJCXRwczY1MjE5X3dhcm1fcmVzZXQodHBzKTsKPiArCWVsc2UKPiArCQl0 cHM2NTIxOV9jb2xkX3Jlc2V0KHRwcyk7CgpOaXQ6ICdcbicKCj4gKwlyZXR1cm4gTk9USUZZX0RP TkU7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcG1pY19yc3RfcmVz dGFydF9uYiA9IHsKPiArCS5ub3RpZmllcl9jYWxsID0gdHBzNjUyMTlfcmVzdGFydCwKPiArCS5w cmlvcml0eSA9IDIwMCwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2Ug dHBzNjUyMTlfcHdyYnV0dG9uX3Jlc291cmNlc1tdID0gewo+ICsJREVGSU5FX1JFU19JUlFfTkFN RUQoVFBTNjUyMTlfSU5UX1BCX0ZBTExJTkdfRURHRV9ERVRFQ1QsICJmYWxsaW5nIiksCj4gKwlE RUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfUEJfUklTSU5HX0VER0VfREVURUNULCAi cmlzaW5nIiksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIHRwczY1 MjE5X3JlZ3VsYXRvcl9yZXNvdXJjZXNbXSA9IHsKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQ UzY1MjE5X0lOVF9MRE8zX1NDRywgIkxETzNfU0NHIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1F RChUUFM2NTIxOV9JTlRfTERPM19PQywgIkxETzNfT0MiKSwKPiArCURFRklORV9SRVNfSVJRX05B TUVEKFRQUzY1MjE5X0lOVF9MRE8zX1VWLCAiTERPM19VViIpLAo+ICsJREVGSU5FX1JFU19JUlFf TkFNRUQoVFBTNjUyMTlfSU5UX0xETzRfU0NHLCAiTERPNF9TQ0ciKSwKPiArCURFRklORV9SRVNf SVJRX05BTUVEKFRQUzY1MjE5X0lOVF9MRE80X09DLCAiTERPNF9PQyIpLAo+ICsJREVGSU5FX1JF U19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0xETzRfVVYsICJMRE80X1VWIiksCj4gKwlERUZJTkVf UkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfTERPMV9TQ0csICJMRE8xX1NDRyIpLAo+ICsJREVG SU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0xETzFfT0MsICJMRE8xX09DIiksCj4gKwlE RUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfTERPMV9VViwgIkxETzFfVVYiKSwKPiAr CURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9MRE8yX1NDRywgIkxETzJfU0NHIiks Cj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfTERPMl9PQywgIkxETzJfT0Mi KSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9MRE8yX1VWLCAiTERPMl9V ViIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0JVQ0szX1NDRywgIkJV Q0szX1NDRyIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0JVQ0szX09D LCAiQlVDSzNfT0MiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9CVUNL M19ORUdfT0MsICJCVUNLM19ORUdfT0MiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1 MjE5X0lOVF9CVUNLM19VViwgIkJVQ0szX1VWIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChU UFM2NTIxOV9JTlRfQlVDSzFfU0NHLCAiQlVDSzFfU0NHIiksCj4gKwlERUZJTkVfUkVTX0lSUV9O QU1FRChUUFM2NTIxOV9JTlRfQlVDSzFfT0MsICJCVUNLMV9PQyIpLAo+ICsJREVGSU5FX1JFU19J UlFfTkFNRUQoVFBTNjUyMTlfSU5UX0JVQ0sxX05FR19PQywgIkJVQ0sxX05FR19PQyIpLAo+ICsJ REVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0JVQ0sxX1VWLCAiQlVDSzFfVVYiKSwK PiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9CVUNLMl9TQ0csICJCVUNLMl9T Q0ciKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9CVUNLMl9PQywgIkJV Q0syX09DIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfQlVDSzJfTkVH X09DLCAiQlVDSzJfTkVHX09DIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9J TlRfQlVDSzJfVVYsICJCVUNLMl9VViIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUy MTlfSU5UX0JVQ0sxX1JWLCAiQlVDSzFfUlYiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQ UzY1MjE5X0lOVF9CVUNLMl9SViwgIkJVQ0syX1JWIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1F RChUUFM2NTIxOV9JTlRfQlVDSzNfUlYsICJCVUNLM19SViIpLAo+ICsJREVGSU5FX1JFU19JUlFf TkFNRUQoVFBTNjUyMTlfSU5UX0xETzFfUlYsICJMRE8xX1JWIiksCj4gKwlERUZJTkVfUkVTX0lS UV9OQU1FRChUUFM2NTIxOV9JTlRfTERPMl9SViwgIkxETzJfUlYiKSwKPiArCURFRklORV9SRVNf SVJRX05BTUVEKFRQUzY1MjE5X0lOVF9MRE8zX1JWLCAiTERPM19SViIpLAo+ICsJREVGSU5FX1JF U19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0xETzRfUlYsICJMRE80X1JWIiksCj4gKwlERUZJTkVf UkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfQlVDSzFfUlZfU0QsICJCVUNLMV9SVl9TRCIpLAo+ ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX0JVQ0syX1JWX1NELCAiQlVDSzJf UlZfU0QiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9CVUNLM19SVl9T RCwgIkJVQ0szX1JWX1NEIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRf TERPMV9SVl9TRCwgIkxETzFfUlZfU0QiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1 MjE5X0lOVF9MRE8yX1JWX1NELCAiTERPMl9SVl9TRCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFN RUQoVFBTNjUyMTlfSU5UX0xETzNfUlZfU0QsICJMRE8zX1JWX1NEIiksCj4gKwlERUZJTkVfUkVT X0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfTERPNF9SVl9TRCwgIkxETzRfUlZfU0QiKSwKPiArCURF RklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5X0lOVF9USU1FT1VULCAiVElNRU9VVCIpLAo+ICsJ REVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTlfSU5UX1NFTlNPUl8zX1dBUk0sICJTRU5TT1Jf M19XQVJNIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfU0VOU09SXzJf V0FSTSwgIlNFTlNPUl8yX1dBUk0iKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE5 X0lOVF9TRU5TT1JfMV9XQVJNLCAiU0VOU09SXzFfV0FSTSIpLAo+ICsJREVGSU5FX1JFU19JUlFf TkFNRUQoVFBTNjUyMTlfSU5UX1NFTlNPUl8wX1dBUk0sICJTRU5TT1JfMF9XQVJNIiksCj4gKwlE RUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfU0VOU09SXzNfSE9ULCAiU0VOU09SXzNf SE9UIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRfU0VOU09SXzJfSE9U LCAiU0VOU09SXzJfSE9UIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxOV9JTlRf U0VOU09SXzFfSE9ULCAiU0VOU09SXzFfSE9UIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChU UFM2NTIxOV9JTlRfU0VOU09SXzBfSE9ULCAiU0VOU09SXzBfSE9UIiksCj4gK307Cj4gKwo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IG1mZF9jZWxsIHRwczY1MjE5X2NlbGxzW10gPSB7Cj4gKwl7Cj4g KwkJLm5hbWUgPSAidHBzNjUyMTktcmVndWxhdG9yIiwKPiArCQkucmVzb3VyY2VzID0gdHBzNjUy MTlfcmVndWxhdG9yX3Jlc291cmNlcywKPiArCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUo dHBzNjUyMTlfcmVndWxhdG9yX3Jlc291cmNlcyksCj4gKwl9LCB7Cj4gKwkJLm5hbWUgPSAidHBz NjUyMTktZ3Bpb3MiLAo+ICsJfSwKCk5pdDogTGlrZSB0aGlzIHBsZWFzZToKCiAgICAgeyAubmFt ZSA9ICJ0cHM2NTIxOS1ncGlvcyIsIH0sCgo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVj dCBtZmRfY2VsbCB0cHM2NTIxOV9wd3JidXR0b25fY2VsbCA9IHsKPiArCS5uYW1lID0gInRwczY1 MjE5LXB3cmJ1dHRvbiIsCj4gKwkucmVzb3VyY2VzID0gdHBzNjUyMTlfcHdyYnV0dG9uX3Jlc291 cmNlcywKPiArCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh0cHM2NTIxOV9wd3JidXR0b25f cmVzb3VyY2VzKSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZp ZyB0cHM2NTIxOV9yZWdtYXBfY29uZmlnID0gewo+ICsJLnJlZ19iaXRzID0gOCwKPiArCS52YWxf Yml0cyA9IDgsCj4gKwkubWF4X3JlZ2lzdGVyID0gVFBTNjUyMTlfUkVHX0ZBQ1RPUllfQ09ORklH XzIsCj4gK307Cj4gKwo+ICsvKgo+ICsgKiBNYXBwaW5nIG9mIG1haW4gSVJRIHJlZ2lzdGVyIGJp dHMgdG8gc3ViLUlSUSByZWdpc3RlciBvZmZzZXRzIHNvIHRoYXQgd2UgY2FuCj4gKyAqIGFjY2Vz cyBjb3JlY3Qgc3ViLUlSUSByZWdpc3RlcnMgYmFzZWQgb24gYml0cyB0aGF0IGFyZSBzZXQgaW4g bWFpbiBJUlEKPiArICogcmVnaXN0ZXIuCj4gKyAqLwo+ICsvKiBUaW1lb3V0IFJlc2lkdWFsIFZv bHRhZ2UgU2h1dGRvd24gKi8KPiArc3RhdGljIHVuc2lnbmVkIGludCBiaXQwX29mZnNldHNbXSA9 IHsgVFBTNjUyMTlfUkVHX0lOVF9UT19SVl9QT1MgfTsKPiArc3RhdGljIHVuc2lnbmVkIGludCBi aXQxX29mZnNldHNbXSA9IHsgVFBTNjUyMTlfUkVHX0lOVF9SVl9QT1MgfTsJLyogUmVzaWR1YWwg Vm9sdGFnZSAqLwo+ICtzdGF0aWMgdW5zaWduZWQgaW50IGJpdDJfb2Zmc2V0c1tdID0geyBUUFM2 NTIxOV9SRUdfSU5UX1NZU19QT1MgfTsJLyogU3lzdGVtICovCj4gK3N0YXRpYyB1bnNpZ25lZCBp bnQgYml0M19vZmZzZXRzW10gPSB7IFRQUzY1MjE5X1JFR19JTlRfQlVDS18xXzJfUE9TIH07CS8q IEJ1Y2sgMS0yICovCj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgYml0NF9vZmZzZXRzW10gPSB7IFRQ UzY1MjE5X1JFR19JTlRfQlVDS18zX1BPUyB9OwkvKiBCdWNrIDMgKi8KPiArc3RhdGljIHVuc2ln bmVkIGludCBiaXQ1X29mZnNldHNbXSA9IHsgVFBTNjUyMTlfUkVHX0lOVF9MRE9fMV8yX1BPUyB9 OwkvKiBMRE8gMS0yICovCj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgYml0Nl9vZmZzZXRzW10gPSB7 IFRQUzY1MjE5X1JFR19JTlRfTERPXzNfNF9QT1MgfTsJLyogTERPIDMtNCAqLwo+ICtzdGF0aWMg dW5zaWduZWQgaW50IGJpdDdfb2Zmc2V0c1tdID0geyBUUFM2NTIxOV9SRUdfSU5UX1BCX1BPUyB9 OwkvKiBQb3dlciBCdXR0b24gKi8KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2lycV9zdWJf aXJxX21hcCB0cHM2NTIxOV9zdWJfaXJxX29mZnNldHNbXSA9IHsKPiArCVJFR01BUF9JUlFfTUFJ Tl9SRUdfT0ZGU0VUKGJpdDBfb2Zmc2V0cyksCj4gKwlSRUdNQVBfSVJRX01BSU5fUkVHX09GRlNF VChiaXQxX29mZnNldHMpLAo+ICsJUkVHTUFQX0lSUV9NQUlOX1JFR19PRkZTRVQoYml0Ml9vZmZz ZXRzKSwKPiArCVJFR01BUF9JUlFfTUFJTl9SRUdfT0ZGU0VUKGJpdDNfb2Zmc2V0cyksCj4gKwlS RUdNQVBfSVJRX01BSU5fUkVHX09GRlNFVChiaXQ0X29mZnNldHMpLAo+ICsJUkVHTUFQX0lSUV9N QUlOX1JFR19PRkZTRVQoYml0NV9vZmZzZXRzKSwKPiArCVJFR01BUF9JUlFfTUFJTl9SRUdfT0ZG U0VUKGJpdDZfb2Zmc2V0cyksCj4gKwlSRUdNQVBfSVJRX01BSU5fUkVHX09GRlNFVChiaXQ3X29m ZnNldHMpLAo+ICt9Owo+ICsKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhpbnRf bmFtZSwgcmVnaXN0ZXJfcG9zaXRpb24pIFwKPiArCVJFR01BUF9JUlFfUkVHKGludF9uYW1lLCBy ZWdpc3Rlcl9wb3NpdGlvbiwgaW50X25hbWUjI19NQVNLKQo+ICsKPiArc3RhdGljIHN0cnVjdCBy ZWdtYXBfaXJxIHRwczY1MjE5X2lycXNbXSA9IHsKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVH KFRQUzY1MjE5X0lOVF9MRE8zX1NDRywgVFBTNjUyMTlfUkVHX0lOVF9MRE9fM180X1BPUyksCj4g KwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfTERPM19PQywgVFBTNjUyMTlf UkVHX0lOVF9MRE9fM180X1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIx OV9JTlRfTERPM19VViwgVFBTNjUyMTlfUkVHX0lOVF9MRE9fM180X1BPUyksCj4gKwlUUFM2NTIx OV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfTERPNF9TQ0csIFRQUzY1MjE5X1JFR19JTlRf TERPXzNfNF9QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0xE TzRfT0MsIFRQUzY1MjE5X1JFR19JTlRfTERPXzNfNF9QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQ X0lSUV9SRUcoVFBTNjUyMTlfSU5UX0xETzRfVVYsIFRQUzY1MjE5X1JFR19JTlRfTERPXzNfNF9Q T1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0xETzFfU0NHLCBU UFM2NTIxOV9SRUdfSU5UX0xET18xXzJfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVH KFRQUzY1MjE5X0lOVF9MRE8xX09DLCBUUFM2NTIxOV9SRUdfSU5UX0xET18xXzJfUE9TKSwKPiAr CVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9MRE8xX1VWLCBUUFM2NTIxOV9S RUdfSU5UX0xET18xXzJfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5 X0lOVF9MRE8yX1NDRywgVFBTNjUyMTlfUkVHX0lOVF9MRE9fMV8yX1BPUyksCj4gKwlUUFM2NTIx OV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfTERPMl9PQywgVFBTNjUyMTlfUkVHX0lOVF9M RE9fMV8yX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfTERP Ml9VViwgVFBTNjUyMTlfUkVHX0lOVF9MRE9fMV8yX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBf SVJRX1JFRyhUUFM2NTIxOV9JTlRfQlVDSzNfU0NHLCBUUFM2NTIxOV9SRUdfSU5UX0JVQ0tfM19Q T1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0JVQ0szX09DLCBU UFM2NTIxOV9SRUdfSU5UX0JVQ0tfM19QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUco VFBTNjUyMTlfSU5UX0JVQ0szX05FR19PQywgVFBTNjUyMTlfUkVHX0lOVF9CVUNLXzNfUE9TKSwK PiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9CVUNLM19VViwgVFBTNjUy MTlfUkVHX0lOVF9CVUNLXzNfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1 MjE5X0lOVF9CVUNLMl9TQ0csIFRQUzY1MjE5X1JFR19JTlRfQlVDS18xXzJfUE9TKSwKPiArCVRQ UzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9CVUNLMl9PQywgVFBTNjUyMTlfUkVH X0lOVF9CVUNLXzFfMl9QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlf SU5UX0JVQ0syX05FR19PQywgVFBTNjUyMTlfUkVHX0lOVF9CVUNLXzFfMl9QT1MpLAo+ICsJVFBT NjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0JVQ0syX1VWLCBUUFM2NTIxOV9SRUdf SU5UX0JVQ0tfMV8yX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9J TlRfQlVDSzFfU0NHLCBUUFM2NTIxOV9SRUdfSU5UX0JVQ0tfMV8yX1BPUyksCj4gKwlUUFM2NTIx OV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfQlVDSzFfT0MsIFRQUzY1MjE5X1JFR19JTlRf QlVDS18xXzJfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9C VUNLMV9ORUdfT0MsIFRQUzY1MjE5X1JFR19JTlRfQlVDS18xXzJfUE9TKSwKPiArCVRQUzY1MjE5 X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9CVUNLMV9VViwgVFBTNjUyMTlfUkVHX0lOVF9C VUNLXzFfMl9QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX1NF TlNPUl8zX1dBUk0sIFRQUzY1MjE5X1JFR19JTlRfU1lTX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdN QVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfU0VOU09SXzJfV0FSTSwgVFBTNjUyMTlfUkVHX0lOVF9T WVNfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9TRU5TT1Jf MV9XQVJNLCBUUFM2NTIxOV9SRUdfSU5UX1NZU19QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lS UV9SRUcoVFBTNjUyMTlfSU5UX1NFTlNPUl8wX1dBUk0sIFRQUzY1MjE5X1JFR19JTlRfU1lTX1BP UyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfU0VOU09SXzNfSE9U LCBUUFM2NTIxOV9SRUdfSU5UX1NZU19QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUco VFBTNjUyMTlfSU5UX1NFTlNPUl8yX0hPVCwgVFBTNjUyMTlfUkVHX0lOVF9TWVNfUE9TKSwKPiAr CVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9TRU5TT1JfMV9IT1QsIFRQUzY1 MjE5X1JFR19JTlRfU1lTX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIx OV9JTlRfU0VOU09SXzBfSE9ULCBUUFM2NTIxOV9SRUdfSU5UX1NZU19QT1MpLAo+ICsJVFBTNjUy MTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0JVQ0sxX1JWLCBUUFM2NTIxOV9SRUdfSU5U X1JWX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfQlVDSzJf UlYsIFRQUzY1MjE5X1JFR19JTlRfUlZfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVH KFRQUzY1MjE5X0lOVF9CVUNLM19SViwgVFBTNjUyMTlfUkVHX0lOVF9SVl9QT1MpLAo+ICsJVFBT NjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0xETzFfUlYsIFRQUzY1MjE5X1JFR19J TlRfUlZfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9MRE8y X1JWLCBUUFM2NTIxOV9SRUdfSU5UX1JWX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JF RyhUUFM2NTIxOV9JTlRfTERPM19SViwgVFBTNjUyMTlfUkVHX0lOVF9SVl9QT1MpLAo+ICsJVFBT NjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX0xETzRfUlYsIFRQUzY1MjE5X1JFR19J TlRfUlZfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9CVUNL MV9SVl9TRCwgVFBTNjUyMTlfUkVHX0lOVF9UT19SVl9QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQ X0lSUV9SRUcoVFBTNjUyMTlfSU5UX0JVQ0syX1JWX1NELCBUUFM2NTIxOV9SRUdfSU5UX1RPX1JW X1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfQlVDSzNfUlZf U0QsIFRQUzY1MjE5X1JFR19JTlRfVE9fUlZfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFf UkVHKFRQUzY1MjE5X0lOVF9MRE8xX1JWX1NELCBUUFM2NTIxOV9SRUdfSU5UX1RPX1JWX1BPUyks Cj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9JTlRfTERPMl9SVl9TRCwgVFBT NjUyMTlfUkVHX0lOVF9UT19SVl9QT1MpLAo+ICsJVFBTNjUyMTlfUkVHTUFQX0lSUV9SRUcoVFBT NjUyMTlfSU5UX0xETzNfUlZfU0QsIFRQUzY1MjE5X1JFR19JTlRfVE9fUlZfUE9TKSwKPiArCVRQ UzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lOVF9MRE80X1JWX1NELCBUUFM2NTIxOV9S RUdfSU5UX1RPX1JWX1BPUyksCj4gKwlUUFM2NTIxOV9SRUdNQVBfSVJRX1JFRyhUUFM2NTIxOV9J TlRfVElNRU9VVCwgVFBTNjUyMTlfUkVHX0lOVF9UT19SVl9QT1MpLAo+ICsJVFBTNjUyMTlfUkVH TUFQX0lSUV9SRUcoVFBTNjUyMTlfSU5UX1BCX0ZBTExJTkdfRURHRV9ERVRFQ1QsIFRQUzY1MjE5 X1JFR19JTlRfUEJfUE9TKSwKPiArCVRQUzY1MjE5X1JFR01BUF9JUlFfUkVHKFRQUzY1MjE5X0lO VF9QQl9SSVNJTkdfRURHRV9ERVRFQ1QsIFRQUzY1MjE5X1JFR19JTlRfUEJfUE9TKSwKPiArfTsK PiArCj4gK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwIHRwczY1MjE5X2lycV9jaGlwID0g ewo+ICsJLm5hbWUgPSAidHBzNjUyMTlfaXJxIiwKPiArCS5tYWluX3N0YXR1cyA9IFRQUzY1MjE5 X1JFR19JTlRfU09VUkNFLAo+ICsJLm51bV9tYWluX3JlZ3MgPSAxLAo+ICsJLm51bV9tYWluX3N0 YXR1c19iaXRzID0gOCwKPiArCS5pcnFzID0gdHBzNjUyMTlfaXJxcywKPiArCS5udW1faXJxcyA9 IEFSUkFZX1NJWkUodHBzNjUyMTlfaXJxcyksCj4gKwkuc3RhdHVzX2Jhc2UgPSBUUFM2NTIxOV9S RUdfSU5UX0xET18zXzQsCj4gKwkuYWNrX2Jhc2UgPSBUUFM2NTIxOV9SRUdfSU5UX0xET18zXzQs Cj4gKwkuY2xlYXJfYWNrID0gMSwKPiArCS5udW1fcmVncyA9IDgsCj4gKwkuc3ViX3JlZ19vZmZz ZXRzID0gdHBzNjUyMTlfc3ViX2lycV9vZmZzZXRzLAo+ICt9Owo+ICsKPiArc3RhdGljIGludCB0 cHM2NTIxOV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQo+ICt7Cj4gKwlzdHJ1Y3Qg dHBzNjUyMTkgKnRwczsKPiArCXVuc2lnbmVkIGludCBjaGlwaWQ7Cj4gKwlib29sIHB3cl9idXR0 b247Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXRwcyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYs IHNpemVvZigqdHBzKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIXRwcykKPiArCQlyZXR1cm4gLUVO T01FTTsKPiArCj4gKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0cHMpOwo+ICsKPiArCXRw cy0+ZGV2ID0gJmNsaWVudC0+ZGV2Owo+ICsKPiArCXRwcy0+cmVnbWFwID0gZGV2bV9yZWdtYXBf aW5pdF9pMmMoY2xpZW50LCAmdHBzNjUyMTlfcmVnbWFwX2NvbmZpZyk7Cj4gKwlpZiAoSVNfRVJS KHRwcy0+cmVnbWFwKSkgewo+ICsJCXJldCA9IFBUUl9FUlIodHBzLT5yZWdtYXApOwo+ICsJCWRl dl9lcnIodHBzLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwg cmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldCA9IGRldm1fcmVnbWFwX2Fk ZF9pcnFfY2hpcCgmY2xpZW50LT5kZXYsIHRwcy0+cmVnbWFwLCBjbGllbnQtPmlycSwKPiArCQkJ CSAgICAgICBJUlFGX09ORVNIT1QsIDAsICZ0cHM2NTIxOV9pcnFfY2hpcCwKPiArCQkJCSAgICAg ICAmdHBzLT5pcnFfZGF0YSk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJ cmV0ID0gcmVnbWFwX3JlYWQodHBzLT5yZWdtYXAsIFRQUzY1MjE5X1JFR19USV9ERVZfSUQsICZj aGlwaWQpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIodHBzLT5kZXYsICJGYWlsZWQgdG8g cmVhZCBkZXZpY2UgSUQ6ICVkXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ ICsJcmV0ID0gZGV2bV9tZmRfYWRkX2RldmljZXModHBzLT5kZXYsIFBMQVRGT1JNX0RFVklEX0FV VE8sCj4gKwkJCQkgICB0cHM2NTIxOV9jZWxscywgQVJSQVlfU0laRSh0cHM2NTIxOV9jZWxscyks Cj4gKwkJCQkgICBOVUxMLCAwLCByZWdtYXBfaXJxX2dldF9kb21haW4odHBzLT5pcnFfZGF0YSkp Owo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIodHBzLT5kZXYsICJGYWlsZWQgdG8gYWRkIGNo aWxkIGRldmljZXM6ICVkXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJ cHdyX2J1dHRvbiA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbCh0cHMtPmRldi0+b2Zfbm9kZSwgInRp LHBvd2VyLWJ1dHRvbiIpOwo+ICsJaWYgKHB3cl9idXR0b24pIHsKPiArCQlyZXQgPSBkZXZtX21m ZF9hZGRfZGV2aWNlcyh0cHMtPmRldiwgUExBVEZPUk1fREVWSURfQVVUTywKPiArCQkJCQkgICAm dHBzNjUyMTlfcHdyYnV0dG9uX2NlbGwsIDEsIE5VTEwsIDAsCj4gKwkJCQkJICAgcmVnbWFwX2ly cV9nZXRfZG9tYWluKHRwcy0+aXJxX2RhdGEpKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCWRldl9l cnIodHBzLT5kZXYsICJGYWlsZWQgdG8gYWRkIHBvd2VyLWJ1dHRvbjogJWRcbiIsIHJldCk7Cj4g KwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXRwcy0+bmIgPSBwbWljX3JzdF9y ZXN0YXJ0X25iOwo+ICsJcmV0ID0gcmVnaXN0ZXJfcmVzdGFydF9oYW5kbGVyKCZ0cHMtPm5iKTsK PiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKHRwcy0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIHJl c3RhcnQgaGFuZGxlciwgJWRcbiIsIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg b2ZfdHBzNjUyMTlfbWF0Y2hfdGFibGVbXSA9IHsKPiArCXsgLmNvbXBhdGlibGUgPSAidGksdHBz NjUyMTkiLCB9LAo+ICsJe30KPiArfTsKPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfdHBz NjUyMTlfbWF0Y2hfdGFibGUpOwo+ICsKPiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczY1 MjE5X2RyaXZlciA9IHsKPiArCS5kcml2ZXIJCT0gewo+ICsJCS5uYW1lCT0gInRwczY1MjE5IiwK PiArCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl90cHM2NTIxOV9tYXRjaF90YWJsZSwKPiArCX0sCj4g KwkucHJvYmVfbmV3CT0gdHBzNjUyMTlfcHJvYmUsCj4gK307Cj4gK21vZHVsZV9pMmNfZHJpdmVy KHRwczY1MjE5X2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJKZXJvbWUgTmVhbm5lIDxq bmVhbm5lQGJheWxpYnJlLmNvbT4iKTsKPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTIxOSBw b3dlciBtYW5hZ2VtZW50IElDIGRyaXZlciIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4g ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE5LmggYi9pbmNsdWRlL2xpbnV4 L21mZC90cHM2NTIxOS5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAw MDAuLjJjMWNmOTJlOTJhYwo+IC0tLSAvZGV2L251bGwKPiArKysgYi9pbmNsdWRlL2xpbnV4L21m ZC90cHM2NTIxOS5oCj4gQEAgLTAsMCArMSwzNDUgQEAKPiArLyogU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAgKi8KPiArLyoKPiArICogRnVuY3Rpb25zIHRvIGFjY2VzcyBUUFM2NTIx OSBwb3dlciBtYW5hZ2VtZW50IElDLgoKTml0OiBQb3dlciBNYW5hZ2VtZW50IElDCgo+ICsgKiBD b3B5cmlnaHQgKEMpIDIwMjIgQmF5TGlicmUgSW5jb3Jwb3JhdGVkIC0gaHR0cHM6Ly93d3cuYmF5 bGlicmUuY29tLwo+ICsgKi8KPiArCj4gKyNpZm5kZWYgTUZEX1RQUzY1MjE5X0gKPiArI2RlZmlu ZSBNRkRfVFBTNjUyMTlfSAo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgo+ICsjaW5j bHVkZSA8bGludXgvbm90aWZpZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2 ZXIuaD4KPiArCj4gK3N0cnVjdCByZWdtYXA7Cj4gK3N0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0 YTsKPiArCj4gKyNkZWZpbmUgVFBTNjUyMTlfMVYzNQkJCQkJMTM1MDAwMAo+ICsjZGVmaW5lIFRQ UzY1MjE5XzFWOAkJCQkJMTgwMDAwMAo+ICsKPiArLyogVFBTIGNoaXAgaWQgbGlzdCAqLwo+ICsj ZGVmaW5lIFRQUzY1MjE5CQkJCQkweEYwCj4gKwo+ICsvKiBJMkMgSUQgZm9yIFRQUzY1MjE5IHBh cnQgKi8KPiArI2RlZmluZSBUUFM2NTIxOV9JMkNfSUQJCQkJCTB4MjQKPiArCj4gKy8qIEFsbCBy ZWdpc3RlciBhZGRyZXNzZXMgKi8KPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfVElfREVWX0lECQkJ CTB4MDAKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTlZNX0lECQkJCTB4MDEKPiArI2RlZmluZSBU UFM2NTIxOV9SRUdfRU5BQkxFX0NUUkwJCQkweDAyCj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVHX0JV Q0tTX0NPTkZJRwkJCTB4MDMKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTERPNF9WT1VUCQkJCTB4 MDQKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTERPM19WT1VUCQkJCTB4MDUKPiArI2RlZmluZSBU UFM2NTIxOV9SRUdfTERPMl9WT1VUCQkJCTB4MDYKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTERP MV9WT1VUCQkJCTB4MDcKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfQlVDSzNfVk9VVAkJCQkweDgK PiArI2RlZmluZSBUUFM2NTIxOV9SRUdfQlVDSzJfVk9VVAkJCQkweDkKPiArI2RlZmluZSBUUFM2 NTIxOV9SRUdfQlVDSzFfVk9VVAkJCQkweEEKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTERPNF9T RVFVRU5DRV9TTE9UCQkJMHhCCj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVHX0xETzNfU0VRVUVOQ0Vf U0xPVAkJCTB4Qwo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19MRE8yX1NFUVVFTkNFX1NMT1QJCQkw eEQKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTERPMV9TRVFVRU5DRV9TTE9UCQkJMHhFCj4gKyNk ZWZpbmUgVFBTNjUyMTlfUkVHX0JVQ0szX1NFUVVFTkNFX1NMT1QJCTB4Rgo+ICsjZGVmaW5lIFRQ UzY1MjE5X1JFR19CVUNLMl9TRVFVRU5DRV9TTE9UCQkweDEwCj4gKyNkZWZpbmUgVFBTNjUyMTlf UkVHX0JVQ0sxX1NFUVVFTkNFX1NMT1QJCTB4MTEKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfblJT VF9TRVFVRU5DRV9TTE9UCQkJMHgxMgo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19HUElPX1NFUVVF TkNFX1NMT1QJCQkweDEzCj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVHX0dQTzJfU0VRVUVOQ0VfU0xP VAkJCTB4MTQKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfR1BPMV9TRVFVRU5DRV9TTE9UCQkJMHgx NQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19QT1dFUl9VUF9TTE9UX0RVUkFUSU9OXzEJCTB4MTYK PiArI2RlZmluZSBUUFM2NTIxOV9SRUdfUE9XRVJfVVBfU0xPVF9EVVJBVElPTl8yCQkweDE3Cj4g KyNkZWZpbmUgVFBTNjUyMTlfUkVHX1BPV0VSX1VQX1NMT1RfRFVSQVRJT05fMwkJMHgxOAo+ICsj ZGVmaW5lIFRQUzY1MjE5X1JFR19QT1dFUl9VUF9TTE9UX0RVUkFUSU9OXzQJCTB4MTkKPiArI2Rl ZmluZSBUUFM2NTIxOV9SRUdfUE9XRVJfRE9XTl9TTE9UX0RVUkFUSU9OXzEJCTB4MUEKPiArI2Rl ZmluZSBUUFM2NTIxOV9SRUdfUE9XRVJfRE9XTl9TTE9UX0RVUkFUSU9OXzIJCTB4MUIKPiArI2Rl ZmluZSBUUFM2NTIxOV9SRUdfUE9XRVJfRE9XTl9TTE9UX0RVUkFUSU9OXzMJCTB4MUMKPiArI2Rl ZmluZSBUUFM2NTIxOV9SRUdfUE9XRVJfRE9XTl9TTE9UX0RVUkFUSU9OXzQJCTB4MUQKPiArI2Rl ZmluZSBUUFM2NTIxOV9SRUdfR0VORVJBTF9DT05GSUcJCQkweDFFCj4gKyNkZWZpbmUgVFBTNjUy MTlfUkVHX01GUF8xX0NPTkZJRwkJCTB4MUYKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfTUZQXzJf Q09ORklHCQkJMHgyMAo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19TVEJZXzFfQ09ORklHCQkJMHgy MQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19TVEJZXzJfQ09ORklHCQkJMHgyMgo+ICsjZGVmaW5l IFRQUzY1MjE5X1JFR19PQ19ERUdMX0NPTkZJRwkJCTB4MjMKPiArLyogJ3N1YiBpcnEnIE1BU0sg cmVnaXN0ZXJzICovCj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVHX0lOVF9NQVNLX1VWCQkJMHgyNAo+ ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19NQVNLX0NPTkZJRwkJCTB4MjUKPiArCj4gKyNkZWZpbmUg VFBTNjUyMTlfUkVHX0kyQ19BRERSRVNTX1JFRwkJCTB4MjYKPiArI2RlZmluZSBUUFM2NTIxOV9S RUdfVVNFUl9HRU5FUkFMX05WTV9TVE9SQUdFCQkweDI3Cj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVH X01BTlVGQUNUVVJJTkdfVkVSCQkJMHgyOAo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19NRlBfQ1RS TAkJCQkweDI5Cj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVHX0RJU0NIQVJHRV9DT05GSUcJCQkweDJB Cj4gKy8qIG1haW4gaXJxIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19JTlRf U09VUkNFCQkJCTB4MkIKPiArLyogJ3N1YiBpcnEnIHJlZ2lzdGVycyAqLwo+ICsjZGVmaW5lIFRQ UzY1MjE5X1JFR19JTlRfTERPXzNfNAkJCTB4MkMKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfSU5U X0xET18xXzIJCQkweDJECj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVHX0lOVF9CVUNLXzMJCQkJMHgy RQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19JTlRfQlVDS18xXzIJCQkweDJGCj4gKyNkZWZpbmUg VFBTNjUyMTlfUkVHX0lOVF9TWVNURU0JCQkJMHgzMAo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19J TlRfUlYJCQkJMHgzMQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19JTlRfVElNRU9VVF9SVl9TRAkJ CTB4MzIKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfSU5UX1BCCQkJCTB4MzMKPiArCj4gKyNkZWZp bmUgVFBTNjUyMTlfUkVHX0lOVF9MRE9fM180X1BPUwkJCTAKPiArI2RlZmluZSBUUFM2NTIxOV9S RUdfSU5UX0xET18xXzJfUE9TCQkJMQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19JTlRfQlVDS18z X1BPUwkJCTIKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfSU5UX0JVQ0tfMV8yX1BPUwkJCTMKPiAr I2RlZmluZSBUUFM2NTIxOV9SRUdfSU5UX1NZU19QT1MJCQk0Cj4gKyNkZWZpbmUgVFBTNjUyMTlf UkVHX0lOVF9SVl9QT1MJCQkJNQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19JTlRfVE9fUlZfUE9T CQkJNgo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19JTlRfUEJfUE9TCQkJCTcKPiArCj4gKyNkZWZp bmUgVFBTNjUyMTlfUkVHX1VTRVJfTlZNX0NNRAkJCTB4MzQKPiArI2RlZmluZSBUUFM2NTIxOV9S RUdfUE9XRVJfVVBfU1RBVFVTCQkJMHgzNQo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19TUEFSRV8y CQkJCTB4MzYKPiArI2RlZmluZSBUUFM2NTIxOV9SRUdfU1BBUkVfMwkJCQkweDM3Cj4gKyNkZWZp bmUgVFBTNjUyMTlfUkVHX0ZBQ1RPUllfQ09ORklHXzIJCQkweDQxCj4gKwo+ICsvKiBSZWdpc3Rl ciBmaWVsZCBkZWZpbml0aW9ucyAqLwo+ICsjZGVmaW5lIFRQUzY1MjE5X0RFVklEX1JFVl9NQVNL CQkJCUdFTk1BU0soNywgMCkKPiArI2RlZmluZSBUUFM2NTIxOV9CVUNLU19MRE9TX1ZPVVRfVlNF VF9NQVNLCQlHRU5NQVNLKDUsIDApCj4gKyNkZWZpbmUgVFBTNjUyMTlfQlVDS1NfVVZfVEhSX1NF TF9NQVNLCQkJQklUKDYpCj4gKyNkZWZpbmUgVFBTNjUyMTlfQlVDS1NfQldfU0VMX01BU0sJCQlC SVQoNykKPiArI2RlZmluZSBMRE9fQllQX1NISUZUCQkJCQk2Cj4gKyNkZWZpbmUgVFBTNjUyMTlf TERPU19CWVBfQ09ORklHX01BU0sJCQlCSVQoTERPX0JZUF9TSElGVCkKPiArI2RlZmluZSBUUFM2 NTIxOV9MRE9TX0xTV19DT05GSUdfTUFTSwkJCUJJVCg3KQo+ICsvKiBSZWd1bGF0b3JzIGVuYWJs ZSBjb250cm9sICovCj4gKyNkZWZpbmUgVFBTNjUyMTlfRU5BQkxFX0JVQ0sxX0VOX01BU0sJCQlC SVQoMCkKPiArI2RlZmluZSBUUFM2NTIxOV9FTkFCTEVfQlVDSzJfRU5fTUFTSwkJCUJJVCgxKQo+ ICsjZGVmaW5lIFRQUzY1MjE5X0VOQUJMRV9CVUNLM19FTl9NQVNLCQkJQklUKDIpCj4gKyNkZWZp bmUgVFBTNjUyMTlfRU5BQkxFX0xETzFfRU5fTUFTSwkJCUJJVCgzKQo+ICsjZGVmaW5lIFRQUzY1 MjE5X0VOQUJMRV9MRE8yX0VOX01BU0sJCQlCSVQoNCkKPiArI2RlZmluZSBUUFM2NTIxOV9FTkFC TEVfTERPM19FTl9NQVNLCQkJQklUKDUpCj4gKyNkZWZpbmUgVFBTNjUyMTlfRU5BQkxFX0xETzRf RU5fTUFTSwkJCUJJVCg2KQo+ICsvKiBwb3dlciBPTi1PRkYgc2VxdWVuY2Ugc2xvdCAqLwo+ICsj ZGVmaW5lIFRQUzY1MjE5X0JVQ0tTX0xET1NfU0VRVUVOQ0VfT0ZGX1NMT1RfTUFTSwlHRU5NQVNL KDMsIDApCj4gKyNkZWZpbmUgVFBTNjUyMTlfQlVDS1NfTERPU19TRVFVRU5DRV9PTl9TTE9UX01B U0sJR0VOTUFTSyg3LCA0KQo+ICsvKiBUT0RPOiBOb3QgbmVlZGVkLCBzYW1lIG1hcHBpbmcgYXMg VFBTNjUyMTlfRU5BQkxFX1JFR05BTUVfRU4sIGZhY3Rvcml6ZSAqLwo+ICsjZGVmaW5lIFRQUzY1 MjE5X1NUQlkxX0JVQ0sxX1NUQllfRU5fTUFTSwkJQklUKDApCj4gKyNkZWZpbmUgVFBTNjUyMTlf U1RCWTFfQlVDSzJfU1RCWV9FTl9NQVNLCQlCSVQoMSkKPiArI2RlZmluZSBUUFM2NTIxOV9TVEJZ MV9CVUNLM19TVEJZX0VOX01BU0sJCUJJVCgyKQo+ICsjZGVmaW5lIFRQUzY1MjE5X1NUQlkxX0xE TzFfU1RCWV9FTl9NQVNLCQlCSVQoMykKPiArI2RlZmluZSBUUFM2NTIxOV9TVEJZMV9MRE8yX1NU QllfRU5fTUFTSwkJQklUKDQpCj4gKyNkZWZpbmUgVFBTNjUyMTlfU1RCWTFfTERPM19TVEJZX0VO X01BU0sJCUJJVCg1KQo+ICsjZGVmaW5lIFRQUzY1MjE5X1NUQlkxX0xETzRfU1RCWV9FTl9NQVNL CQlCSVQoNikKPiArLyogU1RCWV8yIGNvbmZpZyAqLwo+ICsjZGVmaW5lIFRQUzY1MjE5X1NUQlky X0dQTzFfU1RCWV9FTl9NQVNLCQlCSVQoMCkKPiArI2RlZmluZSBUUFM2NTIxOV9TVEJZMl9HUE8y X1NUQllfRU5fTUFTSwkJQklUKDEpCj4gKyNkZWZpbmUgVFBTNjUyMTlfU1RCWTJfR1BJT19TVEJZ X0VOX01BU0sJCUJJVCgyKQo+ICsvKiBNRlAgQ29udHJvbCAqLwo+ICsjZGVmaW5lIFRQUzY1MjE5 X01GUF9JMkNfT0ZGX1JFUV9NQVNLCQkJQklUKDApCj4gKyNkZWZpbmUgVFBTNjUyMTlfTUZQX1NU QllfSTJDX0NUUkxfTUFTSwkJCUJJVCgxKQo+ICsjZGVmaW5lIFRQUzY1MjE5X01GUF9DT0xEX1JF U0VUX0kyQ19DVFJMX01BU0sJCUJJVCgyKQo+ICsjZGVmaW5lIFRQUzY1MjE5X01GUF9XQVJNX1JF U0VUX0kyQ19DVFJMX01BU0sJCUJJVCgzKQo+ICsjZGVmaW5lIFRQUzY1MjE5X01GUF9HUElPX1NU QVRVU19NQVNLCQkJQklUKDQpCj4gKy8qIE1GUF8xIENvbmZpZyAqLwo+ICsjZGVmaW5lIFRQUzY1 MjE5X01GUF8xX1ZTRUxfRERSX1NFTF9NQVNLCQlCSVQoMCkKPiArI2RlZmluZSBUUFM2NTIxOV9N RlBfMV9WU0VMX1NEX1BPTF9NQVNLCQkJQklUKDEpCj4gKyNkZWZpbmUgVFBTNjUyMTlfTUZQXzFf VlNFTF9SQUlMX01BU0sJCQlCSVQoMikKPiArLyogTUZQXzIgQ29uZmlnICovCj4gKyNkZWZpbmUg VFBTNjUyMTlfTUZQXzJfTU9ERV9TVEJZX01BU0sJCQlHRU5NQVNLKDEsIDApCj4gKyNkZWZpbmUg VFBTNjUyMTlfTUZQXzJfTU9ERV9SRVNFVF9NQVNLCQkJQklUKDIpCj4gKyNkZWZpbmUgVFBTNjUy MTlfTUZQXzJfRU5fUEJfVlNFTlNFX0RFR0xfTUFTSwkJQklUKDMpCj4gKyNkZWZpbmUgVFBTNjUy MTlfTUZQXzJfRU5fUEJfVlNFTlNFX01BU0sJCUdFTk1BU0soNSwgNCkKPiArI2RlZmluZSBUUFM2 NTIxOV9NRlBfMl9XQVJNX0NPTERfUkVTRVRfTUFTSwkJQklUKDYpCj4gKyNkZWZpbmUgVFBTNjUy MTlfTUZQXzJfUFVfT05fRlNEX01BU0sJCQlCSVQoNykKPiArI2RlZmluZSBUUFM2NTIxOV9NRlBf Ml9FTgkJCQkwCj4gKyNkZWZpbmUgVFBTNjUyMTlfTUZQXzJfUEIJCQkJQklUKDQpCj4gKyNkZWZp bmUgVFBTNjUyMTlfTUZQXzJfVlNFTlNFCQkJCUJJVCg1KQo+ICsvKiBNQVNLX1VWIENvbmZpZyAq Lwo+ICsjZGVmaW5lIFRQUzY1MjE5X1JFR19NQVNLX1VWX0xETzFfVVZfTUFTSwkJQklUKDApCj4g KyNkZWZpbmUgVFBTNjUyMTlfUkVHX01BU0tfVVZfTERPMl9VVl9NQVNLCQlCSVQoMSkKPiArI2Rl ZmluZSBUUFM2NTIxOV9SRUdfTUFTS19VVl9MRE8zX1VWX01BU0sJCUJJVCgyKQo+ICsjZGVmaW5l IFRQUzY1MjE5X1JFR19NQVNLX1VWX0xETzRfVVZfTUFTSwkJQklUKDMpCj4gKyNkZWZpbmUgVFBT NjUyMTlfUkVHX01BU0tfVVZfQlVDSzFfVVZfTUFTSwkJQklUKDQpCj4gKyNkZWZpbmUgVFBTNjUy MTlfUkVHX01BU0tfVVZfQlVDSzJfVVZfTUFTSwkJQklUKDUpCj4gKyNkZWZpbmUgVFBTNjUyMTlf UkVHX01BU0tfVVZfQlVDSzNfVVZfTUFTSwkJQklUKDYpCj4gKyNkZWZpbmUgVFBTNjUyMTlfUkVH X01BU0tfVVZfUkVUUllfTUFTSwkJCUJJVCg3KQo+ICsvKiBNQVNLIENvbmZpZyAqLwo+ICsvLyBT RU5TT1JfTl9XQVJNX01BU0sgYWxyZWFkeSBkZWZpbmVkIGluIFRoZXJtYWwKPiArI2RlZmluZSBU UFM2NTIxOV9SRUdfTUFTS19JTlRfRk9SX1JWX01BU0sJCUJJVCg0KQo+ICsjZGVmaW5lIFRQUzY1 MjE5X1JFR19NQVNLX0VGRkVDVF9NQVNLCQkJR0VOTUFTSygyLCAxKQo+ICsjZGVmaW5lIFRQUzY1 MjE5X1JFR19NQVNLX0lOVF9GT1JfUEJfTUFTSwkJQklUKDcpCj4gKy8qIFVuZGVyVm9sdGFnZSAt IFNob3J0IHRvIEdORCAtIE92ZXJDdXJyZW50Ki8KPiArLyogTERPMy00ICovCj4gKyNkZWZpbmUg VFBTNjUyMTlfSU5UX0xETzNfU0NHX01BU0sJCQlCSVQoMCkKPiArI2RlZmluZSBUUFM2NTIxOV9J TlRfTERPM19PQ19NQVNLCQkJQklUKDEpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0xETzNfVVZf TUFTSwkJCUJJVCgyKQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9MRE80X1NDR19NQVNLCQkJQklU KDMpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0xETzRfT0NfTUFTSwkJCUJJVCg0KQo+ICsjZGVm aW5lIFRQUzY1MjE5X0lOVF9MRE80X1VWX01BU0sJCQlCSVQoNSkKPiArLyogTERPMS0yICovCj4g KyNkZWZpbmUgVFBTNjUyMTlfSU5UX0xETzFfU0NHX01BU0sJCQlCSVQoMCkKPiArI2RlZmluZSBU UFM2NTIxOV9JTlRfTERPMV9PQ19NQVNLCQkJQklUKDEpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5U X0xETzFfVVZfTUFTSwkJCUJJVCgyKQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9MRE8yX1NDR19N QVNLCQkJQklUKDMpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0xETzJfT0NfTUFTSwkJCUJJVCg0 KQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9MRE8yX1VWX01BU0sJCQlCSVQoNSkKPiArLyogQlVD SzMgKi8KPiArI2RlZmluZSBUUFM2NTIxOV9JTlRfQlVDSzNfU0NHX01BU0sJCQlCSVQoMCkKPiAr I2RlZmluZSBUUFM2NTIxOV9JTlRfQlVDSzNfT0NfTUFTSwkJCUJJVCgxKQo+ICsjZGVmaW5lIFRQ UzY1MjE5X0lOVF9CVUNLM19ORUdfT0NfTUFTSwkJCUJJVCgyKQo+ICsjZGVmaW5lIFRQUzY1MjE5 X0lOVF9CVUNLM19VVl9NQVNLCQkJQklUKDMpCj4gKy8qIEJVQ0sxLTIgKi8KPiArI2RlZmluZSBU UFM2NTIxOV9JTlRfQlVDSzFfU0NHX01BU0sJCQlCSVQoMCkKPiArI2RlZmluZSBUUFM2NTIxOV9J TlRfQlVDSzFfT0NfTUFTSwkJCUJJVCgxKQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9CVUNLMV9O RUdfT0NfTUFTSwkJCUJJVCgyKQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9CVUNLMV9VVl9NQVNL CQkJQklUKDMpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0JVQ0syX1NDR19NQVNLCQkJQklUKDQp Cj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0JVQ0syX09DX01BU0sJCQlCSVQoNSkKPiArI2RlZmlu ZSBUUFM2NTIxOV9JTlRfQlVDSzJfTkVHX09DX01BU0sJCQlCSVQoNikKPiArI2RlZmluZSBUUFM2 NTIxOV9JTlRfQlVDSzJfVVZfTUFTSwkJCUJJVCg3KQo+ICsvKiBUaGVybWFsIFNlbnNvciAgKi8K PiArI2RlZmluZSBUUFM2NTIxOV9JTlRfU0VOU09SXzNfV0FSTV9NQVNLCQkJQklUKDApCj4gKyNk ZWZpbmUgVFBTNjUyMTlfSU5UX1NFTlNPUl8yX1dBUk1fTUFTSwkJCUJJVCgxKQo+ICsjZGVmaW5l IFRQUzY1MjE5X0lOVF9TRU5TT1JfMV9XQVJNX01BU0sJCQlCSVQoMikKPiArI2RlZmluZSBUUFM2 NTIxOV9JTlRfU0VOU09SXzBfV0FSTV9NQVNLCQkJQklUKDMpCj4gKyNkZWZpbmUgVFBTNjUyMTlf SU5UX1NFTlNPUl8zX0hPVF9NQVNLCQkJQklUKDQpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX1NF TlNPUl8yX0hPVF9NQVNLCQkJQklUKDUpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX1NFTlNPUl8x X0hPVF9NQVNLCQkJQklUKDYpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX1NFTlNPUl8wX0hPVF9N QVNLCQkJQklUKDcpCj4gKy8qIFJlc2lkdWFsIFZvbHRhZ2UgKi8KPiArI2RlZmluZSBUUFM2NTIx OV9JTlRfQlVDSzFfUlZfTUFTSwkJCUJJVCgwKQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9CVUNL Ml9SVl9NQVNLCQkJQklUKDEpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0JVQ0szX1JWX01BU0sJ CQlCSVQoMikKPiArI2RlZmluZSBUUFM2NTIxOV9JTlRfTERPMV9SVl9NQVNLCQkJQklUKDMpCj4g KyNkZWZpbmUgVFBTNjUyMTlfSU5UX0xETzJfUlZfTUFTSwkJCUJJVCg0KQo+ICsjZGVmaW5lIFRQ UzY1MjE5X0lOVF9MRE8zX1JWX01BU0sJCQlCSVQoNSkKPiArI2RlZmluZSBUUFM2NTIxOV9JTlRf TERPNF9SVl9NQVNLCQkJQklUKDYpCj4gKy8qIFJlc2lkdWFsIFZvbHRhZ2UgU2h1dERvd24gKi8K PiArI2RlZmluZSBUUFM2NTIxOV9JTlRfQlVDSzFfUlZfU0RfTUFTSwkJCUJJVCgwKQo+ICsjZGVm aW5lIFRQUzY1MjE5X0lOVF9CVUNLMl9SVl9TRF9NQVNLCQkJQklUKDEpCj4gKyNkZWZpbmUgVFBT NjUyMTlfSU5UX0JVQ0szX1JWX1NEX01BU0sJCQlCSVQoMikKPiArI2RlZmluZSBUUFM2NTIxOV9J TlRfTERPMV9SVl9TRF9NQVNLCQkJQklUKDMpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX0xETzJf UlZfU0RfTUFTSwkJCUJJVCg0KQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9MRE8zX1JWX1NEX01B U0sJCQlCSVQoNSkKPiArI2RlZmluZSBUUFM2NTIxOV9JTlRfTERPNF9SVl9TRF9NQVNLCQkJQklU KDYpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX1RJTUVPVVRfTUFTSwkJCUJJVCg3KQo+ICsvKiBQ b3dlciBCdXR0b24gKi8KPiArI2RlZmluZSBUUFM2NTIxOV9JTlRfUEJfRkFMTElOR19FREdFX0RF VEVDVF9NQVNLCUJJVCgwKQo+ICsjZGVmaW5lIFRQUzY1MjE5X0lOVF9QQl9SSVNJTkdfRURHRV9E RVRFQ1RfTUFTSwkJQklUKDEpCj4gKyNkZWZpbmUgVFBTNjUyMTlfSU5UX1BCX1JFQUxfVElNRV9T VEFUVVNfTUFTSwkJQklUKDIpCj4gKwo+ICsjZGVmaW5lIFRQUzY1MjE5X1BCX1BPUwkJCQkJNwo+ ICsjZGVmaW5lIFRQUzY1MjE5X1RPX1JWX1BPUwkJCQk2Cj4gKyNkZWZpbmUgVFBTNjUyMTlfUlZf UE9TCQkJCQk1Cj4gKyNkZWZpbmUgVFBTNjUyMTlfU1lTX1BPUwkJCQk0Cj4gKyNkZWZpbmUgVFBT NjUyMTlfQlVDS18xXzJfUE9TCQkJCTMKPiArI2RlZmluZSBUUFM2NTIxOV9CVUNLXzNfUE9TCQkJ CTIKPiArI2RlZmluZSBUUFM2NTIxOV9MRE9fMV8yX1BPUwkJCQkxCj4gKyNkZWZpbmUgVFBTNjUy MTlfTERPXzNfNF9QT1MJCQkJMAo+ICsKPiArLyogSVJRcyAqLwo+ICtlbnVtIHsKPiArCS8qIExE TzMtNCByZWdpc3RlciBJUlFzICovCj4gKwlUUFM2NTIxOV9JTlRfTERPM19TQ0csCj4gKwlUUFM2 NTIxOV9JTlRfTERPM19PQywKPiArCVRQUzY1MjE5X0lOVF9MRE8zX1VWLAo+ICsJVFBTNjUyMTlf SU5UX0xETzRfU0NHLAo+ICsJVFBTNjUyMTlfSU5UX0xETzRfT0MsCj4gKwlUUFM2NTIxOV9JTlRf TERPNF9VViwKPiArCS8qIExETzEtMiAqLwo+ICsJVFBTNjUyMTlfSU5UX0xETzFfU0NHLAo+ICsJ VFBTNjUyMTlfSU5UX0xETzFfT0MsCj4gKwlUUFM2NTIxOV9JTlRfTERPMV9VViwKPiArCVRQUzY1 MjE5X0lOVF9MRE8yX1NDRywKPiArCVRQUzY1MjE5X0lOVF9MRE8yX09DLAo+ICsJVFBTNjUyMTlf SU5UX0xETzJfVVYsCj4gKwkvKiBCVUNLMyAqLwo+ICsJVFBTNjUyMTlfSU5UX0JVQ0szX1NDRywK PiArCVRQUzY1MjE5X0lOVF9CVUNLM19PQywKPiArCVRQUzY1MjE5X0lOVF9CVUNLM19ORUdfT0Ms Cj4gKwlUUFM2NTIxOV9JTlRfQlVDSzNfVVYsCj4gKwkvKiBCVUNLMS0yICovCj4gKwlUUFM2NTIx OV9JTlRfQlVDSzFfU0NHLAo+ICsJVFBTNjUyMTlfSU5UX0JVQ0sxX09DLAo+ICsJVFBTNjUyMTlf SU5UX0JVQ0sxX05FR19PQywKPiArCVRQUzY1MjE5X0lOVF9CVUNLMV9VViwKPiArCVRQUzY1MjE5 X0lOVF9CVUNLMl9TQ0csCj4gKwlUUFM2NTIxOV9JTlRfQlVDSzJfT0MsCj4gKwlUUFM2NTIxOV9J TlRfQlVDSzJfTkVHX09DLAo+ICsJVFBTNjUyMTlfSU5UX0JVQ0syX1VWLAo+ICsJLyogVGhlcm1h bCBTZW5zb3IgICovCj4gKwlUUFM2NTIxOV9JTlRfU0VOU09SXzNfV0FSTSwKPiArCVRQUzY1MjE5 X0lOVF9TRU5TT1JfMl9XQVJNLAo+ICsJVFBTNjUyMTlfSU5UX1NFTlNPUl8xX1dBUk0sCj4gKwlU UFM2NTIxOV9JTlRfU0VOU09SXzBfV0FSTSwKPiArCVRQUzY1MjE5X0lOVF9TRU5TT1JfM19IT1Qs Cj4gKwlUUFM2NTIxOV9JTlRfU0VOU09SXzJfSE9ULAo+ICsJVFBTNjUyMTlfSU5UX1NFTlNPUl8x X0hPVCwKPiArCVRQUzY1MjE5X0lOVF9TRU5TT1JfMF9IT1QsCj4gKwkvKiBSZXNpZHVhbCBWb2x0 YWdlICovCj4gKwlUUFM2NTIxOV9JTlRfQlVDSzFfUlYsCj4gKwlUUFM2NTIxOV9JTlRfQlVDSzJf UlYsCj4gKwlUUFM2NTIxOV9JTlRfQlVDSzNfUlYsCj4gKwlUUFM2NTIxOV9JTlRfTERPMV9SViwK PiArCVRQUzY1MjE5X0lOVF9MRE8yX1JWLAo+ICsJVFBTNjUyMTlfSU5UX0xETzNfUlYsCj4gKwlU UFM2NTIxOV9JTlRfTERPNF9SViwKPiArCS8qIFJlc2lkdWFsIFZvbHRhZ2UgU2h1dERvd24gKi8K PiArCVRQUzY1MjE5X0lOVF9CVUNLMV9SVl9TRCwKPiArCVRQUzY1MjE5X0lOVF9CVUNLMl9SVl9T RCwKPiArCVRQUzY1MjE5X0lOVF9CVUNLM19SVl9TRCwKPiArCVRQUzY1MjE5X0lOVF9MRE8xX1JW X1NELAo+ICsJVFBTNjUyMTlfSU5UX0xETzJfUlZfU0QsCj4gKwlUUFM2NTIxOV9JTlRfTERPM19S Vl9TRCwKPiArCVRQUzY1MjE5X0lOVF9MRE80X1JWX1NELAo+ICsJVFBTNjUyMTlfSU5UX1RJTUVP VVQsCj4gKwkvKiBQb3dlciBCdXR0b24gKi8KPiArCVRQUzY1MjE5X0lOVF9QQl9GQUxMSU5HX0VE R0VfREVURUNULAo+ICsJVFBTNjUyMTlfSU5UX1BCX1JJU0lOR19FREdFX0RFVEVDVCwKPiArfTsK PiArCj4gK2VudW0gdHBzNjUyMTlfcmVndWxhdG9yX2lkIHsKPiArCS8qIERDREMncyAqLwo+ICsJ VFBTNjUyMTlfQlVDS18xLAo+ICsJVFBTNjUyMTlfQlVDS18yLAo+ICsJVFBTNjUyMTlfQlVDS18z LAo+ICsJLyogTERPcyAqLwo+ICsJVFBTNjUyMTlfTERPXzEsCj4gKwlUUFM2NTIxOV9MRE9fMiwK PiArCVRQUzY1MjE5X0xET18zLAo+ICsJVFBTNjUyMTlfTERPXzQsCj4gK307Cj4gKwo+ICsvKiBO dW1iZXIgb2Ygc3RlcC1kb3duIGNvbnZlcnRlcnMgYXZhaWxhYmxlICovCj4gKyNkZWZpbmUgVFBT NjUyMTlfTlVNX0RDREMJCTMKPiArLyogTnVtYmVyIG9mIExETyB2b2x0YWdlIHJlZ3VsYXRvcnMg YXZhaWxhYmxlICovCj4gKyNkZWZpbmUgVFBTNjUyMTlfTlVNX0xETwkJNAo+ICsvKiBOdW1iZXIg b2YgdG90YWwgcmVndWxhdG9ycyBhdmFpbGFibGUgKi8KPiArI2RlZmluZSBUUFM2NTIxOV9OVU1f UkVHVUxBVE9SCQkoVFBTNjUyMTlfTlVNX0RDREMgKyBUUFM2NTIxOV9OVU1fTERPKQo+ICsKPiAr LyogRGVmaW5lIHRoZSBUUFM2NTIxOSBJUlEgbnVtYmVycyAqLwo+ICtlbnVtIHRwczY1MjE5X2ly cXMgewo+ICsJLyogSU5UIHNvdXJjZSByZWdpc3RlcnMgKi8KPiArCVRQUzY1MjE5X1RPX1JWX1NE X1NFVF9JUlEsCj4gKwlUUFM2NTIxOV9SVl9TRVRfSVJRLAo+ICsJVFBTNjUyMTlfU1lTX1NFVF9J UlEsCj4gKwlUUFM2NTIxOV9CVUNLXzFfMl9TRVRfSVJRLAo+ICsJVFBTNjUyMTlfQlVDS18zX1NF VF9JUlEsCj4gKwlUUFM2NTIxOV9MRE9fMV8yX1NFVF9JUlEsCj4gKwlUUFM2NTIxOV9MRE9fM180 X1NFVF9JUlEsCj4gKwlUUFM2NTIxOV9QQl9TRVRfSVJRLAo+ICt9Owo+ICsKPiArLyoqCj4gKyAq IHN0cnVjdCB0cHM2NTIxOSAtIHRwczY1MjE5IHN1Yi1kcml2ZXIgY2hpcCBhY2Nlc3Mgcm91dGlu ZXMKPiArICoKPiArICogRGV2aWNlIGRhdGEgbWF5IGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBUUFM2 NTIxOSBjaGlwCj4gKyAqCj4gKyAqIEBkZXYgTUZEIGRldmljZQo+ICsgKiBAcmVnbWFwIFJlZ21h cCBmb3IgYWNjZXNzaW5nIHRoZSBkZXZpY2UgcmVnaXN0ZXJzCj4gKyAqIEBpcnFfZGF0YSBSZWdt YXAgaXJxIGRhdGEgdXNlZCBmb3IgdGhlIGlycSBjaGlwCj4gKyAqIEBuYiBub3RpZmllciBibG9j ayBmb3IgdGhlIHJlc3RhcnQgaGFuZGxlcgo+ICsgKi8KClRoaXMgaGVhZGVyIG5lZWRzIHdvcmsu CgpDYW4geW91IHRyeSBhbiBjb21waWxlIHdpdGggVz0xIHBsZWFzZS4KCj4gK3N0cnVjdCB0cHM2 NTIxOSB7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cj4gKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7 Cj4gKwo+ICsJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YTsKPiArCXN0cnVj dCBub3RpZmllcl9ibG9jayBuYjsKPiArfTsKPiArCj4gKyNlbmRpZiAvKiAgTUZEX1RQUzY1MjE5 X0ggKi8KClN1cGVyZmx1b3VzICIgIi4KCi0tIApMZWUgSm9uZXMgW+adjueQvOaWr10KCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJu ZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK