fxls8962af-core.c 33 KB

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