s2dos05_powermeter.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. /*
  2. * s2dos05_powermeter.c
  3. *
  4. * Copyright (c) 2015 Samsung Electronics Co., Ltd
  5. * http://www.samsung.com
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the
  9. * Free Software Foundation; either version 2 of the License, or (at your
  10. * option) any later version.
  11. *
  12. */
  13. #include <linux/err.h>
  14. #include <linux/slab.h>
  15. #include <linux/regulator/s2dos05.h>
  16. #include <linux/platform_device.h>
  17. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  18. #include <linux/regulator/pmic_class.h>
  19. #endif
  20. #define CURRENT_METER 1
  21. #define POWER_METER 2
  22. #define RAWCURRENT_METER 3
  23. #define SYNC_MODE 1
  24. #define ASYNC_MODE 2
  25. #define MICRO 100
  26. struct adc_info {
  27. struct i2c_client *i2c;
  28. u8 adc_mode;
  29. u8 adc_sync_mode;
  30. unsigned long *adc_val;
  31. u8 adc_ctrl1;
  32. #if IS_ENABLED(CONFIG_SEC_PM)
  33. bool is_sm3080;
  34. #endif /* CONFIG_SEC_PM */
  35. };
  36. enum s2dos05_adc_ch {
  37. ADC_CH0 = 0,
  38. ADC_CH1,
  39. ADC_CH2,
  40. ADC_CH3,
  41. ADC_CH4,
  42. ADC_CH5,
  43. ADC_CH6,
  44. ADC_CH7,
  45. ADC_CH8,
  46. };
  47. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  48. static const unsigned long current_coeffs[S2DOS05_MAX_ADC_CHANNEL] =
  49. {CURRENT_ELVDD, CURRENT_ELVSS, CURRENT_AVDD,
  50. CURRENT_BUCK, CURRENT_L1, CURRENT_L2, CURRENT_L3, CURRENT_L4};
  51. static const unsigned long power_coeffs[S2DOS05_MAX_ADC_CHANNEL] =
  52. {POWER_ELVDD, POWER_ELVSS, POWER_AVDD,
  53. POWER_BUCK, POWER_L1, POWER_L2, POWER_L3, POWER_L4};
  54. static void s2m_adc_read_current_data(struct adc_info *adc_meter, int channel)
  55. {
  56. u8 data_l = 0;
  57. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  58. channel, ADC_PTR_MASK);
  59. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_DATA, &data_l);
  60. adc_meter->adc_val[channel] = data_l;
  61. }
  62. static void s2m_adc_read_power_data(struct adc_info *adc_meter, int channel)
  63. {
  64. u8 data_l = 0, data_h = 0;
  65. /* even channel */
  66. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  67. 2*channel, ADC_PTR_MASK);
  68. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_DATA, &data_l);
  69. /* odd channel */
  70. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  71. 2 * channel + 1, ADC_PTR_MASK);
  72. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_DATA, &data_h);
  73. adc_meter->adc_val[channel] = ((data_h & 0xff) << 8) | (data_l & 0xff);
  74. }
  75. static void s2m_adc_read_data(struct device *dev, int channel)
  76. {
  77. struct adc_info *adc_meter = dev_get_drvdata(dev);
  78. size_t i;
  79. u8 temp;
  80. /* ASYNCRD bit '1' --> 2ms delay --> read in case of ADC Async mode */
  81. if (adc_meter->adc_sync_mode == ASYNC_MODE) {
  82. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL1, &temp);
  83. if (!(temp & 0x40)) {
  84. switch (adc_meter->adc_mode) {
  85. case CURRENT_METER:
  86. case POWER_METER:
  87. if (channel < 0) {
  88. for (i = 0; i < S2DOS05_MAX_ADC_CHANNEL; i++)
  89. adc_meter->adc_val[i] = 0;
  90. } else
  91. adc_meter->adc_val[channel] = 0;
  92. break;
  93. default:
  94. dev_err(dev, "%s: invalid adc mode(%d)\n",
  95. __func__, adc_meter->adc_mode);
  96. return;
  97. }
  98. }
  99. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL1,
  100. ADC_ASYNCRD_MASK, ADC_ASYNCRD_MASK);
  101. usleep_range(2000, 2100);
  102. }
  103. switch (adc_meter->adc_mode) {
  104. case CURRENT_METER:
  105. if (channel < 0) {
  106. for (i = 0; i < S2DOS05_MAX_ADC_CHANNEL; i++)
  107. s2m_adc_read_current_data(adc_meter, i);
  108. } else
  109. s2m_adc_read_current_data(adc_meter, channel);
  110. break;
  111. case POWER_METER:
  112. if (channel < 0) {
  113. for (i = 0; i < S2DOS05_MAX_ADC_CHANNEL; i++)
  114. s2m_adc_read_power_data(adc_meter, i);
  115. } else
  116. s2m_adc_read_power_data(adc_meter, channel);
  117. break;
  118. default:
  119. dev_err(dev, "%s: invalid adc mode(%d)\n",
  120. __func__, adc_meter->adc_mode);
  121. }
  122. #if IS_ENABLED(CONFIG_SEC_PM)
  123. if (adc_meter->is_sm3080) {
  124. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  125. 0, ADC_EN_MASK);
  126. usleep_range(150, 200);
  127. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  128. ADC_EN_MASK, ADC_EN_MASK);
  129. dev_info(dev, "%s: power meter on/off\n", __func__);
  130. }
  131. #endif /* CONFIG_SEC_PM */
  132. }
  133. static unsigned long get_coeff(struct device *dev, u8 adc_reg_num)
  134. {
  135. struct adc_info *adc_meter = dev_get_drvdata(dev);
  136. unsigned long coeff;
  137. if (adc_meter->adc_mode == CURRENT_METER) {
  138. if (adc_reg_num < S2DOS05_MAX_ADC_CHANNEL)
  139. coeff = current_coeffs[adc_reg_num];
  140. else {
  141. dev_err(dev, "%s: invalid adc regulator number(%d)\n",
  142. __func__, adc_reg_num);
  143. coeff = 0;
  144. }
  145. } else if (adc_meter->adc_mode == POWER_METER) {
  146. if (adc_reg_num < S2DOS05_MAX_ADC_CHANNEL)
  147. coeff = power_coeffs[adc_reg_num];
  148. else {
  149. dev_err(dev, "%s: invalid adc regulator number(%d)\n",
  150. __func__, adc_reg_num);
  151. coeff = 0;
  152. }
  153. } else {
  154. dev_err(dev, "%s: invalid adc mode(%d)\n",
  155. __func__, adc_meter->adc_mode);
  156. coeff = 0;
  157. }
  158. return coeff;
  159. }
  160. static ssize_t adc_val_all_show(struct device *dev,
  161. struct device_attribute *attr, char *buf)
  162. {
  163. struct adc_info *adc_meter = dev_get_drvdata(dev);
  164. size_t i = 0;
  165. int cnt = 0, chan = 0;
  166. s2m_adc_read_data(dev, -1);
  167. for (i = 0; i < S2DOS05_MAX_ADC_CHANNEL; i++) {
  168. chan = ADC_CH0 + i;
  169. if (adc_meter->adc_mode == POWER_METER)
  170. cnt += snprintf(buf + cnt, PAGE_SIZE, "CH%d:%7lu uW (%7lu) ",
  171. chan, (adc_meter->adc_val[chan] * get_coeff(dev, chan)) / MICRO,
  172. adc_meter->adc_val[chan]);
  173. else
  174. cnt += snprintf(buf + cnt, PAGE_SIZE, "CH%d:%7lu uA (%7lu) ",
  175. chan, (adc_meter->adc_val[chan] * get_coeff(dev, chan)),
  176. adc_meter->adc_val[chan]);
  177. if (i == S2DOS05_MAX_ADC_CHANNEL / 2 - 1)
  178. cnt += snprintf(buf + cnt, PAGE_SIZE, "\n");
  179. }
  180. cnt += snprintf(buf + cnt, PAGE_SIZE, "\n");
  181. return cnt;
  182. }
  183. static ssize_t adc_en_show(struct device *dev,
  184. struct device_attribute *attr, char *buf)
  185. {
  186. struct adc_info *adc_meter = dev_get_drvdata(dev);
  187. u8 adc_ctrl3;
  188. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2, &adc_ctrl3);
  189. if ((adc_ctrl3 & ADC_EN_MASK) == ADC_EN_MASK)
  190. return snprintf(buf, PAGE_SIZE, "ADC enable (0x%02hhx)\n", adc_ctrl3);
  191. else
  192. return snprintf(buf, PAGE_SIZE, "ADC disable (0x%02hhx)\n", adc_ctrl3);
  193. }
  194. static ssize_t adc_en_store(struct device *dev, struct device_attribute *attr,
  195. const char *buf, size_t count)
  196. {
  197. struct adc_info *adc_meter = dev_get_drvdata(dev);
  198. int ret;
  199. u8 temp, val;
  200. ret = kstrtou8(buf, 16, &temp);
  201. if (ret)
  202. return -EINVAL;
  203. switch (temp) {
  204. case 0:
  205. val = 0x00;
  206. break;
  207. case 1:
  208. val = ADC_EN_MASK;
  209. break;
  210. default:
  211. val = 0x00;
  212. break;
  213. }
  214. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  215. val, ADC_EN_MASK);
  216. return count;
  217. }
  218. static ssize_t adc_mode_show(struct device *dev,
  219. struct device_attribute *attr, char *buf)
  220. {
  221. struct adc_info *adc_meter = dev_get_drvdata(dev);
  222. u8 adc_ctrl3;
  223. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2, &adc_ctrl3);
  224. adc_ctrl3 = adc_ctrl3 & ADC_PGEN_MASK;
  225. switch (adc_ctrl3) {
  226. case CURRENT_MODE:
  227. return snprintf(buf, PAGE_SIZE, "CURRENT MODE (%d)\n", CURRENT_METER);
  228. case POWER_MODE:
  229. return snprintf(buf, PAGE_SIZE, "POWER MODE (%d)\n", POWER_METER);
  230. default:
  231. return snprintf(buf, PAGE_SIZE, "error (0x%02hhx)\n", adc_ctrl3);
  232. }
  233. }
  234. static ssize_t adc_mode_store(struct device *dev, struct device_attribute *attr,
  235. const char *buf, size_t count)
  236. {
  237. struct adc_info *adc_meter = dev_get_drvdata(dev);
  238. int ret;
  239. u8 temp, val;
  240. ret = kstrtou8(buf, 16, &temp);
  241. if (ret)
  242. return -EINVAL;
  243. switch (temp) {
  244. case CURRENT_METER:
  245. adc_meter->adc_mode = CURRENT_METER;
  246. val = CURRENT_MODE;
  247. break;
  248. case POWER_METER:
  249. adc_meter->adc_mode = POWER_METER;
  250. val = POWER_MODE;
  251. break;
  252. default:
  253. val = CURRENT_MODE;
  254. break;
  255. }
  256. s2dos05_update_reg(adc_meter->i2c, S2DOS05_REG_PWRMT_CTRL2,
  257. (ADC_EN_MASK | val), (ADC_EN_MASK | ADC_PGEN_MASK));
  258. return count;
  259. }
  260. static ssize_t adc_sync_mode_show(struct device *dev,
  261. struct device_attribute *attr, char *buf)
  262. {
  263. struct adc_info *adc_meter = dev_get_drvdata(dev);
  264. switch (adc_meter->adc_sync_mode) {
  265. case SYNC_MODE:
  266. return snprintf(buf, PAGE_SIZE,
  267. "SYNC_MODE (%d)\n", adc_meter->adc_sync_mode);
  268. case ASYNC_MODE:
  269. return snprintf(buf, PAGE_SIZE,
  270. "ASYNC_MODE (%d)\n", adc_meter->adc_sync_mode);
  271. default:
  272. return snprintf(buf, PAGE_SIZE,
  273. "error (%d)\n", adc_meter->adc_sync_mode);
  274. }
  275. }
  276. static ssize_t adc_sync_mode_store(struct device *dev, struct device_attribute *attr,
  277. const char *buf, size_t count)
  278. {
  279. struct adc_info *adc_meter = dev_get_drvdata(dev);
  280. int ret;
  281. u8 temp;
  282. ret = kstrtou8(buf, 16, &temp);
  283. if (ret)
  284. return -EINVAL;
  285. switch (temp) {
  286. case SYNC_MODE:
  287. adc_meter->adc_sync_mode = SYNC_MODE;
  288. break;
  289. case ASYNC_MODE:
  290. adc_meter->adc_sync_mode = ASYNC_MODE;
  291. break;
  292. default:
  293. adc_meter->adc_sync_mode = SYNC_MODE;
  294. break;
  295. }
  296. return count;
  297. }
  298. static int convert_adc_val(struct device *dev, char *buf, int channel)
  299. {
  300. struct adc_info *adc_meter = dev_get_drvdata(dev);
  301. s2m_adc_read_data(dev, channel);
  302. if (adc_meter->adc_mode == POWER_METER)
  303. return snprintf(buf, PAGE_SIZE, "%7lu uW\n",
  304. (adc_meter->adc_val[channel] * get_coeff(dev, channel)) / MICRO);
  305. else
  306. return snprintf(buf, PAGE_SIZE, "%7lu uA\n",
  307. adc_meter->adc_val[channel] * get_coeff(dev, channel));
  308. }
  309. static ssize_t adc_val_0_show(struct device *dev,
  310. struct device_attribute *attr, char *buf)
  311. {
  312. return convert_adc_val(dev, buf, ADC_CH0);
  313. }
  314. static ssize_t adc_val_1_show(struct device *dev,
  315. struct device_attribute *attr, char *buf)
  316. {
  317. return convert_adc_val(dev, buf, ADC_CH1);
  318. }
  319. static ssize_t adc_val_2_show(struct device *dev,
  320. struct device_attribute *attr, char *buf)
  321. {
  322. return convert_adc_val(dev, buf, ADC_CH2);
  323. }
  324. static ssize_t adc_val_3_show(struct device *dev,
  325. struct device_attribute *attr, char *buf)
  326. {
  327. return convert_adc_val(dev, buf, ADC_CH3);
  328. }
  329. static ssize_t adc_val_4_show(struct device *dev,
  330. struct device_attribute *attr, char *buf)
  331. {
  332. return convert_adc_val(dev, buf, ADC_CH4);
  333. }
  334. static ssize_t adc_val_5_show(struct device *dev,
  335. struct device_attribute *attr, char *buf)
  336. {
  337. return convert_adc_val(dev, buf, ADC_CH5);
  338. }
  339. static ssize_t adc_val_6_show(struct device *dev,
  340. struct device_attribute *attr, char *buf)
  341. {
  342. return convert_adc_val(dev, buf, ADC_CH6);
  343. }
  344. static ssize_t adc_val_7_show(struct device *dev,
  345. struct device_attribute *attr, char *buf)
  346. {
  347. return convert_adc_val(dev, buf, ADC_CH7);
  348. }
  349. static void adc_ctrl1_update(struct device *dev)
  350. {
  351. struct adc_info *adc_meter = dev_get_drvdata(dev);
  352. /* ADC temporarily off */
  353. s2dos05_update_reg(adc_meter->i2c,
  354. S2DOS05_REG_PWRMT_CTRL2, 0x00, ADC_EN_MASK);
  355. /* update ADC_CTRL1 register */
  356. s2dos05_write_reg(adc_meter->i2c,
  357. S2DOS05_REG_PWRMT_CTRL1, adc_meter->adc_ctrl1);
  358. /* ADC Continuous ON */
  359. s2dos05_update_reg(adc_meter->i2c,
  360. S2DOS05_REG_PWRMT_CTRL2, ADC_EN_MASK, ADC_EN_MASK);
  361. }
  362. static ssize_t adc_ctrl1_show(struct device *dev,
  363. struct device_attribute *attr, char *buf)
  364. {
  365. struct adc_info *adc_meter = dev_get_drvdata(dev);
  366. return snprintf(buf, PAGE_SIZE, "0x%02hhx\n", adc_meter->adc_ctrl1);
  367. }
  368. static ssize_t adc_ctrl1_store(struct device *dev, struct device_attribute *attr,
  369. const char *buf, size_t count)
  370. {
  371. struct adc_info *adc_meter = dev_get_drvdata(dev);
  372. int ret;
  373. u8 temp;
  374. ret = kstrtou8(buf, 16, &temp);
  375. if (ret)
  376. return -EINVAL;
  377. temp &= SMPNUM_MASK;
  378. adc_meter->adc_ctrl1 &= ~SMPNUM_MASK;
  379. adc_meter->adc_ctrl1 |= temp;
  380. adc_ctrl1_update(dev);
  381. return count;
  382. }
  383. #if IS_ENABLED(CONFIG_SEC_PM)
  384. static ssize_t adc_validity_show(struct device *dev, struct device_attribute *attr, char *buf)
  385. {
  386. struct adc_info *adc_meter = dev_get_drvdata(dev);
  387. u8 adc_validity;
  388. s2dos05_read_reg(adc_meter->i2c, S2DOS05_REG_OCL, &adc_validity);
  389. return snprintf(buf, PAGE_SIZE, "%d\n", (adc_validity >> 7));
  390. }
  391. #endif /* CONFIG_SEC_PM */
  392. static struct pmic_device_attribute powermeter_attr[] = {
  393. PMIC_ATTR(adc_val_all, S_IRUGO, adc_val_all_show, NULL),
  394. PMIC_ATTR(adc_en, S_IRUGO | S_IWUSR, adc_en_show, adc_en_store),
  395. PMIC_ATTR(adc_mode, S_IRUGO | S_IWUSR, adc_mode_show, adc_mode_store),
  396. PMIC_ATTR(adc_sync_mode, S_IRUGO | S_IWUSR, adc_sync_mode_show, adc_sync_mode_store),
  397. PMIC_ATTR(adc_val_0, S_IRUGO, adc_val_0_show, NULL),
  398. PMIC_ATTR(adc_val_1, S_IRUGO, adc_val_1_show, NULL),
  399. PMIC_ATTR(adc_val_2, S_IRUGO, adc_val_2_show, NULL),
  400. PMIC_ATTR(adc_val_3, S_IRUGO, adc_val_3_show, NULL),
  401. PMIC_ATTR(adc_val_4, S_IRUGO, adc_val_4_show, NULL),
  402. PMIC_ATTR(adc_val_5, S_IRUGO, adc_val_5_show, NULL),
  403. PMIC_ATTR(adc_val_6, S_IRUGO, adc_val_6_show, NULL),
  404. PMIC_ATTR(adc_val_7, S_IRUGO, adc_val_7_show, NULL),
  405. PMIC_ATTR(adc_ctrl1, S_IRUGO | S_IWUSR, adc_ctrl1_show, adc_ctrl1_store),
  406. #if IS_ENABLED(CONFIG_SEC_PM)
  407. PMIC_ATTR(adc_validity, S_IRUGO, adc_validity_show, NULL),
  408. #endif /* CONFIG_SEC_PM */
  409. };
  410. static int s2dos05_create_powermeter_sysfs(struct s2dos05_dev *s2dos05)
  411. {
  412. struct device *s2dos05_adc_dev;
  413. struct device *dev = s2dos05->dev;
  414. char device_name[50] = {0, };
  415. int err = -ENODEV, i = 0;
  416. pr_info("%s()\n", __func__);
  417. /* Dynamic allocation for device name */
  418. snprintf(device_name, sizeof(device_name) - 1, "%s-powermeter@%s",
  419. dev_driver_string(dev), dev_name(dev));
  420. s2dos05_adc_dev = pmic_device_create(s2dos05->adc_meter, device_name);
  421. s2dos05->powermeter_dev = s2dos05_adc_dev;
  422. /* Create sysfs entries */
  423. for (i = 0; i < ARRAY_SIZE(powermeter_attr); i++) {
  424. err = device_create_file(s2dos05_adc_dev, &powermeter_attr[i].dev_attr);
  425. if (err)
  426. goto remove_pmic_device;
  427. }
  428. #if IS_ENABLED(CONFIG_SEC_PM)
  429. if (!IS_ERR_OR_NULL(s2dos05->sec_disp_pmic_dev)) {
  430. err = sysfs_create_link(&s2dos05->sec_disp_pmic_dev->kobj,
  431. &s2dos05_adc_dev->kobj, "power_meter");
  432. if (err) {
  433. pr_err("%s: fail to create link for power_meter\n",
  434. __func__);
  435. goto remove_pmic_device;
  436. }
  437. }
  438. #endif /* CONFIG_SEC_PM */
  439. return 0;
  440. remove_pmic_device:
  441. for (i--; i >= 0; i--)
  442. device_remove_file(s2dos05_adc_dev, &powermeter_attr[i].dev_attr);
  443. pmic_device_destroy(s2dos05_adc_dev->devt);
  444. return -1;
  445. }
  446. #endif
  447. static void s2dos05_set_smp_num(struct adc_info *adc_meter)
  448. {
  449. switch (adc_meter->adc_mode) {
  450. case CURRENT_METER:
  451. adc_meter->adc_ctrl1 = 0x0C;
  452. break;
  453. case POWER_METER:
  454. adc_meter->adc_ctrl1 = 0x0C;
  455. break;
  456. default:
  457. adc_meter->adc_ctrl1 = 0x0C;
  458. break;
  459. }
  460. }
  461. static void s2dos05_adc_set_enable(struct adc_info *adc_meter, struct s2dos05_dev *s2dos05)
  462. {
  463. switch (adc_meter->adc_mode) {
  464. case CURRENT_METER:
  465. s2dos05_update_reg(s2dos05->i2c, S2DOS05_REG_PWRMT_CTRL2,
  466. (ADC_EN_MASK | CURRENT_MODE),
  467. (ADC_EN_MASK | ADC_PGEN_MASK));
  468. pr_info("%s: current mode enable (0x%2x)\n",
  469. __func__, (ADC_EN_MASK | CURRENT_MODE));
  470. break;
  471. case POWER_METER:
  472. s2dos05_update_reg(s2dos05->i2c, S2DOS05_REG_PWRMT_CTRL2,
  473. (ADC_EN_MASK | POWER_MODE),
  474. (ADC_EN_MASK | ADC_PGEN_MASK));
  475. pr_info("%s: power mode enable (0x%2x)\n",
  476. __func__, (ADC_EN_MASK | POWER_MODE));
  477. break;
  478. default:
  479. s2dos05_update_reg(s2dos05->i2c, S2DOS05_REG_PWRMT_CTRL2,
  480. (0x00 | CURRENT_MODE),
  481. (ADC_EN_MASK | ADC_PGEN_MASK));
  482. pr_info("%s: current/power meter disable (0x%2x)\n",
  483. __func__, (ADC_EN_MASK | CURRENT_MODE));
  484. }
  485. }
  486. void s2dos05_powermeter_init(struct s2dos05_dev *s2dos05)
  487. {
  488. struct adc_info *adc_meter;
  489. adc_meter = devm_kzalloc(s2dos05->dev,
  490. sizeof(struct adc_info), GFP_KERNEL);
  491. if (!adc_meter) {
  492. pr_err("%s: adc_meter alloc fail.\n", __func__);
  493. return;
  494. }
  495. adc_meter->adc_val = devm_kzalloc(s2dos05->dev,
  496. sizeof(unsigned long) * S2DOS05_MAX_ADC_CHANNEL,
  497. GFP_KERNEL);
  498. pr_info("%s: s2dos05 power meter init start\n", __func__);
  499. adc_meter->adc_mode = s2dos05->adc_mode;
  500. adc_meter->adc_sync_mode = s2dos05->adc_sync_mode;
  501. /* POWER_METER mode needs bigger SMP_NUM to get stable value */
  502. s2dos05_set_smp_num(adc_meter);
  503. /* SMP_NUM = 1100(16384) ~16s in case of aync mode */
  504. if (adc_meter->adc_sync_mode == ASYNC_MODE)
  505. adc_meter->adc_ctrl1 = 0x0C;
  506. #if IS_ENABLED(CONFIG_SEC_PM)
  507. adc_meter->is_sm3080 = s2dos05->is_sm3080;
  508. if (adc_meter->is_sm3080)
  509. adc_meter->adc_ctrl1 = 0x0B; /* 10 seconds */
  510. #endif /* CONFIG_SEC_PM */
  511. s2dos05_write_reg(s2dos05->i2c,
  512. S2DOS05_REG_PWRMT_CTRL1, adc_meter->adc_ctrl1);
  513. /* ADC EN */
  514. s2dos05_adc_set_enable(adc_meter, s2dos05);
  515. adc_meter->i2c = s2dos05->i2c;
  516. s2dos05->adc_meter = adc_meter;
  517. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  518. if (s2dos05_create_powermeter_sysfs(s2dos05) < 0) {
  519. pr_info("%s: failed to create sysfs\n", __func__);
  520. return;
  521. }
  522. #endif
  523. pr_info("%s: s2dos05 power meter init end\n", __func__);
  524. }
  525. EXPORT_SYMBOL_GPL(s2dos05_powermeter_init);
  526. void s2dos05_powermeter_deinit(struct s2dos05_dev *s2dos05)
  527. {
  528. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  529. struct device *s2dos05_adc_dev = s2dos05->powermeter_dev;
  530. int i = 0;
  531. /* Remove sysfs entries */
  532. for (i = 0; i < ARRAY_SIZE(powermeter_attr); i++)
  533. device_remove_file(s2dos05_adc_dev, &powermeter_attr[i].dev_attr);
  534. pmic_device_destroy(s2dos05_adc_dev->devt);
  535. #endif
  536. /* ADC turned off */
  537. s2dos05_write_reg(s2dos05->i2c, S2DOS05_REG_PWRMT_CTRL2, 0);
  538. pr_info("%s: s2dos05 power meter deinit\n", __func__);
  539. }
  540. EXPORT_SYMBOL_GPL(s2dos05_powermeter_deinit);