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