max8997.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209
  1. /*
  2. * max8997.c - Regulator driver for the Maxim 8997/8966
  3. *
  4. * Copyright (C) 2011 Samsung Electronics
  5. * MyungJoo Ham <myungjoo.ham@smasung.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. *
  21. * This driver is based on max8998.c
  22. */
  23. #include <linux/bug.h>
  24. #include <linux/delay.h>
  25. #include <linux/err.h>
  26. #include <linux/gpio.h>
  27. #include <linux/slab.h>
  28. #include <linux/module.h>
  29. #include <linux/platform_device.h>
  30. #include <linux/regulator/driver.h>
  31. #include <linux/regulator/machine.h>
  32. #include <linux/mfd/max8997.h>
  33. #include <linux/mfd/max8997-private.h>
  34. struct max8997_data {
  35. struct device *dev;
  36. struct max8997_dev *iodev;
  37. int num_regulators;
  38. struct regulator_dev **rdev;
  39. int ramp_delay; /* in mV/us */
  40. bool buck1_gpiodvs;
  41. bool buck2_gpiodvs;
  42. bool buck5_gpiodvs;
  43. u8 buck1_vol[8];
  44. u8 buck2_vol[8];
  45. u8 buck5_vol[8];
  46. int buck125_gpios[3];
  47. int buck125_gpioindex;
  48. bool ignore_gpiodvs_side_effect;
  49. u8 saved_states[MAX8997_REG_MAX];
  50. };
  51. static inline void max8997_set_gpio(struct max8997_data *max8997)
  52. {
  53. int set3 = (max8997->buck125_gpioindex) & 0x1;
  54. int set2 = ((max8997->buck125_gpioindex) >> 1) & 0x1;
  55. int set1 = ((max8997->buck125_gpioindex) >> 2) & 0x1;
  56. gpio_set_value(max8997->buck125_gpios[0], set1);
  57. gpio_set_value(max8997->buck125_gpios[1], set2);
  58. gpio_set_value(max8997->buck125_gpios[2], set3);
  59. }
  60. struct voltage_map_desc {
  61. int min;
  62. int max;
  63. int step;
  64. };
  65. /* Voltage maps in mV */
  66. static const struct voltage_map_desc ldo_voltage_map_desc = {
  67. .min = 800, .max = 3950, .step = 50,
  68. }; /* LDO1 ~ 18, 21 all */
  69. static const struct voltage_map_desc buck1245_voltage_map_desc = {
  70. .min = 650, .max = 2225, .step = 25,
  71. }; /* Buck1, 2, 4, 5 */
  72. static const struct voltage_map_desc buck37_voltage_map_desc = {
  73. .min = 750, .max = 3900, .step = 50,
  74. }; /* Buck3, 7 */
  75. /* current map in mA */
  76. static const struct voltage_map_desc charger_current_map_desc = {
  77. .min = 200, .max = 950, .step = 50,
  78. };
  79. static const struct voltage_map_desc topoff_current_map_desc = {
  80. .min = 50, .max = 200, .step = 10,
  81. };
  82. static const struct voltage_map_desc *reg_voltage_map[] = {
  83. [MAX8997_LDO1] = &ldo_voltage_map_desc,
  84. [MAX8997_LDO2] = &ldo_voltage_map_desc,
  85. [MAX8997_LDO3] = &ldo_voltage_map_desc,
  86. [MAX8997_LDO4] = &ldo_voltage_map_desc,
  87. [MAX8997_LDO5] = &ldo_voltage_map_desc,
  88. [MAX8997_LDO6] = &ldo_voltage_map_desc,
  89. [MAX8997_LDO7] = &ldo_voltage_map_desc,
  90. [MAX8997_LDO8] = &ldo_voltage_map_desc,
  91. [MAX8997_LDO9] = &ldo_voltage_map_desc,
  92. [MAX8997_LDO10] = &ldo_voltage_map_desc,
  93. [MAX8997_LDO11] = &ldo_voltage_map_desc,
  94. [MAX8997_LDO12] = &ldo_voltage_map_desc,
  95. [MAX8997_LDO13] = &ldo_voltage_map_desc,
  96. [MAX8997_LDO14] = &ldo_voltage_map_desc,
  97. [MAX8997_LDO15] = &ldo_voltage_map_desc,
  98. [MAX8997_LDO16] = &ldo_voltage_map_desc,
  99. [MAX8997_LDO17] = &ldo_voltage_map_desc,
  100. [MAX8997_LDO18] = &ldo_voltage_map_desc,
  101. [MAX8997_LDO21] = &ldo_voltage_map_desc,
  102. [MAX8997_BUCK1] = &buck1245_voltage_map_desc,
  103. [MAX8997_BUCK2] = &buck1245_voltage_map_desc,
  104. [MAX8997_BUCK3] = &buck37_voltage_map_desc,
  105. [MAX8997_BUCK4] = &buck1245_voltage_map_desc,
  106. [MAX8997_BUCK5] = &buck1245_voltage_map_desc,
  107. [MAX8997_BUCK6] = NULL,
  108. [MAX8997_BUCK7] = &buck37_voltage_map_desc,
  109. [MAX8997_EN32KHZ_AP] = NULL,
  110. [MAX8997_EN32KHZ_CP] = NULL,
  111. [MAX8997_ENVICHG] = NULL,
  112. [MAX8997_ESAFEOUT1] = NULL,
  113. [MAX8997_ESAFEOUT2] = NULL,
  114. [MAX8997_CHARGER_CV] = NULL,
  115. [MAX8997_CHARGER] = &charger_current_map_desc,
  116. [MAX8997_CHARGER_TOPOFF] = &topoff_current_map_desc,
  117. };
  118. static int max8997_list_voltage_safeout(struct regulator_dev *rdev,
  119. unsigned int selector)
  120. {
  121. int rid = rdev_get_id(rdev);
  122. if (rid == MAX8997_ESAFEOUT1 || rid == MAX8997_ESAFEOUT2) {
  123. switch (selector) {
  124. case 0:
  125. return 4850000;
  126. case 1:
  127. return 4900000;
  128. case 2:
  129. return 4950000;
  130. case 3:
  131. return 3300000;
  132. default:
  133. return -EINVAL;
  134. }
  135. }
  136. return -EINVAL;
  137. }
  138. static int max8997_list_voltage_charger_cv(struct regulator_dev *rdev,
  139. unsigned int selector)
  140. {
  141. int rid = rdev_get_id(rdev);
  142. if (rid != MAX8997_CHARGER_CV)
  143. goto err;
  144. switch (selector) {
  145. case 0x00:
  146. return 4200000;
  147. case 0x01 ... 0x0E:
  148. return 4000000 + 20000 * (selector - 0x01);
  149. case 0x0F:
  150. return 4350000;
  151. default:
  152. return -EINVAL;
  153. }
  154. err:
  155. return -EINVAL;
  156. }
  157. static int max8997_list_voltage(struct regulator_dev *rdev,
  158. unsigned int selector)
  159. {
  160. const struct voltage_map_desc *desc;
  161. int rid = rdev_get_id(rdev);
  162. int val;
  163. if (rid >= ARRAY_SIZE(reg_voltage_map) ||
  164. rid < 0)
  165. return -EINVAL;
  166. desc = reg_voltage_map[rid];
  167. if (desc == NULL)
  168. return -EINVAL;
  169. val = desc->min + desc->step * selector;
  170. if (val > desc->max)
  171. return -EINVAL;
  172. return val * 1000;
  173. }
  174. static int max8997_get_enable_register(struct regulator_dev *rdev,
  175. int *reg, int *mask, int *pattern)
  176. {
  177. int rid = rdev_get_id(rdev);
  178. switch (rid) {
  179. case MAX8997_LDO1 ... MAX8997_LDO21:
  180. *reg = MAX8997_REG_LDO1CTRL + (rid - MAX8997_LDO1);
  181. *mask = 0xC0;
  182. *pattern = 0xC0;
  183. break;
  184. case MAX8997_BUCK1:
  185. *reg = MAX8997_REG_BUCK1CTRL;
  186. *mask = 0x01;
  187. *pattern = 0x01;
  188. break;
  189. case MAX8997_BUCK2:
  190. *reg = MAX8997_REG_BUCK2CTRL;
  191. *mask = 0x01;
  192. *pattern = 0x01;
  193. break;
  194. case MAX8997_BUCK3:
  195. *reg = MAX8997_REG_BUCK3CTRL;
  196. *mask = 0x01;
  197. *pattern = 0x01;
  198. break;
  199. case MAX8997_BUCK4:
  200. *reg = MAX8997_REG_BUCK4CTRL;
  201. *mask = 0x01;
  202. *pattern = 0x01;
  203. break;
  204. case MAX8997_BUCK5:
  205. *reg = MAX8997_REG_BUCK5CTRL;
  206. *mask = 0x01;
  207. *pattern = 0x01;
  208. break;
  209. case MAX8997_BUCK6:
  210. *reg = MAX8997_REG_BUCK6CTRL;
  211. *mask = 0x01;
  212. *pattern = 0x01;
  213. break;
  214. case MAX8997_BUCK7:
  215. *reg = MAX8997_REG_BUCK7CTRL;
  216. *mask = 0x01;
  217. *pattern = 0x01;
  218. break;
  219. case MAX8997_EN32KHZ_AP ... MAX8997_EN32KHZ_CP:
  220. *reg = MAX8997_REG_MAINCON1;
  221. *mask = 0x01 << (rid - MAX8997_EN32KHZ_AP);
  222. *pattern = 0x01 << (rid - MAX8997_EN32KHZ_AP);
  223. break;
  224. case MAX8997_ENVICHG:
  225. *reg = MAX8997_REG_MBCCTRL1;
  226. *mask = 0x80;
  227. *pattern = 0x80;
  228. break;
  229. case MAX8997_ESAFEOUT1 ... MAX8997_ESAFEOUT2:
  230. *reg = MAX8997_REG_SAFEOUTCTRL;
  231. *mask = 0x40 << (rid - MAX8997_ESAFEOUT1);
  232. *pattern = 0x40 << (rid - MAX8997_ESAFEOUT1);
  233. break;
  234. case MAX8997_CHARGER:
  235. *reg = MAX8997_REG_MBCCTRL2;
  236. *mask = 0x40;
  237. *pattern = 0x40;
  238. break;
  239. default:
  240. /* Not controllable or not exists */
  241. return -EINVAL;
  242. }
  243. return 0;
  244. }
  245. static int max8997_reg_is_enabled(struct regulator_dev *rdev)
  246. {
  247. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  248. struct i2c_client *i2c = max8997->iodev->i2c;
  249. int ret, reg, mask, pattern;
  250. u8 val;
  251. ret = max8997_get_enable_register(rdev, &reg, &mask, &pattern);
  252. if (ret == -EINVAL)
  253. return 1; /* "not controllable" */
  254. else if (ret)
  255. return ret;
  256. ret = max8997_read_reg(i2c, reg, &val);
  257. if (ret)
  258. return ret;
  259. return (val & mask) == pattern;
  260. }
  261. static int max8997_reg_enable(struct regulator_dev *rdev)
  262. {
  263. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  264. struct i2c_client *i2c = max8997->iodev->i2c;
  265. int ret, reg, mask, pattern;
  266. ret = max8997_get_enable_register(rdev, &reg, &mask, &pattern);
  267. if (ret)
  268. return ret;
  269. return max8997_update_reg(i2c, reg, pattern, mask);
  270. }
  271. static int max8997_reg_disable(struct regulator_dev *rdev)
  272. {
  273. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  274. struct i2c_client *i2c = max8997->iodev->i2c;
  275. int ret, reg, mask, pattern;
  276. ret = max8997_get_enable_register(rdev, &reg, &mask, &pattern);
  277. if (ret)
  278. return ret;
  279. return max8997_update_reg(i2c, reg, ~pattern, mask);
  280. }
  281. static int max8997_get_voltage_register(struct regulator_dev *rdev,
  282. int *_reg, int *_shift, int *_mask)
  283. {
  284. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  285. int rid = rdev_get_id(rdev);
  286. int reg, shift = 0, mask = 0x3f;
  287. switch (rid) {
  288. case MAX8997_LDO1 ... MAX8997_LDO21:
  289. reg = MAX8997_REG_LDO1CTRL + (rid - MAX8997_LDO1);
  290. break;
  291. case MAX8997_BUCK1:
  292. reg = MAX8997_REG_BUCK1DVS1;
  293. if (max8997->buck1_gpiodvs)
  294. reg += max8997->buck125_gpioindex;
  295. break;
  296. case MAX8997_BUCK2:
  297. reg = MAX8997_REG_BUCK2DVS1;
  298. if (max8997->buck2_gpiodvs)
  299. reg += max8997->buck125_gpioindex;
  300. break;
  301. case MAX8997_BUCK3:
  302. reg = MAX8997_REG_BUCK3DVS;
  303. break;
  304. case MAX8997_BUCK4:
  305. reg = MAX8997_REG_BUCK4DVS;
  306. break;
  307. case MAX8997_BUCK5:
  308. reg = MAX8997_REG_BUCK5DVS1;
  309. if (max8997->buck5_gpiodvs)
  310. reg += max8997->buck125_gpioindex;
  311. break;
  312. case MAX8997_BUCK7:
  313. reg = MAX8997_REG_BUCK7DVS;
  314. break;
  315. case MAX8997_ESAFEOUT1 ... MAX8997_ESAFEOUT2:
  316. reg = MAX8997_REG_SAFEOUTCTRL;
  317. shift = (rid == MAX8997_ESAFEOUT2) ? 2 : 0;
  318. mask = 0x3;
  319. break;
  320. case MAX8997_CHARGER_CV:
  321. reg = MAX8997_REG_MBCCTRL3;
  322. shift = 0;
  323. mask = 0xf;
  324. break;
  325. case MAX8997_CHARGER:
  326. reg = MAX8997_REG_MBCCTRL4;
  327. shift = 0;
  328. mask = 0xf;
  329. break;
  330. case MAX8997_CHARGER_TOPOFF:
  331. reg = MAX8997_REG_MBCCTRL5;
  332. shift = 0;
  333. mask = 0xf;
  334. break;
  335. default:
  336. return -EINVAL;
  337. }
  338. *_reg = reg;
  339. *_shift = shift;
  340. *_mask = mask;
  341. return 0;
  342. }
  343. static int max8997_get_voltage_sel(struct regulator_dev *rdev)
  344. {
  345. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  346. struct i2c_client *i2c = max8997->iodev->i2c;
  347. int reg, shift, mask, ret;
  348. u8 val;
  349. ret = max8997_get_voltage_register(rdev, &reg, &shift, &mask);
  350. if (ret)
  351. return ret;
  352. ret = max8997_read_reg(i2c, reg, &val);
  353. if (ret)
  354. return ret;
  355. val >>= shift;
  356. val &= mask;
  357. return val;
  358. }
  359. static inline int max8997_get_voltage_proper_val(
  360. const struct voltage_map_desc *desc,
  361. int min_vol, int max_vol)
  362. {
  363. int i;
  364. if (desc == NULL)
  365. return -EINVAL;
  366. if (max_vol < desc->min || min_vol > desc->max)
  367. return -EINVAL;
  368. if (min_vol < desc->min)
  369. min_vol = desc->min;
  370. i = DIV_ROUND_UP(min_vol - desc->min, desc->step);
  371. if (desc->min + desc->step * i > max_vol)
  372. return -EINVAL;
  373. return i;
  374. }
  375. static int max8997_set_voltage_charger_cv(struct regulator_dev *rdev,
  376. int min_uV, int max_uV, unsigned *selector)
  377. {
  378. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  379. struct i2c_client *i2c = max8997->iodev->i2c;
  380. int rid = rdev_get_id(rdev);
  381. int lb, ub;
  382. int reg, shift = 0, mask, ret = 0;
  383. u8 val = 0x0;
  384. if (rid != MAX8997_CHARGER_CV)
  385. return -EINVAL;
  386. ret = max8997_get_voltage_register(rdev, &reg, &shift, &mask);
  387. if (ret)
  388. return ret;
  389. if (max_uV < 4000000 || min_uV > 4350000)
  390. return -EINVAL;
  391. if (min_uV <= 4000000) {
  392. if (max_uV >= 4000000)
  393. return -EINVAL;
  394. else
  395. val = 0x1;
  396. } else if (min_uV <= 4200000 && max_uV >= 4200000)
  397. val = 0x0;
  398. else {
  399. lb = (min_uV - 4000001) / 20000 + 2;
  400. ub = (max_uV - 4000000) / 20000 + 1;
  401. if (lb > ub)
  402. return -EINVAL;
  403. if (lb < 0xf)
  404. val = lb;
  405. else {
  406. if (ub >= 0xf)
  407. val = 0xf;
  408. else
  409. return -EINVAL;
  410. }
  411. }
  412. *selector = val;
  413. ret = max8997_update_reg(i2c, reg, val << shift, mask);
  414. return ret;
  415. }
  416. /*
  417. * For LDO1 ~ LDO21, BUCK1~5, BUCK7, CHARGER, CHARGER_TOPOFF
  418. * BUCK1, 2, and 5 are available if they are not controlled by gpio
  419. */
  420. static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev,
  421. int min_uV, int max_uV, unsigned *selector)
  422. {
  423. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  424. struct i2c_client *i2c = max8997->iodev->i2c;
  425. int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
  426. const struct voltage_map_desc *desc;
  427. int rid = rdev_get_id(rdev);
  428. int i, reg, shift, mask, ret;
  429. switch (rid) {
  430. case MAX8997_LDO1 ... MAX8997_LDO21:
  431. break;
  432. case MAX8997_BUCK1 ... MAX8997_BUCK5:
  433. break;
  434. case MAX8997_BUCK6:
  435. return -EINVAL;
  436. case MAX8997_BUCK7:
  437. break;
  438. case MAX8997_CHARGER:
  439. break;
  440. case MAX8997_CHARGER_TOPOFF:
  441. break;
  442. default:
  443. return -EINVAL;
  444. }
  445. desc = reg_voltage_map[rid];
  446. i = max8997_get_voltage_proper_val(desc, min_vol, max_vol);
  447. if (i < 0)
  448. return i;
  449. ret = max8997_get_voltage_register(rdev, &reg, &shift, &mask);
  450. if (ret)
  451. return ret;
  452. ret = max8997_update_reg(i2c, reg, i << shift, mask << shift);
  453. *selector = i;
  454. return ret;
  455. }
  456. static int max8997_set_voltage_ldobuck_time_sel(struct regulator_dev *rdev,
  457. unsigned int old_selector,
  458. unsigned int new_selector)
  459. {
  460. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  461. int rid = rdev_get_id(rdev);
  462. const struct voltage_map_desc *desc = reg_voltage_map[rid];
  463. /* Delay is required only if the voltage is increasing */
  464. if (old_selector >= new_selector)
  465. return 0;
  466. /* No need to delay if gpio_dvs_mode */
  467. switch (rid) {
  468. case MAX8997_BUCK1:
  469. if (max8997->buck1_gpiodvs)
  470. return 0;
  471. break;
  472. case MAX8997_BUCK2:
  473. if (max8997->buck2_gpiodvs)
  474. return 0;
  475. break;
  476. case MAX8997_BUCK5:
  477. if (max8997->buck5_gpiodvs)
  478. return 0;
  479. break;
  480. }
  481. switch (rid) {
  482. case MAX8997_BUCK1:
  483. case MAX8997_BUCK2:
  484. case MAX8997_BUCK4:
  485. case MAX8997_BUCK5:
  486. return DIV_ROUND_UP(desc->step * (new_selector - old_selector),
  487. max8997->ramp_delay);
  488. }
  489. return 0;
  490. }
  491. /*
  492. * Assess the damage on the voltage setting of BUCK1,2,5 by the change.
  493. *
  494. * When GPIO-DVS mode is used for multiple bucks, changing the voltage value
  495. * of one of the bucks may affect that of another buck, which is the side
  496. * effect of the change (set_voltage). This function examines the GPIO-DVS
  497. * configurations and checks whether such side-effect exists.
  498. */
  499. static int max8997_assess_side_effect(struct regulator_dev *rdev,
  500. u8 new_val, int *best)
  501. {
  502. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  503. int rid = rdev_get_id(rdev);
  504. u8 *buckx_val[3];
  505. bool buckx_gpiodvs[3];
  506. int side_effect[8];
  507. int min_side_effect = INT_MAX;
  508. int i;
  509. *best = -1;
  510. switch (rid) {
  511. case MAX8997_BUCK1:
  512. rid = 0;
  513. break;
  514. case MAX8997_BUCK2:
  515. rid = 1;
  516. break;
  517. case MAX8997_BUCK5:
  518. rid = 2;
  519. break;
  520. default:
  521. return -EINVAL;
  522. }
  523. buckx_val[0] = max8997->buck1_vol;
  524. buckx_val[1] = max8997->buck2_vol;
  525. buckx_val[2] = max8997->buck5_vol;
  526. buckx_gpiodvs[0] = max8997->buck1_gpiodvs;
  527. buckx_gpiodvs[1] = max8997->buck2_gpiodvs;
  528. buckx_gpiodvs[2] = max8997->buck5_gpiodvs;
  529. for (i = 0; i < 8; i++) {
  530. int others;
  531. if (new_val != (buckx_val[rid])[i]) {
  532. side_effect[i] = -1;
  533. continue;
  534. }
  535. side_effect[i] = 0;
  536. for (others = 0; others < 3; others++) {
  537. int diff;
  538. if (others == rid)
  539. continue;
  540. if (buckx_gpiodvs[others] == false)
  541. continue; /* Not affected */
  542. diff = (buckx_val[others])[i] -
  543. (buckx_val[others])[max8997->buck125_gpioindex];
  544. if (diff > 0)
  545. side_effect[i] += diff;
  546. else if (diff < 0)
  547. side_effect[i] -= diff;
  548. }
  549. if (side_effect[i] == 0) {
  550. *best = i;
  551. return 0; /* NO SIDE EFFECT! Use This! */
  552. }
  553. if (side_effect[i] < min_side_effect) {
  554. min_side_effect = side_effect[i];
  555. *best = i;
  556. }
  557. }
  558. if (*best == -1)
  559. return -EINVAL;
  560. return side_effect[*best];
  561. }
  562. /*
  563. * For Buck 1 ~ 5 and 7. If it is not controlled by GPIO, this calls
  564. * max8997_set_voltage_ldobuck to do the job.
  565. */
  566. static int max8997_set_voltage_buck(struct regulator_dev *rdev,
  567. int min_uV, int max_uV, unsigned *selector)
  568. {
  569. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  570. int rid = rdev_get_id(rdev);
  571. const struct voltage_map_desc *desc;
  572. int new_val, new_idx, damage, tmp_val, tmp_idx, tmp_dmg;
  573. bool gpio_dvs_mode = false;
  574. int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
  575. if (rid < MAX8997_BUCK1 || rid > MAX8997_BUCK7)
  576. return -EINVAL;
  577. switch (rid) {
  578. case MAX8997_BUCK1:
  579. if (max8997->buck1_gpiodvs)
  580. gpio_dvs_mode = true;
  581. break;
  582. case MAX8997_BUCK2:
  583. if (max8997->buck2_gpiodvs)
  584. gpio_dvs_mode = true;
  585. break;
  586. case MAX8997_BUCK5:
  587. if (max8997->buck5_gpiodvs)
  588. gpio_dvs_mode = true;
  589. break;
  590. }
  591. if (!gpio_dvs_mode)
  592. return max8997_set_voltage_ldobuck(rdev, min_uV, max_uV,
  593. selector);
  594. desc = reg_voltage_map[rid];
  595. new_val = max8997_get_voltage_proper_val(desc, min_vol, max_vol);
  596. if (new_val < 0)
  597. return new_val;
  598. tmp_dmg = INT_MAX;
  599. tmp_idx = -1;
  600. tmp_val = -1;
  601. do {
  602. damage = max8997_assess_side_effect(rdev, new_val, &new_idx);
  603. if (damage == 0)
  604. goto out;
  605. if (tmp_dmg > damage) {
  606. tmp_idx = new_idx;
  607. tmp_val = new_val;
  608. tmp_dmg = damage;
  609. }
  610. new_val++;
  611. } while (desc->min + desc->step + new_val <= desc->max);
  612. new_idx = tmp_idx;
  613. new_val = tmp_val;
  614. if (max8997->ignore_gpiodvs_side_effect == false)
  615. return -EINVAL;
  616. dev_warn(&rdev->dev, "MAX8997 GPIO-DVS Side Effect Warning: GPIO SET:"
  617. " %d -> %d\n", max8997->buck125_gpioindex, tmp_idx);
  618. out:
  619. if (new_idx < 0 || new_val < 0)
  620. return -EINVAL;
  621. max8997->buck125_gpioindex = new_idx;
  622. max8997_set_gpio(max8997);
  623. *selector = new_val;
  624. return 0;
  625. }
  626. static const int safeoutvolt[] = {
  627. 3300000,
  628. 4850000,
  629. 4900000,
  630. 4950000,
  631. };
  632. /* For SAFEOUT1 and SAFEOUT2 */
  633. static int max8997_set_voltage_safeout(struct regulator_dev *rdev,
  634. int min_uV, int max_uV, unsigned *selector)
  635. {
  636. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  637. struct i2c_client *i2c = max8997->iodev->i2c;
  638. int rid = rdev_get_id(rdev);
  639. int reg, shift = 0, mask, ret;
  640. int i = 0;
  641. u8 val;
  642. if (rid != MAX8997_ESAFEOUT1 && rid != MAX8997_ESAFEOUT2)
  643. return -EINVAL;
  644. for (i = 0; i < ARRAY_SIZE(safeoutvolt); i++) {
  645. if (min_uV <= safeoutvolt[i] &&
  646. max_uV >= safeoutvolt[i])
  647. break;
  648. }
  649. if (i >= ARRAY_SIZE(safeoutvolt))
  650. return -EINVAL;
  651. if (i == 0)
  652. val = 0x3;
  653. else
  654. val = i - 1;
  655. ret = max8997_get_voltage_register(rdev, &reg, &shift, &mask);
  656. if (ret)
  657. return ret;
  658. ret = max8997_update_reg(i2c, reg, val << shift, mask << shift);
  659. *selector = val;
  660. return ret;
  661. }
  662. static int max8997_reg_enable_suspend(struct regulator_dev *rdev)
  663. {
  664. return 0;
  665. }
  666. static int max8997_reg_disable_suspend(struct regulator_dev *rdev)
  667. {
  668. struct max8997_data *max8997 = rdev_get_drvdata(rdev);
  669. struct i2c_client *i2c = max8997->iodev->i2c;
  670. int ret, reg, mask, pattern;
  671. int rid = rdev_get_id(rdev);
  672. ret = max8997_get_enable_register(rdev, &reg, &mask, &pattern);
  673. if (ret)
  674. return ret;
  675. max8997_read_reg(i2c, reg, &max8997->saved_states[rid]);
  676. if (rid == MAX8997_LDO1 ||
  677. rid == MAX8997_LDO10 ||
  678. rid == MAX8997_LDO21) {
  679. dev_dbg(&rdev->dev, "Conditional Power-Off for %s\n",
  680. rdev->desc->name);
  681. return max8997_update_reg(i2c, reg, 0x40, mask);
  682. }
  683. dev_dbg(&rdev->dev, "Full Power-Off for %s (%xh -> %xh)\n",
  684. rdev->desc->name, max8997->saved_states[rid] & mask,
  685. (~pattern) & mask);
  686. return max8997_update_reg(i2c, reg, ~pattern, mask);
  687. }
  688. static struct regulator_ops max8997_ldo_ops = {
  689. .list_voltage = max8997_list_voltage,
  690. .is_enabled = max8997_reg_is_enabled,
  691. .enable = max8997_reg_enable,
  692. .disable = max8997_reg_disable,
  693. .get_voltage_sel = max8997_get_voltage_sel,
  694. .set_voltage = max8997_set_voltage_ldobuck,
  695. .set_voltage_time_sel = max8997_set_voltage_ldobuck_time_sel,
  696. .set_suspend_enable = max8997_reg_enable_suspend,
  697. .set_suspend_disable = max8997_reg_disable_suspend,
  698. };
  699. static struct regulator_ops max8997_buck_ops = {
  700. .list_voltage = max8997_list_voltage,
  701. .is_enabled = max8997_reg_is_enabled,
  702. .enable = max8997_reg_enable,
  703. .disable = max8997_reg_disable,
  704. .get_voltage_sel = max8997_get_voltage_sel,
  705. .set_voltage = max8997_set_voltage_buck,
  706. .set_voltage_time_sel = max8997_set_voltage_ldobuck_time_sel,
  707. .set_suspend_enable = max8997_reg_enable_suspend,
  708. .set_suspend_disable = max8997_reg_disable_suspend,
  709. };
  710. static struct regulator_ops max8997_fixedvolt_ops = {
  711. .list_voltage = max8997_list_voltage,
  712. .is_enabled = max8997_reg_is_enabled,
  713. .enable = max8997_reg_enable,
  714. .disable = max8997_reg_disable,
  715. .set_suspend_enable = max8997_reg_enable_suspend,
  716. .set_suspend_disable = max8997_reg_disable_suspend,
  717. };
  718. static struct regulator_ops max8997_safeout_ops = {
  719. .list_voltage = max8997_list_voltage_safeout,
  720. .is_enabled = max8997_reg_is_enabled,
  721. .enable = max8997_reg_enable,
  722. .disable = max8997_reg_disable,
  723. .get_voltage_sel = max8997_get_voltage_sel,
  724. .set_voltage = max8997_set_voltage_safeout,
  725. .set_suspend_enable = max8997_reg_enable_suspend,
  726. .set_suspend_disable = max8997_reg_disable_suspend,
  727. };
  728. static struct regulator_ops max8997_fixedstate_ops = {
  729. .list_voltage = max8997_list_voltage_charger_cv,
  730. .get_voltage_sel = max8997_get_voltage_sel,
  731. .set_voltage = max8997_set_voltage_charger_cv,
  732. };
  733. static int max8997_set_current_limit(struct regulator_dev *rdev,
  734. int min_uA, int max_uA)
  735. {
  736. unsigned dummy;
  737. int rid = rdev_get_id(rdev);
  738. if (rid != MAX8997_CHARGER && rid != MAX8997_CHARGER_TOPOFF)
  739. return -EINVAL;
  740. /* Reuse max8997_set_voltage_ldobuck to set current_limit. */
  741. return max8997_set_voltage_ldobuck(rdev, min_uA, max_uA, &dummy);
  742. }
  743. static int max8997_get_current_limit(struct regulator_dev *rdev)
  744. {
  745. int sel, rid = rdev_get_id(rdev);
  746. if (rid != MAX8997_CHARGER && rid != MAX8997_CHARGER_TOPOFF)
  747. return -EINVAL;
  748. sel = max8997_get_voltage_sel(rdev);
  749. if (sel < 0)
  750. return sel;
  751. /* Reuse max8997_list_voltage to get current_limit. */
  752. return max8997_list_voltage(rdev, sel);
  753. }
  754. static struct regulator_ops max8997_charger_ops = {
  755. .is_enabled = max8997_reg_is_enabled,
  756. .enable = max8997_reg_enable,
  757. .disable = max8997_reg_disable,
  758. .get_current_limit = max8997_get_current_limit,
  759. .set_current_limit = max8997_set_current_limit,
  760. };
  761. static struct regulator_ops max8997_charger_fixedstate_ops = {
  762. .is_enabled = max8997_reg_is_enabled,
  763. .get_current_limit = max8997_get_current_limit,
  764. .set_current_limit = max8997_set_current_limit,
  765. };
  766. #define MAX8997_VOLTAGE_REGULATOR(_name, _ops) {\
  767. .name = #_name, \
  768. .id = MAX8997_##_name, \
  769. .ops = &_ops, \
  770. .type = REGULATOR_VOLTAGE, \
  771. .owner = THIS_MODULE, \
  772. }
  773. #define MAX8997_CURRENT_REGULATOR(_name, _ops) {\
  774. .name = #_name, \
  775. .id = MAX8997_##_name, \
  776. .ops = &_ops, \
  777. .type = REGULATOR_CURRENT, \
  778. .owner = THIS_MODULE, \
  779. }
  780. static struct regulator_desc regulators[] = {
  781. MAX8997_VOLTAGE_REGULATOR(LDO1, max8997_ldo_ops),
  782. MAX8997_VOLTAGE_REGULATOR(LDO2, max8997_ldo_ops),
  783. MAX8997_VOLTAGE_REGULATOR(LDO3, max8997_ldo_ops),
  784. MAX8997_VOLTAGE_REGULATOR(LDO4, max8997_ldo_ops),
  785. MAX8997_VOLTAGE_REGULATOR(LDO5, max8997_ldo_ops),
  786. MAX8997_VOLTAGE_REGULATOR(LDO6, max8997_ldo_ops),
  787. MAX8997_VOLTAGE_REGULATOR(LDO7, max8997_ldo_ops),
  788. MAX8997_VOLTAGE_REGULATOR(LDO8, max8997_ldo_ops),
  789. MAX8997_VOLTAGE_REGULATOR(LDO9, max8997_ldo_ops),
  790. MAX8997_VOLTAGE_REGULATOR(LDO10, max8997_ldo_ops),
  791. MAX8997_VOLTAGE_REGULATOR(LDO11, max8997_ldo_ops),
  792. MAX8997_VOLTAGE_REGULATOR(LDO12, max8997_ldo_ops),
  793. MAX8997_VOLTAGE_REGULATOR(LDO13, max8997_ldo_ops),
  794. MAX8997_VOLTAGE_REGULATOR(LDO14, max8997_ldo_ops),
  795. MAX8997_VOLTAGE_REGULATOR(LDO15, max8997_ldo_ops),
  796. MAX8997_VOLTAGE_REGULATOR(LDO16, max8997_ldo_ops),
  797. MAX8997_VOLTAGE_REGULATOR(LDO17, max8997_ldo_ops),
  798. MAX8997_VOLTAGE_REGULATOR(LDO18, max8997_ldo_ops),
  799. MAX8997_VOLTAGE_REGULATOR(LDO21, max8997_ldo_ops),
  800. MAX8997_VOLTAGE_REGULATOR(BUCK1, max8997_buck_ops),
  801. MAX8997_VOLTAGE_REGULATOR(BUCK2, max8997_buck_ops),
  802. MAX8997_VOLTAGE_REGULATOR(BUCK3, max8997_buck_ops),
  803. MAX8997_VOLTAGE_REGULATOR(BUCK4, max8997_buck_ops),
  804. MAX8997_VOLTAGE_REGULATOR(BUCK5, max8997_buck_ops),
  805. MAX8997_VOLTAGE_REGULATOR(BUCK6, max8997_fixedvolt_ops),
  806. MAX8997_VOLTAGE_REGULATOR(BUCK7, max8997_buck_ops),
  807. MAX8997_VOLTAGE_REGULATOR(EN32KHZ_AP, max8997_fixedvolt_ops),
  808. MAX8997_VOLTAGE_REGULATOR(EN32KHZ_CP, max8997_fixedvolt_ops),
  809. MAX8997_VOLTAGE_REGULATOR(ENVICHG, max8997_fixedvolt_ops),
  810. MAX8997_VOLTAGE_REGULATOR(ESAFEOUT1, max8997_safeout_ops),
  811. MAX8997_VOLTAGE_REGULATOR(ESAFEOUT2, max8997_safeout_ops),
  812. MAX8997_VOLTAGE_REGULATOR(CHARGER_CV, max8997_fixedstate_ops),
  813. MAX8997_CURRENT_REGULATOR(CHARGER, max8997_charger_ops),
  814. MAX8997_CURRENT_REGULATOR(CHARGER_TOPOFF,
  815. max8997_charger_fixedstate_ops),
  816. };
  817. static __devinit int max8997_pmic_probe(struct platform_device *pdev)
  818. {
  819. struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent);
  820. struct max8997_platform_data *pdata = dev_get_platdata(iodev->dev);
  821. struct regulator_config config = { };
  822. struct regulator_dev **rdev;
  823. struct max8997_data *max8997;
  824. struct i2c_client *i2c;
  825. int i, ret, size;
  826. u8 max_buck1 = 0, max_buck2 = 0, max_buck5 = 0;
  827. if (!pdata) {
  828. dev_err(pdev->dev.parent, "No platform init data supplied.\n");
  829. return -ENODEV;
  830. }
  831. max8997 = kzalloc(sizeof(struct max8997_data), GFP_KERNEL);
  832. if (!max8997)
  833. return -ENOMEM;
  834. size = sizeof(struct regulator_dev *) * pdata->num_regulators;
  835. max8997->rdev = kzalloc(size, GFP_KERNEL);
  836. if (!max8997->rdev) {
  837. kfree(max8997);
  838. return -ENOMEM;
  839. }
  840. rdev = max8997->rdev;
  841. max8997->dev = &pdev->dev;
  842. max8997->iodev = iodev;
  843. max8997->num_regulators = pdata->num_regulators;
  844. platform_set_drvdata(pdev, max8997);
  845. i2c = max8997->iodev->i2c;
  846. max8997->buck125_gpioindex = pdata->buck125_default_idx;
  847. max8997->buck1_gpiodvs = pdata->buck1_gpiodvs;
  848. max8997->buck2_gpiodvs = pdata->buck2_gpiodvs;
  849. max8997->buck5_gpiodvs = pdata->buck5_gpiodvs;
  850. memcpy(max8997->buck125_gpios, pdata->buck125_gpios, sizeof(int) * 3);
  851. max8997->ignore_gpiodvs_side_effect = pdata->ignore_gpiodvs_side_effect;
  852. for (i = 0; i < 8; i++) {
  853. max8997->buck1_vol[i] = ret =
  854. max8997_get_voltage_proper_val(
  855. &buck1245_voltage_map_desc,
  856. pdata->buck1_voltage[i] / 1000,
  857. pdata->buck1_voltage[i] / 1000 +
  858. buck1245_voltage_map_desc.step);
  859. if (ret < 0)
  860. goto err_alloc;
  861. max8997->buck2_vol[i] = ret =
  862. max8997_get_voltage_proper_val(
  863. &buck1245_voltage_map_desc,
  864. pdata->buck2_voltage[i] / 1000,
  865. pdata->buck2_voltage[i] / 1000 +
  866. buck1245_voltage_map_desc.step);
  867. if (ret < 0)
  868. goto err_alloc;
  869. max8997->buck5_vol[i] = ret =
  870. max8997_get_voltage_proper_val(
  871. &buck1245_voltage_map_desc,
  872. pdata->buck5_voltage[i] / 1000,
  873. pdata->buck5_voltage[i] / 1000 +
  874. buck1245_voltage_map_desc.step);
  875. if (ret < 0)
  876. goto err_alloc;
  877. if (max_buck1 < max8997->buck1_vol[i])
  878. max_buck1 = max8997->buck1_vol[i];
  879. if (max_buck2 < max8997->buck2_vol[i])
  880. max_buck2 = max8997->buck2_vol[i];
  881. if (max_buck5 < max8997->buck5_vol[i])
  882. max_buck5 = max8997->buck5_vol[i];
  883. }
  884. /* For the safety, set max voltage before setting up */
  885. for (i = 0; i < 8; i++) {
  886. max8997_update_reg(i2c, MAX8997_REG_BUCK1DVS1 + i,
  887. max_buck1, 0x3f);
  888. max8997_update_reg(i2c, MAX8997_REG_BUCK2DVS1 + i,
  889. max_buck2, 0x3f);
  890. max8997_update_reg(i2c, MAX8997_REG_BUCK5DVS1 + i,
  891. max_buck5, 0x3f);
  892. }
  893. /*
  894. * If buck 1, 2, and 5 do not care DVS GPIO settings, ignore them.
  895. * If at least one of them cares, set gpios.
  896. */
  897. if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs ||
  898. pdata->buck5_gpiodvs) {
  899. bool gpio1set = false, gpio2set = false;
  900. if (!gpio_is_valid(pdata->buck125_gpios[0]) ||
  901. !gpio_is_valid(pdata->buck125_gpios[1]) ||
  902. !gpio_is_valid(pdata->buck125_gpios[2])) {
  903. dev_err(&pdev->dev, "GPIO NOT VALID\n");
  904. ret = -EINVAL;
  905. goto err_alloc;
  906. }
  907. ret = gpio_request(pdata->buck125_gpios[0],
  908. "MAX8997 SET1");
  909. if (ret == -EBUSY)
  910. dev_warn(&pdev->dev, "Duplicated gpio request"
  911. " on SET1\n");
  912. else if (ret)
  913. goto err_alloc;
  914. else
  915. gpio1set = true;
  916. ret = gpio_request(pdata->buck125_gpios[1],
  917. "MAX8997 SET2");
  918. if (ret == -EBUSY)
  919. dev_warn(&pdev->dev, "Duplicated gpio request"
  920. " on SET2\n");
  921. else if (ret) {
  922. if (gpio1set)
  923. gpio_free(pdata->buck125_gpios[0]);
  924. goto err_alloc;
  925. } else
  926. gpio2set = true;
  927. ret = gpio_request(pdata->buck125_gpios[2],
  928. "MAX8997 SET3");
  929. if (ret == -EBUSY)
  930. dev_warn(&pdev->dev, "Duplicated gpio request"
  931. " on SET3\n");
  932. else if (ret) {
  933. if (gpio1set)
  934. gpio_free(pdata->buck125_gpios[0]);
  935. if (gpio2set)
  936. gpio_free(pdata->buck125_gpios[1]);
  937. goto err_alloc;
  938. }
  939. gpio_direction_output(pdata->buck125_gpios[0],
  940. (max8997->buck125_gpioindex >> 2)
  941. & 0x1); /* SET1 */
  942. gpio_direction_output(pdata->buck125_gpios[1],
  943. (max8997->buck125_gpioindex >> 1)
  944. & 0x1); /* SET2 */
  945. gpio_direction_output(pdata->buck125_gpios[2],
  946. (max8997->buck125_gpioindex >> 0)
  947. & 0x1); /* SET3 */
  948. ret = 0;
  949. }
  950. /* DVS-GPIO disabled */
  951. max8997_update_reg(i2c, MAX8997_REG_BUCK1CTRL, (pdata->buck1_gpiodvs) ?
  952. (1 << 1) : (0 << 1), 1 << 1);
  953. max8997_update_reg(i2c, MAX8997_REG_BUCK2CTRL, (pdata->buck2_gpiodvs) ?
  954. (1 << 1) : (0 << 1), 1 << 1);
  955. max8997_update_reg(i2c, MAX8997_REG_BUCK5CTRL, (pdata->buck5_gpiodvs) ?
  956. (1 << 1) : (0 << 1), 1 << 1);
  957. /* Initialize all the DVS related BUCK registers */
  958. for (i = 0; i < 8; i++) {
  959. max8997_update_reg(i2c, MAX8997_REG_BUCK1DVS1 + i,
  960. max8997->buck1_vol[i],
  961. 0x3f);
  962. max8997_update_reg(i2c, MAX8997_REG_BUCK2DVS1 + i,
  963. max8997->buck2_vol[i],
  964. 0x3f);
  965. max8997_update_reg(i2c, MAX8997_REG_BUCK5DVS1 + i,
  966. max8997->buck5_vol[i],
  967. 0x3f);
  968. }
  969. /* Misc Settings */
  970. max8997->ramp_delay = 10; /* set 10mV/us, which is the default */
  971. max8997_write_reg(i2c, MAX8997_REG_BUCKRAMP, (0xf << 4) | 0x9);
  972. for (i = 0; i < pdata->num_regulators; i++) {
  973. const struct voltage_map_desc *desc;
  974. int id = pdata->regulators[i].id;
  975. desc = reg_voltage_map[id];
  976. if (desc)
  977. regulators[id].n_voltages =
  978. (desc->max - desc->min) / desc->step + 1;
  979. else if (id == MAX8997_ESAFEOUT1 || id == MAX8997_ESAFEOUT2)
  980. regulators[id].n_voltages = 4;
  981. else if (id == MAX8997_CHARGER_CV)
  982. regulators[id].n_voltages = 16;
  983. config.dev = max8997->dev;
  984. config.init_data = pdata->regulators[i].initdata;
  985. config.driver_data = max8997;
  986. rdev[i] = regulator_register(&regulators[id], &config);
  987. if (IS_ERR(rdev[i])) {
  988. ret = PTR_ERR(rdev[i]);
  989. dev_err(max8997->dev, "regulator init failed for %d\n",
  990. id);
  991. rdev[i] = NULL;
  992. goto err;
  993. }
  994. }
  995. return 0;
  996. err:
  997. for (i = 0; i < max8997->num_regulators; i++)
  998. if (rdev[i])
  999. regulator_unregister(rdev[i]);
  1000. err_alloc:
  1001. kfree(max8997->rdev);
  1002. kfree(max8997);
  1003. return ret;
  1004. }
  1005. static int __devexit max8997_pmic_remove(struct platform_device *pdev)
  1006. {
  1007. struct max8997_data *max8997 = platform_get_drvdata(pdev);
  1008. struct regulator_dev **rdev = max8997->rdev;
  1009. int i;
  1010. for (i = 0; i < max8997->num_regulators; i++)
  1011. if (rdev[i])
  1012. regulator_unregister(rdev[i]);
  1013. kfree(max8997->rdev);
  1014. kfree(max8997);
  1015. return 0;
  1016. }
  1017. static const struct platform_device_id max8997_pmic_id[] = {
  1018. { "max8997-pmic", 0},
  1019. { },
  1020. };
  1021. MODULE_DEVICE_TABLE(platform, max8997_pmic_id);
  1022. static struct platform_driver max8997_pmic_driver = {
  1023. .driver = {
  1024. .name = "max8997-pmic",
  1025. .owner = THIS_MODULE,
  1026. },
  1027. .probe = max8997_pmic_probe,
  1028. .remove = __devexit_p(max8997_pmic_remove),
  1029. .id_table = max8997_pmic_id,
  1030. };
  1031. static int __init max8997_pmic_init(void)
  1032. {
  1033. return platform_driver_register(&max8997_pmic_driver);
  1034. }
  1035. subsys_initcall(max8997_pmic_init);
  1036. static void __exit max8997_pmic_cleanup(void)
  1037. {
  1038. platform_driver_unregister(&max8997_pmic_driver);
  1039. }
  1040. module_exit(max8997_pmic_cleanup);
  1041. MODULE_DESCRIPTION("MAXIM 8997/8966 Regulator Driver");
  1042. MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
  1043. MODULE_LICENSE("GPL");