sec-core.c 12 KB

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