Lines Matching +full:proximity +full:- +full:near +full:- +full:level

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Sensortek STK3310/STK3311 Ambient Light and Proximity Sensor
7 * IIO driver for STK3310/STK3311. 7-bit I2C address: 0x48.
61 data->reg_##name = \
62 devm_regmap_field_alloc(&client->dev, regmap, \
64 if (IS_ERR(data->reg_##name)) { \
65 dev_err(&client->dev, "reg field alloc failed.\n"); \
66 return PTR_ERR(data->reg_##name); \
97 /* Estimate maximum proximity values with regard to measurement scale. */
136 /* Proximity event */
143 /* Out-of-proximity event */
159 return sprintf(buf, "%u\n", data->ps_near_level); in stk3310_read_near_level()
220 return -ENODEV; in stk3310_check_chip_id()
233 return -EINVAL; in stk3310_get_index()
249 return -EINVAL; in stk3310_read_event()
251 /* Only proximity interrupts are implemented at the moment. */ in stk3310_read_event()
257 return -EINVAL; in stk3310_read_event()
259 mutex_lock(&data->lock); in stk3310_read_event()
260 ret = regmap_bulk_read(data->regmap, reg, &buf, 2); in stk3310_read_event()
261 mutex_unlock(&data->lock); in stk3310_read_event()
263 dev_err(&data->client->dev, "register read failed\n"); in stk3310_read_event()
283 struct i2c_client *client = data->client; in stk3310_write_event()
285 ret = regmap_field_read(data->reg_ps_gain, &index); in stk3310_write_event()
290 return -EINVAL; in stk3310_write_event()
297 return -EINVAL; in stk3310_write_event()
300 ret = regmap_bulk_write(data->regmap, reg, &buf, 2); in stk3310_write_event()
302 dev_err(&client->dev, "failed to set PS threshold!\n"); in stk3310_write_event()
316 ret = regmap_field_read(data->reg_int_ps, &event_val); in stk3310_read_event_config()
331 struct i2c_client *client = data->client; in stk3310_write_event_config()
334 mutex_lock(&data->lock); in stk3310_write_event_config()
335 ret = regmap_field_write(data->reg_int_ps, state); in stk3310_write_event_config()
337 dev_err(&client->dev, "failed to set interrupt mode\n"); in stk3310_write_event_config()
338 mutex_unlock(&data->lock); in stk3310_write_event_config()
352 struct i2c_client *client = data->client; in stk3310_read_raw()
354 if (chan->type != IIO_LIGHT && chan->type != IIO_PROXIMITY) in stk3310_read_raw()
355 return -EINVAL; in stk3310_read_raw()
359 if (chan->type == IIO_LIGHT) in stk3310_read_raw()
364 mutex_lock(&data->lock); in stk3310_read_raw()
365 ret = regmap_bulk_read(data->regmap, reg, &buf, 2); in stk3310_read_raw()
367 dev_err(&client->dev, "register read failed\n"); in stk3310_read_raw()
368 mutex_unlock(&data->lock); in stk3310_read_raw()
372 mutex_unlock(&data->lock); in stk3310_read_raw()
375 if (chan->type == IIO_LIGHT) in stk3310_read_raw()
376 ret = regmap_field_read(data->reg_als_it, &index); in stk3310_read_raw()
378 ret = regmap_field_read(data->reg_ps_it, &index); in stk3310_read_raw()
386 if (chan->type == IIO_LIGHT) in stk3310_read_raw()
387 ret = regmap_field_read(data->reg_als_gain, &index); in stk3310_read_raw()
389 ret = regmap_field_read(data->reg_ps_gain, &index); in stk3310_read_raw()
398 return -EINVAL; in stk3310_read_raw()
409 if (chan->type != IIO_LIGHT && chan->type != IIO_PROXIMITY) in stk3310_write_raw()
410 return -EINVAL; in stk3310_write_raw()
418 return -EINVAL; in stk3310_write_raw()
419 mutex_lock(&data->lock); in stk3310_write_raw()
420 if (chan->type == IIO_LIGHT) in stk3310_write_raw()
421 ret = regmap_field_write(data->reg_als_it, index); in stk3310_write_raw()
423 ret = regmap_field_write(data->reg_ps_it, index); in stk3310_write_raw()
425 dev_err(&data->client->dev, in stk3310_write_raw()
427 mutex_unlock(&data->lock); in stk3310_write_raw()
435 return -EINVAL; in stk3310_write_raw()
436 mutex_lock(&data->lock); in stk3310_write_raw()
437 if (chan->type == IIO_LIGHT) in stk3310_write_raw()
438 ret = regmap_field_write(data->reg_als_gain, index); in stk3310_write_raw()
440 ret = regmap_field_write(data->reg_ps_gain, index); in stk3310_write_raw()
442 dev_err(&data->client->dev, in stk3310_write_raw()
444 mutex_unlock(&data->lock); in stk3310_write_raw()
448 return -EINVAL; in stk3310_write_raw()
464 struct i2c_client *client = data->client; in stk3310_set_state()
466 /* 3-bit state; 0b100 is not supported. */ in stk3310_set_state()
468 return -EINVAL; in stk3310_set_state()
470 mutex_lock(&data->lock); in stk3310_set_state()
471 ret = regmap_field_write(data->reg_state, state); in stk3310_set_state()
473 dev_err(&client->dev, "failed to change sensor state\n"); in stk3310_set_state()
476 data->ps_enabled = !!(state & STK3310_STATE_EN_PS); in stk3310_set_state()
477 data->als_enabled = !!(state & STK3310_STATE_EN_ALS); in stk3310_set_state()
479 mutex_unlock(&data->lock); in stk3310_set_state()
490 struct i2c_client *client = data->client; in stk3310_init()
492 ret = regmap_read(data->regmap, STK3310_REG_ID, &chipid); in stk3310_init()
498 dev_info(&client->dev, "new unknown chip id: 0x%x\n", chipid); in stk3310_init()
503 dev_err(&client->dev, "failed to enable sensor"); in stk3310_init()
508 ret = regmap_field_write(data->reg_int_ps, STK3310_PSINT_EN); in stk3310_init()
510 dev_err(&client->dev, "failed to enable interrupts!\n"); in stk3310_init()
543 client = data->client; in stk3310_regmap_init()
546 dev_err(&client->dev, "regmap initialization failed.\n"); in stk3310_regmap_init()
549 data->regmap = regmap; in stk3310_regmap_init()
568 data->timestamp = iio_get_time_ns(indio_dev); in stk3310_irq_handler()
583 mutex_lock(&data->lock); in stk3310_irq_event_handler()
584 ret = regmap_field_read(data->reg_flag_nf, &dir); in stk3310_irq_event_handler()
586 dev_err(&data->client->dev, "register read failed: %d\n", ret); in stk3310_irq_event_handler()
593 iio_push_event(indio_dev, event, data->timestamp); in stk3310_irq_event_handler()
596 ret = regmap_field_write(data->reg_flag_psint, 0); in stk3310_irq_event_handler()
598 dev_err(&data->client->dev, "failed to reset interrupts\n"); in stk3310_irq_event_handler()
600 mutex_unlock(&data->lock); in stk3310_irq_event_handler()
611 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in stk3310_probe()
613 dev_err(&client->dev, "iio allocation failed!\n"); in stk3310_probe()
614 return -ENOMEM; in stk3310_probe()
618 data->client = client; in stk3310_probe()
621 device_property_read_u32(&client->dev, "proximity-near-level", in stk3310_probe()
622 &data->ps_near_level); in stk3310_probe()
624 mutex_init(&data->lock); in stk3310_probe()
630 indio_dev->info = &stk3310_info; in stk3310_probe()
631 indio_dev->name = STK3310_DRIVER_NAME; in stk3310_probe()
632 indio_dev->modes = INDIO_DIRECT_MODE; in stk3310_probe()
633 indio_dev->channels = stk3310_channels; in stk3310_probe()
634 indio_dev->num_channels = ARRAY_SIZE(stk3310_channels); in stk3310_probe()
640 if (client->irq > 0) { in stk3310_probe()
641 ret = devm_request_threaded_irq(&client->dev, client->irq, in stk3310_probe()
648 dev_err(&client->dev, "request irq %d failed\n", in stk3310_probe()
649 client->irq); in stk3310_probe()
656 dev_err(&client->dev, "device_register failed\n"); in stk3310_probe()
690 if (data->ps_enabled) in stk3310_resume()
692 if (data->als_enabled) in stk3310_resume()
743 MODULE_DESCRIPTION("STK3310 Ambient Light and Proximity Sensor driver");