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 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 mma8452_transient_interrupt(struct iio_dev *indio_dev) { struct mma8452_data *data = iio_priv(indio_dev); s64 ts = iio_get_time_ns(); int src; src = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_SRC); if (src < 0) return; if (src & MMA8452_TRANSIENT_SRC_XTRANSE) iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X, IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING), ts); if (src & MMA8452_TRANSIENT_SRC_YTRANSE) iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y, IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING), ts); if (src & MMA8452_TRANSIENT_SRC_ZTRANSE) iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z, IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING), ts); }
static irqreturn_t mma7455_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct mma7455_data *mma7455 = iio_priv(indio_dev); u8 buf[16]; /* 3 x 16-bit channels + padding + ts */ int ret; ret = mma7455_drdy(mma7455); if (ret) goto done; ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL, buf, sizeof(__le16) * 3); if (ret) goto done; iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns(indio_dev)); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
/** * ad7476_poll_bh_to_ring() bh of trigger launched polling to ring buffer * @work_s: the work struct through which this was scheduled * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. * I think the one copy of this at a time was to avoid problems if the * trigger was set far too high and the reads then locked up the computer. **/ static void ad7476_poll_bh_to_ring(struct work_struct *work_s) { struct ad7476_state *st = container_of(work_s, struct ad7476_state, poll_work); struct iio_dev *indio_dev = st->indio_dev; struct iio_sw_ring_buffer *sw_ring = iio_to_sw_ring(indio_dev->ring); s64 time_ns; __u8 *rxbuf; int b_sent; /* Ensure only one copy of this function running at a time */ if (atomic_inc_return(&st->protect_ring) > 1) return; rxbuf = kzalloc(st->d_size, GFP_KERNEL); if (rxbuf == NULL) return; b_sent = spi_read(st->spi, rxbuf, st->chip_info->storagebits / 8); if (b_sent < 0) goto done; time_ns = iio_get_time_ns(); if (indio_dev->ring->scan_timestamp) memcpy(rxbuf + st->d_size - sizeof(s64), &time_ns, sizeof(time_ns)); indio_dev->ring->access.store_to(&sw_ring->buf, rxbuf, time_ns); done: kfree(rxbuf); atomic_dec(&st->protect_ring); }
/** * ad7887_trigger_handler() bh of trigger launched polling to ring buffer * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. **/ static irqreturn_t ad7887_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; struct ad7887_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; s64 time_ns; __u8 *buf; int b_sent; unsigned int bytes = ring->scan_count * st->chip_info->channel[0].scan_type.storagebits / 8; buf = kzalloc(st->d_size, GFP_KERNEL); if (buf == NULL) return -ENOMEM; b_sent = spi_sync(st->spi, st->ring_msg); if (b_sent) goto done; time_ns = iio_get_time_ns(); memcpy(buf, st->data, bytes); if (ring->scan_timestamp) memcpy(buf + st->d_size - sizeof(s64), &time_ns, sizeof(time_ns)); indio_dev->ring->access->store_to(indio_dev->ring, buf, time_ns); done: kfree(buf); iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static irqreturn_t hmc5843_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct hmc5843_data *data = iio_priv(indio_dev); int ret; mutex_lock(&data->lock); ret = hmc5843_wait_measurement(data); if (ret < 0) { mutex_unlock(&data->lock); goto done; } ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS, data->buffer, 3 * sizeof(__be16)); mutex_unlock(&data->lock); if (ret < 0) goto done; iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, iio_get_time_ns(indio_dev)); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static irqreturn_t adc1x8s102_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev; struct adc1x8s102_state *st; s64 time_ns = 0; int b_sent; indio_dev = pf->indio_dev; st = iio_priv(indio_dev); b_sent = spi_sync(st->spi, &st->ring_msg); if (b_sent) goto done; if (indio_dev->scan_timestamp) { time_ns = iio_get_time_ns(); memcpy((u8 *)st->rx_buf + st->ring_xfer.len, &time_ns, sizeof(time_ns)); } /* Skip the dummy response in the first slot */ iio_push_to_buffers(indio_dev, (u8 *)&st->rx_buf[1]); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static irqreturn_t ad7298_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ad7298_state *st = iio_priv(indio_dev); struct iio_buffer *ring = indio_dev->buffer; s64 time_ns; __u16 buf[16]; int b_sent, i; b_sent = spi_sync(st->spi, &st->ring_msg); if (b_sent) return b_sent; if (ring->scan_timestamp) { time_ns = iio_get_time_ns(); memcpy((u8 *)buf + st->d_size - sizeof(s64), &time_ns, sizeof(time_ns)); } for (i = 0; i < bitmap_weight(indio_dev->active_scan_mask, indio_dev->masklength); i++) buf[i] = be16_to_cpu(st->rx_buf[i]); indio_dev->buffer->access->store_to(ring, (u8 *)buf, time_ns); iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static irqreturn_t mag3110_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct mag3110_data *data = iio_priv(indio_dev); u8 buffer[16]; /* 3 16-bit channels + 1 byte temp + padding + ts */ int ret; ret = mag3110_read(data, (__be16 *) buffer); if (ret < 0) goto done; if (test_bit(3, indio_dev->active_scan_mask)) { ret = i2c_smbus_read_byte_data(data->client, MAG3110_DIE_TEMP); if (ret < 0) goto done; buffer[6] = ret; } iio_push_to_buffers_with_timestamp(indio_dev, buffer, iio_get_time_ns()); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
/** * ad7298_trigger_handler() bh of trigger launched polling to ring buffer * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. **/ static irqreturn_t ad7298_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ad7298_state *st = iio_priv(indio_dev); s64 time_ns = 0; int b_sent; b_sent = spi_sync(st->spi, &st->ring_msg); if (b_sent) goto done; if (indio_dev->scan_timestamp) { time_ns = iio_get_time_ns(); memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64), &time_ns, sizeof(time_ns)); } iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
/** * cros_ec_accel_legacy_capture() - The trigger handler function * @irq: The interrupt number. * @p: Private data - always a pointer to the poll func. * * On a trigger event occurring, if the pollfunc is attached then this * handler is called as a threaded interrupt (and hence may sleep). It * is responsible for grabbing data from the device and pushing it into * the associated buffer. * * Return: IRQ_HANDLED */ static irqreturn_t cros_ec_accel_legacy_capture(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct cros_ec_accel_legacy_state *st = iio_priv(indio_dev); /* Clear capture data. */ memset(st->capture_data, 0, sizeof(st->capture_data)); /* * Read data based on which channels are enabled in scan mask. Note * that on a capture we are always reading the calibrated data. */ read_ec_accel_data(st, *indio_dev->active_scan_mask, st->capture_data); iio_push_to_buffers_with_timestamp(indio_dev, (void *)st->capture_data, iio_get_time_ns(indio_dev)); /* * Tell the core we are done with this trigger and ready for the * next one. */ iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static void mma8452_transient_interrupt(struct iio_dev *indio_dev) { struct mma8452_data *data = iio_priv(indio_dev); s64 ts = iio_get_time_ns(); int src; src = i2c_smbus_read_byte_data(data->client, data->chip_info->ev_src); if (src < 0) return; if (src & data->chip_info->ev_src_xe) iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X, IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING), ts); if (src & data->chip_info->ev_src_ye) iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y, IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING), ts); if (src & data->chip_info->ev_src_ze) iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z, IIO_EV_TYPE_MAG, IIO_EV_DIR_RISING), ts); }
static irqreturn_t ad7476_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ad7476_state *st = iio_priv(indio_dev); s64 time_ns; __u8 *rxbuf; int b_sent; rxbuf = kzalloc(st->d_size, GFP_KERNEL); if (rxbuf == NULL) return -ENOMEM; b_sent = spi_read(st->spi, rxbuf, st->chip_info->channel[0].scan_type.storagebits / 8); if (b_sent < 0) goto done; time_ns = iio_get_time_ns(); if (indio_dev->buffer->scan_timestamp) memcpy(rxbuf + st->d_size - sizeof(s64), &time_ns, sizeof(time_ns)); indio_dev->buffer->access->store_to(indio_dev->buffer, rxbuf, time_ns); done: iio_trigger_notify_done(indio_dev->trig); kfree(rxbuf); return IRQ_HANDLED; }
/** * 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_trigger_h() - the trigger handler function * @irq: the interrupt number * @p: private data - always a pointer to the poll func. * * This is the guts of buffered capture. On a trigger event occurring, * if the pollfunc is attached then this handler is called as a threaded * interrupt (and hence may sleep). It is responsible for grabbing data * from the device and pushing it into the associated buffer. */ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct iio_buffer *buffer = indio_dev->buffer; int len = 0; u16 *data; data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); if (data == NULL) return -ENOMEM; if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)) { /* * Three common options here: * hardware scans: certain combinations of channels make * up a fast read. The capture will consist of all of them. * Hence we just call the grab data function and fill the * buffer without processing. * software scans: can be considered to be random access * so efficient reading is just a case of minimal bus * transactions. * software culled hardware scans: * occasionally a driver may process the nearest hardware * scan to avoid storing elements that are not desired. This * is the fidliest option by far. * Here lets pretend we have random access. And the values are * in the constant table fakedata. */ int i, j; for (i = 0, j = 0; i < bitmap_weight(indio_dev->active_scan_mask, indio_dev->masklength); i++) { j = find_next_bit(buffer->scan_mask, indio_dev->masklength, j + 1); /* random access read form the 'device' */ data[i] = fakedata[j]; len += 2; } } /* Store a timestampe at an 8 byte boundary */ if (indio_dev->scan_timestamp) *(s64 *)(((phys_addr_t)data + len + sizeof(s64) - 1) & ~(sizeof(s64) - 1)) = iio_get_time_ns(); buffer->access->store_to(buffer, (u8 *)data, pf->timestamp); kfree(data); /* * Tell the core we are done with this trigger and ready for the * next one. */ iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static irqreturn_t ad799x_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ad799x_state *st = iio_priv(indio_dev); struct iio_buffer *ring = indio_dev->buffer; s64 time_ns; __u8 *rxbuf; int b_sent; u8 cmd; rxbuf = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); if (rxbuf == NULL) goto out; switch (st->id) { case ad7991: case ad7995: case ad7999: cmd = st->config | (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT); break; case ad7992: case ad7993: case ad7994: cmd = (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT) | AD7998_CONV_RES_REG; break; case ad7997: case ad7998: cmd = AD7997_8_READ_SEQUENCE | AD7998_CONV_RES_REG; break; default: cmd = 0; } b_sent = i2c_smbus_read_i2c_block_data(st->client, cmd, bitmap_weight(indio_dev->active_scan_mask, indio_dev->masklength) * 2, rxbuf); if (b_sent < 0) goto done; time_ns = iio_get_time_ns(); if (indio_dev->scan_timestamp) memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64), &time_ns, sizeof(time_ns)); ring->access->store_to(indio_dev->buffer, rxbuf, time_ns); done: kfree(rxbuf); if (b_sent < 0) return b_sent; out: 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, iio_get_time_ns()); spin_unlock_irqrestore(&st->spin_lock, flags); return 0; }
/** * inv_irq_handler() - Cache a timestamp at each data ready interrupt. */ static irqreturn_t inv_ami_irq_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct inv_ami306_state_s *st = iio_priv(indio_dev); st->timestamp = iio_get_time_ns(); return IRQ_WAKE_THREAD; }
/** * ad799x_poll_bh_to_ring() bh of trigger launched polling to ring buffer * @work_s: the work struct through which this was scheduled * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. * I think the one copy of this at a time was to avoid problems if the * trigger was set far too high and the reads then locked up the computer. **/ static void ad799x_poll_bh_to_ring(struct work_struct *work_s) { struct ad799x_state *st = container_of(work_s, struct ad799x_state, poll_work); struct iio_dev *indio_dev = st->indio_dev; struct iio_ring_buffer *ring = indio_dev->ring; struct iio_sw_ring_buffer *ring_sw = iio_to_sw_ring(indio_dev->ring); s64 time_ns; __u8 *rxbuf; int b_sent; u8 cmd; /* Ensure only one copy of this function running at a time */ if (atomic_inc_return(&st->protect_ring) > 1) return; rxbuf = kmalloc(st->d_size, GFP_KERNEL); if (rxbuf == NULL) return; switch (st->id) { case ad7991: case ad7995: case ad7999: cmd = st->config | (ring->scan_mask << AD799X_CHANNEL_SHIFT); break; case ad7992: case ad7993: case ad7994: cmd = (ring->scan_mask << AD799X_CHANNEL_SHIFT) | AD7998_CONV_RES_REG; break; case ad7997: case ad7998: cmd = AD7997_8_READ_SEQUENCE | AD7998_CONV_RES_REG; break; default: cmd = 0; } b_sent = i2c_smbus_read_i2c_block_data(st->client, cmd, ring->scan_count * 2, rxbuf); if (b_sent < 0) goto done; time_ns = iio_get_time_ns(); if (ring->scan_timestamp) memcpy(rxbuf + st->d_size - sizeof(s64), &time_ns, sizeof(time_ns)); ring->access.store_to(&ring_sw->buf, rxbuf, time_ns); done: kfree(rxbuf); atomic_dec(&st->protect_ring); }
static int st_lsm6dsx_update_fifo(struct iio_dev *iio_dev, bool enable) { struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev); struct st_lsm6dsx_hw *hw = sensor->hw; int err; mutex_lock(&hw->conf_lock); if (hw->fifo_mode != ST_LSM6DSX_FIFO_BYPASS) { err = st_lsm6dsx_flush_fifo(hw); if (err < 0) goto out; } if (enable) { err = st_lsm6dsx_sensor_enable(sensor); if (err < 0) goto out; } else { err = st_lsm6dsx_sensor_disable(sensor); if (err < 0) goto out; } err = st_lsm6dsx_set_fifo_odr(sensor, enable); if (err < 0) goto out; err = st_lsm6dsx_update_decimators(hw); if (err < 0) goto out; err = st_lsm6dsx_update_watermark(sensor, sensor->watermark); if (err < 0) goto out; if (hw->enable_mask) { err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_CONT); if (err < 0) goto out; /* * store enable buffer timestamp as reference to compute * first delta timestamp */ sensor->ts = iio_get_time_ns(iio_dev); } out: mutex_unlock(&hw->conf_lock); return err; }
/** * inv_mpu6050_irq_handler() - Cache a timestamp at each data ready interrupt. */ irqreturn_t inv_mpu6050_irq_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct inv_mpu6050_state *st = iio_priv(indio_dev); s64 timestamp; timestamp = iio_get_time_ns(); kfifo_in_spinlocked(&st->timestamps, ×tamp, 1, &st->time_stamp_lock); return IRQ_WAKE_THREAD; }
static irqreturn_t max1363_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct max1363_state *st = iio_priv(indio_dev); s64 time_ns; __u8 *rxbuf; int b_sent; size_t d_size; unsigned long numvals = bitmap_weight(st->current_mode->modemask, MAX1363_MAX_CHANNELS); /* Ensure the timestamp is 8 byte aligned */ if (st->chip_info->bits != 8) d_size = numvals*2; else d_size = numvals; if (indio_dev->buffer->scan_timestamp) { d_size += sizeof(s64); if (d_size % sizeof(s64)) d_size += sizeof(s64) - (d_size % sizeof(s64)); } /* Monitor mode prevents reading. Whilst not currently implemented * might as well have this test in here in the meantime as it does * no harm. */ if (numvals == 0) return IRQ_HANDLED; rxbuf = kmalloc(d_size, GFP_KERNEL); if (rxbuf == NULL) return -ENOMEM; if (st->chip_info->bits != 8) b_sent = i2c_master_recv(st->client, rxbuf, numvals*2); else b_sent = i2c_master_recv(st->client, rxbuf, numvals); if (b_sent < 0) goto done; time_ns = iio_get_time_ns(); if (indio_dev->buffer->scan_timestamp) memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns)); iio_push_to_buffer(indio_dev->buffer, rxbuf, time_ns); done: iio_trigger_notify_done(indio_dev->trig); kfree(rxbuf); return IRQ_HANDLED; }
/** * ad7606_poll_bh_to_ring() bh of trigger launched polling to ring buffer * @work_s: the work struct through which this was scheduled * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. * I think the one copy of this at a time was to avoid problems if the * trigger was set far too high and the reads then locked up the computer. **/ static void ad7606_poll_bh_to_ring(struct work_struct *work_s) { struct ad7606_state *st = container_of(work_s, struct ad7606_state, poll_work); struct iio_dev *indio_dev = iio_priv_to_dev(st); struct iio_buffer *ring = indio_dev->buffer; s64 time_ns; __u8 *buf; int ret; buf = kzalloc(ring->access->get_bytes_per_datum(ring), GFP_KERNEL); if (buf == NULL) return; if (gpio_is_valid(st->pdata->gpio_frstdata)) { ret = st->bops->read_block(st->dev, 1, buf); if (ret) goto done; if (!gpio_get_value(st->pdata->gpio_frstdata)) { /* This should never happen. However * some signal glitch caused by bad PCB desgin or * electrostatic discharge, could cause an extra read * or clock. This allows recovery. */ ad7606_reset(st); goto done; } ret = st->bops->read_block(st->dev, st->chip_info->num_channels - 1, buf + 2); if (ret) goto done; } else { ret = st->bops->read_block(st->dev, st->chip_info->num_channels, buf); if (ret) goto done; } time_ns = iio_get_time_ns(); if (ring->scan_timestamp) *((s64 *)(buf + ring->access->get_bytes_per_datum(ring) - sizeof(s64))) = time_ns; ring->access->store_to(indio_dev->buffer, buf, time_ns); done: gpio_set_value(st->pdata->gpio_convst, 0); iio_trigger_notify_done(indio_dev->trig); kfree(buf); }
static irqreturn_t ltr501_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ltr501_data *data = iio_priv(indio_dev); u16 buf[8]; __le16 als_buf[2]; u8 mask = 0; int j = 0; int ret, psdata; memset(buf, 0, sizeof(buf)); /* figure out which data needs to be ready */ if (test_bit(0, indio_dev->active_scan_mask) || test_bit(1, indio_dev->active_scan_mask)) mask |= LTR501_STATUS_ALS_RDY; if (test_bit(2, indio_dev->active_scan_mask)) mask |= LTR501_STATUS_PS_RDY; ret = ltr501_drdy(data, mask); if (ret < 0) goto done; if (mask & LTR501_STATUS_ALS_RDY) { ret = regmap_bulk_read(data->regmap, LTR501_ALS_DATA1, (u8 *)als_buf, sizeof(als_buf)); if (ret < 0) return ret; if (test_bit(0, indio_dev->active_scan_mask)) buf[j++] = le16_to_cpu(als_buf[1]); if (test_bit(1, indio_dev->active_scan_mask)) buf[j++] = le16_to_cpu(als_buf[0]); } if (mask & LTR501_STATUS_PS_RDY) { ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA, &psdata, 2); if (ret < 0) goto done; buf[j++] = psdata & LTR501_PS_DATA_MASK; } iio_push_to_buffers_with_timestamp(indio_dev, buf, iio_get_time_ns(indio_dev)); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
static irqreturn_t mpu3050_irq_handler(int irq, void *p) { struct iio_trigger *trig = p; struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); struct mpu3050 *mpu3050 = iio_priv(indio_dev); if (!mpu3050->hw_irq_trigger) return IRQ_NONE; /* Get the time stamp as close in time as possible */ mpu3050->hw_timestamp = iio_get_time_ns(indio_dev); return IRQ_WAKE_THREAD; }
/** * max1363_poll_bh_to_ring() - bh of trigger launched polling to ring buffer * @work_s: the work struct through which this was scheduled * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. * I think the one copy of this at a time was to avoid problems if the * trigger was set far too high and the reads then locked up the computer. **/ static void max1363_poll_bh_to_ring(struct work_struct *work_s) { struct max1363_state *st = container_of(work_s, struct max1363_state, poll_work); struct iio_dev *indio_dev = st->indio_dev; struct iio_sw_ring_buffer *sw_ring = iio_to_sw_ring(indio_dev->ring); s64 time_ns; __u8 *rxbuf; int b_sent; size_t d_size; unsigned long numvals = hweight_long(st->current_mode->modemask); /* Ensure the timestamp is 8 byte aligned */ if (st->chip_info->bits != 8) d_size = numvals*2 + sizeof(s64); else d_size = numvals + sizeof(s64); if (d_size % sizeof(s64)) d_size += sizeof(s64) - (d_size % sizeof(s64)); /* Ensure only one copy of this function running at a time */ if (atomic_inc_return(&st->protect_ring) > 1) return; /* Monitor mode prevents reading. Whilst not currently implemented * might as well have this test in here in the meantime as it does * no harm. */ if (numvals == 0) return; rxbuf = kmalloc(d_size, GFP_KERNEL); if (rxbuf == NULL) return; if (st->chip_info->bits != 8) b_sent = i2c_master_recv(st->client, rxbuf, numvals*2); else b_sent = i2c_master_recv(st->client, rxbuf, numvals); if (b_sent < 0) goto done; time_ns = iio_get_time_ns(); memcpy(rxbuf + d_size - sizeof(s64), &time_ns, sizeof(time_ns)); indio_dev->ring->access.store_to(&sw_ring->buf, rxbuf, time_ns); done: kfree(rxbuf); atomic_dec(&st->protect_ring); }
/** * To read output x/y/z data register, in this case x,y and z are not * mapped w.r.t board orientation. Reading just raw data from device **/ static ssize_t lsm303dlh_a_xyz_read(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct lsm303dlh_a_data *data = indio_dev->dev_data; struct i2c_client *client = data->client; struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int lsb , msb; int ret; s16 val; /* * Perform read/write operation, only when device is active */ if (data->device_status != DEVICE_ON) { dev_dbg(&client->dev, "device is switched off,make it ON using MODE"); return -EINVAL; } mutex_lock(&data->lock); ret = i2c_smbus_read_byte_data(client, SR_REG_A); /* wait till data is written to all six registers */ while (!(ret & XYZ_DATA_RDY_MASK)) ret = i2c_smbus_read_byte_data(client, SR_REG_A); lsb = i2c_smbus_read_byte_data(client, this_attr->address); if (ret < 0) { dev_err(&client->dev, "reading xyz failed\n"); mutex_unlock(&data->lock); return -EINVAL; } msb = i2c_smbus_read_byte_data(client, (this_attr->address + 1)); if (ret < 0) { dev_err(&client->dev, "reading xyz failed\n"); mutex_unlock(&data->lock); return -EINVAL; } val = ((msb << 8) | lsb); mutex_unlock(&data->lock); val >>= data->shift_adjust; return sprintf(buf, "%d:%lld\n", val, iio_get_time_ns()); }
static irqreturn_t mma8452_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct mma8452_data *data = iio_priv(indio_dev); u8 buffer[16]; /* 3 16-bit channels + padding + ts */ int ret; ret = mma8452_read(data, (__be16 *) buffer); if (ret < 0) goto done; iio_push_to_buffers_with_timestamp(indio_dev, buffer, iio_get_time_ns()); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }
/** * ad7298_trigger_handler() bh of trigger launched polling to ring buffer * * Currently there is no option in this driver to disable the saving of * timestamps within the ring. **/ static irqreturn_t ad7298_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->indio_dev; struct ad7298_state *st = iio_priv(indio_dev); int b_sent; b_sent = spi_sync(st->spi, &st->ring_msg); if (b_sent) goto done; iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, iio_get_time_ns(indio_dev)); done: iio_trigger_notify_done(indio_dev->trig); return IRQ_HANDLED; }