Re: [PATCH 8/8] iio: position: Add support for Azoteq IQS624/625 angle sensor
On Sun, 20 Oct 2019 23:11:23 -0500 Jeff LaBundy wrote: > This patch adds support for the Azoteq IQS624 and IQS625 angular position > sensors, capable of reporting the angle of a rotating shaft down to 1 and > 10 degrees of accuracy, respectively. > > This patch also introduces a home for linear and angular position sensors. > Unlike resolvers, they are typically contactless and use the Hall effect. Hmm. I wonder if it makes sense to just move the resolvers into this directory and not maintain the distinction. Guess we can do that in the future if we feel like it! :) This one looks good to me. Acked-by: Jonathan Cameron I'm assuming these will all go through mfd and an immutable branch once everyone is happy. Thanks, Jonathan > > Signed-off-by: Jeff LaBundy > --- > drivers/iio/Kconfig | 1 + > drivers/iio/Makefile | 1 + > drivers/iio/position/Kconfig | 19 +++ > drivers/iio/position/Makefile | 7 + > drivers/iio/position/iqs624-pos.c | 302 > ++ > 5 files changed, 330 insertions(+) > create mode 100644 drivers/iio/position/Kconfig > create mode 100644 drivers/iio/position/Makefile > create mode 100644 drivers/iio/position/iqs624-pos.c > > diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig > index 5bd5185..d5c073a 100644 > --- a/drivers/iio/Kconfig > +++ b/drivers/iio/Kconfig > @@ -88,6 +88,7 @@ source "drivers/iio/orientation/Kconfig" > if IIO_TRIGGER > source "drivers/iio/trigger/Kconfig" > endif #IIO_TRIGGER > +source "drivers/iio/position/Kconfig" > source "drivers/iio/potentiometer/Kconfig" > source "drivers/iio/potentiostat/Kconfig" > source "drivers/iio/pressure/Kconfig" > diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile > index bff682a..1712011 100644 > --- a/drivers/iio/Makefile > +++ b/drivers/iio/Makefile > @@ -31,6 +31,7 @@ obj-y += light/ > obj-y += magnetometer/ > obj-y += multiplexer/ > obj-y += orientation/ > +obj-y += position/ > obj-y += potentiometer/ > obj-y += potentiostat/ > obj-y += pressure/ > diff --git a/drivers/iio/position/Kconfig b/drivers/iio/position/Kconfig > new file mode 100644 > index 000..ed9f975 > --- /dev/null > +++ b/drivers/iio/position/Kconfig > @@ -0,0 +1,19 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +# > +# Linear and angular position sensors > +# > +# When adding new entries keep the list in alphabetical order > + > +menu "Linear and angular position sensors" > + > +config IQS624_POS > + tristate "Azoteq IQS624/625 angular position sensor" > + depends on MFD_IQS62X > + help > + Say Y here if you want to build support for the Azoteq IQS624 > + and IQS625 angular position sensors. > + > + To compile this driver as a module, choose M here: the module > + will be called iqs624-pos. > + > +endmenu > diff --git a/drivers/iio/position/Makefile b/drivers/iio/position/Makefile > new file mode 100644 > index 000..3cbe7a7 > --- /dev/null > +++ b/drivers/iio/position/Makefile > @@ -0,0 +1,7 @@ > +# > +# Makefile for IIO linear and angular position sensors > +# > + > +# When adding new entries keep the list in alphabetical order > + > +obj-$(CONFIG_IQS624_POS) += iqs624-pos.o > diff --git a/drivers/iio/position/iqs624-pos.c > b/drivers/iio/position/iqs624-pos.c > new file mode 100644 > index 000..d975065 > --- /dev/null > +++ b/drivers/iio/position/iqs624-pos.c > @@ -0,0 +1,302 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Azoteq IQS624/625 Angular Position Sensor > + * > + * Copyright (C) 2019 > + * Author: Jeff LaBundy > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define IQS624_POS_DEG_OUT 0x16 > + > +#define IQS624_POS_SCALE1(314159 / 180) > +#define IQS624_POS_SCALE210 > + > +struct iqs624_pos_private { > + struct iqs62x_core *iqs62x; > + struct notifier_block notifier; > + struct mutex lock; > + bool event_en; > + union { > + u16 angle; > + u8 interval; > + }; > +}; > + > +static int iqs624_pos_init(struct iqs624_pos_private *iqs624_pos) > +{ > + struct iqs62x_core *iqs62x = iqs624_pos->iqs62x; > + unsigned int val; > + int error; > + __le16 val_buf; > + > + if (iqs62x->dev_desc->prod_num == IQS624_PROD_NUM) { > + error = regmap_raw_read(iqs62x->map, IQS624_POS_DEG_OUT, > + _buf, sizeof(val_buf)); > + if (error) > + return error; > + > + iqs624_pos->angle = le16_to_cpu(val_buf); > + } else { > + error = regmap_read(iqs62x->map, iqs62x->dev_desc->interval, > + ); > + if (error) > + return error; > + > + iqs624_pos->interval = val; > + } > + > +
[PATCH 8/8] iio: position: Add support for Azoteq IQS624/625 angle sensor
This patch adds support for the Azoteq IQS624 and IQS625 angular position sensors, capable of reporting the angle of a rotating shaft down to 1 and 10 degrees of accuracy, respectively. This patch also introduces a home for linear and angular position sensors. Unlike resolvers, they are typically contactless and use the Hall effect. Signed-off-by: Jeff LaBundy --- drivers/iio/Kconfig | 1 + drivers/iio/Makefile | 1 + drivers/iio/position/Kconfig | 19 +++ drivers/iio/position/Makefile | 7 + drivers/iio/position/iqs624-pos.c | 302 ++ 5 files changed, 330 insertions(+) create mode 100644 drivers/iio/position/Kconfig create mode 100644 drivers/iio/position/Makefile create mode 100644 drivers/iio/position/iqs624-pos.c diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig index 5bd5185..d5c073a 100644 --- a/drivers/iio/Kconfig +++ b/drivers/iio/Kconfig @@ -88,6 +88,7 @@ source "drivers/iio/orientation/Kconfig" if IIO_TRIGGER source "drivers/iio/trigger/Kconfig" endif #IIO_TRIGGER +source "drivers/iio/position/Kconfig" source "drivers/iio/potentiometer/Kconfig" source "drivers/iio/potentiostat/Kconfig" source "drivers/iio/pressure/Kconfig" diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile index bff682a..1712011 100644 --- a/drivers/iio/Makefile +++ b/drivers/iio/Makefile @@ -31,6 +31,7 @@ obj-y += light/ obj-y += magnetometer/ obj-y += multiplexer/ obj-y += orientation/ +obj-y += position/ obj-y += potentiometer/ obj-y += potentiostat/ obj-y += pressure/ diff --git a/drivers/iio/position/Kconfig b/drivers/iio/position/Kconfig new file mode 100644 index 000..ed9f975 --- /dev/null +++ b/drivers/iio/position/Kconfig @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Linear and angular position sensors +# +# When adding new entries keep the list in alphabetical order + +menu "Linear and angular position sensors" + +config IQS624_POS + tristate "Azoteq IQS624/625 angular position sensor" + depends on MFD_IQS62X + help + Say Y here if you want to build support for the Azoteq IQS624 + and IQS625 angular position sensors. + + To compile this driver as a module, choose M here: the module + will be called iqs624-pos. + +endmenu diff --git a/drivers/iio/position/Makefile b/drivers/iio/position/Makefile new file mode 100644 index 000..3cbe7a7 --- /dev/null +++ b/drivers/iio/position/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for IIO linear and angular position sensors +# + +# When adding new entries keep the list in alphabetical order + +obj-$(CONFIG_IQS624_POS) += iqs624-pos.o diff --git a/drivers/iio/position/iqs624-pos.c b/drivers/iio/position/iqs624-pos.c new file mode 100644 index 000..d975065 --- /dev/null +++ b/drivers/iio/position/iqs624-pos.c @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Azoteq IQS624/625 Angular Position Sensor + * + * Copyright (C) 2019 + * Author: Jeff LaBundy + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IQS624_POS_DEG_OUT 0x16 + +#define IQS624_POS_SCALE1 (314159 / 180) +#define IQS624_POS_SCALE2 10 + +struct iqs624_pos_private { + struct iqs62x_core *iqs62x; + struct notifier_block notifier; + struct mutex lock; + bool event_en; + union { + u16 angle; + u8 interval; + }; +}; + +static int iqs624_pos_init(struct iqs624_pos_private *iqs624_pos) +{ + struct iqs62x_core *iqs62x = iqs624_pos->iqs62x; + unsigned int val; + int error; + __le16 val_buf; + + if (iqs62x->dev_desc->prod_num == IQS624_PROD_NUM) { + error = regmap_raw_read(iqs62x->map, IQS624_POS_DEG_OUT, + _buf, sizeof(val_buf)); + if (error) + return error; + + iqs624_pos->angle = le16_to_cpu(val_buf); + } else { + error = regmap_read(iqs62x->map, iqs62x->dev_desc->interval, + ); + if (error) + return error; + + iqs624_pos->interval = val; + } + + mutex_lock(_pos->lock); + + /* +* The IQS625 reports angular position in the form of coarse intervals, +* so only interval change events are unmasked. Conversely, the IQS624 +* reports angular position down to one degree of resolution, so wheel +* movement events are unmasked instead. +*/ + error = regmap_update_bits(iqs62x->map, IQS624_HALL_UI, + iqs62x->dev_desc->prod_num == + IQS624_PROD_NUM ? IQS624_HALL_UI_WHL_EVENT : +IQS624_HALL_UI_INT_EVENT, +