adxl367.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2021 Analog Devices, Inc.
  4. * Author: Cosmin Tanislav <[email protected]>
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/bitops.h>
  8. #include <linux/iio/buffer.h>
  9. #include <linux/iio/events.h>
  10. #include <linux/iio/iio.h>
  11. #include <linux/iio/kfifo_buf.h>
  12. #include <linux/iio/sysfs.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/irq.h>
  15. #include <linux/mod_devicetable.h>
  16. #include <linux/regmap.h>
  17. #include <linux/regulator/consumer.h>
  18. #include <asm/unaligned.h>
  19. #include "adxl367.h"
  20. #define ADXL367_REG_DEVID 0x00
  21. #define ADXL367_DEVID_AD 0xAD
  22. #define ADXL367_REG_STATUS 0x0B
  23. #define ADXL367_STATUS_INACT_MASK BIT(5)
  24. #define ADXL367_STATUS_ACT_MASK BIT(4)
  25. #define ADXL367_STATUS_FIFO_FULL_MASK BIT(2)
  26. #define ADXL367_FIFO_ENT_H_MASK GENMASK(1, 0)
  27. #define ADXL367_REG_X_DATA_H 0x0E
  28. #define ADXL367_REG_Y_DATA_H 0x10
  29. #define ADXL367_REG_Z_DATA_H 0x12
  30. #define ADXL367_REG_TEMP_DATA_H 0x14
  31. #define ADXL367_REG_EX_ADC_DATA_H 0x16
  32. #define ADXL367_DATA_MASK GENMASK(15, 2)
  33. #define ADXL367_TEMP_25C 165
  34. #define ADXL367_TEMP_PER_C 54
  35. #define ADXL367_VOLTAGE_OFFSET 8192
  36. #define ADXL367_VOLTAGE_MAX_MV 1000
  37. #define ADXL367_VOLTAGE_MAX_RAW GENMASK(13, 0)
  38. #define ADXL367_REG_RESET 0x1F
  39. #define ADXL367_RESET_CODE 0x52
  40. #define ADXL367_REG_THRESH_ACT_H 0x20
  41. #define ADXL367_REG_THRESH_INACT_H 0x23
  42. #define ADXL367_THRESH_MAX GENMASK(12, 0)
  43. #define ADXL367_THRESH_VAL_H_MASK GENMASK(12, 6)
  44. #define ADXL367_THRESH_H_MASK GENMASK(6, 0)
  45. #define ADXL367_THRESH_VAL_L_MASK GENMASK(5, 0)
  46. #define ADXL367_THRESH_L_MASK GENMASK(7, 2)
  47. #define ADXL367_REG_TIME_ACT 0x22
  48. #define ADXL367_REG_TIME_INACT_H 0x25
  49. #define ADXL367_TIME_ACT_MAX GENMASK(7, 0)
  50. #define ADXL367_TIME_INACT_MAX GENMASK(15, 0)
  51. #define ADXL367_TIME_INACT_VAL_H_MASK GENMASK(15, 8)
  52. #define ADXL367_TIME_INACT_H_MASK GENMASK(7, 0)
  53. #define ADXL367_TIME_INACT_VAL_L_MASK GENMASK(7, 0)
  54. #define ADXL367_TIME_INACT_L_MASK GENMASK(7, 0)
  55. #define ADXL367_REG_ACT_INACT_CTL 0x27
  56. #define ADXL367_ACT_EN_MASK GENMASK(1, 0)
  57. #define ADXL367_ACT_LINKLOOP_MASK GENMASK(5, 4)
  58. #define ADXL367_REG_FIFO_CTL 0x28
  59. #define ADXL367_FIFO_CTL_FORMAT_MASK GENMASK(6, 3)
  60. #define ADXL367_FIFO_CTL_MODE_MASK GENMASK(1, 0)
  61. #define ADXL367_REG_FIFO_SAMPLES 0x29
  62. #define ADXL367_FIFO_SIZE 512
  63. #define ADXL367_FIFO_MAX_WATERMARK 511
  64. #define ADXL367_SAMPLES_VAL_H_MASK BIT(8)
  65. #define ADXL367_SAMPLES_H_MASK BIT(2)
  66. #define ADXL367_SAMPLES_VAL_L_MASK GENMASK(7, 0)
  67. #define ADXL367_SAMPLES_L_MASK GENMASK(7, 0)
  68. #define ADXL367_REG_INT1_MAP 0x2A
  69. #define ADXL367_INT_INACT_MASK BIT(5)
  70. #define ADXL367_INT_ACT_MASK BIT(4)
  71. #define ADXL367_INT_FIFO_WATERMARK_MASK BIT(2)
  72. #define ADXL367_REG_FILTER_CTL 0x2C
  73. #define ADXL367_FILTER_CTL_RANGE_MASK GENMASK(7, 6)
  74. #define ADXL367_2G_RANGE_1G 4095
  75. #define ADXL367_2G_RANGE_100MG 409
  76. #define ADXL367_FILTER_CTL_ODR_MASK GENMASK(2, 0)
  77. #define ADXL367_REG_POWER_CTL 0x2D
  78. #define ADXL367_POWER_CTL_MODE_MASK GENMASK(1, 0)
  79. #define ADXL367_REG_ADC_CTL 0x3C
  80. #define ADXL367_REG_TEMP_CTL 0x3D
  81. #define ADXL367_ADC_EN_MASK BIT(0)
  82. enum adxl367_range {
  83. ADXL367_2G_RANGE,
  84. ADXL367_4G_RANGE,
  85. ADXL367_8G_RANGE,
  86. };
  87. enum adxl367_fifo_mode {
  88. ADXL367_FIFO_MODE_DISABLED = 0b00,
  89. ADXL367_FIFO_MODE_STREAM = 0b10,
  90. };
  91. enum adxl367_fifo_format {
  92. ADXL367_FIFO_FORMAT_XYZ,
  93. ADXL367_FIFO_FORMAT_X,
  94. ADXL367_FIFO_FORMAT_Y,
  95. ADXL367_FIFO_FORMAT_Z,
  96. ADXL367_FIFO_FORMAT_XYZT,
  97. ADXL367_FIFO_FORMAT_XT,
  98. ADXL367_FIFO_FORMAT_YT,
  99. ADXL367_FIFO_FORMAT_ZT,
  100. ADXL367_FIFO_FORMAT_XYZA,
  101. ADXL367_FIFO_FORMAT_XA,
  102. ADXL367_FIFO_FORMAT_YA,
  103. ADXL367_FIFO_FORMAT_ZA,
  104. };
  105. enum adxl367_op_mode {
  106. ADXL367_OP_STANDBY = 0b00,
  107. ADXL367_OP_MEASURE = 0b10,
  108. };
  109. enum adxl367_act_proc_mode {
  110. ADXL367_LOOPED = 0b11,
  111. };
  112. enum adxl367_act_en_mode {
  113. ADXL367_ACT_DISABLED = 0b00,
  114. ADCL367_ACT_REF_ENABLED = 0b11,
  115. };
  116. enum adxl367_activity_type {
  117. ADXL367_ACTIVITY,
  118. ADXL367_INACTIVITY,
  119. };
  120. enum adxl367_odr {
  121. ADXL367_ODR_12P5HZ,
  122. ADXL367_ODR_25HZ,
  123. ADXL367_ODR_50HZ,
  124. ADXL367_ODR_100HZ,
  125. ADXL367_ODR_200HZ,
  126. ADXL367_ODR_400HZ,
  127. };
  128. struct adxl367_state {
  129. const struct adxl367_ops *ops;
  130. void *context;
  131. struct device *dev;
  132. struct regmap *regmap;
  133. struct regulator_bulk_data regulators[2];
  134. /*
  135. * Synchronize access to members of driver state, and ensure atomicity
  136. * of consecutive regmap operations.
  137. */
  138. struct mutex lock;
  139. enum adxl367_odr odr;
  140. enum adxl367_range range;
  141. unsigned int act_threshold;
  142. unsigned int act_time_ms;
  143. unsigned int inact_threshold;
  144. unsigned int inact_time_ms;
  145. unsigned int fifo_set_size;
  146. unsigned int fifo_watermark;
  147. __be16 fifo_buf[ADXL367_FIFO_SIZE] __aligned(IIO_DMA_MINALIGN);
  148. __be16 sample_buf;
  149. u8 act_threshold_buf[2];
  150. u8 inact_time_buf[2];
  151. u8 status_buf[3];
  152. };
  153. static const unsigned int adxl367_threshold_h_reg_tbl[] = {
  154. [ADXL367_ACTIVITY] = ADXL367_REG_THRESH_ACT_H,
  155. [ADXL367_INACTIVITY] = ADXL367_REG_THRESH_INACT_H,
  156. };
  157. static const unsigned int adxl367_act_en_shift_tbl[] = {
  158. [ADXL367_ACTIVITY] = 0,
  159. [ADXL367_INACTIVITY] = 2,
  160. };
  161. static const unsigned int adxl367_act_int_mask_tbl[] = {
  162. [ADXL367_ACTIVITY] = ADXL367_INT_ACT_MASK,
  163. [ADXL367_INACTIVITY] = ADXL367_INT_INACT_MASK,
  164. };
  165. static const int adxl367_samp_freq_tbl[][2] = {
  166. [ADXL367_ODR_12P5HZ] = {12, 500000},
  167. [ADXL367_ODR_25HZ] = {25, 0},
  168. [ADXL367_ODR_50HZ] = {50, 0},
  169. [ADXL367_ODR_100HZ] = {100, 0},
  170. [ADXL367_ODR_200HZ] = {200, 0},
  171. [ADXL367_ODR_400HZ] = {400, 0},
  172. };
  173. /* (g * 2) * 9.80665 * 1000000 / (2^14 - 1) */
  174. static const int adxl367_range_scale_tbl[][2] = {
  175. [ADXL367_2G_RANGE] = {0, 2394347},
  176. [ADXL367_4G_RANGE] = {0, 4788695},
  177. [ADXL367_8G_RANGE] = {0, 9577391},
  178. };
  179. static const int adxl367_range_scale_factor_tbl[] = {
  180. [ADXL367_2G_RANGE] = 1,
  181. [ADXL367_4G_RANGE] = 2,
  182. [ADXL367_8G_RANGE] = 4,
  183. };
  184. enum {
  185. ADXL367_X_CHANNEL_INDEX,
  186. ADXL367_Y_CHANNEL_INDEX,
  187. ADXL367_Z_CHANNEL_INDEX,
  188. ADXL367_TEMP_CHANNEL_INDEX,
  189. ADXL367_EX_ADC_CHANNEL_INDEX
  190. };
  191. #define ADXL367_X_CHANNEL_MASK BIT(ADXL367_X_CHANNEL_INDEX)
  192. #define ADXL367_Y_CHANNEL_MASK BIT(ADXL367_Y_CHANNEL_INDEX)
  193. #define ADXL367_Z_CHANNEL_MASK BIT(ADXL367_Z_CHANNEL_INDEX)
  194. #define ADXL367_TEMP_CHANNEL_MASK BIT(ADXL367_TEMP_CHANNEL_INDEX)
  195. #define ADXL367_EX_ADC_CHANNEL_MASK BIT(ADXL367_EX_ADC_CHANNEL_INDEX)
  196. static const enum adxl367_fifo_format adxl367_fifo_formats[] = {
  197. ADXL367_FIFO_FORMAT_X,
  198. ADXL367_FIFO_FORMAT_Y,
  199. ADXL367_FIFO_FORMAT_Z,
  200. ADXL367_FIFO_FORMAT_XT,
  201. ADXL367_FIFO_FORMAT_YT,
  202. ADXL367_FIFO_FORMAT_ZT,
  203. ADXL367_FIFO_FORMAT_XA,
  204. ADXL367_FIFO_FORMAT_YA,
  205. ADXL367_FIFO_FORMAT_ZA,
  206. ADXL367_FIFO_FORMAT_XYZ,
  207. ADXL367_FIFO_FORMAT_XYZT,
  208. ADXL367_FIFO_FORMAT_XYZA,
  209. };
  210. static const unsigned long adxl367_channel_masks[] = {
  211. ADXL367_X_CHANNEL_MASK,
  212. ADXL367_Y_CHANNEL_MASK,
  213. ADXL367_Z_CHANNEL_MASK,
  214. ADXL367_X_CHANNEL_MASK | ADXL367_TEMP_CHANNEL_MASK,
  215. ADXL367_Y_CHANNEL_MASK | ADXL367_TEMP_CHANNEL_MASK,
  216. ADXL367_Z_CHANNEL_MASK | ADXL367_TEMP_CHANNEL_MASK,
  217. ADXL367_X_CHANNEL_MASK | ADXL367_EX_ADC_CHANNEL_MASK,
  218. ADXL367_Y_CHANNEL_MASK | ADXL367_EX_ADC_CHANNEL_MASK,
  219. ADXL367_Z_CHANNEL_MASK | ADXL367_EX_ADC_CHANNEL_MASK,
  220. ADXL367_X_CHANNEL_MASK | ADXL367_Y_CHANNEL_MASK | ADXL367_Z_CHANNEL_MASK,
  221. ADXL367_X_CHANNEL_MASK | ADXL367_Y_CHANNEL_MASK | ADXL367_Z_CHANNEL_MASK |
  222. ADXL367_TEMP_CHANNEL_MASK,
  223. ADXL367_X_CHANNEL_MASK | ADXL367_Y_CHANNEL_MASK | ADXL367_Z_CHANNEL_MASK |
  224. ADXL367_EX_ADC_CHANNEL_MASK,
  225. 0,
  226. };
  227. static int adxl367_set_measure_en(struct adxl367_state *st, bool en)
  228. {
  229. enum adxl367_op_mode op_mode = en ? ADXL367_OP_MEASURE
  230. : ADXL367_OP_STANDBY;
  231. int ret;
  232. ret = regmap_update_bits(st->regmap, ADXL367_REG_POWER_CTL,
  233. ADXL367_POWER_CTL_MODE_MASK,
  234. FIELD_PREP(ADXL367_POWER_CTL_MODE_MASK,
  235. op_mode));
  236. if (ret)
  237. return ret;
  238. /*
  239. * Wait for acceleration output to settle after entering
  240. * measure mode.
  241. */
  242. if (en)
  243. msleep(100);
  244. return 0;
  245. }
  246. static void adxl367_scale_act_thresholds(struct adxl367_state *st,
  247. enum adxl367_range old_range,
  248. enum adxl367_range new_range)
  249. {
  250. st->act_threshold = st->act_threshold
  251. * adxl367_range_scale_factor_tbl[old_range]
  252. / adxl367_range_scale_factor_tbl[new_range];
  253. st->inact_threshold = st->inact_threshold
  254. * adxl367_range_scale_factor_tbl[old_range]
  255. / adxl367_range_scale_factor_tbl[new_range];
  256. }
  257. static int _adxl367_set_act_threshold(struct adxl367_state *st,
  258. enum adxl367_activity_type act,
  259. unsigned int threshold)
  260. {
  261. u8 reg = adxl367_threshold_h_reg_tbl[act];
  262. int ret;
  263. if (threshold > ADXL367_THRESH_MAX)
  264. return -EINVAL;
  265. st->act_threshold_buf[0] = FIELD_PREP(ADXL367_THRESH_H_MASK,
  266. FIELD_GET(ADXL367_THRESH_VAL_H_MASK,
  267. threshold));
  268. st->act_threshold_buf[1] = FIELD_PREP(ADXL367_THRESH_L_MASK,
  269. FIELD_GET(ADXL367_THRESH_VAL_L_MASK,
  270. threshold));
  271. ret = regmap_bulk_write(st->regmap, reg, st->act_threshold_buf,
  272. sizeof(st->act_threshold_buf));
  273. if (ret)
  274. return ret;
  275. if (act == ADXL367_ACTIVITY)
  276. st->act_threshold = threshold;
  277. else
  278. st->inact_threshold = threshold;
  279. return 0;
  280. }
  281. static int adxl367_set_act_threshold(struct adxl367_state *st,
  282. enum adxl367_activity_type act,
  283. unsigned int threshold)
  284. {
  285. int ret;
  286. mutex_lock(&st->lock);
  287. ret = adxl367_set_measure_en(st, false);
  288. if (ret)
  289. goto out;
  290. ret = _adxl367_set_act_threshold(st, act, threshold);
  291. if (ret)
  292. goto out;
  293. ret = adxl367_set_measure_en(st, true);
  294. out:
  295. mutex_unlock(&st->lock);
  296. return ret;
  297. }
  298. static int adxl367_set_act_proc_mode(struct adxl367_state *st,
  299. enum adxl367_act_proc_mode mode)
  300. {
  301. return regmap_update_bits(st->regmap, ADXL367_REG_ACT_INACT_CTL,
  302. ADXL367_ACT_LINKLOOP_MASK,
  303. FIELD_PREP(ADXL367_ACT_LINKLOOP_MASK,
  304. mode));
  305. }
  306. static int adxl367_set_act_interrupt_en(struct adxl367_state *st,
  307. enum adxl367_activity_type act,
  308. bool en)
  309. {
  310. unsigned int mask = adxl367_act_int_mask_tbl[act];
  311. return regmap_update_bits(st->regmap, ADXL367_REG_INT1_MAP,
  312. mask, en ? mask : 0);
  313. }
  314. static int adxl367_get_act_interrupt_en(struct adxl367_state *st,
  315. enum adxl367_activity_type act,
  316. bool *en)
  317. {
  318. unsigned int mask = adxl367_act_int_mask_tbl[act];
  319. unsigned int val;
  320. int ret;
  321. ret = regmap_read(st->regmap, ADXL367_REG_INT1_MAP, &val);
  322. if (ret)
  323. return ret;
  324. *en = !!(val & mask);
  325. return 0;
  326. }
  327. static int adxl367_set_act_en(struct adxl367_state *st,
  328. enum adxl367_activity_type act,
  329. enum adxl367_act_en_mode en)
  330. {
  331. unsigned int ctl_shift = adxl367_act_en_shift_tbl[act];
  332. return regmap_update_bits(st->regmap, ADXL367_REG_ACT_INACT_CTL,
  333. ADXL367_ACT_EN_MASK << ctl_shift,
  334. en << ctl_shift);
  335. }
  336. static int adxl367_set_fifo_watermark_interrupt_en(struct adxl367_state *st,
  337. bool en)
  338. {
  339. return regmap_update_bits(st->regmap, ADXL367_REG_INT1_MAP,
  340. ADXL367_INT_FIFO_WATERMARK_MASK,
  341. en ? ADXL367_INT_FIFO_WATERMARK_MASK : 0);
  342. }
  343. static int adxl367_get_fifo_mode(struct adxl367_state *st,
  344. enum adxl367_fifo_mode *fifo_mode)
  345. {
  346. unsigned int val;
  347. int ret;
  348. ret = regmap_read(st->regmap, ADXL367_REG_FIFO_CTL, &val);
  349. if (ret)
  350. return ret;
  351. *fifo_mode = FIELD_GET(ADXL367_FIFO_CTL_MODE_MASK, val);
  352. return 0;
  353. }
  354. static int adxl367_set_fifo_mode(struct adxl367_state *st,
  355. enum adxl367_fifo_mode fifo_mode)
  356. {
  357. return regmap_update_bits(st->regmap, ADXL367_REG_FIFO_CTL,
  358. ADXL367_FIFO_CTL_MODE_MASK,
  359. FIELD_PREP(ADXL367_FIFO_CTL_MODE_MASK,
  360. fifo_mode));
  361. }
  362. static int adxl367_set_fifo_format(struct adxl367_state *st,
  363. enum adxl367_fifo_format fifo_format)
  364. {
  365. return regmap_update_bits(st->regmap, ADXL367_REG_FIFO_CTL,
  366. ADXL367_FIFO_CTL_FORMAT_MASK,
  367. FIELD_PREP(ADXL367_FIFO_CTL_FORMAT_MASK,
  368. fifo_format));
  369. }
  370. static int adxl367_set_fifo_watermark(struct adxl367_state *st,
  371. unsigned int fifo_watermark)
  372. {
  373. unsigned int fifo_samples = fifo_watermark * st->fifo_set_size;
  374. unsigned int fifo_samples_h, fifo_samples_l;
  375. int ret;
  376. if (fifo_samples > ADXL367_FIFO_MAX_WATERMARK)
  377. fifo_samples = ADXL367_FIFO_MAX_WATERMARK;
  378. fifo_samples /= st->fifo_set_size;
  379. fifo_samples_h = FIELD_PREP(ADXL367_SAMPLES_H_MASK,
  380. FIELD_GET(ADXL367_SAMPLES_VAL_H_MASK,
  381. fifo_samples));
  382. fifo_samples_l = FIELD_PREP(ADXL367_SAMPLES_L_MASK,
  383. FIELD_GET(ADXL367_SAMPLES_VAL_L_MASK,
  384. fifo_samples));
  385. ret = regmap_update_bits(st->regmap, ADXL367_REG_FIFO_CTL,
  386. ADXL367_SAMPLES_H_MASK, fifo_samples_h);
  387. if (ret)
  388. return ret;
  389. ret = regmap_update_bits(st->regmap, ADXL367_REG_FIFO_SAMPLES,
  390. ADXL367_SAMPLES_L_MASK, fifo_samples_l);
  391. if (ret)
  392. return ret;
  393. st->fifo_watermark = fifo_watermark;
  394. return 0;
  395. }
  396. static int adxl367_set_range(struct iio_dev *indio_dev,
  397. enum adxl367_range range)
  398. {
  399. struct adxl367_state *st = iio_priv(indio_dev);
  400. int ret;
  401. ret = iio_device_claim_direct_mode(indio_dev);
  402. if (ret)
  403. return ret;
  404. mutex_lock(&st->lock);
  405. ret = adxl367_set_measure_en(st, false);
  406. if (ret)
  407. goto out;
  408. ret = regmap_update_bits(st->regmap, ADXL367_REG_FILTER_CTL,
  409. ADXL367_FILTER_CTL_RANGE_MASK,
  410. FIELD_PREP(ADXL367_FILTER_CTL_RANGE_MASK,
  411. range));
  412. if (ret)
  413. goto out;
  414. adxl367_scale_act_thresholds(st, st->range, range);
  415. /* Activity thresholds depend on range */
  416. ret = _adxl367_set_act_threshold(st, ADXL367_ACTIVITY,
  417. st->act_threshold);
  418. if (ret)
  419. goto out;
  420. ret = _adxl367_set_act_threshold(st, ADXL367_INACTIVITY,
  421. st->inact_threshold);
  422. if (ret)
  423. goto out;
  424. ret = adxl367_set_measure_en(st, true);
  425. if (ret)
  426. goto out;
  427. st->range = range;
  428. out:
  429. mutex_unlock(&st->lock);
  430. iio_device_release_direct_mode(indio_dev);
  431. return ret;
  432. }
  433. static int adxl367_time_ms_to_samples(struct adxl367_state *st, unsigned int ms)
  434. {
  435. int freq_hz = adxl367_samp_freq_tbl[st->odr][0];
  436. int freq_microhz = adxl367_samp_freq_tbl[st->odr][1];
  437. /* Scale to decihertz to prevent precision loss in 12.5Hz case. */
  438. int freq_dhz = freq_hz * 10 + freq_microhz / 100000;
  439. return DIV_ROUND_CLOSEST(ms * freq_dhz, 10000);
  440. }
  441. static int _adxl367_set_act_time_ms(struct adxl367_state *st, unsigned int ms)
  442. {
  443. unsigned int val = adxl367_time_ms_to_samples(st, ms);
  444. int ret;
  445. if (val > ADXL367_TIME_ACT_MAX)
  446. val = ADXL367_TIME_ACT_MAX;
  447. ret = regmap_write(st->regmap, ADXL367_REG_TIME_ACT, val);
  448. if (ret)
  449. return ret;
  450. st->act_time_ms = ms;
  451. return 0;
  452. }
  453. static int _adxl367_set_inact_time_ms(struct adxl367_state *st, unsigned int ms)
  454. {
  455. unsigned int val = adxl367_time_ms_to_samples(st, ms);
  456. int ret;
  457. if (val > ADXL367_TIME_INACT_MAX)
  458. val = ADXL367_TIME_INACT_MAX;
  459. st->inact_time_buf[0] = FIELD_PREP(ADXL367_TIME_INACT_H_MASK,
  460. FIELD_GET(ADXL367_TIME_INACT_VAL_H_MASK,
  461. val));
  462. st->inact_time_buf[1] = FIELD_PREP(ADXL367_TIME_INACT_L_MASK,
  463. FIELD_GET(ADXL367_TIME_INACT_VAL_L_MASK,
  464. val));
  465. ret = regmap_bulk_write(st->regmap, ADXL367_REG_TIME_INACT_H,
  466. st->inact_time_buf, sizeof(st->inact_time_buf));
  467. if (ret)
  468. return ret;
  469. st->inact_time_ms = ms;
  470. return 0;
  471. }
  472. static int adxl367_set_act_time_ms(struct adxl367_state *st,
  473. enum adxl367_activity_type act,
  474. unsigned int ms)
  475. {
  476. int ret;
  477. mutex_lock(&st->lock);
  478. ret = adxl367_set_measure_en(st, false);
  479. if (ret)
  480. goto out;
  481. if (act == ADXL367_ACTIVITY)
  482. ret = _adxl367_set_act_time_ms(st, ms);
  483. else
  484. ret = _adxl367_set_inact_time_ms(st, ms);
  485. if (ret)
  486. goto out;
  487. ret = adxl367_set_measure_en(st, true);
  488. out:
  489. mutex_unlock(&st->lock);
  490. return ret;
  491. }
  492. static int _adxl367_set_odr(struct adxl367_state *st, enum adxl367_odr odr)
  493. {
  494. int ret;
  495. ret = regmap_update_bits(st->regmap, ADXL367_REG_FILTER_CTL,
  496. ADXL367_FILTER_CTL_ODR_MASK,
  497. FIELD_PREP(ADXL367_FILTER_CTL_ODR_MASK,
  498. odr));
  499. if (ret)
  500. return ret;
  501. /* Activity timers depend on ODR */
  502. ret = _adxl367_set_act_time_ms(st, st->act_time_ms);
  503. if (ret)
  504. return ret;
  505. ret = _adxl367_set_inact_time_ms(st, st->inact_time_ms);
  506. if (ret)
  507. return ret;
  508. st->odr = odr;
  509. return 0;
  510. }
  511. static int adxl367_set_odr(struct iio_dev *indio_dev, enum adxl367_odr odr)
  512. {
  513. struct adxl367_state *st = iio_priv(indio_dev);
  514. int ret;
  515. ret = iio_device_claim_direct_mode(indio_dev);
  516. if (ret)
  517. return ret;
  518. mutex_lock(&st->lock);
  519. ret = adxl367_set_measure_en(st, false);
  520. if (ret)
  521. goto out;
  522. ret = _adxl367_set_odr(st, odr);
  523. if (ret)
  524. goto out;
  525. ret = adxl367_set_measure_en(st, true);
  526. out:
  527. mutex_unlock(&st->lock);
  528. iio_device_release_direct_mode(indio_dev);
  529. return ret;
  530. }
  531. static int adxl367_set_temp_adc_en(struct adxl367_state *st, unsigned int reg,
  532. bool en)
  533. {
  534. return regmap_update_bits(st->regmap, reg, ADXL367_ADC_EN_MASK,
  535. en ? ADXL367_ADC_EN_MASK : 0);
  536. }
  537. static int adxl367_set_temp_adc_reg_en(struct adxl367_state *st,
  538. unsigned int reg, bool en)
  539. {
  540. int ret;
  541. switch (reg) {
  542. case ADXL367_REG_TEMP_DATA_H:
  543. ret = adxl367_set_temp_adc_en(st, ADXL367_REG_TEMP_CTL, en);
  544. break;
  545. case ADXL367_REG_EX_ADC_DATA_H:
  546. ret = adxl367_set_temp_adc_en(st, ADXL367_REG_ADC_CTL, en);
  547. break;
  548. default:
  549. return 0;
  550. }
  551. if (ret)
  552. return ret;
  553. if (en)
  554. msleep(100);
  555. return 0;
  556. }
  557. static int adxl367_set_temp_adc_mask_en(struct adxl367_state *st,
  558. const unsigned long *active_scan_mask,
  559. bool en)
  560. {
  561. if (*active_scan_mask & ADXL367_TEMP_CHANNEL_MASK)
  562. return adxl367_set_temp_adc_en(st, ADXL367_REG_TEMP_CTL, en);
  563. else if (*active_scan_mask & ADXL367_EX_ADC_CHANNEL_MASK)
  564. return adxl367_set_temp_adc_en(st, ADXL367_REG_ADC_CTL, en);
  565. return 0;
  566. }
  567. static int adxl367_find_odr(struct adxl367_state *st, int val, int val2,
  568. enum adxl367_odr *odr)
  569. {
  570. size_t size = ARRAY_SIZE(adxl367_samp_freq_tbl);
  571. int i;
  572. for (i = 0; i < size; i++)
  573. if (val == adxl367_samp_freq_tbl[i][0] &&
  574. val2 == adxl367_samp_freq_tbl[i][1])
  575. break;
  576. if (i == size)
  577. return -EINVAL;
  578. *odr = i;
  579. return 0;
  580. }
  581. static int adxl367_find_range(struct adxl367_state *st, int val, int val2,
  582. enum adxl367_range *range)
  583. {
  584. size_t size = ARRAY_SIZE(adxl367_range_scale_tbl);
  585. int i;
  586. for (i = 0; i < size; i++)
  587. if (val == adxl367_range_scale_tbl[i][0] &&
  588. val2 == adxl367_range_scale_tbl[i][1])
  589. break;
  590. if (i == size)
  591. return -EINVAL;
  592. *range = i;
  593. return 0;
  594. }
  595. static int adxl367_read_sample(struct iio_dev *indio_dev,
  596. struct iio_chan_spec const *chan,
  597. int *val)
  598. {
  599. struct adxl367_state *st = iio_priv(indio_dev);
  600. u16 sample;
  601. int ret;
  602. ret = iio_device_claim_direct_mode(indio_dev);
  603. if (ret)
  604. return ret;
  605. mutex_lock(&st->lock);
  606. ret = adxl367_set_temp_adc_reg_en(st, chan->address, true);
  607. if (ret)
  608. goto out;
  609. ret = regmap_bulk_read(st->regmap, chan->address, &st->sample_buf,
  610. sizeof(st->sample_buf));
  611. if (ret)
  612. goto out;
  613. sample = FIELD_GET(ADXL367_DATA_MASK, be16_to_cpu(st->sample_buf));
  614. *val = sign_extend32(sample, chan->scan_type.realbits - 1);
  615. ret = adxl367_set_temp_adc_reg_en(st, chan->address, false);
  616. out:
  617. mutex_unlock(&st->lock);
  618. iio_device_release_direct_mode(indio_dev);
  619. return ret ?: IIO_VAL_INT;
  620. }
  621. static int adxl367_get_status(struct adxl367_state *st, u8 *status,
  622. u16 *fifo_entries)
  623. {
  624. int ret;
  625. /* Read STATUS, FIFO_ENT_L and FIFO_ENT_H */
  626. ret = regmap_bulk_read(st->regmap, ADXL367_REG_STATUS,
  627. st->status_buf, sizeof(st->status_buf));
  628. if (ret)
  629. return ret;
  630. st->status_buf[2] &= ADXL367_FIFO_ENT_H_MASK;
  631. *status = st->status_buf[0];
  632. *fifo_entries = get_unaligned_le16(&st->status_buf[1]);
  633. return 0;
  634. }
  635. static bool adxl367_push_event(struct iio_dev *indio_dev, u8 status)
  636. {
  637. unsigned int ev_dir;
  638. if (FIELD_GET(ADXL367_STATUS_ACT_MASK, status))
  639. ev_dir = IIO_EV_DIR_RISING;
  640. else if (FIELD_GET(ADXL367_STATUS_INACT_MASK, status))
  641. ev_dir = IIO_EV_DIR_FALLING;
  642. else
  643. return false;
  644. iio_push_event(indio_dev,
  645. IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
  646. IIO_EV_TYPE_THRESH, ev_dir),
  647. iio_get_time_ns(indio_dev));
  648. return true;
  649. }
  650. static bool adxl367_push_fifo_data(struct iio_dev *indio_dev, u8 status,
  651. u16 fifo_entries)
  652. {
  653. struct adxl367_state *st = iio_priv(indio_dev);
  654. int ret;
  655. int i;
  656. if (!FIELD_GET(ADXL367_STATUS_FIFO_FULL_MASK, status))
  657. return false;
  658. fifo_entries -= fifo_entries % st->fifo_set_size;
  659. ret = st->ops->read_fifo(st->context, st->fifo_buf, fifo_entries);
  660. if (ret) {
  661. dev_err(st->dev, "Failed to read FIFO: %d\n", ret);
  662. return true;
  663. }
  664. for (i = 0; i < fifo_entries; i += st->fifo_set_size)
  665. iio_push_to_buffers(indio_dev, &st->fifo_buf[i]);
  666. return true;
  667. }
  668. static irqreturn_t adxl367_irq_handler(int irq, void *private)
  669. {
  670. struct iio_dev *indio_dev = private;
  671. struct adxl367_state *st = iio_priv(indio_dev);
  672. u16 fifo_entries;
  673. bool handled;
  674. u8 status;
  675. int ret;
  676. ret = adxl367_get_status(st, &status, &fifo_entries);
  677. if (ret)
  678. return IRQ_NONE;
  679. handled = adxl367_push_event(indio_dev, status);
  680. handled |= adxl367_push_fifo_data(indio_dev, status, fifo_entries);
  681. return handled ? IRQ_HANDLED : IRQ_NONE;
  682. }
  683. static int adxl367_reg_access(struct iio_dev *indio_dev,
  684. unsigned int reg,
  685. unsigned int writeval,
  686. unsigned int *readval)
  687. {
  688. struct adxl367_state *st = iio_priv(indio_dev);
  689. if (readval)
  690. return regmap_read(st->regmap, reg, readval);
  691. else
  692. return regmap_write(st->regmap, reg, writeval);
  693. }
  694. static int adxl367_read_raw(struct iio_dev *indio_dev,
  695. struct iio_chan_spec const *chan,
  696. int *val, int *val2, long info)
  697. {
  698. struct adxl367_state *st = iio_priv(indio_dev);
  699. switch (info) {
  700. case IIO_CHAN_INFO_RAW:
  701. return adxl367_read_sample(indio_dev, chan, val);
  702. case IIO_CHAN_INFO_SCALE:
  703. switch (chan->type) {
  704. case IIO_ACCEL:
  705. mutex_lock(&st->lock);
  706. *val = adxl367_range_scale_tbl[st->range][0];
  707. *val2 = adxl367_range_scale_tbl[st->range][1];
  708. mutex_unlock(&st->lock);
  709. return IIO_VAL_INT_PLUS_NANO;
  710. case IIO_TEMP:
  711. *val = 1000;
  712. *val2 = ADXL367_TEMP_PER_C;
  713. return IIO_VAL_FRACTIONAL;
  714. case IIO_VOLTAGE:
  715. *val = ADXL367_VOLTAGE_MAX_MV;
  716. *val2 = ADXL367_VOLTAGE_MAX_RAW;
  717. return IIO_VAL_FRACTIONAL;
  718. default:
  719. return -EINVAL;
  720. }
  721. case IIO_CHAN_INFO_OFFSET:
  722. switch (chan->type) {
  723. case IIO_TEMP:
  724. *val = 25 * ADXL367_TEMP_PER_C - ADXL367_TEMP_25C;
  725. return IIO_VAL_INT;
  726. case IIO_VOLTAGE:
  727. *val = ADXL367_VOLTAGE_OFFSET;
  728. return IIO_VAL_INT;
  729. default:
  730. return -EINVAL;
  731. }
  732. case IIO_CHAN_INFO_SAMP_FREQ:
  733. mutex_lock(&st->lock);
  734. *val = adxl367_samp_freq_tbl[st->odr][0];
  735. *val2 = adxl367_samp_freq_tbl[st->odr][1];
  736. mutex_unlock(&st->lock);
  737. return IIO_VAL_INT_PLUS_MICRO;
  738. default:
  739. return -EINVAL;
  740. }
  741. }
  742. static int adxl367_write_raw(struct iio_dev *indio_dev,
  743. struct iio_chan_spec const *chan,
  744. int val, int val2, long info)
  745. {
  746. struct adxl367_state *st = iio_priv(indio_dev);
  747. int ret;
  748. switch (info) {
  749. case IIO_CHAN_INFO_SAMP_FREQ: {
  750. enum adxl367_odr odr;
  751. ret = adxl367_find_odr(st, val, val2, &odr);
  752. if (ret)
  753. return ret;
  754. return adxl367_set_odr(indio_dev, odr);
  755. }
  756. case IIO_CHAN_INFO_SCALE: {
  757. enum adxl367_range range;
  758. ret = adxl367_find_range(st, val, val2, &range);
  759. if (ret)
  760. return ret;
  761. return adxl367_set_range(indio_dev, range);
  762. }
  763. default:
  764. return -EINVAL;
  765. }
  766. }
  767. static int adxl367_write_raw_get_fmt(struct iio_dev *indio_dev,
  768. struct iio_chan_spec const *chan,
  769. long info)
  770. {
  771. switch (info) {
  772. case IIO_CHAN_INFO_SCALE:
  773. if (chan->type != IIO_ACCEL)
  774. return -EINVAL;
  775. return IIO_VAL_INT_PLUS_NANO;
  776. default:
  777. return IIO_VAL_INT_PLUS_MICRO;
  778. }
  779. }
  780. static int adxl367_read_avail(struct iio_dev *indio_dev,
  781. struct iio_chan_spec const *chan,
  782. const int **vals, int *type, int *length,
  783. long info)
  784. {
  785. switch (info) {
  786. case IIO_CHAN_INFO_SCALE:
  787. if (chan->type != IIO_ACCEL)
  788. return -EINVAL;
  789. *vals = (int *)adxl367_range_scale_tbl;
  790. *type = IIO_VAL_INT_PLUS_NANO;
  791. *length = ARRAY_SIZE(adxl367_range_scale_tbl) * 2;
  792. return IIO_AVAIL_LIST;
  793. case IIO_CHAN_INFO_SAMP_FREQ:
  794. *vals = (int *)adxl367_samp_freq_tbl;
  795. *type = IIO_VAL_INT_PLUS_MICRO;
  796. *length = ARRAY_SIZE(adxl367_samp_freq_tbl) * 2;
  797. return IIO_AVAIL_LIST;
  798. default:
  799. return -EINVAL;
  800. }
  801. }
  802. static int adxl367_read_event_value(struct iio_dev *indio_dev,
  803. const struct iio_chan_spec *chan,
  804. enum iio_event_type type,
  805. enum iio_event_direction dir,
  806. enum iio_event_info info,
  807. int *val, int *val2)
  808. {
  809. struct adxl367_state *st = iio_priv(indio_dev);
  810. switch (info) {
  811. case IIO_EV_INFO_VALUE: {
  812. switch (dir) {
  813. case IIO_EV_DIR_RISING:
  814. mutex_lock(&st->lock);
  815. *val = st->act_threshold;
  816. mutex_unlock(&st->lock);
  817. return IIO_VAL_INT;
  818. case IIO_EV_DIR_FALLING:
  819. mutex_lock(&st->lock);
  820. *val = st->inact_threshold;
  821. mutex_unlock(&st->lock);
  822. return IIO_VAL_INT;
  823. default:
  824. return -EINVAL;
  825. }
  826. }
  827. case IIO_EV_INFO_PERIOD:
  828. switch (dir) {
  829. case IIO_EV_DIR_RISING:
  830. mutex_lock(&st->lock);
  831. *val = st->act_time_ms;
  832. mutex_unlock(&st->lock);
  833. *val2 = 1000;
  834. return IIO_VAL_FRACTIONAL;
  835. case IIO_EV_DIR_FALLING:
  836. mutex_lock(&st->lock);
  837. *val = st->inact_time_ms;
  838. mutex_unlock(&st->lock);
  839. *val2 = 1000;
  840. return IIO_VAL_FRACTIONAL;
  841. default:
  842. return -EINVAL;
  843. }
  844. default:
  845. return -EINVAL;
  846. }
  847. }
  848. static int adxl367_write_event_value(struct iio_dev *indio_dev,
  849. const struct iio_chan_spec *chan,
  850. enum iio_event_type type,
  851. enum iio_event_direction dir,
  852. enum iio_event_info info,
  853. int val, int val2)
  854. {
  855. struct adxl367_state *st = iio_priv(indio_dev);
  856. switch (info) {
  857. case IIO_EV_INFO_VALUE:
  858. if (val < 0)
  859. return -EINVAL;
  860. switch (dir) {
  861. case IIO_EV_DIR_RISING:
  862. return adxl367_set_act_threshold(st, ADXL367_ACTIVITY, val);
  863. case IIO_EV_DIR_FALLING:
  864. return adxl367_set_act_threshold(st, ADXL367_INACTIVITY, val);
  865. default:
  866. return -EINVAL;
  867. }
  868. case IIO_EV_INFO_PERIOD:
  869. if (val < 0)
  870. return -EINVAL;
  871. val = val * 1000 + DIV_ROUND_UP(val2, 1000);
  872. switch (dir) {
  873. case IIO_EV_DIR_RISING:
  874. return adxl367_set_act_time_ms(st, ADXL367_ACTIVITY, val);
  875. case IIO_EV_DIR_FALLING:
  876. return adxl367_set_act_time_ms(st, ADXL367_INACTIVITY, val);
  877. default:
  878. return -EINVAL;
  879. }
  880. default:
  881. return -EINVAL;
  882. }
  883. }
  884. static int adxl367_read_event_config(struct iio_dev *indio_dev,
  885. const struct iio_chan_spec *chan,
  886. enum iio_event_type type,
  887. enum iio_event_direction dir)
  888. {
  889. struct adxl367_state *st = iio_priv(indio_dev);
  890. bool en;
  891. int ret;
  892. switch (dir) {
  893. case IIO_EV_DIR_RISING:
  894. ret = adxl367_get_act_interrupt_en(st, ADXL367_ACTIVITY, &en);
  895. return ret ?: en;
  896. case IIO_EV_DIR_FALLING:
  897. ret = adxl367_get_act_interrupt_en(st, ADXL367_INACTIVITY, &en);
  898. return ret ?: en;
  899. default:
  900. return -EINVAL;
  901. }
  902. }
  903. static int adxl367_write_event_config(struct iio_dev *indio_dev,
  904. const struct iio_chan_spec *chan,
  905. enum iio_event_type type,
  906. enum iio_event_direction dir,
  907. int state)
  908. {
  909. struct adxl367_state *st = iio_priv(indio_dev);
  910. enum adxl367_activity_type act;
  911. int ret;
  912. switch (dir) {
  913. case IIO_EV_DIR_RISING:
  914. act = ADXL367_ACTIVITY;
  915. break;
  916. case IIO_EV_DIR_FALLING:
  917. act = ADXL367_INACTIVITY;
  918. break;
  919. default:
  920. return -EINVAL;
  921. }
  922. ret = iio_device_claim_direct_mode(indio_dev);
  923. if (ret)
  924. return ret;
  925. mutex_lock(&st->lock);
  926. ret = adxl367_set_measure_en(st, false);
  927. if (ret)
  928. goto out;
  929. ret = adxl367_set_act_interrupt_en(st, act, state);
  930. if (ret)
  931. goto out;
  932. ret = adxl367_set_act_en(st, act, state ? ADCL367_ACT_REF_ENABLED
  933. : ADXL367_ACT_DISABLED);
  934. if (ret)
  935. goto out;
  936. ret = adxl367_set_measure_en(st, true);
  937. out:
  938. mutex_unlock(&st->lock);
  939. iio_device_release_direct_mode(indio_dev);
  940. return ret;
  941. }
  942. static ssize_t adxl367_get_fifo_enabled(struct device *dev,
  943. struct device_attribute *attr,
  944. char *buf)
  945. {
  946. struct adxl367_state *st = iio_priv(dev_to_iio_dev(dev));
  947. enum adxl367_fifo_mode fifo_mode;
  948. int ret;
  949. ret = adxl367_get_fifo_mode(st, &fifo_mode);
  950. if (ret)
  951. return ret;
  952. return sysfs_emit(buf, "%d\n", fifo_mode != ADXL367_FIFO_MODE_DISABLED);
  953. }
  954. static ssize_t adxl367_get_fifo_watermark(struct device *dev,
  955. struct device_attribute *attr,
  956. char *buf)
  957. {
  958. struct adxl367_state *st = iio_priv(dev_to_iio_dev(dev));
  959. unsigned int fifo_watermark;
  960. mutex_lock(&st->lock);
  961. fifo_watermark = st->fifo_watermark;
  962. mutex_unlock(&st->lock);
  963. return sysfs_emit(buf, "%d\n", fifo_watermark);
  964. }
  965. static ssize_t hwfifo_watermark_min_show(struct device *dev,
  966. struct device_attribute *attr,
  967. char *buf)
  968. {
  969. return sysfs_emit(buf, "%s\n", "1");
  970. }
  971. static ssize_t hwfifo_watermark_max_show(struct device *dev,
  972. struct device_attribute *attr,
  973. char *buf)
  974. {
  975. return sysfs_emit(buf, "%s\n", __stringify(ADXL367_FIFO_MAX_WATERMARK));
  976. }
  977. static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0);
  978. static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
  979. static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
  980. adxl367_get_fifo_watermark, NULL, 0);
  981. static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
  982. adxl367_get_fifo_enabled, NULL, 0);
  983. static const struct attribute *adxl367_fifo_attributes[] = {
  984. &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr,
  985. &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
  986. &iio_dev_attr_hwfifo_watermark.dev_attr.attr,
  987. &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
  988. NULL,
  989. };
  990. static int adxl367_set_watermark(struct iio_dev *indio_dev, unsigned int val)
  991. {
  992. struct adxl367_state *st = iio_priv(indio_dev);
  993. int ret;
  994. if (val > ADXL367_FIFO_MAX_WATERMARK)
  995. return -EINVAL;
  996. mutex_lock(&st->lock);
  997. ret = adxl367_set_measure_en(st, false);
  998. if (ret)
  999. goto out;
  1000. ret = adxl367_set_fifo_watermark(st, val);
  1001. if (ret)
  1002. goto out;
  1003. ret = adxl367_set_measure_en(st, true);
  1004. out:
  1005. mutex_unlock(&st->lock);
  1006. return ret;
  1007. }
  1008. static bool adxl367_find_mask_fifo_format(const unsigned long *scan_mask,
  1009. enum adxl367_fifo_format *fifo_format)
  1010. {
  1011. size_t size = ARRAY_SIZE(adxl367_fifo_formats);
  1012. int i;
  1013. for (i = 0; i < size; i++)
  1014. if (*scan_mask == adxl367_channel_masks[i])
  1015. break;
  1016. if (i == size)
  1017. return false;
  1018. *fifo_format = adxl367_fifo_formats[i];
  1019. return true;
  1020. }
  1021. static int adxl367_update_scan_mode(struct iio_dev *indio_dev,
  1022. const unsigned long *active_scan_mask)
  1023. {
  1024. struct adxl367_state *st = iio_priv(indio_dev);
  1025. enum adxl367_fifo_format fifo_format;
  1026. int ret;
  1027. if (!adxl367_find_mask_fifo_format(active_scan_mask, &fifo_format))
  1028. return -EINVAL;
  1029. mutex_lock(&st->lock);
  1030. ret = adxl367_set_measure_en(st, false);
  1031. if (ret)
  1032. goto out;
  1033. ret = adxl367_set_fifo_format(st, fifo_format);
  1034. if (ret)
  1035. goto out;
  1036. ret = adxl367_set_measure_en(st, true);
  1037. if (ret)
  1038. goto out;
  1039. st->fifo_set_size = bitmap_weight(active_scan_mask,
  1040. indio_dev->masklength);
  1041. out:
  1042. mutex_unlock(&st->lock);
  1043. return ret;
  1044. }
  1045. static int adxl367_buffer_postenable(struct iio_dev *indio_dev)
  1046. {
  1047. struct adxl367_state *st = iio_priv(indio_dev);
  1048. int ret;
  1049. mutex_lock(&st->lock);
  1050. ret = adxl367_set_temp_adc_mask_en(st, indio_dev->active_scan_mask,
  1051. true);
  1052. if (ret)
  1053. goto out;
  1054. ret = adxl367_set_measure_en(st, false);
  1055. if (ret)
  1056. goto out;
  1057. ret = adxl367_set_fifo_watermark_interrupt_en(st, true);
  1058. if (ret)
  1059. goto out;
  1060. ret = adxl367_set_fifo_mode(st, ADXL367_FIFO_MODE_STREAM);
  1061. if (ret)
  1062. goto out;
  1063. ret = adxl367_set_measure_en(st, true);
  1064. out:
  1065. mutex_unlock(&st->lock);
  1066. return ret;
  1067. }
  1068. static int adxl367_buffer_predisable(struct iio_dev *indio_dev)
  1069. {
  1070. struct adxl367_state *st = iio_priv(indio_dev);
  1071. int ret;
  1072. mutex_lock(&st->lock);
  1073. ret = adxl367_set_measure_en(st, false);
  1074. if (ret)
  1075. goto out;
  1076. ret = adxl367_set_fifo_mode(st, ADXL367_FIFO_MODE_DISABLED);
  1077. if (ret)
  1078. goto out;
  1079. ret = adxl367_set_fifo_watermark_interrupt_en(st, false);
  1080. if (ret)
  1081. goto out;
  1082. ret = adxl367_set_measure_en(st, true);
  1083. if (ret)
  1084. goto out;
  1085. ret = adxl367_set_temp_adc_mask_en(st, indio_dev->active_scan_mask,
  1086. false);
  1087. out:
  1088. mutex_unlock(&st->lock);
  1089. return ret;
  1090. }
  1091. static const struct iio_buffer_setup_ops adxl367_buffer_ops = {
  1092. .postenable = adxl367_buffer_postenable,
  1093. .predisable = adxl367_buffer_predisable,
  1094. };
  1095. static const struct iio_info adxl367_info = {
  1096. .read_raw = adxl367_read_raw,
  1097. .write_raw = adxl367_write_raw,
  1098. .write_raw_get_fmt = adxl367_write_raw_get_fmt,
  1099. .read_avail = adxl367_read_avail,
  1100. .read_event_config = adxl367_read_event_config,
  1101. .write_event_config = adxl367_write_event_config,
  1102. .read_event_value = adxl367_read_event_value,
  1103. .write_event_value = adxl367_write_event_value,
  1104. .debugfs_reg_access = adxl367_reg_access,
  1105. .hwfifo_set_watermark = adxl367_set_watermark,
  1106. .update_scan_mode = adxl367_update_scan_mode,
  1107. };
  1108. static const struct iio_event_spec adxl367_events[] = {
  1109. {
  1110. .type = IIO_EV_TYPE_MAG_REFERENCED,
  1111. .dir = IIO_EV_DIR_RISING,
  1112. .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) |
  1113. BIT(IIO_EV_INFO_PERIOD) |
  1114. BIT(IIO_EV_INFO_VALUE),
  1115. },
  1116. {
  1117. .type = IIO_EV_TYPE_MAG_REFERENCED,
  1118. .dir = IIO_EV_DIR_FALLING,
  1119. .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) |
  1120. BIT(IIO_EV_INFO_PERIOD) |
  1121. BIT(IIO_EV_INFO_VALUE),
  1122. },
  1123. };
  1124. #define ADXL367_ACCEL_CHANNEL(index, reg, axis) { \
  1125. .type = IIO_ACCEL, \
  1126. .address = (reg), \
  1127. .modified = 1, \
  1128. .channel2 = IIO_MOD_##axis, \
  1129. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  1130. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  1131. .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE), \
  1132. .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  1133. .info_mask_shared_by_all_available = \
  1134. BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  1135. .event_spec = adxl367_events, \
  1136. .num_event_specs = ARRAY_SIZE(adxl367_events), \
  1137. .scan_index = (index), \
  1138. .scan_type = { \
  1139. .sign = 's', \
  1140. .realbits = 14, \
  1141. .storagebits = 16, \
  1142. .endianness = IIO_BE, \
  1143. }, \
  1144. }
  1145. #define ADXL367_CHANNEL(index, reg, _type) { \
  1146. .type = (_type), \
  1147. .address = (reg), \
  1148. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  1149. BIT(IIO_CHAN_INFO_OFFSET) | \
  1150. BIT(IIO_CHAN_INFO_SCALE), \
  1151. .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  1152. .scan_index = (index), \
  1153. .scan_type = { \
  1154. .sign = 's', \
  1155. .realbits = 14, \
  1156. .storagebits = 16, \
  1157. .endianness = IIO_BE, \
  1158. }, \
  1159. }
  1160. static const struct iio_chan_spec adxl367_channels[] = {
  1161. ADXL367_ACCEL_CHANNEL(ADXL367_X_CHANNEL_INDEX, ADXL367_REG_X_DATA_H, X),
  1162. ADXL367_ACCEL_CHANNEL(ADXL367_Y_CHANNEL_INDEX, ADXL367_REG_Y_DATA_H, Y),
  1163. ADXL367_ACCEL_CHANNEL(ADXL367_Z_CHANNEL_INDEX, ADXL367_REG_Z_DATA_H, Z),
  1164. ADXL367_CHANNEL(ADXL367_TEMP_CHANNEL_INDEX, ADXL367_REG_TEMP_DATA_H,
  1165. IIO_TEMP),
  1166. ADXL367_CHANNEL(ADXL367_EX_ADC_CHANNEL_INDEX, ADXL367_REG_EX_ADC_DATA_H,
  1167. IIO_VOLTAGE),
  1168. };
  1169. static int adxl367_verify_devid(struct adxl367_state *st)
  1170. {
  1171. unsigned int val;
  1172. int ret;
  1173. ret = regmap_read_poll_timeout(st->regmap, ADXL367_REG_DEVID, val,
  1174. val == ADXL367_DEVID_AD, 1000, 10000);
  1175. if (ret)
  1176. return dev_err_probe(st->dev, -ENODEV,
  1177. "Invalid dev id 0x%02X, expected 0x%02X\n",
  1178. val, ADXL367_DEVID_AD);
  1179. return 0;
  1180. }
  1181. static int adxl367_setup(struct adxl367_state *st)
  1182. {
  1183. int ret;
  1184. ret = _adxl367_set_act_threshold(st, ADXL367_ACTIVITY,
  1185. ADXL367_2G_RANGE_1G);
  1186. if (ret)
  1187. return ret;
  1188. ret = _adxl367_set_act_threshold(st, ADXL367_INACTIVITY,
  1189. ADXL367_2G_RANGE_100MG);
  1190. if (ret)
  1191. return ret;
  1192. ret = adxl367_set_act_proc_mode(st, ADXL367_LOOPED);
  1193. if (ret)
  1194. return ret;
  1195. ret = _adxl367_set_odr(st, ADXL367_ODR_400HZ);
  1196. if (ret)
  1197. return ret;
  1198. ret = _adxl367_set_act_time_ms(st, 10);
  1199. if (ret)
  1200. return ret;
  1201. ret = _adxl367_set_inact_time_ms(st, 10000);
  1202. if (ret)
  1203. return ret;
  1204. return adxl367_set_measure_en(st, true);
  1205. }
  1206. static void adxl367_disable_regulators(void *data)
  1207. {
  1208. struct adxl367_state *st = data;
  1209. regulator_bulk_disable(ARRAY_SIZE(st->regulators), st->regulators);
  1210. }
  1211. int adxl367_probe(struct device *dev, const struct adxl367_ops *ops,
  1212. void *context, struct regmap *regmap, int irq)
  1213. {
  1214. struct iio_dev *indio_dev;
  1215. struct adxl367_state *st;
  1216. int ret;
  1217. indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
  1218. if (!indio_dev)
  1219. return -ENOMEM;
  1220. st = iio_priv(indio_dev);
  1221. st->dev = dev;
  1222. st->regmap = regmap;
  1223. st->context = context;
  1224. st->ops = ops;
  1225. mutex_init(&st->lock);
  1226. indio_dev->channels = adxl367_channels;
  1227. indio_dev->num_channels = ARRAY_SIZE(adxl367_channels);
  1228. indio_dev->available_scan_masks = adxl367_channel_masks;
  1229. indio_dev->name = "adxl367";
  1230. indio_dev->info = &adxl367_info;
  1231. indio_dev->modes = INDIO_DIRECT_MODE;
  1232. st->regulators[0].supply = "vdd";
  1233. st->regulators[1].supply = "vddio";
  1234. ret = devm_regulator_bulk_get(st->dev, ARRAY_SIZE(st->regulators),
  1235. st->regulators);
  1236. if (ret)
  1237. return dev_err_probe(st->dev, ret,
  1238. "Failed to get regulators\n");
  1239. ret = regulator_bulk_enable(ARRAY_SIZE(st->regulators), st->regulators);
  1240. if (ret)
  1241. return dev_err_probe(st->dev, ret,
  1242. "Failed to enable regulators\n");
  1243. ret = devm_add_action_or_reset(st->dev, adxl367_disable_regulators, st);
  1244. if (ret)
  1245. return dev_err_probe(st->dev, ret,
  1246. "Failed to add regulators disable action\n");
  1247. ret = regmap_write(st->regmap, ADXL367_REG_RESET, ADXL367_RESET_CODE);
  1248. if (ret)
  1249. return ret;
  1250. ret = adxl367_verify_devid(st);
  1251. if (ret)
  1252. return ret;
  1253. ret = adxl367_setup(st);
  1254. if (ret)
  1255. return ret;
  1256. ret = devm_iio_kfifo_buffer_setup_ext(st->dev, indio_dev,
  1257. &adxl367_buffer_ops,
  1258. adxl367_fifo_attributes);
  1259. if (ret)
  1260. return ret;
  1261. ret = devm_request_threaded_irq(st->dev, irq, NULL,
  1262. adxl367_irq_handler, IRQF_ONESHOT,
  1263. indio_dev->name, indio_dev);
  1264. if (ret)
  1265. return dev_err_probe(st->dev, ret, "Failed to request irq\n");
  1266. return devm_iio_device_register(dev, indio_dev);
  1267. }
  1268. EXPORT_SYMBOL_NS_GPL(adxl367_probe, IIO_ADXL367);
  1269. MODULE_AUTHOR("Cosmin Tanislav <[email protected]>");
  1270. MODULE_DESCRIPTION("Analog Devices ADXL367 3-axis accelerometer driver");
  1271. MODULE_LICENSE("GPL");