hmc5843_core.c (18217B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Device driver for the the HMC5843 multi-chip module designed 4 * for low field magnetic sensing. 5 * 6 * Copyright (C) 2010 Texas Instruments 7 * 8 * Author: Shubhrajyoti Datta <shubhrajyoti@ti.com> 9 * Acknowledgment: Jonathan Cameron <jic23@kernel.org> for valuable inputs. 10 * Support for HMC5883 and HMC5883L by Peter Meerwald <pmeerw@pmeerw.net>. 11 * Split to multiple files by Josef Gajdusek <atx@atx.name> - 2014 12 */ 13 14#include <linux/module.h> 15#include <linux/regmap.h> 16#include <linux/iio/iio.h> 17#include <linux/iio/sysfs.h> 18#include <linux/iio/trigger_consumer.h> 19#include <linux/iio/buffer.h> 20#include <linux/iio/triggered_buffer.h> 21#include <linux/delay.h> 22 23#include "hmc5843.h" 24 25/* 26 * Range gain settings in (+-)Ga 27 * Beware: HMC5843 and HMC5883 have different recommended sensor field 28 * ranges; default corresponds to +-1.0 Ga and +-1.3 Ga, respectively 29 */ 30#define HMC5843_RANGE_GAIN_OFFSET 0x05 31#define HMC5843_RANGE_GAIN_DEFAULT 0x01 32#define HMC5843_RANGE_GAIN_MASK 0xe0 33 34/* Device status */ 35#define HMC5843_DATA_READY 0x01 36#define HMC5843_DATA_OUTPUT_LOCK 0x02 37 38/* Mode register configuration */ 39#define HMC5843_MODE_CONVERSION_CONTINUOUS 0x00 40#define HMC5843_MODE_CONVERSION_SINGLE 0x01 41#define HMC5843_MODE_IDLE 0x02 42#define HMC5843_MODE_SLEEP 0x03 43#define HMC5843_MODE_MASK 0x03 44 45/* 46 * HMC5843: Minimum data output rate 47 * HMC5883: Typical data output rate 48 */ 49#define HMC5843_RATE_OFFSET 0x02 50#define HMC5843_RATE_DEFAULT 0x04 51#define HMC5843_RATE_MASK 0x1c 52 53/* Device measurement configuration */ 54#define HMC5843_MEAS_CONF_NORMAL 0x00 55#define HMC5843_MEAS_CONF_POSITIVE_BIAS 0x01 56#define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02 57#define HMC5843_MEAS_CONF_MASK 0x03 58 59/* 60 * API for setting the measurement configuration to 61 * Normal, Positive bias and Negative bias 62 * 63 * From the datasheet: 64 * 0 - Normal measurement configuration (default): In normal measurement 65 * configuration the device follows normal measurement flow. Pins BP 66 * and BN are left floating and high impedance. 67 * 68 * 1 - Positive bias configuration: In positive bias configuration, a 69 * positive current is forced across the resistive load on pins BP 70 * and BN. 71 * 72 * 2 - Negative bias configuration. In negative bias configuration, a 73 * negative current is forced across the resistive load on pins BP 74 * and BN. 75 * 76 * 3 - Only available on HMC5983. Magnetic sensor is disabled. 77 * Temperature sensor is enabled. 78 */ 79 80static const char *const hmc5843_meas_conf_modes[] = {"normal", "positivebias", 81 "negativebias"}; 82 83static const char *const hmc5983_meas_conf_modes[] = {"normal", "positivebias", 84 "negativebias", 85 "disabled"}; 86/* Scaling factors: 10000000/Gain */ 87static const int hmc5843_regval_to_nanoscale[] = { 88 6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714 89}; 90 91static const int hmc5883_regval_to_nanoscale[] = { 92 7812, 9766, 13021, 16287, 24096, 27701, 32573, 45662 93}; 94 95static const int hmc5883l_regval_to_nanoscale[] = { 96 7299, 9174, 12195, 15152, 22727, 25641, 30303, 43478 97}; 98 99/* 100 * From the datasheet: 101 * Value | HMC5843 | HMC5883/HMC5883L 102 * | Data output rate (Hz) | Data output rate (Hz) 103 * 0 | 0.5 | 0.75 104 * 1 | 1 | 1.5 105 * 2 | 2 | 3 106 * 3 | 5 | 7.5 107 * 4 | 10 (default) | 15 108 * 5 | 20 | 30 109 * 6 | 50 | 75 110 * 7 | Not used | Not used 111 */ 112static const int hmc5843_regval_to_samp_freq[][2] = { 113 {0, 500000}, {1, 0}, {2, 0}, {5, 0}, {10, 0}, {20, 0}, {50, 0} 114}; 115 116static const int hmc5883_regval_to_samp_freq[][2] = { 117 {0, 750000}, {1, 500000}, {3, 0}, {7, 500000}, {15, 0}, {30, 0}, 118 {75, 0} 119}; 120 121static const int hmc5983_regval_to_samp_freq[][2] = { 122 {0, 750000}, {1, 500000}, {3, 0}, {7, 500000}, {15, 0}, {30, 0}, 123 {75, 0}, {220, 0} 124}; 125 126/* Describe chip variants */ 127struct hmc5843_chip_info { 128 const struct iio_chan_spec *channels; 129 const int (*regval_to_samp_freq)[2]; 130 const int n_regval_to_samp_freq; 131 const int *regval_to_nanoscale; 132 const int n_regval_to_nanoscale; 133}; 134 135/* The lower two bits contain the current conversion mode */ 136static s32 hmc5843_set_mode(struct hmc5843_data *data, u8 operating_mode) 137{ 138 int ret; 139 140 mutex_lock(&data->lock); 141 ret = regmap_update_bits(data->regmap, HMC5843_MODE_REG, 142 HMC5843_MODE_MASK, operating_mode); 143 mutex_unlock(&data->lock); 144 145 return ret; 146} 147 148static int hmc5843_wait_measurement(struct hmc5843_data *data) 149{ 150 int tries = 150; 151 unsigned int val; 152 int ret; 153 154 while (tries-- > 0) { 155 ret = regmap_read(data->regmap, HMC5843_STATUS_REG, &val); 156 if (ret < 0) 157 return ret; 158 if (val & HMC5843_DATA_READY) 159 break; 160 msleep(20); 161 } 162 163 if (tries < 0) { 164 dev_err(data->dev, "data not ready\n"); 165 return -EIO; 166 } 167 168 return 0; 169} 170 171/* Return the measurement value from the specified channel */ 172static int hmc5843_read_measurement(struct hmc5843_data *data, 173 int idx, int *val) 174{ 175 __be16 values[3]; 176 int ret; 177 178 mutex_lock(&data->lock); 179 ret = hmc5843_wait_measurement(data); 180 if (ret < 0) { 181 mutex_unlock(&data->lock); 182 return ret; 183 } 184 ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS, 185 values, sizeof(values)); 186 mutex_unlock(&data->lock); 187 if (ret < 0) 188 return ret; 189 190 *val = sign_extend32(be16_to_cpu(values[idx]), 15); 191 return IIO_VAL_INT; 192} 193 194static int hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf) 195{ 196 int ret; 197 198 mutex_lock(&data->lock); 199 ret = regmap_update_bits(data->regmap, HMC5843_CONFIG_REG_A, 200 HMC5843_MEAS_CONF_MASK, meas_conf); 201 mutex_unlock(&data->lock); 202 203 return ret; 204} 205 206static 207int hmc5843_show_measurement_configuration(struct iio_dev *indio_dev, 208 const struct iio_chan_spec *chan) 209{ 210 struct hmc5843_data *data = iio_priv(indio_dev); 211 unsigned int val; 212 int ret; 213 214 ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_A, &val); 215 if (ret) 216 return ret; 217 218 return val & HMC5843_MEAS_CONF_MASK; 219} 220 221static 222int hmc5843_set_measurement_configuration(struct iio_dev *indio_dev, 223 const struct iio_chan_spec *chan, 224 unsigned int meas_conf) 225{ 226 struct hmc5843_data *data = iio_priv(indio_dev); 227 228 return hmc5843_set_meas_conf(data, meas_conf); 229} 230 231static const struct iio_mount_matrix * 232hmc5843_get_mount_matrix(const struct iio_dev *indio_dev, 233 const struct iio_chan_spec *chan) 234{ 235 struct hmc5843_data *data = iio_priv(indio_dev); 236 237 return &data->orientation; 238} 239 240static const struct iio_enum hmc5843_meas_conf_enum = { 241 .items = hmc5843_meas_conf_modes, 242 .num_items = ARRAY_SIZE(hmc5843_meas_conf_modes), 243 .get = hmc5843_show_measurement_configuration, 244 .set = hmc5843_set_measurement_configuration, 245}; 246 247static const struct iio_chan_spec_ext_info hmc5843_ext_info[] = { 248 IIO_ENUM("meas_conf", IIO_SHARED_BY_TYPE, &hmc5843_meas_conf_enum), 249 IIO_ENUM_AVAILABLE("meas_conf", IIO_SHARED_BY_TYPE, &hmc5843_meas_conf_enum), 250 IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, hmc5843_get_mount_matrix), 251 { } 252}; 253 254static const struct iio_enum hmc5983_meas_conf_enum = { 255 .items = hmc5983_meas_conf_modes, 256 .num_items = ARRAY_SIZE(hmc5983_meas_conf_modes), 257 .get = hmc5843_show_measurement_configuration, 258 .set = hmc5843_set_measurement_configuration, 259}; 260 261static const struct iio_chan_spec_ext_info hmc5983_ext_info[] = { 262 IIO_ENUM("meas_conf", IIO_SHARED_BY_TYPE, &hmc5983_meas_conf_enum), 263 IIO_ENUM_AVAILABLE("meas_conf", IIO_SHARED_BY_TYPE, &hmc5983_meas_conf_enum), 264 IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, hmc5843_get_mount_matrix), 265 { } 266}; 267 268static 269ssize_t hmc5843_show_samp_freq_avail(struct device *dev, 270 struct device_attribute *attr, char *buf) 271{ 272 struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev)); 273 size_t len = 0; 274 int i; 275 276 for (i = 0; i < data->variant->n_regval_to_samp_freq; i++) 277 len += scnprintf(buf + len, PAGE_SIZE - len, 278 "%d.%d ", data->variant->regval_to_samp_freq[i][0], 279 data->variant->regval_to_samp_freq[i][1]); 280 281 /* replace trailing space by newline */ 282 buf[len - 1] = '\n'; 283 284 return len; 285} 286 287static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_samp_freq_avail); 288 289static int hmc5843_set_samp_freq(struct hmc5843_data *data, u8 rate) 290{ 291 int ret; 292 293 mutex_lock(&data->lock); 294 ret = regmap_update_bits(data->regmap, HMC5843_CONFIG_REG_A, 295 HMC5843_RATE_MASK, 296 rate << HMC5843_RATE_OFFSET); 297 mutex_unlock(&data->lock); 298 299 return ret; 300} 301 302static int hmc5843_get_samp_freq_index(struct hmc5843_data *data, 303 int val, int val2) 304{ 305 int i; 306 307 for (i = 0; i < data->variant->n_regval_to_samp_freq; i++) 308 if (val == data->variant->regval_to_samp_freq[i][0] && 309 val2 == data->variant->regval_to_samp_freq[i][1]) 310 return i; 311 312 return -EINVAL; 313} 314 315static int hmc5843_set_range_gain(struct hmc5843_data *data, u8 range) 316{ 317 int ret; 318 319 mutex_lock(&data->lock); 320 ret = regmap_update_bits(data->regmap, HMC5843_CONFIG_REG_B, 321 HMC5843_RANGE_GAIN_MASK, 322 range << HMC5843_RANGE_GAIN_OFFSET); 323 mutex_unlock(&data->lock); 324 325 return ret; 326} 327 328static ssize_t hmc5843_show_scale_avail(struct device *dev, 329 struct device_attribute *attr, 330 char *buf) 331{ 332 struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev)); 333 334 size_t len = 0; 335 int i; 336 337 for (i = 0; i < data->variant->n_regval_to_nanoscale; i++) 338 len += scnprintf(buf + len, PAGE_SIZE - len, 339 "0.%09d ", data->variant->regval_to_nanoscale[i]); 340 341 /* replace trailing space by newline */ 342 buf[len - 1] = '\n'; 343 344 return len; 345} 346 347static IIO_DEVICE_ATTR(scale_available, S_IRUGO, 348 hmc5843_show_scale_avail, NULL, 0); 349 350static int hmc5843_get_scale_index(struct hmc5843_data *data, int val, int val2) 351{ 352 int i; 353 354 if (val) 355 return -EINVAL; 356 357 for (i = 0; i < data->variant->n_regval_to_nanoscale; i++) 358 if (val2 == data->variant->regval_to_nanoscale[i]) 359 return i; 360 361 return -EINVAL; 362} 363 364static int hmc5843_read_raw(struct iio_dev *indio_dev, 365 struct iio_chan_spec const *chan, 366 int *val, int *val2, long mask) 367{ 368 struct hmc5843_data *data = iio_priv(indio_dev); 369 unsigned int rval; 370 int ret; 371 372 switch (mask) { 373 case IIO_CHAN_INFO_RAW: 374 return hmc5843_read_measurement(data, chan->scan_index, val); 375 case IIO_CHAN_INFO_SCALE: 376 ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_B, &rval); 377 if (ret < 0) 378 return ret; 379 rval >>= HMC5843_RANGE_GAIN_OFFSET; 380 *val = 0; 381 *val2 = data->variant->regval_to_nanoscale[rval]; 382 return IIO_VAL_INT_PLUS_NANO; 383 case IIO_CHAN_INFO_SAMP_FREQ: 384 ret = regmap_read(data->regmap, HMC5843_CONFIG_REG_A, &rval); 385 if (ret < 0) 386 return ret; 387 rval >>= HMC5843_RATE_OFFSET; 388 *val = data->variant->regval_to_samp_freq[rval][0]; 389 *val2 = data->variant->regval_to_samp_freq[rval][1]; 390 return IIO_VAL_INT_PLUS_MICRO; 391 } 392 return -EINVAL; 393} 394 395static int hmc5843_write_raw(struct iio_dev *indio_dev, 396 struct iio_chan_spec const *chan, 397 int val, int val2, long mask) 398{ 399 struct hmc5843_data *data = iio_priv(indio_dev); 400 int rate, range; 401 402 switch (mask) { 403 case IIO_CHAN_INFO_SAMP_FREQ: 404 rate = hmc5843_get_samp_freq_index(data, val, val2); 405 if (rate < 0) 406 return -EINVAL; 407 408 return hmc5843_set_samp_freq(data, rate); 409 case IIO_CHAN_INFO_SCALE: 410 range = hmc5843_get_scale_index(data, val, val2); 411 if (range < 0) 412 return -EINVAL; 413 414 return hmc5843_set_range_gain(data, range); 415 default: 416 return -EINVAL; 417 } 418} 419 420static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev, 421 struct iio_chan_spec const *chan, 422 long mask) 423{ 424 switch (mask) { 425 case IIO_CHAN_INFO_SAMP_FREQ: 426 return IIO_VAL_INT_PLUS_MICRO; 427 case IIO_CHAN_INFO_SCALE: 428 return IIO_VAL_INT_PLUS_NANO; 429 default: 430 return -EINVAL; 431 } 432} 433 434static irqreturn_t hmc5843_trigger_handler(int irq, void *p) 435{ 436 struct iio_poll_func *pf = p; 437 struct iio_dev *indio_dev = pf->indio_dev; 438 struct hmc5843_data *data = iio_priv(indio_dev); 439 int ret; 440 441 mutex_lock(&data->lock); 442 ret = hmc5843_wait_measurement(data); 443 if (ret < 0) { 444 mutex_unlock(&data->lock); 445 goto done; 446 } 447 448 ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS, 449 data->scan.chans, sizeof(data->scan.chans)); 450 451 mutex_unlock(&data->lock); 452 if (ret < 0) 453 goto done; 454 455 iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, 456 iio_get_time_ns(indio_dev)); 457 458done: 459 iio_trigger_notify_done(indio_dev->trig); 460 461 return IRQ_HANDLED; 462} 463 464#define HMC5843_CHANNEL(axis, idx) \ 465 { \ 466 .type = IIO_MAGN, \ 467 .modified = 1, \ 468 .channel2 = IIO_MOD_##axis, \ 469 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 470 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ 471 BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 472 .scan_index = idx, \ 473 .scan_type = { \ 474 .sign = 's', \ 475 .realbits = 16, \ 476 .storagebits = 16, \ 477 .endianness = IIO_BE, \ 478 }, \ 479 .ext_info = hmc5843_ext_info, \ 480 } 481 482#define HMC5983_CHANNEL(axis, idx) \ 483 { \ 484 .type = IIO_MAGN, \ 485 .modified = 1, \ 486 .channel2 = IIO_MOD_##axis, \ 487 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 488 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ 489 BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 490 .scan_index = idx, \ 491 .scan_type = { \ 492 .sign = 's', \ 493 .realbits = 16, \ 494 .storagebits = 16, \ 495 .endianness = IIO_BE, \ 496 }, \ 497 .ext_info = hmc5983_ext_info, \ 498 } 499 500static const struct iio_chan_spec hmc5843_channels[] = { 501 HMC5843_CHANNEL(X, 0), 502 HMC5843_CHANNEL(Y, 1), 503 HMC5843_CHANNEL(Z, 2), 504 IIO_CHAN_SOFT_TIMESTAMP(3), 505}; 506 507/* Beware: Y and Z are exchanged on HMC5883 and 5983 */ 508static const struct iio_chan_spec hmc5883_channels[] = { 509 HMC5843_CHANNEL(X, 0), 510 HMC5843_CHANNEL(Z, 1), 511 HMC5843_CHANNEL(Y, 2), 512 IIO_CHAN_SOFT_TIMESTAMP(3), 513}; 514 515static const struct iio_chan_spec hmc5983_channels[] = { 516 HMC5983_CHANNEL(X, 0), 517 HMC5983_CHANNEL(Z, 1), 518 HMC5983_CHANNEL(Y, 2), 519 IIO_CHAN_SOFT_TIMESTAMP(3), 520}; 521 522static struct attribute *hmc5843_attributes[] = { 523 &iio_dev_attr_scale_available.dev_attr.attr, 524 &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 525 NULL 526}; 527 528static const struct attribute_group hmc5843_group = { 529 .attrs = hmc5843_attributes, 530}; 531 532static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = { 533 [HMC5843_ID] = { 534 .channels = hmc5843_channels, 535 .regval_to_samp_freq = hmc5843_regval_to_samp_freq, 536 .n_regval_to_samp_freq = 537 ARRAY_SIZE(hmc5843_regval_to_samp_freq), 538 .regval_to_nanoscale = hmc5843_regval_to_nanoscale, 539 .n_regval_to_nanoscale = 540 ARRAY_SIZE(hmc5843_regval_to_nanoscale), 541 }, 542 [HMC5883_ID] = { 543 .channels = hmc5883_channels, 544 .regval_to_samp_freq = hmc5883_regval_to_samp_freq, 545 .n_regval_to_samp_freq = 546 ARRAY_SIZE(hmc5883_regval_to_samp_freq), 547 .regval_to_nanoscale = hmc5883_regval_to_nanoscale, 548 .n_regval_to_nanoscale = 549 ARRAY_SIZE(hmc5883_regval_to_nanoscale), 550 }, 551 [HMC5883L_ID] = { 552 .channels = hmc5883_channels, 553 .regval_to_samp_freq = hmc5883_regval_to_samp_freq, 554 .n_regval_to_samp_freq = 555 ARRAY_SIZE(hmc5883_regval_to_samp_freq), 556 .regval_to_nanoscale = hmc5883l_regval_to_nanoscale, 557 .n_regval_to_nanoscale = 558 ARRAY_SIZE(hmc5883l_regval_to_nanoscale), 559 }, 560 [HMC5983_ID] = { 561 .channels = hmc5983_channels, 562 .regval_to_samp_freq = hmc5983_regval_to_samp_freq, 563 .n_regval_to_samp_freq = 564 ARRAY_SIZE(hmc5983_regval_to_samp_freq), 565 .regval_to_nanoscale = hmc5883l_regval_to_nanoscale, 566 .n_regval_to_nanoscale = 567 ARRAY_SIZE(hmc5883l_regval_to_nanoscale), 568 } 569}; 570 571static int hmc5843_init(struct hmc5843_data *data) 572{ 573 int ret; 574 u8 id[3]; 575 576 ret = regmap_bulk_read(data->regmap, HMC5843_ID_REG, 577 id, ARRAY_SIZE(id)); 578 if (ret < 0) 579 return ret; 580 if (id[0] != 'H' || id[1] != '4' || id[2] != '3') { 581 dev_err(data->dev, "no HMC5843/5883/5883L/5983 sensor\n"); 582 return -ENODEV; 583 } 584 585 ret = hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL); 586 if (ret < 0) 587 return ret; 588 ret = hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT); 589 if (ret < 0) 590 return ret; 591 ret = hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT); 592 if (ret < 0) 593 return ret; 594 return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS); 595} 596 597static const struct iio_info hmc5843_info = { 598 .attrs = &hmc5843_group, 599 .read_raw = &hmc5843_read_raw, 600 .write_raw = &hmc5843_write_raw, 601 .write_raw_get_fmt = &hmc5843_write_raw_get_fmt, 602}; 603 604static const unsigned long hmc5843_scan_masks[] = {0x7, 0}; 605 606int hmc5843_common_suspend(struct device *dev) 607{ 608 return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)), 609 HMC5843_MODE_SLEEP); 610} 611EXPORT_SYMBOL_NS(hmc5843_common_suspend, IIO_HMC5843); 612 613int hmc5843_common_resume(struct device *dev) 614{ 615 return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)), 616 HMC5843_MODE_CONVERSION_CONTINUOUS); 617} 618EXPORT_SYMBOL_NS(hmc5843_common_resume, IIO_HMC5843); 619 620int hmc5843_common_probe(struct device *dev, struct regmap *regmap, 621 enum hmc5843_ids id, const char *name) 622{ 623 struct hmc5843_data *data; 624 struct iio_dev *indio_dev; 625 int ret; 626 627 indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); 628 if (!indio_dev) 629 return -ENOMEM; 630 631 dev_set_drvdata(dev, indio_dev); 632 633 /* default settings at probe */ 634 data = iio_priv(indio_dev); 635 data->dev = dev; 636 data->regmap = regmap; 637 data->variant = &hmc5843_chip_info_tbl[id]; 638 mutex_init(&data->lock); 639 640 ret = iio_read_mount_matrix(dev, &data->orientation); 641 if (ret) 642 return ret; 643 644 indio_dev->name = name; 645 indio_dev->info = &hmc5843_info; 646 indio_dev->modes = INDIO_DIRECT_MODE; 647 indio_dev->channels = data->variant->channels; 648 indio_dev->num_channels = 4; 649 indio_dev->available_scan_masks = hmc5843_scan_masks; 650 651 ret = hmc5843_init(data); 652 if (ret < 0) 653 return ret; 654 655 ret = iio_triggered_buffer_setup(indio_dev, NULL, 656 hmc5843_trigger_handler, NULL); 657 if (ret < 0) 658 goto buffer_setup_err; 659 660 ret = iio_device_register(indio_dev); 661 if (ret < 0) 662 goto buffer_cleanup; 663 664 return 0; 665 666buffer_cleanup: 667 iio_triggered_buffer_cleanup(indio_dev); 668buffer_setup_err: 669 hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP); 670 return ret; 671} 672EXPORT_SYMBOL_NS(hmc5843_common_probe, IIO_HMC5843); 673 674void hmc5843_common_remove(struct device *dev) 675{ 676 struct iio_dev *indio_dev = dev_get_drvdata(dev); 677 678 iio_device_unregister(indio_dev); 679 iio_triggered_buffer_cleanup(indio_dev); 680 681 /* sleep mode to save power */ 682 hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP); 683} 684EXPORT_SYMBOL_NS(hmc5843_common_remove, IIO_HMC5843); 685 686MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>"); 687MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 core driver"); 688MODULE_LICENSE("GPL");