Lines Matching +full:shunt +full:- +full:resistor +full:- +full:micro +full:- +full:ohms
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * isl28022.c - driver for Renesas ISL28022 power monitor chip monitoring
5 * Copyright (c) 2023 Carsten Spieß <mail@carsten-spiess.de>
42 /* shunt ADC settings */
62 /* shunt voltage range */
66 #define ISL28022_PG_40 0x0 /* +/-40 mV */
67 #define ISL28022_PG_80 0x1 /* +/-80 mV */
68 #define ISL28022_PG_160 0x2 /* +/-160 mV */
69 #define ISL28022_PG_320 0x3 /* +/-3200 mV */
84 u32 shunt; member
100 err = regmap_read(data->regmap, in isl28022_read_in()
108 return -EOPNOTSUPP; in isl28022_read_in()
114 err = regmap_read(data->regmap, in isl28022_read_in()
118 switch (data->gain) { in isl28022_read_in()
121 *val = (long)((((u16)regval) & 0x7FFF) - in isl28022_read_in()
126 *val = (long)((((u16)regval) & 0x3FFF) - in isl28022_read_in()
131 *val = (long)((((u16)regval) & 0x1FFF) - in isl28022_read_in()
136 *val = (long)((((u16)regval) & 0x0FFF) - in isl28022_read_in()
142 return -EOPNOTSUPP; in isl28022_read_in()
146 return -EOPNOTSUPP; in isl28022_read_in()
160 err = regmap_read(data->regmap, in isl28022_read_current()
164 *val = ((long)regval * 1250L * (long)data->gain) / in isl28022_read_current()
165 (long)data->shunt; in isl28022_read_current()
168 return -EOPNOTSUPP; in isl28022_read_current()
182 err = regmap_read(data->regmap, in isl28022_read_power()
186 *val = ((51200000L * ((long)data->gain)) / in isl28022_read_power()
187 (long)data->shunt) * (long)regval; in isl28022_read_power()
190 return -EOPNOTSUPP; in isl28022_read_power()
207 return -EOPNOTSUPP; in isl28022_read()
249 HWMON_I_INPUT), /* channel 1: shunt voltage (mV) */
311 struct isl28022_data *data = seqf->private; in shunt_voltage_show()
315 err = regmap_read(data->regmap, in shunt_voltage_show()
320 /* print shunt voltage in micro volt */ in shunt_voltage_show()
339 scnprintf(name, sizeof(name), "%d-%04hx", client->adapter->nr, client->addr); in isl28022_debugfs_init()
344 devm_add_action_or_reset(&client->dev, isl28022_debugfs_remove, debugfs); in isl28022_debugfs_init()
350 * following values for shunt range and resistor are allowed:
351 * 40 mV -> gain 1, shunt min. 800 micro ohms
352 * 80 mV -> gain 2, shunt min. 1600 micro ohms
353 * 160 mV -> gain 4, shunt min. 3200 micro ohms
354 * 320 mV -> gain 8, shunt min. 6400 micro ohms
361 err = device_property_read_u32(dev, "shunt-resistor-micro-ohms", &val); in isl28022_read_properties()
362 if (err == -EINVAL) in isl28022_read_properties()
366 data->shunt = val; in isl28022_read_properties()
368 err = device_property_read_u32(dev, "renesas,shunt-range-microvolt", &val); in isl28022_read_properties()
369 if (err == -EINVAL) in isl28022_read_properties()
376 data->gain = 1; in isl28022_read_properties()
377 if (data->shunt < 800) in isl28022_read_properties()
381 data->gain = 2; in isl28022_read_properties()
382 if (data->shunt < 1600) in isl28022_read_properties()
386 data->gain = 4; in isl28022_read_properties()
387 if (data->shunt < 3200) in isl28022_read_properties()
391 data->gain = 8; in isl28022_read_properties()
392 if (data->shunt < 6400) in isl28022_read_properties()
396 return dev_err_probe(dev, -EINVAL, in isl28022_read_properties()
397 "renesas,shunt-range-microvolt invalid value %d\n", in isl28022_read_properties()
401 err = device_property_read_u32(dev, "renesas,average-samples", &val); in isl28022_read_properties()
402 if (err == -EINVAL) in isl28022_read_properties()
407 return dev_err_probe(dev, -EINVAL, in isl28022_read_properties()
408 "renesas,average-samples invalid value %d\n", in isl28022_read_properties()
411 data->average = val; in isl28022_read_properties()
416 return dev_err_probe(dev, -EINVAL, in isl28022_read_properties()
417 "renesas,shunt-resistor-microvolt invalid value %d\n", in isl28022_read_properties()
418 data->shunt); in isl28022_read_properties()
424 * The driver supports only shunt and bus continuous ADC mode at 15bit resolution
426 * Shunt voltage gain 1,2,4 or 8 is allowed.
437 (__ffs(data->gain) << ISL28022_PG_SHIFT) | in isl28022_config()
438 ((ISL28022_ADC_15_1 + __ffs(data->average)) << ISL28022_SADC_SHIFT) | in isl28022_config()
439 ((ISL28022_ADC_15_1 + __ffs(data->average)) << ISL28022_BADC_SHIFT); in isl28022_config()
441 calib = data->shunt ? 0x8000 / data->gain : 0; in isl28022_config()
443 err = regmap_write(data->regmap, ISL28022_REG_CONFIG, config); in isl28022_config()
447 return regmap_write(data->regmap, ISL28022_REG_CALIB, calib); in isl28022_config()
452 struct device *dev = &client->dev; in isl28022_probe()
457 if (!i2c_check_functionality(client->adapter, in isl28022_probe()
460 return -ENODEV; in isl28022_probe()
464 return -ENOMEM; in isl28022_probe()
470 data->regmap = devm_regmap_init_i2c(client, &isl28022_regmap_config); in isl28022_probe()
471 if (IS_ERR(data->regmap)) in isl28022_probe()
472 return PTR_ERR(data->regmap); in isl28022_probe()
480 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in isl28022_probe()
530 MODULE_AUTHOR("Carsten Spieß <mail@carsten-spiess.de>");