mxc4005.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  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/delay.h>
  8. #include <linux/module.h>
  9. #include <linux/i2c.h>
  10. #include <linux/iio/iio.h>
  11. #include <linux/mod_devicetable.h>
  12. #include <linux/regmap.h>
  13. #include <linux/types.h>
  14. #include <linux/iio/sysfs.h>
  15. #include <linux/iio/trigger.h>
  16. #include <linux/iio/buffer.h>
  17. #include <linux/iio/triggered_buffer.h>
  18. #include <linux/iio/trigger_consumer.h>
  19. #define MXC4005_DRV_NAME "mxc4005"
  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_MASK0 0x0A
  27. #define MXC4005_REG_INT_MASK1 0x0B
  28. #define MXC4005_REG_INT_MASK1_BIT_DRDYE 0x01
  29. #define MXC4005_REG_INT_CLR0 0x00
  30. #define MXC4005_REG_INT_CLR1 0x01
  31. #define MXC4005_REG_INT_CLR1_BIT_DRDYC 0x01
  32. #define MXC4005_REG_INT_CLR1_SW_RST 0x10
  33. #define MXC4005_REG_CONTROL 0x0D
  34. #define MXC4005_REG_CONTROL_MASK_FSR GENMASK(6, 5)
  35. #define MXC4005_CONTROL_FSR_SHIFT 5
  36. #define MXC4005_REG_DEVICE_ID 0x0E
  37. /* Datasheet does not specify a reset time, this is a conservative guess */
  38. #define MXC4005_RESET_TIME_US 2000
  39. enum mxc4005_axis {
  40. AXIS_X,
  41. AXIS_Y,
  42. AXIS_Z,
  43. };
  44. enum mxc4005_range {
  45. MXC4005_RANGE_2G,
  46. MXC4005_RANGE_4G,
  47. MXC4005_RANGE_8G,
  48. };
  49. struct mxc4005_data {
  50. struct device *dev;
  51. struct mutex mutex;
  52. struct regmap *regmap;
  53. struct iio_trigger *dready_trig;
  54. struct iio_mount_matrix orientation;
  55. /* Ensure timestamp is naturally aligned */
  56. struct {
  57. __be16 chans[3];
  58. aligned_s64 timestamp;
  59. } scan;
  60. bool trigger_enabled;
  61. unsigned int control;
  62. unsigned int int_mask1;
  63. };
  64. /*
  65. * MXC4005 can operate in the following ranges:
  66. * +/- 2G, 4G, 8G (the default +/-2G)
  67. *
  68. * (2 + 2) * 9.81 / (2^12 - 1) = 0.009582
  69. * (4 + 4) * 9.81 / (2^12 - 1) = 0.019164
  70. * (8 + 8) * 9.81 / (2^12 - 1) = 0.038329
  71. */
  72. static const struct {
  73. u8 range;
  74. int scale;
  75. } mxc4005_scale_table[] = {
  76. {MXC4005_RANGE_2G, 9582},
  77. {MXC4005_RANGE_4G, 19164},
  78. {MXC4005_RANGE_8G, 38329},
  79. };
  80. static IIO_CONST_ATTR(in_accel_scale_available, "0.009582 0.019164 0.038329");
  81. static struct attribute *mxc4005_attributes[] = {
  82. &iio_const_attr_in_accel_scale_available.dev_attr.attr,
  83. NULL,
  84. };
  85. static const struct attribute_group mxc4005_attrs_group = {
  86. .attrs = mxc4005_attributes,
  87. };
  88. static bool mxc4005_is_readable_reg(struct device *dev, unsigned int reg)
  89. {
  90. switch (reg) {
  91. case MXC4005_REG_XOUT_UPPER:
  92. case MXC4005_REG_XOUT_LOWER:
  93. case MXC4005_REG_YOUT_UPPER:
  94. case MXC4005_REG_YOUT_LOWER:
  95. case MXC4005_REG_ZOUT_UPPER:
  96. case MXC4005_REG_ZOUT_LOWER:
  97. case MXC4005_REG_DEVICE_ID:
  98. case MXC4005_REG_CONTROL:
  99. return true;
  100. default:
  101. return false;
  102. }
  103. }
  104. static bool mxc4005_is_writeable_reg(struct device *dev, unsigned int reg)
  105. {
  106. switch (reg) {
  107. case MXC4005_REG_INT_CLR0:
  108. case MXC4005_REG_INT_CLR1:
  109. case MXC4005_REG_INT_MASK0:
  110. case MXC4005_REG_INT_MASK1:
  111. case MXC4005_REG_CONTROL:
  112. return true;
  113. default:
  114. return false;
  115. }
  116. }
  117. static const struct regmap_config mxc4005_regmap_config = {
  118. .name = "mxc4005_regmap",
  119. .reg_bits = 8,
  120. .val_bits = 8,
  121. .max_register = MXC4005_REG_DEVICE_ID,
  122. .readable_reg = mxc4005_is_readable_reg,
  123. .writeable_reg = mxc4005_is_writeable_reg,
  124. };
  125. static int mxc4005_read_xyz(struct mxc4005_data *data)
  126. {
  127. int ret;
  128. ret = regmap_bulk_read(data->regmap, MXC4005_REG_XOUT_UPPER,
  129. data->scan.chans, sizeof(data->scan.chans));
  130. if (ret < 0) {
  131. dev_err(data->dev, "failed to read axes\n");
  132. return ret;
  133. }
  134. return 0;
  135. }
  136. static int mxc4005_read_axis(struct mxc4005_data *data,
  137. unsigned int addr)
  138. {
  139. __be16 reg;
  140. int ret;
  141. ret = regmap_bulk_read(data->regmap, addr, &reg, sizeof(reg));
  142. if (ret < 0) {
  143. dev_err(data->dev, "failed to read reg %02x\n", addr);
  144. return ret;
  145. }
  146. return be16_to_cpu(reg);
  147. }
  148. static int mxc4005_read_scale(struct mxc4005_data *data)
  149. {
  150. unsigned int reg;
  151. int ret;
  152. int i;
  153. ret = regmap_read(data->regmap, MXC4005_REG_CONTROL, &reg);
  154. if (ret < 0) {
  155. dev_err(data->dev, "failed to read reg_control\n");
  156. return ret;
  157. }
  158. i = reg >> MXC4005_CONTROL_FSR_SHIFT;
  159. if (i < 0 || i >= ARRAY_SIZE(mxc4005_scale_table))
  160. return -EINVAL;
  161. return mxc4005_scale_table[i].scale;
  162. }
  163. static int mxc4005_set_scale(struct mxc4005_data *data, int val)
  164. {
  165. unsigned int reg;
  166. int i;
  167. int ret;
  168. for (i = 0; i < ARRAY_SIZE(mxc4005_scale_table); i++) {
  169. if (mxc4005_scale_table[i].scale == val) {
  170. reg = i << MXC4005_CONTROL_FSR_SHIFT;
  171. ret = regmap_update_bits(data->regmap,
  172. MXC4005_REG_CONTROL,
  173. MXC4005_REG_CONTROL_MASK_FSR,
  174. reg);
  175. if (ret < 0)
  176. dev_err(data->dev,
  177. "failed to write reg_control\n");
  178. return ret;
  179. }
  180. }
  181. return -EINVAL;
  182. }
  183. static int mxc4005_read_raw(struct iio_dev *indio_dev,
  184. struct iio_chan_spec const *chan,
  185. int *val, int *val2, long mask)
  186. {
  187. struct mxc4005_data *data = iio_priv(indio_dev);
  188. int ret;
  189. switch (mask) {
  190. case IIO_CHAN_INFO_RAW:
  191. switch (chan->type) {
  192. case IIO_ACCEL:
  193. if (iio_buffer_enabled(indio_dev))
  194. return -EBUSY;
  195. ret = mxc4005_read_axis(data, chan->address);
  196. if (ret < 0)
  197. return ret;
  198. *val = sign_extend32(ret >> chan->scan_type.shift,
  199. chan->scan_type.realbits - 1);
  200. return IIO_VAL_INT;
  201. default:
  202. return -EINVAL;
  203. }
  204. case IIO_CHAN_INFO_SCALE:
  205. ret = mxc4005_read_scale(data);
  206. if (ret < 0)
  207. return ret;
  208. *val = 0;
  209. *val2 = ret;
  210. return IIO_VAL_INT_PLUS_MICRO;
  211. default:
  212. return -EINVAL;
  213. }
  214. }
  215. static int mxc4005_write_raw(struct iio_dev *indio_dev,
  216. struct iio_chan_spec const *chan,
  217. int val, int val2, long mask)
  218. {
  219. struct mxc4005_data *data = iio_priv(indio_dev);
  220. switch (mask) {
  221. case IIO_CHAN_INFO_SCALE:
  222. if (val != 0)
  223. return -EINVAL;
  224. return mxc4005_set_scale(data, val2);
  225. default:
  226. return -EINVAL;
  227. }
  228. }
  229. static const struct iio_mount_matrix *
  230. mxc4005_get_mount_matrix(const struct iio_dev *indio_dev,
  231. const struct iio_chan_spec *chan)
  232. {
  233. struct mxc4005_data *data = iio_priv(indio_dev);
  234. return &data->orientation;
  235. }
  236. static const struct iio_chan_spec_ext_info mxc4005_ext_info[] = {
  237. IIO_MOUNT_MATRIX(IIO_SHARED_BY_TYPE, mxc4005_get_mount_matrix),
  238. { }
  239. };
  240. static const struct iio_info mxc4005_info = {
  241. .read_raw = mxc4005_read_raw,
  242. .write_raw = mxc4005_write_raw,
  243. .attrs = &mxc4005_attrs_group,
  244. };
  245. static const unsigned long mxc4005_scan_masks[] = {
  246. BIT(AXIS_X) | BIT(AXIS_Y) | BIT(AXIS_Z),
  247. 0
  248. };
  249. #define MXC4005_CHANNEL(_axis, _addr) { \
  250. .type = IIO_ACCEL, \
  251. .modified = 1, \
  252. .channel2 = IIO_MOD_##_axis, \
  253. .address = _addr, \
  254. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  255. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
  256. .scan_index = AXIS_##_axis, \
  257. .scan_type = { \
  258. .sign = 's', \
  259. .realbits = 12, \
  260. .storagebits = 16, \
  261. .shift = 4, \
  262. .endianness = IIO_BE, \
  263. }, \
  264. .ext_info = mxc4005_ext_info, \
  265. }
  266. static const struct iio_chan_spec mxc4005_channels[] = {
  267. MXC4005_CHANNEL(X, MXC4005_REG_XOUT_UPPER),
  268. MXC4005_CHANNEL(Y, MXC4005_REG_YOUT_UPPER),
  269. MXC4005_CHANNEL(Z, MXC4005_REG_ZOUT_UPPER),
  270. IIO_CHAN_SOFT_TIMESTAMP(3),
  271. };
  272. static irqreturn_t mxc4005_trigger_handler(int irq, void *private)
  273. {
  274. struct iio_poll_func *pf = private;
  275. struct iio_dev *indio_dev = pf->indio_dev;
  276. struct mxc4005_data *data = iio_priv(indio_dev);
  277. int ret;
  278. ret = mxc4005_read_xyz(data);
  279. if (ret < 0)
  280. goto err;
  281. iio_push_to_buffers_with_ts(indio_dev, &data->scan, sizeof(data->scan),
  282. pf->timestamp);
  283. err:
  284. iio_trigger_notify_done(indio_dev->trig);
  285. return IRQ_HANDLED;
  286. }
  287. static void mxc4005_clr_intr(struct mxc4005_data *data)
  288. {
  289. int ret;
  290. /* clear interrupt */
  291. ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
  292. MXC4005_REG_INT_CLR1_BIT_DRDYC);
  293. if (ret < 0)
  294. dev_err(data->dev, "failed to write to reg_int_clr1\n");
  295. }
  296. static int mxc4005_set_trigger_state(struct iio_trigger *trig,
  297. bool state)
  298. {
  299. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  300. struct mxc4005_data *data = iio_priv(indio_dev);
  301. unsigned int val;
  302. int ret;
  303. mutex_lock(&data->mutex);
  304. val = state ? MXC4005_REG_INT_MASK1_BIT_DRDYE : 0;
  305. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, val);
  306. if (ret < 0) {
  307. mutex_unlock(&data->mutex);
  308. dev_err(data->dev, "failed to update reg_int_mask1");
  309. return ret;
  310. }
  311. data->int_mask1 = val;
  312. data->trigger_enabled = state;
  313. mutex_unlock(&data->mutex);
  314. return 0;
  315. }
  316. static void mxc4005_trigger_reen(struct iio_trigger *trig)
  317. {
  318. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  319. struct mxc4005_data *data = iio_priv(indio_dev);
  320. if (!data->dready_trig)
  321. return;
  322. mxc4005_clr_intr(data);
  323. }
  324. static const struct iio_trigger_ops mxc4005_trigger_ops = {
  325. .set_trigger_state = mxc4005_set_trigger_state,
  326. .reenable = mxc4005_trigger_reen,
  327. };
  328. static int mxc4005_chip_init(struct mxc4005_data *data)
  329. {
  330. int ret;
  331. unsigned int reg;
  332. ret = regmap_read(data->regmap, MXC4005_REG_DEVICE_ID, &reg);
  333. if (ret < 0) {
  334. dev_err(data->dev, "failed to read chip id\n");
  335. return ret;
  336. }
  337. dev_dbg(data->dev, "MXC4005 chip id %02x\n", reg);
  338. ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
  339. MXC4005_REG_INT_CLR1_SW_RST);
  340. if (ret < 0)
  341. return dev_err_probe(data->dev, ret, "resetting chip\n");
  342. fsleep(MXC4005_RESET_TIME_US);
  343. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK0, 0);
  344. if (ret < 0)
  345. return dev_err_probe(data->dev, ret, "writing INT_MASK0\n");
  346. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, 0);
  347. if (ret < 0)
  348. return dev_err_probe(data->dev, ret, "writing INT_MASK1\n");
  349. return 0;
  350. }
  351. static int mxc4005_probe(struct i2c_client *client)
  352. {
  353. struct mxc4005_data *data;
  354. struct iio_dev *indio_dev;
  355. struct regmap *regmap;
  356. int ret;
  357. indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
  358. if (!indio_dev)
  359. return -ENOMEM;
  360. regmap = devm_regmap_init_i2c(client, &mxc4005_regmap_config);
  361. if (IS_ERR(regmap)) {
  362. dev_err(&client->dev, "failed to initialize regmap\n");
  363. return PTR_ERR(regmap);
  364. }
  365. data = iio_priv(indio_dev);
  366. i2c_set_clientdata(client, indio_dev);
  367. data->dev = &client->dev;
  368. data->regmap = regmap;
  369. ret = mxc4005_chip_init(data);
  370. if (ret < 0) {
  371. dev_err(&client->dev, "failed to initialize chip\n");
  372. return ret;
  373. }
  374. mutex_init(&data->mutex);
  375. if (!iio_read_acpi_mount_matrix(&client->dev, &data->orientation, "ROTM")) {
  376. ret = iio_read_mount_matrix(&client->dev, &data->orientation);
  377. if (ret)
  378. return ret;
  379. }
  380. indio_dev->channels = mxc4005_channels;
  381. indio_dev->num_channels = ARRAY_SIZE(mxc4005_channels);
  382. indio_dev->available_scan_masks = mxc4005_scan_masks;
  383. indio_dev->name = MXC4005_DRV_NAME;
  384. indio_dev->modes = INDIO_DIRECT_MODE;
  385. indio_dev->info = &mxc4005_info;
  386. ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev,
  387. iio_pollfunc_store_time,
  388. mxc4005_trigger_handler,
  389. NULL);
  390. if (ret < 0) {
  391. dev_err(&client->dev,
  392. "failed to setup iio triggered buffer\n");
  393. return ret;
  394. }
  395. if (client->irq > 0) {
  396. data->dready_trig = devm_iio_trigger_alloc(&client->dev,
  397. "%s-dev%d",
  398. indio_dev->name,
  399. iio_device_id(indio_dev));
  400. if (!data->dready_trig)
  401. return -ENOMEM;
  402. ret = devm_request_irq(&client->dev, client->irq,
  403. iio_trigger_generic_data_rdy_poll,
  404. IRQF_TRIGGER_FALLING | IRQF_NO_THREAD,
  405. "mxc4005_event", data->dready_trig);
  406. if (ret) {
  407. dev_err(&client->dev,
  408. "failed to init threaded irq\n");
  409. return ret;
  410. }
  411. data->dready_trig->ops = &mxc4005_trigger_ops;
  412. iio_trigger_set_drvdata(data->dready_trig, indio_dev);
  413. ret = devm_iio_trigger_register(&client->dev,
  414. data->dready_trig);
  415. if (ret) {
  416. dev_err(&client->dev,
  417. "failed to register trigger\n");
  418. return ret;
  419. }
  420. indio_dev->trig = iio_trigger_get(data->dready_trig);
  421. }
  422. return devm_iio_device_register(&client->dev, indio_dev);
  423. }
  424. static int mxc4005_suspend(struct device *dev)
  425. {
  426. struct iio_dev *indio_dev = dev_get_drvdata(dev);
  427. struct mxc4005_data *data = iio_priv(indio_dev);
  428. int ret;
  429. /* Save control to restore it on resume */
  430. ret = regmap_read(data->regmap, MXC4005_REG_CONTROL, &data->control);
  431. if (ret < 0)
  432. dev_err(data->dev, "failed to read reg_control\n");
  433. return ret;
  434. }
  435. static int mxc4005_resume(struct device *dev)
  436. {
  437. struct iio_dev *indio_dev = dev_get_drvdata(dev);
  438. struct mxc4005_data *data = iio_priv(indio_dev);
  439. int ret;
  440. ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
  441. MXC4005_REG_INT_CLR1_SW_RST);
  442. if (ret) {
  443. dev_err(data->dev, "failed to reset chip: %d\n", ret);
  444. return ret;
  445. }
  446. fsleep(MXC4005_RESET_TIME_US);
  447. ret = regmap_write(data->regmap, MXC4005_REG_CONTROL, data->control);
  448. if (ret) {
  449. dev_err(data->dev, "failed to restore control register\n");
  450. return ret;
  451. }
  452. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK0, 0);
  453. if (ret) {
  454. dev_err(data->dev, "failed to restore interrupt 0 mask\n");
  455. return ret;
  456. }
  457. ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, data->int_mask1);
  458. if (ret) {
  459. dev_err(data->dev, "failed to restore interrupt 1 mask\n");
  460. return ret;
  461. }
  462. return 0;
  463. }
  464. static DEFINE_SIMPLE_DEV_PM_OPS(mxc4005_pm_ops, mxc4005_suspend, mxc4005_resume);
  465. static const struct acpi_device_id mxc4005_acpi_match[] = {
  466. {"MXC4005", 0},
  467. {"MXC6655", 0},
  468. {"MDA6655", 0},
  469. { }
  470. };
  471. MODULE_DEVICE_TABLE(acpi, mxc4005_acpi_match);
  472. static const struct of_device_id mxc4005_of_match[] = {
  473. { .compatible = "memsic,mxc4005", },
  474. { .compatible = "memsic,mxc6655", },
  475. { }
  476. };
  477. MODULE_DEVICE_TABLE(of, mxc4005_of_match);
  478. static const struct i2c_device_id mxc4005_id[] = {
  479. { "mxc4005" },
  480. { "mxc6655" },
  481. { }
  482. };
  483. MODULE_DEVICE_TABLE(i2c, mxc4005_id);
  484. static struct i2c_driver mxc4005_driver = {
  485. .driver = {
  486. .name = MXC4005_DRV_NAME,
  487. .acpi_match_table = mxc4005_acpi_match,
  488. .of_match_table = mxc4005_of_match,
  489. .pm = pm_sleep_ptr(&mxc4005_pm_ops),
  490. },
  491. .probe = mxc4005_probe,
  492. .id_table = mxc4005_id,
  493. };
  494. module_i2c_driver(mxc4005_driver);
  495. MODULE_AUTHOR("Teodora Baluta <teodora.baluta@intel.com>");
  496. MODULE_LICENSE("GPL v2");
  497. MODULE_DESCRIPTION("MXC4005 3-axis accelerometer driver");