Lines Matching +full:scan +full:- +full:delay +full:- +full:ms
1 // SPDX-License-Identifier: GPL-2.0-only
10 * Color light sensor with 16-bit channels for x, y, z and temperature);
11 * 7-bit I2C slave address 0x74 .. 0x77.
14 * AS73211: https://ams.com/documents/20143/36005/AS73211_DS000556_3-01.pdf
15 * AS7331: https://ams.com/documents/20143/9106314/AS7331_DS001047_4-00.pdf
21 #include <linux/delay.h>
77 #define AS73211_SAMPLE_TIME_MAX_MS BIT(AS73211_SAMPLE_TIME_NUM - 1)
94 * struct as73211_spec_dev_data - device-specific data
106 * struct as73211_data - Instance data for one AS73211
115 * @spec_dev: device-specific configuration.
152 #define AS73211_OFFSET_TEMP_INT (-66)
237 return BIT(FIELD_GET(AS73211_CREG1_TIME_MASK, data->creg1)); in as73211_integration_time_1024cyc()
248 * = 2^(-CREG3_CCLK) * 2^CREG1_CYCLES * 1,000 in as73211_integration_time_us()
251 * t_int_us = 2^(3-CREG3_CCLK) * 2^CREG1_CYCLES * 125 in as73211_integration_time_us()
253 return BIT(3 - FIELD_GET(AS73211_CREG3_CCLK_MASK, data->creg3)) * in as73211_integration_time_us()
261 for (i = 0; i < ARRAY_SIZE(data->int_time_avail) / 2; i++) { in as73211_integration_time_calc_avail()
264 data->int_time_avail[i * 2 + 0] = time_us / USEC_PER_SEC; in as73211_integration_time_calc_avail()
265 data->int_time_avail[i * 2 + 1] = time_us % USEC_PER_SEC; in as73211_integration_time_calc_avail()
271 /* gain can be calculated from CREG1 as 2^(11 - CREG1_GAIN) */ in as73211_gain()
272 return BIT(AS73211_CREG1_GAIN_1 - FIELD_GET(AS73211_CREG1_GAIN_MASK, data->creg1)); in as73211_gain()
280 struct device *dev = &data->client->dev; in as73211_req_data()
285 if (data->client->irq) in as73211_req_data()
286 reinit_completion(&data->completion); in as73211_req_data()
292 i2c_lock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
294 data->osr &= ~AS73211_OSR_DOS_MASK; in as73211_req_data()
295 data->osr |= AS73211_OSR_DOS_MEASURE | AS73211_OSR_SS; in as73211_req_data()
297 smbus_data.byte = data->osr; in as73211_req_data()
298 ret = __i2c_smbus_xfer(data->client->adapter, data->client->addr, in as73211_req_data()
299 data->client->flags, I2C_SMBUS_WRITE, in as73211_req_data()
302 i2c_unlock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
310 data->osr &= ~AS73211_OSR_SS; in as73211_req_data()
313 * Add 33% extra margin for the timeout. fclk,min = fclk,typ - 27%. in as73211_req_data()
316 if (data->client->irq) { in as73211_req_data()
317 ret = wait_for_completion_timeout(&data->completion, usecs_to_jiffies(time_us)); in as73211_req_data()
320 i2c_unlock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
321 return -ETIMEDOUT; in as73211_req_data()
328 i2c_unlock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
330 ret = i2c_smbus_read_word_data(data->client, AS73211_OUT_OSR_STATUS); in as73211_req_data()
338 return -ETIME; in as73211_req_data()
342 return -ENODATA; in as73211_req_data()
346 return -ENODATA; in as73211_req_data()
350 return -ENOBUFS; in as73211_req_data()
354 return -EOVERFLOW; in as73211_req_data()
358 return -EOVERFLOW; in as73211_req_data()
362 return -EOVERFLOW; in as73211_req_data()
365 return -EIO; in as73211_req_data()
385 return -EINVAL; in as73211_intensity_scale()
406 return -EINVAL; in as7331_intensity_scale()
423 return -EBUSY; in as73211_read_raw()
431 ret = i2c_smbus_read_word_data(data->client, chan->address); in as73211_read_raw()
445 switch (chan->type) { in as73211_read_raw()
452 return data->spec_dev->intensity_scale(data, chan->channel2, in as73211_read_raw()
456 return -EINVAL; in as73211_read_raw()
461 *val = BIT(FIELD_GET(AS73211_CREG3_CCLK_MASK, data->creg3)) * in as73211_read_raw()
472 mutex_lock(&data->mutex); in as73211_read_raw()
474 mutex_unlock(&data->mutex); in as73211_read_raw()
480 return -EINVAL; in as73211_read_raw()
503 *length = ARRAY_SIZE(data->int_time_avail); in as73211_read_avail()
504 *vals = data->int_time_avail; in as73211_read_avail()
509 return -EINVAL; in as73211_read_avail()
521 if ((data->osr & AS73211_OSR_DOS_MASK) != AS73211_OSR_DOS_CONFIG) { in _as73211_write_raw()
522 data->osr &= ~AS73211_OSR_DOS_MASK; in _as73211_write_raw()
523 data->osr |= AS73211_OSR_DOS_CONFIG; in _as73211_write_raw()
525 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_OSR, data->osr); in _as73211_write_raw()
537 return -EINVAL; in _as73211_write_raw()
540 reg_bits = ilog2(freq_kHz) - 10; in _as73211_write_raw()
542 return -EINVAL; in _as73211_write_raw()
544 data->creg3 &= ~AS73211_CREG3_CCLK_MASK; in _as73211_write_raw()
545 data->creg3 |= FIELD_PREP(AS73211_CREG3_CCLK_MASK, reg_bits); in _as73211_write_raw()
548 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_CREG3, data->creg3); in _as73211_write_raw()
558 return -EINVAL; in _as73211_write_raw()
560 /* gain can be calculated from CREG1 as 2^(11 - CREG1_GAIN) */ in _as73211_write_raw()
561 reg_bits = AS73211_CREG1_GAIN_1 - ilog2(val); in _as73211_write_raw()
563 return -EINVAL; in _as73211_write_raw()
565 data->creg1 &= ~AS73211_CREG1_GAIN_MASK; in _as73211_write_raw()
566 data->creg1 |= FIELD_PREP(AS73211_CREG1_GAIN_MASK, reg_bits); in _as73211_write_raw()
568 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_CREG1, data->creg1); in _as73211_write_raw()
580 int f_samp_1_024mhz = BIT(FIELD_GET(AS73211_CREG3_CCLK_MASK, data->creg3)); in _as73211_write_raw()
586 time_ms = (val_us * f_samp_1_024mhz) / 1000; /* 1 ms, 2 ms, ... (power of two) */ in _as73211_write_raw()
588 return -EINVAL; in _as73211_write_raw()
592 return -EINVAL; /* not possible due to previous tests */ in _as73211_write_raw()
594 data->creg1 &= ~AS73211_CREG1_TIME_MASK; in _as73211_write_raw()
595 data->creg1 |= FIELD_PREP(AS73211_CREG1_TIME_MASK, reg_bits); in _as73211_write_raw()
597 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_CREG1, data->creg1); in _as73211_write_raw()
604 return -EINVAL; in _as73211_write_raw()
614 guard(mutex)(&data->mutex); in as73211_write_raw()
617 return -EBUSY; in as73211_write_raw()
629 complete(&data->completion); in as73211_ready_handler()
637 struct iio_dev *indio_dev = pf->indio_dev; in as73211_trigger_handler()
642 } scan = { }; in as73211_trigger_handler() local
645 mutex_lock(&data->mutex); in as73211_trigger_handler()
648 if (data_result < 0 && data_result != -EOVERFLOW) in as73211_trigger_handler()
651 if (*indio_dev->active_scan_mask == AS73211_SCAN_MASK_ALL) { in as73211_trigger_handler()
656 .addr = data->client->addr, in as73211_trigger_handler()
662 .addr = data->client->addr, in as73211_trigger_handler()
664 .len = sizeof(scan.chan), in as73211_trigger_handler()
665 .buf = (u8 *)&scan.chan, in as73211_trigger_handler()
669 ret = i2c_transfer(data->client->adapter, msgs, ARRAY_SIZE(msgs)); in as73211_trigger_handler()
676 ret = i2c_master_recv(data->client, in as73211_trigger_handler()
677 (char *)&scan.chan[0], 3 * sizeof(scan.chan[0])); in as73211_trigger_handler()
682 scan.chan[3] = 0; in as73211_trigger_handler()
690 if (*indio_dev->active_scan_mask == AS73211_SCAN_MASK_ALL) { in as73211_trigger_handler()
691 scan.chan[1] = cpu_to_le16(U16_MAX); in as73211_trigger_handler()
692 scan.chan[2] = cpu_to_le16(U16_MAX); in as73211_trigger_handler()
693 scan.chan[3] = cpu_to_le16(U16_MAX); in as73211_trigger_handler()
695 scan.chan[0] = cpu_to_le16(U16_MAX); in as73211_trigger_handler()
696 scan.chan[1] = cpu_to_le16(U16_MAX); in as73211_trigger_handler()
697 scan.chan[2] = cpu_to_le16(U16_MAX); in as73211_trigger_handler()
701 iio_push_to_buffers_with_timestamp(indio_dev, &scan, iio_get_time_ns(indio_dev)); in as73211_trigger_handler()
704 mutex_unlock(&data->mutex); in as73211_trigger_handler()
705 iio_trigger_notify_done(indio_dev->trig); in as73211_trigger_handler()
721 mutex_lock(&data->mutex); in as73211_power()
724 data->osr &= ~AS73211_OSR_PD; in as73211_power()
726 data->osr |= AS73211_OSR_PD; in as73211_power()
728 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_OSR, data->osr); in as73211_power()
730 mutex_unlock(&data->mutex); in as73211_power()
747 struct device *dev = &client->dev; in as73211_probe()
754 return -ENOMEM; in as73211_probe()
758 data->client = client; in as73211_probe()
760 data->spec_dev = i2c_get_match_data(client); in as73211_probe()
761 if (!data->spec_dev) in as73211_probe()
762 return -EINVAL; in as73211_probe()
764 mutex_init(&data->mutex); in as73211_probe()
765 init_completion(&data->completion); in as73211_probe()
767 indio_dev->info = &as73211_info; in as73211_probe()
768 indio_dev->name = AS73211_DRV_NAME; in as73211_probe()
769 indio_dev->channels = data->spec_dev->channels; in as73211_probe()
770 indio_dev->num_channels = data->spec_dev->num_channels; in as73211_probe()
771 indio_dev->modes = INDIO_DIRECT_MODE; in as73211_probe()
772 indio_dev->available_scan_masks = as73211_scan_masks; in as73211_probe()
774 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_OSR); in as73211_probe()
777 data->osr = ret; in as73211_probe()
780 data->osr |= AS73211_OSR_SW_RES; in as73211_probe()
781 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_OSR, data->osr); in as73211_probe()
785 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_OSR); in as73211_probe()
788 data->osr = ret; in as73211_probe()
794 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_AGEN); in as73211_probe()
801 return -ENODEV; in as73211_probe()
803 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_CREG1); in as73211_probe()
806 data->creg1 = ret; in as73211_probe()
808 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_CREG2); in as73211_probe()
811 data->creg2 = ret; in as73211_probe()
813 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_CREG3); in as73211_probe()
816 data->creg3 = ret; in as73211_probe()
831 if (client->irq) { in as73211_probe()
832 ret = devm_request_threaded_irq(&client->dev, client->irq, in as73211_probe()
836 client->name, indio_dev); in as73211_probe()