1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2cfb61a41SCarlo Caione /*
34fd41151SChen-Yu Tsai * MFD core driver for the X-Powers' Power Management ICs
4cfb61a41SCarlo Caione *
5af7e9069SJacob Pan * AXP20x typically comprises an adaptive USB-Compatible PWM charger, BUCK DC-DC
6af7e9069SJacob Pan * converters, LDOs, multiple 12-bit ADCs of voltage, current and temperature
7af7e9069SJacob Pan * as well as configurable GPIOs.
8cfb61a41SCarlo Caione *
94fd41151SChen-Yu Tsai * This file contains the interface independent core functions.
104fd41151SChen-Yu Tsai *
11e740235dSChen-Yu Tsai * Copyright (C) 2014 Carlo Caione
12e740235dSChen-Yu Tsai *
13cfb61a41SCarlo Caione * Author: Carlo Caione <carlo@caione.org>
14cfb61a41SCarlo Caione */
15cfb61a41SCarlo Caione
16dcea4d5cSOlliver Schinagl #include <linux/acpi.h>
17dcea4d5cSOlliver Schinagl #include <linux/bitops.h>
18179dc63dSHans de Goede #include <linux/delay.h>
19dcea4d5cSOlliver Schinagl #include <linux/err.h>
20cfb61a41SCarlo Caione #include <linux/interrupt.h>
21cfb61a41SCarlo Caione #include <linux/kernel.h>
22dcea4d5cSOlliver Schinagl #include <linux/mfd/axp20x.h>
23dcea4d5cSOlliver Schinagl #include <linux/mfd/core.h>
24cfb61a41SCarlo Caione #include <linux/module.h>
25dcea4d5cSOlliver Schinagl #include <linux/of_device.h>
261b1305e9SSamuel Holland #include <linux/reboot.h>
27cfb61a41SCarlo Caione #include <linux/regmap.h>
28cfb61a41SCarlo Caione #include <linux/regulator/consumer.h>
29cfb61a41SCarlo Caione
3082b4d997SOlliver Schinagl #define AXP20X_OFF BIT(7)
31cfb61a41SCarlo Caione
32c0369698SRask Ingemann Lambertsen #define AXP806_REG_ADDR_EXT_ADDR_MASTER_MODE 0
33696f0b3fSChen-Yu Tsai #define AXP806_REG_ADDR_EXT_ADDR_SLAVE_MODE BIT(4)
34696f0b3fSChen-Yu Tsai
35c31e858bSKrzysztof Kozlowski static const char * const axp20x_model_names[] = {
36d8d79f8fSMichal Suchanek "AXP152",
3763eeabbcSAidan MacDonald "AXP192",
38af7e9069SJacob Pan "AXP202",
39af7e9069SJacob Pan "AXP209",
40f05be589SBoris BREZILLON "AXP221",
4102071f0fSChen-Yu Tsai "AXP223",
42af7e9069SJacob Pan "AXP288",
4375c8cb2fSMartin Botka "AXP313a",
441578353eSIcenowy Zheng "AXP803",
458824ee85SChen-Yu Tsai "AXP806",
4620147f0dSChen-Yu Tsai "AXP809",
477303733aSChen-Yu Tsai "AXP813",
48e0f8ad2aSShengyu Qu "AXP15060",
49af7e9069SJacob Pan };
50af7e9069SJacob Pan
51d8d79f8fSMichal Suchanek static const struct regmap_range axp152_writeable_ranges[] = {
52d8d79f8fSMichal Suchanek regmap_reg_range(AXP152_LDO3456_DC1234_CTRL, AXP152_IRQ3_STATE),
53d8d79f8fSMichal Suchanek regmap_reg_range(AXP152_DCDC_MODE, AXP152_PWM1_DUTY_CYCLE),
54d8d79f8fSMichal Suchanek };
55d8d79f8fSMichal Suchanek
56d8d79f8fSMichal Suchanek static const struct regmap_range axp152_volatile_ranges[] = {
57d8d79f8fSMichal Suchanek regmap_reg_range(AXP152_PWR_OP_MODE, AXP152_PWR_OP_MODE),
58d8d79f8fSMichal Suchanek regmap_reg_range(AXP152_IRQ1_EN, AXP152_IRQ3_STATE),
59d8d79f8fSMichal Suchanek regmap_reg_range(AXP152_GPIO_INPUT, AXP152_GPIO_INPUT),
60d8d79f8fSMichal Suchanek };
61d8d79f8fSMichal Suchanek
62d8d79f8fSMichal Suchanek static const struct regmap_access_table axp152_writeable_table = {
63d8d79f8fSMichal Suchanek .yes_ranges = axp152_writeable_ranges,
64d8d79f8fSMichal Suchanek .n_yes_ranges = ARRAY_SIZE(axp152_writeable_ranges),
65d8d79f8fSMichal Suchanek };
66d8d79f8fSMichal Suchanek
67d8d79f8fSMichal Suchanek static const struct regmap_access_table axp152_volatile_table = {
68d8d79f8fSMichal Suchanek .yes_ranges = axp152_volatile_ranges,
69d8d79f8fSMichal Suchanek .n_yes_ranges = ARRAY_SIZE(axp152_volatile_ranges),
70d8d79f8fSMichal Suchanek };
71d8d79f8fSMichal Suchanek
72cfb61a41SCarlo Caione static const struct regmap_range axp20x_writeable_ranges[] = {
73cfb61a41SCarlo Caione regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_IRQ5_STATE),
7497602370SQuentin Schulz regmap_reg_range(AXP20X_CHRG_CTRL1, AXP20X_CHRG_CTRL2),
75cfb61a41SCarlo Caione regmap_reg_range(AXP20X_DCDC_MODE, AXP20X_FG_RES),
76553ed4b5SBruno Prémont regmap_reg_range(AXP20X_RDC_H, AXP20X_OCV(AXP20X_OCV_MAX)),
77cfb61a41SCarlo Caione };
78cfb61a41SCarlo Caione
79cfb61a41SCarlo Caione static const struct regmap_range axp20x_volatile_ranges[] = {
80553ed4b5SBruno Prémont regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP20X_USB_OTG_STATUS),
81553ed4b5SBruno Prémont regmap_reg_range(AXP20X_CHRG_CTRL1, AXP20X_CHRG_CTRL2),
82cfb61a41SCarlo Caione regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IRQ5_STATE),
83553ed4b5SBruno Prémont regmap_reg_range(AXP20X_ACIN_V_ADC_H, AXP20X_IPSOUT_V_HIGH_L),
84553ed4b5SBruno Prémont regmap_reg_range(AXP20X_GPIO20_SS, AXP20X_GPIO3_CTRL),
85553ed4b5SBruno Prémont regmap_reg_range(AXP20X_FG_RES, AXP20X_RDC_L),
86cfb61a41SCarlo Caione };
87cfb61a41SCarlo Caione
88cfb61a41SCarlo Caione static const struct regmap_access_table axp20x_writeable_table = {
89cfb61a41SCarlo Caione .yes_ranges = axp20x_writeable_ranges,
90cfb61a41SCarlo Caione .n_yes_ranges = ARRAY_SIZE(axp20x_writeable_ranges),
91cfb61a41SCarlo Caione };
92cfb61a41SCarlo Caione
93cfb61a41SCarlo Caione static const struct regmap_access_table axp20x_volatile_table = {
94cfb61a41SCarlo Caione .yes_ranges = axp20x_volatile_ranges,
95cfb61a41SCarlo Caione .n_yes_ranges = ARRAY_SIZE(axp20x_volatile_ranges),
96cfb61a41SCarlo Caione };
97cfb61a41SCarlo Caione
9863eeabbcSAidan MacDonald static const struct regmap_range axp192_writeable_ranges[] = {
9963eeabbcSAidan MacDonald regmap_reg_range(AXP192_DATACACHE(0), AXP192_DATACACHE(5)),
10063eeabbcSAidan MacDonald regmap_reg_range(AXP192_PWR_OUT_CTRL, AXP192_IRQ5_STATE),
10163eeabbcSAidan MacDonald regmap_reg_range(AXP20X_DCDC_MODE, AXP192_N_RSTO_CTRL),
10263eeabbcSAidan MacDonald regmap_reg_range(AXP20X_CC_CTRL, AXP20X_CC_CTRL),
10363eeabbcSAidan MacDonald };
10463eeabbcSAidan MacDonald
10563eeabbcSAidan MacDonald static const struct regmap_range axp192_volatile_ranges[] = {
10663eeabbcSAidan MacDonald regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP192_USB_OTG_STATUS),
10763eeabbcSAidan MacDonald regmap_reg_range(AXP192_IRQ1_STATE, AXP192_IRQ4_STATE),
10863eeabbcSAidan MacDonald regmap_reg_range(AXP192_IRQ5_STATE, AXP192_IRQ5_STATE),
10963eeabbcSAidan MacDonald regmap_reg_range(AXP20X_ACIN_V_ADC_H, AXP20X_IPSOUT_V_HIGH_L),
11063eeabbcSAidan MacDonald regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL),
11163eeabbcSAidan MacDonald regmap_reg_range(AXP192_GPIO2_0_STATE, AXP192_GPIO2_0_STATE),
11263eeabbcSAidan MacDonald regmap_reg_range(AXP192_GPIO4_3_STATE, AXP192_GPIO4_3_STATE),
11363eeabbcSAidan MacDonald regmap_reg_range(AXP192_N_RSTO_CTRL, AXP192_N_RSTO_CTRL),
11463eeabbcSAidan MacDonald regmap_reg_range(AXP20X_CHRG_CC_31_24, AXP20X_CC_CTRL),
11563eeabbcSAidan MacDonald };
11663eeabbcSAidan MacDonald
11763eeabbcSAidan MacDonald static const struct regmap_access_table axp192_writeable_table = {
11863eeabbcSAidan MacDonald .yes_ranges = axp192_writeable_ranges,
11963eeabbcSAidan MacDonald .n_yes_ranges = ARRAY_SIZE(axp192_writeable_ranges),
12063eeabbcSAidan MacDonald };
12163eeabbcSAidan MacDonald
12263eeabbcSAidan MacDonald static const struct regmap_access_table axp192_volatile_table = {
12363eeabbcSAidan MacDonald .yes_ranges = axp192_volatile_ranges,
12463eeabbcSAidan MacDonald .n_yes_ranges = ARRAY_SIZE(axp192_volatile_ranges),
12563eeabbcSAidan MacDonald };
12663eeabbcSAidan MacDonald
12720147f0dSChen-Yu Tsai /* AXP22x ranges are shared with the AXP809, as they cover the same range */
128f05be589SBoris BREZILLON static const struct regmap_range axp22x_writeable_ranges[] = {
129f05be589SBoris BREZILLON regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_IRQ5_STATE),
13097602370SQuentin Schulz regmap_reg_range(AXP20X_CHRG_CTRL1, AXP22X_CHRG_CTRL3),
131f05be589SBoris BREZILLON regmap_reg_range(AXP20X_DCDC_MODE, AXP22X_BATLOW_THRES1),
132f05be589SBoris BREZILLON };
133f05be589SBoris BREZILLON
134f05be589SBoris BREZILLON static const struct regmap_range axp22x_volatile_ranges[] = {
13515093250SHans de Goede regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP20X_PWR_OP_MODE),
136f05be589SBoris BREZILLON regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IRQ5_STATE),
13715093250SHans de Goede regmap_reg_range(AXP22X_GPIO_STATE, AXP22X_GPIO_STATE),
138ed7311f0SQuentin Schulz regmap_reg_range(AXP22X_PMIC_TEMP_H, AXP20X_IPSOUT_V_HIGH_L),
13915093250SHans de Goede regmap_reg_range(AXP20X_FG_RES, AXP20X_FG_RES),
140f05be589SBoris BREZILLON };
141f05be589SBoris BREZILLON
142f05be589SBoris BREZILLON static const struct regmap_access_table axp22x_writeable_table = {
143f05be589SBoris BREZILLON .yes_ranges = axp22x_writeable_ranges,
144f05be589SBoris BREZILLON .n_yes_ranges = ARRAY_SIZE(axp22x_writeable_ranges),
145f05be589SBoris BREZILLON };
146f05be589SBoris BREZILLON
147f05be589SBoris BREZILLON static const struct regmap_access_table axp22x_volatile_table = {
148f05be589SBoris BREZILLON .yes_ranges = axp22x_volatile_ranges,
149f05be589SBoris BREZILLON .n_yes_ranges = ARRAY_SIZE(axp22x_volatile_ranges),
150f05be589SBoris BREZILLON };
151f05be589SBoris BREZILLON
1521578353eSIcenowy Zheng /* AXP288 ranges are shared with the AXP803, as they cover the same range */
153af7e9069SJacob Pan static const struct regmap_range axp288_writeable_ranges[] = {
1542405fbfbSHans de Goede regmap_reg_range(AXP288_POWER_REASON, AXP288_POWER_REASON),
155af7e9069SJacob Pan regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_IRQ6_STATE),
156af7e9069SJacob Pan regmap_reg_range(AXP20X_DCDC_MODE, AXP288_FG_TUNE5),
157af7e9069SJacob Pan };
158af7e9069SJacob Pan
159af7e9069SJacob Pan static const struct regmap_range axp288_volatile_ranges[] = {
160cd532166SHans de Goede regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP288_POWER_REASON),
161f949a9ebSHans de Goede regmap_reg_range(AXP22X_PWR_OUT_CTRL1, AXP22X_ALDO3_V_OUT),
162cd532166SHans de Goede regmap_reg_range(AXP288_BC_GLOBAL, AXP288_BC_GLOBAL),
163dc91c3b6SSamuel Holland regmap_reg_range(AXP288_BC_DET_STAT, AXP20X_VBUS_IPSOUT_MGMT),
1640c384fc8SHans de Goede regmap_reg_range(AXP20X_CHRG_BAK_CTRL, AXP20X_CHRG_BAK_CTRL),
165af7e9069SJacob Pan regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IPSOUT_V_HIGH_L),
166cd532166SHans de Goede regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL),
167f949a9ebSHans de Goede regmap_reg_range(AXP20X_GPIO1_CTRL, AXP22X_GPIO_STATE),
168cd532166SHans de Goede regmap_reg_range(AXP288_RT_BATT_V_H, AXP288_RT_BATT_V_L),
169cd532166SHans de Goede regmap_reg_range(AXP20X_FG_RES, AXP288_FG_CC_CAP_REG),
170af7e9069SJacob Pan };
171af7e9069SJacob Pan
172af7e9069SJacob Pan static const struct regmap_access_table axp288_writeable_table = {
173af7e9069SJacob Pan .yes_ranges = axp288_writeable_ranges,
174af7e9069SJacob Pan .n_yes_ranges = ARRAY_SIZE(axp288_writeable_ranges),
175af7e9069SJacob Pan };
176af7e9069SJacob Pan
177af7e9069SJacob Pan static const struct regmap_access_table axp288_volatile_table = {
178af7e9069SJacob Pan .yes_ranges = axp288_volatile_ranges,
179af7e9069SJacob Pan .n_yes_ranges = ARRAY_SIZE(axp288_volatile_ranges),
180af7e9069SJacob Pan };
181af7e9069SJacob Pan
1828824ee85SChen-Yu Tsai static const struct regmap_range axp806_writeable_ranges[] = {
1838824ee85SChen-Yu Tsai regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_DATACACHE(3)),
1848824ee85SChen-Yu Tsai regmap_reg_range(AXP806_PWR_OUT_CTRL1, AXP806_CLDO3_V_CTRL),
1858824ee85SChen-Yu Tsai regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IRQ2_EN),
1868824ee85SChen-Yu Tsai regmap_reg_range(AXP20X_IRQ1_STATE, AXP20X_IRQ2_STATE),
18734d9030bSChen-Yu Tsai regmap_reg_range(AXP806_REG_ADDR_EXT, AXP806_REG_ADDR_EXT),
1888824ee85SChen-Yu Tsai };
1898824ee85SChen-Yu Tsai
19075c8cb2fSMartin Botka static const struct regmap_range axp313a_writeable_ranges[] = {
19175c8cb2fSMartin Botka regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE),
19275c8cb2fSMartin Botka };
19375c8cb2fSMartin Botka
19475c8cb2fSMartin Botka static const struct regmap_range axp313a_volatile_ranges[] = {
19575c8cb2fSMartin Botka regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL),
19675c8cb2fSMartin Botka regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE),
19775c8cb2fSMartin Botka };
19875c8cb2fSMartin Botka
19975c8cb2fSMartin Botka static const struct regmap_access_table axp313a_writeable_table = {
20075c8cb2fSMartin Botka .yes_ranges = axp313a_writeable_ranges,
20175c8cb2fSMartin Botka .n_yes_ranges = ARRAY_SIZE(axp313a_writeable_ranges),
20275c8cb2fSMartin Botka };
20375c8cb2fSMartin Botka
20475c8cb2fSMartin Botka static const struct regmap_access_table axp313a_volatile_table = {
20575c8cb2fSMartin Botka .yes_ranges = axp313a_volatile_ranges,
20675c8cb2fSMartin Botka .n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges),
20775c8cb2fSMartin Botka };
20875c8cb2fSMartin Botka
2098824ee85SChen-Yu Tsai static const struct regmap_range axp806_volatile_ranges[] = {
2108824ee85SChen-Yu Tsai regmap_reg_range(AXP20X_IRQ1_STATE, AXP20X_IRQ2_STATE),
2118824ee85SChen-Yu Tsai };
2128824ee85SChen-Yu Tsai
2138824ee85SChen-Yu Tsai static const struct regmap_access_table axp806_writeable_table = {
2148824ee85SChen-Yu Tsai .yes_ranges = axp806_writeable_ranges,
2158824ee85SChen-Yu Tsai .n_yes_ranges = ARRAY_SIZE(axp806_writeable_ranges),
2168824ee85SChen-Yu Tsai };
2178824ee85SChen-Yu Tsai
2188824ee85SChen-Yu Tsai static const struct regmap_access_table axp806_volatile_table = {
2198824ee85SChen-Yu Tsai .yes_ranges = axp806_volatile_ranges,
2208824ee85SChen-Yu Tsai .n_yes_ranges = ARRAY_SIZE(axp806_volatile_ranges),
2218824ee85SChen-Yu Tsai };
2228824ee85SChen-Yu Tsai
223e0f8ad2aSShengyu Qu static const struct regmap_range axp15060_writeable_ranges[] = {
224e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_PWR_OUT_CTRL1, AXP15060_DCDC_MODE_CTRL2),
225e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_OUTPUT_MONITOR_DISCHARGE, AXP15060_CPUSLDO_V_CTRL),
226e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_PWR_WAKEUP_CTRL, AXP15060_PWR_DISABLE_DOWN_SEQ),
227e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_PEK_KEY, AXP15060_PEK_KEY),
228e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_IRQ1_EN, AXP15060_IRQ2_EN),
229e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_IRQ1_STATE, AXP15060_IRQ2_STATE),
230e0f8ad2aSShengyu Qu };
231e0f8ad2aSShengyu Qu
232e0f8ad2aSShengyu Qu static const struct regmap_range axp15060_volatile_ranges[] = {
233e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_STARTUP_SRC, AXP15060_STARTUP_SRC),
234e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_PWR_WAKEUP_CTRL, AXP15060_PWR_DISABLE_DOWN_SEQ),
235e0f8ad2aSShengyu Qu regmap_reg_range(AXP15060_IRQ1_STATE, AXP15060_IRQ2_STATE),
236e0f8ad2aSShengyu Qu };
237e0f8ad2aSShengyu Qu
238e0f8ad2aSShengyu Qu static const struct regmap_access_table axp15060_writeable_table = {
239e0f8ad2aSShengyu Qu .yes_ranges = axp15060_writeable_ranges,
240e0f8ad2aSShengyu Qu .n_yes_ranges = ARRAY_SIZE(axp15060_writeable_ranges),
241e0f8ad2aSShengyu Qu };
242e0f8ad2aSShengyu Qu
243e0f8ad2aSShengyu Qu static const struct regmap_access_table axp15060_volatile_table = {
244e0f8ad2aSShengyu Qu .yes_ranges = axp15060_volatile_ranges,
245e0f8ad2aSShengyu Qu .n_yes_ranges = ARRAY_SIZE(axp15060_volatile_ranges),
246e0f8ad2aSShengyu Qu };
247e0f8ad2aSShengyu Qu
248531a469eSChen-Yu Tsai static const struct resource axp152_pek_resources[] = {
249d8d79f8fSMichal Suchanek DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
250d8d79f8fSMichal Suchanek DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
251d8d79f8fSMichal Suchanek };
252d8d79f8fSMichal Suchanek
25363eeabbcSAidan MacDonald static const struct resource axp192_ac_power_supply_resources[] = {
25463eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
25563eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
25663eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
25763eeabbcSAidan MacDonald };
25863eeabbcSAidan MacDonald
25963eeabbcSAidan MacDonald static const struct resource axp192_usb_power_supply_resources[] = {
26063eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
26163eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
26263eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_VALID, "VBUS_VALID"),
26363eeabbcSAidan MacDonald DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_NOT_VALID, "VBUS_NOT_VALID"),
26463eeabbcSAidan MacDonald };
26563eeabbcSAidan MacDonald
266531a469eSChen-Yu Tsai static const struct resource axp20x_ac_power_supply_resources[] = {
267cd7cf27bSMichael Haas DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
268cd7cf27bSMichael Haas DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
269cd7cf27bSMichael Haas DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
270cd7cf27bSMichael Haas };
271cd7cf27bSMichael Haas
272531a469eSChen-Yu Tsai static const struct resource axp20x_pek_resources[] = {
273e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
274e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
275cfb61a41SCarlo Caione };
276cfb61a41SCarlo Caione
277531a469eSChen-Yu Tsai static const struct resource axp20x_usb_power_supply_resources[] = {
2788de4efdaSHans de Goede DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
2798de4efdaSHans de Goede DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
2808de4efdaSHans de Goede DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_VALID, "VBUS_VALID"),
2818de4efdaSHans de Goede DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_VBUS_NOT_VALID, "VBUS_NOT_VALID"),
2828de4efdaSHans de Goede };
2838de4efdaSHans de Goede
284531a469eSChen-Yu Tsai static const struct resource axp22x_usb_power_supply_resources[] = {
285ecd98cceSHans de Goede DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
286ecd98cceSHans de Goede DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
287ecd98cceSHans de Goede };
288ecd98cceSHans de Goede
289129fc677SQuentin Schulz /* AXP803 and AXP813/AXP818 share the same interrupts */
290129fc677SQuentin Schulz static const struct resource axp803_usb_power_supply_resources[] = {
291129fc677SQuentin Schulz DEFINE_RES_IRQ_NAMED(AXP803_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
292129fc677SQuentin Schulz DEFINE_RES_IRQ_NAMED(AXP803_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
293129fc677SQuentin Schulz };
294129fc677SQuentin Schulz
295531a469eSChen-Yu Tsai static const struct resource axp22x_pek_resources[] = {
296e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
297e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP22X_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
298f05be589SBoris BREZILLON };
299f05be589SBoris BREZILLON
300531a469eSChen-Yu Tsai static const struct resource axp288_power_button_resources[] = {
301e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP288_IRQ_POKP, "PEK_DBR"),
302e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP288_IRQ_POKN, "PEK_DBF"),
303e56e5ad6SBorun Fu };
304e56e5ad6SBorun Fu
305531a469eSChen-Yu Tsai static const struct resource axp288_fuel_gauge_resources[] = {
306e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_QWBTU),
307e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_WBTU),
308e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_QWBTO),
309e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_WBTO),
310e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_WL2),
311e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_WL1),
312af7e9069SJacob Pan };
313af7e9069SJacob Pan
31475c8cb2fSMartin Botka static const struct resource axp313a_pek_resources[] = {
31575c8cb2fSMartin Botka DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
31675c8cb2fSMartin Botka DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
31775c8cb2fSMartin Botka };
31875c8cb2fSMartin Botka
319531a469eSChen-Yu Tsai static const struct resource axp803_pek_resources[] = {
320e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
321e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
3221578353eSIcenowy Zheng };
3231578353eSIcenowy Zheng
32406f49010SChen-Yu Tsai static const struct resource axp806_pek_resources[] = {
32506f49010SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP806_IRQ_POK_RISE, "PEK_DBR"),
32606f49010SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP806_IRQ_POK_FALL, "PEK_DBF"),
32706f49010SChen-Yu Tsai };
32806f49010SChen-Yu Tsai
329531a469eSChen-Yu Tsai static const struct resource axp809_pek_resources[] = {
330e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP809_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
331e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP809_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
33220147f0dSChen-Yu Tsai };
33320147f0dSChen-Yu Tsai
334e0f8ad2aSShengyu Qu static const struct resource axp15060_pek_resources[] = {
335e0f8ad2aSShengyu Qu DEFINE_RES_IRQ_NAMED(AXP15060_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
336e0f8ad2aSShengyu Qu DEFINE_RES_IRQ_NAMED(AXP15060_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
337e0f8ad2aSShengyu Qu };
338e0f8ad2aSShengyu Qu
339d8d79f8fSMichal Suchanek static const struct regmap_config axp152_regmap_config = {
340d8d79f8fSMichal Suchanek .reg_bits = 8,
341d8d79f8fSMichal Suchanek .val_bits = 8,
342d8d79f8fSMichal Suchanek .wr_table = &axp152_writeable_table,
343d8d79f8fSMichal Suchanek .volatile_table = &axp152_volatile_table,
344d8d79f8fSMichal Suchanek .max_register = AXP152_PWM1_DUTY_CYCLE,
345*cdc707f7SMark Brown .cache_type = REGCACHE_MAPLE,
346d8d79f8fSMichal Suchanek };
347d8d79f8fSMichal Suchanek
34863eeabbcSAidan MacDonald static const struct regmap_config axp192_regmap_config = {
34963eeabbcSAidan MacDonald .reg_bits = 8,
35063eeabbcSAidan MacDonald .val_bits = 8,
35163eeabbcSAidan MacDonald .wr_table = &axp192_writeable_table,
35263eeabbcSAidan MacDonald .volatile_table = &axp192_volatile_table,
35363eeabbcSAidan MacDonald .max_register = AXP20X_CC_CTRL,
35463eeabbcSAidan MacDonald .cache_type = REGCACHE_RBTREE,
35563eeabbcSAidan MacDonald };
35663eeabbcSAidan MacDonald
357cfb61a41SCarlo Caione static const struct regmap_config axp20x_regmap_config = {
358cfb61a41SCarlo Caione .reg_bits = 8,
359cfb61a41SCarlo Caione .val_bits = 8,
360cfb61a41SCarlo Caione .wr_table = &axp20x_writeable_table,
361cfb61a41SCarlo Caione .volatile_table = &axp20x_volatile_table,
362553ed4b5SBruno Prémont .max_register = AXP20X_OCV(AXP20X_OCV_MAX),
363*cdc707f7SMark Brown .cache_type = REGCACHE_MAPLE,
364cfb61a41SCarlo Caione };
365cfb61a41SCarlo Caione
366f05be589SBoris BREZILLON static const struct regmap_config axp22x_regmap_config = {
367f05be589SBoris BREZILLON .reg_bits = 8,
368f05be589SBoris BREZILLON .val_bits = 8,
369f05be589SBoris BREZILLON .wr_table = &axp22x_writeable_table,
370f05be589SBoris BREZILLON .volatile_table = &axp22x_volatile_table,
371f05be589SBoris BREZILLON .max_register = AXP22X_BATLOW_THRES1,
372*cdc707f7SMark Brown .cache_type = REGCACHE_MAPLE,
373f05be589SBoris BREZILLON };
374f05be589SBoris BREZILLON
375af7e9069SJacob Pan static const struct regmap_config axp288_regmap_config = {
376af7e9069SJacob Pan .reg_bits = 8,
377af7e9069SJacob Pan .val_bits = 8,
378af7e9069SJacob Pan .wr_table = &axp288_writeable_table,
379af7e9069SJacob Pan .volatile_table = &axp288_volatile_table,
380af7e9069SJacob Pan .max_register = AXP288_FG_TUNE5,
381*cdc707f7SMark Brown .cache_type = REGCACHE_MAPLE,
382af7e9069SJacob Pan };
383af7e9069SJacob Pan
38475c8cb2fSMartin Botka static const struct regmap_config axp313a_regmap_config = {
38575c8cb2fSMartin Botka .reg_bits = 8,
38675c8cb2fSMartin Botka .val_bits = 8,
38775c8cb2fSMartin Botka .wr_table = &axp313a_writeable_table,
38875c8cb2fSMartin Botka .volatile_table = &axp313a_volatile_table,
38975c8cb2fSMartin Botka .max_register = AXP313A_IRQ_STATE,
39075c8cb2fSMartin Botka .cache_type = REGCACHE_RBTREE,
39175c8cb2fSMartin Botka };
39275c8cb2fSMartin Botka
3938824ee85SChen-Yu Tsai static const struct regmap_config axp806_regmap_config = {
3948824ee85SChen-Yu Tsai .reg_bits = 8,
3958824ee85SChen-Yu Tsai .val_bits = 8,
3968824ee85SChen-Yu Tsai .wr_table = &axp806_writeable_table,
3978824ee85SChen-Yu Tsai .volatile_table = &axp806_volatile_table,
39834d9030bSChen-Yu Tsai .max_register = AXP806_REG_ADDR_EXT,
399*cdc707f7SMark Brown .cache_type = REGCACHE_MAPLE,
4008824ee85SChen-Yu Tsai };
4018824ee85SChen-Yu Tsai
402e0f8ad2aSShengyu Qu static const struct regmap_config axp15060_regmap_config = {
403e0f8ad2aSShengyu Qu .reg_bits = 8,
404e0f8ad2aSShengyu Qu .val_bits = 8,
405e0f8ad2aSShengyu Qu .wr_table = &axp15060_writeable_table,
406e0f8ad2aSShengyu Qu .volatile_table = &axp15060_volatile_table,
407e0f8ad2aSShengyu Qu .max_register = AXP15060_IRQ2_STATE,
408*cdc707f7SMark Brown .cache_type = REGCACHE_MAPLE,
409e0f8ad2aSShengyu Qu };
410e0f8ad2aSShengyu Qu
411af7e9069SJacob Pan #define INIT_REGMAP_IRQ(_variant, _irq, _off, _mask) \
412af7e9069SJacob Pan [_variant##_IRQ_##_irq] = { .reg_offset = (_off), .mask = BIT(_mask) }
413cfb61a41SCarlo Caione
414d8d79f8fSMichal Suchanek static const struct regmap_irq axp152_regmap_irqs[] = {
415d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, LDO0IN_CONNECT, 0, 6),
416d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, LDO0IN_REMOVAL, 0, 5),
417d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, ALDO0IN_CONNECT, 0, 3),
418d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, ALDO0IN_REMOVAL, 0, 2),
419d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, DCDC1_V_LOW, 1, 5),
420d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, DCDC2_V_LOW, 1, 4),
421d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, DCDC3_V_LOW, 1, 3),
422d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, DCDC4_V_LOW, 1, 2),
423d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, PEK_SHORT, 1, 1),
424d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, PEK_LONG, 1, 0),
425d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, TIMER, 2, 7),
426d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, PEK_RIS_EDGE, 2, 6),
427d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, PEK_FAL_EDGE, 2, 5),
428d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, GPIO3_INPUT, 2, 3),
429d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, GPIO2_INPUT, 2, 2),
430d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, GPIO1_INPUT, 2, 1),
431d8d79f8fSMichal Suchanek INIT_REGMAP_IRQ(AXP152, GPIO0_INPUT, 2, 0),
432d8d79f8fSMichal Suchanek };
433d8d79f8fSMichal Suchanek
43463eeabbcSAidan MacDonald static const struct regmap_irq axp192_regmap_irqs[] = {
43563eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, ACIN_OVER_V, 0, 7),
43663eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, ACIN_PLUGIN, 0, 6),
43763eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, ACIN_REMOVAL, 0, 5),
43863eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_OVER_V, 0, 4),
43963eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_PLUGIN, 0, 3),
44063eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_REMOVAL, 0, 2),
44163eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_V_LOW, 0, 1),
44263eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, BATT_PLUGIN, 1, 7),
44363eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, BATT_REMOVAL, 1, 6),
44463eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, BATT_ENT_ACT_MODE, 1, 5),
44563eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, BATT_EXIT_ACT_MODE, 1, 4),
44663eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, CHARG, 1, 3),
44763eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, CHARG_DONE, 1, 2),
44863eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, BATT_TEMP_HIGH, 1, 1),
44963eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, BATT_TEMP_LOW, 1, 0),
45063eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, DIE_TEMP_HIGH, 2, 7),
45163eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, CHARG_I_LOW, 2, 6),
45263eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, DCDC1_V_LONG, 2, 5),
45363eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, DCDC2_V_LONG, 2, 4),
45463eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, DCDC3_V_LONG, 2, 3),
45563eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, PEK_SHORT, 2, 1),
45663eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, PEK_LONG, 2, 0),
45763eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, N_OE_PWR_ON, 3, 7),
45863eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, N_OE_PWR_OFF, 3, 6),
45963eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_VALID, 3, 5),
46063eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_NOT_VALID, 3, 4),
46163eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_SESS_VALID, 3, 3),
46263eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, VBUS_SESS_END, 3, 2),
46363eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, LOW_PWR_LVL, 3, 0),
46463eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, TIMER, 4, 7),
46563eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, GPIO2_INPUT, 4, 2),
46663eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, GPIO1_INPUT, 4, 1),
46763eeabbcSAidan MacDonald INIT_REGMAP_IRQ(AXP192, GPIO0_INPUT, 4, 0),
46863eeabbcSAidan MacDonald };
46963eeabbcSAidan MacDonald
470cfb61a41SCarlo Caione static const struct regmap_irq axp20x_regmap_irqs[] = {
471af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, ACIN_OVER_V, 0, 7),
472af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, ACIN_PLUGIN, 0, 6),
473af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, ACIN_REMOVAL, 0, 5),
474af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_OVER_V, 0, 4),
475af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_PLUGIN, 0, 3),
476af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_REMOVAL, 0, 2),
477af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_V_LOW, 0, 1),
478af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, BATT_PLUGIN, 1, 7),
479af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, BATT_REMOVAL, 1, 6),
480af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, BATT_ENT_ACT_MODE, 1, 5),
481af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, BATT_EXIT_ACT_MODE, 1, 4),
482af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, CHARG, 1, 3),
483af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, CHARG_DONE, 1, 2),
484af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, BATT_TEMP_HIGH, 1, 1),
485af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, BATT_TEMP_LOW, 1, 0),
486af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, DIE_TEMP_HIGH, 2, 7),
487af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, CHARG_I_LOW, 2, 6),
488af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, DCDC1_V_LONG, 2, 5),
489af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, DCDC2_V_LONG, 2, 4),
490af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, DCDC3_V_LONG, 2, 3),
491af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, PEK_SHORT, 2, 1),
492af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, PEK_LONG, 2, 0),
493af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, N_OE_PWR_ON, 3, 7),
494af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, N_OE_PWR_OFF, 3, 6),
495af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_VALID, 3, 5),
496af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_NOT_VALID, 3, 4),
497af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_SESS_VALID, 3, 3),
498af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, VBUS_SESS_END, 3, 2),
499af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, LOW_PWR_LVL1, 3, 1),
500af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, LOW_PWR_LVL2, 3, 0),
501af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, TIMER, 4, 7),
502af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, PEK_RIS_EDGE, 4, 6),
503af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, PEK_FAL_EDGE, 4, 5),
504af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, GPIO3_INPUT, 4, 3),
505af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, GPIO2_INPUT, 4, 2),
506af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, GPIO1_INPUT, 4, 1),
507af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP20X, GPIO0_INPUT, 4, 0),
508af7e9069SJacob Pan };
509af7e9069SJacob Pan
510f05be589SBoris BREZILLON static const struct regmap_irq axp22x_regmap_irqs[] = {
511f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, ACIN_OVER_V, 0, 7),
512f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, ACIN_PLUGIN, 0, 6),
513f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, ACIN_REMOVAL, 0, 5),
514f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, VBUS_OVER_V, 0, 4),
515f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, VBUS_PLUGIN, 0, 3),
516f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, VBUS_REMOVAL, 0, 2),
517f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, VBUS_V_LOW, 0, 1),
518f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, BATT_PLUGIN, 1, 7),
519f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, BATT_REMOVAL, 1, 6),
520f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, BATT_ENT_ACT_MODE, 1, 5),
521f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, BATT_EXIT_ACT_MODE, 1, 4),
522f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, CHARG, 1, 3),
523f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, CHARG_DONE, 1, 2),
524f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, BATT_TEMP_HIGH, 1, 1),
525f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, BATT_TEMP_LOW, 1, 0),
526f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, DIE_TEMP_HIGH, 2, 7),
527f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, PEK_SHORT, 2, 1),
528f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, PEK_LONG, 2, 0),
529f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, LOW_PWR_LVL1, 3, 1),
530f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, LOW_PWR_LVL2, 3, 0),
531f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, TIMER, 4, 7),
532f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, PEK_RIS_EDGE, 4, 6),
533f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, PEK_FAL_EDGE, 4, 5),
534f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, GPIO1_INPUT, 4, 1),
535f05be589SBoris BREZILLON INIT_REGMAP_IRQ(AXP22X, GPIO0_INPUT, 4, 0),
536f05be589SBoris BREZILLON };
537f05be589SBoris BREZILLON
538af7e9069SJacob Pan /* some IRQs are compatible with axp20x models */
539af7e9069SJacob Pan static const struct regmap_irq axp288_regmap_irqs[] = {
540ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, VBUS_FALL, 0, 2),
541ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, VBUS_RISE, 0, 3),
542ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, OV, 0, 4),
5438b44e678SHans de Goede INIT_REGMAP_IRQ(AXP288, FALLING_ALT, 0, 5),
5448b44e678SHans de Goede INIT_REGMAP_IRQ(AXP288, RISING_ALT, 0, 6),
5458b44e678SHans de Goede INIT_REGMAP_IRQ(AXP288, OV_ALT, 0, 7),
546af7e9069SJacob Pan
547ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, DONE, 1, 2),
548ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, CHARGING, 1, 3),
549af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, SAFE_QUIT, 1, 4),
550af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, SAFE_ENTER, 1, 5),
551ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, ABSENT, 1, 6),
552ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, APPEND, 1, 7),
553af7e9069SJacob Pan
554af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, QWBTU, 2, 0),
555af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, WBTU, 2, 1),
556af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, QWBTO, 2, 2),
557ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, WBTO, 2, 3),
558af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, QCBTU, 2, 4),
559af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, CBTU, 2, 5),
560af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, QCBTO, 2, 6),
561af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, CBTO, 2, 7),
562af7e9069SJacob Pan
563af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, WL2, 3, 0),
564af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, WL1, 3, 1),
565af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, GPADC, 3, 2),
566af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, OT, 3, 7),
567af7e9069SJacob Pan
568af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, GPIO0, 4, 0),
569af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, GPIO1, 4, 1),
570af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, POKO, 4, 2),
571af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, POKL, 4, 3),
572af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, POKS, 4, 4),
573af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, POKN, 4, 5),
574af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, POKP, 4, 6),
575ff3bbc5cSJacob Pan INIT_REGMAP_IRQ(AXP288, TIMER, 4, 7),
576af7e9069SJacob Pan
577af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, MV_CHNG, 5, 0),
578af7e9069SJacob Pan INIT_REGMAP_IRQ(AXP288, BC_USB_CHNG, 5, 1),
579cfb61a41SCarlo Caione };
580cfb61a41SCarlo Caione
58175c8cb2fSMartin Botka static const struct regmap_irq axp313a_regmap_irqs[] = {
58275c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, PEK_RIS_EDGE, 0, 7),
58375c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, PEK_FAL_EDGE, 0, 6),
58475c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, PEK_SHORT, 0, 5),
58575c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, PEK_LONG, 0, 4),
58675c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, DCDC3_V_LOW, 0, 3),
58775c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, DCDC2_V_LOW, 0, 2),
58875c8cb2fSMartin Botka INIT_REGMAP_IRQ(AXP313A, DIE_TEMP_HIGH, 0, 0),
58975c8cb2fSMartin Botka };
59075c8cb2fSMartin Botka
5911578353eSIcenowy Zheng static const struct regmap_irq axp803_regmap_irqs[] = {
5921578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, ACIN_OVER_V, 0, 7),
5931578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, ACIN_PLUGIN, 0, 6),
5941578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, ACIN_REMOVAL, 0, 5),
5951578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, VBUS_OVER_V, 0, 4),
5961578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, VBUS_PLUGIN, 0, 3),
5971578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, VBUS_REMOVAL, 0, 2),
5981578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_PLUGIN, 1, 7),
5991578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_REMOVAL, 1, 6),
6001578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_ENT_ACT_MODE, 1, 5),
6011578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_EXIT_ACT_MODE, 1, 4),
6021578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, CHARG, 1, 3),
6031578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, CHARG_DONE, 1, 2),
6041578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_CHG_TEMP_HIGH, 2, 7),
6051578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_CHG_TEMP_HIGH_END, 2, 6),
6061578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_CHG_TEMP_LOW, 2, 5),
6071578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_CHG_TEMP_LOW_END, 2, 4),
6081578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_ACT_TEMP_HIGH, 2, 3),
6091578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_ACT_TEMP_HIGH_END, 2, 2),
6101578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_ACT_TEMP_LOW, 2, 1),
6111578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BATT_ACT_TEMP_LOW_END, 2, 0),
6121578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, DIE_TEMP_HIGH, 3, 7),
6131578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, GPADC, 3, 2),
6141578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, LOW_PWR_LVL1, 3, 1),
6151578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, LOW_PWR_LVL2, 3, 0),
6161578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, TIMER, 4, 7),
6171578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, PEK_RIS_EDGE, 4, 6),
6181578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, PEK_FAL_EDGE, 4, 5),
6191578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, PEK_SHORT, 4, 4),
6201578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, PEK_LONG, 4, 3),
6211578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, PEK_OVER_OFF, 4, 2),
6221578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, GPIO1_INPUT, 4, 1),
6231578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, GPIO0_INPUT, 4, 0),
6241578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, BC_USB_CHNG, 5, 1),
6251578353eSIcenowy Zheng INIT_REGMAP_IRQ(AXP803, MV_CHNG, 5, 0),
6261578353eSIcenowy Zheng };
6271578353eSIcenowy Zheng
6288824ee85SChen-Yu Tsai static const struct regmap_irq axp806_regmap_irqs[] = {
6298824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DIE_TEMP_HIGH_LV1, 0, 0),
6308824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DIE_TEMP_HIGH_LV2, 0, 1),
6318824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DCDCA_V_LOW, 0, 3),
6328824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DCDCB_V_LOW, 0, 4),
6338824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DCDCC_V_LOW, 0, 5),
6348824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DCDCD_V_LOW, 0, 6),
6358824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, DCDCE_V_LOW, 0, 7),
636eef2b53aSChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, POK_LONG, 1, 0),
637eef2b53aSChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, POK_SHORT, 1, 1),
6388824ee85SChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, WAKEUP, 1, 4),
639eef2b53aSChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, POK_FALL, 1, 5),
640eef2b53aSChen-Yu Tsai INIT_REGMAP_IRQ(AXP806, POK_RISE, 1, 6),
6418824ee85SChen-Yu Tsai };
6428824ee85SChen-Yu Tsai
64320147f0dSChen-Yu Tsai static const struct regmap_irq axp809_regmap_irqs[] = {
64420147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, ACIN_OVER_V, 0, 7),
64520147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, ACIN_PLUGIN, 0, 6),
64620147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, ACIN_REMOVAL, 0, 5),
64720147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, VBUS_OVER_V, 0, 4),
64820147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, VBUS_PLUGIN, 0, 3),
64920147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, VBUS_REMOVAL, 0, 2),
65020147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, VBUS_V_LOW, 0, 1),
65120147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_PLUGIN, 1, 7),
65220147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_REMOVAL, 1, 6),
65320147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_ENT_ACT_MODE, 1, 5),
65420147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_EXIT_ACT_MODE, 1, 4),
65520147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, CHARG, 1, 3),
65620147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, CHARG_DONE, 1, 2),
65720147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_HIGH, 2, 7),
65820147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_HIGH_END, 2, 6),
65920147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_LOW, 2, 5),
66020147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_CHG_TEMP_LOW_END, 2, 4),
66120147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_HIGH, 2, 3),
66220147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_HIGH_END, 2, 2),
66320147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_LOW, 2, 1),
66420147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, BATT_ACT_TEMP_LOW_END, 2, 0),
66520147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, DIE_TEMP_HIGH, 3, 7),
66620147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, LOW_PWR_LVL1, 3, 1),
66720147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, LOW_PWR_LVL2, 3, 0),
66820147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, TIMER, 4, 7),
66920147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, PEK_RIS_EDGE, 4, 6),
67020147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, PEK_FAL_EDGE, 4, 5),
67120147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, PEK_SHORT, 4, 4),
67220147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, PEK_LONG, 4, 3),
67320147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, PEK_OVER_OFF, 4, 2),
67420147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, GPIO1_INPUT, 4, 1),
67520147f0dSChen-Yu Tsai INIT_REGMAP_IRQ(AXP809, GPIO0_INPUT, 4, 0),
67620147f0dSChen-Yu Tsai };
67720147f0dSChen-Yu Tsai
678e0f8ad2aSShengyu Qu static const struct regmap_irq axp15060_regmap_irqs[] = {
679e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DIE_TEMP_HIGH_LV1, 0, 0),
680e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DIE_TEMP_HIGH_LV2, 0, 1),
681e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DCDC1_V_LOW, 0, 2),
682e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DCDC2_V_LOW, 0, 3),
683e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DCDC3_V_LOW, 0, 4),
684e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DCDC4_V_LOW, 0, 5),
685e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DCDC5_V_LOW, 0, 6),
686e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, DCDC6_V_LOW, 0, 7),
687e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, PEK_LONG, 1, 0),
688e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, PEK_SHORT, 1, 1),
689e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, GPIO1_INPUT, 1, 2),
690e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, PEK_FAL_EDGE, 1, 3),
691e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, PEK_RIS_EDGE, 1, 4),
692e0f8ad2aSShengyu Qu INIT_REGMAP_IRQ(AXP15060, GPIO2_INPUT, 1, 5),
693e0f8ad2aSShengyu Qu };
694e0f8ad2aSShengyu Qu
695d8d79f8fSMichal Suchanek static const struct regmap_irq_chip axp152_regmap_irq_chip = {
696d8d79f8fSMichal Suchanek .name = "axp152_irq_chip",
697d8d79f8fSMichal Suchanek .status_base = AXP152_IRQ1_STATE,
698d8d79f8fSMichal Suchanek .ack_base = AXP152_IRQ1_STATE,
699acc247b2SAidan MacDonald .unmask_base = AXP152_IRQ1_EN,
700d8d79f8fSMichal Suchanek .init_ack_masked = true,
701d8d79f8fSMichal Suchanek .irqs = axp152_regmap_irqs,
702d8d79f8fSMichal Suchanek .num_irqs = ARRAY_SIZE(axp152_regmap_irqs),
703d8d79f8fSMichal Suchanek .num_regs = 3,
704d8d79f8fSMichal Suchanek };
705d8d79f8fSMichal Suchanek
axp192_get_irq_reg(struct regmap_irq_chip_data * data,unsigned int base,int index)70663eeabbcSAidan MacDonald static unsigned int axp192_get_irq_reg(struct regmap_irq_chip_data *data,
70763eeabbcSAidan MacDonald unsigned int base, int index)
70863eeabbcSAidan MacDonald {
70963eeabbcSAidan MacDonald /* linear mapping for IRQ1 to IRQ4 */
71063eeabbcSAidan MacDonald if (index < 4)
71163eeabbcSAidan MacDonald return base + index;
71263eeabbcSAidan MacDonald
71363eeabbcSAidan MacDonald /* handle IRQ5 separately */
71463eeabbcSAidan MacDonald if (base == AXP192_IRQ1_EN)
71563eeabbcSAidan MacDonald return AXP192_IRQ5_EN;
71663eeabbcSAidan MacDonald
71763eeabbcSAidan MacDonald return AXP192_IRQ5_STATE;
71863eeabbcSAidan MacDonald }
71963eeabbcSAidan MacDonald
72063eeabbcSAidan MacDonald static const struct regmap_irq_chip axp192_regmap_irq_chip = {
72163eeabbcSAidan MacDonald .name = "axp192_irq_chip",
72263eeabbcSAidan MacDonald .status_base = AXP192_IRQ1_STATE,
72363eeabbcSAidan MacDonald .ack_base = AXP192_IRQ1_STATE,
72463eeabbcSAidan MacDonald .unmask_base = AXP192_IRQ1_EN,
72563eeabbcSAidan MacDonald .init_ack_masked = true,
72663eeabbcSAidan MacDonald .irqs = axp192_regmap_irqs,
72763eeabbcSAidan MacDonald .num_irqs = ARRAY_SIZE(axp192_regmap_irqs),
72863eeabbcSAidan MacDonald .num_regs = 5,
72963eeabbcSAidan MacDonald .get_irq_reg = axp192_get_irq_reg,
73063eeabbcSAidan MacDonald };
73163eeabbcSAidan MacDonald
732cfb61a41SCarlo Caione static const struct regmap_irq_chip axp20x_regmap_irq_chip = {
733cfb61a41SCarlo Caione .name = "axp20x_irq_chip",
734cfb61a41SCarlo Caione .status_base = AXP20X_IRQ1_STATE,
735cfb61a41SCarlo Caione .ack_base = AXP20X_IRQ1_STATE,
736acc247b2SAidan MacDonald .unmask_base = AXP20X_IRQ1_EN,
737cfb61a41SCarlo Caione .init_ack_masked = true,
738af7e9069SJacob Pan .irqs = axp20x_regmap_irqs,
739af7e9069SJacob Pan .num_irqs = ARRAY_SIZE(axp20x_regmap_irqs),
740af7e9069SJacob Pan .num_regs = 5,
741af7e9069SJacob Pan
742af7e9069SJacob Pan };
743af7e9069SJacob Pan
744f05be589SBoris BREZILLON static const struct regmap_irq_chip axp22x_regmap_irq_chip = {
745f05be589SBoris BREZILLON .name = "axp22x_irq_chip",
746f05be589SBoris BREZILLON .status_base = AXP20X_IRQ1_STATE,
747f05be589SBoris BREZILLON .ack_base = AXP20X_IRQ1_STATE,
748acc247b2SAidan MacDonald .unmask_base = AXP20X_IRQ1_EN,
749f05be589SBoris BREZILLON .init_ack_masked = true,
750f05be589SBoris BREZILLON .irqs = axp22x_regmap_irqs,
751f05be589SBoris BREZILLON .num_irqs = ARRAY_SIZE(axp22x_regmap_irqs),
752f05be589SBoris BREZILLON .num_regs = 5,
753f05be589SBoris BREZILLON };
754f05be589SBoris BREZILLON
755af7e9069SJacob Pan static const struct regmap_irq_chip axp288_regmap_irq_chip = {
756af7e9069SJacob Pan .name = "axp288_irq_chip",
757af7e9069SJacob Pan .status_base = AXP20X_IRQ1_STATE,
758af7e9069SJacob Pan .ack_base = AXP20X_IRQ1_STATE,
759acc247b2SAidan MacDonald .unmask_base = AXP20X_IRQ1_EN,
760af7e9069SJacob Pan .init_ack_masked = true,
761af7e9069SJacob Pan .irqs = axp288_regmap_irqs,
762af7e9069SJacob Pan .num_irqs = ARRAY_SIZE(axp288_regmap_irqs),
763af7e9069SJacob Pan .num_regs = 6,
764af7e9069SJacob Pan
765cfb61a41SCarlo Caione };
766cfb61a41SCarlo Caione
76775c8cb2fSMartin Botka static const struct regmap_irq_chip axp313a_regmap_irq_chip = {
76875c8cb2fSMartin Botka .name = "axp313a_irq_chip",
76975c8cb2fSMartin Botka .status_base = AXP313A_IRQ_STATE,
77075c8cb2fSMartin Botka .ack_base = AXP313A_IRQ_STATE,
77175c8cb2fSMartin Botka .unmask_base = AXP313A_IRQ_EN,
77275c8cb2fSMartin Botka .init_ack_masked = true,
77375c8cb2fSMartin Botka .irqs = axp313a_regmap_irqs,
77475c8cb2fSMartin Botka .num_irqs = ARRAY_SIZE(axp313a_regmap_irqs),
77575c8cb2fSMartin Botka .num_regs = 1,
77675c8cb2fSMartin Botka };
77775c8cb2fSMartin Botka
7781578353eSIcenowy Zheng static const struct regmap_irq_chip axp803_regmap_irq_chip = {
7791578353eSIcenowy Zheng .name = "axp803",
7801578353eSIcenowy Zheng .status_base = AXP20X_IRQ1_STATE,
7811578353eSIcenowy Zheng .ack_base = AXP20X_IRQ1_STATE,
782acc247b2SAidan MacDonald .unmask_base = AXP20X_IRQ1_EN,
7831578353eSIcenowy Zheng .init_ack_masked = true,
7841578353eSIcenowy Zheng .irqs = axp803_regmap_irqs,
7851578353eSIcenowy Zheng .num_irqs = ARRAY_SIZE(axp803_regmap_irqs),
7861578353eSIcenowy Zheng .num_regs = 6,
7871578353eSIcenowy Zheng };
7881578353eSIcenowy Zheng
7898824ee85SChen-Yu Tsai static const struct regmap_irq_chip axp806_regmap_irq_chip = {
7908824ee85SChen-Yu Tsai .name = "axp806",
7918824ee85SChen-Yu Tsai .status_base = AXP20X_IRQ1_STATE,
7928824ee85SChen-Yu Tsai .ack_base = AXP20X_IRQ1_STATE,
793acc247b2SAidan MacDonald .unmask_base = AXP20X_IRQ1_EN,
7948824ee85SChen-Yu Tsai .init_ack_masked = true,
7958824ee85SChen-Yu Tsai .irqs = axp806_regmap_irqs,
7968824ee85SChen-Yu Tsai .num_irqs = ARRAY_SIZE(axp806_regmap_irqs),
7978824ee85SChen-Yu Tsai .num_regs = 2,
7988824ee85SChen-Yu Tsai };
7998824ee85SChen-Yu Tsai
80020147f0dSChen-Yu Tsai static const struct regmap_irq_chip axp809_regmap_irq_chip = {
80120147f0dSChen-Yu Tsai .name = "axp809",
80220147f0dSChen-Yu Tsai .status_base = AXP20X_IRQ1_STATE,
80320147f0dSChen-Yu Tsai .ack_base = AXP20X_IRQ1_STATE,
804acc247b2SAidan MacDonald .unmask_base = AXP20X_IRQ1_EN,
80520147f0dSChen-Yu Tsai .init_ack_masked = true,
80620147f0dSChen-Yu Tsai .irqs = axp809_regmap_irqs,
80720147f0dSChen-Yu Tsai .num_irqs = ARRAY_SIZE(axp809_regmap_irqs),
80820147f0dSChen-Yu Tsai .num_regs = 5,
80920147f0dSChen-Yu Tsai };
81020147f0dSChen-Yu Tsai
811e0f8ad2aSShengyu Qu static const struct regmap_irq_chip axp15060_regmap_irq_chip = {
812e0f8ad2aSShengyu Qu .name = "axp15060",
813e0f8ad2aSShengyu Qu .status_base = AXP15060_IRQ1_STATE,
814e0f8ad2aSShengyu Qu .ack_base = AXP15060_IRQ1_STATE,
815e0f8ad2aSShengyu Qu .unmask_base = AXP15060_IRQ1_EN,
816e0f8ad2aSShengyu Qu .init_ack_masked = true,
817e0f8ad2aSShengyu Qu .irqs = axp15060_regmap_irqs,
818e0f8ad2aSShengyu Qu .num_irqs = ARRAY_SIZE(axp15060_regmap_irqs),
819e0f8ad2aSShengyu Qu .num_regs = 2,
820e0f8ad2aSShengyu Qu };
821e0f8ad2aSShengyu Qu
82263eeabbcSAidan MacDonald static const struct mfd_cell axp192_cells[] = {
82363eeabbcSAidan MacDonald {
82463eeabbcSAidan MacDonald .name = "axp192-adc",
82563eeabbcSAidan MacDonald .of_compatible = "x-powers,axp192-adc",
82663eeabbcSAidan MacDonald }, {
82763eeabbcSAidan MacDonald .name = "axp20x-battery-power-supply",
82863eeabbcSAidan MacDonald .of_compatible = "x-powers,axp192-battery-power-supply",
82963eeabbcSAidan MacDonald }, {
83063eeabbcSAidan MacDonald .name = "axp20x-ac-power-supply",
83163eeabbcSAidan MacDonald .of_compatible = "x-powers,axp202-ac-power-supply",
83263eeabbcSAidan MacDonald .num_resources = ARRAY_SIZE(axp192_ac_power_supply_resources),
83363eeabbcSAidan MacDonald .resources = axp192_ac_power_supply_resources,
83463eeabbcSAidan MacDonald }, {
83563eeabbcSAidan MacDonald .name = "axp20x-usb-power-supply",
83663eeabbcSAidan MacDonald .of_compatible = "x-powers,axp192-usb-power-supply",
83763eeabbcSAidan MacDonald .num_resources = ARRAY_SIZE(axp192_usb_power_supply_resources),
83863eeabbcSAidan MacDonald .resources = axp192_usb_power_supply_resources,
83963eeabbcSAidan MacDonald },
84063eeabbcSAidan MacDonald { .name = "axp20x-regulator" },
84163eeabbcSAidan MacDonald };
84263eeabbcSAidan MacDonald
843531a469eSChen-Yu Tsai static const struct mfd_cell axp20x_cells[] = {
844cfb61a41SCarlo Caione {
845b419c16bSMaxime Ripard .name = "axp20x-gpio",
846b419c16bSMaxime Ripard .of_compatible = "x-powers,axp209-gpio",
847b419c16bSMaxime Ripard }, {
848cfb61a41SCarlo Caione .name = "axp20x-pek",
849cfb61a41SCarlo Caione .num_resources = ARRAY_SIZE(axp20x_pek_resources),
850cfb61a41SCarlo Caione .resources = axp20x_pek_resources,
851cfb61a41SCarlo Caione }, {
852cfb61a41SCarlo Caione .name = "axp20x-regulator",
8538de4efdaSHans de Goede }, {
8544d5e5c34SQuentin Schulz .name = "axp20x-adc",
855034c3c95SQuentin Schulz .of_compatible = "x-powers,axp209-adc",
8564d5e5c34SQuentin Schulz }, {
857b4aeceb6SQuentin Schulz .name = "axp20x-battery-power-supply",
858b4aeceb6SQuentin Schulz .of_compatible = "x-powers,axp209-battery-power-supply",
859b4aeceb6SQuentin Schulz }, {
860cd7cf27bSMichael Haas .name = "axp20x-ac-power-supply",
861cd7cf27bSMichael Haas .of_compatible = "x-powers,axp202-ac-power-supply",
862cd7cf27bSMichael Haas .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
863cd7cf27bSMichael Haas .resources = axp20x_ac_power_supply_resources,
864cd7cf27bSMichael Haas }, {
8658de4efdaSHans de Goede .name = "axp20x-usb-power-supply",
8668de4efdaSHans de Goede .of_compatible = "x-powers,axp202-usb-power-supply",
8678de4efdaSHans de Goede .num_resources = ARRAY_SIZE(axp20x_usb_power_supply_resources),
8688de4efdaSHans de Goede .resources = axp20x_usb_power_supply_resources,
869cfb61a41SCarlo Caione },
870cfb61a41SCarlo Caione };
871cfb61a41SCarlo Caione
872531a469eSChen-Yu Tsai static const struct mfd_cell axp221_cells[] = {
873f05be589SBoris BREZILLON {
874371a9fcaSSamuel Holland .name = "axp20x-gpio",
875371a9fcaSSamuel Holland .of_compatible = "x-powers,axp221-gpio",
876371a9fcaSSamuel Holland }, {
877f4463633SQuentin Schulz .name = "axp221-pek",
878f05be589SBoris BREZILLON .num_resources = ARRAY_SIZE(axp22x_pek_resources),
879f05be589SBoris BREZILLON .resources = axp22x_pek_resources,
8806d4fa89dSChen-Yu Tsai }, {
8816d4fa89dSChen-Yu Tsai .name = "axp20x-regulator",
882ecd98cceSHans de Goede }, {
883034c3c95SQuentin Schulz .name = "axp22x-adc",
884034c3c95SQuentin Schulz .of_compatible = "x-powers,axp221-adc",
8854d5e5c34SQuentin Schulz }, {
88695c4f531SQuentin Schulz .name = "axp20x-ac-power-supply",
88795c4f531SQuentin Schulz .of_compatible = "x-powers,axp221-ac-power-supply",
88895c4f531SQuentin Schulz .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
88995c4f531SQuentin Schulz .resources = axp20x_ac_power_supply_resources,
89095c4f531SQuentin Schulz }, {
891b4aeceb6SQuentin Schulz .name = "axp20x-battery-power-supply",
892b4aeceb6SQuentin Schulz .of_compatible = "x-powers,axp221-battery-power-supply",
893b4aeceb6SQuentin Schulz }, {
894ecd98cceSHans de Goede .name = "axp20x-usb-power-supply",
895ecd98cceSHans de Goede .of_compatible = "x-powers,axp221-usb-power-supply",
896ecd98cceSHans de Goede .num_resources = ARRAY_SIZE(axp22x_usb_power_supply_resources),
897ecd98cceSHans de Goede .resources = axp22x_usb_power_supply_resources,
898f05be589SBoris BREZILLON },
899f05be589SBoris BREZILLON };
900f05be589SBoris BREZILLON
901531a469eSChen-Yu Tsai static const struct mfd_cell axp223_cells[] = {
9024c650561SQuentin Schulz {
903371a9fcaSSamuel Holland .name = "axp20x-gpio",
904371a9fcaSSamuel Holland .of_compatible = "x-powers,axp221-gpio",
905371a9fcaSSamuel Holland }, {
906f4463633SQuentin Schulz .name = "axp221-pek",
9074c650561SQuentin Schulz .num_resources = ARRAY_SIZE(axp22x_pek_resources),
9084c650561SQuentin Schulz .resources = axp22x_pek_resources,
9094c650561SQuentin Schulz }, {
9104d5e5c34SQuentin Schulz .name = "axp22x-adc",
911034c3c95SQuentin Schulz .of_compatible = "x-powers,axp221-adc",
9124d5e5c34SQuentin Schulz }, {
913b4aeceb6SQuentin Schulz .name = "axp20x-battery-power-supply",
914b4aeceb6SQuentin Schulz .of_compatible = "x-powers,axp221-battery-power-supply",
915b4aeceb6SQuentin Schulz }, {
9164c650561SQuentin Schulz .name = "axp20x-regulator",
9174c650561SQuentin Schulz }, {
91895c4f531SQuentin Schulz .name = "axp20x-ac-power-supply",
91995c4f531SQuentin Schulz .of_compatible = "x-powers,axp221-ac-power-supply",
92095c4f531SQuentin Schulz .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
92195c4f531SQuentin Schulz .resources = axp20x_ac_power_supply_resources,
92295c4f531SQuentin Schulz }, {
9234c650561SQuentin Schulz .name = "axp20x-usb-power-supply",
9244c650561SQuentin Schulz .of_compatible = "x-powers,axp223-usb-power-supply",
9254c650561SQuentin Schulz .num_resources = ARRAY_SIZE(axp22x_usb_power_supply_resources),
9264c650561SQuentin Schulz .resources = axp22x_usb_power_supply_resources,
9274c650561SQuentin Schulz },
9284c650561SQuentin Schulz };
9294c650561SQuentin Schulz
930531a469eSChen-Yu Tsai static const struct mfd_cell axp152_cells[] = {
931d8d79f8fSMichal Suchanek {
932d8d79f8fSMichal Suchanek .name = "axp20x-pek",
933d8d79f8fSMichal Suchanek .num_resources = ARRAY_SIZE(axp152_pek_resources),
934d8d79f8fSMichal Suchanek .resources = axp152_pek_resources,
935d8d79f8fSMichal Suchanek },
936d8d79f8fSMichal Suchanek };
937d8d79f8fSMichal Suchanek
93875c8cb2fSMartin Botka static struct mfd_cell axp313a_cells[] = {
93975c8cb2fSMartin Botka MFD_CELL_NAME("axp20x-regulator"),
94075c8cb2fSMartin Botka MFD_CELL_RES("axp313a-pek", axp313a_pek_resources),
94175c8cb2fSMartin Botka };
94275c8cb2fSMartin Botka
943531a469eSChen-Yu Tsai static const struct resource axp288_adc_resources[] = {
944e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ_NAMED(AXP288_IRQ_GPADC, "GPADC"),
945af7e9069SJacob Pan };
946af7e9069SJacob Pan
947531a469eSChen-Yu Tsai static const struct resource axp288_extcon_resources[] = {
948e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_VBUS_FALL),
949e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_VBUS_RISE),
950e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_MV_CHNG),
951e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_BC_USB_CHNG),
952bdb01f78SRamakrishna Pallala };
953bdb01f78SRamakrishna Pallala
954531a469eSChen-Yu Tsai static const struct resource axp288_charger_resources[] = {
955e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_OV),
956e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_DONE),
957e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_CHARGING),
958e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_SAFE_QUIT),
959e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_SAFE_ENTER),
960e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_QCBTU),
961e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_CBTU),
962e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_QCBTO),
963e26f87e5SChen-Yu Tsai DEFINE_RES_IRQ(AXP288_IRQ_CBTO),
964af7e9069SJacob Pan };
965af7e9069SJacob Pan
96632679a7aSHans de Goede static const char * const axp288_fuel_gauge_suppliers[] = { "axp288_charger" };
96732679a7aSHans de Goede
96832679a7aSHans de Goede static const struct property_entry axp288_fuel_gauge_properties[] = {
96932679a7aSHans de Goede PROPERTY_ENTRY_STRING_ARRAY("supplied-from", axp288_fuel_gauge_suppliers),
97032679a7aSHans de Goede { }
97132679a7aSHans de Goede };
97232679a7aSHans de Goede
97332679a7aSHans de Goede static const struct software_node axp288_fuel_gauge_sw_node = {
97432679a7aSHans de Goede .name = "axp288_fuel_gauge",
97532679a7aSHans de Goede .properties = axp288_fuel_gauge_properties,
97632679a7aSHans de Goede };
97732679a7aSHans de Goede
978531a469eSChen-Yu Tsai static const struct mfd_cell axp288_cells[] = {
979af7e9069SJacob Pan {
980af7e9069SJacob Pan .name = "axp288_adc",
981af7e9069SJacob Pan .num_resources = ARRAY_SIZE(axp288_adc_resources),
982af7e9069SJacob Pan .resources = axp288_adc_resources,
983753a8d08SChen-Yu Tsai }, {
984bdb01f78SRamakrishna Pallala .name = "axp288_extcon",
985bdb01f78SRamakrishna Pallala .num_resources = ARRAY_SIZE(axp288_extcon_resources),
986bdb01f78SRamakrishna Pallala .resources = axp288_extcon_resources,
987753a8d08SChen-Yu Tsai }, {
988af7e9069SJacob Pan .name = "axp288_charger",
989af7e9069SJacob Pan .num_resources = ARRAY_SIZE(axp288_charger_resources),
990af7e9069SJacob Pan .resources = axp288_charger_resources,
991753a8d08SChen-Yu Tsai }, {
992d6387874STodd Brandt .name = "axp288_fuel_gauge",
993d6387874STodd Brandt .num_resources = ARRAY_SIZE(axp288_fuel_gauge_resources),
994d6387874STodd Brandt .resources = axp288_fuel_gauge_resources,
99532679a7aSHans de Goede .swnode = &axp288_fuel_gauge_sw_node,
996753a8d08SChen-Yu Tsai }, {
997f4463633SQuentin Schulz .name = "axp221-pek",
998e56e5ad6SBorun Fu .num_resources = ARRAY_SIZE(axp288_power_button_resources),
999e56e5ad6SBorun Fu .resources = axp288_power_button_resources,
1000753a8d08SChen-Yu Tsai }, {
1001d8139f63SAaron Lu .name = "axp288_pmic_acpi",
1002d8139f63SAaron Lu },
1003af7e9069SJacob Pan };
1004af7e9069SJacob Pan
1005531a469eSChen-Yu Tsai static const struct mfd_cell axp803_cells[] = {
10061578353eSIcenowy Zheng {
1007f4463633SQuentin Schulz .name = "axp221-pek",
10081578353eSIcenowy Zheng .num_resources = ARRAY_SIZE(axp803_pek_resources),
10091578353eSIcenowy Zheng .resources = axp803_pek_resources,
1010ea90e7b4SOskari Lemmela }, {
1011ea90e7b4SOskari Lemmela .name = "axp20x-gpio",
1012ea90e7b4SOskari Lemmela .of_compatible = "x-powers,axp813-gpio",
1013ea90e7b4SOskari Lemmela }, {
1014ea90e7b4SOskari Lemmela .name = "axp813-adc",
1015ea90e7b4SOskari Lemmela .of_compatible = "x-powers,axp813-adc",
1016ea90e7b4SOskari Lemmela }, {
1017ea90e7b4SOskari Lemmela .name = "axp20x-battery-power-supply",
1018ea90e7b4SOskari Lemmela .of_compatible = "x-powers,axp813-battery-power-supply",
1019ea90e7b4SOskari Lemmela }, {
1020ea90e7b4SOskari Lemmela .name = "axp20x-ac-power-supply",
1021ea90e7b4SOskari Lemmela .of_compatible = "x-powers,axp813-ac-power-supply",
1022ea90e7b4SOskari Lemmela .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
1023ea90e7b4SOskari Lemmela .resources = axp20x_ac_power_supply_resources,
1024e7037d75SChen-Yu Tsai }, {
1025e7037d75SChen-Yu Tsai .name = "axp20x-usb-power-supply",
1026e7037d75SChen-Yu Tsai .num_resources = ARRAY_SIZE(axp803_usb_power_supply_resources),
1027e7037d75SChen-Yu Tsai .resources = axp803_usb_power_supply_resources,
1028e7037d75SChen-Yu Tsai .of_compatible = "x-powers,axp813-usb-power-supply",
10299b79ff10SIcenowy Zheng },
10309b79ff10SIcenowy Zheng { .name = "axp20x-regulator" },
10311578353eSIcenowy Zheng };
10321578353eSIcenowy Zheng
103306f49010SChen-Yu Tsai static const struct mfd_cell axp806_self_working_cells[] = {
103406f49010SChen-Yu Tsai {
103506f49010SChen-Yu Tsai .name = "axp221-pek",
103606f49010SChen-Yu Tsai .num_resources = ARRAY_SIZE(axp806_pek_resources),
103706f49010SChen-Yu Tsai .resources = axp806_pek_resources,
103806f49010SChen-Yu Tsai },
103906f49010SChen-Yu Tsai { .name = "axp20x-regulator" },
104006f49010SChen-Yu Tsai };
104106f49010SChen-Yu Tsai
1042531a469eSChen-Yu Tsai static const struct mfd_cell axp806_cells[] = {
10438824ee85SChen-Yu Tsai {
10448824ee85SChen-Yu Tsai .id = 2,
10458824ee85SChen-Yu Tsai .name = "axp20x-regulator",
10468824ee85SChen-Yu Tsai },
10478824ee85SChen-Yu Tsai };
10488824ee85SChen-Yu Tsai
1049531a469eSChen-Yu Tsai static const struct mfd_cell axp809_cells[] = {
105020147f0dSChen-Yu Tsai {
1051371a9fcaSSamuel Holland .name = "axp20x-gpio",
1052371a9fcaSSamuel Holland .of_compatible = "x-powers,axp221-gpio",
1053371a9fcaSSamuel Holland }, {
1054f4463633SQuentin Schulz .name = "axp221-pek",
105520147f0dSChen-Yu Tsai .num_resources = ARRAY_SIZE(axp809_pek_resources),
105620147f0dSChen-Yu Tsai .resources = axp809_pek_resources,
105720147f0dSChen-Yu Tsai }, {
10588824ee85SChen-Yu Tsai .id = 1,
105920147f0dSChen-Yu Tsai .name = "axp20x-regulator",
106020147f0dSChen-Yu Tsai },
106120147f0dSChen-Yu Tsai };
106220147f0dSChen-Yu Tsai
1063531a469eSChen-Yu Tsai static const struct mfd_cell axp813_cells[] = {
10647303733aSChen-Yu Tsai {
1065f4463633SQuentin Schulz .name = "axp221-pek",
10667303733aSChen-Yu Tsai .num_resources = ARRAY_SIZE(axp803_pek_resources),
10677303733aSChen-Yu Tsai .resources = axp803_pek_resources,
10689a43206bSChen-Yu Tsai }, {
10699a43206bSChen-Yu Tsai .name = "axp20x-regulator",
10702bb3253cSQuentin Schulz }, {
10712bb3253cSQuentin Schulz .name = "axp20x-gpio",
10722bb3253cSQuentin Schulz .of_compatible = "x-powers,axp813-gpio",
1073e5d590faSQuentin Schulz }, {
1074e5d590faSQuentin Schulz .name = "axp813-adc",
1075e5d590faSQuentin Schulz .of_compatible = "x-powers,axp813-adc",
10766720328fSQuentin Schulz }, {
10776720328fSQuentin Schulz .name = "axp20x-battery-power-supply",
10786720328fSQuentin Schulz .of_compatible = "x-powers,axp813-battery-power-supply",
10794a19f9a6SOskari Lemmela }, {
10804a19f9a6SOskari Lemmela .name = "axp20x-ac-power-supply",
10814a19f9a6SOskari Lemmela .of_compatible = "x-powers,axp813-ac-power-supply",
10824a19f9a6SOskari Lemmela .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
10834a19f9a6SOskari Lemmela .resources = axp20x_ac_power_supply_resources,
1084129fc677SQuentin Schulz }, {
1085129fc677SQuentin Schulz .name = "axp20x-usb-power-supply",
1086129fc677SQuentin Schulz .num_resources = ARRAY_SIZE(axp803_usb_power_supply_resources),
1087129fc677SQuentin Schulz .resources = axp803_usb_power_supply_resources,
1088129fc677SQuentin Schulz .of_compatible = "x-powers,axp813-usb-power-supply",
1089e5d590faSQuentin Schulz },
10907303733aSChen-Yu Tsai };
10917303733aSChen-Yu Tsai
1092e0f8ad2aSShengyu Qu static const struct mfd_cell axp15060_cells[] = {
1093e0f8ad2aSShengyu Qu {
1094e0f8ad2aSShengyu Qu .name = "axp221-pek",
1095e0f8ad2aSShengyu Qu .num_resources = ARRAY_SIZE(axp15060_pek_resources),
1096e0f8ad2aSShengyu Qu .resources = axp15060_pek_resources,
1097e0f8ad2aSShengyu Qu }, {
1098e0f8ad2aSShengyu Qu .name = "axp20x-regulator",
1099e0f8ad2aSShengyu Qu },
1100e0f8ad2aSShengyu Qu };
1101e0f8ad2aSShengyu Qu
1102e0f8ad2aSShengyu Qu /* For boards that don't have IRQ line connected to SOC. */
1103e0f8ad2aSShengyu Qu static const struct mfd_cell axp_regulator_only_cells[] = {
1104e0f8ad2aSShengyu Qu {
1105e0f8ad2aSShengyu Qu .name = "axp20x-regulator",
1106e0f8ad2aSShengyu Qu },
1107e0f8ad2aSShengyu Qu };
1108e0f8ad2aSShengyu Qu
axp20x_power_off(struct sys_off_data * data)11091b1305e9SSamuel Holland static int axp20x_power_off(struct sys_off_data *data)
1110cfb61a41SCarlo Caione {
11111b1305e9SSamuel Holland struct axp20x_dev *axp20x = data->cb_data;
111275c8cb2fSMartin Botka unsigned int shutdown_reg;
1113af7e9069SJacob Pan
111475c8cb2fSMartin Botka switch (axp20x->variant) {
111575c8cb2fSMartin Botka case AXP313A_ID:
111675c8cb2fSMartin Botka shutdown_reg = AXP313A_SHUTDOWN_CTRL;
111775c8cb2fSMartin Botka break;
111875c8cb2fSMartin Botka default:
111975c8cb2fSMartin Botka shutdown_reg = AXP20X_OFF_CTRL;
112075c8cb2fSMartin Botka break;
112175c8cb2fSMartin Botka }
112275c8cb2fSMartin Botka
112375c8cb2fSMartin Botka regmap_write(axp20x->regmap, shutdown_reg, AXP20X_OFF);
1124179dc63dSHans de Goede
1125179dc63dSHans de Goede /* Give capacitors etc. time to drain to avoid kernel panic msg. */
11263f37d4f6SSamuel Holland mdelay(500);
11271b1305e9SSamuel Holland
11281b1305e9SSamuel Holland return NOTIFY_DONE;
1129cfb61a41SCarlo Caione }
1130cfb61a41SCarlo Caione
axp20x_match_device(struct axp20x_dev * axp20x)11314fd41151SChen-Yu Tsai int axp20x_match_device(struct axp20x_dev *axp20x)
1132af7e9069SJacob Pan {
1133e47a3cf7SChen-Yu Tsai struct device *dev = axp20x->dev;
1134af7e9069SJacob Pan const struct acpi_device_id *acpi_id;
1135af7e9069SJacob Pan const struct of_device_id *of_id;
1136af7e9069SJacob Pan
1137af7e9069SJacob Pan if (dev->of_node) {
1138af7acc3dSChen-Yu Tsai of_id = of_match_device(dev->driver->of_match_table, dev);
1139af7e9069SJacob Pan if (!of_id) {
1140af7e9069SJacob Pan dev_err(dev, "Unable to match OF ID\n");
1141af7e9069SJacob Pan return -ENODEV;
1142af7e9069SJacob Pan }
1143af7e9069SJacob Pan axp20x->variant = (long)of_id->data;
1144af7e9069SJacob Pan } else {
1145af7e9069SJacob Pan acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
1146af7e9069SJacob Pan if (!acpi_id || !acpi_id->driver_data) {
1147af7e9069SJacob Pan dev_err(dev, "Unable to match ACPI ID and data\n");
1148af7e9069SJacob Pan return -ENODEV;
1149af7e9069SJacob Pan }
1150af7e9069SJacob Pan axp20x->variant = (long)acpi_id->driver_data;
1151af7e9069SJacob Pan }
1152af7e9069SJacob Pan
1153af7e9069SJacob Pan switch (axp20x->variant) {
1154d8d79f8fSMichal Suchanek case AXP152_ID:
1155d8d79f8fSMichal Suchanek axp20x->nr_cells = ARRAY_SIZE(axp152_cells);
1156d8d79f8fSMichal Suchanek axp20x->cells = axp152_cells;
1157d8d79f8fSMichal Suchanek axp20x->regmap_cfg = &axp152_regmap_config;
1158d8d79f8fSMichal Suchanek axp20x->regmap_irq_chip = &axp152_regmap_irq_chip;
1159d8d79f8fSMichal Suchanek break;
116063eeabbcSAidan MacDonald case AXP192_ID:
116163eeabbcSAidan MacDonald axp20x->nr_cells = ARRAY_SIZE(axp192_cells);
116263eeabbcSAidan MacDonald axp20x->cells = axp192_cells;
116363eeabbcSAidan MacDonald axp20x->regmap_cfg = &axp192_regmap_config;
116463eeabbcSAidan MacDonald axp20x->regmap_irq_chip = &axp192_regmap_irq_chip;
116563eeabbcSAidan MacDonald break;
1166af7e9069SJacob Pan case AXP202_ID:
1167af7e9069SJacob Pan case AXP209_ID:
1168af7e9069SJacob Pan axp20x->nr_cells = ARRAY_SIZE(axp20x_cells);
1169af7e9069SJacob Pan axp20x->cells = axp20x_cells;
1170af7e9069SJacob Pan axp20x->regmap_cfg = &axp20x_regmap_config;
1171af7e9069SJacob Pan axp20x->regmap_irq_chip = &axp20x_regmap_irq_chip;
1172af7e9069SJacob Pan break;
1173f05be589SBoris BREZILLON case AXP221_ID:
11744c650561SQuentin Schulz axp20x->nr_cells = ARRAY_SIZE(axp221_cells);
11754c650561SQuentin Schulz axp20x->cells = axp221_cells;
11764c650561SQuentin Schulz axp20x->regmap_cfg = &axp22x_regmap_config;
11774c650561SQuentin Schulz axp20x->regmap_irq_chip = &axp22x_regmap_irq_chip;
11784c650561SQuentin Schulz break;
117902071f0fSChen-Yu Tsai case AXP223_ID:
11804c650561SQuentin Schulz axp20x->nr_cells = ARRAY_SIZE(axp223_cells);
11814c650561SQuentin Schulz axp20x->cells = axp223_cells;
1182f05be589SBoris BREZILLON axp20x->regmap_cfg = &axp22x_regmap_config;
1183f05be589SBoris BREZILLON axp20x->regmap_irq_chip = &axp22x_regmap_irq_chip;
1184f05be589SBoris BREZILLON break;
1185af7e9069SJacob Pan case AXP288_ID:
1186af7e9069SJacob Pan axp20x->cells = axp288_cells;
1187af7e9069SJacob Pan axp20x->nr_cells = ARRAY_SIZE(axp288_cells);
1188af7e9069SJacob Pan axp20x->regmap_cfg = &axp288_regmap_config;
1189af7e9069SJacob Pan axp20x->regmap_irq_chip = &axp288_regmap_irq_chip;
11900a5454c9SHans de Goede axp20x->irq_flags = IRQF_TRIGGER_LOW;
1191af7e9069SJacob Pan break;
119275c8cb2fSMartin Botka case AXP313A_ID:
119375c8cb2fSMartin Botka axp20x->nr_cells = ARRAY_SIZE(axp313a_cells);
119475c8cb2fSMartin Botka axp20x->cells = axp313a_cells;
119575c8cb2fSMartin Botka axp20x->regmap_cfg = &axp313a_regmap_config;
119675c8cb2fSMartin Botka axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
119775c8cb2fSMartin Botka break;
11981578353eSIcenowy Zheng case AXP803_ID:
11991578353eSIcenowy Zheng axp20x->nr_cells = ARRAY_SIZE(axp803_cells);
12001578353eSIcenowy Zheng axp20x->cells = axp803_cells;
12011578353eSIcenowy Zheng axp20x->regmap_cfg = &axp288_regmap_config;
12021578353eSIcenowy Zheng axp20x->regmap_irq_chip = &axp803_regmap_irq_chip;
12031578353eSIcenowy Zheng break;
12048824ee85SChen-Yu Tsai case AXP806_ID:
12053efc465fSAndre Przywara /*
12063efc465fSAndre Przywara * Don't register the power key part if in slave mode or
12073efc465fSAndre Przywara * if there is no interrupt line.
12083efc465fSAndre Przywara */
120906f49010SChen-Yu Tsai if (of_property_read_bool(axp20x->dev->of_node,
12103efc465fSAndre Przywara "x-powers,self-working-mode") &&
12113efc465fSAndre Przywara axp20x->irq > 0) {
121206f49010SChen-Yu Tsai axp20x->nr_cells = ARRAY_SIZE(axp806_self_working_cells);
121306f49010SChen-Yu Tsai axp20x->cells = axp806_self_working_cells;
121406f49010SChen-Yu Tsai } else {
12158824ee85SChen-Yu Tsai axp20x->nr_cells = ARRAY_SIZE(axp806_cells);
12168824ee85SChen-Yu Tsai axp20x->cells = axp806_cells;
121706f49010SChen-Yu Tsai }
12188824ee85SChen-Yu Tsai axp20x->regmap_cfg = &axp806_regmap_config;
12198824ee85SChen-Yu Tsai axp20x->regmap_irq_chip = &axp806_regmap_irq_chip;
12208824ee85SChen-Yu Tsai break;
122120147f0dSChen-Yu Tsai case AXP809_ID:
122220147f0dSChen-Yu Tsai axp20x->nr_cells = ARRAY_SIZE(axp809_cells);
122320147f0dSChen-Yu Tsai axp20x->cells = axp809_cells;
122420147f0dSChen-Yu Tsai axp20x->regmap_cfg = &axp22x_regmap_config;
122520147f0dSChen-Yu Tsai axp20x->regmap_irq_chip = &axp809_regmap_irq_chip;
122620147f0dSChen-Yu Tsai break;
12277303733aSChen-Yu Tsai case AXP813_ID:
12287303733aSChen-Yu Tsai axp20x->nr_cells = ARRAY_SIZE(axp813_cells);
12297303733aSChen-Yu Tsai axp20x->cells = axp813_cells;
12307303733aSChen-Yu Tsai axp20x->regmap_cfg = &axp288_regmap_config;
12317303733aSChen-Yu Tsai /*
12327303733aSChen-Yu Tsai * The IRQ table given in the datasheet is incorrect.
12337303733aSChen-Yu Tsai * In IRQ enable/status registers 1, there are separate
12347303733aSChen-Yu Tsai * IRQs for ACIN and VBUS, instead of bits [7:5] being
12357303733aSChen-Yu Tsai * the same as bits [4:2]. So it shares the same IRQs
12367303733aSChen-Yu Tsai * as the AXP803, rather than the AXP288.
12377303733aSChen-Yu Tsai */
12387303733aSChen-Yu Tsai axp20x->regmap_irq_chip = &axp803_regmap_irq_chip;
12397303733aSChen-Yu Tsai break;
1240e0f8ad2aSShengyu Qu case AXP15060_ID:
1241e0f8ad2aSShengyu Qu /*
1242e0f8ad2aSShengyu Qu * Don't register the power key part if there is no interrupt
1243e0f8ad2aSShengyu Qu * line.
1244e0f8ad2aSShengyu Qu *
1245e0f8ad2aSShengyu Qu * Since most use cases of AXP PMICs are Allwinner SOCs, board
1246e0f8ad2aSShengyu Qu * designers follow Allwinner's reference design and connects
1247e0f8ad2aSShengyu Qu * IRQ line to SOC, there's no need for those variants to deal
1248e0f8ad2aSShengyu Qu * with cases that IRQ isn't connected. However, AXP15660 is
1249e0f8ad2aSShengyu Qu * used by some other vendors' SOCs that didn't connect IRQ
1250e0f8ad2aSShengyu Qu * line, we need to deal with this case.
1251e0f8ad2aSShengyu Qu */
1252e0f8ad2aSShengyu Qu if (axp20x->irq > 0) {
1253e0f8ad2aSShengyu Qu axp20x->nr_cells = ARRAY_SIZE(axp15060_cells);
1254e0f8ad2aSShengyu Qu axp20x->cells = axp15060_cells;
1255e0f8ad2aSShengyu Qu } else {
1256e0f8ad2aSShengyu Qu axp20x->nr_cells = ARRAY_SIZE(axp_regulator_only_cells);
1257e0f8ad2aSShengyu Qu axp20x->cells = axp_regulator_only_cells;
1258e0f8ad2aSShengyu Qu }
1259e0f8ad2aSShengyu Qu axp20x->regmap_cfg = &axp15060_regmap_config;
1260e0f8ad2aSShengyu Qu axp20x->regmap_irq_chip = &axp15060_regmap_irq_chip;
1261e0f8ad2aSShengyu Qu break;
1262af7e9069SJacob Pan default:
1263af7e9069SJacob Pan dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant);
1264af7e9069SJacob Pan return -EINVAL;
1265af7e9069SJacob Pan }
1266af7e9069SJacob Pan dev_info(dev, "AXP20x variant %s found\n",
1267af7e9069SJacob Pan axp20x_model_names[axp20x->variant]);
1268af7e9069SJacob Pan
1269af7e9069SJacob Pan return 0;
1270af7e9069SJacob Pan }
12714fd41151SChen-Yu Tsai EXPORT_SYMBOL(axp20x_match_device);
1272af7e9069SJacob Pan
axp20x_device_probe(struct axp20x_dev * axp20x)12734fd41151SChen-Yu Tsai int axp20x_device_probe(struct axp20x_dev *axp20x)
1274cfb61a41SCarlo Caione {
1275cfb61a41SCarlo Caione int ret;
1276cfb61a41SCarlo Caione
1277696f0b3fSChen-Yu Tsai /*
1278696f0b3fSChen-Yu Tsai * The AXP806 supports either master/standalone or slave mode.
1279696f0b3fSChen-Yu Tsai * Slave mode allows sharing the serial bus, even with multiple
1280696f0b3fSChen-Yu Tsai * AXP806 which all have the same hardware address.
1281696f0b3fSChen-Yu Tsai *
1282696f0b3fSChen-Yu Tsai * This is done with extra "serial interface address extension",
1283696f0b3fSChen-Yu Tsai * or AXP806_BUS_ADDR_EXT, and "register address extension", or
1284696f0b3fSChen-Yu Tsai * AXP806_REG_ADDR_EXT, registers. The former is read-only, with
1285696f0b3fSChen-Yu Tsai * 1 bit customizable at the factory, and 1 bit depending on the
1286696f0b3fSChen-Yu Tsai * state of an external pin. The latter is writable. The device
1287696f0b3fSChen-Yu Tsai * will only respond to operations to its other registers when
1288696f0b3fSChen-Yu Tsai * the these device addressing bits (in the upper 4 bits of the
1289696f0b3fSChen-Yu Tsai * registers) match.
1290696f0b3fSChen-Yu Tsai *
1291c0369698SRask Ingemann Lambertsen * By default we support an AXP806 chained to an AXP809 in slave
1292c0369698SRask Ingemann Lambertsen * mode. Boards which use an AXP806 in master mode can set the
1293c0369698SRask Ingemann Lambertsen * property "x-powers,master-mode" to override the default.
1294696f0b3fSChen-Yu Tsai */
1295c0369698SRask Ingemann Lambertsen if (axp20x->variant == AXP806_ID) {
1296c0369698SRask Ingemann Lambertsen if (of_property_read_bool(axp20x->dev->of_node,
129706f49010SChen-Yu Tsai "x-powers,master-mode") ||
129806f49010SChen-Yu Tsai of_property_read_bool(axp20x->dev->of_node,
129906f49010SChen-Yu Tsai "x-powers,self-working-mode"))
1300c0369698SRask Ingemann Lambertsen regmap_write(axp20x->regmap, AXP806_REG_ADDR_EXT,
1301c0369698SRask Ingemann Lambertsen AXP806_REG_ADDR_EXT_ADDR_MASTER_MODE);
1302c0369698SRask Ingemann Lambertsen else
1303696f0b3fSChen-Yu Tsai regmap_write(axp20x->regmap, AXP806_REG_ADDR_EXT,
1304696f0b3fSChen-Yu Tsai AXP806_REG_ADDR_EXT_ADDR_SLAVE_MODE);
1305c0369698SRask Ingemann Lambertsen }
1306696f0b3fSChen-Yu Tsai
13073efc465fSAndre Przywara /* Only if there is an interrupt line connected towards the CPU. */
13083efc465fSAndre Przywara if (axp20x->irq > 0) {
13094fd41151SChen-Yu Tsai ret = regmap_add_irq_chip(axp20x->regmap, axp20x->irq,
13100a5454c9SHans de Goede IRQF_ONESHOT | IRQF_SHARED | axp20x->irq_flags,
13113efc465fSAndre Przywara -1, axp20x->regmap_irq_chip,
13123efc465fSAndre Przywara &axp20x->regmap_irqc);
1313cfb61a41SCarlo Caione if (ret) {
13143efc465fSAndre Przywara dev_err(axp20x->dev, "failed to add irq chip: %d\n",
13153efc465fSAndre Przywara ret);
1316cfb61a41SCarlo Caione return ret;
1317cfb61a41SCarlo Caione }
13183efc465fSAndre Przywara }
1319cfb61a41SCarlo Caione
1320af7e9069SJacob Pan ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells,
1321af7e9069SJacob Pan axp20x->nr_cells, NULL, 0, NULL);
1322cfb61a41SCarlo Caione
1323cfb61a41SCarlo Caione if (ret) {
13244fd41151SChen-Yu Tsai dev_err(axp20x->dev, "failed to add MFD devices: %d\n", ret);
13254fd41151SChen-Yu Tsai regmap_del_irq_chip(axp20x->irq, axp20x->regmap_irqc);
1326cfb61a41SCarlo Caione return ret;
1327cfb61a41SCarlo Caione }
1328cfb61a41SCarlo Caione
13291b1305e9SSamuel Holland if (axp20x->variant != AXP288_ID)
13301b1305e9SSamuel Holland devm_register_sys_off_handler(axp20x->dev,
13311b1305e9SSamuel Holland SYS_OFF_MODE_POWER_OFF,
13321b1305e9SSamuel Holland SYS_OFF_PRIO_DEFAULT,
13331b1305e9SSamuel Holland axp20x_power_off, axp20x);
1334cfb61a41SCarlo Caione
13354fd41151SChen-Yu Tsai dev_info(axp20x->dev, "AXP20X driver loaded\n");
1336cfb61a41SCarlo Caione
1337cfb61a41SCarlo Caione return 0;
1338cfb61a41SCarlo Caione }
13394fd41151SChen-Yu Tsai EXPORT_SYMBOL(axp20x_device_probe);
1340cfb61a41SCarlo Caione
axp20x_device_remove(struct axp20x_dev * axp20x)13413c15e00eSUwe Kleine-König void axp20x_device_remove(struct axp20x_dev *axp20x)
1342cfb61a41SCarlo Caione {
1343cfb61a41SCarlo Caione mfd_remove_devices(axp20x->dev);
13444fd41151SChen-Yu Tsai regmap_del_irq_chip(axp20x->irq, axp20x->regmap_irqc);
1345cfb61a41SCarlo Caione }
13464fd41151SChen-Yu Tsai EXPORT_SYMBOL(axp20x_device_remove);
1347cfb61a41SCarlo Caione
1348cfb61a41SCarlo Caione MODULE_DESCRIPTION("PMIC MFD core driver for AXP20X");
1349cfb61a41SCarlo Caione MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
1350cfb61a41SCarlo Caione MODULE_LICENSE("GPL");
1351