Lines Matching +full:1 +full:- +full:channel
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
3 * LTC2992 - Dual Wide Range Power Monitor
108 #define LTC2992_GPIO_BIT(x) (LTC2992_GPIO_NR - (x) - 1)
141 .max_alarm_msk = LTC2992_GPIO1_FAULT_MSK(1),
153 .max_alarm_msk = LTC2992_GPIO2_FAULT_MSK(1),
165 .max_alarm_msk = LTC2992_GPIO3_FAULT_MSK(1),
177 .max_alarm_msk = LTC2992_GPIO4_FAULT_MSK(1),
194 ret = regmap_bulk_read(st->regmap, addr, regvals, reg_len); in ltc2992_read_reg()
200 val |= regvals[reg_len - i - 1] << (i * 8); in ltc2992_read_reg()
211 regvals[reg_len - i - 1] = (val >> (i * 8)) & 0xFF; in ltc2992_write_reg()
213 return regmap_bulk_write(st->regmap, addr, regvals, reg_len); in ltc2992_write_reg()
222 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_get()
223 reg = ltc2992_read_reg(st, LTC2992_GPIO_STATUS, 1); in ltc2992_gpio_get()
224 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_get()
242 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_get_multiple()
243 reg = ltc2992_read_reg(st, LTC2992_GPIO_STATUS, 1); in ltc2992_gpio_get_multiple()
244 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_get_multiple()
266 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_set()
267 reg = ltc2992_read_reg(st, ltc2992_gpio_addr_map[offset].ctrl, 1); in ltc2992_gpio_set()
269 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set()
276 ret = ltc2992_write_reg(st, ltc2992_gpio_addr_map[offset].ctrl, 1, in ltc2992_gpio_set()
278 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set()
300 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_set_multiple()
301 ret = ltc2992_write_reg(st, LTC2992_GPIO_IO_CTRL, 1, gpio_ctrl_io); in ltc2992_gpio_set_multiple()
305 ret = ltc2992_write_reg(st, LTC2992_GPIO_CTRL, 1, gpio_ctrl); in ltc2992_gpio_set_multiple()
307 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set_multiple()
313 const char *name = dev_name(&st->client->dev); in ltc2992_config_gpio()
318 ret = ltc2992_write_reg(st, LTC2992_GPIO_IO_CTRL, 1, 0); in ltc2992_config_gpio()
322 mutex_init(&st->gpio_mutex); in ltc2992_config_gpio()
324 for (i = 0; i < ARRAY_SIZE(st->gpio_names); i++) { in ltc2992_config_gpio()
325 gpio_name = devm_kasprintf(&st->client->dev, GFP_KERNEL, "ltc2992-%x-%s", in ltc2992_config_gpio()
326 st->client->addr, ltc2992_gpio_names[i]); in ltc2992_config_gpio()
328 return -ENOMEM; in ltc2992_config_gpio()
330 st->gpio_names[i] = gpio_name; in ltc2992_config_gpio()
333 st->gc.label = name; in ltc2992_config_gpio()
334 st->gc.parent = &st->client->dev; in ltc2992_config_gpio()
335 st->gc.owner = THIS_MODULE; in ltc2992_config_gpio()
336 st->gc.can_sleep = true; in ltc2992_config_gpio()
337 st->gc.base = -1; in ltc2992_config_gpio()
338 st->gc.names = st->gpio_names; in ltc2992_config_gpio()
339 st->gc.ngpio = ARRAY_SIZE(st->gpio_names); in ltc2992_config_gpio()
340 st->gc.get = ltc2992_gpio_get; in ltc2992_config_gpio()
341 st->gc.get_multiple = ltc2992_gpio_get_multiple; in ltc2992_config_gpio()
342 st->gc.set = ltc2992_gpio_set; in ltc2992_config_gpio()
343 st->gc.set_multiple = ltc2992_gpio_set_multiple; in ltc2992_config_gpio()
345 ret = devm_gpiochip_add_data(&st->client->dev, &st->gc, st); in ltc2992_config_gpio()
347 dev_err(&st->client->dev, "GPIO registering failed (%d)\n", ret); in ltc2992_config_gpio()
353 int channel) in ltc2992_is_visible() argument
384 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
389 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
401 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
406 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
450 reg_val = ltc2992_read_reg(st, ltc2992_gpio_addr_map[nr_gpio].alarm, 1); in ltc2992_read_gpio_alarm()
457 return ltc2992_write_reg(st, ltc2992_gpio_addr_map[nr_gpio].alarm, 1, reg_val); in ltc2992_read_gpio_alarm()
485 return -EOPNOTSUPP; in ltc2992_read_gpios_in()
491 static int ltc2992_read_in_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr) in ltc2992_read_in_alarm() argument
497 mask = LTC2992_SENSE_FAULT_MSK(1); in ltc2992_read_in_alarm()
501 reg_val = ltc2992_read_reg(st, LTC2992_SENSE_FAULT(channel), 1); in ltc2992_read_in_alarm()
508 return ltc2992_write_reg(st, LTC2992_SENSE_FAULT(channel), 1, reg_val); in ltc2992_read_in_alarm()
511 static int ltc2992_read_in(struct device *dev, u32 attr, int channel, long *val) in ltc2992_read_in() argument
516 if (channel > 1) in ltc2992_read_in()
517 return ltc2992_read_gpios_in(dev, attr, channel - 2, val); in ltc2992_read_in()
521 reg = LTC2992_SENSE(channel); in ltc2992_read_in()
524 reg = LTC2992_SENSE_MIN(channel); in ltc2992_read_in()
527 reg = LTC2992_SENSE_MAX(channel); in ltc2992_read_in()
530 reg = LTC2992_SENSE_MIN_THRESH(channel); in ltc2992_read_in()
533 reg = LTC2992_SENSE_MAX_THRESH(channel); in ltc2992_read_in()
537 return ltc2992_read_in_alarm(st, channel, val, attr); in ltc2992_read_in()
539 return -EOPNOTSUPP; in ltc2992_read_in()
545 static int ltc2992_get_current(struct ltc2992_state *st, u32 reg, u32 channel, long *val) in ltc2992_get_current() argument
554 *val = DIV_ROUND_CLOSEST(reg_val * LTC2992_IADC_NANOV_LSB, st->r_sense_uohm[channel]); in ltc2992_get_current()
559 static int ltc2992_set_current(struct ltc2992_state *st, u32 reg, u32 channel, long val) in ltc2992_set_current() argument
563 reg_val = DIV_ROUND_CLOSEST(val * st->r_sense_uohm[channel], LTC2992_IADC_NANOV_LSB); in ltc2992_set_current()
569 static int ltc2992_read_curr_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr) in ltc2992_read_curr_alarm() argument
575 mask = LTC2992_DSENSE_FAULT_MSK(1); in ltc2992_read_curr_alarm()
579 reg_val = ltc2992_read_reg(st, LTC2992_DSENSE_FAULT(channel), 1); in ltc2992_read_curr_alarm()
586 return ltc2992_write_reg(st, LTC2992_DSENSE_FAULT(channel), 1, reg_val); in ltc2992_read_curr_alarm()
589 static int ltc2992_read_curr(struct device *dev, u32 attr, int channel, long *val) in ltc2992_read_curr() argument
596 reg = LTC2992_DSENSE(channel); in ltc2992_read_curr()
599 reg = LTC2992_DSENSE_MIN(channel); in ltc2992_read_curr()
602 reg = LTC2992_DSENSE_MAX(channel); in ltc2992_read_curr()
605 reg = LTC2992_DSENSE_MIN_THRESH(channel); in ltc2992_read_curr()
608 reg = LTC2992_DSENSE_MAX_THRESH(channel); in ltc2992_read_curr()
612 return ltc2992_read_curr_alarm(st, channel, val, attr); in ltc2992_read_curr()
614 return -EOPNOTSUPP; in ltc2992_read_curr()
617 return ltc2992_get_current(st, reg, channel, val); in ltc2992_read_curr()
620 static int ltc2992_get_power(struct ltc2992_state *st, u32 reg, u32 channel, long *val) in ltc2992_get_power() argument
629 st->r_sense_uohm[channel] * 1000); in ltc2992_get_power()
634 static int ltc2992_set_power(struct ltc2992_state *st, u32 reg, u32 channel, long val) in ltc2992_set_power() argument
638 reg_val = mul_u64_u32_div(val, st->r_sense_uohm[channel] * 1000, in ltc2992_set_power()
644 static int ltc2992_read_power_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr) in ltc2992_read_power_alarm() argument
650 mask = LTC2992_POWER_FAULT_MSK(1); in ltc2992_read_power_alarm()
654 reg_val = ltc2992_read_reg(st, LTC2992_POWER_FAULT(channel), 1); in ltc2992_read_power_alarm()
661 return ltc2992_write_reg(st, LTC2992_POWER_FAULT(channel), 1, reg_val); in ltc2992_read_power_alarm()
664 static int ltc2992_read_power(struct device *dev, u32 attr, int channel, long *val) in ltc2992_read_power() argument
671 reg = LTC2992_POWER(channel); in ltc2992_read_power()
674 reg = LTC2992_POWER_MIN(channel); in ltc2992_read_power()
677 reg = LTC2992_POWER_MAX(channel); in ltc2992_read_power()
680 reg = LTC2992_POWER_MIN_THRESH(channel); in ltc2992_read_power()
683 reg = LTC2992_POWER_MAX_THRESH(channel); in ltc2992_read_power()
687 return ltc2992_read_power_alarm(st, channel, val, attr); in ltc2992_read_power()
689 return -EOPNOTSUPP; in ltc2992_read_power()
692 return ltc2992_get_power(st, reg, channel, val); in ltc2992_read_power()
695 static int ltc2992_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, in ltc2992_read() argument
700 return ltc2992_read_in(dev, attr, channel, val); in ltc2992_read()
702 return ltc2992_read_curr(dev, attr, channel, val); in ltc2992_read()
704 return ltc2992_read_power(dev, attr, channel, val); in ltc2992_read()
706 return -EOPNOTSUPP; in ltc2992_read()
710 static int ltc2992_write_curr(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_curr() argument
717 reg = LTC2992_DSENSE_MIN_THRESH(channel); in ltc2992_write_curr()
720 reg = LTC2992_DSENSE_MAX_THRESH(channel); in ltc2992_write_curr()
723 return -EOPNOTSUPP; in ltc2992_write_curr()
726 return ltc2992_set_current(st, reg, channel, val); in ltc2992_write_curr()
742 return -EOPNOTSUPP; in ltc2992_write_gpios_in()
748 static int ltc2992_write_in(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_in() argument
753 if (channel > 1) in ltc2992_write_in()
754 return ltc2992_write_gpios_in(dev, attr, channel - 2, val); in ltc2992_write_in()
758 reg = LTC2992_SENSE_MIN_THRESH(channel); in ltc2992_write_in()
761 reg = LTC2992_SENSE_MAX_THRESH(channel); in ltc2992_write_in()
764 return -EOPNOTSUPP; in ltc2992_write_in()
770 static int ltc2992_write_power(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_power() argument
777 reg = LTC2992_POWER_MIN_THRESH(channel); in ltc2992_write_power()
780 reg = LTC2992_POWER_MAX_THRESH(channel); in ltc2992_write_power()
783 return -EOPNOTSUPP; in ltc2992_write_power()
786 return ltc2992_set_power(st, reg, channel, val); in ltc2992_write_power()
789 static int ltc2992_write_chip(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_chip() argument
795 return regmap_update_bits(st->regmap, LTC2992_CTRLB, LTC2992_RESET_HISTORY, in ltc2992_write_chip()
798 return -EOPNOTSUPP; in ltc2992_write_chip()
802 static int ltc2992_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, in ltc2992_write() argument
807 return ltc2992_write_chip(dev, attr, channel, val); in ltc2992_write()
809 return ltc2992_write_in(dev, attr, channel, val); in ltc2992_write()
811 return ltc2992_write_curr(dev, attr, channel, val); in ltc2992_write()
813 return ltc2992_write_power(dev, attr, channel, val); in ltc2992_write()
815 return -EOPNOTSUPP; in ltc2992_write()
871 device_for_each_child_node_scoped(&st->client->dev, child) { in ltc2992_parse_dt()
876 if (addr > 1) in ltc2992_parse_dt()
877 return -EINVAL; in ltc2992_parse_dt()
879 ret = fwnode_property_read_u32(child, "shunt-resistor-micro-ohms", &val); in ltc2992_parse_dt()
882 return dev_err_probe(&st->client->dev, -EINVAL, in ltc2992_parse_dt()
885 st->r_sense_uohm[addr] = val; in ltc2992_parse_dt()
898 st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL); in ltc2992_i2c_probe()
900 return -ENOMEM; in ltc2992_i2c_probe()
902 st->client = client; in ltc2992_i2c_probe()
903 st->regmap = devm_regmap_init_i2c(client, <c2992_regmap_config); in ltc2992_i2c_probe()
904 if (IS_ERR(st->regmap)) in ltc2992_i2c_probe()
905 return PTR_ERR(st->regmap); in ltc2992_i2c_probe()
915 hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, client->name, st, in ltc2992_i2c_probe()