2015-08-18 11:46:13

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 0/6] ARM: berlin: add cpufreq support

Hi,

This series adds the cpufreq support to the Berlin SoCs, using
cpufreq-dt.

First, the cpuclk clock is added to the BG2Q clock driver. This clock
has a divider fixed to 1, so we use a fixed factor clock here.

Then register a platform device for cpufreq-dt.

I also added the OPP table definition in the BG2Q, BG2 and BG2CD device
trees. When using a BG2Q, some bootloaders may update this table when
booting (mine doesn't).

Tested on a BG2Q DMP.

Thanks,

Antoine

Changes since v1:
- added the BG2 and BG2CD support
- moved MAX_CLKS out of the Berlin clk driver
- reordered the patches

Antoine Tenart (6):
clk: berlin: move MAX_CLKS out of drivers/clk/berlin
clk: berlin: add cpuclk
ARM: berlin: dts: add the cpufreq-dt bindings on the BG2Q
ARM: berlin: dts: add the cpufreq-dt bindings on the BG2
ARM: berlin: dts: add the cpufreq-dt bindings on the BG2CD
ARM: berlin: register cpufreq-dt

arch/arm/boot/dts/berlin2.dtsi | 10 ++++++++++
arch/arm/boot/dts/berlin2cd.dtsi | 8 ++++++++
arch/arm/boot/dts/berlin2q.dtsi | 11 +++++++++++
arch/arm/mach-berlin/berlin.c | 6 ++++++
drivers/clk/berlin/bg2.c | 1 -
drivers/clk/berlin/bg2q.c | 13 ++++++-------
include/dt-bindings/clock/berlin2.h | 2 ++
include/dt-bindings/clock/berlin2q.h | 3 +++
8 files changed, 46 insertions(+), 8 deletions(-)

--
2.5.0


2015-08-18 11:46:15

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 1/6] clk: berlin: move MAX_CLKS out of drivers/clk/berlin

Move the MAX_CLKS definition used in the Berlin clock driver outside the
driver.

Signed-off-by: Antoine Tenart <[email protected]>
---
drivers/clk/berlin/bg2.c | 1 -
drivers/clk/berlin/bg2q.c | 1 -
include/dt-bindings/clock/berlin2.h | 2 ++
include/dt-bindings/clock/berlin2q.h | 2 ++
4 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/clk/berlin/bg2.c b/drivers/clk/berlin/bg2.c
index 73153fc45ee9..469a2c57e1b4 100644
--- a/drivers/clk/berlin/bg2.c
+++ b/drivers/clk/berlin/bg2.c
@@ -91,7 +91,6 @@
*
*/

-#define MAX_CLKS 41
static struct clk *clks[MAX_CLKS];
static struct clk_onecell_data clk_data;
static DEFINE_SPINLOCK(lock);
diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c
index 221f40c2b850..a27958efab92 100644
--- a/drivers/clk/berlin/bg2q.c
+++ b/drivers/clk/berlin/bg2q.c
@@ -45,7 +45,6 @@
#define REG_SDIO0XIN_CLKCTL 0x0158
#define REG_SDIO1XIN_CLKCTL 0x015c

-#define MAX_CLKS 27
static struct clk *clks[MAX_CLKS];
static struct clk_onecell_data clk_data;
static DEFINE_SPINLOCK(lock);
diff --git a/include/dt-bindings/clock/berlin2.h b/include/dt-bindings/clock/berlin2.h
index 0c30800175df..97832b840beb 100644
--- a/include/dt-bindings/clock/berlin2.h
+++ b/include/dt-bindings/clock/berlin2.h
@@ -43,3 +43,5 @@
#define CLKID_VIDEO1 38
#define CLKID_VIDEO2 39
#define CLKID_TWD 40
+
+#define MAX_CLKS 41
diff --git a/include/dt-bindings/clock/berlin2q.h b/include/dt-bindings/clock/berlin2q.h
index 287fc3b4afb2..c79af928ae92 100644
--- a/include/dt-bindings/clock/berlin2q.h
+++ b/include/dt-bindings/clock/berlin2q.h
@@ -29,3 +29,5 @@
#define CLKID_SMEMC 24
#define CLKID_PCIE 25
#define CLKID_TWD 26
+
+#define MAX_CLKS 27
--
2.5.0

2015-08-18 11:47:39

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 2/6] clk: berlin: add cpuclk

Add cpuclk in the Berlin BG2Q clock driver. This clk has a divider
fixed to 1.

