Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp4958286pxu; Tue, 22 Dec 2020 05:13:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJyeqsisivBCOcKDYmaer6vXnpciW00ifR8AbQzz8RtyfTvCcbw6v++f4dZMGprmD8fODKMn X-Received: by 2002:a05:6402:2377:: with SMTP id a23mr20045844eda.34.1608642814569; Tue, 22 Dec 2020 05:13:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608642814; cv=none; d=google.com; s=arc-20160816; b=RtUYfdOO9qZMrLH5Ka2VteRE5pUahsgtWtbN/kKY36O73buNH2hophPX/HtvYTEoi5 aDODp5cay+3f/oHV8mp8vVBIYFasFrj4WMRR0ufMle6TDShTUGC43u8sG2XLM+EyGO46 FnhPfaNpPURVb8Btz0hXSmtgZw8gr7gTqspb/HiR+curx+kUHJAErBJ8M/DRnA9zztRM qVyTBha8iyBKCQRfn2CJ6j0ZNu/0OebGmkVLrLTwM1Sp41909oUz45eb6SRy8ph/MA3N vKo8LmezWqgBFvob5iTNuqwNX7q3QhujshrRBYjha8j6q7nTRfydKhCauvBLu+VmM+dc cs2A== 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=Odnsf7s3CM97aGZtoH8llxPX5iykgrBUwVenUGXSm7s=; b=hH3n5iNsz24zcF/0z2ccLaDESx7VNLE0qP2PjPA3/B4kgyDo1TfIPBqy8jfcKhKs6c 5WwERgNmz6WUqeVoUSOd+12t1wNFPxukQER6JMbgT6uOV+UIDVx89OTJuR1YeuLJ5pRw fVdNvXxiv23StByJFQEqszov4iCCJ9rMP4egWeAQxlx+mTt0pREl3mI1ahtXL/EMMuSC MVHXhsouMdPgRIsgn5Lo7PLudpAJqnT41Y3G3A148hQOzeQ93Qx9Lfd1tNHDCFHO/ETj QWrLPReeiYZr3GY/vQHS8QKoScu+FRnqk3+h1Ju7FA1TBUEX0XEabjcmuwY6CL8wviFA 1g3Q== 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 s15si12347620edj.320.2020.12.22.05.13.12; Tue, 22 Dec 2020 05:13:34 -0800 (PST) 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 S1727221AbgLVNLR (ORCPT + 99 others); Tue, 22 Dec 2020 08:11:17 -0500 Received: from mailgw02.mediatek.com ([210.61.82.184]:33856 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726885AbgLVNLR (ORCPT ); Tue, 22 Dec 2020 08:11:17 -0500 X-UUID: f5ee02fdf024403f886cc9a73d821529-20201222 X-UUID: f5ee02fdf024403f886cc9a73d821529-20201222 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.14 Build 0819 with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 489946339; Tue, 22 Dec 2020 21:09:53 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs07n2.mediatek.inc (172.21.101.141) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 22 Dec 2020 21:09:50 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 22 Dec 2020 21:09:49 +0800 From: Weiyi Lu To: Matthias Brugger , Rob Herring , Stephen Boyd , Nicolas Boichat CC: , , , , , , Weiyi Lu Subject: [PATCH v6 07/22] clk: mediatek: Fix asymmetrical PLL enable and disable control Date: Tue, 22 Dec 2020 21:09:32 +0800 Message-ID: <1608642587-15634-8-git-send-email-weiyi.lu@mediatek.com> X-Mailer: git-send-email 1.8.1.1.dirty In-Reply-To: <1608642587-15634-1-git-send-email-weiyi.lu@mediatek.com> References: <1608642587-15634-1-git-send-email-weiyi.lu@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. Signed-off-by: Weiyi Lu --- 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 f440f2cd..11ed5d1 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; -- 1.8.1.1.dirty