mxc4005.c 14 KB

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