162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2014 MediaTek Inc. 462306a36Sopenharmony_ci * Author: Flora Fu, MediaTek 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/interrupt.h> 862306a36Sopenharmony_ci#include <linux/ioport.h> 962306a36Sopenharmony_ci#include <linux/irqdomain.h> 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include <linux/platform_device.h> 1362306a36Sopenharmony_ci#include <linux/regmap.h> 1462306a36Sopenharmony_ci#include <linux/mfd/core.h> 1562306a36Sopenharmony_ci#include <linux/mfd/mt6323/core.h> 1662306a36Sopenharmony_ci#include <linux/mfd/mt6331/core.h> 1762306a36Sopenharmony_ci#include <linux/mfd/mt6357/core.h> 1862306a36Sopenharmony_ci#include <linux/mfd/mt6358/core.h> 1962306a36Sopenharmony_ci#include <linux/mfd/mt6359/core.h> 2062306a36Sopenharmony_ci#include <linux/mfd/mt6397/core.h> 2162306a36Sopenharmony_ci#include <linux/mfd/mt6323/registers.h> 2262306a36Sopenharmony_ci#include <linux/mfd/mt6331/registers.h> 2362306a36Sopenharmony_ci#include <linux/mfd/mt6357/registers.h> 2462306a36Sopenharmony_ci#include <linux/mfd/mt6358/registers.h> 2562306a36Sopenharmony_ci#include <linux/mfd/mt6359/registers.h> 2662306a36Sopenharmony_ci#include <linux/mfd/mt6397/registers.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define MT6323_RTC_BASE 0x8000 2962306a36Sopenharmony_ci#define MT6323_RTC_SIZE 0x40 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define MT6357_RTC_BASE 0x0588 3262306a36Sopenharmony_ci#define MT6357_RTC_SIZE 0x3c 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define MT6331_RTC_BASE 0x4000 3562306a36Sopenharmony_ci#define MT6331_RTC_SIZE 0x40 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define MT6358_RTC_BASE 0x0588 3862306a36Sopenharmony_ci#define MT6358_RTC_SIZE 0x3c 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define MT6397_RTC_BASE 0xe000 4162306a36Sopenharmony_ci#define MT6397_RTC_SIZE 0x3e 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define MT6323_PWRC_BASE 0x8000 4462306a36Sopenharmony_ci#define MT6323_PWRC_SIZE 0x40 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic const struct resource mt6323_rtc_resources[] = { 4762306a36Sopenharmony_ci DEFINE_RES_MEM(MT6323_RTC_BASE, MT6323_RTC_SIZE), 4862306a36Sopenharmony_ci DEFINE_RES_IRQ(MT6323_IRQ_STATUS_RTC), 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic const struct resource mt6357_rtc_resources[] = { 5262306a36Sopenharmony_ci DEFINE_RES_MEM(MT6357_RTC_BASE, MT6357_RTC_SIZE), 5362306a36Sopenharmony_ci DEFINE_RES_IRQ(MT6357_IRQ_RTC), 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic const struct resource mt6331_rtc_resources[] = { 5762306a36Sopenharmony_ci DEFINE_RES_MEM(MT6331_RTC_BASE, MT6331_RTC_SIZE), 5862306a36Sopenharmony_ci DEFINE_RES_IRQ(MT6331_IRQ_STATUS_RTC), 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic const struct resource mt6358_rtc_resources[] = { 6262306a36Sopenharmony_ci DEFINE_RES_MEM(MT6358_RTC_BASE, MT6358_RTC_SIZE), 6362306a36Sopenharmony_ci DEFINE_RES_IRQ(MT6358_IRQ_RTC), 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic const struct resource mt6397_rtc_resources[] = { 6762306a36Sopenharmony_ci DEFINE_RES_MEM(MT6397_RTC_BASE, MT6397_RTC_SIZE), 6862306a36Sopenharmony_ci DEFINE_RES_IRQ(MT6397_IRQ_RTC), 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic const struct resource mt6358_keys_resources[] = { 7262306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6358_IRQ_PWRKEY, "powerkey"), 7362306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6358_IRQ_HOMEKEY, "homekey"), 7462306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6358_IRQ_PWRKEY_R, "powerkey_r"), 7562306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6358_IRQ_HOMEKEY_R, "homekey_r"), 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic const struct resource mt6359_keys_resources[] = { 7962306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6359_IRQ_PWRKEY, "powerkey"), 8062306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6359_IRQ_HOMEKEY, "homekey"), 8162306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6359_IRQ_PWRKEY_R, "powerkey_r"), 8262306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6359_IRQ_HOMEKEY_R, "homekey_r"), 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic const struct resource mt6323_keys_resources[] = { 8662306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6323_IRQ_STATUS_PWRKEY, "powerkey"), 8762306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6323_IRQ_STATUS_FCHRKEY, "homekey"), 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic const struct resource mt6357_keys_resources[] = { 9162306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6357_IRQ_PWRKEY, "powerkey"), 9262306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6357_IRQ_HOMEKEY, "homekey"), 9362306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6357_IRQ_PWRKEY_R, "powerkey_r"), 9462306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6357_IRQ_HOMEKEY_R, "homekey_r"), 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic const struct resource mt6331_keys_resources[] = { 9862306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6331_IRQ_STATUS_PWRKEY, "powerkey"), 9962306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6331_IRQ_STATUS_HOMEKEY, "homekey"), 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic const struct resource mt6397_keys_resources[] = { 10362306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6397_IRQ_PWRKEY, "powerkey"), 10462306a36Sopenharmony_ci DEFINE_RES_IRQ_NAMED(MT6397_IRQ_HOMEKEY, "homekey"), 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic const struct resource mt6323_pwrc_resources[] = { 10862306a36Sopenharmony_ci DEFINE_RES_MEM(MT6323_PWRC_BASE, MT6323_PWRC_SIZE), 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic const struct mfd_cell mt6323_devs[] = { 11262306a36Sopenharmony_ci { 11362306a36Sopenharmony_ci .name = "mt6323-rtc", 11462306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6323_rtc_resources), 11562306a36Sopenharmony_ci .resources = mt6323_rtc_resources, 11662306a36Sopenharmony_ci .of_compatible = "mediatek,mt6323-rtc", 11762306a36Sopenharmony_ci }, { 11862306a36Sopenharmony_ci .name = "mt6323-regulator", 11962306a36Sopenharmony_ci .of_compatible = "mediatek,mt6323-regulator" 12062306a36Sopenharmony_ci }, { 12162306a36Sopenharmony_ci .name = "mt6323-led", 12262306a36Sopenharmony_ci .of_compatible = "mediatek,mt6323-led" 12362306a36Sopenharmony_ci }, { 12462306a36Sopenharmony_ci .name = "mtk-pmic-keys", 12562306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6323_keys_resources), 12662306a36Sopenharmony_ci .resources = mt6323_keys_resources, 12762306a36Sopenharmony_ci .of_compatible = "mediatek,mt6323-keys" 12862306a36Sopenharmony_ci }, { 12962306a36Sopenharmony_ci .name = "mt6323-pwrc", 13062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6323_pwrc_resources), 13162306a36Sopenharmony_ci .resources = mt6323_pwrc_resources, 13262306a36Sopenharmony_ci .of_compatible = "mediatek,mt6323-pwrc" 13362306a36Sopenharmony_ci }, 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic const struct mfd_cell mt6357_devs[] = { 13762306a36Sopenharmony_ci { 13862306a36Sopenharmony_ci .name = "mt6357-regulator", 13962306a36Sopenharmony_ci }, { 14062306a36Sopenharmony_ci .name = "mt6357-rtc", 14162306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6357_rtc_resources), 14262306a36Sopenharmony_ci .resources = mt6357_rtc_resources, 14362306a36Sopenharmony_ci .of_compatible = "mediatek,mt6357-rtc", 14462306a36Sopenharmony_ci }, { 14562306a36Sopenharmony_ci .name = "mtk-pmic-keys", 14662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6357_keys_resources), 14762306a36Sopenharmony_ci .resources = mt6357_keys_resources, 14862306a36Sopenharmony_ci .of_compatible = "mediatek,mt6357-keys" 14962306a36Sopenharmony_ci }, 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* MT6331 is always used in combination with MT6332 */ 15362306a36Sopenharmony_cistatic const struct mfd_cell mt6331_mt6332_devs[] = { 15462306a36Sopenharmony_ci { 15562306a36Sopenharmony_ci .name = "mt6331-rtc", 15662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6331_rtc_resources), 15762306a36Sopenharmony_ci .resources = mt6331_rtc_resources, 15862306a36Sopenharmony_ci .of_compatible = "mediatek,mt6331-rtc", 15962306a36Sopenharmony_ci }, { 16062306a36Sopenharmony_ci .name = "mt6331-regulator", 16162306a36Sopenharmony_ci .of_compatible = "mediatek,mt6331-regulator" 16262306a36Sopenharmony_ci }, { 16362306a36Sopenharmony_ci .name = "mt6332-regulator", 16462306a36Sopenharmony_ci .of_compatible = "mediatek,mt6332-regulator" 16562306a36Sopenharmony_ci }, { 16662306a36Sopenharmony_ci .name = "mtk-pmic-keys", 16762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6331_keys_resources), 16862306a36Sopenharmony_ci .resources = mt6331_keys_resources, 16962306a36Sopenharmony_ci .of_compatible = "mediatek,mt6331-keys" 17062306a36Sopenharmony_ci }, 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistatic const struct mfd_cell mt6358_devs[] = { 17462306a36Sopenharmony_ci { 17562306a36Sopenharmony_ci .name = "mt6358-regulator", 17662306a36Sopenharmony_ci .of_compatible = "mediatek,mt6358-regulator" 17762306a36Sopenharmony_ci }, { 17862306a36Sopenharmony_ci .name = "mt6358-rtc", 17962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6358_rtc_resources), 18062306a36Sopenharmony_ci .resources = mt6358_rtc_resources, 18162306a36Sopenharmony_ci .of_compatible = "mediatek,mt6358-rtc", 18262306a36Sopenharmony_ci }, { 18362306a36Sopenharmony_ci .name = "mt6358-sound", 18462306a36Sopenharmony_ci .of_compatible = "mediatek,mt6358-sound" 18562306a36Sopenharmony_ci }, { 18662306a36Sopenharmony_ci .name = "mt6358-keys", 18762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6358_keys_resources), 18862306a36Sopenharmony_ci .resources = mt6358_keys_resources, 18962306a36Sopenharmony_ci .of_compatible = "mediatek,mt6358-keys" 19062306a36Sopenharmony_ci }, 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistatic const struct mfd_cell mt6359_devs[] = { 19462306a36Sopenharmony_ci { .name = "mt6359-regulator", }, 19562306a36Sopenharmony_ci { 19662306a36Sopenharmony_ci .name = "mt6359-rtc", 19762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6358_rtc_resources), 19862306a36Sopenharmony_ci .resources = mt6358_rtc_resources, 19962306a36Sopenharmony_ci .of_compatible = "mediatek,mt6358-rtc", 20062306a36Sopenharmony_ci }, 20162306a36Sopenharmony_ci { .name = "mt6359-sound", }, 20262306a36Sopenharmony_ci { 20362306a36Sopenharmony_ci .name = "mtk-pmic-keys", 20462306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6359_keys_resources), 20562306a36Sopenharmony_ci .resources = mt6359_keys_resources, 20662306a36Sopenharmony_ci .of_compatible = "mediatek,mt6359-keys" 20762306a36Sopenharmony_ci }, 20862306a36Sopenharmony_ci}; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic const struct mfd_cell mt6397_devs[] = { 21162306a36Sopenharmony_ci { 21262306a36Sopenharmony_ci .name = "mt6397-rtc", 21362306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6397_rtc_resources), 21462306a36Sopenharmony_ci .resources = mt6397_rtc_resources, 21562306a36Sopenharmony_ci .of_compatible = "mediatek,mt6397-rtc", 21662306a36Sopenharmony_ci }, { 21762306a36Sopenharmony_ci .name = "mt6397-regulator", 21862306a36Sopenharmony_ci .of_compatible = "mediatek,mt6397-regulator", 21962306a36Sopenharmony_ci }, { 22062306a36Sopenharmony_ci .name = "mt6397-codec", 22162306a36Sopenharmony_ci .of_compatible = "mediatek,mt6397-codec", 22262306a36Sopenharmony_ci }, { 22362306a36Sopenharmony_ci .name = "mt6397-clk", 22462306a36Sopenharmony_ci .of_compatible = "mediatek,mt6397-clk", 22562306a36Sopenharmony_ci }, { 22662306a36Sopenharmony_ci .name = "mt6397-pinctrl", 22762306a36Sopenharmony_ci .of_compatible = "mediatek,mt6397-pinctrl", 22862306a36Sopenharmony_ci }, { 22962306a36Sopenharmony_ci .name = "mtk-pmic-keys", 23062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(mt6397_keys_resources), 23162306a36Sopenharmony_ci .resources = mt6397_keys_resources, 23262306a36Sopenharmony_ci .of_compatible = "mediatek,mt6397-keys" 23362306a36Sopenharmony_ci } 23462306a36Sopenharmony_ci}; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistruct chip_data { 23762306a36Sopenharmony_ci u32 cid_addr; 23862306a36Sopenharmony_ci u32 cid_shift; 23962306a36Sopenharmony_ci const struct mfd_cell *cells; 24062306a36Sopenharmony_ci int cell_size; 24162306a36Sopenharmony_ci int (*irq_init)(struct mt6397_chip *chip); 24262306a36Sopenharmony_ci}; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistatic const struct chip_data mt6323_core = { 24562306a36Sopenharmony_ci .cid_addr = MT6323_CID, 24662306a36Sopenharmony_ci .cid_shift = 0, 24762306a36Sopenharmony_ci .cells = mt6323_devs, 24862306a36Sopenharmony_ci .cell_size = ARRAY_SIZE(mt6323_devs), 24962306a36Sopenharmony_ci .irq_init = mt6397_irq_init, 25062306a36Sopenharmony_ci}; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistatic const struct chip_data mt6357_core = { 25362306a36Sopenharmony_ci .cid_addr = MT6357_SWCID, 25462306a36Sopenharmony_ci .cid_shift = 8, 25562306a36Sopenharmony_ci .cells = mt6357_devs, 25662306a36Sopenharmony_ci .cell_size = ARRAY_SIZE(mt6357_devs), 25762306a36Sopenharmony_ci .irq_init = mt6358_irq_init, 25862306a36Sopenharmony_ci}; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistatic const struct chip_data mt6331_mt6332_core = { 26162306a36Sopenharmony_ci .cid_addr = MT6331_HWCID, 26262306a36Sopenharmony_ci .cid_shift = 0, 26362306a36Sopenharmony_ci .cells = mt6331_mt6332_devs, 26462306a36Sopenharmony_ci .cell_size = ARRAY_SIZE(mt6331_mt6332_devs), 26562306a36Sopenharmony_ci .irq_init = mt6397_irq_init, 26662306a36Sopenharmony_ci}; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistatic const struct chip_data mt6358_core = { 26962306a36Sopenharmony_ci .cid_addr = MT6358_SWCID, 27062306a36Sopenharmony_ci .cid_shift = 8, 27162306a36Sopenharmony_ci .cells = mt6358_devs, 27262306a36Sopenharmony_ci .cell_size = ARRAY_SIZE(mt6358_devs), 27362306a36Sopenharmony_ci .irq_init = mt6358_irq_init, 27462306a36Sopenharmony_ci}; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistatic const struct chip_data mt6359_core = { 27762306a36Sopenharmony_ci .cid_addr = MT6359_SWCID, 27862306a36Sopenharmony_ci .cid_shift = 8, 27962306a36Sopenharmony_ci .cells = mt6359_devs, 28062306a36Sopenharmony_ci .cell_size = ARRAY_SIZE(mt6359_devs), 28162306a36Sopenharmony_ci .irq_init = mt6358_irq_init, 28262306a36Sopenharmony_ci}; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic const struct chip_data mt6397_core = { 28562306a36Sopenharmony_ci .cid_addr = MT6397_CID, 28662306a36Sopenharmony_ci .cid_shift = 0, 28762306a36Sopenharmony_ci .cells = mt6397_devs, 28862306a36Sopenharmony_ci .cell_size = ARRAY_SIZE(mt6397_devs), 28962306a36Sopenharmony_ci .irq_init = mt6397_irq_init, 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic int mt6397_probe(struct platform_device *pdev) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci int ret; 29562306a36Sopenharmony_ci unsigned int id = 0; 29662306a36Sopenharmony_ci struct mt6397_chip *pmic; 29762306a36Sopenharmony_ci const struct chip_data *pmic_core; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); 30062306a36Sopenharmony_ci if (!pmic) 30162306a36Sopenharmony_ci return -ENOMEM; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci pmic->dev = &pdev->dev; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci /* 30662306a36Sopenharmony_ci * mt6397 MFD is child device of soc pmic wrapper. 30762306a36Sopenharmony_ci * Regmap is set from its parent. 30862306a36Sopenharmony_ci */ 30962306a36Sopenharmony_ci pmic->regmap = dev_get_regmap(pdev->dev.parent, NULL); 31062306a36Sopenharmony_ci if (!pmic->regmap) 31162306a36Sopenharmony_ci return -ENODEV; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci pmic_core = of_device_get_match_data(&pdev->dev); 31462306a36Sopenharmony_ci if (!pmic_core) 31562306a36Sopenharmony_ci return -ENODEV; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci ret = regmap_read(pmic->regmap, pmic_core->cid_addr, &id); 31862306a36Sopenharmony_ci if (ret) { 31962306a36Sopenharmony_ci dev_err(&pdev->dev, "Failed to read chip id: %d\n", ret); 32062306a36Sopenharmony_ci return ret; 32162306a36Sopenharmony_ci } 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci pmic->chip_id = (id >> pmic_core->cid_shift) & 0xff; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci platform_set_drvdata(pdev, pmic); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci pmic->irq = platform_get_irq(pdev, 0); 32862306a36Sopenharmony_ci if (pmic->irq <= 0) 32962306a36Sopenharmony_ci return pmic->irq; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci ret = pmic_core->irq_init(pmic); 33262306a36Sopenharmony_ci if (ret) 33362306a36Sopenharmony_ci return ret; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci ret = devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE, 33662306a36Sopenharmony_ci pmic_core->cells, pmic_core->cell_size, 33762306a36Sopenharmony_ci NULL, 0, pmic->irq_domain); 33862306a36Sopenharmony_ci if (ret) { 33962306a36Sopenharmony_ci irq_domain_remove(pmic->irq_domain); 34062306a36Sopenharmony_ci dev_err(&pdev->dev, "failed to add child devices: %d\n", ret); 34162306a36Sopenharmony_ci } 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci return ret; 34462306a36Sopenharmony_ci} 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic const struct of_device_id mt6397_of_match[] = { 34762306a36Sopenharmony_ci { 34862306a36Sopenharmony_ci .compatible = "mediatek,mt6323", 34962306a36Sopenharmony_ci .data = &mt6323_core, 35062306a36Sopenharmony_ci }, { 35162306a36Sopenharmony_ci .compatible = "mediatek,mt6331", 35262306a36Sopenharmony_ci .data = &mt6331_mt6332_core, 35362306a36Sopenharmony_ci }, { 35462306a36Sopenharmony_ci .compatible = "mediatek,mt6357", 35562306a36Sopenharmony_ci .data = &mt6357_core, 35662306a36Sopenharmony_ci }, { 35762306a36Sopenharmony_ci .compatible = "mediatek,mt6358", 35862306a36Sopenharmony_ci .data = &mt6358_core, 35962306a36Sopenharmony_ci }, { 36062306a36Sopenharmony_ci .compatible = "mediatek,mt6359", 36162306a36Sopenharmony_ci .data = &mt6359_core, 36262306a36Sopenharmony_ci }, { 36362306a36Sopenharmony_ci .compatible = "mediatek,mt6397", 36462306a36Sopenharmony_ci .data = &mt6397_core, 36562306a36Sopenharmony_ci }, { 36662306a36Sopenharmony_ci /* sentinel */ 36762306a36Sopenharmony_ci } 36862306a36Sopenharmony_ci}; 36962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, mt6397_of_match); 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic const struct platform_device_id mt6397_id[] = { 37262306a36Sopenharmony_ci { "mt6397", 0 }, 37362306a36Sopenharmony_ci { }, 37462306a36Sopenharmony_ci}; 37562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(platform, mt6397_id); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic struct platform_driver mt6397_driver = { 37862306a36Sopenharmony_ci .probe = mt6397_probe, 37962306a36Sopenharmony_ci .driver = { 38062306a36Sopenharmony_ci .name = "mt6397", 38162306a36Sopenharmony_ci .of_match_table = mt6397_of_match, 38262306a36Sopenharmony_ci }, 38362306a36Sopenharmony_ci .id_table = mt6397_id, 38462306a36Sopenharmony_ci}; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cimodule_platform_driver(mt6397_driver); 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ciMODULE_AUTHOR("Flora Fu, MediaTek"); 38962306a36Sopenharmony_ciMODULE_DESCRIPTION("Driver for MediaTek MT6397 PMIC"); 39062306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 391