/** * iio_simple_dummy_event_handler() - identify and pass on event * @irq: irq of event line * @private: pointer to device instance state. * * This handler is responsible for querying the device to find out what * event occurred and for then pushing that event towards userspace. * Here only one event occurs so we push that directly on with locally * grabbed timestamp. */ static void iio_simple_dummy_event_handler(struct irq_work *work) { struct iio_dummy_state *st = container_of(work, struct iio_dummy_state, work); struct iio_dev *indio_dev = st->regs->src_dev; dev_dbg(&indio_dev->dev, "id %x event %x\n", st->regs->reg_id, st->regs->reg_data); switch (st->regs->reg_data) { case 0: iio_push_event(indio_dev, IIO_EVENT_CODE(IIO_VOLTAGE, 0, 0, IIO_EV_DIR_RISING, IIO_EV_TYPE_THRESH, 0, 0, 0), iio_get_time_ns()); break; case 1: if (st->activity_running > st->event_val) iio_push_event(indio_dev, IIO_EVENT_CODE(IIO_ACTIVITY, 0, IIO_MOD_RUNNING, IIO_EV_DIR_RISING, IIO_EV_TYPE_THRESH, 0, 0, 0), iio_get_time_ns()); break; case 2: if (st->activity_walking < st->event_val) iio_push_event(indio_dev, IIO_EVENT_CODE(IIO_ACTIVITY, 0, IIO_MOD_WALKING, IIO_EV_DIR_FALLING, IIO_EV_TYPE_THRESH, 0, 0, 0), iio_get_time_ns()); break; case 3: iio_push_event(indio_dev, IIO_EVENT_CODE(IIO_STEPS, 0, IIO_NO_MOD, IIO_EV_DIR_NONE, IIO_EV_TYPE_CHANGE, 0, 0, 0), iio_get_time_ns()); break; default: break; } }
/** * iio_simple_dummy_event_handler() - identify and pass on event * @irq: irq of event line * @private: pointer to device instance state. * * This handler is responsible for querying the device to find out what * event occurred and for then pushing that event towards userspace. * Here only one event occurs so we push that directly on with locally * grabbed timestamp. */ static irqreturn_t iio_simple_dummy_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; iio_push_event(indio_dev, IIO_EVENT_CODE(IIO_VOLTAGE, 0, 0, IIO_EV_DIR_RISING, IIO_EV_TYPE_THRESH, 0, 0, 0), iio_get_time_ns()); return IRQ_HANDLED; } /** * iio_simple_dummy_events_register() - setup interrupt handling for events * @indio_dev: device instance data * * This function requests the threaded interrupt to handle the events. * Normally the irq is a hardware interrupt and the number comes * from board configuration files. Here we get it from a companion * module that fakes the interrupt for us. Note that module in * no way forms part of this example. Just assume that events magically * appear via the provided interrupt.