From nobody Tue Apr 7 17:35:14 2026 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7BEA93FFAA6 for ; Mon, 2 Mar 2026 13:32:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772458345; cv=none; b=AR44xOuGwgOWReuL5vs0DR1hpgoJWXwUehNKmWPMT8RGPgfPYg2E5pmYPlkmcDyg55Dve+S/e2Vfq/OV88KG3Vzd6SoK9gP1+W6CBiT/QHrm5s40PaHO6IK5XPVrHw9Y8VFHuPoqtGoOBeZIsfFUfeIDlJvfMk4Jb50qFVFLEvY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772458345; c=relaxed/simple; bh=3WwOpYMx6LhkWQF37CtfVtDzeQ/5bON2qkHIGahHGA4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PeCm6zb9LF3NVyP4ZBF+jZjCP8z1dmUyRbtM30Un38evc6QjC2W1ymAOV0P6vomF2QJnZhtrsRc+v0u2dWUap2bCttphIqSh3X8a5TG+2bLhNkps6pY4+lG5pETOOF8tPbZadRUHUD+K17FluuWPBJLI7jNJMHdcDJGPjBprqXs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Qb55vNG6; arc=none smtp.client-ip=209.85.208.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Qb55vNG6" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-65faaa8b807so8080347a12.3 for ; Mon, 02 Mar 2026 05:32:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1772458342; x=1773063142; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=jjFeJ3eKhFpiV9pfO1cds2rolzRBUSdpOdc5Syl0Y1Y=; b=Qb55vNG6Oy+9QLR7V7XcMhAbb80tR1m5p9vY72HQ7CCHyR+ahjSbGHb3HL8amSqxli uV4w9nBo+dOCEqNzRKB/ZMMRHhu56cI4xRRheNFLovcs+AzmWcmM4IfCP0lYLssluESd P1ckARMIKO3yCbidj1z1O8E2n8xPWKP+eH/GBezkDHxsqfDpMcZMa1xTiF/UUdIBGueG gp0Al/Kbndrh6PjpZO+uxrWSz9FHtjNSz6UZdrYaDuk6bESTWAiFBEJuoE3ofcKiWlNk vCUMRGFiYx0Z4A9bLgIrh0YLVAuaFxN/VTOcek1eLD76LmPYAe2Q1M/QNN8WfYaZYQX1 e+3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772458342; x=1773063142; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=jjFeJ3eKhFpiV9pfO1cds2rolzRBUSdpOdc5Syl0Y1Y=; b=er5KRsfBq2OmGE2TZku97+bIBrPu+BQBk8dj2h2cpOITOnPHvY8zyPUNKecw5Ndu1D nDD9H+sFT5br5numQwLPuXaE2dXb8WO03/yOR1x+34tyT81RFbhORhTvvyWIm1zFjJLn co0+RuacrJSK2mE8YH60nVsnUuiN+uWqCWqAh3g9POgsq+fLb6IS6M99HeqsPbEAGvym ZcOf+THu7xvwoLR/loGezTnWjyVXjA+VrTBtcePLxbB2kXolKl7VSZ3kEJFJeVEDDeN5 Tk7e9d1TFCKVmuKyxk42SCavh1ZR9K31OLuUxTfC/CwHtYMFCgDeA/GEiUByUa0k+uR+ 9R0Q== X-Forwarded-Encrypted: i=1; AJvYcCX6cnLdvwKZBjXaWG5lvC5Yah+n2Cem6J3LuTcG8ggjqUrPzRqFaPvVPIiyOiUUkqcIJVym3Dt+OlOkjok=@vger.kernel.org X-Gm-Message-State: AOJu0YzYT1M1rrSDc6Kn5oLD+DDfR6TJf8E2rLIj3y9Pemh/MFGViTe9 BhAJ2f+PStQH7qtUJiJJg57fnhNVmdNleregCSMIoqV3wGDppka9rmJ4Ssek+8sLwAg= X-Gm-Gg: ATEYQzwH1+AGkWOy1s1X7M0RRcSI/70TAVyma7K5HDwNUNghf306gdYi5G9MyarE61U kP3hQ4cTNxAAjYhJecxTT3CxIgPTuXoCjyqK2NxA0Tx8H4dBROXkaFD2h3K1DyXGS++BSf4TpgY +S+Rn58QJPWRRfYO/wfHFjYt6716ddfx+LrxhYLStAYINwNSwMOv+GbFJrSKBWadu7ReBVxh/mp eHMjPbGkZUSxJ0Jep1B+Rsf9CmqJb6K2AfUf13ajPTWHraPUnVGsW4FX/da73vHoxBYN7h4rBzm d8xdrhAbPA6LySGsmcMeXwCvBvds8eFf/RFc/iRCcgNMnAANO01557EqbJDc2DEVOxmBGjVluoI DNC702RBhhj6ROJETUtH8wwipL1E02rNrJKNfj/53dA65q3sVnZl49d5ZLhld2PomOaUySG/2+9 iSmA4QLJj0gGkHcFkKcuOCp+Dvlo7wSSxZrIwl+Iddp/dKcBPC64wtbPOFENXkWeN3hgzU6hdq5 R6XpV+lTqwTU3I= X-Received: by 2002:a05:6402:5209:b0:65f:b622:748f with SMTP id 4fb4d7f45d1cf-65fde4bc8c5mr7404203a12.32.1772458341629; Mon, 02 Mar 2026 05:32:21 -0800 (PST) Received: from puffmais2.c.googlers.com (221.210.91.34.bc.googleusercontent.com. [34.91.210.221]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-65fabf6d1c6sm3282988a12.17.2026.03.02.05.32.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 05:32:21 -0800 (PST) From: =?utf-8?q?Andr=C3=A9_Draszik?= Date: Mon, 02 Mar 2026 13:32:08 +0000 Subject: [PATCH v3 09/11] power: supply: max17042: initial support for Maxim MAX77759 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260302-max77759-fg-v3-9-3c5f01dbda23@linaro.org> References: <20260302-max77759-fg-v3-0-3c5f01dbda23@linaro.org> In-Reply-To: <20260302-max77759-fg-v3-0-3c5f01dbda23@linaro.org> To: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , Sebastian Reichel , Rob Herring , Conor Dooley , Ramakrishna Pallala Cc: Peter Griffin , Tudor Ambarus , Juan Yescas , Amit Sunil Dhamne , kernel-team@android.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Andr=C3=A9_Draszik?= X-Mailer: b4 0.14.3 The Maxim MAX77759 is a companion PMIC intended for use in mobile phones and tablets. It is used on Google Pixel 6 and 6 Pro (oriole and raven). Amongst others, it contains a fuel gauge that is similar to the ones supported by this driver. The fuel gauge can measure battery charge and discharge current, battery voltage, battery temperature, and the Type C connector's temperature. The MAX77759 incorporates the Maxim ModelGauge m5 algorithm. It, as well as previous generations like m3 on max17047/max17050, requires the host to save/restore some register values across power cycles to maintain full accuracy. Extending the driver for such support is out of scope in this initial commit. Reviewed-by: Peter Griffin Signed-off-by: Andr=C3=A9 Draszik --- v2: fix typo MAX77759_T_convert -> MAX77759_Tconvert --- drivers/power/supply/max17042_battery.c | 59 +++++++++++++++++++++++++++++= +--- include/linux/power/max17042_battery.h | 24 ++++++++++++-- 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply= /max17042_battery.c index e21d2bd7e231..b9a21cef2cc6 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -650,7 +650,8 @@ static void max17042_write_config_regs(struct max17042_= chip *chip) regmap_write(map, MAX17042_RelaxCFG, config->relax_cfg); if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17047 || chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17050 || - chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) + chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055 || + chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX77759) regmap_write(map, MAX17047_FullSOCThr, config->full_soc_thresh); } @@ -787,7 +788,8 @@ static inline void max17042_override_por_values(struct = max17042_chip *chip) =20 if ((chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17042) || (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17047) || - (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17050)) { + (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17050) || + (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX77759)) { max17042_override_por(map, MAX17042_IAvg_empty, config->iavg_empty); max17042_override_por(map, MAX17042_TempNom, config->temp_nom); max17042_override_por(map, MAX17042_TempLim, config->temp_lim); @@ -796,7 +798,8 @@ static inline void max17042_override_por_values(struct = max17042_chip *chip) =20 if ((chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17047) || (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17050) || - (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055)) { + (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX17055) || + (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX77759)) { max17042_override_por(map, MAX17047_V_empty, config->vempty); } } @@ -1019,6 +1022,45 @@ static const struct regmap_config max17042_regmap_co= nfig =3D { .val_format_endian =3D REGMAP_ENDIAN_NATIVE, }; =20 +static const struct regmap_range max77759_fg_registers[] =3D { + regmap_reg_range(MAX17042_STATUS, MAX77759_MixAtFull), + regmap_reg_range(MAX17042_VFSOC0Enable, MAX17042_VFSOC0Enable), + regmap_reg_range(MAX17042_MLOCKReg1, MAX17042_MLOCKReg2), + regmap_reg_range(MAX17042_MODELChrTbl, MAX17055_TimerH), + regmap_reg_range(MAX77759_IIn, MAX77759_IIn), + regmap_reg_range(MAX17055_AtQResidual, MAX17055_AtAvCap), + regmap_reg_range(MAX17042_OCVInternal, MAX17042_OCVInternal), + regmap_reg_range(MAX17042_VFSOC, MAX17042_VFSOC), +}; + +static const struct regmap_range max77759_fg_ro_registers[] =3D { + regmap_reg_range(MAX17042_FSTAT, MAX17042_FSTAT), + regmap_reg_range(MAX17042_OCVInternal, MAX17042_OCVInternal), + regmap_reg_range(MAX17042_VFSOC, MAX17042_VFSOC), +}; + +static const struct regmap_access_table max77759_fg_write_table =3D { + .yes_ranges =3D max77759_fg_registers, + .n_yes_ranges =3D ARRAY_SIZE(max77759_fg_registers), + .no_ranges =3D max77759_fg_ro_registers, + .n_no_ranges =3D ARRAY_SIZE(max77759_fg_ro_registers), +}; + +static const struct regmap_access_table max77759_fg_rd_table =3D { + .yes_ranges =3D max77759_fg_registers, + .n_yes_ranges =3D ARRAY_SIZE(max77759_fg_registers), +}; + +static const struct regmap_config max77759_fg_regmap_cfg =3D { + .reg_bits =3D 8, + .val_bits =3D 16, + .max_register =3D 0xff, + .wr_table =3D &max77759_fg_write_table, + .rd_table =3D &max77759_fg_rd_table, + .val_format_endian =3D REGMAP_ENDIAN_NATIVE, + .cache_type =3D REGCACHE_NONE, +}; + static const struct power_supply_desc max17042_psy_desc =3D { .name =3D "max170xx_battery", .type =3D POWER_SUPPLY_TYPE_BATTERY, @@ -1045,6 +1087,7 @@ static int max17042_probe(struct i2c_client *client, = struct device *dev, int irq { struct i2c_adapter *adapter =3D client->adapter; const struct power_supply_desc *max17042_desc =3D &max17042_psy_desc; + const struct regmap_config *regmap_config; struct power_supply_config psy_cfg =3D {}; struct max17042_chip *chip; int ret; @@ -1060,7 +1103,12 @@ static int max17042_probe(struct i2c_client *client,= struct device *dev, int irq =20 chip->dev =3D dev; chip->chip_type =3D chip_type; - chip->regmap =3D devm_regmap_init_i2c(client, &max17042_regmap_config); + + if (chip->chip_type =3D=3D MAXIM_DEVICE_TYPE_MAX77759) + regmap_config =3D &max77759_fg_regmap_cfg; + else + regmap_config =3D &max17042_regmap_config; + chip->regmap =3D devm_regmap_init_i2c(client, regmap_config); if (IS_ERR(chip->regmap)) return dev_err_probe(dev, PTR_ERR(chip->regmap), "Failed to initialize regmap\n"); @@ -1241,6 +1289,8 @@ static const struct of_device_id max17042_dt_match[] = __used =3D { .data =3D (void *) MAXIM_DEVICE_TYPE_MAX17055 }, { .compatible =3D "maxim,max77705-battery", .data =3D (void *) MAXIM_DEVICE_TYPE_MAX17047 }, + { .compatible =3D "maxim,max77759-fg", + .data =3D (void *) MAXIM_DEVICE_TYPE_MAX77759 }, { .compatible =3D "maxim,max77849-battery", .data =3D (void *) MAXIM_DEVICE_TYPE_MAX17047 }, { }, @@ -1253,6 +1303,7 @@ static const struct i2c_device_id max17042_id[] =3D { { "max17047", MAXIM_DEVICE_TYPE_MAX17047 }, { "max17050", MAXIM_DEVICE_TYPE_MAX17050 }, { "max17055", MAXIM_DEVICE_TYPE_MAX17055 }, + { "max77759-fg", MAXIM_DEVICE_TYPE_MAX77759 }, { "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 }, { } }; diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/m= ax17042_battery.h index c417abd2ab70..05097f08ea36 100644 --- a/include/linux/power/max17042_battery.h +++ b/include/linux/power/max17042_battery.h @@ -105,7 +105,7 @@ enum max17042_register { =20 MAX17042_OCV =3D 0xEE, =20 - MAX17042_OCVInternal =3D 0xFB, /* MAX17055 VFOCV */ + MAX17042_OCVInternal =3D 0xFB, /* MAX17055/77759 VFOCV */ =20 MAX17042_VFSOC =3D 0xFF, }; @@ -156,7 +156,7 @@ enum max17055_register { MAX17055_AtAvCap =3D 0xDF, }; =20 -/* Registers specific to max17047/50/55 */ +/* Registers specific to max17047/50/55/77759 */ enum max17047_register { MAX17047_QRTbl00 =3D 0x12, MAX17047_FullSOCThr =3D 0x13, @@ -167,12 +167,32 @@ enum max17047_register { MAX17047_QRTbl30 =3D 0x42, }; =20 +enum max77759_register { + MAX77759_AvgTA0 =3D 0x26, + MAX77759_AtTTF =3D 0x33, + MAX77759_Tconvert =3D 0x34, + MAX77759_AvgCurrent0 =3D 0x3B, + MAX77759_THMHOT =3D 0x40, + MAX77759_CTESample =3D 0x41, + MAX77759_ISys =3D 0x43, + MAX77759_AvgVCell0 =3D 0x44, + MAX77759_RlxSOC =3D 0x47, + MAX77759_AvgISys =3D 0x4B, + MAX77759_QH0 =3D 0x4C, + MAX77759_MixAtFull =3D 0x4F, + MAX77759_VSys =3D 0xB1, + MAX77759_TAlrtTh2 =3D 0xB2, + MAX77759_VByp =3D 0xB3, + MAX77759_IIn =3D 0xD0, +}; + enum max170xx_chip_type { MAXIM_DEVICE_TYPE_UNKNOWN =3D 0, MAXIM_DEVICE_TYPE_MAX17042, MAXIM_DEVICE_TYPE_MAX17047, MAXIM_DEVICE_TYPE_MAX17050, MAXIM_DEVICE_TYPE_MAX17055, + MAXIM_DEVICE_TYPE_MAX77759, =20 MAXIM_DEVICE_TYPE_NUM }; --=20 2.53.0.473.g4a7958ca14-goog