da9212-regulator.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. /*
  2. * Copyright (c) 2014 MediaTek Inc.
  3. * Author: HenryC.Chen <henryc.chen@mediatek.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. */
  14. #include <linux/err.h>
  15. #include <linux/gpio.h>
  16. #include <linux/i2c.h>
  17. #include <linux/module.h>
  18. #include <linux/init.h>
  19. #include <linux/slab.h>
  20. #include <linux/regulator/driver.h>
  21. #include <linux/regulator/machine.h>
  22. #include <linux/regulator/of_regulator.h>
  23. #include <linux/regmap.h>
  24. #include <linux/irq.h>
  25. #include <linux/interrupt.h>
  26. #include <linux/of.h>
  27. #include <linux/of_device.h>
  28. #include <linux/of_gpio.h>
  29. #include <linux/regulator/da9212-regulator.h>
  30. #define DA9212_BUCK_MODE_SLEEP 1
  31. #define DA9212_BUCK_MODE_SYNC 2
  32. #define DA9212_BUCK_MODE_AUTO 3
  33. /* DA9212 REGULATOR IDs */
  34. #define DA9212_ID_BUCKA 0
  35. #define DA9212_ID_BUCKB 1
  36. #define DA9212_MAX_REGULATORS 2
  37. #define DA9212_TEST_NODE
  38. enum da9212_ramp_rate {
  39. RAMP_RATE_2P5MV,
  40. RAMP_RATE_5MV,
  41. RAMP_RATE_10MV,
  42. RAMP_RATE_20MV,
  43. };
  44. struct da9212_pdata {
  45. struct device *dev;
  46. int num_buck;
  47. struct regulator_init_data *init_data[DA9212_MAX_REGULATORS];
  48. int gpio_en[DA9212_MAX_REGULATORS];
  49. int gpio_vbuck[DA9212_MAX_REGULATORS];
  50. struct device_node *reg_node[DA9212_MAX_REGULATORS];
  51. };
  52. struct da9212 {
  53. struct device *dev;
  54. struct regmap *regmap;
  55. struct da9212_pdata *pdata;
  56. struct regulator_dev *rdev[DA9212_MAX_REGULATORS];
  57. int num_regulator;
  58. };
  59. static const struct regmap_config da9212_regmap_config = {
  60. .reg_bits = 8,
  61. .val_bits = 8,
  62. };
  63. /* Default limits measured in millivolts and milliamps */
  64. #define DA9212_MIN_MV 300
  65. #define DA9212_MAX_MV 1570
  66. #define DA9212_STEP_MV 10
  67. #define DA9212_RAMP_DELAY 10
  68. #define DA9212_TURN_ON_DELAY 70
  69. /* Current limits for buck (uA) indices corresponds with register values */
  70. static const int da9212_current_limits[] = {
  71. 2000000, 2200000, 2400000, 2600000, 2800000, 3000000, 3200000, 3400000,
  72. 3600000, 3800000, 4000000, 4200000, 4400000, 4600000, 4800000, 5000000
  73. };
  74. static unsigned int da9212_buck_get_mode(struct regulator_dev *rdev)
  75. {
  76. int id = rdev_get_id(rdev);
  77. struct da9212 *chip = rdev_get_drvdata(rdev);
  78. unsigned int data;
  79. int ret, mode;
  80. ret = regmap_read(chip->regmap, DA9212_REG_BUCKA_CONF + id, &data);
  81. if (ret < 0)
  82. return ret;
  83. mode = 0;
  84. switch (data & DA9212_BUCKA_MODE_MASK) {
  85. case DA9212_BUCK_MODE_SYNC:
  86. mode = REGULATOR_MODE_FAST;
  87. break;
  88. case DA9212_BUCK_MODE_AUTO:
  89. mode = REGULATOR_MODE_NORMAL;
  90. break;
  91. case DA9212_BUCK_MODE_SLEEP:
  92. mode = REGULATOR_MODE_STANDBY;
  93. break;
  94. }
  95. return mode;
  96. }
  97. static int da9212_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
  98. {
  99. int id = rdev_get_id(rdev);
  100. struct da9212 *chip = rdev_get_drvdata(rdev);
  101. int val;
  102. val = 0;
  103. switch (mode) {
  104. case REGULATOR_MODE_FAST:
  105. val = DA9212_BUCK_MODE_SYNC;
  106. break;
  107. case REGULATOR_MODE_NORMAL:
  108. val = DA9212_BUCK_MODE_AUTO;
  109. break;
  110. case REGULATOR_MODE_STANDBY:
  111. val = DA9212_BUCK_MODE_SLEEP;
  112. break;
  113. }
  114. return regmap_update_bits(chip->regmap, DA9212_REG_BUCKA_CONF + id, 0x03, val);
  115. }
  116. static int da9212_get_current_limit(struct regulator_dev *rdev)
  117. {
  118. int id = rdev_get_id(rdev);
  119. struct da9212 *chip = rdev_get_drvdata(rdev);
  120. unsigned int data;
  121. int ret;
  122. ret = regmap_read(chip->regmap, DA9212_REG_BUCK_ILIM, &data);
  123. if (ret < 0)
  124. return ret;
  125. /* select one of 16 values: 0000 (2000mA) to 1111 (5000mA) */
  126. data = (data >> id * 4) & 0x0F;
  127. return da9212_current_limits[data];
  128. }
  129. static int da9212_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
  130. {
  131. int id = rdev_get_id(rdev);
  132. unsigned int ramp_value = DA9212_RAMP_DELAY;
  133. unsigned int mask;
  134. switch (ramp_delay) {
  135. case 1 ... 2500:
  136. ramp_value = RAMP_RATE_2P5MV;
  137. break;
  138. case 2501 ... 5000:
  139. ramp_value = RAMP_RATE_5MV;
  140. break;
  141. case 5001 ... 10000:
  142. ramp_value = RAMP_RATE_10MV;
  143. break;
  144. case 10001 ... 20000:
  145. ramp_value = RAMP_RATE_20MV;
  146. break;
  147. default:
  148. return -EINVAL;
  149. }
  150. mask = id ? DA9212_SLEW_RATE_B_MASK : DA9212_SLEW_RATE_A_MASK;
  151. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, mask, ramp_value << 6);
  152. }
  153. static struct regulator_ops da9212_buck_ops = {
  154. .get_mode = da9212_buck_get_mode,
  155. .set_mode = da9212_buck_set_mode,
  156. .enable = regulator_enable_regmap,
  157. .disable = regulator_disable_regmap,
  158. .is_enabled = regulator_is_enabled_regmap,
  159. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  160. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  161. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  162. .set_ramp_delay = da9212_set_ramp_delay,
  163. .list_voltage = regulator_list_voltage_linear,
  164. .get_current_limit = da9212_get_current_limit,
  165. };
  166. #define DA9212_BUCK(_id) \
  167. {\
  168. .name = #_id,\
  169. .ops = &da9212_buck_ops,\
  170. .type = REGULATOR_VOLTAGE,\
  171. .id = DA9212_ID_##_id,\
  172. .n_voltages = (DA9212_MAX_MV - DA9212_MIN_MV) / DA9212_STEP_MV + 1,\
  173. .min_uV = (DA9212_MIN_MV * 1000),\
  174. .uV_step = (DA9212_STEP_MV * 1000),\
  175. .ramp_delay = (DA9212_RAMP_DELAY * 1000), \
  176. .enable_time = DA9212_TURN_ON_DELAY, \
  177. .enable_reg = DA9212_REG_BUCKA_CONT + DA9212_ID_##_id,\
  178. .enable_mask = 1,\
  179. .vsel_reg = DA9212_REG_VBUCKA_A + DA9212_ID_##_id * 2,\
  180. .vsel_mask = DA9212_VBUCK_MASK,\
  181. .owner = THIS_MODULE,\
  182. }
  183. static struct regulator_desc da9212_regulators[] = {
  184. DA9212_BUCK(BUCKA),
  185. DA9212_BUCK(BUCKB),
  186. };
  187. static int da9212_regulator_init(struct da9212 *chip)
  188. {
  189. struct regulator_config config = { };
  190. int i, ret;
  191. unsigned int data;
  192. ret = regmap_update_bits(chip->regmap, DA9212_REG_PAGE_CON,
  193. DA9212_REG_PAGE_MASK, DA9212_REG_PAGE2);
  194. if (ret < 0) {
  195. dev_err(chip->dev, "Failed to update PAGE reg: %d\n", ret);
  196. goto err;
  197. }
  198. ret = regmap_read(chip->regmap, DA9212_REG_INTERFACE, &data);
  199. if (ret < 0 || ((data >> 4) != 0xD)) {
  200. ret = regmap_update_bits(chip->regmap, DA9212_REG_PAGE_CON,
  201. DA9212_REG_PAGE_MASK, DA9212_REG_PAGE0);
  202. dev_err(chip->dev, "Failed to read CONTROL_E reg: %d\n", data);
  203. goto err;
  204. }
  205. chip->num_regulator = chip->pdata->num_buck;
  206. ret = regmap_update_bits(chip->regmap, DA9212_REG_PAGE_CON,
  207. DA9212_REG_PAGE_MASK, DA9212_REG_PAGE0);
  208. if (ret < 0) {
  209. dev_err(chip->dev, "Failed to update PAGE reg: %d\n", ret);
  210. goto err;
  211. }
  212. for (i = 0; i < chip->num_regulator; i++) {
  213. if (chip->pdata)
  214. config.init_data = chip->pdata->init_data[i];
  215. config.ena_gpio = 0; /* initialize */
  216. if (chip->pdata->gpio_en[i]) {
  217. config.ena_gpio = chip->pdata->gpio_en[i];
  218. config.ena_gpio_flags |= GPIOF_OUT_INIT_HIGH;
  219. }
  220. dev_err(chip->dev, "config.ena_gpio: %d\n", config.ena_gpio);
  221. config.dev = chip->dev;
  222. config.driver_data = chip;
  223. config.of_node = chip->pdata->reg_node[i];
  224. config.regmap = chip->regmap;
  225. chip->rdev[i] = regulator_register(&da9212_regulators[i], &config);
  226. if (IS_ERR(chip->rdev[i])) {
  227. dev_err(chip->dev, "Failed to register DA9212 regulator\n");
  228. ret = PTR_ERR(chip->rdev[i]);
  229. goto err_regulator;
  230. }
  231. }
  232. return 0;
  233. err_regulator:
  234. while (--i >= 0)
  235. regulator_unregister(chip->rdev[i]);
  236. err:
  237. return ret;
  238. }
  239. /*
  240. * I2C driver interface functions
  241. */
  242. static const struct i2c_device_id da9212_i2c_id[] = {
  243. {"da9212-regulator", 0},
  244. {},
  245. };
  246. #if defined(CONFIG_OF)
  247. static const struct of_device_id da9212_of_match[] = {
  248. {.compatible = "dlg,da9212-regulator", .data = &da9212_i2c_id[0]},
  249. {},
  250. };
  251. MODULE_DEVICE_TABLE(of, da9212_of_match);
  252. static struct of_regulator_match da9212_matches[] = {
  253. [DA9212_ID_BUCKA] = {.name = "BUCKA"},
  254. [DA9212_ID_BUCKB] = {.name = "BUCKB"},
  255. };
  256. static struct da9212_pdata *of_get_da9212_platform_data(struct device *dev);
  257. static struct da9212_pdata *of_get_da9212_platform_data(struct device *dev)
  258. {
  259. struct da9212_pdata *pdata;
  260. struct device_node *node;
  261. enum of_gpio_flags flags;
  262. int num, i, ret;
  263. int cnt;
  264. const struct of_device_id *match;
  265. match = of_match_device(of_match_ptr(da9212_of_match), dev);
  266. if (!match) {
  267. dev_err(dev, "Error: No device match found\n");
  268. return NULL;
  269. }
  270. node = of_get_child_by_name(dev->of_node, "regulators");
  271. if (!node) {
  272. dev_err(dev, "regulators node not found\n");
  273. return NULL;
  274. }
  275. num = of_regulator_match(dev, node, da9212_matches, ARRAY_SIZE(da9212_matches));
  276. of_node_put(node);
  277. if (num < 0) {
  278. dev_err(dev, "Failed to match regulators\n");
  279. return NULL;
  280. }
  281. pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
  282. if (!pdata)
  283. return ERR_PTR(-ENOMEM);
  284. pdata->num_buck = num;
  285. cnt = 0;
  286. for (i = 0; i < ARRAY_SIZE(da9212_matches); i++) {
  287. if (!da9212_matches[i].init_data)
  288. continue;
  289. pdata->init_data[cnt] = da9212_matches[i].init_data;
  290. pdata->reg_node[cnt] = da9212_matches[cnt].of_node;
  291. ret = of_get_named_gpio_flags(da9212_matches[cnt].of_node,
  292. "vbuck-gpio", 0, &flags);
  293. if (ret >= 0)
  294. pdata->gpio_vbuck[cnt] = ret;
  295. ret = of_get_named_gpio_flags(da9212_matches[cnt].of_node,
  296. "en-gpio", 0, &flags);
  297. if (ret >= 0)
  298. pdata->gpio_en[cnt] = ret;
  299. cnt++;
  300. }
  301. dev_info(dev, "pdata->gpio_en : %d, pdata->gpio_vbuck : %d,\n",
  302. pdata->gpio_en[0], pdata->gpio_vbuck[1]);
  303. return pdata;
  304. }
  305. #else
  306. static struct da9212 *of_get_da9212_platform_data(struct device *dev)
  307. {
  308. return NULL;
  309. }
  310. #endif
  311. #ifdef DA9212_TEST_NODE
  312. unsigned int reg_value_da9212 = 0;
  313. static ssize_t show_da9212_access(struct device *dev, struct device_attribute *attr, char *buf)
  314. {
  315. return sprintf(buf, "%x\n", reg_value_da9212);
  316. }
  317. static ssize_t store_da9212_access(struct device *dev,
  318. struct device_attribute *attr, const char *buf, size_t size)
  319. {
  320. int ret = 0;
  321. char *pvalue = NULL;
  322. unsigned long reg_value = 0;
  323. unsigned long reg_address = 0;
  324. struct da9212 *chip = dev_get_drvdata(dev);
  325. strcpy(pvalue, buf);
  326. if (buf != NULL && size != 0) {
  327. if (size > 4) {
  328. ret = kstrtoul(strsep(&pvalue, " "), 16, &reg_address);
  329. if (ret)
  330. return ret;
  331. ret = kstrtoul(pvalue, 16, &reg_value);
  332. if (ret)
  333. return ret;
  334. ret = regmap_update_bits(chip->regmap, reg_address, 0xff, reg_value);
  335. if (ret < 0)
  336. dev_err(chip->dev, "Failed to update PAGE reg: %d\n", ret);
  337. /* restore to page 0,1 */
  338. ret = regmap_update_bits(chip->regmap, DA9212_REG_PAGE_CON,
  339. DA9212_REG_PAGE_MASK, DA9212_REG_PAGE0);
  340. if (ret < 0)
  341. dev_err(chip->dev, "Failed to update PAGE reg: %d\n", ret);
  342. } else {
  343. ret = kstrtoul(pvalue, 16, &reg_value);
  344. if (ret)
  345. return ret;
  346. ret = regmap_read(chip->regmap, reg_address, &reg_value_da9212);
  347. if (ret < 0)
  348. dev_err(chip->dev, "Failed to read reg: %d\n", ret);
  349. /* restore to page 0,1 */
  350. ret = regmap_update_bits(chip->regmap, DA9212_REG_PAGE_CON,
  351. DA9212_REG_PAGE_MASK, DA9212_REG_PAGE0);
  352. if (ret < 0)
  353. dev_err(chip->dev, "Failed to update PAGE reg: %d\n", ret);
  354. }
  355. }
  356. return size;
  357. }
  358. static ssize_t show_da9212_buck_voltage_cpu(struct device *dev,
  359. struct device_attribute *attr, char *buf)
  360. {
  361. int ret;
  362. struct regulator *reg = devm_regulator_get(dev, "VBUCKA");
  363. if (IS_ERR(reg)) {
  364. ret = PTR_ERR(reg);
  365. dev_err(dev, "Failed to request VBUCKA: %d\n", ret);
  366. return 0;
  367. }
  368. ret = sprintf(buf, "%d\n", regulator_get_voltage(reg));
  369. devm_regulator_put(reg);
  370. return ret;
  371. }
  372. static ssize_t store_da9212_buck_voltage_cpu(struct device *dev,
  373. struct device_attribute *attr, const char *buf,
  374. size_t size)
  375. {
  376. int ret;
  377. unsigned int reg_value = 0;
  378. struct regulator *reg = devm_regulator_get(dev, "VBUCKA");
  379. ret = 0;
  380. if (IS_ERR(reg)) {
  381. ret = PTR_ERR(reg);
  382. dev_err(dev, "Failed to request VBUCKA: %d\n", ret);
  383. return ret;
  384. }
  385. if (buf != NULL && size != 0) {
  386. ret = kstrtou32(buf, 0, &reg_value);
  387. if (ret)
  388. goto error_input;
  389. /* set voltage */
  390. ret = regulator_set_voltage(reg, reg_value, reg_value);
  391. if (ret != 0)
  392. dev_err(dev, "Failed to set reg voltage: %d\n", reg_value);
  393. }
  394. error_input:
  395. devm_regulator_put(reg);
  396. return size;
  397. }
  398. static ssize_t show_da9212_buck_voltage_gpu(struct device *dev,
  399. struct device_attribute *attr, char *buf)
  400. {
  401. int ret;
  402. struct regulator *reg = devm_regulator_get(dev, "VBUCKB");
  403. if (IS_ERR(reg)) {
  404. ret = PTR_ERR(reg);
  405. dev_err(dev, "Failed to request VBUCKB: %d\n", ret);
  406. return 0;
  407. }
  408. ret = sprintf(buf, "%d\n", regulator_get_voltage(reg));
  409. devm_regulator_put(reg);
  410. return ret;
  411. }
  412. static ssize_t store_da9212_buck_voltage_gpu(struct device *dev,
  413. struct device_attribute *attr, const char *buf,
  414. size_t size)
  415. {
  416. int ret;
  417. unsigned int reg_value = 0;
  418. struct regulator *reg = devm_regulator_get(dev, "VBUCKB");
  419. ret = 0;
  420. if (IS_ERR(reg)) {
  421. ret = PTR_ERR(reg);
  422. dev_err(dev, "Failed to request VBUCKB: %d\n", ret);
  423. return ret;
  424. }
  425. if (buf != NULL && size != 0) {
  426. ret = kstrtou32(buf, 0, &reg_value);
  427. if (ret)
  428. goto error_input;
  429. /* set voltage */
  430. ret = regulator_set_voltage(reg, reg_value, reg_value);
  431. if (ret != 0)
  432. dev_err(dev, "Failed to set reg voltage: %d\n", reg_value);
  433. }
  434. error_input:
  435. devm_regulator_put(reg);
  436. return size;
  437. }
  438. static DEVICE_ATTR(voltage_cpu, 0664, show_da9212_buck_voltage_cpu, store_da9212_buck_voltage_cpu);
  439. static DEVICE_ATTR(voltage_gpu, 0664, show_da9212_buck_voltage_gpu, store_da9212_buck_voltage_gpu);
  440. static DEVICE_ATTR(access, 0664, show_da9212_access, store_da9212_access);
  441. #endif
  442. static int da9212_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
  443. {
  444. struct da9212 *chip;
  445. int error, ret;
  446. chip = devm_kzalloc(&i2c->dev, sizeof(struct da9212), GFP_KERNEL);
  447. chip->dev = &i2c->dev;
  448. chip->regmap = devm_regmap_init_i2c(i2c, &da9212_regmap_config);
  449. if (IS_ERR(chip->regmap)) {
  450. error = PTR_ERR(chip->regmap);
  451. dev_err(&i2c->dev, "Failed to allocate register map: %d\n", error);
  452. return error;
  453. }
  454. i2c_set_clientdata(i2c, chip);
  455. chip->pdata = i2c->dev.platform_data;
  456. if (!chip->pdata && (i2c->dev.of_node))
  457. chip->pdata = of_get_da9212_platform_data(chip->dev);
  458. if (!chip->pdata) {
  459. dev_err(&i2c->dev, "No platform init data supplied\n");
  460. return -ENODEV;
  461. }
  462. ret = da9212_regulator_init(chip);
  463. if (ret < 0) {
  464. dev_err(&i2c->dev, "Failed to initialize regulator: %d\n", ret);
  465. return ret;
  466. }
  467. dev_err(&i2c->dev, "da9212_i2c_probe: done...\n");
  468. #ifdef DA9212_TEST_NODE
  469. /* Debug sysfs */
  470. device_create_file(&(i2c->dev), &dev_attr_voltage_cpu);
  471. device_create_file(&(i2c->dev), &dev_attr_voltage_gpu);
  472. device_create_file(&(i2c->dev), &dev_attr_access);
  473. #endif
  474. return ret;
  475. }
  476. static int da9212_i2c_remove(struct i2c_client *i2c)
  477. {
  478. struct da9212 *chip = i2c_get_clientdata(i2c);
  479. int i;
  480. for (i = 0; i < chip->num_regulator; i++)
  481. regulator_unregister(chip->rdev[i]);
  482. return 0;
  483. }
  484. MODULE_DEVICE_TABLE(i2c, da9212_i2c_id);
  485. static struct i2c_driver da9212_regulator_driver = {
  486. .driver = {
  487. .name = "da9212-regulator",
  488. .owner = THIS_MODULE,
  489. #if defined(CONFIG_OF)
  490. .of_match_table = of_match_ptr(da9212_of_match),
  491. #endif
  492. },
  493. .probe = da9212_i2c_probe,
  494. .remove = da9212_i2c_remove,
  495. .id_table = da9212_i2c_id,
  496. };
  497. static int __init da9212_init(void)
  498. {
  499. if (i2c_add_driver(&da9212_regulator_driver) != 0)
  500. pr_err("failed to register da9212 i2c driver.\n");
  501. else
  502. pr_err("Success to register da9212-regulator.\n");
  503. return 0;
  504. }
  505. subsys_initcall(da9212_init);
  506. static void __exit da9212_cleanup(void)
  507. {
  508. i2c_del_driver(&da9212_regulator_driver);
  509. }
  510. module_exit(da9212_cleanup);
  511. MODULE_DESCRIPTION("Regulator device driver for Dialog DA9212");
  512. MODULE_LICENSE("GPL v2");