Commit 69821106 authored by Nuno Sá's avatar Nuno Sá Committed by Jonathan Cameron

iio: imu: adis: Add irq flag variable

There are some ADIS devices that can configure the data ready pin
polarity. Hence, we cannot hardcode our IRQ mask as IRQF_TRIGGER_RISING
since we might want to have it as IRQF_TRIGGER_FALLING.
Signed-off-by: default avatarNuno Sá <nuno.sa@analog.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent fec86c6b
......@@ -34,6 +34,27 @@ static void adis_trigger_setup(struct adis *adis)
iio_trigger_set_drvdata(adis->trig, adis);
}
static int adis_validate_irq_flag(struct adis *adis)
{
/*
* Typically this devices have data ready either on the rising edge or
* on the falling edge of the data ready pin. This checks enforces that
* one of those is set in the drivers... It defaults to
* IRQF_TRIGGER_RISING for backward compatibility wiht devices that
* don't support changing the pin polarity.
*/
if (!adis->irq_flag) {
adis->irq_flag = IRQF_TRIGGER_RISING;
return 0;
} else if (adis->irq_flag != IRQF_TRIGGER_RISING &&
adis->irq_flag != IRQF_TRIGGER_FALLING) {
dev_err(&adis->spi->dev, "Invalid IRQ mask: %08lx\n",
adis->irq_flag);
return -EINVAL;
}
return 0;
}
/**
* adis_probe_trigger() - Sets up trigger for a adis device
* @adis: The adis device
......@@ -54,9 +75,13 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
adis_trigger_setup(adis);
ret = adis_validate_irq_flag(adis);
if (ret)
return ret;
ret = request_irq(adis->spi->irq,
&iio_trigger_generic_data_rdy_poll,
IRQF_TRIGGER_RISING,
adis->irq_flag,
indio_dev->name,
adis->trig);
if (ret)
......@@ -96,9 +121,13 @@ int devm_adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
adis_trigger_setup(adis);
ret = adis_validate_irq_flag(adis);
if (ret)
return ret;
ret = devm_request_irq(&adis->spi->dev, adis->spi->irq,
&iio_trigger_generic_data_rdy_poll,
IRQF_TRIGGER_RISING,
adis->irq_flag,
indio_dev->name,
adis->trig);
if (ret)
......
......@@ -87,6 +87,7 @@ struct adis_data {
* @msg: SPI message object
* @xfer: SPI transfer objects to be used for a @msg
* @current_page: Some ADIS devices have registers, this selects current page
* @irq_flag: IRQ handling flags as passed to request_irq()
* @buffer: Data buffer for information read from the device
* @tx: DMA safe TX buffer for SPI transfers
* @rx: DMA safe RX buffer for SPI transfers
......@@ -113,6 +114,7 @@ struct adis {
struct spi_message msg;
struct spi_transfer *xfer;
unsigned int current_page;
unsigned long irq_flag;
void *buffer;
uint8_t tx[10] ____cacheline_aligned;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment