Lines Matching +full:reset +full:- +full:pin +full:- +full:assert +full:- +full:time +full:- +full:ms

1 // SPDX-License-Identifier: GPL-2.0-only
3 * RPR-0521 ROHM Ambient Light and Proximity Sensor
7 * IIO driver for RPR-0521RS (7-bit I2C slave address 0x38).
31 #define RPR0521_REG_PXS_DATA 0x44 /* 16-bit, little endian */
32 #define RPR0521_REG_ALS_DATA0 0x46 /* 16-bit, little endian */
33 #define RPR0521_REG_ALS_DATA1 0x48 /* 16-bit, little endian */
68 #define RPR0521_DEFAULT_MEAS_TIME 0x06 /* ALS - 100ms, PXS - 100ms */
170 {2, 500000, 20, 0}, /* 1000, measurement 100ms, sleep 300ms */
171 {2, 500000, 10, 0}, /* 1001, measurement 100ms, sleep 300ms */
190 /* optimize runtime pm ops - enable/disable device only if needed */
286 ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL, in rpr0521_als_enable()
293 data->als_dev_en = true; in rpr0521_als_enable()
295 data->als_dev_en = false; in rpr0521_als_enable()
304 ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL, in rpr0521_pxs_enable()
311 data->pxs_dev_en = true; in rpr0521_pxs_enable()
313 data->pxs_dev_en = false; in rpr0521_pxs_enable()
319 * rpr0521_set_power_state - handles runtime PM state and sensors enabled status
335 data->als_ps_need_en = on; in rpr0521_set_power_state()
336 data->als_need_dis = !on; in rpr0521_set_power_state()
340 data->pxs_ps_need_en = on; in rpr0521_set_power_state()
341 data->pxs_need_dis = !on; in rpr0521_set_power_state()
348 * Note: If either measurement is re-enabled before _suspend(), in rpr0521_set_power_state()
352 ret = pm_runtime_get_sync(&data->client->dev); in rpr0521_set_power_state()
354 pm_runtime_mark_last_busy(&data->client->dev); in rpr0521_set_power_state()
355 ret = pm_runtime_put_autosuspend(&data->client->dev); in rpr0521_set_power_state()
358 dev_err(&data->client->dev, in rpr0521_set_power_state()
362 pm_runtime_put_noidle(&data->client->dev); in rpr0521_set_power_state()
369 if (data->als_ps_need_en) { in rpr0521_set_power_state()
373 data->als_ps_need_en = false; in rpr0521_set_power_state()
376 if (data->pxs_ps_need_en) { in rpr0521_set_power_state()
380 data->pxs_ps_need_en = false; in rpr0521_set_power_state()
393 ret = regmap_read(data->regmap, RPR0521_REG_INTERRUPT, &reg); in rpr0521_is_triggered()
410 data->irq_timestamp = iio_get_time_ns(indio_dev); in rpr0521_drdy_irq_handler()
426 iio_trigger_poll_chained(data->drdy_trigger0); in rpr0521_drdy_irq_thread()
436 struct iio_dev *indio_dev = pf->indio_dev; in rpr0521_trigger_consumer_store_time()
438 /* Other trigger polls store time here. */ in rpr0521_trigger_consumer_store_time()
440 pf->timestamp = iio_get_time_ns(indio_dev); in rpr0521_trigger_consumer_store_time()
448 struct iio_dev *indio_dev = pf->indio_dev; in rpr0521_trigger_consumer_handler()
452 u8 buffer[16]; /* 3 16-bit channels + padding + ts */ in rpr0521_trigger_consumer_handler()
455 if (iio_trigger_using_own(indio_dev) && data->irq_timestamp) { in rpr0521_trigger_consumer_handler()
456 pf->timestamp = data->irq_timestamp; in rpr0521_trigger_consumer_handler()
457 data->irq_timestamp = 0; in rpr0521_trigger_consumer_handler()
460 if (!pf->timestamp) in rpr0521_trigger_consumer_handler()
461 pf->timestamp = iio_get_time_ns(indio_dev); in rpr0521_trigger_consumer_handler()
463 err = regmap_bulk_read(data->regmap, RPR0521_REG_PXS_DATA, in rpr0521_trigger_consumer_handler()
465 (3 * 2) + 1); /* 3 * 16-bit + (discarded) int clear reg. */ in rpr0521_trigger_consumer_handler()
468 buffer, pf->timestamp); in rpr0521_trigger_consumer_handler()
470 dev_err(&data->client->dev, in rpr0521_trigger_consumer_handler()
472 pf->timestamp = 0; in rpr0521_trigger_consumer_handler()
474 iio_trigger_notify_done(indio_dev->trig); in rpr0521_trigger_consumer_handler()
484 err = regmap_update_bits(data->regmap, RPR0521_REG_PXS_CTRL, in rpr0521_write_int_enable()
488 dev_err(&data->client->dev, "PS control reg write fail.\n"); in rpr0521_write_int_enable()
489 return -EBUSY; in rpr0521_write_int_enable()
493 err = regmap_write(data->regmap, RPR0521_REG_INTERRUPT, in rpr0521_write_int_enable()
499 dev_err(&data->client->dev, "Interrupt setup write fail.\n"); in rpr0521_write_int_enable()
500 return -EBUSY; in rpr0521_write_int_enable()
508 /* Don't care of clearing mode, assert and latch. */ in rpr0521_write_int_disable()
509 return regmap_write(data->regmap, RPR0521_REG_INTERRUPT, in rpr0521_write_int_disable()
531 dev_err(&data->client->dev, "rpr0521_pxs_drdy_set_state failed\n"); in rpr0521_pxs_drdy_set_state()
546 mutex_lock(&data->lock); in rpr0521_buffer_preenable()
549 mutex_unlock(&data->lock); in rpr0521_buffer_preenable()
551 dev_err(&data->client->dev, "_buffer_preenable fail\n"); in rpr0521_buffer_preenable()
561 mutex_lock(&data->lock); in rpr0521_buffer_postdisable()
564 mutex_unlock(&data->lock); in rpr0521_buffer_postdisable()
566 dev_err(&data->client->dev, "_buffer_postdisable fail\n"); in rpr0521_buffer_postdisable()
581 ret = regmap_read(data->regmap, rpr0521_gain[chan].reg, &reg); in rpr0521_get_gain()
595 int i, idx = -EINVAL; in rpr0521_set_gain()
608 return regmap_update_bits(data->regmap, rpr0521_gain[chan].reg, in rpr0521_set_gain()
619 ret = regmap_read(data->regmap, RPR0521_REG_MODE_CTRL, &reg); in rpr0521_read_samp_freq()
625 return -EINVAL; in rpr0521_read_samp_freq()
639 return -EINVAL; in rpr0521_read_samp_freq()
660 return -EINVAL; in rpr0521_write_samp_freq_common()
670 return -EINVAL; in rpr0521_write_samp_freq_common()
673 return regmap_update_bits(data->regmap, in rpr0521_write_samp_freq_common()
684 ret = regmap_bulk_read(data->regmap, in rpr0521_read_ps_offset()
688 dev_err(&data->client->dev, "Failed to read PS OFFSET register\n"); in rpr0521_read_ps_offset()
702 ret = regmap_raw_write(data->regmap, in rpr0521_write_ps_offset()
706 dev_err(&data->client->dev, "Failed to write PS OFFSET register\n"); in rpr0521_write_ps_offset()
725 if (chan->type != IIO_INTENSITY && chan->type != IIO_PROXIMITY) in rpr0521_read_raw()
726 return -EINVAL; in rpr0521_read_raw()
730 return -EBUSY; in rpr0521_read_raw()
732 device_mask = rpr0521_data_reg[chan->address].device_mask; in rpr0521_read_raw()
734 mutex_lock(&data->lock); in rpr0521_read_raw()
739 ret = regmap_bulk_read(data->regmap, in rpr0521_read_raw()
740 rpr0521_data_reg[chan->address].address, in rpr0521_read_raw()
750 mutex_unlock(&data->lock); in rpr0521_read_raw()
760 mutex_lock(&data->lock); in rpr0521_read_raw()
761 ret = rpr0521_get_gain(data, chan->address, val, val2); in rpr0521_read_raw()
762 mutex_unlock(&data->lock); in rpr0521_read_raw()
769 mutex_lock(&data->lock); in rpr0521_read_raw()
770 ret = rpr0521_read_samp_freq(data, chan->type, val, val2); in rpr0521_read_raw()
771 mutex_unlock(&data->lock); in rpr0521_read_raw()
778 mutex_lock(&data->lock); in rpr0521_read_raw()
780 mutex_unlock(&data->lock); in rpr0521_read_raw()
787 return -EINVAL; in rpr0521_read_raw()
800 mutex_lock(&data->lock); in rpr0521_write_raw()
801 ret = rpr0521_set_gain(data, chan->address, val, val2); in rpr0521_write_raw()
802 mutex_unlock(&data->lock); in rpr0521_write_raw()
807 mutex_lock(&data->lock); in rpr0521_write_raw()
808 ret = rpr0521_write_samp_freq_common(data, chan->type, in rpr0521_write_raw()
810 mutex_unlock(&data->lock); in rpr0521_write_raw()
815 mutex_lock(&data->lock); in rpr0521_write_raw()
817 mutex_unlock(&data->lock); in rpr0521_write_raw()
822 return -EINVAL; in rpr0521_write_raw()
837 ret = regmap_read(data->regmap, RPR0521_REG_ID, &id); in rpr0521_init()
839 dev_err(&data->client->dev, "Failed to read REG_ID register\n"); in rpr0521_init()
844 dev_err(&data->client->dev, "Wrong id, got %x, expected %x\n", in rpr0521_init()
846 return -ENODEV; in rpr0521_init()
849 /* set default measurement time - 100 ms for both ALS and PS */ in rpr0521_init()
850 ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL, in rpr0521_init()
867 data->irq_timestamp = 0; in rpr0521_init()
877 ret = regmap_update_bits(data->regmap, RPR0521_REG_MODE_CTRL, in rpr0521_poweroff()
885 data->als_dev_en = false; in rpr0521_poweroff()
886 data->pxs_dev_en = false; in rpr0521_poweroff()
889 * Int pin keeps state after power off. Set pin to high impedance in rpr0521_poweroff()
892 ret = regmap_read(data->regmap, RPR0521_REG_INTERRUPT, &tmp); in rpr0521_poweroff()
894 dev_err(&data->client->dev, "Failed to reset int pin.\n"); in rpr0521_poweroff()
932 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in rpr0521_probe()
934 return -ENOMEM; in rpr0521_probe()
938 dev_err(&client->dev, "regmap_init failed!\n"); in rpr0521_probe()
944 data->client = client; in rpr0521_probe()
945 data->regmap = regmap; in rpr0521_probe()
947 mutex_init(&data->lock); in rpr0521_probe()
949 indio_dev->info = &rpr0521_info; in rpr0521_probe()
950 indio_dev->name = RPR0521_DRV_NAME; in rpr0521_probe()
951 indio_dev->channels = rpr0521_channels; in rpr0521_probe()
952 indio_dev->num_channels = ARRAY_SIZE(rpr0521_channels); in rpr0521_probe()
953 indio_dev->modes = INDIO_DIRECT_MODE; in rpr0521_probe()
957 dev_err(&client->dev, "rpr0521 chip init failed\n"); in rpr0521_probe()
961 ret = pm_runtime_set_active(&client->dev); in rpr0521_probe()
965 pm_runtime_enable(&client->dev); in rpr0521_probe()
966 pm_runtime_set_autosuspend_delay(&client->dev, RPR0521_SLEEP_DELAY_MS); in rpr0521_probe()
967 pm_runtime_use_autosuspend(&client->dev); in rpr0521_probe()
975 if (client->irq) { in rpr0521_probe()
977 data->drdy_trigger0 = devm_iio_trigger_alloc( in rpr0521_probe()
978 indio_dev->dev.parent, in rpr0521_probe()
979 "%s-dev%d", indio_dev->name, indio_dev->id); in rpr0521_probe()
980 if (!data->drdy_trigger0) { in rpr0521_probe()
981 ret = -ENOMEM; in rpr0521_probe()
984 data->drdy_trigger0->dev.parent = indio_dev->dev.parent; in rpr0521_probe()
985 data->drdy_trigger0->ops = &rpr0521_trigger_ops; in rpr0521_probe()
986 indio_dev->available_scan_masks = rpr0521_available_scan_masks; in rpr0521_probe()
987 iio_trigger_set_drvdata(data->drdy_trigger0, indio_dev); in rpr0521_probe()
990 ret = devm_request_threaded_irq(&client->dev, client->irq, in rpr0521_probe()
995 dev_err(&client->dev, "request irq %d for trigger0 failed\n", in rpr0521_probe()
996 client->irq); in rpr0521_probe()
1000 ret = devm_iio_trigger_register(indio_dev->dev.parent, in rpr0521_probe()
1001 data->drdy_trigger0); in rpr0521_probe()
1003 dev_err(&client->dev, "iio trigger register failed\n"); in rpr0521_probe()
1013 ret = devm_iio_triggered_buffer_setup(indio_dev->dev.parent, in rpr0521_probe()
1019 dev_err(&client->dev, "iio triggered buffer setup failed\n"); in rpr0521_probe()
1031 pm_runtime_disable(&client->dev); in rpr0521_probe()
1032 pm_runtime_set_suspended(&client->dev); in rpr0521_probe()
1033 pm_runtime_put_noidle(&client->dev); in rpr0521_probe()
1046 pm_runtime_disable(&client->dev); in rpr0521_remove()
1047 pm_runtime_set_suspended(&client->dev); in rpr0521_remove()
1048 pm_runtime_put_noidle(&client->dev); in rpr0521_remove()
1062 mutex_lock(&data->lock); in rpr0521_runtime_suspend()
1064 if (!data->als_need_dis) in rpr0521_runtime_suspend()
1065 data->als_ps_need_en = data->als_dev_en; in rpr0521_runtime_suspend()
1066 if (!data->pxs_need_dis) in rpr0521_runtime_suspend()
1067 data->pxs_ps_need_en = data->pxs_dev_en; in rpr0521_runtime_suspend()
1071 regcache_mark_dirty(data->regmap); in rpr0521_runtime_suspend()
1072 mutex_unlock(&data->lock); in rpr0521_runtime_suspend()
1083 regcache_sync(data->regmap); in rpr0521_runtime_resume()
1084 if (data->als_ps_need_en) { in rpr0521_runtime_resume()
1088 data->als_ps_need_en = false; in rpr0521_runtime_resume()
1091 if (data->pxs_ps_need_en) { in rpr0521_runtime_resume()
1095 data->pxs_ps_need_en = false; in rpr0521_runtime_resume()