adux1020.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * adux1020.c - Support for Analog Devices ADUX1020 photometric sensor
  4. *
  5. * Copyright (C) 2019 Linaro Ltd.
  6. * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
  7. *
  8. * TODO: Triggered buffer support
  9. */
  10. #include <linux/bitfield.h>
  11. #include <linux/delay.h>
  12. #include <linux/err.h>
  13. #include <linux/i2c.h>
  14. #include <linux/init.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/irq.h>
  17. #include <linux/module.h>
  18. #include <linux/mutex.h>
  19. #include <linux/regmap.h>
  20. #include <linux/iio/iio.h>
  21. #include <linux/iio/sysfs.h>
  22. #include <linux/iio/events.h>
  23. #define ADUX1020_REGMAP_NAME "adux1020_regmap"
  24. #define ADUX1020_DRV_NAME "adux1020"
  25. /* System registers */
  26. #define ADUX1020_REG_CHIP_ID 0x08
  27. #define ADUX1020_REG_SLAVE_ADDRESS 0x09
  28. #define ADUX1020_REG_SW_RESET 0x0f
  29. #define ADUX1020_REG_INT_ENABLE 0x1c
  30. #define ADUX1020_REG_INT_POLARITY 0x1d
  31. #define ADUX1020_REG_PROX_TH_ON1 0x2a
  32. #define ADUX1020_REG_PROX_TH_OFF1 0x2b
  33. #define ADUX1020_REG_PROX_TYPE 0x2f
  34. #define ADUX1020_REG_TEST_MODES_3 0x32
  35. #define ADUX1020_REG_FORCE_MODE 0x33
  36. #define ADUX1020_REG_FREQUENCY 0x40
  37. #define ADUX1020_REG_LED_CURRENT 0x41
  38. #define ADUX1020_REG_OP_MODE 0x45
  39. #define ADUX1020_REG_INT_MASK 0x48
  40. #define ADUX1020_REG_INT_STATUS 0x49
  41. #define ADUX1020_REG_DATA_BUFFER 0x60
  42. /* Chip ID bits */
  43. #define ADUX1020_CHIP_ID_MASK GENMASK(11, 0)
  44. #define ADUX1020_CHIP_ID 0x03fc
  45. #define ADUX1020_SW_RESET BIT(1)
  46. #define ADUX1020_FIFO_FLUSH BIT(15)
  47. #define ADUX1020_OP_MODE_MASK GENMASK(3, 0)
  48. #define ADUX1020_DATA_OUT_MODE_MASK GENMASK(7, 4)
  49. #define ADUX1020_DATA_OUT_PROX_I FIELD_PREP(ADUX1020_DATA_OUT_MODE_MASK, 1)
  50. #define ADUX1020_MODE_INT_MASK GENMASK(7, 0)
  51. #define ADUX1020_INT_ENABLE 0x2094
  52. #define ADUX1020_INT_DISABLE 0x2090
  53. #define ADUX1020_PROX_INT_ENABLE 0x00f0
  54. #define ADUX1020_PROX_ON1_INT BIT(0)
  55. #define ADUX1020_PROX_OFF1_INT BIT(1)
  56. #define ADUX1020_FIFO_INT_ENABLE 0x7f
  57. #define ADUX1020_MODE_INT_DISABLE 0xff
  58. #define ADUX1020_MODE_INT_STATUS_MASK GENMASK(7, 0)
  59. #define ADUX1020_FIFO_STATUS_MASK GENMASK(15, 8)
  60. #define ADUX1020_INT_CLEAR 0xff
  61. #define ADUX1020_PROX_TYPE BIT(15)
  62. #define ADUX1020_INT_PROX_ON1 BIT(0)
  63. #define ADUX1020_INT_PROX_OFF1 BIT(1)
  64. #define ADUX1020_FORCE_CLOCK_ON 0x0f4f
  65. #define ADUX1020_FORCE_CLOCK_RESET 0x0040
  66. #define ADUX1020_ACTIVE_4_STATE 0x0008
  67. #define ADUX1020_PROX_FREQ_MASK GENMASK(7, 4)
  68. #define ADUX1020_PROX_FREQ(x) FIELD_PREP(ADUX1020_PROX_FREQ_MASK, x)
  69. #define ADUX1020_LED_CURRENT_MASK GENMASK(3, 0)
  70. #define ADUX1020_LED_PIREF_EN BIT(12)
  71. /* Operating modes */
  72. enum adux1020_op_modes {
  73. ADUX1020_MODE_STANDBY,
  74. ADUX1020_MODE_PROX_I,
  75. ADUX1020_MODE_PROX_XY,
  76. ADUX1020_MODE_GEST,
  77. ADUX1020_MODE_SAMPLE,
  78. ADUX1020_MODE_FORCE = 0x0e,
  79. ADUX1020_MODE_IDLE = 0x0f,
  80. };
  81. struct adux1020_data {
  82. struct i2c_client *client;
  83. struct iio_dev *indio_dev;
  84. struct mutex lock;
  85. struct regmap *regmap;
  86. };
  87. struct adux1020_mode_data {
  88. u8 bytes;
  89. u8 buf_len;
  90. u16 int_en;
  91. };
  92. static const struct adux1020_mode_data adux1020_modes[] = {
  93. [ADUX1020_MODE_PROX_I] = {
  94. .bytes = 2,
  95. .buf_len = 1,
  96. .int_en = ADUX1020_PROX_INT_ENABLE,
  97. },
  98. };
  99. static const struct regmap_config adux1020_regmap_config = {
  100. .name = ADUX1020_REGMAP_NAME,
  101. .reg_bits = 8,
  102. .val_bits = 16,
  103. .max_register = 0x6F,
  104. .cache_type = REGCACHE_NONE,
  105. };
  106. static const struct reg_sequence adux1020_def_conf[] = {
  107. { 0x000c, 0x000f },
  108. { 0x0010, 0x1010 },
  109. { 0x0011, 0x004c },
  110. { 0x0012, 0x5f0c },
  111. { 0x0013, 0xada5 },
  112. { 0x0014, 0x0080 },
  113. { 0x0015, 0x0000 },
  114. { 0x0016, 0x0600 },
  115. { 0x0017, 0x0000 },
  116. { 0x0018, 0x2693 },
  117. { 0x0019, 0x0004 },
  118. { 0x001a, 0x4280 },
  119. { 0x001b, 0x0060 },
  120. { 0x001c, 0x2094 },
  121. { 0x001d, 0x0020 },
  122. { 0x001e, 0x0001 },
  123. { 0x001f, 0x0100 },
  124. { 0x0020, 0x0320 },
  125. { 0x0021, 0x0A13 },
  126. { 0x0022, 0x0320 },
  127. { 0x0023, 0x0113 },
  128. { 0x0024, 0x0000 },
  129. { 0x0025, 0x2412 },
  130. { 0x0026, 0x2412 },
  131. { 0x0027, 0x0022 },
  132. { 0x0028, 0x0000 },
  133. { 0x0029, 0x0300 },
  134. { 0x002a, 0x0700 },
  135. { 0x002b, 0x0600 },
  136. { 0x002c, 0x6000 },
  137. { 0x002d, 0x4000 },
  138. { 0x002e, 0x0000 },
  139. { 0x002f, 0x0000 },
  140. { 0x0030, 0x0000 },
  141. { 0x0031, 0x0000 },
  142. { 0x0032, 0x0040 },
  143. { 0x0033, 0x0008 },
  144. { 0x0034, 0xE400 },
  145. { 0x0038, 0x8080 },
  146. { 0x0039, 0x8080 },
  147. { 0x003a, 0x2000 },
  148. { 0x003b, 0x1f00 },
  149. { 0x003c, 0x2000 },
  150. { 0x003d, 0x2000 },
  151. { 0x003e, 0x0000 },
  152. { 0x0040, 0x8069 },
  153. { 0x0041, 0x1f2f },
  154. { 0x0042, 0x4000 },
  155. { 0x0043, 0x0000 },
  156. { 0x0044, 0x0008 },
  157. { 0x0046, 0x0000 },
  158. { 0x0048, 0x00ef },
  159. { 0x0049, 0x0000 },
  160. { 0x0045, 0x0000 },
  161. };
  162. static const int adux1020_rates[][2] = {
  163. { 0, 100000 },
  164. { 0, 200000 },
  165. { 0, 500000 },
  166. { 1, 0 },
  167. { 2, 0 },
  168. { 5, 0 },
  169. { 10, 0 },
  170. { 20, 0 },
  171. { 50, 0 },
  172. { 100, 0 },
  173. { 190, 0 },
  174. { 450, 0 },
  175. { 820, 0 },
  176. { 1400, 0 },
  177. };
  178. static const int adux1020_led_currents[][2] = {
  179. { 0, 25000 },
  180. { 0, 40000 },
  181. { 0, 55000 },
  182. { 0, 70000 },
  183. { 0, 85000 },
  184. { 0, 100000 },
  185. { 0, 115000 },
  186. { 0, 130000 },
  187. { 0, 145000 },
  188. { 0, 160000 },
  189. { 0, 175000 },
  190. { 0, 190000 },
  191. { 0, 205000 },
  192. { 0, 220000 },
  193. { 0, 235000 },
  194. { 0, 250000 },
  195. };
  196. static int adux1020_flush_fifo(struct adux1020_data *data)
  197. {
  198. int ret;
  199. /* Force Idle mode */
  200. ret = regmap_write(data->regmap, ADUX1020_REG_FORCE_MODE,
  201. ADUX1020_ACTIVE_4_STATE);
  202. if (ret < 0)
  203. return ret;
  204. ret = regmap_update_bits(data->regmap, ADUX1020_REG_OP_MODE,
  205. ADUX1020_OP_MODE_MASK, ADUX1020_MODE_FORCE);
  206. if (ret < 0)
  207. return ret;
  208. ret = regmap_update_bits(data->regmap, ADUX1020_REG_OP_MODE,
  209. ADUX1020_OP_MODE_MASK, ADUX1020_MODE_IDLE);
  210. if (ret < 0)
  211. return ret;
  212. /* Flush FIFO */
  213. ret = regmap_write(data->regmap, ADUX1020_REG_TEST_MODES_3,
  214. ADUX1020_FORCE_CLOCK_ON);
  215. if (ret < 0)
  216. return ret;
  217. ret = regmap_write(data->regmap, ADUX1020_REG_INT_STATUS,
  218. ADUX1020_FIFO_FLUSH);
  219. if (ret < 0)
  220. return ret;
  221. return regmap_write(data->regmap, ADUX1020_REG_TEST_MODES_3,
  222. ADUX1020_FORCE_CLOCK_RESET);
  223. }
  224. static int adux1020_read_fifo(struct adux1020_data *data, u16 *buf, u8 buf_len)
  225. {
  226. unsigned int regval;
  227. int i, ret;
  228. /* Enable 32MHz clock */
  229. ret = regmap_write(data->regmap, ADUX1020_REG_TEST_MODES_3,
  230. ADUX1020_FORCE_CLOCK_ON);
  231. if (ret < 0)
  232. return ret;
  233. for (i = 0; i < buf_len; i++) {
  234. ret = regmap_read(data->regmap, ADUX1020_REG_DATA_BUFFER,
  235. &regval);
  236. if (ret < 0)
  237. return ret;
  238. buf[i] = regval;
  239. }
  240. /* Set 32MHz clock to be controlled by internal state machine */
  241. return regmap_write(data->regmap, ADUX1020_REG_TEST_MODES_3,
  242. ADUX1020_FORCE_CLOCK_RESET);
  243. }
  244. static int adux1020_set_mode(struct adux1020_data *data,
  245. enum adux1020_op_modes mode)
  246. {
  247. int ret;
  248. /* Switch to standby mode before changing the mode */
  249. ret = regmap_write(data->regmap, ADUX1020_REG_OP_MODE,
  250. ADUX1020_MODE_STANDBY);
  251. if (ret < 0)
  252. return ret;
  253. /* Set data out and switch to the desired mode */
  254. switch (mode) {
  255. case ADUX1020_MODE_PROX_I:
  256. ret = regmap_update_bits(data->regmap, ADUX1020_REG_OP_MODE,
  257. ADUX1020_DATA_OUT_MODE_MASK,
  258. ADUX1020_DATA_OUT_PROX_I);
  259. if (ret < 0)
  260. return ret;
  261. ret = regmap_update_bits(data->regmap, ADUX1020_REG_OP_MODE,
  262. ADUX1020_OP_MODE_MASK,
  263. ADUX1020_MODE_PROX_I);
  264. if (ret < 0)
  265. return ret;
  266. break;
  267. default:
  268. return -EINVAL;
  269. }
  270. return 0;
  271. }
  272. static int adux1020_measure(struct adux1020_data *data,
  273. enum adux1020_op_modes mode,
  274. u16 *val)
  275. {
  276. unsigned int status;
  277. int ret, tries = 50;
  278. /* Disable INT pin as polling is going to be used */
  279. ret = regmap_write(data->regmap, ADUX1020_REG_INT_ENABLE,
  280. ADUX1020_INT_DISABLE);
  281. if (ret < 0)
  282. return ret;
  283. /* Enable mode interrupt */
  284. ret = regmap_update_bits(data->regmap, ADUX1020_REG_INT_MASK,
  285. ADUX1020_MODE_INT_MASK,
  286. adux1020_modes[mode].int_en);
  287. if (ret < 0)
  288. return ret;
  289. while (tries--) {
  290. ret = regmap_read(data->regmap, ADUX1020_REG_INT_STATUS,
  291. &status);
  292. if (ret < 0)
  293. return ret;
  294. status &= ADUX1020_FIFO_STATUS_MASK;
  295. if (status >= adux1020_modes[mode].bytes)
  296. break;
  297. msleep(20);
  298. }
  299. if (tries < 0)
  300. return -EIO;
  301. ret = adux1020_read_fifo(data, val, adux1020_modes[mode].buf_len);
  302. if (ret < 0)
  303. return ret;
  304. /* Clear mode interrupt */
  305. ret = regmap_write(data->regmap, ADUX1020_REG_INT_STATUS,
  306. (~adux1020_modes[mode].int_en));
  307. if (ret < 0)
  308. return ret;
  309. /* Disable mode interrupts */
  310. return regmap_update_bits(data->regmap, ADUX1020_REG_INT_MASK,
  311. ADUX1020_MODE_INT_MASK,
  312. ADUX1020_MODE_INT_DISABLE);
  313. }
  314. static int adux1020_read_raw(struct iio_dev *indio_dev,
  315. struct iio_chan_spec const *chan,
  316. int *val, int *val2, long mask)
  317. {
  318. struct adux1020_data *data = iio_priv(indio_dev);
  319. u16 buf[3];
  320. int ret = -EINVAL;
  321. unsigned int regval;
  322. mutex_lock(&data->lock);
  323. switch (mask) {
  324. case IIO_CHAN_INFO_RAW:
  325. switch (chan->type) {
  326. case IIO_PROXIMITY:
  327. ret = adux1020_set_mode(data, ADUX1020_MODE_PROX_I);
  328. if (ret < 0)
  329. goto fail;
  330. ret = adux1020_measure(data, ADUX1020_MODE_PROX_I, buf);
  331. if (ret < 0)
  332. goto fail;
  333. *val = buf[0];
  334. ret = IIO_VAL_INT;
  335. break;
  336. default:
  337. break;
  338. }
  339. break;
  340. case IIO_CHAN_INFO_PROCESSED:
  341. switch (chan->type) {
  342. case IIO_CURRENT:
  343. ret = regmap_read(data->regmap,
  344. ADUX1020_REG_LED_CURRENT, &regval);
  345. if (ret < 0)
  346. goto fail;
  347. regval = regval & ADUX1020_LED_CURRENT_MASK;
  348. *val = adux1020_led_currents[regval][0];
  349. *val2 = adux1020_led_currents[regval][1];
  350. ret = IIO_VAL_INT_PLUS_MICRO;
  351. break;
  352. default:
  353. break;
  354. }
  355. break;
  356. case IIO_CHAN_INFO_SAMP_FREQ:
  357. switch (chan->type) {
  358. case IIO_PROXIMITY:
  359. ret = regmap_read(data->regmap, ADUX1020_REG_FREQUENCY,
  360. &regval);
  361. if (ret < 0)
  362. goto fail;
  363. regval = FIELD_GET(ADUX1020_PROX_FREQ_MASK, regval);
  364. *val = adux1020_rates[regval][0];
  365. *val2 = adux1020_rates[regval][1];
  366. ret = IIO_VAL_INT_PLUS_MICRO;
  367. break;
  368. default:
  369. break;
  370. }
  371. break;
  372. default:
  373. break;
  374. }
  375. fail:
  376. mutex_unlock(&data->lock);
  377. return ret;
  378. };
  379. static inline int adux1020_find_index(const int array[][2], int count, int val,
  380. int val2)
  381. {
  382. int i;
  383. for (i = 0; i < count; i++)
  384. if (val == array[i][0] && val2 == array[i][1])
  385. return i;
  386. return -EINVAL;
  387. }
  388. static int adux1020_write_raw(struct iio_dev *indio_dev,
  389. struct iio_chan_spec const *chan,
  390. int val, int val2, long mask)
  391. {
  392. struct adux1020_data *data = iio_priv(indio_dev);
  393. int i, ret = -EINVAL;
  394. mutex_lock(&data->lock);
  395. switch (mask) {
  396. case IIO_CHAN_INFO_SAMP_FREQ:
  397. if (chan->type == IIO_PROXIMITY) {
  398. i = adux1020_find_index(adux1020_rates,
  399. ARRAY_SIZE(adux1020_rates),
  400. val, val2);
  401. if (i < 0) {
  402. ret = i;
  403. goto fail;
  404. }
  405. ret = regmap_update_bits(data->regmap,
  406. ADUX1020_REG_FREQUENCY,
  407. ADUX1020_PROX_FREQ_MASK,
  408. ADUX1020_PROX_FREQ(i));
  409. }
  410. break;
  411. case IIO_CHAN_INFO_PROCESSED:
  412. if (chan->type == IIO_CURRENT) {
  413. i = adux1020_find_index(adux1020_led_currents,
  414. ARRAY_SIZE(adux1020_led_currents),
  415. val, val2);
  416. if (i < 0) {
  417. ret = i;
  418. goto fail;
  419. }
  420. ret = regmap_update_bits(data->regmap,
  421. ADUX1020_REG_LED_CURRENT,
  422. ADUX1020_LED_CURRENT_MASK, i);
  423. }
  424. break;
  425. default:
  426. break;
  427. }
  428. fail:
  429. mutex_unlock(&data->lock);
  430. return ret;
  431. }
  432. static int adux1020_write_event_config(struct iio_dev *indio_dev,
  433. const struct iio_chan_spec *chan,
  434. enum iio_event_type type,
  435. enum iio_event_direction dir, int state)
  436. {
  437. struct adux1020_data *data = iio_priv(indio_dev);
  438. int ret, mask;
  439. mutex_lock(&data->lock);
  440. ret = regmap_write(data->regmap, ADUX1020_REG_INT_ENABLE,
  441. ADUX1020_INT_ENABLE);
  442. if (ret < 0)
  443. goto fail;
  444. ret = regmap_write(data->regmap, ADUX1020_REG_INT_POLARITY, 0);
  445. if (ret < 0)
  446. goto fail;
  447. switch (chan->type) {
  448. case IIO_PROXIMITY:
  449. if (dir == IIO_EV_DIR_RISING)
  450. mask = ADUX1020_PROX_ON1_INT;
  451. else
  452. mask = ADUX1020_PROX_OFF1_INT;
  453. if (state)
  454. state = 0;
  455. else
  456. state = mask;
  457. ret = regmap_update_bits(data->regmap, ADUX1020_REG_INT_MASK,
  458. mask, state);
  459. if (ret < 0)
  460. goto fail;
  461. /*
  462. * Trigger proximity interrupt when the intensity is above
  463. * or below threshold
  464. */
  465. ret = regmap_set_bits(data->regmap, ADUX1020_REG_PROX_TYPE,
  466. ADUX1020_PROX_TYPE);
  467. if (ret < 0)
  468. goto fail;
  469. /* Set proximity mode */
  470. ret = adux1020_set_mode(data, ADUX1020_MODE_PROX_I);
  471. break;
  472. default:
  473. ret = -EINVAL;
  474. break;
  475. }
  476. fail:
  477. mutex_unlock(&data->lock);
  478. return ret;
  479. }
  480. static int adux1020_read_event_config(struct iio_dev *indio_dev,
  481. const struct iio_chan_spec *chan,
  482. enum iio_event_type type,
  483. enum iio_event_direction dir)
  484. {
  485. struct adux1020_data *data = iio_priv(indio_dev);
  486. int ret, mask;
  487. unsigned int regval;
  488. switch (chan->type) {
  489. case IIO_PROXIMITY:
  490. if (dir == IIO_EV_DIR_RISING)
  491. mask = ADUX1020_PROX_ON1_INT;
  492. else
  493. mask = ADUX1020_PROX_OFF1_INT;
  494. break;
  495. default:
  496. return -EINVAL;
  497. }
  498. ret = regmap_read(data->regmap, ADUX1020_REG_INT_MASK, &regval);
  499. if (ret < 0)
  500. return ret;
  501. return !(regval & mask);
  502. }
  503. static int adux1020_read_thresh(struct iio_dev *indio_dev,
  504. const struct iio_chan_spec *chan,
  505. enum iio_event_type type,
  506. enum iio_event_direction dir,
  507. enum iio_event_info info, int *val, int *val2)
  508. {
  509. struct adux1020_data *data = iio_priv(indio_dev);
  510. u8 reg;
  511. int ret;
  512. unsigned int regval;
  513. switch (chan->type) {
  514. case IIO_PROXIMITY:
  515. if (dir == IIO_EV_DIR_RISING)
  516. reg = ADUX1020_REG_PROX_TH_ON1;
  517. else
  518. reg = ADUX1020_REG_PROX_TH_OFF1;
  519. break;
  520. default:
  521. return -EINVAL;
  522. }
  523. ret = regmap_read(data->regmap, reg, &regval);
  524. if (ret < 0)
  525. return ret;
  526. *val = regval;
  527. return IIO_VAL_INT;
  528. }
  529. static int adux1020_write_thresh(struct iio_dev *indio_dev,
  530. const struct iio_chan_spec *chan,
  531. enum iio_event_type type,
  532. enum iio_event_direction dir,
  533. enum iio_event_info info, int val, int val2)
  534. {
  535. struct adux1020_data *data = iio_priv(indio_dev);
  536. u8 reg;
  537. switch (chan->type) {
  538. case IIO_PROXIMITY:
  539. if (dir == IIO_EV_DIR_RISING)
  540. reg = ADUX1020_REG_PROX_TH_ON1;
  541. else
  542. reg = ADUX1020_REG_PROX_TH_OFF1;
  543. break;
  544. default:
  545. return -EINVAL;
  546. }
  547. /* Full scale threshold value is 0-65535 */
  548. if (val < 0 || val > 65535)
  549. return -EINVAL;
  550. return regmap_write(data->regmap, reg, val);
  551. }
  552. static const struct iio_event_spec adux1020_proximity_event[] = {
  553. {
  554. .type = IIO_EV_TYPE_THRESH,
  555. .dir = IIO_EV_DIR_RISING,
  556. .mask_separate = BIT(IIO_EV_INFO_VALUE) |
  557. BIT(IIO_EV_INFO_ENABLE),
  558. },
  559. {
  560. .type = IIO_EV_TYPE_THRESH,
  561. .dir = IIO_EV_DIR_FALLING,
  562. .mask_separate = BIT(IIO_EV_INFO_VALUE) |
  563. BIT(IIO_EV_INFO_ENABLE),
  564. },
  565. };
  566. static const struct iio_chan_spec adux1020_channels[] = {
  567. {
  568. .type = IIO_PROXIMITY,
  569. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
  570. BIT(IIO_CHAN_INFO_SAMP_FREQ),
  571. .event_spec = adux1020_proximity_event,
  572. .num_event_specs = ARRAY_SIZE(adux1020_proximity_event),
  573. },
  574. {
  575. .type = IIO_CURRENT,
  576. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
  577. .extend_name = "led",
  578. .output = 1,
  579. },
  580. };
  581. static IIO_CONST_ATTR_SAMP_FREQ_AVAIL(
  582. "0.1 0.2 0.5 1 2 5 10 20 50 100 190 450 820 1400");
  583. static struct attribute *adux1020_attributes[] = {
  584. &iio_const_attr_sampling_frequency_available.dev_attr.attr,
  585. NULL
  586. };
  587. static const struct attribute_group adux1020_attribute_group = {
  588. .attrs = adux1020_attributes,
  589. };
  590. static const struct iio_info adux1020_info = {
  591. .attrs = &adux1020_attribute_group,
  592. .read_raw = adux1020_read_raw,
  593. .write_raw = adux1020_write_raw,
  594. .read_event_config = adux1020_read_event_config,
  595. .write_event_config = adux1020_write_event_config,
  596. .read_event_value = adux1020_read_thresh,
  597. .write_event_value = adux1020_write_thresh,
  598. };
  599. static irqreturn_t adux1020_interrupt_handler(int irq, void *private)
  600. {
  601. struct iio_dev *indio_dev = private;
  602. struct adux1020_data *data = iio_priv(indio_dev);
  603. int ret, status;
  604. ret = regmap_read(data->regmap, ADUX1020_REG_INT_STATUS, &status);
  605. if (ret < 0)
  606. return IRQ_HANDLED;
  607. status &= ADUX1020_MODE_INT_STATUS_MASK;
  608. if (status & ADUX1020_INT_PROX_ON1) {
  609. iio_push_event(indio_dev,
  610. IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0,
  611. IIO_EV_TYPE_THRESH,
  612. IIO_EV_DIR_RISING),
  613. iio_get_time_ns(indio_dev));
  614. }
  615. if (status & ADUX1020_INT_PROX_OFF1) {
  616. iio_push_event(indio_dev,
  617. IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0,
  618. IIO_EV_TYPE_THRESH,
  619. IIO_EV_DIR_FALLING),
  620. iio_get_time_ns(indio_dev));
  621. }
  622. regmap_update_bits(data->regmap, ADUX1020_REG_INT_STATUS,
  623. ADUX1020_MODE_INT_MASK, ADUX1020_INT_CLEAR);
  624. return IRQ_HANDLED;
  625. }
  626. static int adux1020_chip_init(struct adux1020_data *data)
  627. {
  628. struct i2c_client *client = data->client;
  629. int ret;
  630. unsigned int val;
  631. ret = regmap_read(data->regmap, ADUX1020_REG_CHIP_ID, &val);
  632. if (ret < 0)
  633. return ret;
  634. if ((val & ADUX1020_CHIP_ID_MASK) != ADUX1020_CHIP_ID) {
  635. dev_err(&client->dev, "invalid chip id 0x%04x\n", val);
  636. return -ENODEV;
  637. }
  638. dev_dbg(&client->dev, "Detected ADUX1020 with chip id: 0x%04x\n", val);
  639. ret = regmap_set_bits(data->regmap, ADUX1020_REG_SW_RESET,
  640. ADUX1020_SW_RESET);
  641. if (ret < 0)
  642. return ret;
  643. /* Load default configuration */
  644. ret = regmap_multi_reg_write(data->regmap, adux1020_def_conf,
  645. ARRAY_SIZE(adux1020_def_conf));
  646. if (ret < 0)
  647. return ret;
  648. ret = adux1020_flush_fifo(data);
  649. if (ret < 0)
  650. return ret;
  651. /* Use LED_IREF for proximity mode */
  652. ret = regmap_clear_bits(data->regmap, ADUX1020_REG_LED_CURRENT,
  653. ADUX1020_LED_PIREF_EN);
  654. if (ret < 0)
  655. return ret;
  656. /* Mask all interrupts */
  657. return regmap_update_bits(data->regmap, ADUX1020_REG_INT_MASK,
  658. ADUX1020_MODE_INT_MASK, ADUX1020_MODE_INT_DISABLE);
  659. }
  660. static int adux1020_probe(struct i2c_client *client)
  661. {
  662. struct adux1020_data *data;
  663. struct iio_dev *indio_dev;
  664. int ret;
  665. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  666. if (!indio_dev)
  667. return -ENOMEM;
  668. indio_dev->info = &adux1020_info;
  669. indio_dev->name = ADUX1020_DRV_NAME;
  670. indio_dev->channels = adux1020_channels;
  671. indio_dev->num_channels = ARRAY_SIZE(adux1020_channels);
  672. indio_dev->modes = INDIO_DIRECT_MODE;
  673. data = iio_priv(indio_dev);
  674. data->regmap = devm_regmap_init_i2c(client, &adux1020_regmap_config);
  675. if (IS_ERR(data->regmap)) {
  676. dev_err(&client->dev, "regmap initialization failed.\n");
  677. return PTR_ERR(data->regmap);
  678. }
  679. data->client = client;
  680. data->indio_dev = indio_dev;
  681. mutex_init(&data->lock);
  682. ret = adux1020_chip_init(data);
  683. if (ret)
  684. return ret;
  685. if (client->irq) {
  686. ret = devm_request_threaded_irq(&client->dev, client->irq,
  687. NULL, adux1020_interrupt_handler,
  688. IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
  689. ADUX1020_DRV_NAME, indio_dev);
  690. if (ret) {
  691. dev_err(&client->dev, "irq request error %d\n", -ret);
  692. return ret;
  693. }
  694. }
  695. return devm_iio_device_register(&client->dev, indio_dev);
  696. }
  697. static const struct i2c_device_id adux1020_id[] = {
  698. { "adux1020" },
  699. {}
  700. };
  701. MODULE_DEVICE_TABLE(i2c, adux1020_id);
  702. static const struct of_device_id adux1020_of_match[] = {
  703. { .compatible = "adi,adux1020" },
  704. { }
  705. };
  706. MODULE_DEVICE_TABLE(of, adux1020_of_match);
  707. static struct i2c_driver adux1020_driver = {
  708. .driver = {
  709. .name = ADUX1020_DRV_NAME,
  710. .of_match_table = adux1020_of_match,
  711. },
  712. .probe = adux1020_probe,
  713. .id_table = adux1020_id,
  714. };
  715. module_i2c_driver(adux1020_driver);
  716. MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
  717. MODULE_DESCRIPTION("ADUX1020 photometric sensor");
  718. MODULE_LICENSE("GPL");