Lines Matching +full:attr +full:- +full:max +full:- +full:name

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)
121 u8 max; member
135 .max = LTC2992_G1_MAX,
147 .max = LTC2992_G2_MAX,
159 .max = LTC2992_G3_MAX,
171 .max = LTC2992_G4_MAX,
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()
242 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_get_multiple()
244 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_get_multiple()
265 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_set()
268 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set()
276 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set()
295 mutex_lock(&st->gpio_mutex); in ltc2992_gpio_set_multiple()
298 mutex_unlock(&st->gpio_mutex); in ltc2992_gpio_set_multiple()
303 const char *name = dev_name(&st->client->dev); in ltc2992_config_gpio() local
312 mutex_init(&st->gpio_mutex); in ltc2992_config_gpio()
314 for (i = 0; i < ARRAY_SIZE(st->gpio_names); i++) { in ltc2992_config_gpio()
315 gpio_name = devm_kasprintf(&st->client->dev, GFP_KERNEL, "ltc2992-%x-%s", in ltc2992_config_gpio()
316 st->client->addr, ltc2992_gpio_names[i]); in ltc2992_config_gpio()
318 return -ENOMEM; in ltc2992_config_gpio()
320 st->gpio_names[i] = gpio_name; in ltc2992_config_gpio()
323 st->gc.label = name; in ltc2992_config_gpio()
324 st->gc.parent = &st->client->dev; in ltc2992_config_gpio()
325 st->gc.owner = THIS_MODULE; in ltc2992_config_gpio()
326 st->gc.can_sleep = true; in ltc2992_config_gpio()
327 st->gc.base = -1; in ltc2992_config_gpio()
328 st->gc.names = st->gpio_names; in ltc2992_config_gpio()
329 st->gc.ngpio = ARRAY_SIZE(st->gpio_names); in ltc2992_config_gpio()
330 st->gc.get = ltc2992_gpio_get; in ltc2992_config_gpio()
331 st->gc.get_multiple = ltc2992_gpio_get_multiple; in ltc2992_config_gpio()
332 st->gc.set = ltc2992_gpio_set; in ltc2992_config_gpio()
333 st->gc.set_multiple = ltc2992_gpio_set_multiple; in ltc2992_config_gpio()
335 ret = devm_gpiochip_add_data(&st->client->dev, &st->gc, st); in ltc2992_config_gpio()
337 dev_err(&st->client->dev, "GPIO registering failed (%d)\n", ret); in ltc2992_config_gpio()
342 static umode_t ltc2992_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr, in ltc2992_is_visible() argument
349 switch (attr) { in ltc2992_is_visible()
355 switch (attr) { in ltc2992_is_visible()
368 switch (attr) { in ltc2992_is_visible()
374 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
379 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
385 switch (attr) { in ltc2992_is_visible()
391 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
396 if (st->r_sense_uohm[channel]) in ltc2992_is_visible()
430 static int ltc2992_read_gpio_alarm(struct ltc2992_state *st, int nr_gpio, u32 attr, long *val) in ltc2992_read_gpio_alarm() argument
435 if (attr == hwmon_in_max_alarm) in ltc2992_read_gpio_alarm()
450 static int ltc2992_read_gpios_in(struct device *dev, u32 attr, int nr_gpio, long *val) in ltc2992_read_gpios_in() argument
455 switch (attr) { in ltc2992_read_gpios_in()
463 reg = ltc2992_gpio_addr_map[nr_gpio].max; in ltc2992_read_gpios_in()
473 return ltc2992_read_gpio_alarm(st, nr_gpio, attr, val); in ltc2992_read_gpios_in()
475 return -EOPNOTSUPP; in ltc2992_read_gpios_in()
481 static int ltc2992_read_in_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr) in ltc2992_read_in_alarm() argument
486 if (attr == hwmon_in_max_alarm) in ltc2992_read_in_alarm()
501 static int ltc2992_read_in(struct device *dev, u32 attr, int channel, long *val) in ltc2992_read_in() argument
507 return ltc2992_read_gpios_in(dev, attr, channel - 2, val); in ltc2992_read_in()
509 switch (attr) { in ltc2992_read_in()
527 return ltc2992_read_in_alarm(st, channel, val, attr); in ltc2992_read_in()
529 return -EOPNOTSUPP; in ltc2992_read_in()
544 *val = DIV_ROUND_CLOSEST(reg_val * LTC2992_IADC_NANOV_LSB, st->r_sense_uohm[channel]); in ltc2992_get_current()
553 reg_val = DIV_ROUND_CLOSEST(val * st->r_sense_uohm[channel], LTC2992_IADC_NANOV_LSB); in ltc2992_set_current()
559 static int ltc2992_read_curr_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr) in ltc2992_read_curr_alarm() argument
564 if (attr == hwmon_curr_max_alarm) in ltc2992_read_curr_alarm()
579 static int ltc2992_read_curr(struct device *dev, u32 attr, int channel, long *val) in ltc2992_read_curr() argument
584 switch (attr) { in ltc2992_read_curr()
602 return ltc2992_read_curr_alarm(st, channel, val, attr); in ltc2992_read_curr()
604 return -EOPNOTSUPP; in ltc2992_read_curr()
619 st->r_sense_uohm[channel] * 1000); in ltc2992_get_power()
628 reg_val = mul_u64_u32_div(val, st->r_sense_uohm[channel] * 1000, in ltc2992_set_power()
634 static int ltc2992_read_power_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr) in ltc2992_read_power_alarm() argument
639 if (attr == hwmon_power_max_alarm) in ltc2992_read_power_alarm()
654 static int ltc2992_read_power(struct device *dev, u32 attr, int channel, long *val) in ltc2992_read_power() argument
659 switch (attr) { in ltc2992_read_power()
677 return ltc2992_read_power_alarm(st, channel, val, attr); in ltc2992_read_power()
679 return -EOPNOTSUPP; in ltc2992_read_power()
685 static int ltc2992_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, in ltc2992_read() argument
690 return ltc2992_read_in(dev, attr, channel, val); in ltc2992_read()
692 return ltc2992_read_curr(dev, attr, channel, val); in ltc2992_read()
694 return ltc2992_read_power(dev, attr, channel, val); in ltc2992_read()
696 return -EOPNOTSUPP; in ltc2992_read()
700 static int ltc2992_write_curr(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_curr() argument
705 switch (attr) { in ltc2992_write_curr()
713 return -EOPNOTSUPP; in ltc2992_write_curr()
719 static int ltc2992_write_gpios_in(struct device *dev, u32 attr, int nr_gpio, long val) in ltc2992_write_gpios_in() argument
724 switch (attr) { in ltc2992_write_gpios_in()
732 return -EOPNOTSUPP; in ltc2992_write_gpios_in()
738 static int ltc2992_write_in(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_in() argument
744 return ltc2992_write_gpios_in(dev, attr, channel - 2, val); in ltc2992_write_in()
746 switch (attr) { in ltc2992_write_in()
754 return -EOPNOTSUPP; in ltc2992_write_in()
760 static int ltc2992_write_power(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_power() argument
765 switch (attr) { in ltc2992_write_power()
773 return -EOPNOTSUPP; in ltc2992_write_power()
779 static int ltc2992_write_chip(struct device *dev, u32 attr, int channel, long val) in ltc2992_write_chip() argument
783 switch (attr) { in ltc2992_write_chip()
785 return regmap_update_bits(st->regmap, LTC2992_CTRLB, LTC2992_RESET_HISTORY, in ltc2992_write_chip()
788 return -EOPNOTSUPP; in ltc2992_write_chip()
792 static int ltc2992_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, in ltc2992_write() argument
797 return ltc2992_write_chip(dev, attr, channel, val); in ltc2992_write()
799 return ltc2992_write_in(dev, attr, channel, val); in ltc2992_write()
801 return ltc2992_write_curr(dev, attr, channel, val); in ltc2992_write()
803 return ltc2992_write_power(dev, attr, channel, val); in ltc2992_write()
805 return -EOPNOTSUPP; in ltc2992_write()
861 device_for_each_child_node_scoped(&st->client->dev, child) { in ltc2992_parse_dt()
867 return -EINVAL; in ltc2992_parse_dt()
869 ret = fwnode_property_read_u32(child, "shunt-resistor-micro-ohms", &val); in ltc2992_parse_dt()
872 return dev_err_probe(&st->client->dev, -EINVAL, in ltc2992_parse_dt()
875 st->r_sense_uohm[addr] = val; in ltc2992_parse_dt()
888 st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL); in ltc2992_i2c_probe()
890 return -ENOMEM; in ltc2992_i2c_probe()
892 st->client = client; in ltc2992_i2c_probe()
893 st->regmap = devm_regmap_init_i2c(client, &ltc2992_regmap_config); in ltc2992_i2c_probe()
894 if (IS_ERR(st->regmap)) in ltc2992_i2c_probe()
895 return PTR_ERR(st->regmap); in ltc2992_i2c_probe()
905 hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, client->name, st, in ltc2992_i2c_probe()
925 .name = "ltc2992",