* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
@ 2013-10-23 13:04 Andrew Lunn
2013-10-23 13:04 ` [PATCH 2/4] mvebu: Dove: Instantiate cpufreq driver Andrew Lunn
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 13:04 UTC (permalink / raw)
To: linux-arm-kernel
The Marvell Dove SoC can run the CPU at two frequencies. The high
frequencey is from a PLL, while the lower is the same as the DDR
clock. Add a cpufreq driver to swap between these frequences.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
Sort header files
Remove unneeded header files
Notify only on change
Use get_cpu_device(0), devm_clk_get()
Use platform_get_resource_byname()
Error check clk_prepare_enable()
Comment the interrupt handler
---
drivers/cpufreq/Kconfig.arm | 5 +
drivers/cpufreq/Makefile | 1 +
drivers/cpufreq/dove-cpufreq.c | 279 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 285 insertions(+)
create mode 100644 drivers/cpufreq/dove-cpufreq.c
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
index 701ec95..9560384 100644
--- a/drivers/cpufreq/Kconfig.arm
+++ b/drivers/cpufreq/Kconfig.arm
@@ -8,6 +8,11 @@ config ARM_BIG_LITTLE_CPUFREQ
help
This enables the Generic CPUfreq driver for ARM big.LITTLE platforms.
+config ARM_DOVE_CPUFREQ
+ def_bool ARCH_DOVE && OF
+ help
+ This adds the CPUFreq driver for Marvell Dove SoCs.
+
config ARM_DT_BL_CPUFREQ
tristate "Generic probing via DT for ARM big LITTLE CPUfreq driver"
depends on ARM_BIG_LITTLE_CPUFREQ && OF
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index b7948bb..5956661 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_ARM_DT_BL_CPUFREQ) += arm_big_little_dt.o
obj-$(CONFIG_ARCH_DAVINCI_DA850) += davinci-cpufreq.o
obj-$(CONFIG_UX500_SOC_DB8500) += dbx500-cpufreq.o
+obj-$(CONFIG_ARM_DOVE_CPUFREQ) += dove-cpufreq.o
obj-$(CONFIG_ARM_EXYNOS_CPUFREQ) += exynos-cpufreq.o
obj-$(CONFIG_ARM_EXYNOS4210_CPUFREQ) += exynos4210-cpufreq.o
obj-$(CONFIG_ARM_EXYNOS4X12_CPUFREQ) += exynos4x12-cpufreq.o
diff --git a/drivers/cpufreq/dove-cpufreq.c b/drivers/cpufreq/dove-cpufreq.c
new file mode 100644
index 0000000..10f013c
--- /dev/null
+++ b/drivers/cpufreq/dove-cpufreq.c
@@ -0,0 +1,279 @@
+/*
+ * dove_freq.c: cpufreq driver for the Marvell dove
+ *
+ * Copyright (C) 2013 Andrew Lunn <andrew@lunn.ch>
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/clk.h>
+#include <linux/cpu.h>
+#include <linux/cpufreq.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <asm/proc-fns.h>
+
+#define DFS_CR 0x00
+#define DFS_EN BIT(0)
+#define CPU_SLOW_EN BIT(1)
+#define L2_RATIO_OFFS 9
+#define L2_RATIO_MASK (0x3F << L2_RATIO_OFFS)
+#define DFS_SR 0x04
+#define CPU_SLOW_MODE_STTS BIT(1)
+
+/* PMU_CR */
+#define MASK_FIQ BIT(28)
+#define MASK_IRQ BIT(24) /* PMU_CR */
+
+/* CPU Clock Divider Control 0 Register */
+#define DPRATIO_OFFS 24
+#define DPRATIO_MASK (0x3F << DPRATIO_OFFS)
+#define XPRATIO_OFFS 16
+#define XPRATIO_MASK (0x3F << XPRATIO_OFFS)
+
+static struct priv
+{
+ struct clk *cpu_clk;
+ struct clk *ddr_clk;
+ struct device *dev;
+ unsigned long dpratio;
+ unsigned long xpratio;
+ void __iomem *dfs;
+ void __iomem *pmu_cr;
+ void __iomem *pmu_clk_div;
+} priv;
+
+#define STATE_CPU_FREQ 0x01
+#define STATE_DDR_FREQ 0x02
+
+/*
+ * Dove can swap the clock to the CPU between two clocks:
+ *
+ * - cpu clk
+ * - ddr clk
+ *
+ * The frequencies are set@runtime before registering this
+ * table.
+ */
+static struct cpufreq_frequency_table dove_freq_table[] = {
+ {STATE_CPU_FREQ, 0}, /* CPU uses cpuclk */
+ {STATE_DDR_FREQ, 0}, /* CPU uses ddrclk */
+ {0, CPUFREQ_TABLE_END},
+};
+
+static unsigned int dove_cpufreq_get_cpu_frequency(unsigned int cpu)
+{
+ unsigned long reg = readl_relaxed(priv.dfs + DFS_SR);
+
+ if (reg & CPU_SLOW_MODE_STTS)
+ return dove_freq_table[1].frequency;
+ return dove_freq_table[0].frequency;
+}
+
+static void dove_cpufreq_set_cpu_state(struct cpufreq_policy *policy,
+ unsigned int index)
+{
+ struct cpufreq_freqs freqs;
+ unsigned int state = dove_freq_table[index].driver_data;
+ unsigned long reg, cr;
+
+ freqs.old = dove_cpufreq_get_cpu_frequency(0);
+ freqs.new = dove_freq_table[index].frequency;
+
+ if (freqs.old != freqs.new) {
+ cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
+ local_irq_disable();
+
+ /* Mask IRQ and FIQ to CPU */
+ cr = readl(priv.pmu_cr);
+ cr |= MASK_IRQ | MASK_FIQ;
+ writel(cr, priv.pmu_cr);
+
+ /* Set/Clear the CPU_SLOW_EN bit */
+ reg = readl_relaxed(priv.dfs + DFS_CR);
+ reg &= ~L2_RATIO_MASK;
+
+ switch (state) {
+ case STATE_CPU_FREQ:
+ reg |= priv.xpratio;
+ reg &= ~CPU_SLOW_EN;
+ break;
+ case STATE_DDR_FREQ:
+ reg |= (priv.dpratio | CPU_SLOW_EN);
+ break;
+ }
+
+ /* Start the DFS process */
+ reg |= DFS_EN;
+
+ writel(reg, priv.dfs + DFS_CR);
+
+ /* Wait-for-Interrupt, while the hardware changes frequency */
+ cpu_do_idle();
+
+ local_irq_enable();
+ cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
+ }
+}
+
+static int dove_cpufreq_target(struct cpufreq_policy *policy,
+ unsigned int target_freq,
+ unsigned int relation)
+{
+ unsigned int index = 0;
+
+ if (cpufreq_frequency_table_target(policy, dove_freq_table,
+ target_freq, relation, &index))
+ return -EINVAL;
+
+ dove_cpufreq_set_cpu_state(policy, index);
+
+ return 0;
+}
+
+static int dove_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+ return cpufreq_generic_init(policy, dove_freq_table, 5000);
+}
+
+/*
+ * Handle the interrupt raised when the frequency change is
+ * complete.
+ */
+static irqreturn_t dove_cpufreq_irq(int irq, void *dev)
+{
+ return IRQ_HANDLED;
+}
+
+static struct cpufreq_driver dove_cpufreq_driver = {
+ .get = dove_cpufreq_get_cpu_frequency,
+ .verify = cpufreq_generic_frequency_table_verify,
+ .target = dove_cpufreq_target,
+ .init = dove_cpufreq_cpu_init,
+ .exit = cpufreq_generic_exit,
+ .name = "dove-cpufreq",
+ .attr = cpufreq_generic_attr,
+};
+
+static int dove_cpufreq_probe(struct platform_device *pdev)
+{
+ struct device *cpu_dev;
+ struct resource *res;
+ int err, irq;
+
+ memset(&priv, 0, sizeof(priv));
+ priv.dev = &pdev->dev;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+ "cpufreq: DFS");
+ priv.dfs = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(priv.dfs))
+ return PTR_ERR(priv.dfs);
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+ "cpufreq: PMU CR");
+ priv.pmu_cr = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(priv.pmu_cr))
+ return PTR_ERR(priv.pmu_cr);
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+ "cpufreq: PMU Clk Div");
+ priv.pmu_clk_div = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(priv.pmu_clk_div))
+ return PTR_ERR(priv.pmu_clk_div);
+
+ cpu_dev = get_cpu_device(0);
+
+ priv.cpu_clk = devm_clk_get(cpu_dev, "cpu_clk");
+ if (IS_ERR(priv.cpu_clk)) {
+ err = PTR_ERR(priv.cpu_clk);
+ goto out;
+ }
+
+ err = clk_prepare_enable(priv.cpu_clk);
+ if (err)
+ goto out;
+
+ dove_freq_table[0].frequency = clk_get_rate(priv.cpu_clk) / 1000;
+
+ priv.ddr_clk = devm_clk_get(cpu_dev, "ddrclk");
+ if (IS_ERR(priv.ddr_clk)) {
+ err = PTR_ERR(priv.ddr_clk);
+ goto out;
+ }
+
+ err = clk_prepare_enable(priv.ddr_clk);
+ if (err)
+ goto out;
+
+ dove_freq_table[1].frequency = clk_get_rate(priv.ddr_clk) / 1000;
+
+ irq = irq_of_parse_and_map(cpu_dev->of_node, 0);
+ if (!irq) {
+ err = -ENXIO;
+ goto out;
+ }
+
+ err = devm_request_irq(&pdev->dev, irq, dove_cpufreq_irq,
+ 0, "dove-cpufreq", NULL);
+ if (err) {
+ dev_err(&pdev->dev, "cannot assign irq %d, %d\n", irq, err);
+ goto out;
+ }
+
+ /* Read the target ratio which should be the DDR ratio */
+ priv.dpratio = readl_relaxed(priv.pmu_clk_div);
+ priv.dpratio = (priv.dpratio & DPRATIO_MASK) >> DPRATIO_OFFS;
+ priv.dpratio = priv.dpratio << L2_RATIO_OFFS;
+
+ /* Save L2 ratio@reset */
+ priv.xpratio = readl(priv.pmu_clk_div);
+ priv.xpratio = (priv.xpratio & XPRATIO_MASK) >> XPRATIO_OFFS;
+ priv.xpratio = priv.xpratio << L2_RATIO_OFFS;
+
+ err = cpufreq_register_driver(&dove_cpufreq_driver);
+ if (!err)
+ return 0;
+
+ dev_err(priv.dev, "Failed to register cpufreq driver");
+
+out:
+ clk_disable_unprepare(priv.ddr_clk);
+ clk_disable_unprepare(priv.cpu_clk);
+
+ return err;
+}
+
+static int dove_cpufreq_remove(struct platform_device *pdev)
+{
+ cpufreq_unregister_driver(&dove_cpufreq_driver);
+
+ clk_disable_unprepare(priv.ddr_clk);
+ clk_disable_unprepare(priv.cpu_clk);
+
+ return 0;
+}
+
+static struct platform_driver dove_cpufreq_platform_driver = {
+ .probe = dove_cpufreq_probe,
+ .remove = dove_cpufreq_remove,
+ .driver = {
+ .name = "dove-cpufreq",
+ .owner = THIS_MODULE,
+ },
+};
+
+module_platform_driver(dove_cpufreq_platform_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch");
+MODULE_DESCRIPTION("cpufreq driver for Marvell's dove CPU");
+MODULE_ALIAS("platform:dove-cpufreq");
--
1.8.4.rc3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/4] mvebu: Dove: Instantiate cpufreq driver.
2013-10-23 13:04 [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Andrew Lunn
@ 2013-10-23 13:04 ` Andrew Lunn
2013-10-23 13:04 ` [PATCH 3/4] mvebu: Dove: Enable cpufreq driver in defconfig Andrew Lunn
` (2 subsequent siblings)
3 siblings, 0 replies; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 13:04 UTC (permalink / raw)
To: linux-arm-kernel
Add a platform driver definition to instantiate the dove cpufreq
driver. Also indicate the ARCH has cpufreq support, so allowing the
cpufreq framework to be enabled.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
Make resource names consistent.
Fix length of ranges
---
arch/arm/Kconfig | 1 +
arch/arm/mach-dove/board-dt.c | 2 ++
arch/arm/mach-dove/common.c | 36 ++++++++++++++++++++++++++++++++++
arch/arm/mach-dove/common.h | 1 +
arch/arm/mach-dove/include/mach/dove.h | 1 +
5 files changed, 41 insertions(+)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 1ad6fb6..7744415 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -495,6 +495,7 @@ config ARCH_IXP4XX
config ARCH_DOVE
bool "Marvell Dove"
+ select ARCH_HAS_CPUFREQ
select ARCH_REQUIRE_GPIOLIB
select CPU_PJ4
select GENERIC_CLOCKEVENTS
diff --git a/arch/arm/mach-dove/board-dt.c b/arch/arm/mach-dove/board-dt.c
index 49f72a8..98202de 100644
--- a/arch/arm/mach-dove/board-dt.c
+++ b/arch/arm/mach-dove/board-dt.c
@@ -70,6 +70,8 @@ static void __init dove_dt_init(void)
/* Setup clocks for legacy devices */
dove_legacy_clk_init();
+ dove_cpufreq_init();
+
/* Internal devices not ported to DT yet */
dove_pcie_init(1, 1);
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c
index c122bcf..323fcd4 100644
--- a/arch/arm/mach-dove/common.c
+++ b/arch/arm/mach-dove/common.c
@@ -344,6 +344,42 @@ void __init dove_sdio1_init(void)
platform_device_register(&dove_sdio1);
}
+/*****************************************************************************
+ * CPU Frequency
+ ****************************************************************************/
+static struct resource dove_cpufreq_resources[] = {
+ [0] = {
+ .start = DOVE_PMU_PHYS_BASE,
+ .end = DOVE_PMU_PHYS_BASE + 0x7,
+ .flags = IORESOURCE_MEM,
+ .name = "cpufreq: DFS"
+ },
+ [1] = {
+ .start = DOVE_PMU_PHYS_BASE + 0x8000,
+ .end = DOVE_PMU_PHYS_BASE + 0x8003,
+ .flags = IORESOURCE_MEM,
+ .name = "cpufreq: PMU CR"
+ },
+ [2] = {
+ .start = DOVE_PMU_PHYS_BASE + 0x0044,
+ .end = DOVE_PMU_PHYS_BASE + 0x0047,
+ .flags = IORESOURCE_MEM,
+ .name = "cpufreq: PMU Clk Div"
+ },
+};
+
+static struct platform_device dove_cpufreq_device = {
+ .name = "dove-cpufreq",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(dove_cpufreq_resources),
+ .resource = dove_cpufreq_resources,
+};
+
+void __init dove_cpufreq_init(void)
+{
+ platform_device_register(&dove_cpufreq_device);
+}
+
void __init dove_setup_cpu_wins(void)
{
/*
diff --git a/arch/arm/mach-dove/common.h b/arch/arm/mach-dove/common.h
index 1d72522..5c9a77b 100644
--- a/arch/arm/mach-dove/common.h
+++ b/arch/arm/mach-dove/common.h
@@ -44,6 +44,7 @@ void dove_spi1_init(void);
void dove_i2c_init(void);
void dove_sdio0_init(void);
void dove_sdio1_init(void);
+void dove_cpufreq_init(void);
void dove_restart(enum reboot_mode, const char *);
#endif
diff --git a/arch/arm/mach-dove/include/mach/dove.h b/arch/arm/mach-dove/include/mach/dove.h
index 0c4b35f..48db186 100644
--- a/arch/arm/mach-dove/include/mach/dove.h
+++ b/arch/arm/mach-dove/include/mach/dove.h
@@ -144,6 +144,7 @@
#define DOVE_SD0_GPIO_SEL (1 << 0)
/* Power Management */
+#define DOVE_PMU_PHYS_BASE (DOVE_SB_REGS_PHYS_BASE + 0xd0000)
#define DOVE_PMU_VIRT_BASE (DOVE_SB_REGS_VIRT_BASE + 0xd0000)
#define DOVE_PMU_SIG_CTRL (DOVE_PMU_VIRT_BASE + 0x802c)
--
1.8.4.rc3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/4] mvebu: Dove: Enable cpufreq driver in defconfig
2013-10-23 13:04 [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Andrew Lunn
2013-10-23 13:04 ` [PATCH 2/4] mvebu: Dove: Instantiate cpufreq driver Andrew Lunn
@ 2013-10-23 13:04 ` Andrew Lunn
2013-10-23 13:04 ` [PATCH 4/4] mvebu: Dove: Add clocks and DFS interrupt to cpu node in DT Andrew Lunn
2013-10-23 13:40 ` [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Viresh Kumar
3 siblings, 0 replies; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 13:04 UTC (permalink / raw)
To: linux-arm-kernel
Add cpufreq to dove_defconfig, so it is built by default.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
arch/arm/configs/dove_defconfig | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm/configs/dove_defconfig b/arch/arm/configs/dove_defconfig
index 1101054..3d92350 100644
--- a/arch/arm/configs/dove_defconfig
+++ b/arch/arm/configs/dove_defconfig
@@ -22,6 +22,8 @@ CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_ARM_APPENDED_DTB=y
CONFIG_ARM_ATAG_DTB_COMPAT=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_VFP=y
CONFIG_NET=y
CONFIG_PACKET=y
--
1.8.4.rc3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/4] mvebu: Dove: Add clocks and DFS interrupt to cpu node in DT.
2013-10-23 13:04 [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Andrew Lunn
2013-10-23 13:04 ` [PATCH 2/4] mvebu: Dove: Instantiate cpufreq driver Andrew Lunn
2013-10-23 13:04 ` [PATCH 3/4] mvebu: Dove: Enable cpufreq driver in defconfig Andrew Lunn
@ 2013-10-23 13:04 ` Andrew Lunn
2013-10-23 13:40 ` [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Viresh Kumar
3 siblings, 0 replies; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 13:04 UTC (permalink / raw)
To: linux-arm-kernel
The dove-cpufreq driver needs access to the DDR and CPU clock. There
is also an interrupt generated when the DFS hardware completes a
change of frequencey. Add these to the cpu node in DT.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
arch/arm/boot/dts/dove.dtsi | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi
index 1fd615d..e96d7a6 100644
--- a/arch/arm/boot/dts/dove.dtsi
+++ b/arch/arm/boot/dts/dove.dtsi
@@ -19,6 +19,10 @@
device_type = "cpu";
next-level-cache = <&l2>;
reg = <0>;
+ clocks = <&core_clk 1>, <&core_clk 3>;
+ clock-names = "cpu_clk", "ddrclk";
+ interrupt-parent = <&pmu_intc>;
+ interrupts = <0>;
};
};
--
1.8.4.rc3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 13:04 [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Andrew Lunn
` (2 preceding siblings ...)
2013-10-23 13:04 ` [PATCH 4/4] mvebu: Dove: Add clocks and DFS interrupt to cpu node in DT Andrew Lunn
@ 2013-10-23 13:40 ` Viresh Kumar
2013-10-23 13:51 ` Andrew Lunn
3 siblings, 1 reply; 14+ messages in thread
From: Viresh Kumar @ 2013-10-23 13:40 UTC (permalink / raw)
To: linux-arm-kernel
On 23 October 2013 18:34, Andrew Lunn <andrew@lunn.ch> wrote:
> The Marvell Dove SoC can run the CPU at two frequencies. The high
> frequencey is from a PLL, while the lower is the same as the DDR
> clock. Add a cpufreq driver to swap between these frequences.
>
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> ---
> Sort header files
> Comment the interrupt handler
Really? I don't see these two comments being incorporated..
Also, you would be required to update your patchset ones my
patches are in (And that will happen for v3.13)..
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 13:40 ` [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Viresh Kumar
@ 2013-10-23 13:51 ` Andrew Lunn
2013-10-23 14:25 ` Viresh Kumar
0 siblings, 1 reply; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 13:51 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 23, 2013 at 07:10:41PM +0530, Viresh Kumar wrote:
> On 23 October 2013 18:34, Andrew Lunn <andrew@lunn.ch> wrote:
> > The Marvell Dove SoC can run the CPU at two frequencies. The high
> > frequencey is from a PLL, while the lower is the same as the DDR
> > clock. Add a cpufreq driver to swap between these frequences.
> >
> > Signed-off-by: Andrew Lunn <andrew@lunn.ch>
> > Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> > ---
> > Sort header files
> > Comment the interrupt handler
>
> Really? I don't see these two comments being incorporated..
> Also, you would be required to update your patchset ones my
> patches are in (And that will happen for v3.13)..
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/clk.h>
+#include <linux/cpu.h>
+#include <linux/cpufreq.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <asm/proc-fns.h>
There does seem to be a convention that kernel.h and module.h come
first, and then i have the rest in order.
+/*
+ * Handle the interrupt raised when the frequency change is
+ * complete.
+ */
+static irqreturn_t dove_cpufreq_irq(int irq, void *dev)
+{
+ return IRQ_HANDLED;
+}
What more would you like to see in the comment?
Thanks
Andrew
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 13:51 ` Andrew Lunn
@ 2013-10-23 14:25 ` Viresh Kumar
2013-10-23 14:36 ` Andrew Lunn
0 siblings, 1 reply; 14+ messages in thread
From: Viresh Kumar @ 2013-10-23 14:25 UTC (permalink / raw)
To: linux-arm-kernel
On 23 October 2013 19:21, Andrew Lunn <andrew@lunn.ch> wrote:
> There does seem to be a convention that kernel.h and module.h come
> first, and then i have the rest in order.
Atleast I am not aware of any such convention and so got
confused.
> +/*
> + * Handle the interrupt raised when the frequency change is
> + * complete.
> + */
> +static irqreturn_t dove_cpufreq_irq(int irq, void *dev)
> +{
> + return IRQ_HANDLED;
> +}
>
> What more would you like to see in the comment?
Ahh.. I read it as "Commented interrupt handler and so it is no
more registered" :)
So, you have actually tested your code without interrupt handler?
What exactly happens in that case?
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 14:25 ` Viresh Kumar
@ 2013-10-23 14:36 ` Andrew Lunn
2013-10-23 15:00 ` Viresh Kumar
0 siblings, 1 reply; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 14:36 UTC (permalink / raw)
To: linux-arm-kernel
> So, you have actually tested your code without interrupt handler?
No.
> What exactly happens in that case?
Take a look at request_threaded_irq(). It contains:
1421 if (!handler) {
1422 if (!thread_fn)
1423 return -EINVAL;
So devm_request_irq() will fail, and so the probe function will fail.
Andrew
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 14:36 ` Andrew Lunn
@ 2013-10-23 15:00 ` Viresh Kumar
2013-10-23 14:59 ` Andrew Lunn
2013-10-28 11:31 ` Andrew Lunn
0 siblings, 2 replies; 14+ messages in thread
From: Viresh Kumar @ 2013-10-23 15:00 UTC (permalink / raw)
To: linux-arm-kernel
On 23 October 2013 20:06, Andrew Lunn <andrew@lunn.ch> wrote:
>> So, you have actually tested your code without interrupt handler?
>
> No.
It would be better if you atleast try this and confirm that this dummy
handler is required.
>> What exactly happens in that case?
>
> Take a look at request_threaded_irq(). It contains:
>
> 1421 if (!handler) {
> 1422 if (!thread_fn)
> 1423 return -EINVAL;
>
> So devm_request_irq() will fail, and so the probe function will fail.
Obviously I wanted you to remove all irq specific code and hence
devm_request_irq() :)
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 15:00 ` Viresh Kumar
@ 2013-10-23 14:59 ` Andrew Lunn
2013-10-24 2:17 ` Viresh Kumar
2013-10-28 11:31 ` Andrew Lunn
1 sibling, 1 reply; 14+ messages in thread
From: Andrew Lunn @ 2013-10-23 14:59 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 23, 2013 at 08:30:02PM +0530, Viresh Kumar wrote:
> On 23 October 2013 20:06, Andrew Lunn <andrew@lunn.ch> wrote:
> >> So, you have actually tested your code without interrupt handler?
> >
> > No.
>
> It would be better if you atleast try this and confirm that this dummy
> handler is required.
>
> >> What exactly happens in that case?
> >
> > Take a look at request_threaded_irq(). It contains:
> >
> > 1421 if (!handler) {
> > 1422 if (!thread_fn)
> > 1423 return -EINVAL;
> >
> > So devm_request_irq() will fail, and so the probe function will fail.
>
> Obviously I wanted you to remove all irq specific code and hence
> devm_request_irq() :)
So you want to know if WFI exits without an interrupt being delivered?
The Marvell documentation says the interrupt should be enabled, but we
can try it with it disabled.
Andrew
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 14:59 ` Andrew Lunn
@ 2013-10-24 2:17 ` Viresh Kumar
0 siblings, 0 replies; 14+ messages in thread
From: Viresh Kumar @ 2013-10-24 2:17 UTC (permalink / raw)
To: linux-arm-kernel
On 23 October 2013 20:29, Andrew Lunn <andrew@lunn.ch> wrote:
> So you want to know if WFI exits without an interrupt being delivered?
Yeah..
> The Marvell documentation says the interrupt should be enabled, but we
> can try it with it disabled.
Yes, that will work.. So we will not explicitly disable interrupt but let kernel
do it for us (i.e. by not registering an interrupt handler)..
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-23 15:00 ` Viresh Kumar
2013-10-23 14:59 ` Andrew Lunn
@ 2013-10-28 11:31 ` Andrew Lunn
2013-10-29 11:33 ` Viresh Kumar
1 sibling, 1 reply; 14+ messages in thread
From: Andrew Lunn @ 2013-10-28 11:31 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 23, 2013 at 08:30:02PM +0530, Viresh Kumar wrote:
> On 23 October 2013 20:06, Andrew Lunn <andrew@lunn.ch> wrote:
> >> So, you have actually tested your code without interrupt handler?
> >
> > No.
>
> It would be better if you atleast try this and confirm that this dummy
> handler is required.
Hi Viresh
I have tested this now. The dummy handler is required. Without it, it
seems like the WFI exits at the next timer tick, not immediately once
the cpufreq change has finished. I get poor numbers out of
cpufreq-bench without the handler.
Andrew
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove
2013-10-28 11:31 ` Andrew Lunn
@ 2013-10-29 11:33 ` Viresh Kumar
0 siblings, 0 replies; 14+ messages in thread
From: Viresh Kumar @ 2013-10-29 11:33 UTC (permalink / raw)
To: linux-arm-kernel
On 28 October 2013 17:01, Andrew Lunn <andrew@lunn.ch> wrote:
> I have tested this now. The dummy handler is required. Without it, it
> seems like the WFI exits at the next timer tick, not immediately once
> the cpufreq change has finished. I get poor numbers out of
> cpufreq-bench without the handler.
Ahh.. that helps.. You can now put exactly this stuff in the comment over
the handler..
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 0/4] Dove cpufreq driver
@ 2013-10-19 12:37 Andrew Lunn
2013-10-19 12:37 ` [PATCH 3/4] mvebu: Dove: Enable cpufreq driver in defconfig Andrew Lunn
0 siblings, 1 reply; 14+ messages in thread
From: Andrew Lunn @ 2013-10-19 12:37 UTC (permalink / raw)
To: linux-arm-kernel
Marvell Dove can run its CPU at two different frequencies. Add a
cpufreq driver.
These patches are based on top of Rafael's for-next branch, since
there have been a lot of changes to the cpufreq core code.
However, this driver also has a run time dependency on the PMU
interrupt controller patches:
http://www.spinics.net/lists/devicetree/msg06547.html
If the PMU interrupt controller is not available, the cpufreq probe
function will fail, but the machine keeps running O.K.
Probably Jason will want to take the mvebu patches, and Rafeal or
Viresh for the cpufreq driver itself.
Once github comes back online, the following branch will have these patches
and the dependencies.
https://github.com/lunn/linux v3.12-rc5-rafael-next-dove-cpufreq
Andrew
Andrew Lunn (4):
cpufreq: Add a cpufreq driver for Marvell Dove
mvebu: Dove: Instantiate cpufreq driver.
mvebu: Dove: Enable cpufreq driver in defconfig
mvebu: Dove: Add clocks and DFS interrupt to cpu node in DT.
arch/arm/Kconfig | 1 +
arch/arm/boot/dts/dove.dtsi | 4 +
arch/arm/configs/dove_defconfig | 2 +
arch/arm/mach-dove/board-dt.c | 2 +
arch/arm/mach-dove/common.c | 36 +++++
arch/arm/mach-dove/common.h | 1 +
arch/arm/mach-dove/include/mach/dove.h | 1 +
drivers/cpufreq/Kconfig.arm | 7 +
drivers/cpufreq/Makefile | 1 +
drivers/cpufreq/dove-cpufreq.c | 276 +++++++++++++++++++++++++++++++++
10 files changed, 331 insertions(+)
create mode 100644 drivers/cpufreq/dove-cpufreq.c
--
1.8.4.rc3
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2013-10-29 11:33 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-23 13:04 [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Andrew Lunn
2013-10-23 13:04 ` [PATCH 2/4] mvebu: Dove: Instantiate cpufreq driver Andrew Lunn
2013-10-23 13:04 ` [PATCH 3/4] mvebu: Dove: Enable cpufreq driver in defconfig Andrew Lunn
2013-10-23 13:04 ` [PATCH 4/4] mvebu: Dove: Add clocks and DFS interrupt to cpu node in DT Andrew Lunn
2013-10-23 13:40 ` [PATCH 1/4] cpufreq: Add a cpufreq driver for Marvell Dove Viresh Kumar
2013-10-23 13:51 ` Andrew Lunn
2013-10-23 14:25 ` Viresh Kumar
2013-10-23 14:36 ` Andrew Lunn
2013-10-23 15:00 ` Viresh Kumar
2013-10-23 14:59 ` Andrew Lunn
2013-10-24 2:17 ` Viresh Kumar
2013-10-28 11:31 ` Andrew Lunn
2013-10-29 11:33 ` Viresh Kumar
-- strict thread matches above, loose matches on Subject: below --
2013-10-19 12:37 [PATCH 0/4] Dove cpufreq driver Andrew Lunn
2013-10-19 12:37 ` [PATCH 3/4] mvebu: Dove: Enable cpufreq driver in defconfig Andrew Lunn
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).