1 // SPDX-License-Identifier: GPL-2.0+ 2 // 3 // max77693.c - mfd core driver for the MAX 77693 4 // 5 // Copyright (C) 2012 Samsung Electronics 6 // SangYoung Son <hello.son@samsung.com> 7 // 8 // This program is not provided / owned by Maxim Integrated Products. 9 // 10 // This driver is based on max8997.c 11 12 #include <linux/module.h> 13 #include <linux/slab.h> 14 #include <linux/i2c.h> 15 #include <linux/err.h> 16 #include <linux/interrupt.h> 17 #include <linux/of.h> 18 #include <linux/pm_runtime.h> 19 #include <linux/mutex.h> 20 #include <linux/mfd/core.h> 21 #include <linux/mfd/max77693.h> 22 #include <linux/mfd/max77693-common.h> 23 #include <linux/mfd/max77693-private.h> 24 #include <linux/regulator/machine.h> 25 #include <linux/regmap.h> 26 27 #define I2C_ADDR_PMIC (0xCC >> 1) /* Charger, Flash LED */ 28 #define I2C_ADDR_MUIC (0x4A >> 1) 29 #define I2C_ADDR_HAPTIC (0x90 >> 1) 30 31 static const struct mfd_cell max77693_devs[] = { 32 { .name = "max77693-pmic", }, 33 { 34 .name = "max77693-charger", 35 .of_compatible = "maxim,max77693-charger", 36 }, 37 { 38 .name = "max77693-muic", 39 .of_compatible = "maxim,max77693-muic", 40 }, 41 { 42 .name = "max77693-haptic", 43 .of_compatible = "maxim,max77693-haptic", 44 }, 45 { 46 .name = "max77693-led", 47 .of_compatible = "maxim,max77693-led", 48 }, 49 }; 50 51 static const struct regmap_config max77693_regmap_config = { 52 .reg_bits = 8, 53 .val_bits = 8, 54 .max_register = MAX77693_PMIC_REG_END, 55 }; 56 57 static const struct regmap_irq max77693_led_irqs[] = { 58 { .mask = LED_IRQ_FLED2_OPEN, }, 59 { .mask = LED_IRQ_FLED2_SHORT, }, 60 { .mask = LED_IRQ_FLED1_OPEN, }, 61 { .mask = LED_IRQ_FLED1_SHORT, }, 62 { .mask = LED_IRQ_MAX_FLASH, }, 63 }; 64 65 static const struct regmap_irq_chip max77693_led_irq_chip = { 66 .name = "max77693-led", 67 .status_base = MAX77693_LED_REG_FLASH_INT, 68 .mask_base = MAX77693_LED_REG_FLASH_INT_MASK, 69 .num_regs = 1, 70 .irqs = max77693_led_irqs, 71 .num_irqs = ARRAY_SIZE(max77693_led_irqs), 72 }; 73 74 static const struct regmap_irq max77693_topsys_irqs[] = { 75 { .mask = TOPSYS_IRQ_T120C_INT, }, 76 { .mask = TOPSYS_IRQ_T140C_INT, }, 77 { .mask = TOPSYS_IRQ_LOWSYS_INT, }, 78 }; 79 80 static const struct regmap_irq_chip max77693_topsys_irq_chip = { 81 .name = "max77693-topsys", 82 .status_base = MAX77693_PMIC_REG_TOPSYS_INT, 83 .mask_base = MAX77693_PMIC_REG_TOPSYS_INT_MASK, 84 .num_regs = 1, 85 .irqs = max77693_topsys_irqs, 86 .num_irqs = ARRAY_SIZE(max77693_topsys_irqs), 87 }; 88 89 static const struct regmap_irq max77693_charger_irqs[] = { 90 { .mask = CHG_IRQ_BYP_I, }, 91 { .mask = CHG_IRQ_THM_I, }, 92 { .mask = CHG_IRQ_BAT_I, }, 93 { .mask = CHG_IRQ_CHG_I, }, 94 { .mask = CHG_IRQ_CHGIN_I, }, 95 }; 96 97 static const struct regmap_irq_chip max77693_charger_irq_chip = { 98 .name = "max77693-charger", 99 .status_base = MAX77693_CHG_REG_CHG_INT, 100 .mask_base = MAX77693_CHG_REG_CHG_INT_MASK, 101 .num_regs = 1, 102 .irqs = max77693_charger_irqs, 103 .num_irqs = ARRAY_SIZE(max77693_charger_irqs), 104 }; 105 106 static const struct regmap_config max77693_regmap_muic_config = { 107 .reg_bits = 8, 108 .val_bits = 8, 109 .max_register = MAX77693_MUIC_REG_END, 110 }; 111 112 static const struct regmap_irq max77693_muic_irqs[] = { 113 { .reg_offset = 0, .mask = MUIC_IRQ_INT1_ADC, }, 114 { .reg_offset = 0, .mask = MUIC_IRQ_INT1_ADC_LOW, }, 115 { .reg_offset = 0, .mask = MUIC_IRQ_INT1_ADC_ERR, }, 116 { .reg_offset = 0, .mask = MUIC_IRQ_INT1_ADC1K, }, 117 118 { .reg_offset = 1, .mask = MUIC_IRQ_INT2_CHGTYP, }, 119 { .reg_offset = 1, .mask = MUIC_IRQ_INT2_CHGDETREUN, }, 120 { .reg_offset = 1, .mask = MUIC_IRQ_INT2_DCDTMR, }, 121 { .reg_offset = 1, .mask = MUIC_IRQ_INT2_DXOVP, }, 122 { .reg_offset = 1, .mask = MUIC_IRQ_INT2_VBVOLT, }, 123 { .reg_offset = 1, .mask = MUIC_IRQ_INT2_VIDRM, }, 124 125 { .reg_offset = 2, .mask = MUIC_IRQ_INT3_EOC, }, 126 { .reg_offset = 2, .mask = MUIC_IRQ_INT3_CGMBC, }, 127 { .reg_offset = 2, .mask = MUIC_IRQ_INT3_OVP, }, 128 { .reg_offset = 2, .mask = MUIC_IRQ_INT3_MBCCHG_ERR, }, 129 { .reg_offset = 2, .mask = MUIC_IRQ_INT3_CHG_ENABLED, }, 130 { .reg_offset = 2, .mask = MUIC_IRQ_INT3_BAT_DET, }, 131 }; 132 133 static const struct regmap_irq_chip max77693_muic_irq_chip = { 134 .name = "max77693-muic", 135 .status_base = MAX77693_MUIC_REG_INT1, 136 .unmask_base = MAX77693_MUIC_REG_INTMASK1, 137 .num_regs = 3, 138 .irqs = max77693_muic_irqs, 139 .num_irqs = ARRAY_SIZE(max77693_muic_irqs), 140 }; 141 142 static const struct regmap_config max77693_regmap_haptic_config = { 143 .reg_bits = 8, 144 .val_bits = 8, 145 .max_register = MAX77693_HAPTIC_REG_END, 146 }; 147 148 static int max77693_i2c_probe(struct i2c_client *i2c) 149 { 150 const struct i2c_device_id *id = i2c_client_get_device_id(i2c); 151 struct max77693_dev *max77693; 152 unsigned int reg_data; 153 int ret = 0; 154 155 max77693 = devm_kzalloc_obj(&i2c->dev, struct max77693_dev); 156 if (max77693 == NULL) 157 return -ENOMEM; 158 159 i2c_set_clientdata(i2c, max77693); 160 max77693->dev = &i2c->dev; 161 max77693->i2c = i2c; 162 max77693->irq = i2c->irq; 163 max77693->type = id->driver_data; 164 165 max77693->regmap = devm_regmap_init_i2c(i2c, &max77693_regmap_config); 166 if (IS_ERR(max77693->regmap)) { 167 ret = PTR_ERR(max77693->regmap); 168 dev_err(max77693->dev, "failed to allocate register map: %d\n", 169 ret); 170 return ret; 171 } 172 173 ret = regmap_read(max77693->regmap, MAX77693_PMIC_REG_PMIC_ID2, 174 ®_data); 175 if (ret < 0) { 176 dev_err(max77693->dev, "device not found on this channel\n"); 177 return ret; 178 } else 179 dev_info(max77693->dev, "device ID: 0x%x\n", reg_data); 180 181 max77693->i2c_muic = i2c_new_dummy_device(i2c->adapter, I2C_ADDR_MUIC); 182 if (IS_ERR(max77693->i2c_muic)) { 183 dev_err(max77693->dev, "Failed to allocate I2C device for MUIC\n"); 184 return PTR_ERR(max77693->i2c_muic); 185 } 186 i2c_set_clientdata(max77693->i2c_muic, max77693); 187 188 max77693->i2c_haptic = i2c_new_dummy_device(i2c->adapter, I2C_ADDR_HAPTIC); 189 if (IS_ERR(max77693->i2c_haptic)) { 190 dev_err(max77693->dev, "Failed to allocate I2C device for Haptic\n"); 191 ret = PTR_ERR(max77693->i2c_haptic); 192 goto err_i2c_haptic; 193 } 194 i2c_set_clientdata(max77693->i2c_haptic, max77693); 195 196 max77693->regmap_haptic = devm_regmap_init_i2c(max77693->i2c_haptic, 197 &max77693_regmap_haptic_config); 198 if (IS_ERR(max77693->regmap_haptic)) { 199 ret = PTR_ERR(max77693->regmap_haptic); 200 dev_err(max77693->dev, 201 "failed to initialize haptic register map: %d\n", ret); 202 goto err_regmap; 203 } 204 205 /* 206 * Initialize register map for MUIC device because use regmap-muic 207 * instance of MUIC device when irq of max77693 is initialized 208 * before call max77693-muic probe() function. 209 */ 210 max77693->regmap_muic = devm_regmap_init_i2c(max77693->i2c_muic, 211 &max77693_regmap_muic_config); 212 if (IS_ERR(max77693->regmap_muic)) { 213 ret = PTR_ERR(max77693->regmap_muic); 214 dev_err(max77693->dev, 215 "failed to allocate register map: %d\n", ret); 216 goto err_regmap; 217 } 218 219 ret = regmap_add_irq_chip(max77693->regmap, max77693->irq, 220 IRQF_ONESHOT | IRQF_SHARED, 0, 221 &max77693_led_irq_chip, 222 &max77693->irq_data_led); 223 if (ret) { 224 dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); 225 goto err_regmap; 226 } 227 228 ret = regmap_add_irq_chip(max77693->regmap, max77693->irq, 229 IRQF_ONESHOT | IRQF_SHARED, 0, 230 &max77693_topsys_irq_chip, 231 &max77693->irq_data_topsys); 232 if (ret) { 233 dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); 234 goto err_irq_topsys; 235 } 236 237 ret = regmap_add_irq_chip(max77693->regmap, max77693->irq, 238 IRQF_ONESHOT | IRQF_SHARED, 0, 239 &max77693_charger_irq_chip, 240 &max77693->irq_data_chg); 241 if (ret) { 242 dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); 243 goto err_irq_charger; 244 } 245 246 ret = regmap_add_irq_chip(max77693->regmap_muic, max77693->irq, 247 IRQF_ONESHOT | IRQF_SHARED, 0, 248 &max77693_muic_irq_chip, 249 &max77693->irq_data_muic); 250 if (ret) { 251 dev_err(max77693->dev, "failed to add irq chip: %d\n", ret); 252 goto err_irq_muic; 253 } 254 255 /* Unmask interrupts from all blocks in interrupt source register */ 256 ret = regmap_update_bits(max77693->regmap, 257 MAX77693_PMIC_REG_INTSRC_MASK, 258 SRC_IRQ_ALL, (unsigned int)~SRC_IRQ_ALL); 259 if (ret < 0) { 260 dev_err(max77693->dev, 261 "Could not unmask interrupts in INTSRC: %d\n", 262 ret); 263 goto err_intsrc; 264 } 265 266 pm_runtime_set_active(max77693->dev); 267 268 ret = mfd_add_devices(max77693->dev, -1, max77693_devs, 269 ARRAY_SIZE(max77693_devs), NULL, 0, NULL); 270 if (ret < 0) 271 goto err_mfd; 272 273 return ret; 274 275 err_mfd: 276 mfd_remove_devices(max77693->dev); 277 err_intsrc: 278 regmap_del_irq_chip(max77693->irq, max77693->irq_data_muic); 279 err_irq_muic: 280 regmap_del_irq_chip(max77693->irq, max77693->irq_data_chg); 281 err_irq_charger: 282 regmap_del_irq_chip(max77693->irq, max77693->irq_data_topsys); 283 err_irq_topsys: 284 regmap_del_irq_chip(max77693->irq, max77693->irq_data_led); 285 err_regmap: 286 i2c_unregister_device(max77693->i2c_haptic); 287 err_i2c_haptic: 288 i2c_unregister_device(max77693->i2c_muic); 289 return ret; 290 } 291 292 static void max77693_i2c_remove(struct i2c_client *i2c) 293 { 294 struct max77693_dev *max77693 = i2c_get_clientdata(i2c); 295 296 mfd_remove_devices(max77693->dev); 297 298 regmap_del_irq_chip(max77693->irq, max77693->irq_data_muic); 299 regmap_del_irq_chip(max77693->irq, max77693->irq_data_chg); 300 regmap_del_irq_chip(max77693->irq, max77693->irq_data_topsys); 301 regmap_del_irq_chip(max77693->irq, max77693->irq_data_led); 302 303 i2c_unregister_device(max77693->i2c_muic); 304 i2c_unregister_device(max77693->i2c_haptic); 305 } 306 307 static const struct i2c_device_id max77693_i2c_id[] = { 308 { "max77693", TYPE_MAX77693 }, 309 { } 310 }; 311 MODULE_DEVICE_TABLE(i2c, max77693_i2c_id); 312 313 static int max77693_suspend(struct device *dev) 314 { 315 struct i2c_client *i2c = to_i2c_client(dev); 316 struct max77693_dev *max77693 = i2c_get_clientdata(i2c); 317 318 if (device_may_wakeup(dev)) { 319 enable_irq_wake(max77693->irq); 320 disable_irq(max77693->irq); 321 } 322 323 return 0; 324 } 325 326 static int max77693_resume(struct device *dev) 327 { 328 struct i2c_client *i2c = to_i2c_client(dev); 329 struct max77693_dev *max77693 = i2c_get_clientdata(i2c); 330 331 if (device_may_wakeup(dev)) { 332 disable_irq_wake(max77693->irq); 333 enable_irq(max77693->irq); 334 } 335 336 return 0; 337 } 338 339 static const struct dev_pm_ops max77693_pm = { 340 .suspend = max77693_suspend, 341 .resume = max77693_resume, 342 }; 343 344 #ifdef CONFIG_OF 345 static const struct of_device_id max77693_dt_match[] = { 346 { .compatible = "maxim,max77693" }, 347 {}, 348 }; 349 MODULE_DEVICE_TABLE(of, max77693_dt_match); 350 #endif 351 352 static struct i2c_driver max77693_i2c_driver = { 353 .driver = { 354 .name = "max77693", 355 .pm = &max77693_pm, 356 .of_match_table = of_match_ptr(max77693_dt_match), 357 }, 358 .probe = max77693_i2c_probe, 359 .remove = max77693_i2c_remove, 360 .id_table = max77693_i2c_id, 361 }; 362 363 module_i2c_driver(max77693_i2c_driver); 364 365 MODULE_DESCRIPTION("MAXIM 77693 multi-function core driver"); 366 MODULE_AUTHOR("SangYoung, Son <hello.son@samsung.com>"); 367 MODULE_LICENSE("GPL"); 368