From patchwork Wed Sep 25 21:35:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Hilman X-Patchwork-Id: 11161467 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D8244912 for ; Wed, 25 Sep 2019 21:35:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B7915222BE for ; Wed, 25 Sep 2019 21:35:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1569447330; bh=qm/TdfonbBzBB/AEHmYGEpSlc7ICBztPIwTfuRqbwv0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=0gSzjKNQytkq4dvsbzpnNHPXoiHmB98YM7Y0pGAJaDAEHgVOW3Ol5NsxPCr59jz4R 3KJpHS/DyT+DCPqozWHcWXE33f4z5G6f5J8CTK69zCpvfDt2HjX06FEq+r0twzPVTp uS46velrkX8UGrSXcE+uPTK3pXVuq2BaacmLgGIY= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727745AbfIYVfa (ORCPT ); Wed, 25 Sep 2019 17:35:30 -0400 Received: from mail.kernel.org ([198.145.29.99]:46956 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727683AbfIYVfa (ORCPT ); Wed, 25 Sep 2019 17:35:30 -0400 Received: from localhost (c-71-197-186-152.hsd1.wa.comcast.net [71.197.186.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 83E3A21D82; Wed, 25 Sep 2019 21:35:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1569447329; bh=qm/TdfonbBzBB/AEHmYGEpSlc7ICBztPIwTfuRqbwv0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h/y8cEL15FyXJTSLNSZSc+k2fzrMcA62zUDP0csgm/5a/oHeq7hjHdO3+TE3RC6st W0uleeTy6Jz39AWP6uZQlF8WwahXXnzNjcv89jO03sDOcmtDn15/oUMF/iZWaTM+Gn F/uJ1kwkcR8hqxdOs6ZKMUQaCbUeagY49RY0o+Yo= From: Kevin Hilman To: linux-amlogic@lists.infradead.org, Neil Armstrong Cc: linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org Subject: [PATCH v2 2/2] soc: amlogic: ee-pwrc: ensure driver state maches HW state Date: Wed, 25 Sep 2019 14:35:28 -0700 Message-Id: <20190925213528.21515-3-khilman@kernel.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190925213528.21515-1-khilman@kernel.org> References: <20190925213528.21515-1-khilman@kernel.org> MIME-Version: 1.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Kevin Hilman During init, ensure that the driver on/off state as well as clock and reset state matches the hardware state. Do this by always calling the drivers 'on' function, and then callling the 'off' function if the HW state was initially detected as off. Signed-off-by: Kevin Hilman --- drivers/soc/amlogic/meson-ee-pwrc.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/drivers/soc/amlogic/meson-ee-pwrc.c b/drivers/soc/amlogic/meson-ee-pwrc.c index dcce8e694a07..2e8eee0dc166 100644 --- a/drivers/soc/amlogic/meson-ee-pwrc.c +++ b/drivers/soc/amlogic/meson-ee-pwrc.c @@ -323,6 +323,8 @@ static int meson_ee_pwrc_init_domain(struct platform_device *pdev, struct meson_ee_pwrc *pwrc, struct meson_ee_pwrc_domain *dom) { + bool is_off; + dom->pwrc = pwrc; dom->num_rstc = dom->desc.reset_names_count; dom->num_clks = dom->desc.clk_names_count; @@ -356,27 +358,12 @@ static int meson_ee_pwrc_init_domain(struct platform_device *pdev, dom->base.power_on = meson_ee_pwrc_on; dom->base.power_off = meson_ee_pwrc_off; - /* - * TOFIX: This is a special case for the VPU power domain, which can - * be enabled previously by the bootloader. In this case the VPU - * pipeline may be functional but no driver maybe never attach - * to this power domain, and if the domain is disabled it could - * cause system errors. This is why the pm_domain_always_on_gov - * is used here. - * For the same reason, the clocks should be enabled in case - * we need to power the domain off, otherwise the internal clocks - * prepare/enable counters won't be in sync. - */ - if (dom->num_clks && dom->desc.is_off && !dom->desc.is_off(dom)) { - int ret = clk_bulk_prepare_enable(dom->num_clks, dom->clks); - if (ret) - return ret; - - pm_genpd_init(&dom->base, &pm_domain_always_on_gov, false); - } else - pm_genpd_init(&dom->base, NULL, - (dom->desc.is_off ? - dom->desc.is_off(dom) : true)); + /* Ensure that driver state matches HW state */ + is_off = dom->desc.is_off ? dom->desc.is_off(dom) : true; + meson_ee_pwrc_on(&dom->base); + if (is_off) + meson_ee_pwrc_off(&dom->base); + pm_genpd_init(&dom->base, NULL, is_off); return 0; }