Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4399985pxv; Mon, 5 Jul 2021 23:21:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwYRlMN1N/67BMheY4a6UfYCik8PMIksJUlXqRmvs0jqwD+w9oYjV85IXjK9sMQOkHlk5B/ X-Received: by 2002:a05:6e02:2144:: with SMTP id d4mr13672018ilv.136.1625552489472; Mon, 05 Jul 2021 23:21:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625552489; cv=none; d=google.com; s=arc-20160816; b=phI7imJHIW30IJw2d/fl36DCODFtRJNJQVG96IbG0/W2jmGpb9DJeAX5nFPvvwN1gR HaxbTCA8YkOIakxyMzHwcI6z4DzpJGQ0QwqU88/MQdtKB+Jg4mOp4EBn9ZqyWeeR5fYG eEkqwD6ELFxbjnGmBwtxYUTNYdOnqaF2k4SIERHlwVLZsrVRQUSjaSUVwAbmKw2QHima mJkoE0S+q34qDz4rY7DHPH1LTT6jwG7eozsfjsmz9ONM1fxOR2l2AWN+OEIN/6tJ/F/T 2/vspy1T0VYzhEgtWWxRFkcRAXaOwJDlWT0QPTOV+8DgTFZ5yUqSJy+ZWC7BSncKWZMN AT4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=FOxS8gMtcvDiaH9UMrfAKutjnUsrYOGmfeOQ5DCquOQ=; b=UXlwgxFl4hMuf8krmEODYVhgf4HDhE+hBnJHTNUI3zrFuLELHB69f4dv3ze/esuB7M SvJLXhUDWvvA0beTX1UQP08JICF0puCAM7A2KTpQbw3H6J4eaFAxrZ2g9667VTl56yu4 AXbhjmywxux0M5NxcRttI0QC49xaZKJJQeUnBBHQleOvq1RutGBStO40W7dXIeB3TSt6 cQJwrkjAu+pySReC3bWcN/1bxYAMfuM15Kzb4FGEtVnxALsv3dRd9h3SRq1j25Cwkbn5 nMDPAIUdfOWqm8V7jOJYyFLV5CRUEhn5HAlNpYC/O/E7hkkwuQtA18NYlTpZVbhz1AlO lfog== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v16si17672151jas.41.2021.07.05.23.21.17; Mon, 05 Jul 2021 23:21:29 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230340AbhGFGXJ (ORCPT + 99 others); Tue, 6 Jul 2021 02:23:09 -0400 Received: from mailgw01.mediatek.com ([60.244.123.138]:41059 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S230326AbhGFGXJ (ORCPT ); Tue, 6 Jul 2021 02:23:09 -0400 X-UUID: 4de892125be3422b927b148353a6a0f1-20210706 X-UUID: 4de892125be3422b927b148353a6a0f1-20210706 Received: from mtkcas07.mediatek.inc [(172.21.101.84)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1346156419; Tue, 06 Jul 2021 14:20:28 +0800 Received: from mtkcas10.mediatek.inc (172.21.101.39) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 6 Jul 2021 14:20:26 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas10.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 6 Jul 2021 14:20:26 +0800 From: Chun-Jie Chen To: Matthias Brugger , Stephen Boyd , Nicolas Boichat , Rob Herring CC: , , , , , , , Weiyi Lu , Chun-Jie Chen Subject: [v13 06/21] clk: mediatek: Fix asymmetrical PLL enable and disable control Date: Tue, 6 Jul 2021 14:19:05 +0800 Message-ID: <20210706061920.16013-7-chun-jie.chen@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20210706061920.16013-1-chun-jie.chen@mediatek.com> References: <20210706061920.16013-1-chun-jie.chen@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In fact, the en_mask is a combination of divider enable mask and pll enable bit(bit0). Before this patch, we enabled both divider mask and bit0 in prepare(), but only cleared the bit0 in unprepare(). In the future, we hope en_mask will only be used as divider enable mask. The enable register(CON0) will be set in 2 steps: first is divider mask, and then bit0 during prepare(), and vice versa. But considering backward compatibility, at this stage we allow en_mask to be a combination or a pure divider enable mask. And then we will make en_mask a pure divider enable mask in another following patch series. Reviewed-by: Ikjoon Jang Signed-off-by: Weiyi Lu Signed-off-by: Chun-Jie Chen --- drivers/clk/mediatek/clk-pll.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/clk/mediatek/clk-pll.c b/drivers/clk/mediatek/clk-pll.c index f440f2cd0b69..11ed5d1d1c36 100644 --- a/drivers/clk/mediatek/clk-pll.c +++ b/drivers/clk/mediatek/clk-pll.c @@ -238,6 +238,7 @@ static int mtk_pll_prepare(struct clk_hw *hw) { struct mtk_clk_pll *pll = to_mtk_clk_pll(hw); u32 r; + u32 div_en_mask; r = readl(pll->pwr_addr) | CON0_PWR_ON; writel(r, pll->pwr_addr); @@ -247,10 +248,15 @@ static int mtk_pll_prepare(struct clk_hw *hw) writel(r, pll->pwr_addr); udelay(1); - r = readl(pll->base_addr + REG_CON0); - r |= pll->data->en_mask; + r = readl(pll->base_addr + REG_CON0) | CON0_BASE_EN; writel(r, pll->base_addr + REG_CON0); + div_en_mask = pll->data->en_mask & ~CON0_BASE_EN; + if (div_en_mask) { + r = readl(pll->base_addr + REG_CON0) | div_en_mask; + writel(r, pll->base_addr + REG_CON0); + } + __mtk_pll_tuner_enable(pll); udelay(20); @@ -268,6 +274,7 @@ static void mtk_pll_unprepare(struct clk_hw *hw) { struct mtk_clk_pll *pll = to_mtk_clk_pll(hw); u32 r; + u32 div_en_mask; if (pll->data->flags & HAVE_RST_BAR) { r = readl(pll->base_addr + REG_CON0); @@ -277,8 +284,13 @@ static void mtk_pll_unprepare(struct clk_hw *hw) __mtk_pll_tuner_disable(pll); - r = readl(pll->base_addr + REG_CON0); - r &= ~CON0_BASE_EN; + div_en_mask = pll->data->en_mask & ~CON0_BASE_EN; + if (div_en_mask) { + r = readl(pll->base_addr + REG_CON0) & ~div_en_mask; + writel(r, pll->base_addr + REG_CON0); + } + + r = readl(pll->base_addr + REG_CON0) & ~CON0_BASE_EN; writel(r, pll->base_addr + REG_CON0); r = readl(pll->pwr_addr) | CON0_ISO_EN; -- 2.18.0