• Home
  • Raw
  • Download

Lines Matching +full:x +full:- +full:powers

1 // SPDX-License-Identifier: GPL-2.0-only
9 * Color light sensor with 16-bit channels for x, y, z and temperature);
10 * 7-bit I2C slave address 0x74 .. 0x77.
12 * Datasheet: https://ams.com/documents/20143/36005/AS73211_DS000556_3-01.pdf
54 #define AS73211_AGEN_DEVID(x) FIELD_PREP(AS73211_AGEN_DEVID_MASK, (x)) argument
56 #define AS73211_AGEN_MUT(x) FIELD_PREP(AS73211_AGEN_MUT_MASK, (x)) argument
74 #define AS73211_SAMPLE_TIME_MAX_MS BIT(AS73211_SAMPLE_TIME_NUM - 1)
76 /* Available sample frequencies are 1.024MHz multiplied by powers of two. */
89 * struct as73211_data - Instance data for one AS73211
133 #define AS73211_OFFSET_TEMP_INT (-66)
174 AS73211_COLOR_CHANNEL(X, AS73211_SCAN_INDEX_X, AS73211_OUT_MRES1),
184 * in CREG1 is in powers of 2 (x 1024 cycles). in as73211_integration_time_1024cyc()
186 return BIT(FIELD_GET(AS73211_CREG1_TIME_MASK, data->creg1)); in as73211_integration_time_1024cyc()
193 * f_samp is configured in CREG3 in powers of 2 (x 1.024 MHz) in as73211_integration_time_us()
194 * t_cycl is configured in CREG1 in powers of 2 (x 1024 cycles) in as73211_integration_time_us()
197 * = 2^(-CREG3_CCLK) * 2^CREG1_CYCLES * 1,000 in as73211_integration_time_us()
200 * t_int_us = 2^(3-CREG3_CCLK) * 2^CREG1_CYCLES * 125 in as73211_integration_time_us()
202 return BIT(3 - FIELD_GET(AS73211_CREG3_CCLK_MASK, data->creg3)) * in as73211_integration_time_us()
210 for (i = 0; i < ARRAY_SIZE(data->int_time_avail) / 2; i++) { in as73211_integration_time_calc_avail()
213 data->int_time_avail[i * 2 + 0] = time_us / USEC_PER_SEC; in as73211_integration_time_calc_avail()
214 data->int_time_avail[i * 2 + 1] = time_us % USEC_PER_SEC; in as73211_integration_time_calc_avail()
220 /* gain can be calculated from CREG1 as 2^(11 - CREG1_GAIN) */ in as73211_gain()
221 return BIT(AS73211_CREG1_GAIN_1 - FIELD_GET(AS73211_CREG1_GAIN_MASK, data->creg1)); in as73211_gain()
229 struct device *dev = &data->client->dev; in as73211_req_data()
234 if (data->client->irq) in as73211_req_data()
235 reinit_completion(&data->completion); in as73211_req_data()
241 i2c_lock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
243 data->osr &= ~AS73211_OSR_DOS_MASK; in as73211_req_data()
244 data->osr |= AS73211_OSR_DOS_MEASURE | AS73211_OSR_SS; in as73211_req_data()
246 smbus_data.byte = data->osr; in as73211_req_data()
247 ret = __i2c_smbus_xfer(data->client->adapter, data->client->addr, in as73211_req_data()
248 data->client->flags, I2C_SMBUS_WRITE, in as73211_req_data()
251 i2c_unlock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
259 data->osr &= ~AS73211_OSR_SS; in as73211_req_data()
262 * Add 33% extra margin for the timeout. fclk,min = fclk,typ - 27%. in as73211_req_data()
265 if (data->client->irq) { in as73211_req_data()
266 ret = wait_for_completion_timeout(&data->completion, usecs_to_jiffies(time_us)); in as73211_req_data()
269 i2c_unlock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
270 return -ETIMEDOUT; in as73211_req_data()
277 i2c_unlock_bus(data->client->adapter, I2C_LOCK_SEGMENT); in as73211_req_data()
279 ret = i2c_smbus_read_word_data(data->client, AS73211_OUT_OSR_STATUS); in as73211_req_data()
287 return -ETIME; in as73211_req_data()
291 return -ENODATA; in as73211_req_data()
295 return -ENODATA; in as73211_req_data()
299 return -ENOBUFS; in as73211_req_data()
303 return -EOVERFLOW; in as73211_req_data()
307 return -EOVERFLOW; in as73211_req_data()
311 return -EOVERFLOW; in as73211_req_data()
314 return -EIO; in as73211_req_data()
339 ret = i2c_smbus_read_word_data(data->client, chan->address); in as73211_read_raw()
353 switch (chan->type) { in as73211_read_raw()
362 switch (chan->channel2) { in as73211_read_raw()
373 return -EINVAL; in as73211_read_raw()
381 return -EINVAL; in as73211_read_raw()
385 /* f_samp is configured in CREG3 in powers of 2 (x 1.024 MHz) */ in as73211_read_raw()
386 *val = BIT(FIELD_GET(AS73211_CREG3_CCLK_MASK, data->creg3)) * in as73211_read_raw()
397 mutex_lock(&data->mutex); in as73211_read_raw()
399 mutex_unlock(&data->mutex); in as73211_read_raw()
405 return -EINVAL; in as73211_read_raw()
428 *length = ARRAY_SIZE(data->int_time_avail); in as73211_read_avail()
429 *vals = data->int_time_avail; in as73211_read_avail()
434 return -EINVAL; in as73211_read_avail()
449 /* val must be 1024 * 2^x */ in _as73211_write_raw()
452 return -EINVAL; in _as73211_write_raw()
454 /* f_samp is configured in CREG3 in powers of 2 (x 1.024 MHz (=2^10)) */ in _as73211_write_raw()
455 reg_bits = ilog2(freq_kHz) - 10; in _as73211_write_raw()
457 return -EINVAL; in _as73211_write_raw()
459 data->creg3 &= ~AS73211_CREG3_CCLK_MASK; in _as73211_write_raw()
460 data->creg3 |= FIELD_PREP(AS73211_CREG3_CCLK_MASK, reg_bits); in _as73211_write_raw()
463 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_CREG3, data->creg3); in _as73211_write_raw()
473 return -EINVAL; in _as73211_write_raw()
475 /* gain can be calculated from CREG1 as 2^(11 - CREG1_GAIN) */ in _as73211_write_raw()
476 reg_bits = AS73211_CREG1_GAIN_1 - ilog2(val); in _as73211_write_raw()
478 return -EINVAL; in _as73211_write_raw()
480 data->creg1 &= ~AS73211_CREG1_GAIN_MASK; in _as73211_write_raw()
481 data->creg1 |= FIELD_PREP(AS73211_CREG1_GAIN_MASK, reg_bits); in _as73211_write_raw()
483 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_CREG1, data->creg1); in _as73211_write_raw()
494 /* f_samp is configured in CREG3 in powers of 2 (x 1.024 MHz) */ in _as73211_write_raw()
495 int f_samp_1_024mhz = BIT(FIELD_GET(AS73211_CREG3_CCLK_MASK, data->creg3)); in _as73211_write_raw()
503 return -EINVAL; in _as73211_write_raw()
507 return -EINVAL; /* not possible due to previous tests */ in _as73211_write_raw()
509 data->creg1 &= ~AS73211_CREG1_TIME_MASK; in _as73211_write_raw()
510 data->creg1 |= FIELD_PREP(AS73211_CREG1_TIME_MASK, reg_bits); in _as73211_write_raw()
512 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_CREG1, data->creg1); in _as73211_write_raw()
519 return -EINVAL; in _as73211_write_raw()
529 mutex_lock(&data->mutex); in as73211_write_raw()
536 if ((data->osr & AS73211_OSR_DOS_MASK) != AS73211_OSR_DOS_CONFIG) { in as73211_write_raw()
537 data->osr &= ~AS73211_OSR_DOS_MASK; in as73211_write_raw()
538 data->osr |= AS73211_OSR_DOS_CONFIG; in as73211_write_raw()
540 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_OSR, data->osr); in as73211_write_raw()
550 mutex_unlock(&data->mutex); in as73211_write_raw()
558 complete(&data->completion); in as73211_ready_handler()
566 struct iio_dev *indio_dev = pf->indio_dev; in as73211_trigger_handler()
574 mutex_lock(&data->mutex); in as73211_trigger_handler()
577 if (data_result < 0 && data_result != -EOVERFLOW) in as73211_trigger_handler()
580 if (*indio_dev->active_scan_mask == AS73211_SCAN_MASK_ALL) { in as73211_trigger_handler()
585 .addr = data->client->addr, in as73211_trigger_handler()
591 .addr = data->client->addr, in as73211_trigger_handler()
598 ret = i2c_transfer(data->client->adapter, msgs, ARRAY_SIZE(msgs)); in as73211_trigger_handler()
605 ret = i2c_master_recv(data->client, in as73211_trigger_handler()
624 mutex_unlock(&data->mutex); in as73211_trigger_handler()
625 iio_trigger_notify_done(indio_dev->trig); in as73211_trigger_handler()
641 mutex_lock(&data->mutex); in as73211_power()
644 data->osr &= ~AS73211_OSR_PD; in as73211_power()
646 data->osr |= AS73211_OSR_PD; in as73211_power()
648 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_OSR, data->osr); in as73211_power()
650 mutex_unlock(&data->mutex); in as73211_power()
667 struct device *dev = &client->dev; in as73211_probe()
674 return -ENOMEM; in as73211_probe()
678 data->client = client; in as73211_probe()
680 mutex_init(&data->mutex); in as73211_probe()
681 init_completion(&data->completion); in as73211_probe()
683 indio_dev->info = &as73211_info; in as73211_probe()
684 indio_dev->name = AS73211_DRV_NAME; in as73211_probe()
685 indio_dev->channels = as73211_channels; in as73211_probe()
686 indio_dev->num_channels = ARRAY_SIZE(as73211_channels); in as73211_probe()
687 indio_dev->modes = INDIO_DIRECT_MODE; in as73211_probe()
689 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_OSR); in as73211_probe()
692 data->osr = ret; in as73211_probe()
695 data->osr |= AS73211_OSR_SW_RES; in as73211_probe()
696 ret = i2c_smbus_write_byte_data(data->client, AS73211_REG_OSR, data->osr); in as73211_probe()
700 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_OSR); in as73211_probe()
703 data->osr = ret; in as73211_probe()
709 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_AGEN); in as73211_probe()
716 return -ENODEV; in as73211_probe()
718 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_CREG1); in as73211_probe()
721 data->creg1 = ret; in as73211_probe()
723 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_CREG2); in as73211_probe()
726 data->creg2 = ret; in as73211_probe()
728 ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_CREG3); in as73211_probe()
731 data->creg3 = ret; in as73211_probe()
746 if (client->irq) { in as73211_probe()
747 ret = devm_request_threaded_irq(&client->dev, client->irq, in as73211_probe()
751 client->name, indio_dev); in as73211_probe()