From patchwork Mon Apr 21 18:13:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Antoine via B4 Relay X-Patchwork-Id: 883468 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0D2B1E5B99; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; cv=none; b=QpJ2nzsjst7RzeFbd+tuI4Czj3Wuw2l/yjTUKbBaxS2d44OhxZzSjTikzgje9+LE4ajrG5v5MPy3qPfMM3yK6ZxfbZovVQb5OxQCH+tN7U4JyJolooDNxR44OEROuq/FJWNV0cRWh1WKfPI+ucNbFGMbqnD5pubI22EJPedNuLM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; c=relaxed/simple; bh=wQyUeSMEJH3kxxBnB719wTNt8wGUOd00qdhNudybJVw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jLFCJk2GjKliKqf1aWugqOTw5jmYX6Hit2SSGR06sQbGcJfKGTAay9v2Cxpts4xIF4qeqE/AKXp68nBBHjsiDD656nA2pj53S9xy88Sb6techXMB88MKYCTr88c1snWRpb8cBylJXhGzkFbuKgErIjTJq7iaOVnodq1gKxL+e1Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HSQpJ7A3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HSQpJ7A3" Received: by smtp.kernel.org (Postfix) with ESMTPS id 5CA89C4AF0C; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745259232; bh=wQyUeSMEJH3kxxBnB719wTNt8wGUOd00qdhNudybJVw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=HSQpJ7A3+w/MZXqTxnu/G225UdqIKtvbNE82PK21uUHOjlxsdm7fttrqJVQXJW1Ss eJFPnahHuXffdaZV1mjwzAwPLJj40gqRYNCF2gJjAR93oWXEAUorhsRGNKVxMBQYXO HZiTtGm8s32iclV1CICPqTMrY0odlaSqYDITsXPdOfr32tFT+4iErVTocZs6A3in6/ zIKyj0+UkaiRDEan8wL9Yu0/nV4BlzNirVw0+NNdmZGMYKdIKDJPwwZSWm2tdMcGOe 7GXZzxZrREwN4bVpbMaq27POB9KKvbnnE1WOuzGotko0+2uwW9yvU+1fqRF6RRw86v s2OYpWQ75ZkCg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4EC8BC369D7; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) From: Thomas Antoine via B4 Relay Date: Mon, 21 Apr 2025 20:13:33 +0200 Subject: [PATCH v3 2/5] power: supply: add support for max77759 fuel gauge Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250421-b4-gs101_max77759_fg-v3-2-50cd8caf9017@uclouvain.be> References: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> In-Reply-To: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> To: Rob Herring , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , Catalin Marinas , Will Deacon , Sebastian Reichel , Dimitri Fedrau Cc: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Thomas Antoine X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1745259219; l=14313; i=t.antoine@uclouvain.be; s=20241202; h=from:subject:message-id; bh=ZbjNDwSRJFEoYuWbXrVTfeLtbZ5Ur0LIUfGXzuDBmv8=; b=tuTXi5j9wW62WtK/AN7rdXeNwkj/KbvJn0+/ufudihjw8p5z1B4o/rzXOPoGfY+EnlnwtwWfi RsyuHKiYll4BoD79HJDp8o+tJj9W6auIPU94lfAhA/MwabYyJGTYpsy X-Developer-Key: i=t.antoine@uclouvain.be; a=ed25519; pk=sw7UYl31W1LTpgWRiX4xIF5x6ok7YWZ6XZnHqy/d3dY= X-Endpoint-Received: by B4 Relay for t.antoine@uclouvain.be/20241202 with auth_id=289 X-Original-From: Thomas Antoine Reply-To: t.antoine@uclouvain.be From: Thomas Antoine The interface of the Maxim MAX77759 fuel gauge has a lot of common with the Maxim MAX1720x. A major difference is the lack of non-volatile memory slave address. No slave is available at address 0xb of the i2c bus, which is coherent with the following driver from google: line 5836 disables non-volatile memory for m5 gauge. Link: https://android.googlesource.com/kernel/google-modules/bms/+/1a68c36bef474573cc8629cc1d121eb6a81ab68c/max1720x_battery.c Other differences include the lack of V_BATT register to read the battery level. The voltage must instead be read from V_CELL, the lowest voltage of all cells. The mask to identify the chip is different. The computation of the charge must also be changed to take into account TASKPERIOD, which can add a factor 2 to the result. Add support for the MAX77759 by taking into account all of those differences based on chip type. Do not advertise temp probes using the non-volatile memory as those are not available. The regmap was proposed by AndrĂ© Draszik in Link: https://lore.kernel.org/all/d1bade77b5281c1de6b2ddcb4dbbd033e455a116.camel@linaro.org/ Signed-off-by: Thomas Antoine --- drivers/power/supply/max1720x_battery.c | 270 ++++++++++++++++++++++++++++---- 1 file changed, 237 insertions(+), 33 deletions(-) diff --git a/drivers/power/supply/max1720x_battery.c b/drivers/power/supply/max1720x_battery.c index cca5f8b5071fb731f9b60420239ea03d46cb1bf3..969d3a7c2baa7e1d23c5175942d975b277c8554c 100644 --- a/drivers/power/supply/max1720x_battery.c +++ b/drivers/power/supply/max1720x_battery.c @@ -37,6 +37,7 @@ #define MAX172XX_REPCAP 0x05 /* Average capacity */ #define MAX172XX_REPSOC 0x06 /* Percentage of charge */ #define MAX172XX_TEMP 0x08 /* Temperature */ +#define MAX172XX_VCELL 0x09 /* Lowest cell voltage */ #define MAX172XX_CURRENT 0x0A /* Actual current */ #define MAX172XX_AVG_CURRENT 0x0B /* Average current */ #define MAX172XX_FULL_CAP 0x10 /* Calculated full capacity */ @@ -50,19 +51,32 @@ #define MAX172XX_DEV_NAME_TYPE_MASK GENMASK(3, 0) #define MAX172XX_DEV_NAME_TYPE_MAX17201 BIT(0) #define MAX172XX_DEV_NAME_TYPE_MAX17205 (BIT(0) | BIT(2)) +#define MAX77759_DEV_NAME_TYPE_MASK GENMASK(15, 9) +#define MAX77759_DEV_NAME_TYPE_MAX77759 0x31 #define MAX172XX_QR_TABLE10 0x22 +#define MAX77759_TASKPERIOD 0x3C +#define MAX77759_TASKPERIOD_175MS 0x1680 +#define MAX77759_TASKPERIOD_351MS 0x2D00 #define MAX172XX_BATT 0xDA /* Battery voltage */ #define MAX172XX_ATAVCAP 0xDF static const char *const max1720x_manufacturer = "Maxim Integrated"; static const char *const max17201_model = "MAX17201"; static const char *const max17205_model = "MAX17205"; +static const char *const max77759_model = "MAX77759"; + +enum chip_id { + MAX1720X_ID, + MAX77759_ID, +}; struct max1720x_device_info { struct regmap *regmap; struct regmap *regmap_nv; struct i2c_client *ancillary; int rsense; + int charge_full_design; + enum chip_id id; }; /* @@ -271,6 +285,80 @@ static const enum power_supply_property max1720x_battery_props[] = { POWER_SUPPLY_PROP_MANUFACTURER, }; +/* + * Registers 0x80 up to 0xaf which contain the model for the fuel gauge + * algorithm (stored in nvmem for the max1720x) are locked. They can + * be unlocked by writing 0x59 to 0x62 and 0xc4 to 0x63. They should be + * enabled in the regmap if the driver is extended to manage the model. + */ +static const struct regmap_range max77759_registers[] = { + regmap_reg_range(0x00, 0x4f), + regmap_reg_range(0xb0, 0xbf), + regmap_reg_range(0xd0, 0xd0), + regmap_reg_range(0xdc, 0xdf), + regmap_reg_range(0xfb, 0xfb), + regmap_reg_range(0xff, 0xff), +}; + +static const struct regmap_range max77759_ro_registers[] = { + regmap_reg_range(0x3d, 0x3d), + regmap_reg_range(0xfb, 0xfb), + regmap_reg_range(0xff, 0xff), +}; + +static const struct regmap_access_table max77759_write_table = { + .no_ranges = max77759_ro_registers, + .n_no_ranges = ARRAY_SIZE(max77759_ro_registers), +}; + +static const struct regmap_access_table max77759_rd_table = { + .yes_ranges = max77759_registers, + .n_yes_ranges = ARRAY_SIZE(max77759_registers), +}; + +static const struct regmap_config max77759_regmap_cfg = { + .reg_bits = 8, + .val_bits = 16, + .max_register = 0xff, + .wr_table = &max77759_write_table, + .rd_table = &max77759_rd_table, + .val_format_endian = REGMAP_ENDIAN_LITTLE, + .cache_type = REGCACHE_NONE, +}; + +static const enum power_supply_property max77759_battery_props[] = { + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CHARGE_FULL, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_CHARGE_AVG, + POWER_SUPPLY_PROP_TEMP, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_CURRENT_AVG, + POWER_SUPPLY_PROP_MODEL_NAME, + POWER_SUPPLY_PROP_MANUFACTURER, +}; + + +struct chip_data { + bool has_nvmem; + const struct regmap_config *regmap_cfg; + enum chip_id id; +}; + +static const struct chip_data max1720x_data = { + .has_nvmem = true, + .regmap_cfg = &max1720x_regmap_cfg, + .id = MAX1720X_ID, +}; + +static const struct chip_data max77759_data = { + .has_nvmem = false, + .regmap_cfg = &max77759_regmap_cfg, + .id = MAX77759_ID, +}; + /* Convert regs value to power_supply units */ static int max172xx_time_to_ps(unsigned int reg) @@ -288,10 +376,36 @@ static int max172xx_voltage_to_ps(unsigned int reg) return reg * 1250; /* in uV */ } +static int max172xx_cell_voltage_to_ps(unsigned int reg) +{ + return reg * 625 / 8; /* in uV */ +} + static int max172xx_capacity_to_ps(unsigned int reg, - struct max1720x_device_info *info) + struct max1720x_device_info *info, + int *intval) { - return reg * (500000 / info->rsense); /* in uAh */ + int lsb = 1; + int reg_val; + int ret; + + if (info->id == MAX77759_ID) { + ret = regmap_read(info->regmap, MAX77759_TASKPERIOD, ®_val); + if (ret) + return ret; + + switch (reg_val) { + case MAX77759_TASKPERIOD_175MS: + break; + case MAX77759_TASKPERIOD_351MS: + lsb = 2; + break; + default: + return -ENODEV; + } + } + *intval = reg * (500000 / info->rsense) * lsb; /* in uAh */ + return 0; } /* @@ -306,6 +420,28 @@ static int max172xx_temperature_to_ps(unsigned int reg) return val * 10 / 256; /* in tenths of deg. C */ } +static const char *max1720x_devname_to_model(unsigned int reg_val, + union power_supply_propval *val, + struct max1720x_device_info *info) +{ + switch (info->id) { + case MAX1720X_ID: + reg_val = FIELD_GET(MAX172XX_DEV_NAME_TYPE_MASK, reg_val); + if (reg_val == MAX172XX_DEV_NAME_TYPE_MAX17201) + return max17201_model; + else if (reg_val == MAX172XX_DEV_NAME_TYPE_MAX17205) + return max17205_model; + return NULL; + case MAX77759_ID: + reg_val = FIELD_GET(MAX77759_DEV_NAME_TYPE_MASK, reg_val); + if (reg_val == MAX77759_DEV_NAME_TYPE_MAX77759) + return max77759_model; + return NULL; + default: + return NULL; + } +} + /* * Calculating current registers resolution: * @@ -390,19 +526,31 @@ static int max1720x_battery_get_property(struct power_supply *psy, val->intval = max172xx_percent_to_ps(reg_val); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: - ret = regmap_read(info->regmap, MAX172XX_BATT, ®_val); - val->intval = max172xx_voltage_to_ps(reg_val); + if (info->id == MAX1720X_ID) { + ret = regmap_read(info->regmap, MAX172XX_BATT, ®_val); + val->intval = max172xx_voltage_to_ps(reg_val); + } else if (info->id == MAX77759_ID) { + ret = regmap_read(info->regmap, MAX172XX_VCELL, ®_val); + val->intval = max172xx_cell_voltage_to_ps(reg_val); + } else + return -ENODEV; break; case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: ret = regmap_read(info->regmap, MAX172XX_DESIGN_CAP, ®_val); - val->intval = max172xx_capacity_to_ps(reg_val); + if (ret) + break; + ret = max172xx_capacity_to_ps(reg_val, info, &val->intval); break; case POWER_SUPPLY_PROP_CHARGE_AVG: ret = regmap_read(info->regmap, MAX172XX_REPCAP, ®_val); - val->intval = max172xx_capacity_to_ps(reg_val); + if (ret) + break; + + ret = max172xx_capacity_to_ps(reg_val, info, &val->intval); break; case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG: ret = regmap_read(info->regmap, MAX172XX_TTE, ®_val); + pr_info("RAW TTE: %d", reg_val); val->intval = max172xx_time_to_ps(reg_val); break; case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG: @@ -423,17 +571,15 @@ static int max1720x_battery_get_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_CHARGE_FULL: ret = regmap_read(info->regmap, MAX172XX_FULL_CAP, ®_val); - val->intval = max172xx_capacity_to_ps(reg_val); + if (ret) + break; + ret = max172xx_capacity_to_ps(reg_val, info, &val->intval); break; case POWER_SUPPLY_PROP_MODEL_NAME: ret = regmap_read(info->regmap, MAX172XX_DEV_NAME, ®_val); - reg_val = FIELD_GET(MAX172XX_DEV_NAME_TYPE_MASK, reg_val); - if (reg_val == MAX172XX_DEV_NAME_TYPE_MAX17201) - val->strval = max17201_model; - else if (reg_val == MAX172XX_DEV_NAME_TYPE_MAX17205) - val->strval = max17205_model; - else - return -ENODEV; + val->strval = max1720x_devname_to_model(reg_val, val, info); + if (!val->strval) + ret = -ENODEV; break; case POWER_SUPPLY_PROP_MANUFACTURER: val->strval = max1720x_manufacturer; @@ -527,7 +673,6 @@ static int max1720x_probe_nvmem(struct i2c_client *client, .priv = info, }; struct nvmem_device *nvmem; - unsigned int val; int ret; info->ancillary = i2c_new_ancillary_device(client, "nvmem", 0xb); @@ -549,18 +694,6 @@ static int max1720x_probe_nvmem(struct i2c_client *client, return PTR_ERR(info->regmap_nv); } - ret = regmap_read(info->regmap_nv, MAX1720X_NRSENSE, &val); - if (ret < 0) { - dev_err(dev, "Failed to read sense resistor value\n"); - return ret; - } - - info->rsense = val; - if (!info->rsense) { - dev_warn(dev, "RSense not calibrated, set 10 mOhms!\n"); - info->rsense = 1000; /* in regs in 10^-5 */ - } - nvmem = devm_nvmem_register(dev, &nvmem_config); if (IS_ERR(nvmem)) { dev_err(dev, "Could not register nvmem!"); @@ -570,6 +703,38 @@ static int max1720x_probe_nvmem(struct i2c_client *client, return 0; } +static int max1720x_get_rsense(struct device *dev, + struct max1720x_device_info *info, + const struct chip_data *data) +{ + unsigned int val; + int ret; + + if (data->has_nvmem) { + ret = regmap_read(info->regmap_nv, MAX1720X_NRSENSE, &val); + if (ret < 0) { + dev_err(dev, "Failed to read RSense from nvmem\n"); + return ret; + } + + info->rsense = val; + if (!info->rsense) { + dev_warn(dev, "RSense not calibrated, set 10 mOhms!\n"); + info->rsense = 1000; /* in regs in 10^-5 */ + } + } else { + ret = of_property_read_u32(dev->of_node, + "shunt-resistor-micro-ohms", &val); + if (ret) { + dev_err(dev, "Failed to read RSense from devicetree\n"); + return ret; + } + info->rsense = val/10; + } + + return 0; +} + static const struct power_supply_desc max1720x_bat_desc = { .name = "max1720x", .no_thermal = true, @@ -579,32 +744,70 @@ static const struct power_supply_desc max1720x_bat_desc = { .get_property = max1720x_battery_get_property, }; +static const struct power_supply_desc max77759_bat_desc = { + .name = "max77759-fg", + .no_thermal = true, + .type = POWER_SUPPLY_TYPE_BATTERY, + .properties = max77759_battery_props, + .num_properties = ARRAY_SIZE(max77759_battery_props), + .get_property = max1720x_battery_get_property, +}; + static int max1720x_probe(struct i2c_client *client) { struct power_supply_config psy_cfg = {}; struct device *dev = &client->dev; struct max1720x_device_info *info; struct power_supply *bat; + const struct chip_data *data; + const struct power_supply_desc *bat_desc; int ret; info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; + data = device_get_match_data(dev); + if (!data) + return dev_err_probe(dev, -EINVAL, "Failed to get chip data\n"); + psy_cfg.drv_data = info; psy_cfg.fwnode = dev_fwnode(dev); - psy_cfg.attr_grp = max1720x_groups; + switch (data->id) { + case MAX1720X_ID: + psy_cfg.attr_grp = max1720x_groups; + bat_desc = &max1720x_bat_desc; + break; + case MAX77759_ID: + bat_desc = &max77759_bat_desc; + break; + default: + return dev_err_probe(dev, -EINVAL, "Unsupported chip\n"); + } i2c_set_clientdata(client, info); - info->regmap = devm_regmap_init_i2c(client, &max1720x_regmap_cfg); + + info->id = data->id; + info->regmap = devm_regmap_init_i2c(client, data->regmap_cfg); if (IS_ERR(info->regmap)) return dev_err_probe(dev, PTR_ERR(info->regmap), "regmap initialization failed\n"); - ret = max1720x_probe_nvmem(client, info); + if (data->has_nvmem) { + ret = max1720x_probe_nvmem(client, info); + if (ret) + return dev_err_probe(dev, ret, "Failed to probe nvmem\n"); + } + + ret = of_property_read_u32(dev->of_node, + "charge-full-design-microamp-hours", &info->charge_full_design); + if (ret) + info->charge_full_design = 0; + + ret = max1720x_get_rsense(dev, info, data); if (ret) - return dev_err_probe(dev, ret, "Failed to probe nvmem\n"); + return dev_err_probe(dev, ret, "Failed to get RSense\n"); - bat = devm_power_supply_register(dev, &max1720x_bat_desc, &psy_cfg); + bat = devm_power_supply_register(dev, bat_desc, &psy_cfg); if (IS_ERR(bat)) return dev_err_probe(dev, PTR_ERR(bat), "Failed to register power supply\n"); @@ -613,7 +816,8 @@ static int max1720x_probe(struct i2c_client *client) } static const struct of_device_id max1720x_of_match[] = { - { .compatible = "maxim,max17201" }, + { .compatible = "maxim,max17201", .data = (void *) &max1720x_data }, + { .compatible = "maxim,max77759-fg", .data = (void *) &max77759_data }, {} }; MODULE_DEVICE_TABLE(of, max1720x_of_match); From patchwork Mon Apr 21 18:13:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Antoine via B4 Relay X-Patchwork-Id: 882960 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0D841E8320; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; cv=none; b=hyP5mInzVC4QbAm11wP67QKRcf2YlnZ1Fx9FTK7wfsi0ytHgAoZwslZWn98esyiao5BuQcFoy17p8vUJTg2BIS8oir00CHkUsEVK3FG5cPECSBjFjkFZyMoGerft0Wg6LrhqBSY+G6klhY4aXwcK7ouNKSHjCEA7lIE9N2T9O0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; c=relaxed/simple; bh=V/kjbIpsR7o8/54il8ImspS8yqRyVOqGksL/52gZejM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FRvWKyMC0eynSapPCMYlQMwiwiuPKXrzh8U7RW30PCY1Cs9oyr4NUrFdVeB3vdCO13vzcbkr+8z1nL9Typ62kaGS+zKWvCnv9nwMlEkXwg4o2w02ZEQbtBHfnKn3kDdelkdqO+bTNCdX/Kl/3VlOacxonMtIqrW57dd73/1pQeU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lOmO3C2Y; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lOmO3C2Y" Received: by smtp.kernel.org (Postfix) with ESMTPS id 878E8C4CEF5; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745259232; bh=V/kjbIpsR7o8/54il8ImspS8yqRyVOqGksL/52gZejM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=lOmO3C2Yt9AKELsFG2PNh2SJmQsyOfel0ZvBWC1rr295EEevtr47I0/JDNADsAZjS uaRMC2POFuL4SXbACLqgPZLd6vKHLYxZMHaODysCR2tW3JwRAALCJJXNmTih+t4uh/ +qKtAn5ix+HUxs20/OXeSimacWV/cMXdbALGI2POQxBQIoTbmTJZTA5KmJT31dps/q 9zZcMf6w8v/1v7KZcTEeVe2PmWOOw3iYEmkVlR6ZAfUX/TM/CuvhO5OM2LM6puDF9X tnyy7khtwxTSHxE+ary0+v2gWSjjCCc2m2bAJ6ajmUVisIxc3WqGPBecElTFrLUtf8 QYqVFOhCiOAlQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7C185C369AB; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) From: Thomas Antoine via B4 Relay Date: Mon, 21 Apr 2025 20:13:34 +0200 Subject: [PATCH v3 3/5] dt-bindings: power: supply: add max77759-fg flavor Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250421-b4-gs101_max77759_fg-v3-3-50cd8caf9017@uclouvain.be> References: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> In-Reply-To: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> To: Rob Herring , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , Catalin Marinas , Will Deacon , Sebastian Reichel , Dimitri Fedrau Cc: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Thomas Antoine X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1745259219; l=2149; i=t.antoine@uclouvain.be; s=20241202; h=from:subject:message-id; bh=3csHwNLf51MgGPB35l/jqx2BDbuC5NezSGJ/M4ttHB0=; b=hdZ5Rso1TYtabh6eg8jkEmrW24+n8D/oOip4OJEpl0tOPzFFs4tV0EiJ5qsDr9uqLuRHV1LkY qVAnT3vizopCgmKHmOf+5qkukpUjrQt83QCOiMFRCY6pmqavfYCltWB X-Developer-Key: i=t.antoine@uclouvain.be; a=ed25519; pk=sw7UYl31W1LTpgWRiX4xIF5x6ok7YWZ6XZnHqy/d3dY= X-Endpoint-Received: by B4 Relay for t.antoine@uclouvain.be/20241202 with auth_id=289 X-Original-From: Thomas Antoine Reply-To: t.antoine@uclouvain.be From: Thomas Antoine The Maxim MAX77759 is an IC used to manage the power supply of the battery and the USB-C. Based on drivers from google, it contains at least a PMIC, a fuel gauge, a TCPCI and a charger. Use max77759-fg compatible to avoid conflict with drivers for other functions. The Maxim MAX77759 has no non-volatile memory so it doesn't require an address and instead requires a value for the current sensing resistor. Signed-off-by: Thomas Antoine --- .../bindings/power/supply/maxim,max17201.yaml | 34 ++++++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/power/supply/maxim,max17201.yaml b/Documentation/devicetree/bindings/power/supply/maxim,max17201.yaml index fe3dd9bd5585618e45220c51023391a5b21acfd2..4823021ff16b170db83abd0b974986a307c05089 100644 --- a/Documentation/devicetree/bindings/power/supply/maxim,max17201.yaml +++ b/Documentation/devicetree/bindings/power/supply/maxim,max17201.yaml @@ -9,13 +9,11 @@ title: Maxim MAX17201 fuel gauge maintainers: - Dimitri Fedrau -allOf: - - $ref: power-supply.yaml# - properties: compatible: oneOf: - const: maxim,max17201 + - const: maxim,max77759-fg - items: - enum: - maxim,max17205 @@ -39,6 +37,36 @@ required: - reg - reg-names +allOf: + - $ref: power-supply.yaml# + - if: + properties: + compatible: + contains: + enum: + - maxim,max17201 + then: + properties: + reg: + minItems: 2 + maxItems: 2 + - if: + properties: + compatible: + contains: + enum: + - maxim,max77759-fg + then: + properties: + reg: + items: + minItems: 1 + maxItems: 1 + shunt-resistor-micro-ohms: + description: The value of current sense resistor in microohms. + required: + - shunt-resistor-micro-ohms + unevaluatedProperties: false examples: From patchwork Mon Apr 21 18:13:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Antoine via B4 Relay X-Patchwork-Id: 882959 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 353221E9B19; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; cv=none; b=rCapnMmml13EYXx1tf+It8j/zdbwn47lNkN3VDtkPIlm5TuAlpePnsOi/Sw3Qf0CiE2hcq2OyRLR29WDE7EWtbXDDtWyl8ZRQlisABFqT+bz6z+Y4YfpMFx5Kfpu6TPEygV+hH80qOu7TUN8JNsXttDv2c6z7kvGaaEQ3T/48QQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; c=relaxed/simple; bh=T+XZ9Epqso4lamigfMKzOTzFq0QKydck3UHjfbzbL0Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JHqwJQvmQzcWX6ymZY+YFJ7+ycI9fV3B1P/lNvlfJYFXP8dJb8CfDg2hDyuCHeCvK/7bgONVED8njBWJrX0W3zm8wlstlElZ+/bmdhsK8MfPzHyUGTzUe/URLTp43CnsaxJ8hDJoXlRngmmp9FKN/N6NpdInP4Mw0G2RYGp+reY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=th37WpDG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="th37WpDG" Received: by smtp.kernel.org (Postfix) with ESMTPS id 95BB9C4CEEC; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745259232; bh=T+XZ9Epqso4lamigfMKzOTzFq0QKydck3UHjfbzbL0Y=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=th37WpDGQt9xC4RgS/LADrR+yO73bwalelu34kTWDJNleDZBH2kCKeRre+qAkQwIB NObIO6YF3Sqgkx2lCYzbo7cb0I8LWO4bBfJeqnuFHjSHx/cOslv8aMkL2foMnoj8zg 2hBBJypKcn1obezkhRiIiE8WFAcOuYaNwWW1UJRE5w3SDpUnRtG+rajimCt3RL6cNi az2bIP7PZuLSCfA+fUZ50vU3YHVPEKSw0M0zbTphOQsSKXrpgSwmkAE2dZy9FMsg7f PVe4Cpe8Fr7dyFaxu4AP8WJPvGPmssaYYYY9tGMz3uc4c3txMbAxmQr+4PvPBzbo0H j2eXZxk5uJi6A== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8DD2FC369D5; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) From: Thomas Antoine via B4 Relay Date: Mon, 21 Apr 2025 20:13:35 +0200 Subject: [PATCH v3 4/5] arm64: defconfig: enable Maxim max1720x driver Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250421-b4-gs101_max77759_fg-v3-4-50cd8caf9017@uclouvain.be> References: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> In-Reply-To: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> To: Rob Herring , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , Catalin Marinas , Will Deacon , Sebastian Reichel , Dimitri Fedrau Cc: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Thomas Antoine X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1745259219; l=716; i=t.antoine@uclouvain.be; s=20241202; h=from:subject:message-id; bh=yx0SuiaIbKa84b0oToxMe11+jBYaoqB6+UxBMxg24/I=; b=S4zPayfzajzMowy0sNp4LipgsT+1+PUeJdTK+n0NuKabzZjL2EvVQiQMMnXcIpKHrDKznUtrj WElm0l00aQ7BToIlo3UQkw5psKfjjVw4jqRjkKhjGZOddyMy2l7IAWc X-Developer-Key: i=t.antoine@uclouvain.be; a=ed25519; pk=sw7UYl31W1LTpgWRiX4xIF5x6ok7YWZ6XZnHqy/d3dY= X-Endpoint-Received: by B4 Relay for t.antoine@uclouvain.be/20241202 with auth_id=289 X-Original-From: Thomas Antoine Reply-To: t.antoine@uclouvain.be From: Thomas Antoine Enable the Maxim MAX1720x as it is used by the gs101-oriole (Google Pixel 6) board. Signed-off-by: Thomas Antoine --- arch/arm64/configs/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 5bb8f09422a22116781169611482179b10798c14..4feaebca340b1bc613c4f4ea9f1ff3b6686b092d 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -687,6 +687,7 @@ CONFIG_BATTERY_QCOM_BATTMGR=m CONFIG_BATTERY_SBS=m CONFIG_BATTERY_BQ27XXX=y CONFIG_BATTERY_MAX17042=m +CONFIG_BATTERY_MAX1720X=m CONFIG_CHARGER_MT6360=m CONFIG_CHARGER_BQ25890=m CONFIG_CHARGER_BQ25980=m From patchwork Mon Apr 21 18:13:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Antoine via B4 Relay X-Patchwork-Id: 883467 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 116981E8854; Mon, 21 Apr 2025 18:13:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; cv=none; b=obyKjgjkHGvVIwfFzMQE1oXq6XBhM00wQ3idgPiMSh2tLXbaByrLUR+bcbZBC89wfYfoUysF6Q5wXt2BvqysPiUpTGx+OHCmlkQk6yzH8dOMpfG/Z+qvdVSz5IdUhmQlAqF3ETYYqSotwe9GGQkyE/FZReWJqY9X0plDIcPrlzc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745259233; c=relaxed/simple; bh=5xEPkCKOVRabxXHHeF2mu6uzqMA218cBnnVPAnWjDKU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G7HmFuCthz1vF44uq4sNmk2s1gz+teBNtmm948Jca7QmWLR/aws9qmOgHqxUL6vQNm5G7DkOG04V4r5wqhPCY2LICCW6fDk7G5xs6yJyz2RxGennshR+sYLMiYmlHeZh6EGTkZAaN95GIkREHNcSaJPOpCDd59voFUBNt3T59KI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IOrIlr69; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IOrIlr69" Received: by smtp.kernel.org (Postfix) with ESMTPS id AB3B6C4CEF7; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745259232; bh=5xEPkCKOVRabxXHHeF2mu6uzqMA218cBnnVPAnWjDKU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=IOrIlr694miPvQfU2wp3lnwc7P631sDN8U+hIUlcI3sV32VBnRhVwAf98A9aGl49Q oTa1GcLupUCKz71t3LjmW87kJnyeG3F6nKq0tT3WA8m5bmqDHok4m5LFYCja9CEvV2 BIDBvdOL3Sjkez5/Kgayg/+qoSaWPs54drYOkFAjexReHrPmLDu0ACERgeSyiN2kZ8 bI/Zdpwbtb42R2l2/LwjKgJZEQiQiji6oBzS6OoUAggGsZC+wjb3C6dqHzzkFM+DJE MHjfGQOOzKKLkqgBhqJ9uw6pLsfQpvoph7L7UlM4ZXh10LhUS72d5jtjiDG4DOAVRv MzlQXwrPlRxjg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9DD30C369D7; Mon, 21 Apr 2025 18:13:52 +0000 (UTC) From: Thomas Antoine via B4 Relay Date: Mon, 21 Apr 2025 20:13:36 +0200 Subject: [PATCH v3 5/5] arm64: dts: exynos: gs101-oriole: enable Maxim max77759 fuel gauge Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250421-b4-gs101_max77759_fg-v3-5-50cd8caf9017@uclouvain.be> References: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> In-Reply-To: <20250421-b4-gs101_max77759_fg-v3-0-50cd8caf9017@uclouvain.be> To: Rob Herring , Peter Griffin , =?utf-8?q?Andr=C3=A9_Draszik?= , Tudor Ambarus , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alim Akhtar , Catalin Marinas , Will Deacon , Sebastian Reichel , Dimitri Fedrau Cc: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Thomas Antoine X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1745259219; l=1313; i=t.antoine@uclouvain.be; s=20241202; h=from:subject:message-id; bh=+E8KTkRWD/mhjwDdm0OrzwMI0i7bo8G/TbulwCt/cNU=; b=3Vmi01/6lLR8bdWK8rEFtyFk8OJvaSSYwt+P0HGLokKmOmUByXF181HxjD28obfVkyXl2dRlz +rwW3Uw+43aDGPshLCK05RKjDNecb/srcSX5tw0KEv7JXZaDrFG9C9G X-Developer-Key: i=t.antoine@uclouvain.be; a=ed25519; pk=sw7UYl31W1LTpgWRiX4xIF5x6ok7YWZ6XZnHqy/d3dY= X-Endpoint-Received: by B4 Relay for t.antoine@uclouvain.be/20241202 with auth_id=289 X-Original-From: Thomas Antoine Reply-To: t.antoine@uclouvain.be From: Thomas Antoine Add the node for the Maxim MAX77759 fuel gauge as a slave of the i2c. The TODO is still applicable given there are other slaves on the bus (e.g. PCA9468, other MAX77759 functions and the MAX20339 OVP). Signed-off-by: Thomas Antoine --- arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi b/arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi index b25230495c64dce60916b7cd5dcb9a7cce5d0e4e..84fc10c3562958ab1621f24644709e85a9433b9b 100644 --- a/arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi +++ b/arch/arm64/boot/dts/exynos/google/gs101-pixel-common.dtsi @@ -10,6 +10,7 @@ #include #include +#include #include #include "gs101-pinctrl.h" #include "gs101.dtsi" @@ -188,6 +189,15 @@ usbc0_role_sw: endpoint { }; }; }; + + fuel-gauge@36 { + compatible = "maxim,max77759-fg"; + reg = <0x36>; + reg-names = "m5"; + interrupt-parent = <&gpa9>; + interrupts = <3 IRQ_TYPE_LEVEL_LOW>; + shunt-resistor-micro-ohms = <5000>; + }; }; &pinctrl_far_alive {