Lines Matching +full:average +full:- +full:samples
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>
54 #define ISL28022_ADC_15_2 0x9 /* 15 bit ADC, 2 samples */
55 #define ISL28022_ADC_15_4 0xA /* 15 bit ADC, 4 samples */
56 #define ISL28022_ADC_15_8 0xB /* 15 bit ADC, 8 samples */
57 #define ISL28022_ADC_15_16 0xC /* 15 bit ADC, 16 samples */
58 #define ISL28022_ADC_15_32 0xD /* 15 bit ADC, 32 samples */
59 #define ISL28022_ADC_15_64 0xE /* 15 bit ADC, 64 samples */
60 #define ISL28022_ADC_15_128 0xF /* 15 bit ADC, 128 samples */
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 */
86 u32 average; 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()
311 struct isl28022_data *data = seqf->private; in shunt_voltage_show()
315 err = regmap_read(data->regmap, 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()
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()
425 * with averaging from 1 to 128 samples (pow of 2) on both channels.
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>");