Signed-off-by: Antoine Tenart <[email protected]>
Acked-by: Stephen Boyd <[email protected]>
---
drivers/clk/berlin/bg2q.c | 12 ++++++------
include/dt-bindings/clock/berlin2q.h | 3 ++-
2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c
index a27958efab92..c2f48f3773e8 100644
--- a/drivers/clk/berlin/bg2q.c
+++ b/drivers/clk/berlin/bg2q.c
@@ -355,13 +355,13 @@ static void __init berlin2q_clock_setup(struct device_node *np)
gd->bit_idx, 0, &lock);
}

- /*
- * twdclk is derived from cpu/3
- * TODO: use cpupll until cpuclk is not available
- */
+ /* cpuclk divider is fixed to 1 */
+ clks[CLKID_CPU] =
+ clk_register_fixed_factor(NULL, "cpu", clk_names[CPUPLL],
+ 0, 1, 1);
+ /* twdclk is derived from cpu/3 */
clks[CLKID_TWD] =
- clk_register_fixed_factor(NULL, "twd", clk_names[CPUPLL],
- 0, 1, 3);
+ clk_register_fixed_factor(NULL, "twd", "cpu", 0, 1, 3);

/* check for errors on leaf clocks */
for (n = 0; n < MAX_CLKS; n++) {
diff --git a/include/dt-bindings/clock/berlin2q.h b/include/dt-bindings/clock/berlin2q.h
index c79af928ae92..771d8739f67a 100644
--- a/include/dt-bindings/clock/berlin2q.h
+++ b/include/dt-bindings/clock/berlin2q.h
@@ -29,5 +29,6 @@
#define CLKID_SMEMC 24
#define CLKID_PCIE 25
#define CLKID_TWD 26
+#define CLKID_CPU 27

-#define MAX_CLKS 27
+#define MAX_CLKS 28
--
2.5.0

2015-08-18 11:47:23

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 3/6] ARM: berlin: dts: add the cpufreq-dt bindings on the BG2Q

The BG2Q uses cpugreq-dt. Add the corresponding bindings. The operating
points can be updated by the bootloader.

Signed-off-by: Antoine Tenart <[email protected]>
---
arch/arm/boot/dts/berlin2q.dtsi | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/arch/arm/boot/dts/berlin2q.dtsi b/arch/arm/boot/dts/berlin2q.dtsi
index 63a48490e2f9..58f6792c0d77 100644
--- a/arch/arm/boot/dts/berlin2q.dtsi
+++ b/arch/arm/boot/dts/berlin2q.dtsi
@@ -53,6 +53,17 @@
device_type = "cpu";
next-level-cache = <&l2>;
reg = <0>;
+
+ clocks = <&chip_clk CLKID_CPU>;
+ clock-latency = <100000>;
+ /* Can be modified by the bootloader */
+ operating-points = <
+ /* kHz uV */
+ 1200000 1200000
+ 1000000 1200000
+ 800000 1200000
+ 600000 1200000
+ >;
};

cpu@1 {
--
2.5.0

2015-08-18 11:46:45

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 4/6] ARM: berlin: dts: add the cpufreq-dt bindings on the BG2

The BG2 uses cpugreq-dt. Add the corresponding bindings.

Signed-off-by: Antoine Tenart <[email protected]>
---
arch/arm/boot/dts/berlin2.dtsi | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/arch/arm/boot/dts/berlin2.dtsi b/arch/arm/boot/dts/berlin2.dtsi
index ef811de09908..d80dc82729b8 100644
--- a/arch/arm/boot/dts/berlin2.dtsi
+++ b/arch/arm/boot/dts/berlin2.dtsi
@@ -57,6 +57,16 @@
device_type = "cpu";
next-level-cache = <&l2>;
reg = <0>;
+
+ clocks = <&chip_clk CLKID_CPU>;
+ clock-latency = <100000>;
+ operating-points = <
+ /* kHz uV */
+ 1200000 1200000
+ 1000000 1200000
+ 800000 1200000
+ 600000 1200000
+ >;
};

cpu@1 {
--
2.5.0

2015-08-18 11:46:44

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 5/6] ARM: berlin: dts: add the cpufreq-dt bindings on the BG2CD

The BG2CD uses cpugreq-dt. Add the corresponding bindings.

