Skip to content

Commit 3a17ba6

Browse files
andredlag-linaro
authored andcommitted
mfd: sec: Add support for S2MPG11 PMIC via ACPM
Add support for Samsung's S2MPG11 PMIC, which is a Power Management IC for mobile applications with buck converters, various LDOs, power meters, NTC thermistor inputs, and additional GPIO interfaces. It typically complements an S2MPG10 PMIC in a main/sub configuration as the sub-PMIC. Like S2MPG10, communication is not via I2C, but via the Samsung ACPM firmware. While at it, we can also switch to asynchronous probe, which helps with probe performance, as the drivers for s2mpg10 and s2mpg11 can probe in parallel. Note: The firmware uses the ACPM channel ID and the Speedy channel ID to select the PMIC address. Since these are firmware properties, they can not be retrieved from DT, but instead are deducted from the compatible for now. Signed-off-by: André Draszik <andre.draszik@linaro.org> Link: https://patch.msgid.link/20260122-s2mpg1x-regulators-v7-9-3b1f9831fffd@linaro.org Signed-off-by: Lee Jones <lee@kernel.org>
1 parent fa72a84 commit 3a17ba6

6 files changed

Lines changed: 808 additions & 6 deletions

File tree

drivers/mfd/sec-acpm.c

Lines changed: 167 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <linux/mfd/samsung/core.h>
1414
#include <linux/mfd/samsung/rtc.h>
1515
#include <linux/mfd/samsung/s2mpg10.h>
16+
#include <linux/mfd/samsung/s2mpg11.h>
1617
#include <linux/mod_devicetable.h>
1718
#include <linux/module.h>
1819
#include <linux/of.h>
@@ -216,6 +217,155 @@ static const struct regmap_config s2mpg10_regmap_config_meter = {
216217
.cache_type = REGCACHE_FLAT,
217218
};
218219

