Message ID | 20250225-initial-support-for-max77705-sensors-v1-1-2be6467628b0@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | hwmon: (max77705) add initial support | expand |
On 2/25/25 11:11, Dzmitry Sankouski wrote: > Add support for max77705 hwmon. Includes charger input, system bus, and > vbyp measurements. > > Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> > --- > Maxim MAX77705 is a Companion Power Management and Type-C interface IC. > It includes charger and fuel gauge blocks, and is capable of measuring > charger input current, system bus volatage and current, and bypass > voltage. > > This patch add support for mentioned measurements. s/This patch add/Add/ Please run checkpatch --strict and fix what it reports (mostly multi-line alignment problems and unnecessary spaces). > --- > Documentation/hwmon/index.rst | 1 + > Documentation/hwmon/max77705.rst | 39 +++++++++++++++++++++++++++++++++++++++ > MAINTAINERS | 7 +++++++ > drivers/hwmon/Kconfig | 10 ++++++++++ > drivers/hwmon/Makefile | 1 + > drivers/hwmon/max77705-hwmon.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 6 files changed, 318 insertions(+) > > diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst > index 874f8fd26325..444c7865f74f 100644 > --- a/Documentation/hwmon/index.rst > +++ b/Documentation/hwmon/index.rst > @@ -158,6 +158,7 @@ Hardware Monitoring Kernel Drivers > max6639 > max6650 > max6697 > + max77705 > max8688 > mc13783-adc > mc34vr500 > diff --git a/Documentation/hwmon/max77705.rst b/Documentation/hwmon/max77705.rst > new file mode 100644 > index 000000000000..9037226c50b9 > --- /dev/null > +++ b/Documentation/hwmon/max77705.rst > @@ -0,0 +1,39 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +Kernel driver max77705 > +==================== > + > +Supported chips: > + > + * Maxim Integrated MAX77705 > + > + Prefix: 'max77705' > + > + Addresses scanned: none > + > + Datasheet: Not available > + > +Authors: > + - Dzmitry Sankouski <dsankouski@gmail.com> > + > +Description > +----------- > + > +The MAX77705 PMIC provides current and voltage measurements besides fuelgauge: > +- chip input current > +- system bus current and voltage > +- VBYP voltage > + > +Sysfs Attributes > +---------------- > + > +================= ======================================== > +in1_label "vbyp" > +in1_input Measured chip vbyp voltage > +in2_label "vsys" > +in2_input Measured chip system bus voltage > +curr1_label "iin" > +curr1_input Measured chip input current. > +curr2_label "isys" > +curr2_input Measured chip system bus current. > +================= ======================================== > diff --git a/MAINTAINERS b/MAINTAINERS > index f076360ce3c6..b6e970731928 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -18025,6 +18025,13 @@ S: Maintained > F: Documentation/hwmon/pc87427.rst > F: drivers/hwmon/pc87427.c > > +MAX77705 HARDWARE MONITORING DRIVER > +M: Dzmitry Sankouski <dsankouski@gmail.com> > +L: linux-hwmon@vger.kernel.org > +S: Maintained > +F: Documentation/hwmon/max77705.rst > +F: drivers/hwmon/max77705-hwmon.c > + > PCA9532 LED DRIVER > M: Riku Voipio <riku.voipio@iki.fi> > S: Maintained > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig > index f114d0c55d78..17b2e1b535eb 100644 > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -1287,6 +1287,16 @@ config SENSORS_MAX31790 > This driver can also be built as a module. If so, the module > will be called max31790. > > +config SENSORS_MAX77705 > + tristate "MAX77705 current and voltage sensor" > + depends on I2C > + select REGMAP_I2C > + help > + If you say yes here you get support for MAX77705 sensors connected with I2C. > + > + This driver can also be built as a module. If so, the module > + will be called max77705-hwmon. > + > config SENSORS_MC34VR500 > tristate "NXP MC34VR500 hardware monitoring driver" > depends on I2C > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > index b7ef0f0562d3..ff69f45eca50 100644 > --- a/drivers/hwmon/Makefile > +++ b/drivers/hwmon/Makefile > @@ -159,6 +159,7 @@ obj-$(CONFIG_SENSORS_MAX6650) += max6650.o > obj-$(CONFIG_SENSORS_MAX6697) += max6697.o > obj-$(CONFIG_SENSORS_MAX31790) += max31790.o > obj-$(CONFIG_MAX31827) += max31827.o > +obj-$(CONFIG_SENSORS_MAX77705) += max77705-hwmon.o > obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o > obj-$(CONFIG_SENSORS_MC34VR500) += mc34vr500.o > obj-$(CONFIG_SENSORS_MCP3021) += mcp3021.o > diff --git a/drivers/hwmon/max77705-hwmon.c b/drivers/hwmon/max77705-hwmon.c > new file mode 100644 > index 000000000000..3218e9f5a726 > --- /dev/null > +++ b/drivers/hwmon/max77705-hwmon.c > @@ -0,0 +1,260 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * MAX77705 voltage and current hwmon driver. > + * > + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.com> > + */ > + > +#include <linux/module.h> > +#include <linux/kernel.h> > +#include <linux/platform_device.h> > +#include <linux/mfd/max77705-private.h> > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/regmap.h> > +#include <linux/jiffies.h> > +#include <linux/slab.h> > +#include <linux/i2c.h> > +#include <linux/err.h> Aplphabetic order, please. > + > +struct max77705_hwmon { > + struct regmap *regmap; > +}; Unnecessary structure. Just point to regmap directly if nothing else is needed. > + > +struct channel_desc { > + u8 reg; > + u8 avg_reg; > + const char *const label; > + // register resolution. nano Volts for voltage, nano Amperes for current > + u64 resolution; Why u64 ? > +}; > + > +static const struct channel_desc current_channel_desc[] = { > + { > + .reg = IIN_REG, > + .label = "IIN_REG", > + .resolution = 125000 > + }, > + { > + .reg = ISYS_REG, > + .avg_reg = AVGISYS_REG, > + .label = "ISYS_REG", > + .resolution = 312500 > + } > +}; > + > +static const struct channel_desc voltage_channel_desc[] = { > + { > + .reg = VBYP_REG, > + .label = "VBYP_REG", > + .resolution = 427246 > + }, > + { > + .reg = VSYS_REG, > + .label = "VSYS_REG", > + .resolution = 156250 > + } > +}; > + > +static const struct regmap_range max77705_hwmon_readable_ranges[] = { > + regmap_reg_range(AVGISYS_REG, AVGISYS_REG + 1), > + regmap_reg_range(IIN_REG, IIN_REG + 1), > + regmap_reg_range(ISYS_REG, ISYS_REG + 1), > + regmap_reg_range(VBYP_REG, VBYP_REG + 1), > + regmap_reg_range(VSYS_REG, VSYS_REG + 1), > +}; > + > +static const struct regmap_access_table max77705_hwmon_readable_table = { > + .yes_ranges = max77705_hwmon_readable_ranges, > + .n_yes_ranges = ARRAY_SIZE(max77705_hwmon_readable_ranges), > +}; > + > +static const struct regmap_config max77705_hwmon_regmap_config = { > + .name = "max77705_hwmon", > + .reg_bits = 8, > + .val_bits = 16, > + .rd_table = &max77705_hwmon_readable_table, > + .max_register = MAX77705_FG_END, > + .val_format_endian = REGMAP_ENDIAN_LITTLE > +}; > + > +static umode_t max77705_is_visible(const void *data, > + enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + switch (type) { > + case hwmon_in: > + if (channel >= ARRAY_SIZE(voltage_channel_desc)) > + return 0; > + > + switch (attr) { > + case hwmon_in_input: > + case hwmon_in_label: > + return 0444; > + default: > + break; > + } > + break; > + case hwmon_curr: > + if (channel >= ARRAY_SIZE(current_channel_desc)) > + return 0; > + > + switch (attr) { > + case hwmon_curr_input: > + case hwmon_in_label: > + return 0444; > + default: > + break; > + } > + break; > + default: > + break; > + } > + return 0; > +} > + > +static int max77705_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, const char **buf) > +{ > + switch (type) { > + case hwmon_curr: > + switch (attr) { > + case hwmon_in_label: > + *buf = current_channel_desc[channel].label; > + return 0; > + default: > + return -EOPNOTSUPP; > + } > + > + case hwmon_in: > + switch (attr) { > + case hwmon_in_label: > + *buf = voltage_channel_desc[channel].label; > + return 0; > + default: > + return -EOPNOTSUPP; > + } > + default: > + return -EOPNOTSUPP; > + } > +} > + > +static int max77705_read(struct device *dev, enum hwmon_sensor_types type, > + u32 attr, int channel, long *val) > +{ > + struct max77705_hwmon *drv_data = dev_get_drvdata(dev); > + struct regmap *regmap = drv_data->regmap; > + u8 reg; > + u32 regval; > + u64 res; > + int ret; > + > + switch (type) { > + case hwmon_curr: > + switch (attr) { > + case hwmon_curr_input: > + reg = current_channel_desc[channel].reg; > + res = current_channel_desc[channel].resolution; > + ret = regmap_read(regmap, reg, ®val); > + if (ret < 0) > + return ret; > + *val = mult_frac((long) regval, res, 1000000); > + return 0; > + case hwmon_curr_average: > + reg = current_channel_desc[channel].avg_reg; > + res = current_channel_desc[channel].resolution; > + if (reg) { reg is 0 for current channel 0. That should be addressed in the is_visible function, and the attribute should not exist for curent channel 0. Checking it here is wrong. > + ret = regmap_read(regmap, reg, ®val); > + if (ret < 0) > + return ret; > + *val = mult_frac((long) regval, res, 1000000); > + } > + return 0; > + > + default: > + return -EOPNOTSUPP; > + } > + > + case hwmon_in: > + switch (attr) { > + case hwmon_in_input: > + reg = voltage_channel_desc[channel].reg; > + res = voltage_channel_desc[channel].resolution; > + ret = regmap_read(regmap, reg, ®val); > + if (ret < 0) > + return ret; > + *val = mult_frac((long) regval, res, 1000000); > + return 0; > + default: > + return -EOPNOTSUPP; > + } > + default: > + return -EOPNOTSUPP; > + } > + > + return 0; > +} > + > +static const struct hwmon_ops max77705_hwmon_ops = { > + .is_visible = max77705_is_visible, > + .read = max77705_read, > + .read_string = max77705_read_string, > +}; > + > +static const struct hwmon_channel_info *max77705_info[] = { > + HWMON_CHANNEL_INFO(in, > + HWMON_I_INPUT | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_LABEL > + ), > + HWMON_CHANNEL_INFO(curr, > + HWMON_C_INPUT | HWMON_C_AVERAGE | HWMON_C_LABEL, > + HWMON_C_INPUT | HWMON_C_LABEL > + ), > + NULL > +}; > + > +static const struct hwmon_chip_info max77705_chip_info = { > + .ops = &max77705_hwmon_ops, > + .info = max77705_info, > +}; > + > +static int max77705_hwmon_probe(struct platform_device *pdev) > +{ > + struct i2c_client *i2c; > + struct device *hwmon_dev; > + struct max77705_hwmon *drv_data; > + > + drv_data = devm_kzalloc(&pdev->dev, sizeof(struct max77705_hwmon), > + GFP_KERNEL); > + if (!drv_data) > + return -ENOMEM; > + > + i2c = to_i2c_client(pdev->dev.parent); > + drv_data->regmap = devm_regmap_init_i2c(i2c, &max77705_hwmon_regmap_config); This is unusual for an mfd driver. Why not pass regmap from the parent driver ? > + if (IS_ERR(drv_data->regmap)) > + return dev_err_probe(&pdev->dev, PTR_ERR(drv_data->regmap), > + "Failed to register max77705 hwmon regmap\n"); > + > + hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "max77705", drv_data, > + &max77705_chip_info, NULL); > + if (IS_ERR(hwmon_dev)) { > + return dev_err_probe(&i2c->dev, PTR_ERR(hwmon_dev), > + "Unable to register hwmon device\n"); > + } > + > + return 0; > +}; > + > +static struct platform_driver max77705_hwmon_driver = { > + .driver = { > + .name = "max77705-hwmon", > + }, > + .probe = max77705_hwmon_probe, > +}; > + > +module_platform_driver(max77705_hwmon_driver); > + > +MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>"); > +MODULE_DESCRIPTION("MAX77705 monitor driver"); > +MODULE_LICENSE("GPL"); > + > > --- > base-commit: d4b0fd87ff0d4338b259dc79b2b3c6f7e70e8afa > change-id: 20250123-initial-support-for-max77705-sensors-ad0170ac1ec5 > > Best regards,
Le 25/02/2025 à 20:11, Dzmitry Sankouski a écrit : > Add support for max77705 hwmon. Includes charger input, system bus, and > vbyp measurements. > > Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> ... > +static int max77705_hwmon_probe(struct platform_device *pdev) > +{ > + struct i2c_client *i2c; > + struct device *hwmon_dev; > + struct max77705_hwmon *drv_data; > + > + drv_data = devm_kzalloc(&pdev->dev, sizeof(struct max77705_hwmon), > + GFP_KERNEL); > + if (!drv_data) > + return -ENOMEM; > + > + i2c = to_i2c_client(pdev->dev.parent); > + drv_data->regmap = devm_regmap_init_i2c(i2c, &max77705_hwmon_regmap_config); > + if (IS_ERR(drv_data->regmap)) > + return dev_err_probe(&pdev->dev, PTR_ERR(drv_data->regmap), > + "Failed to register max77705 hwmon regmap\n"); > + > + hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "max77705", drv_data, > + &max77705_chip_info, NULL); > + if (IS_ERR(hwmon_dev)) { > + return dev_err_probe(&i2c->dev, PTR_ERR(hwmon_dev), No strong opinion, but why &i2c->dev and not &pdev->dev? > + "Unable to register hwmon device\n"); > + } Extra { } can be removed, as done a few lines above > + > + return 0; > +}; > + ... CJ
diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst index 874f8fd26325..444c7865f74f 100644 --- a/Documentation/hwmon/index.rst +++ b/Documentation/hwmon/index.rst @@ -158,6 +158,7 @@ Hardware Monitoring Kernel Drivers max6639 max6650 max6697 + max77705 max8688 mc13783-adc mc34vr500 diff --git a/Documentation/hwmon/max77705.rst b/Documentation/hwmon/max77705.rst new file mode 100644 index 000000000000..9037226c50b9 --- /dev/null +++ b/Documentation/hwmon/max77705.rst @@ -0,0 +1,39 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Kernel driver max77705 +==================== + +Supported chips: + + * Maxim Integrated MAX77705 + + Prefix: 'max77705' + + Addresses scanned: none + + Datasheet: Not available + +Authors: + - Dzmitry Sankouski <dsankouski@gmail.com> + +Description +----------- + +The MAX77705 PMIC provides current and voltage measurements besides fuelgauge: +- chip input current +- system bus current and voltage +- VBYP voltage + +Sysfs Attributes +---------------- + +================= ======================================== +in1_label "vbyp" +in1_input Measured chip vbyp voltage +in2_label "vsys" +in2_input Measured chip system bus voltage +curr1_label "iin" +curr1_input Measured chip input current. +curr2_label "isys" +curr2_input Measured chip system bus current. +================= ======================================== diff --git a/MAINTAINERS b/MAINTAINERS index f076360ce3c6..b6e970731928 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -18025,6 +18025,13 @@ S: Maintained F: Documentation/hwmon/pc87427.rst F: drivers/hwmon/pc87427.c +MAX77705 HARDWARE MONITORING DRIVER +M: Dzmitry Sankouski <dsankouski@gmail.com> +L: linux-hwmon@vger.kernel.org +S: Maintained +F: Documentation/hwmon/max77705.rst +F: drivers/hwmon/max77705-hwmon.c + PCA9532 LED DRIVER M: Riku Voipio <riku.voipio@iki.fi> S: Maintained diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index f114d0c55d78..17b2e1b535eb 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1287,6 +1287,16 @@ config SENSORS_MAX31790 This driver can also be built as a module. If so, the module will be called max31790. +config SENSORS_MAX77705 + tristate "MAX77705 current and voltage sensor" + depends on I2C + select REGMAP_I2C + help + If you say yes here you get support for MAX77705 sensors connected with I2C. + + This driver can also be built as a module. If so, the module + will be called max77705-hwmon. + config SENSORS_MC34VR500 tristate "NXP MC34VR500 hardware monitoring driver" depends on I2C diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index b7ef0f0562d3..ff69f45eca50 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -159,6 +159,7 @@ obj-$(CONFIG_SENSORS_MAX6650) += max6650.o obj-$(CONFIG_SENSORS_MAX6697) += max6697.o obj-$(CONFIG_SENSORS_MAX31790) += max31790.o obj-$(CONFIG_MAX31827) += max31827.o +obj-$(CONFIG_SENSORS_MAX77705) += max77705-hwmon.o obj-$(CONFIG_SENSORS_MC13783_ADC)+= mc13783-adc.o obj-$(CONFIG_SENSORS_MC34VR500) += mc34vr500.o obj-$(CONFIG_SENSORS_MCP3021) += mcp3021.o diff --git a/drivers/hwmon/max77705-hwmon.c b/drivers/hwmon/max77705-hwmon.c new file mode 100644 index 000000000000..3218e9f5a726 --- /dev/null +++ b/drivers/hwmon/max77705-hwmon.c @@ -0,0 +1,260 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * MAX77705 voltage and current hwmon driver. + * + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.com> + */ + +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/mfd/max77705-private.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/regmap.h> +#include <linux/jiffies.h> +#include <linux/slab.h> +#include <linux/i2c.h> +#include <linux/err.h> + +struct max77705_hwmon { + struct regmap *regmap; +}; + +struct channel_desc { + u8 reg; + u8 avg_reg; + const char *const label; + // register resolution. nano Volts for voltage, nano Amperes for current + u64 resolution; +}; + +static const struct channel_desc current_channel_desc[] = { + { + .reg = IIN_REG, + .label = "IIN_REG", + .resolution = 125000 + }, + { + .reg = ISYS_REG, + .avg_reg = AVGISYS_REG, + .label = "ISYS_REG", + .resolution = 312500 + } +}; + +static const struct channel_desc voltage_channel_desc[] = { + { + .reg = VBYP_REG, + .label = "VBYP_REG", + .resolution = 427246 + }, + { + .reg = VSYS_REG, + .label = "VSYS_REG", + .resolution = 156250 + } +}; + +static const struct regmap_range max77705_hwmon_readable_ranges[] = { + regmap_reg_range(AVGISYS_REG, AVGISYS_REG + 1), + regmap_reg_range(IIN_REG, IIN_REG + 1), + regmap_reg_range(ISYS_REG, ISYS_REG + 1), + regmap_reg_range(VBYP_REG, VBYP_REG + 1), + regmap_reg_range(VSYS_REG, VSYS_REG + 1), +}; + +static const struct regmap_access_table max77705_hwmon_readable_table = { + .yes_ranges = max77705_hwmon_readable_ranges, + .n_yes_ranges = ARRAY_SIZE(max77705_hwmon_readable_ranges), +}; + +static const struct regmap_config max77705_hwmon_regmap_config = { + .name = "max77705_hwmon", + .reg_bits = 8, + .val_bits = 16, + .rd_table = &max77705_hwmon_readable_table, + .max_register = MAX77705_FG_END, + .val_format_endian = REGMAP_ENDIAN_LITTLE +}; + +static umode_t max77705_is_visible(const void *data, + enum hwmon_sensor_types type, + u32 attr, int channel) +{ + switch (type) { + case hwmon_in: + if (channel >= ARRAY_SIZE(voltage_channel_desc)) + return 0; + + switch (attr) { + case hwmon_in_input: + case hwmon_in_label: + return 0444; + default: + break; + } + break; + case hwmon_curr: + if (channel >= ARRAY_SIZE(current_channel_desc)) + return 0; + + switch (attr) { + case hwmon_curr_input: + case hwmon_in_label: + return 0444; + default: + break; + } + break; + default: + break; + } + return 0; +} + +static int max77705_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, const char **buf) +{ + switch (type) { + case hwmon_curr: + switch (attr) { + case hwmon_in_label: + *buf = current_channel_desc[channel].label; + return 0; + default: + return -EOPNOTSUPP; + } + + case hwmon_in: + switch (attr) { + case hwmon_in_label: + *buf = voltage_channel_desc[channel].label; + return 0; + default: + return -EOPNOTSUPP; + } + default: + return -EOPNOTSUPP; + } +} + +static int max77705_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + struct max77705_hwmon *drv_data = dev_get_drvdata(dev); + struct regmap *regmap = drv_data->regmap; + u8 reg; + u32 regval; + u64 res; + int ret; + + switch (type) { + case hwmon_curr: + switch (attr) { + case hwmon_curr_input: + reg = current_channel_desc[channel].reg; + res = current_channel_desc[channel].resolution; + ret = regmap_read(regmap, reg, ®val); + if (ret < 0) + return ret; + *val = mult_frac((long) regval, res, 1000000); + return 0; + case hwmon_curr_average: + reg = current_channel_desc[channel].avg_reg; + res = current_channel_desc[channel].resolution; + if (reg) { + ret = regmap_read(regmap, reg, ®val); + if (ret < 0) + return ret; + *val = mult_frac((long) regval, res, 1000000); + } + return 0; + + default: + return -EOPNOTSUPP; + } + + case hwmon_in: + switch (attr) { + case hwmon_in_input: + reg = voltage_channel_desc[channel].reg; + res = voltage_channel_desc[channel].resolution; + ret = regmap_read(regmap, reg, ®val); + if (ret < 0) + return ret; + *val = mult_frac((long) regval, res, 1000000); + return 0; + default: + return -EOPNOTSUPP; + } + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static const struct hwmon_ops max77705_hwmon_ops = { + .is_visible = max77705_is_visible, + .read = max77705_read, + .read_string = max77705_read_string, +}; + +static const struct hwmon_channel_info *max77705_info[] = { + HWMON_CHANNEL_INFO(in, + HWMON_I_INPUT | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_LABEL + ), + HWMON_CHANNEL_INFO(curr, + HWMON_C_INPUT | HWMON_C_AVERAGE | HWMON_C_LABEL, + HWMON_C_INPUT | HWMON_C_LABEL + ), + NULL +}; + +static const struct hwmon_chip_info max77705_chip_info = { + .ops = &max77705_hwmon_ops, + .info = max77705_info, +}; + +static int max77705_hwmon_probe(struct platform_device *pdev) +{ + struct i2c_client *i2c; + struct device *hwmon_dev; + struct max77705_hwmon *drv_data; + + drv_data = devm_kzalloc(&pdev->dev, sizeof(struct max77705_hwmon), + GFP_KERNEL); + if (!drv_data) + return -ENOMEM; + + i2c = to_i2c_client(pdev->dev.parent); + drv_data->regmap = devm_regmap_init_i2c(i2c, &max77705_hwmon_regmap_config); + if (IS_ERR(drv_data->regmap)) + return dev_err_probe(&pdev->dev, PTR_ERR(drv_data->regmap), + "Failed to register max77705 hwmon regmap\n"); + + hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "max77705", drv_data, + &max77705_chip_info, NULL); + if (IS_ERR(hwmon_dev)) { + return dev_err_probe(&i2c->dev, PTR_ERR(hwmon_dev), + "Unable to register hwmon device\n"); + } + + return 0; +}; + +static struct platform_driver max77705_hwmon_driver = { + .driver = { + .name = "max77705-hwmon", + }, + .probe = max77705_hwmon_probe, +}; + +module_platform_driver(max77705_hwmon_driver); + +MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>"); +MODULE_DESCRIPTION("MAX77705 monitor driver"); +MODULE_LICENSE("GPL"); +
Add support for max77705 hwmon. Includes charger input, system bus, and vbyp measurements. Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> --- Maxim MAX77705 is a Companion Power Management and Type-C interface IC. It includes charger and fuel gauge blocks, and is capable of measuring charger input current, system bus volatage and current, and bypass voltage. This patch add support for mentioned measurements. --- Documentation/hwmon/index.rst | 1 + Documentation/hwmon/max77705.rst | 39 +++++++++++++++++++++++++++++++++++++++ MAINTAINERS | 7 +++++++ drivers/hwmon/Kconfig | 10 ++++++++++ drivers/hwmon/Makefile | 1 + drivers/hwmon/max77705-hwmon.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 318 insertions(+) --- base-commit: d4b0fd87ff0d4338b259dc79b2b3c6f7e70e8afa change-id: 20250123-initial-support-for-max77705-sensors-ad0170ac1ec5 Best regards,