qcom-spmi-vadc.c 24 KB

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