1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for the TI TMAG5273 Low-Power Linear 3D Hall-Effect Sensor
5 * Copyright (C) 2022 WolfVision GmbH
7 * Author: Gerald Loacker <gerald.loacker@wolfvision.net>
10 #include <linux/bitfield.h>
11 #include <linux/bits.h>
12 #include <linux/delay.h>
13 #include <linux/module.h>
14 #include <linux/i2c.h>
15 #include <linux/regmap.h>
16 #include <linux/pm_runtime.h>
18 #include <linux/iio/iio.h>
19 #include <linux/iio/sysfs.h>
21 #define TMAG5273_DEVICE_CONFIG_1 0x00
22 #define TMAG5273_DEVICE_CONFIG_2 0x01
23 #define TMAG5273_SENSOR_CONFIG_1 0x02
24 #define TMAG5273_SENSOR_CONFIG_2 0x03
25 #define TMAG5273_X_THR_CONFIG 0x04
26 #define TMAG5273_Y_THR_CONFIG 0x05
27 #define TMAG5273_Z_THR_CONFIG 0x06
28 #define TMAG5273_T_CONFIG 0x07
29 #define TMAG5273_INT_CONFIG_1 0x08
30 #define TMAG5273_MAG_GAIN_CONFIG 0x09
31 #define TMAG5273_MAG_OFFSET_CONFIG_1 0x0A
32 #define TMAG5273_MAG_OFFSET_CONFIG_2 0x0B
33 #define TMAG5273_I2C_ADDRESS 0x0C
34 #define TMAG5273_DEVICE_ID 0x0D
35 #define TMAG5273_MANUFACTURER_ID_LSB 0x0E
36 #define TMAG5273_MANUFACTURER_ID_MSB 0x0F
37 #define TMAG5273_T_MSB_RESULT 0x10
38 #define TMAG5273_T_LSB_RESULT 0x11
39 #define TMAG5273_X_MSB_RESULT 0x12
40 #define TMAG5273_X_LSB_RESULT 0x13
41 #define TMAG5273_Y_MSB_RESULT 0x14
42 #define TMAG5273_Y_LSB_RESULT 0x15
43 #define TMAG5273_Z_MSB_RESULT 0x16
44 #define TMAG5273_Z_LSB_RESULT 0x17
45 #define TMAG5273_CONV_STATUS 0x18
46 #define TMAG5273_ANGLE_RESULT_MSB 0x19
47 #define TMAG5273_ANGLE_RESULT_LSB 0x1A
48 #define TMAG5273_MAGNITUDE_RESULT 0x1B
49 #define TMAG5273_DEVICE_STATUS 0x1C
50 #define TMAG5273_MAX_REG TMAG5273_DEVICE_STATUS
52 #define TMAG5273_AUTOSLEEP_DELAY_MS 5000
53 #define TMAG5273_MAX_AVERAGE 32
56 * bits in the TMAG5273_MANUFACTURER_ID_LSB / MSB register
57 * 16-bit unique manufacturer ID 0x49 / 0x54 = "TI"
59 #define TMAG5273_MANUFACTURER_ID 0x5449
61 /* bits in the TMAG5273_DEVICE_CONFIG_1 register */
62 #define TMAG5273_AVG_MODE_MASK GENMASK(4, 2)
63 #define TMAG5273_AVG_1_MODE FIELD_PREP(TMAG5273_AVG_MODE_MASK, 0)
64 #define TMAG5273_AVG_2_MODE FIELD_PREP(TMAG5273_AVG_MODE_MASK, 1)
65 #define TMAG5273_AVG_4_MODE FIELD_PREP(TMAG5273_AVG_MODE_MASK, 2)
66 #define TMAG5273_AVG_8_MODE FIELD_PREP(TMAG5273_AVG_MODE_MASK, 3)
67 #define TMAG5273_AVG_16_MODE FIELD_PREP(TMAG5273_AVG_MODE_MASK, 4)
68 #define TMAG5273_AVG_32_MODE FIELD_PREP(TMAG5273_AVG_MODE_MASK, 5)
70 /* bits in the TMAG5273_DEVICE_CONFIG_2 register */
71 #define TMAG5273_OP_MODE_MASK GENMASK(1, 0)
72 #define TMAG5273_OP_MODE_STANDBY FIELD_PREP(TMAG5273_OP_MODE_MASK, 0)
73 #define TMAG5273_OP_MODE_SLEEP FIELD_PREP(TMAG5273_OP_MODE_MASK, 1)
74 #define TMAG5273_OP_MODE_CONT FIELD_PREP(TMAG5273_OP_MODE_MASK, 2)
75 #define TMAG5273_OP_MODE_WAKEUP FIELD_PREP(TMAG5273_OP_MODE_MASK, 3)
77 /* bits in the TMAG5273_SENSOR_CONFIG_1 register */
78 #define TMAG5273_MAG_CH_EN_MASK GENMASK(7, 4)
79 #define TMAG5273_MAG_CH_EN_X_Y_Z 7
81 /* bits in the TMAG5273_SENSOR_CONFIG_2 register */
82 #define TMAG5273_Z_RANGE_MASK BIT(0)
83 #define TMAG5273_X_Y_RANGE_MASK BIT(1)
84 #define TMAG5273_ANGLE_EN_MASK GENMASK(3, 2)
85 #define TMAG5273_ANGLE_EN_OFF 0
86 #define TMAG5273_ANGLE_EN_X_Y 1
87 #define TMAG5273_ANGLE_EN_Y_Z 2
88 #define TMAG5273_ANGLE_EN_X_Z 3
90 /* bits in the TMAG5273_T_CONFIG register */
91 #define TMAG5273_T_CH_EN BIT(0)
93 /* bits in the TMAG5273_DEVICE_ID register */
94 #define TMAG5273_VERSION_MASK GENMASK(1, 0)
96 /* bits in the TMAG5273_CONV_STATUS register */
97 #define TMAG5273_CONV_STATUS_COMPLETE BIT(0)
99 enum tmag5273_channels {
108 enum tmag5273_scale_index {
114 /* state container for the TMAG5273 driver */
115 struct tmag5273_data {
118 unsigned int version;
120 unsigned int conv_avg;
122 enum tmag5273_scale_index scale_index;
123 unsigned int angle_measurement;
125 struct regulator *vcc;
128 * Locks the sensor for exclusive use during a measurement (which
129 * involves several register transactions so the regmap lock is not
130 * enough) so that measurements get serialized in a
131 * first-come-first-serve manner.
136 static const char *const tmag5273_angle_names[] = { "off", "x-y", "y-z", "x-z" };
139 * Averaging enables additional sampling of the sensor data to reduce the noise
140 * effect, but also increases conversion time.
142 static const unsigned int tmag5273_avg_table[] = {
147 * Magnetic resolution in Gauss for different TMAG5273 versions.
148 * Scale[Gauss] = Range[mT] * 1000 / 2^15 * 10, (1 mT = 10 Gauss)
149 * Only version 1 and 2 are valid, version 0 and 3 are reserved.
151 static const struct iio_val_int_plus_micro tmag5273_scale[][MAGN_RANGE_NUM] = {
152 { { 0, 0 }, { 0, 0 } },
153 { { 0, 12200 }, { 0, 24400 } },
154 { { 0, 40600 }, { 0, 81200 } },
155 { { 0, 0 }, { 0, 0 } },
158 static int tmag5273_get_measure(struct tmag5273_data *data, s16 *t, s16 *x,
159 s16 *y, s16 *z, u16 *angle, u16 *magnitude)
161 unsigned int status, val;
165 mutex_lock(&data->lock);
168 * Max. conversion time is 2425 us in 32x averaging mode for all three
169 * channels. Since we are in continuous measurement mode, a measurement
170 * may already be there, so poll for completed measurement with
173 ret = regmap_read_poll_timeout(data->map, TMAG5273_CONV_STATUS, status,
174 status & TMAG5273_CONV_STATUS_COMPLETE,
177 dev_err(data->dev, "timeout waiting for measurement\n");
181 ret = regmap_bulk_read(data->map, TMAG5273_T_MSB_RESULT, reg_data,
185 *t = be16_to_cpu(reg_data[0]);
186 *x = be16_to_cpu(reg_data[1]);
187 *y = be16_to_cpu(reg_data[2]);
188 *z = be16_to_cpu(reg_data[3]);
190 ret = regmap_bulk_read(data->map, TMAG5273_ANGLE_RESULT_MSB,
191 ®_data[0], sizeof(reg_data[0]));
195 * angle has 9 bits integer value and 4 bits fractional part
196 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
197 * 0 0 0 a a a a a a a a a f f f f
199 *angle = be16_to_cpu(reg_data[0]);
201 ret = regmap_read(data->map, TMAG5273_MAGNITUDE_RESULT, &val);
207 mutex_unlock(&data->lock);
211 static int tmag5273_write_osr(struct tmag5273_data *data, int val)
215 if (val == data->conv_avg)
218 for (i = 0; i < ARRAY_SIZE(tmag5273_avg_table); i++) {
219 if (tmag5273_avg_table[i] == val)
222 if (i == ARRAY_SIZE(tmag5273_avg_table))
224 data->conv_avg = val;
226 return regmap_update_bits(data->map, TMAG5273_DEVICE_CONFIG_1,
227 TMAG5273_AVG_MODE_MASK,
228 FIELD_PREP(TMAG5273_AVG_MODE_MASK, i));
231 static int tmag5273_write_scale(struct tmag5273_data *data, int scale_micro)
236 for (i = 0; i < ARRAY_SIZE(tmag5273_scale[0]); i++) {
237 if (tmag5273_scale[data->version][i].micro == scale_micro)
240 if (i == ARRAY_SIZE(tmag5273_scale[0]))
242 data->scale_index = i;
244 if (data->scale_index == MAGN_RANGE_LOW)
247 value = TMAG5273_Z_RANGE_MASK | TMAG5273_X_Y_RANGE_MASK;
249 return regmap_update_bits(data->map, TMAG5273_SENSOR_CONFIG_2,
250 TMAG5273_Z_RANGE_MASK | TMAG5273_X_Y_RANGE_MASK, value);
253 static int tmag5273_read_avail(struct iio_dev *indio_dev,
254 struct iio_chan_spec const *chan,
255 const int **vals, int *type, int *length,
258 struct tmag5273_data *data = iio_priv(indio_dev);
261 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
262 *vals = tmag5273_avg_table;
264 *length = ARRAY_SIZE(tmag5273_avg_table);
265 return IIO_AVAIL_LIST;
266 case IIO_CHAN_INFO_SCALE:
267 switch (chan->type) {
269 *type = IIO_VAL_INT_PLUS_MICRO;
270 *vals = (int *)tmag5273_scale[data->version];
271 *length = ARRAY_SIZE(tmag5273_scale[data->version]) *
273 return IIO_AVAIL_LIST;
282 static int tmag5273_read_raw(struct iio_dev *indio_dev,
283 const struct iio_chan_spec *chan, int *val,
284 int *val2, long mask)
286 struct tmag5273_data *data = iio_priv(indio_dev);
288 u16 angle, magnitude;
292 case IIO_CHAN_INFO_PROCESSED:
293 case IIO_CHAN_INFO_RAW:
294 ret = pm_runtime_resume_and_get(data->dev);
298 ret = tmag5273_get_measure(data, &t, &x, &y, &z, &angle, &magnitude);
302 pm_runtime_mark_last_busy(data->dev);
303 pm_runtime_put_autosuspend(data->dev);
305 switch (chan->address) {
327 case IIO_CHAN_INFO_SCALE:
328 switch (chan->type) {
331 * Convert device specific value to millicelsius.
332 * Resolution from the sensor is 60.1 LSB/celsius and
333 * the reference value at 25 celsius is 17508 LSBs.
337 return IIO_VAL_FRACTIONAL;
339 /* Magnetic resolution in uT */
341 *val2 = tmag5273_scale[data->version]
342 [data->scale_index].micro;
343 return IIO_VAL_INT_PLUS_MICRO;
346 * Angle is in degrees and has four fractional bits,
347 * therefore use 1/16 * pi/180 to convert to radians.
351 return IIO_VAL_FRACTIONAL;
355 case IIO_CHAN_INFO_OFFSET:
356 switch (chan->type) {
363 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
364 *val = data->conv_avg;
372 static int tmag5273_write_raw(struct iio_dev *indio_dev,
373 struct iio_chan_spec const *chan, int val,
376 struct tmag5273_data *data = iio_priv(indio_dev);
379 case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
380 return tmag5273_write_osr(data, val);
381 case IIO_CHAN_INFO_SCALE:
382 switch (chan->type) {
386 return tmag5273_write_scale(data, val2);
395 #define TMAG5273_AXIS_CHANNEL(axis, index) \
399 .channel2 = IIO_MOD_##axis, \
400 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
401 BIT(IIO_CHAN_INFO_SCALE), \
402 .info_mask_shared_by_type_available = \
403 BIT(IIO_CHAN_INFO_SCALE), \
404 .info_mask_shared_by_all = \
405 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \
406 .info_mask_shared_by_all_available = \
407 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \
409 .scan_index = index, \
414 .endianness = IIO_CPU, \
418 static const struct iio_chan_spec tmag5273_channels[] = {
421 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
422 BIT(IIO_CHAN_INFO_SCALE) |
423 BIT(IIO_CHAN_INFO_OFFSET),
424 .address = TEMPERATURE,
425 .scan_index = TEMPERATURE,
430 .endianness = IIO_CPU,
433 TMAG5273_AXIS_CHANNEL(X, AXIS_X),
434 TMAG5273_AXIS_CHANNEL(Y, AXIS_Y),
435 TMAG5273_AXIS_CHANNEL(Z, AXIS_Z),
438 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
439 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
440 .info_mask_shared_by_all =
441 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
442 .info_mask_shared_by_all_available =
443 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
450 .endianness = IIO_CPU,
454 .type = IIO_DISTANCE,
455 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
456 .info_mask_shared_by_all =
457 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
458 .info_mask_shared_by_all_available =
459 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
460 .address = MAGNITUDE,
461 .scan_index = MAGNITUDE,
466 .endianness = IIO_CPU,
469 IIO_CHAN_SOFT_TIMESTAMP(6),
472 static const struct iio_info tmag5273_info = {
473 .read_avail = tmag5273_read_avail,
474 .read_raw = tmag5273_read_raw,
475 .write_raw = tmag5273_write_raw,
478 static bool tmag5273_volatile_reg(struct device *dev, unsigned int reg)
480 return reg >= TMAG5273_T_MSB_RESULT && reg <= TMAG5273_MAGNITUDE_RESULT;
483 static const struct regmap_config tmag5273_regmap_config = {
486 .max_register = TMAG5273_MAX_REG,
487 .volatile_reg = tmag5273_volatile_reg,
490 static int tmag5273_set_operating_mode(struct tmag5273_data *data,
493 return regmap_write(data->map, TMAG5273_DEVICE_CONFIG_2, val);
496 static void tmag5273_read_device_property(struct tmag5273_data *data)
498 struct device *dev = data->dev;
502 data->angle_measurement = TMAG5273_ANGLE_EN_X_Y;
504 ret = device_property_read_string(dev, "ti,angle-measurement", &str);
508 ret = match_string(tmag5273_angle_names,
509 ARRAY_SIZE(tmag5273_angle_names), str);
511 data->angle_measurement = ret;
514 static void tmag5273_wake_up(struct tmag5273_data *data)
518 /* Wake up the chip by sending a dummy I2C command */
519 regmap_read(data->map, TMAG5273_DEVICE_ID, &val);
521 * Time to go to stand-by mode from sleep mode is 50us
522 * typically, during this time no I2C access is possible.
524 usleep_range(80, 200);
527 static int tmag5273_chip_init(struct tmag5273_data *data)
531 ret = regmap_write(data->map, TMAG5273_DEVICE_CONFIG_1,
532 TMAG5273_AVG_32_MODE);
537 ret = regmap_write(data->map, TMAG5273_DEVICE_CONFIG_2,
538 TMAG5273_OP_MODE_CONT);
542 ret = regmap_write(data->map, TMAG5273_SENSOR_CONFIG_1,
543 FIELD_PREP(TMAG5273_MAG_CH_EN_MASK,
544 TMAG5273_MAG_CH_EN_X_Y_Z));
548 ret = regmap_write(data->map, TMAG5273_SENSOR_CONFIG_2,
549 FIELD_PREP(TMAG5273_ANGLE_EN_MASK,
550 data->angle_measurement));
553 data->scale_index = MAGN_RANGE_LOW;
555 return regmap_write(data->map, TMAG5273_T_CONFIG, TMAG5273_T_CH_EN);
558 static int tmag5273_check_device_id(struct tmag5273_data *data)
563 ret = regmap_read(data->map, TMAG5273_DEVICE_ID, &val);
565 return dev_err_probe(data->dev, ret, "failed to power on device\n");
566 data->version = FIELD_PREP(TMAG5273_VERSION_MASK, val);
568 ret = regmap_bulk_read(data->map, TMAG5273_MANUFACTURER_ID_LSB, &devid,
571 return dev_err_probe(data->dev, ret, "failed to read device ID\n");
572 data->devid = le16_to_cpu(devid);
574 switch (data->devid) {
575 case TMAG5273_MANUFACTURER_ID:
577 * The device name matches the orderable part number. 'x' stands
578 * for A, B, C or D devices, which have different I2C addresses.
579 * Versions 1 or 2 (0 and 3 is reserved) stands for different
580 * magnetic strengths.
582 snprintf(data->name, sizeof(data->name), "tmag5273x%1u", data->version);
583 if (data->version < 1 || data->version > 2)
584 dev_warn(data->dev, "Unsupported device %s\n", data->name);
588 * Only print warning in case of unknown device ID to allow
589 * fallback compatible in device tree.
591 dev_warn(data->dev, "Unknown device ID 0x%x\n", data->devid);
596 static void tmag5273_power_down(void *data)
598 tmag5273_set_operating_mode(data, TMAG5273_OP_MODE_SLEEP);
601 static int tmag5273_probe(struct i2c_client *i2c)
603 struct device *dev = &i2c->dev;
604 struct tmag5273_data *data;
605 struct iio_dev *indio_dev;
608 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
612 data = iio_priv(indio_dev);
614 i2c_set_clientdata(i2c, indio_dev);
616 data->map = devm_regmap_init_i2c(i2c, &tmag5273_regmap_config);
617 if (IS_ERR(data->map))
618 return dev_err_probe(dev, PTR_ERR(data->map),
619 "failed to allocate register map\n");
621 mutex_init(&data->lock);
623 ret = devm_regulator_get_enable(dev, "vcc");
625 return dev_err_probe(dev, ret, "failed to enable regulator\n");
627 tmag5273_wake_up(data);
629 ret = tmag5273_check_device_id(data);
633 ret = tmag5273_set_operating_mode(data, TMAG5273_OP_MODE_CONT);
635 return dev_err_probe(dev, ret, "failed to power on device\n");
638 * Register powerdown deferred callback which suspends the chip
639 * after module unloaded.
641 * TMAG5273 should be in SUSPEND mode in the two cases:
642 * 1) When driver is loaded, but we do not have any data or
643 * configuration requests to it (we are solving it using
644 * autosuspend feature).
645 * 2) When driver is unloaded and device is not used (devm action is
646 * used in this case).
648 ret = devm_add_action_or_reset(dev, tmag5273_power_down, data);
650 return dev_err_probe(dev, ret, "failed to add powerdown action\n");
652 ret = pm_runtime_set_active(dev);
656 ret = devm_pm_runtime_enable(dev);
660 pm_runtime_get_noresume(dev);
661 pm_runtime_set_autosuspend_delay(dev, TMAG5273_AUTOSLEEP_DELAY_MS);
662 pm_runtime_use_autosuspend(dev);
664 tmag5273_read_device_property(data);
666 ret = tmag5273_chip_init(data);
668 return dev_err_probe(dev, ret, "failed to init device\n");
670 indio_dev->info = &tmag5273_info;
671 indio_dev->modes = INDIO_DIRECT_MODE;
672 indio_dev->name = data->name;
673 indio_dev->channels = tmag5273_channels;
674 indio_dev->num_channels = ARRAY_SIZE(tmag5273_channels);
676 pm_runtime_mark_last_busy(dev);
677 pm_runtime_put_autosuspend(dev);
679 ret = devm_iio_device_register(dev, indio_dev);
681 return dev_err_probe(dev, ret, "device register failed\n");
686 static int tmag5273_runtime_suspend(struct device *dev)
688 struct iio_dev *indio_dev = dev_get_drvdata(dev);
689 struct tmag5273_data *data = iio_priv(indio_dev);
692 ret = tmag5273_set_operating_mode(data, TMAG5273_OP_MODE_SLEEP);
694 dev_err(dev, "failed to power off device (%pe)\n", ERR_PTR(ret));
699 static int tmag5273_runtime_resume(struct device *dev)
701 struct iio_dev *indio_dev = dev_get_drvdata(dev);
702 struct tmag5273_data *data = iio_priv(indio_dev);
705 tmag5273_wake_up(data);
707 ret = tmag5273_set_operating_mode(data, TMAG5273_OP_MODE_CONT);
709 dev_err(dev, "failed to power on device (%pe)\n", ERR_PTR(ret));
714 static DEFINE_RUNTIME_DEV_PM_OPS(tmag5273_pm_ops,
715 tmag5273_runtime_suspend, tmag5273_runtime_resume,
718 static const struct i2c_device_id tmag5273_id[] = {
722 MODULE_DEVICE_TABLE(i2c, tmag5273_id);
724 static const struct of_device_id tmag5273_of_match[] = {
725 { .compatible = "ti,tmag5273" },
728 MODULE_DEVICE_TABLE(of, tmag5273_of_match);
730 static struct i2c_driver tmag5273_driver = {
733 .of_match_table = tmag5273_of_match,
734 .pm = pm_ptr(&tmag5273_pm_ops),
736 .probe_new = tmag5273_probe,
737 .id_table = tmag5273_id,
739 module_i2c_driver(tmag5273_driver);
741 MODULE_DESCRIPTION("TI TMAG5273 Low-Power Linear 3D Hall-Effect Sensor driver");
742 MODULE_AUTHOR("Gerald Loacker <gerald.loacker@wolfvision.net>");
743 MODULE_LICENSE("GPL");