From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lee Jones Subject: Re: [PATCH v3] mfd: mt6360: add pmic mt6360 driver Date: Fri, 4 Oct 2019 14:33:24 +0100 Message-ID: <20191004133324.GE18429@dell> References: <1569338741-2784-1-git-send-email-gene.chen.richtek@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: Content-Disposition: inline In-Reply-To: <1569338741-2784-1-git-send-email-gene.chen.richtek@gmail.com> Sender: linux-kernel-owner@vger.kernel.org To: Gene Chen Cc: matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, gene_chen@richtek.com, Wilma.Wu@mediatek.com, shufan_lee@richtek.com, cy_huang@richtek.com List-Id: linux-mediatek@lists.infradead.org Wolfram, Would you be kind enough to grep for your name below? On Tue, 24 Sep 2019, Gene Chen wrote: > From: Gene Chen > > Add mfd driver for mt6360 pmic chip include > Battery Charger/USB_PD/Flash LED/RGB LED/LDO/Buck > > Signed-off-by: Gene Chen --- > drivers/mfd/Kconfig | 12 + > drivers/mfd/Makefile | 1 + > drivers/mfd/mt6360-core.c | 463 +++++++++++++++++++++++++++++++++++++ > include/linux/mfd/mt6360-private.h | 279 ++++++++++++++++++++++ > include/linux/mfd/mt6360.h | 33 +++ > 5 files changed, 788 insertions(+) > create mode 100644 drivers/mfd/mt6360-core.c > create mode 100644 include/linux/mfd/mt6360-private.h > create mode 100644 include/linux/mfd/mt6360.h > > changelogs between v1 & v2 > - include missing header file > > changelogs between v2 & v3 > - add changelogs > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index f129f96..a422c76 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -862,6 +862,18 @@ config MFD_MAX8998 > additional drivers must be enabled in order to use the functionality > of the device. > > +config MFD_MT6360 > + tristate "Mediatek MT6360 SubPMIC" > + select MFD_CORE > + select REGMAP_I2C > + select REGMAP_IRQ > + depends on I2C > + help > + Say Y here to enable MT6360 PMU/PMIC/LDO functional support. > + PMU part include charger, flashlight, rgb led > + PMIC part include 2-channel BUCKs and 2-channel LDOs > + LDO part include 4-channel LDOs PMU part includes Charger, Flashlight, RGB and LED PMIC part includes 2-channel BUCKs and 2-channel LDOs LDO part includes 4-channel LDOs > config MFD_MT6397 > tristate "MediaTek MT6397 PMIC Support" > select MFD_CORE > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index f026ada..77a8f0b 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -241,6 +241,7 @@ obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o > obj-$(CONFIG_INTEL_SOC_PMIC_BXTWC) += intel_soc_pmic_bxtwc.o > obj-$(CONFIG_INTEL_SOC_PMIC_CHTWC) += intel_soc_pmic_chtwc.o > obj-$(CONFIG_INTEL_SOC_PMIC_CHTDC_TI) += intel_soc_pmic_chtdc_ti.o > +obj-$(CONFIG_MFD_MT6360) += mt6360-core.o > obj-$(CONFIG_MFD_MT6397) += mt6397-core.o > > obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o > diff --git a/drivers/mfd/mt6360-core.c b/drivers/mfd/mt6360-core.c > new file mode 100644 > index 0000000..d3580618 > --- /dev/null > +++ b/drivers/mfd/mt6360-core.c > @@ -0,0 +1,463 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2019 MediaTek Inc. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +/* reg 0 -> 0 ~ 7 */ > +#define MT6360_CHG_TREG_EVT (4) > +#define MT6360_CHG_AICR_EVT (5) > +#define MT6360_CHG_MIVR_EVT (6) > +#define MT6360_PWR_RDY_EVT (7) > +/* REG 1 -> 8 ~ 15 */ > +#define MT6360_CHG_BATSYSUV_EVT (9) > +#define MT6360_FLED_CHG_VINOVP_EVT (11) > +#define MT6360_CHG_VSYSUV_EVT (12) > +#define MT6360_CHG_VSYSOV_EVT (13) > +#define MT6360_CHG_VBATOV_EVT (14) > +#define MT6360_CHG_VBUSOV_EVT (15) > +/* REG 2 -> 16 ~ 23 */ > +/* REG 3 -> 24 ~ 31 */ > +#define MT6360_WD_PMU_DET (25) > +#define MT6360_WD_PMU_DONE (26) > +#define MT6360_CHG_TMRI (27) > +#define MT6360_CHG_ADPBADI (29) > +#define MT6360_CHG_RVPI (30) > +#define MT6360_OTPI (31) > +/* REG 4 -> 32 ~ 39 */ > +#define MT6360_CHG_AICCMEASL (32) > +#define MT6360_CHGDET_DONEI (34) > +#define MT6360_WDTMRI (35) > +#define MT6360_SSFINISHI (36) > +#define MT6360_CHG_RECHGI (37) > +#define MT6360_CHG_TERMI (38) > +#define MT6360_CHG_IEOCI (39) > +/* REG 5 -> 40 ~ 47 */ > +#define MT6360_PUMPX_DONEI (40) > +#define MT6360_BAT_OVP_ADC_EVT (41) > +#define MT6360_TYPEC_OTP_EVT (42) > +#define MT6360_ADC_WAKEUP_EVT (43) > +#define MT6360_ADC_DONEI (44) > +#define MT6360_BST_BATUVI (45) > +#define MT6360_BST_VBUSOVI (46) > +#define MT6360_BST_OLPI (47) > +/* REG 6 -> 48 ~ 55 */ > +#define MT6360_ATTACH_I (48) > +#define MT6360_DETACH_I (49) > +#define MT6360_QC30_STPDONE (51) > +#define MT6360_QC_VBUSDET_DONE (52) > +#define MT6360_HVDCP_DET (53) > +#define MT6360_CHGDETI (54) > +#define MT6360_DCDTI (55) > +/* REG 7 -> 56 ~ 63 */ > +#define MT6360_FOD_DONE_EVT (56) > +#define MT6360_FOD_OV_EVT (57) > +#define MT6360_CHRDET_UVP_EVT (58) > +#define MT6360_CHRDET_OVP_EVT (59) > +#define MT6360_CHRDET_EXT_EVT (60) > +#define MT6360_FOD_LR_EVT (61) > +#define MT6360_FOD_HR_EVT (62) > +#define MT6360_FOD_DISCHG_FAIL_EVT (63) > +/* REG 8 -> 64 ~ 71 */ > +#define MT6360_USBID_EVT (64) > +#define MT6360_APWDTRST_EVT (65) > +#define MT6360_EN_EVT (66) > +#define MT6360_QONB_RST_EVT (67) > +#define MT6360_MRSTB_EVT (68) > +#define MT6360_OTP_EVT (69) > +#define MT6360_VDDAOV_EVT (70) > +#define MT6360_SYSUV_EVT (71) > +/* REG 9 -> 72 ~ 79 */ > +#define MT6360_FLED_STRBPIN_EVT (72) > +#define MT6360_FLED_TORPIN_EVT (73) > +#define MT6360_FLED_TX_EVT (74) > +#define MT6360_FLED_LVF_EVT (75) > +#define MT6360_FLED2_SHORT_EVT (78) > +#define MT6360_FLED1_SHORT_EVT (79) > +/* REG 10 -> 80 ~ 87 */ > +#define MT6360_FLED2_STRB_EVT (80) > +#define MT6360_FLED1_STRB_EVT (81) > +#define MT6360_FLED2_STRB_TO_EVT (82) > +#define MT6360_FLED1_STRB_TO_EVT (83) > +#define MT6360_FLED2_TOR_EVT (84) > +#define MT6360_FLED1_TOR_EVT (85) > +/* REG 11 -> 88 ~ 95 */ > +/* REG 12 -> 96 ~ 103 */ > +#define MT6360_BUCK1_PGB_EVT (96) > +#define MT6360_BUCK1_OC_EVT (100) > +#define MT6360_BUCK1_OV_EVT (101) > +#define MT6360_BUCK1_UV_EVT (102) > +/* REG 13 -> 104 ~ 111 */ > +#define MT6360_BUCK2_PGB_EVT (104) > +#define MT6360_BUCK2_OC_EVT (108) > +#define MT6360_BUCK2_OV_EVT (109) > +#define MT6360_BUCK2_UV_EVT (110) > +/* REG 14 -> 112 ~ 119 */ > +#define MT6360_LDO1_OC_EVT (113) > +#define MT6360_LDO2_OC_EVT (114) > +#define MT6360_LDO3_OC_EVT (115) > +#define MT6360_LDO5_OC_EVT (117) > +#define MT6360_LDO6_OC_EVT (118) > +#define MT6360_LDO7_OC_EVT (119) > +/* REG 15 -> 120 ~ 127 */ > +#define MT6360_LDO1_PGB_EVT (121) > +#define MT6360_LDO2_PGB_EVT (122) > +#define MT6360_LDO3_PGB_EVT (123) > +#define MT6360_LDO5_PGB_EVT (125) > +#define MT6360_LDO6_PGB_EVT (126) > +#define MT6360_LDO7_PGB_EVT (127) > + > +#define MT6360_REGMAP_IRQ_REG(_irq_evt) \ > + REGMAP_IRQ_REG(_irq_evt, (_irq_evt) / 8, BIT((_irq_evt) % 8)) > + > +#define MT6360_MFD_CELL(_name) \ > + { \ > + .name = #_name, \ > + .of_compatible = "mediatek," #_name, \ > + .num_resources = ARRAY_SIZE(_name##_resources), \ > + .resources = _name##_resources, \ > + } Please do not roll your own MACROS like this. If they are helpful for you, they are likely to be helpful for others. However, this is your lucky day, as we've been here before. Please rebase onto the MFD tree where you will find some pre-authored macros which aren't too dissimilar to this one. Please use one of those instead. > +static const struct regmap_irq mt6360_pmu_irqs[] = { > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_TREG_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_AICR_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_MIVR_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_PWR_RDY_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_BATSYSUV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED_CHG_VINOVP_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_VSYSUV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_VSYSOV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_VBATOV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_VBUSOV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_WD_PMU_DET), > + MT6360_REGMAP_IRQ_REG(MT6360_WD_PMU_DONE), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_TMRI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_ADPBADI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_RVPI), > + MT6360_REGMAP_IRQ_REG(MT6360_OTPI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_AICCMEASL), > + MT6360_REGMAP_IRQ_REG(MT6360_CHGDET_DONEI), > + MT6360_REGMAP_IRQ_REG(MT6360_WDTMRI), > + MT6360_REGMAP_IRQ_REG(MT6360_SSFINISHI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_RECHGI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_TERMI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_IEOCI), > + MT6360_REGMAP_IRQ_REG(MT6360_PUMPX_DONEI), > + MT6360_REGMAP_IRQ_REG(MT6360_CHG_TREG_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BAT_OVP_ADC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_TYPEC_OTP_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_ADC_WAKEUP_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_ADC_DONEI), > + MT6360_REGMAP_IRQ_REG(MT6360_BST_BATUVI), > + MT6360_REGMAP_IRQ_REG(MT6360_BST_VBUSOVI), > + MT6360_REGMAP_IRQ_REG(MT6360_BST_OLPI), > + MT6360_REGMAP_IRQ_REG(MT6360_ATTACH_I), > + MT6360_REGMAP_IRQ_REG(MT6360_DETACH_I), > + MT6360_REGMAP_IRQ_REG(MT6360_QC30_STPDONE), > + MT6360_REGMAP_IRQ_REG(MT6360_QC_VBUSDET_DONE), > + MT6360_REGMAP_IRQ_REG(MT6360_HVDCP_DET), > + MT6360_REGMAP_IRQ_REG(MT6360_CHGDETI), > + MT6360_REGMAP_IRQ_REG(MT6360_DCDTI), > + MT6360_REGMAP_IRQ_REG(MT6360_FOD_DONE_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FOD_OV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHRDET_UVP_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHRDET_OVP_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_CHRDET_EXT_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FOD_LR_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FOD_HR_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FOD_DISCHG_FAIL_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_USBID_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_APWDTRST_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_EN_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_QONB_RST_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_MRSTB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_OTP_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_VDDAOV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_SYSUV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED_STRBPIN_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED_TORPIN_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED_TX_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED_LVF_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED2_SHORT_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED1_SHORT_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED2_STRB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED1_STRB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED2_STRB_TO_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED1_STRB_TO_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED2_TOR_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_FLED1_TOR_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK1_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK1_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK1_OV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK1_UV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK2_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK2_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK2_OV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_BUCK2_UV_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO1_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO2_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO3_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO5_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO6_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO7_OC_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO1_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO2_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO3_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO5_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO6_PGB_EVT), > + MT6360_REGMAP_IRQ_REG(MT6360_LDO7_PGB_EVT), > +}; > + > +static int mt6360_pmu_handle_post_irq(void *irq_drv_data) > +{ > + struct mt6360_pmu_info *mpi = irq_drv_data; > + > + return regmap_update_bits(mpi->regmap, > + MT6360_PMU_IRQ_SET, MT6360_IRQ_RETRIG, MT6360_IRQ_RETRIG); > +} > + > +static const struct regmap_irq_chip mt6360_pmu_irq_chip = { > + .irqs = mt6360_pmu_irqs, > + .num_irqs = ARRAY_SIZE(mt6360_pmu_irqs), > + .num_regs = MT6360_PMU_IRQ_REGNUM, > + .mask_base = MT6360_PMU_CHG_MASK1, > + .status_base = MT6360_PMU_CHG_IRQ1, > + .ack_base = MT6360_PMU_CHG_IRQ1, > + .init_ack_masked = true, > + .use_ack = true, > + .handle_post_irq = mt6360_pmu_handle_post_irq, > +}; > + > +static const struct regmap_config mt6360_pmu_regmap_config = { > + .reg_bits = 8, > + .val_bits = 8, > + .max_register = MT6360_PMU_MAXREG, > +}; > + > +static const struct resource mt6360_adc_resources[] = { > + DEFINE_RES_IRQ_NAMED(MT6360_ADC_DONEI, "adc_donei"), > +}; > + > +static const struct resource mt6360_chg_resources[] = { > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_TREG_EVT, "chg_treg_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_PWR_RDY_EVT, "pwr_rdy_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_BATSYSUV_EVT, "chg_batsysuv_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_VSYSUV_EVT, "chg_vsysuv_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_VSYSOV_EVT, "chg_vsysov_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_VBATOV_EVT, "chg_vbatov_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_VBUSOV_EVT, "chg_vbusov_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_AICCMEASL, "chg_aiccmeasl"), > + DEFINE_RES_IRQ_NAMED(MT6360_WDTMRI, "wdtmri"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_RECHGI, "chg_rechgi"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_TERMI, "chg_termi"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHG_IEOCI, "chg_ieoci"), > + DEFINE_RES_IRQ_NAMED(MT6360_PUMPX_DONEI, "pumpx_donei"), > + DEFINE_RES_IRQ_NAMED(MT6360_ATTACH_I, "attach_i"), > + DEFINE_RES_IRQ_NAMED(MT6360_CHRDET_EXT_EVT, "chrdet_ext_evt"), > +}; > + > +static const struct resource mt6360_led_resources[] = { > + DEFINE_RES_IRQ_NAMED(MT6360_FLED_CHG_VINOVP_EVT, "fled_chg_vinovp_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_FLED_LVF_EVT, "fled_lvf_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_FLED2_SHORT_EVT, "fled2_short_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_FLED1_SHORT_EVT, "fled1_short_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_FLED2_STRB_TO_EVT, "fled2_strb_to_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_FLED1_STRB_TO_EVT, "fled1_strb_to_evt"), > +}; > + > +static const struct resource mt6360_pmic_resources[] = { > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK1_PGB_EVT, "buck1_pgb_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK1_OC_EVT, "buck1_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK1_OV_EVT, "buck1_ov_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK1_UV_EVT, "buck1_uv_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK2_PGB_EVT, "buck2_pgb_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK2_OC_EVT, "buck2_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK2_OV_EVT, "buck2_ov_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_BUCK2_UV_EVT, "buck2_uv_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO6_OC_EVT, "ldo6_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO7_OC_EVT, "ldo7_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO6_PGB_EVT, "ldo6_pgb_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO7_PGB_EVT, "ldo7_pgb_evt"), > +}; > + > +static const struct resource mt6360_ldo_resources[] = { > + DEFINE_RES_IRQ_NAMED(MT6360_LDO1_OC_EVT, "ldo1_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO2_OC_EVT, "ldo2_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO3_OC_EVT, "ldo3_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO5_OC_EVT, "ldo5_oc_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO1_PGB_EVT, "ldo1_pgb_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO2_PGB_EVT, "ldo2_pgb_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO3_PGB_EVT, "ldo3_pgb_evt"), > + DEFINE_RES_IRQ_NAMED(MT6360_LDO5_PGB_EVT, "ldo5_pgb_evt"), > +}; > + > +static const struct mfd_cell mt6360_devs[] = { > + MT6360_MFD_CELL(mt6360_adc), > + MT6360_MFD_CELL(mt6360_chg), > + MT6360_MFD_CELL(mt6360_led), > + MT6360_MFD_CELL(mt6360_pmic), > + MT6360_MFD_CELL(mt6360_ldo), > + /* tcpc dev */ > + { > + .name = "mt6360_tcpc", > + .of_compatible = "mediatek,mt6360_tcpc", There is a macro for this too (OF_MFD_CELL()) > + }, > +}; > + > +static const unsigned short mt6360_slave_addr[MT6360_SLAVE_MAX] = { > + MT6360_PMU_SLAVEID, > + MT6360_PMIC_SLAVEID, > + MT6360_LDO_SLAVEID, > + MT6360_TCPC_SLAVEID, > +}; > + > +static int mt6360_pmu_probe(struct i2c_client *client, > + const struct i2c_device_id *id) If you use .probe_new (see below) you can omit the 'id' param. > +{ > + struct mt6360_pmu_info *mpi; We normally call this ddata. > + unsigned int reg_data = 0; > + int i, ret; > + > + mpi = devm_kzalloc(&client->dev, sizeof(*mpi), GFP_KERNEL); > + if (!mpi) > + return -ENOMEM; '\n' here. > + mpi->dev = &client->dev; > + i2c_set_clientdata(client, mpi); > + > + /* regmap regiser */ This comment is spelt incorrectly and doesn't really add anything. > + mpi->regmap = devm_regmap_init_i2c(client, &mt6360_pmu_regmap_config); > + if (IS_ERR(mpi->regmap)) { > + dev_err(&client->dev, "regmap register fail\n"); "Failed to register regmap" > + return PTR_ERR(mpi->regmap); > + } '\n' here. > + /* chip id check */ Again, the code is pretty obvious. > + ret = regmap_read(mpi->regmap, MT6360_PMU_DEV_INFO, ®_data); > + if (ret < 0) { > + dev_err(&client->dev, "device not found\n"); "Device not found" > + return ret; > + } '\n' here. > + if ((reg_data & CHIP_VEN_MASK) != CHIP_VEN_MT6360) { > + dev_err(&client->dev, "not mt6360 chip\n"); "Device not supported" > + return -ENODEV; > + } '\n' here. > + mpi->chip_rev = reg_data & CHIP_REV_MASK; Do this above the check, then do (mpi->chip_rev != CHIP_VEN_MT6360) ... above. > + /* irq register */ Please remove all of these comments. > + memcpy(&mpi->irq_chip, &mt6360_pmu_irq_chip, sizeof(mpi->irq_chip)); Why do we need to make a copy of it? > + mpi->irq_chip.name = dev_name(&client->dev); We already know the name. Why do we need to do this dynamically? > + mpi->irq_chip.irq_drv_data = mpi; We already saved ddata. Why do we need to save it here as well? > + ret = devm_regmap_add_irq_chip(&client->dev, mpi->regmap, client->irq, > + IRQF_TRIGGER_FALLING, 0, &mpi->irq_chip, > + &mpi->irq_data); > + if (ret < 0) { Is (ret > 0) valid? > + dev_err(&client->dev, "regmap irq chip add fail\n"); "Failed to add Regmap IRQ Chip" > + return ret; > + } '\n' here. > + /* new i2c slave device */ > + for (i = 0; i < MT6360_SLAVE_MAX; i++) { > + if (mt6360_slave_addr[i] == client->addr) { > + mpi->i2c[i] = client; > + continue; > + } > + mpi->i2c[i] = i2c_new_dummy(client->adapter, > + mt6360_slave_addr[i]); > + if (!mpi->i2c[i]) { > + dev_err(&client->dev, "new i2c dev [%d] fail\n", i); > + ret = -ENODEV; > + goto out; > + } > + i2c_set_clientdata(mpi->i2c[i], mpi); > + } This doesn't look right to me. Wolfram, would you be kind enough to take a look? '\n' here. > + /* mfd cell register */ > + ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_AUTO, > + mt6360_devs, ARRAY_SIZE(mt6360_devs), NULL, > + 0, regmap_irq_get_domain(mpi->irq_data)); > + if (ret < 0) { > + dev_err(&client->dev, "mfd add cells fail\n"); > + goto out; > + } '\n' here. > + dev_info(&client->dev, "Successfully probed\n"); Please remove this line. It doesn't provide anything. > + return 0; > +out: > + while (--i >= 0) { > + if (mpi->i2c[i]->addr == client->addr) > + continue; > + i2c_unregister_device(mpi->i2c[i]); > + } '\n' here. > + return ret; > +} > + > +static int mt6360_pmu_remove(struct i2c_client *client) > +{ > + struct mt6360_pmu_info *mpi = i2c_get_clientdata(client); > + int i; > + > + for (i = 0; i < MT6360_SLAVE_MAX; i++) { > + if (mpi->i2c[i]->addr == client->addr) > + continue; > + i2c_unregister_device(mpi->i2c[i]); > + } '\n' here. > + return 0; > +} > + > +static int __maybe_unused mt6360_pmu_suspend(struct device *dev) > +{ > + struct i2c_client *i2c = to_i2c_client(dev); > + > + if (device_may_wakeup(dev)) > + enable_irq_wake(i2c->irq); '\n' here. > + return 0; > +} > + > +static int __maybe_unused mt6360_pmu_resume(struct device *dev) > +{ > + > + struct i2c_client *i2c = to_i2c_client(dev); > + > + if (device_may_wakeup(dev)) > + disable_irq_wake(i2c->irq); '\n' here. > + return 0; > +} > + > +static SIMPLE_DEV_PM_OPS(mt6360_pmu_pm_ops, > + mt6360_pmu_suspend, mt6360_pmu_resume); > + > +static const struct of_device_id __maybe_unused mt6360_pmu_of_id[] = { > + { .compatible = "mediatek,mt6360_pmu", }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, mt6360_pmu_of_id); > + > +static const struct i2c_device_id mt6360_pmu_id[] = { > + { "mt6360_pmu", 0 }, > + {}, > +}; > +MODULE_DEVICE_TABLE(i2c, mt6360_pmu_id); If you use .probe_new (see below, you can remove this table. > +static struct i2c_driver mt6360_pmu_driver = { > + .driver = { > + .name = "mt6360_pmu", > + .owner = THIS_MODULE, This is no longer required. > + .pm = &mt6360_pmu_pm_ops, > + .of_match_table = of_match_ptr(mt6360_pmu_of_id), > + }, > + .probe = mt6360_pmu_probe, Use .probe_new here. > + .remove = mt6360_pmu_remove, > + .id_table = mt6360_pmu_id, > +}; > +module_i2c_driver(mt6360_pmu_driver); > + > +MODULE_AUTHOR("CY_Huang "); > +MODULE_DESCRIPTION("MT6360 PMU I2C Driver"); > +MODULE_LICENSE("GPL"); > +MODULE_VERSION("1.0.0"); > diff --git a/include/linux/mfd/mt6360-private.h b/include/linux/mfd/mt6360-private.h > new file mode 100644 > index 0000000..b07b3d9 > --- /dev/null > +++ b/include/linux/mfd/mt6360-private.h Why do you need 2 header files? > @@ -0,0 +1,279 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2019 MediaTek Inc. > + */ > + > +#ifndef __MT6360_PRIVATE_H__ > +#define __MT6360_PRIVATE_H__ __MFD_MT6360_H__ > +#include > + > +/* PMU register defininition */ > +#define MT6360_PMU_DEV_INFO (0x00) > +#define MT6360_PMU_CORE_CTRL1 (0x01) > +#define MT6360_PMU_RST1 (0x02) > +#define MT6360_PMU_CRCEN (0x03) > +#define MT6360_PMU_RST_PAS_CODE1 (0x04) > +#define MT6360_PMU_RST_PAS_CODE2 (0x05) > +#define MT6360_PMU_CORE_CTRL2 (0x06) > +#define MT6360_PMU_TM_PAS_CODE1 (0x07) > +#define MT6360_PMU_TM_PAS_CODE2 (0x08) > +#define MT6360_PMU_TM_PAS_CODE3 (0x09) > +#define MT6360_PMU_TM_PAS_CODE4 (0x0A) > +#define MT6360_PMU_IRQ_IND (0x0B) > +#define MT6360_PMU_IRQ_MASK (0x0C) > +#define MT6360_PMU_IRQ_SET (0x0D) > +#define MT6360_PMU_SHDN_CTRL (0x0E) > +#define MT6360_PMU_TM_INF (0x0F) > +#define MT6360_PMU_I2C_CTRL (0x10) > +#define MT6360_PMU_CHG_CTRL1 (0x11) > +#define MT6360_PMU_CHG_CTRL2 (0x12) > +#define MT6360_PMU_CHG_CTRL3 (0x13) > +#define MT6360_PMU_CHG_CTRL4 (0x14) > +#define MT6360_PMU_CHG_CTRL5 (0x15) > +#define MT6360_PMU_CHG_CTRL6 (0x16) > +#define MT6360_PMU_CHG_CTRL7 (0x17) > +#define MT6360_PMU_CHG_CTRL8 (0x18) > +#define MT6360_PMU_CHG_CTRL9 (0x19) > +#define MT6360_PMU_CHG_CTRL10 (0x1A) > +#define MT6360_PMU_CHG_CTRL11 (0x1B) > +#define MT6360_PMU_CHG_CTRL12 (0x1C) > +#define MT6360_PMU_CHG_CTRL13 (0x1D) > +#define MT6360_PMU_CHG_CTRL14 (0x1E) > +#define MT6360_PMU_CHG_CTRL15 (0x1F) > +#define MT6360_PMU_CHG_CTRL16 (0x20) > +#define MT6360_PMU_CHG_AICC_RESULT (0x21) > +#define MT6360_PMU_DEVICE_TYPE (0x22) > +#define MT6360_PMU_QC_CONTROL1 (0x23) > +#define MT6360_PMU_QC_CONTROL2 (0x24) > +#define MT6360_PMU_QC30_CONTROL1 (0x25) > +#define MT6360_PMU_QC30_CONTROL2 (0x26) > +#define MT6360_PMU_USB_STATUS1 (0x27) > +#define MT6360_PMU_QC_STATUS1 (0x28) > +#define MT6360_PMU_QC_STATUS2 (0x29) > +#define MT6360_PMU_CHG_PUMP (0x2A) > +#define MT6360_PMU_CHG_CTRL17 (0x2B) > +#define MT6360_PMU_CHG_CTRL18 (0x2C) > +#define MT6360_PMU_CHRDET_CTRL1 (0x2D) > +#define MT6360_PMU_CHRDET_CTRL2 (0x2E) > +#define MT6360_PMU_DPDN_CTRL (0x2F) > +#define MT6360_PMU_CHG_HIDDEN_CTRL1 (0x30) > +#define MT6360_PMU_CHG_HIDDEN_CTRL2 (0x31) > +#define MT6360_PMU_CHG_HIDDEN_CTRL3 (0x32) > +#define MT6360_PMU_CHG_HIDDEN_CTRL4 (0x33) > +#define MT6360_PMU_CHG_HIDDEN_CTRL5 (0x34) > +#define MT6360_PMU_CHG_HIDDEN_CTRL6 (0x35) > +#define MT6360_PMU_CHG_HIDDEN_CTRL7 (0x36) > +#define MT6360_PMU_CHG_HIDDEN_CTRL8 (0x37) > +#define MT6360_PMU_CHG_HIDDEN_CTRL9 (0x38) > +#define MT6360_PMU_CHG_HIDDEN_CTRL10 (0x39) > +#define MT6360_PMU_CHG_HIDDEN_CTRL11 (0x3A) > +#define MT6360_PMU_CHG_HIDDEN_CTRL12 (0x3B) > +#define MT6360_PMU_CHG_HIDDEN_CTRL13 (0x3C) > +#define MT6360_PMU_CHG_HIDDEN_CTRL14 (0x3D) > +#define MT6360_PMU_CHG_HIDDEN_CTRL15 (0x3E) > +#define MT6360_PMU_CHG_HIDDEN_CTRL16 (0x3F) > +#define MT6360_PMU_CHG_HIDDEN_CTRL17 (0x40) > +#define MT6360_PMU_CHG_HIDDEN_CTRL18 (0x41) > +#define MT6360_PMU_CHG_HIDDEN_CTRL19 (0x42) > +#define MT6360_PMU_CHG_HIDDEN_CTRL20 (0x43) > +#define MT6360_PMU_CHG_HIDDEN_CTRL21 (0x44) > +#define MT6360_PMU_CHG_HIDDEN_CTRL22 (0x45) > +#define MT6360_PMU_CHG_HIDDEN_CTRL23 (0x46) > +#define MT6360_PMU_CHG_HIDDEN_CTRL24 (0x47) > +#define MT6360_PMU_CHG_HIDDEN_CTRL25 (0x48) > +#define MT6360_PMU_BC12_CTRL (0x49) > +#define MT6360_PMU_CHG_STAT (0x4A) > +#define MT6360_PMU_RESV1 (0x4B) > +#define MT6360_PMU_TYPEC_OTP_TH_SEL_CODEH (0x4E) > +#define MT6360_PMU_TYPEC_OTP_TH_SEL_CODEL (0x4F) > +#define MT6360_PMU_TYPEC_OTP_HYST_TH (0x50) > +#define MT6360_PMU_TYPEC_OTP_CTRL (0x51) > +#define MT6360_PMU_ADC_BAT_DATA_H (0x52) > +#define MT6360_PMU_ADC_BAT_DATA_L (0x53) > +#define MT6360_PMU_IMID_BACKBST_ON (0x54) > +#define MT6360_PMU_IMID_BACKBST_OFF (0x55) > +#define MT6360_PMU_ADC_CONFIG (0x56) > +#define MT6360_PMU_ADC_EN2 (0x57) > +#define MT6360_PMU_ADC_IDLE_T (0x58) > +#define MT6360_PMU_ADC_RPT_1 (0x5A) > +#define MT6360_PMU_ADC_RPT_2 (0x5B) > +#define MT6360_PMU_ADC_RPT_3 (0x5C) > +#define MT6360_PMU_ADC_RPT_ORG1 (0x5D) > +#define MT6360_PMU_ADC_RPT_ORG2 (0x5E) > +#define MT6360_PMU_BAT_OVP_TH_SEL_CODEH (0x5F) > +#define MT6360_PMU_BAT_OVP_TH_SEL_CODEL (0x60) > +#define MT6360_PMU_CHG_CTRL19 (0x61) > +#define MT6360_PMU_VDDASUPPLY (0x62) > +#define MT6360_PMU_BC12_MANUAL (0x63) > +#define MT6360_PMU_CHGDET_FUNC (0x64) > +#define MT6360_PMU_FOD_CTRL (0x65) > +#define MT6360_PMU_CHG_CTRL20 (0x66) > +#define MT6360_PMU_CHG_HIDDEN_CTRL26 (0x67) > +#define MT6360_PMU_CHG_HIDDEN_CTRL27 (0x68) > +#define MT6360_PMU_RESV2 (0x69) > +#define MT6360_PMU_USBID_CTRL1 (0x6D) > +#define MT6360_PMU_USBID_CTRL2 (0x6E) > +#define MT6360_PMU_USBID_CTRL3 (0x6F) > +#define MT6360_PMU_FLED_CFG (0x70) > +#define MT6360_PMU_RESV3 (0x71) > +#define MT6360_PMU_FLED1_CTRL (0x72) > +#define MT6360_PMU_FLED_STRB_CTRL (0x73) > +#define MT6360_PMU_FLED1_STRB_CTRL2 (0x74) > +#define MT6360_PMU_FLED1_TOR_CTRL (0x75) > +#define MT6360_PMU_FLED2_CTRL (0x76) > +#define MT6360_PMU_RESV4 (0x77) > +#define MT6360_PMU_FLED2_STRB_CTRL2 (0x78) > +#define MT6360_PMU_FLED2_TOR_CTRL (0x79) > +#define MT6360_PMU_FLED_VMIDTRK_CTRL1 (0x7A) > +#define MT6360_PMU_FLED_VMID_RTM (0x7B) > +#define MT6360_PMU_FLED_VMIDTRK_CTRL2 (0x7C) > +#define MT6360_PMU_FLED_PWSEL (0x7D) > +#define MT6360_PMU_FLED_EN (0x7E) > +#define MT6360_PMU_FLED_Hidden1 (0x7F) > +#define MT6360_PMU_RGB_EN (0x80) > +#define MT6360_PMU_RGB1_ISNK (0x81) > +#define MT6360_PMU_RGB2_ISNK (0x82) > +#define MT6360_PMU_RGB3_ISNK (0x83) > +#define MT6360_PMU_RGB_ML_ISNK (0x84) > +#define MT6360_PMU_RGB1_DIM (0x85) > +#define MT6360_PMU_RGB2_DIM (0x86) > +#define MT6360_PMU_RGB3_DIM (0x87) > +#define MT6360_PMU_RESV5 (0x88) > +#define MT6360_PMU_RGB12_Freq (0x89) > +#define MT6360_PMU_RGB34_Freq (0x8A) > +#define MT6360_PMU_RGB1_Tr (0x8B) > +#define MT6360_PMU_RGB1_Tf (0x8C) > +#define MT6360_PMU_RGB1_TON_TOFF (0x8D) > +#define MT6360_PMU_RGB2_Tr (0x8E) > +#define MT6360_PMU_RGB2_Tf (0x8F) > +#define MT6360_PMU_RGB2_TON_TOFF (0x90) > +#define MT6360_PMU_RGB3_Tr (0x91) > +#define MT6360_PMU_RGB3_Tf (0x92) > +#define MT6360_PMU_RGB3_TON_TOFF (0x93) > +#define MT6360_PMU_RGB_Hidden_CTRL1 (0x94) > +#define MT6360_PMU_RGB_Hidden_CTRL2 (0x95) > +#define MT6360_PMU_RESV6 (0x97) > +#define MT6360_PMU_SPARE1 (0x9A) > +#define MT6360_PMU_SPARE2 (0xA0) > +#define MT6360_PMU_SPARE3 (0xB0) > +#define MT6360_PMU_SPARE4 (0xC0) > +#define MT6360_PMU_CHG_IRQ1 (0xD0) > +#define MT6360_PMU_CHG_IRQ2 (0xD1) > +#define MT6360_PMU_CHG_IRQ3 (0xD2) > +#define MT6360_PMU_CHG_IRQ4 (0xD3) > +#define MT6360_PMU_CHG_IRQ5 (0xD4) > +#define MT6360_PMU_CHG_IRQ6 (0xD5) > +#define MT6360_PMU_QC_IRQ (0xD6) > +#define MT6360_PMU_FOD_IRQ (0xD7) > +#define MT6360_PMU_BASE_IRQ (0xD8) > +#define MT6360_PMU_FLED_IRQ1 (0xD9) > +#define MT6360_PMU_FLED_IRQ2 (0xDA) > +#define MT6360_PMU_RGB_IRQ (0xDB) > +#define MT6360_PMU_BUCK1_IRQ (0xDC) > +#define MT6360_PMU_BUCK2_IRQ (0xDD) > +#define MT6360_PMU_LDO_IRQ1 (0xDE) > +#define MT6360_PMU_LDO_IRQ2 (0xDF) > +#define MT6360_PMU_CHG_STAT1 (0xE0) > +#define MT6360_PMU_CHG_STAT2 (0xE1) > +#define MT6360_PMU_CHG_STAT3 (0xE2) > +#define MT6360_PMU_CHG_STAT4 (0xE3) > +#define MT6360_PMU_CHG_STAT5 (0xE4) > +#define MT6360_PMU_CHG_STAT6 (0xE5) > +#define MT6360_PMU_QC_STAT (0xE6) > +#define MT6360_PMU_FOD_STAT (0xE7) > +#define MT6360_PMU_BASE_STAT (0xE8) > +#define MT6360_PMU_FLED_STAT1 (0xE9) > +#define MT6360_PMU_FLED_STAT2 (0xEA) > +#define MT6360_PMU_RGB_STAT (0xEB) > +#define MT6360_PMU_BUCK1_STAT (0xEC) > +#define MT6360_PMU_BUCK2_STAT (0xED) > +#define MT6360_PMU_LDO_STAT1 (0xEE) > +#define MT6360_PMU_LDO_STAT2 (0xEF) > +#define MT6360_PMU_CHG_MASK1 (0xF0) > +#define MT6360_PMU_CHG_MASK2 (0xF1) > +#define MT6360_PMU_CHG_MASK3 (0xF2) > +#define MT6360_PMU_CHG_MASK4 (0xF3) > +#define MT6360_PMU_CHG_MASK5 (0xF4) > +#define MT6360_PMU_CHG_MASK6 (0xF5) > +#define MT6360_PMU_QC_MASK (0xF6) > +#define MT6360_PMU_FOD_MASK (0xF7) > +#define MT6360_PMU_BASE_MASK (0xF8) > +#define MT6360_PMU_FLED_MASK1 (0xF9) > +#define MT6360_PMU_FLED_MASK2 (0xFA) > +#define MT6360_PMU_FAULTB_MASK (0xFB) > +#define MT6360_PMU_BUCK1_MASK (0xFC) > +#define MT6360_PMU_BUCK2_MASK (0xFD) > +#define MT6360_PMU_LDO_MASK1 (0xFE) > +#define MT6360_PMU_LDO_MASK2 (0xFF) > +#define MT6360_PMU_MAXREG (MT6360_PMU_LDO_MASK2) > + > + > +/* MT6360_PMU_IRQ_SET */ > +#define MT6360_PMU_IRQ_REGNUM (MT6360_PMU_LDO_IRQ2 - MT6360_PMU_CHG_IRQ1 + 1) > +#define MT6360_IRQ_RETRIG BIT(2) > + > +#define CHIP_VEN_MASK (0xF0) > +#define CHIP_VEN_MT6360 (0x50) > +#define CHIP_REV_MASK (0x0F) > + > +/* IRQ definitions */ Remove this please. > +struct mt6360_pmu_irq_desc { > + const char *name; > + irq_handler_t irq_handler; > +}; Where is this used? > +#define MT6360_DT_VALPROP(name, type) \ > + {#name, offsetof(type, name)} Where is this used? > +struct mt6360_val_prop { > + const char *name; > + size_t offset; > +}; > + > +static inline void mt6360_dt_parser_helper(struct device_node *np, void *data, > + const struct mt6360_val_prop *props, > + int prop_cnt) > +{ > + int i; > + > + for (i = 0; i < prop_cnt; i++) { > + if (unlikely(!props[i].name)) > + continue; > + of_property_read_u32(np, props[i].name, data + props[i].offset); > + } > +} What are you using this for? Why is the standard API not sufficient? > +#define MT6360_PDATA_VALPROP(name, type, reg, shift, mask, func, base) \ > + {offsetof(type, name), reg, shift, mask, func, base} Where is this used? > +struct mt6360_pdata_prop { > + size_t offset; > + u8 reg; > + u8 shift; > + u8 mask; > + u32 (*transform)(u32 val); > + u8 base; > +}; > + > +static inline int mt6360_pdata_apply_helper(void *context, void *pdata, > + const struct mt6360_pdata_prop *prop, > + int prop_cnt) > +{ > + int i, ret; > + u32 val; > + > + for (i = 0; i < prop_cnt; i++) { > + val = *(u32 *)(pdata + prop[i].offset); > + if (prop[i].transform) > + val = prop[i].transform(val); > + val += prop[i].base; > + ret = regmap_update_bits(context, > + prop[i].reg, prop[i].mask, val << prop[i].shift); > + if (ret < 0) > + return ret; > + } > + return 0; > +} Where is this used? What does it do? > +#endif /* __MT6360_PRIVATE_H__ */ > diff --git a/include/linux/mfd/mt6360.h b/include/linux/mfd/mt6360.h > new file mode 100644 > index 0000000..ba2e80a > --- /dev/null > +++ b/include/linux/mfd/mt6360.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2019 MediaTek Inc. > + */ > + > +#ifndef __MT6360_H__ > +#define __MT6360_H__ > + > +#include > + > +enum { > + MT6360_SLAVE_PMU = 0, > + MT6360_SLAVE_PMIC, > + MT6360_SLAVE_LDO, > + MT6360_SLAVE_TCPC, > + MT6360_SLAVE_MAX, > +}; > + > +#define MT6360_PMU_SLAVEID (0x34) > +#define MT6360_PMIC_SLAVEID (0x1A) > +#define MT6360_LDO_SLAVEID (0x64) > +#define MT6360_TCPC_SLAVEID (0x4E) What kind of slave ID? I2C address? > +struct mt6360_pmu_info { > + struct i2c_client *i2c[MT6360_SLAVE_MAX]; > + struct device *dev; > + struct regmap *regmap; > + struct regmap_irq_chip_data *irq_data; > + struct regmap_irq_chip irq_chip; > + unsigned int chip_rev; Why are you saving these? Where do you reuse them? > +}; > + > +#endif /* __MT6360_H__ */ -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9546AC4360C for ; Fri, 4 Oct 2019 13:34:33 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 60B8C222C4 for ; Fri, 4 Oct 2019 13:34:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="KpBtzfQu"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="IP6zw4b8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 60B8C222C4 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+2HG+2R+KevLOInFdGSXEzVnQOpouDzpaR0K4HObn6Q=; b=KpBtzfQuTmpqne TAawBOxLLD4WT71B6VbA34QEX78y9nGQ05+Sp2GIMOPn7A/RQy7TfOFvcYoIJ6njcvGM45VD+ea9Q Qqq3tnROSvSjlpbpZ2K6BB8M3uYMmHhTzyRBpdoFzRVooGi+HptO0Poh4fjqBeaV4+cda6eIkRokz qQ4y6y2RdgGiN9OGItfmMd6wKCVYytC2wSVL7K/MvuZhU8Gd2VvQLpZu3W0K8aIGbd/ddTZOOZ826 mwn09zWYqWn1sp5wyvcZNo7ICh0ltoVA8qeX3X6344U9cCg8D+ffLoYQMTiJ2dwxsQK39B7usbmgN upEQ3jk0orGGWA4R6A4A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.2 #3 (Red Hat Linux)) id 1iGNj5-0006iH-Uv; Fri, 04 Oct 2019 13:34:32 +0000 Received: from mail-wm1-x342.google.com ([2a00:1450:4864:20::342]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iGNi4-0005h5-TQ for linux-arm-kernel@lists.infradead.org; Fri, 04 Oct 2019 13:33:32 +0000 Received: by mail-wm1-x342.google.com with SMTP id p7so5859123wmp.4 for ; Fri, 04 Oct 2019 06:33:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=IpHwbgJ4ZLdW/CxZfJLoUn2ABnJNTF4uim1slA/Ssa4=; b=IP6zw4b8MUFW/N1V6r3e3Qm3w6GqzqXr2PwfBbwPfNDh/2UJx5CO0YXVj+wo/oFEfc Fpj+2dJKrDxrcGLNDbiWVOOCM7+hsRTJ5Lpn1gOhggj51madl2cyDGDVSQWHEVxfmMFC +iHDbwbZqcfSom/fhMSkvW84YxB7O7/KdzO5XiO6ABK0Ob02wZpLZG54/3uo7x7439sM TlnEKw5tWJH2kUvjGlbGDvmJMhYxZMME5BA3aA+d/smVrbluyYWbWWwKnl7ZixHt5UJS ulpj5Lm8lQ0QLjJoU6sADYBTFpJWVAO66mcPwC+UI1+fMiGm28D9eBzfm3AE5z5GRYY6 afVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=IpHwbgJ4ZLdW/CxZfJLoUn2ABnJNTF4uim1slA/Ssa4=; b=Sci3/34vWPd/UsXBuBdbNlQXDpUZwe9t31q5WWXIUnhJUE2ZV2pcheg/VyAIA7/bzI Md4/6K65iet6wGX/diNQrOPYlDAfcOP5zZ1PeNbZoNFsKvtFcZJRgcyaLYHdPiNpkeUF 5zu8squ2E0R053ShjCQcscFYdxFqNg8LfhG0+WZ59Ts8ivAJr+HDOmqN4iWG809wnRRR 1uWlU7R+pM7h6iZ1KBDGYvgce0js+tGUR+gtC27BBwRVnNiCWyWXJPZU0PH6+69WZvfm bCSYV9AIZ8mpBJrDe8YT4iwIJ3kVbKKcrYqmdyo0gA+Nc4bhpMUuPwrYrWR+N7jjFzoq fvtg== X-Gm-Message-State: APjAAAXbhfTia7CJ/xXsDCYNmawjJ5fNVmCXHBj9tDb5ZZTAMVkNlIL2 6zcQChppLGpIwhsIVrXUU1MjmQ== X-Google-Smtp-Source: APXvYqydYJHpTgHmqb0MvsmxNK/7tVzQYDTEsFjyKqWvwsSgS/i9HQ4m2OeNM4LM0tXEckMAQZ7KhQ== X-Received: by 2002:a05:600c:1103:: with SMTP id b3mr11292306wma.3.1570196007101; Fri, 04 Oct 2019 06:33:27 -0700 (PDT) Received: from dell ([2.27.167.122]) by smtp.gmail.com with ESMTPSA id v6sm6547995wrn.50.2019.10.04.06.33.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04 Oct 2019 06:33:26 -0700 (PDT) Date: Fri, 4 Oct 2019 14:33:24 +0100 From: Lee Jones To: Gene Chen Subject: Re: [PATCH v3] mfd: mt6360: add pmic mt6360 driver Message-ID: <20191004133324.GE18429@dell> References: <1569338741-2784-1-git-send-email-gene.chen.richtek@gmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1569338741-2784-1-git-send-email-gene.chen.richtek@gmail.com> User-Agent: Mutt/1.9.4 (2018-02-28) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191004_063329_211297_85BC3963 X-CRM114-Status: GOOD ( 21.41 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gene_chen@richtek.com, linux-kernel@vger.kernel.org, cy_huang@richtek.com, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, Wilma.Wu@mediatek.com, linux-arm-kernel@lists.infradead.org, shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org V29sZnJhbSwKCldvdWxkIHlvdSBiZSBraW5kIGVub3VnaCB0byBncmVwIGZvciB5b3VyIG5hbWUg YmVsb3c/CgpPbiBUdWUsIDI0IFNlcCAyMDE5LCBHZW5lIENoZW4gd3JvdGU6Cgo+IEZyb206IEdl bmUgQ2hlbiA8Z2VuZV9jaGVuQHJpY2h0ZWsuY29tPgo+IAo+IEFkZCBtZmQgZHJpdmVyIGZvciBt dDYzNjAgcG1pYyBjaGlwIGluY2x1ZGUKPiBCYXR0ZXJ5IENoYXJnZXIvVVNCX1BEL0ZsYXNoIExF RC9SR0IgTEVEL0xETy9CdWNrCj4gCj4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5lX2No ZW5AcmljaHRlay5jb20KPiAtLS0KPiAgZHJpdmVycy9tZmQvS2NvbmZpZyAgICAgICAgICAgICAg ICB8ICAxMiArCj4gIGRyaXZlcnMvbWZkL01ha2VmaWxlICAgICAgICAgICAgICAgfCAgIDEgKwo+ ICBkcml2ZXJzL21mZC9tdDYzNjAtY29yZS5jICAgICAgICAgIHwgNDYzICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKPiAgaW5jbHVkZS9saW51eC9tZmQvbXQ2MzYwLXByaXZh dGUuaCB8IDI3OSArKysrKysrKysrKysrKysrKysrKysrCj4gIGluY2x1ZGUvbGludXgvbWZkL210 NjM2MC5oICAgICAgICAgfCAgMzMgKysrCj4gIDUgZmlsZXMgY2hhbmdlZCwgNzg4IGluc2VydGlv bnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWZkL210NjM2MC1jb3JlLmMKPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvbWZkL210NjM2MC1wcml2YXRlLmgKPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvbWZkL210NjM2MC5oCj4gCj4gY2hhbmdl bG9ncyBiZXR3ZWVuIHYxICYgdjIKPiAtIGluY2x1ZGUgbWlzc2luZyBoZWFkZXIgZmlsZQo+IAo+ IGNoYW5nZWxvZ3MgYmV0d2VlbiB2MiAmIHYzCj4gLSBhZGQgY2hhbmdlbG9ncwo+IAo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwo+IGluZGV4 IGYxMjlmOTYuLmE0MjJjNzYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZwo+ICsr KyBiL2RyaXZlcnMvbWZkL0tjb25maWcKPiBAQCAtODYyLDYgKzg2MiwxOCBAQCBjb25maWcgTUZE X01BWDg5OTgKPiAgCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRl ciB0byB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkKPiAgCSAgb2YgdGhlIGRldmljZS4KPiAgCj4gK2Nv bmZpZyBNRkRfTVQ2MzYwCj4gKwl0cmlzdGF0ZSAiTWVkaWF0ZWsgTVQ2MzYwIFN1YlBNSUMiCj4g KwlzZWxlY3QgTUZEX0NPUkUKPiArCXNlbGVjdCBSRUdNQVBfSTJDCj4gKwlzZWxlY3QgUkVHTUFQ X0lSUQo+ICsJZGVwZW5kcyBvbiBJMkMKPiArCWhlbHAKPiArCSAgU2F5IFkgaGVyZSB0byBlbmFi bGUgTVQ2MzYwIFBNVS9QTUlDL0xETyBmdW5jdGlvbmFsIHN1cHBvcnQuCj4gKwkgIFBNVSBwYXJ0 IGluY2x1ZGUgY2hhcmdlciwgZmxhc2hsaWdodCwgcmdiIGxlZAo+ICsJICBQTUlDIHBhcnQgaW5j bHVkZSAyLWNoYW5uZWwgQlVDS3MgYW5kIDItY2hhbm5lbCBMRE9zCj4gKwkgIExETyBwYXJ0IGlu Y2x1ZGUgNC1jaGFubmVsIExET3MKCgkgIFBNVSBwYXJ0IGluY2x1ZGVzIENoYXJnZXIsIEZsYXNo bGlnaHQsIFJHQiBhbmQgTEVECgkgIFBNSUMgcGFydCBpbmNsdWRlcyAyLWNoYW5uZWwgQlVDS3Mg YW5kIDItY2hhbm5lbCBMRE9zCgkgIExETyBwYXJ0IGluY2x1ZGVzIDQtY2hhbm5lbCBMRE9zCgo+ ICBjb25maWcgTUZEX01UNjM5Nwo+ICAJdHJpc3RhdGUgIk1lZGlhVGVrIE1UNjM5NyBQTUlDIFN1 cHBvcnQiCj4gIAlzZWxlY3QgTUZEX0NPUkUKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFr ZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQo+IGluZGV4IGYwMjZhZGEuLjc3YThmMGIgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL21mZC9NYWtl ZmlsZQo+IEBAIC0yNDEsNiArMjQxLDcgQEAgb2JqLSQoQ09ORklHX0lOVEVMX1NPQ19QTUlDKQkr PSBpbnRlbC1zb2MtcG1pYy5vCj4gIG9iai0kKENPTkZJR19JTlRFTF9TT0NfUE1JQ19CWFRXQykJ Kz0gaW50ZWxfc29jX3BtaWNfYnh0d2Mubwo+ICBvYmotJChDT05GSUdfSU5URUxfU09DX1BNSUNf Q0hUV0MpCSs9IGludGVsX3NvY19wbWljX2NodHdjLm8KPiAgb2JqLSQoQ09ORklHX0lOVEVMX1NP Q19QTUlDX0NIVERDX1RJKQkrPSBpbnRlbF9zb2NfcG1pY19jaHRkY190aS5vCj4gK29iai0kKENP TkZJR19NRkRfTVQ2MzYwKQkrPSBtdDYzNjAtY29yZS5vCj4gIG9iai0kKENPTkZJR19NRkRfTVQ2 Mzk3KQkrPSBtdDYzOTctY29yZS5vCj4gIAo+ICBvYmotJChDT05GSUdfTUZEX0FMVEVSQV9BMTBT UikJKz0gYWx0ZXJhLWExMHNyLm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbXQ2MzYwLWNv cmUuYyBiL2RyaXZlcnMvbWZkL210NjM2MC1jb3JlLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAuLmQzNTgwNjE4Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMv bWZkL210NjM2MC1jb3JlLmMKPiBAQCAtMCwwICsxLDQ2MyBAQAo+ICsvLyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTkgTWVkaWFU ZWsgSW5jLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPiArI2luY2x1ZGUg PGxpbnV4L2luaXQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8 bGludXgvbWZkL2NvcmUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVk ZSA8bGludXgvb2ZfaXJxLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgo+ICsj aW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L21mZC9tdDYz NjAuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21mZC9tdDYzNjAtcHJpdmF0ZS5oPgo+ICsKPiArLyog cmVnIDAgLT4gMCB+IDcgKi8KPiArI2RlZmluZSBNVDYzNjBfQ0hHX1RSRUdfRVZUCQkoNCkKPiAr I2RlZmluZSBNVDYzNjBfQ0hHX0FJQ1JfRVZUCQkoNSkKPiArI2RlZmluZSBNVDYzNjBfQ0hHX01J VlJfRVZUCQkoNikKPiArI2RlZmluZSBNVDYzNjBfUFdSX1JEWV9FVlQJCSg3KQo+ICsvKiBSRUcg MSAtPiA4IH4gMTUgKi8KPiArI2RlZmluZSBNVDYzNjBfQ0hHX0JBVFNZU1VWX0VWVAkJKDkpCj4g KyNkZWZpbmUgTVQ2MzYwX0ZMRURfQ0hHX1ZJTk9WUF9FVlQJKDExKQo+ICsjZGVmaW5lIE1UNjM2 MF9DSEdfVlNZU1VWX0VWVAkJKDEyKQo+ICsjZGVmaW5lIE1UNjM2MF9DSEdfVlNZU09WX0VWVAkJ KDEzKQo+ICsjZGVmaW5lIE1UNjM2MF9DSEdfVkJBVE9WX0VWVAkJKDE0KQo+ICsjZGVmaW5lIE1U NjM2MF9DSEdfVkJVU09WX0VWVAkJKDE1KQo+ICsvKiBSRUcgMiAtPiAxNiB+IDIzICovCj4gKy8q IFJFRyAzIC0+IDI0IH4gMzEgKi8KPiArI2RlZmluZSBNVDYzNjBfV0RfUE1VX0RFVAkJKDI1KQo+ ICsjZGVmaW5lIE1UNjM2MF9XRF9QTVVfRE9ORQkJKDI2KQo+ICsjZGVmaW5lIE1UNjM2MF9DSEdf VE1SSQkJCSgyNykKPiArI2RlZmluZSBNVDYzNjBfQ0hHX0FEUEJBREkJCSgyOSkKPiArI2RlZmlu ZSBNVDYzNjBfQ0hHX1JWUEkJCQkoMzApCj4gKyNkZWZpbmUgTVQ2MzYwX09UUEkJCQkoMzEpCj4g Ky8qIFJFRyA0IC0+IDMyIH4gMzkgKi8KPiArI2RlZmluZSBNVDYzNjBfQ0hHX0FJQ0NNRUFTTAkJ KDMyKQo+ICsjZGVmaW5lIE1UNjM2MF9DSEdERVRfRE9ORUkJCSgzNCkKPiArI2RlZmluZSBNVDYz NjBfV0RUTVJJCQkJKDM1KQo+ICsjZGVmaW5lIE1UNjM2MF9TU0ZJTklTSEkJCSgzNikKPiArI2Rl ZmluZSBNVDYzNjBfQ0hHX1JFQ0hHSQkJKDM3KQo+ICsjZGVmaW5lIE1UNjM2MF9DSEdfVEVSTUkJ CSgzOCkKPiArI2RlZmluZSBNVDYzNjBfQ0hHX0lFT0NJCQkoMzkpCj4gKy8qIFJFRyA1IC0+IDQw IH4gNDcgKi8KPiArI2RlZmluZSBNVDYzNjBfUFVNUFhfRE9ORUkJCSg0MCkKPiArI2RlZmluZSBN VDYzNjBfQkFUX09WUF9BRENfRVZUCQkoNDEpCj4gKyNkZWZpbmUgTVQ2MzYwX1RZUEVDX09UUF9F VlQJCSg0MikKPiArI2RlZmluZSBNVDYzNjBfQURDX1dBS0VVUF9FVlQJCSg0MykKPiArI2RlZmlu ZSBNVDYzNjBfQURDX0RPTkVJCQkoNDQpCj4gKyNkZWZpbmUgTVQ2MzYwX0JTVF9CQVRVVkkJCSg0 NSkKPiArI2RlZmluZSBNVDYzNjBfQlNUX1ZCVVNPVkkJCSg0NikKPiArI2RlZmluZSBNVDYzNjBf QlNUX09MUEkJCQkoNDcpCj4gKy8qIFJFRyA2IC0+IDQ4IH4gNTUgKi8KPiArI2RlZmluZSBNVDYz NjBfQVRUQUNIX0kJCQkoNDgpCj4gKyNkZWZpbmUgTVQ2MzYwX0RFVEFDSF9JCQkJKDQ5KQo+ICsj ZGVmaW5lIE1UNjM2MF9RQzMwX1NUUERPTkUJCSg1MSkKPiArI2RlZmluZSBNVDYzNjBfUUNfVkJV U0RFVF9ET05FCQkoNTIpCj4gKyNkZWZpbmUgTVQ2MzYwX0hWRENQX0RFVAkJKDUzKQo+ICsjZGVm aW5lIE1UNjM2MF9DSEdERVRJCQkJKDU0KQo+ICsjZGVmaW5lIE1UNjM2MF9EQ0RUSQkJCSg1NSkK PiArLyogUkVHIDcgLT4gNTYgfiA2MyAqLwo+ICsjZGVmaW5lIE1UNjM2MF9GT0RfRE9ORV9FVlQJ CSg1NikKPiArI2RlZmluZSBNVDYzNjBfRk9EX09WX0VWVAkJKDU3KQo+ICsjZGVmaW5lIE1UNjM2 MF9DSFJERVRfVVZQX0VWVAkJKDU4KQo+ICsjZGVmaW5lIE1UNjM2MF9DSFJERVRfT1ZQX0VWVAkJ KDU5KQo+ICsjZGVmaW5lIE1UNjM2MF9DSFJERVRfRVhUX0VWVAkJKDYwKQo+ICsjZGVmaW5lIE1U NjM2MF9GT0RfTFJfRVZUCQkoNjEpCj4gKyNkZWZpbmUgTVQ2MzYwX0ZPRF9IUl9FVlQJCSg2MikK PiArI2RlZmluZSBNVDYzNjBfRk9EX0RJU0NIR19GQUlMX0VWVAkoNjMpCj4gKy8qIFJFRyA4IC0+ IDY0IH4gNzEgKi8KPiArI2RlZmluZSBNVDYzNjBfVVNCSURfRVZUCQkoNjQpCj4gKyNkZWZpbmUg TVQ2MzYwX0FQV0RUUlNUX0VWVAkJKDY1KQo+ICsjZGVmaW5lIE1UNjM2MF9FTl9FVlQJCQkoNjYp Cj4gKyNkZWZpbmUgTVQ2MzYwX1FPTkJfUlNUX0VWVAkJKDY3KQo+ICsjZGVmaW5lIE1UNjM2MF9N UlNUQl9FVlQJCSg2OCkKPiArI2RlZmluZSBNVDYzNjBfT1RQX0VWVAkJCSg2OSkKPiArI2RlZmlu ZSBNVDYzNjBfVkREQU9WX0VWVAkJKDcwKQo+ICsjZGVmaW5lIE1UNjM2MF9TWVNVVl9FVlQJCSg3 MSkKPiArLyogUkVHIDkgLT4gNzIgfiA3OSAqLwo+ICsjZGVmaW5lIE1UNjM2MF9GTEVEX1NUUkJQ SU5fRVZUCQkoNzIpCj4gKyNkZWZpbmUgTVQ2MzYwX0ZMRURfVE9SUElOX0VWVAkJKDczKQo+ICsj ZGVmaW5lIE1UNjM2MF9GTEVEX1RYX0VWVAkJKDc0KQo+ICsjZGVmaW5lIE1UNjM2MF9GTEVEX0xW Rl9FVlQJCSg3NSkKPiArI2RlZmluZSBNVDYzNjBfRkxFRDJfU0hPUlRfRVZUCQkoNzgpCj4gKyNk ZWZpbmUgTVQ2MzYwX0ZMRUQxX1NIT1JUX0VWVAkJKDc5KQo+ICsvKiBSRUcgMTAgLT4gODAgfiA4 NyAqLwo+ICsjZGVmaW5lIE1UNjM2MF9GTEVEMl9TVFJCX0VWVAkJKDgwKQo+ICsjZGVmaW5lIE1U NjM2MF9GTEVEMV9TVFJCX0VWVAkJKDgxKQo+ICsjZGVmaW5lIE1UNjM2MF9GTEVEMl9TVFJCX1RP X0VWVAkoODIpCj4gKyNkZWZpbmUgTVQ2MzYwX0ZMRUQxX1NUUkJfVE9fRVZUCSg4MykKPiArI2Rl ZmluZSBNVDYzNjBfRkxFRDJfVE9SX0VWVAkJKDg0KQo+ICsjZGVmaW5lIE1UNjM2MF9GTEVEMV9U T1JfRVZUCQkoODUpCj4gKy8qIFJFRyAxMSAtPiA4OCB+IDk1ICovCj4gKy8qIFJFRyAxMiAtPiA5 NiB+IDEwMyAqLwo+ICsjZGVmaW5lIE1UNjM2MF9CVUNLMV9QR0JfRVZUCQkoOTYpCj4gKyNkZWZp bmUgTVQ2MzYwX0JVQ0sxX09DX0VWVAkJKDEwMCkKPiArI2RlZmluZSBNVDYzNjBfQlVDSzFfT1Zf RVZUCQkoMTAxKQo+ICsjZGVmaW5lIE1UNjM2MF9CVUNLMV9VVl9FVlQJCSgxMDIpCj4gKy8qIFJF RyAxMyAtPiAxMDQgfiAxMTEgKi8KPiArI2RlZmluZSBNVDYzNjBfQlVDSzJfUEdCX0VWVAkJKDEw NCkKPiArI2RlZmluZSBNVDYzNjBfQlVDSzJfT0NfRVZUCQkoMTA4KQo+ICsjZGVmaW5lIE1UNjM2 MF9CVUNLMl9PVl9FVlQJCSgxMDkpCj4gKyNkZWZpbmUgTVQ2MzYwX0JVQ0syX1VWX0VWVAkJKDEx MCkKPiArLyogUkVHIDE0IC0+IDExMiB+IDExOSAqLwo+ICsjZGVmaW5lIE1UNjM2MF9MRE8xX09D X0VWVAkJKDExMykKPiArI2RlZmluZSBNVDYzNjBfTERPMl9PQ19FVlQJCSgxMTQpCj4gKyNkZWZp bmUgTVQ2MzYwX0xETzNfT0NfRVZUCQkoMTE1KQo+ICsjZGVmaW5lIE1UNjM2MF9MRE81X09DX0VW VAkJKDExNykKPiArI2RlZmluZSBNVDYzNjBfTERPNl9PQ19FVlQJCSgxMTgpCj4gKyNkZWZpbmUg TVQ2MzYwX0xETzdfT0NfRVZUCQkoMTE5KQo+ICsvKiBSRUcgMTUgLT4gMTIwIH4gMTI3ICovCj4g KyNkZWZpbmUgTVQ2MzYwX0xETzFfUEdCX0VWVAkJKDEyMSkKPiArI2RlZmluZSBNVDYzNjBfTERP Ml9QR0JfRVZUCQkoMTIyKQo+ICsjZGVmaW5lIE1UNjM2MF9MRE8zX1BHQl9FVlQJCSgxMjMpCj4g KyNkZWZpbmUgTVQ2MzYwX0xETzVfUEdCX0VWVAkJKDEyNSkKPiArI2RlZmluZSBNVDYzNjBfTERP Nl9QR0JfRVZUCQkoMTI2KQo+ICsjZGVmaW5lIE1UNjM2MF9MRE83X1BHQl9FVlQJCSgxMjcpCj4g Kwo+ICsjZGVmaW5lIE1UNjM2MF9SRUdNQVBfSVJRX1JFRyhfaXJxX2V2dCkJCVwKPiArCVJFR01B UF9JUlFfUkVHKF9pcnFfZXZ0LCAoX2lycV9ldnQpIC8gOCwgQklUKChfaXJxX2V2dCkgJSA4KSkK PiArCj4gKyNkZWZpbmUgTVQ2MzYwX01GRF9DRUxMKF9uYW1lKQkJCQkJXAo+ICsJewkJCQkJCQlc Cj4gKwkJLm5hbWUgPSAjX25hbWUsCQkJCQlcCj4gKwkJLm9mX2NvbXBhdGlibGUgPSAibWVkaWF0 ZWssIiAjX25hbWUsCQlcCj4gKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKF9uYW1lIyNf cmVzb3VyY2VzKSwJXAo+ICsJCS5yZXNvdXJjZXMgPSBfbmFtZSMjX3Jlc291cmNlcywJCQlcCj4g Kwl9CgpQbGVhc2UgZG8gbm90IHJvbGwgeW91ciBvd24gTUFDUk9TIGxpa2UgdGhpcy4gIElmIHRo ZXkgYXJlIGhlbHBmdWwgZm9yCnlvdSwgdGhleSBhcmUgbGlrZWx5IHRvIGJlIGhlbHBmdWwgZm9y IG90aGVycy4gIEhvd2V2ZXIsIHRoaXMgaXMgeW91cgpsdWNreSBkYXksIGFzIHdlJ3ZlIGJlZW4g aGVyZSBiZWZvcmUuICBQbGVhc2UgcmViYXNlIG9udG8gdGhlIE1GRCB0cmVlCndoZXJlIHlvdSB3 aWxsIGZpbmQgc29tZSBwcmUtYXV0aG9yZWQgbWFjcm9zIHdoaWNoIGFyZW4ndCB0b28KZGlzc2lt aWxhciB0byB0aGlzIG9uZS4gIFBsZWFzZSB1c2Ugb25lIG9mIHRob3NlIGluc3RlYWQuCgo+ICtz dGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnEgbXQ2MzYwX3BtdV9pcnFzW10gPSAgewo+ICsJ TVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9DSEdfVFJFR19FVlQpLAo+ICsJTVQ2MzYwX1JF R01BUF9JUlFfUkVHKE1UNjM2MF9DSEdfQUlDUl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFf UkVHKE1UNjM2MF9DSEdfTUlWUl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2 MF9QV1JfUkRZX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0NIR19CQVRT WVNVVl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9GTEVEX0NIR19WSU5P VlBfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfQ0hHX1ZTWVNVVl9FVlQp LAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9DSEdfVlNZU09WX0VWVCksCj4gKwlN VDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0NIR19WQkFUT1ZfRVZUKSwKPiArCU1UNjM2MF9S RUdNQVBfSVJRX1JFRyhNVDYzNjBfQ0hHX1ZCVVNPVl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9J UlFfUkVHKE1UNjM2MF9XRF9QTVVfREVUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYz NjBfV0RfUE1VX0RPTkUpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9DSEdfVE1S SSksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0NIR19BRFBCQURJKSwKPiArCU1U NjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfQ0hHX1JWUEkpLAo+ICsJTVQ2MzYwX1JFR01BUF9J UlFfUkVHKE1UNjM2MF9PVFBJKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfQ0hH X0FJQ0NNRUFTTCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0NIR0RFVF9ET05F SSksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX1dEVE1SSSksCj4gKwlNVDYzNjBf UkVHTUFQX0lSUV9SRUcoTVQ2MzYwX1NTRklOSVNISSksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9S RUcoTVQ2MzYwX0NIR19SRUNIR0kpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9D SEdfVEVSTUkpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9DSEdfSUVPQ0kpLAo+ ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9QVU1QWF9ET05FSSksCj4gKwlNVDYzNjBf UkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0NIR19UUkVHX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lS UV9SRUcoTVQ2MzYwX0JBVF9PVlBfQURDX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUco TVQ2MzYwX1RZUEVDX09UUF9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9B RENfV0FLRVVQX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0FEQ19ET05F SSksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0JTVF9CQVRVVkkpLAo+ICsJTVQ2 MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9CU1RfVkJVU09WSSksCj4gKwlNVDYzNjBfUkVHTUFQ X0lSUV9SRUcoTVQ2MzYwX0JTVF9PTFBJKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYz NjBfQVRUQUNIX0kpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9ERVRBQ0hfSSks Cj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX1FDMzBfU1RQRE9ORSksCj4gKwlNVDYz NjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX1FDX1ZCVVNERVRfRE9ORSksCj4gKwlNVDYzNjBfUkVH TUFQX0lSUV9SRUcoTVQ2MzYwX0hWRENQX0RFVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUco TVQ2MzYwX0NIR0RFVEkpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9EQ0RUSSks Cj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZPRF9ET05FX0VWVCksCj4gKwlNVDYz NjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZPRF9PVl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9J UlFfUkVHKE1UNjM2MF9DSFJERVRfVVZQX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUco TVQ2MzYwX0NIUkRFVF9PVlBfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBf Q0hSREVUX0VYVF9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9GT0RfTFJf RVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfRk9EX0hSX0VWVCksCj4gKwlN VDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZPRF9ESVNDSEdfRkFJTF9FVlQpLAo+ICsJTVQ2 MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9VU0JJRF9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9J UlFfUkVHKE1UNjM2MF9BUFdEVFJTVF9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1U NjM2MF9FTl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9RT05CX1JTVF9F VlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9NUlNUQl9FVlQpLAo+ICsJTVQ2 MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9PVFBfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJR X1JFRyhNVDYzNjBfVkREQU9WX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYw X1NZU1VWX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZMRURfU1RSQlBJ Tl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9GTEVEX1RPUlBJTl9FVlQp LAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9GTEVEX1RYX0VWVCksCj4gKwlNVDYz NjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZMRURfTFZGX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQ X0lSUV9SRUcoTVQ2MzYwX0ZMRUQyX1NIT1JUX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9S RUcoTVQ2MzYwX0ZMRUQxX1NIT1JUX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2 MzYwX0ZMRUQyX1NUUkJfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfRkxF RDFfU1RSQl9FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9GTEVEMl9TVFJC X1RPX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZMRUQxX1NUUkJfVE9f RVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfRkxFRDJfVE9SX0VWVCksCj4g KwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0ZMRUQxX1RPUl9FVlQpLAo+ICsJTVQ2MzYw X1JFR01BUF9JUlFfUkVHKE1UNjM2MF9CVUNLMV9QR0JfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBf SVJRX1JFRyhNVDYzNjBfQlVDSzFfT0NfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhN VDYzNjBfQlVDSzFfT1ZfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfQlVD SzFfVVZfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfQlVDSzJfUEdCX0VW VCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0JVQ0syX09DX0VWVCksCj4gKwlN VDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0JVQ0syX09WX0VWVCksCj4gKwlNVDYzNjBfUkVH TUFQX0lSUV9SRUcoTVQ2MzYwX0JVQ0syX1VWX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9S RUcoTVQ2MzYwX0xETzFfT0NfRVZUKSwKPiArCU1UNjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBf TERPMl9PQ19FVlQpLAo+ICsJTVQ2MzYwX1JFR01BUF9JUlFfUkVHKE1UNjM2MF9MRE8zX09DX0VW VCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0xETzVfT0NfRVZUKSwKPiArCU1U NjM2MF9SRUdNQVBfSVJRX1JFRyhNVDYzNjBfTERPNl9PQ19FVlQpLAo+ICsJTVQ2MzYwX1JFR01B UF9JUlFfUkVHKE1UNjM2MF9MRE83X09DX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUco TVQ2MzYwX0xETzFfUEdCX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0xE TzJfUEdCX0VWVCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0xETzNfUEdCX0VW VCksCj4gKwlNVDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0xETzVfUEdCX0VWVCksCj4gKwlN VDYzNjBfUkVHTUFQX0lSUV9SRUcoTVQ2MzYwX0xETzZfUEdCX0VWVCksCj4gKwlNVDYzNjBfUkVH TUFQX0lSUV9SRUcoTVQ2MzYwX0xETzdfUEdCX0VWVCksCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50 IG10NjM2MF9wbXVfaGFuZGxlX3Bvc3RfaXJxKHZvaWQgKmlycV9kcnZfZGF0YSkKPiArewo+ICsJ c3RydWN0IG10NjM2MF9wbXVfaW5mbyAqbXBpID0gaXJxX2Rydl9kYXRhOwo+ICsKPiArCXJldHVy biByZWdtYXBfdXBkYXRlX2JpdHMobXBpLT5yZWdtYXAsCj4gKwkJTVQ2MzYwX1BNVV9JUlFfU0VU LCBNVDYzNjBfSVJRX1JFVFJJRywgTVQ2MzYwX0lSUV9SRVRSSUcpOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCBtdDYzNjBfcG11X2lycV9jaGlwID0gewo+ ICsJLmlycXMgPSBtdDYzNjBfcG11X2lycXMsCj4gKwkubnVtX2lycXMgPSBBUlJBWV9TSVpFKG10 NjM2MF9wbXVfaXJxcyksCj4gKwkubnVtX3JlZ3MgPSBNVDYzNjBfUE1VX0lSUV9SRUdOVU0sCj4g KwkubWFza19iYXNlID0gTVQ2MzYwX1BNVV9DSEdfTUFTSzEsCj4gKwkuc3RhdHVzX2Jhc2UgPSBN VDYzNjBfUE1VX0NIR19JUlExLAo+ICsJLmFja19iYXNlID0gTVQ2MzYwX1BNVV9DSEdfSVJRMSwK PiArCS5pbml0X2Fja19tYXNrZWQgPSB0cnVlLAo+ICsJLnVzZV9hY2sgPSB0cnVlLAo+ICsJLmhh bmRsZV9wb3N0X2lycSA9IG10NjM2MF9wbXVfaGFuZGxlX3Bvc3RfaXJxLAo+ICt9Owo+ICsKPiAr c3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG10NjM2MF9wbXVfcmVnbWFwX2NvbmZp ZyA9IHsKPiArCS5yZWdfYml0cyA9IDgsCj4gKwkudmFsX2JpdHMgPSA4LAo+ICsJLm1heF9yZWdp c3RlciA9IE1UNjM2MF9QTVVfTUFYUkVHLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVj dCByZXNvdXJjZSBtdDYzNjBfYWRjX3Jlc291cmNlc1tdID0gewo+ICsJREVGSU5FX1JFU19JUlFf TkFNRUQoTVQ2MzYwX0FEQ19ET05FSSwgImFkY19kb25laSIpLAo+ICt9Owo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCByZXNvdXJjZSBtdDYzNjBfY2hnX3Jlc291cmNlc1tdID0gewo+ICsJREVG SU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19UUkVHX0VWVCwgImNoZ190cmVnX2V2dCIpLAo+ ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX1BXUl9SRFlfRVZULCAicHdyX3JkeV9ldnQi KSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9DSEdfQkFUU1lTVVZfRVZULCAiY2hn X2JhdHN5c3V2X2V2dCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19WU1lT VVZfRVZULCAiY2hnX3ZzeXN1dl9ldnQiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2 MF9DSEdfVlNZU09WX0VWVCwgImNoZ192c3lzb3ZfZXZ0IiksCj4gKwlERUZJTkVfUkVTX0lSUV9O QU1FRChNVDYzNjBfQ0hHX1ZCQVRPVl9FVlQsICJjaGdfdmJhdG92X2V2dCIpLAo+ICsJREVGSU5F X1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19WQlVTT1ZfRVZULCAiY2hnX3ZidXNvdl9ldnQiKSwK PiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9DSEdfQUlDQ01FQVNMLCAiY2hnX2FpY2Nt ZWFzbCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX1dEVE1SSSwgIndkdG1yaSIp LAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0NIR19SRUNIR0ksICJjaGdfcmVjaGdp IiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX1RFUk1JLCAiY2hnX3Rlcm1p IiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQ0hHX0lFT0NJLCAiY2hnX2llb2Np IiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfUFVNUFhfRE9ORUksICJwdW1weF9k b25laSIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0FUVEFDSF9JLCAiYXR0YWNo X2kiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9DSFJERVRfRVhUX0VWVCwgImNo cmRldF9leHRfZXZ0IiksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNl IG10NjM2MF9sZWRfcmVzb3VyY2VzW10gPSB7Cj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYz NjBfRkxFRF9DSEdfVklOT1ZQX0VWVCwgImZsZWRfY2hnX3Zpbm92cF9ldnQiKSwKPiArCURFRklO RV9SRVNfSVJRX05BTUVEKE1UNjM2MF9GTEVEX0xWRl9FVlQsICJmbGVkX2x2Zl9ldnQiKSwKPiAr CURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9GTEVEMl9TSE9SVF9FVlQsICJmbGVkMl9zaG9y dF9ldnQiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9GTEVEMV9TSE9SVF9FVlQs ICJmbGVkMV9zaG9ydF9ldnQiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9GTEVE Ml9TVFJCX1RPX0VWVCwgImZsZWQyX3N0cmJfdG9fZXZ0IiksCj4gKwlERUZJTkVfUkVTX0lSUV9O QU1FRChNVDYzNjBfRkxFRDFfU1RSQl9UT19FVlQsICJmbGVkMV9zdHJiX3RvX2V2dCIpLAo+ICt9 Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZXNvdXJjZSBtdDYzNjBfcG1pY19yZXNvdXJj ZXNbXSA9IHsKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9CVUNLMV9QR0JfRVZULCAi YnVjazFfcGdiX2V2dCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0JVQ0sxX09D X0VWVCwgImJ1Y2sxX29jX2V2dCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0JV Q0sxX09WX0VWVCwgImJ1Y2sxX292X2V2dCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2 MzYwX0JVQ0sxX1VWX0VWVCwgImJ1Y2sxX3V2X2V2dCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFN RUQoTVQ2MzYwX0JVQ0syX1BHQl9FVlQsICJidWNrMl9wZ2JfZXZ0IiksCj4gKwlERUZJTkVfUkVT X0lSUV9OQU1FRChNVDYzNjBfQlVDSzJfT0NfRVZULCAiYnVjazJfb2NfZXZ0IiksCj4gKwlERUZJ TkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQlVDSzJfT1ZfRVZULCAiYnVjazJfb3ZfZXZ0IiksCj4g KwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfQlVDSzJfVVZfRVZULCAiYnVjazJfdXZfZXZ0 IiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfTERPNl9PQ19FVlQsICJsZG82X29j X2V2dCIpLAo+ICsJREVGSU5FX1JFU19JUlFfTkFNRUQoTVQ2MzYwX0xETzdfT0NfRVZULCAibGRv N19vY19ldnQiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9MRE82X1BHQl9FVlQs ICJsZG82X3BnYl9ldnQiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM2MF9MRE83X1BH Ql9FVlQsICJsZG83X3BnYl9ldnQiKSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg cmVzb3VyY2UgbXQ2MzYwX2xkb19yZXNvdXJjZXNbXSA9IHsKPiArCURFRklORV9SRVNfSVJRX05B TUVEKE1UNjM2MF9MRE8xX09DX0VWVCwgImxkbzFfb2NfZXZ0IiksCj4gKwlERUZJTkVfUkVTX0lS UV9OQU1FRChNVDYzNjBfTERPMl9PQ19FVlQsICJsZG8yX29jX2V2dCIpLAo+ICsJREVGSU5FX1JF U19JUlFfTkFNRUQoTVQ2MzYwX0xETzNfT0NfRVZULCAibGRvM19vY19ldnQiKSwKPiArCURFRklO RV9SRVNfSVJRX05BTUVEKE1UNjM2MF9MRE81X09DX0VWVCwgImxkbzVfb2NfZXZ0IiksCj4gKwlE RUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfTERPMV9QR0JfRVZULCAibGRvMV9wZ2JfZXZ0Iiks Cj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfTERPMl9QR0JfRVZULCAibGRvMl9wZ2Jf ZXZ0IiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfTERPM19QR0JfRVZULCAibGRv M19wZ2JfZXZ0IiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNjBfTERPNV9QR0JfRVZU LCAibGRvNV9wZ2JfZXZ0IiksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG1mZF9j ZWxsIG10NjM2MF9kZXZzW10gPSB7Cj4gKwlNVDYzNjBfTUZEX0NFTEwobXQ2MzYwX2FkYyksCj4g KwlNVDYzNjBfTUZEX0NFTEwobXQ2MzYwX2NoZyksCj4gKwlNVDYzNjBfTUZEX0NFTEwobXQ2MzYw X2xlZCksCj4gKwlNVDYzNjBfTUZEX0NFTEwobXQ2MzYwX3BtaWMpLAo+ICsJTVQ2MzYwX01GRF9D RUxMKG10NjM2MF9sZG8pLAo+ICsJLyogdGNwYyBkZXYgKi8KPiArCXsKPiArCQkubmFtZSA9ICJt dDYzNjBfdGNwYyIsCj4gKwkJLm9mX2NvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ2MzYwX3RjcGMi LAoKVGhlcmUgaXMgYSBtYWNybyBmb3IgdGhpcyB0b28gKE9GX01GRF9DRUxMKCkpCgo+ICsJfSwK PiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBtdDYzNjBfc2xhdmVfYWRk cltNVDYzNjBfU0xBVkVfTUFYXSA9IHsKPiArCU1UNjM2MF9QTVVfU0xBVkVJRCwKPiArCU1UNjM2 MF9QTUlDX1NMQVZFSUQsCj4gKwlNVDYzNjBfTERPX1NMQVZFSUQsCj4gKwlNVDYzNjBfVENQQ19T TEFWRUlELAo+ICt9Owo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfcG11X3Byb2JlKHN0cnVjdCBp MmNfY2xpZW50ICpjbGllbnQsCj4gKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAq aWQpCgpJZiB5b3UgdXNlIC5wcm9iZV9uZXcgKHNlZSBiZWxvdykgeW91IGNhbiBvbWl0IHRoZSAn aWQnIHBhcmFtLgoKPiArewo+ICsJc3RydWN0IG10NjM2MF9wbXVfaW5mbyAqbXBpOwoKV2Ugbm9y bWFsbHkgY2FsbCB0aGlzIGRkYXRhLgoKPiArCXVuc2lnbmVkIGludCByZWdfZGF0YSA9IDA7Cj4g KwlpbnQgaSwgcmV0Owo+ICsKPiArCW1waSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNp emVvZigqbXBpKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW1waSkKPiArCQlyZXR1cm4gLUVOT01F TTsKCidcbicgaGVyZS4KCj4gKwltcGktPmRldiA9ICZjbGllbnQtPmRldjsKPiArCWkyY19zZXRf Y2xpZW50ZGF0YShjbGllbnQsIG1waSk7Cj4gKwo+ICsJLyogcmVnbWFwIHJlZ2lzZXIgKi8KClRo aXMgY29tbWVudCBpcyBzcGVsdCBpbmNvcnJlY3RseSBhbmQgZG9lc24ndCByZWFsbHkgYWRkIGFu eXRoaW5nLgoKPiArCW1waS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAm bXQ2MzYwX3BtdV9yZWdtYXBfY29uZmlnKTsKPiArCWlmIChJU19FUlIobXBpLT5yZWdtYXApKSB7 Cj4gKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWdtYXAgcmVnaXN0ZXIgZmFpbFxuIik7Cgoi RmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ21hcCIKCj4gKwkJcmV0dXJuIFBUUl9FUlIobXBpLT5yZWdt YXApOwo+ICsJfQoKJ1xuJyBoZXJlLgoKPiArCS8qIGNoaXAgaWQgY2hlY2sgKi8KCkFnYWluLCB0 aGUgY29kZSBpcyBwcmV0dHkgb2J2aW91cy4KCj4gKwlyZXQgPSByZWdtYXBfcmVhZChtcGktPnJl Z21hcCwgTVQ2MzYwX1BNVV9ERVZfSU5GTywgJnJlZ19kYXRhKTsKPiArCWlmIChyZXQgPCAwKSB7 Cj4gKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJkZXZpY2Ugbm90IGZvdW5kXG4iKTsKCiJEZXZp Y2Ugbm90IGZvdW5kIgoKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQoKJ1xuJyBoZXJlLgoKPiArCWlm ICgocmVnX2RhdGEgJiBDSElQX1ZFTl9NQVNLKSAhPSBDSElQX1ZFTl9NVDYzNjApIHsKPiArCQlk ZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vdCBtdDYzNjAgY2hpcFxuIik7CgoiRGV2aWNlIG5vdCBz dXBwb3J0ZWQiCgo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQoKJ1xuJyBoZXJlLgoKPiArCW1w aS0+Y2hpcF9yZXYgPSByZWdfZGF0YSAmIENISVBfUkVWX01BU0s7CgpEbyB0aGlzIGFib3ZlIHRo ZSBjaGVjaywgdGhlbiBkbwoKICAobXBpLT5jaGlwX3JldiAhPSBDSElQX1ZFTl9NVDYzNjApCgou Li4gYWJvdmUuCgo+ICsJLyogaXJxIHJlZ2lzdGVyICovCgpQbGVhc2UgcmVtb3ZlIGFsbCBvZiB0 aGVzZSBjb21tZW50cy4KCj4gKwltZW1jcHkoJm1waS0+aXJxX2NoaXAsICZtdDYzNjBfcG11X2ly cV9jaGlwLCBzaXplb2YobXBpLT5pcnFfY2hpcCkpOwoKV2h5IGRvIHdlIG5lZWQgdG8gbWFrZSBh IGNvcHkgb2YgaXQ/Cgo+ICsJbXBpLT5pcnFfY2hpcC5uYW1lID0gZGV2X25hbWUoJmNsaWVudC0+ ZGV2KTsKCldlIGFscmVhZHkga25vdyB0aGUgbmFtZS4gIFdoeSBkbyB3ZSBuZWVkIHRvIGRvIHRo aXMgZHluYW1pY2FsbHk/Cgo+ICsJbXBpLT5pcnFfY2hpcC5pcnFfZHJ2X2RhdGEgPSBtcGk7CgpX ZSBhbHJlYWR5IHNhdmVkIGRkYXRhLiAgV2h5IGRvIHdlIG5lZWQgdG8gc2F2ZSBpdCBoZXJlIGFz IHdlbGw/Cgo+ICsJcmV0ID0gZGV2bV9yZWdtYXBfYWRkX2lycV9jaGlwKCZjbGllbnQtPmRldiwg bXBpLT5yZWdtYXAsIGNsaWVudC0+aXJxLAo+ICsJCQkJICAgICAgIElSUUZfVFJJR0dFUl9GQUxM SU5HLCAwLCAmbXBpLT5pcnFfY2hpcCwKPiArCQkJCSAgICAgICAmbXBpLT5pcnFfZGF0YSk7Cj4g KwlpZiAocmV0IDwgMCkgewoKSXMgKHJldCA+IDApIHZhbGlkPwoKPiArCQlkZXZfZXJyKCZjbGll bnQtPmRldiwgInJlZ21hcCBpcnEgY2hpcCBhZGQgZmFpbFxuIik7CgoiRmFpbGVkIHRvIGFkZCBS ZWdtYXAgSVJRIENoaXAiCgo+ICsJCXJldHVybiByZXQ7Cj4gKwl9CgonXG4nIGhlcmUuCgo+ICsJ LyogbmV3IGkyYyBzbGF2ZSBkZXZpY2UgKi8KPiArCWZvciAoaSA9IDA7IGkgPCBNVDYzNjBfU0xB VkVfTUFYOyBpKyspIHsKPiArCQlpZiAobXQ2MzYwX3NsYXZlX2FkZHJbaV0gPT0gY2xpZW50LT5h ZGRyKSB7Cj4gKwkJCW1waS0+aTJjW2ldID0gY2xpZW50Owo+ICsJCQljb250aW51ZTsKPiArCQl9 Cj4gKwkJbXBpLT5pMmNbaV0gPSBpMmNfbmV3X2R1bW15KGNsaWVudC0+YWRhcHRlciwKPiArCQkJ CQkgICAgbXQ2MzYwX3NsYXZlX2FkZHJbaV0pOwo+ICsJCWlmICghbXBpLT5pMmNbaV0pIHsKPiAr CQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJuZXcgaTJjIGRldiBbJWRdIGZhaWxcbiIsIGkpOwo+ ICsJCQlyZXQgPSAtRU5PREVWOwo+ICsJCQlnb3RvIG91dDsKPiArCQl9Cj4gKwkJaTJjX3NldF9j bGllbnRkYXRhKG1waS0+aTJjW2ldLCBtcGkpOwo+ICsJfQoKVGhpcyBkb2Vzbid0IGxvb2sgcmln aHQgdG8gbWUuCgpXb2xmcmFtLCB3b3VsZCB5b3UgYmUga2luZCBlbm91Z2ggdG8gdGFrZSBhIGxv b2s/CgonXG4nIGhlcmUuCgo+ICsJLyogbWZkIGNlbGwgcmVnaXN0ZXIgKi8KPiArCXJldCA9IGRl dm1fbWZkX2FkZF9kZXZpY2VzKCZjbGllbnQtPmRldiwgUExBVEZPUk1fREVWSURfQVVUTywKPiAr CQkJCSAgIG10NjM2MF9kZXZzLCBBUlJBWV9TSVpFKG10NjM2MF9kZXZzKSwgTlVMTCwKPiArCQkJ CSAgIDAsIHJlZ21hcF9pcnFfZ2V0X2RvbWFpbihtcGktPmlycV9kYXRhKSk7Cj4gKwlpZiAocmV0 IDwgMCkgewo+ICsJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibWZkIGFkZCBjZWxscyBmYWlsXG4i KTsKPiArCQlnb3RvIG91dDsKPiArCX0KCidcbicgaGVyZS4KCj4gKwlkZXZfaW5mbygmY2xpZW50 LT5kZXYsICJTdWNjZXNzZnVsbHkgcHJvYmVkXG4iKTsKClBsZWFzZSByZW1vdmUgdGhpcyBsaW5l LiAgSXQgZG9lc24ndCBwcm92aWRlIGFueXRoaW5nLgoKPiArCXJldHVybiAwOwo+ICtvdXQ6Cj4g Kwl3aGlsZSAoLS1pID49IDApIHsKPiArCQlpZiAobXBpLT5pMmNbaV0tPmFkZHIgPT0gY2xpZW50 LT5hZGRyKQo+ICsJCQljb250aW51ZTsKPiArCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UobXBpLT5p MmNbaV0pOwo+ICsJfQoKJ1xuJyBoZXJlLgoKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgbXQ2MzYwX3BtdV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKPiAr ewo+ICsJc3RydWN0IG10NjM2MF9wbXVfaW5mbyAqbXBpID0gaTJjX2dldF9jbGllbnRkYXRhKGNs aWVudCk7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgTVQ2MzYwX1NMQVZFX01B WDsgaSsrKSB7Cj4gKwkJaWYgKG1waS0+aTJjW2ldLT5hZGRyID09IGNsaWVudC0+YWRkcikKPiAr CQkJY29udGludWU7Cj4gKwkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKG1waS0+aTJjW2ldKTsKPiAr CX0KCidcbicgaGVyZS4KCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBfX21h eWJlX3VudXNlZCBtdDYzNjBfcG11X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4g KwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChkZXYpOwo+ICsKPiArCWlm IChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQo+ICsJCWVuYWJsZV9pcnFfd2FrZShpMmMtPmlycSk7 CgonXG4nIGhlcmUuCgo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19tYXli ZV91bnVzZWQgbXQ2MzYwX3BtdV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwo+ ICsJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRvX2kyY19jbGllbnQoZGV2KTsKPiArCj4gKwlp ZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKPiArCQlkaXNhYmxlX2lycV93YWtlKGkyYy0+aXJx KTsKCidcbicgaGVyZS4KCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIFNJTVBMRV9E RVZfUE1fT1BTKG10NjM2MF9wbXVfcG1fb3BzLAo+ICsJCQkgbXQ2MzYwX3BtdV9zdXNwZW5kLCBt dDYzNjBfcG11X3Jlc3VtZSk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBfX21heWJlX3VudXNlZCBtdDYzNjBfcG11X29mX2lkW10gPSB7Cj4gKwl7IC5jb21wYXRpYmxl ID0gIm1lZGlhdGVrLG10NjM2MF9wbXUiLCB9LAo+ICsJe30sCj4gK307Cj4gK01PRFVMRV9ERVZJ Q0VfVEFCTEUob2YsIG10NjM2MF9wbXVfb2ZfaWQpOwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVj dCBpMmNfZGV2aWNlX2lkIG10NjM2MF9wbXVfaWRbXSA9IHsKPiArCXsgIm10NjM2MF9wbXUiLCAw IH0sCj4gKwl7fSwKPiArfTsKPiArTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG10NjM2MF9wbXVf aWQpOwoKSWYgeW91IHVzZSAucHJvYmVfbmV3IChzZWUgYmVsb3csIHlvdSBjYW4gcmVtb3ZlIHRo aXMgdGFibGUuCgo+ICtzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbXQ2MzYwX3BtdV9kcml2ZXIg PSB7Cj4gKwkuZHJpdmVyID0gewo+ICsJCS5uYW1lID0gIm10NjM2MF9wbXUiLAo+ICsJCS5vd25l ciA9IFRISVNfTU9EVUxFLAoKVGhpcyBpcyBubyBsb25nZXIgcmVxdWlyZWQuCgo+ICsJCS5wbSA9 ICZtdDYzNjBfcG11X3BtX29wcywKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIo bXQ2MzYwX3BtdV9vZl9pZCksCj4gKwl9LAo+ICsJLnByb2JlID0gbXQ2MzYwX3BtdV9wcm9iZSwK ClVzZSAucHJvYmVfbmV3IGhlcmUuCgo+ICsJLnJlbW92ZSA9IG10NjM2MF9wbXVfcmVtb3ZlLAo+ ICsJLmlkX3RhYmxlID0gbXQ2MzYwX3BtdV9pZCwKPiArfTsKPiArbW9kdWxlX2kyY19kcml2ZXIo bXQ2MzYwX3BtdV9kcml2ZXIpOwo+ICsKPiArTU9EVUxFX0FVVEhPUigiQ1lfSHVhbmcgPGN5X2h1 YW5nQHJpY2h0ZWsuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1UNjM2MCBQTVUgSTJD IERyaXZlciIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gK01PRFVMRV9WRVJTSU9OKCIx LjAuMCIpOwo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tdDYzNjAtcHJpdmF0ZS5o IGIvaW5jbHVkZS9saW51eC9tZmQvbXQ2MzYwLXByaXZhdGUuaAo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMC4uYjA3YjNkOQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9pbmNs dWRlL2xpbnV4L21mZC9tdDYzNjAtcHJpdmF0ZS5oCgpXaHkgZG8geW91IG5lZWQgMiBoZWFkZXIg ZmlsZXM/Cgo+IEBAIC0wLDAgKzEsMjc5IEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAxOSBNZWRpYVRlayBJbmMu Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfX01UNjM2MF9QUklWQVRFX0hfXwo+ICsjZGVmaW5lIF9f TVQ2MzYwX1BSSVZBVEVfSF9fCgpfX01GRF9NVDYzNjBfSF9fCgo+ICsjaW5jbHVkZSA8bGludXgv aW50ZXJydXB0Lmg+Cj4gKwo+ICsvKiBQTVUgcmVnaXN0ZXIgZGVmaW5pbml0aW9uICovCj4gKyNk ZWZpbmUgTVQ2MzYwX1BNVV9ERVZfSU5GTwkJCSgweDAwKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf Q09SRV9DVFJMMQkJCSgweDAxKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUlNUMQkJCQkoMHgwMikK PiArI2RlZmluZSBNVDYzNjBfUE1VX0NSQ0VOCQkJKDB4MDMpCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9SU1RfUEFTX0NPREUxCQkoMHgwNCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX1JTVF9QQVNfQ09E RTIJCSgweDA1KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ09SRV9DVFJMMgkJCSgweDA2KQo+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfVE1fUEFTX0NPREUxCQkJKDB4MDcpCj4gKyNkZWZpbmUgTVQ2MzYw X1BNVV9UTV9QQVNfQ09ERTIJCQkoMHgwOCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX1RNX1BBU19D T0RFMwkJCSgweDA5KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfVE1fUEFTX0NPREU0CQkJKDB4MEEp Cj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9JUlFfSU5ECQkJKDB4MEIpCj4gKyNkZWZpbmUgTVQ2MzYw X1BNVV9JUlFfTUFTSwkJCSgweDBDKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfSVJRX1NFVAkJCSgw eDBEKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfU0hETl9DVFJMCQkJKDB4MEUpCj4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9UTV9JTkYJCQkoMHgwRikKPiArI2RlZmluZSBNVDYzNjBfUE1VX0kyQ19DVFJM CQkJKDB4MTApCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEJCQkoMHgxMSkKPiArI2Rl ZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMgkJCSgweDEyKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf Q0hHX0NUUkwzCQkJKDB4MTMpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDQJCQkoMHgx NCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMNQkJCSgweDE1KQo+ICsjZGVmaW5lIE1U NjM2MF9QTVVfQ0hHX0NUUkw2CQkJKDB4MTYpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RS TDcJCQkoMHgxNykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMOAkJCSgweDE4KQo+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw5CQkJKDB4MTkpCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9DSEdfQ1RSTDEwCQkJKDB4MUEpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDExCQkJ KDB4MUIpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEyCQkJKDB4MUMpCj4gKyNkZWZp bmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDEzCQkJKDB4MUQpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9D SEdfQ1RSTDE0CQkJKDB4MUUpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDE1CQkJKDB4 MUYpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RSTDE2CQkJKDB4MjApCj4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9DSEdfQUlDQ19SRVNVTFQJCSgweDIxKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf REVWSUNFX1RZUEUJCQkoMHgyMikKPiArI2RlZmluZSBNVDYzNjBfUE1VX1FDX0NPTlRST0wxCQkJ KDB4MjMpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9RQ19DT05UUk9MMgkJCSgweDI0KQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfUUMzMF9DT05UUk9MMQkJKDB4MjUpCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9RQzMwX0NPTlRST0wyCQkoMHgyNikKPiArI2RlZmluZSBNVDYzNjBfUE1VX1VTQl9TVEFUVVMx CQkJKDB4MjcpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9RQ19TVEFUVVMxCQkJKDB4MjgpCj4gKyNk ZWZpbmUgTVQ2MzYwX1BNVV9RQ19TVEFUVVMyCQkJKDB4MjkpCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9DSEdfUFVNUAkJCSgweDJBKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxNwkJCSgw eDJCKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxOAkJCSgweDJDKQo+ICsjZGVmaW5l IE1UNjM2MF9QTVVfQ0hSREVUX0NUUkwxCQkJKDB4MkQpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9D SFJERVRfQ1RSTDIJCQkoMHgyRSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0RQRE5fQ1RSTAkJCSgw eDJGKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMQkJKDB4MzApCj4gKyNk ZWZpbmUgTVQ2MzYwX1BNVV9DSEdfSElEREVOX0NUUkwyCQkoMHgzMSkKPiArI2RlZmluZSBNVDYz NjBfUE1VX0NIR19ISURERU5fQ1RSTDMJCSgweDMyKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hH X0hJRERFTl9DVFJMNAkJKDB4MzMpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfSElEREVOX0NU Ukw1CQkoMHgzNCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19ISURERU5fQ1RSTDYJCSgweDM1 KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMNwkJKDB4MzYpCj4gKyNkZWZp bmUgTVQ2MzYwX1BNVV9DSEdfSElEREVOX0NUUkw4CQkoMHgzNykKPiArI2RlZmluZSBNVDYzNjBf UE1VX0NIR19ISURERU5fQ1RSTDkJCSgweDM4KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJ RERFTl9DVFJMMTAJCSgweDM5KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJM MTEJCSgweDNBKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMTIJCSgweDNC KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMTMJCSgweDNDKQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMTQJCSgweDNEKQo+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfQ0hHX0hJRERFTl9DVFJMMTUJCSgweDNFKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hH X0hJRERFTl9DVFJMMTYJCSgweDNGKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9D VFJMMTcJCSgweDQwKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMTgJCSgw eDQxKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMTkJCSgweDQyKQo+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMjAJCSgweDQzKQo+ICsjZGVmaW5lIE1U NjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMjEJCSgweDQ0KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf Q0hHX0hJRERFTl9DVFJMMjIJCSgweDQ1KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERF Tl9DVFJMMjMJCSgweDQ2KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMjQJ CSgweDQ3KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0hJRERFTl9DVFJMMjUJCSgweDQ4KQo+ ICsjZGVmaW5lIE1UNjM2MF9QTVVfQkMxMl9DVFJMCQkJKDB4NDkpCj4gKyNkZWZpbmUgTVQ2MzYw X1BNVV9DSEdfU1RBVAkJCSgweDRBKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkVTVjEJCQkoMHg0 QikKPiArI2RlZmluZSBNVDYzNjBfUE1VX1RZUEVDX09UUF9USF9TRUxfQ09ERUgJKDB4NEUpCj4g KyNkZWZpbmUgTVQ2MzYwX1BNVV9UWVBFQ19PVFBfVEhfU0VMX0NPREVMCSgweDRGKQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfVFlQRUNfT1RQX0hZU1RfVEgJCSgweDUwKQo+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfVFlQRUNfT1RQX0NUUkwJCSgweDUxKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQURDX0JB VF9EQVRBX0gJCSgweDUyKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQURDX0JBVF9EQVRBX0wJCSgw eDUzKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfSU1JRF9CQUNLQlNUX09OCQkoMHg1NCkKPiArI2Rl ZmluZSBNVDYzNjBfUE1VX0lNSURfQkFDS0JTVF9PRkYJCSgweDU1KQo+ICsjZGVmaW5lIE1UNjM2 MF9QTVVfQURDX0NPTkZJRwkJCSgweDU2KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQURDX0VOMgkJ CSgweDU3KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQURDX0lETEVfVAkJCSgweDU4KQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfQURDX1JQVF8xCQkJKDB4NUEpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9B RENfUlBUXzIJCQkoMHg1QikKPiArI2RlZmluZSBNVDYzNjBfUE1VX0FEQ19SUFRfMwkJCSgweDVD KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQURDX1JQVF9PUkcxCQkJKDB4NUQpCj4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9BRENfUlBUX09SRzIJCQkoMHg1RSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0JB VF9PVlBfVEhfU0VMX0NPREVICQkoMHg1RikKPiArI2RlZmluZSBNVDYzNjBfUE1VX0JBVF9PVlBf VEhfU0VMX0NPREVMCQkoMHg2MCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMTkJCQko MHg2MSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX1ZEREFTVVBQTFkJCQkoMHg2MikKPiArI2RlZmlu ZSBNVDYzNjBfUE1VX0JDMTJfTUFOVUFMCQkJKDB4NjMpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9D SEdERVRfRlVOQwkJCSgweDY0KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfRk9EX0NUUkwJCQkoMHg2 NSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMjAJCQkoMHg2NikKPiArI2RlZmluZSBN VDYzNjBfUE1VX0NIR19ISURERU5fQ1RSTDI2CQkoMHg2NykKPiArI2RlZmluZSBNVDYzNjBfUE1V X0NIR19ISURERU5fQ1RSTDI3CQkoMHg2OCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX1JFU1YyCQkJ KDB4NjkpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9VU0JJRF9DVFJMMQkJCSgweDZEKQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfVVNCSURfQ1RSTDIJCQkoMHg2RSkKPiArI2RlZmluZSBNVDYzNjBfUE1V X1VTQklEX0NUUkwzCQkJKDB4NkYpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9GTEVEX0NGRwkJCSgw eDcwKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkVTVjMJCQkoMHg3MSkKPiArI2RlZmluZSBNVDYz NjBfUE1VX0ZMRUQxX0NUUkwJCQkoMHg3MikKPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZMRURfU1RS Ql9DVFJMCQkoMHg3MykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZMRUQxX1NUUkJfQ1RSTDIJCSgw eDc0KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfRkxFRDFfVE9SX0NUUkwJCSgweDc1KQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfRkxFRDJfQ1RSTAkJCSgweDc2KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf UkVTVjQJCQkoMHg3NykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZMRUQyX1NUUkJfQ1RSTDIJCSgw eDc4KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfRkxFRDJfVE9SX0NUUkwJCSgweDc5KQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfRkxFRF9WTUlEVFJLX0NUUkwxCQkoMHg3QSkKPiArI2RlZmluZSBNVDYz NjBfUE1VX0ZMRURfVk1JRF9SVE0JCSgweDdCKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfRkxFRF9W TUlEVFJLX0NUUkwyCQkoMHg3QykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZMRURfUFdTRUwJCQko MHg3RCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0ZMRURfRU4JCQkoMHg3RSkKPiArI2RlZmluZSBN VDYzNjBfUE1VX0ZMRURfSGlkZGVuMQkJCSgweDdGKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkdC X0VOCQkJKDB4ODApCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9SR0IxX0lTTksJCQkoMHg4MSkKPiAr I2RlZmluZSBNVDYzNjBfUE1VX1JHQjJfSVNOSwkJCSgweDgyKQo+ICsjZGVmaW5lIE1UNjM2MF9Q TVVfUkdCM19JU05LCQkJKDB4ODMpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9SR0JfTUxfSVNOSwkJ CSgweDg0KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkdCMV9ESU0JCQkoMHg4NSkKPiArI2RlZmlu ZSBNVDYzNjBfUE1VX1JHQjJfRElNCQkJKDB4ODYpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9SR0Iz X0RJTQkJCSgweDg3KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkVTVjUJCQkoMHg4OCkKPiArI2Rl ZmluZSBNVDYzNjBfUE1VX1JHQjEyX0ZyZXEJCQkoMHg4OSkKPiArI2RlZmluZSBNVDYzNjBfUE1V X1JHQjM0X0ZyZXEJCQkoMHg4QSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX1JHQjFfVHIJCQkoMHg4 QikKPiArI2RlZmluZSBNVDYzNjBfUE1VX1JHQjFfVGYJCQkoMHg4QykKPiArI2RlZmluZSBNVDYz NjBfUE1VX1JHQjFfVE9OX1RPRkYJCSgweDhEKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkdCMl9U cgkJCSgweDhFKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkdCMl9UZgkJCSgweDhGKQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfUkdCMl9UT05fVE9GRgkJKDB4OTApCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9SR0IzX1RyCQkJKDB4OTEpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9SR0IzX1RmCQkJKDB4OTIp Cj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9SR0IzX1RPTl9UT0ZGCQkoMHg5MykKPiArI2RlZmluZSBN VDYzNjBfUE1VX1JHQl9IaWRkZW5fQ1RSTDEJCSgweDk0KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf UkdCX0hpZGRlbl9DVFJMMgkJKDB4OTUpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9SRVNWNgkJCSgw eDk3KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfU1BBUkUxCQkJKDB4OUEpCj4gKyNkZWZpbmUgTVQ2 MzYwX1BNVV9TUEFSRTIJCQkoMHhBMCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX1NQQVJFMwkJCSgw eEIwKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfU1BBUkU0CQkJKDB4QzApCj4gKyNkZWZpbmUgTVQ2 MzYwX1BNVV9DSEdfSVJRMQkJCSgweEQwKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0lSUTIJ CQkoMHhEMSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19JUlEzCQkJKDB4RDIpCj4gKyNkZWZp bmUgTVQ2MzYwX1BNVV9DSEdfSVJRNAkJCSgweEQzKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hH X0lSUTUJCQkoMHhENCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19JUlE2CQkJKDB4RDUpCj4g KyNkZWZpbmUgTVQ2MzYwX1BNVV9RQ19JUlEJCQkoMHhENikKPiArI2RlZmluZSBNVDYzNjBfUE1V X0ZPRF9JUlEJCQkoMHhENykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0JBU0VfSVJRCQkJKDB4RDgp Cj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9GTEVEX0lSUTEJCQkoMHhEOSkKPiArI2RlZmluZSBNVDYz NjBfUE1VX0ZMRURfSVJRMgkJCSgweERBKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUkdCX0lSUQkJ CSgweERCKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQlVDSzFfSVJRCQkJKDB4REMpCj4gKyNkZWZp bmUgTVQ2MzYwX1BNVV9CVUNLMl9JUlEJCQkoMHhERCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0xE T19JUlExCQkJKDB4REUpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9MRE9fSVJRMgkJCSgweERGKQo+ ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX1NUQVQxCQkJKDB4RTApCj4gKyNkZWZpbmUgTVQ2MzYw X1BNVV9DSEdfU1RBVDIJCQkoMHhFMSkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19TVEFUMwkJ CSgweEUyKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX1NUQVQ0CQkJKDB4RTMpCj4gKyNkZWZp bmUgTVQ2MzYwX1BNVV9DSEdfU1RBVDUJCQkoMHhFNCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NI R19TVEFUNgkJCSgweEU1KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfUUNfU1RBVAkJCSgweEU2KQo+ ICsjZGVmaW5lIE1UNjM2MF9QTVVfRk9EX1NUQVQJCQkoMHhFNykKPiArI2RlZmluZSBNVDYzNjBf UE1VX0JBU0VfU1RBVAkJCSgweEU4KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfRkxFRF9TVEFUMQkJ CSgweEU5KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfRkxFRF9TVEFUMgkJCSgweEVBKQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfUkdCX1NUQVQJCQkoMHhFQikKPiArI2RlZmluZSBNVDYzNjBfUE1VX0JV Q0sxX1NUQVQJCQkoMHhFQykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0JVQ0syX1NUQVQJCQkoMHhF RCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0xET19TVEFUMQkJCSgweEVFKQo+ICsjZGVmaW5lIE1U NjM2MF9QTVVfTERPX1NUQVQyCQkJKDB4RUYpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfTUFT SzEJCQkoMHhGMCkKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19NQVNLMgkJCSgweEYxKQo+ICsj ZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX01BU0szCQkJKDB4RjIpCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9DSEdfTUFTSzQJCQkoMHhGMykKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19NQVNLNQkJCSgw eEY0KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX01BU0s2CQkJKDB4RjUpCj4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9RQ19NQVNLCQkJKDB4RjYpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9GT0RfTUFT SwkJCSgweEY3KQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQkFTRV9NQVNLCQkJKDB4RjgpCj4gKyNk ZWZpbmUgTVQ2MzYwX1BNVV9GTEVEX01BU0sxCQkJKDB4RjkpCj4gKyNkZWZpbmUgTVQ2MzYwX1BN VV9GTEVEX01BU0syCQkJKDB4RkEpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9GQVVMVEJfTUFTSwkJ CSgweEZCKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQlVDSzFfTUFTSwkJCSgweEZDKQo+ICsjZGVm aW5lIE1UNjM2MF9QTVVfQlVDSzJfTUFTSwkJCSgweEZEKQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf TERPX01BU0sxCQkJKDB4RkUpCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9MRE9fTUFTSzIJCQkoMHhG RikKPiArI2RlZmluZSBNVDYzNjBfUE1VX01BWFJFRwkJCShNVDYzNjBfUE1VX0xET19NQVNLMikK PiArCj4gKwo+ICsvKiBNVDYzNjBfUE1VX0lSUV9TRVQgKi8KPiArI2RlZmluZSBNVDYzNjBfUE1V X0lSUV9SRUdOVU0JKE1UNjM2MF9QTVVfTERPX0lSUTIgLSBNVDYzNjBfUE1VX0NIR19JUlExICsg MSkKPiArI2RlZmluZSBNVDYzNjBfSVJRX1JFVFJJRwlCSVQoMikKPiArCj4gKyNkZWZpbmUgQ0hJ UF9WRU5fTUFTSwkJCQkoMHhGMCkKPiArI2RlZmluZSBDSElQX1ZFTl9NVDYzNjAJCQkJKDB4NTAp Cj4gKyNkZWZpbmUgQ0hJUF9SRVZfTUFTSwkJCQkoMHgwRikKPiArCj4gKy8qIElSUSBkZWZpbml0 aW9ucyAqLwoKUmVtb3ZlIHRoaXMgcGxlYXNlLgoKPiArc3RydWN0IG10NjM2MF9wbXVfaXJxX2Rl c2Mgewo+ICsJY29uc3QgY2hhciAqbmFtZTsKPiArCWlycV9oYW5kbGVyX3QgaXJxX2hhbmRsZXI7 Cj4gK307CgpXaGVyZSBpcyB0aGlzIHVzZWQ/Cgo+ICsjZGVmaW5lICBNVDYzNjBfRFRfVkFMUFJP UChuYW1lLCB0eXBlKSBcCj4gKwkJCXsjbmFtZSwgb2Zmc2V0b2YodHlwZSwgbmFtZSl9CgpXaGVy ZSBpcyB0aGlzIHVzZWQ/Cgo+ICtzdHJ1Y3QgbXQ2MzYwX3ZhbF9wcm9wIHsKPiArCWNvbnN0IGNo YXIgKm5hbWU7Cj4gKwlzaXplX3Qgb2Zmc2V0Owo+ICt9Owo+ICsKPiArc3RhdGljIGlubGluZSB2 b2lkIG10NjM2MF9kdF9wYXJzZXJfaGVscGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHZvaWQg KmRhdGEsCj4gKwkJCQkJICAgY29uc3Qgc3RydWN0IG10NjM2MF92YWxfcHJvcCAqcHJvcHMsCj4g KwkJCQkJICAgaW50IHByb3BfY250KQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAw OyBpIDwgcHJvcF9jbnQ7IGkrKykgewo+ICsJCWlmICh1bmxpa2VseSghcHJvcHNbaV0ubmFtZSkp Cj4gKwkJCWNvbnRpbnVlOwo+ICsJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCBwcm9wc1tpXS5u YW1lLCBkYXRhICsgcHJvcHNbaV0ub2Zmc2V0KTsKPiArCX0KPiArfQoKV2hhdCBhcmUgeW91IHVz aW5nIHRoaXMgZm9yPyAgV2h5IGlzIHRoZSBzdGFuZGFyZCBBUEkgbm90IHN1ZmZpY2llbnQ/Cgo+ ICsjZGVmaW5lIE1UNjM2MF9QREFUQV9WQUxQUk9QKG5hbWUsIHR5cGUsIHJlZywgc2hpZnQsIG1h c2ssIGZ1bmMsIGJhc2UpIFwKPiArCQkJe29mZnNldG9mKHR5cGUsIG5hbWUpLCByZWcsIHNoaWZ0 LCBtYXNrLCBmdW5jLCBiYXNlfQoKV2hlcmUgaXMgdGhpcyB1c2VkPwoKPiArc3RydWN0IG10NjM2 MF9wZGF0YV9wcm9wIHsKPiArCXNpemVfdCBvZmZzZXQ7Cj4gKwl1OCByZWc7Cj4gKwl1OCBzaGlm dDsKPiArCXU4IG1hc2s7Cj4gKwl1MzIgKCp0cmFuc2Zvcm0pKHUzMiB2YWwpOwo+ICsJdTggYmFz ZTsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgaW50IG10NjM2MF9wZGF0YV9hcHBseV9oZWxw ZXIodm9pZCAqY29udGV4dCwgdm9pZCAqcGRhdGEsCj4gKwkJCQkJICAgY29uc3Qgc3RydWN0IG10 NjM2MF9wZGF0YV9wcm9wICpwcm9wLAo+ICsJCQkJCSAgIGludCBwcm9wX2NudCkKPiArewo+ICsJ aW50IGksIHJldDsKPiArCXUzMiB2YWw7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IHByb3BfY250 OyBpKyspIHsKPiArCQl2YWwgPSAqKHUzMiAqKShwZGF0YSArIHByb3BbaV0ub2Zmc2V0KTsKPiAr CQlpZiAocHJvcFtpXS50cmFuc2Zvcm0pCj4gKwkJCXZhbCA9IHByb3BbaV0udHJhbnNmb3JtKHZh bCk7Cj4gKwkJdmFsICs9IHByb3BbaV0uYmFzZTsKPiArCQlyZXQgPSByZWdtYXBfdXBkYXRlX2Jp dHMoY29udGV4dCwKPiArCQkJICAgICBwcm9wW2ldLnJlZywgcHJvcFtpXS5tYXNrLCB2YWwgPDwg cHJvcFtpXS5zaGlmdCk7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJCXJldHVybiByZXQ7Cj4gKwl9 Cj4gKwlyZXR1cm4gMDsKPiArfQoKV2hlcmUgaXMgdGhpcyB1c2VkPyAgV2hhdCBkb2VzIGl0IGRv PwoKPiArI2VuZGlmIC8qIF9fTVQ2MzYwX1BSSVZBVEVfSF9fICovCj4gZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvbWZkL210NjM2MC5oIGIvaW5jbHVkZS9saW51eC9tZmQvbXQ2MzYwLmgKPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmJhMmU4MGEKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbXQ2MzYwLmgKPiBAQCAtMCwwICsxLDMzIEBA Cj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gKy8qCj4gKyAqIENv cHlyaWdodCAoYykgMjAxOSBNZWRpYVRlayBJbmMuCj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfX01U NjM2MF9IX18KPiArI2RlZmluZSBfX01UNjM2MF9IX18KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9y ZWdtYXAuaD4KPiArCj4gK2VudW0gewo+ICsJTVQ2MzYwX1NMQVZFX1BNVSA9IDAsCj4gKwlNVDYz NjBfU0xBVkVfUE1JQywKPiArCU1UNjM2MF9TTEFWRV9MRE8sCj4gKwlNVDYzNjBfU0xBVkVfVENQ QywKPiArCU1UNjM2MF9TTEFWRV9NQVgsCj4gK307Cj4gKwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVf U0xBVkVJRAkoMHgzNCkKPiArI2RlZmluZSBNVDYzNjBfUE1JQ19TTEFWRUlECSgweDFBKQo+ICsj ZGVmaW5lIE1UNjM2MF9MRE9fU0xBVkVJRAkoMHg2NCkKPiArI2RlZmluZSBNVDYzNjBfVENQQ19T TEFWRUlECSgweDRFKQoKV2hhdCBraW5kIG9mIHNsYXZlIElEPyAgSTJDIGFkZHJlc3M/Cgo+ICtz dHJ1Y3QgbXQ2MzYwX3BtdV9pbmZvIHsKPiArCXN0cnVjdCBpMmNfY2xpZW50ICppMmNbTVQ2MzYw X1NMQVZFX01BWF07Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cgo+ICsJc3RydWN0IHJlZ21hcCAq cmVnbWFwOwo+ICsJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YTsKPiArCXN0 cnVjdCByZWdtYXBfaXJxX2NoaXAgaXJxX2NoaXA7Cj4gKwl1bnNpZ25lZCBpbnQgY2hpcF9yZXY7 CgpXaHkgYXJlIHlvdSBzYXZpbmcgdGhlc2U/CgpXaGVyZSBkbyB5b3UgcmV1c2UgdGhlbT8KCj4g K307Cj4gKwo+ICsjZW5kaWYgLyogX19NVDYzNjBfSF9fICovCgotLSAKTGVlIEpvbmVzIFvmnY7n kLzmlq9dCkxpbmFybyBTZXJ2aWNlcyBUZWNobmljYWwgTGVhZApMaW5hcm8ub3JnIOKUgiBPcGVu IHNvdXJjZSBzb2Z0d2FyZSBmb3IgQVJNIFNvQ3MKRm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBU d2l0dGVyIHwgQmxvZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtYXJtLWtlcm5lbAo=