Lines Matching +full:data +full:- +full:channel

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>
81 * These macros return the address of the first reg for the given channel.
90 * The hysteresis for a channel is stored in the same register where the
115 /* Bitmask of disabled events (for rate limiting) for each channel. */
201 struct bd79124_data *data = gpiochip_get_data(gc); in bd79124gpo_set() local
203 return regmap_assign_bits(data->map, BD79124_REG_GPO_VAL, BIT(offset), in bd79124gpo_set()
212 struct bd79124_data *data = gpiochip_get_data(gc); in bd79124gpo_set_multiple() local
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()
238 struct bd79124_data *data = gpiochip_get_data(gc); in bd79124_init_valid_mask() local
240 *valid_mask = data->gpio_valid_mask; in bd79124_init_valid_mask()
247 .label = "bd79124-gpo",
254 .base = -1,
274 * Read data from register and convert to integer.
276 static int bd79124_read_reg_to_int(struct bd79124_data *data, int reg, in bd79124_read_reg_to_int() argument
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()
303 static int bd79124_write_int_to_reg(struct bd79124_data *data, int reg, in bd79124_write_int_to_reg() argument
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()
362 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_read_event_value() local
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()
399 static int bd79124_start_measurement(struct bd79124_data *data, int chan) in bd79124_start_measurement() argument
405 ret = regmap_read(data->map, BD79124_REG_AUTO_CHANNELS, &val); in bd79124_start_measurement()
411 * the list of the measured channels to ensure the new channel 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()
434 return regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_start_measurement()
438 static int bd79124_stop_measurement(struct bd79124_data *data, int chan) in bd79124_stop_measurement() argument
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()
451 /* Clear the channel from the measured channels */ in bd79124_stop_measurement()
453 ret = regmap_write(data->map, BD79124_REG_AUTO_CHANNELS, in bd79124_stop_measurement()
460 * channel. 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()
481 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_read_event_config() local
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()
489 static int bd79124_disable_event(struct bd79124_data *data, in bd79124_disable_event() argument
490 enum iio_event_direction dir, int channel) in bd79124_disable_event() argument
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()
503 reg = BD79124_GET_HIGH_LIMIT_REG(channel); in bd79124_disable_event()
506 reg = BD79124_GET_LOW_LIMIT_REG(channel); 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()
520 bd79124_stop_measurement(data, channel); in bd79124_disable_event()
521 regmap_clear_bits(data->map, BD79124_REG_ALERT_CH_SEL, in bd79124_disable_event()
522 BIT(channel)); in bd79124_disable_event()
525 return bd79124_write_int_to_reg(data, reg, limit); in bd79124_disable_event()
528 static int bd79124_enable_event(struct bd79124_data *data, in bd79124_enable_event() argument
530 unsigned int channel) in bd79124_enable_event() argument
536 guard(mutex)(&data->mutex); in bd79124_enable_event()
537 ret = bd79124_start_measurement(data, channel); in bd79124_enable_event()
541 data->alarm_monitored[channel] |= dir_bit; in bd79124_enable_event()
543 /* Add the channel to the list of monitored channels */ 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()
550 reg = BD79124_GET_HIGH_LIMIT_REG(channel); in bd79124_enable_event()
552 limit = &data->alarm_f_limit[channel]; in bd79124_enable_event()
553 reg = BD79124_GET_LOW_LIMIT_REG(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()
561 ret = bd79124_write_int_to_reg(data, reg, *limit); 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()
583 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_write_event_config() local
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()
601 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_write_event_value() local
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()
630 return bd79124_write_int_to_reg(data, reg, val); 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()
643 static int bd79124_single_chan_seq(struct bd79124_data *data, int chan, unsigned int *old) in bd79124_single_chan_seq() argument
647 ret = regmap_clear_bits(data->map, BD79124_REG_SEQ_CFG, in bd79124_single_chan_seq()
654 * cache the old config and return it when the single channel 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()
670 static int bd79124_single_chan_seq_end(struct bd79124_data *data, unsigned int old) in bd79124_single_chan_seq_end() argument
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()
691 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_read_raw() local
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()
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()
723 ret = bd79124_read_reg_to_int(data, in bd79124_read_raw()
724 BD79124_GET_RECENT_RES_REG(chan->channel), val); in bd79124_read_raw()
726 * Return the old chan config even if data reading failed in in bd79124_read_raw()
727 * order to re-enable the event monitoring. in bd79124_read_raw()
729 tmp = bd79124_single_chan_seq_end(data, old_chan_cfg); 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()
756 static void bd79124_re_enable_lo(struct bd79124_data *data, unsigned int channel) in bd79124_re_enable_lo() argument
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()
772 ret = bd79124_write_int_to_reg(data, BD79124_GET_LOW_LIMIT_REG(channel), 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()
776 channel); in bd79124_re_enable_lo()
779 static void bd79124_re_enable_hi(struct bd79124_data *data, unsigned int channel) in bd79124_re_enable_hi() argument
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()
795 ret = bd79124_write_int_to_reg(data, BD79124_GET_HIGH_LIMIT_REG(channel), 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()
799 channel); in bd79124_re_enable_hi()
805 struct bd79124_data *data = container_of(work, struct bd79124_data, in bd79124_alm_enable_worker() local
809 guard(mutex)(&data->mutex); in bd79124_alm_enable_worker()
811 bd79124_re_enable_hi(data, i); in bd79124_alm_enable_worker()
812 bd79124_re_enable_lo(data, i); in bd79124_alm_enable_worker()
816 static int __bd79124_event_ratelimit(struct bd79124_data *data, int reg, in __bd79124_event_ratelimit() argument
822 return -EINVAL; in __bd79124_event_ratelimit()
824 ret = bd79124_write_int_to_reg(data, reg, limit); in __bd79124_event_ratelimit()
833 schedule_delayed_work(&data->alm_enable_work, msecs_to_jiffies(1000)); in __bd79124_event_ratelimit()
838 static int bd79124_event_ratelimit_hi(struct bd79124_data *data, in bd79124_event_ratelimit_hi() argument
839 unsigned int channel) in bd79124_event_ratelimit_hi() argument
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()
844 return __bd79124_event_ratelimit(data, in bd79124_event_ratelimit_hi()
845 BD79124_GET_HIGH_LIMIT_REG(channel), in bd79124_event_ratelimit_hi()
849 static int bd79124_event_ratelimit_lo(struct bd79124_data *data, in bd79124_event_ratelimit_lo() argument
850 unsigned int channel) in bd79124_event_ratelimit_lo() argument
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()
855 return __bd79124_event_ratelimit(data, in bd79124_event_ratelimit_lo()
856 BD79124_GET_LOW_LIMIT_REG(channel), in bd79124_event_ratelimit_lo()
865 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_event_handler() local
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()
899 * Disable the event for the channel and schedule the in bd79124_event_handler()
900 * re-enabling the event later to prevent storm of in bd79124_event_handler()
903 ret = bd79124_event_ratelimit_hi(data, i); in bd79124_event_handler()
912 iio_push_event(iio_dev, ecode, data->timestamp); in bd79124_event_handler()
913 ret = bd79124_event_ratelimit_lo(data, i); 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()
933 struct bd79124_data *data = iio_priv(iio_dev); in bd79124_irq_handler() local
935 data->timestamp = iio_get_time_ns(iio_dev); in bd79124_irq_handler()
940 static int bd79124_chan_init(struct bd79124_data *data, int channel) in bd79124_chan_init() argument
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()
964 gpio_channels &= ~BIT(cs[i].channel); in bd79124_get_gpio_pins()
969 static int bd79124_hw_init(struct bd79124_data *data) in bd79124_hw_init() argument
975 ret = bd79124_chan_init(data, i); in bd79124_hw_init()
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()
1016 return regmap_update_bits(data->map, BD79124_REG_OPMODE_CFG, in bd79124_hw_init()
1022 struct bd79124_data *data; in bd79124_probe() local
1026 struct device *dev = &i2c->dev; in bd79124_probe()
1030 iio_dev = devm_iio_device_alloc(dev, sizeof(*data)); in bd79124_probe()
1032 return -ENOMEM; in bd79124_probe()
1034 data = iio_priv(iio_dev); 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()
1081 ret = bd79124_hw_init(data); 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()