1 // SPDX-License-Identifier: GPL-2.0+ 2 // 3 // Copyright (c) 2012 Samsung Electronics Co., Ltd 4 // http://www.samsung.com 5 6 #include <linux/module.h> 7 #include <linux/moduleparam.h> 8 #include <linux/init.h> 9 #include <linux/err.h> 10 #include <linux/slab.h> 11 #include <linux/i2c.h> 12 #include <linux/of.h> 13 #include <linux/of_device.h> 14 #include <linux/of_irq.h> 15 #include <linux/interrupt.h> 16 #include <linux/pm_runtime.h> 17 #include <linux/mutex.h> 18 #include <linux/mfd/core.h> 19 #include <linux/mfd/samsung/core.h> 20 #include <linux/mfd/samsung/irq.h> 21 #include <linux/mfd/samsung/s2mpa01.h> 22 #include <linux/mfd/samsung/s2mps11.h> 23 #include <linux/mfd/samsung/s2mps13.h> 24 #include <linux/mfd/samsung/s2mps14.h> 25 #include <linux/mfd/samsung/s2mps15.h> 26 #include <linux/mfd/samsung/s2mpu02.h> 27 #include <linux/mfd/samsung/s5m8763.h> 28 #include <linux/mfd/samsung/s5m8767.h> 29 #include <linux/regmap.h> 30 31 static const struct mfd_cell s5m8751_devs[] = { 32 { .name = "s5m8751-pmic", }, 33 { .name = "s5m-charger", }, 34 { .name = "s5m8751-codec", }, 35 }; 36 37 static const struct mfd_cell s5m8763_devs[] = { 38 { .name = "s5m8763-pmic", }, 39 { .name = "s5m-rtc", }, 40 { .name = "s5m-charger", }, 41 }; 42 43 static const struct mfd_cell s5m8767_devs[] = { 44 { .name = "s5m8767-pmic", }, 45 { .name = "s5m-rtc", }, 46 { 47 .name = "s5m8767-clk", 48 .of_compatible = "samsung,s5m8767-clk", 49 }, 50 }; 51 52 static const struct mfd_cell s2mps11_devs[] = { 53 { .name = "s2mps11-regulator", }, 54 { .name = "s2mps14-rtc", }, 55 { 56 .name = "s2mps11-clk", 57 .of_compatible = "samsung,s2mps11-clk", 58 }, 59 }; 60 61 static const struct mfd_cell s2mps13_devs[] = { 62 { .name = "s2mps13-regulator", }, 63 { .name = "s2mps13-rtc", }, 64 { 65 .name = "s2mps13-clk", 66 .of_compatible = "samsung,s2mps13-clk", 67 }, 68 }; 69 70 static const struct mfd_cell s2mps14_devs[] = { 71 { .name = "s2mps14-regulator", }, 72 { .name = "s2mps14-rtc", }, 73 { 74 .name = "s2mps14-clk", 75 .of_compatible = "samsung,s2mps14-clk", 76 }, 77 }; 78 79 static const struct mfd_cell s2mps15_devs[] = { 80 { .name = "s2mps15-regulator", }, 81 { .name = "s2mps15-rtc", }, 82 { 83 .name = "s2mps13-clk", 84 .of_compatible = "samsung,s2mps13-clk", 85 }, 86 }; 87 88 static const struct mfd_cell s2mpa01_devs[] = { 89 { .name = "s2mpa01-pmic", }, 90 { .name = "s2mps14-rtc", }, 91 }; 92 93 static const struct mfd_cell s2mpu02_devs[] = { 94 { .name = "s2mpu02-regulator", }, 95 }; 96 97 static const struct of_device_id sec_dt_match[] = { 98 { 99 .compatible = "samsung,s5m8767-pmic", 100 .data = (void *)S5M8767X, 101 }, { 102 .compatible = "samsung,s2mps11-pmic", 103 .data = (void *)S2MPS11X, 104 }, { 105 .compatible = "samsung,s2mps13-pmic", 106 .data = (void *)S2MPS13X, 107 }, { 108 .compatible = "samsung,s2mps14-pmic", 109 .data = (void *)S2MPS14X, 110 }, { 111 .compatible = "samsung,s2mps15-pmic", 112 .data = (void *)S2MPS15X, 113 }, { 114 .compatible = "samsung,s2mpa01-pmic", 115 .data = (void *)S2MPA01, 116 }, { 117 .compatible = "samsung,s2mpu02-pmic", 118 .data = (void *)S2MPU02, 119 }, { 120 /* Sentinel */ 121 }, 122 }; 123 MODULE_DEVICE_TABLE(of, sec_dt_match); 124 125 static bool s2mpa01_volatile(struct device *dev, unsigned int reg) 126 { 127 switch (reg) { 128 case S2MPA01_REG_INT1M: 129 case S2MPA01_REG_INT2M: 130 case S2MPA01_REG_INT3M: 131 return false; 132 default: 133 return true; 134 } 135 } 136 137 static bool s2mps11_volatile(struct device *dev, unsigned int reg) 138 { 139 switch (reg) { 140 case S2MPS11_REG_INT1M: 141 case S2MPS11_REG_INT2M: 142 case S2MPS11_REG_INT3M: 143 return false; 144 default: 145 return true; 146 } 147 } 148 149 static bool s2mpu02_volatile(struct device *dev, unsigned int reg) 150 { 151 switch (reg) { 152 case S2MPU02_REG_INT1M: 153 case S2MPU02_REG_INT2M: 154 case S2MPU02_REG_INT3M: 155 return false; 156 default: 157 return true; 158 } 159 } 160 161 static bool s5m8763_volatile(struct device *dev, unsigned int reg) 162 { 163 switch (reg) { 164 case S5M8763_REG_IRQM1: 165 case S5M8763_REG_IRQM2: 166 case S5M8763_REG_IRQM3: 167 case S5M8763_REG_IRQM4: 168 return false; 169 default: 170 return true; 171 } 172 } 173 174 static const struct regmap_config sec_regmap_config = { 175 .reg_bits = 8, 176 .val_bits = 8, 177 }; 178 179 static const struct regmap_config s2mpa01_regmap_config = { 180 .reg_bits = 8, 181 .val_bits = 8, 182 183 .max_register = S2MPA01_REG_LDO_OVCB4, 184 .volatile_reg = s2mpa01_volatile, 185 .cache_type = REGCACHE_FLAT, 186 }; 187 188 static const struct regmap_config s2mps11_regmap_config = { 189 .reg_bits = 8, 190 .val_bits = 8, 191 192 .max_register = S2MPS11_REG_L38CTRL, 193 .volatile_reg = s2mps11_volatile, 194 .cache_type = REGCACHE_FLAT, 195 }; 196 197 static const struct regmap_config s2mps13_regmap_config = { 198 .reg_bits = 8, 199 .val_bits = 8, 200 201 .max_register = S2MPS13_REG_LDODSCH5, 202 .volatile_reg = s2mps11_volatile, 203 .cache_type = REGCACHE_FLAT, 204 }; 205 206 static const struct regmap_config s2mps14_regmap_config = { 207 .reg_bits = 8, 208 .val_bits = 8, 209 210 .max_register = S2MPS14_REG_LDODSCH3, 211 .volatile_reg = s2mps11_volatile, 212 .cache_type = REGCACHE_FLAT, 213 }; 214 215 static const struct regmap_config s2mps15_regmap_config = { 216 .reg_bits = 8, 217 .val_bits = 8, 218 219 .max_register = S2MPS15_REG_LDODSCH4, 220 .volatile_reg = s2mps11_volatile, 221 .cache_type = REGCACHE_FLAT, 222 }; 223 224 static const struct regmap_config s2mpu02_regmap_config = { 225 .reg_bits = 8, 226 .val_bits = 8, 227 228 .max_register = S2MPU02_REG_DVSDATA, 229 .volatile_reg = s2mpu02_volatile, 230 .cache_type = REGCACHE_FLAT, 231 }; 232 233 static const struct regmap_config s5m8763_regmap_config = { 234 .reg_bits = 8, 235 .val_bits = 8, 236 237 .max_register = S5M8763_REG_LBCNFG2, 238 .volatile_reg = s5m8763_volatile, 239 .cache_type = REGCACHE_FLAT, 240 }; 241 242 static const struct regmap_config s5m8767_regmap_config = { 243 .reg_bits = 8, 244 .val_bits = 8, 245 246 .max_register = S5M8767_REG_LDO28CTRL, 247 .volatile_reg = s2mps11_volatile, 248 .cache_type = REGCACHE_FLAT, 249 }; 250 251 static void sec_pmic_dump_rev(struct sec_pmic_dev *sec_pmic) 252 { 253 unsigned int val; 254 255 /* For each device type, the REG_ID is always the first register */ 256 if (!regmap_read(sec_pmic->regmap_pmic, S2MPS11_REG_ID, &val)) 257 dev_dbg(sec_pmic->dev, "Revision: 0x%x\n", val); 258 } 259 260 static void sec_pmic_configure(struct sec_pmic_dev *sec_pmic) 261 { 262 int err; 263 264 if (sec_pmic->device_type != S2MPS13X) 265 return; 266 267 if (sec_pmic->pdata->disable_wrstbi) { 268 /* 269 * If WRSTBI pin is pulled down this feature must be disabled 270 * because each Suspend to RAM will trigger buck voltage reset 271 * to default values. 272 */ 273 err = regmap_update_bits(sec_pmic->regmap_pmic, 274 S2MPS13_REG_WRSTBI, 275 S2MPS13_REG_WRSTBI_MASK, 0x0); 276 if (err) 277 dev_warn(sec_pmic->dev, 278 "Cannot initialize WRSTBI config: %d\n", 279 err); 280 } 281 } 282 283 /* 284 * Only the common platform data elements for s5m8767 are parsed here from the 285 * device tree. Other sub-modules of s5m8767 such as pmic, rtc , charger and 286 * others have to parse their own platform data elements from device tree. 287 * 288 * The s5m8767 platform data structure is instantiated here and the drivers for 289 * the sub-modules need not instantiate another instance while parsing their 290 * platform data. 291 */ 292 static struct sec_platform_data * 293 sec_pmic_i2c_parse_dt_pdata(struct device *dev) 294 { 295 struct sec_platform_data *pd; 296 297 pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); 298 if (!pd) 299 return ERR_PTR(-ENOMEM); 300 301 /* 302 * ToDo: the 'wakeup' member in the platform data is more of a linux 303 * specfic information. Hence, there is no binding for that yet and 304 * not parsed here. 305 */ 306 307 pd->manual_poweroff = of_property_read_bool(dev->of_node, 308 "samsung,s2mps11-acokb-ground"); 309 pd->disable_wrstbi = of_property_read_bool(dev->of_node, 310 "samsung,s2mps11-wrstbi-ground"); 311 return pd; 312 } 313 314 static int sec_pmic_probe(struct i2c_client *i2c, 315 const struct i2c_device_id *id) 316 { 317 const struct regmap_config *regmap; 318 struct sec_platform_data *pdata; 319 const struct mfd_cell *sec_devs; 320 struct sec_pmic_dev *sec_pmic; 321 int ret, num_sec_devs; 322 323 sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev), 324 GFP_KERNEL); 325 if (sec_pmic == NULL) 326 return -ENOMEM; 327 328 i2c_set_clientdata(i2c, sec_pmic); 329 sec_pmic->dev = &i2c->dev; 330 sec_pmic->i2c = i2c; 331 sec_pmic->irq = i2c->irq; 332 333 pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev); 334 if (IS_ERR(pdata)) { 335 ret = PTR_ERR(pdata); 336 return ret; 337 } 338 339 sec_pmic->device_type = (unsigned long)of_device_get_match_data(sec_pmic->dev); 340 sec_pmic->irq_base = pdata->irq_base; 341 sec_pmic->wakeup = pdata->wakeup; 342 sec_pmic->pdata = pdata; 343 344 switch (sec_pmic->device_type) { 345 case S2MPA01: 346 regmap = &s2mpa01_regmap_config; 347 break; 348 case S2MPS11X: 349 regmap = &s2mps11_regmap_config; 350 break; 351 case S2MPS13X: 352 regmap = &s2mps13_regmap_config; 353 break; 354 case S2MPS14X: 355 regmap = &s2mps14_regmap_config; 356 break; 357 case S2MPS15X: 358 regmap = &s2mps15_regmap_config; 359 break; 360 case S5M8763X: 361 regmap = &s5m8763_regmap_config; 362 break; 363 case S5M8767X: 364 regmap = &s5m8767_regmap_config; 365 break; 366 case S2MPU02: 367 regmap = &s2mpu02_regmap_config; 368 break; 369 default: 370 regmap = &sec_regmap_config; 371 break; 372 } 373 374 sec_pmic->regmap_pmic = devm_regmap_init_i2c(i2c, regmap); 375 if (IS_ERR(sec_pmic->regmap_pmic)) { 376 ret = PTR_ERR(sec_pmic->regmap_pmic); 377 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 378 ret); 379 return ret; 380 } 381 382 sec_irq_init(sec_pmic); 383 384 pm_runtime_set_active(sec_pmic->dev); 385 386 switch (sec_pmic->device_type) { 387 case S5M8751X: 388 sec_devs = s5m8751_devs; 389 num_sec_devs = ARRAY_SIZE(s5m8751_devs); 390 break; 391 case S5M8763X: 392 sec_devs = s5m8763_devs; 393 num_sec_devs = ARRAY_SIZE(s5m8763_devs); 394 break; 395 case S5M8767X: 396 sec_devs = s5m8767_devs; 397 num_sec_devs = ARRAY_SIZE(s5m8767_devs); 398 break; 399 case S2MPA01: 400 sec_devs = s2mpa01_devs; 401 num_sec_devs = ARRAY_SIZE(s2mpa01_devs); 402 break; 403 case S2MPS11X: 404 sec_devs = s2mps11_devs; 405 num_sec_devs = ARRAY_SIZE(s2mps11_devs); 406 break; 407 case S2MPS13X: 408 sec_devs = s2mps13_devs; 409 num_sec_devs = ARRAY_SIZE(s2mps13_devs); 410 break; 411 case S2MPS14X: 412 sec_devs = s2mps14_devs; 413 num_sec_devs = ARRAY_SIZE(s2mps14_devs); 414 break; 415 case S2MPS15X: 416 sec_devs = s2mps15_devs; 417 num_sec_devs = ARRAY_SIZE(s2mps15_devs); 418 break; 419 case S2MPU02: 420 sec_devs = s2mpu02_devs; 421 num_sec_devs = ARRAY_SIZE(s2mpu02_devs); 422 break; 423 default: 424 dev_err(&i2c->dev, "Unsupported device type (%lu)\n", 425 sec_pmic->device_type); 426 return -ENODEV; 427 } 428 ret = devm_mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs, 429 NULL, 0, NULL); 430 if (ret) 431 return ret; 432 433 device_init_wakeup(sec_pmic->dev, sec_pmic->wakeup); 434 sec_pmic_configure(sec_pmic); 435 sec_pmic_dump_rev(sec_pmic); 436 437 return ret; 438 } 439 440 static void sec_pmic_shutdown(struct i2c_client *i2c) 441 { 442 struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); 443 unsigned int reg, mask; 444 445 if (!sec_pmic->pdata->manual_poweroff) 446 return; 447 448 switch (sec_pmic->device_type) { 449 case S2MPS11X: 450 reg = S2MPS11_REG_CTRL1; 451 mask = S2MPS11_CTRL1_PWRHOLD_MASK; 452 break; 453 default: 454 /* 455 * Currently only one board with S2MPS11 needs this, so just 456 * ignore the rest. 457 */ 458 dev_warn(sec_pmic->dev, 459 "Unsupported device %lu for manual power off\n", 460 sec_pmic->device_type); 461 return; 462 } 463 464 regmap_update_bits(sec_pmic->regmap_pmic, reg, mask, 0); 465 } 466 467 #ifdef CONFIG_PM_SLEEP 468 static int sec_pmic_suspend(struct device *dev) 469 { 470 struct i2c_client *i2c = to_i2c_client(dev); 471 struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); 472 473 if (device_may_wakeup(dev)) 474 enable_irq_wake(sec_pmic->irq); 475 /* 476 * PMIC IRQ must be disabled during suspend for RTC alarm 477 * to work properly. 478 * When device is woken up from suspend, an 479 * interrupt occurs before resuming I2C bus controller. 480 * The interrupt is handled by regmap_irq_thread which tries 481 * to read RTC registers. This read fails (I2C is still 482 * suspended) and RTC Alarm interrupt is disabled. 483 */ 484 disable_irq(sec_pmic->irq); 485 486 return 0; 487 } 488 489 static int sec_pmic_resume(struct device *dev) 490 { 491 struct i2c_client *i2c = to_i2c_client(dev); 492 struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c); 493 494 if (device_may_wakeup(dev)) 495 disable_irq_wake(sec_pmic->irq); 496 enable_irq(sec_pmic->irq); 497 498 return 0; 499 } 500 #endif /* CONFIG_PM_SLEEP */ 501 502 static SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume); 503 504 static struct i2c_driver sec_pmic_driver = { 505 .driver = { 506 .name = "sec_pmic", 507 .pm = &sec_pmic_pm_ops, 508 .of_match_table = sec_dt_match, 509 }, 510 .probe = sec_pmic_probe, 511 .shutdown = sec_pmic_shutdown, 512 }; 513 module_i2c_driver(sec_pmic_driver); 514 515 MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); 516 MODULE_DESCRIPTION("Core support for the S5M MFD"); 517 MODULE_LICENSE("GPL"); 518