|
@@ -273,33 +273,13 @@ static void xadc_zynq_unmask_worker(struct work_struct *work)
|
|
schedule_delayed_work(&xadc->zynq_unmask_work,
|
|
schedule_delayed_work(&xadc->zynq_unmask_work,
|
|
msecs_to_jiffies(XADC_ZYNQ_UNMASK_TIMEOUT));
|
|
msecs_to_jiffies(XADC_ZYNQ_UNMASK_TIMEOUT));
|
|
}
|
|
}
|
|
-}
|
|
|
|
-
|
|
|
|
-static irqreturn_t xadc_zynq_threaded_interrupt_handler(int irq, void *devid)
|
|
|
|
-{
|
|
|
|
- struct iio_dev *indio_dev = devid;
|
|
|
|
- struct xadc *xadc = iio_priv(indio_dev);
|
|
|
|
- unsigned int alarm;
|
|
|
|
-
|
|
|
|
- spin_lock_irq(&xadc->lock);
|
|
|
|
- alarm = xadc->zynq_alarm;
|
|
|
|
- xadc->zynq_alarm = 0;
|
|
|
|
- spin_unlock_irq(&xadc->lock);
|
|
|
|
-
|
|
|
|
- xadc_handle_events(indio_dev, xadc_zynq_transform_alarm(alarm));
|
|
|
|
|
|
|
|
- /* unmask the required interrupts in timer. */
|
|
|
|
- schedule_delayed_work(&xadc->zynq_unmask_work,
|
|
|
|
- msecs_to_jiffies(XADC_ZYNQ_UNMASK_TIMEOUT));
|
|
|
|
-
|
|
|
|
- return IRQ_HANDLED;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static irqreturn_t xadc_zynq_interrupt_handler(int irq, void *devid)
|
|
static irqreturn_t xadc_zynq_interrupt_handler(int irq, void *devid)
|
|
{
|
|
{
|
|
struct iio_dev *indio_dev = devid;
|
|
struct iio_dev *indio_dev = devid;
|
|
struct xadc *xadc = iio_priv(indio_dev);
|
|
struct xadc *xadc = iio_priv(indio_dev);
|
|
- irqreturn_t ret = IRQ_HANDLED;
|
|
|
|
uint32_t status;
|
|
uint32_t status;
|
|
|
|
|
|
xadc_read_reg(xadc, XADC_ZYNQ_REG_INTSTS, &status);
|
|
xadc_read_reg(xadc, XADC_ZYNQ_REG_INTSTS, &status);
|
|
@@ -321,18 +301,23 @@ static irqreturn_t xadc_zynq_interrupt_handler(int irq, void *devid)
|
|
|
|
|
|
status &= XADC_ZYNQ_INT_ALARM_MASK;
|
|
status &= XADC_ZYNQ_INT_ALARM_MASK;
|
|
if (status) {
|
|
if (status) {
|
|
- xadc->zynq_alarm |= status;
|
|
|
|
xadc->zynq_masked_alarm |= status;
|
|
xadc->zynq_masked_alarm |= status;
|
|
/*
|
|
/*
|
|
* mask the current event interrupt,
|
|
* mask the current event interrupt,
|
|
* unmask it when the interrupt is no more active.
|
|
* unmask it when the interrupt is no more active.
|
|
*/
|
|
*/
|
|
xadc_zynq_update_intmsk(xadc, 0, 0);
|
|
xadc_zynq_update_intmsk(xadc, 0, 0);
|
|
- ret = IRQ_WAKE_THREAD;
|
|
|
|
|
|
+
|
|
|
|
+ xadc_handle_events(indio_dev,
|
|
|
|
+ xadc_zynq_transform_alarm(status));
|
|
|
|
+
|
|
|
|
+ /* unmask the required interrupts in timer. */
|
|
|
|
+ schedule_delayed_work(&xadc->zynq_unmask_work,
|
|
|
|
+ msecs_to_jiffies(XADC_ZYNQ_UNMASK_TIMEOUT));
|
|
}
|
|
}
|
|
spin_unlock(&xadc->lock);
|
|
spin_unlock(&xadc->lock);
|
|
|
|
|
|
- return ret;
|
|
|
|
|
|
+ return IRQ_HANDLED;
|
|
}
|
|
}
|
|
|
|
|
|
#define XADC_ZYNQ_TCK_RATE_MAX 50000000
|
|
#define XADC_ZYNQ_TCK_RATE_MAX 50000000
|
|
@@ -437,7 +422,6 @@ static const struct xadc_ops xadc_zynq_ops = {
|
|
.setup = xadc_zynq_setup,
|
|
.setup = xadc_zynq_setup,
|
|
.get_dclk_rate = xadc_zynq_get_dclk_rate,
|
|
.get_dclk_rate = xadc_zynq_get_dclk_rate,
|
|
.interrupt_handler = xadc_zynq_interrupt_handler,
|
|
.interrupt_handler = xadc_zynq_interrupt_handler,
|
|
- .threaded_interrupt_handler = xadc_zynq_threaded_interrupt_handler,
|
|
|
|
.update_alarm = xadc_zynq_update_alarm,
|
|
.update_alarm = xadc_zynq_update_alarm,
|
|
};
|
|
};
|
|
|
|
|
|
@@ -1225,9 +1209,8 @@ static int xadc_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
if (ret)
|
|
goto err_free_samplerate_trigger;
|
|
goto err_free_samplerate_trigger;
|
|
|
|
|
|
- ret = request_threaded_irq(irq, xadc->ops->interrupt_handler,
|
|
|
|
- xadc->ops->threaded_interrupt_handler,
|
|
|
|
- 0, dev_name(&pdev->dev), indio_dev);
|
|
|
|
|
|
+ ret = request_irq(irq, xadc->ops->interrupt_handler, 0,
|
|
|
|
+ dev_name(&pdev->dev), indio_dev);
|
|
if (ret)
|
|
if (ret)
|
|
goto err_clk_disable_unprepare;
|
|
goto err_clk_disable_unprepare;
|
|
|
|
|