Lines Matching +full:lsb +full:- +full:first

1 // SPDX-License-Identifier: GPL-2.0-only
3 * zopt2201.c - Support for IDT ZOPT2201 ambient light and UV B sensor
5 * Copyright 2017 Peter Meerwald-Stadler <pmeerw@pmeerw.net>
7 * Datasheet: https://www.idt.com/document/dst/zopt2201-datasheet
8 * 7-bit I2C slave addresses 0x53 (default) or 0x52 (programmed)
32 #define ZOPT2201_ALS_DATA 0x0d /* LSB first, 13 to 20 bits */
33 #define ZOPT2201_UVB_DATA 0x10 /* LSB first, 13 to 20 bits */
34 #define ZOPT2201_UV_COMP_DATA 0x13 /* LSB first, 13 to 20 bits */
35 #define ZOPT2201_COMP_DATA 0x16 /* LSB first, 13 to 20 bits */
179 return i2c_smbus_write_byte_data(data->client, ZOPT2201_MAIN_CTRL, out); in zopt2201_enable_mode()
184 struct i2c_client *client = data->client; in zopt2201_read()
189 mutex_lock(&data->lock); in zopt2201_read()
194 while (tries--) { in zopt2201_read()
195 unsigned long t = zopt2201_resolution[data->res].us; in zopt2201_read()
209 ret = -ETIMEDOUT; in zopt2201_read()
220 mutex_unlock(&data->lock); in zopt2201_read()
225 mutex_unlock(&data->lock); in zopt2201_read()
262 ret = zopt2201_read(data, chan->address); in zopt2201_read_raw()
272 (1 << (20 - zopt2201_resolution[data->res].bits)) / in zopt2201_read_raw()
273 zopt2201_gain_uvb[data->gain].gain; in zopt2201_read_raw()
276 switch (chan->address) { in zopt2201_read_raw()
278 *val = zopt2201_gain_als[data->gain].scale; in zopt2201_read_raw()
281 *val = zopt2201_gain_uvb[data->gain].scale; in zopt2201_read_raw()
284 return -EINVAL; in zopt2201_read_raw()
288 *val2 *= (1 << (zopt2201_resolution[data->res].bits - 13)); in zopt2201_read_raw()
295 *val2 = zopt2201_resolution[data->res].us; in zopt2201_read_raw()
298 return -EINVAL; in zopt2201_read_raw()
306 ret = i2c_smbus_write_byte_data(data->client, ZOPT2201_LS_MEAS_RATE, in zopt2201_set_resolution()
308 data->rate); in zopt2201_set_resolution()
312 data->res = res; in zopt2201_set_resolution()
323 return -EINVAL; in zopt2201_write_resolution()
327 mutex_lock(&data->lock); in zopt2201_write_resolution()
329 mutex_unlock(&data->lock); in zopt2201_write_resolution()
333 return -EINVAL; in zopt2201_write_resolution()
340 ret = i2c_smbus_write_byte_data(data->client, ZOPT2201_LS_GAIN, gain); in zopt2201_set_gain()
344 data->gain = gain; in zopt2201_set_gain()
354 mutex_lock(&data->lock); in zopt2201_write_scale_by_idx()
362 mutex_unlock(&data->lock); in zopt2201_write_scale_by_idx()
376 return -EINVAL; in zopt2201_write_scale_als()
389 return -EINVAL; in zopt2201_write_scale_uvb()
402 switch (chan->address) { in zopt2201_write_raw()
408 return -EINVAL; in zopt2201_write_raw()
412 return -EINVAL; in zopt2201_write_raw()
423 len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06lu ", in zopt2201_show_int_time_available()
425 buf[len - 1] = '\n'; in zopt2201_show_int_time_available()
440 len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06u ", in zopt2201_show_als_scale_avail()
443 buf[len - 1] = '\n'; in zopt2201_show_als_scale_avail()
456 len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06u ", in zopt2201_show_uvb_scale_avail()
459 buf[len - 1] = '\n'; in zopt2201_show_uvb_scale_avail()
492 if (!i2c_check_functionality(client->adapter, in zopt2201_probe()
494 return -EOPNOTSUPP; in zopt2201_probe()
500 return -ENODEV; in zopt2201_probe()
502 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in zopt2201_probe()
504 return -ENOMEM; in zopt2201_probe()
508 data->client = client; in zopt2201_probe()
509 mutex_init(&data->lock); in zopt2201_probe()
511 indio_dev->info = &zopt2201_info; in zopt2201_probe()
512 indio_dev->channels = zopt2201_channels; in zopt2201_probe()
513 indio_dev->num_channels = ARRAY_SIZE(zopt2201_channels); in zopt2201_probe()
514 indio_dev->name = ZOPT2201_DRV_NAME; in zopt2201_probe()
515 indio_dev->modes = INDIO_DIRECT_MODE; in zopt2201_probe()
517 data->rate = ZOPT2201_MEAS_FREQ_100MS; in zopt2201_probe()
526 return devm_iio_device_register(&client->dev, indio_dev); in zopt2201_probe()
545 MODULE_AUTHOR("Peter Meerwald-Stadler <pmeerw@pmeerw.net>");