ad7746.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * AD7746 capacitive sensor driver supporting AD7745, AD7746 and AD7747
  4. *
  5. * Copyright 2011 Analog Devices Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/delay.h>
  9. #include <linux/device.h>
  10. #include <linux/i2c.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/slab.h>
  15. #include <linux/stat.h>
  16. #include <linux/sysfs.h>
  17. #include <linux/unaligned.h>
  18. #include <linux/iio/iio.h>
  19. #include <linux/iio/sysfs.h>
  20. /* AD7746 Register Definition */
  21. #define AD7746_REG_STATUS 0
  22. #define AD7746_REG_CAP_DATA_HIGH 1
  23. #define AD7746_REG_VT_DATA_HIGH 4
  24. #define AD7746_REG_CAP_SETUP 7
  25. #define AD7746_REG_VT_SETUP 8
  26. #define AD7746_REG_EXC_SETUP 9
  27. #define AD7746_REG_CFG 10
  28. #define AD7746_REG_CAPDACA 11
  29. #define AD7746_REG_CAPDACB 12
  30. #define AD7746_REG_CAP_OFFH 13
  31. #define AD7746_REG_CAP_GAINH 15
  32. #define AD7746_REG_VOLT_GAINH 17
  33. /* Status Register Bit Designations (AD7746_REG_STATUS) */
  34. #define AD7746_STATUS_EXCERR BIT(3)
  35. #define AD7746_STATUS_RDY BIT(2)
  36. #define AD7746_STATUS_RDYVT BIT(1)
  37. #define AD7746_STATUS_RDYCAP BIT(0)
  38. /* Capacitive Channel Setup Register Bit Designations (AD7746_REG_CAP_SETUP) */
  39. #define AD7746_CAPSETUP_CAPEN BIT(7)
  40. #define AD7746_CAPSETUP_CIN2 BIT(6) /* AD7746 only */
  41. #define AD7746_CAPSETUP_CAPDIFF BIT(5)
  42. #define AD7746_CAPSETUP_CACHOP BIT(0)
  43. /* Voltage/Temperature Setup Register Bit Designations (AD7746_REG_VT_SETUP) */
  44. #define AD7746_VTSETUP_VTEN BIT(7)
  45. #define AD7746_VTSETUP_VTMD_MASK GENMASK(6, 5)
  46. #define AD7746_VTSETUP_VTMD_INT_TEMP 0
  47. #define AD7746_VTSETUP_VTMD_EXT_TEMP 1
  48. #define AD7746_VTSETUP_VTMD_VDD_MON 2
  49. #define AD7746_VTSETUP_VTMD_EXT_VIN 3
  50. #define AD7746_VTSETUP_EXTREF BIT(4)
  51. #define AD7746_VTSETUP_VTSHORT BIT(1)
  52. #define AD7746_VTSETUP_VTCHOP BIT(0)
  53. /* Excitation Setup Register Bit Designations (AD7746_REG_EXC_SETUP) */
  54. #define AD7746_EXCSETUP_CLKCTRL BIT(7)
  55. #define AD7746_EXCSETUP_EXCON BIT(6)
  56. #define AD7746_EXCSETUP_EXCB BIT(5)
  57. #define AD7746_EXCSETUP_NEXCB BIT(4)
  58. #define AD7746_EXCSETUP_EXCA BIT(3)
  59. #define AD7746_EXCSETUP_NEXCA BIT(2)
  60. #define AD7746_EXCSETUP_EXCLVL_MASK GENMASK(1, 0)
  61. /* Config Register Bit Designations (AD7746_REG_CFG) */
  62. #define AD7746_CONF_VTFS_MASK GENMASK(7, 6)
  63. #define AD7746_CONF_CAPFS_MASK GENMASK(5, 3)
  64. #define AD7746_CONF_MODE_MASK GENMASK(2, 0)
  65. #define AD7746_CONF_MODE_IDLE 0
  66. #define AD7746_CONF_MODE_CONT_CONV 1
  67. #define AD7746_CONF_MODE_SINGLE_CONV 2
  68. #define AD7746_CONF_MODE_PWRDN 3
  69. #define AD7746_CONF_MODE_OFFS_CAL 5
  70. #define AD7746_CONF_MODE_GAIN_CAL 6
  71. /* CAPDAC Register Bit Designations (AD7746_REG_CAPDACx) */
  72. #define AD7746_CAPDAC_DACEN BIT(7)
  73. #define AD7746_CAPDAC_DACP_MASK GENMASK(6, 0)
  74. struct ad7746_chip_info {
  75. struct i2c_client *client;
  76. struct mutex lock; /* protect sensor state */
  77. /*
  78. * Capacitive channel digital filter setup;
  79. * conversion time/update rate setup per channel
  80. */
  81. u8 config;
  82. u8 cap_setup;
  83. u8 vt_setup;
  84. u8 capdac[2][2];
  85. s8 capdac_set;
  86. };
  87. enum ad7746_chan {
  88. VIN,
  89. VIN_VDD,
  90. TEMP_INT,
  91. TEMP_EXT,
  92. CIN1,
  93. CIN1_DIFF,
  94. CIN2,
  95. CIN2_DIFF,
  96. };
  97. struct ad7746_chan_info {
  98. u8 addr;
  99. union {
  100. u8 vtmd;
  101. struct { /* CAP SETUP fields */
  102. unsigned int cin2 : 1;
  103. unsigned int capdiff : 1;
  104. };
  105. };
  106. };
  107. static const struct ad7746_chan_info ad7746_chan_info[] = {
  108. [VIN] = {
  109. .addr = AD7746_REG_VT_DATA_HIGH,
  110. .vtmd = AD7746_VTSETUP_VTMD_EXT_VIN,
  111. },
  112. [VIN_VDD] = {
  113. .addr = AD7746_REG_VT_DATA_HIGH,
  114. .vtmd = AD7746_VTSETUP_VTMD_VDD_MON,
  115. },
  116. [TEMP_INT] = {
  117. .addr = AD7746_REG_VT_DATA_HIGH,
  118. .vtmd = AD7746_VTSETUP_VTMD_INT_TEMP,
  119. },
  120. [TEMP_EXT] = {
  121. .addr = AD7746_REG_VT_DATA_HIGH,
  122. .vtmd = AD7746_VTSETUP_VTMD_EXT_TEMP,
  123. },
  124. [CIN1] = {
  125. .addr = AD7746_REG_CAP_DATA_HIGH,
  126. },
  127. [CIN1_DIFF] = {
  128. .addr = AD7746_REG_CAP_DATA_HIGH,
  129. .capdiff = 1,
  130. },
  131. [CIN2] = {
  132. .addr = AD7746_REG_CAP_DATA_HIGH,
  133. .cin2 = 1,
  134. },
  135. [CIN2_DIFF] = {
  136. .addr = AD7746_REG_CAP_DATA_HIGH,
  137. .cin2 = 1,
  138. .capdiff = 1,
  139. },
  140. };
  141. static const struct iio_chan_spec ad7746_channels[] = {
  142. [VIN] = {
  143. .type = IIO_VOLTAGE,
  144. .indexed = 1,
  145. .channel = 0,
  146. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  147. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  148. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  149. .address = VIN,
  150. },
  151. [VIN_VDD] = {
  152. .type = IIO_VOLTAGE,
  153. .indexed = 1,
  154. .channel = 1,
  155. .extend_name = "supply",
  156. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
  157. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  158. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  159. .address = VIN_VDD,
  160. },
  161. [TEMP_INT] = {
  162. .type = IIO_TEMP,
  163. .indexed = 1,
  164. .channel = 0,
  165. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
  166. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
  167. .address = TEMP_INT,
  168. },
  169. [TEMP_EXT] = {
  170. .type = IIO_TEMP,
  171. .indexed = 1,
  172. .channel = 1,
  173. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
  174. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
  175. .address = TEMP_EXT,
  176. },
  177. [CIN1] = {
  178. .type = IIO_CAPACITANCE,
  179. .indexed = 1,
  180. .channel = 0,
  181. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  182. BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
  183. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
  184. BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
  185. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  186. .address = CIN1,
  187. },
  188. [CIN1_DIFF] = {
  189. .type = IIO_CAPACITANCE,
  190. .differential = 1,
  191. .indexed = 1,
  192. .channel = 0,
  193. .channel2 = 2,
  194. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  195. BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_ZEROPOINT),
  196. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
  197. BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
  198. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  199. .address = CIN1_DIFF,
  200. },
  201. [CIN2] = {
  202. .type = IIO_CAPACITANCE,
  203. .indexed = 1,
  204. .channel = 1,
  205. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  206. BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_OFFSET),
  207. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
  208. BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
  209. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  210. .address = CIN2,
  211. },
  212. [CIN2_DIFF] = {
  213. .type = IIO_CAPACITANCE,
  214. .differential = 1,
  215. .indexed = 1,
  216. .channel = 1,
  217. .channel2 = 3,
  218. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  219. BIT(IIO_CHAN_INFO_CALIBSCALE) | BIT(IIO_CHAN_INFO_ZEROPOINT),
  220. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_CALIBBIAS) |
  221. BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_SAMP_FREQ),
  222. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SAMP_FREQ),
  223. .address = CIN2_DIFF,
  224. }
  225. };
  226. /* Values are Update Rate (Hz), Conversion Time (ms) + 1*/
  227. static const unsigned char ad7746_vt_filter_rate_table[][2] = {
  228. { 50, 20 + 1 }, { 31, 32 + 1 }, { 16, 62 + 1 }, { 8, 122 + 1 },
  229. };
  230. static const unsigned char ad7746_cap_filter_rate_table[][2] = {
  231. { 91, 11 + 1 }, { 84, 12 + 1 }, { 50, 20 + 1 }, { 26, 38 + 1 },
  232. { 16, 62 + 1 }, { 13, 77 + 1 }, { 11, 92 + 1 }, { 9, 110 + 1 },
  233. };
  234. static int ad7746_set_capdac(struct ad7746_chip_info *chip, int channel)
  235. {
  236. int ret = i2c_smbus_write_byte_data(chip->client,
  237. AD7746_REG_CAPDACA,
  238. chip->capdac[channel][0]);
  239. if (ret < 0)
  240. return ret;
  241. return i2c_smbus_write_byte_data(chip->client,
  242. AD7746_REG_CAPDACB,
  243. chip->capdac[channel][1]);
  244. }
  245. static int ad7746_select_channel(struct iio_dev *indio_dev,
  246. struct iio_chan_spec const *chan)
  247. {
  248. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  249. u8 vt_setup, cap_setup;
  250. int ret, delay, idx;
  251. switch (chan->type) {
  252. case IIO_CAPACITANCE:
  253. cap_setup = FIELD_PREP(AD7746_CAPSETUP_CIN2,
  254. ad7746_chan_info[chan->address].cin2) |
  255. FIELD_PREP(AD7746_CAPSETUP_CAPDIFF,
  256. ad7746_chan_info[chan->address].capdiff) |
  257. FIELD_PREP(AD7746_CAPSETUP_CAPEN, 1);
  258. vt_setup = chip->vt_setup & ~AD7746_VTSETUP_VTEN;
  259. idx = FIELD_GET(AD7746_CONF_CAPFS_MASK, chip->config);
  260. delay = ad7746_cap_filter_rate_table[idx][1];
  261. ret = ad7746_set_capdac(chip, chan->channel);
  262. if (ret < 0)
  263. return ret;
  264. chip->capdac_set = chan->channel;
  265. break;
  266. case IIO_VOLTAGE:
  267. case IIO_TEMP:
  268. vt_setup = FIELD_PREP(AD7746_VTSETUP_VTMD_MASK,
  269. ad7746_chan_info[chan->address].vtmd) |
  270. FIELD_PREP(AD7746_VTSETUP_VTEN, 1);
  271. cap_setup = chip->cap_setup & ~AD7746_CAPSETUP_CAPEN;
  272. idx = FIELD_GET(AD7746_CONF_VTFS_MASK, chip->config);
  273. delay = ad7746_cap_filter_rate_table[idx][1];
  274. break;
  275. default:
  276. return -EINVAL;
  277. }
  278. if (chip->cap_setup != cap_setup) {
  279. ret = i2c_smbus_write_byte_data(chip->client,
  280. AD7746_REG_CAP_SETUP,
  281. cap_setup);
  282. if (ret < 0)
  283. return ret;
  284. chip->cap_setup = cap_setup;
  285. }
  286. if (chip->vt_setup != vt_setup) {
  287. ret = i2c_smbus_write_byte_data(chip->client,
  288. AD7746_REG_VT_SETUP,
  289. vt_setup);
  290. if (ret < 0)
  291. return ret;
  292. chip->vt_setup = vt_setup;
  293. }
  294. return delay;
  295. }
  296. static inline ssize_t ad7746_start_calib(struct device *dev,
  297. struct device_attribute *attr,
  298. const char *buf,
  299. size_t len,
  300. u8 regval)
  301. {
  302. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  303. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  304. int ret, timeout = 10;
  305. bool doit;
  306. ret = kstrtobool(buf, &doit);
  307. if (ret < 0)
  308. return ret;
  309. if (!doit)
  310. return 0;
  311. mutex_lock(&chip->lock);
  312. regval |= chip->config;
  313. ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG, regval);
  314. if (ret < 0)
  315. goto unlock;
  316. do {
  317. msleep(20);
  318. ret = i2c_smbus_read_byte_data(chip->client, AD7746_REG_CFG);
  319. if (ret < 0)
  320. goto unlock;
  321. } while ((ret == regval) && timeout--);
  322. mutex_unlock(&chip->lock);
  323. return len;
  324. unlock:
  325. mutex_unlock(&chip->lock);
  326. return ret;
  327. }
  328. static ssize_t ad7746_start_offset_calib(struct device *dev,
  329. struct device_attribute *attr,
  330. const char *buf,
  331. size_t len)
  332. {
  333. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  334. int ret = ad7746_select_channel(indio_dev,
  335. &ad7746_channels[to_iio_dev_attr(attr)->address]);
  336. if (ret < 0)
  337. return ret;
  338. return ad7746_start_calib(dev, attr, buf, len,
  339. FIELD_PREP(AD7746_CONF_MODE_MASK,
  340. AD7746_CONF_MODE_OFFS_CAL));
  341. }
  342. static ssize_t ad7746_start_gain_calib(struct device *dev,
  343. struct device_attribute *attr,
  344. const char *buf,
  345. size_t len)
  346. {
  347. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  348. int ret = ad7746_select_channel(indio_dev,
  349. &ad7746_channels[to_iio_dev_attr(attr)->address]);
  350. if (ret < 0)
  351. return ret;
  352. return ad7746_start_calib(dev, attr, buf, len,
  353. FIELD_PREP(AD7746_CONF_MODE_MASK,
  354. AD7746_CONF_MODE_GAIN_CAL));
  355. }
  356. static IIO_DEVICE_ATTR(in_capacitance0_calibbias_calibration,
  357. 0200, NULL, ad7746_start_offset_calib, CIN1);
  358. static IIO_DEVICE_ATTR(in_capacitance1_calibbias_calibration,
  359. 0200, NULL, ad7746_start_offset_calib, CIN2);
  360. static IIO_DEVICE_ATTR(in_capacitance0_calibscale_calibration,
  361. 0200, NULL, ad7746_start_gain_calib, CIN1);
  362. static IIO_DEVICE_ATTR(in_capacitance1_calibscale_calibration,
  363. 0200, NULL, ad7746_start_gain_calib, CIN2);
  364. static IIO_DEVICE_ATTR(in_voltage0_calibscale_calibration,
  365. 0200, NULL, ad7746_start_gain_calib, VIN);
  366. static int ad7746_store_cap_filter_rate_setup(struct ad7746_chip_info *chip,
  367. int val)
  368. {
  369. int i;
  370. for (i = 0; i < ARRAY_SIZE(ad7746_cap_filter_rate_table); i++)
  371. if (val >= ad7746_cap_filter_rate_table[i][0])
  372. break;
  373. if (i >= ARRAY_SIZE(ad7746_cap_filter_rate_table))
  374. i = ARRAY_SIZE(ad7746_cap_filter_rate_table) - 1;
  375. chip->config &= ~AD7746_CONF_CAPFS_MASK;
  376. chip->config |= FIELD_PREP(AD7746_CONF_CAPFS_MASK, i);
  377. return 0;
  378. }
  379. static int ad7746_store_vt_filter_rate_setup(struct ad7746_chip_info *chip,
  380. int val)
  381. {
  382. int i;
  383. for (i = 0; i < ARRAY_SIZE(ad7746_vt_filter_rate_table); i++)
  384. if (val >= ad7746_vt_filter_rate_table[i][0])
  385. break;
  386. if (i >= ARRAY_SIZE(ad7746_vt_filter_rate_table))
  387. i = ARRAY_SIZE(ad7746_vt_filter_rate_table) - 1;
  388. chip->config &= ~AD7746_CONF_VTFS_MASK;
  389. chip->config |= FIELD_PREP(AD7746_CONF_VTFS_MASK, i);
  390. return 0;
  391. }
  392. static struct attribute *ad7746_attributes[] = {
  393. &iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
  394. &iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
  395. &iio_dev_attr_in_capacitance1_calibscale_calibration.dev_attr.attr,
  396. &iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
  397. &iio_dev_attr_in_voltage0_calibscale_calibration.dev_attr.attr,
  398. NULL,
  399. };
  400. static const struct attribute_group ad7746_attribute_group = {
  401. .attrs = ad7746_attributes,
  402. };
  403. static int ad7746_write_raw(struct iio_dev *indio_dev,
  404. struct iio_chan_spec const *chan,
  405. int val,
  406. int val2,
  407. long mask)
  408. {
  409. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  410. int ret, reg;
  411. switch (mask) {
  412. case IIO_CHAN_INFO_CALIBSCALE:
  413. if (val != 1)
  414. return -EINVAL;
  415. val = (val2 * 1024) / 15625;
  416. switch (chan->type) {
  417. case IIO_CAPACITANCE:
  418. reg = AD7746_REG_CAP_GAINH;
  419. break;
  420. case IIO_VOLTAGE:
  421. reg = AD7746_REG_VOLT_GAINH;
  422. break;
  423. default:
  424. return -EINVAL;
  425. }
  426. mutex_lock(&chip->lock);
  427. ret = i2c_smbus_write_word_swapped(chip->client, reg, val);
  428. mutex_unlock(&chip->lock);
  429. if (ret < 0)
  430. return ret;
  431. return 0;
  432. case IIO_CHAN_INFO_CALIBBIAS:
  433. if (val < 0 || val > 0xFFFF)
  434. return -EINVAL;
  435. mutex_lock(&chip->lock);
  436. ret = i2c_smbus_write_word_swapped(chip->client,
  437. AD7746_REG_CAP_OFFH, val);
  438. mutex_unlock(&chip->lock);
  439. if (ret < 0)
  440. return ret;
  441. return 0;
  442. case IIO_CHAN_INFO_OFFSET:
  443. case IIO_CHAN_INFO_ZEROPOINT:
  444. if (val < 0 || val > 43008000) /* 21pF */
  445. return -EINVAL;
  446. /*
  447. * CAPDAC Scale = 21pF_typ / 127
  448. * CIN Scale = 8.192pF / 2^24
  449. * Offset Scale = CAPDAC Scale / CIN Scale = 338646
  450. */
  451. val /= 338646;
  452. mutex_lock(&chip->lock);
  453. chip->capdac[chan->channel][chan->differential] = val > 0 ?
  454. FIELD_PREP(AD7746_CAPDAC_DACP_MASK, val) | AD7746_CAPDAC_DACEN : 0;
  455. ret = ad7746_set_capdac(chip, chan->channel);
  456. if (ret < 0) {
  457. mutex_unlock(&chip->lock);
  458. return ret;
  459. }
  460. chip->capdac_set = chan->channel;
  461. mutex_unlock(&chip->lock);
  462. return 0;
  463. case IIO_CHAN_INFO_SAMP_FREQ:
  464. if (val2)
  465. return -EINVAL;
  466. switch (chan->type) {
  467. case IIO_CAPACITANCE:
  468. mutex_lock(&chip->lock);
  469. ret = ad7746_store_cap_filter_rate_setup(chip, val);
  470. mutex_unlock(&chip->lock);
  471. return ret;
  472. case IIO_VOLTAGE:
  473. mutex_lock(&chip->lock);
  474. ret = ad7746_store_vt_filter_rate_setup(chip, val);
  475. mutex_unlock(&chip->lock);
  476. return ret;
  477. default:
  478. return -EINVAL;
  479. }
  480. default:
  481. return -EINVAL;
  482. }
  483. }
  484. static const int ad7746_v_samp_freq[] = { 50, 31, 16, 8, };
  485. static const int ad7746_cap_samp_freq[] = { 91, 84, 50, 26, 16, 13, 11, 9, };
  486. static int ad7746_read_avail(struct iio_dev *indio_dev,
  487. struct iio_chan_spec const *chan, const int **vals,
  488. int *type, int *length, long mask)
  489. {
  490. if (mask != IIO_CHAN_INFO_SAMP_FREQ)
  491. return -EINVAL;
  492. switch (chan->type) {
  493. case IIO_VOLTAGE:
  494. *vals = ad7746_v_samp_freq;
  495. *length = ARRAY_SIZE(ad7746_v_samp_freq);
  496. break;
  497. case IIO_CAPACITANCE:
  498. *vals = ad7746_cap_samp_freq;
  499. *length = ARRAY_SIZE(ad7746_cap_samp_freq);
  500. break;
  501. default:
  502. return -EINVAL;
  503. }
  504. *type = IIO_VAL_INT;
  505. return IIO_AVAIL_LIST;
  506. }
  507. static int ad7746_read_channel(struct iio_dev *indio_dev,
  508. struct iio_chan_spec const *chan,
  509. int *val)
  510. {
  511. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  512. int ret, delay;
  513. u8 data[3];
  514. u8 regval;
  515. ret = ad7746_select_channel(indio_dev, chan);
  516. if (ret < 0)
  517. return ret;
  518. delay = ret;
  519. regval = chip->config | FIELD_PREP(AD7746_CONF_MODE_MASK,
  520. AD7746_CONF_MODE_SINGLE_CONV);
  521. ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG, regval);
  522. if (ret < 0)
  523. return ret;
  524. msleep(delay);
  525. /* Now read the actual register */
  526. ret = i2c_smbus_read_i2c_block_data(chip->client,
  527. ad7746_chan_info[chan->address].addr,
  528. sizeof(data), data);
  529. if (ret < 0)
  530. return ret;
  531. /*
  532. * Offset applied internally becaue the _offset userspace interface is
  533. * needed for the CAP DACs which apply a controllable offset.
  534. */
  535. *val = get_unaligned_be24(data) - 0x800000;
  536. return 0;
  537. }
  538. static int ad7746_read_raw(struct iio_dev *indio_dev,
  539. struct iio_chan_spec const *chan,
  540. int *val, int *val2,
  541. long mask)
  542. {
  543. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  544. int ret, idx;
  545. u8 reg;
  546. switch (mask) {
  547. case IIO_CHAN_INFO_RAW:
  548. mutex_lock(&chip->lock);
  549. ret = ad7746_read_channel(indio_dev, chan, val);
  550. mutex_unlock(&chip->lock);
  551. if (ret < 0)
  552. return ret;
  553. return IIO_VAL_INT;
  554. case IIO_CHAN_INFO_CALIBSCALE:
  555. switch (chan->type) {
  556. case IIO_CAPACITANCE:
  557. reg = AD7746_REG_CAP_GAINH;
  558. break;
  559. case IIO_VOLTAGE:
  560. reg = AD7746_REG_VOLT_GAINH;
  561. break;
  562. default:
  563. return -EINVAL;
  564. }
  565. mutex_lock(&chip->lock);
  566. ret = i2c_smbus_read_word_swapped(chip->client, reg);
  567. mutex_unlock(&chip->lock);
  568. if (ret < 0)
  569. return ret;
  570. /* 1 + gain_val / 2^16 */
  571. *val = 1;
  572. *val2 = (15625 * ret) / 1024;
  573. return IIO_VAL_INT_PLUS_MICRO;
  574. case IIO_CHAN_INFO_CALIBBIAS:
  575. mutex_lock(&chip->lock);
  576. ret = i2c_smbus_read_word_swapped(chip->client,
  577. AD7746_REG_CAP_OFFH);
  578. mutex_unlock(&chip->lock);
  579. if (ret < 0)
  580. return ret;
  581. *val = ret;
  582. return IIO_VAL_INT;
  583. case IIO_CHAN_INFO_OFFSET:
  584. case IIO_CHAN_INFO_ZEROPOINT:
  585. *val = FIELD_GET(AD7746_CAPDAC_DACP_MASK,
  586. chip->capdac[chan->channel][chan->differential]) * 338646;
  587. return IIO_VAL_INT;
  588. case IIO_CHAN_INFO_SCALE:
  589. switch (chan->type) {
  590. case IIO_CAPACITANCE:
  591. /* 8.192pf / 2^24 */
  592. *val = 0;
  593. *val2 = 488;
  594. return IIO_VAL_INT_PLUS_NANO;
  595. case IIO_VOLTAGE:
  596. /* 1170mV / 2^23 */
  597. *val = 1170;
  598. if (chan->channel == 1)
  599. *val *= 6;
  600. *val2 = 23;
  601. return IIO_VAL_FRACTIONAL_LOG2;
  602. case IIO_TEMP:
  603. *val = 125;
  604. *val2 = 8;
  605. return IIO_VAL_FRACTIONAL_LOG2;
  606. default:
  607. return -EINVAL;
  608. }
  609. case IIO_CHAN_INFO_SAMP_FREQ:
  610. switch (chan->type) {
  611. case IIO_CAPACITANCE:
  612. idx = FIELD_GET(AD7746_CONF_CAPFS_MASK, chip->config);
  613. *val = ad7746_cap_filter_rate_table[idx][0];
  614. return IIO_VAL_INT;
  615. case IIO_VOLTAGE:
  616. idx = FIELD_GET(AD7746_CONF_VTFS_MASK, chip->config);
  617. *val = ad7746_vt_filter_rate_table[idx][0];
  618. return IIO_VAL_INT;
  619. default:
  620. return -EINVAL;
  621. }
  622. default:
  623. return -EINVAL;
  624. }
  625. }
  626. static const struct iio_info ad7746_info = {
  627. .attrs = &ad7746_attribute_group,
  628. .read_raw = ad7746_read_raw,
  629. .read_avail = ad7746_read_avail,
  630. .write_raw = ad7746_write_raw,
  631. };
  632. static int ad7746_probe(struct i2c_client *client)
  633. {
  634. const struct i2c_device_id *id = i2c_client_get_device_id(client);
  635. struct device *dev = &client->dev;
  636. struct ad7746_chip_info *chip;
  637. struct iio_dev *indio_dev;
  638. unsigned char regval = 0;
  639. unsigned int vdd_permille;
  640. int ret;
  641. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
  642. if (!indio_dev)
  643. return -ENOMEM;
  644. chip = iio_priv(indio_dev);
  645. mutex_init(&chip->lock);
  646. chip->client = client;
  647. chip->capdac_set = -1;
  648. indio_dev->name = id->name;
  649. indio_dev->info = &ad7746_info;
  650. indio_dev->channels = ad7746_channels;
  651. if (id->driver_data == 7746)
  652. indio_dev->num_channels = ARRAY_SIZE(ad7746_channels);
  653. else
  654. indio_dev->num_channels = ARRAY_SIZE(ad7746_channels) - 2;
  655. indio_dev->modes = INDIO_DIRECT_MODE;
  656. if (device_property_read_bool(dev, "adi,exca-output-en")) {
  657. if (device_property_read_bool(dev, "adi,exca-output-invert"))
  658. regval |= AD7746_EXCSETUP_NEXCA;
  659. else
  660. regval |= AD7746_EXCSETUP_EXCA;
  661. }
  662. if (device_property_read_bool(dev, "adi,excb-output-en")) {
  663. if (device_property_read_bool(dev, "adi,excb-output-invert"))
  664. regval |= AD7746_EXCSETUP_NEXCB;
  665. else
  666. regval |= AD7746_EXCSETUP_EXCB;
  667. }
  668. ret = device_property_read_u32(dev, "adi,excitation-vdd-permille",
  669. &vdd_permille);
  670. if (!ret) {
  671. switch (vdd_permille) {
  672. case 125:
  673. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 0);
  674. break;
  675. case 250:
  676. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 1);
  677. break;
  678. case 375:
  679. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 2);
  680. break;
  681. case 500:
  682. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 3);
  683. break;
  684. default:
  685. break;
  686. }
  687. }
  688. ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_EXC_SETUP,
  689. regval);
  690. if (ret < 0)
  691. return ret;
  692. return devm_iio_device_register(indio_dev->dev.parent, indio_dev);
  693. }
  694. static const struct i2c_device_id ad7746_id[] = {
  695. { "ad7745", 7745 },
  696. { "ad7746", 7746 },
  697. { "ad7747", 7747 },
  698. {}
  699. };
  700. MODULE_DEVICE_TABLE(i2c, ad7746_id);
  701. static const struct of_device_id ad7746_of_match[] = {
  702. { .compatible = "adi,ad7745" },
  703. { .compatible = "adi,ad7746" },
  704. { .compatible = "adi,ad7747" },
  705. { },
  706. };
  707. MODULE_DEVICE_TABLE(of, ad7746_of_match);
  708. static struct i2c_driver ad7746_driver = {
  709. .driver = {
  710. .name = KBUILD_MODNAME,
  711. .of_match_table = ad7746_of_match,
  712. },
  713. .probe = ad7746_probe,
  714. .id_table = ad7746_id,
  715. };
  716. module_i2c_driver(ad7746_driver);
  717. MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
  718. MODULE_DESCRIPTION("Analog Devices AD7746/5/7 capacitive sensor driver");
  719. MODULE_LICENSE("GPL v2");