KVM: x86: update KVM_SAVE_MSRS_BEGIN to correct value
[cascardo/linux.git] / drivers / staging / iio / adc / ad7476_ring.c
1 /*
2  * Copyright 2010-2012 Analog Devices Inc.
3  * Copyright (C) 2008 Jonathan Cameron
4  *
5  * Licensed under the GPL-2 or later.
6  *
7  * ad7476_ring.c
8  */
9
10 #include <linux/interrupt.h>
11 #include <linux/device.h>
12 #include <linux/kernel.h>
13 #include <linux/slab.h>
14 #include <linux/spi/spi.h>
15
16 #include <linux/iio/iio.h>
17 #include <linux/iio/buffer.h>
18 #include <linux/iio/kfifo_buf.h>
19 #include <linux/iio/trigger_consumer.h>
20
21 #include "ad7476.h"
22
23 static irqreturn_t ad7476_trigger_handler(int irq, void  *p)
24 {
25         struct iio_poll_func *pf = p;
26         struct iio_dev *indio_dev = pf->indio_dev;
27         struct ad7476_state *st = iio_priv(indio_dev);
28         s64 time_ns;
29         __u8 *rxbuf;
30         int b_sent;
31
32         rxbuf = kzalloc(indio_dev->scan_bytes, GFP_KERNEL);
33         if (rxbuf == NULL)
34                 return -ENOMEM;
35
36         b_sent = spi_read(st->spi, rxbuf,
37                           st->chip_info->channel[0].scan_type.storagebits / 8);
38         if (b_sent < 0)
39                 goto done;
40
41         time_ns = iio_get_time_ns();
42
43         if (indio_dev->scan_timestamp)
44                 memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64),
45                         &time_ns, sizeof(time_ns));
46
47         indio_dev->buffer->access->store_to(indio_dev->buffer, rxbuf, time_ns);
48 done:
49         iio_trigger_notify_done(indio_dev->trig);
50         kfree(rxbuf);
51
52         return IRQ_HANDLED;
53 }
54
55 static const struct iio_buffer_setup_ops ad7476_ring_setup_ops = {
56         .preenable = &iio_sw_buffer_preenable,
57         .postenable = &iio_triggered_buffer_postenable,
58         .predisable = &iio_triggered_buffer_predisable,
59 };
60
61 int ad7476_register_ring_funcs_and_init(struct iio_dev *indio_dev)
62 {
63         struct ad7476_state *st = iio_priv(indio_dev);
64         int ret = 0;
65
66         indio_dev->buffer = iio_kfifo_allocate(indio_dev);
67         if (!indio_dev->buffer) {
68                 ret = -ENOMEM;
69                 goto error_ret;
70         }
71         indio_dev->pollfunc
72                 = iio_alloc_pollfunc(NULL,
73                                      &ad7476_trigger_handler,
74                                      IRQF_ONESHOT,
75                                      indio_dev,
76                                      "%s_consumer%d",
77                                      spi_get_device_id(st->spi)->name,
78                                      indio_dev->id);
79         if (indio_dev->pollfunc == NULL) {
80                 ret = -ENOMEM;
81                 goto error_deallocate_kfifo;
82         }
83
84         /* Ring buffer functions - here trigger setup related */
85         indio_dev->setup_ops = &ad7476_ring_setup_ops;
86         indio_dev->buffer->scan_timestamp = true;
87
88         /* Flag that polled ring buffering is possible */
89         indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
90         return 0;
91
92 error_deallocate_kfifo:
93         iio_kfifo_free(indio_dev->buffer);
94 error_ret:
95         return ret;
96 }
97
98 void ad7476_ring_cleanup(struct iio_dev *indio_dev)
99 {
100         iio_dealloc_pollfunc(indio_dev->pollfunc);
101         iio_kfifo_free(indio_dev->buffer);
102 }