Commit 33c02590 authored by Gregory CLEMENT's avatar Gregory CLEMENT Committed by Stephen Boyd

clk: mvebu: add helper file for Armada AP and CP clocks

Clock drivers for Armada AP and Armada CP use the same function to
generate unique clock name. A third drivers is coming with the same
need, so it's time to move this function in a common file.
Signed-off-by: default avatarGregory CLEMENT <gregory.clement@bootlin.com>
Link: https://lkml.kernel.org/r/20190710134346.30239-3-gregory.clement@bootlin.comSigned-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 096f4597
...@@ -8,6 +8,9 @@ config MVEBU_CLK_CPU ...@@ -8,6 +8,9 @@ config MVEBU_CLK_CPU
config MVEBU_CLK_COREDIV config MVEBU_CLK_COREDIV
bool bool
config ARMADA_AP_CP_HELPER
bool
config ARMADA_370_CLK config ARMADA_370_CLK
bool bool
select MVEBU_CLK_COMMON select MVEBU_CLK_COMMON
...@@ -35,9 +38,11 @@ config ARMADA_XP_CLK ...@@ -35,9 +38,11 @@ config ARMADA_XP_CLK
config ARMADA_AP806_SYSCON config ARMADA_AP806_SYSCON
bool bool
select ARMADA_AP_CP_HELPER
config ARMADA_CP110_SYSCON config ARMADA_CP110_SYSCON
bool bool
select ARMADA_AP_CP_HELPER
config DOVE_CLK config DOVE_CLK
bool bool
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
obj-$(CONFIG_MVEBU_CLK_COMMON) += common.o obj-$(CONFIG_MVEBU_CLK_COMMON) += common.o
obj-$(CONFIG_MVEBU_CLK_CPU) += clk-cpu.o obj-$(CONFIG_MVEBU_CLK_CPU) += clk-cpu.o
obj-$(CONFIG_MVEBU_CLK_COREDIV) += clk-corediv.o obj-$(CONFIG_MVEBU_CLK_COREDIV) += clk-corediv.o
obj-$(CONFIG_ARMADA_AP_CP_HELPER) += armada_ap_cp_helper.o
obj-$(CONFIG_ARMADA_370_CLK) += armada-370.o obj-$(CONFIG_ARMADA_370_CLK) += armada-370.o
obj-$(CONFIG_ARMADA_375_CLK) += armada-375.o obj-$(CONFIG_ARMADA_375_CLK) += armada-375.o
......
...@@ -10,11 +10,11 @@ ...@@ -10,11 +10,11 @@
#define pr_fmt(fmt) "ap806-system-controller: " fmt #define pr_fmt(fmt) "ap806-system-controller: " fmt
#include "armada_ap_cp_helper.h"
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/mfd/syscon.h> #include <linux/mfd/syscon.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
...@@ -30,18 +30,6 @@ static struct clk_onecell_data ap806_clk_data = { ...@@ -30,18 +30,6 @@ static struct clk_onecell_data ap806_clk_data = {
.clk_num = AP806_CLK_NUM, .clk_num = AP806_CLK_NUM,
}; };
static char *ap806_unique_name(struct device *dev, struct device_node *np,
char *name)
{
const __be32 *reg;
u64 addr;
reg = of_get_property(np, "reg", NULL);
addr = of_translate_address(np, reg);
return devm_kasprintf(dev, GFP_KERNEL, "%llx-%s",
(unsigned long long)addr, name);
}
static int ap806_syscon_common_probe(struct platform_device *pdev, static int ap806_syscon_common_probe(struct platform_device *pdev,
struct device_node *syscon_node) struct device_node *syscon_node)
{ {
...@@ -109,7 +97,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev, ...@@ -109,7 +97,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev,
cpuclk_freq *= 1000 * 1000; cpuclk_freq *= 1000 * 1000;
/* CPU clocks depend on the Sample At Reset configuration */ /* CPU clocks depend on the Sample At Reset configuration */
name = ap806_unique_name(dev, syscon_node, "cpu-cluster-0"); name = ap_cp_unique_name(dev, syscon_node, "cpu-cluster-0");
ap806_clks[0] = clk_register_fixed_rate(dev, name, NULL, ap806_clks[0] = clk_register_fixed_rate(dev, name, NULL,
0, cpuclk_freq); 0, cpuclk_freq);
if (IS_ERR(ap806_clks[0])) { if (IS_ERR(ap806_clks[0])) {
...@@ -117,7 +105,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev, ...@@ -117,7 +105,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev,
goto fail0; goto fail0;
} }
name = ap806_unique_name(dev, syscon_node, "cpu-cluster-1"); name = ap_cp_unique_name(dev, syscon_node, "cpu-cluster-1");
ap806_clks[1] = clk_register_fixed_rate(dev, name, NULL, 0, ap806_clks[1] = clk_register_fixed_rate(dev, name, NULL, 0,
cpuclk_freq); cpuclk_freq);
if (IS_ERR(ap806_clks[1])) { if (IS_ERR(ap806_clks[1])) {
...@@ -126,7 +114,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev, ...@@ -126,7 +114,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev,
} }
/* Fixed clock is always 1200 Mhz */ /* Fixed clock is always 1200 Mhz */
fixedclk_name = ap806_unique_name(dev, syscon_node, "fixed"); fixedclk_name = ap_cp_unique_name(dev, syscon_node, "fixed");
ap806_clks[2] = clk_register_fixed_rate(dev, fixedclk_name, NULL, ap806_clks[2] = clk_register_fixed_rate(dev, fixedclk_name, NULL,
0, 1200 * 1000 * 1000); 0, 1200 * 1000 * 1000);
if (IS_ERR(ap806_clks[2])) { if (IS_ERR(ap806_clks[2])) {
...@@ -135,7 +123,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev, ...@@ -135,7 +123,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev,
} }
/* MSS Clock is fixed clock divided by 6 */ /* MSS Clock is fixed clock divided by 6 */
name = ap806_unique_name(dev, syscon_node, "mss"); name = ap_cp_unique_name(dev, syscon_node, "mss");
ap806_clks[3] = clk_register_fixed_factor(NULL, name, fixedclk_name, ap806_clks[3] = clk_register_fixed_factor(NULL, name, fixedclk_name,
0, 1, 6); 0, 1, 6);
if (IS_ERR(ap806_clks[3])) { if (IS_ERR(ap806_clks[3])) {
...@@ -144,7 +132,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev, ...@@ -144,7 +132,7 @@ static int ap806_syscon_common_probe(struct platform_device *pdev,
} }
/* SDIO(/eMMC) Clock is fixed clock divided by 3 */ /* SDIO(/eMMC) Clock is fixed clock divided by 3 */
name = ap806_unique_name(dev, syscon_node, "sdio"); name = ap_cp_unique_name(dev, syscon_node, "sdio");
ap806_clks[4] = clk_register_fixed_factor(NULL, name, ap806_clks[4] = clk_register_fixed_factor(NULL, name,
fixedclk_name, fixedclk_name,
0, 1, 3); 0, 1, 3);
......
// SPDX-License-Identifier: GPL-2.0+
/*
* Marvell Armada AP and CP110 helper
*
* Copyright (C) 2018 Marvell
*
* Gregory Clement <gregory.clement@bootlin.com>
*
*/
#include "armada_ap_cp_helper.h"
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
char *ap_cp_unique_name(struct device *dev, struct device_node *np,
const char *name)
{
const __be32 *reg;
u64 addr;
/* Do not create a name if there is no clock */
if (!name)
return NULL;
reg = of_get_property(np, "reg", NULL);
addr = of_translate_address(np, reg);
return devm_kasprintf(dev, GFP_KERNEL, "%llx-%s",
(unsigned long long)addr, name);
}
/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef __ARMADA_AP_CP_HELPER_H
#define __ARMADA_AP_CP_HELPER_H
struct device;
struct device_node;
char *ap_cp_unique_name(struct device *dev, struct device_node *np,
const char *name);
#endif
...@@ -26,11 +26,11 @@ ...@@ -26,11 +26,11 @@
#define pr_fmt(fmt) "cp110-system-controller: " fmt #define pr_fmt(fmt) "cp110-system-controller: " fmt
#include "armada_ap_cp_helper.h"
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/mfd/syscon.h> #include <linux/mfd/syscon.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -212,22 +212,6 @@ static struct clk_hw *cp110_of_clk_get(struct of_phandle_args *clkspec, ...@@ -212,22 +212,6 @@ static struct clk_hw *cp110_of_clk_get(struct of_phandle_args *clkspec,
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static char *cp110_unique_name(struct device *dev, struct device_node *np,
const char *name)
{
const __be32 *reg;
u64 addr;
/* Do not create a name if there is no clock */
if (!name)
return NULL;
reg = of_get_property(np, "reg", NULL);
addr = of_translate_address(np, reg);
return devm_kasprintf(dev, GFP_KERNEL, "%llx-%s",
(unsigned long long)addr, name);
}
static int cp110_syscon_common_probe(struct platform_device *pdev, static int cp110_syscon_common_probe(struct platform_device *pdev,
struct device_node *syscon_node) struct device_node *syscon_node)
{ {
...@@ -261,7 +245,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -261,7 +245,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
cp110_clk_data->num = CP110_CLK_NUM; cp110_clk_data->num = CP110_CLK_NUM;
/* Register the PLL0 which is the root of the hw tree */ /* Register the PLL0 which is the root of the hw tree */
pll0_name = cp110_unique_name(dev, syscon_node, "pll0"); pll0_name = ap_cp_unique_name(dev, syscon_node, "pll0");
hw = clk_hw_register_fixed_rate(NULL, pll0_name, NULL, 0, hw = clk_hw_register_fixed_rate(NULL, pll0_name, NULL, 0,
1000 * 1000 * 1000); 1000 * 1000 * 1000);
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
...@@ -272,7 +256,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -272,7 +256,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
cp110_clks[CP110_CORE_PLL0] = hw; cp110_clks[CP110_CORE_PLL0] = hw;
/* PPv2 is PLL0/3 */ /* PPv2 is PLL0/3 */
ppv2_name = cp110_unique_name(dev, syscon_node, "ppv2-core"); ppv2_name = ap_cp_unique_name(dev, syscon_node, "ppv2-core");
hw = clk_hw_register_fixed_factor(NULL, ppv2_name, pll0_name, 0, 1, 3); hw = clk_hw_register_fixed_factor(NULL, ppv2_name, pll0_name, 0, 1, 3);
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
ret = PTR_ERR(hw); ret = PTR_ERR(hw);
...@@ -282,7 +266,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -282,7 +266,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
cp110_clks[CP110_CORE_PPV2] = hw; cp110_clks[CP110_CORE_PPV2] = hw;
/* X2CORE clock is PLL0/2 */ /* X2CORE clock is PLL0/2 */
x2core_name = cp110_unique_name(dev, syscon_node, "x2core"); x2core_name = ap_cp_unique_name(dev, syscon_node, "x2core");
hw = clk_hw_register_fixed_factor(NULL, x2core_name, pll0_name, hw = clk_hw_register_fixed_factor(NULL, x2core_name, pll0_name,
0, 1, 2); 0, 1, 2);
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
...@@ -293,7 +277,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -293,7 +277,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
cp110_clks[CP110_CORE_X2CORE] = hw; cp110_clks[CP110_CORE_X2CORE] = hw;
/* Core clock is X2CORE/2 */ /* Core clock is X2CORE/2 */
core_name = cp110_unique_name(dev, syscon_node, "core"); core_name = ap_cp_unique_name(dev, syscon_node, "core");
hw = clk_hw_register_fixed_factor(NULL, core_name, x2core_name, hw = clk_hw_register_fixed_factor(NULL, core_name, x2core_name,
0, 1, 2); 0, 1, 2);
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
...@@ -303,7 +287,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -303,7 +287,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
cp110_clks[CP110_CORE_CORE] = hw; cp110_clks[CP110_CORE_CORE] = hw;
/* NAND can be either PLL0/2.5 or core clock */ /* NAND can be either PLL0/2.5 or core clock */
nand_name = cp110_unique_name(dev, syscon_node, "nand-core"); nand_name = ap_cp_unique_name(dev, syscon_node, "nand-core");
if (nand_clk_ctrl & NF_CLOCK_SEL_400_MASK) if (nand_clk_ctrl & NF_CLOCK_SEL_400_MASK)
hw = clk_hw_register_fixed_factor(NULL, nand_name, hw = clk_hw_register_fixed_factor(NULL, nand_name,
pll0_name, 0, 2, 5); pll0_name, 0, 2, 5);
...@@ -318,7 +302,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -318,7 +302,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
cp110_clks[CP110_CORE_NAND] = hw; cp110_clks[CP110_CORE_NAND] = hw;
/* SDIO clock is PLL0/2.5 */ /* SDIO clock is PLL0/2.5 */
sdio_name = cp110_unique_name(dev, syscon_node, "sdio-core"); sdio_name = ap_cp_unique_name(dev, syscon_node, "sdio-core");
hw = clk_hw_register_fixed_factor(NULL, sdio_name, hw = clk_hw_register_fixed_factor(NULL, sdio_name,
pll0_name, 0, 2, 5); pll0_name, 0, 2, 5);
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
...@@ -330,7 +314,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev, ...@@ -330,7 +314,7 @@ static int cp110_syscon_common_probe(struct platform_device *pdev,
/* create the unique name for all the gate clocks */ /* create the unique name for all the gate clocks */
for (i = 0; i < ARRAY_SIZE(gate_base_names); i++) for (i = 0; i < ARRAY_SIZE(gate_base_names); i++)
gate_name[i] = cp110_unique_name(dev, syscon_node, gate_name[i] = ap_cp_unique_name(dev, syscon_node,
gate_base_names[i]); gate_base_names[i]);
for (i = 0; i < ARRAY_SIZE(gate_base_names); i++) { for (i = 0; i < ARRAY_SIZE(gate_base_names); i++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment