max8998.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. /*
  2. * max8998.c - Voltage regulator driver for the Maxim 8998
  3. *
  4. * Copyright (C) 2009-2010 Samsung Electronics
  5. * Kyungmin Park <kyungmin.park@samsung.com>
  6. * Marek Szyprowski <m.szyprowski@samsung.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. */
  22. #include <linux/module.h>
  23. #include <linux/init.h>
  24. #include <linux/i2c.h>
  25. #include <linux/err.h>
  26. #include <linux/gpio.h>
  27. #include <linux/slab.h>
  28. #include <linux/interrupt.h>
  29. #include <linux/mutex.h>
  30. #include <linux/platform_device.h>
  31. #include <linux/regulator/driver.h>
  32. #include <linux/mfd/max8998.h>
  33. #include <linux/mfd/max8998-private.h>
  34. struct max8998_data {
  35. struct device *dev;
  36. struct max8998_dev *iodev;
  37. int num_regulators;
  38. struct regulator_dev **rdev;
  39. };
  40. struct voltage_map_desc {
  41. int min;
  42. int max;
  43. int step;
  44. };
  45. /* Voltage maps */
  46. static const struct voltage_map_desc ldo23_voltage_map_desc = {
  47. .min = 800, .step = 50, .max = 1300,
  48. };
  49. static const struct voltage_map_desc ldo456711_voltage_map_desc = {
  50. .min = 1600, .step = 100, .max = 3600,
  51. };
  52. static const struct voltage_map_desc ldo8_voltage_map_desc = {
  53. .min = 3000, .step = 100, .max = 3600,
  54. };
  55. static const struct voltage_map_desc ldo9_voltage_map_desc = {
  56. .min = 2800, .step = 100, .max = 3100,
  57. };
  58. static const struct voltage_map_desc ldo10_voltage_map_desc = {
  59. .min = 950, .step = 50, .max = 1300,
  60. };
  61. static const struct voltage_map_desc ldo1213_voltage_map_desc = {
  62. .min = 800, .step = 100, .max = 3300,
  63. };
  64. static const struct voltage_map_desc ldo1415_voltage_map_desc = {
  65. .min = 1200, .step = 100, .max = 3300,
  66. };
  67. static const struct voltage_map_desc ldo1617_voltage_map_desc = {
  68. .min = 1600, .step = 100, .max = 3600,
  69. };
  70. static const struct voltage_map_desc buck12_voltage_map_desc = {
  71. .min = 750, .step = 25, .max = 1525,
  72. };
  73. static const struct voltage_map_desc buck3_voltage_map_desc = {
  74. .min = 1600, .step = 100, .max = 3600,
  75. };
  76. static const struct voltage_map_desc buck4_voltage_map_desc = {
  77. .min = 800, .step = 100, .max = 2300,
  78. };
  79. static const struct voltage_map_desc *ldo_voltage_map[] = {
  80. NULL,
  81. NULL,
  82. &ldo23_voltage_map_desc, /* LDO2 */
  83. &ldo23_voltage_map_desc, /* LDO3 */
  84. &ldo456711_voltage_map_desc, /* LDO4 */
  85. &ldo456711_voltage_map_desc, /* LDO5 */
  86. &ldo456711_voltage_map_desc, /* LDO6 */
  87. &ldo456711_voltage_map_desc, /* LDO7 */
  88. &ldo8_voltage_map_desc, /* LDO8 */
  89. &ldo9_voltage_map_desc, /* LDO9 */
  90. &ldo10_voltage_map_desc, /* LDO10 */
  91. &ldo456711_voltage_map_desc, /* LDO11 */
  92. &ldo1213_voltage_map_desc, /* LDO12 */
  93. &ldo1213_voltage_map_desc, /* LDO13 */
  94. &ldo1415_voltage_map_desc, /* LDO14 */
  95. &ldo1415_voltage_map_desc, /* LDO15 */
  96. &ldo1617_voltage_map_desc, /* LDO16 */
  97. &ldo1617_voltage_map_desc, /* LDO17 */
  98. &buck12_voltage_map_desc, /* BUCK1 */
  99. &buck12_voltage_map_desc, /* BUCK2 */
  100. &buck3_voltage_map_desc, /* BUCK3 */
  101. &buck4_voltage_map_desc, /* BUCK4 */
  102. };
  103. static inline int max8998_get_ldo(struct regulator_dev *rdev)
  104. {
  105. return rdev_get_id(rdev);
  106. }
  107. static int max8998_list_voltage(struct regulator_dev *rdev,
  108. unsigned int selector)
  109. {
  110. const struct voltage_map_desc *desc;
  111. int ldo = max8998_get_ldo(rdev);
  112. int val;
  113. if (ldo > ARRAY_SIZE(ldo_voltage_map))
  114. return -EINVAL;
  115. desc = ldo_voltage_map[ldo];
  116. if (desc == NULL)
  117. return -EINVAL;
  118. val = desc->min + desc->step * selector;
  119. if (val > desc->max)
  120. return -EINVAL;
  121. return val * 1000;
  122. }
  123. static int max8998_get_enable_register(struct regulator_dev *rdev,
  124. int *reg, int *shift)
  125. {
  126. int ldo = max8998_get_ldo(rdev);
  127. switch (ldo) {
  128. case MAX8998_LDO2 ... MAX8998_LDO5:
  129. *reg = MAX8998_REG_ONOFF1;
  130. *shift = 3 - (ldo - MAX8998_LDO2);
  131. break;
  132. case MAX8998_LDO6 ... MAX8998_LDO13:
  133. *reg = MAX8998_REG_ONOFF2;
  134. *shift = 7 - (ldo - MAX8998_LDO6);
  135. break;
  136. case MAX8998_LDO14 ... MAX8998_LDO17:
  137. *reg = MAX8998_REG_ONOFF3;
  138. *shift = 7 - (ldo - MAX8998_LDO14);
  139. break;
  140. case MAX8998_BUCK1 ... MAX8998_BUCK4:
  141. *reg = MAX8998_REG_ONOFF1;
  142. *shift = 7 - (ldo - MAX8998_BUCK1);
  143. break;
  144. case MAX8998_EN32KHZ_AP ... MAX8998_ENVICHG:
  145. *reg = MAX8998_REG_ONOFF4;
  146. *shift = 7 - (ldo - MAX8998_EN32KHZ_AP);
  147. break;
  148. case MAX8998_ESAFEOUT1 ... MAX8998_ESAFEOUT2:
  149. *reg = MAX8998_REG_CHGR2;
  150. *shift = 7 - (ldo - MAX8998_ESAFEOUT1);
  151. break;
  152. default:
  153. return -EINVAL;
  154. }
  155. return 0;
  156. }
  157. static int max8998_ldo_is_enabled(struct regulator_dev *rdev)
  158. {
  159. struct max8998_data *max8998 = rdev_get_drvdata(rdev);
  160. int ret, reg, shift = 8;
  161. u8 val;
  162. ret = max8998_get_enable_register(rdev, &reg, &shift);
  163. if (ret)
  164. return ret;
  165. ret = max8998_read_reg(max8998->iodev, reg, &val);
  166. if (ret)
  167. return ret;
  168. return val & (1 << shift);
  169. }
  170. static int max8998_ldo_enable(struct regulator_dev *rdev)
  171. {
  172. struct max8998_data *max8998 = rdev_get_drvdata(rdev);
  173. int reg, shift = 8, ret;
  174. ret = max8998_get_enable_register(rdev, &reg, &shift);
  175. if (ret)
  176. return ret;
  177. return max8998_update_reg(max8998->iodev, reg, 1<<shift, 1<<shift);
  178. }
  179. static int max8998_ldo_disable(struct regulator_dev *rdev)
  180. {
  181. struct max8998_data *max8998 = rdev_get_drvdata(rdev);
  182. int reg, shift = 8, ret;
  183. ret = max8998_get_enable_register(rdev, &reg, &shift);
  184. if (ret)
  185. return ret;
  186. return max8998_update_reg(max8998->iodev, reg, 0, 1<<shift);
  187. }
  188. static int max8998_get_voltage_register(struct regulator_dev *rdev,
  189. int *_reg, int *_shift, int *_mask)
  190. {
  191. int ldo = max8998_get_ldo(rdev);
  192. int reg, shift = 0, mask = 0xff;
  193. switch (ldo) {
  194. case MAX8998_LDO2 ... MAX8998_LDO3:
  195. reg = MAX8998_REG_LDO2_LDO3;
  196. mask = 0xf;
  197. if (ldo == MAX8998_LDO2)
  198. shift = 4;
  199. else
  200. shift = 0;
  201. break;
  202. case MAX8998_LDO4 ... MAX8998_LDO7:
  203. reg = MAX8998_REG_LDO4 + (ldo - MAX8998_LDO4);
  204. break;
  205. case MAX8998_LDO8 ... MAX8998_LDO9:
  206. reg = MAX8998_REG_LDO8_LDO9;
  207. mask = 0xf;
  208. if (ldo == MAX8998_LDO8)
  209. shift = 4;
  210. else
  211. shift = 0;
  212. break;
  213. case MAX8998_LDO10 ... MAX8998_LDO11:
  214. reg = MAX8998_REG_LDO10_LDO11;
  215. if (ldo == MAX8998_LDO10) {
  216. shift = 5;
  217. mask = 0x7;
  218. } else {
  219. shift = 0;
  220. mask = 0x1f;
  221. }
  222. break;
  223. case MAX8998_LDO12 ... MAX8998_LDO17:
  224. reg = MAX8998_REG_LDO12 + (ldo - MAX8998_LDO12);
  225. break;
  226. case MAX8998_BUCK1:
  227. reg = MAX8998_REG_BUCK1_DVSARM1;
  228. break;
  229. case MAX8998_BUCK2:
  230. reg = MAX8998_REG_BUCK2_DVSINT1;
  231. break;
  232. case MAX8998_BUCK3:
  233. reg = MAX8998_REG_BUCK3;
  234. break;
  235. case MAX8998_BUCK4:
  236. reg = MAX8998_REG_BUCK4;
  237. break;
  238. default:
  239. return -EINVAL;
  240. }
  241. *_reg = reg;
  242. *_shift = shift;
  243. *_mask = mask;
  244. return 0;
  245. }
  246. static int max8998_get_voltage(struct regulator_dev *rdev)
  247. {
  248. struct max8998_data *max8998 = rdev_get_drvdata(rdev);
  249. int reg, shift = 0, mask, ret;
  250. u8 val;
  251. ret = max8998_get_voltage_register(rdev, &reg, &shift, &mask);
  252. if (ret)
  253. return ret;
  254. ret = max8998_read_reg(max8998->iodev, reg, &val);
  255. if (ret)
  256. return ret;
  257. val >>= shift;
  258. val &= mask;
  259. return max8998_list_voltage(rdev, val);
  260. }
  261. static int max8998_set_voltage(struct regulator_dev *rdev,
  262. int min_uV, int max_uV)
  263. {
  264. struct max8998_data *max8998 = rdev_get_drvdata(rdev);
  265. int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
  266. const struct voltage_map_desc *desc;
  267. int ldo = max8998_get_ldo(rdev);
  268. int reg, shift = 0, mask, ret;
  269. int i = 0;
  270. if (ldo > ARRAY_SIZE(ldo_voltage_map))
  271. return -EINVAL;
  272. desc = ldo_voltage_map[ldo];
  273. if (desc == NULL)
  274. return -EINVAL;
  275. if (max_vol < desc->min || min_vol > desc->max)
  276. return -EINVAL;
  277. while (desc->min + desc->step*i < max_vol &&
  278. desc->min + desc->step*i < desc->max)
  279. i++;
  280. ret = max8998_get_voltage_register(rdev, &reg, &shift, &mask);
  281. if (ret)
  282. return ret;
  283. return max8998_update_reg(max8998->iodev, reg, i<<shift, mask<<shift);
  284. }
  285. static struct regulator_ops max8998_ldo_ops = {
  286. .list_voltage = max8998_list_voltage,
  287. .is_enabled = max8998_ldo_is_enabled,
  288. .enable = max8998_ldo_enable,
  289. .disable = max8998_ldo_disable,
  290. .get_voltage = max8998_get_voltage,
  291. .set_voltage = max8998_set_voltage,
  292. .set_suspend_enable = max8998_ldo_enable,
  293. .set_suspend_disable = max8998_ldo_disable,
  294. };
  295. static struct regulator_ops max8998_buck_ops = {
  296. .list_voltage = max8998_list_voltage,
  297. .is_enabled = max8998_ldo_is_enabled,
  298. .enable = max8998_ldo_enable,
  299. .disable = max8998_ldo_disable,
  300. .get_voltage = max8998_get_voltage,
  301. .set_voltage = max8998_set_voltage,
  302. .set_suspend_enable = max8998_ldo_enable,
  303. .set_suspend_disable = max8998_ldo_disable,
  304. };
  305. static struct regulator_ops max8998_others_ops = {
  306. .is_enabled = max8998_ldo_is_enabled,
  307. .enable = max8998_ldo_enable,
  308. .disable = max8998_ldo_disable,
  309. .set_suspend_enable = max8998_ldo_enable,
  310. .set_suspend_disable = max8998_ldo_disable,
  311. };
  312. static struct regulator_desc regulators[] = {
  313. {
  314. .name = "LDO2",
  315. .id = MAX8998_LDO2,
  316. .ops = &max8998_ldo_ops,
  317. .type = REGULATOR_VOLTAGE,
  318. .owner = THIS_MODULE,
  319. }, {
  320. .name = "LDO3",
  321. .id = MAX8998_LDO3,
  322. .ops = &max8998_ldo_ops,
  323. .type = REGULATOR_VOLTAGE,
  324. .owner = THIS_MODULE,
  325. }, {
  326. .name = "LDO4",
  327. .id = MAX8998_LDO4,
  328. .ops = &max8998_ldo_ops,
  329. .type = REGULATOR_VOLTAGE,
  330. .owner = THIS_MODULE,
  331. }, {
  332. .name = "LDO5",
  333. .id = MAX8998_LDO5,
  334. .ops = &max8998_ldo_ops,
  335. .type = REGULATOR_VOLTAGE,
  336. .owner = THIS_MODULE,
  337. }, {
  338. .name = "LDO6",
  339. .id = MAX8998_LDO6,
  340. .ops = &max8998_ldo_ops,
  341. .type = REGULATOR_VOLTAGE,
  342. .owner = THIS_MODULE,
  343. }, {
  344. .name = "LDO7",
  345. .id = MAX8998_LDO7,
  346. .ops = &max8998_ldo_ops,
  347. .type = REGULATOR_VOLTAGE,
  348. .owner = THIS_MODULE,
  349. }, {
  350. .name = "LDO8",
  351. .id = MAX8998_LDO8,
  352. .ops = &max8998_ldo_ops,
  353. .type = REGULATOR_VOLTAGE,
  354. .owner = THIS_MODULE,
  355. }, {
  356. .name = "LDO9",
  357. .id = MAX8998_LDO9,
  358. .ops = &max8998_ldo_ops,
  359. .type = REGULATOR_VOLTAGE,
  360. .owner = THIS_MODULE,
  361. }, {
  362. .name = "LDO10",
  363. .id = MAX8998_LDO10,
  364. .ops = &max8998_ldo_ops,
  365. .type = REGULATOR_VOLTAGE,
  366. .owner = THIS_MODULE,
  367. }, {
  368. .name = "LDO11",
  369. .id = MAX8998_LDO11,
  370. .ops = &max8998_ldo_ops,
  371. .type = REGULATOR_VOLTAGE,
  372. .owner = THIS_MODULE,
  373. }, {
  374. .name = "LDO12",
  375. .id = MAX8998_LDO12,
  376. .ops = &max8998_ldo_ops,
  377. .type = REGULATOR_VOLTAGE,
  378. .owner = THIS_MODULE,
  379. }, {
  380. .name = "LDO13",
  381. .id = MAX8998_LDO13,
  382. .ops = &max8998_ldo_ops,
  383. .type = REGULATOR_VOLTAGE,
  384. .owner = THIS_MODULE,
  385. }, {
  386. .name = "LDO14",
  387. .id = MAX8998_LDO14,
  388. .ops = &max8998_ldo_ops,
  389. .type = REGULATOR_VOLTAGE,
  390. .owner = THIS_MODULE,
  391. }, {
  392. .name = "LDO15",
  393. .id = MAX8998_LDO15,
  394. .ops = &max8998_ldo_ops,
  395. .type = REGULATOR_VOLTAGE,
  396. .owner = THIS_MODULE,
  397. }, {
  398. .name = "LDO16",
  399. .id = MAX8998_LDO16,
  400. .ops = &max8998_ldo_ops,
  401. .type = REGULATOR_VOLTAGE,
  402. .owner = THIS_MODULE,
  403. }, {
  404. .name = "LDO17",
  405. .id = MAX8998_LDO17,
  406. .ops = &max8998_ldo_ops,
  407. .type = REGULATOR_VOLTAGE,
  408. .owner = THIS_MODULE,
  409. }, {
  410. .name = "BUCK1",
  411. .id = MAX8998_BUCK1,
  412. .ops = &max8998_buck_ops,
  413. .type = REGULATOR_VOLTAGE,
  414. .owner = THIS_MODULE,
  415. }, {
  416. .name = "BUCK2",
  417. .id = MAX8998_BUCK2,
  418. .ops = &max8998_buck_ops,
  419. .type = REGULATOR_VOLTAGE,
  420. .owner = THIS_MODULE,
  421. }, {
  422. .name = "BUCK3",
  423. .id = MAX8998_BUCK3,
  424. .ops = &max8998_buck_ops,
  425. .type = REGULATOR_VOLTAGE,
  426. .owner = THIS_MODULE,
  427. }, {
  428. .name = "BUCK4",
  429. .id = MAX8998_BUCK4,
  430. .ops = &max8998_buck_ops,
  431. .type = REGULATOR_VOLTAGE,
  432. .owner = THIS_MODULE,
  433. }, {
  434. .name = "EN32KHz AP",
  435. .id = MAX8998_EN32KHZ_AP,
  436. .ops = &max8998_others_ops,
  437. .type = REGULATOR_VOLTAGE,
  438. .owner = THIS_MODULE,
  439. }, {
  440. .name = "EN32KHz CP",
  441. .id = MAX8998_EN32KHZ_CP,
  442. .ops = &max8998_others_ops,
  443. .type = REGULATOR_VOLTAGE,
  444. .owner = THIS_MODULE,
  445. }, {
  446. .name = "ENVICHG",
  447. .id = MAX8998_ENVICHG,
  448. .ops = &max8998_others_ops,
  449. .type = REGULATOR_VOLTAGE,
  450. .owner = THIS_MODULE,
  451. }, {
  452. .name = "ESAFEOUT1",
  453. .id = MAX8998_ESAFEOUT1,
  454. .ops = &max8998_others_ops,
  455. .type = REGULATOR_VOLTAGE,
  456. .owner = THIS_MODULE,
  457. }, {
  458. .name = "ESAFEOUT2",
  459. .id = MAX8998_ESAFEOUT2,
  460. .ops = &max8998_others_ops,
  461. .type = REGULATOR_VOLTAGE,
  462. .owner = THIS_MODULE,
  463. }
  464. };
  465. static __devinit int max8998_pmic_probe(struct platform_device *pdev)
  466. {
  467. struct max8998_dev *iodev = dev_get_drvdata(pdev->dev.parent);
  468. struct max8998_platform_data *pdata = dev_get_platdata(iodev->dev);
  469. struct regulator_dev **rdev;
  470. struct max8998_data *max8998;
  471. int i, ret, size;
  472. if (!pdata) {
  473. dev_err(pdev->dev.parent, "No platform init data supplied\n");
  474. return -ENODEV;
  475. }
  476. max8998 = kzalloc(sizeof(struct max8998_data), GFP_KERNEL);
  477. if (!max8998)
  478. return -ENOMEM;
  479. size = sizeof(struct regulator_dev *) * (pdata->num_regulators + 1);
  480. max8998->rdev = kzalloc(size, GFP_KERNEL);
  481. if (!max8998->rdev) {
  482. kfree(max8998);
  483. return -ENOMEM;
  484. }
  485. rdev = max8998->rdev;
  486. max8998->iodev = iodev;
  487. platform_set_drvdata(pdev, max8998);
  488. for (i = 0; i < pdata->num_regulators; i++) {
  489. const struct voltage_map_desc *desc;
  490. int id = pdata->regulators[i].id;
  491. int index = id - MAX8998_LDO2;
  492. desc = ldo_voltage_map[id];
  493. if (desc && regulators[index].ops != &max8998_others_ops) {
  494. int count = (desc->max - desc->min) / desc->step + 1;
  495. regulators[index].n_voltages = count;
  496. }
  497. rdev[i] = regulator_register(&regulators[index], max8998->dev,
  498. pdata->regulators[i].initdata, max8998);
  499. if (IS_ERR(rdev[i])) {
  500. ret = PTR_ERR(rdev[i]);
  501. dev_err(max8998->dev, "regulator init failed\n");
  502. rdev[i] = NULL;
  503. goto err;
  504. }
  505. }
  506. return 0;
  507. err:
  508. for (i = 0; i <= max8998->num_regulators; i++)
  509. if (rdev[i])
  510. regulator_unregister(rdev[i]);
  511. kfree(max8998->rdev);
  512. kfree(max8998);
  513. return ret;
  514. }
  515. static int __devexit max8998_pmic_remove(struct platform_device *pdev)
  516. {
  517. struct max8998_data *max8998 = platform_get_drvdata(pdev);
  518. struct regulator_dev **rdev = max8998->rdev;
  519. int i;
  520. for (i = 0; i <= max8998->num_regulators; i++)
  521. if (rdev[i])
  522. regulator_unregister(rdev[i]);
  523. kfree(max8998->rdev);
  524. kfree(max8998);
  525. return 0;
  526. }
  527. static struct platform_driver max8998_pmic_driver = {
  528. .driver = {
  529. .name = "max8998-pmic",
  530. .owner = THIS_MODULE,
  531. },
  532. .probe = max8998_pmic_probe,
  533. .remove = __devexit_p(max8998_pmic_remove),
  534. };
  535. static int __init max8998_pmic_init(void)
  536. {
  537. return platform_driver_register(&max8998_pmic_driver);
  538. }
  539. subsys_initcall(max8998_pmic_init);
  540. static void __exit max8998_pmic_cleanup(void)
  541. {
  542. platform_driver_unregister(&max8998_pmic_driver);
  543. }
  544. module_exit(max8998_pmic_cleanup);
  545. MODULE_DESCRIPTION("MAXIM 8998 voltage regulator driver");
  546. MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
  547. MODULE_LICENSE("GPL");