Lines Matching defs:data

48  * The BU27034 does not have interrupt to trigger the data read when a
110 /* See the data sheet for the "Gain Setting" table */
138 * the data collection to data0-channel only and cuts the supported range to
212 * Protect gain and time during scale adjustment and data reading.
280 static int bu27034_get_gain_sel(struct bu27034_data *data, int chan)
292 ret = regmap_read(data->regmap, reg[chan], &val);
302 ret = regmap_read(data->regmap, BU27034_REG_MODE_CONTROL2, &val);
319 static int bu27034_get_gain(struct bu27034_data *data, int chan, int *gain)
323 ret = bu27034_get_gain_sel(data, chan);
329 ret = iio_gts_find_gain_by_sel(&data->gts, sel);
331 dev_err(data->dev, "chan %u: unknown gain value 0x%x\n", chan,
342 static int bu27034_get_int_time(struct bu27034_data *data)
346 ret = regmap_read(data->regmap, BU27034_REG_MODE_CONTROL1, &sel);
350 return iio_gts_find_int_time_by_sel(&data->gts,
354 static int _bu27034_get_scale(struct bu27034_data *data, int channel, int *val,
359 ret = bu27034_get_gain(data, channel, &gain);
363 ret = bu27034_get_int_time(data);
367 return iio_gts_get_scale(&data->gts, gain, ret, val, val2);
370 static int bu27034_get_scale(struct bu27034_data *data, int channel, int *val,
381 mutex_lock(&data->mutex);
382 ret = _bu27034_get_scale(data, channel, val, val2);
383 mutex_unlock(&data->mutex);
391 static int bu27034_write_gain_sel(struct bu27034_data *data, int chan, int sel)
437 return regmap_update_bits(data->regmap, reg[chan], mask, val);
440 static int bu27034_set_gain(struct bu27034_data *data, int chan, int gain)
451 ret = iio_gts_find_sel_by_gain(&data->gts, gain);
455 return bu27034_write_gain_sel(data, chan, ret);
458 /* Caller should hold the lock to protect data->int_time */
459 static int bu27034_set_int_time(struct bu27034_data *data, int time)
463 ret = iio_gts_find_sel_by_int_time(&data->gts, time);
467 return regmap_update_bits(data->regmap, BU27034_REG_MODE_CONTROL1,
475 static int bu27034_try_set_int_time(struct bu27034_data *data, int time_us)
484 mutex_lock(&data->mutex);
485 ret = bu27034_get_int_time(data);
491 if (!iio_gts_valid_time(&data->gts, time_us)) {
492 dev_err(data->dev, "Unsupported integration time %u\n",
505 ret = bu27034_get_gain(data, gains[i].chan, &gains[i].old_gain);
509 ret = iio_gts_find_new_gain_by_old_gain_time(&data->gts,
517 _bu27034_get_scale(data, gains[i].chan, &scale1, &scale2);
518 dev_dbg(data->dev,
531 ret = iio_find_closest_gain_low(&data->gts,
535 dev_dbg(data->dev,
540 dev_dbg(data->dev,
542 ret = iio_gts_get_min_gain(&data->gts);
546 dev_dbg(data->dev, "chan %u scale changed\n",
549 dev_dbg(data->dev, "chan %u new gain %u\n",
555 ret = bu27034_set_gain(data, gains[i].chan, gains[i].new_gain);
560 ret = bu27034_set_int_time(data, time_us);
563 mutex_unlock(&data->mutex);
568 static int bu27034_set_scale(struct bu27034_data *data, int chan,
584 mutex_lock(&data->mutex);
585 ret = regmap_read(data->regmap, BU27034_REG_MODE_CONTROL1, &time_sel);
589 ret = iio_gts_find_gain_sel_for_scale_using_time(&data->gts, time_sel,
610 ret = bu27034_get_gain(data, gain.chan, &gain.old_gain);
619 for (i = 0; i < data->gts.num_itime; i++) {
620 new_time_sel = data->gts.itime_table[i].sel;
627 &data->gts, new_time_sel, val, val2,
634 &data->gts, gain.old_gain, time_sel,
643 dev_dbg(data->dev,
650 ret = bu27034_set_gain(data, gain.chan, gain.new_gain);
654 ret = regmap_update_bits(data->regmap, BU27034_REG_MODE_CONTROL1,
660 ret = bu27034_write_gain_sel(data, chan, gain_sel);
662 mutex_unlock(&data->mutex);
946 static bool bu27034_has_valid_sample(struct bu27034_data *data)
950 ret = regmap_read(data->regmap, BU27034_REG_MODE_CONTROL4, &val);
952 dev_err(data->dev, "Read failed %d\n", ret);
963 * set when we have acquired new data. We use this bit to indicate data
966 static void bu27034_invalidate_read_data(struct bu27034_data *data)
968 bu27034_has_valid_sample(data);
971 static int bu27034_read_result(struct bu27034_data *data, int chan, int *res)
981 ret = regmap_read_poll_timeout(data->regmap, BU27034_REG_MODE_CONTROL4,
987 ret = regmap_bulk_read(data->regmap, reg[chan], &val, sizeof(val));
996 static int bu27034_get_result_unlocked(struct bu27034_data *data, __le16 *res,
1002 /* Get new value from sensor if data is ready */
1003 if (bu27034_has_valid_sample(data)) {
1004 ret = regmap_bulk_read(data->regmap, BU27034_REG_DATA0_LO,
1009 bu27034_invalidate_read_data(data);
1011 /* No new data in sensor. Wait and retry */
1015 dev_err(data->dev, "No data from sensor\n");
1028 static int bu27034_meas_set(struct bu27034_data *data, bool en)
1031 return regmap_set_bits(data->regmap, BU27034_REG_MODE_CONTROL4,
1034 return regmap_clear_bits(data->regmap, BU27034_REG_MODE_CONTROL4,
1038 static int bu27034_get_single_result(struct bu27034_data *data, int chan,
1046 ret = bu27034_meas_set(data, true);
1050 ret = bu27034_get_int_time(data);
1056 return bu27034_read_result(data, chan, val);
1080 static int bu27034_calc_mlux(struct bu27034_data *data, __le16 *res, int *val)
1090 * easy to spot from the buffers especially if raw-data channels show
1098 ret = bu27034_get_gain(data, BU27034_CHAN_DATA0, &gain0);
1102 ret = bu27034_get_gain(data, BU27034_CHAN_DATA1, &gain1);
1106 ret = bu27034_get_int_time(data);
1140 static int bu27034_get_mlux(struct bu27034_data *data, int chan, int *val)
1145 ret = bu27034_meas_set(data, true);
1149 ret = bu27034_get_result_unlocked(data, &res[0], sizeof(res));
1153 ret = bu27034_calc_mlux(data, res, val);
1157 ret = bu27034_meas_set(data, false);
1159 dev_err(data->dev, "failed to disable measurement\n");
1168 struct bu27034_data *data = iio_priv(idev);
1174 *val2 = bu27034_get_int_time(data);
1181 return bu27034_get_scale(data, chan->channel, val, val2);
1185 int (*result_get)(struct bu27034_data *data, int chan, int *val);
1199 mutex_lock(&data->mutex);
1205 ret = result_get(data, chan->channel, val);
1207 mutex_unlock(&data->mutex);
1239 struct bu27034_data *data = iio_priv(idev);
1248 ret = bu27034_set_scale(data, chan->channel, val, val2);
1252 ret = bu27034_try_set_int_time(data, val2);
1270 struct bu27034_data *data = iio_priv(idev);
1274 return iio_gts_avail_times(&data->gts, vals, type, length);
1276 return iio_gts_all_avail_scales(&data->gts, vals, type, length);
1289 static int bu27034_chip_init(struct bu27034_data *data)
1294 ret = regmap_write_bits(data->regmap, BU27034_REG_SYSTEM_CONTROL,
1297 return dev_err_probe(data->dev, ret, "Sensor reset failed\n");
1301 ret = regmap_reinit_cache(data->regmap, &bu27034_regmap);
1303 dev_err(data->dev, "Failed to reinit reg cache\n");
1314 ret = regmap_read(data->regmap, BU27034_REG_MODE_CONTROL1, &sel);
1316 dev_err(data->dev, "reading integration time failed\n");
1321 static int bu27034_wait_for_data(struct bu27034_data *data)
1325 ret = regmap_read_poll_timeout(data->regmap, BU27034_REG_MODE_CONTROL4,
1330 dev_err(data->dev, "data polling %s\n",
1336 ret = regmap_bulk_read(data->regmap, BU27034_REG_DATA0_LO,
1337 &data->scan.channels[0],
1338 sizeof(data->scan.channels));
1342 bu27034_invalidate_read_data(data);
1350 struct bu27034_data *data;
1353 data = iio_priv(idev);
1355 wait_ms = bu27034_get_int_time(data);
1365 ret = bu27034_wait_for_data(data);
1374 ret = bu27034_calc_mlux(data, &data->scan.channels[0],
1377 dev_err(data->dev, "failed to calculate lux\n");
1381 * 55mS data ch0 = 0xffff ch1 = 0xffff fits in 26 bits
1385 data->scan.mlux = (u32)mlux;
1387 iio_push_to_buffers_with_timestamp(idev, &data->scan, tstamp);
1395 struct bu27034_data *data = iio_priv(idev);
1399 mutex_lock(&data->mutex);
1400 ret = bu27034_meas_set(data, true);
1412 data->task = task;
1415 mutex_unlock(&data->mutex);
1422 struct bu27034_data *data = iio_priv(idev);
1425 mutex_lock(&data->mutex);
1426 if (data->task) {
1427 kthread_stop(data->task);
1428 data->task = NULL;
1431 ret = bu27034_meas_set(data, false);
1432 mutex_unlock(&data->mutex);
1445 struct bu27034_data *data;
1456 idev = devm_iio_device_alloc(dev, sizeof(*data));
1464 data = iio_priv(idev);
1477 ARRAY_SIZE(bu27034_itimes), &data->gts);
1481 mutex_init(&data->mutex);
1482 data->regmap = regmap;
1483 data->dev = dev;
1493 ret = bu27034_chip_init(data);