220+
static const struct regmap_range s2mpg11_common_registers[] = {
221+
regmap_reg_range(0x00, 0x02), /* CHIP_ID_S, INT, INT_MASK */
222+
regmap_reg_range(0x0a, 0x0c), /* Speedy control */
223+
regmap_reg_range(0x1a, 0x27), /* Debug */
224+
};
225+
226+
static const struct regmap_range s2mpg11_common_ro_registers[] = {
227+
regmap_reg_range(0x00, 0x01), /* CHIP_ID_S, INT */
228+
regmap_reg_range(0x25, 0x27), /* Debug */
229+
};
230+
231+
static const struct regmap_range s2mpg11_common_nonvolatile_registers[] = {
232+
regmap_reg_range(0x00, 0x00), /* CHIP_ID_S */
233+
regmap_reg_range(0x02, 0x02), /* INT_MASK */
234+
regmap_reg_range(0x0a, 0x0c), /* Speedy control */
235+
};
236+
237+
static const struct regmap_range s2mpg11_common_precious_registers[] = {
238+
regmap_reg_range(0x01, 0x01), /* INT */
239+
};
240+
241+
static const struct regmap_access_table s2mpg11_common_wr_table = {
242+
.yes_ranges = s2mpg11_common_registers,
243+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_common_registers),
244+
.no_ranges = s2mpg11_common_ro_registers,
245+
.n_no_ranges = ARRAY_SIZE(s2mpg11_common_ro_registers),
246+
};
247+
248+
static const struct regmap_access_table s2mpg11_common_rd_table = {
249+
.yes_ranges = s2mpg11_common_registers,
250+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_common_registers),
251+
};
252+
253+
static const struct regmap_access_table s2mpg11_common_volatile_table = {
254+
.no_ranges = s2mpg11_common_nonvolatile_registers,
255+
.n_no_ranges = ARRAY_SIZE(s2mpg11_common_nonvolatile_registers),
256+
};
257+
258+
static const struct regmap_access_table s2mpg11_common_precious_table = {
259+
.yes_ranges = s2mpg11_common_precious_registers,
260+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_common_precious_registers),
261+
};
262+
263+
static const struct regmap_config s2mpg11_regmap_config_common = {
264+
.name = "common",
265+
.reg_bits = ACPM_ADDR_BITS,
266+
.val_bits = 8,
267+
.max_register = S2MPG11_COMMON_SPD_DEBUG4,
268+
.wr_table = &s2mpg11_common_wr_table,
269+
.rd_table = &s2mpg11_common_rd_table,
270+
.volatile_table = &s2mpg11_common_volatile_table,
271+
.precious_table = &s2mpg11_common_precious_table,
272+
.num_reg_defaults_raw = S2MPG11_COMMON_SPD_DEBUG4 + 1,
273+
.cache_type = REGCACHE_FLAT,
274+
};
275+
276+
static const struct regmap_range s2mpg11_pmic_registers[] = {
277+
regmap_reg_range(0x00, 0x5a), /* All PMIC registers */
278+
regmap_reg_range(0x5c, 0xb7), /* All PMIC registers */
279+
};
280+
281+
static const struct regmap_range s2mpg11_pmic_ro_registers[] = {
282+
regmap_reg_range(0x00, 0x05), /* INTx */
283+
regmap_reg_range(0x0c, 0x0d), /* STATUS OFFSRC */
284+
regmap_reg_range(0x98, 0x98), /* GPIO input */
285+
};
286+
287+
static const struct regmap_range s2mpg11_pmic_nonvolatile_registers[] = {
288+
regmap_reg_range(0x06, 0x0b), /* INTxM */
289+
};
290+
291+
static const struct regmap_range s2mpg11_pmic_precious_registers[] = {
292+
regmap_reg_range(0x00, 0x05), /* INTx */
293+
};
294+
295+
static const struct regmap_access_table s2mpg11_pmic_wr_table = {
296+
.yes_ranges = s2mpg11_pmic_registers,
297+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_pmic_registers),
298+
.no_ranges = s2mpg11_pmic_ro_registers,
299+
.n_no_ranges = ARRAY_SIZE(s2mpg11_pmic_ro_registers),
300+
};
301+
302+
static const struct regmap_access_table s2mpg11_pmic_rd_table = {
303+
.yes_ranges = s2mpg11_pmic_registers,
304+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_pmic_registers),
305+
};
306+
307+
static const struct regmap_access_table s2mpg11_pmic_volatile_table = {
308+
.no_ranges = s2mpg11_pmic_nonvolatile_registers,
309+
.n_no_ranges = ARRAY_SIZE(s2mpg11_pmic_nonvolatile_registers),
310+
};
311+
312+
static const struct regmap_access_table s2mpg11_pmic_precious_table = {
313+
.yes_ranges = s2mpg11_pmic_precious_registers,
314+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_pmic_precious_registers),
315+
};
316+
317+
static const struct regmap_config s2mpg11_regmap_config_pmic = {
318+
.name = "pmic",
319+
.reg_bits = ACPM_ADDR_BITS,
320+
.val_bits = 8,
321+
.max_register = S2MPG11_PMIC_LDO_SENSE2,
322+
.wr_table = &s2mpg11_pmic_wr_table,
323+
.rd_table = &s2mpg11_pmic_rd_table,
324+
.volatile_table = &s2mpg11_pmic_volatile_table,
325+
.precious_table = &s2mpg11_pmic_precious_table,
326+
.num_reg_defaults_raw = S2MPG11_PMIC_LDO_SENSE2 + 1,
327+
.cache_type = REGCACHE_FLAT,
328+
};
329+
330+
static const struct regmap_range s2mpg11_meter_registers[] = {
331+
regmap_reg_range(0x00, 0x3e), /* Meter config */
332+
regmap_reg_range(0x40, 0x8a), /* Meter data */
333+
regmap_reg_range(0x8d, 0x9c), /* Meter data */
334+
};
335+
336+
static const struct regmap_range s2mpg11_meter_ro_registers[] = {
337+
regmap_reg_range(0x40, 0x9c), /* Meter data */
338+
};
339+
340+
static const struct regmap_access_table s2mpg11_meter_wr_table = {
341+
.yes_ranges = s2mpg11_meter_registers,
342+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_meter_registers),
343+
.no_ranges = s2mpg11_meter_ro_registers,
344+
.n_no_ranges = ARRAY_SIZE(s2mpg11_meter_ro_registers),
345+
};
346+
347+
static const struct regmap_access_table s2mpg11_meter_rd_table = {
348+
.yes_ranges = s2mpg11_meter_registers,
349+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_meter_registers),
350+
};
351+
352+
static const struct regmap_access_table s2mpg11_meter_volatile_table = {
353+
.yes_ranges = s2mpg11_meter_ro_registers,
354+
.n_yes_ranges = ARRAY_SIZE(s2mpg11_meter_ro_registers),
355+
};
356+
357+
static const struct regmap_config s2mpg11_regmap_config_meter = {
358+
.name = "meter",
359+
.reg_bits = ACPM_ADDR_BITS,
360+
.val_bits = 8,
361+
.max_register = S2MPG11_METER_LPF_DATA_NTC7_2,
362+
.wr_table = &s2mpg11_meter_wr_table,
363+
.rd_table = &s2mpg11_meter_rd_table,
364+
.volatile_table = &s2mpg11_meter_volatile_table,
365+
.num_reg_defaults_raw = S2MPG11_METER_LPF_DATA_NTC7_2 + 1,
366+
.cache_type = REGCACHE_FLAT,
367+
};
368+
219369
struct sec_pmic_acpm_shared_bus_context {
220370
const struct acpm_handle *acpm;
221371
unsigned int acpm_chan_id;
@@ -364,10 +514,12 @@ static int sec_pmic_acpm_probe(struct platform_device *pdev)
364514
if (IS_ERR(regmap_pmic))
365515
return PTR_ERR(regmap_pmic);
366516

367-
regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_RTC,
368-
pdata->regmap_cfg_rtc, true);
369-
if (IS_ERR(regmap))
370-
return PTR_ERR(regmap);
517+
if (pdata->regmap_cfg_rtc) {
518+
regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_RTC,
519+
pdata->regmap_cfg_rtc, true);
520+
if (IS_ERR(regmap))
521+
return PTR_ERR(regmap);
522+
}
371523

