Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp2257541ybc; Wed, 20 Nov 2019 11:14:36 -0800 (PST) X-Google-Smtp-Source: APXvYqwXId7gS/rZ78xbXm31iG9k7M3jDTYDkowwVGcRolnDV4N8KbXUrXRRjGobp34ZCUxaxaEU X-Received: by 2002:a17:906:4dda:: with SMTP id f26mr7302342ejw.89.1574277276428; Wed, 20 Nov 2019 11:14:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574277276; cv=none; d=google.com; s=arc-20160816; b=pmVwYc1fzI6mNWIbxLvQHl3W0TuVirV4Q5FFSVw2sIvp4hiVgRgjxkYpyFXx37f1fK wuY/Gq2lYLJd2xsjqc5kCy71NhWVU6uZ35HhgfLzAiAatIYpORY1hPi9POD7qjgZr1iy wUebzzC7cPiAnsBAgt0sGBQNVuC1klwJm63M8OZLMzH4sLG1f6C6ZyRj4AtGQ5aatlZl s7Ar79PL/VH4q+QOEtbbHCgVdbF4J0mv97darOUvUTAqhBpokjQilPUlJR6mIEHwObRQ h1H2Gim6e5624FJ5qxphoiRzUA93zXBDGgFoRzkdrNTAqJhOMoESGt9Q56YloakV9ZkM l39Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:dkim-signature:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=JdVfNtDRnnw+p38nai+nOdloVWvXp+n5L6JxeOZT3s0=; b=WWnrSI2YaqyrnZ+cnEhe+IIKiGtrAb1r5LUktxFX/YyPHj/NaWAg10awUW4OaCdwIl G+Wcok3yRAHC2FpG/CT/aYJh5BrOriwIctmKd4AyyIp6PyYvhbG81n/25/jngf4idb8r sxu03/jy51ldxR1a1wp9Cufg3o9Q52FANqUfqEhxBM8BY0B70JhyXjvBdVJMtusXWmzm QrIVaLdwTHfsWnff8w73SYHvwEHWhl/jMSUOlXIjLQG8Bej8IHySdo6Ec1pVsByEorz/ 0Cof6JCqqlGNjG6eJcJGmTGnmiFXv8m5nbE+LuuqJqznnEdTPRNxlGN7zrT6T79t6C7f iYog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=iF3geYjU; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x18si28686ejc.97.2019.11.20.11.14.11; Wed, 20 Nov 2019 11:14:36 -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; dkim=pass header.i=@nvidia.com header.s=n1 header.b=iF3geYjU; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727378AbfKTTKc (ORCPT + 99 others); Wed, 20 Nov 2019 14:10:32 -0500 Received: from hqemgate16.nvidia.com ([216.228.121.65]:17100 "EHLO hqemgate16.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726685AbfKTTKc (ORCPT ); Wed, 20 Nov 2019 14:10:32 -0500 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate16.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Wed, 20 Nov 2019 11:10:29 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Wed, 20 Nov 2019 11:10:28 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Wed, 20 Nov 2019 11:10:28 -0800 Received: from [10.2.175.254] (10.124.1.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Wed, 20 Nov 2019 19:10:27 +0000 Subject: Re: [PATCH v1 04/17] soc: tegra: Add Tegra PMC clock registrations into PMC driver To: Dmitry Osipenko , , , , , , , , CC: , , , , , , , , , , , , , , , , , References: <1574146234-3871-1-git-send-email-skomatineni@nvidia.com> <1574146234-3871-5-git-send-email-skomatineni@nvidia.com> From: Sowjanya Komatineni Message-ID: Date: Wed, 20 Nov 2019 11:09:08 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: X-Originating-IP: [10.124.1.5] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable Content-Language: en-US DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1574277030; bh=JdVfNtDRnnw+p38nai+nOdloVWvXp+n5L6JxeOZT3s0=; h=X-PGP-Universal:Subject:To:CC:References:From:Message-ID:Date: User-Agent:MIME-Version:In-Reply-To:X-Originating-IP: X-ClientProxiedBy:Content-Type:Content-Transfer-Encoding: Content-Language; b=iF3geYjUijLCuINOr33qQKiGBl0gemXxeOJ8Mp9+YYv7R5Sxn+ZQvE5KZTLs/bp6q lj/26izjYfNNqFu/U8wTy+F7jcmy7M+/kaDoOj2+vwj3PHufokTCIp+uHsBXobta/X tx54hFvXOaeU2aq+BPEUKwdH0SuWf51lh0aEhrGelLYXaWMzh6q0JADEfQfwJJm4G3 s0pNRB0Ynr7IEBzsbP2Cju6x7l5jB+rh8IYuPREQq020aj9NMwofu4/n4iliQem9yh 6gQAPE1468nc52gkYRLmUqTgdsxO9/YqD1OonNfXPRxhR4Gx1UA9QzRBEGDX4hoBcr xOj3D+/dsu6nQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 11/20/19 9:46 AM, Dmitry Osipenko wrote: > 19.11.2019 23:08, Sowjanya Komatineni =D0=BF=D0=B8=D1=88=D0=B5=D1=82: >> On 11/19/19 11:33 AM, Dmitry Osipenko wrote: >>> 19.11.2019 09:50, Sowjanya Komatineni =D0=BF=D0=B8=D1=88=D0=B5=D1=82: >>>> Tegra PMC has clk_out_1, clk_out_2, clk_out_3 with mux and gate for >>>> each of these clocks. >>>> >>>> Currently these PMC clocks are registered by Tegra clock driver using >>>> clk_register_mux and clk_register_gate by passing PMC base address >>>> and register offsets and PMC programming for these clocks happens >>>> through direct PMC access by the clock driver. >>>> >>>> With this, when PMC is in secure mode any direct PMC access from the >>>> non-secure world does not go through and these clocks will not be >>>> functional. >>>> >>>> This patch adds these clocks registration with PMC as a clock provider >>>> for these clocks. clk_ops callback implementations for these clocks >>>> uses tegra_pmc_readl and tegra_pmc_writel which supports PMC programmi= ng >>>> in secure mode and non-secure mode. >>>> >>>> Signed-off-by: Sowjanya Komatineni >>>> --- >>>> =C2=A0 drivers/soc/tegra/pmc.c | 330 >>>> ++++++++++++++++++++++++++++++++++++++++++++++++ >>>> =C2=A0 1 file changed, 330 insertions(+) >>>> >>>> diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c >>>> index 7a5aab0b993b..790a6619ba32 100644 >>>> --- a/drivers/soc/tegra/pmc.c >>>> +++ b/drivers/soc/tegra/pmc.c >>>> @@ -13,6 +13,9 @@ >>>> =C2=A0 =C2=A0 #include >>>> =C2=A0 #include >>>> +#include >>>> +#include >>>> +#include >>>> =C2=A0 #include >>>> =C2=A0 #include >>>> =C2=A0 #include >>>> @@ -48,6 +51,7 @@ >>>> =C2=A0 #include >>>> =C2=A0 #include >>>> =C2=A0 #include >>>> +#include >>>> =C2=A0 =C2=A0 #define PMC_CNTRL=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0x0 >>>> =C2=A0 #define=C2=A0 PMC_CNTRL_INTR_POLARITY=C2=A0=C2=A0=C2=A0 BIT(17= ) /* inverts INTR >>>> polarity */ >>>> @@ -108,6 +112,7 @@ >>>> =C2=A0 #define PMC_WAKE2_STATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0x168 >>>> =C2=A0 #define PMC_SW_WAKE2_STATUS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 0x16c >>>> =C2=A0 +#define PMC_CLK_OUT_CNTRL=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 0x1a8 >>>> =C2=A0 #define PMC_SATA_PWRGT=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 0x1ac >>>> =C2=A0 #define PMC_SATA_PWRGT_PLLE_IDDQ_VALUE BIT(5) >>>> =C2=A0 #define PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL BIT(4) >>>> @@ -170,6 +175,78 @@ >>>> =C2=A0 #define=C2=A0 TEGRA_SMC_PMC_READ=C2=A0=C2=A0=C2=A0 0xaa >>>> =C2=A0 #define=C2=A0 TEGRA_SMC_PMC_WRITE=C2=A0=C2=A0=C2=A0 0xbb >>>> =C2=A0 +struct pmc_clk_mux { >>>> +=C2=A0=C2=A0=C2=A0 struct clk_hw=C2=A0=C2=A0=C2=A0 hw; >>>> +=C2=A0=C2=A0=C2=A0 unsigned long=C2=A0=C2=A0=C2=A0 offs; >>>> +=C2=A0=C2=A0=C2=A0 u32=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 mask= ; >>>> +=C2=A0=C2=A0=C2=A0 u32=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 shif= t; >>>> +=C2=A0=C2=A0=C2=A0 /* register lock */ >>>> +=C2=A0=C2=A0=C2=A0 spinlock_t=C2=A0=C2=A0=C2=A0 *lock; >>>> +}; >>>> + >>>> +#define to_pmc_clk_mux(_hw) container_of(_hw, struct pmc_clk_mux, hw) >>>> + >>>> +struct pmc_clk_gate { >>>> +=C2=A0=C2=A0=C2=A0 struct clk_hw=C2=A0=C2=A0=C2=A0 hw; >>>> +=C2=A0=C2=A0=C2=A0 unsigned long=C2=A0=C2=A0=C2=A0 offs; >>>> +=C2=A0=C2=A0=C2=A0 u32=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 shif= t; >>>> +=C2=A0=C2=A0=C2=A0 /* register lock */ >>>> +=C2=A0=C2=A0=C2=A0 spinlock_t=C2=A0=C2=A0=C2=A0 *lock; > Why clk_out_lock is needed at all? CCLK framework already takes care of > the clock's locking and then nothing else in PMC code uses that lock to > avoid races, thus that spinlock doesn't do anything useful and should be > removed from both mux and gate. Will remove spinlock in next version. >>>> +}; >>>> + >>>> +#define to_pmc_clk_gate(_hw) container_of(_hw, struct pmc_clk_gate, h= w) >>>> + >>>> +struct pmc_clk_init_data { >>>> +=C2=A0=C2=A0=C2=A0 char *mux_name; >>>> +=C2=A0=C2=A0=C2=A0 char *gate_name; >>>> +=C2=A0=C2=A0=C2=A0 const char **parents; >>>> +=C2=A0=C2=A0=C2=A0 int num_parents; >>>> +=C2=A0=C2=A0=C2=A0 int mux_id; >>>> +=C2=A0=C2=A0=C2=A0 int gate_id; >>>> +=C2=A0=C2=A0=C2=A0 char *dev_name; >>>> +=C2=A0=C2=A0=C2=A0 u8 mux_shift; >>>> +=C2=A0=C2=A0=C2=A0 u8 gate_shift; >>>> +=C2=A0=C2=A0=C2=A0 u8 init_parent; >>>> +=C2=A0=C2=A0=C2=A0 int init_state; >>>> +=C2=A0=C2=A0=C2=A0 struct pmc_clk_mux mux; >>>> +=C2=A0=C2=A0=C2=A0 struct pmc_clk_gate gate; >>>> +}; >>>> + >>>> +#define PMC_CLK(_num, _mux_shift, _gate_shift, _init_parent, >>>> _init_state)\ >>>> +=C2=A0=C2=A0=C2=A0 {\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .mux_name =3D "clk_out_" #= _num "_mux",\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .gate_name =3D "clk_out_" = #_num,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .parents =3D clk_out ##_nu= m ##_parents,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .num_parents =3D ARRAY_SIZ= E(clk_out ##_num ##_parents),\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .mux_id =3D TEGRA_PMC_CLK_= OUT_ ##_num ##_MUX,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .gate_id =3D TEGRA_PMC_CLK= _OUT_ ##_num,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .dev_name =3D "extern" #_n= um,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .mux_shift =3D _mux_shift,= \ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .gate_shift =3D _gate_shif= t,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .init_parent =3D _init_par= ent,\ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .init_state =3D _init_stat= e,\ >>>> +=C2=A0=C2=A0=C2=A0 } >>>> + >>>> +static DEFINE_SPINLOCK(clk_out_lock); >>>> + >>>> +static const char *clk_out1_parents[] =3D { "clk_m", "clk_m_div2", >>>> +=C2=A0=C2=A0=C2=A0 "clk_m_div4", "extern1", >>>> +}; >>>> + >>>> +static const char *clk_out2_parents[] =3D { "clk_m", "clk_m_div2", >>>> +=C2=A0=C2=A0=C2=A0 "clk_m_div4", "extern2", >>>> +}; >>>> + >>>> +static const char *clk_out3_parents[] =3D { "clk_m", "clk_m_div2", >>>> +=C2=A0=C2=A0=C2=A0 "clk_m_div4", "extern3", >>>> +}; >>> Why these are unused? >> They are used in PMC_CLK macro > Looks like it will better to define those three structs directly, > without the PMC_CLK macro. > > [snip] ok, will define structs directly in next version.