fxls8962af-core.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * NXP FXLS8962AF/FXLS8964AF Accelerometer Core Driver
  4. *
  5. * Copyright 2021 Connected Cars A/S
  6. *
  7. * Datasheet:
  8. * https://www.nxp.com/docs/en/data-sheet/FXLS8962AF.pdf
  9. * https://www.nxp.com/docs/en/data-sheet/FXLS8964AF.pdf
  10. *
  11. * Errata:
  12. * https://www.nxp.com/docs/en/errata/ES_FXLS8962AF.pdf
  13. */
  14. #include <linux/bits.h>
  15. #include <linux/bitfield.h>
  16. #include <linux/i2c.h>
  17. #include <linux/irq.h>
  18. #include <linux/module.h>
  19. #include <linux/mod_devicetable.h>
  20. #include <linux/pm_runtime.h>
  21. #include <linux/property.h>
  22. #include <linux/regulator/consumer.h>
  23. #include <linux/regmap.h>
  24. #include <linux/iio/buffer.h>
  25. #include <linux/iio/events.h>
  26. #include <linux/iio/iio.h>
  27. #include <linux/iio/kfifo_buf.h>
  28. #include <linux/iio/sysfs.h>
  29. #include "fxls8962af.h"
  30. #define FXLS8962AF_INT_STATUS 0x00
  31. #define FXLS8962AF_INT_STATUS_SRC_BOOT BIT(0)
  32. #define FXLS8962AF_INT_STATUS_SRC_SDCD_OT BIT(4)
  33. #define FXLS8962AF_INT_STATUS_SRC_BUF BIT(5)
  34. #define FXLS8962AF_INT_STATUS_SRC_DRDY BIT(7)
  35. #define FXLS8962AF_TEMP_OUT 0x01
  36. #define FXLS8962AF_VECM_LSB 0x02
  37. #define FXLS8962AF_OUT_X_LSB 0x04
  38. #define FXLS8962AF_OUT_Y_LSB 0x06
  39. #define FXLS8962AF_OUT_Z_LSB 0x08
  40. #define FXLS8962AF_BUF_STATUS 0x0b
  41. #define FXLS8962AF_BUF_STATUS_BUF_CNT GENMASK(5, 0)
  42. #define FXLS8962AF_BUF_STATUS_BUF_OVF BIT(6)
  43. #define FXLS8962AF_BUF_STATUS_BUF_WMRK BIT(7)
  44. #define FXLS8962AF_BUF_X_LSB 0x0c
  45. #define FXLS8962AF_BUF_Y_LSB 0x0e
  46. #define FXLS8962AF_BUF_Z_LSB 0x10
  47. #define FXLS8962AF_PROD_REV 0x12
  48. #define FXLS8962AF_WHO_AM_I 0x13
  49. #define FXLS8962AF_SYS_MODE 0x14
  50. #define FXLS8962AF_SENS_CONFIG1 0x15
  51. #define FXLS8962AF_SENS_CONFIG1_ACTIVE BIT(0)
  52. #define FXLS8962AF_SENS_CONFIG1_RST BIT(7)
  53. #define FXLS8962AF_SC1_FSR_MASK GENMASK(2, 1)
  54. #define FXLS8962AF_SC1_FSR_PREP(x) FIELD_PREP(FXLS8962AF_SC1_FSR_MASK, (x))
  55. #define FXLS8962AF_SC1_FSR_GET(x) FIELD_GET(FXLS8962AF_SC1_FSR_MASK, (x))
  56. #define FXLS8962AF_SENS_CONFIG2 0x16
  57. #define FXLS8962AF_SENS_CONFIG3 0x17
  58. #define FXLS8962AF_SC3_WAKE_ODR_MASK GENMASK(7, 4)
  59. #define FXLS8962AF_SC3_WAKE_ODR_PREP(x) FIELD_PREP(FXLS8962AF_SC3_WAKE_ODR_MASK, (x))
  60. #define FXLS8962AF_SC3_WAKE_ODR_GET(x) FIELD_GET(FXLS8962AF_SC3_WAKE_ODR_MASK, (x))
  61. #define FXLS8962AF_SENS_CONFIG4 0x18
  62. #define FXLS8962AF_SC4_INT_PP_OD_MASK BIT(1)
  63. #define FXLS8962AF_SC4_INT_PP_OD_PREP(x) FIELD_PREP(FXLS8962AF_SC4_INT_PP_OD_MASK, (x))
  64. #define FXLS8962AF_SC4_INT_POL_MASK BIT(0)
  65. #define FXLS8962AF_SC4_INT_POL_PREP(x) FIELD_PREP(FXLS8962AF_SC4_INT_POL_MASK, (x))
  66. #define FXLS8962AF_SENS_CONFIG5 0x19
  67. #define FXLS8962AF_WAKE_IDLE_LSB 0x1b
  68. #define FXLS8962AF_SLEEP_IDLE_LSB 0x1c
  69. #define FXLS8962AF_ASLP_COUNT_LSB 0x1e
  70. #define FXLS8962AF_INT_EN 0x20
  71. #define FXLS8962AF_INT_EN_SDCD_OT_EN BIT(5)
  72. #define FXLS8962AF_INT_EN_BUF_EN BIT(6)
  73. #define FXLS8962AF_INT_PIN_SEL 0x21
  74. #define FXLS8962AF_INT_PIN_SEL_MASK GENMASK(7, 0)
  75. #define FXLS8962AF_INT_PIN_SEL_INT1 0x00
  76. #define FXLS8962AF_INT_PIN_SEL_INT2 GENMASK(7, 0)
  77. #define FXLS8962AF_OFF_X 0x22
  78. #define FXLS8962AF_OFF_Y 0x23
  79. #define FXLS8962AF_OFF_Z 0x24
  80. #define FXLS8962AF_BUF_CONFIG1 0x26
  81. #define FXLS8962AF_BC1_BUF_MODE_MASK GENMASK(6, 5)
  82. #define FXLS8962AF_BC1_BUF_MODE_PREP(x) FIELD_PREP(FXLS8962AF_BC1_BUF_MODE_MASK, (x))
  83. #define FXLS8962AF_BUF_CONFIG2 0x27
  84. #define FXLS8962AF_BUF_CONFIG2_BUF_WMRK GENMASK(5, 0)
  85. #define FXLS8962AF_ORIENT_STATUS 0x28
  86. #define FXLS8962AF_ORIENT_CONFIG 0x29
  87. #define FXLS8962AF_ORIENT_DBCOUNT 0x2a
  88. #define FXLS8962AF_ORIENT_BF_ZCOMP 0x2b
  89. #define FXLS8962AF_ORIENT_THS_REG 0x2c
  90. #define FXLS8962AF_SDCD_INT_SRC1 0x2d
  91. #define FXLS8962AF_SDCD_INT_SRC1_X_OT BIT(5)
  92. #define FXLS8962AF_SDCD_INT_SRC1_X_POL BIT(4)
  93. #define FXLS8962AF_SDCD_INT_SRC1_Y_OT BIT(3)
  94. #define FXLS8962AF_SDCD_INT_SRC1_Y_POL BIT(2)
  95. #define FXLS8962AF_SDCD_INT_SRC1_Z_OT BIT(1)
  96. #define FXLS8962AF_SDCD_INT_SRC1_Z_POL BIT(0)
  97. #define FXLS8962AF_SDCD_INT_SRC2 0x2e
  98. #define FXLS8962AF_SDCD_CONFIG1 0x2f
  99. #define FXLS8962AF_SDCD_CONFIG1_Z_OT_EN BIT(3)
  100. #define FXLS8962AF_SDCD_CONFIG1_Y_OT_EN BIT(4)
  101. #define FXLS8962AF_SDCD_CONFIG1_X_OT_EN BIT(5)
  102. #define FXLS8962AF_SDCD_CONFIG1_OT_ELE BIT(7)
  103. #define FXLS8962AF_SDCD_CONFIG2 0x30
  104. #define FXLS8962AF_SDCD_CONFIG2_SDCD_EN BIT(7)
  105. #define FXLS8962AF_SC2_REF_UPDM_AC GENMASK(6, 5)
  106. #define FXLS8962AF_SDCD_OT_DBCNT 0x31
  107. #define FXLS8962AF_SDCD_WT_DBCNT 0x32
  108. #define FXLS8962AF_SDCD_LTHS_LSB 0x33
  109. #define FXLS8962AF_SDCD_UTHS_LSB 0x35
  110. #define FXLS8962AF_SELF_TEST_CONFIG1 0x37
  111. #define FXLS8962AF_SELF_TEST_CONFIG2 0x38
  112. #define FXLS8962AF_MAX_REG 0x38
  113. #define FXLS8962AF_DEVICE_ID 0x62
  114. #define FXLS8964AF_DEVICE_ID 0x84
  115. /* Raw temp channel offset */
  116. #define FXLS8962AF_TEMP_CENTER_VAL 25
  117. #define FXLS8962AF_AUTO_SUSPEND_DELAY_MS 2000
  118. #define FXLS8962AF_FIFO_LENGTH 32
  119. #define FXLS8962AF_SCALE_TABLE_LEN 4
  120. #define FXLS8962AF_SAMP_FREQ_TABLE_LEN 13
  121. static const int fxls8962af_scale_table[FXLS8962AF_SCALE_TABLE_LEN][2] = {
  122. {0, IIO_G_TO_M_S_2(980000)},
  123. {0, IIO_G_TO_M_S_2(1950000)},
  124. {0, IIO_G_TO_M_S_2(3910000)},
  125. {0, IIO_G_TO_M_S_2(7810000)},
  126. };
  127. static const int fxls8962af_samp_freq_table[FXLS8962AF_SAMP_FREQ_TABLE_LEN][2] = {
  128. {3200, 0}, {1600, 0}, {800, 0}, {400, 0}, {200, 0}, {100, 0},
  129. {50, 0}, {25, 0}, {12, 500000}, {6, 250000}, {3, 125000},
  130. {1, 563000}, {0, 781000},
  131. };
  132. struct fxls8962af_chip_info {
  133. const char *name;
  134. const struct iio_chan_spec *channels;
  135. int num_channels;
  136. u8 chip_id;
  137. };
  138. struct fxls8962af_data {
  139. struct regmap *regmap;
  140. const struct fxls8962af_chip_info *chip_info;
  141. struct {
  142. __le16 channels[3];
  143. s64 ts __aligned(8);
  144. } scan;
  145. int64_t timestamp, old_timestamp; /* Only used in hw fifo mode. */
  146. struct iio_mount_matrix orientation;
  147. int irq;
  148. u8 watermark;
  149. u8 enable_event;
  150. u16 lower_thres;
  151. u16 upper_thres;
  152. };
  153. const struct regmap_config fxls8962af_i2c_regmap_conf = {
  154. .reg_bits = 8,
  155. .val_bits = 8,
  156. .max_register = FXLS8962AF_MAX_REG,
  157. };
  158. EXPORT_SYMBOL_NS_GPL(fxls8962af_i2c_regmap_conf, IIO_FXLS8962AF);
  159. const struct regmap_config fxls8962af_spi_regmap_conf = {
  160. .reg_bits = 8,
  161. .pad_bits = 8,
  162. .val_bits = 8,
  163. .max_register = FXLS8962AF_MAX_REG,
  164. };
  165. EXPORT_SYMBOL_NS_GPL(fxls8962af_spi_regmap_conf, IIO_FXLS8962AF);
  166. enum {
  167. fxls8962af_idx_x,
  168. fxls8962af_idx_y,
  169. fxls8962af_idx_z,
  170. fxls8962af_idx_ts,
  171. };
  172. enum fxls8962af_int_pin {
  173. FXLS8962AF_PIN_INT1,
  174. FXLS8962AF_PIN_INT2,
  175. };
  176. static int fxls8962af_power_on(struct fxls8962af_data *data)
  177. {
  178. struct device *dev = regmap_get_device(data->regmap);
  179. int ret;
  180. ret = pm_runtime_resume_and_get(dev);
  181. if (ret)
  182. dev_err(dev, "failed to power on\n");
  183. return ret;
  184. }
  185. static int fxls8962af_power_off(struct fxls8962af_data *data)
  186. {
  187. struct device *dev = regmap_get_device(data->regmap);
  188. int ret;
  189. pm_runtime_mark_last_busy(dev);
  190. ret = pm_runtime_put_autosuspend(dev);
  191. if (ret)
  192. dev_err(dev, "failed to power off\n");
  193. return ret;
  194. }
  195. static int fxls8962af_standby(struct fxls8962af_data *data)
  196. {
  197. return regmap_clear_bits(data->regmap, FXLS8962AF_SENS_CONFIG1,
  198. FXLS8962AF_SENS_CONFIG1_ACTIVE);
  199. }
  200. static int fxls8962af_active(struct fxls8962af_data *data)
  201. {
  202. return regmap_update_bits(data->regmap, FXLS8962AF_SENS_CONFIG1,
  203. FXLS8962AF_SENS_CONFIG1_ACTIVE, 1);
  204. }
  205. static int fxls8962af_is_active(struct fxls8962af_data *data)
  206. {
  207. unsigned int reg;
  208. int ret;
  209. ret = regmap_read(data->regmap, FXLS8962AF_SENS_CONFIG1, &reg);
  210. if (ret)
  211. return ret;
  212. return reg & FXLS8962AF_SENS_CONFIG1_ACTIVE;
  213. }
  214. static int fxls8962af_get_out(struct fxls8962af_data *data,
  215. struct iio_chan_spec const *chan, int *val)
  216. {
  217. struct device *dev = regmap_get_device(data->regmap);
  218. __le16 raw_val;
  219. int is_active;
  220. int ret;
  221. is_active = fxls8962af_is_active(data);
  222. if (!is_active) {
  223. ret = fxls8962af_power_on(data);
  224. if (ret)
  225. return ret;
  226. }
  227. ret = regmap_bulk_read(data->regmap, chan->address,
  228. &raw_val, sizeof(data->lower_thres));
  229. if (!is_active)
  230. fxls8962af_power_off(data);
  231. if (ret) {
  232. dev_err(dev, "failed to get out reg 0x%lx\n", chan->address);
  233. return ret;
  234. }
  235. *val = sign_extend32(le16_to_cpu(raw_val),
  236. chan->scan_type.realbits - 1);
  237. return IIO_VAL_INT;
  238. }
  239. static int fxls8962af_read_avail(struct iio_dev *indio_dev,
  240. struct iio_chan_spec const *chan,
  241. const int **vals, int *type, int *length,
  242. long mask)
  243. {
  244. switch (mask) {
  245. case IIO_CHAN_INFO_SCALE:
  246. *type = IIO_VAL_INT_PLUS_NANO;
  247. *vals = (int *)fxls8962af_scale_table;
  248. *length = ARRAY_SIZE(fxls8962af_scale_table) * 2;
  249. return IIO_AVAIL_LIST;
  250. case IIO_CHAN_INFO_SAMP_FREQ:
  251. *type = IIO_VAL_INT_PLUS_MICRO;
  252. *vals = (int *)fxls8962af_samp_freq_table;
  253. *length = ARRAY_SIZE(fxls8962af_samp_freq_table) * 2;
  254. return IIO_AVAIL_LIST;
  255. default:
  256. return -EINVAL;
  257. }
  258. }
  259. static int fxls8962af_write_raw_get_fmt(struct iio_dev *indio_dev,
  260. struct iio_chan_spec const *chan,
  261. long mask)
  262. {
  263. switch (mask) {
  264. case IIO_CHAN_INFO_SCALE:
  265. return IIO_VAL_INT_PLUS_NANO;
  266. case IIO_CHAN_INFO_SAMP_FREQ:
  267. return IIO_VAL_INT_PLUS_MICRO;
  268. default:
  269. return IIO_VAL_INT_PLUS_NANO;
  270. }
  271. }
  272. static int fxls8962af_update_config(struct fxls8962af_data *data, u8 reg,
  273. u8 mask, u8 val)
  274. {
  275. int ret;
  276. int is_active;
  277. is_active = fxls8962af_is_active(data);
  278. if (is_active) {
  279. ret = fxls8962af_standby(data);
  280. if (ret)
  281. return ret;
  282. }
  283. ret = regmap_update_bits(data->regmap, reg, mask, val);
  284. if (ret)
  285. return ret;
  286. if (is_active) {
  287. ret = fxls8962af_active(data);
  288. if (ret)
  289. return ret;
  290. }
  291. return 0;
  292. }
  293. static int fxls8962af_set_full_scale(struct fxls8962af_data *data, u32 scale)
  294. {
  295. int i;
  296. for (i = 0; i < ARRAY_SIZE(fxls8962af_scale_table); i++)
  297. if (scale == fxls8962af_scale_table[i][1])
  298. break;
  299. if (i == ARRAY_SIZE(fxls8962af_scale_table))
  300. return -EINVAL;
  301. return fxls8962af_update_config(data, FXLS8962AF_SENS_CONFIG1,
  302. FXLS8962AF_SC1_FSR_MASK,
  303. FXLS8962AF_SC1_FSR_PREP(i));
  304. }
  305. static unsigned int fxls8962af_read_full_scale(struct fxls8962af_data *data,
  306. int *val)
  307. {
  308. int ret;
  309. unsigned int reg;
  310. u8 range_idx;
  311. ret = regmap_read(data->regmap, FXLS8962AF_SENS_CONFIG1, &reg);
  312. if (ret)
  313. return ret;
  314. range_idx = FXLS8962AF_SC1_FSR_GET(reg);
  315. *val = fxls8962af_scale_table[range_idx][1];
  316. return IIO_VAL_INT_PLUS_NANO;
  317. }
  318. static int fxls8962af_set_samp_freq(struct fxls8962af_data *data, u32 val,
  319. u32 val2)
  320. {
  321. int i;
  322. for (i = 0; i < ARRAY_SIZE(fxls8962af_samp_freq_table); i++)
  323. if (val == fxls8962af_samp_freq_table[i][0] &&
  324. val2 == fxls8962af_samp_freq_table[i][1])
  325. break;
  326. if (i == ARRAY_SIZE(fxls8962af_samp_freq_table))
  327. return -EINVAL;
  328. return fxls8962af_update_config(data, FXLS8962AF_SENS_CONFIG3,
  329. FXLS8962AF_SC3_WAKE_ODR_MASK,
  330. FXLS8962AF_SC3_WAKE_ODR_PREP(i));
  331. }
  332. static unsigned int fxls8962af_read_samp_freq(struct fxls8962af_data *data,
  333. int *val, int *val2)
  334. {
  335. int ret;
  336. unsigned int reg;
  337. u8 range_idx;
  338. ret = regmap_read(data->regmap, FXLS8962AF_SENS_CONFIG3, &reg);
  339. if (ret)
  340. return ret;
  341. range_idx = FXLS8962AF_SC3_WAKE_ODR_GET(reg);
  342. *val = fxls8962af_samp_freq_table[range_idx][0];
  343. *val2 = fxls8962af_samp_freq_table[range_idx][1];
  344. return IIO_VAL_INT_PLUS_MICRO;
  345. }
  346. static int fxls8962af_read_raw(struct iio_dev *indio_dev,
  347. struct iio_chan_spec const *chan,
  348. int *val, int *val2, long mask)
  349. {
  350. struct fxls8962af_data *data = iio_priv(indio_dev);
  351. switch (mask) {
  352. case IIO_CHAN_INFO_RAW:
  353. switch (chan->type) {
  354. case IIO_TEMP:
  355. case IIO_ACCEL:
  356. return fxls8962af_get_out(data, chan, val);
  357. default:
  358. return -EINVAL;
  359. }
  360. case IIO_CHAN_INFO_OFFSET:
  361. if (chan->type != IIO_TEMP)
  362. return -EINVAL;
  363. *val = FXLS8962AF_TEMP_CENTER_VAL;
  364. return IIO_VAL_INT;
  365. case IIO_CHAN_INFO_SCALE:
  366. *val = 0;
  367. return fxls8962af_read_full_scale(data, val2);
  368. case IIO_CHAN_INFO_SAMP_FREQ:
  369. return fxls8962af_read_samp_freq(data, val, val2);
  370. default:
  371. return -EINVAL;
  372. }
  373. }
  374. static int fxls8962af_write_raw(struct iio_dev *indio_dev,
  375. struct iio_chan_spec const *chan,
  376. int val, int val2, long mask)
  377. {
  378. struct fxls8962af_data *data = iio_priv(indio_dev);
  379. int ret;
  380. switch (mask) {
  381. case IIO_CHAN_INFO_SCALE:
  382. if (val != 0)
  383. return -EINVAL;
  384. ret = iio_device_claim_direct_mode(indio_dev);
  385. if (ret)
  386. return ret;
  387. ret = fxls8962af_set_full_scale(data, val2);
  388. iio_device_release_direct_mode(indio_dev);
  389. return ret;
  390. case IIO_CHAN_INFO_SAMP_FREQ:
  391. ret = iio_device_claim_direct_mode(indio_dev);
  392. if (ret)
  393. return ret;
  394. ret = fxls8962af_set_samp_freq(data, val, val2);
  395. iio_device_release_direct_mode(indio_dev);
  396. return ret;
  397. default:
  398. return -EINVAL;
  399. }
  400. }
  401. static int fxls8962af_event_setup(struct fxls8962af_data *data, int state)
  402. {
  403. /* Enable wakeup interrupt */
  404. int mask = FXLS8962AF_INT_EN_SDCD_OT_EN;
  405. int value = state ? mask : 0;
  406. return regmap_update_bits(data->regmap, FXLS8962AF_INT_EN, mask, value);
  407. }
  408. static int fxls8962af_set_watermark(struct iio_dev *indio_dev, unsigned val)
  409. {
  410. struct fxls8962af_data *data = iio_priv(indio_dev);
  411. if (val > FXLS8962AF_FIFO_LENGTH)
  412. val = FXLS8962AF_FIFO_LENGTH;
  413. data->watermark = val;
  414. return 0;
  415. }
  416. static int __fxls8962af_set_thresholds(struct fxls8962af_data *data,
  417. const struct iio_chan_spec *chan,
  418. enum iio_event_direction dir,
  419. int val)
  420. {
  421. switch (dir) {
  422. case IIO_EV_DIR_FALLING:
  423. data->lower_thres = val;
  424. return regmap_bulk_write(data->regmap, FXLS8962AF_SDCD_LTHS_LSB,
  425. &data->lower_thres, sizeof(data->lower_thres));
  426. case IIO_EV_DIR_RISING:
  427. data->upper_thres = val;
  428. return regmap_bulk_write(data->regmap, FXLS8962AF_SDCD_UTHS_LSB,
  429. &data->upper_thres, sizeof(data->upper_thres));
  430. default:
  431. return -EINVAL;
  432. }
  433. }
  434. static int fxls8962af_read_event(struct iio_dev *indio_dev,
  435. const struct iio_chan_spec *chan,
  436. enum iio_event_type type,
  437. enum iio_event_direction dir,
  438. enum iio_event_info info,
  439. int *val, int *val2)
  440. {
  441. struct fxls8962af_data *data = iio_priv(indio_dev);
  442. int ret;
  443. if (type != IIO_EV_TYPE_THRESH)
  444. return -EINVAL;
  445. switch (dir) {
  446. case IIO_EV_DIR_FALLING:
  447. ret = regmap_bulk_read(data->regmap, FXLS8962AF_SDCD_LTHS_LSB,
  448. &data->lower_thres, sizeof(data->lower_thres));
  449. if (ret)
  450. return ret;
  451. *val = sign_extend32(data->lower_thres, chan->scan_type.realbits - 1);
  452. return IIO_VAL_INT;
  453. case IIO_EV_DIR_RISING:
  454. ret = regmap_bulk_read(data->regmap, FXLS8962AF_SDCD_UTHS_LSB,
  455. &data->upper_thres, sizeof(data->upper_thres));
  456. if (ret)
  457. return ret;
  458. *val = sign_extend32(data->upper_thres, chan->scan_type.realbits - 1);
  459. return IIO_VAL_INT;
  460. default:
  461. return -EINVAL;
  462. }
  463. }
  464. static int fxls8962af_write_event(struct iio_dev *indio_dev,
  465. const struct iio_chan_spec *chan,
  466. enum iio_event_type type,
  467. enum iio_event_direction dir,
  468. enum iio_event_info info,
  469. int val, int val2)
  470. {
  471. struct fxls8962af_data *data = iio_priv(indio_dev);
  472. int ret, val_masked;
  473. if (type != IIO_EV_TYPE_THRESH)
  474. return -EINVAL;
  475. if (val < -2048 || val > 2047)
  476. return -EINVAL;
  477. if (data->enable_event)
  478. return -EBUSY;
  479. val_masked = val & GENMASK(11, 0);
  480. if (fxls8962af_is_active(data)) {
  481. ret = fxls8962af_standby(data);
  482. if (ret)
  483. return ret;
  484. ret = __fxls8962af_set_thresholds(data, chan, dir, val_masked);
  485. if (ret)
  486. return ret;
  487. return fxls8962af_active(data);
  488. } else {
  489. return __fxls8962af_set_thresholds(data, chan, dir, val_masked);
  490. }
  491. }
  492. static int
  493. fxls8962af_read_event_config(struct iio_dev *indio_dev,
  494. const struct iio_chan_spec *chan,
  495. enum iio_event_type type,
  496. enum iio_event_direction dir)
  497. {
  498. struct fxls8962af_data *data = iio_priv(indio_dev);
  499. if (type != IIO_EV_TYPE_THRESH)
  500. return -EINVAL;
  501. switch (chan->channel2) {
  502. case IIO_MOD_X:
  503. return !!(FXLS8962AF_SDCD_CONFIG1_X_OT_EN & data->enable_event);
  504. case IIO_MOD_Y:
  505. return !!(FXLS8962AF_SDCD_CONFIG1_Y_OT_EN & data->enable_event);
  506. case IIO_MOD_Z:
  507. return !!(FXLS8962AF_SDCD_CONFIG1_Z_OT_EN & data->enable_event);
  508. default:
  509. return -EINVAL;
  510. }
  511. }
  512. static int
  513. fxls8962af_write_event_config(struct iio_dev *indio_dev,
  514. const struct iio_chan_spec *chan,
  515. enum iio_event_type type,
  516. enum iio_event_direction dir, int state)
  517. {
  518. struct fxls8962af_data *data = iio_priv(indio_dev);
  519. u8 enable_event, enable_bits;
  520. int ret, value;
  521. if (type != IIO_EV_TYPE_THRESH)
  522. return -EINVAL;
  523. switch (chan->channel2) {
  524. case IIO_MOD_X:
  525. enable_bits = FXLS8962AF_SDCD_CONFIG1_X_OT_EN;
  526. break;
  527. case IIO_MOD_Y:
  528. enable_bits = FXLS8962AF_SDCD_CONFIG1_Y_OT_EN;
  529. break;
  530. case IIO_MOD_Z:
  531. enable_bits = FXLS8962AF_SDCD_CONFIG1_Z_OT_EN;
  532. break;
  533. default:
  534. return -EINVAL;
  535. }
  536. if (state)
  537. enable_event = data->enable_event | enable_bits;
  538. else
  539. enable_event = data->enable_event & ~enable_bits;
  540. if (data->enable_event == enable_event)
  541. return 0;
  542. ret = fxls8962af_standby(data);
  543. if (ret)
  544. return ret;
  545. /* Enable events */
  546. value = enable_event | FXLS8962AF_SDCD_CONFIG1_OT_ELE;
  547. ret = regmap_write(data->regmap, FXLS8962AF_SDCD_CONFIG1, value);
  548. if (ret)
  549. return ret;
  550. /*
  551. * Enable update of SDCD_REF_X/Y/Z values with the current decimated and
  552. * trimmed X/Y/Z acceleration input data. This allows for acceleration
  553. * slope detection with Data(n) to Data(n–1) always used as the input
  554. * to the window comparator.
  555. */
  556. value = enable_event ?
  557. FXLS8962AF_SDCD_CONFIG2_SDCD_EN | FXLS8962AF_SC2_REF_UPDM_AC :
  558. 0x00;
  559. ret = regmap_write(data->regmap, FXLS8962AF_SDCD_CONFIG2, value);
  560. if (ret)
  561. return ret;
  562. ret = fxls8962af_event_setup(data, state);
  563. if (ret)
  564. return ret;
  565. data->enable_event = enable_event;
  566. if (data->enable_event) {
  567. fxls8962af_active(data);
  568. ret = fxls8962af_power_on(data);
  569. } else {
  570. ret = iio_device_claim_direct_mode(indio_dev);
  571. if (ret)
  572. return ret;
  573. /* Not in buffered mode so disable power */
  574. ret = fxls8962af_power_off(data);
  575. iio_device_release_direct_mode(indio_dev);
  576. }
  577. return ret;
  578. }
  579. static const struct iio_event_spec fxls8962af_event[] = {
  580. {
  581. .type = IIO_EV_TYPE_THRESH,
  582. .dir = IIO_EV_DIR_EITHER,
  583. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  584. },
  585. {
  586. .type = IIO_EV_TYPE_THRESH,
  587. .dir = IIO_EV_DIR_FALLING,
  588. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  589. },
  590. {
  591. .type = IIO_EV_TYPE_THRESH,
  592. .dir = IIO_EV_DIR_RISING,
  593. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  594. },
  595. };
  596. #define FXLS8962AF_CHANNEL(axis, reg, idx) { \
  597. .type = IIO_ACCEL, \
  598. .address = reg, \
  599. .modified = 1, \
  600. .channel2 = IIO_MOD_##axis, \
  601. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  602. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
  603. BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  604. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE) | \
  605. BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  606. .scan_index = idx, \
  607. .scan_type = { \
  608. .sign = 's', \
  609. .realbits = 12, \
  610. .storagebits = 16, \
  611. .endianness = IIO_LE, \
  612. }, \
  613. .event_spec = fxls8962af_event, \
  614. .num_event_specs = ARRAY_SIZE(fxls8962af_event), \
  615. }
  616. #define FXLS8962AF_TEMP_CHANNEL { \
  617. .type = IIO_TEMP, \
  618. .address = FXLS8962AF_TEMP_OUT, \
  619. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  620. BIT(IIO_CHAN_INFO_OFFSET),\
  621. .scan_index = -1, \
  622. .scan_type = { \
  623. .realbits = 8, \
  624. .storagebits = 8, \
  625. }, \
  626. }
  627. static const struct iio_chan_spec fxls8962af_channels[] = {
  628. FXLS8962AF_CHANNEL(X, FXLS8962AF_OUT_X_LSB, fxls8962af_idx_x),
  629. FXLS8962AF_CHANNEL(Y, FXLS8962AF_OUT_Y_LSB, fxls8962af_idx_y),
  630. FXLS8962AF_CHANNEL(Z, FXLS8962AF_OUT_Z_LSB, fxls8962af_idx_z),
  631. IIO_CHAN_SOFT_TIMESTAMP(fxls8962af_idx_ts),
  632. FXLS8962AF_TEMP_CHANNEL,
  633. };
  634. static const struct fxls8962af_chip_info fxls_chip_info_table[] = {
  635. [fxls8962af] = {
  636. .chip_id = FXLS8962AF_DEVICE_ID,
  637. .name = "fxls8962af",
  638. .channels = fxls8962af_channels,
  639. .num_channels = ARRAY_SIZE(fxls8962af_channels),
  640. },
  641. [fxls8964af] = {
  642. .chip_id = FXLS8964AF_DEVICE_ID,
  643. .name = "fxls8964af",
  644. .channels = fxls8962af_channels,
  645. .num_channels = ARRAY_SIZE(fxls8962af_channels),
  646. },
  647. };
  648. static const struct iio_info fxls8962af_info = {
  649. .read_raw = &fxls8962af_read_raw,
  650. .write_raw = &fxls8962af_write_raw,
  651. .write_raw_get_fmt = fxls8962af_write_raw_get_fmt,
  652. .read_event_value = fxls8962af_read_event,
  653. .write_event_value = fxls8962af_write_event,
  654. .read_event_config = fxls8962af_read_event_config,
  655. .write_event_config = fxls8962af_write_event_config,
  656. .read_avail = fxls8962af_read_avail,
  657. .hwfifo_set_watermark = fxls8962af_set_watermark,
  658. };
  659. static int fxls8962af_reset(struct fxls8962af_data *data)
  660. {
  661. struct device *dev = regmap_get_device(data->regmap);
  662. unsigned int reg;
  663. int ret;
  664. ret = regmap_set_bits(data->regmap, FXLS8962AF_SENS_CONFIG1,
  665. FXLS8962AF_SENS_CONFIG1_RST);
  666. if (ret)
  667. return ret;
  668. /* TBOOT1, TBOOT2, specifies we have to wait between 1 - 17.7ms */
  669. ret = regmap_read_poll_timeout(data->regmap, FXLS8962AF_INT_STATUS, reg,
  670. (reg & FXLS8962AF_INT_STATUS_SRC_BOOT),
  671. 1000, 18000);
  672. if (ret == -ETIMEDOUT)
  673. dev_err(dev, "reset timeout, int_status = 0x%x\n", reg);
  674. return ret;
  675. }
  676. static int __fxls8962af_fifo_set_mode(struct fxls8962af_data *data, bool onoff)
  677. {
  678. int ret;
  679. /* Enable watermark at max fifo size */
  680. ret = regmap_update_bits(data->regmap, FXLS8962AF_BUF_CONFIG2,
  681. FXLS8962AF_BUF_CONFIG2_BUF_WMRK,
  682. data->watermark);
  683. if (ret)
  684. return ret;
  685. return regmap_update_bits(data->regmap, FXLS8962AF_BUF_CONFIG1,
  686. FXLS8962AF_BC1_BUF_MODE_MASK,
  687. FXLS8962AF_BC1_BUF_MODE_PREP(onoff));
  688. }
  689. static int fxls8962af_buffer_preenable(struct iio_dev *indio_dev)
  690. {
  691. return fxls8962af_power_on(iio_priv(indio_dev));
  692. }
  693. static int fxls8962af_buffer_postenable(struct iio_dev *indio_dev)
  694. {
  695. struct fxls8962af_data *data = iio_priv(indio_dev);
  696. int ret;
  697. fxls8962af_standby(data);
  698. /* Enable buffer interrupt */
  699. ret = regmap_set_bits(data->regmap, FXLS8962AF_INT_EN,
  700. FXLS8962AF_INT_EN_BUF_EN);
  701. if (ret)
  702. return ret;
  703. ret = __fxls8962af_fifo_set_mode(data, true);
  704. fxls8962af_active(data);
  705. return ret;
  706. }
  707. static int fxls8962af_buffer_predisable(struct iio_dev *indio_dev)
  708. {
  709. struct fxls8962af_data *data = iio_priv(indio_dev);
  710. int ret;
  711. fxls8962af_standby(data);
  712. /* Disable buffer interrupt */
  713. ret = regmap_clear_bits(data->regmap, FXLS8962AF_INT_EN,
  714. FXLS8962AF_INT_EN_BUF_EN);
  715. if (ret)
  716. return ret;
  717. ret = __fxls8962af_fifo_set_mode(data, false);
  718. if (data->enable_event)
  719. fxls8962af_active(data);
  720. return ret;
  721. }
  722. static int fxls8962af_buffer_postdisable(struct iio_dev *indio_dev)
  723. {
  724. struct fxls8962af_data *data = iio_priv(indio_dev);
  725. if (!data->enable_event)
  726. fxls8962af_power_off(data);
  727. return 0;
  728. }
  729. static const struct iio_buffer_setup_ops fxls8962af_buffer_ops = {
  730. .preenable = fxls8962af_buffer_preenable,
  731. .postenable = fxls8962af_buffer_postenable,
  732. .predisable = fxls8962af_buffer_predisable,
  733. .postdisable = fxls8962af_buffer_postdisable,
  734. };
  735. static int fxls8962af_i2c_raw_read_errata3(struct fxls8962af_data *data,
  736. u16 *buffer, int samples,
  737. int sample_length)
  738. {
  739. int i, ret;
  740. for (i = 0; i < samples; i++) {
  741. ret = regmap_raw_read(data->regmap, FXLS8962AF_BUF_X_LSB,
  742. &buffer[i * 3], sample_length);
  743. if (ret)
  744. return ret;
  745. }
  746. return 0;
  747. }
  748. static int fxls8962af_fifo_transfer(struct fxls8962af_data *data,
  749. u16 *buffer, int samples)
  750. {
  751. struct device *dev = regmap_get_device(data->regmap);
  752. int sample_length = 3 * sizeof(*buffer);
  753. int total_length = samples * sample_length;
  754. int ret;
  755. if (i2c_verify_client(dev) &&
  756. data->chip_info->chip_id == FXLS8962AF_DEVICE_ID)
  757. /*
  758. * Due to errata bug (only applicable on fxls8962af):
  759. * E3: FIFO burst read operation error using I2C interface
  760. * We have to avoid burst reads on I2C..
  761. */
  762. ret = fxls8962af_i2c_raw_read_errata3(data, buffer, samples,
  763. sample_length);
  764. else
  765. ret = regmap_raw_read(data->regmap, FXLS8962AF_BUF_X_LSB, buffer,
  766. total_length);
  767. if (ret)
  768. dev_err(dev, "Error transferring data from fifo: %d\n", ret);
  769. return ret;
  770. }
  771. static int fxls8962af_fifo_flush(struct iio_dev *indio_dev)
  772. {
  773. struct fxls8962af_data *data = iio_priv(indio_dev);
  774. struct device *dev = regmap_get_device(data->regmap);
  775. u16 buffer[FXLS8962AF_FIFO_LENGTH * 3];
  776. uint64_t sample_period;
  777. unsigned int reg;
  778. int64_t tstamp;
  779. int ret, i;
  780. u8 count;
  781. ret = regmap_read(data->regmap, FXLS8962AF_BUF_STATUS, &reg);
  782. if (ret)
  783. return ret;
  784. if (reg & FXLS8962AF_BUF_STATUS_BUF_OVF) {
  785. dev_err(dev, "Buffer overflow");
  786. return -EOVERFLOW;
  787. }
  788. count = reg & FXLS8962AF_BUF_STATUS_BUF_CNT;
  789. if (!count)
  790. return 0;
  791. data->old_timestamp = data->timestamp;
  792. data->timestamp = iio_get_time_ns(indio_dev);
  793. /*
  794. * Approximate timestamps for each of the sample based on the sampling,
  795. * frequency, timestamp for last sample and number of samples.
  796. */
  797. sample_period = (data->timestamp - data->old_timestamp);
  798. do_div(sample_period, count);
  799. tstamp = data->timestamp - (count - 1) * sample_period;
  800. ret = fxls8962af_fifo_transfer(data, buffer, count);
  801. if (ret)
  802. return ret;
  803. /* Demux hw FIFO into kfifo. */
  804. for (i = 0; i < count; i++) {
  805. int j, bit;
  806. j = 0;
  807. iio_for_each_active_channel(indio_dev, bit) {
  808. memcpy(&data->scan.channels[j++], &buffer[i * 3 + bit],
  809. sizeof(data->scan.channels[0]));
  810. }
  811. iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
  812. tstamp);
  813. tstamp += sample_period;
  814. }
  815. return count;
  816. }
  817. static int fxls8962af_event_interrupt(struct iio_dev *indio_dev)
  818. {
  819. struct fxls8962af_data *data = iio_priv(indio_dev);
  820. s64 ts = iio_get_time_ns(indio_dev);
  821. unsigned int reg;
  822. u64 ev_code;
  823. int ret;
  824. ret = regmap_read(data->regmap, FXLS8962AF_SDCD_INT_SRC1, &reg);
  825. if (ret)
  826. return ret;
  827. if (reg & FXLS8962AF_SDCD_INT_SRC1_X_OT) {
  828. ev_code = reg & FXLS8962AF_SDCD_INT_SRC1_X_POL ?
  829. IIO_EV_DIR_RISING : IIO_EV_DIR_FALLING;
  830. iio_push_event(indio_dev,
  831. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
  832. IIO_EV_TYPE_THRESH, ev_code), ts);
  833. }
  834. if (reg & FXLS8962AF_SDCD_INT_SRC1_Y_OT) {
  835. ev_code = reg & FXLS8962AF_SDCD_INT_SRC1_Y_POL ?
  836. IIO_EV_DIR_RISING : IIO_EV_DIR_FALLING;
  837. iio_push_event(indio_dev,
  838. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
  839. IIO_EV_TYPE_THRESH, ev_code), ts);
  840. }
  841. if (reg & FXLS8962AF_SDCD_INT_SRC1_Z_OT) {
  842. ev_code = reg & FXLS8962AF_SDCD_INT_SRC1_Z_POL ?
  843. IIO_EV_DIR_RISING : IIO_EV_DIR_FALLING;
  844. iio_push_event(indio_dev,
  845. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
  846. IIO_EV_TYPE_THRESH, ev_code), ts);
  847. }
  848. return 0;
  849. }
  850. static irqreturn_t fxls8962af_interrupt(int irq, void *p)
  851. {
  852. struct iio_dev *indio_dev = p;
  853. struct fxls8962af_data *data = iio_priv(indio_dev);
  854. unsigned int reg;
  855. int ret;
  856. ret = regmap_read(data->regmap, FXLS8962AF_INT_STATUS, &reg);
  857. if (ret)
  858. return IRQ_NONE;
  859. if (reg & FXLS8962AF_INT_STATUS_SRC_BUF) {
  860. ret = fxls8962af_fifo_flush(indio_dev);
  861. if (ret < 0)
  862. return IRQ_NONE;
  863. return IRQ_HANDLED;
  864. }
  865. if (reg & FXLS8962AF_INT_STATUS_SRC_SDCD_OT) {
  866. ret = fxls8962af_event_interrupt(indio_dev);
  867. if (ret < 0)
  868. return IRQ_NONE;
  869. return IRQ_HANDLED;
  870. }
  871. return IRQ_NONE;
  872. }
  873. static void fxls8962af_pm_disable(void *dev_ptr)
  874. {
  875. struct device *dev = dev_ptr;
  876. struct iio_dev *indio_dev = dev_get_drvdata(dev);
  877. pm_runtime_disable(dev);
  878. pm_runtime_set_suspended(dev);
  879. pm_runtime_put_noidle(dev);
  880. fxls8962af_standby(iio_priv(indio_dev));
  881. }
  882. static void fxls8962af_get_irq(struct device *dev,
  883. enum fxls8962af_int_pin *pin)
  884. {
  885. int irq;
  886. irq = fwnode_irq_get_byname(dev_fwnode(dev), "INT2");
  887. if (irq > 0) {
  888. *pin = FXLS8962AF_PIN_INT2;
  889. return;
  890. }
  891. *pin = FXLS8962AF_PIN_INT1;
  892. }
  893. static int fxls8962af_irq_setup(struct iio_dev *indio_dev, int irq)
  894. {
  895. struct fxls8962af_data *data = iio_priv(indio_dev);
  896. struct device *dev = regmap_get_device(data->regmap);
  897. unsigned long irq_type;
  898. bool irq_active_high;
  899. enum fxls8962af_int_pin int_pin;
  900. u8 int_pin_sel;
  901. int ret;
  902. fxls8962af_get_irq(dev, &int_pin);
  903. switch (int_pin) {
  904. case FXLS8962AF_PIN_INT1:
  905. int_pin_sel = FXLS8962AF_INT_PIN_SEL_INT1;
  906. break;
  907. case FXLS8962AF_PIN_INT2:
  908. int_pin_sel = FXLS8962AF_INT_PIN_SEL_INT2;
  909. break;
  910. default:
  911. dev_err(dev, "unsupported int pin selected\n");
  912. return -EINVAL;
  913. }
  914. ret = regmap_update_bits(data->regmap, FXLS8962AF_INT_PIN_SEL,
  915. FXLS8962AF_INT_PIN_SEL_MASK, int_pin_sel);
  916. if (ret)
  917. return ret;
  918. irq_type = irqd_get_trigger_type(irq_get_irq_data(irq));
  919. switch (irq_type) {
  920. case IRQF_TRIGGER_HIGH:
  921. case IRQF_TRIGGER_RISING:
  922. irq_active_high = true;
  923. break;
  924. case IRQF_TRIGGER_LOW:
  925. case IRQF_TRIGGER_FALLING:
  926. irq_active_high = false;
  927. break;
  928. default:
  929. dev_info(dev, "mode %lx unsupported\n", irq_type);
  930. return -EINVAL;
  931. }
  932. ret = regmap_update_bits(data->regmap, FXLS8962AF_SENS_CONFIG4,
  933. FXLS8962AF_SC4_INT_POL_MASK,
  934. FXLS8962AF_SC4_INT_POL_PREP(irq_active_high));
  935. if (ret)
  936. return ret;
  937. if (device_property_read_bool(dev, "drive-open-drain")) {
  938. ret = regmap_update_bits(data->regmap, FXLS8962AF_SENS_CONFIG4,
  939. FXLS8962AF_SC4_INT_PP_OD_MASK,
  940. FXLS8962AF_SC4_INT_PP_OD_PREP(1));
  941. if (ret)
  942. return ret;
  943. irq_type |= IRQF_SHARED;
  944. }
  945. return devm_request_threaded_irq(dev,
  946. irq,
  947. NULL, fxls8962af_interrupt,
  948. irq_type | IRQF_ONESHOT,
  949. indio_dev->name, indio_dev);
  950. }
  951. int fxls8962af_core_probe(struct device *dev, struct regmap *regmap, int irq)
  952. {
  953. struct fxls8962af_data *data;
  954. struct iio_dev *indio_dev;
  955. unsigned int reg;
  956. int ret, i;
  957. indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
  958. if (!indio_dev)
  959. return -ENOMEM;
  960. data = iio_priv(indio_dev);
  961. dev_set_drvdata(dev, indio_dev);
  962. data->regmap = regmap;
  963. data->irq = irq;
  964. ret = iio_read_mount_matrix(dev, &data->orientation);
  965. if (ret)
  966. return ret;
  967. ret = devm_regulator_get_enable(dev, "vdd");
  968. if (ret)
  969. return dev_err_probe(dev, ret,
  970. "Failed to get vdd regulator\n");
  971. ret = regmap_read(data->regmap, FXLS8962AF_WHO_AM_I, &reg);
  972. if (ret)
  973. return ret;
  974. for (i = 0; i < ARRAY_SIZE(fxls_chip_info_table); i++) {
  975. if (fxls_chip_info_table[i].chip_id == reg) {
  976. data->chip_info = &fxls_chip_info_table[i];
  977. break;
  978. }
  979. }
  980. if (i == ARRAY_SIZE(fxls_chip_info_table)) {
  981. dev_err(dev, "failed to match device in table\n");
  982. return -ENXIO;
  983. }
  984. indio_dev->channels = data->chip_info->channels;
  985. indio_dev->num_channels = data->chip_info->num_channels;
  986. indio_dev->name = data->chip_info->name;
  987. indio_dev->info = &fxls8962af_info;
  988. indio_dev->modes = INDIO_DIRECT_MODE;
  989. ret = fxls8962af_reset(data);
  990. if (ret)
  991. return ret;
  992. if (irq) {
  993. ret = fxls8962af_irq_setup(indio_dev, irq);
  994. if (ret)
  995. return ret;
  996. ret = devm_iio_kfifo_buffer_setup(dev, indio_dev,
  997. &fxls8962af_buffer_ops);
  998. if (ret)
  999. return ret;
  1000. }
  1001. ret = pm_runtime_set_active(dev);
  1002. if (ret)
  1003. return ret;
  1004. pm_runtime_enable(dev);
  1005. pm_runtime_set_autosuspend_delay(dev, FXLS8962AF_AUTO_SUSPEND_DELAY_MS);
  1006. pm_runtime_use_autosuspend(dev);
  1007. ret = devm_add_action_or_reset(dev, fxls8962af_pm_disable, dev);
  1008. if (ret)
  1009. return ret;
  1010. if (device_property_read_bool(dev, "wakeup-source"))
  1011. device_init_wakeup(dev, true);
  1012. return devm_iio_device_register(dev, indio_dev);
  1013. }
  1014. EXPORT_SYMBOL_NS_GPL(fxls8962af_core_probe, IIO_FXLS8962AF);
  1015. static int fxls8962af_runtime_suspend(struct device *dev)
  1016. {
  1017. struct fxls8962af_data *data = iio_priv(dev_get_drvdata(dev));
  1018. int ret;
  1019. ret = fxls8962af_standby(data);
  1020. if (ret) {
  1021. dev_err(dev, "powering off device failed\n");
  1022. return ret;
  1023. }
  1024. return 0;
  1025. }
  1026. static int fxls8962af_runtime_resume(struct device *dev)
  1027. {
  1028. struct fxls8962af_data *data = iio_priv(dev_get_drvdata(dev));
  1029. return fxls8962af_active(data);
  1030. }
  1031. static int fxls8962af_suspend(struct device *dev)
  1032. {
  1033. struct iio_dev *indio_dev = dev_get_drvdata(dev);
  1034. struct fxls8962af_data *data = iio_priv(indio_dev);
  1035. if (device_may_wakeup(dev) && data->enable_event) {
  1036. enable_irq_wake(data->irq);
  1037. /*
  1038. * Disable buffer, as the buffer is so small the device will wake
  1039. * almost immediately.
  1040. */
  1041. if (iio_buffer_enabled(indio_dev))
  1042. fxls8962af_buffer_predisable(indio_dev);
  1043. } else {
  1044. fxls8962af_runtime_suspend(dev);
  1045. }
  1046. return 0;
  1047. }
  1048. static int fxls8962af_resume(struct device *dev)
  1049. {
  1050. struct iio_dev *indio_dev = dev_get_drvdata(dev);
  1051. struct fxls8962af_data *data = iio_priv(indio_dev);
  1052. if (device_may_wakeup(dev) && data->enable_event) {
  1053. disable_irq_wake(data->irq);
  1054. if (iio_buffer_enabled(indio_dev))
  1055. fxls8962af_buffer_postenable(indio_dev);
  1056. } else {
  1057. fxls8962af_runtime_resume(dev);
  1058. }
  1059. return 0;
  1060. }
  1061. EXPORT_NS_GPL_DEV_PM_OPS(fxls8962af_pm_ops, IIO_FXLS8962AF) = {
  1062. SYSTEM_SLEEP_PM_OPS(fxls8962af_suspend, fxls8962af_resume)
  1063. RUNTIME_PM_OPS(fxls8962af_runtime_suspend, fxls8962af_runtime_resume, NULL)
  1064. };
  1065. MODULE_AUTHOR("Sean Nyekjaer <sean@geanix.com>");
  1066. MODULE_DESCRIPTION("NXP FXLS8962AF/FXLS8964AF accelerometer driver");
  1067. MODULE_LICENSE("GPL v2");