372524
regmap = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_METER,
373525
pdata->regmap_cfg_meter, true);
@@ -399,15 +551,26 @@ static const struct sec_pmic_acpm_platform_data s2mpg10_data = {
399551
.regmap_cfg_meter = &s2mpg10_regmap_config_meter,
400552
};
401553

554+
static const struct sec_pmic_acpm_platform_data s2mpg11_data = {
555+
.device_type = S2MPG11,
556+
.acpm_chan_id = 2,
557+
.speedy_channel = 1,
558+
.regmap_cfg_common = &s2mpg11_regmap_config_common,
559+
.regmap_cfg_pmic = &s2mpg11_regmap_config_pmic,
560+
.regmap_cfg_meter = &s2mpg11_regmap_config_meter,
561+
};
562+
402563
static const struct of_device_id sec_pmic_acpm_of_match[] = {
403564
{ .compatible = "samsung,s2mpg10-pmic", .data = &s2mpg10_data, },
565+
{ .compatible = "samsung,s2mpg11-pmic", .data = &s2mpg11_data, },
404566
{ },
405567
};
406568
MODULE_DEVICE_TABLE(of, sec_pmic_acpm_of_match);
407569

408570
static struct platform_driver sec_pmic_acpm_driver = {
409571
.driver = {
410572
.name = "sec-pmic-acpm",
573+
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
411574
.pm = pm_sleep_ptr(&sec_pmic_pm_ops),
412575
.of_match_table = sec_pmic_acpm_of_match,
413576
},

drivers/mfd/sec-common.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ static const struct mfd_cell s2mpg10_devs[] = {
4949
MFD_CELL_OF("s2mpg10-gpio", NULL, NULL, 0, 0, "samsung,s2mpg10-gpio"),
5050
};
5151

52+
static const struct mfd_cell s2mpg11_devs[] = {
53+
MFD_CELL_NAME("s2mpg11-meter"),
54+
MFD_CELL_NAME("s2mpg11-regulator"),
55+
MFD_CELL_OF("s2mpg11-gpio", NULL, NULL, 0, 0, "samsung,s2mpg11-gpio"),
56+
};
57+
5258
static const struct resource s2mps11_rtc_resources[] = {
5359
DEFINE_RES_IRQ_NAMED(S2MPS11_IRQ_RTCA0, "alarm"),
5460
};
@@ -104,8 +110,13 @@ static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic)
104110
unsigned int val;
105111

