ad7746.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  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 <asm/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. if (chip->capdac_set != chan->channel)
  265. chip->capdac_set = chan->channel;
  266. break;
  267. case IIO_VOLTAGE:
  268. case IIO_TEMP:
  269. vt_setup = FIELD_PREP(AD7746_VTSETUP_VTMD_MASK,
  270. ad7746_chan_info[chan->address].vtmd) |
  271. FIELD_PREP(AD7746_VTSETUP_VTEN, 1);
  272. cap_setup = chip->cap_setup & ~AD7746_CAPSETUP_CAPEN;
  273. idx = FIELD_GET(AD7746_CONF_VTFS_MASK, chip->config);
  274. delay = ad7746_cap_filter_rate_table[idx][1];
  275. break;
  276. default:
  277. return -EINVAL;
  278. }
  279. if (chip->cap_setup != cap_setup) {
  280. ret = i2c_smbus_write_byte_data(chip->client,
  281. AD7746_REG_CAP_SETUP,
  282. cap_setup);
  283. if (ret < 0)
  284. return ret;
  285. chip->cap_setup = cap_setup;
  286. }
  287. if (chip->vt_setup != vt_setup) {
  288. ret = i2c_smbus_write_byte_data(chip->client,
  289. AD7746_REG_VT_SETUP,
  290. vt_setup);
  291. if (ret < 0)
  292. return ret;
  293. chip->vt_setup = vt_setup;
  294. }
  295. return delay;
  296. }
  297. static inline ssize_t ad7746_start_calib(struct device *dev,
  298. struct device_attribute *attr,
  299. const char *buf,
  300. size_t len,
  301. u8 regval)
  302. {
  303. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  304. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  305. int ret, timeout = 10;
  306. bool doit;
  307. ret = kstrtobool(buf, &doit);
  308. if (ret < 0)
  309. return ret;
  310. if (!doit)
  311. return 0;
  312. mutex_lock(&chip->lock);
  313. regval |= chip->config;
  314. ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG, regval);
  315. if (ret < 0)
  316. goto unlock;
  317. do {
  318. msleep(20);
  319. ret = i2c_smbus_read_byte_data(chip->client, AD7746_REG_CFG);
  320. if (ret < 0)
  321. goto unlock;
  322. } while ((ret == regval) && timeout--);
  323. mutex_unlock(&chip->lock);
  324. return len;
  325. unlock:
  326. mutex_unlock(&chip->lock);
  327. return ret;
  328. }
  329. static ssize_t ad7746_start_offset_calib(struct device *dev,
  330. struct device_attribute *attr,
  331. const char *buf,
  332. size_t len)
  333. {
  334. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  335. int ret = ad7746_select_channel(indio_dev,
  336. &ad7746_channels[to_iio_dev_attr(attr)->address]);
  337. if (ret < 0)
  338. return ret;
  339. return ad7746_start_calib(dev, attr, buf, len,
  340. FIELD_PREP(AD7746_CONF_MODE_MASK,
  341. AD7746_CONF_MODE_OFFS_CAL));
  342. }
  343. static ssize_t ad7746_start_gain_calib(struct device *dev,
  344. struct device_attribute *attr,
  345. const char *buf,
  346. size_t len)
  347. {
  348. struct iio_dev *indio_dev = dev_to_iio_dev(dev);
  349. int ret = ad7746_select_channel(indio_dev,
  350. &ad7746_channels[to_iio_dev_attr(attr)->address]);
  351. if (ret < 0)
  352. return ret;
  353. return ad7746_start_calib(dev, attr, buf, len,
  354. FIELD_PREP(AD7746_CONF_MODE_MASK,
  355. AD7746_CONF_MODE_GAIN_CAL));
  356. }
  357. static IIO_DEVICE_ATTR(in_capacitance0_calibbias_calibration,
  358. 0200, NULL, ad7746_start_offset_calib, CIN1);
  359. static IIO_DEVICE_ATTR(in_capacitance1_calibbias_calibration,
  360. 0200, NULL, ad7746_start_offset_calib, CIN2);
  361. static IIO_DEVICE_ATTR(in_capacitance0_calibscale_calibration,
  362. 0200, NULL, ad7746_start_gain_calib, CIN1);
  363. static IIO_DEVICE_ATTR(in_capacitance1_calibscale_calibration,
  364. 0200, NULL, ad7746_start_gain_calib, CIN2);
  365. static IIO_DEVICE_ATTR(in_voltage0_calibscale_calibration,
  366. 0200, NULL, ad7746_start_gain_calib, VIN);
  367. static int ad7746_store_cap_filter_rate_setup(struct ad7746_chip_info *chip,
  368. int val)
  369. {
  370. int i;
  371. for (i = 0; i < ARRAY_SIZE(ad7746_cap_filter_rate_table); i++)
  372. if (val >= ad7746_cap_filter_rate_table[i][0])
  373. break;
  374. if (i >= ARRAY_SIZE(ad7746_cap_filter_rate_table))
  375. i = ARRAY_SIZE(ad7746_cap_filter_rate_table) - 1;
  376. chip->config &= ~AD7746_CONF_CAPFS_MASK;
  377. chip->config |= FIELD_PREP(AD7746_CONF_CAPFS_MASK, i);
  378. return 0;
  379. }
  380. static int ad7746_store_vt_filter_rate_setup(struct ad7746_chip_info *chip,
  381. int val)
  382. {
  383. int i;
  384. for (i = 0; i < ARRAY_SIZE(ad7746_vt_filter_rate_table); i++)
  385. if (val >= ad7746_vt_filter_rate_table[i][0])
  386. break;
  387. if (i >= ARRAY_SIZE(ad7746_vt_filter_rate_table))
  388. i = ARRAY_SIZE(ad7746_vt_filter_rate_table) - 1;
  389. chip->config &= ~AD7746_CONF_VTFS_MASK;
  390. chip->config |= FIELD_PREP(AD7746_CONF_VTFS_MASK, i);
  391. return 0;
  392. }
  393. static struct attribute *ad7746_attributes[] = {
  394. &iio_dev_attr_in_capacitance0_calibbias_calibration.dev_attr.attr,
  395. &iio_dev_attr_in_capacitance0_calibscale_calibration.dev_attr.attr,
  396. &iio_dev_attr_in_capacitance1_calibscale_calibration.dev_attr.attr,
  397. &iio_dev_attr_in_capacitance1_calibbias_calibration.dev_attr.attr,
  398. &iio_dev_attr_in_voltage0_calibscale_calibration.dev_attr.attr,
  399. NULL,
  400. };
  401. static const struct attribute_group ad7746_attribute_group = {
  402. .attrs = ad7746_attributes,
  403. };
  404. static int ad7746_write_raw(struct iio_dev *indio_dev,
  405. struct iio_chan_spec const *chan,
  406. int val,
  407. int val2,
  408. long mask)
  409. {
  410. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  411. int ret, reg;
  412. switch (mask) {
  413. case IIO_CHAN_INFO_CALIBSCALE:
  414. if (val != 1)
  415. return -EINVAL;
  416. val = (val2 * 1024) / 15625;
  417. switch (chan->type) {
  418. case IIO_CAPACITANCE:
  419. reg = AD7746_REG_CAP_GAINH;
  420. break;
  421. case IIO_VOLTAGE:
  422. reg = AD7746_REG_VOLT_GAINH;
  423. break;
  424. default:
  425. return -EINVAL;
  426. }
  427. mutex_lock(&chip->lock);
  428. ret = i2c_smbus_write_word_swapped(chip->client, reg, val);
  429. mutex_unlock(&chip->lock);
  430. if (ret < 0)
  431. return ret;
  432. return 0;
  433. case IIO_CHAN_INFO_CALIBBIAS:
  434. if (val < 0 || val > 0xFFFF)
  435. return -EINVAL;
  436. mutex_lock(&chip->lock);
  437. ret = i2c_smbus_write_word_swapped(chip->client,
  438. AD7746_REG_CAP_OFFH, val);
  439. mutex_unlock(&chip->lock);
  440. if (ret < 0)
  441. return ret;
  442. return 0;
  443. case IIO_CHAN_INFO_OFFSET:
  444. case IIO_CHAN_INFO_ZEROPOINT:
  445. if (val < 0 || val > 43008000) /* 21pF */
  446. return -EINVAL;
  447. /*
  448. * CAPDAC Scale = 21pF_typ / 127
  449. * CIN Scale = 8.192pF / 2^24
  450. * Offset Scale = CAPDAC Scale / CIN Scale = 338646
  451. */
  452. val /= 338646;
  453. mutex_lock(&chip->lock);
  454. chip->capdac[chan->channel][chan->differential] = val > 0 ?
  455. FIELD_PREP(AD7746_CAPDAC_DACP_MASK, val) | AD7746_CAPDAC_DACEN : 0;
  456. ret = ad7746_set_capdac(chip, chan->channel);
  457. if (ret < 0) {
  458. mutex_unlock(&chip->lock);
  459. return ret;
  460. }
  461. chip->capdac_set = chan->channel;
  462. mutex_unlock(&chip->lock);
  463. return 0;
  464. case IIO_CHAN_INFO_SAMP_FREQ:
  465. if (val2)
  466. return -EINVAL;
  467. switch (chan->type) {
  468. case IIO_CAPACITANCE:
  469. mutex_lock(&chip->lock);
  470. ret = ad7746_store_cap_filter_rate_setup(chip, val);
  471. mutex_unlock(&chip->lock);
  472. return ret;
  473. case IIO_VOLTAGE:
  474. mutex_lock(&chip->lock);
  475. ret = ad7746_store_vt_filter_rate_setup(chip, val);
  476. mutex_unlock(&chip->lock);
  477. return ret;
  478. default:
  479. return -EINVAL;
  480. }
  481. default:
  482. return -EINVAL;
  483. }
  484. }
  485. static const int ad7746_v_samp_freq[] = { 50, 31, 16, 8, };
  486. static const int ad7746_cap_samp_freq[] = { 91, 84, 50, 26, 16, 13, 11, 9, };
  487. static int ad7746_read_avail(struct iio_dev *indio_dev,
  488. struct iio_chan_spec const *chan, const int **vals,
  489. int *type, int *length, long mask)
  490. {
  491. if (mask != IIO_CHAN_INFO_SAMP_FREQ)
  492. return -EINVAL;
  493. switch (chan->type) {
  494. case IIO_VOLTAGE:
  495. *vals = ad7746_v_samp_freq;
  496. *length = ARRAY_SIZE(ad7746_v_samp_freq);
  497. break;
  498. case IIO_CAPACITANCE:
  499. *vals = ad7746_cap_samp_freq;
  500. *length = ARRAY_SIZE(ad7746_cap_samp_freq);
  501. break;
  502. default:
  503. return -EINVAL;
  504. }
  505. *type = IIO_VAL_INT;
  506. return IIO_AVAIL_LIST;
  507. }
  508. static int ad7746_read_channel(struct iio_dev *indio_dev,
  509. struct iio_chan_spec const *chan,
  510. int *val)
  511. {
  512. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  513. int ret, delay;
  514. u8 data[3];
  515. u8 regval;
  516. ret = ad7746_select_channel(indio_dev, chan);
  517. if (ret < 0)
  518. return ret;
  519. delay = ret;
  520. regval = chip->config | FIELD_PREP(AD7746_CONF_MODE_MASK,
  521. AD7746_CONF_MODE_SINGLE_CONV);
  522. ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG, regval);
  523. if (ret < 0)
  524. return ret;
  525. msleep(delay);
  526. /* Now read the actual register */
  527. ret = i2c_smbus_read_i2c_block_data(chip->client,
  528. ad7746_chan_info[chan->address].addr,
  529. sizeof(data), data);
  530. if (ret < 0)
  531. return ret;
  532. /*
  533. * Offset applied internally becaue the _offset userspace interface is
  534. * needed for the CAP DACs which apply a controllable offset.
  535. */
  536. *val = get_unaligned_be24(data) - 0x800000;
  537. return 0;
  538. }
  539. static int ad7746_read_raw(struct iio_dev *indio_dev,
  540. struct iio_chan_spec const *chan,
  541. int *val, int *val2,
  542. long mask)
  543. {
  544. struct ad7746_chip_info *chip = iio_priv(indio_dev);
  545. int ret, idx;
  546. u8 reg;
  547. switch (mask) {
  548. case IIO_CHAN_INFO_RAW:
  549. mutex_lock(&chip->lock);
  550. ret = ad7746_read_channel(indio_dev, chan, val);
  551. mutex_unlock(&chip->lock);
  552. if (ret < 0)
  553. return ret;
  554. return IIO_VAL_INT;
  555. case IIO_CHAN_INFO_CALIBSCALE:
  556. switch (chan->type) {
  557. case IIO_CAPACITANCE:
  558. reg = AD7746_REG_CAP_GAINH;
  559. break;
  560. case IIO_VOLTAGE:
  561. reg = AD7746_REG_VOLT_GAINH;
  562. break;
  563. default:
  564. return -EINVAL;
  565. }
  566. mutex_lock(&chip->lock);
  567. ret = i2c_smbus_read_word_swapped(chip->client, reg);
  568. mutex_unlock(&chip->lock);
  569. if (ret < 0)
  570. return ret;
  571. /* 1 + gain_val / 2^16 */
  572. *val = 1;
  573. *val2 = (15625 * ret) / 1024;
  574. return IIO_VAL_INT_PLUS_MICRO;
  575. case IIO_CHAN_INFO_CALIBBIAS:
  576. mutex_lock(&chip->lock);
  577. ret = i2c_smbus_read_word_swapped(chip->client,
  578. AD7746_REG_CAP_OFFH);
  579. mutex_unlock(&chip->lock);
  580. if (ret < 0)
  581. return ret;
  582. *val = ret;
  583. return IIO_VAL_INT;
  584. case IIO_CHAN_INFO_OFFSET:
  585. case IIO_CHAN_INFO_ZEROPOINT:
  586. *val = FIELD_GET(AD7746_CAPDAC_DACP_MASK,
  587. chip->capdac[chan->channel][chan->differential]) * 338646;
  588. return IIO_VAL_INT;
  589. case IIO_CHAN_INFO_SCALE:
  590. switch (chan->type) {
  591. case IIO_CAPACITANCE:
  592. /* 8.192pf / 2^24 */
  593. *val = 0;
  594. *val2 = 488;
  595. return IIO_VAL_INT_PLUS_NANO;
  596. case IIO_VOLTAGE:
  597. /* 1170mV / 2^23 */
  598. *val = 1170;
  599. if (chan->channel == 1)
  600. *val *= 6;
  601. *val2 = 23;
  602. return IIO_VAL_FRACTIONAL_LOG2;
  603. case IIO_TEMP:
  604. *val = 125;
  605. *val2 = 8;
  606. return IIO_VAL_FRACTIONAL_LOG2;
  607. default:
  608. return -EINVAL;
  609. }
  610. case IIO_CHAN_INFO_SAMP_FREQ:
  611. switch (chan->type) {
  612. case IIO_CAPACITANCE:
  613. idx = FIELD_GET(AD7746_CONF_CAPFS_MASK, chip->config);
  614. *val = ad7746_cap_filter_rate_table[idx][0];
  615. return IIO_VAL_INT;
  616. case IIO_VOLTAGE:
  617. idx = FIELD_GET(AD7746_CONF_VTFS_MASK, chip->config);
  618. *val = ad7746_vt_filter_rate_table[idx][0];
  619. return IIO_VAL_INT;
  620. default:
  621. return -EINVAL;
  622. }
  623. default:
  624. return -EINVAL;
  625. }
  626. }
  627. static const struct iio_info ad7746_info = {
  628. .attrs = &ad7746_attribute_group,
  629. .read_raw = ad7746_read_raw,
  630. .read_avail = ad7746_read_avail,
  631. .write_raw = ad7746_write_raw,
  632. };
  633. static int ad7746_probe(struct i2c_client *client,
  634. const struct i2c_device_id *id)
  635. {
  636. struct device *dev = &client->dev;
  637. struct ad7746_chip_info *chip;
  638. struct iio_dev *indio_dev;
  639. unsigned char regval = 0;
  640. unsigned int vdd_permille;
  641. int ret;
  642. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
  643. if (!indio_dev)
  644. return -ENOMEM;
  645. chip = iio_priv(indio_dev);
  646. mutex_init(&chip->lock);
  647. chip->client = client;
  648. chip->capdac_set = -1;
  649. indio_dev->name = id->name;
  650. indio_dev->info = &ad7746_info;
  651. indio_dev->channels = ad7746_channels;
  652. if (id->driver_data == 7746)
  653. indio_dev->num_channels = ARRAY_SIZE(ad7746_channels);
  654. else
  655. indio_dev->num_channels = ARRAY_SIZE(ad7746_channels) - 2;
  656. indio_dev->modes = INDIO_DIRECT_MODE;
  657. if (device_property_read_bool(dev, "adi,exca-output-en")) {
  658. if (device_property_read_bool(dev, "adi,exca-output-invert"))
  659. regval |= AD7746_EXCSETUP_NEXCA;
  660. else
  661. regval |= AD7746_EXCSETUP_EXCA;
  662. }
  663. if (device_property_read_bool(dev, "adi,excb-output-en")) {
  664. if (device_property_read_bool(dev, "adi,excb-output-invert"))
  665. regval |= AD7746_EXCSETUP_NEXCB;
  666. else
  667. regval |= AD7746_EXCSETUP_EXCB;
  668. }
  669. ret = device_property_read_u32(dev, "adi,excitation-vdd-permille",
  670. &vdd_permille);
  671. if (!ret) {
  672. switch (vdd_permille) {
  673. case 125:
  674. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 0);
  675. break;
  676. case 250:
  677. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 1);
  678. break;
  679. case 375:
  680. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 2);
  681. break;
  682. case 500:
  683. regval |= FIELD_PREP(AD7746_EXCSETUP_EXCLVL_MASK, 3);
  684. break;
  685. default:
  686. break;
  687. }
  688. }
  689. ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_EXC_SETUP,
  690. regval);
  691. if (ret < 0)
  692. return ret;
  693. return devm_iio_device_register(indio_dev->dev.parent, indio_dev);
  694. }
  695. static const struct i2c_device_id ad7746_id[] = {
  696. { "ad7745", 7745 },
  697. { "ad7746", 7746 },
  698. { "ad7747", 7747 },
  699. {}
  700. };
  701. MODULE_DEVICE_TABLE(i2c, ad7746_id);
  702. static const struct of_device_id ad7746_of_match[] = {
  703. { .compatible = "adi,ad7745" },
  704. { .compatible = "adi,ad7746" },
  705. { .compatible = "adi,ad7747" },
  706. { },
  707. };
  708. MODULE_DEVICE_TABLE(of, ad7746_of_match);
  709. static struct i2c_driver ad7746_driver = {
  710. .driver = {
  711. .name = KBUILD_MODNAME,
  712. .of_match_table = ad7746_of_match,
  713. },
  714. .probe = ad7746_probe,
  715. .id_table = ad7746_id,
  716. };
  717. module_i2c_driver(ad7746_driver);
  718. MODULE_AUTHOR("Michael Hennerich <[email protected]>");
  719. MODULE_DESCRIPTION("Analog Devices AD7746/5/7 capacitive sensor driver");
  720. MODULE_LICENSE("GPL v2");