qcom-spmi-adc5.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2018, 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/iio.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/kernel.h>
  12. #include <linux/log2.h>
  13. #include <linux/math64.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/regmap.h>
  18. #include <linux/slab.h>
  19. #include <dt-bindings/iio/qcom,spmi-vadc.h>
  20. #include "qcom-vadc-common.h"
  21. #define ADC5_USR_REVISION1 0x0
  22. #define ADC5_USR_STATUS1 0x8
  23. #define ADC5_USR_STATUS1_REQ_STS BIT(1)
  24. #define ADC5_USR_STATUS1_EOC BIT(0)
  25. #define ADC5_USR_STATUS1_REQ_STS_EOC_MASK 0x3
  26. #define ADC5_USR_STATUS2 0x9
  27. #define ADC5_USR_STATUS2_CONV_SEQ_MASK 0x70
  28. #define ADC5_USR_STATUS2_CONV_SEQ_MASK_SHIFT 0x5
  29. #define ADC5_USR_IBAT_MEAS 0xf
  30. #define ADC5_USR_IBAT_MEAS_SUPPORTED BIT(0)
  31. #define ADC5_USR_DIG_PARAM 0x42
  32. #define ADC5_USR_DIG_PARAM_CAL_VAL BIT(6)
  33. #define ADC5_USR_DIG_PARAM_CAL_VAL_SHIFT 6
  34. #define ADC5_USR_DIG_PARAM_CAL_SEL 0x30
  35. #define ADC5_USR_DIG_PARAM_CAL_SEL_SHIFT 4
  36. #define ADC5_USR_DIG_PARAM_DEC_RATIO_SEL 0xc
  37. #define ADC5_USR_DIG_PARAM_DEC_RATIO_SEL_SHIFT 2
  38. #define ADC5_USR_FAST_AVG_CTL 0x43
  39. #define ADC5_USR_FAST_AVG_CTL_EN BIT(7)
  40. #define ADC5_USR_FAST_AVG_CTL_SAMPLES_MASK 0x7
  41. #define ADC5_USR_CH_SEL_CTL 0x44
  42. #define ADC5_USR_DELAY_CTL 0x45
  43. #define ADC5_USR_HW_SETTLE_DELAY_MASK 0xf
  44. #define ADC5_USR_EN_CTL1 0x46
  45. #define ADC5_USR_EN_CTL1_ADC_EN BIT(7)
  46. #define ADC5_USR_CONV_REQ 0x47
  47. #define ADC5_USR_CONV_REQ_REQ BIT(7)
  48. #define ADC5_USR_DATA0 0x50
  49. #define ADC5_USR_DATA1 0x51
  50. #define ADC5_USR_IBAT_DATA0 0x52
  51. #define ADC5_USR_IBAT_DATA1 0x53
  52. /*
  53. * Conversion time varies based on the decimation, clock rate, fast average
  54. * samples and measurements queued across different VADC peripherals.
  55. * Set the timeout to a max of 100ms.
  56. */
  57. #define ADC5_CONV_TIME_MIN_US 263
  58. #define ADC5_CONV_TIME_MAX_US 264
  59. #define ADC5_CONV_TIME_RETRY 400
  60. #define ADC5_CONV_TIMEOUT msecs_to_jiffies(100)
  61. /* Digital version >= 5.3 supports hw_settle_2 */
  62. #define ADC5_HW_SETTLE_DIFF_MINOR 3
  63. #define ADC5_HW_SETTLE_DIFF_MAJOR 5
  64. enum adc5_cal_method {
  65. ADC5_NO_CAL = 0,
  66. ADC5_RATIOMETRIC_CAL,
  67. ADC5_ABSOLUTE_CAL
  68. };
  69. enum adc5_cal_val {
  70. ADC5_TIMER_CAL = 0,
  71. ADC5_NEW_CAL
  72. };
  73. /**
  74. * struct adc5_channel_prop - ADC channel property.
  75. * @channel: channel number, refer to the channel list.
  76. * @cal_method: calibration method.
  77. * @cal_val: calibration value
  78. * @decimation: sampling rate supported for the channel.
  79. * @prescale: channel scaling performed on the input signal.
  80. * @hw_settle_time: the time between AMUX being configured and the
  81. * start of conversion.
  82. * @avg_samples: ability to provide single result from the ADC
  83. * that is an average of multiple measurements.
  84. * @scale_fn_type: Represents the scaling function to convert voltage
  85. * physical units desired by the client for the channel.
  86. * @datasheet_name: Channel name used in device tree.
  87. */
  88. struct adc5_channel_prop {
  89. unsigned int channel;
  90. enum adc5_cal_method cal_method;
  91. enum adc5_cal_val cal_val;
  92. unsigned int decimation;
  93. unsigned int prescale;
  94. unsigned int hw_settle_time;
  95. unsigned int avg_samples;
  96. enum vadc_scale_fn_type scale_fn_type;
  97. const char *datasheet_name;
  98. };
  99. /**
  100. * struct adc5_chip - ADC private structure.
  101. * @regmap: SPMI ADC5 peripheral register map field.
  102. * @dev: SPMI ADC5 device.
  103. * @base: base address for the ADC peripheral.
  104. * @nchannels: number of ADC channels.
  105. * @chan_props: array of ADC channel properties.
  106. * @iio_chans: array of IIO channels specification.
  107. * @poll_eoc: use polling instead of interrupt.
  108. * @complete: ADC result notification after interrupt is received.
  109. * @lock: ADC lock for access to the peripheral.
  110. * @data: software configuration data.
  111. */
  112. struct adc5_chip {
  113. struct regmap *regmap;
  114. struct device *dev;
  115. u16 base;
  116. unsigned int nchannels;
  117. struct adc5_channel_prop *chan_props;
  118. struct iio_chan_spec *iio_chans;
  119. bool poll_eoc;
  120. struct completion complete;
  121. struct mutex lock;
  122. const struct adc5_data *data;
  123. };
  124. static const struct vadc_prescale_ratio adc5_prescale_ratios[] = {
  125. {.num = 1, .den = 1},
  126. {.num = 1, .den = 3},
  127. {.num = 1, .den = 4},
  128. {.num = 1, .den = 6},
  129. {.num = 1, .den = 20},
  130. {.num = 1, .den = 8},
  131. {.num = 10, .den = 81},
  132. {.num = 1, .den = 10},
  133. {.num = 1, .den = 16}
  134. };
  135. static int adc5_read(struct adc5_chip *adc, u16 offset, u8 *data, int len)
  136. {
  137. return regmap_bulk_read(adc->regmap, adc->base + offset, data, len);
  138. }
  139. static int adc5_write(struct adc5_chip *adc, u16 offset, u8 *data, int len)
  140. {
  141. return regmap_bulk_write(adc->regmap, adc->base + offset, data, len);
  142. }
  143. static int adc5_prescaling_from_dt(u32 num, u32 den)
  144. {
  145. unsigned int pre;
  146. for (pre = 0; pre < ARRAY_SIZE(adc5_prescale_ratios); pre++)
  147. if (adc5_prescale_ratios[pre].num == num &&
  148. adc5_prescale_ratios[pre].den == den)
  149. break;
  150. if (pre == ARRAY_SIZE(adc5_prescale_ratios))
  151. return -EINVAL;
  152. return pre;
  153. }
  154. static int adc5_hw_settle_time_from_dt(u32 value,
  155. const unsigned int *hw_settle)
  156. {
  157. unsigned int i;
  158. for (i = 0; i < VADC_HW_SETTLE_SAMPLES_MAX; i++) {
  159. if (value == hw_settle[i])
  160. return i;
  161. }
  162. return -EINVAL;
  163. }
  164. static int adc5_avg_samples_from_dt(u32 value)
  165. {
  166. if (!is_power_of_2(value) || value > ADC5_AVG_SAMPLES_MAX)
  167. return -EINVAL;
  168. return __ffs(value);
  169. }
  170. static int adc5_decimation_from_dt(u32 value,
  171. const unsigned int *decimation)
  172. {
  173. unsigned int i;
  174. for (i = 0; i < ADC5_DECIMATION_SAMPLES_MAX; i++) {
  175. if (value == decimation[i])
  176. return i;
  177. }
  178. return -EINVAL;
  179. }
  180. static int adc5_read_voltage_data(struct adc5_chip *adc, u16 *data)
  181. {
  182. int ret;
  183. u8 rslt_lsb, rslt_msb;
  184. ret = adc5_read(adc, ADC5_USR_DATA0, &rslt_lsb, sizeof(rslt_lsb));
  185. if (ret)
  186. return ret;
  187. ret = adc5_read(adc, ADC5_USR_DATA1, &rslt_msb, sizeof(rslt_lsb));
  188. if (ret)
  189. return ret;
  190. *data = (rslt_msb << 8) | rslt_lsb;
  191. if (*data == ADC5_USR_DATA_CHECK) {
  192. pr_err("Invalid data:0x%x\n", *data);
  193. return -EINVAL;
  194. }
  195. pr_debug("voltage raw code:0x%x\n", *data);
  196. return 0;
  197. }
  198. static int adc5_poll_wait_eoc(struct adc5_chip *adc)
  199. {
  200. unsigned int count, retry = ADC5_CONV_TIME_RETRY;
  201. u8 status1;
  202. int ret;
  203. for (count = 0; count < retry; count++) {
  204. ret = adc5_read(adc, ADC5_USR_STATUS1, &status1,
  205. sizeof(status1));
  206. if (ret)
  207. return ret;
  208. status1 &= ADC5_USR_STATUS1_REQ_STS_EOC_MASK;
  209. if (status1 == ADC5_USR_STATUS1_EOC)
  210. return 0;
  211. usleep_range(ADC5_CONV_TIME_MIN_US, ADC5_CONV_TIME_MAX_US);
  212. }
  213. return -ETIMEDOUT;
  214. }
  215. static void adc5_update_dig_param(struct adc5_chip *adc,
  216. struct adc5_channel_prop *prop, u8 *data)
  217. {
  218. /* Update calibration value */
  219. *data &= ~ADC5_USR_DIG_PARAM_CAL_VAL;
  220. *data |= (prop->cal_val << ADC5_USR_DIG_PARAM_CAL_VAL_SHIFT);
  221. /* Update calibration select */
  222. *data &= ~ADC5_USR_DIG_PARAM_CAL_SEL;
  223. *data |= (prop->cal_method << ADC5_USR_DIG_PARAM_CAL_SEL_SHIFT);
  224. /* Update decimation ratio select */
  225. *data &= ~ADC5_USR_DIG_PARAM_DEC_RATIO_SEL;
  226. *data |= (prop->decimation << ADC5_USR_DIG_PARAM_DEC_RATIO_SEL_SHIFT);
  227. }
  228. static int adc5_configure(struct adc5_chip *adc,
  229. struct adc5_channel_prop *prop)
  230. {
  231. int ret;
  232. u8 buf[6];
  233. /* Read registers 0x42 through 0x46 */
  234. ret = adc5_read(adc, ADC5_USR_DIG_PARAM, buf, sizeof(buf));
  235. if (ret < 0)
  236. return ret;
  237. /* Digital param selection */
  238. adc5_update_dig_param(adc, prop, &buf[0]);
  239. /* Update fast average sample value */
  240. buf[1] &= (u8) ~ADC5_USR_FAST_AVG_CTL_SAMPLES_MASK;
  241. buf[1] |= prop->avg_samples;
  242. /* Select ADC channel */
  243. buf[2] = prop->channel;
  244. /* Select HW settle delay for channel */
  245. buf[3] &= (u8) ~ADC5_USR_HW_SETTLE_DELAY_MASK;
  246. buf[3] |= prop->hw_settle_time;
  247. /* Select ADC enable */
  248. buf[4] |= ADC5_USR_EN_CTL1_ADC_EN;
  249. /* Select CONV request */
  250. buf[5] |= ADC5_USR_CONV_REQ_REQ;
  251. if (!adc->poll_eoc)
  252. reinit_completion(&adc->complete);
  253. return adc5_write(adc, ADC5_USR_DIG_PARAM, buf, sizeof(buf));
  254. }
  255. static int adc5_do_conversion(struct adc5_chip *adc,
  256. struct adc5_channel_prop *prop,
  257. struct iio_chan_spec const *chan,
  258. u16 *data_volt, u16 *data_cur)
  259. {
  260. int ret;
  261. mutex_lock(&adc->lock);
  262. ret = adc5_configure(adc, prop);
  263. if (ret) {
  264. pr_err("ADC configure failed with %d\n", ret);
  265. goto unlock;
  266. }
  267. if (adc->poll_eoc) {
  268. ret = adc5_poll_wait_eoc(adc);
  269. if (ret < 0) {
  270. pr_err("EOC bit not set\n");
  271. goto unlock;
  272. }
  273. } else {
  274. ret = wait_for_completion_timeout(&adc->complete,
  275. ADC5_CONV_TIMEOUT);
  276. if (!ret) {
  277. pr_debug("Did not get completion timeout.\n");
  278. ret = adc5_poll_wait_eoc(adc);
  279. if (ret < 0) {
  280. pr_err("EOC bit not set\n");
  281. goto unlock;
  282. }
  283. }
  284. }
  285. ret = adc5_read_voltage_data(adc, data_volt);
  286. unlock:
  287. mutex_unlock(&adc->lock);
  288. return ret;
  289. }
  290. static irqreturn_t adc5_isr(int irq, void *dev_id)
  291. {
  292. struct adc5_chip *adc = dev_id;
  293. complete(&adc->complete);
  294. return IRQ_HANDLED;
  295. }
  296. static int adc5_of_xlate(struct iio_dev *indio_dev,
  297. const struct of_phandle_args *iiospec)
  298. {
  299. struct adc5_chip *adc = iio_priv(indio_dev);
  300. int i;
  301. for (i = 0; i < adc->nchannels; i++)
  302. if (adc->chan_props[i].channel == iiospec->args[0])
  303. return i;
  304. return -EINVAL;
  305. }
  306. static int adc5_read_raw(struct iio_dev *indio_dev,
  307. struct iio_chan_spec const *chan, int *val, int *val2,
  308. long mask)
  309. {
  310. struct adc5_chip *adc = iio_priv(indio_dev);
  311. struct adc5_channel_prop *prop;
  312. u16 adc_code_volt, adc_code_cur;
  313. int ret;
  314. prop = &adc->chan_props[chan->address];
  315. switch (mask) {
  316. case IIO_CHAN_INFO_PROCESSED:
  317. ret = adc5_do_conversion(adc, prop, chan,
  318. &adc_code_volt, &adc_code_cur);
  319. if (ret)
  320. return ret;
  321. ret = qcom_adc5_hw_scale(prop->scale_fn_type,
  322. &adc5_prescale_ratios[prop->prescale],
  323. adc->data,
  324. adc_code_volt, val);
  325. if (ret)
  326. return ret;
  327. return IIO_VAL_INT;
  328. default:
  329. return -EINVAL;
  330. }
  331. return 0;
  332. }
  333. static const struct iio_info adc5_info = {
  334. .read_raw = adc5_read_raw,
  335. .of_xlate = adc5_of_xlate,
  336. };
  337. struct adc5_channels {
  338. const char *datasheet_name;
  339. unsigned int prescale_index;
  340. enum iio_chan_type type;
  341. long info_mask;
  342. enum vadc_scale_fn_type scale_fn_type;
  343. };
  344. #define ADC5_CHAN(_dname, _type, _mask, _pre, _scale) \
  345. { \
  346. .datasheet_name = _dname, \
  347. .prescale_index = _pre, \
  348. .type = _type, \
  349. .info_mask = _mask, \
  350. .scale_fn_type = _scale, \
  351. }, \
  352. #define ADC5_CHAN_TEMP(_dname, _pre, _scale) \
  353. ADC5_CHAN(_dname, IIO_TEMP, \
  354. BIT(IIO_CHAN_INFO_PROCESSED), \
  355. _pre, _scale) \
  356. #define ADC5_CHAN_VOLT(_dname, _pre, _scale) \
  357. ADC5_CHAN(_dname, IIO_VOLTAGE, \
  358. BIT(IIO_CHAN_INFO_PROCESSED), \
  359. _pre, _scale) \
  360. static const struct adc5_channels adc5_chans_pmic[ADC5_MAX_CHANNEL] = {
  361. [ADC5_REF_GND] = ADC5_CHAN_VOLT("ref_gnd", 1,
  362. SCALE_HW_CALIB_DEFAULT)
  363. [ADC5_1P25VREF] = ADC5_CHAN_VOLT("vref_1p25", 1,
  364. SCALE_HW_CALIB_DEFAULT)
  365. [ADC5_VPH_PWR] = ADC5_CHAN_VOLT("vph_pwr", 3,
  366. SCALE_HW_CALIB_DEFAULT)
  367. [ADC5_VBAT_SNS] = ADC5_CHAN_VOLT("vbat_sns", 3,
  368. SCALE_HW_CALIB_DEFAULT)
  369. [ADC5_DIE_TEMP] = ADC5_CHAN_TEMP("die_temp", 1,
  370. SCALE_HW_CALIB_PMIC_THERM)
  371. [ADC5_USB_IN_I] = ADC5_CHAN_VOLT("usb_in_i_uv", 1,
  372. SCALE_HW_CALIB_DEFAULT)
  373. [ADC5_USB_IN_V_16] = ADC5_CHAN_VOLT("usb_in_v_div_16", 16,
  374. SCALE_HW_CALIB_DEFAULT)
  375. [ADC5_CHG_TEMP] = ADC5_CHAN_TEMP("chg_temp", 1,
  376. SCALE_HW_CALIB_PM5_CHG_TEMP)
  377. /* Charger prescales SBUx and MID_CHG to fit within 1.8V upper unit */
  378. [ADC5_SBUx] = ADC5_CHAN_VOLT("chg_sbux", 3,
  379. SCALE_HW_CALIB_DEFAULT)
  380. [ADC5_MID_CHG_DIV6] = ADC5_CHAN_VOLT("chg_mid_chg", 6,
  381. SCALE_HW_CALIB_DEFAULT)
  382. [ADC5_XO_THERM_100K_PU] = ADC5_CHAN_TEMP("xo_therm", 1,
  383. SCALE_HW_CALIB_XOTHERM)
  384. [ADC5_AMUX_THM1_100K_PU] = ADC5_CHAN_TEMP("amux_thm1_100k_pu", 1,
  385. SCALE_HW_CALIB_THERM_100K_PULLUP)
  386. [ADC5_AMUX_THM2_100K_PU] = ADC5_CHAN_TEMP("amux_thm2_100k_pu", 1,
  387. SCALE_HW_CALIB_THERM_100K_PULLUP)
  388. [ADC5_AMUX_THM3_100K_PU] = ADC5_CHAN_TEMP("amux_thm3_100k_pu", 1,
  389. SCALE_HW_CALIB_THERM_100K_PULLUP)
  390. [ADC5_AMUX_THM2] = ADC5_CHAN_TEMP("amux_thm2", 1,
  391. SCALE_HW_CALIB_PM5_SMB_TEMP)
  392. };
  393. static const struct adc5_channels adc5_chans_rev2[ADC5_MAX_CHANNEL] = {
  394. [ADC5_REF_GND] = ADC5_CHAN_VOLT("ref_gnd", 1,
  395. SCALE_HW_CALIB_DEFAULT)
  396. [ADC5_1P25VREF] = ADC5_CHAN_VOLT("vref_1p25", 1,
  397. SCALE_HW_CALIB_DEFAULT)
  398. [ADC5_VPH_PWR] = ADC5_CHAN_VOLT("vph_pwr", 3,
  399. SCALE_HW_CALIB_DEFAULT)
  400. [ADC5_VBAT_SNS] = ADC5_CHAN_VOLT("vbat_sns", 3,
  401. SCALE_HW_CALIB_DEFAULT)
  402. [ADC5_VCOIN] = ADC5_CHAN_VOLT("vcoin", 3,
  403. SCALE_HW_CALIB_DEFAULT)
  404. [ADC5_DIE_TEMP] = ADC5_CHAN_TEMP("die_temp", 1,
  405. SCALE_HW_CALIB_PMIC_THERM)
  406. [ADC5_AMUX_THM1_100K_PU] = ADC5_CHAN_TEMP("amux_thm1_100k_pu", 1,
  407. SCALE_HW_CALIB_THERM_100K_PULLUP)
  408. [ADC5_AMUX_THM2_100K_PU] = ADC5_CHAN_TEMP("amux_thm2_100k_pu", 1,
  409. SCALE_HW_CALIB_THERM_100K_PULLUP)
  410. [ADC5_AMUX_THM3_100K_PU] = ADC5_CHAN_TEMP("amux_thm3_100k_pu", 1,
  411. SCALE_HW_CALIB_THERM_100K_PULLUP)
  412. [ADC5_AMUX_THM4_100K_PU] = ADC5_CHAN_TEMP("amux_thm4_100k_pu", 1,
  413. SCALE_HW_CALIB_THERM_100K_PULLUP)
  414. [ADC5_AMUX_THM5_100K_PU] = ADC5_CHAN_TEMP("amux_thm5_100k_pu", 1,
  415. SCALE_HW_CALIB_THERM_100K_PULLUP)
  416. [ADC5_XO_THERM_100K_PU] = ADC5_CHAN_TEMP("xo_therm_100k_pu", 1,
  417. SCALE_HW_CALIB_THERM_100K_PULLUP)
  418. };
  419. static int adc5_get_dt_channel_data(struct adc5_chip *adc,
  420. struct adc5_channel_prop *prop,
  421. struct device_node *node,
  422. const struct adc5_data *data)
  423. {
  424. const char *name = node->name, *channel_name;
  425. u32 chan, value, varr[2];
  426. int ret;
  427. struct device *dev = adc->dev;
  428. ret = of_property_read_u32(node, "reg", &chan);
  429. if (ret) {
  430. dev_err(dev, "invalid channel number %s\n", name);
  431. return ret;
  432. }
  433. if (chan > ADC5_PARALLEL_ISENSE_VBAT_IDATA ||
  434. !data->adc_chans[chan].datasheet_name) {
  435. dev_err(dev, "%s invalid channel number %d\n", name, chan);
  436. return -EINVAL;
  437. }
  438. /* the channel has DT description */
  439. prop->channel = chan;
  440. channel_name = of_get_property(node,
  441. "label", NULL) ? : node->name;
  442. if (!channel_name) {
  443. pr_err("Invalid channel name\n");
  444. return -EINVAL;
  445. }
  446. prop->datasheet_name = channel_name;
  447. ret = of_property_read_u32(node, "qcom,decimation", &value);
  448. if (!ret) {
  449. ret = adc5_decimation_from_dt(value, data->decimation);
  450. if (ret < 0) {
  451. dev_err(dev, "%02x invalid decimation %d\n",
  452. chan, value);
  453. return ret;
  454. }
  455. prop->decimation = ret;
  456. } else {
  457. prop->decimation = ADC5_DECIMATION_DEFAULT;
  458. }
  459. ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2);
  460. if (!ret) {
  461. ret = adc5_prescaling_from_dt(varr[0], varr[1]);
  462. if (ret < 0) {
  463. dev_err(dev, "%02x invalid pre-scaling <%d %d>\n",
  464. chan, varr[0], varr[1]);
  465. return ret;
  466. }
  467. prop->prescale = ret;
  468. }
  469. ret = of_property_read_u32(node, "qcom,hw-settle-time", &value);
  470. if (!ret) {
  471. u8 dig_version[2];
  472. ret = adc5_read(adc, ADC5_USR_REVISION1, dig_version,
  473. sizeof(dig_version));
  474. if (ret < 0) {
  475. dev_err(dev, "Invalid dig version read %d\n", ret);
  476. return ret;
  477. }
  478. pr_debug("dig_ver:minor:%d, major:%d\n", dig_version[0],
  479. dig_version[1]);
  480. /* Digital controller >= 5.3 have hw_settle_2 option */
  481. if (dig_version[0] >= ADC5_HW_SETTLE_DIFF_MINOR &&
  482. dig_version[1] >= ADC5_HW_SETTLE_DIFF_MAJOR)
  483. ret = adc5_hw_settle_time_from_dt(value,
  484. data->hw_settle_2);
  485. else
  486. ret = adc5_hw_settle_time_from_dt(value,
  487. data->hw_settle_1);
  488. if (ret < 0) {
  489. dev_err(dev, "%02x invalid hw-settle-time %d us\n",
  490. chan, value);
  491. return ret;
  492. }
  493. prop->hw_settle_time = ret;
  494. } else {
  495. prop->hw_settle_time = VADC_DEF_HW_SETTLE_TIME;
  496. }
  497. ret = of_property_read_u32(node, "qcom,avg-samples", &value);
  498. if (!ret) {
  499. ret = adc5_avg_samples_from_dt(value);
  500. if (ret < 0) {
  501. dev_err(dev, "%02x invalid avg-samples %d\n",
  502. chan, value);
  503. return ret;
  504. }
  505. prop->avg_samples = ret;
  506. } else {
  507. prop->avg_samples = VADC_DEF_AVG_SAMPLES;
  508. }
  509. if (of_property_read_bool(node, "qcom,ratiometric"))
  510. prop->cal_method = ADC5_RATIOMETRIC_CAL;
  511. else
  512. prop->cal_method = ADC5_ABSOLUTE_CAL;
  513. /*
  514. * Default to using timer calibration. Using a fresh calibration value
  515. * for every conversion will increase the overall time for a request.
  516. */
  517. prop->cal_val = ADC5_TIMER_CAL;
  518. dev_dbg(dev, "%02x name %s\n", chan, name);
  519. return 0;
  520. }
  521. static const struct adc5_data adc5_data_pmic = {
  522. .full_scale_code_volt = 0x70e4,
  523. .full_scale_code_cur = 0x2710,
  524. .adc_chans = adc5_chans_pmic,
  525. .decimation = (unsigned int [ADC5_DECIMATION_SAMPLES_MAX])
  526. {250, 420, 840},
  527. .hw_settle_1 = (unsigned int [VADC_HW_SETTLE_SAMPLES_MAX])
  528. {15, 100, 200, 300, 400, 500, 600, 700,
  529. 800, 900, 1, 2, 4, 6, 8, 10},
  530. .hw_settle_2 = (unsigned int [VADC_HW_SETTLE_SAMPLES_MAX])
  531. {15, 100, 200, 300, 400, 500, 600, 700,
  532. 1, 2, 4, 8, 16, 32, 64, 128},
  533. };
  534. static const struct adc5_data adc5_data_pmic_rev2 = {
  535. .full_scale_code_volt = 0x4000,
  536. .full_scale_code_cur = 0x1800,
  537. .adc_chans = adc5_chans_rev2,
  538. .decimation = (unsigned int [ADC5_DECIMATION_SAMPLES_MAX])
  539. {256, 512, 1024},
  540. .hw_settle_1 = (unsigned int [VADC_HW_SETTLE_SAMPLES_MAX])
  541. {0, 100, 200, 300, 400, 500, 600, 700,
  542. 800, 900, 1, 2, 4, 6, 8, 10},
  543. .hw_settle_2 = (unsigned int [VADC_HW_SETTLE_SAMPLES_MAX])
  544. {15, 100, 200, 300, 400, 500, 600, 700,
  545. 1, 2, 4, 8, 16, 32, 64, 128},
  546. };
  547. static const struct of_device_id adc5_match_table[] = {
  548. {
  549. .compatible = "qcom,spmi-adc5",
  550. .data = &adc5_data_pmic,
  551. },
  552. {
  553. .compatible = "qcom,spmi-adc-rev2",
  554. .data = &adc5_data_pmic_rev2,
  555. },
  556. { }
  557. };
  558. static int adc5_get_dt_data(struct adc5_chip *adc, struct device_node *node)
  559. {
  560. const struct adc5_channels *adc_chan;
  561. struct iio_chan_spec *iio_chan;
  562. struct adc5_channel_prop prop, *chan_props;
  563. struct device_node *child;
  564. unsigned int index = 0;
  565. const struct of_device_id *id;
  566. const struct adc5_data *data;
  567. int ret;
  568. adc->nchannels = of_get_available_child_count(node);
  569. if (!adc->nchannels)
  570. return -EINVAL;
  571. adc->iio_chans = devm_kcalloc(adc->dev, adc->nchannels,
  572. sizeof(*adc->iio_chans), GFP_KERNEL);
  573. if (!adc->iio_chans)
  574. return -ENOMEM;
  575. adc->chan_props = devm_kcalloc(adc->dev, adc->nchannels,
  576. sizeof(*adc->chan_props), GFP_KERNEL);
  577. if (!adc->chan_props)
  578. return -ENOMEM;
  579. chan_props = adc->chan_props;
  580. iio_chan = adc->iio_chans;
  581. id = of_match_node(adc5_match_table, node);
  582. if (id)
  583. data = id->data;
  584. else
  585. data = &adc5_data_pmic;
  586. adc->data = data;
  587. for_each_available_child_of_node(node, child) {
  588. ret = adc5_get_dt_channel_data(adc, &prop, child, data);
  589. if (ret) {
  590. of_node_put(child);
  591. return ret;
  592. }
  593. prop.scale_fn_type =
  594. data->adc_chans[prop.channel].scale_fn_type;
  595. *chan_props = prop;
  596. adc_chan = &data->adc_chans[prop.channel];
  597. iio_chan->channel = prop.channel;
  598. iio_chan->datasheet_name = prop.datasheet_name;
  599. iio_chan->extend_name = prop.datasheet_name;
  600. iio_chan->info_mask_separate = adc_chan->info_mask;
  601. iio_chan->type = adc_chan->type;
  602. iio_chan->address = index;
  603. iio_chan++;
  604. chan_props++;
  605. index++;
  606. }
  607. return 0;
  608. }
  609. static int adc5_probe(struct platform_device *pdev)
  610. {
  611. struct device_node *node = pdev->dev.of_node;
  612. struct device *dev = &pdev->dev;
  613. struct iio_dev *indio_dev;
  614. struct adc5_chip *adc;
  615. struct regmap *regmap;
  616. int ret, irq_eoc;
  617. u32 reg;
  618. regmap = dev_get_regmap(dev->parent, NULL);
  619. if (!regmap)
  620. return -ENODEV;
  621. ret = of_property_read_u32(node, "reg", &reg);
  622. if (ret < 0)
  623. return ret;
  624. indio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
  625. if (!indio_dev)
  626. return -ENOMEM;
  627. adc = iio_priv(indio_dev);
  628. adc->regmap = regmap;
  629. adc->dev = dev;
  630. adc->base = reg;
  631. init_completion(&adc->complete);
  632. mutex_init(&adc->lock);
  633. ret = adc5_get_dt_data(adc, node);
  634. if (ret) {
  635. pr_err("adc get dt data failed\n");
  636. return ret;
  637. }
  638. irq_eoc = platform_get_irq(pdev, 0);
  639. if (irq_eoc < 0) {
  640. if (irq_eoc == -EPROBE_DEFER || irq_eoc == -EINVAL)
  641. return irq_eoc;
  642. adc->poll_eoc = true;
  643. } else {
  644. ret = devm_request_irq(dev, irq_eoc, adc5_isr, 0,
  645. "pm-adc5", adc);
  646. if (ret)
  647. return ret;
  648. }
  649. indio_dev->dev.parent = dev;
  650. indio_dev->dev.of_node = node;
  651. indio_dev->name = pdev->name;
  652. indio_dev->modes = INDIO_DIRECT_MODE;
  653. indio_dev->info = &adc5_info;
  654. indio_dev->channels = adc->iio_chans;
  655. indio_dev->num_channels = adc->nchannels;
  656. return devm_iio_device_register(dev, indio_dev);
  657. }
  658. static struct platform_driver adc5_driver = {
  659. .driver = {
  660. .name = "qcom-spmi-adc5.c",
  661. .of_match_table = adc5_match_table,
  662. },
  663. .probe = adc5_probe,
  664. };
  665. module_platform_driver(adc5_driver);
  666. MODULE_ALIAS("platform:qcom-spmi-adc5");
  667. MODULE_DESCRIPTION("Qualcomm Technologies Inc. PMIC5 ADC driver");
  668. MODULE_LICENSE("GPL v2");