blob: 5b35a7f08f4f7588803b1255d4c7748a11b6ed84 [file] [log] [blame]
Michael Hennerich69c272c2011-05-18 14:42:03 +01001/*
2 * ADE7758 Poly Phase Multifunction Energy Metering IC driver
3 *
4 * Copyright 2010-2011 Analog Devices Inc.
5 *
6 * Licensed under the GPL-2.
7 */
8
Barry Song8210cfe2010-10-27 21:44:16 -04009#include <linux/interrupt.h>
Barry Song8210cfe2010-10-27 21:44:16 -040010#include <linux/kernel.h>
Barry Song8210cfe2010-10-27 21:44:16 -040011#include <linux/spi/spi.h>
Paul Gortmaker8e336a72011-07-10 13:09:12 -040012#include <linux/export.h>
Barry Song8210cfe2010-10-27 21:44:16 -040013
Jonathan Cameron06458e22012-04-25 15:54:58 +010014#include <linux/iio/iio.h>
15#include <linux/iio/trigger.h>
Barry Song8210cfe2010-10-27 21:44:16 -040016#include "ade7758.h"
17
18/**
19 * ade7758_data_rdy_trig_poll() the event handler for the data rdy trig
20 **/
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010021static irqreturn_t ade7758_data_rdy_trig_poll(int irq, void *private)
Barry Song8210cfe2010-10-27 21:44:16 -040022{
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010023 disable_irq_nosync(irq);
Peter Meerwald398fd222014-12-06 06:46:00 +000024 iio_trigger_poll(private);
Michael Hennerich69c272c2011-05-18 14:42:03 +010025
Barry Song8210cfe2010-10-27 21:44:16 -040026 return IRQ_HANDLED;
27}
28
Barry Song8210cfe2010-10-27 21:44:16 -040029/**
30 * ade7758_data_rdy_trigger_set_state() set datardy interrupt state
31 **/
32static int ade7758_data_rdy_trigger_set_state(struct iio_trigger *trig,
33 bool state)
34{
Lars-Peter Clausen1e9663c2013-03-25 08:58:00 +000035 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
Barry Song8210cfe2010-10-27 21:44:16 -040036
37 dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010038 return ade7758_set_irq(&indio_dev->dev, state);
Barry Song8210cfe2010-10-27 21:44:16 -040039}
40
41/**
42 * ade7758_trig_try_reen() try renabling irq for data rdy trigger
43 * @trig: the datardy trigger
44 **/
45static int ade7758_trig_try_reen(struct iio_trigger *trig)
46{
Lars-Peter Clausen1e9663c2013-03-25 08:58:00 +000047 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
Michael Hennericha3f02372011-05-18 14:42:36 +010048 struct ade7758_state *st = iio_priv(indio_dev);
Michael Hennerich69c272c2011-05-18 14:42:03 +010049
Barry Song8210cfe2010-10-27 21:44:16 -040050 enable_irq(st->us->irq);
51 /* irq reenabled so success! */
52 return 0;
53}
54
Jonathan Camerond29f73d2011-08-12 17:08:38 +010055static const struct iio_trigger_ops ade7758_trigger_ops = {
56 .owner = THIS_MODULE,
57 .set_trigger_state = &ade7758_data_rdy_trigger_set_state,
58 .try_reenable = &ade7758_trig_try_reen,
59};
60
Barry Song8210cfe2010-10-27 21:44:16 -040061int ade7758_probe_trigger(struct iio_dev *indio_dev)
62{
Michael Hennericha3f02372011-05-18 14:42:36 +010063 struct ade7758_state *st = iio_priv(indio_dev);
Barry Song8210cfe2010-10-27 21:44:16 -040064 int ret;
Barry Song8210cfe2010-10-27 21:44:16 -040065
Lars-Peter Clausen7cbb7532012-04-26 13:35:01 +020066 st->trig = iio_trigger_alloc("%s-dev%d",
Jonathan Cameron59c85e82011-05-18 14:42:22 +010067 spi_get_device_id(st->us)->name,
68 indio_dev->id);
Cristina Opriceana45297572015-03-31 13:01:18 +030069 if (!st->trig) {
Michael Hennerich69c272c2011-05-18 14:42:03 +010070 ret = -ENOMEM;
Jonathan Cameron59c85e82011-05-18 14:42:22 +010071 goto error_ret;
Michael Hennerich69c272c2011-05-18 14:42:03 +010072 }
73
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010074 ret = request_irq(st->us->irq,
75 ade7758_data_rdy_trig_poll,
Michael Hennerich69c272c2011-05-18 14:42:03 +010076 IRQF_TRIGGER_LOW,
77 spi_get_device_id(st->us)->name,
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010078 st->trig);
79 if (ret)
80 goto error_free_trig;
81
Barry Song8210cfe2010-10-27 21:44:16 -040082 st->trig->dev.parent = &st->us->dev;
Jonathan Camerond29f73d2011-08-12 17:08:38 +010083 st->trig->ops = &ade7758_trigger_ops;
Lars-Peter Clausen1e9663c2013-03-25 08:58:00 +000084 iio_trigger_set_drvdata(st->trig, indio_dev);
Barry Song8210cfe2010-10-27 21:44:16 -040085 ret = iio_trigger_register(st->trig);
86
87 /* select default trigger */
Srinivas Pandruvada04950812014-08-22 21:48:00 +010088 indio_dev->trig = iio_trigger_get(st->trig);
Barry Song8210cfe2010-10-27 21:44:16 -040089 if (ret)
Michael Hennerich69c272c2011-05-18 14:42:03 +010090 goto error_free_irq;
Barry Song8210cfe2010-10-27 21:44:16 -040091
92 return 0;
93
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010094error_free_irq:
95 free_irq(st->us->irq, st->trig);
Barry Song8210cfe2010-10-27 21:44:16 -040096error_free_trig:
Lars-Peter Clausen7cbb7532012-04-26 13:35:01 +020097 iio_trigger_free(st->trig);
Jonathan Cameron4be6f5d2011-04-18 12:59:06 +010098error_ret:
Barry Song8210cfe2010-10-27 21:44:16 -040099 return ret;
100}
101
102void ade7758_remove_trigger(struct iio_dev *indio_dev)
103{
Michael Hennericha3f02372011-05-18 14:42:36 +0100104 struct ade7758_state *st = iio_priv(indio_dev);
Barry Song8210cfe2010-10-27 21:44:16 -0400105
Michael Hennericha3f02372011-05-18 14:42:36 +0100106 iio_trigger_unregister(st->trig);
107 free_irq(st->us->irq, st->trig);
Lars-Peter Clausen7cbb7532012-04-26 13:35:01 +0200108 iio_trigger_free(st->trig);
Barry Song8210cfe2010-10-27 21:44:16 -0400109}