clk: renesas: cpg-mssr: Add support for R-Car M3-W
Subsystems (5)
Geert Uytterhoeven
maintainercover clk: renesas: cpg-mssr: Add support for R-Car M3-W
Hi Mike, Stephen,
This patch series adds initial support for the Clock Pulse Generator and Module Standby and Software Reset modules on the Renesas R-Car M3-W SoC:
- Basic core clocks,
- SCIF2 (console) module clock,
- INTC-AP (GIC) module clock (disabled pending CLK_ENABLE_HAND_OFF).
Support for more core and module clocks will be added incrementally.
/sys/kernel/debug/clk/clk_summary output:
clock enable_cnt prepare_cnt rate accuracy phase
---------------------------------------------------------------------------
scif 1 1 14745600 0 0
extalr 0 0 0 0 0
extal 1 1 16666666 0 0
cp 0 0 8333333 0 0
.main 1 1 16666666 0 0
.pll4 0 0 2399999904 0 0
.pll3 0 0 3199999872 0 0
.pll2 0 0 2399999904 0 0
.pll1 1 1 3199999872 0 0
.pll1_div2 1 1 1599999936 0 0
cl 0 0 33333332 0 0
zx 0 0 799999968 0 0
zt 0 0 399999984 0 0
ztrd2 0 0 133333328 0 0
ztr 0 0 266666656 0 0
.s3 2 2 266666656 0 0
s3d4 1 1 66666664 0 0
scif2 2 2 66666664 0 0
s3d2 0 0 133333328 0 0
s3d1 2 2 266666656 0 0
intc-ap 1 1 266666656 0 0
.s2 0 0 399999984 0 0
s2d4 0 0 99999996 0 0
s2d2 0 0 199999992 0 0
s2d1 0 0 399999984 0 0
.s1 0 0 533333312 0 0
s1d4 0 0 133333328 0 0
s1d2 0 0 266666656 0 0
s1d1 0 0 533333312 0 0
.s0 0 0 799999968 0 0
s0d12 0 0 66666664 0 0
s0d8 0 0 99999996 0 0
s0d6 0 0 133333328 0 0
s0d4 0 0 199999992 0 0
s0d3 0 0 266666656 0 0
s0d2 0 0 399999984 0 0
s0d1 0 0 799999968 0 0
.pll1_div4 0 0 799999968 0 0
.pll0 0 0 2999999880 0 0For your convenience, I've pushed this series to the topic/r8a7796-clk-v1 branch of
https://git.kernel.org/cgit/linux/kernel/git/geert/renesas-drivers.git.
Integration with renesas-drivers-2016-04-26-v4.6-rc5, and minimal board integration for testing is available in the topic/gen3-latest branch.
This has received minimal testing on r8a7796/salvator-x, and regression testing on r8a7795/salvator-x (ES1.0 and ES1.1).
Thanks for your comments!
Geert Uytterhoeven (4):
clk: renesas: cpg-mssr: Document r8a7796 support
clk: renesas: Add r8a7796 CPG Core Clock Definitions
clk: renesas: cpg-mssr: Extract common R-Car Gen3 support code
clk: renesas: cpg-mssr: Add support for R-Car M3-W
.../devicetree/bindings/clock/renesas,cpg-mssr.txt | 7 +- drivers/clk/renesas/Kconfig | 1 + drivers/clk/renesas/Makefile | 3 +- drivers/clk/renesas/r8a7795-cpg-mssr.c | 360 +-------------------- drivers/clk/renesas/r8a7796-cpg-mssr.c | 192 +++++++++++ drivers/clk/renesas/rcar-gen3-cpg.c | 359 ++++++++++++++++++++ drivers/clk/renesas/rcar-gen3-cpg.h | 43 +++ drivers/clk/renesas/renesas-cpg-mssr.c | 6 + drivers/clk/renesas/renesas-cpg-mssr.h | 1 + include/dt-bindings/clock/r8a7796-cpg-mssr.h | 69 ++++ 10 files changed, 682 insertions(+), 359 deletions(-) create mode 100644 drivers/clk/renesas/r8a7796-cpg-mssr.c create mode 100644 drivers/clk/renesas/rcar-gen3-cpg.c create mode 100644 drivers/clk/renesas/rcar-gen3-cpg.h create mode 100644 include/dt-bindings/clock/r8a7796-cpg-mssr.h
Signature · 12 lines
1.9.1
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus TorvaldsGeert Uytterhoeven
maintainerPATCH 1/4 clk: renesas: cpg-mssr: Document r8a7796 support
--- Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt +4 -3
@@ -13,7 +13,8 @@ They provide the following functionalities: Required Properties: - compatible: Must be one of: - - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC + - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC (R-Car H3) + - "renesas,r8a7796-cpg-mssr" for the r8a7796 SoC (R-Car M3-W) - reg: Base address and length of the memory resource used by the CPG/MSSR block
@@ -21,8 +22,8 @@ Required Properties: - clocks: References to external parent clocks, one entry for each entry in clock-names - clock-names: List of external parent clock names. Valid names are: - - "extal" (r8a7795) - - "extalr" (r8a7795) + - "extal" (r8a7795, r8a7796) + - "extalr" (r8a7795, r8a7796) - #clock-cells: Must be 2 - For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
Signature · 1 line
1.9.1
Re: [PATCH 1/4] clk: renesas: cpg-mssr: Document r8a7796 support
Quoted 4 lines · Geert Uytterhoeven
Signed-off-by Geert Uytterhoeven <[email protected]>--- Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
Geert Uytterhoeven
maintainerPATCH 2/4 clk: renesas: Add r8a7796 CPG Core Clock Definitions
In reply to Geert UytterhoevenAdd all R-Car M3-W Clock Pulse Generator Core Clock Outputs, as listed in Table 8.2b ("List of Clocks [R-Car M3-W]") of the R-Car Gen3 datasheet (rev. 0.51 + Errata for Rev051 Mar 31 2016).
Note that internal CPG clocks (S0, S1, S2, S3, SDSRC, and SSPSRC) are not included, as they are used as internal clock sources only, and never referenced from DT.
--- include/dt-bindings/clock/r8a7796-cpg-mssr.h | 69 ++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 include/dt-bindings/clock/r8a7796-cpg-mssr.h
include/dt-bindings/clock/r8a7796-cpg-mssr.h new file +69 -0
@@ -0,0 +1,69 @@ +/* +* Copyright (C) 2016 Renesas Electronics Corp. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +*/ +#ifndef __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__ +#define __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__ + +#include <dt-bindings/clock/renesas-cpg-mssr.h> + +/* r8a7796 CPG Core Clocks */ +#define R8A7796_CLK_Z 0 +#define R8A7796_CLK_Z2 1 +#define R8A7796_CLK_ZR 2 +#define R8A7796_CLK_ZG 3 +#define R8A7796_CLK_ZTR 4 +#define R8A7796_CLK_ZTRD2 5 +#define R8A7796_CLK_ZT 6 +#define R8A7796_CLK_ZX 7 +#define R8A7796_CLK_S0D1 8 +#define R8A7796_CLK_S0D2 9 +#define R8A7796_CLK_S0D3 10 +#define R8A7796_CLK_S0D4 11 +#define R8A7796_CLK_S0D6 12 +#define R8A7796_CLK_S0D8 13 +#define R8A7796_CLK_S0D12 14 +#define R8A7796_CLK_S1D1 15 +#define R8A7796_CLK_S1D2 16 +#define R8A7796_CLK_S1D4 17 +#define R8A7796_CLK_S2D1 18 +#define R8A7796_CLK_S2D2 19 +#define R8A7796_CLK_S2D4 20 +#define R8A7796_CLK_S3D1 21 +#define R8A7796_CLK_S3D2 22 +#define R8A7796_CLK_S3D4 23 +#define R8A7796_CLK_LB 24 +#define R8A7796_CLK_CL 25 +#define R8A7796_CLK_ZB3 26 +#define R8A7796_CLK_ZB3D2 27 +#define R8A7796_CLK_ZB3D4 28 +#define R8A7796_CLK_CR 29 +#define R8A7796_CLK_CRD2 30 +#define R8A7796_CLK_SD0H 31 +#define R8A7796_CLK_SD0 32 +#define R8A7796_CLK_SD1H 33 +#define R8A7796_CLK_SD1 34 +#define R8A7796_CLK_SD2H 35 +#define R8A7796_CLK_SD2 36 +#define R8A7796_CLK_SD3H 37 +#define R8A7796_CLK_SD3 38 +#define R8A7796_CLK_SSP2 39 +#define R8A7796_CLK_SSP1 40 +#define R8A7796_CLK_SSPRS 41 +#define R8A7796_CLK_RPC 42 +#define R8A7796_CLK_RPCD2 43 +#define R8A7796_CLK_MSO 44 +#define R8A7796_CLK_CANFD 45 +#define R8A7796_CLK_HDMI 46 +#define R8A7796_CLK_CSI0 47 +#define R8A7796_CLK_CSIREF 48 +#define R8A7796_CLK_CP 49 +#define R8A7796_CLK_CPEX 50 +#define R8A7796_CLK_R 51 +#define R8A7796_CLK_OSC 52 + +#endif /* __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__ */
Signature · 1 line
1.9.1
Geert Uytterhoeven
maintainerPATCH 3/4 clk: renesas: cpg-mssr: Extract common R-Car Gen3 support code
In reply to Geert UytterhoevenExtract the code to support parts common to all members of the R-Car Gen3 SoC family into a separate file, to ease sharing among SoC-specific drivers.
Note that while the cpg_pll_configs[] arrays and the selection of the config based on the MODE bits are identical on R-Car H3 and R-Car M3-W, they are not common, and may be different on other R-Car Gen3 SoCs.
--- drivers/clk/renesas/Makefile | 2 +- drivers/clk/renesas/r8a7795-cpg-mssr.c | 360 +-------------------------------- drivers/clk/renesas/rcar-gen3-cpg.c | 359 ++++++++++++++++++++++++++++++++ drivers/clk/renesas/rcar-gen3-cpg.h | 43 ++++ 4 files changed, 408 insertions(+), 356 deletions(-) create mode 100644 drivers/clk/renesas/rcar-gen3-cpg.c create mode 100644 drivers/clk/renesas/rcar-gen3-cpg.h
drivers/clk/renesas/Makefile +1 -1
@@ -8,7 +8,7 @@ obj-$(CONFIG_ARCH_R8A7790) += clk-rcar-gen2.o clk-div6.o obj-$(CONFIG_ARCH_R8A7791) += clk-rcar-gen2.o clk-div6.o obj-$(CONFIG_ARCH_R8A7793) += clk-rcar-gen2.o clk-div6.o obj-$(CONFIG_ARCH_R8A7794) += clk-rcar-gen2.o clk-div6.o -obj-$(CONFIG_ARCH_R8A7795) += r8a7795-cpg-mssr.o +obj-$(CONFIG_ARCH_R8A7795) += r8a7795-cpg-mssr.o rcar-gen3-cpg.o obj-$(CONFIG_ARCH_SH73A0) += clk-sh73a0.o clk-div6.o obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o clk-div6.o
drivers/clk/renesas/r8a7795-cpg-mssr.c +5 -355
409 lines not on this page · raw message
drivers/clk/renesas/rcar-gen3-cpg.c new file +359 -0
359 lines not on this page · raw message
drivers/clk/renesas/rcar-gen3-cpg.h new file +43 -0
43 lines not on this page · raw message
Signature · 1 line
1.9.1
Geert Uytterhoeven
maintainerPATCH 4/4 clk: renesas: cpg-mssr: Add support for R-Car M3-W
In reply to Geert UytterhoevenInitial support for R-Car M3-W (r8a7796), including basic core clocks, and SCIF2 (console) and INTC-AP (GIC) module clocks.
--- drivers/clk/renesas/Kconfig | 1 + drivers/clk/renesas/Makefile | 1 + drivers/clk/renesas/r8a7796-cpg-mssr.c | 192 +++++++++++++++++++++++++++++++++ drivers/clk/renesas/renesas-cpg-mssr.c | 6 ++ drivers/clk/renesas/renesas-cpg-mssr.h | 1 + 5 files changed, 201 insertions(+) create mode 100644 drivers/clk/renesas/r8a7796-cpg-mssr.c
drivers/clk/renesas/Kconfig +1 -0
@@ -1,6 +1,7 @@ config CLK_RENESAS_CPG_MSSR bool default y if ARCH_R8A7795 + default y if ARCH_R8A7796 config CLK_RENESAS_CPG_MSTP bool
drivers/clk/renesas/Makefile +1 -0
@@ -9,6 +9,7 @@ obj-$(CONFIG_ARCH_R8A7791) += clk-rcar-gen2.o clk-div6.o obj-$(CONFIG_ARCH_R8A7793) += clk-rcar-gen2.o clk-div6.o obj-$(CONFIG_ARCH_R8A7794) += clk-rcar-gen2.o clk-div6.o obj-$(CONFIG_ARCH_R8A7795) += r8a7795-cpg-mssr.o rcar-gen3-cpg.o +obj-$(CONFIG_ARCH_R8A7796) += r8a7796-cpg-mssr.o rcar-gen3-cpg.o obj-$(CONFIG_ARCH_SH73A0) += clk-sh73a0.o clk-div6.o obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o clk-div6.o
drivers/clk/renesas/r8a7796-cpg-mssr.c new file +192 -0
192 lines not on this page · raw message
drivers/clk/renesas/renesas-cpg-mssr.c +6 -0
@@ -509,6 +509,12 @@ static const struct of_device_id cpg_mssr_match[] = { .data = &r8a7795_cpg_mssr_info, },#endif +#ifdef CONFIG_ARCH_R8A7796 + { + .compatible = "renesas,r8a7796-cpg-mssr", + .data = &r8a7796_cpg_mssr_info, + }, +#endif {/* sentinel */ } };
drivers/clk/renesas/renesas-cpg-mssr.h +1 -0
@@ -131,4 +131,5 @@ struct cpg_mssr_info { };extern const struct cpg_mssr_info r8a7795_cpg_mssr_info; +extern const struct cpg_mssr_info r8a7796_cpg_mssr_info;#endif
Signature · 1 line
1.9.1
cover Add Z clock support
In reply to Geert UytterhoevenHi Geert,
This series adds Z clock support for R-Car Gen3.
It was written on top of "[PATCH 0/4] clk: renesas: cpg-mssr: Add support for R-Car M3-W" series.
Dien Pham (1):
arm64: dts: r8a7795: Add Z clock scaling support
Khiem Nguyen (3):
clk: renesas: rcar-gen3-cpg: Add Z clock
clk: renesas: r8a7795: Add Z clock
clk: renesas: r8a7796: Add Z clock
arch/arm64/boot/dts/renesas/r8a7795.dtsi | 26 ++++++ drivers/clk/renesas/r8a7795-cpg-mssr.c | 1 + drivers/clk/renesas/r8a7796-cpg-mssr.c | 2 + drivers/clk/renesas/rcar-gen3-cpg.c | 143 +++++++++++++++++++++++++++++++ drivers/clk/renesas/rcar-gen3-cpg.h | 1 + 5 files changed, 173 insertions(+)
Signature · 1 line
1.9.1
cover cpufreq: rcar: Enable CPUFreq support
This series enables CPUFreq support in available R-Car Gen3 SoC.
It depends on 2 series below:
[PATCH 0/4] clk: renesas: cpg-mssr: Add support for R-Car M3-W [RFC 0/4] Add Z clock support
All comments are appreciated.
Khiem Nguyen (2):
cpufreq: rcar: Add support for R8A7795 SoC
cpufreq: rcar: Add support for R8A7796 SoC
drivers/cpufreq/cpufreq-dt-platdev.c | 2 ++ 1 file changed, 2 insertions(+)
Signature · 1 line
1.9.1
PATCH 1/2 cpufreq: rcar: Add support for R8A7795 SoC
After the commit "a399dc9fc50 cpufreq: shmobile: Use generic platdev driver", will use cpufreq-dt-platdev driver to enable cpufreq-dt support. Hence, follow the implementation to support new R8A7795 SoC.
--- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/cpufreq-dt-platdev.c +1 -0
@@ -53,6 +53,7 @@ static const struct of_device_id machines[] __initconst = { { .compatible = "renesas,r8a7791", }, { .compatible = "renesas,r8a7793", }, { .compatible = "renesas,r8a7794", }, + { .compatible = "renesas,r8a7795", }, { .compatible = "renesas,sh73a0", }, { .compatible = "rockchip,rk2928", },
Signature · 1 line
1.9.1
PATCH 2/2 cpufreq: rcar: Add support for R8A7796 SoC
--- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpufreq/cpufreq-dt-platdev.c +1 -0
@@ -54,6 +54,7 @@ static const struct of_device_id machines[] __initconst = { { .compatible = "renesas,r8a7793", }, { .compatible = "renesas,r8a7794", }, { .compatible = "renesas,r8a7795", }, + { .compatible = "renesas,r8a7796", }, { .compatible = "renesas,sh73a0", }, { .compatible = "rockchip,rk2928", },
Signature · 1 line
1.9.1
Re: [PATCH 2/2] cpufreq: rcar: Add support for R8A7796 SoC
Quoted 18 lines · Khiem Nguyen
Signed-off-by Khiem Nguyen <[email protected]>--- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+)drivers/cpufreq/cpufreq-dt-platdev.c +1
-0@@ -54,6 +54,7 @@ static const struct of_device_id machines[] __initconst = { { .compatible = "renesas,r8a7793", }, { .compatible = "renesas,r8a7794", }, { .compatible = "renesas,r8a7795", }, + { .compatible = "renesas,r8a7796", }, { .compatible = "renesas,sh73a0", },
Quoted 1 line
{ .compatible = "rockchip,rk2928", },
Well, you could have done that in the same patch. But I don't mind two patches now.
Signature · 1 line
viresh
Re: [PATCH 1/2] cpufreq: rcar: Add support for R8A7795 SoC
In reply to Khiem NguyenQuoted 8 lines · Khiem Nguyen
After the commit "
a399dc9fc50cpufreq: shmobile: Use generic platdev driver", will use cpufreq-dt-platdev driver to enable cpufreq-dt support. Hence, follow the implementation to support new R8A7795 SoC.Signed-off-by Khiem Nguyen <[email protected]>--- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+)
Signature · 1 line
viresh
Re: [PATCH 1/2] cpufreq: rcar: Add support for R8A7795 SoC
Hi Viresh,
Quoted 11 lines · Viresh Kumar
Quoted 8 lines · Khiem Nguyen
After the commit "
a399dc9fc50cpufreq: shmobile: Use generic platdev driver", will use cpufreq-dt-platdev driver to enable cpufreq-dt support. Hence, follow the implementation to support new R8A7795 SoC.Signed-off-by Khiem Nguyen <[email protected]>--- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+)Acked-by Viresh Kumar <[email protected]>
Quoting Viresh when this file was introduced:
| This is going to be done once per boot and this shouldn't hurt. And for new | platforms we may do things differently as they are going to use opp-v2 bindings.
As r8a7795/r8a7796 are not arm32 "shmobile", but arm64, perhaps we should use this new "opp-v2" binding instead? Has it been finalized?
Thanks!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Viresh Kumar
maintainerRe: [PATCH 1/2] cpufreq: rcar: Add support for R8A7795 SoC
Quoted 15 lines · Geert Uytterhoeven
Hi Viresh,
Quoted 11 lines · Viresh Kumar
Quoted 8 lines · Khiem Nguyen
After the commit "
a399dc9fc50cpufreq: shmobile: Use generic platdev driver", will use cpufreq-dt-platdev driver to enable cpufreq-dt support. Hence, follow the implementation to support new R8A7795 SoC.Signed-off-by Khiem Nguyen <[email protected]>--- drivers/cpufreq/cpufreq-dt-platdev.c | 1 + 1 file changed, 1 insertion(+)Acked-by Viresh Kumar <[email protected]>
Quoted 7 lines
Quoting Viresh when this file was introduced:
| This is going to be done once per boot and this shouldn't hurt. And for new | platforms we may do things differently as they are going to use opp-v2 bindings.As r8a7795/r8a7796 are not arm32 "shmobile", but arm64, perhaps we should use this new "opp-v2" binding instead? Has it been finalized?
Yeah, that would be preferred.
Signature · 1 line
viresh
Re: [RFC 0/4] Add Z clock support
In reply to Khiem NguyenHi Khiem,
Quoted 3 lines · Khiem Nguyen
This series adds Z clock support for R-Car Gen3.
It was written on top of "[PATCH 0/4] clk: renesas: cpg-mssr: Add support for R-Car M3-W" series.
Thanks for your patch series!
Unfortunately it seems to be whitespace-damaged, and can't be applied without manual tweaking.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
RFC 1/4 clk: renesas: rcar-gen3-cpg: Add Z clock
In reply to Geert UytterhoevenBase on Dien Pham work.
--- drivers/clk/renesas/rcar-gen3-cpg.c | 143 ++++++++++++++++++++++++++++++++++++ drivers/clk/renesas/rcar-gen3-cpg.h | 1 + 2 files changed, 144 insertions(+)
drivers/clk/renesas/rcar-gen3-cpg.c +143 -0
@@ -28,6 +28,146 @@#define CPG_PLL2CR 0x002c#define CPG_PLL4CR 0x01f4 +/** Modify for Z-clock +* ----------------------------------------------------------------------------- +* Z Clock +* +* Traits of this clock: +* prepare - clk_prepare only ensures that parents are prepared +* enable - clk_enable only ensures that parents are enabled +* rate - rate is adjustable. clk->rate = parent->rate * mult / 32 +* parent - fixed parent. No clk_set_parent support +*/ +#define CPG_FRQCRB 0x00000004 +#define CPG_FRQCRB_KICK BIT(31) +#define CPG_FRQCRC 0x000000e0 +#define CPG_FRQCRC_ZFC_MASK (0x1f << 8) +#define CPG_FRQCRC_ZFC_SHIFT 8 + + +struct cpg_z_clk { +struct clk_hw hw; +void __iomem *reg; +void __iomem *kick_reg; +}; + +#define to_z_clk (_hw) container_of(_hw, struct cpg_z_clk, hw) + +static unsigned long cpg_z_clk_recalc_rate (struct clk_hw *hw, +unsigned long parent_rate) +{ +struct cpg_z_clk *zclk =to_z_clk (hw); +unsigned int mult; +unsigned int val; +unsigned long rate; + + val = (clk_readl (zclk->reg) &CPG_FRQCRC_ZFC_MASK ) + >>CPG_FRQCRC_ZFC_SHIFT ; + mult =32 - val; + + rate =div_u64 ((u64 )parent_rate * mult +16 ,32 ); +/* Round to closest value at 100MHz unit */ + rate =100000000 *DIV_ROUND_CLOSEST (rate,100000000 ); +return rate; +} + +static long cpg_z_clk_round_rate (struct clk_hw *hw,unsigned long rate, +unsigned long *parent_rate) +{ +unsigned long prate = *parent_rate; +unsigned int mult; + +if (!prate) + prate =1 ; + + mult =div_u64 ((u64 )rate *32 + prate/2 , prate); + mult =clamp (mult,1U ,32U ); + +return *parent_rate /32 * mult; +} + +static int cpg_z_clk_set_rate (struct clk_hw *hw,unsigned long rate, +unsigned long parent_rate) +{ +struct cpg_z_clk *zclk =to_z_clk (hw); +unsigned int mult; +u32 val, kick; +unsigned int i; + + mult =div_u64 ((u64 )rate *32 + parent_rate/2 , parent_rate); + mult =clamp (mult,1U ,32U ); + +if (clk_readl (zclk->kick_reg) &CPG_FRQCRB_KICK ) +return -EBUSY ; + + val =clk_readl (zclk->reg); + val &= ~CPG_FRQCRC_ZFC_MASK ; + val |= (32 - mult) <<CPG_FRQCRC_ZFC_SHIFT ; +clk_writel (val, zclk->reg); + +/* +* Set KICK bit in FRQCRB to update hardware setting and wait for +* clock change completion. +*/ + kick =clk_readl (zclk->kick_reg); + kick |=CPG_FRQCRB_KICK ; +clk_writel (kick, zclk->kick_reg); + +/* +* Note: There is no HW information about the worst case latency. +* +* Using experimental measurements, it seems that no more than +* ~10 iterations are needed, independently of the CPU rate. +* Since this value might be dependent of external xtal rate, pll1 +* rate or even the other emulation clocks rate, use 1000 as a +* "super" safe value. +*/ +for (i =1000 ; i; i--) { +if (!(clk_readl (zclk->kick_reg) &CPG_FRQCRB_KICK )) +return 0 ; + +cpu_relax (); + } + +return -ETIMEDOUT ; +} + +static const struct clk_ops cpg_z_clk_ops = { + .recalc_rate = cpg_z_clk_recalc_rate, + .round_rate = cpg_z_clk_round_rate, + .set_rate = cpg_z_clk_set_rate, +}; + +static struct clk *__init cpg_z_clk_register (const struct cpg_core_clk *core, +void __iomem *base, +const char *parent_name) +{ +struct clk_init_data init; +struct cpg_z_clk *zclk; +struct clk *clk; + + zclk =kzalloc (sizeof (*zclk),GFP_KERNEL ); +if (!zclk) +return ERR_PTR (-ENOMEM ); + + init.name = core->name; + init.ops = &cpg_z_clk_ops; + init.flags =CLK_SET_RATE_GATE ; + init.parent_names = &parent_name; + init.num_parents =1 ; + + zclk->reg = base +CPG_FRQCRC ; + zclk->kick_reg = base +CPG_FRQCRB ; + zclk->hw.init = &init; + + clk =clk_register (NULL , &zclk->hw); +if (IS_ERR (clk)) +kfree (zclk); + +return clk; +} + +/** End of modifying for Z-clock */ /* * SDn Clock
@@ -325,6 +465,9 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,writel (value, base +CPG_RCKCR );break ; +case CLK_TYPE_GEN3_Z : +return cpg_z_clk_register (core, base,__clk_get_name (parent)); +default :return ERR_PTR (-EINVAL ); }
drivers/clk/renesas/rcar-gen3-cpg.h +1 -0
@@ -20,6 +20,7 @@ enum rcar_gen3_clk_types {CLK_TYPE_GEN3_PLL4 ,CLK_TYPE_GEN3_SD ,CLK_TYPE_GEN3_R , + CLK_TYPE_GEN3_Z, };#define DEF_GEN3_SD (_name, _id, _parent, _offset) \
Signature · 1 line
1.9.1
Re: [RFC 1/4] clk: renesas: rcar-gen3-cpg: Add Z clock
Hi Khiem,
Quoted 3 lines · Khiem Nguyen
Base on Dien Pham work.
Signed-off-by Khiem Nguyen <[email protected]>
Thanks for your patch!
Quoted 12 lines
--- drivers/clk/renesas/rcar-gen3-cpg.c | 143 ++++++++++++++++++++++++++++++++++++ drivers/clk/renesas/rcar-gen3-cpg.h | 1 + 2 files changed, 144 insertions(+)drivers/clk/renesas/rcar-gen3-cpg.c +0
-0
drivers/clk/renesas/rcar-gen3-cpg.c line 31
Quoted 4 lines
drivers/clk/renesas/rcar-gen3-cpg.c +1
-0@@ -28,6 +28,146 @@#define CPG_PLL2CR 0x002c#define CPG_PLL4CR 0x01f4 +/** Modify for Z-clock
Please drop this comment
Quoted 11 lines
drivers/clk/renesas/rcar-gen3-cpg.c +10
-1+* ----------------------------------------------------------------------------- +* Z Clock +* +* Traits of this clock: +* prepare - clk_prepare only ensures that parents are prepared +* enable - clk_enable only ensures that parents are enabled +* rate - rate is adjustable. clk->rate = parent->rate * mult / 32 +* parent - fixed parent. No clk_set_parent support +*/ +#define CPG_FRQCRB 0x00000004
drivers/clk/renesas/rcar-gen3-cpg.c line 51
Quoted 10 lines
drivers/clk/renesas/rcar-gen3-cpg.c +10
-0+#define CPG_FRQCRB_KICK BIT(31) +#define CPG_FRQCRC 0x000000e0 +#define CPG_FRQCRC_ZFC_MASK (0x1f << 8) +#define CPG_FRQCRC_ZFC_SHIFT 8 + + +struct cpg_z_clk { +struct clk_hw hw; +void __iomem *reg; +void __iomem *kick_reg;
I would just store the base address, and always use "zclk->base + CPG_FRQCRB" or "zclk->base + CPG_FRQCRC".
Quoted 7 lines
drivers/clk/renesas/rcar-gen3-cpg.c +7
-0+}; + +#define to_z_clk (_hw) container_of(_hw, struct cpg_z_clk, hw) + +static unsigned long cpg_z_clk_recalc_rate (struct clk_hw *hw, +unsigned long parent_rate) +{
drivers/clk/renesas/rcar-gen3-cpg.c line 68
Quoted 10 lines
drivers/clk/renesas/rcar-gen3-cpg.c +10
-0+struct cpg_z_clk *zclk =to_z_clk (hw); +unsigned int mult; +unsigned int val; +unsigned long rate; + + val = (clk_readl (zclk->reg) &CPG_FRQCRC_ZFC_MASK ) + >>CPG_FRQCRC_ZFC_SHIFT ; + mult =32 - val; + + rate =div_u64 ((u64 )parent_rate * mult +16 ,32 );
The above also does rounding.
drivers/clk/renesas/rcar-gen3-cpg.c line 70
Quoted 2 lines
drivers/clk/renesas/rcar-gen3-cpg.c +2
-0+/* Round to closest value at 100MHz unit */ + rate =100000000 *DIV_ROUND_CLOSEST (rate,100000000 );
Why rounding to the closest 100MHz unit?
drivers/clk/renesas/rcar-gen3-cpg.c line 83
Quoted 13 lines
drivers/clk/renesas/rcar-gen3-cpg.c +13
-0+return rate; +} + +static long cpg_z_clk_round_rate (struct clk_hw *hw,unsigned long rate, +unsigned long *parent_rate) +{ +unsigned long prate = *parent_rate; +unsigned int mult; + +if (!prate) + prate =1 ; + + mult =div_u64 ((u64 )rate *32 + prate/2 , prate);
DIV_ROUND_CLOSEST_ULL()
drivers/clk/renesas/rcar-gen3-cpg.c line 86
Quoted 3 lines
drivers/clk/renesas/rcar-gen3-cpg.c +3
-0+ mult =clamp (mult,1U ,32U ); + +return *parent_rate /32 * mult;
Doing the division first reduces accuracy.
Please do the multiplication first (in 64-bit arithmetic).
drivers/clk/renesas/rcar-gen3-cpg.c line 97
Quoted 11 lines
drivers/clk/renesas/rcar-gen3-cpg.c +11
-0+} + +static int cpg_z_clk_set_rate (struct clk_hw *hw,unsigned long rate, +unsigned long parent_rate) +{ +struct cpg_z_clk *zclk =to_z_clk (hw); +unsigned int mult; +u32 val, kick; +unsigned int i; + + mult =div_u64 ((u64 )rate *32 + parent_rate/2 , parent_rate);
DIV_ROUND_CLOSEST_ULL()
Quoted 14 lines
drivers/clk/renesas/rcar-gen3-cpg.c +13
-0+} + +static const struct clk_ops cpg_z_clk_ops = { + .recalc_rate = cpg_z_clk_recalc_rate, + .round_rate = cpg_z_clk_round_rate, + .set_rate = cpg_z_clk_set_rate, +}; + +static struct clk *__init cpg_z_clk_register (const struct cpg_core_clk *core, +void __iomem *base, +const char *parent_name) +{ +struct clk_init_data init;
drivers/clk/renesas/rcar-gen3-cpg.c line 155
Quoted 10 lines
drivers/clk/renesas/rcar-gen3-cpg.c +10
-0+struct cpg_z_clk *zclk; +struct clk *clk; + + zclk =kzalloc (sizeof (*zclk),GFP_KERNEL ); +if (!zclk) +return ERR_PTR (-ENOMEM ); + + init.name = core->name; + init.ops = &cpg_z_clk_ops; + init.flags =CLK_SET_RATE_GATE ;
#define CLK_SET_RATE_GATE BIT(0) /* must be gated across rate change */
Given you don't implement clk_ops.disable() and clk_ops.unprepare(), CLK_SET_RATE_GATE doesn't sound like the right flag to use.
Quoted 5 lines
drivers/clk/renesas/rcar-gen3-cpg.c +5
-0+ init.parent_names = &parent_name; + init.num_parents =1 ; + + zclk->reg = base +CPG_FRQCRC ; + zclk->kick_reg = base +CPG_FRQCRB ;
drivers/clk/renesas/rcar-gen3-cpg.c line 170
Quoted 10 lines
drivers/clk/renesas/rcar-gen3-cpg.c +10
-0+ zclk->hw.init = &init; + + clk =clk_register (NULL , &zclk->hw); +if (IS_ERR (clk)) +kfree (zclk); + +return clk; +} + +/** End of modifying for Z-clock */
Please drop this comment
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Re: [RFC 1/4] clk: renesas: rcar-gen3-cpg: Add Z clock
In reply to Khiem NguyenHi Khiem,
drivers/clk/renesas/rcar-gen3-cpg.c line 29
Quoted 5 lines · Khiem Nguyen
drivers/clk/renesas/rcar-gen3-cpg.c +1
-0@@ -28,6 +28,146 @@ + val = (clk_readl (zclk->reg) &CPG_FRQCRC_ZFC_MASK )
Please use readl()/writel() instead of clk_readl/()/clk_writel().
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
RFC 2/4 clk: renesas: r8a7795: Add Z clock
In reply to Geert Uytterhoeven--- drivers/clk/renesas/r8a7795-cpg-mssr.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/renesas/r8a7795-cpg-mssr.c +1 -0
@@ -104,6 +104,7 @@ static const struct cpg_core_clk r8a7795_core_clks[] __initconst = {DEF_DIV6_RO ("r_int" ,CLK_RINT ,CLK_EXTAL ,CPG_RCKCR ,32 ),DEF_BASE ("r" ,R8A7795_CLK_R ,CLK_TYPE_GEN3_R ,CLK_RINT ), + DEF_BASE("z", R8A7795_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0), }; static const struct mssr_mod_clk r8a7795_mod_clks[] __initconst = {
Signature · 1 line
1.9.1
RFC 3/4 clk: renesas: r8a7796: Add Z clock
--- drivers/clk/renesas/r8a7796-cpg-mssr.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/clk/renesas/r8a7796-cpg-mssr.c +2 -0
@@ -94,6 +94,8 @@ static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {DEF_FIXED ("cl" ,R8A7796_CLK_CL ,CLK_PLL1_DIV2 ,48 ,1 ),DEF_FIXED ("cp" ,R8A7796_CLK_CP ,CLK_EXTAL ,2 ,1 ), + + DEF_BASE("z", R8A7795_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0), }; static const struct mssr_mod_clk r8a7796_mod_clks[] __initconst = {
Signature · 1 line
1.9.1
Re: [RFC 3/4] clk: renesas: r8a7796: Add Z clock
Hi Khiem,
drivers/clk/renesas/r8a7796-cpg-mssr.c static const struct cpg_core_clk r8a7796_core_clks[] · line 99
Quoted 10 lines · Khiem Nguyen
index c84b549..7368805 100644
drivers/clk/renesas/r8a7796-cpg-mssr.c +2
-0@@ -94,6 +94,8 @@ static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {DEF_FIXED ("cl" ,R8A7796_CLK_CL ,CLK_PLL1_DIV2 ,48 ,1 ),DEF_FIXED ("cp" ,R8A7796_CLK_CP ,CLK_EXTAL ,2 ,1 ), + + DEF_BASE("z", R8A7795_CLK_Z, CLK_TYPE_GEN3_Z, CLK_PLL0),
R8A7796_CLK_Z?
How could that work?
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
RFC 4/4 arm64: dts: r8a7795: Add Z clock scaling support
In reply to Khiem NguyenThis patch adds Z clock scaling support for CA57 in R8A7795 SoC. An OPP table is created with the supported frequency scaling.
--- arch/arm64/boot/dts/renesas/r8a7795.dtsi | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
arch/arm64/boot/dts/renesas/r8a7795.dtsi +26 -0
@@ -43,6 +43,8 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU0>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + clocks =<&cpg CPG_CORE R8A7795_CLK_Z>; + operating-points-v2 = <&cluster0_opp_tb0>; }; a57_1: cpu@1 {
@@ -52,6 +54,7 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU1>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + operating-points-v2 = <&cluster0_opp_tb0>; }; a57_2: cpu@2 { compatible = "arm,cortex-a57","arm,armv8";
@@ -60,6 +63,7 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU2>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + operating-points-v2 = <&cluster0_opp_tb0>; }; a57_3: cpu@3 { compatible = "arm,cortex-a57","arm,armv8";
@@ -68,6 +72,28 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU3>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + operating-points-v2 = <&cluster0_opp_tb0>; + }; + }; + + cluster0_opp_tb0: opp_table0 { + compatible = "operating-points-v2"; + opp-shared; + + opp@500000000 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <820000>; + clock-latency-ns = <300000>; + }; + opp@1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <820000>; + clock-latency-ns = <300000>; + }; + opp@1500000000 { + opp-hz = /bits/ 64 <1500000000>; + opp-microvolt = <820000>; + clock-latency-ns = <300000>; }; };
Signature · 1 line
1.9.1
Re: [RFC 4/4] arm64: dts: r8a7795: Add Z clock scaling support
Quoted 56 lines · Khiem Nguyen
This patch adds Z clock scaling support for CA57 in R8A7795 SoC. An OPP table is created with the supported frequency scaling.
Signed-off-by Dien Pham <[email protected]>Signed-off-by Takeshi Kihara <[email protected]>Signed-off-by Khiem Nguyen <[email protected]>--- arch/arm64/boot/dts/renesas/r8a7795.dtsi | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)arch/arm64/boot/dts/renesas/r8a7795.dtsi +16
-0@@ -43,6 +43,8 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU0>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + clocks =<&cpg CPG_CORE R8A7795_CLK_Z>; + operating-points-v2 = <&cluster0_opp_tb0>; }; a57_1: cpu@1 {@@ -52,6 +54,7 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU1>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + operating-points-v2 = <&cluster0_opp_tb0>; }; a57_2: cpu@2 { compatible = "arm,cortex-a57","arm,armv8";@@ -60,6 +63,7 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU2>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + operating-points-v2 = <&cluster0_opp_tb0>; }; a57_3: cpu@3 { compatible = "arm,cortex-a57","arm,armv8";@@ -68,6 +72,28 @@ power-domains = <&sysc R8A7795_PD_CA57_CPU3>; next-level-cache = <&L2_CA57>; enable-method = "psci"; + operating-points-v2 = <&cluster0_opp_tb0>; + }; + }; + + cluster0_opp_tb0: opp_table0 { + compatible = "operating-points-v2"; + opp-shared; + + opp@500000000 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <820000>; + clock-latency-ns = <300000>;
arch/arm64/boot/dts/renesas/r8a7795.dtsi line 96
Quoted 10 lines
arch/arm64/boot/dts/renesas/r8a7795.dtsi +10
-0+ }; + opp@1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <820000>; + clock-latency-ns = <300000>; + }; + opp@1500000000 { + opp-hz = /bits/ 64 <1500000000>; + opp-microvolt = <820000>; + clock-latency-ns = <300000>;
With W=1:
Warning (unit_address_vs_reg): Node /opp_table0/opp@500000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table0/opp@1000000000 has a unit name, but no reg property
Warning (unit_address_vs_reg): Node /opp_table0/opp@1500000000 has a unit name, but no reg property
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Re: [RFC 2/4] clk: renesas: r8a7795: Add Z clock
In reply to Khiem NguyenQuoted 1 line · Khiem Nguyen
Signed-off-by Khiem Nguyen <[email protected]>
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Hi Geert,
Quoted 10 lines · Geert Uytterhoeven
Hi Mike, Stephen,
This patch series adds initial support for the Clock Pulse Generator and Module Standby and Software Reset modules on the Renesas R-Car M3-W SoC:
- Basic core clocks,
- SCIF2 (console) module clock,
- INTC-AP (GIC) module clock (disabled pendingCLK_ENABLE_HAND_OFF).Support for more core and module clocks will be added incrementally.
I am wondering about the status of this patchset vis a vis mainline.
I would like to queue up "[PATCH v3 0/3] arm64: Add Renesas R8A7796 SoC support" for v4.8 but I'd prefer to do so only if there is a good chance that this patch-set, which is provides run-time dependency, will also be in v4.8.
Thanks!
Hi Simon,
Quoted 8 lines · Simon Horman
Quoted 7 lines · Geert Uytterhoeven
This patch series adds initial support for the Clock Pulse Generator and Module Standby and Software Reset modules on the Renesas R-Car M3-W SoC:
- Basic core clocks,
- SCIF2 (console) module clock,
- INTC-AP (GIC) module clock (disabled pendingCLK_ENABLE_HAND_OFF).
Quoted 8 lines
Quoted 1 line
Support for more core and module clocks will be added incrementally.
I am wondering about the status of this patchset vis a vis mainline.
I would like to queue up "[PATCH v3 0/3] arm64: Add Renesas R8A7796 SoC support" for v4.8 but I'd prefer to do so only if there is a good chance that this patch-set, which is provides run-time dependency, will also be in v4.8.
I plan to queue it in clk-renesas-for-v4.8 after the closing of the v4.7 merge window.
BTW, as there were no comments on the code, but people are obviously using it, and building on top of it, it would be good to receive some {Acked,Tested,Reviewed}-by tags.
Thanks!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Simon Horman
Tested-byQuoted 20 lines · Geert Uytterhoeven
Hi Simon,
Quoted 8 lines · Simon Horman
Quoted 7 lines · Geert Uytterhoeven
This patch series adds initial support for the Clock Pulse Generator and Module Standby and Software Reset modules on the Renesas R-Car M3-W SoC:
- Basic core clocks,
- SCIF2 (console) module clock,
- INTC-AP (GIC) module clock (disabled pendingCLK_ENABLE_HAND_OFF).Quoted 8 lines
Quoted 1 line
Support for more core and module clocks will be added incrementally.
I am wondering about the status of this patchset vis a vis mainline.
I would like to queue up "[PATCH v3 0/3] arm64: Add Renesas R8A7796 SoC support" for v4.8 but I'd prefer to do so only if there is a good chance that this patch-set, which is provides run-time dependency, will also be in v4.8.
Quoted 6 lines
I plan to queue it in clk-renesas-for-v4.8 after the closing of the v4.7 merge window.
BTW, as there were no comments on the code, but people are obviously using it, and building on top of it, it would be good to receive some {Acked,Tested,Reviewed}-by tags.
Sorry, I meant to do that a long time ago.