mxc4005.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * 3-axis accelerometer driver for MXC4005XC Memsic sensor
  4. *
  5. * Copyright (c) 2014, Intel Corporation.
  6. */
  7. #include <linux/module.h>
  8. #include <linux/i2c.h>
  9. #include <linux/iio/iio.h>
  10. #include <linux/acpi.h>
  11. #include <linux/regmap.h>
  12. #include <linux/iio/sysfs.h>
  13. #include <linux/iio/trigger.h>
  14. #include <linux/iio/buffer.h>
  15. #include <linux/iio/triggered_buffer.h>
  16. #include <linux/iio/trigger_consumer.h>
  17. #define MXC4005_DRV_NAME "mxc4005"
  18. #define MXC4005_IRQ_NAME "mxc4005_event"
  19. #define MXC4005_REGMAP_NAME "mxc4005_regmap"
  20. #define MXC4005_REG_XOUT_UPPER 0x03
  21. #define MXC4005_REG_XOUT_LOWER 0x04
  22. #define MXC4005_REG_YOUT_UPPER 0x05
  23. #define MXC4005_REG_YOUT_LOWER 0x06
  24. #define MXC4005_REG_ZOUT_UPPER 0x07
  25. #define MXC4005_REG_ZOUT_LOWER 0x08
  26. #define MXC4005_REG_INT_MASK1 0x0B
  27. #define MXC4005_REG_INT_MASK1_BIT_DRDYE 0x01
  28. #define MXC4005_REG_INT_CLR1 0x01
  29. #define MXC4005_REG_INT_CLR1_BIT_DRDYC 0x01
  30. #define MXC4005_REG_CONTROL 0x0D
  31. #define MXC4005_REG_CONTROL_MASK_FSR GENMASK(6, 5)
  32. #define MXC4005_CONTROL_FSR_SHIFT 5
  33. #define MXC4005_REG_DEVICE_ID 0x0E
  34. enum mxc4005_axis {
  35. AXIS_X,
  36. AXIS_Y,
  37. AXIS_Z,
  38. };
  39. enum mxc4005_range {
  40. MXC4005_RANGE_2G,
  41. MXC4005_RANGE_4G,
  42. MXC4005_RANGE_8G,
  43. };
  44. struct mxc4005_data {
  45. struct device *dev;
  46. struct mutex mutex;
  47. struct regmap *regmap;
  48. struct iio_trigger *dready_trig;
  49. /* Ensure timestamp is naturally aligned */
  50. struct {
  51. __be16 chans[3];
  52. s64 timestamp __aligned(8);
  53. } scan;
  54. bool trigger_enabled;
  55. };
  56. /*
  57. * MXC4005 can operate in the following ranges:
  58. * +/- 2G, 4G, 8G (the default +/-2G)
  59. *
  60. * (2 + 2) * 9.81 / (2^12 - 1) = 0.009582
  61. * (4 + 4) * 9.81 / (2^12 - 1) = 0.019164
  62. * (8 + 8) * 9.81 / (2^12 - 1) = 0.038329
  63. */
  64. static const struct {
  65. u8 range;
  66. int scale;
  67. } mxc4005_scale_table[] = {
  68. {MXC4005_RANGE_2G, 9582},
  69. {MXC4005_RANGE_4G, 19164},
  70. {MXC4005_RANGE_8G, 38329},
  71. };
  72. static IIO_CONST_ATTR(in_accel_scale_available, "0.009582 0.019164 0.038329");
  73. static struct attribute *mxc4005_attributes[] = {
  74. &iio_const_attr_in_accel_scale_available.dev_attr.attr,
  75. NULL,
  76. };
  77. static const struct attribute_group mxc4005_attrs_group = {
  78. .attrs = mxc4005_attributes,
  79. };
  80. static bool mxc4005_is_readable_reg(struct device *dev, unsigned int reg)
  81. {
  82. switch (reg) {
  83. case MXC4005_REG_XOUT_UPPER:
  84. case MXC4005_REG_XOUT_LOWER:
  85. case MXC4005_REG_YOUT_UPPER:
  86. case MXC4005_REG_YOUT_LOWER:
  87. case MXC4005_REG_ZOUT_UPPER:
  88. case MXC4005_REG_ZOUT_LOWER:
  89. case MXC4005_REG_DEVICE_ID:
  90. case MXC4005_REG_CONTROL:
  91. return true;
  92. default:
  93. return false;
  94. }
  95. }
  96. static bool mxc4005_is_writeable_reg(struct device *dev, unsigned int reg)
  97. {
  98. switch (reg) {
  99. case MXC4005_REG_INT_CLR1:
  100. case MXC4005_REG_INT_MASK1:
  101. case MXC4005_REG_CONTROL:
  102. return true;
  103. default:
  104. return false;
  105. }
  106. }
  107. static const struct regmap_config mxc4005_regmap_config = {
  108. .name = MXC4005_REGMAP_NAME,
  109. .reg_bits = 8,
  110. .val_bits = 8,
  111. .max_register = MXC4005_REG_DEVICE_ID,
  112. .readable_reg = mxc4005_is_readable_reg,
  113. .writeable_reg = mxc4005_is_writeable_reg,
  114. };
  115. static int mxc4005_read_xyz(struct mxc4005_data *data)
  116. {
  117. int ret;
  118. ret = regmap_bulk_read(data->regmap, MXC4005_REG_XOUT_UPPER,
  119. data->scan.chans, sizeof(data->scan.chans));
  120. if (ret < 0) {
  121. dev_err(data->dev, "failed to read axes\n");
  122. return ret;
  123. }
  124. return 0;
  125. }
  126. static int mxc4005_read_axis(struct mxc4005_data *data,
  127. unsigned int addr)
  128. {
  129. __be16 reg;
  130. int ret;
  131. ret = regmap_bulk_read(data->regmap, addr, &reg, sizeof(reg));
  132. if (ret < 0) {
  133. dev_err(data->dev, "failed to read reg %02x\n", addr);
  134. return ret;
  135. }
  136. return be16_to_cpu(reg);
  137. }
  138. static int mxc4005_read_scale(struct mxc4005_data *data)
  139. {
  140. unsigned int reg;
  141. int ret;
  142. int i;
  143. ret = regmap_read(data->regmap, MXC4005_REG_CONTROL, &reg);
  144. if (ret < 0) {
  145. dev_err(data->dev, "failed to read reg_control\n");
  146. return ret;
  147. }
  148. i = reg >> MXC4005_CONTROL_FSR_SHIFT;
  149. if (i < 0 || i >= ARRAY_SIZE(mxc4005_scale_table))
  150. return -EINVAL;
  151. return mxc4005_scale_table[i].scale;
  152. }
  153. static int mxc4005_set_scale(struct mxc4005_data *data, int val)
  154. {
  155. unsigned int reg;
  156. int i;
  157. int ret;
  158. for (i = 0; i < ARRAY_SIZE(mxc4005_scale_table); i++) {
  159. if (mxc4005_scale_table[i].scale == val) {
  160. reg = i << MXC4005_CONTROL_FSR_SHIFT;
  161. ret = regmap_update_bits(data->regmap,
  162. MXC4005_REG_CONTROL,
  163. MXC4005_REG_CONTROL_MASK_FSR,
  164. reg);
  165. if (ret < 0)
  166. dev_err(data->dev,
  167. "failed to write reg_control\n");
  168. return ret;
  169. }
  170. }
  171. return -EINVAL;
  172. }
  173. static int mxc4005_read_raw(struct iio_dev *indio_dev,
  174. struct iio_chan_spec const *chan,
  175. int *val, int *val2, long mask)
  176. {
  177. struct mxc4005_data *data = iio_priv(indio_dev);
  178. int ret;
  179. switch (mask) {
  180. case IIO_CHAN_INFO_RAW:
  181. switch (chan->type) {
  182. case IIO_ACCEL:
  183. if (iio_buffer_enabled(indio_dev))
  184. return -EBUSY;
  185. ret = mxc4005_read_axis(data, chan->address);
  186. if (ret < 0)
  187. return ret;
  188. *val = sign_extend32(ret >> chan->scan_type.shift,
  189. chan->scan_type.realbits - 1);
  190. return IIO_VAL_INT;
  191. default:
  192. return -EINVAL;
  193. }
  194. case IIO_CHAN_INFO_SCALE:
  195. ret = mxc4005_read_scale(data);
  196. if (ret < 0)
  197. return ret;
  198. *val = 0;
  199. *val2 = ret;
  200. return IIO_VAL_INT_PLUS_MICRO;
  201. default:
  202. return -EINVAL;
  203. }
  204. }
  205. static int mxc4005_write_raw(struct iio_dev *indio_dev,
  206. struct iio_chan_spec const *chan,
  207. int val, int val2, long mask)
  208. {
  209. struct mxc4005_data *data = iio_priv(indio_dev);
  210. switch (mask) {
  211. case IIO_CHAN_INFO_SCALE:
  212. if (val != 0)
  213. return -EINVAL;
  214. return mxc4005_set_scale(data, val2);
  215. default:
  216. return -EINVAL;
  217. }
  218. }
  219. static const struct iio_info mxc4005_info = {
  220. .read_raw = mxc4005_read_raw,
  221. .write_raw = mxc4005_write_raw,
  222. .attrs = &mxc4005_attrs_group,
  223. };
  224. static const unsigned long mxc4005_scan_masks[] = {
  225. BIT(AXIS_X) | BIT(AXIS_Y) | BIT(AXIS_Z),
  226. 0
  227. };
  228. #define MXC4005_CHANNEL(_axis, _addr) { \
  229. .type = IIO_ACCEL, \
  230. .modified = 1, \
  231. .channel2 = IIO_MOD_##_axis, \
  232. .address = _addr, \
  233. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  234. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  235. .scan_index = AXIS_##_axis, \
  236. .scan_type = { \
  237. .sign = 's', \
  238. .realbits = 12, \
  239. .storagebits = 16, \
  240. .shift = 4, \
  241. .endianness = IIO_BE, \
  242. }, \
  243. }
  244. static const struct iio_chan_spec mxc4005_channels[] = {
  245. MXC4005_CHANNEL(X, MXC4005_REG_XOUT_UPPER),
  246. MXC4005_CHANNEL(Y, MXC4005_REG_YOUT_UPPER),
  247. MXC4005_CHANNEL(Z, MXC4005_REG_ZOUT_UPPER),
  248. IIO_CHAN_SOFT_TIMESTAMP(3),
  249. };
  250. static irqreturn_t mxc4005_trigger_handler(int irq, void *private)
  251. {
  252. struct iio_poll_func *pf = private;
  253. struct iio_dev *indio_dev = pf->indio_dev;
  254. struct mxc4005_data *data = iio_priv(indio_dev);
  255. int ret;
  256. ret = mxc4005_read_xyz(data);
  257. if (ret < 0)
  258. goto err;
  259. iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
  260. pf->timestamp);
  261. err:
  262. iio_trigger_notify_done(indio_dev->trig);
  263. return IRQ_HANDLED;
  264. }
  265. static void mxc4005_clr_intr(struct mxc4005_data *data)
  266. {
  267. int ret;
  268. /* clear interrupt */
  269. ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
  270. MXC4005_REG_INT_CLR1_BIT_DRDYC);
  271. if (ret < 0)
  272. dev_err(data->dev, "failed to write to reg_int_clr1\n");
  273. }
  274. static int mxc4005_set_trigger_state(struct iio_trigger *trig,
  275. bool state)
  276. {
  277. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  278. struct mxc4005_data *data = iio_priv(indio_dev);
  279. int ret;
  280. mutex_lock(&data->mutex);
  281. if (state) {
  282. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1,
  283. MXC4005_REG_INT_MASK1_BIT_DRDYE);
  284. } else {
  285. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1,
  286. ~MXC4005_REG_INT_MASK1_BIT_DRDYE);
  287. }
  288. if (ret < 0) {
  289. mutex_unlock(&data->mutex);
  290. dev_err(data->dev, "failed to update reg_int_mask1");
  291. return ret;
  292. }
  293. data->trigger_enabled = state;
  294. mutex_unlock(&data->mutex);
  295. return 0;
  296. }
  297. static void mxc4005_trigger_reen(struct iio_trigger *trig)
  298. {
  299. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  300. struct mxc4005_data *data = iio_priv(indio_dev);
  301. if (!data->dready_trig)
  302. return;
  303. mxc4005_clr_intr(data);
  304. }
  305. static const struct iio_trigger_ops mxc4005_trigger_ops = {
  306. .set_trigger_state = mxc4005_set_trigger_state,
  307. .reenable = mxc4005_trigger_reen,
  308. };
  309. static int mxc4005_chip_init(struct mxc4005_data *data)
  310. {
  311. int ret;
  312. unsigned int reg;
  313. ret = regmap_read(data->regmap, MXC4005_REG_DEVICE_ID, &reg);
  314. if (ret < 0) {
  315. dev_err(data->dev, "failed to read chip id\n");
  316. return ret;
  317. }
  318. dev_dbg(data->dev, "MXC4005 chip id %02x\n", reg);
  319. return 0;
  320. }
  321. static int mxc4005_probe(struct i2c_client *client,
  322. const struct i2c_device_id *id)
  323. {
  324. struct mxc4005_data *data;
  325. struct iio_dev *indio_dev;
  326. struct regmap *regmap;
  327. int ret;
  328. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  329. if (!indio_dev)
  330. return -ENOMEM;
  331. regmap = devm_regmap_init_i2c(client, &mxc4005_regmap_config);
  332. if (IS_ERR(regmap)) {
  333. dev_err(&client->dev, "failed to initialize regmap\n");
  334. return PTR_ERR(regmap);
  335. }
  336. data = iio_priv(indio_dev);
  337. i2c_set_clientdata(client, indio_dev);
  338. data->dev = &client->dev;
  339. data->regmap = regmap;
  340. ret = mxc4005_chip_init(data);
  341. if (ret < 0) {
  342. dev_err(&client->dev, "failed to initialize chip\n");
  343. return ret;
  344. }
  345. mutex_init(&data->mutex);
  346. indio_dev->channels = mxc4005_channels;
  347. indio_dev->num_channels = ARRAY_SIZE(mxc4005_channels);
  348. indio_dev->available_scan_masks = mxc4005_scan_masks;
  349. indio_dev->name = MXC4005_DRV_NAME;
  350. indio_dev->modes = INDIO_DIRECT_MODE;
  351. indio_dev->info = &mxc4005_info;
  352. ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev,
  353. iio_pollfunc_store_time,
  354. mxc4005_trigger_handler,
  355. NULL);
  356. if (ret < 0) {
  357. dev_err(&client->dev,
  358. "failed to setup iio triggered buffer\n");
  359. return ret;
  360. }
  361. if (client->irq > 0) {
  362. data->dready_trig = devm_iio_trigger_alloc(&client->dev,
  363. "%s-dev%d",
  364. indio_dev->name,
  365. iio_device_id(indio_dev));
  366. if (!data->dready_trig)
  367. return -ENOMEM;
  368. ret = devm_request_threaded_irq(&client->dev, client->irq,
  369. iio_trigger_generic_data_rdy_poll,
  370. NULL,
  371. IRQF_TRIGGER_FALLING |
  372. IRQF_ONESHOT,
  373. MXC4005_IRQ_NAME,
  374. data->dready_trig);
  375. if (ret) {
  376. dev_err(&client->dev,
  377. "failed to init threaded irq\n");
  378. return ret;
  379. }
  380. data->dready_trig->ops = &mxc4005_trigger_ops;
  381. iio_trigger_set_drvdata(data->dready_trig, indio_dev);
  382. ret = devm_iio_trigger_register(&client->dev,
  383. data->dready_trig);
  384. if (ret) {
  385. dev_err(&client->dev,
  386. "failed to register trigger\n");
  387. return ret;
  388. }
  389. indio_dev->trig = iio_trigger_get(data->dready_trig);
  390. }
  391. return devm_iio_device_register(&client->dev, indio_dev);
  392. }
  393. static const struct acpi_device_id mxc4005_acpi_match[] = {
  394. {"MXC4005", 0},
  395. {"MXC6655", 0},
  396. { },
  397. };
  398. MODULE_DEVICE_TABLE(acpi, mxc4005_acpi_match);
  399. static const struct i2c_device_id mxc4005_id[] = {
  400. {"mxc4005", 0},
  401. {"mxc6655", 0},
  402. { },
  403. };
  404. MODULE_DEVICE_TABLE(i2c, mxc4005_id);
  405. static struct i2c_driver mxc4005_driver = {
  406. .driver = {
  407. .name = MXC4005_DRV_NAME,
  408. .acpi_match_table = ACPI_PTR(mxc4005_acpi_match),
  409. },
  410. .probe = mxc4005_probe,
  411. .id_table = mxc4005_id,
  412. };
  413. module_i2c_driver(mxc4005_driver);
  414. MODULE_AUTHOR("Teodora Baluta <[email protected]>");
  415. MODULE_LICENSE("GPL v2");
  416. MODULE_DESCRIPTION("MXC4005 3-axis accelerometer driver");