Re: [PATCH 1/2 V3] iio: adc: ad-sigma-delta: Allow custom IRQ flags

Jonathan Cameron
2020-01-18T11:18:23Z

On Mon, 13 Jan 2020 12:26:52 +0200
Alexandru Tachici <alexandru.tachici@analog.com> wrote:

> Before this patch the ad_sigma_delta implementation hardcoded
> the irq trigger type to low, assuming that all Sigma-Delta ADCs
> have the same interrupt-type.
>
> This patch allows all drivers using the ad_sigma_delta layer to set the
> irq trigger type to the one specified in the datasheet.
>
> Signed-off-by: Alexandru Tachici <alexandru.tachici@analog.com>

Now, as neither of these has a fixes tag, I've taken them in the
togreg branch of iio.git. If you want them backported to stable,
one they are in Linus's tree you can send a specific message to
request they are applied.

Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan

> ---
> drivers/iio/adc/ad7124.c | 2 ++
> drivers/iio/adc/ad7780.c | 1 +
> drivers/iio/adc/ad7791.c | 1 +
> drivers/iio/adc/ad7793.c | 1 +
> drivers/iio/adc/ad_sigma_delta.c | 2 +-
> include/linux/iio/adc/ad_sigma_delta.h | 2 ++
> 6 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c
> index edc6f1cc90b2..9531d8a6cb27 100644
> --- a/drivers/iio/adc/ad7124.c
> +++ b/drivers/iio/adc/ad7124.c
> @@ -9,6 +9,7 @@
> #include <linux/delay.h>
> #include <linux/device.h>
> #include <linux/err.h>
> +#include <linux/interrupt.h>
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/regulator/consumer.h>
> @@ -222,6 +223,7 @@ static const struct ad_sigma_delta_info ad7124_sigma_delta_info = {
> .addr_shift = 0,
> .read_mask = BIT(6),
> .data_reg = AD7124_DATA,
> + .irq_flags = IRQF_TRIGGER_LOW,
> };
>
> static int ad7124_set_channel_odr(struct ad7124_state *st,
> diff --git a/drivers/iio/adc/ad7780.c b/drivers/iio/adc/ad7780.c
> index 217a5a5c3c6d..291c1a898129 100644
> --- a/drivers/iio/adc/ad7780.c
> +++ b/drivers/iio/adc/ad7780.c
> @@ -203,6 +203,7 @@ static const struct ad_sigma_delta_info ad7780_sigma_delta_info = {
> .set_mode = ad7780_set_mode,
> .postprocess_sample = ad7780_postprocess_sample,
> .has_registers = false,
> + .irq_flags = IRQF_TRIGGER_LOW,
> };
>
> #define AD7780_CHANNEL(bits, wordsize) \
> diff --git a/drivers/iio/adc/ad7791.c b/drivers/iio/adc/ad7791.c
> index 54025ea10239..abb239392631 100644
> --- a/drivers/iio/adc/ad7791.c
> +++ b/drivers/iio/adc/ad7791.c
> @@ -205,6 +205,7 @@ static const struct ad_sigma_delta_info ad7791_sigma_delta_info = {
> .has_registers = true,
> .addr_shift = 4,
> .read_mask = BIT(3),
> + .irq_flags = IRQF_TRIGGER_LOW,
> };
>
> static int ad7791_read_raw(struct iio_dev *indio_dev,
> diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c
> index bbc41ecf0d2f..b747db97f78a 100644
> --- a/drivers/iio/adc/ad7793.c
> +++ b/drivers/iio/adc/ad7793.c
> @@ -206,6 +206,7 @@ static const struct ad_sigma_delta_info ad7793_sigma_delta_info = {
> .has_registers = true,
> .addr_shift = 3,
> .read_mask = BIT(6),
> + .irq_flags = IRQF_TRIGGER_LOW,
> };
>
> static const struct ad_sd_calib_data ad7793_calib_arr[6] = {
> diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c
> index 8ba90486c787..8115b6de1d6c 100644
> --- a/drivers/iio/adc/ad_sigma_delta.c
> +++ b/drivers/iio/adc/ad_sigma_delta.c
> @@ -500,7 +500,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
>
> ret = request_irq(sigma_delta->spi->irq,
> ad_sd_data_rdy_trig_poll,
> - IRQF_TRIGGER_LOW,
> + sigma_delta->info->irq_flags,
> indio_dev->name,
> sigma_delta);
> if (ret)
> diff --git a/include/linux/iio/adc/ad_sigma_delta.h b/include/linux/iio/adc/ad_sigma_delta.h
> index 8a4e25a7080c..5a127c0ed200 100644
> --- a/include/linux/iio/adc/ad_sigma_delta.h
> +++ b/include/linux/iio/adc/ad_sigma_delta.h
> @@ -40,6 +40,7 @@ struct iio_dev;
> * @read_mask: Mask for the communications register having the read bit set.
> * @data_reg: Address of the data register, if 0 the default address of 0x3 will
> * be used.
> + * @irq_flags: flags for the interrupt used by the triggered buffer
> */
> struct ad_sigma_delta_info {
> int (*set_channel)(struct ad_sigma_delta *, unsigned int channel);
> @@ -49,6 +50,7 @@ struct ad_sigma_delta_info {
> unsigned int addr_shift;
> unsigned int read_mask;
> unsigned int data_reg;
> + unsigned long irq_flags;
> };
>
> /**