static void xadc_handle_event(struct iio_dev *indio_dev, unsigned int event) { const struct iio_chan_spec *chan; /* Temperature threshold error, we don't handle this yet */ if (event == 0) return; chan = xadc_event_to_channel(indio_dev, event); if (chan->type == IIO_TEMP) { /* * The temperature channel only supports over-temperature * events. */ iio_push_event(indio_dev, IIO_UNMOD_EVENT_CODE(chan->type, chan->channel, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), iio_get_time_ns(indio_dev)); } else { /* * For other channels we don't know whether it is a upper or * lower threshold event. Userspace will have to check the * channel value if it wants to know. */ iio_push_event(indio_dev, IIO_UNMOD_EVENT_CODE(chan->type, chan->channel, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), iio_get_time_ns(indio_dev)); } }
static int st_lsm6ds3_event_poll(struct lsm6ds3_data *cdata, int sensor) { int err; u8 src_value_reg = 0x00; err = cdata->tf->read(&cdata->tb, cdata->dev, ST_LSM6DS3_SRC_FUNC_REG, 1, &src_value_reg); if (err < 0) return err; cdata->timestamp = st_lsm6ds3_iio_get_boottime_ns(); if (sensor & (1 << ST_INDIO_DEV_SIGN_MOTION)) // STM { if (src_value_reg & ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL) { mutex_lock(&cdata->indio_dev[ST_INDIO_DEV_SIGN_MOTION]->mlock); iio_push_event(cdata->indio_dev[ST_INDIO_DEV_SIGN_MOTION], IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), cdata->timestamp); mutex_unlock(&cdata->indio_dev[ST_INDIO_DEV_SIGN_MOTION]->mlock); } } if (sensor & (1 << ST_INDIO_DEV_STEP_DETECTOR)) { if (src_value_reg & ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL) { mutex_lock(&cdata->indio_dev[ST_INDIO_DEV_STEP_DETECTOR]->mlock); iio_trigger_poll_chained( cdata->trig[ST_INDIO_DEV_STEP_COUNTER], 0); iio_push_event(cdata->indio_dev[ST_INDIO_DEV_STEP_DETECTOR], IIO_UNMOD_EVENT_CODE(IIO_STEP_DETECTOR, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), cdata->timestamp); mutex_unlock(&cdata->indio_dev[ST_INDIO_DEV_STEP_DETECTOR]->mlock); } } if (sensor & (1 << ST_INDIO_DEV_TILT)) { if (src_value_reg & ST_LSM6DS3_SRC_TILT_DATA_AVL) { mutex_lock(&cdata->indio_dev[ST_INDIO_DEV_TILT]->mlock); iio_push_event(cdata->indio_dev[ST_INDIO_DEV_TILT], IIO_UNMOD_EVENT_CODE(IIO_TILT, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), cdata->timestamp); mutex_unlock(&cdata->indio_dev[ST_INDIO_DEV_TILT]->mlock); } } //dev_info(cdata->dev, "%s run...%d\n", __func__, src_value_reg); return 0; }
static irqreturn_t optical_trigger_handler(int irq, void *p) { int len; struct iio_poll_func *pf = p; //struct iio_dev *indio_dev = pf->indio_dev;//VungGV struct iio_dev *indio_dev = pf->private_data; struct optical_data *sdata = iio_priv(indio_dev); //struct optical_data *sdata= indio_dev->dev_data; struct iio_ring_buffer *ring = indio_dev->ring; printk (KERN_ALERT "[%s %d]\n", __FUNCTION__,irq); len = optical_get_buffer_element(indio_dev, sdata->buffer_data); if (len < 0) goto st_sensors_get_buffer_element_error; if (indio_dev->ring->scan_timestamp) //VungGV *(s64 *)((u8 *)sdata->buffer_data + ALIGN(len, sizeof(s64))) = pf->timestamp; #define CONFIG_PUSH_EVENT 1 //VungGV add ev_len=1 #ifdef CONFIG_PUSH_EVENT if ( 0 == strcmp(indio_dev->name, "lt1ph03")) { iio_push_event(indio_dev,1, IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), iio_get_time_ns()); iio_push_event(indio_dev,1, IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), iio_get_time_ns()); } else { goto st_sensors_get_buffer_element_error; } #endif //iio_push_to_buffers(indio_dev, sdata->buffer_data);//VungGV ?? ring->access->store_to(ring, (u8 *)sdata->buffer_data, pf->timestamp); st_sensors_get_buffer_element_error: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static void st_hub_sensor_events_push_event(struct platform_device *pdev, int64_t timestamp) { enum iio_chan_type index; struct iio_dev *indio_dev = platform_get_drvdata(pdev); struct st_hub_pdata_info *info = indio_dev->dev.parent->platform_data; switch (info->index) { case ST_SIGN_MOTION_INDEX: index = IIO_SIGN_MOTION; break; case ST_TAP_TAP_INDEX: index = IIO_TAP_TAP; break; case ST_TILT_INDEX: index = IIO_TILT; break; default: return; } iio_push_event(indio_dev, IIO_UNMOD_EVENT_CODE(index, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), timestamp); return; }
static void st_hub_step_detector_push_event(struct platform_device *pdev, int64_t timestamp) { struct iio_dev *indio_dev = platform_get_drvdata(pdev); iio_push_event(indio_dev, IIO_UNMOD_EVENT_CODE(IIO_STEP_DETECTOR, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), timestamp); }
static irqreturn_t lm3533_als_isr(int irq, void *dev_id) { struct iio_dev *indio_dev = dev_id; struct lm3533_als *als = iio_priv(indio_dev); u8 zone; int ret; /* Clear interrupt by reading the ALS zone register. */ ret = _lm3533_als_get_zone(indio_dev, &zone); if (ret) goto out; atomic_set(&als->zone, zone); iio_push_event(indio_dev, IIO_UNMOD_EVENT_CODE(IIO_LIGHT, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), iio_get_time_ns()); out: return IRQ_HANDLED; }
} switch (IIO_EVENT_CODE_EXTRACT_DIR(event_code)) { case IIO_EV_DIR_FALLING: st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val; break; case IIO_EV_DIR_RISING: st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val; break; } return 0; } static const u64 max1363_event_codes[] = { IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 3, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), };
.type = IIO_INTENSITY, .channel = 1, .channel2 = IIO_MOD_LIGHT_IR, .indexed = true, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), }, }; static irqreturn_t apds9300_interrupt_handler(int irq, void *private) { struct iio_dev *dev_info = private; struct apds9300_data *data = iio_priv(dev_info); iio_push_event(dev_info, IIO_UNMOD_EVENT_CODE(IIO_INTENSITY, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), iio_get_time_ns()); apds9300_clear_intr(data); return IRQ_HANDLED; } static int apds9300_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct apds9300_data *data; struct iio_dev *indio_dev; int ret;