From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Osipenko Subject: Re: [PATCH v5 3/8] clk: tegra: Implement Tegra210 EMC clock Date: Tue, 10 Mar 2020 20:44:38 +0300 Message-ID: References: <20200310152003.2945170-1-thierry.reding@gmail.com> <20200310152003.2945170-4-thierry.reding@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20200310152003.2945170-4-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Content-Language: en-US Sender: linux-tegra-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Thierry Reding Cc: Jon Hunter , Rob Herring , Mark Rutland , Michael Turquette , Stephen Boyd , Joseph Lo , devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-clk-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org List-Id: linux-tegra@vger.kernel.org 10.03.2020 18:19, Thierry Reding пишет: > From: Joseph Lo > > The EMC clock needs to carefully coordinate with the EMC controller > programming to make sure external memory can be properly clocked. Do so > by hooking up the EMC clock with an EMC provider that will specify which > rates are supported by the EMC and provide a callback to use for setting > the clock rate at the EMC. > > Based on work by Peter De Schrijver . > > Signed-off-by: Joseph Lo > Signed-off-by: Thierry Reding > --- > Changes in v5: > - major rework and cleanup ... > +static u8 tegra210_clk_emc_get_parent(struct clk_hw *hw) > +{ > + struct tegra210_clk_emc *emc = to_tegra210_clk_emc(hw); > + u32 value; > + u8 src; > + > + value = readl_relaxed(emc->regs + CLK_SOURCE_EMC); > + src = (value >> CLK_SOURCE_EMC_2X_CLK_SRC_SHIFT) & > + CLK_SOURCE_EMC_2X_CLK_SRC_MASK; What about to use a generic FIELD_GET/PREP()? > +static int tegra210_clk_emc_set_rate(struct clk_hw *hw, unsigned long rate, > + unsigned long parent_rate) > +{ > + struct tegra210_clk_emc *emc = to_tegra210_clk_emc(hw); > + struct tegra210_clk_emc_provider *provider = emc->provider; > + struct tegra210_clk_emc_config *config; > + struct device *dev = provider->dev; > + struct clk_hw *old, *new, *parent; > + u8 old_idx, new_idx, index; > + struct clk *clk; > + unsigned int i; > + int err; > + > + if (!provider || !provider->configs || provider->num_configs == 0) > + return -EINVAL; Why all these checks are needed? I don't think it ever could fail, couldn't it? > +static int emc_table_lookup(struct tegra_emc *emc, unsigned long rate) > +{ > + int i; unsigned int Same for all other occurrences in the code.