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