From: Mason <slash.tmp@free.fr>
To: Stephen Boyd <sboyd@codeaurora.org>,
Michael Turquette <mturquette@baylibre.com>
Cc: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>,
clk <linux-clk@vger.kernel.org>, Mans Rullgard <mans@mansr.com>
Subject: Re: [PATCH v1] clk: Sigma Designs Tango4 cpuclk driver
Date: Thu, 8 Oct 2015 11:48:17 +0200 [thread overview]
Message-ID: <56163BE1.6040402@free.fr> (raw)
In-Reply-To: <20151008013054.GC26883@codeaurora.org>
On 08/10/2015 03:30, Stephen Boyd wrote:
> Marc Gonzalez wrote:
>
>> Date: Tue, 6 Oct 2015 16:07:45 +0200
>> Subject: [PATCH] clk: Sigma Designs Tango4 cpuclk driver
>
> This part doesn't go here. Please fix your mailer. Also, please
> add some commit text.
Sorry, I misread the instructions. Next submission will be
properly formatted.
Could you point out the most recent driver additions, so that
I may copy their log style?
>> drivers/clk/Makefile | 1 +
>> drivers/clk/clk-tango4.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
>
> Is there a DT binding document somewhere?
I assume this is a roundabout request for said document? :-)
Here's the actual clock tree DT I'm using:
+ clocks {
+ ranges;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ xtal: xtal {
+ compatible = "fixed-clock";
+ clock-frequency = <27000000>;
+ #clock-cells = <0>;
+ };
+
+ pll0: pll0 {
+ compatible = "sigma,tango4-pll";
+ reg = <0x10000 4>;
+ clocks = <&xtal>;
+ #clock-cells = <0>;
+ };
+
+ pll1: pll1 {
+ compatible = "sigma,tango4-pll";
+ reg = <0x10008 4>;
+ clocks = <&xtal>;
+ #clock-cells = <0>;
+ };
+
+ cpuclk: cpuclk {
+ compatible = "sigma,tango4-cpuclk";
+ reg = <0x10024 4>;
+ clocks = <&pll0>;
+ #clock-cells = <0>;
+ };
+
+ periphclk: periphclk {
+ compatible = "fixed-factor-clock";
+ clocks = <&cpuclk>;
+ clock-mult = <1>;
+ clock-div = <2>;
+ #clock-cells = <0>;
+ };
+
+ sysclk: sysclk {
+ compatible = "fixed-factor-clock";
+ clocks = <&pll1>;
+ clock-mult = <1>;
+ clock-div = <3>; /* HW bug precludes other dividers */
+ #clock-cells = <0>;
+ };
+ };
"sigma,tango4-pll" requires two properties:
- reg: the address of the relevant clkgen register (size 4)
- clocks: the input clock (must be the crystal oscillator)
(I don't know if "#clock-cells = <0>;" is required?)
"sigma,tango4-cpuclk" requires two properties:
- reg: the address of the clkdiv register (size 4)
- clocks: the input clock (always pll0)
(I don't know if "#clock-cells = <0>;" is required?)
IIUC, I should provide this documentation in my patch?
(Will probably require an iteration or two to work out the
proper format.)
>> 2 files changed, 60 insertions(+)
>> create mode 100644 drivers/clk/clk-tango4.c
>>
>> diff --git a/drivers/clk/clk-tango4.c b/drivers/clk/clk-tango4.c
>> new file mode 100644
>> index 000000000000..9c21e8c0b6e8
>> --- /dev/null
>> +++ b/drivers/clk/clk-tango4.c
>> @@ -0,0 +1,59 @@
>> +#include <linux/clk-provider.h>
>> +#include <linux/of_address.h>
>
> We need a few more includes here for iomap, __init, readl().
OK.
<linux/clk-provider.h>
<linux/of_address.h>
<linux/init.h>
<linux/io.h>
>> +#define REG(name, ...) union name { struct { u32 __VA_ARGS__; }; u32 val; }
>> +
>> +REG(SYS_clkgen_pll, N:7, :6, K:3, M:3, :5, Isel:3, :3, T:1, B:1);
>
> This is new to me. Using bitfields like this is not really a good
> idea though. Please just use masks, shifts, etc. instead.
You don't say /why/ it's not a good idea ;-)
The typical objection to bit-fields is that they are not portable.
As far as the compiler is concerned, the kernel community seems
to have "standardized" on gcc, for its convenient extensions.
<parenthesis>
Some people want to compile the kernel with icc or clang, but
there are several pit-falls.
https://llvm.linuxfoundation.org/index.php/Main_Page
https://software.intel.com/sites/default/files/article/146679/linuxkernelbuildwhitepaper.pdf
</parenthesis>
"bit-fields in gcc" are more easy to deal with than bit-fields
in general. Their behavior is specified here:
https://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit-fields-implementation.html
Since this driver is only intended to be compiled for arm
(if ARCH_TANGOX), non-portability is not an issue. In gcc,
the order of allocation of bit-fields within a unit is
"Determined by [the] ABI". (I'm using EABI)
I've also relied on this gcc extension:
https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html
to be able to write e.g. pll.N
(It's used elsewhere in the kernel)
What I like about the implementation using bit-fields is
that one only needs specify the layout, and computing the
offsets is left to the compiler (which is less error-prone).
Also the definition is short, and I find that the intent of
pll.K
is clearer than
(pll >> 13) & 7
[...] That being said, if I must forgo bit-fields to get this
driver accepted, I can write:
#define PLL_N(val) ((val) >> 0 & 0x7f)
#define PLL_K(val) ((val) >> 13 & 0x07)
#define PLL_M(val) ((val) >> 16 & 0x07)
Is that the preferred way?
>> +static void __init tango4_pll_setup(struct device_node *np)
>> +{
>> + unsigned int mul, div;
>> + union SYS_clkgen_pll pll;
>> + const char *name = np->name;
>> + const char *parent = of_clk_get_parent_name(np, 0);
>> +
>> + void __iomem *clkgen_pll = of_iomap(np, 0);
>
> What if of_iomap() fails?
If of_iomap() fails, the system will panic when it tries to
read from address 0.
I can make it explicit, if you prefer:
if (clkgen_pll == NULL)
panic("%s: invalid reg property\n", np->full_name);
>> + pll.val = readl_relaxed(clkgen_pll);
>> + iounmap(clkgen_pll);
>> +
>> + mul = (pll.N + 1);
>
> Parenthesis are useless, please remove.
They are aesthetic, to align the mul and div expressions.
>> + div = (pll.M + 1) << pll.K;
>> + clk_register_fixed_factor(NULL, name, parent, 0, mul, div);
>> +}
>> +
>> +static void __init tango4_div_setup(struct device_node *np)
>> +{
>> + const char *name = np->name;
>> + const char *parent = of_clk_get_parent_name(np, 0);
>> + void __iomem *div_ctrl = of_iomap(np, 0);
>> +
>> + clk_register_divider(NULL, name, parent, 0,
>> + div_ctrl, 8, 8, CLK_DIVIDER_ONE_BASED, NULL);
>> +}
>> +
>> +CLK_OF_DECLARE(tango4_pll, "sigma,tango4-pll", tango4_pll_setup);
>> +CLK_OF_DECLARE(tango4_cpuclk, "sigma,tango4-cpuclk", tango4_div_setup);
>
> More discussion will come with the binding, but we're pushing
> people towards making real platform drivers for their clock
> controllers, instead of parsing everything out of DT and having
> one node per clock. So if these are picking things out of some
> larger clock controller block, please rewrite the binding to be a
> real clock provider.
I don't understand what you wrote.
Could you explain what you meant?
Regards.
next prev parent reply other threads:[~2015-10-08 9:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-06 14:33 [PATCH v1] clk: Sigma Designs Tango4 cpuclk driver Marc Gonzalez
2015-10-08 1:30 ` Stephen Boyd
2015-10-08 9:48 ` Mason [this message]
2015-10-09 8:00 ` Marc Gonzalez
2015-10-15 15:52 ` [PATCH v2] clk: tango4: clkgen driver for Tango4 ARM platforms Marc Gonzalez
2015-10-15 15:55 ` Marc Gonzalez
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=56163BE1.6040402@free.fr \
--to=slash.tmp@free.fr \
--cc=linux-clk@vger.kernel.org \
--cc=mans@mansr.com \
--cc=marc_gonzalez@sigmadesigns.com \
--cc=mturquette@baylibre.com \
--cc=sboyd@codeaurora.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.