106112
/* For s2mpg1x, the revision is in a different regmap */
107-
if (sec_pmic->device_type == S2MPG10)
113+
switch (sec_pmic->device_type) {
114+
case S2MPG10:
115+
case S2MPG11:
108116
return;
117+
default:
118+
break;
119+
}
109120

110121
/* For each device type, the REG_ID is always the first register */
111122
if (!regmap_read(sec_pmic->regmap_pmic, S2MPS11_REG_ID, &val))
@@ -211,6 +222,10 @@ int sec_pmic_probe(struct device *dev, int device_type, unsigned int irq,
211222
sec_devs = s2mpg10_devs;
212223
num_sec_devs = ARRAY_SIZE(s2mpg10_devs);
213224
break;
225+
case S2MPG11:
226+
sec_devs = s2mpg11_devs;
227+
num_sec_devs = ARRAY_SIZE(s2mpg11_devs);
228+
break;
214229
case S2MPS11X:
215230
sec_devs = s2mps11_devs;
216231
num_sec_devs = ARRAY_SIZE(s2mps11_devs);

drivers/mfd/sec-irq.c

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/mfd/samsung/core.h>
1212
#include <linux/mfd/samsung/irq.h>
1313
#include <linux/mfd/samsung/s2mpg10.h>
14+
#include <linux/mfd/samsung/s2mpg11.h>
1415
#include <linux/mfd/samsung/s2mps11.h>
1516
#include <linux/mfd/samsung/s2mps14.h>
1617
#include <linux/mfd/samsung/s2mpu02.h>
@@ -79,6 +80,64 @@ static const struct regmap_irq s2mpg10_pmic_irqs[] = {
7980
REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH7, 5, S2MPG10_IRQ_PWR_WARN_CH7_MASK),
8081
};
8182

