diff options
Diffstat (limited to 'drivers/iio/accel/kxsd9.c')
-rw-r--r-- | drivers/iio/accel/kxsd9.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c index a787ec236608..c065c6e09fa4 100644 --- a/drivers/iio/accel/kxsd9.c +++ b/drivers/iio/accel/kxsd9.c @@ -21,7 +21,7 @@ #include <linux/sysfs.h> #include <linux/slab.h> #include <linux/module.h> - +#include <linux/regmap.h> #include <linux/iio/iio.h> #include <linux/iio/sysfs.h> @@ -46,7 +46,7 @@ * @us: spi device **/ struct kxsd9_state { - struct kxsd9_transport *transport; + struct regmap *map; struct mutex buf_lock; }; @@ -63,6 +63,7 @@ static int kxsd9_write_scale(struct iio_dev *indio_dev, int micro) int ret, i; struct kxsd9_state *st = iio_priv(indio_dev); bool foundit = false; + unsigned int val; for (i = 0; i < 4; i++) if (micro == kxsd9_micro_scales[i]) { @@ -73,13 +74,14 @@ static int kxsd9_write_scale(struct iio_dev *indio_dev, int micro) return -EINVAL; mutex_lock(&st->buf_lock); - ret = st->transport->readreg(st->transport, - KXSD9_REG_CTRL_C); + ret = regmap_read(st->map, + KXSD9_REG_CTRL_C, + &val); if (ret < 0) goto error_ret; - ret = st->transport->writereg(st->transport, - KXSD9_REG_CTRL_C, - (ret & ~KXSD9_FS_MASK) | i); + ret = regmap_write(st->map, + KXSD9_REG_CTRL_C, + (val & ~KXSD9_FS_MASK) | i); error_ret: mutex_unlock(&st->buf_lock); return ret; @@ -89,11 +91,15 @@ static int kxsd9_read(struct iio_dev *indio_dev, u8 address) { int ret; struct kxsd9_state *st = iio_priv(indio_dev); + __be16 raw_val; mutex_lock(&st->buf_lock); - ret = st->transport->readval(st->transport, address); + ret = regmap_bulk_read(st->map, address, &raw_val, sizeof(raw_val)); + if (ret) + goto out_fail_read; /* Only 12 bits are valid */ - ret &= 0xfff0; + ret = be16_to_cpu(raw_val) & 0xfff0; +out_fail_read: mutex_unlock(&st->buf_lock); return ret; } @@ -133,6 +139,7 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev, { int ret = -EINVAL; struct kxsd9_state *st = iio_priv(indio_dev); + unsigned int regval; switch (mask) { case IIO_CHAN_INFO_RAW: @@ -143,12 +150,13 @@ static int kxsd9_read_raw(struct iio_dev *indio_dev, ret = IIO_VAL_INT; break; case IIO_CHAN_INFO_SCALE: - ret = st->transport->readreg(st->transport, - KXSD9_REG_CTRL_C); + ret = regmap_read(st->map, + KXSD9_REG_CTRL_C, + ®val); if (ret < 0) goto error_ret; *val = 0; - *val2 = kxsd9_micro_scales[ret & KXSD9_FS_MASK]; + *val2 = kxsd9_micro_scales[regval & KXSD9_FS_MASK]; ret = IIO_VAL_INT_PLUS_MICRO; break; } @@ -184,10 +192,10 @@ static int kxsd9_power_up(struct kxsd9_state *st) { int ret; - ret = st->transport->writereg(st->transport, KXSD9_REG_CTRL_B, 0x40); + ret = regmap_write(st->map, KXSD9_REG_CTRL_B, 0x40); if (ret) return ret; - return st->transport->writereg(st->transport, KXSD9_REG_CTRL_C, 0x9b); + return regmap_write(st->map, KXSD9_REG_CTRL_C, 0x9b); }; static const struct iio_info kxsd9_info = { @@ -198,7 +206,7 @@ static const struct iio_info kxsd9_info = { }; int kxsd9_common_probe(struct device *parent, - struct kxsd9_transport *transport, + struct regmap *map, const char *name) { struct iio_dev *indio_dev; @@ -210,7 +218,7 @@ int kxsd9_common_probe(struct device *parent, return -ENOMEM; st = iio_priv(indio_dev); - st->transport = transport; + st->map = map; mutex_init(&st->buf_lock); indio_dev->channels = kxsd9_channels; |