s2mpb02-regulator.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. /*
  2. * s2mpb02_regulator.c - Regulator driver for the Samsung s2mpb02
  3. *
  4. * Copyright (C) 2014 Samsung Electronics
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. *
  20. */
  21. #include <linux/module.h>
  22. #include <linux/bug.h>
  23. #include <linux/delay.h>
  24. #include <linux/err.h>
  25. #include <linux/gpio.h>
  26. #include <linux/slab.h>
  27. #include <linux/module.h>
  28. #include <linux/platform_device.h>
  29. #include <linux/regulator/driver.h>
  30. #include <linux/regulator/machine.h>
  31. #if IS_ENABLED(CONFIG_REGULATOR_DEBUG_CONTROL)
  32. #include <linux/regulator/debug-regulator.h>
  33. #endif
  34. #include <linux/mfd/samsung/s2mpb02.h>
  35. #include <linux/mfd/samsung/s2mpb02-regulator.h>
  36. #include <linux/regulator/of_regulator.h>
  37. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  38. #include <linux/regulator/pmic_class.h>
  39. #endif
  40. struct s2mpb02_data {
  41. struct s2mpb02_dev *iodev;
  42. int num_regulators;
  43. struct regulator_dev *rdev[S2MPB02_REGULATOR_MAX];
  44. bool need_recovery;
  45. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  46. u8 read_addr;
  47. u8 read_val;
  48. struct device *dev;
  49. #endif
  50. };
  51. static int s2m_enable(struct regulator_dev *rdev)
  52. {
  53. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  54. struct i2c_client *i2c = info->iodev->i2c;
  55. return s2mpb02_update_reg(i2c, rdev->desc->enable_reg,
  56. rdev->desc->enable_mask,
  57. rdev->desc->enable_mask);
  58. }
  59. static int s2m_disable_regmap(struct regulator_dev *rdev)
  60. {
  61. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  62. struct i2c_client *i2c = info->iodev->i2c;
  63. u8 val;
  64. if (rdev->desc->enable_is_inverted)
  65. val = rdev->desc->enable_mask;
  66. else
  67. val = 0;
  68. return s2mpb02_update_reg(i2c, rdev->desc->enable_reg,
  69. val, rdev->desc->enable_mask);
  70. }
  71. static int s2m_is_enabled_regmap(struct regulator_dev *rdev)
  72. {
  73. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  74. struct i2c_client *i2c = info->iodev->i2c;
  75. int ret;
  76. u8 val;
  77. ret = s2mpb02_read_reg(i2c, rdev->desc->enable_reg, &val);
  78. if (ret < 0)
  79. return ret;
  80. val &= rdev->desc->enable_mask;
  81. return (val == rdev->desc->enable_mask);
  82. }
  83. static int s2m_get_voltage_sel_regmap(struct regulator_dev *rdev)
  84. {
  85. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  86. struct i2c_client *i2c = info->iodev->i2c;
  87. int ret;
  88. u8 val;
  89. ret = s2mpb02_read_reg(i2c, rdev->desc->vsel_reg, &val);
  90. if (ret < 0)
  91. return ret;
  92. val &= rdev->desc->vsel_mask;
  93. return val;
  94. }
  95. static int s2m_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel)
  96. {
  97. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  98. struct i2c_client *i2c = info->iodev->i2c;
  99. int ret;
  100. ret = s2mpb02_update_reg(i2c, rdev->desc->vsel_reg,
  101. sel, rdev->desc->vsel_mask);
  102. if (ret < 0)
  103. goto out;
  104. if (rdev->desc->apply_bit)
  105. ret = s2mpb02_update_reg(i2c, rdev->desc->apply_reg,
  106. rdev->desc->apply_bit,
  107. rdev->desc->apply_bit);
  108. return ret;
  109. out:
  110. pr_warn("%s: failed to set voltage_sel_regmap\n", rdev->desc->name);
  111. return ret;
  112. }
  113. static int s2m_set_voltage_sel_regmap_buck(struct regulator_dev *rdev,
  114. unsigned sel)
  115. {
  116. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  117. struct i2c_client *i2c = info->iodev->i2c;
  118. int ret;
  119. ret = s2mpb02_write_reg(i2c, rdev->desc->vsel_reg, sel);
  120. if (ret < 0)
  121. goto out;
  122. if (rdev->desc->apply_bit)
  123. ret = s2mpb02_update_reg(i2c, rdev->desc->apply_reg,
  124. rdev->desc->apply_bit,
  125. rdev->desc->apply_bit);
  126. return ret;
  127. out:
  128. pr_warn("%s: failed to set voltage_sel_regmap\n", rdev->desc->name);
  129. return ret;
  130. }
  131. static int s2m_set_voltage_time_sel(struct regulator_dev *rdev,
  132. unsigned int old_selector,
  133. unsigned int new_selector)
  134. {
  135. int old_volt, new_volt;
  136. /* sanity check */
  137. if (!rdev->desc->ops->list_voltage)
  138. return -EINVAL;
  139. old_volt = rdev->desc->ops->list_voltage(rdev, old_selector);
  140. new_volt = rdev->desc->ops->list_voltage(rdev, new_selector);
  141. if (old_selector < new_selector)
  142. return DIV_ROUND_UP(new_volt - old_volt, S2MPB02_RAMP_DELAY);
  143. return 0;
  144. }
  145. #if IS_ENABLED(CONFIG_SEC_PM)
  146. #define S2MPB02_BUCK_MODE_MASK (3 << 2)
  147. #define S2MPB02_BUCK_MODE_FPWM (3 << 2)
  148. #define S2MPB02_BUCK_MODE_AUTO (2 << 2)
  149. /* BUCKs & BB support [Auto/Force PWM] mode */
  150. static int s2m_set_buck_mode(struct regulator_dev *rdev, unsigned int mode)
  151. {
  152. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  153. struct i2c_client *i2c = info->iodev->i2c;
  154. u8 val;
  155. dev_info(info->iodev->dev, "%s: mode: %u\n", __func__, mode);
  156. if (mode == REGULATOR_MODE_FAST)
  157. val = S2MPB02_BUCK_MODE_FPWM;
  158. else if (mode == REGULATOR_MODE_NORMAL)
  159. val = S2MPB02_BUCK_MODE_AUTO;
  160. else
  161. return -EINVAL;
  162. return s2mpb02_update_reg(i2c, rdev->desc->enable_reg, val,
  163. S2MPB02_BUCK_MODE_MASK);
  164. }
  165. static unsigned int s2m_get_buck_mode(struct regulator_dev *rdev)
  166. {
  167. struct s2mpb02_data *info = rdev_get_drvdata(rdev);
  168. struct i2c_client *i2c = info->iodev->i2c;
  169. int ret;
  170. u8 val;
  171. ret = s2mpb02_read_reg(i2c, rdev->desc->enable_reg, &val);
  172. if (ret < 0)
  173. return ret;
  174. val = val & S2MPB02_BUCK_MODE_MASK;
  175. dev_info(info->iodev->dev, "%s: val: %u\n", __func__, val >> 2);
  176. if (val == S2MPB02_BUCK_MODE_FPWM)
  177. ret = REGULATOR_MODE_FAST;
  178. else if (val == S2MPB02_BUCK_MODE_AUTO)
  179. ret = REGULATOR_MODE_NORMAL;
  180. else
  181. ret = -EINVAL;
  182. return ret;
  183. }
  184. #endif /* CONFIG_SEC_PM */
  185. static struct regulator_ops s2mpb02_ldo_ops = {
  186. .list_voltage = regulator_list_voltage_linear,
  187. .map_voltage = regulator_map_voltage_linear,
  188. .is_enabled = s2m_is_enabled_regmap,
  189. .enable = s2m_enable,
  190. .disable = s2m_disable_regmap,
  191. .get_voltage_sel = s2m_get_voltage_sel_regmap,
  192. .set_voltage_sel = s2m_set_voltage_sel_regmap,
  193. .set_voltage_time_sel = s2m_set_voltage_time_sel,
  194. };
  195. static struct regulator_ops s2mpb02_buck_ops = {
  196. .list_voltage = regulator_list_voltage_linear,
  197. .map_voltage = regulator_map_voltage_linear,
  198. .is_enabled = s2m_is_enabled_regmap,
  199. .enable = s2m_enable,
  200. .disable = s2m_disable_regmap,
  201. .get_voltage_sel = s2m_get_voltage_sel_regmap,
  202. .set_voltage_sel = s2m_set_voltage_sel_regmap_buck,
  203. .set_voltage_time_sel = s2m_set_voltage_time_sel,
  204. #if IS_ENABLED(CONFIG_SEC_PM)
  205. .set_mode = s2m_set_buck_mode,
  206. .get_mode = s2m_get_buck_mode,
  207. #endif /* CONFIG_SEC_PM */
  208. };
  209. #if IS_ENABLED(CONFIG_SEC_PM)
  210. static unsigned int s2mpb02_of_map_mode(unsigned int mode)
  211. {
  212. switch (mode) {
  213. case 1 ... 2: /* Forced PWM & Auto */
  214. return mode;
  215. default:
  216. return REGULATOR_MODE_INVALID;
  217. }
  218. }
  219. #else
  220. static unsigned int s2mpb02_of_map_mode(unsigned int mode)
  221. {
  222. return REGULATOR_MODE_INVALID;
  223. }
  224. #endif /* CONFIG_SEC_PM */
  225. #define _BUCK(macro) S2MPB02_BUCK##macro
  226. #define _buck_ops(num) s2mpb02_buck_ops##num
  227. #define _LDO(macro) S2MPB02_LDO##macro
  228. #define _REG(ctrl) S2MPB02_REG##ctrl
  229. #define _ldo_ops(num) s2mpb02_ldo_ops##num
  230. #define _TIME(macro) S2MPB02_ENABLE_TIME##macro
  231. #define BUCK_DESC(_name, _id, _ops, m, s, v, e, t) { \
  232. .name = _name, \
  233. .id = _id, \
  234. .ops = _ops, \
  235. .type = REGULATOR_VOLTAGE, \
  236. .owner = THIS_MODULE, \
  237. .min_uV = m, \
  238. .uV_step = s, \
  239. .n_voltages = S2MPB02_BUCK_N_VOLTAGES, \
  240. .vsel_reg = v, \
  241. .vsel_mask = S2MPB02_BUCK_VSEL_MASK, \
  242. .enable_reg = e, \
  243. .enable_mask = S2MPB02_BUCK_ENABLE_MASK, \
  244. .enable_time = t, \
  245. .of_map_mode = s2mpb02_of_map_mode, \
  246. }
  247. #define LDO_DESC(_name, _id, _ops, m, s, v, e, t) { \
  248. .name = _name, \
  249. .id = _id, \
  250. .ops = _ops, \
  251. .type = REGULATOR_VOLTAGE, \
  252. .owner = THIS_MODULE, \
  253. .min_uV = m, \
  254. .uV_step = s, \
  255. .n_voltages = S2MPB02_LDO_N_VOLTAGES, \
  256. .vsel_reg = v, \
  257. .vsel_mask = S2MPB02_LDO_VSEL_MASK, \
  258. .enable_reg = e, \
  259. .enable_mask = S2MPB02_LDO_ENABLE_MASK, \
  260. .enable_time = t \
  261. }
  262. static struct regulator_desc regulators[S2MPB02_REGULATOR_MAX] = {
  263. /* name, id, ops, min_uv, uV_step, vsel_reg, enable_reg */
  264. LDO_DESC("s2mpb02-ldo1", _LDO(1), &_ldo_ops(), _LDO(_MIN1),
  265. _LDO(_STEP1), _REG(_L1CTRL), _REG(_L1CTRL), _TIME(_LDO)),
  266. LDO_DESC("s2mpb02-ldo2", _LDO(2), &_ldo_ops(), _LDO(_MIN1),
  267. _LDO(_STEP1), _REG(_L2CTRL), _REG(_L2CTRL), _TIME(_LDO)),
  268. LDO_DESC("s2mpb02-ldo3", _LDO(3), &_ldo_ops(), _LDO(_MIN1),
  269. _LDO(_STEP1), _REG(_L3CTRL), _REG(_L3CTRL), _TIME(_LDO)),
  270. LDO_DESC("s2mpb02-ldo4", _LDO(4), &_ldo_ops(), _LDO(_MIN1),
  271. _LDO(_STEP1), _REG(_L4CTRL), _REG(_L4CTRL), _TIME(_LDO)),
  272. LDO_DESC("s2mpb02-ldo5", _LDO(5), &_ldo_ops(), _LDO(_MIN1),
  273. _LDO(_STEP1), _REG(_L5CTRL), _REG(_L5CTRL), _TIME(_LDO)),
  274. LDO_DESC("s2mpb02-ldo6", _LDO(6), &_ldo_ops(), _LDO(_MIN1),
  275. _LDO(_STEP2), _REG(_L6CTRL), _REG(_L6CTRL), _TIME(_LDO)),
  276. LDO_DESC("s2mpb02-ldo7", _LDO(7), &_ldo_ops(), _LDO(_MIN1),
  277. _LDO(_STEP2), _REG(_L7CTRL), _REG(_L7CTRL), _TIME(_LDO)),
  278. LDO_DESC("s2mpb02-ldo8", _LDO(8), &_ldo_ops(), _LDO(_MIN1),
  279. _LDO(_STEP2), _REG(_L8CTRL), _REG(_L8CTRL), _TIME(_LDO)),
  280. LDO_DESC("s2mpb02-ldo9", _LDO(9), &_ldo_ops(), _LDO(_MIN1),
  281. _LDO(_STEP2), _REG(_L9CTRL), _REG(_L9CTRL), _TIME(_LDO)),
  282. LDO_DESC("s2mpb02-ldo10", _LDO(10), &_ldo_ops(), _LDO(_MIN1),
  283. _LDO(_STEP2), _REG(_L10CTRL), _REG(_L10CTRL), _TIME(_LDO)),
  284. LDO_DESC("s2mpb02-ldo11", _LDO(11), &_ldo_ops(), _LDO(_MIN1),
  285. _LDO(_STEP2), _REG(_L11CTRL), _REG(_L11CTRL), _TIME(_LDO)),
  286. LDO_DESC("s2mpb02-ldo12", _LDO(12), &_ldo_ops(), _LDO(_MIN1),
  287. _LDO(_STEP2), _REG(_L12CTRL), _REG(_L12CTRL), _TIME(_LDO)),
  288. LDO_DESC("s2mpb02-ldo13", _LDO(13), &_ldo_ops(), _LDO(_MIN1),
  289. _LDO(_STEP2), _REG(_L13CTRL), _REG(_L13CTRL), _TIME(_LDO)),
  290. LDO_DESC("s2mpb02-ldo14", _LDO(14), &_ldo_ops(), _LDO(_MIN1),
  291. _LDO(_STEP2), _REG(_L14CTRL), _REG(_L14CTRL), _TIME(_LDO)),
  292. LDO_DESC("s2mpb02-ldo15", _LDO(15), &_ldo_ops(), _LDO(_MIN1),
  293. _LDO(_STEP2), _REG(_L15CTRL), _REG(_L15CTRL), _TIME(_LDO)),
  294. LDO_DESC("s2mpb02-ldo16", _LDO(16), &_ldo_ops(), _LDO(_MIN1),
  295. _LDO(_STEP2), _REG(_L16CTRL), _REG(_L16CTRL), _TIME(_LDO)),
  296. LDO_DESC("s2mpb02-ldo17", _LDO(17), &_ldo_ops(), _LDO(_MIN1),
  297. _LDO(_STEP2), _REG(_L17CTRL), _REG(_L17CTRL), _TIME(_LDO)),
  298. LDO_DESC("s2mpb02-ldo18", _LDO(18), &_ldo_ops(), _LDO(_MIN1),
  299. _LDO(_STEP2), _REG(_L18CTRL), _REG(_L18CTRL), _TIME(_LDO)),
  300. BUCK_DESC("s2mpb02-buck1", _BUCK(1), &_buck_ops(), _BUCK(_MIN1),
  301. _BUCK(_STEP1), _REG(_B1CTRL2), _REG(_B1CTRL1), _TIME(_BUCK)),
  302. BUCK_DESC("s2mpb02-buck2", _BUCK(2), &_buck_ops(), _BUCK(_MIN1),
  303. _BUCK(_STEP1), _REG(_B2CTRL2), _REG(_B2CTRL1), _TIME(_BUCK)),
  304. BUCK_DESC("s2mpb02-bb", S2MPB02_BB1, &_buck_ops(), _BUCK(_MIN2),
  305. _BUCK(_STEP2), _REG(_BB1CTRL2), _REG(_BB1CTRL1), _TIME(_BB)),
  306. };
  307. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  308. /*
  309. * Recovery logic for S2MPB02 detach test
  310. */
  311. int s2mpb02_need_recovery(struct s2mpb02_data *s2mpb02)
  312. {
  313. struct regulator_dev *rdev;
  314. int i, ret = 0;
  315. // Check whether S2MPB02 Recovery is needed
  316. for (i = 0; i < s2mpb02->num_regulators; i++) {
  317. if (s2mpb02->rdev[i]) {
  318. rdev = s2mpb02->rdev[i];
  319. // If the regulator is always-on or use_count is over 0, 'enable bit' should be checked
  320. if ((rdev->constraints->always_on) || (rdev->use_count > 0)) {
  321. if(!s2m_is_enabled_regmap(rdev)) {
  322. pr_info("%s: s2mpb02->rdev[%d]->desc->name(%s)\n",
  323. __func__, i, rdev->desc->name);
  324. ret = 1;
  325. continue;
  326. }
  327. }
  328. }
  329. }
  330. return ret;
  331. }
  332. int s2mpb02_recovery(struct s2mpb02_data *s2mpb02)
  333. {
  334. struct regulator_dev *rdev;
  335. int i, ret = 0;
  336. u8 val;
  337. unsigned int vol, reg;
  338. if (!s2mpb02) {
  339. pr_info("%s: There is no local rdev data\n", __func__);
  340. return -ENODEV;
  341. }
  342. pr_info("%s: Start recovery\n", __func__);
  343. // S2MPB02 Recovery
  344. for (i = 0; i < s2mpb02->num_regulators; i++) {
  345. if (s2mpb02->rdev[i]) {
  346. rdev = s2mpb02->rdev[i];
  347. pr_info("%s: s2mpb02->rdev[%d]->desc->name(%s): max_uV(%d), min_uV(%d), always_on(%d), use_count(%d)\n",
  348. __func__, i, rdev->desc->name, rdev->constraints->max_uV, rdev->desc->min_uV,
  349. rdev->constraints->always_on, rdev->use_count);
  350. // Make sure enabled registers are cleared
  351. s2m_disable_regmap(rdev);
  352. // Get and calculate voltage from regulator framework
  353. vol = (rdev->constraints->min_uV - rdev->desc->min_uV) / rdev->desc->uV_step;
  354. reg = s2m_get_voltage_sel_regmap(rdev);
  355. // Set proper voltage according to regulator type
  356. if (rdev->desc->vsel_mask == S2MPB02_BUCK_VSEL_MASK)
  357. ret = s2m_set_voltage_sel_regmap_buck(rdev, vol);
  358. else if (S2MPB02_LDO_VSEL_MASK)
  359. ret = s2m_set_voltage_sel_regmap(rdev, vol);
  360. if (ret < 0)
  361. return ret;
  362. if (rdev->constraints->always_on) {
  363. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, rdev->desc->enable_reg, &val);
  364. if (ret < 0)
  365. return ret;
  366. if (!(val & 0x80)) {
  367. ret = s2m_enable(rdev);
  368. if (ret < 0)
  369. return ret;
  370. }
  371. } else {
  372. if (rdev->use_count > 0) {
  373. ret = s2m_enable(rdev);
  374. if (ret < 0)
  375. return ret;
  376. }
  377. }
  378. }
  379. }
  380. pr_info("%s: S2MPB02 is successfully recovered!\n", __func__);
  381. return ret;
  382. }
  383. static int s2mpb02_regulator_resume(struct device *dev)
  384. {
  385. struct platform_device *pdev = to_platform_device(dev);
  386. struct s2mpb02_data *s2mpb02 = platform_get_drvdata(pdev);
  387. int ret;
  388. if (s2mpb02->need_recovery) {
  389. pr_info("%s: Check recovery needs\n", __func__);
  390. ret = s2mpb02_need_recovery(s2mpb02);
  391. // Do recovery if needed
  392. if (ret)
  393. s2mpb02_recovery(s2mpb02);
  394. }
  395. return 0;
  396. }
  397. const struct dev_pm_ops s2mpb02_regulator_pm = {
  398. .resume = s2mpb02_regulator_resume,
  399. };
  400. #endif
  401. #if IS_ENABLED(CONFIG_OF)
  402. static int s2mpb02_pmic_dt_parse_pdata(struct s2mpb02_dev *iodev,
  403. struct s2mpb02_platform_data *pdata)
  404. {
  405. struct device_node *pmic_np, *regulators_np, *reg_np;
  406. struct s2mpb02_regulator_data *rdata;
  407. size_t i;
  408. pmic_np = iodev->dev->of_node;
  409. if (!pmic_np) {
  410. dev_err(iodev->dev, "could not find pmic sub-node\n");
  411. return -ENODEV;
  412. }
  413. regulators_np = of_find_node_by_name(pmic_np, "regulators");
  414. if (!regulators_np) {
  415. dev_err(iodev->dev, "could not find regulators sub-node\n");
  416. return -EINVAL;
  417. }
  418. pdata->need_recovery = of_property_read_bool(pmic_np, "s2mpb02,need_recovery");
  419. /* count the number of regulators to be supported in pmic */
  420. pdata->num_regulators = 0;
  421. for_each_child_of_node(regulators_np, reg_np) {
  422. pdata->num_regulators++;
  423. }
  424. rdata = devm_kzalloc(iodev->dev, sizeof(*rdata) *
  425. pdata->num_regulators, GFP_KERNEL);
  426. if (!rdata) {
  427. dev_err(iodev->dev,
  428. "could not allocate memory for regulator data\n");
  429. return -ENOMEM;
  430. }
  431. pdata->regulators = rdata;
  432. pdata->num_rdata = 0;
  433. for_each_child_of_node(regulators_np, reg_np) {
  434. for (i = 0; i < ARRAY_SIZE(regulators); i++)
  435. if (!of_node_cmp(reg_np->name, regulators[i].name))
  436. break;
  437. if (i == ARRAY_SIZE(regulators)) {
  438. dev_warn(iodev->dev,
  439. "don't know how to configure regulator %s\n",
  440. reg_np->name);
  441. continue;
  442. }
  443. rdata->id = i;
  444. rdata->initdata = of_get_regulator_init_data(iodev->dev, reg_np,
  445. &regulators[i]);
  446. rdata->reg_node = reg_np;
  447. rdata++;
  448. pdata->num_rdata++;
  449. }
  450. of_node_put(regulators_np);
  451. return 0;
  452. }
  453. #else
  454. static int s2mpb02_pmic_dt_parse_pdata(struct s2mpb02_dev *iodev,
  455. struct s2mpb02_platform_data *pdata)
  456. {
  457. return 0;
  458. }
  459. #endif /* CONFIG_OF */
  460. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  461. static ssize_t s2mpb02_read_store(struct device *dev,
  462. struct device_attribute *attr,
  463. const char *buf, size_t size)
  464. {
  465. struct s2mpb02_data *s2mpb02 = dev_get_drvdata(dev);
  466. int ret;
  467. u8 val, reg_addr;
  468. if (buf == NULL) {
  469. pr_info("%s: empty buffer\n", __func__);
  470. return -1;
  471. }
  472. ret = kstrtou8(buf, 0, &reg_addr);
  473. if (ret < 0)
  474. pr_info("%s: fail to transform i2c address\n", __func__);
  475. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, reg_addr, &val);
  476. if (ret < 0)
  477. pr_info("%s: fail to read i2c address\n", __func__);
  478. pr_info("%s: reg(0x%02hhx) data(0x%02hhx)\n", __func__, reg_addr, val);
  479. s2mpb02->read_addr = reg_addr;
  480. s2mpb02->read_val = val;
  481. return size;
  482. }
  483. static ssize_t s2mpb02_read_show(struct device *dev,
  484. struct device_attribute *attr,
  485. char *buf)
  486. {
  487. struct s2mpb02_data *s2mpb02 = dev_get_drvdata(dev);
  488. return sprintf(buf, "0x%02hhx: 0x%02hhx\n", s2mpb02->read_addr,
  489. s2mpb02->read_val);
  490. }
  491. static ssize_t s2mpb02_write_store(struct device *dev,
  492. struct device_attribute *attr,
  493. const char *buf, size_t size)
  494. {
  495. struct s2mpb02_data *s2mpb02 = dev_get_drvdata(dev);
  496. int ret;
  497. u8 reg = 0, data = 0;
  498. if (buf == NULL) {
  499. pr_info("%s: empty buffer\n", __func__);
  500. return size;
  501. }
  502. ret = sscanf(buf, "0x%02hhx 0x%02hhx", &reg, &data);
  503. if (ret != 2) {
  504. pr_info("%s: input error\n", __func__);
  505. return size;
  506. }
  507. pr_info("%s: reg(0x%02hhx) data(0x%02hhx)\n", __func__, reg, data);
  508. ret = s2mpb02_write_reg(s2mpb02->iodev->i2c, reg, data);
  509. if (ret < 0)
  510. pr_info("%s: fail to write i2c addr/data\n", __func__);
  511. return size;
  512. }
  513. static ssize_t s2mpb02_write_show(struct device *dev,
  514. struct device_attribute *attr,
  515. char *buf)
  516. {
  517. return sprintf(buf, "echo (register addr.) (data) > s2mpb02_write\n");
  518. }
  519. #define ATTR_REGULATOR (2)
  520. static struct pmic_device_attribute regulator_attr[] = {
  521. PMIC_ATTR(s2mpb02_write, S_IRUGO | S_IWUSR, s2mpb02_write_show, s2mpb02_write_store),
  522. PMIC_ATTR(s2mpb02_read, S_IRUGO | S_IWUSR, s2mpb02_read_show, s2mpb02_read_store),
  523. };
  524. static int s2mpb02_create_sysfs(struct s2mpb02_data *s2mpb02)
  525. {
  526. struct device *s2mpb02_pmic = s2mpb02->dev;
  527. struct device *dev = s2mpb02->iodev->dev;
  528. char device_name[32] = {0, };
  529. int err = -ENODEV, i = 0;
  530. pr_info("%s()\n", __func__);
  531. s2mpb02->read_addr = 0;
  532. s2mpb02->read_val = 0;
  533. /* Dynamic allocation for device name */
  534. snprintf(device_name, sizeof(device_name) - 1, "%s@%s",
  535. dev_driver_string(dev), dev_name(dev));
  536. s2mpb02_pmic = pmic_device_create(s2mpb02, device_name);
  537. s2mpb02->dev = s2mpb02_pmic;
  538. /* Create sysfs entries */
  539. for (i = 0; i < ATTR_REGULATOR; i++) {
  540. err = device_create_file(s2mpb02_pmic, &regulator_attr[i].dev_attr);
  541. if (err)
  542. goto remove_pmic_device;
  543. }
  544. return 0;
  545. remove_pmic_device:
  546. for (i--; i >= 0; i--)
  547. device_remove_file(s2mpb02_pmic, &regulator_attr[i].dev_attr);
  548. pmic_device_destroy(s2mpb02_pmic->devt);
  549. return -1;
  550. }
  551. #endif
  552. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  553. /* 0x32:LDO_DSCH3, Bit[7~2]:unused */
  554. #define VALID_REG S2MPB02_REG_LDO_DSCH3 /* register address for validation */
  555. #define VALID_MASK 0xFC /* NA(unused) bit */
  556. static int s2mpb02_verify_i2c_bus(struct s2mpb02_data* s2mpb02)
  557. {
  558. u8 old_val, val;
  559. bool result = false;
  560. int ret;
  561. /* Checking S2MPB02 validation */
  562. /* 1. Write 1 to 0x32's bit[7~2] */
  563. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, VALID_REG, &val);
  564. if (ret < 0) {
  565. pr_info("%s: fail to read i2c address\n", __func__);
  566. return -ENXIO;
  567. }
  568. pr_info("%s: %s: init state: reg(0x%02x) data(0x%02x)\n",
  569. MFD_DEV_NAME, __func__, VALID_REG, val);
  570. old_val = val;
  571. ret = s2mpb02_write_reg(s2mpb02->iodev->i2c, VALID_REG, (old_val | VALID_MASK));
  572. if (ret < 0) {
  573. pr_info("%s: fail to write i2c address\n", __func__);
  574. return -ENXIO;
  575. }
  576. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, VALID_REG, &val);
  577. if (ret < 0) {
  578. pr_info("%s: fail to read i2c address\n", __func__);
  579. return -ENXIO;
  580. }
  581. pr_info("%s: %s: updated state: reg(0x%02x) data(0x%02x)\n",
  582. MFD_DEV_NAME, __func__, VALID_REG, val);
  583. if ((val & VALID_MASK) == VALID_MASK)
  584. result = true;
  585. if (!result) {
  586. pr_info("%s: %s: ERROR: state is not updated!: reg(0x%02x) data(0x%02x)\n",
  587. MFD_DEV_NAME, __func__, VALID_REG, val);
  588. return -ENODEV;
  589. }
  590. /* 2. Write 0 to 0x32's bit[7~2] */
  591. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, VALID_REG, &val);
  592. if (ret < 0) {
  593. pr_info("%s: fail to read i2c address\n", __func__);
  594. return -ENXIO;
  595. }
  596. pr_info("%s: %s: init state: reg(0x%02x) data(0x%02x)\n",
  597. MFD_DEV_NAME, __func__, VALID_REG, val);
  598. ret = s2mpb02_write_reg(s2mpb02->iodev->i2c, VALID_REG, (val & 0x03));
  599. if (ret < 0) {
  600. pr_info("%s: fail to write i2c address\n", __func__);
  601. return -ENXIO;
  602. }
  603. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, VALID_REG, &val);
  604. if (ret < 0) {
  605. pr_info("%s: fail to read i2c address\n", __func__);
  606. return -ENXIO;
  607. }
  608. pr_info("%s: %s: updated state: reg(0x%02x) data(0x%02x)\n",
  609. MFD_DEV_NAME, __func__, VALID_REG, val);
  610. if ((val & VALID_MASK) == 0x0)
  611. result = true;
  612. if (!result) {
  613. pr_info("%s: %s: ERROR: state is not updated!: reg(0x%02x) data(0x%02x)\n",
  614. MFD_DEV_NAME, __func__, VALID_REG, val);
  615. return -ENODEV;
  616. }
  617. /* 3. Restore old_val to 0x32's bit[7~2] */
  618. ret = s2mpb02_write_reg(s2mpb02->iodev->i2c, VALID_REG, old_val);
  619. if (ret < 0) {
  620. pr_info("%s: fail to write i2c address\n", __func__);
  621. return -ENXIO;
  622. }
  623. ret = s2mpb02_read_reg(s2mpb02->iodev->i2c, VALID_REG, &val);
  624. if (ret < 0) {
  625. pr_info("%s: fail to read i2c address\n", __func__);
  626. return -ENXIO;
  627. }
  628. if (old_val != val) {
  629. pr_info("%s: ERROR: old_val(0x%02x), val(0x%02x) are different!\n", __func__, old_val, val);
  630. return -EIO;
  631. }
  632. pr_info("%s: %s: restored value: reg(0x%02x) data(0x%02x)\n",
  633. MFD_DEV_NAME, __func__, VALID_REG, val);
  634. pr_err("%s: %s: i2c operation is %s\n", MFD_DEV_NAME, __func__,
  635. result ? "ok" : "not ok");
  636. return 0;
  637. }
  638. #endif
  639. static int s2mpb02_pmic_probe(struct platform_device *pdev)
  640. {
  641. struct s2mpb02_dev *iodev = dev_get_drvdata(pdev->dev.parent);
  642. struct s2mpb02_platform_data *pdata = iodev->pdata;
  643. struct regulator_config config = { };
  644. struct s2mpb02_data *s2mpb02;
  645. struct i2c_client *i2c;
  646. u32 i;
  647. int ret;
  648. dev_info(&pdev->dev, "%s start\n", __func__);
  649. if (!pdata) {
  650. pr_info("[%s:%d] !pdata\n", __FILE__, __LINE__);
  651. dev_err(pdev->dev.parent, "No platform init data supplied.\n");
  652. return -ENODEV;
  653. }
  654. if (iodev->dev->of_node) {
  655. ret = s2mpb02_pmic_dt_parse_pdata(iodev, pdata);
  656. if (ret)
  657. goto err_pdata;
  658. }
  659. s2mpb02 = devm_kzalloc(&pdev->dev, sizeof(struct s2mpb02_data),
  660. GFP_KERNEL);
  661. if (!s2mpb02) {
  662. pr_info("[%s:%d] if (!s2mpb02)\n", __FILE__, __LINE__);
  663. return -ENOMEM;
  664. }
  665. s2mpb02->iodev = iodev;
  666. s2mpb02->num_regulators = pdata->num_rdata;
  667. s2mpb02->need_recovery = pdata->need_recovery;
  668. platform_set_drvdata(pdev, s2mpb02);
  669. i2c = s2mpb02->iodev->i2c;
  670. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  671. ret = s2mpb02_verify_i2c_bus(s2mpb02);
  672. if (ret < 0) {
  673. pr_err("%s: check_s2mpb02_validation fail\n", __func__);
  674. return -ENODEV;
  675. }
  676. #endif
  677. for (i = 0; i < pdata->num_rdata; i++) {
  678. int id = pdata->regulators[i].id;
  679. config.dev = &pdev->dev;
  680. config.init_data = pdata->regulators[i].initdata;
  681. config.driver_data = s2mpb02;
  682. config.of_node = pdata->regulators[i].reg_node;
  683. s2mpb02->rdev[i] = devm_regulator_register(&pdev->dev,
  684. &regulators[id], &config);
  685. if (IS_ERR(s2mpb02->rdev[i])) {
  686. ret = PTR_ERR(s2mpb02->rdev[i]);
  687. dev_err(&pdev->dev, "regulator init failed for %d\n", i);
  688. s2mpb02->rdev[i] = NULL;
  689. goto err_s2mpb02_data;
  690. }
  691. #if IS_ENABLED(CONFIG_REGULATOR_DEBUG_CONTROL)
  692. ret = devm_regulator_debug_register(&pdev->dev, s2mpb02->rdev[i]);
  693. if (ret)
  694. dev_err(&pdev->dev, "failed to register debug regulator for %d, rc=%d\n",
  695. i, ret);
  696. #endif
  697. }
  698. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  699. ret = s2mpb02_create_sysfs(s2mpb02);
  700. if (ret < 0) {
  701. pr_err("%s: s2mpb02_create_sysfs fail\n", __func__);
  702. return -ENODEV;
  703. }
  704. #endif
  705. dev_info(&pdev->dev, "%s end\n", __func__);
  706. return 0;
  707. err_s2mpb02_data:
  708. err_pdata:
  709. return ret;
  710. }
  711. static int s2mpb02_pmic_remove(struct platform_device *pdev)
  712. {
  713. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  714. struct s2mpb02_data *s2mpb02 = platform_get_drvdata(pdev);
  715. struct device *s2mpb02_pmic = s2mpb02->dev;
  716. int i = 0;
  717. dev_info(&pdev->dev, "%s\n", __func__);
  718. /* Remove sysfs entries */
  719. for (i = 0; i < ATTR_REGULATOR; i++)
  720. device_remove_file(s2mpb02_pmic, &regulator_attr[i].dev_attr);
  721. pmic_device_destroy(s2mpb02_pmic->devt);
  722. #else
  723. dev_info(&pdev->dev, "%s\n", __func__);
  724. #endif
  725. return 0;
  726. }
  727. static const struct platform_device_id s2mpb02_pmic_id[] = {
  728. {"s2mpb02-regulator", TYPE_S2MPB02_REG_MAIN},
  729. {"s2mpb02-sub-reg", TYPE_S2MPB02_REG_SUB},
  730. {},
  731. };
  732. MODULE_DEVICE_TABLE(platform, s2mpb02_pmic_id);
  733. static struct platform_driver s2mpb02_pmic_driver = {
  734. .driver = {
  735. .name = "s2mpb02-regulator",
  736. .owner = THIS_MODULE,
  737. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  738. .pm = &s2mpb02_regulator_pm,
  739. #endif
  740. .suppress_bind_attrs = true,
  741. },
  742. .probe = s2mpb02_pmic_probe,
  743. .remove = s2mpb02_pmic_remove,
  744. .id_table = s2mpb02_pmic_id,
  745. };
  746. static int __init s2mpb02_pmic_init(void)
  747. {
  748. return platform_driver_register(&s2mpb02_pmic_driver);
  749. }
  750. subsys_initcall(s2mpb02_pmic_init);
  751. static void __exit s2mpb02_pmic_cleanup(void)
  752. {
  753. platform_driver_unregister(&s2mpb02_pmic_driver);
  754. }
  755. module_exit(s2mpb02_pmic_cleanup);
  756. MODULE_DESCRIPTION("SAMSUNG s2mpb02 Regulator Driver");
  757. MODULE_LICENSE("GPL");