Lines Matching +full:conversion +full:- +full:start +full:- +full:gpios
1 // SPDX-License-Identifier: GPL-2.0-only
4 * https://fscdn.rohm.com/en/products/databook/datasheet/ic/data_converter/dac/bd79124muf-c-e.pdf
15 #include <linux/devm-helpers.h>
30 #include <linux/iio/adc-helpers.h>
203 return regmap_assign_bits(data->map, BD79124_REG_GPO_VAL, BIT(offset), in bd79124gpo_set()
215 * Ensure all GPIOs in 'mask' are set to be GPIOs in bd79124gpo_set_multiple()
221 ret = regmap_read(data->map, BD79124_REG_PINCFG, &all_gpos); in bd79124gpo_set_multiple()
226 dev_dbg(data->dev, "Invalid mux config. Can't set value.\n"); in bd79124gpo_set_multiple()
228 return -EINVAL; in bd79124gpo_set_multiple()
231 return regmap_update_bits(data->map, BD79124_REG_GPO_VAL, *mask, *bits); in bd79124gpo_set_multiple()
240 *valid_mask = data->gpio_valid_mask; in bd79124_init_valid_mask()
247 .label = "bd79124-gpo",
254 .base = -1,
282 ret = regmap_bulk_read(data->map, reg, &raw, sizeof(raw)); in bd79124_read_reg_to_int()
284 dev_dbg(data->dev, "bulk_read failed %d\n", ret); in bd79124_read_reg_to_int()
310 ret = regmap_read(data->map, reg, &tmp); in bd79124_write_int_to_reg()
316 return regmap_bulk_write(data->map, reg, &raw, sizeof(raw)); in bd79124_write_int_to_reg()
365 if (chan->channel >= BD79124_MAX_NUM_CHANNELS) in bd79124_read_event_value()
366 return -EINVAL; in bd79124_read_event_value()
371 *val = data->alarm_r_limit[chan->channel]; in bd79124_read_event_value()
373 *val = data->alarm_f_limit[chan->channel]; in bd79124_read_event_value()
375 return -EINVAL; in bd79124_read_event_value()
380 reg = BD79124_GET_HYSTERESIS_REG(chan->channel); in bd79124_read_event_value()
381 ret = regmap_read(data->map, reg, val); in bd79124_read_event_value()
387 * The data-sheet says the hysteresis register value needs to be in bd79124_read_event_value()
395 return -EINVAL; in bd79124_read_event_value()
405 ret = regmap_read(data->map, BD79124_REG_AUTO_CHANNELS, &val); in bd79124_start_measurement()
414 ret = regmap_clear_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_start_measurement()
419 ret = regmap_write(data->map, BD79124_REG_AUTO_CHANNELS, val | BIT(chan)); in bd79124_start_measurement()
423 ret = regmap_set_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_start_measurement()
429 * Start the measurement at the background. Don't bother checking if in bd79124_start_measurement()
434 return regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_start_measurement()
444 ret = regmap_read(data->map, BD79124_REG_AUTO_CHANNELS, &enabled_chans); in bd79124_stop_measurement()
448 ret = regmap_clear_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_stop_measurement()
453 ret = regmap_write(data->map, BD79124_REG_AUTO_CHANNELS, in bd79124_stop_measurement()
459 * Stop background conversion for power saving if it was the last in bd79124_stop_measurement()
466 ret = regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_stop_measurement()
472 return regmap_set_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_stop_measurement()
483 if (chan->channel >= BD79124_MAX_NUM_CHANNELS) in bd79124_read_event_config()
484 return -EINVAL; in bd79124_read_event_config()
486 return !!(data->alarm_monitored[chan->channel] & BIT(dir)); in bd79124_read_event_config()
496 guard(mutex)(&data->mutex); in bd79124_disable_event()
499 * Set thresholds either to 0 or to 2^12 - 1 as appropriate to prevent in bd79124_disable_event()
509 return -EINVAL; in bd79124_disable_event()
512 data->alarm_monitored[channel] &= ~dir_bit; in bd79124_disable_event()
519 if (!data->alarm_monitored[channel]) { in bd79124_disable_event()
521 regmap_clear_bits(data->map, BD79124_REG_ALERT_CH_SEL, in bd79124_disable_event()
536 guard(mutex)(&data->mutex); in bd79124_enable_event()
541 data->alarm_monitored[channel] |= dir_bit; in bd79124_enable_event()
544 ret = regmap_set_bits(data->map, BD79124_REG_ALERT_CH_SEL, BIT(channel)); in bd79124_enable_event()
549 limit = &data->alarm_f_limit[channel]; in bd79124_enable_event()
552 limit = &data->alarm_f_limit[channel]; in bd79124_enable_event()
557 * rate-limit period. The timer which re-enables the event will set in bd79124_enable_event()
560 if (!(data->alarm_suppressed[channel] & dir_bit)) { in bd79124_enable_event()
570 * We could do this in the hw-init, but there may be users who in bd79124_enable_event()
574 return regmap_set_bits(data->map, BD79124_REG_GEN_CFG, in bd79124_enable_event()
585 if (chan->channel >= BD79124_MAX_NUM_CHANNELS) in bd79124_write_event_config()
586 return -EINVAL; in bd79124_write_event_config()
589 return bd79124_enable_event(data, dir, chan->channel); in bd79124_write_event_config()
591 return bd79124_disable_event(data, dir, chan->channel); in bd79124_write_event_config()
604 if (chan->channel >= BD79124_MAX_NUM_CHANNELS) in bd79124_write_event_value()
605 return -EINVAL; in bd79124_write_event_value()
610 guard(mutex)(&data->mutex); in bd79124_write_event_value()
613 data->alarm_r_limit[chan->channel] = val; in bd79124_write_event_value()
614 reg = BD79124_GET_HIGH_LIMIT_REG(chan->channel); in bd79124_write_event_value()
616 data->alarm_f_limit[chan->channel] = val; in bd79124_write_event_value()
617 reg = BD79124_GET_LOW_LIMIT_REG(chan->channel); in bd79124_write_event_value()
619 return -EINVAL; in bd79124_write_event_value()
626 if (!(data->alarm_monitored[chan->channel] & BIT(dir)) || in bd79124_write_event_value()
627 data->alarm_suppressed[chan->channel] & BIT(dir)) in bd79124_write_event_value()
633 reg = BD79124_GET_HYSTERESIS_REG(chan->channel); in bd79124_write_event_value()
636 return regmap_update_bits(data->map, reg, BD79124_MSK_HYSTERESIS, in bd79124_write_event_value()
639 return -EINVAL; in bd79124_write_event_value()
647 ret = regmap_clear_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_single_chan_seq()
657 ret = regmap_read(data->map, BD79124_REG_AUTO_CHANNELS, old); in bd79124_single_chan_seq()
661 ret = regmap_write(data->map, BD79124_REG_AUTO_CHANNELS, BIT(chan)); in bd79124_single_chan_seq()
666 return regmap_set_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_single_chan_seq()
674 ret = regmap_clear_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_single_chan_seq_end()
679 ret = regmap_write(data->map, BD79124_REG_AUTO_CHANNELS, old); in bd79124_single_chan_seq_end()
683 return regmap_set_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_single_chan_seq_end()
694 if (chan->channel >= BD79124_MAX_NUM_CHANNELS) in bd79124_read_raw()
695 return -EINVAL; in bd79124_read_raw()
703 guard(mutex)(&data->mutex); in bd79124_read_raw()
706 * Start the automatic conversion. This is needed here if no in bd79124_read_raw()
711 ret = regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_read_raw()
716 ret = bd79124_single_chan_seq(data, chan->channel, &old_chan_cfg); in bd79124_read_raw()
720 /* The maximum conversion time is 6 uS. */ in bd79124_read_raw()
724 BD79124_GET_RECENT_RES_REG(chan->channel), val); in bd79124_read_raw()
727 * order to re-enable the event monitoring. in bd79124_read_raw()
731 dev_err(data->dev, in bd79124_read_raw()
740 *val = data->vmax / 1000; in bd79124_read_raw()
744 return -EINVAL; in bd79124_read_raw()
761 * We should not re-enable the event if user has disabled it while in bd79124_re_enable_lo()
762 * rate-limiting was enabled. in bd79124_re_enable_lo()
764 if (!(data->alarm_suppressed[channel] & evbit)) in bd79124_re_enable_lo()
767 data->alarm_suppressed[channel] &= ~evbit; in bd79124_re_enable_lo()
769 if (!(data->alarm_monitored[channel] & evbit)) in bd79124_re_enable_lo()
773 data->alarm_f_limit[channel]); in bd79124_re_enable_lo()
775 dev_warn(data->dev, "Low limit enabling failed for channel%d\n", in bd79124_re_enable_lo()
784 * We should not re-enable the event if user has disabled it while in bd79124_re_enable_hi()
785 * rate-limiting was enabled. in bd79124_re_enable_hi()
787 if (!(data->alarm_suppressed[channel] & evbit)) in bd79124_re_enable_hi()
790 data->alarm_suppressed[channel] &= ~evbit; in bd79124_re_enable_hi()
792 if (!(data->alarm_monitored[channel] & evbit)) in bd79124_re_enable_hi()
796 data->alarm_r_limit[channel]); in bd79124_re_enable_hi()
798 dev_warn(data->dev, "High limit enabling failed for channel%d\n", in bd79124_re_enable_hi()
809 guard(mutex)(&data->mutex); in bd79124_alm_enable_worker()
822 return -EINVAL; in __bd79124_event_ratelimit()
833 schedule_delayed_work(&data->alm_enable_work, msecs_to_jiffies(1000)); in __bd79124_event_ratelimit()
841 guard(mutex)(&data->mutex); in bd79124_event_ratelimit_hi()
842 data->alarm_suppressed[channel] |= BIT(IIO_EV_DIR_RISING); in bd79124_event_ratelimit_hi()
852 guard(mutex)(&data->mutex); in bd79124_event_ratelimit_lo()
853 data->alarm_suppressed[channel] |= BIT(IIO_EV_DIR_FALLING); in bd79124_event_ratelimit_lo()
868 * Return IRQ_NONE if bailing-out without acking. This allows the IRQ in bd79124_event_handler()
874 ret = regmap_read(data->map, BD79124_REG_EVENT_FLAG_HI, &i_hi); in bd79124_event_handler()
878 ret = regmap_read(data->map, BD79124_REG_EVENT_FLAG_LO, &i_lo); in bd79124_event_handler()
893 iio_push_event(iio_dev, ecode, data->timestamp); in bd79124_event_handler()
900 * re-enabling the event later to prevent storm of in bd79124_event_handler()
912 iio_push_event(iio_dev, ecode, data->timestamp); in bd79124_event_handler()
919 ret = regmap_write(data->map, BD79124_REG_EVENT_FLAG_HI, i_hi); in bd79124_event_handler()
923 ret = regmap_write(data->map, BD79124_REG_EVENT_FLAG_LO, i_lo); in bd79124_event_handler()
935 data->timestamp = iio_get_time_ns(iio_dev); in bd79124_irq_handler()
944 ret = regmap_write(data->map, BD79124_GET_HIGH_LIMIT_REG(channel), in bd79124_chan_init()
949 return regmap_write(data->map, BD79124_GET_LOW_LIMIT_REG(channel), in bd79124_chan_init()
959 * GPIOs. Then we can just loop through the iio_chan_spec and clear the in bd79124_get_gpio_pins()
978 data->alarm_r_limit[i] = BD79124_HIGH_LIMIT_MAX; in bd79124_hw_init()
981 ret = regmap_clear_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_hw_init()
987 ret = regmap_set_bits(data->map, BD79124_REG_GEN_CFG, in bd79124_hw_init()
992 /* Set no channels to be auto-measured */ in bd79124_hw_init()
993 ret = regmap_write(data->map, BD79124_REG_AUTO_CHANNELS, 0x0); in bd79124_hw_init()
998 ret = regmap_write(data->map, BD79124_REG_MANUAL_CHANNELS, 0x0); in bd79124_hw_init()
1003 ret = regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_hw_init()
1009 ret = regmap_set_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_hw_init()
1014 /* Don't start the measurement */ in bd79124_hw_init()
1016 return regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_hw_init()
1026 struct device *dev = &i2c->dev; in bd79124_probe()
1032 return -ENOMEM; in bd79124_probe()
1035 data->dev = dev; in bd79124_probe()
1036 data->map = devm_regmap_init_i2c(i2c, &bd79124_regmap); in bd79124_probe()
1037 if (IS_ERR(data->map)) in bd79124_probe()
1038 return dev_err_probe(dev, PTR_ERR(data->map), in bd79124_probe()
1045 data->vmax = ret; in bd79124_probe()
1051 ret = devm_delayed_work_autocancel(dev, &data->alm_enable_work, in bd79124_probe()
1056 if (i2c->irq) { in bd79124_probe()
1063 ret = devm_mutex_init(dev, &data->mutex); in bd79124_probe()
1068 BD79124_MAX_NUM_CHANNELS - 1, &cs); in bd79124_probe()
1071 if (ret == -ENOENT) in bd79124_probe()
1075 iio_dev->channels = cs; in bd79124_probe()
1076 iio_dev->num_channels = ret; in bd79124_probe()
1077 iio_dev->info = &bd79124_info; in bd79124_probe()
1078 iio_dev->name = "bd79124"; in bd79124_probe()
1079 iio_dev->modes = INDIO_DIRECT_MODE; in bd79124_probe()
1085 if (i2c->irq > 0) { in bd79124_probe()
1086 ret = devm_request_threaded_irq(dev, i2c->irq, in bd79124_probe()
1088 IRQF_ONESHOT, "adc-thresh-alert", iio_dev); in bd79124_probe()
1090 return dev_err_probe(data->dev, ret, in bd79124_probe()
1094 ret = devm_iio_device_register(data->dev, iio_dev); in bd79124_probe()
1096 return dev_err_probe(data->dev, ret, "Failed to register ADC\n"); in bd79124_probe()
1099 gpio_pins = bd79124_get_gpio_pins(iio_dev->channels, in bd79124_probe()
1100 iio_dev->num_channels); in bd79124_probe()
1106 ret = regmap_write(data->map, BD79124_REG_PINCFG, gpio_pins); in bd79124_probe()
1114 data->gpio_valid_mask = gpio_pins; in bd79124_probe()
1115 data->gc = bd79124gpo_chip; in bd79124_probe()
1116 data->gc.parent = dev; in bd79124_probe()
1118 return devm_gpiochip_add_data(dev, &data->gc, data); in bd79124_probe()