qcom-spmi-vadc.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. /*
  2. * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/bitops.h>
  14. #include <linux/completion.h>
  15. #include <linux/delay.h>
  16. #include <linux/err.h>
  17. #include <linux/iio/iio.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/kernel.h>
  20. #include <linux/math64.h>
  21. #include <linux/module.h>
  22. #include <linux/of.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/regmap.h>
  25. #include <linux/slab.h>
  26. #include <linux/log2.h>
  27. #include <dt-bindings/iio/qcom,spmi-vadc.h>
  28. #include "qcom-vadc-common.h"
  29. /* VADC register and bit definitions */
  30. #define VADC_REVISION2 0x1
  31. #define VADC_REVISION2_SUPPORTED_VADC 1
  32. #define VADC_PERPH_TYPE 0x4
  33. #define VADC_PERPH_TYPE_ADC 8
  34. #define VADC_PERPH_SUBTYPE 0x5
  35. #define VADC_PERPH_SUBTYPE_VADC 1
  36. #define VADC_STATUS1 0x8
  37. #define VADC_STATUS1_OP_MODE 4
  38. #define VADC_STATUS1_REQ_STS BIT(1)
  39. #define VADC_STATUS1_EOC BIT(0)
  40. #define VADC_STATUS1_REQ_STS_EOC_MASK 0x3
  41. #define VADC_MODE_CTL 0x40
  42. #define VADC_OP_MODE_SHIFT 3
  43. #define VADC_OP_MODE_NORMAL 0
  44. #define VADC_AMUX_TRIM_EN BIT(1)
  45. #define VADC_ADC_TRIM_EN BIT(0)
  46. #define VADC_EN_CTL1 0x46
  47. #define VADC_EN_CTL1_SET BIT(7)
  48. #define VADC_ADC_CH_SEL_CTL 0x48
  49. #define VADC_ADC_DIG_PARAM 0x50
  50. #define VADC_ADC_DIG_DEC_RATIO_SEL_SHIFT 2
  51. #define VADC_HW_SETTLE_DELAY 0x51
  52. #define VADC_CONV_REQ 0x52
  53. #define VADC_CONV_REQ_SET BIT(7)
  54. #define VADC_FAST_AVG_CTL 0x5a
  55. #define VADC_FAST_AVG_EN 0x5b
  56. #define VADC_FAST_AVG_EN_SET BIT(7)
  57. #define VADC_ACCESS 0xd0
  58. #define VADC_ACCESS_DATA 0xa5
  59. #define VADC_PERH_RESET_CTL3 0xda
  60. #define VADC_FOLLOW_WARM_RB BIT(2)
  61. #define VADC_DATA 0x60 /* 16 bits */
  62. #define VADC_CHAN_MIN VADC_USBIN
  63. #define VADC_CHAN_MAX VADC_LR_MUX3_BUF_PU1_PU2_XO_THERM
  64. /**
  65. * struct vadc_channel_prop - VADC channel property.
  66. * @channel: channel number, refer to the channel list.
  67. * @calibration: calibration type.
  68. * @decimation: sampling rate supported for the channel.
  69. * @prescale: channel scaling performed on the input signal.
  70. * @hw_settle_time: the time between AMUX being configured and the
  71. * start of conversion.
  72. * @avg_samples: ability to provide single result from the ADC
  73. * that is an average of multiple measurements.
  74. * @scale_fn_type: Represents the scaling function to convert voltage
  75. * physical units desired by the client for the channel.
  76. */
  77. struct vadc_channel_prop {
  78. unsigned int channel;
  79. enum vadc_calibration calibration;
  80. unsigned int decimation;
  81. unsigned int prescale;
  82. unsigned int hw_settle_time;
  83. unsigned int avg_samples;
  84. enum vadc_scale_fn_type scale_fn_type;
  85. };
  86. /**
  87. * struct vadc_priv - VADC private structure.
  88. * @regmap: pointer to struct regmap.
  89. * @dev: pointer to struct device.
  90. * @base: base address for the ADC peripheral.
  91. * @nchannels: number of VADC channels.
  92. * @chan_props: array of VADC channel properties.
  93. * @iio_chans: array of IIO channels specification.
  94. * @are_ref_measured: are reference points measured.
  95. * @poll_eoc: use polling instead of interrupt.
  96. * @complete: VADC result notification after interrupt is received.
  97. * @graph: store parameters for calibration.
  98. * @lock: ADC lock for access to the peripheral.
  99. */
  100. struct vadc_priv {
  101. struct regmap *regmap;
  102. struct device *dev;
  103. u16 base;
  104. unsigned int nchannels;
  105. struct vadc_channel_prop *chan_props;
  106. struct iio_chan_spec *iio_chans;
  107. bool are_ref_measured;
  108. bool poll_eoc;
  109. struct completion complete;
  110. struct vadc_linear_graph graph[2];
  111. struct mutex lock;
  112. };
  113. static const struct vadc_prescale_ratio vadc_prescale_ratios[] = {
  114. {.num = 1, .den = 1},
  115. {.num = 1, .den = 3},
  116. {.num = 1, .den = 4},
  117. {.num = 1, .den = 6},
  118. {.num = 1, .den = 20},
  119. {.num = 1, .den = 8},
  120. {.num = 10, .den = 81},
  121. {.num = 1, .den = 10}
  122. };
  123. static int vadc_read(struct vadc_priv *vadc, u16 offset, u8 *data)
  124. {
  125. return regmap_bulk_read(vadc->regmap, vadc->base + offset, data, 1);
  126. }
  127. static int vadc_write(struct vadc_priv *vadc, u16 offset, u8 data)
  128. {
  129. return regmap_write(vadc->regmap, vadc->base + offset, data);
  130. }
  131. static int vadc_reset(struct vadc_priv *vadc)
  132. {
  133. u8 data;
  134. int ret;
  135. ret = vadc_write(vadc, VADC_ACCESS, VADC_ACCESS_DATA);
  136. if (ret)
  137. return ret;
  138. ret = vadc_read(vadc, VADC_PERH_RESET_CTL3, &data);
  139. if (ret)
  140. return ret;
  141. ret = vadc_write(vadc, VADC_ACCESS, VADC_ACCESS_DATA);
  142. if (ret)
  143. return ret;
  144. data |= VADC_FOLLOW_WARM_RB;
  145. return vadc_write(vadc, VADC_PERH_RESET_CTL3, data);
  146. }
  147. static int vadc_set_state(struct vadc_priv *vadc, bool state)
  148. {
  149. return vadc_write(vadc, VADC_EN_CTL1, state ? VADC_EN_CTL1_SET : 0);
  150. }
  151. static void vadc_show_status(struct vadc_priv *vadc)
  152. {
  153. u8 mode, sta1, chan, dig, en, req;
  154. int ret;
  155. ret = vadc_read(vadc, VADC_MODE_CTL, &mode);
  156. if (ret)
  157. return;
  158. ret = vadc_read(vadc, VADC_ADC_DIG_PARAM, &dig);
  159. if (ret)
  160. return;
  161. ret = vadc_read(vadc, VADC_ADC_CH_SEL_CTL, &chan);
  162. if (ret)
  163. return;
  164. ret = vadc_read(vadc, VADC_CONV_REQ, &req);
  165. if (ret)
  166. return;
  167. ret = vadc_read(vadc, VADC_STATUS1, &sta1);
  168. if (ret)
  169. return;
  170. ret = vadc_read(vadc, VADC_EN_CTL1, &en);
  171. if (ret)
  172. return;
  173. dev_err(vadc->dev,
  174. "mode:%02x en:%02x chan:%02x dig:%02x req:%02x sta1:%02x\n",
  175. mode, en, chan, dig, req, sta1);
  176. }
  177. static int vadc_configure(struct vadc_priv *vadc,
  178. struct vadc_channel_prop *prop)
  179. {
  180. u8 decimation, mode_ctrl;
  181. int ret;
  182. /* Mode selection */
  183. mode_ctrl = (VADC_OP_MODE_NORMAL << VADC_OP_MODE_SHIFT) |
  184. VADC_ADC_TRIM_EN | VADC_AMUX_TRIM_EN;
  185. ret = vadc_write(vadc, VADC_MODE_CTL, mode_ctrl);
  186. if (ret)
  187. return ret;
  188. /* Channel selection */
  189. ret = vadc_write(vadc, VADC_ADC_CH_SEL_CTL, prop->channel);
  190. if (ret)
  191. return ret;
  192. /* Digital parameter setup */
  193. decimation = prop->decimation << VADC_ADC_DIG_DEC_RATIO_SEL_SHIFT;
  194. ret = vadc_write(vadc, VADC_ADC_DIG_PARAM, decimation);
  195. if (ret)
  196. return ret;
  197. /* HW settle time delay */
  198. ret = vadc_write(vadc, VADC_HW_SETTLE_DELAY, prop->hw_settle_time);
  199. if (ret)
  200. return ret;
  201. ret = vadc_write(vadc, VADC_FAST_AVG_CTL, prop->avg_samples);
  202. if (ret)
  203. return ret;
  204. if (prop->avg_samples)
  205. ret = vadc_write(vadc, VADC_FAST_AVG_EN, VADC_FAST_AVG_EN_SET);
  206. else
  207. ret = vadc_write(vadc, VADC_FAST_AVG_EN, 0);
  208. return ret;
  209. }
  210. static int vadc_poll_wait_eoc(struct vadc_priv *vadc, unsigned int interval_us)
  211. {
  212. unsigned int count, retry;
  213. u8 sta1;
  214. int ret;
  215. retry = interval_us / VADC_CONV_TIME_MIN_US;
  216. for (count = 0; count < retry; count++) {
  217. ret = vadc_read(vadc, VADC_STATUS1, &sta1);
  218. if (ret)
  219. return ret;
  220. sta1 &= VADC_STATUS1_REQ_STS_EOC_MASK;
  221. if (sta1 == VADC_STATUS1_EOC)
  222. return 0;
  223. usleep_range(VADC_CONV_TIME_MIN_US, VADC_CONV_TIME_MAX_US);
  224. }
  225. vadc_show_status(vadc);
  226. return -ETIMEDOUT;
  227. }
  228. static int vadc_read_result(struct vadc_priv *vadc, u16 *data)
  229. {
  230. int ret;
  231. ret = regmap_bulk_read(vadc->regmap, vadc->base + VADC_DATA, data, 2);
  232. if (ret)
  233. return ret;
  234. *data = clamp_t(u16, *data, VADC_MIN_ADC_CODE, VADC_MAX_ADC_CODE);
  235. return 0;
  236. }
  237. static struct vadc_channel_prop *vadc_get_channel(struct vadc_priv *vadc,
  238. unsigned int num)
  239. {
  240. unsigned int i;
  241. for (i = 0; i < vadc->nchannels; i++)
  242. if (vadc->chan_props[i].channel == num)
  243. return &vadc->chan_props[i];
  244. dev_dbg(vadc->dev, "no such channel %02x\n", num);
  245. return NULL;
  246. }
  247. static int vadc_do_conversion(struct vadc_priv *vadc,
  248. struct vadc_channel_prop *prop, u16 *data)
  249. {
  250. unsigned int timeout;
  251. int ret;
  252. mutex_lock(&vadc->lock);
  253. ret = vadc_configure(vadc, prop);
  254. if (ret)
  255. goto unlock;
  256. if (!vadc->poll_eoc)
  257. reinit_completion(&vadc->complete);
  258. ret = vadc_set_state(vadc, true);
  259. if (ret)
  260. goto unlock;
  261. ret = vadc_write(vadc, VADC_CONV_REQ, VADC_CONV_REQ_SET);
  262. if (ret)
  263. goto err_disable;
  264. timeout = BIT(prop->avg_samples) * VADC_CONV_TIME_MIN_US * 2;
  265. if (vadc->poll_eoc) {
  266. ret = vadc_poll_wait_eoc(vadc, timeout);
  267. } else {
  268. ret = wait_for_completion_timeout(&vadc->complete, timeout);
  269. if (!ret) {
  270. ret = -ETIMEDOUT;
  271. goto err_disable;
  272. }
  273. /* Double check conversion status */
  274. ret = vadc_poll_wait_eoc(vadc, VADC_CONV_TIME_MIN_US);
  275. if (ret)
  276. goto err_disable;
  277. }
  278. ret = vadc_read_result(vadc, data);
  279. err_disable:
  280. vadc_set_state(vadc, false);
  281. if (ret)
  282. dev_err(vadc->dev, "conversion failed\n");
  283. unlock:
  284. mutex_unlock(&vadc->lock);
  285. return ret;
  286. }
  287. static int vadc_measure_ref_points(struct vadc_priv *vadc)
  288. {
  289. struct vadc_channel_prop *prop;
  290. u16 read_1, read_2;
  291. int ret;
  292. vadc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE;
  293. vadc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV;
  294. prop = vadc_get_channel(vadc, VADC_REF_1250MV);
  295. ret = vadc_do_conversion(vadc, prop, &read_1);
  296. if (ret)
  297. goto err;
  298. /* Try with buffered 625mV channel first */
  299. prop = vadc_get_channel(vadc, VADC_SPARE1);
  300. if (!prop)
  301. prop = vadc_get_channel(vadc, VADC_REF_625MV);
  302. ret = vadc_do_conversion(vadc, prop, &read_2);
  303. if (ret)
  304. goto err;
  305. if (read_1 == read_2) {
  306. ret = -EINVAL;
  307. goto err;
  308. }
  309. vadc->graph[VADC_CALIB_ABSOLUTE].dy = read_1 - read_2;
  310. vadc->graph[VADC_CALIB_ABSOLUTE].gnd = read_2;
  311. /* Ratiometric calibration */
  312. prop = vadc_get_channel(vadc, VADC_VDD_VADC);
  313. ret = vadc_do_conversion(vadc, prop, &read_1);
  314. if (ret)
  315. goto err;
  316. prop = vadc_get_channel(vadc, VADC_GND_REF);
  317. ret = vadc_do_conversion(vadc, prop, &read_2);
  318. if (ret)
  319. goto err;
  320. if (read_1 == read_2) {
  321. ret = -EINVAL;
  322. goto err;
  323. }
  324. vadc->graph[VADC_CALIB_RATIOMETRIC].dy = read_1 - read_2;
  325. vadc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_2;
  326. err:
  327. if (ret)
  328. dev_err(vadc->dev, "measure reference points failed\n");
  329. return ret;
  330. }
  331. static int vadc_prescaling_from_dt(u32 num, u32 den)
  332. {
  333. unsigned int pre;
  334. for (pre = 0; pre < ARRAY_SIZE(vadc_prescale_ratios); pre++)
  335. if (vadc_prescale_ratios[pre].num == num &&
  336. vadc_prescale_ratios[pre].den == den)
  337. break;
  338. if (pre == ARRAY_SIZE(vadc_prescale_ratios))
  339. return -EINVAL;
  340. return pre;
  341. }
  342. static int vadc_hw_settle_time_from_dt(u32 value)
  343. {
  344. if ((value <= 1000 && value % 100) || (value > 1000 && value % 2000))
  345. return -EINVAL;
  346. if (value <= 1000)
  347. value /= 100;
  348. else
  349. value = value / 2000 + 10;
  350. return value;
  351. }
  352. static int vadc_avg_samples_from_dt(u32 value)
  353. {
  354. if (!is_power_of_2(value) || value > VADC_AVG_SAMPLES_MAX)
  355. return -EINVAL;
  356. return __ffs64(value);
  357. }
  358. static int vadc_read_raw(struct iio_dev *indio_dev,
  359. struct iio_chan_spec const *chan, int *val, int *val2,
  360. long mask)
  361. {
  362. struct vadc_priv *vadc = iio_priv(indio_dev);
  363. struct vadc_channel_prop *prop;
  364. u16 adc_code;
  365. int ret;
  366. switch (mask) {
  367. case IIO_CHAN_INFO_PROCESSED:
  368. prop = &vadc->chan_props[chan->address];
  369. ret = vadc_do_conversion(vadc, prop, &adc_code);
  370. if (ret)
  371. break;
  372. ret = qcom_vadc_scale(prop->scale_fn_type,
  373. &vadc->graph[prop->calibration],
  374. &vadc_prescale_ratios[prop->prescale],
  375. (prop->calibration == VADC_CALIB_ABSOLUTE),
  376. adc_code, val);
  377. if (ret)
  378. break;
  379. return IIO_VAL_INT;
  380. case IIO_CHAN_INFO_RAW:
  381. prop = &vadc->chan_props[chan->address];
  382. ret = vadc_do_conversion(vadc, prop, &adc_code);
  383. if (ret)
  384. break;
  385. *val = (int)adc_code;
  386. return IIO_VAL_INT;
  387. default:
  388. ret = -EINVAL;
  389. break;
  390. }
  391. return ret;
  392. }
  393. static int vadc_of_xlate(struct iio_dev *indio_dev,
  394. const struct of_phandle_args *iiospec)
  395. {
  396. struct vadc_priv *vadc = iio_priv(indio_dev);
  397. unsigned int i;
  398. for (i = 0; i < vadc->nchannels; i++)
  399. if (vadc->iio_chans[i].channel == iiospec->args[0])
  400. return i;
  401. return -EINVAL;
  402. }
  403. static const struct iio_info vadc_info = {
  404. .read_raw = vadc_read_raw,
  405. .of_xlate = vadc_of_xlate,
  406. };
  407. struct vadc_channels {
  408. const char *datasheet_name;
  409. unsigned int prescale_index;
  410. enum iio_chan_type type;
  411. long info_mask;
  412. enum vadc_scale_fn_type scale_fn_type;
  413. };
  414. #define VADC_CHAN(_dname, _type, _mask, _pre, _scale) \
  415. [VADC_##_dname] = { \
  416. .datasheet_name = __stringify(_dname), \
  417. .prescale_index = _pre, \
  418. .type = _type, \
  419. .info_mask = _mask, \
  420. .scale_fn_type = _scale \
  421. }, \
  422. #define VADC_NO_CHAN(_dname, _type, _mask, _pre) \
  423. [VADC_##_dname] = { \
  424. .datasheet_name = __stringify(_dname), \
  425. .prescale_index = _pre, \
  426. .type = _type, \
  427. .info_mask = _mask \
  428. },
  429. #define VADC_CHAN_TEMP(_dname, _pre, _scale) \
  430. VADC_CHAN(_dname, IIO_TEMP, \
  431. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_PROCESSED), \
  432. _pre, _scale) \
  433. #define VADC_CHAN_VOLT(_dname, _pre, _scale) \
  434. VADC_CHAN(_dname, IIO_VOLTAGE, \
  435. BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_PROCESSED),\
  436. _pre, _scale) \
  437. #define VADC_CHAN_NO_SCALE(_dname, _pre) \
  438. VADC_NO_CHAN(_dname, IIO_VOLTAGE, \
  439. BIT(IIO_CHAN_INFO_RAW), \
  440. _pre) \
  441. /*
  442. * The array represents all possible ADC channels found in the supported PMICs.
  443. * Every index in the array is equal to the channel number per datasheet. The
  444. * gaps in the array should be treated as reserved channels.
  445. */
  446. static const struct vadc_channels vadc_chans[] = {
  447. VADC_CHAN_VOLT(USBIN, 4, SCALE_DEFAULT)
  448. VADC_CHAN_VOLT(DCIN, 4, SCALE_DEFAULT)
  449. VADC_CHAN_NO_SCALE(VCHG_SNS, 3)
  450. VADC_CHAN_NO_SCALE(SPARE1_03, 1)
  451. VADC_CHAN_NO_SCALE(USB_ID_MV, 1)
  452. VADC_CHAN_VOLT(VCOIN, 1, SCALE_DEFAULT)
  453. VADC_CHAN_NO_SCALE(VBAT_SNS, 1)
  454. VADC_CHAN_VOLT(VSYS, 1, SCALE_DEFAULT)
  455. VADC_CHAN_TEMP(DIE_TEMP, 0, SCALE_PMIC_THERM)
  456. VADC_CHAN_VOLT(REF_625MV, 0, SCALE_DEFAULT)
  457. VADC_CHAN_VOLT(REF_1250MV, 0, SCALE_DEFAULT)
  458. VADC_CHAN_NO_SCALE(CHG_TEMP, 0)
  459. VADC_CHAN_NO_SCALE(SPARE1, 0)
  460. VADC_CHAN_TEMP(SPARE2, 0, SCALE_PMI_CHG_TEMP)
  461. VADC_CHAN_VOLT(GND_REF, 0, SCALE_DEFAULT)
  462. VADC_CHAN_VOLT(VDD_VADC, 0, SCALE_DEFAULT)
  463. VADC_CHAN_NO_SCALE(P_MUX1_1_1, 0)
  464. VADC_CHAN_NO_SCALE(P_MUX2_1_1, 0)
  465. VADC_CHAN_NO_SCALE(P_MUX3_1_1, 0)
  466. VADC_CHAN_NO_SCALE(P_MUX4_1_1, 0)
  467. VADC_CHAN_NO_SCALE(P_MUX5_1_1, 0)
  468. VADC_CHAN_NO_SCALE(P_MUX6_1_1, 0)
  469. VADC_CHAN_NO_SCALE(P_MUX7_1_1, 0)
  470. VADC_CHAN_NO_SCALE(P_MUX8_1_1, 0)
  471. VADC_CHAN_NO_SCALE(P_MUX9_1_1, 0)
  472. VADC_CHAN_NO_SCALE(P_MUX10_1_1, 0)
  473. VADC_CHAN_NO_SCALE(P_MUX11_1_1, 0)
  474. VADC_CHAN_NO_SCALE(P_MUX12_1_1, 0)
  475. VADC_CHAN_NO_SCALE(P_MUX13_1_1, 0)
  476. VADC_CHAN_NO_SCALE(P_MUX14_1_1, 0)
  477. VADC_CHAN_NO_SCALE(P_MUX15_1_1, 0)
  478. VADC_CHAN_NO_SCALE(P_MUX16_1_1, 0)
  479. VADC_CHAN_NO_SCALE(P_MUX1_1_3, 1)
  480. VADC_CHAN_NO_SCALE(P_MUX2_1_3, 1)
  481. VADC_CHAN_NO_SCALE(P_MUX3_1_3, 1)
  482. VADC_CHAN_NO_SCALE(P_MUX4_1_3, 1)
  483. VADC_CHAN_NO_SCALE(P_MUX5_1_3, 1)
  484. VADC_CHAN_NO_SCALE(P_MUX6_1_3, 1)
  485. VADC_CHAN_NO_SCALE(P_MUX7_1_3, 1)
  486. VADC_CHAN_NO_SCALE(P_MUX8_1_3, 1)
  487. VADC_CHAN_NO_SCALE(P_MUX9_1_3, 1)
  488. VADC_CHAN_NO_SCALE(P_MUX10_1_3, 1)
  489. VADC_CHAN_NO_SCALE(P_MUX11_1_3, 1)
  490. VADC_CHAN_NO_SCALE(P_MUX12_1_3, 1)
  491. VADC_CHAN_NO_SCALE(P_MUX13_1_3, 1)
  492. VADC_CHAN_NO_SCALE(P_MUX14_1_3, 1)
  493. VADC_CHAN_NO_SCALE(P_MUX15_1_3, 1)
  494. VADC_CHAN_NO_SCALE(P_MUX16_1_3, 1)
  495. VADC_CHAN_NO_SCALE(LR_MUX1_BAT_THERM, 0)
  496. VADC_CHAN_VOLT(LR_MUX2_BAT_ID, 0, SCALE_DEFAULT)
  497. VADC_CHAN_NO_SCALE(LR_MUX3_XO_THERM, 0)
  498. VADC_CHAN_NO_SCALE(LR_MUX4_AMUX_THM1, 0)
  499. VADC_CHAN_NO_SCALE(LR_MUX5_AMUX_THM2, 0)
  500. VADC_CHAN_NO_SCALE(LR_MUX6_AMUX_THM3, 0)
  501. VADC_CHAN_NO_SCALE(LR_MUX7_HW_ID, 0)
  502. VADC_CHAN_NO_SCALE(LR_MUX8_AMUX_THM4, 0)
  503. VADC_CHAN_NO_SCALE(LR_MUX9_AMUX_THM5, 0)
  504. VADC_CHAN_NO_SCALE(LR_MUX10_USB_ID, 0)
  505. VADC_CHAN_NO_SCALE(AMUX_PU1, 0)
  506. VADC_CHAN_NO_SCALE(AMUX_PU2, 0)
  507. VADC_CHAN_NO_SCALE(LR_MUX3_BUF_XO_THERM, 0)
  508. VADC_CHAN_NO_SCALE(LR_MUX1_PU1_BAT_THERM, 0)
  509. VADC_CHAN_NO_SCALE(LR_MUX2_PU1_BAT_ID, 0)
  510. VADC_CHAN_NO_SCALE(LR_MUX3_PU1_XO_THERM, 0)
  511. VADC_CHAN_TEMP(LR_MUX4_PU1_AMUX_THM1, 0, SCALE_THERM_100K_PULLUP)
  512. VADC_CHAN_TEMP(LR_MUX5_PU1_AMUX_THM2, 0, SCALE_THERM_100K_PULLUP)
  513. VADC_CHAN_TEMP(LR_MUX6_PU1_AMUX_THM3, 0, SCALE_THERM_100K_PULLUP)
  514. VADC_CHAN_NO_SCALE(LR_MUX7_PU1_AMUX_HW_ID, 0)
  515. VADC_CHAN_TEMP(LR_MUX8_PU1_AMUX_THM4, 0, SCALE_THERM_100K_PULLUP)
  516. VADC_CHAN_TEMP(LR_MUX9_PU1_AMUX_THM5, 0, SCALE_THERM_100K_PULLUP)
  517. VADC_CHAN_NO_SCALE(LR_MUX10_PU1_AMUX_USB_ID, 0)
  518. VADC_CHAN_TEMP(LR_MUX3_BUF_PU1_XO_THERM, 0, SCALE_XOTHERM)
  519. VADC_CHAN_NO_SCALE(LR_MUX1_PU2_BAT_THERM, 0)
  520. VADC_CHAN_NO_SCALE(LR_MUX2_PU2_BAT_ID, 0)
  521. VADC_CHAN_NO_SCALE(LR_MUX3_PU2_XO_THERM, 0)
  522. VADC_CHAN_NO_SCALE(LR_MUX4_PU2_AMUX_THM1, 0)
  523. VADC_CHAN_NO_SCALE(LR_MUX5_PU2_AMUX_THM2, 0)
  524. VADC_CHAN_NO_SCALE(LR_MUX6_PU2_AMUX_THM3, 0)
  525. VADC_CHAN_NO_SCALE(LR_MUX7_PU2_AMUX_HW_ID, 0)
  526. VADC_CHAN_NO_SCALE(LR_MUX8_PU2_AMUX_THM4, 0)
  527. VADC_CHAN_NO_SCALE(LR_MUX9_PU2_AMUX_THM5, 0)
  528. VADC_CHAN_NO_SCALE(LR_MUX10_PU2_AMUX_USB_ID, 0)
  529. VADC_CHAN_NO_SCALE(LR_MUX3_BUF_PU2_XO_THERM, 0)
  530. VADC_CHAN_NO_SCALE(LR_MUX1_PU1_PU2_BAT_THERM, 0)
  531. VADC_CHAN_NO_SCALE(LR_MUX2_PU1_PU2_BAT_ID, 0)
  532. VADC_CHAN_NO_SCALE(LR_MUX3_PU1_PU2_XO_THERM, 0)
  533. VADC_CHAN_NO_SCALE(LR_MUX4_PU1_PU2_AMUX_THM1, 0)
  534. VADC_CHAN_NO_SCALE(LR_MUX5_PU1_PU2_AMUX_THM2, 0)
  535. VADC_CHAN_NO_SCALE(LR_MUX6_PU1_PU2_AMUX_THM3, 0)
  536. VADC_CHAN_NO_SCALE(LR_MUX7_PU1_PU2_AMUX_HW_ID, 0)
  537. VADC_CHAN_NO_SCALE(LR_MUX8_PU1_PU2_AMUX_THM4, 0)
  538. VADC_CHAN_NO_SCALE(LR_MUX9_PU1_PU2_AMUX_THM5, 0)
  539. VADC_CHAN_NO_SCALE(LR_MUX10_PU1_PU2_AMUX_USB_ID, 0)
  540. VADC_CHAN_NO_SCALE(LR_MUX3_BUF_PU1_PU2_XO_THERM, 0)
  541. };
  542. static int vadc_get_dt_channel_data(struct device *dev,
  543. struct vadc_channel_prop *prop,
  544. struct device_node *node)
  545. {
  546. const char *name = node->name;
  547. u32 chan, value, varr[2];
  548. int ret;
  549. ret = of_property_read_u32(node, "reg", &chan);
  550. if (ret) {
  551. dev_err(dev, "invalid channel number %s\n", name);
  552. return ret;
  553. }
  554. if (chan > VADC_CHAN_MAX || chan < VADC_CHAN_MIN) {
  555. dev_err(dev, "%s invalid channel number %d\n", name, chan);
  556. return -EINVAL;
  557. }
  558. /* the channel has DT description */
  559. prop->channel = chan;
  560. ret = of_property_read_u32(node, "qcom,decimation", &value);
  561. if (!ret) {
  562. ret = qcom_vadc_decimation_from_dt(value);
  563. if (ret < 0) {
  564. dev_err(dev, "%02x invalid decimation %d\n",
  565. chan, value);
  566. return ret;
  567. }
  568. prop->decimation = ret;
  569. } else {
  570. prop->decimation = VADC_DEF_DECIMATION;
  571. }
  572. ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2);
  573. if (!ret) {
  574. ret = vadc_prescaling_from_dt(varr[0], varr[1]);
  575. if (ret < 0) {
  576. dev_err(dev, "%02x invalid pre-scaling <%d %d>\n",
  577. chan, varr[0], varr[1]);
  578. return ret;
  579. }
  580. prop->prescale = ret;
  581. } else {
  582. prop->prescale = vadc_chans[prop->channel].prescale_index;
  583. }
  584. ret = of_property_read_u32(node, "qcom,hw-settle-time", &value);
  585. if (!ret) {
  586. ret = vadc_hw_settle_time_from_dt(value);
  587. if (ret < 0) {
  588. dev_err(dev, "%02x invalid hw-settle-time %d us\n",
  589. chan, value);
  590. return ret;
  591. }
  592. prop->hw_settle_time = ret;
  593. } else {
  594. prop->hw_settle_time = VADC_DEF_HW_SETTLE_TIME;
  595. }
  596. ret = of_property_read_u32(node, "qcom,avg-samples", &value);
  597. if (!ret) {
  598. ret = vadc_avg_samples_from_dt(value);
  599. if (ret < 0) {
  600. dev_err(dev, "%02x invalid avg-samples %d\n",
  601. chan, value);
  602. return ret;
  603. }
  604. prop->avg_samples = ret;
  605. } else {
  606. prop->avg_samples = VADC_DEF_AVG_SAMPLES;
  607. }
  608. if (of_property_read_bool(node, "qcom,ratiometric"))
  609. prop->calibration = VADC_CALIB_RATIOMETRIC;
  610. else
  611. prop->calibration = VADC_CALIB_ABSOLUTE;
  612. dev_dbg(dev, "%02x name %s\n", chan, name);
  613. return 0;
  614. }
  615. static int vadc_get_dt_data(struct vadc_priv *vadc, struct device_node *node)
  616. {
  617. const struct vadc_channels *vadc_chan;
  618. struct iio_chan_spec *iio_chan;
  619. struct vadc_channel_prop prop;
  620. struct device_node *child;
  621. unsigned int index = 0;
  622. int ret;
  623. vadc->nchannels = of_get_available_child_count(node);
  624. if (!vadc->nchannels)
  625. return -EINVAL;
  626. vadc->iio_chans = devm_kcalloc(vadc->dev, vadc->nchannels,
  627. sizeof(*vadc->iio_chans), GFP_KERNEL);
  628. if (!vadc->iio_chans)
  629. return -ENOMEM;
  630. vadc->chan_props = devm_kcalloc(vadc->dev, vadc->nchannels,
  631. sizeof(*vadc->chan_props), GFP_KERNEL);
  632. if (!vadc->chan_props)
  633. return -ENOMEM;
  634. iio_chan = vadc->iio_chans;
  635. for_each_available_child_of_node(node, child) {
  636. ret = vadc_get_dt_channel_data(vadc->dev, &prop, child);
  637. if (ret) {
  638. of_node_put(child);
  639. return ret;
  640. }
  641. prop.scale_fn_type = vadc_chans[prop.channel].scale_fn_type;
  642. vadc->chan_props[index] = prop;
  643. vadc_chan = &vadc_chans[prop.channel];
  644. iio_chan->channel = prop.channel;
  645. iio_chan->datasheet_name = vadc_chan->datasheet_name;
  646. iio_chan->info_mask_separate = vadc_chan->info_mask;
  647. iio_chan->type = vadc_chan->type;
  648. iio_chan->indexed = 1;
  649. iio_chan->address = index++;
  650. iio_chan++;
  651. }
  652. /* These channels are mandatory, they are used as reference points */
  653. if (!vadc_get_channel(vadc, VADC_REF_1250MV)) {
  654. dev_err(vadc->dev, "Please define 1.25V channel\n");
  655. return -ENODEV;
  656. }
  657. if (!vadc_get_channel(vadc, VADC_REF_625MV)) {
  658. dev_err(vadc->dev, "Please define 0.625V channel\n");
  659. return -ENODEV;
  660. }
  661. if (!vadc_get_channel(vadc, VADC_VDD_VADC)) {
  662. dev_err(vadc->dev, "Please define VDD channel\n");
  663. return -ENODEV;
  664. }
  665. if (!vadc_get_channel(vadc, VADC_GND_REF)) {
  666. dev_err(vadc->dev, "Please define GND channel\n");
  667. return -ENODEV;
  668. }
  669. return 0;
  670. }
  671. static irqreturn_t vadc_isr(int irq, void *dev_id)
  672. {
  673. struct vadc_priv *vadc = dev_id;
  674. complete(&vadc->complete);
  675. return IRQ_HANDLED;
  676. }
  677. static int vadc_check_revision(struct vadc_priv *vadc)
  678. {
  679. u8 val;
  680. int ret;
  681. ret = vadc_read(vadc, VADC_PERPH_TYPE, &val);
  682. if (ret)
  683. return ret;
  684. if (val < VADC_PERPH_TYPE_ADC) {
  685. dev_err(vadc->dev, "%d is not ADC\n", val);
  686. return -ENODEV;
  687. }
  688. ret = vadc_read(vadc, VADC_PERPH_SUBTYPE, &val);
  689. if (ret)
  690. return ret;
  691. if (val < VADC_PERPH_SUBTYPE_VADC) {
  692. dev_err(vadc->dev, "%d is not VADC\n", val);
  693. return -ENODEV;
  694. }
  695. ret = vadc_read(vadc, VADC_REVISION2, &val);
  696. if (ret)
  697. return ret;
  698. if (val < VADC_REVISION2_SUPPORTED_VADC) {
  699. dev_err(vadc->dev, "revision %d not supported\n", val);
  700. return -ENODEV;
  701. }
  702. return 0;
  703. }
  704. static int vadc_probe(struct platform_device *pdev)
  705. {
  706. struct device_node *node = pdev->dev.of_node;
  707. struct device *dev = &pdev->dev;
  708. struct iio_dev *indio_dev;
  709. struct vadc_priv *vadc;
  710. struct regmap *regmap;
  711. int ret, irq_eoc;
  712. u32 reg;
  713. regmap = dev_get_regmap(dev->parent, NULL);
  714. if (!regmap)
  715. return -ENODEV;
  716. ret = of_property_read_u32(node, "reg", &reg);
  717. if (ret < 0)
  718. return ret;
  719. indio_dev = devm_iio_device_alloc(dev, sizeof(*vadc));
  720. if (!indio_dev)
  721. return -ENOMEM;
  722. vadc = iio_priv(indio_dev);
  723. vadc->regmap = regmap;
  724. vadc->dev = dev;
  725. vadc->base = reg;
  726. vadc->are_ref_measured = false;
  727. init_completion(&vadc->complete);
  728. mutex_init(&vadc->lock);
  729. ret = vadc_check_revision(vadc);
  730. if (ret)
  731. return ret;
  732. ret = vadc_get_dt_data(vadc, node);
  733. if (ret)
  734. return ret;
  735. irq_eoc = platform_get_irq(pdev, 0);
  736. if (irq_eoc < 0) {
  737. if (irq_eoc == -EPROBE_DEFER || irq_eoc == -EINVAL)
  738. return irq_eoc;
  739. vadc->poll_eoc = true;
  740. } else {
  741. ret = devm_request_irq(dev, irq_eoc, vadc_isr, 0,
  742. "spmi-vadc", vadc);
  743. if (ret)
  744. return ret;
  745. }
  746. ret = vadc_reset(vadc);
  747. if (ret) {
  748. dev_err(dev, "reset failed\n");
  749. return ret;
  750. }
  751. ret = vadc_measure_ref_points(vadc);
  752. if (ret)
  753. return ret;
  754. indio_dev->dev.parent = dev;
  755. indio_dev->dev.of_node = node;
  756. indio_dev->name = pdev->name;
  757. indio_dev->modes = INDIO_DIRECT_MODE;
  758. indio_dev->info = &vadc_info;
  759. indio_dev->channels = vadc->iio_chans;
  760. indio_dev->num_channels = vadc->nchannels;
  761. return devm_iio_device_register(dev, indio_dev);
  762. }
  763. static const struct of_device_id vadc_match_table[] = {
  764. { .compatible = "qcom,spmi-vadc" },
  765. { }
  766. };
  767. MODULE_DEVICE_TABLE(of, vadc_match_table);
  768. static struct platform_driver vadc_driver = {
  769. .driver = {
  770. .name = "qcom-spmi-vadc",
  771. .of_match_table = vadc_match_table,
  772. },
  773. .probe = vadc_probe,
  774. };
  775. module_platform_driver(vadc_driver);
  776. MODULE_ALIAS("platform:qcom-spmi-vadc");
  777. MODULE_DESCRIPTION("Qualcomm SPMI PMIC voltage ADC driver");
  778. MODULE_LICENSE("GPL v2");
  779. MODULE_AUTHOR("Stanimir Varbanov <svarbanov@mm-sol.com>");
  780. MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");