Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp7526933ybl; Thu, 16 Jan 2020 00:53:57 -0800 (PST) X-Google-Smtp-Source: APXvYqybGOtIIa4RKTROhZ+oOPthT30dWDzdnAimp3aTpGDHic+WST/iKNcyY9oWY/lRwXzDI0Nd X-Received: by 2002:a9d:7d99:: with SMTP id j25mr1103742otn.226.1579164836982; Thu, 16 Jan 2020 00:53:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579164836; cv=none; d=google.com; s=arc-20160816; b=evQbdN6uzdximu6T3JeIrJnevFM/BYpRHm+ZjBWhyBgPf0Pm9puApQJzX9iKNwmDUk 92+JcQ70+0pwgA2k/LlNovh3ZyOQn3kGuhXyd92QJHqiitRAXD89Uju/Mr7gj1nLBZqz nbuwwTsWz5HDCpnZA/DEvedExU1IEBDVRq0y3+lRJYRpsWMwN7R1txl5bPfb0sRvetGP LI2iyaNCrSTu/7sqW5T87M1uUhqC+Q7gkpn8MnX3wE6wc8voj1hcwbNq7jwB1AJFsVqv 8U0z8AApQDiXUrWqvdunkYPcDu1tDlbmtWLxv+4EYYOfhYjEwBX3Guq+RmJzr9aZg393 ysyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Gn3wtrM2wzwNWDg9SQdZhsw6G3h3wbG11maUR3WsTCo=; b=mV9MLZQp0dCmPRkj5fmnzMuFBB0CL8+0JuQNj46Xt/20U8Yc0+Hm5yDQ4g+stX81UC sfL2PsSuKw6JOnbiQ4Y1YEJiXdFuJjiCNPyvcb4wqzvi0IEJ1NhK4IwPaaaNOD+hbyS0 3p0tBC/E9H82JTJlfnCEz/QiAKsOiy7ScVEgKVNqHwDadNTdXyawamU7ZI1Y9pLidCTh QaTA+HC5xNVdojimCgG2cMwKigcsH2rIlCXkEbxwOdqemY37gVNXEl1k8fmcbiRhXKWz T9XZy8pKNO1974Xa2pk1WkRwV/zDF2h8zTIJgTkPvkiDdfM3XYngMoHpbybWPz1/9Pf/ zRiA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v2si2365111oth.167.2020.01.16.00.53.45; Thu, 16 Jan 2020 00:53:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730654AbgAPIEv (ORCPT + 99 others); Thu, 16 Jan 2020 03:04:51 -0500 Received: from mail-sz.amlogic.com ([211.162.65.117]:32981 "EHLO mail-sz.amlogic.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730627AbgAPIEr (ORCPT ); Thu, 16 Jan 2020 03:04:47 -0500 Received: from droid15-sz.amlogic.com (10.28.8.25) by mail-sz.amlogic.com (10.28.11.5) with Microsoft SMTP Server id 15.1.1591.10; Thu, 16 Jan 2020 16:05:11 +0800 From: Jian Hu To: Jerome Brunet , Neil Armstrong CC: Jian Hu , Kevin Hilman , Rob Herring , Martin Blumenstingl , Michael Turquette , Stephen Boyd , Qiufang Dai , Jianxin Pan , Victor Wan , Chandle Zou , , , , , Subject: [PATCH v6 2/5] clk: meson: add support for A1 PLL clock ops Date: Thu, 16 Jan 2020 16:04:37 +0800 Message-ID: <20200116080440.118679-3-jian.hu@amlogic.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20200116080440.118679-1-jian.hu@amlogic.com> References: <20200116080440.118679-1-jian.hu@amlogic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.28.8.25] Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Compared with the previous SoCs, self-adaption current module is newly added for A1, and there is no reset parm except the fixed pll. In A1 PLL, the PLL enable sequence is different, using the new power-on sequence to enable the PLL. Signed-off-by: Jian Hu --- drivers/clk/meson/clk-pll.c | 47 +++++++++++++++++++++++++++++++------ drivers/clk/meson/clk-pll.h | 2 ++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c index ddb1e5634739..10926291440f 100644 --- a/drivers/clk/meson/clk-pll.c +++ b/drivers/clk/meson/clk-pll.c @@ -283,10 +283,14 @@ static void meson_clk_pll_init(struct clk_hw *hw) struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); if (pll->init_count) { - meson_parm_write(clk->map, &pll->rst, 1); + if (MESON_PARM_APPLICABLE(&pll->rst)) + meson_parm_write(clk->map, &pll->rst, 1); + regmap_multi_reg_write(clk->map, pll->init_regs, pll->init_count); - meson_parm_write(clk->map, &pll->rst, 0); + + if (MESON_PARM_APPLICABLE(&pll->rst)) + meson_parm_write(clk->map, &pll->rst, 0); } } @@ -295,8 +299,11 @@ static int meson_clk_pll_is_enabled(struct clk_hw *hw) struct clk_regmap *clk = to_clk_regmap(hw); struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); - if (meson_parm_read(clk->map, &pll->rst) || - !meson_parm_read(clk->map, &pll->en) || + if (MESON_PARM_APPLICABLE(&pll->rst) && + meson_parm_read(clk->map, &pll->rst)) + return 0; + + if (!meson_parm_read(clk->map, &pll->en) || !meson_parm_read(clk->map, &pll->l)) return 0; @@ -323,13 +330,34 @@ static int meson_clk_pll_enable(struct clk_hw *hw) return 0; /* Make sure the pll is in reset */ - meson_parm_write(clk->map, &pll->rst, 1); + if (MESON_PARM_APPLICABLE(&pll->rst)) + meson_parm_write(clk->map, &pll->rst, 1); /* Enable the pll */ meson_parm_write(clk->map, &pll->en, 1); /* Take the pll out reset */ - meson_parm_write(clk->map, &pll->rst, 0); + if (MESON_PARM_APPLICABLE(&pll->rst)) + meson_parm_write(clk->map, &pll->rst, 0); + + /* + * Compared with the previous SoCs, self-adaption current module + * is newly added for A1, keep the new power-on sequence to enable the + * PLL. The sequence is: + * 1. enable the pll, delay for 10us + * 2. enable the pll self-adaption current module, delay for 40us + * 3. enable the lock detect module + */ + if (MESON_PARM_APPLICABLE(&pll->current_en)) { + udelay(10); + meson_parm_write(clk->map, &pll->current_en, 1); + udelay(40); + }; + + if (MESON_PARM_APPLICABLE(&pll->l_detect)) { + meson_parm_write(clk->map, &pll->l_detect, 1); + meson_parm_write(clk->map, &pll->l_detect, 0); + } if (meson_clk_pll_wait_lock(hw)) return -EIO; @@ -343,10 +371,15 @@ static void meson_clk_pll_disable(struct clk_hw *hw) struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); /* Put the pll is in reset */ - meson_parm_write(clk->map, &pll->rst, 1); + if (MESON_PARM_APPLICABLE(&pll->rst)) + meson_parm_write(clk->map, &pll->rst, 1); /* Disable the pll */ meson_parm_write(clk->map, &pll->en, 0); + + /* Disable PLL internal self-adaption current module */ + if (MESON_PARM_APPLICABLE(&pll->current_en)) + meson_parm_write(clk->map, &pll->current_en, 0); } static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, diff --git a/drivers/clk/meson/clk-pll.h b/drivers/clk/meson/clk-pll.h index 367efd0f6410..a2228c0fdce5 100644 --- a/drivers/clk/meson/clk-pll.h +++ b/drivers/clk/meson/clk-pll.h @@ -36,6 +36,8 @@ struct meson_clk_pll_data { struct parm frac; struct parm l; struct parm rst; + struct parm current_en; + struct parm l_detect; const struct reg_sequence *init_regs; unsigned int init_count; const struct pll_params_table *table; -- 2.24.0