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 ADFA2C433EF for ; Tue, 12 Jul 2022 15:29:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233553AbiGLP32 (ORCPT ); Tue, 12 Jul 2022 11:29:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37882 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233459AbiGLP31 (ORCPT ); Tue, 12 Jul 2022 11:29:27 -0400 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06E8D74790 for ; Tue, 12 Jul 2022 08:29:23 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id o4so11699033wrh.3 for ; Tue, 12 Jul 2022 08:29:22 -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; bh=Q+JH/qWaiP2eJjuYW7C2uW3S0RkJ71Ub5nbWi6ekYbU=; b=OczFGqywfdpy/mS2TpodOJOjuQVYsPEbYTpYSvI59PBCT2BHt/vguhiU3Z+P/25Xy1 NX12SAQIPHWI4v65pWrdKecJzJ1ZGNsVrm4p4CkSKIuywvfuizpOzZ9Wqb5Jt0s0UHBp T5PS8SW072ViH7TP9Q1PP6fDrZJHGcvg2WmV6fg5I4zrNV3XGkuRlHjgoLdrxTGYU28w Z87I9ucdUZ9RkKjmGgpr804KkfSTtYBOnSa8OCgcdq8A7jMi3r48eOJ1/nJefL8+oJ9R cLWhrGedBVWmNXkrHud8KRNz7PKK4gOV5vdbwVuBC3Im5EaXVYsYxBfTlWzC718rBE5u DBkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Q+JH/qWaiP2eJjuYW7C2uW3S0RkJ71Ub5nbWi6ekYbU=; b=lSihYOPp24NAd0Z+lsuM11rdT2u5vJA5jgXrXLK5rd/lQObEe9dxgdK8duy3bseCC6 1oZro73fbiLWcE9QS308NWBBgECaxtTE1P/eTmif6t+CvETxxsbxAXq/jrrSKlzR75Hr 2jkThiXNGoyGzcSsASQZOR2Kho7hN5b+jQWkKVRg/jCBrEjO1p/4FrqgUZoMTOTD/byh +UHCVQ2V9PJyijqPPgKOpGV57E0OW/nIT5IzQ//JKGKN23kKL2xJuyRSQ+Ud4EoHwgVN dRgXAq1EqMjQs+iAccw6hQ5+CVpDIQoYGhiOMoO0TBpnTeFs901b5vs9dJtc/xH4TtjE 695w== X-Gm-Message-State: AJIora+Uejqs+ehypkISevcqLyTst5TEKxBwQDd6RB1tK8JSj4RObXyS 30fFrRCN1NTdOenVfI2LMeTB1w== X-Google-Smtp-Source: AGRyM1uSLPcm2Pav8BPF3Jx+Guud3701li2mH9y8hYpZuHdD2WZOCC/W4swCDeXJTVRAPp66ckDPSg== X-Received: by 2002:a5d:414a:0:b0:21d:6be5:1765 with SMTP id c10-20020a5d414a000000b0021d6be51765mr22980167wrq.419.1657639761463; Tue, 12 Jul 2022 08:29:21 -0700 (PDT) Received: from google.com (cpc155339-bagu17-2-0-cust87.1-3.cable.virginm.net. [86.27.177.88]) by smtp.gmail.com with ESMTPSA id ay26-20020a05600c1e1a00b003a2e89d1fb5sm5149242wmb.42.2022.07.12.08.29.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Jul 2022 08:29:20 -0700 (PDT) Date: Tue, 12 Jul 2022 16:29:18 +0100 From: Lee Jones To: ChiaEn Wu Cc: daniel.thompson@linaro.org, jingoohan1@gmail.com, pavel@ucw.cz, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, matthias.bgg@gmail.com, sre@kernel.org, chunfeng.yun@mediatek.com, gregkh@linuxfoundation.org, jic23@kernel.org, lars@metafoo.de, lgirdwood@gmail.com, broonie@kernel.org, linux@roeck-us.net, heikki.krogerus@linux.intel.com, deller@gmx.de, chiaen_wu@richtek.com, alice_chen@richtek.com, cy_huang@richtek.com, dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, linux-iio@vger.kernel.org, linux-fbdev@vger.kernel.org, szunichen@gmail.com Subject: Re: [PATCH v3 07/14] mfd: mt6370: Add Mediatek MT6370 support Message-ID: References: <20220623115631.22209-1-peterwu.pub@gmail.com> <20220623115631.22209-8-peterwu.pub@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220623115631.22209-8-peterwu.pub@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org On Thu, 23 Jun 2022, ChiaEn Wu wrote: > From: ChiYuan Huang > > Add Mediatek MT6370 MFD support. No such thing as "MFD support". And you're not getting away with submitting a 370 line patch with a 5 word change log either. :) Please at least tell us what the device is and what it's used for. > Signed-off-by: ChiYuan Huang > --- > > v3 > - Refine Kconfig help text > - Refine error message of unknown vendor ID in > mt6370_check_vendor_info() > - Refine return value handling of mt6370_regmap_read() > - Refine all probe error by using dev_err_probe() > - Refine "bank_idx" and "bank_addr" in mt6370_regmap_read() and > mt6370_regmap_write() > - Add "#define VENID*" and drop the comments in > mt6370_check_vendor_info() > - Drop "MFD" in MODULE_DESCRIPTION() > --- > drivers/mfd/Kconfig | 13 ++ > drivers/mfd/Makefile | 1 + > drivers/mfd/mt6370.c | 358 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 372 insertions(+) > create mode 100644 drivers/mfd/mt6370.c > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 3b59456..4c900c4 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -937,6 +937,19 @@ config MFD_MT6360 > PMIC part includes 2-channel BUCKs and 2-channel LDOs > LDO part includes 4-channel LDOs > > +config MFD_MT6370 > + tristate "Mediatek MT6370 SubPMIC" > + select MFD_CORE > + select REGMAP_I2C > + select REGMAP_IRQ > + depends on I2C > + help > + Say Y here to enable MT6370 SubPMIC functional support. > + It consists of a single cell battery charger with ADC monitoring, RGB > + LEDs, dual channel flashlight, WLED backlight driver, display bias > + voltage supply, one general purpose LDO, and the USB Type-C & PD > + controller complies with the latest USB Type-C and PD standards. > + > config MFD_MT6397 > tristate "MediaTek MT6397 PMIC Support" > select MFD_CORE > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 858cacf..62b2712 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -242,6 +242,7 @@ 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_MT6370) += mt6370.o > mt6397-objs := mt6397-core.o mt6397-irq.o mt6358-irq.o > obj-$(CONFIG_MFD_MT6397) += mt6397.o > obj-$(CONFIG_INTEL_SOC_PMIC_MRFLD) += intel_soc_pmic_mrfld.o > diff --git a/drivers/mfd/mt6370.c b/drivers/mfd/mt6370.c > new file mode 100644 > index 0000000..49f02b1 > --- /dev/null > +++ b/drivers/mfd/mt6370.c > @@ -0,0 +1,358 @@ > +// SPDX-License-Identifier: GPL-2.0 No Copyright? > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +enum { > + MT6370_USBC_I2C = 0, > + MT6370_PMU_I2C, > + MT6370_MAX_I2C > +}; > + > +#define MT6370_REG_DEV_INFO 0x100 > +#define MT6370_REG_CHG_IRQ1 0x1C0 > +#define MT6370_REG_CHG_MASK1 0x1E0 > + > +#define MT6370_VENID_MASK GENMASK(7, 4) > + > +#define MT6370_NUM_IRQREGS 16 > +#define MT6370_USBC_I2CADDR 0x4E > +#define MT6370_REG_ADDRLEN 2 > +#define MT6370_REG_MAXADDR 0x1FF > + > +#define MT6370_VENID_RT5081 0x8 > +#define MT6370_VENID_RT5081A 0xA > +#define MT6370_VENID_MT6370 0xE > +#define MT6370_VENID_MT6371 0xF > +#define MT6370_VENID_MT6372P 0x9 > +#define MT6370_VENID_MT6372CP 0xB > + > +/* IRQ definitions */ > +#define MT6370_IRQ_DIRCHGON 0 > +#define MT6370_IRQ_CHG_TREG 4 > +#define MT6370_IRQ_CHG_AICR 5 > +#define MT6370_IRQ_CHG_MIVR 6 > +#define MT6370_IRQ_PWR_RDY 7 > +#define MT6370_IRQ_FL_CHG_VINOVP 11 > +#define MT6370_IRQ_CHG_VSYSUV 12 > +#define MT6370_IRQ_CHG_VSYSOV 13 > +#define MT6370_IRQ_CHG_VBATOV 14 > +#define MT6370_IRQ_CHG_VINOVPCHG 15 > +#define MT6370_IRQ_TS_BAT_COLD 20 > +#define MT6370_IRQ_TS_BAT_COOL 21 > +#define MT6370_IRQ_TS_BAT_WARM 22 > +#define MT6370_IRQ_TS_BAT_HOT 23 > +#define MT6370_IRQ_TS_STATC 24 > +#define MT6370_IRQ_CHG_FAULT 25 > +#define MT6370_IRQ_CHG_STATC 26 > +#define MT6370_IRQ_CHG_TMR 27 > +#define MT6370_IRQ_CHG_BATABS 28 > +#define MT6370_IRQ_CHG_ADPBAD 29 > +#define MT6370_IRQ_CHG_RVP 30 > +#define MT6370_IRQ_TSHUTDOWN 31 > +#define MT6370_IRQ_CHG_IINMEAS 32 > +#define MT6370_IRQ_CHG_ICCMEAS 33 > +#define MT6370_IRQ_CHGDET_DONE 34 > +#define MT6370_IRQ_WDTMR 35 > +#define MT6370_IRQ_SSFINISH 36 > +#define MT6370_IRQ_CHG_RECHG 37 > +#define MT6370_IRQ_CHG_TERM 38 > +#define MT6370_IRQ_CHG_IEOC 39 > +#define MT6370_IRQ_ADC_DONE 40 > +#define MT6370_IRQ_PUMPX_DONE 41 > +#define MT6370_IRQ_BST_BATUV 45 > +#define MT6370_IRQ_BST_MIDOV 46 > +#define MT6370_IRQ_BST_OLP 47 > +#define MT6370_IRQ_ATTACH 48 > +#define MT6370_IRQ_DETACH 49 > +#define MT6370_IRQ_HVDCP_STPDONE 51 > +#define MT6370_IRQ_HVDCP_VBUSDET_DONE 52 > +#define MT6370_IRQ_HVDCP_DET 53 > +#define MT6370_IRQ_CHGDET 54 > +#define MT6370_IRQ_DCDT 55 > +#define MT6370_IRQ_DIRCHG_VGOK 59 > +#define MT6370_IRQ_DIRCHG_WDTMR 60 > +#define MT6370_IRQ_DIRCHG_UC 61 > +#define MT6370_IRQ_DIRCHG_OC 62 > +#define MT6370_IRQ_DIRCHG_OV 63 > +#define MT6370_IRQ_OVPCTRL_SWON 67 > +#define MT6370_IRQ_OVPCTRL_UVP_D 68 > +#define MT6370_IRQ_OVPCTRL_UVP 69 > +#define MT6370_IRQ_OVPCTRL_OVP_D 70 > +#define MT6370_IRQ_OVPCTRL_OVP 71 > +#define MT6370_IRQ_FLED_STRBPIN 72 > +#define MT6370_IRQ_FLED_TORPIN 73 > +#define MT6370_IRQ_FLED_TX 74 > +#define MT6370_IRQ_FLED_LVF 75 > +#define MT6370_IRQ_FLED2_SHORT 78 > +#define MT6370_IRQ_FLED1_SHORT 79 > +#define MT6370_IRQ_FLED2_STRB 80 > +#define MT6370_IRQ_FLED1_STRB 81 > +#define mT6370_IRQ_FLED2_STRB_TO 82 > +#define MT6370_IRQ_FLED1_STRB_TO 83 > +#define MT6370_IRQ_FLED2_TOR 84 > +#define MT6370_IRQ_FLED1_TOR 85 > +#define MT6370_IRQ_OTP 93 > +#define MT6370_IRQ_VDDA_OVP 94 > +#define MT6370_IRQ_VDDA_UV 95 > +#define MT6370_IRQ_LDO_OC 103 > +#define MT6370_IRQ_BLED_OCP 118 > +#define MT6370_IRQ_BLED_OVP 119 > +#define MT6370_IRQ_DSV_VNEG_OCP 123 > +#define MT6370_IRQ_DSV_VPOS_OCP 124 > +#define MT6370_IRQ_DSV_BST_OCP 125 > +#define MT6370_IRQ_DSV_VNEG_SCP 126 > +#define MT6370_IRQ_DSV_VPOS_SCP 127 Can you pop these into a header file please? > +struct mt6370_info { > + struct i2c_client *i2c[MT6370_MAX_I2C]; > + struct device *dev; You don't need both 'i2c' and 'dev'. You can derive one from the other. > + struct regmap *regmap; > + struct regmap_irq_chip_data *irq_data; > +}; This can do into the header file too. > +static const struct regmap_irq mt6370_irqs[] = { > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHGON, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_TREG, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_AICR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_MIVR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_PWR_RDY, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FL_CHG_VINOVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VSYSUV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VSYSOV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VBATOV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VINOVPCHG, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_COLD, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_COOL, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_WARM, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_HOT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_STATC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_FAULT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_STATC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_TMR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_BATABS, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_ADPBAD, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_RVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TSHUTDOWN, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_IINMEAS, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_ICCMEAS, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHGDET_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_WDTMR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_SSFINISH, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_RECHG, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_TERM, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_IEOC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_ADC_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_PUMPX_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BST_BATUV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BST_MIDOV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BST_OLP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_ATTACH, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DETACH, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_HVDCP_STPDONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_HVDCP_VBUSDET_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_HVDCP_DET, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHGDET, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DCDT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_VGOK, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_WDTMR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_UC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_OC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_OV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_SWON, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_UVP_D, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_UVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_OVP_D, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_OVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_STRBPIN, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_TORPIN, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_TX, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_LVF, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED2_SHORT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_SHORT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED2_STRB, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_STRB, 8), > + REGMAP_IRQ_REG_LINE(mT6370_IRQ_FLED2_STRB_TO, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_STRB_TO, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED2_TOR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_TOR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OTP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_VDDA_OVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_VDDA_UV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_LDO_OC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BLED_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BLED_OVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VNEG_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VPOS_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_BST_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VNEG_SCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VPOS_SCP, 8) > +}; > + > +static const struct regmap_irq_chip mt6370_irq_chip = { > + .name = "mt6370-irqs", > + .status_base = MT6370_REG_CHG_IRQ1, > + .mask_base = MT6370_REG_CHG_MASK1, > + .num_regs = MT6370_NUM_IRQREGS, > + .irqs = mt6370_irqs, > + .num_irqs = ARRAY_SIZE(mt6370_irqs), > +}; > + > +static const struct resource mt6370_regulator_irqs[] = { > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VPOS_SCP, "db_vpos_scp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VNEG_SCP, "db_vneg_scp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_BST_OCP, "db_vbst_ocp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VPOS_OCP, "db_vpos_ocp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VNEG_OCP, "db_vneg_ocp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_LDO_OC, "ldo_oc") > +}; > + > +static const struct mfd_cell mt6370_devices[] = { > + MFD_CELL_OF("adc", NULL, NULL, 0, 0, "mediatek,mt6370-adc"), > + MFD_CELL_OF("charger", NULL, NULL, 0, 0, "mediatek,mt6370-charger"), > + MFD_CELL_OF("backlight", NULL, NULL, 0, 0, "mediatek,mt6370-backlight"), > + MFD_CELL_OF("flashlight", NULL, NULL, 0, 0, "mediatek,mt6370-flashlight"), > + MFD_CELL_OF("indicator", NULL, NULL, 0, 0, "mediatek,mt6370-indicator"), > + MFD_CELL_OF("tcpc", NULL, NULL, 0, 0, "mediatek,mt6370-tcpc"), > + MFD_CELL_RES("regulator", mt6370_regulator_irqs) The first parameters here should be prepended with something, perhaps "mt6370_"? > +}; > + > +static int mt6370_check_vendor_info(struct mt6370_info *info) > +{ > + unsigned int devinfo; > + int ret; > + > + ret = regmap_read(info->regmap, MT6370_REG_DEV_INFO, &devinfo); > + if (ret) > + return ret; > + > + switch (FIELD_GET(MT6370_VENID_MASK, devinfo)) { > + case MT6370_VENID_RT5081: > + case MT6370_VENID_RT5081A: > + case MT6370_VENID_MT6370: > + case MT6370_VENID_MT6371: > + case MT6370_VENID_MT6372P: > + case MT6370_VENID_MT6372CP: > + break; > + default: > + dev_err(info->dev, "Unknown Vendor ID 0x%02x\n", devinfo); > + return -ENODEV; > + } > + > + return 0; > +} > + > +static int mt6370_regmap_read(void *context, const void *reg_buf, > + size_t reg_size, void *val_buf, size_t val_size) > +{ > + struct mt6370_info *info = context; > + u8 bank_idx, bank_addr; > + int ret; > + > + bank_idx = *(u8 *)reg_buf; > + bank_addr = *(u8 *)(reg_buf + 1); > + > + ret = i2c_smbus_read_i2c_block_data(info->i2c[bank_idx], bank_addr, > + val_size, val_buf); > + if (ret < 0) > + return ret; > + else if (ret != val_size) > + return -EIO; > + > + return 0; > +} > + > +static int mt6370_regmap_write(void *context, const void *data, size_t count) > +{ > + struct mt6370_info *info = context; > + u8 bank_idx, bank_addr; > + int len = count - MT6370_REG_ADDRLEN; > + > + bank_idx = *(u8 *)data; > + bank_addr = *(u8 *)(data + 1); > + > + return i2c_smbus_write_i2c_block_data(info->i2c[bank_idx], bank_addr, > + len, data + MT6370_REG_ADDRLEN); > +} > + > +static const struct regmap_bus mt6370_regmap_bus = { > + .read = mt6370_regmap_read, > + .write = mt6370_regmap_write, > +}; > + > +static const struct regmap_config mt6370_regmap_config = { > + .reg_bits = 16, > + .val_bits = 8, > + .reg_format_endian = REGMAP_ENDIAN_BIG, > + .max_register = MT6370_REG_MAXADDR, > +}; > + > +static int mt6370_probe(struct i2c_client *i2c) > +{ > + struct mt6370_info *info; > + struct i2c_client *usbc_i2c; > + int ret; > + > + info = devm_kzalloc(&i2c->dev, sizeof(*info), GFP_KERNEL); > + if (!info) > + return -ENOMEM; > + > + info->dev = &i2c->dev; > + > + usbc_i2c = devm_i2c_new_dummy_device(&i2c->dev, i2c->adapter, > + MT6370_USBC_I2CADDR); > + if (IS_ERR(usbc_i2c)) > + return dev_err_probe(&i2c->dev, PTR_ERR(usbc_i2c), > + "Failed to register USBC I2C client\n"); > + > + /* Assign I2C client for PMU and TypeC */ > + info->i2c[MT6370_PMU_I2C] = i2c; > + info->i2c[MT6370_USBC_I2C] = usbc_i2c; > + > + info->regmap = devm_regmap_init(&i2c->dev, &mt6370_regmap_bus, info, > + &mt6370_regmap_config); Apart from in mt6370_check_vendor_info() where is this actually used? > + if (IS_ERR(info->regmap)) > + return dev_err_probe(&i2c->dev, PTR_ERR(info->regmap), > + "Failed to register regmap\n"); > + > + ret = mt6370_check_vendor_info(info); > + if (ret) > + return dev_err_probe(&i2c->dev, ret, > + "Failed to check vendor info\n"); > + > + ret = devm_regmap_add_irq_chip(&i2c->dev, info->regmap, i2c->irq, > + IRQF_ONESHOT, -1, &mt6370_irq_chip, > + &info->irq_data); > + if (ret) > + return dev_err_probe(&i2c->dev, ret, > + "Failed to add irq chip\n"); > + > + return devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO, > + mt6370_devices, ARRAY_SIZE(mt6370_devices), > + NULL, 0, > + regmap_irq_get_domain(info->irq_data)); > +} > + > +static const struct of_device_id mt6370_match_table[] = { > + { .compatible = "mediatek,mt6370", }, > + {} > +}; > +MODULE_DEVICE_TABLE(of, mt6370_match_table); > + > +static struct i2c_driver mt6370_driver = { > + .driver = { > + .name = "mt6370", > + .of_match_table = mt6370_match_table, > + }, > + .probe_new = mt6370_probe, > +}; > +module_i2c_driver(mt6370_driver); > + > +MODULE_AUTHOR("ChiYuan Huang "); > +MODULE_DESCRIPTION("MT6370 I2C Driver"); This is not an I2C driver. > +MODULE_LICENSE("GPL v2"); -- Lee Jones [李琼斯] Principal Technical Lead - Developer Services 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 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 23516C43334 for ; Tue, 12 Jul 2022 15:30:37 +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=5o9hGxen67Ts7ErvDUaAU7OH6SU1CG1JMS/KiVvTnSw=; b=z9hug6s6owvGbX OUc6hH+hUIuVS60S3qWZVwzpj83Krd2NnmF4eBxkNOMoNG4WuW5MgMnvSNzp4l3WLIJknkK7nKPav NJlJK07oG/215Od4Xf3Ljmm5C141mJ8vM/pdqKMeqb4AQw7nbgGJpfe8x8Jzs42/Lc+0cOQIFbF4R Odey5p0jWh9RwyjDNFI24/APG91jiq8J/QSz42WkAIwt/8gRe54Xv1NuN9JsB8V7uN/P06W4U1fdn FKLYqxt+qpttYN3Z4Oaxa0/tN0OtbkbrCQ+y55JEzxUS4hg2pVRUusPdyfw2EV/5Gh5uuM5zbVCZ3 ghW61cDmoNqWWNOnU9qg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oBHpO-00C8WO-AE; Tue, 12 Jul 2022 15:29:34 +0000 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oBHpI-00C8Is-KS for linux-arm-kernel@lists.infradead.org; Tue, 12 Jul 2022 15:29:31 +0000 Received: by mail-wr1-x435.google.com with SMTP id bu1so10498426wrb.9 for ; Tue, 12 Jul 2022 08:29:22 -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; bh=Q+JH/qWaiP2eJjuYW7C2uW3S0RkJ71Ub5nbWi6ekYbU=; b=OczFGqywfdpy/mS2TpodOJOjuQVYsPEbYTpYSvI59PBCT2BHt/vguhiU3Z+P/25Xy1 NX12SAQIPHWI4v65pWrdKecJzJ1ZGNsVrm4p4CkSKIuywvfuizpOzZ9Wqb5Jt0s0UHBp T5PS8SW072ViH7TP9Q1PP6fDrZJHGcvg2WmV6fg5I4zrNV3XGkuRlHjgoLdrxTGYU28w Z87I9ucdUZ9RkKjmGgpr804KkfSTtYBOnSa8OCgcdq8A7jMi3r48eOJ1/nJefL8+oJ9R cLWhrGedBVWmNXkrHud8KRNz7PKK4gOV5vdbwVuBC3Im5EaXVYsYxBfTlWzC718rBE5u DBkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Q+JH/qWaiP2eJjuYW7C2uW3S0RkJ71Ub5nbWi6ekYbU=; b=DDUVpQcgcu3d79MRCc4UOkkuLC2SRnbAQNB+eq7yAxzirb7LXr/aKnhdpsURvp2yTM Z0bXSDazu8KlZ3etf1+upDu0O6Z6bUzrKJdKQtPbF33Oq5PgPoJSua998dHBxyPPZI08 13YCaNHQDeB9GRL/113FWplWZrUp+tJIsR3WbaDwat9yRj4hjiii6uq8w3QXw02fkQGR J9I4c8vR+Kk7Sal4EMYZcLkqw+kXsjcfYiw3PHyAu2109KTdpZ2bcQoonN3nNdjDJ2DS n54b6BwA44SoXQZ+6madFMzZ9RpamKUjiSs1SuLyyoe+2XX4tZnScCSp/0GvTViKPM4O 9R0Q== X-Gm-Message-State: AJIora+N//XcFU/If0hzFDGGbLfCUwJoYVJpsDAbJDxpR0IC2hqPgqu0 SRGtNiTwCmJOa6BwT+nrA14pBQ== X-Google-Smtp-Source: AGRyM1uSLPcm2Pav8BPF3Jx+Guud3701li2mH9y8hYpZuHdD2WZOCC/W4swCDeXJTVRAPp66ckDPSg== X-Received: by 2002:a5d:414a:0:b0:21d:6be5:1765 with SMTP id c10-20020a5d414a000000b0021d6be51765mr22980167wrq.419.1657639761463; Tue, 12 Jul 2022 08:29:21 -0700 (PDT) Received: from google.com (cpc155339-bagu17-2-0-cust87.1-3.cable.virginm.net. [86.27.177.88]) by smtp.gmail.com with ESMTPSA id ay26-20020a05600c1e1a00b003a2e89d1fb5sm5149242wmb.42.2022.07.12.08.29.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Jul 2022 08:29:20 -0700 (PDT) Date: Tue, 12 Jul 2022 16:29:18 +0100 From: Lee Jones To: ChiaEn Wu Cc: daniel.thompson@linaro.org, jingoohan1@gmail.com, pavel@ucw.cz, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, matthias.bgg@gmail.com, sre@kernel.org, chunfeng.yun@mediatek.com, gregkh@linuxfoundation.org, jic23@kernel.org, lars@metafoo.de, lgirdwood@gmail.com, broonie@kernel.org, linux@roeck-us.net, heikki.krogerus@linux.intel.com, deller@gmx.de, chiaen_wu@richtek.com, alice_chen@richtek.com, cy_huang@richtek.com, dri-devel@lists.freedesktop.org, linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, linux-iio@vger.kernel.org, linux-fbdev@vger.kernel.org, szunichen@gmail.com Subject: Re: [PATCH v3 07/14] mfd: mt6370: Add Mediatek MT6370 support Message-ID: References: <20220623115631.22209-1-peterwu.pub@gmail.com> <20220623115631.22209-8-peterwu.pub@gmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220623115631.22209-8-peterwu.pub@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220712_082928_690036_E94A865F X-CRM114-Status: GOOD ( 27.15 ) 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 T24gVGh1LCAyMyBKdW4gMjAyMiwgQ2hpYUVuIFd1IHdyb3RlOgoKPiBGcm9tOiBDaGlZdWFuIEh1 YW5nIDxjeV9odWFuZ0ByaWNodGVrLmNvbT4KPiAKPiBBZGQgTWVkaWF0ZWsgTVQ2MzcwIE1GRCBz dXBwb3J0LgoKTm8gc3VjaCB0aGluZyBhcyAiTUZEIHN1cHBvcnQiLgoKQW5kIHlvdSdyZSBub3Qg Z2V0dGluZyBhd2F5IHdpdGggc3VibWl0dGluZyBhIDM3MCBsaW5lIHBhdGNoIHdpdGggYSA1Cndv cmQgY2hhbmdlIGxvZyBlaXRoZXIuIDopCgpQbGVhc2UgYXQgbGVhc3QgdGVsbCB1cyB3aGF0IHRo ZSBkZXZpY2UgaXMgYW5kIHdoYXQgaXQncyB1c2VkIGZvci4KCj4gU2lnbmVkLW9mZi1ieTogQ2hp WXVhbiBIdWFuZyA8Y3lfaHVhbmdAcmljaHRlay5jb20+Cj4gLS0tCj4gCj4gdjMKPiAtIFJlZmlu ZSBLY29uZmlnIGhlbHAgdGV4dAo+IC0gUmVmaW5lIGVycm9yIG1lc3NhZ2Ugb2YgdW5rbm93biB2 ZW5kb3IgSUQgaW4KPiAgIG10NjM3MF9jaGVja192ZW5kb3JfaW5mbygpCj4gLSBSZWZpbmUgcmV0 dXJuIHZhbHVlIGhhbmRsaW5nIG9mIG10NjM3MF9yZWdtYXBfcmVhZCgpCj4gLSBSZWZpbmUgYWxs IHByb2JlIGVycm9yIGJ5IHVzaW5nIGRldl9lcnJfcHJvYmUoKQo+IC0gUmVmaW5lICJiYW5rX2lk eCIgYW5kICJiYW5rX2FkZHIiIGluIG10NjM3MF9yZWdtYXBfcmVhZCgpIGFuZAo+ICAgbXQ2Mzcw X3JlZ21hcF93cml0ZSgpCj4gLSBBZGQgIiNkZWZpbmUgVkVOSUQqIiBhbmQgZHJvcCB0aGUgY29t bWVudHMgaW4KPiAgIG10NjM3MF9jaGVja192ZW5kb3JfaW5mbygpCj4gLSBEcm9wICJNRkQiIGlu IE1PRFVMRV9ERVNDUklQVElPTigpCj4gLS0tCj4gIGRyaXZlcnMvbWZkL0tjb25maWcgIHwgIDEz ICsrCj4gIGRyaXZlcnMvbWZkL01ha2VmaWxlIHwgICAxICsKPiAgZHJpdmVycy9tZmQvbXQ2Mzcw LmMgfCAzNTggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMzcyIGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvbWZkL210NjM3MC5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZk L0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCj4gaW5kZXggM2I1OTQ1Ni4uNGM5MDBjNCAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9tZmQvS2Nv bmZpZwo+IEBAIC05MzcsNiArOTM3LDE5IEBAIGNvbmZpZyBNRkRfTVQ2MzYwCj4gIAkgIFBNSUMg cGFydCBpbmNsdWRlcyAyLWNoYW5uZWwgQlVDS3MgYW5kIDItY2hhbm5lbCBMRE9zCj4gIAkgIExE TyBwYXJ0IGluY2x1ZGVzIDQtY2hhbm5lbCBMRE9zCj4gIAo+ICtjb25maWcgTUZEX01UNjM3MAo+ ICsJdHJpc3RhdGUgIk1lZGlhdGVrIE1UNjM3MCBTdWJQTUlDIgo+ICsJc2VsZWN0IE1GRF9DT1JF Cj4gKwlzZWxlY3QgUkVHTUFQX0kyQwo+ICsJc2VsZWN0IFJFR01BUF9JUlEKPiArCWRlcGVuZHMg b24gSTJDCj4gKwloZWxwCj4gKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIE1UNjM3MCBTdWJQTUlD IGZ1bmN0aW9uYWwgc3VwcG9ydC4KPiArCSAgSXQgY29uc2lzdHMgb2YgYSBzaW5nbGUgY2VsbCBi YXR0ZXJ5IGNoYXJnZXIgd2l0aCBBREMgbW9uaXRvcmluZywgUkdCCj4gKwkgIExFRHMsIGR1YWwg Y2hhbm5lbCBmbGFzaGxpZ2h0LCBXTEVEIGJhY2tsaWdodCBkcml2ZXIsIGRpc3BsYXkgYmlhcwo+ ICsJICB2b2x0YWdlIHN1cHBseSwgb25lIGdlbmVyYWwgcHVycG9zZSBMRE8sIGFuZCB0aGUgVVNC IFR5cGUtQyAmIFBECj4gKwkgIGNvbnRyb2xsZXIgY29tcGxpZXMgd2l0aCB0aGUgbGF0ZXN0IFVT QiBUeXBlLUMgYW5kIFBEIHN0YW5kYXJkcy4KPiArCj4gIGNvbmZpZyBNRkRfTVQ2Mzk3Cj4gIAl0 cmlzdGF0ZSAiTWVkaWFUZWsgTVQ2Mzk3IFBNSUMgU3VwcG9ydCIKPiAgCXNlbGVjdCBNRkRfQ09S RQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2Vm aWxlCj4gaW5kZXggODU4Y2FjZi4uNjJiMjcxMiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21mZC9N YWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCj4gQEAgLTI0Miw2ICsyNDIsNyBA QCBvYmotJChDT05GSUdfSU5URUxfU09DX1BNSUNfQlhUV0MpCSs9IGludGVsX3NvY19wbWljX2J4 dHdjLm8KPiAgb2JqLSQoQ09ORklHX0lOVEVMX1NPQ19QTUlDX0NIVFdDKQkrPSBpbnRlbF9zb2Nf cG1pY19jaHR3Yy5vCj4gIG9iai0kKENPTkZJR19JTlRFTF9TT0NfUE1JQ19DSFREQ19USSkJKz0g aW50ZWxfc29jX3BtaWNfY2h0ZGNfdGkubwo+ICBvYmotJChDT05GSUdfTUZEX01UNjM2MCkJKz0g bXQ2MzYwLWNvcmUubwo+ICtvYmotJChDT05GSUdfTUZEX01UNjM3MCkJKz0gbXQ2MzcwLm8KPiAg bXQ2Mzk3LW9ianMJCQk6PSBtdDYzOTctY29yZS5vIG10NjM5Ny1pcnEubyBtdDYzNTgtaXJxLm8K PiAgb2JqLSQoQ09ORklHX01GRF9NVDYzOTcpCSs9IG10NjM5Ny5vCj4gIG9iai0kKENPTkZJR19J TlRFTF9TT0NfUE1JQ19NUkZMRCkJKz0gaW50ZWxfc29jX3BtaWNfbXJmbGQubwo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL21mZC9tdDYzNzAuYyBiL2RyaXZlcnMvbWZkL210NjM3MC5jCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi40OWYwMmIxCj4gLS0tIC9kZXYvbnVsbAo+ ICsrKyBiL2RyaXZlcnMvbWZkL210NjM3MC5jCj4gQEAgLTAsMCArMSwzNTggQEAKPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKCk5vIENvcHlyaWdodD8KCj4gKyNpbmNsdWRl IDxsaW51eC9iaXRzLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxp bnV4L2ludGVycnVwdC5oPgo+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4gKyNpbmNsdWRl IDxsaW51eC9tZmQvY29yZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9yZWdtYXAuaD4KPiArCj4gK2VudW0gewo+ICsJTVQ2MzcwX1VTQkNfSTJDID0g MCwKPiArCU1UNjM3MF9QTVVfSTJDLAo+ICsJTVQ2MzcwX01BWF9JMkMKPiArfTsKPiArCj4gKyNk ZWZpbmUgTVQ2MzcwX1JFR19ERVZfSU5GTwkweDEwMAo+ICsjZGVmaW5lIE1UNjM3MF9SRUdfQ0hH X0lSUTEJMHgxQzAKPiArI2RlZmluZSBNVDYzNzBfUkVHX0NIR19NQVNLMQkweDFFMAo+ICsKPiAr I2RlZmluZSBNVDYzNzBfVkVOSURfTUFTSwlHRU5NQVNLKDcsIDQpCj4gKwo+ICsjZGVmaW5lIE1U NjM3MF9OVU1fSVJRUkVHUwkxNgo+ICsjZGVmaW5lIE1UNjM3MF9VU0JDX0kyQ0FERFIJMHg0RQo+ ICsjZGVmaW5lIE1UNjM3MF9SRUdfQUREUkxFTgkyCj4gKyNkZWZpbmUgTVQ2MzcwX1JFR19NQVhB RERSCTB4MUZGCj4gKwo+ICsjZGVmaW5lIE1UNjM3MF9WRU5JRF9SVDUwODEJMHg4Cj4gKyNkZWZp bmUgTVQ2MzcwX1ZFTklEX1JUNTA4MUEJMHhBCj4gKyNkZWZpbmUgTVQ2MzcwX1ZFTklEX01UNjM3 MAkweEUKPiArI2RlZmluZSBNVDYzNzBfVkVOSURfTVQ2MzcxCTB4Rgo+ICsjZGVmaW5lIE1UNjM3 MF9WRU5JRF9NVDYzNzJQCTB4OQo+ICsjZGVmaW5lIE1UNjM3MF9WRU5JRF9NVDYzNzJDUAkweEIK PiArCj4gKy8qIElSUSBkZWZpbml0aW9ucyAqLwo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfRElSQ0hH T04JCTAKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19UUkVHCQk0Cj4gKyNkZWZpbmUgTVQ2Mzcw X0lSUV9DSEdfQUlDUgkJNQo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfQ0hHX01JVlIJCTYKPiArI2Rl ZmluZSBNVDYzNzBfSVJRX1BXUl9SRFkJCTcKPiArI2RlZmluZSBNVDYzNzBfSVJRX0ZMX0NIR19W SU5PVlAJMTEKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19WU1lTVVYJCTEyCj4gKyNkZWZpbmUg TVQ2MzcwX0lSUV9DSEdfVlNZU09WCQkxMwo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfQ0hHX1ZCQVRP VgkJMTQKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19WSU5PVlBDSEcJMTUKPiArI2RlZmluZSBN VDYzNzBfSVJRX1RTX0JBVF9DT0xECQkyMAo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfVFNfQkFUX0NP T0wJCTIxCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9UU19CQVRfV0FSTQkJMjIKPiArI2RlZmluZSBN VDYzNzBfSVJRX1RTX0JBVF9IT1QJCTIzCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9UU19TVEFUQwkJ MjQKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19GQVVMVAkJMjUKPiArI2RlZmluZSBNVDYzNzBf SVJRX0NIR19TVEFUQwkJMjYKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19UTVIJCTI3Cj4gKyNk ZWZpbmUgTVQ2MzcwX0lSUV9DSEdfQkFUQUJTCQkyOAo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfQ0hH X0FEUEJBRAkJMjkKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19SVlAJCTMwCj4gKyNkZWZpbmUg TVQ2MzcwX0lSUV9UU0hVVERPV04JCTMxCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9DSEdfSUlOTUVB UwkJMzIKPiArI2RlZmluZSBNVDYzNzBfSVJRX0NIR19JQ0NNRUFTCQkzMwo+ICsjZGVmaW5lIE1U NjM3MF9JUlFfQ0hHREVUX0RPTkUJCTM0Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9XRFRNUgkJMzUK PiArI2RlZmluZSBNVDYzNzBfSVJRX1NTRklOSVNICQkzNgo+ICsjZGVmaW5lIE1UNjM3MF9JUlFf Q0hHX1JFQ0hHCQkzNwo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfQ0hHX1RFUk0JCTM4Cj4gKyNkZWZp bmUgTVQ2MzcwX0lSUV9DSEdfSUVPQwkJMzkKPiArI2RlZmluZSBNVDYzNzBfSVJRX0FEQ19ET05F CQk0MAo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfUFVNUFhfRE9ORQkJNDEKPiArI2RlZmluZSBNVDYz NzBfSVJRX0JTVF9CQVRVVgkJNDUKPiArI2RlZmluZSBNVDYzNzBfSVJRX0JTVF9NSURPVgkJNDYK PiArI2RlZmluZSBNVDYzNzBfSVJRX0JTVF9PTFAJCTQ3Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9B VFRBQ0gJCTQ4Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9ERVRBQ0gJCTQ5Cj4gKyNkZWZpbmUgTVQ2 MzcwX0lSUV9IVkRDUF9TVFBET05FCTUxCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9IVkRDUF9WQlVT REVUX0RPTkUJNTIKPiArI2RlZmluZSBNVDYzNzBfSVJRX0hWRENQX0RFVAkJNTMKPiArI2RlZmlu ZSBNVDYzNzBfSVJRX0NIR0RFVAkJNTQKPiArI2RlZmluZSBNVDYzNzBfSVJRX0RDRFQJCQk1NQo+ ICsjZGVmaW5lIE1UNjM3MF9JUlFfRElSQ0hHX1ZHT0sJCTU5Cj4gKyNkZWZpbmUgTVQ2MzcwX0lS UV9ESVJDSEdfV0RUTVIJCTYwCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9ESVJDSEdfVUMJCTYxCj4g KyNkZWZpbmUgTVQ2MzcwX0lSUV9ESVJDSEdfT0MJCTYyCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9E SVJDSEdfT1YJCTYzCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9PVlBDVFJMX1NXT04JCTY3Cj4gKyNk ZWZpbmUgTVQ2MzcwX0lSUV9PVlBDVFJMX1VWUF9ECTY4Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9P VlBDVFJMX1VWUAkJNjkKPiArI2RlZmluZSBNVDYzNzBfSVJRX09WUENUUkxfT1ZQX0QJNzAKPiAr I2RlZmluZSBNVDYzNzBfSVJRX09WUENUUkxfT1ZQCQk3MQo+ICsjZGVmaW5lIE1UNjM3MF9JUlFf RkxFRF9TVFJCUElOCQk3Mgo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfRkxFRF9UT1JQSU4JCTczCj4g KyNkZWZpbmUgTVQ2MzcwX0lSUV9GTEVEX1RYCQk3NAo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfRkxF RF9MVkYJCTc1Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9GTEVEMl9TSE9SVAkJNzgKPiArI2RlZmlu ZSBNVDYzNzBfSVJRX0ZMRUQxX1NIT1JUCQk3OQo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfRkxFRDJf U1RSQgkJODAKPiArI2RlZmluZSBNVDYzNzBfSVJRX0ZMRUQxX1NUUkIJCTgxCj4gKyNkZWZpbmUg bVQ2MzcwX0lSUV9GTEVEMl9TVFJCX1RPCTgyCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9GTEVEMV9T VFJCX1RPCTgzCj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9GTEVEMl9UT1IJCTg0Cj4gKyNkZWZpbmUg TVQ2MzcwX0lSUV9GTEVEMV9UT1IJCTg1Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9PVFAJCQk5Mwo+ ICsjZGVmaW5lIE1UNjM3MF9JUlFfVkREQV9PVlAJCTk0Cj4gKyNkZWZpbmUgTVQ2MzcwX0lSUV9W RERBX1VWCQk5NQo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfTERPX09DCQkxMDMKPiArI2RlZmluZSBN VDYzNzBfSVJRX0JMRURfT0NQCQkxMTgKPiArI2RlZmluZSBNVDYzNzBfSVJRX0JMRURfT1ZQCQkx MTkKPiArI2RlZmluZSBNVDYzNzBfSVJRX0RTVl9WTkVHX09DUAkJMTIzCj4gKyNkZWZpbmUgTVQ2 MzcwX0lSUV9EU1ZfVlBPU19PQ1AJCTEyNAo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfRFNWX0JTVF9P Q1AJCTEyNQo+ICsjZGVmaW5lIE1UNjM3MF9JUlFfRFNWX1ZORUdfU0NQCQkxMjYKPiArI2RlZmlu ZSBNVDYzNzBfSVJRX0RTVl9WUE9TX1NDUAkJMTI3CgpDYW4geW91IHBvcCB0aGVzZSBpbnRvIGEg aGVhZGVyIGZpbGUgcGxlYXNlPwoKPiArc3RydWN0IG10NjM3MF9pbmZvIHsKPiArCXN0cnVjdCBp MmNfY2xpZW50ICppMmNbTVQ2MzcwX01BWF9JMkNdOwo+ICsJc3RydWN0IGRldmljZSAqZGV2OwoK WW91IGRvbid0IG5lZWQgYm90aCAnaTJjJyBhbmQgJ2RldicuCgpZb3UgY2FuIGRlcml2ZSBvbmUg ZnJvbSB0aGUgb3RoZXIuCgo+ICsJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwo+ICsJc3RydWN0IHJl Z21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YTsKPiArfTsKClRoaXMgY2FuIGRvIGludG8gdGhl IGhlYWRlciBmaWxlIHRvby4KCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSBtdDYz NzBfaXJxc1tdID0gewo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0RJUkNIR09O LCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9DSEdfVFJFRywgOCksCj4g KwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfQ0hHX0FJQ1IsIDgpLAo+ICsJUkVHTUFQ X0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0NIR19NSVZSLCA4KSwKPiArCVJFR01BUF9JUlFfUkVH X0xJTkUoTVQ2MzcwX0lSUV9QV1JfUkRZLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2 MzcwX0lSUV9GTF9DSEdfVklOT1ZQLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2Mzcw X0lSUV9DSEdfVlNZU1VWLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9D SEdfVlNZU09WLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9DSEdfVkJB VE9WLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9DSEdfVklOT1ZQQ0hH LCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9UU19CQVRfQ09MRCwgOCks Cj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfVFNfQkFUX0NPT0wsIDgpLAo+ICsJ UkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX1RTX0JBVF9XQVJNLCA4KSwKPiArCVJFR01B UF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9UU19CQVRfSE9ULCA4KSwKPiArCVJFR01BUF9JUlFf UkVHX0xJTkUoTVQ2MzcwX0lSUV9UU19TVEFUQywgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5F KE1UNjM3MF9JUlFfQ0hHX0ZBVUxULCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2Mzcw X0lSUV9DSEdfU1RBVEMsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0NI R19UTVIsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0NIR19CQVRBQlMs IDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0NIR19BRFBCQUQsIDgpLAo+ ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0NIR19SVlAsIDgpLAo+ICsJUkVHTUFQ X0lSUV9SRUdfTElORShNVDYzNzBfSVJRX1RTSFVURE9XTiwgOCksCj4gKwlSRUdNQVBfSVJRX1JF R19MSU5FKE1UNjM3MF9JUlFfQ0hHX0lJTk1FQVMsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElO RShNVDYzNzBfSVJRX0NIR19JQ0NNRUFTLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2 MzcwX0lSUV9DSEdERVRfRE9ORSwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9J UlFfV0RUTVIsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX1NTRklOSVNI LCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9DSEdfUkVDSEcsIDgpLAo+ ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0NIR19URVJNLCA4KSwKPiArCVJFR01B UF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9DSEdfSUVPQywgOCksCj4gKwlSRUdNQVBfSVJRX1JF R19MSU5FKE1UNjM3MF9JUlFfQURDX0RPTkUsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShN VDYzNzBfSVJRX1BVTVBYX0RPTkUsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBf SVJRX0JTVF9CQVRVViwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfQlNU X01JRE9WLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9CU1RfT0xQLCA4 KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9BVFRBQ0gsIDgpLAo+ICsJUkVH TUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0RFVEFDSCwgOCksCj4gKwlSRUdNQVBfSVJRX1JF R19MSU5FKE1UNjM3MF9JUlFfSFZEQ1BfU1RQRE9ORSwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19M SU5FKE1UNjM3MF9JUlFfSFZEQ1BfVkJVU0RFVF9ET05FLCA4KSwKPiArCVJFR01BUF9JUlFfUkVH X0xJTkUoTVQ2MzcwX0lSUV9IVkRDUF9ERVQsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShN VDYzNzBfSVJRX0NIR0RFVCwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFf RENEVCwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfRElSQ0hHX1ZHT0ss IDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0RJUkNIR19XRFRNUiwgOCks Cj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfRElSQ0hHX1VDLCA4KSwKPiArCVJF R01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9ESVJDSEdfT0MsIDgpLAo+ICsJUkVHTUFQX0lS UV9SRUdfTElORShNVDYzNzBfSVJRX0RJUkNIR19PViwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19M SU5FKE1UNjM3MF9JUlFfT1ZQQ1RSTF9TV09OLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUo TVQ2MzcwX0lSUV9PVlBDVFJMX1VWUF9ELCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2 MzcwX0lSUV9PVlBDVFJMX1VWUCwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9J UlFfT1ZQQ1RSTF9PVlBfRCwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFf T1ZQQ1RSTF9PVlAsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0ZMRURf U1RSQlBJTiwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfRkxFRF9UT1JQ SU4sIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0ZMRURfVFgsIDgpLAo+ ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0ZMRURfTFZGLCA4KSwKPiArCVJFR01B UF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9GTEVEMl9TSE9SVCwgOCksCj4gKwlSRUdNQVBfSVJR X1JFR19MSU5FKE1UNjM3MF9JUlFfRkxFRDFfU0hPUlQsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdf TElORShNVDYzNzBfSVJRX0ZMRUQyX1NUUkIsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShN VDYzNzBfSVJRX0ZMRUQxX1NUUkIsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShtVDYzNzBf SVJRX0ZMRUQyX1NUUkJfVE8sIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJR X0ZMRUQxX1NUUkJfVE8sIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0ZM RUQyX1RPUiwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfRkxFRDFfVE9S LCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9PVFAsIDgpLAo+ICsJUkVH TUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX1ZEREFfT1ZQLCA4KSwKPiArCVJFR01BUF9JUlFf UkVHX0xJTkUoTVQ2MzcwX0lSUV9WRERBX1VWLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUo TVQ2MzcwX0lSUV9MRE9fT0MsIDgpLAo+ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJR X0JMRURfT0NQLCA4KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9CTEVEX09W UCwgOCksCj4gKwlSRUdNQVBfSVJRX1JFR19MSU5FKE1UNjM3MF9JUlFfRFNWX1ZORUdfT0NQLCA4 KSwKPiArCVJFR01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9EU1ZfVlBPU19PQ1AsIDgpLAo+ ICsJUkVHTUFQX0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0RTVl9CU1RfT0NQLCA4KSwKPiArCVJF R01BUF9JUlFfUkVHX0xJTkUoTVQ2MzcwX0lSUV9EU1ZfVk5FR19TQ1AsIDgpLAo+ICsJUkVHTUFQ X0lSUV9SRUdfTElORShNVDYzNzBfSVJRX0RTVl9WUE9TX1NDUCwgOCkKPiArfTsKPiArCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwIG10NjM3MF9pcnFfY2hpcCA9IHsKPiAr CS5uYW1lCQk9ICJtdDYzNzAtaXJxcyIsCj4gKwkuc3RhdHVzX2Jhc2UJPSBNVDYzNzBfUkVHX0NI R19JUlExLAo+ICsJLm1hc2tfYmFzZQk9IE1UNjM3MF9SRUdfQ0hHX01BU0sxLAo+ICsJLm51bV9y ZWdzCT0gTVQ2MzcwX05VTV9JUlFSRUdTLAo+ICsJLmlycXMJCT0gbXQ2MzcwX2lycXMsCj4gKwku bnVtX2lycXMJPSBBUlJBWV9TSVpFKG10NjM3MF9pcnFzKSwKPiArfTsKPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgcmVzb3VyY2UgbXQ2MzcwX3JlZ3VsYXRvcl9pcnFzW10gPSB7Cj4gKwlERUZJ TkVfUkVTX0lSUV9OQU1FRChNVDYzNzBfSVJRX0RTVl9WUE9TX1NDUCwgImRiX3Zwb3Nfc2NwIiks Cj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNzBfSVJRX0RTVl9WTkVHX1NDUCwgImRiX3Zu ZWdfc2NwIiksCj4gKwlERUZJTkVfUkVTX0lSUV9OQU1FRChNVDYzNzBfSVJRX0RTVl9CU1RfT0NQ LCAiZGJfdmJzdF9vY3AiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM3MF9JUlFfRFNW X1ZQT1NfT0NQLCAiZGJfdnBvc19vY3AiKSwKPiArCURFRklORV9SRVNfSVJRX05BTUVEKE1UNjM3 MF9JUlFfRFNWX1ZORUdfT0NQLCAiZGJfdm5lZ19vY3AiKSwKPiArCURFRklORV9SRVNfSVJRX05B TUVEKE1UNjM3MF9JUlFfTERPX09DLCAibGRvX29jIikKPiArfTsKPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3QgbWZkX2NlbGwgbXQ2MzcwX2RldmljZXNbXSA9IHsKPiArCU1GRF9DRUxMX09GKCJh ZGMiLCBOVUxMLCBOVUxMLCAwLCAwLCAibWVkaWF0ZWssbXQ2MzcwLWFkYyIpLAo+ICsJTUZEX0NF TExfT0YoImNoYXJnZXIiLCBOVUxMLCBOVUxMLCAwLCAwLCAibWVkaWF0ZWssbXQ2MzcwLWNoYXJn ZXIiKSwKPiArCU1GRF9DRUxMX09GKCJiYWNrbGlnaHQiLCBOVUxMLCBOVUxMLCAwLCAwLCAibWVk aWF0ZWssbXQ2MzcwLWJhY2tsaWdodCIpLAo+ICsJTUZEX0NFTExfT0YoImZsYXNobGlnaHQiLCBO VUxMLCBOVUxMLCAwLCAwLCAibWVkaWF0ZWssbXQ2MzcwLWZsYXNobGlnaHQiKSwKPiArCU1GRF9D RUxMX09GKCJpbmRpY2F0b3IiLCBOVUxMLCBOVUxMLCAwLCAwLCAibWVkaWF0ZWssbXQ2MzcwLWlu ZGljYXRvciIpLAo+ICsJTUZEX0NFTExfT0YoInRjcGMiLCBOVUxMLCBOVUxMLCAwLCAwLCAibWVk aWF0ZWssbXQ2MzcwLXRjcGMiKSwKPiArCU1GRF9DRUxMX1JFUygicmVndWxhdG9yIiwgbXQ2Mzcw X3JlZ3VsYXRvcl9pcnFzKQoKVGhlIGZpcnN0IHBhcmFtZXRlcnMgaGVyZSBzaG91bGQgYmUgcHJl cGVuZGVkIHdpdGggc29tZXRoaW5nLCBwZXJoYXBzCiJtdDYzNzBfIj8KCj4gK307Cj4gKwo+ICtz dGF0aWMgaW50IG10NjM3MF9jaGVja192ZW5kb3JfaW5mbyhzdHJ1Y3QgbXQ2MzcwX2luZm8gKmlu Zm8pCj4gK3sKPiArCXVuc2lnbmVkIGludCBkZXZpbmZvOwo+ICsJaW50IHJldDsKPiArCj4gKwly ZXQgPSByZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIE1UNjM3MF9SRUdfREVWX0lORk8sICZkZXZp bmZvKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlzd2l0Y2ggKEZJRUxE X0dFVChNVDYzNzBfVkVOSURfTUFTSywgZGV2aW5mbykpIHsKPiArCWNhc2UgTVQ2MzcwX1ZFTklE X1JUNTA4MToKPiArCWNhc2UgTVQ2MzcwX1ZFTklEX1JUNTA4MUE6Cj4gKwljYXNlIE1UNjM3MF9W RU5JRF9NVDYzNzA6Cj4gKwljYXNlIE1UNjM3MF9WRU5JRF9NVDYzNzE6Cj4gKwljYXNlIE1UNjM3 MF9WRU5JRF9NVDYzNzJQOgo+ICsJY2FzZSBNVDYzNzBfVkVOSURfTVQ2MzcyQ1A6Cj4gKwkJYnJl YWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCWRldl9lcnIoaW5mby0+ZGV2LCAiVW5rbm93biBWZW5kb3Ig SUQgMHglMDJ4XG4iLCBkZXZpbmZvKTsKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCX0KPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNzBfcmVnbWFwX3JlYWQodm9p ZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcmVnX2J1ZiwKPiArCQkJICAgICAgc2l6ZV90IHJlZ19z aXplLCB2b2lkICp2YWxfYnVmLCBzaXplX3QgdmFsX3NpemUpCj4gK3sKPiArCXN0cnVjdCBtdDYz NzBfaW5mbyAqaW5mbyA9IGNvbnRleHQ7Cj4gKwl1OCBiYW5rX2lkeCwgYmFua19hZGRyOwo+ICsJ aW50IHJldDsKPiArCj4gKwliYW5rX2lkeCA9ICoodTggKilyZWdfYnVmOwo+ICsJYmFua19hZGRy ID0gKih1OCAqKShyZWdfYnVmICsgMSk7Cj4gKwo+ICsJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJj X2Jsb2NrX2RhdGEoaW5mby0+aTJjW2JhbmtfaWR4XSwgYmFua19hZGRyLAo+ICsJCQkJCSAgICB2 YWxfc2l6ZSwgdmFsX2J1Zik7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm4gcmV0Owo+ICsJ ZWxzZSBpZiAocmV0ICE9IHZhbF9zaXplKQo+ICsJCXJldHVybiAtRUlPOwo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM3MF9yZWdtYXBfd3JpdGUodm9pZCAqY29u dGV4dCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQo+ICt7Cj4gKwlzdHJ1Y3QgbXQ2 MzcwX2luZm8gKmluZm8gPSBjb250ZXh0Owo+ICsJdTggYmFua19pZHgsIGJhbmtfYWRkcjsKPiAr CWludCBsZW4gPSBjb3VudCAtIE1UNjM3MF9SRUdfQUREUkxFTjsKPiArCj4gKwliYW5rX2lkeCA9 ICoodTggKilkYXRhOwo+ICsJYmFua19hZGRyID0gKih1OCAqKShkYXRhICsgMSk7Cj4gKwo+ICsJ cmV0dXJuIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShpbmZvLT5pMmNbYmFua19pZHhd LCBiYW5rX2FkZHIsCj4gKwkJCQkJICAgICAgbGVuLCBkYXRhICsgTVQ2MzcwX1JFR19BRERSTEVO KTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfYnVzIG10NjM3MF9yZWdt YXBfYnVzID0gewo+ICsJLnJlYWQJCT0gbXQ2MzcwX3JlZ21hcF9yZWFkLAo+ICsJLndyaXRlCQk9 IG10NjM3MF9yZWdtYXBfd3JpdGUsCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJl Z21hcF9jb25maWcgbXQ2MzcwX3JlZ21hcF9jb25maWcgPSB7Cj4gKwkucmVnX2JpdHMJCT0gMTYs Cj4gKwkudmFsX2JpdHMJCT0gOCwKPiArCS5yZWdfZm9ybWF0X2VuZGlhbgk9IFJFR01BUF9FTkRJ QU5fQklHLAo+ICsJLm1heF9yZWdpc3RlcgkJPSBNVDYzNzBfUkVHX01BWEFERFIsCj4gK307Cj4g Kwo+ICtzdGF0aWMgaW50IG10NjM3MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQo+ICt7 Cj4gKwlzdHJ1Y3QgbXQ2MzcwX2luZm8gKmluZm87Cj4gKwlzdHJ1Y3QgaTJjX2NsaWVudCAqdXNi Y19pMmM7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWluZm8gPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2 LCBzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKPiArCWlmICghaW5mbykKPiArCQlyZXR1cm4g LUVOT01FTTsKPiArCj4gKwlpbmZvLT5kZXYgPSAmaTJjLT5kZXY7Cj4gKwo+ICsJdXNiY19pMmMg PSBkZXZtX2kyY19uZXdfZHVtbXlfZGV2aWNlKCZpMmMtPmRldiwgaTJjLT5hZGFwdGVyLAo+ICsJ CQkJCSAgICAgTVQ2MzcwX1VTQkNfSTJDQUREUik7Cj4gKwlpZiAoSVNfRVJSKHVzYmNfaTJjKSkK PiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmaTJjLT5kZXYsIFBUUl9FUlIodXNiY19pMmMpLAo+ ICsJCQkJICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIFVTQkMgSTJDIGNsaWVudFxuIik7Cj4gKwo+ ICsJLyogQXNzaWduIEkyQyBjbGllbnQgZm9yIFBNVSBhbmQgVHlwZUMgKi8KPiArCWluZm8tPmky Y1tNVDYzNzBfUE1VX0kyQ10gPSBpMmM7Cj4gKwlpbmZvLT5pMmNbTVQ2MzcwX1VTQkNfSTJDXSA9 IHVzYmNfaTJjOwo+ICsKPiArCWluZm8tPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQoJmkyYy0+ ZGV2LCAmbXQ2MzcwX3JlZ21hcF9idXMsIGluZm8sCj4gKwkJCQkJJm10NjM3MF9yZWdtYXBfY29u ZmlnKTsKCkFwYXJ0IGZyb20gaW4gbXQ2MzcwX2NoZWNrX3ZlbmRvcl9pbmZvKCkgd2hlcmUgaXMg dGhpcyBhY3R1YWxseSB1c2VkPwoKPiArCWlmIChJU19FUlIoaW5mby0+cmVnbWFwKSkKPiArCQly ZXR1cm4gZGV2X2Vycl9wcm9iZSgmaTJjLT5kZXYsIFBUUl9FUlIoaW5mby0+cmVnbWFwKSwKPiAr CQkJCSAgICAgIkZhaWxlZCB0byByZWdpc3RlciByZWdtYXBcbiIpOwo+ICsKPiArCXJldCA9IG10 NjM3MF9jaGVja192ZW5kb3JfaW5mbyhpbmZvKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIGRl dl9lcnJfcHJvYmUoJmkyYy0+ZGV2LCByZXQsCj4gKwkJCQkgICAgICJGYWlsZWQgdG8gY2hlY2sg dmVuZG9yIGluZm9cbiIpOwo+ICsKPiArCXJldCA9IGRldm1fcmVnbWFwX2FkZF9pcnFfY2hpcCgm aTJjLT5kZXYsIGluZm8tPnJlZ21hcCwgaTJjLT5pcnEsCj4gKwkJCQkgICAgICAgSVJRRl9PTkVT SE9ULCAtMSwgJm10NjM3MF9pcnFfY2hpcCwKPiArCQkJCSAgICAgICAmaW5mby0+aXJxX2RhdGEp Owo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmaTJjLT5kZXYsIHJldCwK PiArCQkJCSAgICAgIkZhaWxlZCB0byBhZGQgaXJxIGNoaXBcbiIpOwo+ICsKPiArCXJldHVybiBk ZXZtX21mZF9hZGRfZGV2aWNlcygmaTJjLT5kZXYsIFBMQVRGT1JNX0RFVklEX0FVVE8sCj4gKwkJ CQkgICAgbXQ2MzcwX2RldmljZXMsIEFSUkFZX1NJWkUobXQ2MzcwX2RldmljZXMpLAo+ICsJCQkJ ICAgIE5VTEwsIDAsCj4gKwkJCQkgICAgcmVnbWFwX2lycV9nZXRfZG9tYWluKGluZm8tPmlycV9k YXRhKSk7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10NjM3 MF9tYXRjaF90YWJsZVtdID0gewo+ICsJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzNzAi LCB9LAo+ICsJe30KPiArfTsKPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ2MzcwX21hdGNo X3RhYmxlKTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDYzNzBfZHJpdmVyID0g ewo+ICsJLmRyaXZlciA9IHsKPiArCQkubmFtZSA9ICJtdDYzNzAiLAo+ICsJCS5vZl9tYXRjaF90 YWJsZSA9IG10NjM3MF9tYXRjaF90YWJsZSwKPiArCX0sCj4gKwkucHJvYmVfbmV3ID0gbXQ2Mzcw X3Byb2JlLAo+ICt9Owo+ICttb2R1bGVfaTJjX2RyaXZlcihtdDYzNzBfZHJpdmVyKTsKPiArCj4g K01PRFVMRV9BVVRIT1IoIkNoaVl1YW4gSHVhbmcgPGN5X2h1YW5nQHJpY2h0ZWsuY29tPiIpOwo+ ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1UNjM3MCBJMkMgRHJpdmVyIik7CgpUaGlzIGlzIG5vdCBh biBJMkMgZHJpdmVyLgoKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwoKLS0gCkxlZSBKb25l cyBb5p2O55C85pavXQpQcmluY2lwYWwgVGVjaG5pY2FsIExlYWQgLSBEZXZlbG9wZXIgU2Vydmlj ZXMKTGluYXJvLm9yZyDilIIgT3BlbiBzb3VyY2Ugc29mdHdhcmUgZm9yIEFybSBTb0NzCkZvbGxv dyBMaW5hcm86IEZhY2Vib29rIHwgVHdpdHRlciB8IEJsb2cKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0 CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK 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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 D5E26CCA47F for ; Tue, 12 Jul 2022 15:29:25 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 08B328CFC1; Tue, 12 Jul 2022 15:29:25 +0000 (UTC) Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by gabe.freedesktop.org (Postfix) with ESMTPS id 16A9F8BECA for ; Tue, 12 Jul 2022 15:29:23 +0000 (UTC) Received: by mail-wr1-x42a.google.com with SMTP id v14so11683562wra.5 for ; Tue, 12 Jul 2022 08:29:23 -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; bh=Q+JH/qWaiP2eJjuYW7C2uW3S0RkJ71Ub5nbWi6ekYbU=; b=OczFGqywfdpy/mS2TpodOJOjuQVYsPEbYTpYSvI59PBCT2BHt/vguhiU3Z+P/25Xy1 NX12SAQIPHWI4v65pWrdKecJzJ1ZGNsVrm4p4CkSKIuywvfuizpOzZ9Wqb5Jt0s0UHBp T5PS8SW072ViH7TP9Q1PP6fDrZJHGcvg2WmV6fg5I4zrNV3XGkuRlHjgoLdrxTGYU28w Z87I9ucdUZ9RkKjmGgpr804KkfSTtYBOnSa8OCgcdq8A7jMi3r48eOJ1/nJefL8+oJ9R cLWhrGedBVWmNXkrHud8KRNz7PKK4gOV5vdbwVuBC3Im5EaXVYsYxBfTlWzC718rBE5u DBkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Q+JH/qWaiP2eJjuYW7C2uW3S0RkJ71Ub5nbWi6ekYbU=; b=6tyDPbooBBtWV+bVesXkhs3AxXY9Gp/p9Q+jGSK3swX++3mp/EpcMSoRwI54KuSDy6 WlQY4ORfugNQvamnWtZDGzoUOyLmfxQNDhOTZNyFgi44qdTvaTSYeikwgJrSiAlBtF02 cJLkEh4xMd4NDjSh4CPfbIbGpoqBg/AD+gEvuHWzsYtGqPUTkdwf1bZwMZzcx+/cARaT BuRKSMVSYeL1dcujLcUszRXX0jJxcEjS309IC+cUI3/PSxtI2npE8hDTF0YKddXyEnWS 3Uz9txJ9HWDeoYodbR8NXbOs+078RXFqNkAQMVzH+ISO4+kpve01P4dtRM1h4+AMDN+6 daCw== X-Gm-Message-State: AJIora/SiPvfEsp9YLMQrrVdnmr08GO6nG9Rj01JCHvc7N4ca6dLfTHO qfjup10XxIBsUGoIlKcSg8JbGQ== X-Google-Smtp-Source: AGRyM1uSLPcm2Pav8BPF3Jx+Guud3701li2mH9y8hYpZuHdD2WZOCC/W4swCDeXJTVRAPp66ckDPSg== X-Received: by 2002:a5d:414a:0:b0:21d:6be5:1765 with SMTP id c10-20020a5d414a000000b0021d6be51765mr22980167wrq.419.1657639761463; Tue, 12 Jul 2022 08:29:21 -0700 (PDT) Received: from google.com (cpc155339-bagu17-2-0-cust87.1-3.cable.virginm.net. [86.27.177.88]) by smtp.gmail.com with ESMTPSA id ay26-20020a05600c1e1a00b003a2e89d1fb5sm5149242wmb.42.2022.07.12.08.29.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Jul 2022 08:29:20 -0700 (PDT) Date: Tue, 12 Jul 2022 16:29:18 +0100 From: Lee Jones To: ChiaEn Wu Subject: Re: [PATCH v3 07/14] mfd: mt6370: Add Mediatek MT6370 support Message-ID: References: <20220623115631.22209-1-peterwu.pub@gmail.com> <20220623115631.22209-8-peterwu.pub@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220623115631.22209-8-peterwu.pub@gmail.com> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-fbdev@vger.kernel.org, heikki.krogerus@linux.intel.com, krzysztof.kozlowski+dt@linaro.org, alice_chen@richtek.com, linux-iio@vger.kernel.org, dri-devel@lists.freedesktop.org, lgirdwood@gmail.com, cy_huang@richtek.com, pavel@ucw.cz, linux-leds@vger.kernel.org, daniel.thompson@linaro.org, deller@gmx.de, robh+dt@kernel.org, chunfeng.yun@mediatek.com, linux@roeck-us.net, devicetree@vger.kernel.org, linux-pm@vger.kernel.org, szunichen@gmail.com, broonie@kernel.org, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, linux-arm-kernel@lists.infradead.org, jingoohan1@gmail.com, linux-usb@vger.kernel.org, sre@kernel.org, linux-kernel@vger.kernel.org, chiaen_wu@richtek.com, gregkh@linuxfoundation.org, jic23@kernel.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Thu, 23 Jun 2022, ChiaEn Wu wrote: > From: ChiYuan Huang > > Add Mediatek MT6370 MFD support. No such thing as "MFD support". And you're not getting away with submitting a 370 line patch with a 5 word change log either. :) Please at least tell us what the device is and what it's used for. > Signed-off-by: ChiYuan Huang > --- > > v3 > - Refine Kconfig help text > - Refine error message of unknown vendor ID in > mt6370_check_vendor_info() > - Refine return value handling of mt6370_regmap_read() > - Refine all probe error by using dev_err_probe() > - Refine "bank_idx" and "bank_addr" in mt6370_regmap_read() and > mt6370_regmap_write() > - Add "#define VENID*" and drop the comments in > mt6370_check_vendor_info() > - Drop "MFD" in MODULE_DESCRIPTION() > --- > drivers/mfd/Kconfig | 13 ++ > drivers/mfd/Makefile | 1 + > drivers/mfd/mt6370.c | 358 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 372 insertions(+) > create mode 100644 drivers/mfd/mt6370.c > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 3b59456..4c900c4 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -937,6 +937,19 @@ config MFD_MT6360 > PMIC part includes 2-channel BUCKs and 2-channel LDOs > LDO part includes 4-channel LDOs > > +config MFD_MT6370 > + tristate "Mediatek MT6370 SubPMIC" > + select MFD_CORE > + select REGMAP_I2C > + select REGMAP_IRQ > + depends on I2C > + help > + Say Y here to enable MT6370 SubPMIC functional support. > + It consists of a single cell battery charger with ADC monitoring, RGB > + LEDs, dual channel flashlight, WLED backlight driver, display bias > + voltage supply, one general purpose LDO, and the USB Type-C & PD > + controller complies with the latest USB Type-C and PD standards. > + > config MFD_MT6397 > tristate "MediaTek MT6397 PMIC Support" > select MFD_CORE > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index 858cacf..62b2712 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -242,6 +242,7 @@ 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_MT6370) += mt6370.o > mt6397-objs := mt6397-core.o mt6397-irq.o mt6358-irq.o > obj-$(CONFIG_MFD_MT6397) += mt6397.o > obj-$(CONFIG_INTEL_SOC_PMIC_MRFLD) += intel_soc_pmic_mrfld.o > diff --git a/drivers/mfd/mt6370.c b/drivers/mfd/mt6370.c > new file mode 100644 > index 0000000..49f02b1 > --- /dev/null > +++ b/drivers/mfd/mt6370.c > @@ -0,0 +1,358 @@ > +// SPDX-License-Identifier: GPL-2.0 No Copyright? > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +enum { > + MT6370_USBC_I2C = 0, > + MT6370_PMU_I2C, > + MT6370_MAX_I2C > +}; > + > +#define MT6370_REG_DEV_INFO 0x100 > +#define MT6370_REG_CHG_IRQ1 0x1C0 > +#define MT6370_REG_CHG_MASK1 0x1E0 > + > +#define MT6370_VENID_MASK GENMASK(7, 4) > + > +#define MT6370_NUM_IRQREGS 16 > +#define MT6370_USBC_I2CADDR 0x4E > +#define MT6370_REG_ADDRLEN 2 > +#define MT6370_REG_MAXADDR 0x1FF > + > +#define MT6370_VENID_RT5081 0x8 > +#define MT6370_VENID_RT5081A 0xA > +#define MT6370_VENID_MT6370 0xE > +#define MT6370_VENID_MT6371 0xF > +#define MT6370_VENID_MT6372P 0x9 > +#define MT6370_VENID_MT6372CP 0xB > + > +/* IRQ definitions */ > +#define MT6370_IRQ_DIRCHGON 0 > +#define MT6370_IRQ_CHG_TREG 4 > +#define MT6370_IRQ_CHG_AICR 5 > +#define MT6370_IRQ_CHG_MIVR 6 > +#define MT6370_IRQ_PWR_RDY 7 > +#define MT6370_IRQ_FL_CHG_VINOVP 11 > +#define MT6370_IRQ_CHG_VSYSUV 12 > +#define MT6370_IRQ_CHG_VSYSOV 13 > +#define MT6370_IRQ_CHG_VBATOV 14 > +#define MT6370_IRQ_CHG_VINOVPCHG 15 > +#define MT6370_IRQ_TS_BAT_COLD 20 > +#define MT6370_IRQ_TS_BAT_COOL 21 > +#define MT6370_IRQ_TS_BAT_WARM 22 > +#define MT6370_IRQ_TS_BAT_HOT 23 > +#define MT6370_IRQ_TS_STATC 24 > +#define MT6370_IRQ_CHG_FAULT 25 > +#define MT6370_IRQ_CHG_STATC 26 > +#define MT6370_IRQ_CHG_TMR 27 > +#define MT6370_IRQ_CHG_BATABS 28 > +#define MT6370_IRQ_CHG_ADPBAD 29 > +#define MT6370_IRQ_CHG_RVP 30 > +#define MT6370_IRQ_TSHUTDOWN 31 > +#define MT6370_IRQ_CHG_IINMEAS 32 > +#define MT6370_IRQ_CHG_ICCMEAS 33 > +#define MT6370_IRQ_CHGDET_DONE 34 > +#define MT6370_IRQ_WDTMR 35 > +#define MT6370_IRQ_SSFINISH 36 > +#define MT6370_IRQ_CHG_RECHG 37 > +#define MT6370_IRQ_CHG_TERM 38 > +#define MT6370_IRQ_CHG_IEOC 39 > +#define MT6370_IRQ_ADC_DONE 40 > +#define MT6370_IRQ_PUMPX_DONE 41 > +#define MT6370_IRQ_BST_BATUV 45 > +#define MT6370_IRQ_BST_MIDOV 46 > +#define MT6370_IRQ_BST_OLP 47 > +#define MT6370_IRQ_ATTACH 48 > +#define MT6370_IRQ_DETACH 49 > +#define MT6370_IRQ_HVDCP_STPDONE 51 > +#define MT6370_IRQ_HVDCP_VBUSDET_DONE 52 > +#define MT6370_IRQ_HVDCP_DET 53 > +#define MT6370_IRQ_CHGDET 54 > +#define MT6370_IRQ_DCDT 55 > +#define MT6370_IRQ_DIRCHG_VGOK 59 > +#define MT6370_IRQ_DIRCHG_WDTMR 60 > +#define MT6370_IRQ_DIRCHG_UC 61 > +#define MT6370_IRQ_DIRCHG_OC 62 > +#define MT6370_IRQ_DIRCHG_OV 63 > +#define MT6370_IRQ_OVPCTRL_SWON 67 > +#define MT6370_IRQ_OVPCTRL_UVP_D 68 > +#define MT6370_IRQ_OVPCTRL_UVP 69 > +#define MT6370_IRQ_OVPCTRL_OVP_D 70 > +#define MT6370_IRQ_OVPCTRL_OVP 71 > +#define MT6370_IRQ_FLED_STRBPIN 72 > +#define MT6370_IRQ_FLED_TORPIN 73 > +#define MT6370_IRQ_FLED_TX 74 > +#define MT6370_IRQ_FLED_LVF 75 > +#define MT6370_IRQ_FLED2_SHORT 78 > +#define MT6370_IRQ_FLED1_SHORT 79 > +#define MT6370_IRQ_FLED2_STRB 80 > +#define MT6370_IRQ_FLED1_STRB 81 > +#define mT6370_IRQ_FLED2_STRB_TO 82 > +#define MT6370_IRQ_FLED1_STRB_TO 83 > +#define MT6370_IRQ_FLED2_TOR 84 > +#define MT6370_IRQ_FLED1_TOR 85 > +#define MT6370_IRQ_OTP 93 > +#define MT6370_IRQ_VDDA_OVP 94 > +#define MT6370_IRQ_VDDA_UV 95 > +#define MT6370_IRQ_LDO_OC 103 > +#define MT6370_IRQ_BLED_OCP 118 > +#define MT6370_IRQ_BLED_OVP 119 > +#define MT6370_IRQ_DSV_VNEG_OCP 123 > +#define MT6370_IRQ_DSV_VPOS_OCP 124 > +#define MT6370_IRQ_DSV_BST_OCP 125 > +#define MT6370_IRQ_DSV_VNEG_SCP 126 > +#define MT6370_IRQ_DSV_VPOS_SCP 127 Can you pop these into a header file please? > +struct mt6370_info { > + struct i2c_client *i2c[MT6370_MAX_I2C]; > + struct device *dev; You don't need both 'i2c' and 'dev'. You can derive one from the other. > + struct regmap *regmap; > + struct regmap_irq_chip_data *irq_data; > +}; This can do into the header file too. > +static const struct regmap_irq mt6370_irqs[] = { > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHGON, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_TREG, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_AICR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_MIVR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_PWR_RDY, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FL_CHG_VINOVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VSYSUV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VSYSOV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VBATOV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_VINOVPCHG, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_COLD, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_COOL, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_WARM, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_BAT_HOT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TS_STATC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_FAULT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_STATC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_TMR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_BATABS, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_ADPBAD, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_RVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_TSHUTDOWN, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_IINMEAS, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_ICCMEAS, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHGDET_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_WDTMR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_SSFINISH, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_RECHG, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_TERM, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHG_IEOC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_ADC_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_PUMPX_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BST_BATUV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BST_MIDOV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BST_OLP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_ATTACH, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DETACH, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_HVDCP_STPDONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_HVDCP_VBUSDET_DONE, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_HVDCP_DET, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_CHGDET, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DCDT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_VGOK, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_WDTMR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_UC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_OC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DIRCHG_OV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_SWON, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_UVP_D, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_UVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_OVP_D, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OVPCTRL_OVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_STRBPIN, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_TORPIN, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_TX, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED_LVF, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED2_SHORT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_SHORT, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED2_STRB, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_STRB, 8), > + REGMAP_IRQ_REG_LINE(mT6370_IRQ_FLED2_STRB_TO, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_STRB_TO, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED2_TOR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_FLED1_TOR, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_OTP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_VDDA_OVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_VDDA_UV, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_LDO_OC, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BLED_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_BLED_OVP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VNEG_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VPOS_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_BST_OCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VNEG_SCP, 8), > + REGMAP_IRQ_REG_LINE(MT6370_IRQ_DSV_VPOS_SCP, 8) > +}; > + > +static const struct regmap_irq_chip mt6370_irq_chip = { > + .name = "mt6370-irqs", > + .status_base = MT6370_REG_CHG_IRQ1, > + .mask_base = MT6370_REG_CHG_MASK1, > + .num_regs = MT6370_NUM_IRQREGS, > + .irqs = mt6370_irqs, > + .num_irqs = ARRAY_SIZE(mt6370_irqs), > +}; > + > +static const struct resource mt6370_regulator_irqs[] = { > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VPOS_SCP, "db_vpos_scp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VNEG_SCP, "db_vneg_scp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_BST_OCP, "db_vbst_ocp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VPOS_OCP, "db_vpos_ocp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_DSV_VNEG_OCP, "db_vneg_ocp"), > + DEFINE_RES_IRQ_NAMED(MT6370_IRQ_LDO_OC, "ldo_oc") > +}; > + > +static const struct mfd_cell mt6370_devices[] = { > + MFD_CELL_OF("adc", NULL, NULL, 0, 0, "mediatek,mt6370-adc"), > + MFD_CELL_OF("charger", NULL, NULL, 0, 0, "mediatek,mt6370-charger"), > + MFD_CELL_OF("backlight", NULL, NULL, 0, 0, "mediatek,mt6370-backlight"), > + MFD_CELL_OF("flashlight", NULL, NULL, 0, 0, "mediatek,mt6370-flashlight"), > + MFD_CELL_OF("indicator", NULL, NULL, 0, 0, "mediatek,mt6370-indicator"), > + MFD_CELL_OF("tcpc", NULL, NULL, 0, 0, "mediatek,mt6370-tcpc"), > + MFD_CELL_RES("regulator", mt6370_regulator_irqs) The first parameters here should be prepended with something, perhaps "mt6370_"? > +}; > + > +static int mt6370_check_vendor_info(struct mt6370_info *info) > +{ > + unsigned int devinfo; > + int ret; > + > + ret = regmap_read(info->regmap, MT6370_REG_DEV_INFO, &devinfo); > + if (ret) > + return ret; > + > + switch (FIELD_GET(MT6370_VENID_MASK, devinfo)) { > + case MT6370_VENID_RT5081: > + case MT6370_VENID_RT5081A: > + case MT6370_VENID_MT6370: > + case MT6370_VENID_MT6371: > + case MT6370_VENID_MT6372P: > + case MT6370_VENID_MT6372CP: > + break; > + default: > + dev_err(info->dev, "Unknown Vendor ID 0x%02x\n", devinfo); > + return -ENODEV; > + } > + > + return 0; > +} > + > +static int mt6370_regmap_read(void *context, const void *reg_buf, > + size_t reg_size, void *val_buf, size_t val_size) > +{ > + struct mt6370_info *info = context; > + u8 bank_idx, bank_addr; > + int ret; > + > + bank_idx = *(u8 *)reg_buf; > + bank_addr = *(u8 *)(reg_buf + 1); > + > + ret = i2c_smbus_read_i2c_block_data(info->i2c[bank_idx], bank_addr, > + val_size, val_buf); > + if (ret < 0) > + return ret; > + else if (ret != val_size) > + return -EIO; > + > + return 0; > +} > + > +static int mt6370_regmap_write(void *context, const void *data, size_t count) > +{ > + struct mt6370_info *info = context; > + u8 bank_idx, bank_addr; > + int len = count - MT6370_REG_ADDRLEN; > + > + bank_idx = *(u8 *)data; > + bank_addr = *(u8 *)(data + 1); > + > + return i2c_smbus_write_i2c_block_data(info->i2c[bank_idx], bank_addr, > + len, data + MT6370_REG_ADDRLEN); > +} > + > +static const struct regmap_bus mt6370_regmap_bus = { > + .read = mt6370_regmap_read, > + .write = mt6370_regmap_write, > +}; > + > +static const struct regmap_config mt6370_regmap_config = { > + .reg_bits = 16, > + .val_bits = 8, > + .reg_format_endian = REGMAP_ENDIAN_BIG, > + .max_register = MT6370_REG_MAXADDR, > +}; > + > +static int mt6370_probe(struct i2c_client *i2c) > +{ > + struct mt6370_info *info; > + struct i2c_client *usbc_i2c; > + int ret; > + > + info = devm_kzalloc(&i2c->dev, sizeof(*info), GFP_KERNEL); > + if (!info) > + return -ENOMEM; > + > + info->dev = &i2c->dev; > + > + usbc_i2c = devm_i2c_new_dummy_device(&i2c->dev, i2c->adapter, > + MT6370_USBC_I2CADDR); > + if (IS_ERR(usbc_i2c)) > + return dev_err_probe(&i2c->dev, PTR_ERR(usbc_i2c), > + "Failed to register USBC I2C client\n"); > + > + /* Assign I2C client for PMU and TypeC */ > + info->i2c[MT6370_PMU_I2C] = i2c; > + info->i2c[MT6370_USBC_I2C] = usbc_i2c; > + > + info->regmap = devm_regmap_init(&i2c->dev, &mt6370_regmap_bus, info, > + &mt6370_regmap_config); Apart from in mt6370_check_vendor_info() where is this actually used? > + if (IS_ERR(info->regmap)) > + return dev_err_probe(&i2c->dev, PTR_ERR(info->regmap), > + "Failed to register regmap\n"); > + > + ret = mt6370_check_vendor_info(info); > + if (ret) > + return dev_err_probe(&i2c->dev, ret, > + "Failed to check vendor info\n"); > + > + ret = devm_regmap_add_irq_chip(&i2c->dev, info->regmap, i2c->irq, > + IRQF_ONESHOT, -1, &mt6370_irq_chip, > + &info->irq_data); > + if (ret) > + return dev_err_probe(&i2c->dev, ret, > + "Failed to add irq chip\n"); > + > + return devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO, > + mt6370_devices, ARRAY_SIZE(mt6370_devices), > + NULL, 0, > + regmap_irq_get_domain(info->irq_data)); > +} > + > +static const struct of_device_id mt6370_match_table[] = { > + { .compatible = "mediatek,mt6370", }, > + {} > +}; > +MODULE_DEVICE_TABLE(of, mt6370_match_table); > + > +static struct i2c_driver mt6370_driver = { > + .driver = { > + .name = "mt6370", > + .of_match_table = mt6370_match_table, > + }, > + .probe_new = mt6370_probe, > +}; > +module_i2c_driver(mt6370_driver); > + > +MODULE_AUTHOR("ChiYuan Huang "); > +MODULE_DESCRIPTION("MT6370 I2C Driver"); This is not an I2C driver. > +MODULE_LICENSE("GPL v2"); -- Lee Jones [李琼斯] Principal Technical Lead - Developer Services Linaro.org │ Open source software for Arm SoCs Follow Linaro: Facebook | Twitter | Blog