Signed-off-by: Antoine Tenart <[email protected]>
---
arch/arm/boot/dts/berlin2cd.dtsi | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/arch/arm/boot/dts/berlin2cd.dtsi b/arch/arm/boot/dts/berlin2cd.dtsi
index 900213d78a32..3c7a7404f10c 100644
--- a/arch/arm/boot/dts/berlin2cd.dtsi
+++ b/arch/arm/boot/dts/berlin2cd.dtsi
@@ -56,6 +56,14 @@
device_type = "cpu";
next-level-cache = <&l2>;
reg = <0>;
+
+ clocks = <&chip_clk CLKID_CPU>;
+ clock-latency = <100000>;
+ operating-points = <
+ /* kHz uV */
+ 800000 1200000
+ 600000 1200000
+ >;
};
};

--
2.5.0

2015-08-18 11:46:25

by Antoine Tenart

[permalink] [raw]
Subject: [PATCH v2 6/6] ARM: berlin: register cpufreq-dt

The Berlin SoCs use cpufreq-dt for cpufreq. Register a platform device.

Signed-off-by: Antoine Tenart <[email protected]>
---
arch/arm/mach-berlin/berlin.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c
index ac181c6797ee..25d73870ccca 100644
--- a/arch/arm/mach-berlin/berlin.c
+++ b/arch/arm/mach-berlin/berlin.c
@@ -18,6 +18,11 @@
#include <asm/hardware/cache-l2x0.h>
#include <asm/mach/arch.h>

