Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp10768183ybl; Fri, 27 Dec 2019 01:47:39 -0800 (PST) X-Google-Smtp-Source: APXvYqxY6dmF649xYFKTpWsLUx4vdu6UIZM37iO4B6gcA/VOz4OMFuwBhZ2x5nncxZkuMD6/k8pH X-Received: by 2002:a9d:ed5:: with SMTP id 79mr56335933otj.72.1577440059808; Fri, 27 Dec 2019 01:47:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577440059; cv=none; d=google.com; s=arc-20160816; b=pqqLqyi4JItu2REI+FrFSi+W0fmvzN5wpeZ3qs2MWK1afeIQDkYbzkkoa1WerH3x7F wqoov+oz3nkjCoJ1ZNfVvsIvbEQDoODXo0B/ePz6PxbN6s5Ao1rg40gKiX5zAI+7WZUN DzEG2ciI51cTPVmuamB6gmII0pa8Mkpo/UnZM9msnuX5IFf+VQylsZsg3YmdcqacV2Ry XndW2W9HjB7VzPQ3B/xSGHTCRSaWeZApGjxEy0H1ZbgfE8aSMhLgYZ5tdde5oJGKBp6G 3cpwplKAxjMbbw2tZxfsFUr2acxQjJzt2TX4++ViJ3fb868diIRnoMXegfIqnetrCe1t Empg== 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=GVlVW4/J52DPwup+7MyedJ7WOv4T0cQRdp7Vr9MKmQo=; b=Iy62OM+rPgZ4TgxpVXeEniOu/TAF802SPl1q5dY7ET9oL1V0G8d3BAwtdjo6uiieGK br2YaFamuwqBBqgRWoibsUgSn5rFJk8cmQNF1GLajX/H8wdCKeFQ1oyFJEqV86cazxjg P2j1AryXY0caES0ATl81h8wsEtKL5/xim+lV2Z3QC0gB3tIHF243fwTfu47V5QSZOJjN iF6msF7vb7qqh/+qFHIRSkOjtCHXwhdgXV9UDRj5/ZTv4RJ4xgP0hngOIxqElRtZdgD0 CDbMFhv3BEAmHREpc6atyp4r4SNIcFWVSejoFjM5YaU2Px7u1HTV+5OZs4/xe0lZdb3P w+BQ== 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 c7si16427381oto.305.2019.12.27.01.47.29; Fri, 27 Dec 2019 01:47:39 -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 S1727044AbfL0Jqb (ORCPT + 99 others); Fri, 27 Dec 2019 04:46:31 -0500 Received: from mail-sz.amlogic.com ([211.162.65.117]:21110 "EHLO mail-sz.amlogic.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726677AbfL0Jqb (ORCPT ); Fri, 27 Dec 2019 04:46:31 -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; Fri, 27 Dec 2019 17:46:34 +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 v5 2/5] clk: meson: add support for A1 PLL clock ops Date: Fri, 27 Dec 2019 17:46:03 +0800 Message-ID: <20191227094606.143637-3-jian.hu@amlogic.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191227094606.143637-1-jian.hu@amlogic.com> References: <20191227094606.143637-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 module current 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 | 40 ++++++++++++++++++++++++++++++++----- drivers/clk/meson/clk-pll.h | 2 ++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c index ddb1e5634739..9eb7d465d123 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); } } @@ -294,9 +298,12 @@ 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); + int ret = 0; - if (meson_parm_read(clk->map, &pll->rst) || - !meson_parm_read(clk->map, &pll->en) || + if (MESON_PARM_APPLICABLE(&pll->rst)) + ret = meson_parm_read(clk->map, &pll->rst); + + if (ret || !meson_parm_read(clk->map, &pll->en) || !meson_parm_read(clk->map, &pll->l)) return 0; @@ -321,6 +328,23 @@ static int meson_clk_pll_enable(struct clk_hw *hw) /* do nothing if the PLL is already enabled */ if (clk_hw_is_enabled(hw)) return 0; + /* + * Compared with the previous SoCs, self-adaption module current + * is newly added for A1, keep the new power-on sequence to enable the + * PLL. + */ + if (MESON_PARM_APPLICABLE(&pll->current_en)) { + /* Enable the pll */ + meson_parm_write(clk->map, &pll->en, 1); + udelay(10); + /* Enable the pll self-adaption module current */ + meson_parm_write(clk->map, &pll->current_en, 1); + udelay(40); + /* Enable lock detect module */ + meson_parm_write(clk->map, &pll->l_detect, 1); + meson_parm_write(clk->map, &pll->l_detect, 0); + goto out; + } /* Make sure the pll is in reset */ meson_parm_write(clk->map, &pll->rst, 1); @@ -331,6 +355,7 @@ static int meson_clk_pll_enable(struct clk_hw *hw) /* Take the pll out reset */ meson_parm_write(clk->map, &pll->rst, 0); +out: if (meson_clk_pll_wait_lock(hw)) return -EIO; @@ -343,10 +368,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 module current */ + 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