Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: pf1550: Add core driver for the PF1550 PMIC

There are 3 sub-devices for which the drivers will be added in
subsequent patches.

Signed-off-by: Samuel Kayode <samuel.kayode@savoirfairelinux.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Tested-by: Sean Nyekjaer <sean@geanix.com>
Link: https://patch.msgid.link/20251001-pf1550-v12-2-a3302aa41687@savoirfairelinux.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Samuel Kayode and committed by
Lee Jones
ebaec90e 2391e137

+658
+16
drivers/mfd/Kconfig
··· 605 605 i.MX25 processors. They consist of a conversion queue for general 606 606 purpose ADC and a queue for Touchscreens. 607 607 608 + config MFD_PF1550 609 + tristate "NXP PF1550 PMIC Support" 610 + depends on I2C=y && OF 611 + select MFD_CORE 612 + select REGMAP_I2C 613 + select REGMAP_IRQ 614 + help 615 + Say yes here to add support for NXP PF1550. This is a companion Power 616 + Management IC with regulators, onkey, and charger control on chip. 617 + This driver provides common support for accessing the device; 618 + additional drivers must be enabled in order to use the functionality 619 + of the device. 620 + 621 + This driver can also be built as a module and if so will be called 622 + pf1550. 623 + 608 624 config MFD_HI6421_PMIC 609 625 tristate "HiSilicon Hi6421 PMU/Codec IC" 610 626 depends on OF
+2
drivers/mfd/Makefile
··· 122 122 obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o 123 123 obj-$(CONFIG_MFD_MC13XXX_I2C) += mc13xxx-i2c.o 124 124 125 + obj-$(CONFIG_MFD_PF1550) += pf1550.o 126 + 125 127 obj-$(CONFIG_MFD_NCT6694) += nct6694.o 126 128 127 129 obj-$(CONFIG_MFD_CORE) += mfd-core.o
+367
drivers/mfd/pf1550.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Core driver for the PF1550 4 + * 5 + * Copyright (C) 2016 Freescale Semiconductor, Inc. 6 + * Robin Gong <yibin.gong@freescale.com> 7 + * 8 + * Portions Copyright (c) 2025 Savoir-faire Linux Inc. 9 + * Samuel Kayode <samuel.kayode@savoirfairelinux.com> 10 + */ 11 + 12 + #include <linux/err.h> 13 + #include <linux/i2c.h> 14 + #include <linux/interrupt.h> 15 + #include <linux/mfd/core.h> 16 + #include <linux/mfd/pf1550.h> 17 + #include <linux/module.h> 18 + #include <linux/of.h> 19 + #include <linux/regmap.h> 20 + 21 + static const struct regmap_config pf1550_regmap_config = { 22 + .reg_bits = 8, 23 + .val_bits = 8, 24 + .max_register = PF1550_PMIC_REG_END, 25 + }; 26 + 27 + static const struct regmap_irq pf1550_irqs[] = { 28 + REGMAP_IRQ_REG(PF1550_IRQ_CHG, 0, IRQ_CHG), 29 + REGMAP_IRQ_REG(PF1550_IRQ_REGULATOR, 0, IRQ_REGULATOR), 30 + REGMAP_IRQ_REG(PF1550_IRQ_ONKEY, 0, IRQ_ONKEY), 31 + }; 32 + 33 + static const struct regmap_irq_chip pf1550_irq_chip = { 34 + .name = "pf1550", 35 + .status_base = PF1550_PMIC_REG_INT_CATEGORY, 36 + .init_ack_masked = 1, 37 + .num_regs = 1, 38 + .irqs = pf1550_irqs, 39 + .num_irqs = ARRAY_SIZE(pf1550_irqs), 40 + }; 41 + 42 + static const struct regmap_irq pf1550_regulator_irqs[] = { 43 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_SW1_LS, 0, PMIC_IRQ_SW1_LS), 44 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_SW2_LS, 0, PMIC_IRQ_SW2_LS), 45 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_SW3_LS, 0, PMIC_IRQ_SW3_LS), 46 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_SW1_HS, 3, PMIC_IRQ_SW1_HS), 47 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_SW2_HS, 3, PMIC_IRQ_SW2_HS), 48 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_SW3_HS, 3, PMIC_IRQ_SW3_HS), 49 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_LDO1_FAULT, 16, PMIC_IRQ_LDO1_FAULT), 50 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_LDO2_FAULT, 16, PMIC_IRQ_LDO2_FAULT), 51 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_LDO3_FAULT, 16, PMIC_IRQ_LDO3_FAULT), 52 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_TEMP_110, 24, PMIC_IRQ_TEMP_110), 53 + REGMAP_IRQ_REG(PF1550_PMIC_IRQ_TEMP_125, 24, PMIC_IRQ_TEMP_125), 54 + }; 55 + 56 + static const struct regmap_irq_chip pf1550_regulator_irq_chip = { 57 + .name = "pf1550-regulator", 58 + .status_base = PF1550_PMIC_REG_SW_INT_STAT0, 59 + .ack_base = PF1550_PMIC_REG_SW_INT_STAT0, 60 + .mask_base = PF1550_PMIC_REG_SW_INT_MASK0, 61 + .use_ack = 1, 62 + .init_ack_masked = 1, 63 + .num_regs = 25, 64 + .irqs = pf1550_regulator_irqs, 65 + .num_irqs = ARRAY_SIZE(pf1550_regulator_irqs), 66 + }; 67 + 68 + static const struct resource regulator_resources[] = { 69 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_SW1_LS), 70 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_SW2_LS), 71 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_SW3_LS), 72 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_SW1_HS), 73 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_SW2_HS), 74 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_SW3_HS), 75 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_LDO1_FAULT), 76 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_LDO2_FAULT), 77 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_LDO3_FAULT), 78 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_TEMP_110), 79 + DEFINE_RES_IRQ(PF1550_PMIC_IRQ_TEMP_125), 80 + }; 81 + 82 + static const struct regmap_irq pf1550_onkey_irqs[] = { 83 + REGMAP_IRQ_REG(PF1550_ONKEY_IRQ_PUSHI, 0, ONKEY_IRQ_PUSHI), 84 + REGMAP_IRQ_REG(PF1550_ONKEY_IRQ_1SI, 0, ONKEY_IRQ_1SI), 85 + REGMAP_IRQ_REG(PF1550_ONKEY_IRQ_2SI, 0, ONKEY_IRQ_2SI), 86 + REGMAP_IRQ_REG(PF1550_ONKEY_IRQ_3SI, 0, ONKEY_IRQ_3SI), 87 + REGMAP_IRQ_REG(PF1550_ONKEY_IRQ_4SI, 0, ONKEY_IRQ_4SI), 88 + REGMAP_IRQ_REG(PF1550_ONKEY_IRQ_8SI, 0, ONKEY_IRQ_8SI), 89 + }; 90 + 91 + static const struct regmap_irq_chip pf1550_onkey_irq_chip = { 92 + .name = "pf1550-onkey", 93 + .status_base = PF1550_PMIC_REG_ONKEY_INT_STAT0, 94 + .ack_base = PF1550_PMIC_REG_ONKEY_INT_STAT0, 95 + .mask_base = PF1550_PMIC_REG_ONKEY_INT_MASK0, 96 + .use_ack = 1, 97 + .init_ack_masked = 1, 98 + .num_regs = 1, 99 + .irqs = pf1550_onkey_irqs, 100 + .num_irqs = ARRAY_SIZE(pf1550_onkey_irqs), 101 + }; 102 + 103 + static const struct resource onkey_resources[] = { 104 + DEFINE_RES_IRQ(PF1550_ONKEY_IRQ_PUSHI), 105 + DEFINE_RES_IRQ(PF1550_ONKEY_IRQ_1SI), 106 + DEFINE_RES_IRQ(PF1550_ONKEY_IRQ_2SI), 107 + DEFINE_RES_IRQ(PF1550_ONKEY_IRQ_3SI), 108 + DEFINE_RES_IRQ(PF1550_ONKEY_IRQ_4SI), 109 + DEFINE_RES_IRQ(PF1550_ONKEY_IRQ_8SI), 110 + }; 111 + 112 + static const struct regmap_irq pf1550_charger_irqs[] = { 113 + REGMAP_IRQ_REG(PF1550_CHARG_IRQ_BAT2SOCI, 0, CHARG_IRQ_BAT2SOCI), 114 + REGMAP_IRQ_REG(PF1550_CHARG_IRQ_BATI, 0, CHARG_IRQ_BATI), 115 + REGMAP_IRQ_REG(PF1550_CHARG_IRQ_CHGI, 0, CHARG_IRQ_CHGI), 116 + REGMAP_IRQ_REG(PF1550_CHARG_IRQ_VBUSI, 0, CHARG_IRQ_VBUSI), 117 + REGMAP_IRQ_REG(PF1550_CHARG_IRQ_THMI, 0, CHARG_IRQ_THMI), 118 + }; 119 + 120 + static const struct regmap_irq_chip pf1550_charger_irq_chip = { 121 + .name = "pf1550-charger", 122 + .status_base = PF1550_CHARG_REG_CHG_INT, 123 + .ack_base = PF1550_CHARG_REG_CHG_INT, 124 + .mask_base = PF1550_CHARG_REG_CHG_INT_MASK, 125 + .use_ack = 1, 126 + .init_ack_masked = 1, 127 + .num_regs = 1, 128 + .irqs = pf1550_charger_irqs, 129 + .num_irqs = ARRAY_SIZE(pf1550_charger_irqs), 130 + }; 131 + 132 + static const struct resource charger_resources[] = { 133 + DEFINE_RES_IRQ(PF1550_CHARG_IRQ_BAT2SOCI), 134 + DEFINE_RES_IRQ(PF1550_CHARG_IRQ_BATI), 135 + DEFINE_RES_IRQ(PF1550_CHARG_IRQ_CHGI), 136 + DEFINE_RES_IRQ(PF1550_CHARG_IRQ_VBUSI), 137 + DEFINE_RES_IRQ(PF1550_CHARG_IRQ_THMI), 138 + }; 139 + 140 + static const struct mfd_cell pf1550_regulator_cell = { 141 + .name = "pf1550-regulator", 142 + .num_resources = ARRAY_SIZE(regulator_resources), 143 + .resources = regulator_resources, 144 + }; 145 + 146 + static const struct mfd_cell pf1550_onkey_cell = { 147 + .name = "pf1550-onkey", 148 + .num_resources = ARRAY_SIZE(onkey_resources), 149 + .resources = onkey_resources, 150 + }; 151 + 152 + static const struct mfd_cell pf1550_charger_cell = { 153 + .name = "pf1550-charger", 154 + .num_resources = ARRAY_SIZE(charger_resources), 155 + .resources = charger_resources, 156 + }; 157 + 158 + /* 159 + * The PF1550 is shipped in variants of A0, A1,...A9. Each variant defines a 160 + * configuration of the PMIC in a One-Time Programmable (OTP) memory. 161 + * This memory is accessed indirectly by writing valid keys to specific 162 + * registers of the PMIC. To read the OTP memory after writing the valid keys, 163 + * the OTP register address to be read is written to pf1550 register 0xc4 and 164 + * its value read from pf1550 register 0xc5. 165 + */ 166 + static int pf1550_read_otp(const struct pf1550_ddata *pf1550, unsigned int index, 167 + unsigned int *val) 168 + { 169 + int ret = 0; 170 + 171 + ret = regmap_write(pf1550->regmap, PF1550_PMIC_REG_KEY, PF1550_OTP_PMIC_KEY); 172 + if (ret) 173 + goto read_err; 174 + 175 + ret = regmap_write(pf1550->regmap, PF1550_CHARG_REG_CHGR_KEY2, PF1550_OTP_CHGR_KEY); 176 + if (ret) 177 + goto read_err; 178 + 179 + ret = regmap_write(pf1550->regmap, PF1550_TEST_REG_KEY3, PF1550_OTP_TEST_KEY); 180 + if (ret) 181 + goto read_err; 182 + 183 + ret = regmap_write(pf1550->regmap, PF1550_TEST_REG_FMRADDR, index); 184 + if (ret) 185 + goto read_err; 186 + 187 + ret = regmap_read(pf1550->regmap, PF1550_TEST_REG_FMRDATA, val); 188 + if (ret) 189 + goto read_err; 190 + 191 + return 0; 192 + 193 + read_err: 194 + return dev_err_probe(pf1550->dev, ret, "OTP reg %x not found!\n", index); 195 + } 196 + 197 + static int pf1550_i2c_probe(struct i2c_client *i2c) 198 + { 199 + const struct mfd_cell *regulator = &pf1550_regulator_cell; 200 + const struct mfd_cell *charger = &pf1550_charger_cell; 201 + const struct mfd_cell *onkey = &pf1550_onkey_cell; 202 + unsigned int reg_data = 0, otp_data = 0; 203 + struct pf1550_ddata *pf1550; 204 + struct irq_domain *domain; 205 + int irq, ret = 0; 206 + 207 + pf1550 = devm_kzalloc(&i2c->dev, sizeof(*pf1550), GFP_KERNEL); 208 + if (!pf1550) 209 + return -ENOMEM; 210 + 211 + i2c_set_clientdata(i2c, pf1550); 212 + pf1550->dev = &i2c->dev; 213 + pf1550->irq = i2c->irq; 214 + 215 + pf1550->regmap = devm_regmap_init_i2c(i2c, &pf1550_regmap_config); 216 + if (IS_ERR(pf1550->regmap)) 217 + return dev_err_probe(pf1550->dev, PTR_ERR(pf1550->regmap), 218 + "failed to allocate register map\n"); 219 + 220 + ret = regmap_read(pf1550->regmap, PF1550_PMIC_REG_DEVICE_ID, &reg_data); 221 + if (ret < 0) 222 + return dev_err_probe(pf1550->dev, ret, "cannot read chip ID\n"); 223 + if (reg_data != PF1550_DEVICE_ID) 224 + return dev_err_probe(pf1550->dev, -ENODEV, "invalid device ID: 0x%02x\n", reg_data); 225 + 226 + /* Regulator DVS for SW2 */ 227 + ret = pf1550_read_otp(pf1550, PF1550_OTP_SW2_SW3, &otp_data); 228 + if (ret) 229 + return ret; 230 + 231 + /* When clear, DVS should be enabled */ 232 + if (!(otp_data & OTP_SW2_DVS_ENB)) 233 + pf1550->dvs2_enable = true; 234 + 235 + /* Regulator DVS for SW1 */ 236 + ret = pf1550_read_otp(pf1550, PF1550_OTP_SW1_SW2, &otp_data); 237 + if (ret) 238 + return ret; 239 + 240 + if (!(otp_data & OTP_SW1_DVS_ENB)) 241 + pf1550->dvs1_enable = true; 242 + 243 + /* Add top level interrupts */ 244 + ret = devm_regmap_add_irq_chip(pf1550->dev, pf1550->regmap, pf1550->irq, 245 + IRQF_ONESHOT | IRQF_SHARED | 246 + IRQF_TRIGGER_FALLING, 247 + 0, &pf1550_irq_chip, 248 + &pf1550->irq_data); 249 + if (ret) 250 + return ret; 251 + 252 + /* Add regulator */ 253 + irq = regmap_irq_get_virq(pf1550->irq_data, PF1550_IRQ_REGULATOR); 254 + if (irq < 0) 255 + return dev_err_probe(pf1550->dev, irq, 256 + "Failed to get parent vIRQ(%d) for chip %s\n", 257 + PF1550_IRQ_REGULATOR, pf1550_irq_chip.name); 258 + 259 + ret = devm_regmap_add_irq_chip(pf1550->dev, pf1550->regmap, irq, 260 + IRQF_ONESHOT | IRQF_SHARED | 261 + IRQF_TRIGGER_FALLING, 0, 262 + &pf1550_regulator_irq_chip, 263 + &pf1550->irq_data_regulator); 264 + if (ret) 265 + return dev_err_probe(pf1550->dev, ret, "Failed to add %s IRQ chip\n", 266 + pf1550_regulator_irq_chip.name); 267 + 268 + domain = regmap_irq_get_domain(pf1550->irq_data_regulator); 269 + 270 + ret = devm_mfd_add_devices(pf1550->dev, PLATFORM_DEVID_NONE, regulator, 1, NULL, 0, domain); 271 + if (ret) 272 + return ret; 273 + 274 + /* Add onkey */ 275 + irq = regmap_irq_get_virq(pf1550->irq_data, PF1550_IRQ_ONKEY); 276 + if (irq < 0) 277 + return dev_err_probe(pf1550->dev, irq, 278 + "Failed to get parent vIRQ(%d) for chip %s\n", 279 + PF1550_IRQ_ONKEY, pf1550_irq_chip.name); 280 + 281 + ret = devm_regmap_add_irq_chip(pf1550->dev, pf1550->regmap, irq, 282 + IRQF_ONESHOT | IRQF_SHARED | 283 + IRQF_TRIGGER_FALLING, 0, 284 + &pf1550_onkey_irq_chip, 285 + &pf1550->irq_data_onkey); 286 + if (ret) 287 + return dev_err_probe(pf1550->dev, ret, "Failed to add %s IRQ chip\n", 288 + pf1550_onkey_irq_chip.name); 289 + 290 + domain = regmap_irq_get_domain(pf1550->irq_data_onkey); 291 + 292 + ret = devm_mfd_add_devices(pf1550->dev, PLATFORM_DEVID_NONE, onkey, 1, NULL, 0, domain); 293 + if (ret) 294 + return ret; 295 + 296 + /* Add battery charger */ 297 + irq = regmap_irq_get_virq(pf1550->irq_data, PF1550_IRQ_CHG); 298 + if (irq < 0) 299 + return dev_err_probe(pf1550->dev, irq, 300 + "Failed to get parent vIRQ(%d) for chip %s\n", 301 + PF1550_IRQ_CHG, pf1550_irq_chip.name); 302 + 303 + ret = devm_regmap_add_irq_chip(pf1550->dev, pf1550->regmap, irq, 304 + IRQF_ONESHOT | IRQF_SHARED | 305 + IRQF_TRIGGER_FALLING, 0, 306 + &pf1550_charger_irq_chip, 307 + &pf1550->irq_data_charger); 308 + if (ret) 309 + return dev_err_probe(pf1550->dev, ret, "Failed to add %s IRQ chip\n", 310 + pf1550_charger_irq_chip.name); 311 + 312 + domain = regmap_irq_get_domain(pf1550->irq_data_charger); 313 + 314 + return devm_mfd_add_devices(pf1550->dev, PLATFORM_DEVID_NONE, charger, 1, NULL, 0, domain); 315 + } 316 + 317 + static int pf1550_suspend(struct device *dev) 318 + { 319 + struct pf1550_ddata *pf1550 = dev_get_drvdata(dev); 320 + 321 + if (device_may_wakeup(dev)) { 322 + enable_irq_wake(pf1550->irq); 323 + disable_irq(pf1550->irq); 324 + } 325 + 326 + return 0; 327 + } 328 + 329 + static int pf1550_resume(struct device *dev) 330 + { 331 + struct pf1550_ddata *pf1550 = dev_get_drvdata(dev); 332 + 333 + if (device_may_wakeup(dev)) { 334 + disable_irq_wake(pf1550->irq); 335 + enable_irq(pf1550->irq); 336 + } 337 + 338 + return 0; 339 + } 340 + static DEFINE_SIMPLE_DEV_PM_OPS(pf1550_pm, pf1550_suspend, pf1550_resume); 341 + 342 + static const struct i2c_device_id pf1550_i2c_id[] = { 343 + { "pf1550" }, 344 + { /* sentinel */ } 345 + }; 346 + MODULE_DEVICE_TABLE(i2c, pf1550_i2c_id); 347 + 348 + static const struct of_device_id pf1550_dt_match[] = { 349 + { .compatible = "nxp,pf1550" }, 350 + { /* sentinel */ } 351 + }; 352 + MODULE_DEVICE_TABLE(of, pf1550_dt_match); 353 + 354 + static struct i2c_driver pf1550_i2c_driver = { 355 + .driver = { 356 + .name = "pf1550", 357 + .pm = pm_sleep_ptr(&pf1550_pm), 358 + .of_match_table = pf1550_dt_match, 359 + }, 360 + .probe = pf1550_i2c_probe, 361 + .id_table = pf1550_i2c_id, 362 + }; 363 + module_i2c_driver(pf1550_i2c_driver); 364 + 365 + MODULE_DESCRIPTION("NXP PF1550 core driver"); 366 + MODULE_AUTHOR("Robin Gong <yibin.gong@freescale.com>"); 367 + MODULE_LICENSE("GPL");
+273
include/linux/mfd/pf1550.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 2 + * 3 + * Declarations for the PF1550 PMIC 4 + * 5 + * Copyright (C) 2016 Freescale Semiconductor, Inc. 6 + * Robin Gong <yibin.gong@freescale.com> 7 + * 8 + * Portions Copyright (c) 2025 Savoir-faire Linux Inc. 9 + * Samuel Kayode <samuel.kayode@savoirfairelinux.com> 10 + */ 11 + 12 + #ifndef __LINUX_MFD_PF1550_H 13 + #define __LINUX_MFD_PF1550_H 14 + 15 + #include <linux/i2c.h> 16 + #include <linux/regmap.h> 17 + 18 + enum pf1550_pmic_reg { 19 + /* PMIC regulator part */ 20 + PF1550_PMIC_REG_DEVICE_ID = 0x00, 21 + PF1550_PMIC_REG_OTP_FLAVOR = 0x01, 22 + PF1550_PMIC_REG_SILICON_REV = 0x02, 23 + 24 + PF1550_PMIC_REG_INT_CATEGORY = 0x06, 25 + PF1550_PMIC_REG_SW_INT_STAT0 = 0x08, 26 + PF1550_PMIC_REG_SW_INT_MASK0 = 0x09, 27 + PF1550_PMIC_REG_SW_INT_SENSE0 = 0x0a, 28 + PF1550_PMIC_REG_SW_INT_STAT1 = 0x0b, 29 + PF1550_PMIC_REG_SW_INT_MASK1 = 0x0c, 30 + PF1550_PMIC_REG_SW_INT_SENSE1 = 0x0d, 31 + PF1550_PMIC_REG_SW_INT_STAT2 = 0x0e, 32 + PF1550_PMIC_REG_SW_INT_MASK2 = 0x0f, 33 + PF1550_PMIC_REG_SW_INT_SENSE2 = 0x10, 34 + PF1550_PMIC_REG_LDO_INT_STAT0 = 0x18, 35 + PF1550_PMIC_REG_LDO_INT_MASK0 = 0x19, 36 + PF1550_PMIC_REG_LDO_INT_SENSE0 = 0x1a, 37 + PF1550_PMIC_REG_TEMP_INT_STAT0 = 0x20, 38 + PF1550_PMIC_REG_TEMP_INT_MASK0 = 0x21, 39 + PF1550_PMIC_REG_TEMP_INT_SENSE0 = 0x22, 40 + PF1550_PMIC_REG_ONKEY_INT_STAT0 = 0x24, 41 + PF1550_PMIC_REG_ONKEY_INT_MASK0 = 0x25, 42 + PF1550_PMIC_REG_ONKEY_INT_SENSE0 = 0x26, 43 + PF1550_PMIC_REG_MISC_INT_STAT0 = 0x28, 44 + PF1550_PMIC_REG_MISC_INT_MASK0 = 0x29, 45 + PF1550_PMIC_REG_MISC_INT_SENSE0 = 0x2a, 46 + 47 + PF1550_PMIC_REG_COINCELL_CONTROL = 0x30, 48 + 49 + PF1550_PMIC_REG_SW1_VOLT = 0x32, 50 + PF1550_PMIC_REG_SW1_STBY_VOLT = 0x33, 51 + PF1550_PMIC_REG_SW1_SLP_VOLT = 0x34, 52 + PF1550_PMIC_REG_SW1_CTRL = 0x35, 53 + PF1550_PMIC_REG_SW1_CTRL1 = 0x36, 54 + PF1550_PMIC_REG_SW2_VOLT = 0x38, 55 + PF1550_PMIC_REG_SW2_STBY_VOLT = 0x39, 56 + PF1550_PMIC_REG_SW2_SLP_VOLT = 0x3a, 57 + PF1550_PMIC_REG_SW2_CTRL = 0x3b, 58 + PF1550_PMIC_REG_SW2_CTRL1 = 0x3c, 59 + PF1550_PMIC_REG_SW3_VOLT = 0x3e, 60 + PF1550_PMIC_REG_SW3_STBY_VOLT = 0x3f, 61 + PF1550_PMIC_REG_SW3_SLP_VOLT = 0x40, 62 + PF1550_PMIC_REG_SW3_CTRL = 0x41, 63 + PF1550_PMIC_REG_SW3_CTRL1 = 0x42, 64 + PF1550_PMIC_REG_VSNVS_CTRL = 0x48, 65 + PF1550_PMIC_REG_VREFDDR_CTRL = 0x4a, 66 + PF1550_PMIC_REG_LDO1_VOLT = 0x4c, 67 + PF1550_PMIC_REG_LDO1_CTRL = 0x4d, 68 + PF1550_PMIC_REG_LDO2_VOLT = 0x4f, 69 + PF1550_PMIC_REG_LDO2_CTRL = 0x50, 70 + PF1550_PMIC_REG_LDO3_VOLT = 0x52, 71 + PF1550_PMIC_REG_LDO3_CTRL = 0x53, 72 + PF1550_PMIC_REG_PWRCTRL0 = 0x58, 73 + PF1550_PMIC_REG_PWRCTRL1 = 0x59, 74 + PF1550_PMIC_REG_PWRCTRL2 = 0x5a, 75 + PF1550_PMIC_REG_PWRCTRL3 = 0x5b, 76 + PF1550_PMIC_REG_SW1_PWRDN_SEQ = 0x5f, 77 + PF1550_PMIC_REG_SW2_PWRDN_SEQ = 0x60, 78 + PF1550_PMIC_REG_SW3_PWRDN_SEQ = 0x61, 79 + PF1550_PMIC_REG_LDO1_PWRDN_SEQ = 0x62, 80 + PF1550_PMIC_REG_LDO2_PWRDN_SEQ = 0x63, 81 + PF1550_PMIC_REG_LDO3_PWRDN_SEQ = 0x64, 82 + PF1550_PMIC_REG_VREFDDR_PWRDN_SEQ = 0x65, 83 + 84 + PF1550_PMIC_REG_STATE_INFO = 0x67, 85 + PF1550_PMIC_REG_I2C_ADDR = 0x68, 86 + PF1550_PMIC_REG_IO_DRV0 = 0x69, 87 + PF1550_PMIC_REG_IO_DRV1 = 0x6a, 88 + PF1550_PMIC_REG_RC_16MHZ = 0x6b, 89 + PF1550_PMIC_REG_KEY = 0x6f, 90 + 91 + /* Charger part */ 92 + PF1550_CHARG_REG_CHG_INT = 0x80, 93 + PF1550_CHARG_REG_CHG_INT_MASK = 0x82, 94 + PF1550_CHARG_REG_CHG_INT_OK = 0x84, 95 + PF1550_CHARG_REG_VBUS_SNS = 0x86, 96 + PF1550_CHARG_REG_CHG_SNS = 0x87, 97 + PF1550_CHARG_REG_BATT_SNS = 0x88, 98 + PF1550_CHARG_REG_CHG_OPER = 0x89, 99 + PF1550_CHARG_REG_CHG_TMR = 0x8a, 100 + PF1550_CHARG_REG_CHG_EOC_CNFG = 0x8d, 101 + PF1550_CHARG_REG_CHG_CURR_CNFG = 0x8e, 102 + PF1550_CHARG_REG_BATT_REG = 0x8f, 103 + PF1550_CHARG_REG_BATFET_CNFG = 0x91, 104 + PF1550_CHARG_REG_THM_REG_CNFG = 0x92, 105 + PF1550_CHARG_REG_VBUS_INLIM_CNFG = 0x94, 106 + PF1550_CHARG_REG_VBUS_LIN_DPM = 0x95, 107 + PF1550_CHARG_REG_USB_PHY_LDO_CNFG = 0x96, 108 + PF1550_CHARG_REG_DBNC_DELAY_TIME = 0x98, 109 + PF1550_CHARG_REG_CHG_INT_CNFG = 0x99, 110 + PF1550_CHARG_REG_THM_ADJ_SETTING = 0x9a, 111 + PF1550_CHARG_REG_VBUS2SYS_CNFG = 0x9b, 112 + PF1550_CHARG_REG_LED_PWM = 0x9c, 113 + PF1550_CHARG_REG_FAULT_BATFET_CNFG = 0x9d, 114 + PF1550_CHARG_REG_LED_CNFG = 0x9e, 115 + PF1550_CHARG_REG_CHGR_KEY2 = 0x9f, 116 + 117 + PF1550_TEST_REG_FMRADDR = 0xc4, 118 + PF1550_TEST_REG_FMRDATA = 0xc5, 119 + PF1550_TEST_REG_KEY3 = 0xdf, 120 + 121 + PF1550_PMIC_REG_END = 0xff, 122 + }; 123 + 124 + /* One-Time Programmable(OTP) memory */ 125 + enum pf1550_otp_reg { 126 + PF1550_OTP_SW1_SW2 = 0x1e, 127 + PF1550_OTP_SW2_SW3 = 0x1f, 128 + }; 129 + 130 + #define PF1550_DEVICE_ID 0x7c 131 + 132 + /* Keys for reading OTP */ 133 + #define PF1550_OTP_PMIC_KEY 0x15 134 + #define PF1550_OTP_CHGR_KEY 0x50 135 + #define PF1550_OTP_TEST_KEY 0xab 136 + 137 + /* Supported charger modes */ 138 + #define PF1550_CHG_BAT_OFF 1 139 + #define PF1550_CHG_BAT_ON 2 140 + 141 + #define PF1550_CHG_PRECHARGE 0 142 + #define PF1550_CHG_CONSTANT_CURRENT 1 143 + #define PF1550_CHG_CONSTANT_VOL 2 144 + #define PF1550_CHG_EOC 3 145 + #define PF1550_CHG_DONE 4 146 + #define PF1550_CHG_TIMER_FAULT 6 147 + #define PF1550_CHG_SUSPEND 7 148 + #define PF1550_CHG_OFF_INV 8 149 + #define PF1550_CHG_BAT_OVER 9 150 + #define PF1550_CHG_OFF_TEMP 10 151 + #define PF1550_CHG_LINEAR_ONLY 12 152 + #define PF1550_CHG_SNS_MASK 0xf 153 + #define PF1550_CHG_INT_MASK 0x51 154 + 155 + #define PF1550_BAT_NO_VBUS 0 156 + #define PF1550_BAT_LOW_THAN_PRECHARG 1 157 + #define PF1550_BAT_CHARG_FAIL 2 158 + #define PF1550_BAT_HIGH_THAN_PRECHARG 4 159 + #define PF1550_BAT_OVER_VOL 5 160 + #define PF1550_BAT_NO_DETECT 6 161 + #define PF1550_BAT_SNS_MASK 0x7 162 + 163 + #define PF1550_VBUS_UVLO BIT(2) 164 + #define PF1550_VBUS_IN2SYS BIT(3) 165 + #define PF1550_VBUS_OVLO BIT(4) 166 + #define PF1550_VBUS_VALID BIT(5) 167 + 168 + #define PF1550_CHARG_REG_BATT_REG_CHGCV_MASK 0x3f 169 + #define PF1550_CHARG_REG_BATT_REG_VMINSYS_SHIFT 6 170 + #define PF1550_CHARG_REG_BATT_REG_VMINSYS_MASK GENMASK(7, 6) 171 + #define PF1550_CHARG_REG_THM_REG_CNFG_REGTEMP_SHIFT 2 172 + #define PF1550_CHARG_REG_THM_REG_CNFG_REGTEMP_MASK GENMASK(3, 2) 173 + 174 + #define PF1550_ONKEY_RST_EN BIT(7) 175 + 176 + /* DVS enable masks */ 177 + #define OTP_SW1_DVS_ENB BIT(1) 178 + #define OTP_SW2_DVS_ENB BIT(3) 179 + 180 + /* Top level interrupt masks */ 181 + #define IRQ_REGULATOR (BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(6)) 182 + #define IRQ_ONKEY BIT(5) 183 + #define IRQ_CHG BIT(0) 184 + 185 + /* Regulator interrupt masks */ 186 + #define PMIC_IRQ_SW1_LS BIT(0) 187 + #define PMIC_IRQ_SW2_LS BIT(1) 188 + #define PMIC_IRQ_SW3_LS BIT(2) 189 + #define PMIC_IRQ_SW1_HS BIT(0) 190 + #define PMIC_IRQ_SW2_HS BIT(1) 191 + #define PMIC_IRQ_SW3_HS BIT(2) 192 + #define PMIC_IRQ_LDO1_FAULT BIT(0) 193 + #define PMIC_IRQ_LDO2_FAULT BIT(1) 194 + #define PMIC_IRQ_LDO3_FAULT BIT(2) 195 + #define PMIC_IRQ_TEMP_110 BIT(0) 196 + #define PMIC_IRQ_TEMP_125 BIT(1) 197 + 198 + /* Onkey interrupt masks */ 199 + #define ONKEY_IRQ_PUSHI BIT(0) 200 + #define ONKEY_IRQ_1SI BIT(1) 201 + #define ONKEY_IRQ_2SI BIT(2) 202 + #define ONKEY_IRQ_3SI BIT(3) 203 + #define ONKEY_IRQ_4SI BIT(4) 204 + #define ONKEY_IRQ_8SI BIT(5) 205 + 206 + /* Charger interrupt masks */ 207 + #define CHARG_IRQ_BAT2SOCI BIT(1) 208 + #define CHARG_IRQ_BATI BIT(2) 209 + #define CHARG_IRQ_CHGI BIT(3) 210 + #define CHARG_IRQ_VBUSI BIT(5) 211 + #define CHARG_IRQ_DPMI BIT(6) 212 + #define CHARG_IRQ_THMI BIT(7) 213 + 214 + enum pf1550_irq { 215 + PF1550_IRQ_CHG, 216 + PF1550_IRQ_REGULATOR, 217 + PF1550_IRQ_ONKEY, 218 + }; 219 + 220 + enum pf1550_pmic_irq { 221 + PF1550_PMIC_IRQ_SW1_LS, 222 + PF1550_PMIC_IRQ_SW2_LS, 223 + PF1550_PMIC_IRQ_SW3_LS, 224 + PF1550_PMIC_IRQ_SW1_HS, 225 + PF1550_PMIC_IRQ_SW2_HS, 226 + PF1550_PMIC_IRQ_SW3_HS, 227 + PF1550_PMIC_IRQ_LDO1_FAULT, 228 + PF1550_PMIC_IRQ_LDO2_FAULT, 229 + PF1550_PMIC_IRQ_LDO3_FAULT, 230 + PF1550_PMIC_IRQ_TEMP_110, 231 + PF1550_PMIC_IRQ_TEMP_125, 232 + }; 233 + 234 + enum pf1550_onkey_irq { 235 + PF1550_ONKEY_IRQ_PUSHI, 236 + PF1550_ONKEY_IRQ_1SI, 237 + PF1550_ONKEY_IRQ_2SI, 238 + PF1550_ONKEY_IRQ_3SI, 239 + PF1550_ONKEY_IRQ_4SI, 240 + PF1550_ONKEY_IRQ_8SI, 241 + }; 242 + 243 + enum pf1550_charg_irq { 244 + PF1550_CHARG_IRQ_BAT2SOCI, 245 + PF1550_CHARG_IRQ_BATI, 246 + PF1550_CHARG_IRQ_CHGI, 247 + PF1550_CHARG_IRQ_VBUSI, 248 + PF1550_CHARG_IRQ_THMI, 249 + }; 250 + 251 + enum pf1550_regulators { 252 + PF1550_SW1, 253 + PF1550_SW2, 254 + PF1550_SW3, 255 + PF1550_VREFDDR, 256 + PF1550_LDO1, 257 + PF1550_LDO2, 258 + PF1550_LDO3, 259 + }; 260 + 261 + struct pf1550_ddata { 262 + struct regmap_irq_chip_data *irq_data_regulator; 263 + struct regmap_irq_chip_data *irq_data_charger; 264 + struct regmap_irq_chip_data *irq_data_onkey; 265 + struct regmap_irq_chip_data *irq_data; 266 + struct regmap *regmap; 267 + struct device *dev; 268 + bool dvs1_enable; 269 + bool dvs2_enable; 270 + int irq; 271 + }; 272 + 273 + #endif /* __LINUX_MFD_PF1550_H */