From patchwork Sun Jan 11 08:23:46 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Nazzareno Trimarchi X-Patchwork-Id: 4428 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 55A583F1D4 for ; Sun, 11 Jan 2026 09:23:58 +0100 (CET) Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-b844098869csf538033866b.2 for ; Sun, 11 Jan 2026 00:23:58 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1768119838; cv=pass; d=google.com; s=arc-20240605; b=AvF0BmBDWwjg1h52gYs9jFBoNb6mVf/V6Qu5y3QvHxNOro3VZfJGpo459moOKjXDHs cC08gebHDswSwh57y2WqEqMjU31YsTi6u9spvxOI2XUAYO3zl4dyPzXSGjV536VAqIBn PMg1AeYKG1X0hFuGEXp0OzWw8I+3bJ57KDkFSCjAChyrr/D/jevaRlBDpEGxHdZatmiB /YyvBVU3fwYOSTu9Vh7HJ+fvv95MSm6jeCHXxZBPjbydX36aWxLJ7iTDpUauOlvnGVSW 3nhwLywnlbTZUXs7pb1/wDSZ6zslF2yHQ5KQfGPfr8d9TlGKUTgtw9tzu8O4nZ0ZTYjt nZqQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=/qOfr70YksQH1cDk8twanAQNrfagx1hWsmHP1goZnz4=; fh=6pOQyucNLgrQrvV7fY2DLW271MLlb4Ypkn32/W7AkdI=; b=I0TQAgyO9a1JmLd9IDXsBKuiWOrJpyskC71SGok7it08FOCnOS1vJy/zqp9ikqUByr zYP49Wq2WjGs3AOxnrRVArAPSjPxJEOslX5HhYFXXNfffW3P2hhoV73ltPH6wualvbD9 XSAnrQVcbllEe9809UUUvKDD8WxTs8Io3u7e2qYqD3lT3WSCwteryTtbeaW8CjTEh4TJ XmnzKxAENT/fGvXAa9sxVMB6OVrV8e/v/vP+EJjTNRyRoDEXgV6gQcFtdKyaMZF3xxc2 AmY0qH23mWhgYqFGak7FrjwfM1+CU5k4ODpr3CrCW9L8hj9LnACfQyTRyknYs4AcU5G8 1bVA==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=IE59pOBk; spf=pass (google.com: domain of michael@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=michael@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1768119838; x=1768724638; darn=patchwork.amarulasolutions.com; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=/qOfr70YksQH1cDk8twanAQNrfagx1hWsmHP1goZnz4=; b=Hy8GT0jN4uDhyaEKa6jBLhvvo4wTSkMaW2336pPxavlNyy8/YYSDh0muh4ekeuqoZI NctI6lu33ghAqHRO99bBXs7ZE4K9q0SyoXuapzwENgYYZSESYtUISljpKVpmGQnOzzzO 4mZncKIdvyumEbI/Mn0ZcDwVH+yPq9sRzpMSk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768119838; x=1768724638; h=list-unsubscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-beenthere:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=/qOfr70YksQH1cDk8twanAQNrfagx1hWsmHP1goZnz4=; b=YiW2OAX1XqopRBS32nekBySjVktPs+ihCa4eTGF8I7XJpYglQi0A/Og6MY9jQHkQ98 OVmlASmvQ0YB2kl7MyZhsay6xLtR4UE2crLk4jdodc3PbbDl+qhyIf754opYMToG3n62 GcXM4Ml41SINf8dQvPsbGdmPsxVnJv0NlypNafz3M6Frrs9KobcFenM7gTi+0oZHCA/F EqRYIUPJnBMGz/8xIrB0+L/QZsMDTCixxR/8tv48dfBL3s1TSEvx/QIvffotJUfEEBUH JG/I2bAq/axG9LqkIUi2OxQRZ0fJhgSMdgKRn3pSP9VZtgVapcItqQ1sGrP0NQNJrrEJ 7WRw== X-Forwarded-Encrypted: i=2; AJvYcCWZM0lau0pT7n2RlBIQysQIZke8ZqHkSJk03ndyTMF7Fxou1xOn5fngdDaWrSF60DMCJuTaQjiVINrAWeln@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0Yz4Aqd/OgJlIYbxuhSpqSAEh58IYF35pM4bciW6AOzqrekUMeRa JRsLpyKJjpqo3RT4+RAGQTC4VpbmwzZWSR1DtaumMjXtzrE4mDuoshgePC2aV4jlX72+Rw== X-Google-Smtp-Source: AGHT+IF9K6GCPpfwbS+tfwtrKJhwkldI6ppqPYXKul+giJfBV9SCqRetM5SdX4gmOBBPqPRwW8RFxw== X-Received: by 2002:a17:907:9603:b0:b80:a31:eb08 with SMTP id a640c23a62f3a-b84450205e1mr1428509966b.55.1768119837850; Sun, 11 Jan 2026 00:23:57 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com; h="AV1CL+Ed8EWTIZigudsI0pLs0lrTyZ+5cdhROuryrGnPOtcfpQ==" Received: by 2002:aa7:dd06:0:b0:64c:7925:f275 with SMTP id 4fb4d7f45d1cf-650748d4084ls5284112a12.1.-pod-prod-09-eu; Sun, 11 Jan 2026 00:23:55 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCX+wbfKBlQMow4Yq851oYVqAxQJ/EMVBpyYHaCWaC7HKgc4VL/t/UYEqx7quTn0dncLwpXcKZWutJusFttl@amarulasolutions.com X-Received: by 2002:a17:907:728a:b0:b87:1064:4ea1 with SMTP id a640c23a62f3a-b8710645888mr82020266b.65.1768119835536; Sun, 11 Jan 2026 00:23:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1768119835; cv=none; d=google.com; s=arc-20240605; b=ZUxrcK07wfU1Byey1uqdhfUdS+iJ6a68pGu6ScdmWWOOGqxOq2fp5bYpfhPRbiTnC0 nRD8aAFaHpsm6DYZVNesds9gnVeI8DL3hKdsfkfKQhUxrThJqElDaqYAcjHLpHg11ujt aIWnDIUc8bWaLxFswRIvSwWvtNHLWdOs9Wj0FkJeTZTgY5SG9pp2t/Dyl0dmQMsVFdoZ zUAzZeat9Byb7yPKNd7qdhDKiPQu1AaUwH0HOv/Xogk23J9yiMAuV/kXUvzGYAsPqFBm zp3qtuBcC0/Ll/rSUo/TA8CEltBWroR2Mu9k0C9681dKlDOIlBkQgYQnDFpFf0nUG8cC lI6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=dtgzZWNyxrestrdjMq7Z3/mtKELvM+5iu53N1RBbkB4=; fh=lQ5X/UrhkUps7XI/GGqJHoNTBfFzUaclzNK5T3SKrSQ=; b=cmBujVu4cvi8YTxPLgs9+o7HmlcGvdkcoszjXt4AonR1qGH7a/TduOH3EwrKMkjeOT EY2Jts7jWRKDMzoSVyUTH3RRvJUKYoivko6oRdAwsBb3htk3dQyp2Fpqcq2ykVGsg5j7 zQXBS1O/TDBT6S2ZW7Hi8TqyWvr9bHAZg+4Z9bdcNNmLpqOicPgB2cuXPbxGZAZlgSec d3CchERGT6ELYAU2oh2iAVRL8h+Ji0Yp/AJ+ndaY+FpSy9DBN+MN1H3REbf4LNfduu7q cxOFHfCKFC4AtD4AhZPM/tD+NEIluEh6AKlQOqQE6A5LFDyzY0nf68OxADJW7u/fePav wi8g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=IE59pOBk; spf=pass (google.com: domain of michael@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=michael@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id 4fb4d7f45d1cf-6507c06a654sor3550916a12.15.2026.01.11.00.23.55 for (Google Transport Security); Sun, 11 Jan 2026 00:23:55 -0800 (PST) Received-SPF: pass (google.com: domain of michael@amarulasolutions.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; X-Forwarded-Encrypted: i=1; AJvYcCVLftlGEjduh7Zn3LwzJ5rFLfnTHRdZMgzwXJ4X3iLQSmkTtZl2oi4rBit9aDreCuBi85Bxe+T8eWFJuqsp@amarulasolutions.com X-Gm-Gg: AY/fxX556t/HBy0lkWILzdm0iaQjG+kUjMNJpFbREjRhEIXlbGEHmemVJ/udd31dHHa tFTTwtOy2rvoOpF8gOxSdHO7GAAvtrUxIm24O/si7jiGrJ4JutFcUx163uvJwIEIFR1meTxwGl6 v0zyyt9nzd6mY81guV3YIE9TISsKJeQnd2g4KHUAdwShUqxmuAZccfb6q0Q7Kw6iWrCbD+EGDlJ BJLudo47KLtQ+EuLP9QO858N1N71JrR88m/AHR7i5QNMlAZUKRuZ7+C3kLv27K8yXgXK3FZDhI4 EvzAQwOmqhRO7Hzc0XrXuQ04CUZBSQFtgUjQ5wHrOxOs1tn8B9ELA9nmxsQfLdo3khUf35i7KE+ gAPoOCuu1ZA3vY9fplbQq6R18BEWZxD+8QXIvHM2WcZMPDmFPdvdnQWCgla2TCR1aTAWmBdQjhZ I82tDzpXSCKRrhdmnvViM49WsCzhAMMYx1eRPYj58NoWFtkrh64ujEeCTbItDK2TyC1cv5Pu7i2 AudcGXw9T+S2rKcJbiXlwcDwd5sE4xLdU1IPUAIpuHP0bYlhuwRjc8WzQ== X-Received: by 2002:a05:6402:26d1:b0:64b:5f4e:9e6d with SMTP id 4fb4d7f45d1cf-65097e50c56mr13244155a12.18.1768119835009; Sun, 11 Jan 2026 00:23:55 -0800 (PST) Received: from panicking.homenet.telecomitalia.it (host-87-5-117-220.retail.telecomitalia.it. [87.5.117.220]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6507b9d44bfsm14608346a12.8.2026.01.11.00.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Jan 2026 00:23:54 -0800 (PST) From: Michael Trimarchi To: Peng Fan , Jaehoon Chung Cc: Tom Rini , Dario Binacchi , u-boot@lists.denx.de, linux-amarula@amarulasolutions.com, Michael Trimarchi Subject: [PATCH V2 1/2] power: regulator: pfuze100: support high voltage range bit Date: Sun, 11 Jan 2026 09:23:46 +0100 Message-ID: <20260111082347.1302003-2-michael@amarulasolutions.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260111082347.1302003-1-michael@amarulasolutions.com> References: <20260111082347.1302003-1-michael@amarulasolutions.com> MIME-Version: 1.0 X-Original-Sender: michael@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=IE59pOBk; spf=pass (google.com: domain of michael@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=michael@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , The PFUZE100/200/3000 family of PMICs allow switching regulators (specifically SW2, SW3A/B, SW4 on PFUZE100/200 and SW2 on PFUZE3000) to operate in a "high" voltage range mode. This mode is indicated by a specific bit in the voltage selection register (bit 3 for PFUZE3000, bit 6 for others). When this bit is set: - PFUZE100/200 switches from a 25mV step to a 50mV step, with a different minimum voltage (800mV). - PFUZE3000 SW2 switches to a completely different non-linear voltage table. Currently, the driver uses static descriptors that assume the low/default range. This results in incorrect voltage readings and settings if the PMIC is configured for the high range. This patch updates the driver to: 1. Identify regulators with high-bit support via a new `hi_bit` flag. 2. Read the register during probe to detect the current range configuration. 3. Dynamically update the regulator descriptor (step, mask, min_uV, or table) to match the active range. This aligns the U-Boot driver behavior with the Linux kernel implementation. Signed-off-by: Michael Trimarchi --- V1->V2: drop change of uv_mask, it's already fixed for bit 6 and anyway 0x7 was invalid --- drivers/power/regulator/pfuze100.c | 65 +++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/drivers/power/regulator/pfuze100.c b/drivers/power/regulator/pfuze100.c index f864b1d8834..2242bf68f39 100644 --- a/drivers/power/regulator/pfuze100.c +++ b/drivers/power/regulator/pfuze100.c @@ -18,6 +18,7 @@ * * @name: Identify name for the regulator. * @type: Indicates the regulator type. + * @hi_bit: Indicate if support hi voltage range. * @uV_step: Voltage increase for each selector. * @vsel_reg: Register for adjust regulator voltage for normal. * @vsel_mask: Mask bit for setting regulator voltage for normal. @@ -29,6 +30,7 @@ struct pfuze100_regulator_desc { char *name; enum regulator_type type; + bool hi_bit; unsigned int uV_step; unsigned int vsel_reg; unsigned int vsel_mask; @@ -54,10 +56,11 @@ struct pfuze100_regulator_plat { .voltage = (vol), \ } -#define PFUZE100_SW_REG(_name, base, step) \ +#define PFUZE100_SW_REG(_name, base, step, hbit) \ { \ .name = #_name, \ .type = REGULATOR_TYPE_BUCK, \ + .hi_bit = (hbit), \ .uV_step = (step), \ .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \ .vsel_mask = 0x3F, \ @@ -65,10 +68,11 @@ struct pfuze100_regulator_plat { .stby_mask = 0x3F, \ } -#define PFUZE100_SWB_REG(_name, base, mask, step, voltages) \ +#define PFUZE100_SWB_REG(_name, base, mask, step, voltages, hbit) \ { \ .name = #_name, \ .type = REGULATOR_TYPE_BUCK, \ + .hi_bit = (hbit), \ .uV_step = (step), \ .vsel_reg = (base), \ .vsel_mask = (mask), \ @@ -155,15 +159,19 @@ static unsigned int pfuze3000_sw2lo[] = { 1500000, 1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000 }; +static unsigned int pfuze3000_sw2hi[] = { + 2500000, 2800000, 2850000, 3000000, 3100000, 3150000, 3200000, 3300000, +}; + /* PFUZE100 */ static struct pfuze100_regulator_desc pfuze100_regulators[] = { - PFUZE100_SW_REG(sw1ab, PFUZE100_SW1ABVOL, 25000), - PFUZE100_SW_REG(sw1c, PFUZE100_SW1CVOL, 25000), - PFUZE100_SW_REG(sw2, PFUZE100_SW2VOL, 25000), - PFUZE100_SW_REG(sw3a, PFUZE100_SW3AVOL, 25000), - PFUZE100_SW_REG(sw3b, PFUZE100_SW3BVOL, 25000), - PFUZE100_SW_REG(sw4, PFUZE100_SW4VOL, 25000), - PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst), + PFUZE100_SW_REG(sw1ab, PFUZE100_SW1ABVOL, 25000, false), + PFUZE100_SW_REG(sw1c, PFUZE100_SW1CVOL, 25000, false), + PFUZE100_SW_REG(sw2, PFUZE100_SW2VOL, 25000, true), + PFUZE100_SW_REG(sw3a, PFUZE100_SW3AVOL, 25000, true), + PFUZE100_SW_REG(sw3b, PFUZE100_SW3BVOL, 25000, true), + PFUZE100_SW_REG(sw4, PFUZE100_SW4VOL, 25000, true), + PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst, false), PFUZE100_SNVS_REG(vsnvs, PFUZE100_VSNVSVOL, 0x7, pfuze100_vsnvs), PFUZE100_FIXED_REG(vrefddr, PFUZE100_VREFDDRCON, 750000), PFUZE100_VGEN_REG(vgen1, PFUZE100_VGEN1VOL, 50000), @@ -176,11 +184,11 @@ static struct pfuze100_regulator_desc pfuze100_regulators[] = { /* PFUZE200 */ static struct pfuze100_regulator_desc pfuze200_regulators[] = { - PFUZE100_SW_REG(sw1ab, PFUZE100_SW1ABVOL, 25000), - PFUZE100_SW_REG(sw2, PFUZE100_SW2VOL, 25000), - PFUZE100_SW_REG(sw3a, PFUZE100_SW3AVOL, 25000), - PFUZE100_SW_REG(sw3b, PFUZE100_SW3BVOL, 25000), - PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst), + PFUZE100_SW_REG(sw1ab, PFUZE100_SW1ABVOL, 25000, false), + PFUZE100_SW_REG(sw2, PFUZE100_SW2VOL, 25000, true), + PFUZE100_SW_REG(sw3a, PFUZE100_SW3AVOL, 25000, true), + PFUZE100_SW_REG(sw3b, PFUZE100_SW3BVOL, 25000, true), + PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst, false), PFUZE100_SNVS_REG(vsnvs, PFUZE100_VSNVSVOL, 0x7, pfuze100_vsnvs), PFUZE100_FIXED_REG(vrefddr, PFUZE100_VREFDDRCON, 750000), PFUZE100_VGEN_REG(vgen1, PFUZE100_VGEN1VOL, 50000), @@ -195,9 +203,9 @@ static struct pfuze100_regulator_desc pfuze200_regulators[] = { static struct pfuze100_regulator_desc pfuze3000_regulators[] = { PFUZE3000_SW1_REG(sw1a, PFUZE100_SW1ABVOL, 25000), PFUZE3000_SW1_REG(sw1b, PFUZE100_SW1CVOL, 25000), - PFUZE100_SWB_REG(sw2, PFUZE100_SW2VOL, 0x7, 50000, pfuze3000_sw2lo), + PFUZE100_SWB_REG(sw2, PFUZE100_SW2VOL, 0x7, 50000, pfuze3000_sw2lo, true), PFUZE3000_SW3_REG(sw3, PFUZE100_SW3AVOL, 50000), - PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst), + PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst, false), PFUZE100_SNVS_REG(vsnvs, PFUZE100_VSNVSVOL, 0x7, pfuze3000_vsnvs), PFUZE100_FIXED_REG(vrefddr, PFUZE100_VREFDDRCON, 750000), PFUZE100_VGEN_REG(vldo1, PFUZE100_VGEN1VOL, 100000), @@ -246,9 +254,10 @@ static int pfuze100_regulator_probe(struct udevice *dev) struct dm_regulator_uclass_plat *uc_pdata; struct pfuze100_regulator_plat *plat = dev_get_plat(dev); struct pfuze100_regulator_desc *desc; - int i, size; + int i, size, val, sw_hi = 0x40; + int version = dev_get_driver_data(dev_get_parent(dev)); - switch (dev_get_driver_data(dev_get_parent(dev))) { + switch (version) { case PFUZE100: desc = pfuze100_regulators; size = ARRAY_SIZE(pfuze100_regulators); @@ -260,6 +269,7 @@ static int pfuze100_regulator_probe(struct udevice *dev) case PFUZE3000: desc = pfuze3000_regulators; size = ARRAY_SIZE(pfuze3000_regulators); + sw_hi = 1 << 3; break; default: debug("Unsupported PFUZE\n"); @@ -281,6 +291,25 @@ static int pfuze100_regulator_probe(struct udevice *dev) uc_pdata = dev_get_uclass_plat(dev); uc_pdata->type = desc[i].type; + + /* SW2~SW4 high bit check and modify the voltage value table */ + if (desc[i].hi_bit) { + val = pmic_reg_read(dev->parent, desc[i].vsel_reg); + if (val < 0) { + printf("Fails to read from the register.\n"); + return -EIO; + } + + if (val & sw_hi) { + if (version == PFUZE3000) { + desc[i].volt_table = pfuze3000_sw2hi; + } else { + desc[i].uV_step = 50000; + uc_pdata->min_uV = 800000; + } + } + } + if (uc_pdata->type == REGULATOR_TYPE_BUCK) { if (!strcmp(dev->name, "swbst")) { uc_pdata->mode = pfuze_swbst_modes;