static irqreturn_t yas_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct yas_state *st = iio_priv(indio_dev); struct iio_buffer *buffer = indio_dev->buffer; size_t datasize = buffer->access->get_bytes_per_datum(buffer); int len = 0, i, j; int32_t *mag; s64 timestamp; mag = (int32_t *) kmalloc(datasize, GFP_KERNEL); if (mag == NULL) goto done; if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)) { j = 0; for (i = 0; i < 3; i++) { if (test_bit(i, indio_dev->active_scan_mask)) { mag[j] = st->compass_data[i]; j++; } } len = j * 4; } timestamp = yas_iio_get_boottime_ns(); *(s64 *)((u8 *)mag + ALIGN(len, sizeof(s64))) = timestamp; iio_push_to_buffer(indio_dev->buffer, (u8 *)mag, 0); kfree(mag); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static int yas_data_rdy_trig_poll(struct iio_dev *indio_dev) { struct yas_state *st = iio_priv(indio_dev); unsigned long flags; spin_lock_irqsave(&st->spin_lock, flags); iio_trigger_poll(st->trig, yas_iio_get_boottime_ns()); spin_unlock_irqrestore(&st->spin_lock, flags); return 0; }
irqreturn_t yas_iio_pollfunc_store_boottime(int irq, void *p) { struct iio_poll_func *pf = p; pf->timestamp = yas_iio_get_boottime_ns(); return IRQ_WAKE_THREAD; }