Lines Matching +full:x +full:- +full:mask

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
3 * LTC2992 - Dual Wide Range Power Monitor
62 #define LTC2992_POWER(x) (LTC2992_POWER1 + ((x) * 0x32)) argument
63 #define LTC2992_POWER_MAX(x) (LTC2992_POWER1_MAX + ((x) * 0x32)) argument
64 #define LTC2992_POWER_MIN(x) (LTC2992_POWER1_MIN + ((x) * 0x32)) argument
65 #define LTC2992_POWER_MAX_THRESH(x) (LTC2992_POWER1_MAX_THRESH + ((x) * 0x32)) argument
66 #define LTC2992_POWER_MIN_THRESH(x) (LTC2992_POWER1_MIN_THRESH + ((x) * 0x32)) argument
67 #define LTC2992_DSENSE(x) (LTC2992_DSENSE1 + ((x) * 0x32)) argument
68 #define LTC2992_DSENSE_MAX(x) (LTC2992_DSENSE1_MAX + ((x) * 0x32)) argument
69 #define LTC2992_DSENSE_MIN(x) (LTC2992_DSENSE1_MIN + ((x) * 0x32)) argument
70 #define LTC2992_DSENSE_MAX_THRESH(x) (LTC2992_DSENSE1_MAX_THRESH + ((x) * 0x32)) argument
71 #define LTC2992_DSENSE_MIN_THRESH(x) (LTC2992_DSENSE1_MIN_THRESH + ((x) * 0x32)) argument
72 #define LTC2992_SENSE(x) (LTC2992_SENSE1 + ((x) * 0x32)) argument
73 #define LTC2992_SENSE_MAX(x) (LTC2992_SENSE1_MAX + ((x) * 0x32)) argument
74 #define LTC2992_SENSE_MIN(x) (LTC2992_SENSE1_MIN + ((x) * 0x32)) argument
75 #define LTC2992_SENSE_MAX_THRESH(x) (LTC2992_SENSE1_MAX_THRESH + ((x) * 0x32)) argument
76 #define LTC2992_SENSE_MIN_THRESH(x) (LTC2992_SENSE1_MIN_THRESH + ((x) * 0x32)) argument
77 #define LTC2992_POWER_FAULT(x) (LTC2992_FAULT1 + ((x) * 0x32)) argument
78 #define LTC2992_SENSE_FAULT(x) (LTC2992_FAULT1 + ((x) * 0x32)) argument
79 #define LTC2992_DSENSE_FAULT(x) (LTC2992_FAULT1 + ((x) * 0x32)) argument
85 #define LTC2992_POWER_FAULT_MSK(x) (BIT(6) << (x)) argument
86 #define LTC2992_DSENSE_FAULT_MSK(x) (BIT(4) << (x)) argument
87 #define LTC2992_SENSE_FAULT_MSK(x) (BIT(2) << (x)) argument
90 #define LTC2992_GPIO1_FAULT_MSK(x) (BIT(0) << (x)) argument
93 #define LTC2992_GPIO2_FAULT_MSK(x) (BIT(0) << (x)) argument
96 #define LTC2992_GPIO3_FAULT_MSK(x) (BIT(6) << (x)) argument
97 #define LTC2992_GPIO4_FAULT_MSK(x) (BIT(4) << (x)) argument
108 #define LTC2992_GPIO_BIT(x) (LTC2992_GPIO_NR - (x) - 1) argument
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()
224 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_get()
234 static int ltc2992_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, in ltc2992_gpio_get_multiple() argument
242 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_get_multiple()
244 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_get_multiple()
251 for_each_set_bit(gpio_nr, mask, LTC2992_GPIO_NR) { in ltc2992_gpio_get_multiple()
266 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_set()
269 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set()
278 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set()
283 static int ltc2992_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask, in ltc2992_gpio_set_multiple() argument
292 for_each_set_bit(gpio_nr, mask, LTC2992_GPIO_NR) { in ltc2992_gpio_set_multiple()
300 mutex_lock(&st->gpio_mutex); 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()
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()
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()
443 u32 mask; in ltc2992_read_gpio_alarm() local
446 mask = ltc2992_gpio_addr_map[nr_gpio].max_alarm_msk; in ltc2992_read_gpio_alarm()
448 mask = ltc2992_gpio_addr_map[nr_gpio].min_alarm_msk; in ltc2992_read_gpio_alarm()
454 *val = !!(reg_val & mask); in ltc2992_read_gpio_alarm()
455 reg_val &= ~mask; in ltc2992_read_gpio_alarm()
485 return -EOPNOTSUPP; in ltc2992_read_gpios_in()
494 u32 mask; in ltc2992_read_in_alarm() local
497 mask = LTC2992_SENSE_FAULT_MSK(1); in ltc2992_read_in_alarm()
499 mask = LTC2992_SENSE_FAULT_MSK(0); in ltc2992_read_in_alarm()
505 *val = !!(reg_val & mask); in ltc2992_read_in_alarm()
506 reg_val &= ~mask; in ltc2992_read_in_alarm()
517 return ltc2992_read_gpios_in(dev, attr, channel - 2, val); in ltc2992_read_in()
539 return -EOPNOTSUPP; in ltc2992_read_in()
554 *val = DIV_ROUND_CLOSEST(reg_val * LTC2992_IADC_NANOV_LSB, st->r_sense_uohm[channel]); in ltc2992_get_current()
563 reg_val = DIV_ROUND_CLOSEST(val * st->r_sense_uohm[channel], LTC2992_IADC_NANOV_LSB); in ltc2992_set_current()
572 u32 mask; in ltc2992_read_curr_alarm() local
575 mask = LTC2992_DSENSE_FAULT_MSK(1); in ltc2992_read_curr_alarm()
577 mask = LTC2992_DSENSE_FAULT_MSK(0); in ltc2992_read_curr_alarm()
583 *val = !!(reg_val & mask); in ltc2992_read_curr_alarm()
585 reg_val &= ~mask; in ltc2992_read_curr_alarm()
614 return -EOPNOTSUPP; in ltc2992_read_curr()
629 st->r_sense_uohm[channel] * 1000); in ltc2992_get_power()
638 reg_val = mul_u64_u32_div(val, st->r_sense_uohm[channel] * 1000, in ltc2992_set_power()
647 u32 mask; in ltc2992_read_power_alarm() local
650 mask = LTC2992_POWER_FAULT_MSK(1); in ltc2992_read_power_alarm()
652 mask = LTC2992_POWER_FAULT_MSK(0); in ltc2992_read_power_alarm()
658 *val = !!(reg_val & mask); in ltc2992_read_power_alarm()
659 reg_val &= ~mask; in ltc2992_read_power_alarm()
689 return -EOPNOTSUPP; in ltc2992_read_power()
706 return -EOPNOTSUPP; in ltc2992_read()
723 return -EOPNOTSUPP; in ltc2992_write_curr()
742 return -EOPNOTSUPP; in ltc2992_write_gpios_in()
754 return ltc2992_write_gpios_in(dev, attr, channel - 2, val); in ltc2992_write_in()
764 return -EOPNOTSUPP; in ltc2992_write_in()
783 return -EOPNOTSUPP; in ltc2992_write_power()
795 return regmap_update_bits(st->regmap, LTC2992_CTRLB, LTC2992_RESET_HISTORY, in ltc2992_write_chip()
798 return -EOPNOTSUPP; in ltc2992_write_chip()
815 return -EOPNOTSUPP; in ltc2992_write()
871 device_for_each_child_node_scoped(&st->client->dev, child) { 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, &ltc2992_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()