Lines Matching +full:uv +full:- +full:sensor

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)
39 #define ZOPT2201_MAIN_CTRL_LS_MODE BIT(3) /* 0 .. ALS, 1 .. UV B */
105 unsigned int bits; /* sensor resolution in bits */
181 return i2c_smbus_write_byte_data(data->client, ZOPT2201_MAIN_CTRL, out); in zopt2201_enable_mode()
186 struct i2c_client *client = data->client; in zopt2201_read()
191 mutex_lock(&data->lock); in zopt2201_read()
196 while (tries--) { in zopt2201_read()
197 unsigned long t = zopt2201_resolution[data->res].us; in zopt2201_read()
211 ret = -ETIMEDOUT; in zopt2201_read()
222 mutex_unlock(&data->lock); in zopt2201_read()
227 mutex_unlock(&data->lock); in zopt2201_read()
264 ret = zopt2201_read(data, chan->address); in zopt2201_read_raw()
274 (1 << (20 - zopt2201_resolution[data->res].bits)) / in zopt2201_read_raw()
275 zopt2201_gain_uvb[data->gain].gain; in zopt2201_read_raw()
278 switch (chan->address) { in zopt2201_read_raw()
280 *val = zopt2201_gain_als[data->gain].scale; in zopt2201_read_raw()
283 *val = zopt2201_gain_uvb[data->gain].scale; in zopt2201_read_raw()
286 return -EINVAL; in zopt2201_read_raw()
290 *val2 *= (1 << (zopt2201_resolution[data->res].bits - 13)); in zopt2201_read_raw()
297 *val2 = zopt2201_resolution[data->res].us; in zopt2201_read_raw()
300 return -EINVAL; in zopt2201_read_raw()
308 ret = i2c_smbus_write_byte_data(data->client, ZOPT2201_LS_MEAS_RATE, in zopt2201_set_resolution()
310 data->rate); in zopt2201_set_resolution()
314 data->res = res; in zopt2201_set_resolution()
325 return -EINVAL; in zopt2201_write_resolution()
329 mutex_lock(&data->lock); in zopt2201_write_resolution()
331 mutex_unlock(&data->lock); in zopt2201_write_resolution()
335 return -EINVAL; in zopt2201_write_resolution()
342 ret = i2c_smbus_write_byte_data(data->client, ZOPT2201_LS_GAIN, gain); in zopt2201_set_gain()
346 data->gain = gain; in zopt2201_set_gain()
355 mutex_lock(&data->lock); in zopt2201_write_scale_als_by_idx()
363 mutex_unlock(&data->lock); in zopt2201_write_scale_als_by_idx()
378 return -EINVAL; in zopt2201_write_scale_als()
385 mutex_lock(&data->lock); in zopt2201_write_scale_uvb_by_idx()
393 mutex_unlock(&data->lock); in zopt2201_write_scale_uvb_by_idx()
407 return -EINVAL; in zopt2201_write_scale_uvb()
420 switch (chan->address) { in zopt2201_write_raw()
426 return -EINVAL; in zopt2201_write_raw()
430 return -EINVAL; in zopt2201_write_raw()
441 len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06lu ", in zopt2201_show_int_time_available()
443 buf[len - 1] = '\n'; in zopt2201_show_int_time_available()
458 len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06u ", in zopt2201_show_als_scale_avail()
461 buf[len - 1] = '\n'; in zopt2201_show_als_scale_avail()
474 len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06u ", in zopt2201_show_uvb_scale_avail()
477 buf[len - 1] = '\n'; in zopt2201_show_uvb_scale_avail()
510 if (!i2c_check_functionality(client->adapter, in zopt2201_probe()
512 return -EOPNOTSUPP; in zopt2201_probe()
518 return -ENODEV; in zopt2201_probe()
520 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in zopt2201_probe()
522 return -ENOMEM; in zopt2201_probe()
526 data->client = client; in zopt2201_probe()
527 mutex_init(&data->lock); in zopt2201_probe()
529 indio_dev->info = &zopt2201_info; in zopt2201_probe()
530 indio_dev->channels = zopt2201_channels; in zopt2201_probe()
531 indio_dev->num_channels = ARRAY_SIZE(zopt2201_channels); in zopt2201_probe()
532 indio_dev->name = ZOPT2201_DRV_NAME; in zopt2201_probe()
533 indio_dev->modes = INDIO_DIRECT_MODE; in zopt2201_probe()
535 data->rate = ZOPT2201_MEAS_FREQ_100MS; in zopt2201_probe()
544 return devm_iio_device_register(&client->dev, indio_dev); in zopt2201_probe()
563 MODULE_AUTHOR("Peter Meerwald-Stadler <pmeerw@pmeerw.net>");
564 MODULE_DESCRIPTION("IDT ZOPT2201 ambient light and UV B sensor driver");