lp8755.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * LP8755 High Performance Power Management Unit : System Interface Driver
  4. * (based on rev. 0.26)
  5. * Copyright 2012 Texas Instruments
  6. *
  7. * Author: Daniel(Geon Si) Jeong <daniel.jeong@ti.com>
  8. */
  9. #include <linux/module.h>
  10. #include <linux/slab.h>
  11. #include <linux/i2c.h>
  12. #include <linux/err.h>
  13. #include <linux/irq.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/regmap.h>
  16. #include <linux/uaccess.h>
  17. #include <linux/regulator/driver.h>
  18. #include <linux/regulator/machine.h>
  19. #include <linux/platform_data/lp8755.h>
  20. #define LP8755_REG_BUCK0 0x00
  21. #define LP8755_REG_BUCK1 0x03
  22. #define LP8755_REG_BUCK2 0x04
  23. #define LP8755_REG_BUCK3 0x01
  24. #define LP8755_REG_BUCK4 0x05
  25. #define LP8755_REG_BUCK5 0x02
  26. #define LP8755_REG_MAX 0xFF
  27. #define LP8755_BUCK_EN_M BIT(7)
  28. #define LP8755_BUCK_LINEAR_OUT_MAX 0x76
  29. #define LP8755_BUCK_VOUT_M 0x7F
  30. struct lp8755_mphase {
  31. int nreg;
  32. int buck_num[LP8755_BUCK_MAX];
  33. };
  34. struct lp8755_chip {
  35. struct device *dev;
  36. struct regmap *regmap;
  37. struct lp8755_platform_data *pdata;
  38. int irq;
  39. unsigned int irqmask;
  40. int mphase;
  41. struct regulator_dev *rdev[LP8755_BUCK_MAX];
  42. };
  43. static int lp8755_buck_enable_time(struct regulator_dev *rdev)
  44. {
  45. int ret;
  46. unsigned int regval;
  47. enum lp8755_bucks id = rdev_get_id(rdev);
  48. ret = regmap_read(rdev->regmap, 0x12 + id, &regval);
  49. if (ret < 0) {
  50. dev_err(&rdev->dev, "i2c access error %s\n", __func__);
  51. return ret;
  52. }
  53. return (regval & 0xff) * 100;
  54. }
  55. static int lp8755_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
  56. {
  57. int ret;
  58. unsigned int regbval = 0x0;
  59. enum lp8755_bucks id = rdev_get_id(rdev);
  60. struct lp8755_chip *pchip = rdev_get_drvdata(rdev);
  61. switch (mode) {
  62. case REGULATOR_MODE_FAST:
  63. /* forced pwm mode */
  64. regbval = (0x01 << id);
  65. break;
  66. case REGULATOR_MODE_NORMAL:
  67. /* enable automatic pwm/pfm mode */
  68. ret = regmap_update_bits(rdev->regmap, 0x08 + id, 0x20, 0x00);
  69. if (ret < 0)
  70. goto err_i2c;
  71. break;
  72. case REGULATOR_MODE_IDLE:
  73. /* enable automatic pwm/pfm/lppfm mode */
  74. ret = regmap_update_bits(rdev->regmap, 0x08 + id, 0x20, 0x20);
  75. if (ret < 0)
  76. goto err_i2c;
  77. ret = regmap_update_bits(rdev->regmap, 0x10, 0x01, 0x01);
  78. if (ret < 0)
  79. goto err_i2c;
  80. break;
  81. default:
  82. dev_err(pchip->dev, "Not supported buck mode %s\n", __func__);
  83. /* forced pwm mode */
  84. regbval = (0x01 << id);
  85. }
  86. ret = regmap_update_bits(rdev->regmap, 0x06, 0x01 << id, regbval);
  87. if (ret < 0)
  88. goto err_i2c;
  89. return ret;
  90. err_i2c:
  91. dev_err(&rdev->dev, "i2c access error %s\n", __func__);
  92. return ret;
  93. }
  94. static unsigned int lp8755_buck_get_mode(struct regulator_dev *rdev)
  95. {
  96. int ret;
  97. unsigned int regval;
  98. enum lp8755_bucks id = rdev_get_id(rdev);
  99. ret = regmap_read(rdev->regmap, 0x06, &regval);
  100. if (ret < 0)
  101. goto err_i2c;
  102. /* mode fast means forced pwm mode */
  103. if (regval & (0x01 << id))
  104. return REGULATOR_MODE_FAST;
  105. ret = regmap_read(rdev->regmap, 0x08 + id, &regval);
  106. if (ret < 0)
  107. goto err_i2c;
  108. /* mode idle means automatic pwm/pfm/lppfm mode */
  109. if (regval & 0x20)
  110. return REGULATOR_MODE_IDLE;
  111. /* mode normal means automatic pwm/pfm mode */
  112. return REGULATOR_MODE_NORMAL;
  113. err_i2c:
  114. dev_err(&rdev->dev, "i2c access error %s\n", __func__);
  115. return 0;
  116. }
  117. static const unsigned int lp8755_buck_ramp_table[] = {
  118. 30000, 15000, 7500, 3800, 1900, 940, 470, 230
  119. };
  120. static const struct regulator_ops lp8755_buck_ops = {
  121. .map_voltage = regulator_map_voltage_linear,
  122. .list_voltage = regulator_list_voltage_linear,
  123. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  124. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  125. .enable = regulator_enable_regmap,
  126. .disable = regulator_disable_regmap,
  127. .is_enabled = regulator_is_enabled_regmap,
  128. .enable_time = lp8755_buck_enable_time,
  129. .set_mode = lp8755_buck_set_mode,
  130. .get_mode = lp8755_buck_get_mode,
  131. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  132. };
  133. #define lp8755_rail(_id) "lp8755_buck"#_id
  134. #define lp8755_buck_init(_id)\
  135. {\
  136. .constraints = {\
  137. .name = lp8755_rail(_id),\
  138. .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,\
  139. .min_uV = 500000,\
  140. .max_uV = 1675000,\
  141. },\
  142. }
  143. static struct regulator_init_data lp8755_reg_default[LP8755_BUCK_MAX] = {
  144. [LP8755_BUCK0] = lp8755_buck_init(0),
  145. [LP8755_BUCK1] = lp8755_buck_init(1),
  146. [LP8755_BUCK2] = lp8755_buck_init(2),
  147. [LP8755_BUCK3] = lp8755_buck_init(3),
  148. [LP8755_BUCK4] = lp8755_buck_init(4),
  149. [LP8755_BUCK5] = lp8755_buck_init(5),
  150. };
  151. static const struct lp8755_mphase mphase_buck[MPHASE_CONF_MAX] = {
  152. { 3, { LP8755_BUCK0, LP8755_BUCK3, LP8755_BUCK5 } },
  153. { 6, { LP8755_BUCK0, LP8755_BUCK1, LP8755_BUCK2, LP8755_BUCK3,
  154. LP8755_BUCK4, LP8755_BUCK5 } },
  155. { 5, { LP8755_BUCK0, LP8755_BUCK2, LP8755_BUCK3, LP8755_BUCK4,
  156. LP8755_BUCK5} },
  157. { 4, { LP8755_BUCK0, LP8755_BUCK3, LP8755_BUCK4, LP8755_BUCK5} },
  158. { 3, { LP8755_BUCK0, LP8755_BUCK4, LP8755_BUCK5} },
  159. { 2, { LP8755_BUCK0, LP8755_BUCK5} },
  160. { 1, { LP8755_BUCK0} },
  161. { 2, { LP8755_BUCK0, LP8755_BUCK3} },
  162. { 4, { LP8755_BUCK0, LP8755_BUCK2, LP8755_BUCK3, LP8755_BUCK5} },
  163. };
  164. static int lp8755_init_data(struct lp8755_chip *pchip)
  165. {
  166. unsigned int regval;
  167. int ret, icnt, buck_num;
  168. struct lp8755_platform_data *pdata = pchip->pdata;
  169. /* read back muti-phase configuration */
  170. ret = regmap_read(pchip->regmap, 0x3D, &regval);
  171. if (ret < 0)
  172. goto out_i2c_error;
  173. pchip->mphase = regval & 0x0F;
  174. /* set default data based on multi-phase config */
  175. for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) {
  176. buck_num = mphase_buck[pchip->mphase].buck_num[icnt];
  177. pdata->buck_data[buck_num] = &lp8755_reg_default[buck_num];
  178. }
  179. return ret;
  180. out_i2c_error:
  181. dev_err(pchip->dev, "i2c access error %s\n", __func__);
  182. return ret;
  183. }
  184. #define lp8755_buck_desc(_id)\
  185. {\
  186. .name = lp8755_rail(_id),\
  187. .id = LP8755_BUCK##_id,\
  188. .ops = &lp8755_buck_ops,\
  189. .n_voltages = LP8755_BUCK_LINEAR_OUT_MAX+1,\
  190. .uV_step = 10000,\
  191. .min_uV = 500000,\
  192. .type = REGULATOR_VOLTAGE,\
  193. .owner = THIS_MODULE,\
  194. .enable_reg = LP8755_REG_BUCK##_id,\
  195. .enable_mask = LP8755_BUCK_EN_M,\
  196. .vsel_reg = LP8755_REG_BUCK##_id,\
  197. .vsel_mask = LP8755_BUCK_VOUT_M,\
  198. .ramp_reg = (LP8755_BUCK##_id) + 0x7,\
  199. .ramp_mask = 0x7,\
  200. .ramp_delay_table = lp8755_buck_ramp_table,\
  201. .n_ramp_values = ARRAY_SIZE(lp8755_buck_ramp_table),\
  202. }
  203. static const struct regulator_desc lp8755_regulators[] = {
  204. lp8755_buck_desc(0),
  205. lp8755_buck_desc(1),
  206. lp8755_buck_desc(2),
  207. lp8755_buck_desc(3),
  208. lp8755_buck_desc(4),
  209. lp8755_buck_desc(5),
  210. };
  211. static int lp8755_regulator_init(struct lp8755_chip *pchip)
  212. {
  213. int ret, icnt, buck_num;
  214. struct lp8755_platform_data *pdata = pchip->pdata;
  215. struct regulator_config rconfig = { };
  216. rconfig.regmap = pchip->regmap;
  217. rconfig.dev = pchip->dev;
  218. rconfig.driver_data = pchip;
  219. for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) {
  220. buck_num = mphase_buck[pchip->mphase].buck_num[icnt];
  221. rconfig.init_data = pdata->buck_data[buck_num];
  222. rconfig.of_node = pchip->dev->of_node;
  223. pchip->rdev[buck_num] =
  224. devm_regulator_register(pchip->dev,
  225. &lp8755_regulators[buck_num], &rconfig);
  226. if (IS_ERR(pchip->rdev[buck_num])) {
  227. ret = PTR_ERR(pchip->rdev[buck_num]);
  228. pchip->rdev[buck_num] = NULL;
  229. dev_err(pchip->dev, "regulator init failed: buck %d\n",
  230. buck_num);
  231. return ret;
  232. }
  233. }
  234. return 0;
  235. }
  236. static irqreturn_t lp8755_irq_handler(int irq, void *data)
  237. {
  238. int ret, icnt;
  239. unsigned int flag0, flag1;
  240. struct lp8755_chip *pchip = data;
  241. /* read flag0 register */
  242. ret = regmap_read(pchip->regmap, 0x0D, &flag0);
  243. if (ret < 0)
  244. goto err_i2c;
  245. /* clear flag register to pull up int. pin */
  246. ret = regmap_write(pchip->regmap, 0x0D, 0x00);
  247. if (ret < 0)
  248. goto err_i2c;
  249. /* sent power fault detection event to specific regulator */
  250. for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
  251. if ((flag0 & (0x4 << icnt))
  252. && (pchip->irqmask & (0x04 << icnt))
  253. && (pchip->rdev[icnt] != NULL)) {
  254. regulator_notifier_call_chain(pchip->rdev[icnt],
  255. LP8755_EVENT_PWR_FAULT,
  256. NULL);
  257. }
  258. /* read flag1 register */
  259. ret = regmap_read(pchip->regmap, 0x0E, &flag1);
  260. if (ret < 0)
  261. goto err_i2c;
  262. /* clear flag register to pull up int. pin */
  263. ret = regmap_write(pchip->regmap, 0x0E, 0x00);
  264. if (ret < 0)
  265. goto err_i2c;
  266. /* send OCP event to all regulator devices */
  267. if ((flag1 & 0x01) && (pchip->irqmask & 0x01))
  268. for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
  269. if (pchip->rdev[icnt] != NULL) {
  270. regulator_notifier_call_chain(pchip->rdev[icnt],
  271. LP8755_EVENT_OCP,
  272. NULL);
  273. }
  274. /* send OVP event to all regulator devices */
  275. if ((flag1 & 0x02) && (pchip->irqmask & 0x02))
  276. for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
  277. if (pchip->rdev[icnt] != NULL) {
  278. regulator_notifier_call_chain(pchip->rdev[icnt],
  279. LP8755_EVENT_OVP,
  280. NULL);
  281. }
  282. return IRQ_HANDLED;
  283. err_i2c:
  284. dev_err(pchip->dev, "i2c access error %s\n", __func__);
  285. return IRQ_NONE;
  286. }
  287. static int lp8755_int_config(struct lp8755_chip *pchip)
  288. {
  289. int ret;
  290. unsigned int regval;
  291. if (pchip->irq == 0) {
  292. dev_warn(pchip->dev, "not use interrupt : %s\n", __func__);
  293. return 0;
  294. }
  295. ret = regmap_read(pchip->regmap, 0x0F, &regval);
  296. if (ret < 0) {
  297. dev_err(pchip->dev, "i2c access error %s\n", __func__);
  298. return ret;
  299. }
  300. pchip->irqmask = regval;
  301. return devm_request_threaded_irq(pchip->dev, pchip->irq, NULL,
  302. lp8755_irq_handler,
  303. IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
  304. "lp8755-irq", pchip);
  305. }
  306. static const struct regmap_config lp8755_regmap = {
  307. .reg_bits = 8,
  308. .val_bits = 8,
  309. .max_register = LP8755_REG_MAX,
  310. };
  311. static int lp8755_probe(struct i2c_client *client)
  312. {
  313. int ret, icnt;
  314. struct lp8755_chip *pchip;
  315. struct lp8755_platform_data *pdata = dev_get_platdata(&client->dev);
  316. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  317. dev_err(&client->dev, "i2c functionality check fail.\n");
  318. return -EOPNOTSUPP;
  319. }
  320. pchip = devm_kzalloc(&client->dev,
  321. sizeof(struct lp8755_chip), GFP_KERNEL);
  322. if (!pchip)
  323. return -ENOMEM;
  324. pchip->dev = &client->dev;
  325. pchip->regmap = devm_regmap_init_i2c(client, &lp8755_regmap);
  326. if (IS_ERR(pchip->regmap)) {
  327. ret = PTR_ERR(pchip->regmap);
  328. dev_err(&client->dev, "fail to allocate regmap %d\n", ret);
  329. return ret;
  330. }
  331. i2c_set_clientdata(client, pchip);
  332. if (pdata != NULL) {
  333. pchip->pdata = pdata;
  334. pchip->mphase = pdata->mphase;
  335. } else {
  336. pchip->pdata = devm_kzalloc(pchip->dev,
  337. sizeof(struct lp8755_platform_data),
  338. GFP_KERNEL);
  339. if (!pchip->pdata)
  340. return -ENOMEM;
  341. ret = lp8755_init_data(pchip);
  342. if (ret < 0) {
  343. dev_err(&client->dev, "fail to initialize chip\n");
  344. return ret;
  345. }
  346. }
  347. ret = lp8755_regulator_init(pchip);
  348. if (ret < 0) {
  349. dev_err(&client->dev, "fail to initialize regulators\n");
  350. goto err;
  351. }
  352. pchip->irq = client->irq;
  353. ret = lp8755_int_config(pchip);
  354. if (ret < 0) {
  355. dev_err(&client->dev, "fail to irq config\n");
  356. goto err;
  357. }
  358. return ret;
  359. err:
  360. /* output disable */
  361. for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
  362. regmap_write(pchip->regmap, icnt, 0x00);
  363. return ret;
  364. }
  365. static void lp8755_remove(struct i2c_client *client)
  366. {
  367. int icnt;
  368. struct lp8755_chip *pchip = i2c_get_clientdata(client);
  369. for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
  370. regmap_write(pchip->regmap, icnt, 0x00);
  371. }
  372. static const struct i2c_device_id lp8755_id[] = {
  373. { LP8755_NAME },
  374. {}
  375. };
  376. MODULE_DEVICE_TABLE(i2c, lp8755_id);
  377. static struct i2c_driver lp8755_i2c_driver = {
  378. .driver = {
  379. .name = LP8755_NAME,
  380. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  381. },
  382. .probe = lp8755_probe,
  383. .remove = lp8755_remove,
  384. .id_table = lp8755_id,
  385. };
  386. static int __init lp8755_init(void)
  387. {
  388. return i2c_add_driver(&lp8755_i2c_driver);
  389. }
  390. subsys_initcall(lp8755_init);
  391. static void __exit lp8755_exit(void)
  392. {
  393. i2c_del_driver(&lp8755_i2c_driver);
  394. }
  395. module_exit(lp8755_exit);
  396. MODULE_DESCRIPTION("Texas Instruments lp8755 driver");
  397. MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>");
  398. MODULE_LICENSE("GPL v2");