hmc5843_core.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. /*
  2. * Device driver for the the HMC5843 multi-chip module designed
  3. * for low field magnetic sensing.
  4. *
  5. * Copyright (C) 2010 Texas Instruments
  6. *
  7. * Author: Shubhrajyoti Datta <shubhrajyoti@ti.com>
  8. * Acknowledgment: Jonathan Cameron <jic23@kernel.org> for valuable inputs.
  9. * Support for HMC5883 and HMC5883L by Peter Meerwald <pmeerw@pmeerw.net>.
  10. * Split to multiple files by Josef Gajdusek <atx@atx.name> - 2014
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation; either version 2 of the License, or
  15. * (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. */
  23. #include <linux/module.h>
  24. #include <linux/regmap.h>
  25. #include <linux/iio/iio.h>
  26. #include <linux/iio/sysfs.h>
  27. #include <linux/iio/trigger_consumer.h>
  28. #include <linux/iio/buffer.h>
  29. #include <linux/iio/triggered_buffer.h>
  30. #include <linux/delay.h>
  31. #include "hmc5843.h"
  32. /*
  33. * Range gain settings in (+-)Ga
  34. * Beware: HMC5843 and HMC5883 have different recommended sensor field
  35. * ranges; default corresponds to +-1.0 Ga and +-1.3 Ga, respectively
  36. */
  37. #define HMC5843_RANGE_GAIN_OFFSET 0x05
  38. #define HMC5843_RANGE_GAIN_DEFAULT 0x01
  39. #define HMC5843_RANGE_GAIN_MASK 0xe0
  40. /* Device status */
  41. #define HMC5843_DATA_READY 0x01
  42. #define HMC5843_DATA_OUTPUT_LOCK 0x02
  43. /* Mode register configuration */
  44. #define HMC5843_MODE_CONVERSION_CONTINUOUS 0x00
  45. #define HMC5843_MODE_CONVERSION_SINGLE 0x01
  46. #define HMC5843_MODE_IDLE 0x02
  47. #define HMC5843_MODE_SLEEP 0x03
  48. #define HMC5843_MODE_MASK 0x03
  49. /*
  50. * HMC5843: Minimum data output rate
  51. * HMC5883: Typical data output rate
  52. */
  53. #define HMC5843_RATE_OFFSET 0x02
  54. #define HMC5843_RATE_DEFAULT 0x04
  55. #define HMC5843_RATE_MASK 0x1c
  56. /* Device measurement configuration */
  57. #define HMC5843_MEAS_CONF_NORMAL 0x00
  58. #define HMC5843_MEAS_CONF_POSITIVE_BIAS 0x01
  59. #define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02
  60. #define HMC5843_MEAS_CONF_MASK 0x03
  61. /* Scaling factors: 10000000/Gain */
  62. static const int hmc5843_regval_to_nanoscale[] = {
  63. 6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714
  64. };
  65. static const int hmc5883_regval_to_nanoscale[] = {
  66. 7812, 9766, 13021, 16287, 24096, 27701, 32573, 45662
  67. };
  68. static const int hmc5883l_regval_to_nanoscale[] = {
  69. 7299, 9174, 12195, 15152, 22727, 25641, 30303, 43478
  70. };
  71. /*
  72. * From the datasheet:
  73. * Value | HMC5843 | HMC5883/HMC5883L
  74. * | Data output rate (Hz) | Data output rate (Hz)
  75. * 0 | 0.5 | 0.75
  76. * 1 | 1 | 1.5
  77. * 2 | 2 | 3
  78. * 3 | 5 | 7.5
  79. * 4 | 10 (default) | 15
  80. * 5 | 20 | 30
  81. * 6 | 50 | 75
  82. * 7 | Not used | Not used
  83. */
  84. static const int hmc5843_regval_to_samp_freq[][2] = {
  85. {0, 500000}, {1, 0}, {2, 0}, {5, 0}, {10, 0}, {20, 0}, {50, 0}
  86. };
  87. static const int hmc5883_regval_to_samp_freq[][2] = {
  88. {0, 750000}, {1, 500000}, {3, 0}, {7, 500000}, {15, 0}, {30, 0},
  89. {75, 0}
  90. };
  91. static const int hmc5983_regval_to_samp_freq[][2] = {
  92. {0, 750000}, {1, 500000}, {3, 0}, {7, 500000}, {15, 0}, {30, 0},
  93. {75, 0}, {220, 0}
  94. };
  95. /* Describe chip variants */
  96. struct hmc5843_chip_info {
  97. const struct iio_chan_spec *channels;
  98. const int (*regval_to_samp_freq)[2];
  99. const int n_regval_to_samp_freq;
  100. const int *regval_to_nanoscale;
  101. const int n_regval_to_nanoscale;
  102. };
  103. /* The lower two bits contain the current conversion mode */
  104. static s32 hmc5843_set_mode(struct hmc5843_data *data, u8 operating_mode)
  105. {
  106. int ret;
  107. mutex_lock(&data->lock);
  108. ret = regmap_update_bits(data->regmap, HMC5843_MODE_REG,
  109. HMC5843_MODE_MASK, operating_mode);
  110. mutex_unlock(&data->lock);
  111. return ret;
  112. }
  113. static int hmc5843_wait_measurement(struct hmc5843_data *data)
  114. {
  115. int tries = 150;
  116. unsigned int val;
  117. int ret;
  118. while (tries-- > 0) {
  119. ret = regmap_read(data->regmap, HMC5843_STATUS_REG, &val);
  120. if (ret < 0)
  121. return ret;
  122. if (val & HMC5843_DATA_READY)
  123. break;
  124. msleep(20);
  125. }
  126. if (tries < 0) {
  127. dev_err(data->dev, "data not ready\n");
  128. return -EIO;
  129. }
  130. return 0;
  131. }
  132. /* Return the measurement value from the specified channel */
  133. static int hmc5843_read_measurement(struct hmc5843_data *data,
  134. int idx, int *val)
  135. {
  136. __be16 values[3];
  137. int ret;
  138. mutex_lock(&data->lock);
  139. ret = hmc5843_wait_measurement(data);
  140. if (ret < 0) {
  141. mutex_unlock(&data->lock);
  142. return ret;
  143. }
  144. ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS,
  145. values, sizeof(values));
  146. mutex_unlock(&data->lock);
  147. if (ret < 0)
  148. return ret;
  149. *val = sign_extend32(be16_to_cpu(values[idx]), 15);
  150. return IIO_VAL_INT;
  151. }
  152. /*
  153. * API for setting the measurement configuration to
  154. * Normal, Positive bias and Negative bias
  155. *
  156. * From the datasheet:
  157. * 0 - Normal measurement configuration (default): In normal measurement
  158. * configuration the device follows normal measurement flow. Pins BP
  159. * and BN are left floating and high impedance.
  160. *
  161. * 1 - Positive bias configuration: In positive bias configuration, a
  162. * positive current is forced across the resistive load on pins BP
  163. * and BN.
  164. *
  165. * 2 - Negative bias configuration. In negative bias configuration, a
  166. * negative current is forced across the resistive load on pins BP
  167. * and BN.
  168. *
  169. */
  170. static int hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
  171. {
  172. int ret;
  173. mutex_lock(&data->lock);
  174. ret = regmap_update_bits(data->regmap, HMC5843_CONFIG_REG_A,
  175. HMC5843_MEAS_CONF_MASK, meas_conf);
  176. mutex_unlock(&data->lock);
  177. return ret;
  178. }
  179. static
  180. ssize_t hmc5843_show_measurement_configuration(struct device *dev,
  181. struct device_attribute *attr,
  182. char *buf)
  183. {
  184. struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
  185. unsigned int val;
  186. int ret;
  187. ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_A, &val);
  188. if (ret)
  189. return ret;
  190. val &= HMC5843_MEAS_CONF_MASK;
  191. return sprintf(buf, "%d\n", val);
  192. }
  193. static
  194. ssize_t hmc5843_set_measurement_configuration(struct device *dev,
  195. struct device_attribute *attr,
  196. const char *buf,
  197. size_t count)
  198. {
  199. struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
  200. unsigned long meas_conf = 0;
  201. int ret;
  202. ret = kstrtoul(buf, 10, &meas_conf);
  203. if (ret)
  204. return ret;
  205. if (meas_conf >= HMC5843_MEAS_CONF_MASK)
  206. return -EINVAL;
  207. ret = hmc5843_set_meas_conf(data, meas_conf);
  208. return (ret < 0) ? ret : count;
  209. }
  210. static IIO_DEVICE_ATTR(meas_conf,
  211. S_IWUSR | S_IRUGO,
  212. hmc5843_show_measurement_configuration,
  213. hmc5843_set_measurement_configuration,
  214. 0);
  215. static
  216. ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
  217. struct device_attribute *attr, char *buf)
  218. {
  219. struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
  220. size_t len = 0;
  221. int i;
  222. for (i = 0; i < data->variant->n_regval_to_samp_freq; i++)
  223. len += scnprintf(buf + len, PAGE_SIZE - len,
  224. "%d.%d ", data->variant->regval_to_samp_freq[i][0],
  225. data->variant->regval_to_samp_freq[i][1]);
  226. /* replace trailing space by newline */
  227. buf[len - 1] = '\n';
  228. return len;
  229. }
  230. static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_samp_freq_avail);
  231. static int hmc5843_set_samp_freq(struct hmc5843_data *data, u8 rate)
  232. {
  233. int ret;
  234. mutex_lock(&data->lock);
  235. ret = regmap_update_bits(data->regmap, HMC5843_CONFIG_REG_A,
  236. HMC5843_RATE_MASK,
  237. rate << HMC5843_RATE_OFFSET);
  238. mutex_unlock(&data->lock);
  239. return ret;
  240. }
  241. static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
  242. int val, int val2)
  243. {
  244. int i;
  245. for (i = 0; i < data->variant->n_regval_to_samp_freq; i++)
  246. if (val == data->variant->regval_to_samp_freq[i][0] &&
  247. val2 == data->variant->regval_to_samp_freq[i][1])
  248. return i;
  249. return -EINVAL;
  250. }
  251. static int hmc5843_set_range_gain(struct hmc5843_data *data, u8 range)
  252. {
  253. int ret;
  254. mutex_lock(&data->lock);
  255. ret = regmap_update_bits(data->regmap, HMC5843_CONFIG_REG_B,
  256. HMC5843_RANGE_GAIN_MASK,
  257. range << HMC5843_RANGE_GAIN_OFFSET);
  258. mutex_unlock(&data->lock);
  259. return ret;
  260. }
  261. static ssize_t hmc5843_show_scale_avail(struct device *dev,
  262. struct device_attribute *attr,
  263. char *buf)
  264. {
  265. struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
  266. size_t len = 0;
  267. int i;
  268. for (i = 0; i < data->variant->n_regval_to_nanoscale; i++)
  269. len += scnprintf(buf + len, PAGE_SIZE - len,
  270. "0.%09d ", data->variant->regval_to_nanoscale[i]);
  271. /* replace trailing space by newline */
  272. buf[len - 1] = '\n';
  273. return len;
  274. }
  275. static IIO_DEVICE_ATTR(scale_available, S_IRUGO,
  276. hmc5843_show_scale_avail, NULL, 0);
  277. static int hmc5843_get_scale_index(struct hmc5843_data *data, int val, int val2)
  278. {
  279. int i;
  280. if (val)
  281. return -EINVAL;
  282. for (i = 0; i < data->variant->n_regval_to_nanoscale; i++)
  283. if (val2 == data->variant->regval_to_nanoscale[i])
  284. return i;
  285. return -EINVAL;
  286. }
  287. static int hmc5843_read_raw(struct iio_dev *indio_dev,
  288. struct iio_chan_spec const *chan,
  289. int *val, int *val2, long mask)
  290. {
  291. struct hmc5843_data *data = iio_priv(indio_dev);
  292. unsigned int rval;
  293. int ret;
  294. switch (mask) {
  295. case IIO_CHAN_INFO_RAW:
  296. return hmc5843_read_measurement(data, chan->scan_index, val);
  297. case IIO_CHAN_INFO_SCALE:
  298. ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_B, &rval);
  299. if (ret < 0)
  300. return ret;
  301. rval >>= HMC5843_RANGE_GAIN_OFFSET;
  302. *val = 0;
  303. *val2 = data->variant->regval_to_nanoscale[rval];
  304. return IIO_VAL_INT_PLUS_NANO;
  305. case IIO_CHAN_INFO_SAMP_FREQ:
  306. ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_A, &rval);
  307. if (ret < 0)
  308. return ret;
  309. rval >>= HMC5843_RATE_OFFSET;
  310. *val = data->variant->regval_to_samp_freq[rval][0];
  311. *val2 = data->variant->regval_to_samp_freq[rval][1];
  312. return IIO_VAL_INT_PLUS_MICRO;
  313. }
  314. return -EINVAL;
  315. }
  316. static int hmc5843_write_raw(struct iio_dev *indio_dev,
  317. struct iio_chan_spec const *chan,
  318. int val, int val2, long mask)
  319. {
  320. struct hmc5843_data *data = iio_priv(indio_dev);
  321. int rate, range;
  322. switch (mask) {
  323. case IIO_CHAN_INFO_SAMP_FREQ:
  324. rate = hmc5843_get_samp_freq_index(data, val, val2);
  325. if (rate < 0)
  326. return -EINVAL;
  327. return hmc5843_set_samp_freq(data, rate);
  328. case IIO_CHAN_INFO_SCALE:
  329. range = hmc5843_get_scale_index(data, val, val2);
  330. if (range < 0)
  331. return -EINVAL;
  332. return hmc5843_set_range_gain(data, range);
  333. default:
  334. return -EINVAL;
  335. }
  336. }
  337. static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev,
  338. struct iio_chan_spec const *chan,
  339. long mask)
  340. {
  341. switch (mask) {
  342. case IIO_CHAN_INFO_SAMP_FREQ:
  343. return IIO_VAL_INT_PLUS_MICRO;
  344. case IIO_CHAN_INFO_SCALE:
  345. return IIO_VAL_INT_PLUS_NANO;
  346. default:
  347. return -EINVAL;
  348. }
  349. }
  350. static irqreturn_t hmc5843_trigger_handler(int irq, void *p)
  351. {
  352. struct iio_poll_func *pf = p;
  353. struct iio_dev *indio_dev = pf->indio_dev;
  354. struct hmc5843_data *data = iio_priv(indio_dev);
  355. int ret;
  356. mutex_lock(&data->lock);
  357. ret = hmc5843_wait_measurement(data);
  358. if (ret < 0) {
  359. mutex_unlock(&data->lock);
  360. goto done;
  361. }
  362. ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS,
  363. data->buffer, 3 * sizeof(__be16));
  364. mutex_unlock(&data->lock);
  365. if (ret < 0)
  366. goto done;
  367. iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
  368. iio_get_time_ns());
  369. done:
  370. iio_trigger_notify_done(indio_dev->trig);
  371. return IRQ_HANDLED;
  372. }
  373. #define HMC5843_CHANNEL(axis, idx) \
  374. { \
  375. .type = IIO_MAGN, \
  376. .modified = 1, \
  377. .channel2 = IIO_MOD_##axis, \
  378. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
  379. .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
  380. BIT(IIO_CHAN_INFO_SAMP_FREQ), \
  381. .scan_index = idx, \
  382. .scan_type = { \
  383. .sign = 's', \
  384. .realbits = 16, \
  385. .storagebits = 16, \
  386. .endianness = IIO_BE, \
  387. }, \
  388. }
  389. static const struct iio_chan_spec hmc5843_channels[] = {
  390. HMC5843_CHANNEL(X, 0),
  391. HMC5843_CHANNEL(Y, 1),
  392. HMC5843_CHANNEL(Z, 2),
  393. IIO_CHAN_SOFT_TIMESTAMP(3),
  394. };
  395. /* Beware: Y and Z are exchanged on HMC5883 and 5983 */
  396. static const struct iio_chan_spec hmc5883_channels[] = {
  397. HMC5843_CHANNEL(X, 0),
  398. HMC5843_CHANNEL(Z, 1),
  399. HMC5843_CHANNEL(Y, 2),
  400. IIO_CHAN_SOFT_TIMESTAMP(3),
  401. };
  402. static struct attribute *hmc5843_attributes[] = {
  403. &iio_dev_attr_meas_conf.dev_attr.attr,
  404. &iio_dev_attr_scale_available.dev_attr.attr,
  405. &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
  406. NULL
  407. };
  408. static const struct attribute_group hmc5843_group = {
  409. .attrs = hmc5843_attributes,
  410. };
  411. static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
  412. [HMC5843_ID] = {
  413. .channels = hmc5843_channels,
  414. .regval_to_samp_freq = hmc5843_regval_to_samp_freq,
  415. .n_regval_to_samp_freq =
  416. ARRAY_SIZE(hmc5843_regval_to_samp_freq),
  417. .regval_to_nanoscale = hmc5843_regval_to_nanoscale,
  418. .n_regval_to_nanoscale =
  419. ARRAY_SIZE(hmc5843_regval_to_nanoscale),
  420. },
  421. [HMC5883_ID] = {
  422. .channels = hmc5883_channels,
  423. .regval_to_samp_freq = hmc5883_regval_to_samp_freq,
  424. .n_regval_to_samp_freq =
  425. ARRAY_SIZE(hmc5883_regval_to_samp_freq),
  426. .regval_to_nanoscale = hmc5883_regval_to_nanoscale,
  427. .n_regval_to_nanoscale =
  428. ARRAY_SIZE(hmc5883_regval_to_nanoscale),
  429. },
  430. [HMC5883L_ID] = {
  431. .channels = hmc5883_channels,
  432. .regval_to_samp_freq = hmc5883_regval_to_samp_freq,
  433. .n_regval_to_samp_freq =
  434. ARRAY_SIZE(hmc5883_regval_to_samp_freq),
  435. .regval_to_nanoscale = hmc5883l_regval_to_nanoscale,
  436. .n_regval_to_nanoscale =
  437. ARRAY_SIZE(hmc5883l_regval_to_nanoscale),
  438. },
  439. [HMC5983_ID] = {
  440. .channels = hmc5883_channels,
  441. .regval_to_samp_freq = hmc5983_regval_to_samp_freq,
  442. .n_regval_to_samp_freq =
  443. ARRAY_SIZE(hmc5983_regval_to_samp_freq),
  444. .regval_to_nanoscale = hmc5883l_regval_to_nanoscale,
  445. .n_regval_to_nanoscale =
  446. ARRAY_SIZE(hmc5883l_regval_to_nanoscale),
  447. }
  448. };
  449. static int hmc5843_init(struct hmc5843_data *data)
  450. {
  451. int ret;
  452. u8 id[3];
  453. ret = regmap_bulk_read(data->regmap, HMC5843_ID_REG,
  454. id, ARRAY_SIZE(id));
  455. if (ret < 0)
  456. return ret;
  457. if (id[0] != 'H' || id[1] != '4' || id[2] != '3') {
  458. dev_err(data->dev, "no HMC5843/5883/5883L/5983 sensor\n");
  459. return -ENODEV;
  460. }
  461. ret = hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
  462. if (ret < 0)
  463. return ret;
  464. ret = hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT);
  465. if (ret < 0)
  466. return ret;
  467. ret = hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT);
  468. if (ret < 0)
  469. return ret;
  470. return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
  471. }
  472. static const struct iio_info hmc5843_info = {
  473. .attrs = &hmc5843_group,
  474. .read_raw = &hmc5843_read_raw,
  475. .write_raw = &hmc5843_write_raw,
  476. .write_raw_get_fmt = &hmc5843_write_raw_get_fmt,
  477. .driver_module = THIS_MODULE,
  478. };
  479. static const unsigned long hmc5843_scan_masks[] = {0x7, 0};
  480. int hmc5843_common_suspend(struct device *dev)
  481. {
  482. return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)),
  483. HMC5843_MODE_CONVERSION_CONTINUOUS);
  484. }
  485. EXPORT_SYMBOL(hmc5843_common_suspend);
  486. int hmc5843_common_resume(struct device *dev)
  487. {
  488. return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)),
  489. HMC5843_MODE_SLEEP);
  490. }
  491. EXPORT_SYMBOL(hmc5843_common_resume);
  492. int hmc5843_common_probe(struct device *dev, struct regmap *regmap,
  493. enum hmc5843_ids id, const char *name)
  494. {
  495. struct hmc5843_data *data;
  496. struct iio_dev *indio_dev;
  497. int ret;
  498. indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
  499. if (!indio_dev)
  500. return -ENOMEM;
  501. dev_set_drvdata(dev, indio_dev);
  502. /* default settings at probe */
  503. data = iio_priv(indio_dev);
  504. data->dev = dev;
  505. data->regmap = regmap;
  506. data->variant = &hmc5843_chip_info_tbl[id];
  507. mutex_init(&data->lock);
  508. indio_dev->dev.parent = dev;
  509. indio_dev->name = name;
  510. indio_dev->info = &hmc5843_info;
  511. indio_dev->modes = INDIO_DIRECT_MODE;
  512. indio_dev->channels = data->variant->channels;
  513. indio_dev->num_channels = 4;
  514. indio_dev->available_scan_masks = hmc5843_scan_masks;
  515. ret = hmc5843_init(data);
  516. if (ret < 0)
  517. return ret;
  518. ret = iio_triggered_buffer_setup(indio_dev, NULL,
  519. hmc5843_trigger_handler, NULL);
  520. if (ret < 0)
  521. goto buffer_setup_err;
  522. ret = iio_device_register(indio_dev);
  523. if (ret < 0)
  524. goto buffer_cleanup;
  525. return 0;
  526. buffer_cleanup:
  527. iio_triggered_buffer_cleanup(indio_dev);
  528. buffer_setup_err:
  529. hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP);
  530. return ret;
  531. }
  532. EXPORT_SYMBOL(hmc5843_common_probe);
  533. int hmc5843_common_remove(struct device *dev)
  534. {
  535. struct iio_dev *indio_dev = dev_get_drvdata(dev);
  536. iio_device_unregister(indio_dev);
  537. iio_triggered_buffer_cleanup(indio_dev);
  538. /* sleep mode to save power */
  539. hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP);
  540. return 0;
  541. }
  542. EXPORT_SYMBOL(hmc5843_common_remove);
  543. MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>");
  544. MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 core driver");
  545. MODULE_LICENSE("GPL");