From nobody Tue Apr 7 17:15:06 2026 Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) (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 628E232E122 for ; Thu, 26 Feb 2026 13:11:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772111507; cv=none; b=guKVq4gYo+c7PuzH4j5GG1YOn4U3nuqqPxD3wnWNRBEUVnfVsXxUYmeCcTKwgCG9VnIR1pogdGIDJ39XDV3D4VCdfb1b9gsz6oLWZjnMpOEN2Tgi8nSo2bGUvcy8ePmHcmOKwdS+E+00fQGJUUidvEb88ln2z+TRr5BYruUoCH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772111507; c=relaxed/simple; bh=CxTsTMmV8skHVUsm+jW03yN6qWeLL/zDVotJNPTmaHo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sutaAwYM42t4vrHdzY9b1vJLjQxrQEaN6tWCaNkhZyuKtqqwl/dMRJq/AwxquBTBat5w7j2bANpvdELJQx38/7ykFHuRCvo63yJPES5zF+Y6/uQyOiwCEKS9h817q/m6WgLWG5v3/NjO8zO5ZDxcW5aL8Big6gV6u+kCFJBt/k4= 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=Sfjc/yMu; arc=none smtp.client-ip=209.85.208.42 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="Sfjc/yMu" Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-65f71ed7c6cso1598964a12.0 for ; Thu, 26 Feb 2026 05:11:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1772111504; x=1772716304; 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=2gQP8USbfJkmMUuSLrzEcZ4FLbZzBl1slM5DTz0FABA=; b=Sfjc/yMu0AxbE/7bgpDPVmNP+34mRewS8gCKtB1YS5A1g4a7rdFyVqWkpbVLxd2Zhu tP1k3oEaK79+XdGSncKbIhyRV4VdKloANhMcrDOo5HzidKvtvAafPyu8HwrZD1iCzfAa cBp0vgRuORG5s2ofWnvY6Z4qQ8ZqoE5qbzuYn4BwCX+9zAsdew9jdK+nTJ9HafCGJ8ce 24cyLGexRwXuBXmwAMEsDVvfMdvLzakqop2RlwRg31vmd0WT29xRUHLFDtW7AS1QjRGk URAETePLUG3lCrM5BDBSJVjpHOURXMhQk/gYMS+dTLKuqGx3vve0r6I2fQz3D13CLMA1 Ba4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772111504; x=1772716304; 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=2gQP8USbfJkmMUuSLrzEcZ4FLbZzBl1slM5DTz0FABA=; b=N2X59TpDnYzKwC5XhbInJ+/S6mCxvF18obwyIUf6yx0zHuJtvtD3zH/YC8wSvMeVNd FBi5145FmFWRmv9joKJ75rTeG3VMd89y34+G2jQtNqzMO+8xzW3O97zuAFB9NOUiNhIf itgFlWSr2r2/02yaGOPkh7gUi+P4ThA+DgrDLzarRfBHxki74qRA7oc6l6jfrFU3guVm vdnL+7ljmU9e0mFUxg86iDYr4BeirfNKtZVUc4OtfNRO4RMefcIElC+ZGPs7TQZdaajP d7Su8zydOf+8n+bPpHVNavAEceXtsd4sA4HyLb51YvYmMn2qQkDJsa+Ti5vAgkzyetUu UPxw== X-Forwarded-Encrypted: i=1; AJvYcCUAfL2+qQTIqC4NYQvsoMCrjOWRmeCZmKvBrvfjwaT6hVpA4adxup67+zIUm+4vsfeQTslcLtuQI8T52qw=@vger.kernel.org X-Gm-Message-State: AOJu0YwpVVB9JDgbbj5qkQE9DCfm4gODn78s3dFmzFhp30fOLNS/qFu3 04B1I9G8IaOkr8DZRiPRhdJAO1qdpPDiXFRwqIn4/u5aCMDJrqmst6RYM0LV7dOajxM= X-Gm-Gg: ATEYQzztp3L3Nz4IaH3jFgT8a0PQV4Ic1YKEpWozSc+wmJnnXouQ516VF0aVhCQyoMJ B0Q6CJ9OLw6Jt18vuI43TAMCSgM+Ka3hytdd/yH3rIzhUeqLsPBuHfLjAPJ0w2xU2AIAnhTweuZ I6QuctUtOhKUeWi9hlxQGchUnzA5ookFdlUKxUKcn31Qhl10xLRzD0kdQ4VAciu/psyyq/M5N9c h8E7HzfvxIb1zn7/bybFYOjayzPbAT0UP22OGmadtEPDAo19ZjaadiP7rvXmT8pTk6vIp+bcZfr 8KKVeqtwqnuvcCN9I4EJWISErhmo04qyvzECG8TmIRemcd4g3SSN4K4fXGgRxUC3Of9mh9lEEU3 Xs9PPF351QPbX5BQY+UKxfcPN77NErFywQXacVuUe75ZY9y3YVITZmenor5M7XYq4YZgqZnCuTj xYixpDu6JaGU1PgQfqZxXl/SWIFns87rj92/GTpwqMQteBXMCuYtNiLjuzBDHsNZ1Dx/Gx2HeDS Tt3PRJ/FxsgsbjLrg== X-Received: by 2002:a17:907:3e1b:b0:b88:241e:693c with SMTP id a640c23a62f3a-b93516f9c32mr275692866b.31.1772111503528; Thu, 26 Feb 2026 05:11:43 -0800 (PST) Received: from puffmais2.c.googlers.com (244.175.141.34.bc.googleusercontent.com. [34.141.175.244]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b935ac73d2asm55125866b.26.2026.02.26.05.11.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Feb 2026 05:11:43 -0800 (PST) From: =?utf-8?q?Andr=C3=A9_Draszik?= Date: Thu, 26 Feb 2026 13:11:43 +0000 Subject: [PATCH 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: <20260226-max77759-fg-v1-9-ff0a08a70a9f@linaro.org> References: <20260226-max77759-fg-v1-0-ff0a08a70a9f@linaro.org> In-Reply-To: <20260226-max77759-fg-v1-0-ff0a08a70a9f@linaro.org> To: Hans de Goede , Krzysztof Kozlowski , Marek Szyprowski , Sebastian Krzyszkowiak , Purism Kernel Team , Sebastian Reichel , Rob Herring , Conor Dooley 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. Signed-off-by: Andr=C3=A9 Draszik --- 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 823533ea5a17..44626abdab34 100644 --- a/drivers/power/supply/max17042_battery.c +++ b/drivers/power/supply/max17042_battery.c @@ -654,7 +654,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); } @@ -791,7 +792,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); @@ -800,7 +802,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); } } @@ -1023,6 +1026,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, @@ -1049,6 +1091,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; @@ -1064,7 +1107,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"); @@ -1245,6 +1293,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 }, { }, @@ -1257,6 +1307,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..76b85ad3cf48 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_T_convert =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.414.gf7e9f6c205-goog