+static void __init berlin_init_late(void)
+{
+ platform_device_register_simple("cpufreq-dt", -1, NULL, 0);
+}
+
static const char * const berlin_dt_compat[] = {
"marvell,berlin",
NULL,
@@ -25,6 +30,7 @@ static const char * const berlin_dt_compat[] = {

DT_MACHINE_START(BERLIN_DT, "Marvell Berlin")
.dt_compat = berlin_dt_compat,
+ .init_late = berlin_init_late,
/*
* with DT probing for L2CCs, berlin_init_machine can be removed.
* Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc
--
2.5.0

2015-08-18 12:56:44

by Viresh Kumar

[permalink] [raw]
Subject: Re: [PATCH v2 0/6] ARM: berlin: add cpufreq support

On Tue, Aug 18, 2015 at 5:16 PM, Antoine Tenart
<[email protected]> wrote:
> Hi,
>
> This series adds the cpufreq support to the Berlin SoCs, using
> cpufreq-dt.
>
> First, the cpuclk clock is added to the BG2Q clock driver. This clock
> has a divider fixed to 1, so we use a fixed factor clock here.
>
> Then register a platform device for cpufreq-dt.
>
> I also added the OPP table definition in the BG2Q, BG2 and BG2CD device
> trees. When using a BG2Q, some bootloaders may update this table when
> booting (mine doesn't).

You can switch to OPP-v2 bindings if you want. Just have a look, they are
much more powerful.. Should be in linux-next/master.

2015-08-18 14:39:16

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH v2 0/6] ARM: berlin: add cpufreq support

Hi,

On Tue, Aug 18, 2015 at 06:26:42PM +0530, Viresh Kumar wrote:
> On Tue, Aug 18, 2015 at 5:16 PM, Antoine Tenart
> <[email protected]> wrote:
> >
> > This series adds the cpufreq support to the Berlin SoCs, using
> > cpufreq-dt.
> >
> > First, the cpuclk clock is added to the BG2Q clock driver. This clock
> > has a divider fixed to 1, so we use a fixed factor clock here.
> >
> > Then register a platform device for cpufreq-dt.
> >
> > I also added the OPP table definition in the BG2Q, BG2 and BG2CD device
> > trees. When using a BG2Q, some bootloaders may update this table when
> > booting (mine doesn't).
>
> You can switch to OPP-v2 bindings if you want. Just have a look, they are
> much more powerful.. Should be in linux-next/master.

Nice!

However, it seems the OPP-v2 table takes precedence over the old one.
When a default OPP-v2 table is supplied in the device tree, if the
bootloader supplies an OPP table the old way it won't be taken into
account.

So if I understood correctly, this won't work here for the BG2Q.

Antoine

--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2015-08-18 14:59:38

by Viresh Kumar

[permalink] [raw]
Subject: Re: [PATCH v2 0/6] ARM: berlin: add cpufreq support

On 18-08-15, 16:39, Antoine Tenart wrote:
> However, it seems the OPP-v2 table takes precedence over the old one.
> When a default OPP-v2 table is supplied in the device tree, if the
> bootloader supplies an OPP table the old way it won't be taken into
> account.
>
> So if I understood correctly, this won't work here for the BG2Q.

Didn't understood it completely. Are you saying that your dtb will
have two operating-points tables ?

The deal is that for any device, parsing of opp-v2 will be attempted
first. If its not available, then opp-v1 will be tried. But this is
per-device. So, one device can have opp-v2 tables and other one can do
v1 type.

--
viresh

2015-08-19 08:18:05

by Antoine Tenart

[permalink] [raw]
Subject: Re: [PATCH v2 0/6] ARM: berlin: add cpufreq support

On Tue, Aug 18, 2015 at 08:29:25PM +0530, Viresh Kumar wrote:
> On 18-08-15, 16:39, Antoine Tenart wrote:
> > However, it seems the OPP-v2 table takes precedence over the old one.
> > When a default OPP-v2 table is supplied in the device tree, if the
> > bootloader supplies an OPP table the old way it won't be taken into
> > account.
> >
> > So if I understood correctly, this won't work here for the BG2Q.
>
> Didn't understood it completely. Are you saying that your dtb will
> have two operating-points tables ?

Yes. If the device tree has an OPP-v2 table and the bootloader modify it
to add an old OPP table at boot, the one added by the bootloader won't
be taken into account by the kernel.

> The deal is that for any device, parsing of opp-v2 will be attempted
> first. If its not available, then opp-v1 will be tried. But this is
> per-device. So, one device can have opp-v2 tables and other one can do
> v1 type.

Sure. OPP-v2 tables can be used for devices having an up-to-date
bootloader or if the bootloader do not modify the device tree at boot
time to add an (old) OPP table.

Antoine

--
Antoine T?nart, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

2015-08-25 20:26:14

by Michael Turquette

[permalink] [raw]
Subject: Re: [PATCH v2 1/6] clk: berlin: move MAX_CLKS out of drivers/clk/berlin

Quoting Antoine Tenart (2015-08-18 04:46:03)
> Move the MAX_CLKS definition used in the Berlin clock driver outside the
> driver.
>
> Signed-off-by: Antoine Tenart <[email protected]>

Acked-by: Michael Turquette <[email protected]>

> ---
> drivers/clk/berlin/bg2.c | 1 -
> drivers/clk/berlin/bg2q.c | 1 -
> include/dt-bindings/clock/berlin2.h | 2 ++
> include/dt-bindings/clock/berlin2q.h | 2 ++
> 4 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clk/berlin/bg2.c b/drivers/clk/berlin/bg2.c
> index 73153fc45ee9..469a2c57e1b4 100644
> --- a/drivers/clk/berlin/bg2.c
> +++ b/drivers/clk/berlin/bg2.c
> @@ -91,7 +91,6 @@
> *
> */
>
> -#define MAX_CLKS 41
> static struct clk *clks[MAX_CLKS];
> static struct clk_onecell_data clk_data;
> static DEFINE_SPINLOCK(lock);
> diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c
> index 221f40c2b850..a27958efab92 100644
> --- a/drivers/clk/berlin/bg2q.c
> +++ b/drivers/clk/berlin/bg2q.c
> @@ -45,7 +45,6 @@
> #define REG_SDIO0XIN_CLKCTL 0x0158
> #define REG_SDIO1XIN_CLKCTL 0x015c
>
> -#define MAX_CLKS 27
> static struct clk *clks[MAX_CLKS];
> static struct clk_onecell_data clk_data;
> static DEFINE_SPINLOCK(lock);
> diff --git a/include/dt-bindings/clock/berlin2.h b/include/dt-bindings/clock/berlin2.h
> index 0c30800175df..97832b840beb 100644
> --- a/include/dt-bindings/clock/berlin2.h
> +++ b/include/dt-bindings/clock/berlin2.h
> @@ -43,3 +43,5 @@
> #define CLKID_VIDEO1 38
> #define CLKID_VIDEO2 39
> #define CLKID_TWD 40
> +
> +#define MAX_CLKS 41
> diff --git a/include/dt-bindings/clock/berlin2q.h b/include/dt-bindings/clock/berlin2q.h
> index 287fc3b4afb2..c79af928ae92 100644
> --- a/include/dt-bindings/clock/berlin2q.h
> +++ b/include/dt-bindings/clock/berlin2q.h
> @@ -29,3 +29,5 @@
> #define CLKID_SMEMC 24
> #define CLKID_PCIE 25
> #define CLKID_TWD 26
> +
> +#define MAX_CLKS 27
> --
> 2.5.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/