xref: /openbmc/linux/Documentation/driver-api/iio/triggered-buffers.rst (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
149b2fd6eSJonathan Cameron=================
249b2fd6eSJonathan CameronTriggered Buffers
349b2fd6eSJonathan Cameron=================
449b2fd6eSJonathan Cameron
549b2fd6eSJonathan CameronNow that we know what buffers and triggers are let's see how they work together.
649b2fd6eSJonathan Cameron
749b2fd6eSJonathan CameronIIO triggered buffer setup
849b2fd6eSJonathan Cameron==========================
949b2fd6eSJonathan Cameron
1049b2fd6eSJonathan Cameron* :c:func:`iio_triggered_buffer_setup` — Setup triggered buffer and pollfunc
1149b2fd6eSJonathan Cameron* :c:func:`iio_triggered_buffer_cleanup` — Free resources allocated by
1249b2fd6eSJonathan Cameron  :c:func:`iio_triggered_buffer_setup`
13*9303c9d5SMauro Carvalho Chehab* struct iio_buffer_setup_ops — buffer setup related callbacks
1449b2fd6eSJonathan Cameron
1549b2fd6eSJonathan CameronA typical triggered buffer setup looks like this::
1649b2fd6eSJonathan Cameron
1749b2fd6eSJonathan Cameron    const struct iio_buffer_setup_ops sensor_buffer_setup_ops = {
1849b2fd6eSJonathan Cameron      .preenable    = sensor_buffer_preenable,
1949b2fd6eSJonathan Cameron      .postenable   = sensor_buffer_postenable,
2049b2fd6eSJonathan Cameron      .postdisable  = sensor_buffer_postdisable,
2149b2fd6eSJonathan Cameron      .predisable   = sensor_buffer_predisable,
2249b2fd6eSJonathan Cameron    };
2349b2fd6eSJonathan Cameron
2449b2fd6eSJonathan Cameron    irqreturn_t sensor_iio_pollfunc(int irq, void *p)
2549b2fd6eSJonathan Cameron    {
2649b2fd6eSJonathan Cameron        pf->timestamp = iio_get_time_ns((struct indio_dev *)p);
2749b2fd6eSJonathan Cameron        return IRQ_WAKE_THREAD;
2849b2fd6eSJonathan Cameron    }
2949b2fd6eSJonathan Cameron
3049b2fd6eSJonathan Cameron    irqreturn_t sensor_trigger_handler(int irq, void *p)
3149b2fd6eSJonathan Cameron    {
3249b2fd6eSJonathan Cameron        u16 buf[8];
3349b2fd6eSJonathan Cameron        int i = 0;
3449b2fd6eSJonathan Cameron
3549b2fd6eSJonathan Cameron        /* read data for each active channel */
3649b2fd6eSJonathan Cameron        for_each_set_bit(bit, active_scan_mask, masklength)
3749b2fd6eSJonathan Cameron            buf[i++] = sensor_get_data(bit)
3849b2fd6eSJonathan Cameron
3949b2fd6eSJonathan Cameron        iio_push_to_buffers_with_timestamp(indio_dev, buf, timestamp);
4049b2fd6eSJonathan Cameron
4149b2fd6eSJonathan Cameron        iio_trigger_notify_done(trigger);
4249b2fd6eSJonathan Cameron        return IRQ_HANDLED;
4349b2fd6eSJonathan Cameron    }
4449b2fd6eSJonathan Cameron
4549b2fd6eSJonathan Cameron    /* setup triggered buffer, usually in probe function */
4649b2fd6eSJonathan Cameron    iio_triggered_buffer_setup(indio_dev, sensor_iio_polfunc,
4749b2fd6eSJonathan Cameron                               sensor_trigger_handler,
4849b2fd6eSJonathan Cameron                               sensor_buffer_setup_ops);
4949b2fd6eSJonathan Cameron
5049b2fd6eSJonathan CameronThe important things to notice here are:
5149b2fd6eSJonathan Cameron
5249b2fd6eSJonathan Cameron* :c:type:`iio_buffer_setup_ops`, the buffer setup functions to be called at
5349b2fd6eSJonathan Cameron  predefined points in the buffer configuration sequence (e.g. before enable,
5449b2fd6eSJonathan Cameron  after disable). If not specified, the IIO core uses the default
5549b2fd6eSJonathan Cameron  iio_triggered_buffer_setup_ops.
5649b2fd6eSJonathan Cameron* **sensor_iio_pollfunc**, the function that will be used as top half of poll
5749b2fd6eSJonathan Cameron  function. It should do as little processing as possible, because it runs in
5849b2fd6eSJonathan Cameron  interrupt context. The most common operation is recording of the current
5949b2fd6eSJonathan Cameron  timestamp and for this reason one can use the IIO core defined
6049b2fd6eSJonathan Cameron  :c:func:`iio_pollfunc_store_time` function.
6149b2fd6eSJonathan Cameron* **sensor_trigger_handler**, the function that will be used as bottom half of
6249b2fd6eSJonathan Cameron  the poll function. This runs in the context of a kernel thread and all the
6349b2fd6eSJonathan Cameron  processing takes place here. It usually reads data from the device and
6449b2fd6eSJonathan Cameron  stores it in the internal buffer together with the timestamp recorded in the
6549b2fd6eSJonathan Cameron  top half.
6649b2fd6eSJonathan Cameron
6749b2fd6eSJonathan CameronMore details
6849b2fd6eSJonathan Cameron============
6949b2fd6eSJonathan Cameron.. kernel-doc:: drivers/iio/buffer/industrialio-triggered-buffer.c
70