2 * ADE7758 Poly Phase Multifunction Energy Metering IC driver
4 * Copyright 2010-2011 Analog Devices Inc.
6 * Licensed under the GPL-2.
9 #include <linux/interrupt.h>
10 #include <linux/kernel.h>
11 #include <linux/spi/spi.h>
12 #include <linux/export.h>
14 #include <linux/iio/iio.h>
15 #include <linux/iio/trigger.h>
19 * ade7758_data_rdy_trig_poll() the event handler for the data rdy trig
21 static irqreturn_t
ade7758_data_rdy_trig_poll(int irq
, void *private)
23 disable_irq_nosync(irq
);
24 iio_trigger_poll(private, iio_get_time_ns());
30 * ade7758_data_rdy_trigger_set_state() set datardy interrupt state
32 static int ade7758_data_rdy_trigger_set_state(struct iio_trigger
*trig
,
35 struct iio_dev
*indio_dev
= iio_trigger_get_drvdata(trig
);
37 dev_dbg(&indio_dev
->dev
, "%s (%d)\n", __func__
, state
);
38 return ade7758_set_irq(&indio_dev
->dev
, state
);
42 * ade7758_trig_try_reen() try renabling irq for data rdy trigger
43 * @trig: the datardy trigger
45 static int ade7758_trig_try_reen(struct iio_trigger
*trig
)
47 struct iio_dev
*indio_dev
= iio_trigger_get_drvdata(trig
);
48 struct ade7758_state
*st
= iio_priv(indio_dev
);
50 enable_irq(st
->us
->irq
);
51 /* irq reenabled so success! */
55 static const struct iio_trigger_ops ade7758_trigger_ops
= {
57 .set_trigger_state
= &ade7758_data_rdy_trigger_set_state
,
58 .try_reenable
= &ade7758_trig_try_reen
,
61 int ade7758_probe_trigger(struct iio_dev
*indio_dev
)
63 struct ade7758_state
*st
= iio_priv(indio_dev
);
66 st
->trig
= iio_trigger_alloc("%s-dev%d",
67 spi_get_device_id(st
->us
)->name
,
69 if (st
->trig
== NULL
) {
74 ret
= request_irq(st
->us
->irq
,
75 ade7758_data_rdy_trig_poll
,
77 spi_get_device_id(st
->us
)->name
,
82 st
->trig
->dev
.parent
= &st
->us
->dev
;
83 st
->trig
->ops
= &ade7758_trigger_ops
;
84 iio_trigger_set_drvdata(st
->trig
, indio_dev
);
85 ret
= iio_trigger_register(st
->trig
);
87 /* select default trigger */
88 indio_dev
->trig
= st
->trig
;
95 free_irq(st
->us
->irq
, st
->trig
);
97 iio_trigger_free(st
->trig
);
102 void ade7758_remove_trigger(struct iio_dev
*indio_dev
)
104 struct ade7758_state
*st
= iio_priv(indio_dev
);
106 iio_trigger_unregister(st
->trig
);
107 free_irq(st
->us
->irq
, st
->trig
);
108 iio_trigger_free(st
->trig
);