From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 0974B33AD91 for ; Mon, 20 Apr 2026 15:43:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776699842; cv=none; b=TPG362nS2aNf9dAb9tOgbNmoZ8ILX4aDd7EO4Ty1Dp43wLwoP5xPDrtCQUPNxAV4pZL0JOKmTEImz5HbSc87U/w/Khu5AOtB0tX9A6gKYb447c7tTD5Zu108ZcUMQHF/OpkYFsI1bu+9LiArREgV6l6hAVHvdr56FXTelx0pTZo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776699842; c=relaxed/simple; bh=Hq96TCkrNAk+nIwzsh/wJnzVo8+VTfX6cYKH0fAOzjo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p743yUdj9/rCjFPQHRcXc4VUwIjsrV8th+8u4b8Eng/5LhCrd+hLNiKW2ibkh63NNEFALLZ94s22OIyxb/taXr/CO4ZpyCSKEVrOwKQ3osmFGjDig94rLXzAcoICHWTYO74vJcYuaHg36npzgOrd17sFZcMbzN1mhTbzzI5rDhc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=e14QeWO/; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=L2mArInD; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="e14QeWO/"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="L2mArInD" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63K97RKX084485 for ; Mon, 20 Apr 2026 15:43:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= IQ+L0PhdbxHQr4ISeIqjXzA+0fOsr/ypPkuqaUU9Vbo=; b=e14QeWO/TFeeCsG2 VnN0YmRq0pLnI9Cm6Ru/ySPbpP+y2ocJ8HrksQIkYZAd0wicDannAjl/DB0C6usm uRqQsWKLij1m1r4PI523bjto2ZktL7J2LXoxVtCStZC58qLR5B7PzUbzsp5fAxBA wuWYXWLnR5oZksMfiajuOoNerMU+R2WPPQ8Fq0WFtkXN4BC2wKk4lHawecHAYDFS rR5zM75muHMRPfk91Yc5rdS2mxNnDb5zAAESnaqpQfuM90UAwpU5+Wt0XL3HmS4k oXgGPTJMXgU0W0hjau4V+Dso08jy1ryre0Sm4p1Kv8tCs0azLdMzhT8AV2ELs4UL P3tKaw== Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dnh81heqb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 20 Apr 2026 15:43:58 +0000 (GMT) Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-c76c2bb3149so1455912a12.1 for ; Mon, 20 Apr 2026 08:43:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1776699838; x=1777304638; 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=IQ+L0PhdbxHQr4ISeIqjXzA+0fOsr/ypPkuqaUU9Vbo=; b=L2mArInDWYK9EUlcFz+tm/uDmj0YXK7iS+xOod5pxtXPXiokzmmitPhga4DcUJq2v3 QkD/9hdhg2xtRlxDghwMJnj3W6dOdpBwbPSecsNEFMliL+TN2yVCfgA6BOpNXJAOzapS BFrkfvrFmLaNcuRpqEbxwmuQ5hp3DQktze0y1dZtksW5bmM7kCte0eErBZBa+7vhFEZ2 tLCO29fUTqg4qEUVc+vJRRnh8vqMy/iJy884XL5/DLMGg/5t4HzWRbU/iotE+MgEp9dH CsNr/Bt1AJkSt30wVH1adgBQ+lu6EWpSzDMIkU8bY2/nfoTBnwR6m6a9rDf5SUTDNY62 uI+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776699838; x=1777304638; 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=IQ+L0PhdbxHQr4ISeIqjXzA+0fOsr/ypPkuqaUU9Vbo=; b=dDHmjO/lZgonGmiBB6sfjiNsY3CWsrZ7YvRE/D2ofDAT3DcOawtsdHG1hG4NU2fqxU 6DMjVdaqNelFZtGbJqmNOJsiPN4OvNtipCUvd0gQJ8T8gwxcoX4emOOhqiRnl3FkthpA tPvYN8GRJdz9eNBIJ7bWoOJtkwcKiMI+NLSL8cY5Pg7mK8SQtK1gg22zJc6rekdZ+cNZ IP/gaHM8RTTi80IATQOavQRuoZYSakbnDCdwadUqmRzHVwkuYG/29S7DAbf+Xdh6xSU4 kACf0mTMexCV/Upu/YRjf952Y9H6hrvGhZv1GBI2J6Z3+67Gihg21s038W9rs4WT3T0h uNxQ== X-Forwarded-Encrypted: i=1; AFNElJ88y2rpgNSISLWlVT3Hbjjh/0mYE65rUnGmDd15T6/MHMzJW1Eva9QiD/7+nECLNZExOHeYrDcxybdHZDI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1/EC6Y37CnLwd15FgtRSbj26NWjxj5kh9Yw+Y++pMAj+WZf9u rfcm8on+twIb/T2sFqK2SwDingM+abKmGpk3/tlX4F7CsnRwlmsV3IqD9OZUSMgnxQrhS71DoVx Cy8LjtLbfnuA6sznLEEh1tFKHUTSSPmx9V0zAxcUVe2bkgHWMqSltLh/sm+J0xxaRg6c= X-Gm-Gg: AeBDieukCAmjPs0l3HLUuW3eNdn8dFpujPzjhteZukcDWFDdjFsCxqx7xEY3tJ7tBk4 sALLN3Zts8iSKW5c3UDOH2SDIDh5Ts4DW3n/NojI3C6pjc9VpBHfxJGkyQcrmT6bJpybPfPg2Ke gUfrbAqbwi0ijgZk6kajzvMFdWuU9aalGZBkOIXFfYYPkQ75ZsDPK+67LmRBiHD9s75LKy3tHDx UPgjaTaH3eLQ5hkyCPbS1No2P955zEsXbtCDPuv/8t4hudbvIexgMgdb3v34xwcR+ZMzORWaVX4 3NTWKYT9+Cg9vBh42HlVFbZCFFpF2Ii8m3Nf4m+chpbIu2WS/3h3pnNF+dp27r3ANE9mZn2M+PV 2kEIRKCxPBXqGyMDl8sXiaEDfGoz+kXmuHuxZeHzgyS5il4NInPu0PLh5Q9ymBQ== X-Received: by 2002:a05:6a00:a58a:b0:82f:3017:6168 with SMTP id d2e1a72fcca58-82f8b322ec3mr11320697b3a.1.1776699837555; Mon, 20 Apr 2026 08:43:57 -0700 (PDT) X-Received: by 2002:a05:6a00:a58a:b0:82f:3017:6168 with SMTP id d2e1a72fcca58-82f8b322ec3mr11320677b3a.1.1776699836857; Mon, 20 Apr 2026 08:43:56 -0700 (PDT) Received: from hu-kamalw-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82f8e9cbb28sm10533230b3a.13.2026.04.20.08.43.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Apr 2026 08:43:56 -0700 (PDT) From: Kamal Wadhwa Date: Mon, 20 Apr 2026 21:13:40 +0530 Subject: [PATCH v4 3/4] regulator: qcom-rpmh: readback voltage/bypass/mode/status set during bootup 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: 7bit Message-Id: <20260420-read-rpmh-v3-v4-3-70c152e6c958@oss.qualcomm.com> References: <20260420-read-rpmh-v3-v4-0-70c152e6c958@oss.qualcomm.com> In-Reply-To: <20260420-read-rpmh-v3-v4-0-70c152e6c958@oss.qualcomm.com> To: Bjorn Andersson , Konrad Dybcio , Liam Girdwood , Mark Brown , Vinod Koul Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Kamal Wadhwa X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776699822; l=10320; i=kamal.wadhwa@oss.qualcomm.com; s=20260406; h=from:subject:message-id; bh=Hq96TCkrNAk+nIwzsh/wJnzVo8+VTfX6cYKH0fAOzjo=; b=kCi41cImcgixPZQicPEKNUV7UyQQ+WsfOIOPi4BZOTQQnaId10SygIozV+9a3dbSeRyGrFbM1 rN6j8BcuiQEC1r4fFE3Sr/P+xXWTRGV5sUOMsKy/j6o093GtiXZgFEY X-Developer-Key: i=kamal.wadhwa@oss.qualcomm.com; a=ed25519; pk=ylH1NxUZkBpYsmww89g6zVxpS0q8qthtzcORkYxn/Ag= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDIwMDE1MiBTYWx0ZWRfX0gkMlVXZpJIm ccDsVerjSvsHWXyRuLaWo6luDKuRWwU8V4BX30jhG6QEostMX7Hqw+QI2SVPUXM5WMzGiWcVaf3 61P7QX2LCJs43o9CFGPhLMra2jBlpKYhmLoQqHrdG4Mi1XHCW8emfJyEYlDmwvnW/Di0uwtxlho REA5325McQEshc71FAmqDXkwbmsQpvUB+ybh2mr72tE5wgsy/yXAKc81D2gj/pAZNhvYsMikshR ShVASpvx2qqezJGE5ygtGOpHofetfC8/b2GX9RBAhu8c3JgQm4u2qegCGi2+ye/j4ULgojvE+oj npYNE3HxbTHIgPw0jiU3lo4UJ9liBcVWQNGptceZe/jwRsgT0vNHh6GWq2YlwAEq0O1kWBsKpWs AtMEwHa6zy9y9xB1s/U23OiNg98yNfcI+N2JVkk1N8s0DsSBURkJYYgAlOrMjVPPOuzqb+aNjGi wEmKzvhx9QPygEYTuqg== X-Proofpoint-GUID: 5RdYQNfJRpvj2Lv1zIH-1rDFa3VTVNQM X-Proofpoint-ORIG-GUID: 5RdYQNfJRpvj2Lv1zIH-1rDFa3VTVNQM X-Authority-Analysis: v=2.4 cv=PsKjqQM3 c=1 sm=1 tr=0 ts=69e649be cx=c_pps a=Oh5Dbbf/trHjhBongsHeRQ==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=tHHH2asN0IuRntgD_GYA:9 a=QEXdDO2ut3YA:10 a=_Vgx9l1VpLgwpw_dHYaR:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-20_03,2026-04-20_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 adultscore=0 bulkscore=0 lowpriorityscore=0 spamscore=0 impostorscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604070000 definitions=main-2604200152 Currently, during regulator registration, regulator framework sends an unnecessary `min-microvolts` request for the rpmh-regulator device. This happens because in current design, we do not have a way to readback the voltage settings that was set during the bootloader stage. Fix this by using the rpmh_read() API to read the regulator voltage settings done during boot and make it available to regulator framework from the very first read after the bootup. Also use this API to read the status/mode/bypass settings as well. This will provide the regulator framework a sense of the initial settings done by bootloader and thus preventing any redundents writes for any setting post bootup incase the same setting was already applied during bootup. Signed-off-by: Kamal Wadhwa --- drivers/regulator/qcom-rpmh-regulator.c | 179 ++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qcom-rpmh-regulator.c index 85fbf10f74bb3393071bc65681356312f27b7527..1add15d73cac67ad8c0b45aaad6fb2ae9b388180 100644 --- a/drivers/regulator/qcom-rpmh-regulator.c +++ b/drivers/regulator/qcom-rpmh-regulator.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -61,8 +62,13 @@ static const struct resource_name_formats vreg_rsc_name_lookup[NUM_REGULATOR_TYP }; #define RPMH_REGULATOR_REG_VRM_VOLTAGE 0x0 +#define RPMH_REGULATOR_VOLTAGE_MASK GENMASK(12, 0) + #define RPMH_REGULATOR_REG_ENABLE 0x4 +#define RPMH_REGULATOR_ENABLE_MASK BIT(0) + #define RPMH_REGULATOR_REG_VRM_MODE 0x8 +#define RPMH_REGULATOR_MODE_MASK GENMASK(2, 0) #define PMIC4_LDO_MODE_RETENTION 4 #define PMIC4_LDO_MODE_LPM 5 @@ -154,6 +160,7 @@ struct rpmh_vreg_hw_data { * @voltage_selector: Selector used for get_voltage_sel() and * set_voltage_sel() callbacks * @mode: RPMh VRM regulator current framework mode + * @status: RPMh VRM regulator current framework status */ struct rpmh_vreg { struct device *dev; @@ -166,6 +173,7 @@ struct rpmh_vreg { bool bypassed; int voltage_selector; unsigned int mode; + unsigned int status; }; /** @@ -210,6 +218,28 @@ static int rpmh_regulator_send_request(struct rpmh_vreg *vreg, return ret; } +/** + * rpmh_regulator_read_data() - read data from RPMh + * @vreg: Pointer to the RPMh regulator + * @cmd: Pointer to the RPMh command struct to readback data + * + * Return: 0 on success, or a negative error number on failure + */ +static int rpmh_regulator_read_data(struct rpmh_vreg *vreg, struct tcs_cmd *cmd) +{ + return rpmh_read(vreg->dev, cmd); +} + +static void rpmh_vreg_update_status(struct rpmh_vreg *vreg) +{ + if (!vreg->enabled) + vreg->status = REGULATOR_STATUS_OFF; + else if (vreg->bypassed) + vreg->status = REGULATOR_STATUS_BYPASS; + else + vreg->status = regulator_mode_to_status(vreg->mode); +} + static int _rpmh_regulator_vrm_set_voltage_sel(struct regulator_dev *rdev, unsigned int selector, bool wait_for_ack) { @@ -248,9 +278,42 @@ static int rpmh_regulator_vrm_set_voltage_sel(struct regulator_dev *rdev, selector > vreg->voltage_selector); } +static int _rpmh_regulator_vrm_get_voltage(struct regulator_dev *rdev, int *uV) +{ + struct rpmh_vreg *vreg = rdev_get_drvdata(rdev); + struct tcs_cmd cmd = { + .addr = vreg->addr + RPMH_REGULATOR_REG_VRM_VOLTAGE, + }; + int min_uV = rdev->constraints->min_uV; + int max_uV = rdev->constraints->max_uV; + int ret, _uV = 0; + + ret = rpmh_regulator_read_data(vreg, &cmd); + if (!ret) + _uV = (cmd.data & RPMH_REGULATOR_VOLTAGE_MASK) * 1000; + else + dev_err(vreg->dev, "failed to read VOLTAGE ret = %d\n", ret); + + if (!_uV || (_uV >= min_uV && _uV <= max_uV)) + *uV = _uV; + else + dev_err(vreg->dev, "read voltage %d is out-of-range[%d:%d]\n", + _uV, min_uV, max_uV); + + return ret; +} + static int rpmh_regulator_vrm_get_voltage_sel(struct regulator_dev *rdev) { struct rpmh_vreg *vreg = rdev_get_drvdata(rdev); + int ret, uV = 0; + + if (vreg->voltage_selector < 0) { + ret = _rpmh_regulator_vrm_get_voltage(rdev, &uV); + if (!ret && uV != 0) + vreg->voltage_selector = regulator_map_voltage_linear_range(rdev, + uV, INT_MAX); + } return vreg->voltage_selector; } @@ -284,6 +347,8 @@ static int rpmh_regulator_set_enable_state(struct regulator_dev *rdev, if (!ret) vreg->enabled = enable; + rpmh_vreg_update_status(vreg); + return ret; } @@ -333,9 +398,27 @@ static int rpmh_regulator_vrm_set_mode(struct regulator_dev *rdev, if (!ret) vreg->mode = mode; + rpmh_vreg_update_status(vreg); + return ret; } +static int rpmh_regulator_vrm_get_pmic_mode(struct rpmh_vreg *vreg, int *pmic_mode) +{ + struct tcs_cmd cmd = { + .addr = vreg->addr + RPMH_REGULATOR_REG_VRM_MODE, + }; + int ret; + + ret = rpmh_regulator_read_data(vreg, &cmd); + if (!ret) + *pmic_mode = cmd.data & RPMH_REGULATOR_MODE_MASK; + else + return -EINVAL; + + return 0; +} + static unsigned int rpmh_regulator_vrm_get_mode(struct regulator_dev *rdev) { struct rpmh_vreg *vreg = rdev_get_drvdata(rdev); @@ -343,6 +426,13 @@ static unsigned int rpmh_regulator_vrm_get_mode(struct regulator_dev *rdev) return vreg->mode; } +static int rpmh_regulator_vrm_get_status(struct regulator_dev *rdev) +{ + struct rpmh_vreg *vreg = rdev_get_drvdata(rdev); + + return vreg->status; +} + /** * rpmh_regulator_vrm_get_optimum_mode() - get the mode based on the load * @rdev: Regulator device pointer for the rpmh-regulator @@ -379,6 +469,8 @@ static int rpmh_regulator_vrm_set_bypass(struct regulator_dev *rdev, if (!ret) vreg->bypassed = enable; + rpmh_vreg_update_status(vreg); + return ret; } @@ -401,6 +493,7 @@ static const struct regulator_ops rpmh_regulator_vrm_ops = { .list_voltage = regulator_list_voltage_linear_range, .set_mode = rpmh_regulator_vrm_set_mode, .get_mode = rpmh_regulator_vrm_get_mode, + .get_status = rpmh_regulator_vrm_get_status, }; static const struct regulator_ops rpmh_regulator_vrm_drms_ops = { @@ -412,6 +505,7 @@ static const struct regulator_ops rpmh_regulator_vrm_drms_ops = { .list_voltage = regulator_list_voltage_linear_range, .set_mode = rpmh_regulator_vrm_set_mode, .get_mode = rpmh_regulator_vrm_get_mode, + .get_status = rpmh_regulator_vrm_get_status, .get_optimum_mode = rpmh_regulator_vrm_get_optimum_mode, }; @@ -424,6 +518,7 @@ static const struct regulator_ops rpmh_regulator_vrm_bypass_ops = { .list_voltage = regulator_list_voltage_linear_range, .set_mode = rpmh_regulator_vrm_set_mode, .get_mode = rpmh_regulator_vrm_get_mode, + .get_status = rpmh_regulator_vrm_get_status, .set_bypass = rpmh_regulator_vrm_set_bypass, .get_bypass = rpmh_regulator_vrm_get_bypass, }; @@ -432,6 +527,7 @@ static const struct regulator_ops rpmh_regulator_xob_ops = { .enable = rpmh_regulator_enable, .disable = rpmh_regulator_disable, .is_enabled = rpmh_regulator_is_enabled, + .get_status = rpmh_regulator_vrm_get_status, }; /** @@ -540,6 +636,83 @@ static int rpmh_regulator_init_vreg(struct rpmh_vreg *vreg, struct device *dev, return 0; } +static int rpmh_regulator_determine_initial_status(struct rpmh_vreg *vreg) +{ + struct tcs_cmd cmd = { + .addr = vreg->addr + RPMH_REGULATOR_REG_ENABLE, + }; + int ret, pmic_mode, mode; + int sts = 0; + + ret = rpmh_regulator_read_data(vreg, &cmd); + if (ret) { + vreg->status = REGULATOR_STATUS_UNDEFINED; + dev_err(vreg->dev, "failed to read ENABLE status ret = %d\n", ret); + + return ret; + } + + sts = cmd.data & RPMH_REGULATOR_ENABLE_MASK; + if (!sts) { + vreg->status = REGULATOR_STATUS_OFF; + + return 0; + } + + if (vreg->hw_data->regulator_type == XOB) { + vreg->status = REGULATOR_STATUS_ON; + + return 0; + } + + ret = rpmh_regulator_vrm_get_pmic_mode(vreg, &pmic_mode); + if (ret < 0) { + vreg->mode = REGULATOR_MODE_INVALID; + vreg->status = REGULATOR_STATUS_UNDEFINED; + dev_err(vreg->dev, "failed to read pmic_mode ret = %d\n", ret); + + return ret; + } + + /* + * NOTE: Since BOB4 BYPASS_MODE value = 0 we cannot confirm if that BOB + * regulator has been sent into bypass mode by bootloader or if bootloader + * just has not requested for any mode voting. Due this limitation, we + * must check if the read pmic_mode value is non-zero before comparing it + * to bypass mode value. This also is needed to avoid setting BYPASS status + * for LDOs which dont support bypass mode, and have the pmic_bypass_mode + * uninitialized value as zero in the vreg hw data. For such cases assume + * lowest mode/status, if pmic_mode is zero, to allow for mode voting. + */ + if (!pmic_mode) { + for (mode = REGULATOR_MODE_STANDBY; mode > REGULATOR_MODE_INVALID; mode >>= 1) { + if (vreg->hw_data->pmic_mode_map[mode] >= 0) { + vreg->mode = mode; + break; + } + } + + vreg->status = regulator_mode_to_status(vreg->mode); + return 0; + } + + if (vreg->hw_data->pmic_bypass_mode == pmic_mode) { + vreg->bypassed = true; + vreg->status = REGULATOR_STATUS_BYPASS; + return 0; + } + + for (mode = REGULATOR_MODE_STANDBY; mode > REGULATOR_MODE_INVALID; mode >>= 1) { + if (pmic_mode == vreg->hw_data->pmic_mode_map[mode]) { + vreg->mode = mode; + vreg->status = regulator_mode_to_status(vreg->mode); + break; + } + } + + return 0; +} + static const int pmic_mode_map_pmic4_ldo[REGULATOR_MODE_STANDBY + 1] = { [REGULATOR_MODE_INVALID] = -EINVAL, [REGULATOR_MODE_STANDBY] = PMIC4_LDO_MODE_RETENTION, @@ -1823,6 +1996,12 @@ static int rpmh_regulator_probe(struct platform_device *pdev) vreg_data); if (ret < 0) return ret; + + ret = rpmh_regulator_determine_initial_status(vreg); + if (ret < 0) + dev_err(dev, "failed to read initial status for %s\n", + vreg->rdesc.name); + } return 0; -- 2.25.1