83+
static const struct regmap_irq s2mpg11_irqs[] = {
84+
REGMAP_IRQ_REG(S2MPG11_COMMON_IRQ_PMIC, 0, S2MPG11_COMMON_INT_SRC_PMIC),
85+
/* No documentation or other reference for remaining bits */
86+
REGMAP_IRQ_REG(S2MPG11_COMMON_IRQ_UNUSED, 0, GENMASK(7, 1)),
87+
};
88+
89+
static const struct regmap_irq s2mpg11_pmic_irqs[] = {
90+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWRONF, 0, S2MPG11_IRQ_PWRONF_MASK),
91+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWRONR, 0, S2MPG11_IRQ_PWRONR_MASK),
92+
REGMAP_IRQ_REG(S2MPG11_IRQ_PIF_TIMEOUT_MIF, 0, S2MPG11_IRQ_PIF_TIMEOUT_MIF_MASK),
93+
REGMAP_IRQ_REG(S2MPG11_IRQ_PIF_TIMEOUTS, 0, S2MPG11_IRQ_PIF_TIMEOUTS_MASK),
94+
REGMAP_IRQ_REG(S2MPG11_IRQ_WTSR, 0, S2MPG11_IRQ_WTSR_MASK),
95+
REGMAP_IRQ_REG(S2MPG11_IRQ_SPD_ABNORMAL_STOP, 0, S2MPG11_IRQ_SPD_ABNORMAL_STOP_MASK),
96+
REGMAP_IRQ_REG(S2MPG11_IRQ_SPD_PARITY_ERR, 0, S2MPG11_IRQ_SPD_PARITY_ERR_MASK),
97+
98+
REGMAP_IRQ_REG(S2MPG11_IRQ_140C, 1, S2MPG11_IRQ_INT140C_MASK),
99+
REGMAP_IRQ_REG(S2MPG11_IRQ_120C, 1, S2MPG11_IRQ_INT120C_MASK),
100+
REGMAP_IRQ_REG(S2MPG11_IRQ_TSD, 1, S2MPG11_IRQ_TSD_MASK),
101+
REGMAP_IRQ_REG(S2MPG11_IRQ_WRST, 1, S2MPG11_IRQ_WRST_MASK),
102+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_CYCLE_DONE, 1, S2MPG11_IRQ_NTC_CYCLE_DONE_MASK),
103+
REGMAP_IRQ_REG(S2MPG11_IRQ_PMETER_OVERF, 1, S2MPG11_IRQ_PMETER_OVERF_MASK),
104+
105+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B1S, 2, S2MPG11_IRQ_OCP_B1S_MASK),
106+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B2S, 2, S2MPG11_IRQ_OCP_B2S_MASK),
107+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B3S, 2, S2MPG11_IRQ_OCP_B3S_MASK),
108+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B4S, 2, S2MPG11_IRQ_OCP_B4S_MASK),
109+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B5S, 2, S2MPG11_IRQ_OCP_B5S_MASK),
110+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B6S, 2, S2MPG11_IRQ_OCP_B6S_MASK),
111+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B7S, 2, S2MPG11_IRQ_OCP_B7S_MASK),
112+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B8S, 2, S2MPG11_IRQ_OCP_B8S_MASK),
113+
114+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B9S, 3, S2MPG11_IRQ_OCP_B9S_MASK),
115+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_B10S, 3, S2MPG11_IRQ_OCP_B10S_MASK),
116+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_BDS, 3, S2MPG11_IRQ_OCP_BDS_MASK),
117+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_BAS, 3, S2MPG11_IRQ_OCP_BAS_MASK),
118+
REGMAP_IRQ_REG(S2MPG11_IRQ_OCP_BBS, 3, S2MPG11_IRQ_OCP_BBS_MASK),
119+
REGMAP_IRQ_REG(S2MPG11_IRQ_WLWP_ACC, 3, S2MPG11_IRQ_WLWP_ACC_MASK),
120+
REGMAP_IRQ_REG(S2MPG11_IRQ_SPD_SRP_PKT_RST, 3, S2MPG11_IRQ_SPD_SRP_PKT_RST_MASK),
121+
122+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH0, 4, S2MPG11_IRQ_PWR_WARN_CH0_MASK),
123+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH1, 4, S2MPG11_IRQ_PWR_WARN_CH1_MASK),
124+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH2, 4, S2MPG11_IRQ_PWR_WARN_CH2_MASK),
125+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH3, 4, S2MPG11_IRQ_PWR_WARN_CH3_MASK),
126+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH4, 4, S2MPG11_IRQ_PWR_WARN_CH4_MASK),
127+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH5, 4, S2MPG11_IRQ_PWR_WARN_CH5_MASK),
128+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH6, 4, S2MPG11_IRQ_PWR_WARN_CH6_MASK),
129+
REGMAP_IRQ_REG(S2MPG11_IRQ_PWR_WARN_CH7, 4, S2MPG11_IRQ_PWR_WARN_CH7_MASK),
130+
131+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH0, 5, S2MPG11_IRQ_NTC_WARN_CH0_MASK),
132+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH1, 5, S2MPG11_IRQ_NTC_WARN_CH1_MASK),
133+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH2, 5, S2MPG11_IRQ_NTC_WARN_CH2_MASK),
134+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH3, 5, S2MPG11_IRQ_NTC_WARN_CH3_MASK),
135+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH4, 5, S2MPG11_IRQ_NTC_WARN_CH4_MASK),
136+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH5, 5, S2MPG11_IRQ_NTC_WARN_CH5_MASK),
137+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH6, 5, S2MPG11_IRQ_NTC_WARN_CH6_MASK),
138+
REGMAP_IRQ_REG(S2MPG11_IRQ_NTC_WARN_CH7, 5, S2MPG11_IRQ_NTC_WARN_CH7_MASK),
139+
};
140+
82141
static const struct regmap_irq s2mps11_irqs[] = {
83142
REGMAP_IRQ_REG(S2MPS11_IRQ_PWRONF, 0, S2MPS11_IRQ_PWRONF_MASK),
84143
REGMAP_IRQ_REG(S2MPS11_IRQ_PWRONR, 0, S2MPS11_IRQ_PWRONR_MASK),
@@ -186,7 +245,7 @@ static const struct regmap_irq s5m8767_irqs[] = {
186245
REGMAP_IRQ_REG(S5M8767_IRQ_WTSR, 2, S5M8767_IRQ_WTSR_MASK),
187246
};
188247

189-
/* All S2MPG10 interrupt sources are read-only and don't require clearing */
248+
/* All S2MPG1x interrupt sources are read-only and don't require clearing */
190249
static const struct regmap_irq_chip s2mpg10_irq_chip = {
191250
.name = "s2mpg10",
192251
.status_base = S2MPG10_COMMON_INT,
@@ -205,6 +264,25 @@ static const struct regmap_irq_chip s2mpg10_irq_chip_pmic = {
205264
.num_irqs = ARRAY_SIZE(s2mpg10_pmic_irqs),
206265
};
207266

267+
static const struct regmap_irq_chip s2mpg11_irq_chip = {
268+
.name = "s2mpg11",
269+
.status_base = S2MPG11_COMMON_INT,
270+
.mask_base = S2MPG11_COMMON_INT_MASK,
271+
.num_regs = 1,
272+
.irqs = s2mpg11_irqs,
273+
.num_irqs = ARRAY_SIZE(s2mpg11_irqs),
274+
};
275+
276+
static const struct regmap_irq_chip s2mpg11_irq_chip_pmic = {
277+
.name = "s2mpg11-pmic",
278+
.domain_suffix = "pmic",
279+
.status_base = S2MPG11_PMIC_INT1,
280+
.mask_base = S2MPG11_PMIC_INT1M,
281+
.num_regs = 6,
282+
.irqs = s2mpg11_pmic_irqs,
283+
.num_irqs = ARRAY_SIZE(s2mpg11_pmic_irqs),
284+
};
285+
208286
static const struct regmap_irq_chip s2mps11_irq_chip = {
209287
.name = "s2mps11",
210288
.irqs = s2mps11_irqs,
@@ -303,6 +381,11 @@ static struct regmap_irq_chip_data *sec_irq_init_s2mpg1x(struct sec_pmic_dev *se
303381
chained_irq_chip = &s2mpg10_irq_chip_pmic;
304382
chained_pirq = S2MPG10_COMMON_IRQ_PMIC;
305383
break;
384+
case S2MPG11:
385+
irq_chip = &s2mpg11_irq_chip;
386+
chained_irq_chip = &s2mpg11_irq_chip_pmic;
387+
chained_pirq = S2MPG11_COMMON_IRQ_PMIC;
388+
break;
306389
default:
307390
return dev_err_ptr_probe(sec_pmic->dev, -EINVAL, "Unsupported device type %d\n",
308391
sec_pmic->device_type);
@@ -338,6 +421,7 @@ struct regmap_irq_chip_data *sec_irq_init(struct sec_pmic_dev *sec_pmic)
338421
sec_irq_chip = &s2mps14_irq_chip;
339422
break;
340423
case S2MPG10:
424+
case S2MPG11:
341425
return sec_irq_init_s2mpg1x(sec_pmic);
342426
case S2MPS11X:
343427
sec_irq_chip = &s2mps11_irq_chip;

include/linux/mfd/samsung/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ enum sec_device_type {
4040
S2DOS05,
4141
S2MPA01,
4242
S2MPG10,
43+
S2MPG11,
4344
S2MPS11X,
4445
S2MPS13X,
4546
S2MPS14X,

0 commit comments

Comments
 (0)