Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp2894993pxb; Tue, 24 Aug 2021 10:03:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxz3rOJW/URNFOWlmvOmDRxgbFpXfhnDt7YJ7wGQn70VLz6+0CtPZcNiGkR0DEdR0sh8dOq X-Received: by 2002:aa7:de85:: with SMTP id j5mr43288556edv.147.1629824633956; Tue, 24 Aug 2021 10:03:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629824633; cv=none; d=google.com; s=arc-20160816; b=oqxBBrl/XTNO7EOeQ32ZL5wuN9Qs0QKb7ctvtcbsPP4jigpShJsYXngDan2RYBEzwH JUgex554HsdwCvLyz3kmiYXLc30+RzggRQvCOEEsTearyAheSElEIvf0+44gKLCtlhR4 tExZ7Z/+sBsfH8XLWYW8vQJPk39cCAaT+A3PwdpH/iJwT+wRqxFt4R6TdNM0Xbk9DAP5 7v642Dii4+G8dcSP0NfK9glg6o6VakNh35+Ixm1Ksl9MxTblWAulsj06pbpd0B5OuaCy u2B6legTHDpE1DTqGP6kY64UGyBlj1jz+DGyK2vxIU6a6/es8ozYPkkkdv3rhT8TTQGA Y2aw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=BrLsDTYf2lB661cJy/taDYn4o1EXG6YYBwRZT0/jofg=; b=EU0TObyEMbhgD1VMtqbVQhKWZHqdEqkr2WXkxEFIYcf01l6HGqFXTboL2xVbCXobhF xXZjYYj7UgyuybSUTOVCRioXDgWIQPgRie8GRIFTztND0gO4sjdZ+PH0i1T+LAKmG8+5 3BOd/6rkoTBZA9kvGHVtuR1lowt82dCNAxTryK/5wZh9KBIPXIMY9FqOJZjRS+VY2hBq 8SD6+1Jn5K2qL1A79v68UD2hhMu+A7MvBa5ashxNm3u/0kOvfeRExIf+5pZAExFVp28n MK5BrPLNG8EqTyXaBzyJ8yoPw16Cqlt74lM5tsqJjwm/5tP3eZYUabnL9xsm+8gXBdvT dRCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=QP4117v2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d13si18497043ejz.741.2021.08.24.10.03.29; Tue, 24 Aug 2021 10:03:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=QP4117v2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239345AbhHXRCs (ORCPT + 99 others); Tue, 24 Aug 2021 13:02:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:39104 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239094AbhHXQ7t (ORCPT ); Tue, 24 Aug 2021 12:59:49 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DE7236147F; Tue, 24 Aug 2021 16:57:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1629824257; bh=p4W+aGWilu+phCbFPw5UJIPV3jHhStkKTzckY5OTw0c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QP4117v2S4hogDpEOruKPNNHYn4KIxgI2ir6xYcvt2Bxo6m4FOLSyQTmhVpnR3kBc m9hlUEPmPQO5yJg4WS8UhFxW2nOA3cbRYpL+rbiW56AbsQ2hATCYcKMI0E2Fmm4PaV ic/IevZn2kL0eoczRvI30ZuK1Lx8bNR2yA+2iCOdo5vx28mhIqqSf8lZYOehAcBI0l UQLn8oqUXY9wJWm0dmB1gN8Wt46bbtrbE5HCxzW1e65JXWLyrU/8tkyZwbCcVjlfCa dU/uqbTi6jH4djSIEnjxq/YSHJh0Bn3U56qqoi1/Zj3TOFhMoMLNP6WUtnTav9pP7S cBy8Xv3ta1Scw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Bjorn Andersson , Stephen Boyd , Sasha Levin Subject: [PATCH 5.13 090/127] clk: qcom: gdsc: Ensure regulator init state matches GDSC state Date: Tue, 24 Aug 2021 12:55:30 -0400 Message-Id: <20210824165607.709387-91-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210824165607.709387-1-sashal@kernel.org> References: <20210824165607.709387-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.13.13-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.13.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.13.13-rc1 X-KernelTest-Deadline: 2021-08-26T16:55+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bjorn Andersson [ Upstream commit 9711759a87a041705148161b937ec847048d882e ] As GDSCs are registered and found to be already enabled gdsc_init() ensures that 1) the kernel state matches the hardware state, and 2) votable GDSCs are properly enabled from this master as well. But as the (optional) supply regulator is enabled deep into gdsc_toggle_logic(), which is only executed for votable GDSCs, the kernel's state of the regulator might not match the hardware. The regulator might be automatically turned off if no other users are present or the next call to gdsc_disable() would cause an unbalanced regulator_disable(). Given that the votable case deals with an already enabled GDSC, most of gdsc_enable() and gdsc_toggle_logic() can be skipped. Reduce it to just clearing the SW_COLLAPSE_MASK and enabling hardware control to simply call regulator_enable() in both cases. The enablement of hardware control seems to be an independent property from the GDSC being enabled, so this is moved outside that conditional segment. Lastly, as the propagation of ALWAYS_ON to GENPD_FLAG_ALWAYS_ON needs to happen regardless of the initial state this is grouped together with the other sc->pd updates at the end of the function. Cc: stable@vger.kernel.org Fixes: 37416e554961 ("clk: qcom: gdsc: Handle GDSC regulator supplies") Signed-off-by: Bjorn Andersson Link: https://lore.kernel.org/r/20210721224056.3035016-1-bjorn.andersson@linaro.org [sboyd@kernel.org: Rephrase commit text] Signed-off-by: Stephen Boyd Signed-off-by: Sasha Levin --- drivers/clk/qcom/gdsc.c | 54 +++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/drivers/clk/qcom/gdsc.c b/drivers/clk/qcom/gdsc.c index 51ed640e527b..4ece326ea233 100644 --- a/drivers/clk/qcom/gdsc.c +++ b/drivers/clk/qcom/gdsc.c @@ -357,27 +357,43 @@ static int gdsc_init(struct gdsc *sc) if (on < 0) return on; - /* - * Votable GDSCs can be ON due to Vote from other masters. - * If a Votable GDSC is ON, make sure we have a Vote. - */ - if ((sc->flags & VOTABLE) && on) - gdsc_enable(&sc->pd); + if (on) { + /* The regulator must be on, sync the kernel state */ + if (sc->rsupply) { + ret = regulator_enable(sc->rsupply); + if (ret < 0) + return ret; + } - /* - * Make sure the retain bit is set if the GDSC is already on, otherwise - * we end up turning off the GDSC and destroying all the register - * contents that we thought we were saving. - */ - if ((sc->flags & RETAIN_FF_ENABLE) && on) - gdsc_retain_ff_on(sc); + /* + * Votable GDSCs can be ON due to Vote from other masters. + * If a Votable GDSC is ON, make sure we have a Vote. + */ + if (sc->flags & VOTABLE) { + ret = regmap_update_bits(sc->regmap, sc->gdscr, + SW_COLLAPSE_MASK, val); + if (ret) + return ret; + } + + /* Turn on HW trigger mode if supported */ + if (sc->flags & HW_CTRL) { + ret = gdsc_hwctrl(sc, true); + if (ret < 0) + return ret; + } - /* If ALWAYS_ON GDSCs are not ON, turn them ON */ - if (sc->flags & ALWAYS_ON) { - if (!on) - gdsc_enable(&sc->pd); + /* + * Make sure the retain bit is set if the GDSC is already on, + * otherwise we end up turning off the GDSC and destroying all + * the register contents that we thought we were saving. + */ + if (sc->flags & RETAIN_FF_ENABLE) + gdsc_retain_ff_on(sc); + } else if (sc->flags & ALWAYS_ON) { + /* If ALWAYS_ON GDSCs are not ON, turn them ON */ + gdsc_enable(&sc->pd); on = true; - sc->pd.flags |= GENPD_FLAG_ALWAYS_ON; } if (on || (sc->pwrsts & PWRSTS_RET)) @@ -385,6 +401,8 @@ static int gdsc_init(struct gdsc *sc) else gdsc_clear_mem_on(sc); + if (sc->flags & ALWAYS_ON) + sc->pd.flags |= GENPD_FLAG_ALWAYS_ON; if (!sc->pd.power_off) sc->pd.power_off = gdsc_disable; if (!sc->pd.power_on) -- 2.30.2