From: Stephen Boyd <sboyd@codeaurora.org>
To: Sudeep Holla <sudeep.holla@arm.com>
Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Liviu Dudau <Liviu.Dudau@arm.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
"Jon Medhurst (Tixy)" <tixy@linaro.org>,
Arnd Bergmann <arnd@arndb.de>, Kevin Hilman <khilman@kernel.org>,
Olof Johansson <olof@lixom.net>,
Mike Turquette <mturquette@linaro.org>
Subject: Re: [PATCH v3 3/5] clk: add support for clocks provided by SCP(System Control Processor)
Date: Thu, 4 Jun 2015 13:20:09 -0700 [thread overview]
Message-ID: <20150604202009.GI676@codeaurora.org> (raw)
In-Reply-To: <1432720398-5701-4-git-send-email-sudeep.holla@arm.com>
On 05/27, Sudeep Holla wrote:
> +
> +#include <linux/clk-provider.h>
> +#include <linux/device.h>
> +#include <linux/err.h>
> +#include <linux/of.h>
> +#include <linux/module.h>
> +#include <linux/of_platform.h>
> +#include <linux/scpi_protocol.h>
> +
> +struct scpi_clk {
> + u32 id;
> + const char *name;
> + struct clk_hw hw;
> + struct scpi_dvfs_info *info;
> + unsigned long rate_min;
> + unsigned long rate_max;
> +};
> +
> +#define to_scpi_clk(clk) container_of(clk, struct scpi_clk, hw)
> +
> +static struct scpi_ops *scpi_ops;
Why do we need this singleton? Can we put this pointer into scpi_clk?
> +
> +static unsigned long scpi_clk_recalc_rate(struct clk_hw *hw,
> + unsigned long parent_rate)
> +{
> + struct scpi_clk *clk = to_scpi_clk(hw);
> +
> + return scpi_ops->clk_get_val(clk->id);
> +}
> +
> +static long scpi_clk_round_rate(struct clk_hw *hw, unsigned long rate,
> + unsigned long *parent_rate)
> +{
> + struct scpi_clk *clk = to_scpi_clk(hw);
> +
> + if (WARN_ON(clk->rate_min && rate < clk->rate_min))
> + rate = clk->rate_min;
> + if (WARN_ON(clk->rate_max && rate > clk->rate_max))
> + rate = clk->rate_max;
> +
> + return rate;
> +}
Hm.. this seems really generic. It might be better to support a
way to tell the framework to limit the min/max rate that's
accepted for a clk. That could be done later though.
> +
> +static int scpi_clk_set_rate(struct clk_hw *hw, unsigned long rate,
> + unsigned long parent_rate)
> +{
> + struct scpi_clk *clk = to_scpi_clk(hw);
> +
> + return scpi_ops->clk_set_val(clk->id, rate);
> +}
> +
[..]
> +
> +static int scpi_clk_add(struct device *dev, struct device_node *np)
> +{
> + struct clk **clks;
> + int idx, count;
> + struct clk_onecell_data *clk_data;
> +
> + count = of_property_count_strings(np, "clock-output-names");
> + if (count < 0) {
> + dev_err(dev, "%s: invalid clock output count\n", np->name);
> + return -EINVAL;
> + }
> +
> + clk_data = devm_kmalloc(dev, sizeof(*clk_data), GFP_KERNEL);
> + if (!clk_data)
> + return -ENOMEM;
> +
> + clks = devm_kcalloc(dev, count, sizeof(*clks), GFP_KERNEL);
> + if (!clks)
> + return -ENOMEM;
> +
> + for (idx = 0; idx < count; idx++) {
> + struct scpi_clk *sclk;
> + u32 val;
> +
> + sclk = devm_kzalloc(dev, sizeof(*sclk), GFP_KERNEL);
> + if (!sclk)
> + return -ENOMEM;
> +
> + if (of_property_read_string_index(np, "clock-output-names",
> + idx, &sclk->name)) {
> + dev_err(dev, "invalid clock name @ %s\n", np->name);
> + return -EINVAL;
> + }
> +
> + if (of_property_read_u32_index(np, "clock-indices",
> + idx, &val)) {
> + dev_err(dev, "invalid clock index @ %s\n", np->name);
> + return -EINVAL;
> + }
> +
> + sclk->id = val;
> +
> + clks[idx] = scpi_clk_ops_init(dev, np, sclk);
> + if (IS_ERR_OR_NULL(clks[idx]))
> + dev_err(dev, "failed to register clock '%s'\n",
> + sclk->name);
> + else
> + dev_dbg(dev, "Registered clock '%s'\n", sclk->name);
> + }
> +
> + clk_data->clks = clks;
> + clk_data->clk_num = idx;
> + of_clk_add_provider(np, of_clk_src_onecell_get, clk_data);
And if of_clk_add_provider() fails?
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
next prev parent reply other threads:[~2015-06-04 20:20 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-27 9:53 [PATCH v3 0/5] ARM64: juno: add SCPI mailbox protocol, clock and CPUFreq support Sudeep Holla
2015-05-27 9:53 ` [PATCH v3 1/5] Documentation: add DT binding for ARM System Control and Power Interface(SCPI) protocol Sudeep Holla
2015-05-27 13:37 ` Mark Rutland
2015-05-27 14:52 ` Sudeep Holla
2015-05-27 9:53 ` [PATCH v3 2/5] firmware: add support " Sudeep Holla
2015-05-27 9:53 ` [PATCH v3 3/5] clk: add support for clocks provided by SCP(System Control Processor) Sudeep Holla
2015-06-04 20:20 ` Stephen Boyd [this message]
2015-06-05 9:36 ` Sudeep Holla
2015-06-05 17:10 ` Sudeep Holla
2015-06-06 1:12 ` Stephen Boyd
2015-05-27 9:53 ` [PATCH v3 4/5] clk: scpi: add support for cpufreq virtual device Sudeep Holla
2015-06-04 21:19 ` Stephen Boyd
2015-06-05 9:13 ` Sudeep Holla
2015-05-27 9:53 ` [PATCH v3 5/5] cpufreq: arm_big_little: add SCPI interface driver Sudeep Holla
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150604202009.GI676@codeaurora.org \
--to=sboyd@codeaurora.org \
--cc=Liviu.Dudau@arm.com \
--cc=arnd@arndb.de \
--cc=khilman@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=mturquette@linaro.org \
--cc=olof@lixom.net \
--cc=sudeep.holla@arm.com \
--cc=tixy@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).