* [PATCHv2 0/5] Support for Marvell switches with integrated CPUs
@ 2017-01-05 3:36 Chris Packham
2017-01-05 3:36 ` [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham
` (3 more replies)
0 siblings, 4 replies; 15+ messages in thread
From: Chris Packham @ 2017-01-05 3:36 UTC (permalink / raw)
To: linux-arm-kernel
Cc: Chris Packham, Rob Herring, Mark Rutland, Michael Turquette,
Stephen Boyd, Linus Walleij, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Russell King,
Geert Uytterhoeven, Chris Brand, Florian Fainelli, Arnd Bergmann,
Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni,
Laxman Dewangan, Kalyan Kinthada, devicetree, linux-kernel,
linux-clk, linux-gpio
The 98DX3236, 98DX3336 and 98DX4251 are a set of switch ASICs with
integrated CPUs. They CPU block is common within these product lines and
(as far as I can tell/have been told) is based on the Armada XP. There
are a few differences due to the fact they have to squeeze the CPU into
the same package as the switch.
Chris Packham (4):
clk: mvebu: support for 98DX3236 SoC
arm: mvebu: support for SMP on 98DX3336 SoC
arm: mvebu: Add device tree for 98DX3236 SoCs
arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards
Kalyan Kinthada (1):
pinctrl: mvebu: pinctrl driver for 98DX3236 SoC
Documentation/devicetree/bindings/arm/cpus.txt | 1 +
.../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++
.../devicetree/bindings/arm/marvell/98dx3236.txt | 23 ++
.../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 +
.../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 ++++
arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 247 +++++++++++++++++++++
arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++
arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 92 ++++++++
arch/arm/boot/dts/db-dxbc2.dts | 159 +++++++++++++
arch/arm/boot/dts/db-xc3-24g4xg.dts | 155 +++++++++++++
arch/arm/mach-mvebu/Makefile | 1 +
arch/arm/mach-mvebu/common.h | 1 +
arch/arm/mach-mvebu/platsmp.c | 43 ++++
arch/arm/mach-mvebu/pmsu-98dx3236.c | 69 ++++++
drivers/clk/mvebu/Makefile | 2 +-
drivers/clk/mvebu/armada-xp.c | 42 ++++
drivers/clk/mvebu/clk-cpu.c | 33 ++-
drivers/clk/mvebu/mv98dx3236-corediv.c | 207 +++++++++++++++++
drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 155 +++++++++++++
19 files changed, 1369 insertions(+), 4 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt
create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.txt
create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt
create mode 100644 arch/arm/boot/dts/armada-xp-98dx3236.dtsi
create mode 100644 arch/arm/boot/dts/armada-xp-98dx3336.dtsi
create mode 100644 arch/arm/boot/dts/armada-xp-98dx4251.dtsi
create mode 100644 arch/arm/boot/dts/db-dxbc2.dts
create mode 100644 arch/arm/boot/dts/db-xc3-24g4xg.dts
create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c
create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c
--
2.11.0.24.ge6920cf
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC 2017-01-05 3:36 [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Chris Packham @ 2017-01-05 3:36 ` Chris Packham 2017-01-05 13:53 ` Mark Rutland 2017-01-05 4:07 ` [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Florian Fainelli ` (2 subsequent siblings) 3 siblings, 1 reply; 15+ messages in thread From: Chris Packham @ 2017-01-05 3:36 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Michael Turquette, Stephen Boyd, Rob Herring, Mark Rutland, Gregory CLEMENT, Thomas Petazzoni, linux-clk, devicetree, linux-kernel The 98DX3236, 98DX3336, 98DX4521 and variants have a different TCLK from the Armada XP (200MHz vs 250MHz). The CPU core clock is fixed at 800MHz. The clock gating options are a subset of those on the Armada XP. The core clock divider is different to the Armada XP also. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- Changes in v2: - Update devicetree binding documentation for new compatible string .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 + drivers/clk/mvebu/Makefile | 2 +- drivers/clk/mvebu/armada-xp.c | 42 +++++ drivers/clk/mvebu/clk-cpu.c | 33 +++- drivers/clk/mvebu/mv98dx3236-corediv.c | 207 +++++++++++++++++++++ 5 files changed, 281 insertions(+), 4 deletions(-) create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c diff --git a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt index 99c214660bdc..7f28506eaee7 100644 --- a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt +++ b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt @@ -3,6 +3,7 @@ Device Tree Clock bindings for cpu clock of Marvell EBU platforms Required properties: - compatible : shall be one of the following: "marvell,armada-xp-cpu-clock" - cpu clocks for Armada XP + "marvell,mv98dx3236-cpu-clock" - cpu clocks for 98DX3236 SoC - reg : Address and length of the clock complex register set, followed by address and length of the PMU DFS registers - #clock-cells : should be set to 1. diff --git a/drivers/clk/mvebu/Makefile b/drivers/clk/mvebu/Makefile index d9ae97fb43c4..6a3681e3d6db 100644 --- a/drivers/clk/mvebu/Makefile +++ b/drivers/clk/mvebu/Makefile @@ -9,7 +9,7 @@ obj-$(CONFIG_ARMADA_39X_CLK) += armada-39x.o obj-$(CONFIG_ARMADA_37XX_CLK) += armada-37xx-xtal.o obj-$(CONFIG_ARMADA_37XX_CLK) += armada-37xx-tbg.o obj-$(CONFIG_ARMADA_37XX_CLK) += armada-37xx-periph.o -obj-$(CONFIG_ARMADA_XP_CLK) += armada-xp.o +obj-$(CONFIG_ARMADA_XP_CLK) += armada-xp.o mv98dx3236-corediv.o obj-$(CONFIG_ARMADA_AP806_SYSCON) += ap806-system-controller.o obj-$(CONFIG_ARMADA_CP110_SYSCON) += cp110-system-controller.o obj-$(CONFIG_DOVE_CLK) += dove.o dove-divider.o diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c index b3094315a3c0..0413bf8284e0 100644 --- a/drivers/clk/mvebu/armada-xp.c +++ b/drivers/clk/mvebu/armada-xp.c @@ -52,6 +52,12 @@ static u32 __init axp_get_tclk_freq(void __iomem *sar) return 250000000; } +/* MV98DX3236 TCLK frequency is fixed to 200MHz */ +static u32 __init mv98dx3236_get_tclk_freq(void __iomem *sar) +{ + return 200000000; +} + static const u32 axp_cpu_freqs[] __initconst = { 1000000000, 1066000000, @@ -89,6 +95,12 @@ static u32 __init axp_get_cpu_freq(void __iomem *sar) return cpu_freq; } +/* MV98DX3236 CLK frequency is fixed to 800MHz */ +static u32 __init mv98dx3236_get_cpu_freq(void __iomem *sar) +{ + return 800000000; +} + static const int axp_nbclk_ratios[32][2] __initconst = { {0, 1}, {1, 2}, {2, 2}, {2, 2}, {1, 2}, {1, 2}, {1, 1}, {2, 3}, @@ -158,6 +170,14 @@ static const struct coreclk_soc_desc axp_coreclks = { .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), }; +static const struct coreclk_soc_desc mv98dx3236_coreclks = { + .get_tclk_freq = mv98dx3236_get_tclk_freq, + .get_cpu_freq = mv98dx3236_get_cpu_freq, + .get_clk_ratio = NULL, + .ratios = NULL, + .num_ratios = 0, +}; + /* * Clock Gating Control */ @@ -195,6 +215,15 @@ static const struct clk_gating_soc_desc axp_gating_desc[] __initconst = { { } }; +static const struct clk_gating_soc_desc mv98dx3236_gating_desc[] __initconst = { + { "ge1", NULL, 3, 0 }, + { "ge0", NULL, 4, 0 }, + { "pex00", NULL, 5, 0 }, + { "sdio", NULL, 17, 0 }, + { "xor0", NULL, 22, 0 }, + { } +}; + static void __init axp_clk_init(struct device_node *np) { struct device_node *cgnp = @@ -206,3 +235,16 @@ static void __init axp_clk_init(struct device_node *np) mvebu_clk_gating_setup(cgnp, axp_gating_desc); } CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); + +static void __init mv98dx3236_clk_init(struct device_node *np) +{ + struct device_node *cgnp = + of_find_compatible_node(NULL, NULL, "marvell,armada-xp-gating-clock"); + + mvebu_coreclk_setup(np, &mv98dx3236_coreclks); + + if (cgnp) + mvebu_clk_gating_setup(cgnp, mv98dx3236_gating_desc); +} +CLK_OF_DECLARE(mv98dx3236_clk, "marvell,mv98dx3236-core-clock", + mv98dx3236_clk_init); diff --git a/drivers/clk/mvebu/clk-cpu.c b/drivers/clk/mvebu/clk-cpu.c index 5837eb8a212f..29f295e7a36b 100644 --- a/drivers/clk/mvebu/clk-cpu.c +++ b/drivers/clk/mvebu/clk-cpu.c @@ -165,7 +165,9 @@ static const struct clk_ops cpu_ops = { .set_rate = clk_cpu_set_rate, }; -static void __init of_cpu_clk_setup(struct device_node *node) +/* Add parameter to allow this to support different clock operations. */ +static void __init _of_cpu_clk_setup(struct device_node *node, + const struct clk_ops *cpu_clk_ops) { struct cpu_clk *cpuclk; void __iomem *clock_complex_base = of_iomap(node, 0); @@ -218,7 +220,7 @@ static void __init of_cpu_clk_setup(struct device_node *node) cpuclk[cpu].hw.init = &init; init.name = cpuclk[cpu].clk_name; - init.ops = &cpu_ops; + init.ops = cpu_clk_ops; init.flags = 0; init.parent_names = &cpuclk[cpu].parent_name; init.num_parents = 1; @@ -243,5 +245,30 @@ static void __init of_cpu_clk_setup(struct device_node *node) iounmap(clock_complex_base); } +/* Use this function to call the generic setup with the correct + * clock operation + */ +static void __init of_cpu_clk_setup(struct device_node *node) +{ + _of_cpu_clk_setup(node, &cpu_ops); +} + CLK_OF_DECLARE(armada_xp_cpu_clock, "marvell,armada-xp-cpu-clock", - of_cpu_clk_setup); + of_cpu_clk_setup); + +/* Define the clock and operations for the mv98dx3236 - it cannot perform + * any operations. + */ +static const struct clk_ops mv98dx3236_cpu_ops = { + .recalc_rate = NULL, + .round_rate = NULL, + .set_rate = NULL, +}; + +static void __init of_mv98dx3236_cpu_clk_setup(struct device_node *node) +{ + _of_cpu_clk_setup(node, &mv98dx3236_cpu_ops); +} + +CLK_OF_DECLARE(mv98dx3236_cpu_clock, "marvell,mv98dx3236-cpu-clock", + of_mv98dx3236_cpu_clk_setup); diff --git a/drivers/clk/mvebu/mv98dx3236-corediv.c b/drivers/clk/mvebu/mv98dx3236-corediv.c new file mode 100644 index 000000000000..3060764a8e5d --- /dev/null +++ b/drivers/clk/mvebu/mv98dx3236-corediv.c @@ -0,0 +1,207 @@ +/* + * MV98DX3236 Core divider clock + * + * Copyright (C) 2015 Allied Telesis Labs + * + * Based on armada-xp-corediv.c + * Copyright (C) 2015 Marvell + * + * John Thompson <john.thompson@alliedtelesis.co.nz> + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ +#include <linux/kernel.h> +#include <linux/clk-provider.h> +#include <linux/of_address.h> +#include <linux/slab.h> +#include <linux/delay.h> +#include "common.h" + +#define CORE_CLK_DIV_RATIO_MASK 0xff + +#define CLK_DIV_RATIO_NAND_MASK 0x0f +#define CLK_DIV_RATIO_NAND_OFFSET 6 +#define CLK_DIV_RATIO_NAND_FORCE_RELOAD_BIT 26 + +#define RATIO_RELOAD_BIT BIT(10) +#define RATIO_REG_OFFSET 0x08 + +/* + * This structure represents one core divider clock for the clock + * framework, and is dynamically allocated for each core divider clock + * existing in the current SoC. + */ +struct clk_corediv { + struct clk_hw hw; + void __iomem *reg; + spinlock_t lock; +}; + +static struct clk_onecell_data clk_data; + + +#define to_corediv_clk(p) container_of(p, struct clk_corediv, hw) + +static int mv98dx3236_corediv_is_enabled(struct clk_hw *hwclk) +{ + /* Core divider is always active */ + return 1; +} + +static int mv98dx3236_corediv_enable(struct clk_hw *hwclk) +{ + /* always succeeds */ + return 0; +} + +static void mv98dx3236_corediv_disable(struct clk_hw *hwclk) +{ + /* can't be disabled so is left alone */ +} + +static unsigned long mv98dx3236_corediv_recalc_rate(struct clk_hw *hwclk, + unsigned long parent_rate) +{ + struct clk_corediv *corediv = to_corediv_clk(hwclk); + u32 reg, div; + + reg = readl(corediv->reg + RATIO_REG_OFFSET); + div = (reg >> CLK_DIV_RATIO_NAND_OFFSET) & CLK_DIV_RATIO_NAND_MASK; + return parent_rate / div; +} + +static long mv98dx3236_corediv_round_rate(struct clk_hw *hwclk, + unsigned long rate, unsigned long *parent_rate) +{ + /* Valid ratio are 1:4, 1:5, 1:6 and 1:8 */ + u32 div; + + div = *parent_rate / rate; + if (div < 4) + div = 4; + else if (div > 6) + div = 8; + + return *parent_rate / div; +} + +static int mv98dx3236_corediv_set_rate(struct clk_hw *hwclk, unsigned long rate, + unsigned long parent_rate) +{ + struct clk_corediv *corediv = to_corediv_clk(hwclk); + unsigned long flags = 0; + u32 reg, div; + + div = parent_rate / rate; + + spin_lock_irqsave(&corediv->lock, flags); + + /* Write new divider to the divider ratio register */ + reg = readl(corediv->reg + RATIO_REG_OFFSET); + reg &= ~(CLK_DIV_RATIO_NAND_MASK << CLK_DIV_RATIO_NAND_OFFSET); + reg |= (div & CLK_DIV_RATIO_NAND_MASK) << CLK_DIV_RATIO_NAND_OFFSET; + writel(reg, corediv->reg + RATIO_REG_OFFSET); + + /* Set reload-force for this clock */ + reg = readl(corediv->reg) | BIT(CLK_DIV_RATIO_NAND_FORCE_RELOAD_BIT); + writel(reg, corediv->reg); + + /* Now trigger the clock update */ + reg = readl(corediv->reg + RATIO_REG_OFFSET) | RATIO_RELOAD_BIT; + writel(reg, corediv->reg + RATIO_REG_OFFSET); + + /* + * Wait for clocks to settle down, and then clear all the + * ratios request and the reload request. + */ + udelay(1000); + reg &= ~(CORE_CLK_DIV_RATIO_MASK | RATIO_RELOAD_BIT); + writel(reg, corediv->reg + RATIO_REG_OFFSET); + udelay(1000); + + spin_unlock_irqrestore(&corediv->lock, flags); + + return 0; +} + +static const struct clk_ops ops = { + .enable = mv98dx3236_corediv_enable, + .disable = mv98dx3236_corediv_disable, + .is_enabled = mv98dx3236_corediv_is_enabled, + .recalc_rate = mv98dx3236_corediv_recalc_rate, + .round_rate = mv98dx3236_corediv_round_rate, + .set_rate = mv98dx3236_corediv_set_rate, +}; + +static void __init mv98dx3236_corediv_clk_init(struct device_node *node) +{ + struct clk_init_data init; + struct clk_corediv *corediv; + struct clk **clks; + void __iomem *base; + const __be32 *off; + const char *parent_name; + const char *clk_name; + int len; + struct device_node *dfx_node; + + dfx_node = of_parse_phandle(node, "base", 0); + if (WARN_ON(!dfx_node)) + return; + + off = of_get_property(node, "reg", &len); + if (WARN_ON(!off)) + return; + + base = of_iomap(dfx_node, 0); + if (WARN_ON(!base)) + return; + + of_node_put(dfx_node); + + parent_name = of_clk_get_parent_name(node, 0); + + clk_data.clk_num = 1; + + /* clks holds the clock array */ + clks = kcalloc(clk_data.clk_num, sizeof(struct clk *), + GFP_KERNEL); + if (WARN_ON(!clks)) + goto err_unmap; + /* corediv holds the clock specific array */ + corediv = kcalloc(clk_data.clk_num, sizeof(struct clk_corediv), + GFP_KERNEL); + if (WARN_ON(!corediv)) + goto err_free_clks; + + spin_lock_init(&corediv->lock); + + of_property_read_string_index(node, "clock-output-names", + 0, &clk_name); + + init.num_parents = 1; + init.parent_names = &parent_name; + init.name = clk_name; + init.ops = &ops; + init.flags = 0; + + corediv[0].reg = (void *)((int)base + be32_to_cpu(*off)); + corediv[0].hw.init = &init; + + clks[0] = clk_register(NULL, &corediv[0].hw); + WARN_ON(IS_ERR(clks[0])); + + clk_data.clks = clks; + of_clk_add_provider(node, of_clk_src_onecell_get, &clk_data); + return; + +err_free_clks: + kfree(clks); +err_unmap: + iounmap(base); +} + +CLK_OF_DECLARE(mv98dx3236_corediv_clk, "marvell,mv98dx3236-corediv-clock", + mv98dx3236_corediv_clk_init); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC 2017-01-05 3:36 ` [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham @ 2017-01-05 13:53 ` Mark Rutland 2017-01-05 23:05 ` Chris Packham 0 siblings, 1 reply; 15+ messages in thread From: Mark Rutland @ 2017-01-05 13:53 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Michael Turquette, Stephen Boyd, Rob Herring, Gregory CLEMENT, Thomas Petazzoni, linux-clk, devicetree, linux-kernel On Thu, Jan 05, 2017 at 04:36:37PM +1300, Chris Packham wrote: > The 98DX3236, 98DX3336, 98DX4521 and variants have a different TCLK from > the Armada XP (200MHz vs 250MHz). The CPU core clock is fixed at 800MHz. > > The clock gating options are a subset of those on the Armada XP. > > The core clock divider is different to the Armada XP also. > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > Changes in v2: > - Update devicetree binding documentation for new compatible string > > .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 + > drivers/clk/mvebu/Makefile | 2 +- > drivers/clk/mvebu/armada-xp.c | 42 +++++ > drivers/clk/mvebu/clk-cpu.c | 33 +++- > drivers/clk/mvebu/mv98dx3236-corediv.c | 207 +++++++++++++++++++++ > 5 files changed, 281 insertions(+), 4 deletions(-) > create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c It looks like you also need to update Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt for the addition of "marvell,mv98dx3236-corediv-clock". > > diff --git a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt > index 99c214660bdc..7f28506eaee7 100644 > --- a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt > +++ b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt > @@ -3,6 +3,7 @@ Device Tree Clock bindings for cpu clock of Marvell EBU platforms > Required properties: > - compatible : shall be one of the following: > "marvell,armada-xp-cpu-clock" - cpu clocks for Armada XP > + "marvell,mv98dx3236-cpu-clock" - cpu clocks for 98DX3236 SoC > - reg : Address and length of the clock complex register set, followed > by address and length of the PMU DFS registers > - #clock-cells : should be set to 1. [...] > +static void __init mv98dx3236_corediv_clk_init(struct device_node *node) > +{ > + struct clk_init_data init; > + struct clk_corediv *corediv; > + struct clk **clks; > + void __iomem *base; > + const __be32 *off; > + const char *parent_name; > + const char *clk_name; > + int len; > + struct device_node *dfx_node; > + > + dfx_node = of_parse_phandle(node, "base", 0); > + if (WARN_ON(!dfx_node)) What's going on here? The existing bingings don't mention a "base" phandle, and nothing was added to describe it. > + return; > + > + off = of_get_property(node, "reg", &len); > + if (WARN_ON(!off)) > + return; Please don't use of_get_property directly; generally you should use the existing higher-level helpers like of_proeprty_read_u32(). > + > + base = of_iomap(dfx_node, 0); > + if (WARN_ON(!base)) > + return; > + > + of_node_put(dfx_node); > + > + parent_name = of_clk_get_parent_name(node, 0); > + > + clk_data.clk_num = 1; > + > + /* clks holds the clock array */ > + clks = kcalloc(clk_data.clk_num, sizeof(struct clk *), > + GFP_KERNEL); > + if (WARN_ON(!clks)) > + goto err_unmap; > + /* corediv holds the clock specific array */ > + corediv = kcalloc(clk_data.clk_num, sizeof(struct clk_corediv), > + GFP_KERNEL); > + if (WARN_ON(!corediv)) > + goto err_free_clks; > + > + spin_lock_init(&corediv->lock); > + > + of_property_read_string_index(node, "clock-output-names", > + 0, &clk_name); > + > + init.num_parents = 1; > + init.parent_names = &parent_name; > + init.name = clk_name; > + init.ops = &ops; > + init.flags = 0; > + > + corediv[0].reg = (void *)((int)base + be32_to_cpu(*off)); I don't understand this, but I guess this has something to do with that base phandle. Is the corediv clock a sub-component of some "base" clock? I don't think this binding is the best way of describing that. Thanks, Mark. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC 2017-01-05 13:53 ` Mark Rutland @ 2017-01-05 23:05 ` Chris Packham 0 siblings, 0 replies; 15+ messages in thread From: Chris Packham @ 2017-01-05 23:05 UTC (permalink / raw) To: Mark Rutland Cc: linux-arm-kernel@lists.infradead.org, Michael Turquette, Stephen Boyd, Rob Herring, Gregory CLEMENT, Thomas Petazzoni, linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org On 06/01/17 03:01, Mark Rutland wrote:=0A= > On Thu, Jan 05, 2017 at 04:36:37PM +1300, Chris Packham wrote:=0A= >> The 98DX3236, 98DX3336, 98DX4521 and variants have a different TCLK from= =0A= >> the Armada XP (200MHz vs 250MHz). The CPU core clock is fixed at 800MHz.= =0A= >>=0A= >> The clock gating options are a subset of those on the Armada XP.=0A= >>=0A= >> The core clock divider is different to the Armada XP also.=0A= >>=0A= >> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>=0A= >> ---=0A= >> Changes in v2:=0A= >> - Update devicetree binding documentation for new compatible string=0A= >>=0A= >> .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 +=0A= >> drivers/clk/mvebu/Makefile | 2 +-=0A= >> drivers/clk/mvebu/armada-xp.c | 42 +++++=0A= >> drivers/clk/mvebu/clk-cpu.c | 33 +++-=0A= >> drivers/clk/mvebu/mv98dx3236-corediv.c | 207 ++++++++++++++= +++++++=0A= >> 5 files changed, 281 insertions(+), 4 deletions(-)=0A= >> create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c=0A= >=0A= >=0A= > It looks like you also need to update=0A= > Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt for the= =0A= > addition of "marvell,mv98dx3236-corediv-clock".=0A= =0A= Will do.=0A= =0A= >=0A= >>=0A= >> diff --git a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt= b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt=0A= >> index 99c214660bdc..7f28506eaee7 100644=0A= >> --- a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt=0A= >> +++ b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt=0A= >> @@ -3,6 +3,7 @@ Device Tree Clock bindings for cpu clock of Marvell EBU = platforms=0A= >> Required properties:=0A= >> - compatible : shall be one of the following:=0A= >> "marvell,armada-xp-cpu-clock" - cpu clocks for Armada XP=0A= >> + "marvell,mv98dx3236-cpu-clock" - cpu clocks for 98DX3236 SoC=0A= >> - reg : Address and length of the clock complex register set, followed= =0A= >> by address and length of the PMU DFS registers=0A= >> - #clock-cells : should be set to 1.=0A= >=0A= > [...]=0A= >=0A= >> +static void __init mv98dx3236_corediv_clk_init(struct device_node *node= )=0A= >> +{=0A= >> + struct clk_init_data init;=0A= >> + struct clk_corediv *corediv;=0A= >> + struct clk **clks;=0A= >> + void __iomem *base;=0A= >> + const __be32 *off;=0A= >> + const char *parent_name;=0A= >> + const char *clk_name;=0A= >> + int len;=0A= >> + struct device_node *dfx_node;=0A= >> +=0A= >> + dfx_node =3D of_parse_phandle(node, "base", 0);=0A= >> + if (WARN_ON(!dfx_node))=0A= >=0A= > What's going on here? The existing bingings don't mention a "base"=0A= > phandle, and nothing was added to describe it.=0A= >=0A= >> + return;=0A= >> +=0A= >> + off =3D of_get_property(node, "reg", &len);=0A= >> + if (WARN_ON(!off))=0A= >> + return;=0A= >=0A= > Please don't use of_get_property directly; generally you should use the= =0A= > existing higher-level helpers like of_proeprty_read_u32().=0A= >=0A= >> +=0A= >> + base =3D of_iomap(dfx_node, 0);=0A= >> + if (WARN_ON(!base))=0A= >> + return;=0A= >> +=0A= >> + of_node_put(dfx_node);=0A= >> +=0A= >> + parent_name =3D of_clk_get_parent_name(node, 0);=0A= >> +=0A= >> + clk_data.clk_num =3D 1;=0A= >> +=0A= >> + /* clks holds the clock array */=0A= >> + clks =3D kcalloc(clk_data.clk_num, sizeof(struct clk *),=0A= >> + GFP_KERNEL);=0A= >> + if (WARN_ON(!clks))=0A= >> + goto err_unmap;=0A= >> + /* corediv holds the clock specific array */=0A= >> + corediv =3D kcalloc(clk_data.clk_num, sizeof(struct clk_corediv),=0A= >> + GFP_KERNEL);=0A= >> + if (WARN_ON(!corediv))=0A= >> + goto err_free_clks;=0A= >> +=0A= >> + spin_lock_init(&corediv->lock);=0A= >> +=0A= >> + of_property_read_string_index(node, "clock-output-names",=0A= >> + 0, &clk_name);=0A= >> +=0A= >> + init.num_parents =3D 1;=0A= >> + init.parent_names =3D &parent_name;=0A= >> + init.name =3D clk_name;=0A= >> + init.ops =3D &ops;=0A= >> + init.flags =3D 0;=0A= >> +=0A= >> + corediv[0].reg =3D (void *)((int)base + be32_to_cpu(*off));=0A= >=0A= > I don't understand this, but I guess this has something to do with that= =0A= > base phandle. Is the corediv clock a sub-component of some "base" clock?= =0A= > I don't think this binding is the best way of describing that.=0A= =0A= Actually once I've got things setup correctly via the dts I only need =0A= some minor modification to mvebu/clk-corediv.c to handle the differences = =0A= in the bit fields used.=0A= =0A= >=0A= > Thanks,=0A= > Mark.=0A= >=0A= =0A= ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 3:36 [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Chris Packham 2017-01-05 3:36 ` [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham @ 2017-01-05 4:07 ` Florian Fainelli 2017-01-05 4:24 ` Chris Packham 2017-01-05 14:09 ` Marcin Wojtas 2017-01-06 4:14 ` Chris Packham 3 siblings, 1 reply; 15+ messages in thread From: Florian Fainelli @ 2017-01-05 4:07 UTC (permalink / raw) To: Chris Packham, linux-arm-kernel Cc: Rob Herring, Mark Rutland, Michael Turquette, Stephen Boyd, Linus Walleij, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, Geert Uytterhoeven, Arnd Bergmann, Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni, Laxman Dewangan, Kalyan Kinthada, devicetree, linux-kernel, linux-clk, linux-gpio Le 01/04/17 à 19:36, Chris Packham a écrit : > The 98DX3236, 98DX3336 and 98DX4251 are a set of switch ASICs with > integrated CPUs. They CPU block is common within these product lines and > (as far as I can tell/have been told) is based on the Armada XP. There > are a few differences due to the fact they have to squeeze the CPU into > the same package as the switch. It's really great to see these changes, do you have a plan to also add support for the integrated switch using a DSA/switchdev driver? Thanks! -- Florian ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 4:07 ` [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Florian Fainelli @ 2017-01-05 4:24 ` Chris Packham 2017-01-05 13:09 ` Andrew Lunn 0 siblings, 1 reply; 15+ messages in thread From: Chris Packham @ 2017-01-05 4:24 UTC (permalink / raw) To: Florian Fainelli, linux-arm-kernel@lists.infradead.org Cc: Rob Herring, Mark Rutland, Michael Turquette, Stephen Boyd, Linus Walleij, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, Geert Uytterhoeven, Arnd Bergmann, Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni, Laxman Dewangan, Kalyan Kinthada, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org On 05/01/17 17:07, Florian Fainelli wrote:=0A= > Le 01/04/17 =E0 19:36, Chris Packham a =E9crit :=0A= >> The 98DX3236, 98DX3336 and 98DX4251 are a set of switch ASICs with=0A= >> integrated CPUs. They CPU block is common within these product lines and= =0A= >> (as far as I can tell/have been told) is based on the Armada XP. There= =0A= >> are a few differences due to the fact they have to squeeze the CPU into= =0A= >> the same package as the switch.=0A= >=0A= > It's really great to see these changes, do you have a plan to also add=0A= > support for the integrated switch using a DSA/switchdev driver?=0A= =0A= I'd love to see a switchdev driver but it's a huge task (and no I'm not =0A= committing to writing it). As it stands Marvell ship a switch SDK =0A= largely executes in userspace with a small kernel module providing some =0A= linkage to the underlying hardware.=0A= =0A= We (a few of us here at Allied Telesis NZ) have discussed switchdev and =0A= how we get from using Marvell's SDK in our products to using switchdev =0A= proper.=0A= =0A= The first step would probably be some kind of trampoline driver which =0A= communicates with a userspace helper to do the actual work. =0A= Alternatively there is some support in Marvell's SDK for compilation as =0A= a binary blob so a proprietary kernel module is another option. Neither =0A= of these are particularly nice in a free software world.=0A= =0A= A full "free" implementation would be a large undertaking. Ideally I'd =0A= like to see Marvell involved with producing one but so far they've not =0A= been interested whenever I've brought it up.=0A= =0A= ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 4:24 ` Chris Packham @ 2017-01-05 13:09 ` Andrew Lunn 2017-01-05 14:07 ` Marcin Wojtas 2017-01-05 19:46 ` Chris Packham 0 siblings, 2 replies; 15+ messages in thread From: Andrew Lunn @ 2017-01-05 13:09 UTC (permalink / raw) To: Chris Packham Cc: Florian Fainelli, linux-arm-kernel@lists.infradead.org, Rob Herring, Mark Rutland, Michael Turquette, Stephen Boyd, Linus Walleij, Jason Cooper, Gregory Clement, Sebastian Hesselbarth, Russell King, Geert Uytterhoeven, Arnd Bergmann, Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni, Laxman Dewangan, Kalyan Kinthada, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org > I'd love to see a switchdev driver but it's a huge task (and no I'm not > committing to writing it). As it stands Marvell ship a switch SDK > largely executes in userspace with a small kernel module providing some > linkage to the underlying hardware. Is there any similarity to the mv88e6xxx family? If it was similar registers, just a different access mechanising, we could probably extend the mv88e6xxx to support MMIO as well as MDIO. Andrew ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 13:09 ` Andrew Lunn @ 2017-01-05 14:07 ` Marcin Wojtas 2017-01-05 19:46 ` Chris Packham 1 sibling, 0 replies; 15+ messages in thread From: Marcin Wojtas @ 2017-01-05 14:07 UTC (permalink / raw) To: Andrew Lunn Cc: Chris Packham, Mark Rutland, Geert Uytterhoeven, Michael Turquette, Laxman Dewangan, linux-clk@vger.kernel.org, Florian Fainelli, Juri Lelli, Russell King, Thierry Reding, Linus Walleij, Sebastian Hesselbarth, devicetree@vger.kernel.org, Jason Cooper, Arnd Bergmann, Kalyan Kinthada, Rob Herring, Gregory Clement, linux-arm-kernel@lists.infradead.org, Thomas Petazzoni, linux-gpio@vger.kernel.org, Stephen Boyd, linux-kernel@vger.kernel.org, Sudeep Holla Hi Andrew, 2017-01-05 14:09 GMT+01:00 Andrew Lunn <andrew@lunn.ch>: >> I'd love to see a switchdev driver but it's a huge task (and no I'm not >> committing to writing it). As it stands Marvell ship a switch SDK >> largely executes in userspace with a small kernel module providing some >> linkage to the underlying hardware. > > Is there any similarity to the mv88e6xxx family? Prestera switches (they are sold as standalone devices and with integrated CPU's, like ones submitted) are as far from mv88e6xxx as possible. There are various mix of 1/2.5/10/40G ports, depending on model. > > If it was similar registers, just a different access mechanising, we > could probably extend the mv88e6xxx to support MMIO as well as MDIO. > The difference is huge, nothing existing in the mainline can fit. The driver, that exposes resources to the userspace SDK (called CPSS, it's huge and complex piece of code) is existing in Marvell internal branches (kernel v4.4 is the latest one), but I doubt such solution (despite it's really small) is upstreamable. I believe it can be shipped to the customers along with the SDK as a kernel module. Having the CPU's support in the mainline is IMO sufficient. Best regards, Marcin ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 13:09 ` Andrew Lunn 2017-01-05 14:07 ` Marcin Wojtas @ 2017-01-05 19:46 ` Chris Packham 2017-01-05 19:52 ` Florian Fainelli 1 sibling, 1 reply; 15+ messages in thread From: Chris Packham @ 2017-01-05 19:46 UTC (permalink / raw) To: Andrew Lunn Cc: Florian Fainelli, linux-arm-kernel@lists.infradead.org, Rob Herring, Mark Rutland, Michael Turquette, Stephen Boyd, Linus Walleij, Jason Cooper, Gregory Clement, Sebastian Hesselbarth, Russell King, Geert Uytterhoeven, Arnd Bergmann, Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni, Laxman Dewangan, Kalyan Kinthada, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org On 06/01/17 02:10, Andrew Lunn wrote:=0A= >> I'd love to see a switchdev driver but it's a huge task (and no I'm not= =0A= >> committing to writing it). As it stands Marvell ship a switch SDK=0A= >> largely executes in userspace with a small kernel module providing some= =0A= >> linkage to the underlying hardware.=0A= >=0A= > Is there any similarity to the mv88e6xxx family?=0A= >=0A= > If it was similar registers, just a different access mechanising, we=0A= > could probably extend the mv88e6xxx to support MMIO as well as MDIO.=0A= =0A= No the prestera family of devices are considerably more powerful (and =0A= complex) than the linkstreet devices.=0A= ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 19:46 ` Chris Packham @ 2017-01-05 19:52 ` Florian Fainelli 0 siblings, 0 replies; 15+ messages in thread From: Florian Fainelli @ 2017-01-05 19:52 UTC (permalink / raw) To: Chris Packham, Andrew Lunn Cc: linux-arm-kernel@lists.infradead.org, Rob Herring, Mark Rutland, Michael Turquette, Stephen Boyd, Linus Walleij, Jason Cooper, Gregory Clement, Sebastian Hesselbarth, Russell King, Geert Uytterhoeven, Arnd Bergmann, Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni, Laxman Dewangan, Kalyan Kinthada, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org On 01/05/2017 11:46 AM, Chris Packham wrote: > On 06/01/17 02:10, Andrew Lunn wrote: >>> I'd love to see a switchdev driver but it's a huge task (and no I'm not >>> committing to writing it). As it stands Marvell ship a switch SDK >>> largely executes in userspace with a small kernel module providing some >>> linkage to the underlying hardware. >> >> Is there any similarity to the mv88e6xxx family? >> >> If it was similar registers, just a different access mechanising, we >> could probably extend the mv88e6xxx to support MMIO as well as MDIO. > > No the prestera family of devices are considerably more powerful (and > complex) than the linkstreet devices. I see, we have a similar situation with some of the Broadcom SoCs, the BCM534xx/BCM5334x have a completely different integrated switching engine that is not roboswitch compatible. Thanks for the information, this is still valuable to have this supported upstream. -- Florian ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 3:36 [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Chris Packham 2017-01-05 3:36 ` [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham 2017-01-05 4:07 ` [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Florian Fainelli @ 2017-01-05 14:09 ` Marcin Wojtas 2017-01-05 20:02 ` Chris Packham 2017-01-06 4:14 ` Chris Packham 3 siblings, 1 reply; 15+ messages in thread From: Marcin Wojtas @ 2017-01-05 14:09 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel@lists.infradead.org, Mark Rutland, Andrew Lunn, Geert Uytterhoeven, Michael Turquette, Laxman Dewangan, linux-clk, Florian Fainelli, Juri Lelli, Russell King, Thierry Reding, Linus Walleij, Sebastian Hesselbarth, devicetree@vger.kernel.org, Jason Cooper, Arnd Bergmann, Kalyan Kinthada, Rob Herring, Chris Brand, Gregory Clement, Thomas Petazzoni, linux-gpio, Stephen Boyd, linux-kernel, Sudeep Holla, nadavh Hi Chris, Thanks a lot for your work and v2. Can you please add changelog between patchset versions in your cover letter? Best regards, Marcin 2017-01-05 4:36 GMT+01:00 Chris Packham <chris.packham@alliedtelesis.co.nz>: > The 98DX3236, 98DX3336 and 98DX4251 are a set of switch ASICs with > integrated CPUs. They CPU block is common within these product lines and > (as far as I can tell/have been told) is based on the Armada XP. There > are a few differences due to the fact they have to squeeze the CPU into > the same package as the switch. > > Chris Packham (4): > clk: mvebu: support for 98DX3236 SoC > arm: mvebu: support for SMP on 98DX3336 SoC > arm: mvebu: Add device tree for 98DX3236 SoCs > arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards > > Kalyan Kinthada (1): > pinctrl: mvebu: pinctrl driver for 98DX3236 SoC > > Documentation/devicetree/bindings/arm/cpus.txt | 1 + > .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++ > .../devicetree/bindings/arm/marvell/98dx3236.txt | 23 ++ > .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 + > .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 ++++ > arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 247 +++++++++++++++++++++ > arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++ > arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 92 ++++++++ > arch/arm/boot/dts/db-dxbc2.dts | 159 +++++++++++++ > arch/arm/boot/dts/db-xc3-24g4xg.dts | 155 +++++++++++++ > arch/arm/mach-mvebu/Makefile | 1 + > arch/arm/mach-mvebu/common.h | 1 + > arch/arm/mach-mvebu/platsmp.c | 43 ++++ > arch/arm/mach-mvebu/pmsu-98dx3236.c | 69 ++++++ > drivers/clk/mvebu/Makefile | 2 +- > drivers/clk/mvebu/armada-xp.c | 42 ++++ > drivers/clk/mvebu/clk-cpu.c | 33 ++- > drivers/clk/mvebu/mv98dx3236-corediv.c | 207 +++++++++++++++++ > drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 155 +++++++++++++ > 19 files changed, 1369 insertions(+), 4 deletions(-) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt > create mode 100644 arch/arm/boot/dts/armada-xp-98dx3236.dtsi > create mode 100644 arch/arm/boot/dts/armada-xp-98dx3336.dtsi > create mode 100644 arch/arm/boot/dts/armada-xp-98dx4251.dtsi > create mode 100644 arch/arm/boot/dts/db-dxbc2.dts > create mode 100644 arch/arm/boot/dts/db-xc3-24g4xg.dts > create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c > create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c > > -- > 2.11.0.24.ge6920cf > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 14:09 ` Marcin Wojtas @ 2017-01-05 20:02 ` Chris Packham 0 siblings, 0 replies; 15+ messages in thread From: Chris Packham @ 2017-01-05 20:02 UTC (permalink / raw) To: Marcin Wojtas Cc: linux-arm-kernel@lists.infradead.org, Mark Rutland, Andrew Lunn, Geert Uytterhoeven, Michael Turquette, Laxman Dewangan, linux-clk@vger.kernel.org, Florian Fainelli, Juri Lelli, Russell King, Thierry Reding, Linus Walleij, Sebastian Hesselbarth, devicetree@vger.kernel.org, Jason Cooper, Arnd Bergmann, Kalyan Kinthada, Rob Herring, Chris Brand, Gregory Clement, Thomas Petazzoni, linux-gpio@vger.kernel.org, Stephen Boyd, linux-kernel@vger.kernel.org, Sudeep Holla, nadavh@marvell.com On 06/01/17 03:09, Marcin Wojtas wrote:=0A= > Hi Chris,=0A= >=0A= > Thanks a lot for your work and v2. Can you please add changelog=0A= > between patchset versions in your cover letter?=0A= =0A= Will do for v3. I did actually include a changelog in the individual =0A= patches but I can collate that here.=0A= =0A= clk: mvebu: support for 98DX3236 SoC=0A= - Update devicetree binding documentation for new compatible string=0A= arm: mvebu: support for SMP on 98DX3336 SoC=0A= - Document new enable-method value=0A= - Correct some references from 98DX4521 to 98DX3236=0A= pinctrl: mvebu: pinctrl driver for 98DX3236 SoC=0A= - include sdio support for the 98DX4251=0A= arm: mvebu: Add device tree for 98DX3236 SoCs=0A= - Update devicetree binding documentation to reflect that 98DX3336 and=0A= 984251 are supersets of 98DX3236.=0A= - disable crypto block=0A= - disable sdio for 98DX3236, enable for 98DX4251=0A= arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards=0A= - None=0A= =0A= Here's the interdiff=0A= =0A= diff --git a/Documentation/devicetree/bindings/arm/cpus.txt =0A= b/Documentation/devicetree/bindings/arm/cpus.txt=0A= index a1bcfeed5f24..3c2fd72d0bf9 100644=0A= --- a/Documentation/devicetree/bindings/arm/cpus.txt=0A= +++ b/Documentation/devicetree/bindings/arm/cpus.txt=0A= @@ -202,6 +202,7 @@ nodes to be present and contain the properties =0A= described below.=0A= "marvell,armada-380-smp"=0A= "marvell,armada-390-smp"=0A= "marvell,armada-xp-smp"=0A= + "marvell,98dx3236-smp"=0A= "mediatek,mt6589-smp"=0A= "mediatek,mt81xx-tz-smp"=0A= "qcom,gcc-msm8660"=0A= diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt =0A= b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt=0A= index e7dc9b2dd90b..64e8c73fc5ab 100644=0A= --- a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt=0A= +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt=0A= @@ -6,5 +6,18 @@ shall have the following property:=0A= =0A= Required root node property:=0A= =0A= -compatible: one of "marvell,armadaxp-98dx3236", "marvell,armadaxp-98dx3336= "=0A= - or "marvell,armadaxp-98dx4251"=0A= +compatible: must contain "marvell,armadaxp-98dx3236"=0A= +=0A= +In addition, boards using the Marvell 98DX3336 SoC shall have the=0A= +following property:=0A= +=0A= +Required root node property:=0A= +=0A= +compatible: must contain "marvell,armadaxp-98dx3336"=0A= +=0A= +In addition, boards using the Marvell 98DX4251 SoC shall have the=0A= +following property:=0A= +=0A= +Required root node property:=0A= +=0A= +compatible: must contain "marvell,armadaxp-98dx4251"=0A= diff --git a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt = =0A= b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt=0A= index 99c214660bdc..7f28506eaee7 100644=0A= --- a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt=0A= +++ b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt=0A= @@ -3,6 +3,7 @@ Device Tree Clock bindings for cpu clock of Marvell EBU =0A= platforms=0A= Required properties:=0A= - compatible : shall be one of the following:=0A= "marvell,armada-xp-cpu-clock" - cpu clocks for Armada XP=0A= + "marvell,mv98dx3236-cpu-clock" - cpu clocks for 98DX3236 SoC=0A= - reg : Address and length of the clock complex register set, followed=0A= by address and length of the PMU DFS registers=0A= - #clock-cells : should be set to 1.=0A= diff --git =0A= a/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl= .txt =0A= b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl= .txt=0A= index 34c1e380adaa..d4e6ecdfc853 100644=0A= --- =0A= a/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl= .txt=0A= +++ =0A= b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl= .txt=0A= @@ -4,7 +4,7 @@ Please refer to marvell,mvebu-pinctrl.txt in this =0A= directory for common binding=0A= part and usage=0A= =0A= Required properties:=0A= -- compatible: "marvell,98dx3236-pinctrl"=0A= +- compatible: "marvell,98dx3236-pinctrl" or "marvell,98dx4251-pinctrl"=0A= - reg: register specifier of MPP registers=0A= =0A= This driver supports all 98dx3236, 98dx3336 and 98dx4251 variants=0A= @@ -16,12 +16,12 @@ mpp1 1 gpio, spi0(miso), dev(ad9)=0A= mpp2 2 gpio, spi0(sck), dev(ad10)=0A= mpp3 3 gpio, spi0(cs0), dev(ad11)=0A= mpp4 4 gpio, spi0(cs1), smi(mdc), dev(cs0)=0A= -mpp5 5 gpio, pex(rsto), dev(bootcs)=0A= -mpp6 6 gpio, dev(a2)=0A= -mpp7 7 gpio, dev(ale0)=0A= -mpp8 8 gpio, dev(ale1)=0A= -mpp9 9 gpio, dev(ready0)=0A= -mpp10 10 gpio, dev(ad12)=0A= +mpp5 5 gpio, pex(rsto), sd0(cmd), dev(bootcs)=0A= +mpp6 6 gpio, sd0(clk), dev(a2)=0A= +mpp7 7 gpio, sd0(d0), dev(ale0)=0A= +mpp8 8 gpio, sd0(d1), dev(ale1)=0A= +mpp9 9 gpio, sd0(d2), dev(ready0)=0A= +mpp10 10 gpio, sd0(d3), dev(ad12)=0A= mpp11 11 gpio, uart1(rxd), uart0(cts), dev(ad13)=0A= mpp12 12 gpio, uart1(txd), uart0(rts), dev(ad14)=0A= mpp13 13 gpio, intr(out), dev(ad15)=0A= diff --git a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi =0A= b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi=0A= index bac53f8b44af..61bd3acc5cfe 100644=0A= --- a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi=0A= +++ b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi=0A= @@ -138,6 +138,10 @@=0A= status =3D "disabled";=0A= };=0A= =0A= + crypto@90000 {=0A= + status =3D "disabled";=0A= + };=0A= +=0A= xor@f0900 {=0A= status =3D "disabled";=0A= };=0A= @@ -229,3 +233,15 @@=0A= marvell,function =3D "spi0";=0A= };=0A= };=0A= +=0A= +&sdio {=0A= + status =3D "disabled";=0A= +};=0A= +=0A= +&crypto_sram0 {=0A= + status =3D "disabled";=0A= +};=0A= +=0A= +&crypto_sram1 {=0A= + status =3D "disabled";=0A= +};=0A= diff --git a/arch/arm/boot/dts/armada-xp-98dx4251.dtsi =0A= b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi=0A= index 5d1da8513fae..5f7edc23d5ae 100644=0A= --- a/arch/arm/boot/dts/armada-xp-98dx4251.dtsi=0A= +++ b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi=0A= @@ -76,3 +76,17 @@=0A= };=0A= };=0A= };=0A= +=0A= +&sdio {=0A= + status =3D "okay";=0A= +};=0A= +=0A= +&pinctrl {=0A= + compatible =3D "marvell,98dx4251-pinctrl";=0A= +=0A= + sdio_pins: sdio-pins {=0A= + marvell,pins =3D "mpp5", "mpp6", "mpp7",=0A= + "mpp8", "mpp9", "mpp10";=0A= + marvell,function =3D "sd0";=0A= + };=0A= +};=0A= diff --git a/arch/arm/mach-mvebu/pmsu-98dx3236.c =0A= b/arch/arm/mach-mvebu/pmsu-98dx3236.c=0A= index fadc81d0c051..87ca42ef40c7 100644=0A= --- a/arch/arm/mach-mvebu/pmsu-98dx3236.c=0A= +++ b/arch/arm/mach-mvebu/pmsu-98dx3236.c=0A= @@ -1,5 +1,5 @@=0A= /**=0A= - * CPU resume support for 98DX4521 internal CPU (a.k.a. MSYS).=0A= + * CPU resume support for 98DX3236 internal CPU (a.k.a. MSYS).=0A= */=0A= =0A= #define pr_fmt(fmt) "mv98dx3236-resume: " fmt=0A= @@ -38,7 +38,7 @@ static int __init mv98dx3236_resume_init(void)=0A= if (!np)=0A= return 0;=0A= =0A= - pr_info("Initializing 98DX4521 Resume\n");=0A= + pr_info("Initializing 98DX3236 Resume\n");=0A= =0A= if (of_address_to_resource(np, 0, &res)) {=0A= pr_err("unable to get resource\n");=0A= diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c =0A= b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c=0A= index 2586903c59f0..554eeae8cd21 100644=0A= --- a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c=0A= +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c=0A= @@ -389,21 +389,27 @@ static struct mvebu_mpp_mode =0A= mv98dx3236_mpp_modes[] =3D {=0A= MPP_MODE(5,=0A= MPP_VAR_FUNCTION(0x0, "gpio", NULL, =0A= V_98DX3236_PLUS),=0A= MPP_VAR_FUNCTION(0x1, "pex", "rsto", =0A= V_98DX3236_PLUS),=0A= + MPP_VAR_FUNCTION(0x2, "sd0", "cmd", V_98DX4251),= =0A= MPP_VAR_FUNCTION(0x4, "dev", "bootcs0", =0A= V_98DX3236_PLUS)),=0A= MPP_MODE(6,=0A= MPP_VAR_FUNCTION(0x0, "gpo", NULL, =0A= V_98DX3236_PLUS),=0A= + MPP_VAR_FUNCTION(0x2, "sd0", "clk", V_98DX4251),= =0A= MPP_VAR_FUNCTION(0x4, "dev", "a2", =0A= V_98DX3236_PLUS)),=0A= MPP_MODE(7,=0A= MPP_VAR_FUNCTION(0x0, "gpio", NULL, =0A= V_98DX3236_PLUS),=0A= + MPP_VAR_FUNCTION(0x2, "sd0", "d0", V_98DX4251),= =0A= MPP_VAR_FUNCTION(0x4, "dev", "ale0", =0A= V_98DX3236_PLUS)),=0A= MPP_MODE(8,=0A= MPP_VAR_FUNCTION(0x0, "gpio", NULL, =0A= V_98DX3236_PLUS),=0A= + MPP_VAR_FUNCTION(0x2, "sd0", "d1", V_98DX4251),= =0A= MPP_VAR_FUNCTION(0x4, "dev", "ale1", =0A= V_98DX3236_PLUS)),=0A= MPP_MODE(9,=0A= MPP_VAR_FUNCTION(0x0, "gpio", NULL, =0A= V_98DX3236_PLUS),=0A= + MPP_VAR_FUNCTION(0x2, "sd0", "d2", V_98DX4251),= =0A= MPP_VAR_FUNCTION(0x4, "dev", "ready0", =0A= V_98DX3236_PLUS)),=0A= MPP_MODE(10,=0A= MPP_VAR_FUNCTION(0x0, "gpio", NULL, =0A= V_98DX3236_PLUS),=0A= + MPP_VAR_FUNCTION(0x2, "sd0", "d3", V_98DX4251),= =0A= MPP_VAR_FUNCTION(0x4, "dev", "ad12", =0A= V_98DX3236_PLUS)),=0A= MPP_MODE(11,=0A= MPP_VAR_FUNCTION(0x0, "gpio", NULL, =0A= V_98DX3236_PLUS),=0A= @@ -501,6 +507,10 @@ static const struct of_device_id =0A= armada_xp_pinctrl_of_match[] =3D {=0A= .compatible =3D "marvell,98dx3236-pinctrl",=0A= .data =3D (void *) V_98DX3236,=0A= },=0A= + {=0A= + .compatible =3D "marvell,98dx4251-pinctrl",=0A= + .data =3D (void *) V_98DX4251,=0A= + },=0A= { },=0A= };=0A= =0A= =0A= =0A= >=0A= > Best regards,=0A= > Marcin=0A= >=0A= > 2017-01-05 4:36 GMT+01:00 Chris Packham <chris.packham@alliedtelesis.co.n= z>:=0A= >> The 98DX3236, 98DX3336 and 98DX4251 are a set of switch ASICs with=0A= >> integrated CPUs. They CPU block is common within these product lines and= =0A= >> (as far as I can tell/have been told) is based on the Armada XP. There= =0A= >> are a few differences due to the fact they have to squeeze the CPU into= =0A= >> the same package as the switch.=0A= >>=0A= >> Chris Packham (4):=0A= >> clk: mvebu: support for 98DX3236 SoC=0A= >> arm: mvebu: support for SMP on 98DX3336 SoC=0A= >> arm: mvebu: Add device tree for 98DX3236 SoCs=0A= >> arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards=0A= >>=0A= >> Kalyan Kinthada (1):=0A= >> pinctrl: mvebu: pinctrl driver for 98DX3236 SoC=0A= >>=0A= >> Documentation/devicetree/bindings/arm/cpus.txt | 1 +=0A= >> .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++=0A= >> .../devicetree/bindings/arm/marvell/98dx3236.txt | 23 ++=0A= >> .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 +=0A= >> .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 ++++=0A= >> arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 247 ++++++++++++++= +++++++=0A= >> arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++=0A= >> arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 92 ++++++++=0A= >> arch/arm/boot/dts/db-dxbc2.dts | 159 +++++++++++++= =0A= >> arch/arm/boot/dts/db-xc3-24g4xg.dts | 155 +++++++++++++= =0A= >> arch/arm/mach-mvebu/Makefile | 1 +=0A= >> arch/arm/mach-mvebu/common.h | 1 +=0A= >> arch/arm/mach-mvebu/platsmp.c | 43 ++++=0A= >> arch/arm/mach-mvebu/pmsu-98dx3236.c | 69 ++++++=0A= >> drivers/clk/mvebu/Makefile | 2 +-=0A= >> drivers/clk/mvebu/armada-xp.c | 42 ++++=0A= >> drivers/clk/mvebu/clk-cpu.c | 33 ++-=0A= >> drivers/clk/mvebu/mv98dx3236-corediv.c | 207 ++++++++++++++= +++=0A= >> drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 155 +++++++++++++= =0A= >> 19 files changed, 1369 insertions(+), 4 deletions(-)=0A= >> create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx32= 36-resume-ctrl.txt=0A= >> create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx32= 36.txt=0A= >> create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,ar= mada-98dx3236-pinctrl.txt=0A= >> create mode 100644 arch/arm/boot/dts/armada-xp-98dx3236.dtsi=0A= >> create mode 100644 arch/arm/boot/dts/armada-xp-98dx3336.dtsi=0A= >> create mode 100644 arch/arm/boot/dts/armada-xp-98dx4251.dtsi=0A= >> create mode 100644 arch/arm/boot/dts/db-dxbc2.dts=0A= >> create mode 100644 arch/arm/boot/dts/db-xc3-24g4xg.dts=0A= >> create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c=0A= >> create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c=0A= >>=0A= >> --=0A= >> 2.11.0.24.ge6920cf=0A= >>=0A= >>=0A= >> _______________________________________________=0A= >> linux-arm-kernel mailing list=0A= >> linux-arm-kernel@lists.infradead.org=0A= >> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel=0A= >=0A= =0A= ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCHv2 0/5] Support for Marvell switches with integrated CPUs 2017-01-05 3:36 [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Chris Packham ` (2 preceding siblings ...) 2017-01-05 14:09 ` Marcin Wojtas @ 2017-01-06 4:14 ` Chris Packham 2017-01-06 4:14 ` [PATCHv3 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham 3 siblings, 1 reply; 15+ messages in thread From: Chris Packham @ 2017-01-06 4:14 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Rob Herring, Mark Rutland, Michael Turquette, Stephen Boyd, Linus Walleij, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, Geert Uytterhoeven, Chris Brand, Florian Fainelli, Arnd Bergmann, Thierry Reding, Sudeep Holla, Juri Lelli, Thomas Petazzoni, Laxman Dewangan, Kalyan Kinthada, devicetree, linux-kernel, linux-clk, linux-gpio, netdev The 98DX3236, 98DX3336 and 98DX4251 are a set of switch ASICs with integrated CPUs. They CPU block is common within these product lines and (as far as I can tell/have been told) is based on the Armada XP. There are a few differences due to the fact they have to squeeze the CPU into the same package as the switch. Chris Packham (4): clk: mvebu: support for 98DX3236 SoC Changes in v2: - Update devicetree binding documentation for new compatible string Changes in v3: - Add 98dx3236 support to mvebu/clk-corediv.c rather than creating a new driver. - Document mv98dx3236-corediv-clock binding arm: mvebu: support for SMP on 98DX3336 SoC Changes in v2: - Document new enable-method value - Correct some references from 98DX4521 to 98DX3236 Changes in v3: - Simplify mv98dx3236_resume_init by using of_io_request_and_map() arm: mvebu: Add device tree for 98DX3236 SoCs Changes in v2: - Update devicetree binding documentation to reflect that 98DX3336 and 984251 are supersets of 98DX3236. - disable crypto block - disable sdio for 98DX3236, enable for 98DX4251 Changes in v3: - fix typo 4521 -> 4251 - document prestera bindings - rework corediv-clock binding - add label to packet processor node - add new compativle string for DFX server arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards Changes in v2/v3: - none Kalyan Kinthada (1): pinctrl: mvebu: pinctrl driver for 98DX3236 SoC Changes in v2: - include sdio support for the 98DX4251 Changes in v3: - None Documentation/devicetree/bindings/arm/cpus.txt | 1 + .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++ .../devicetree/bindings/arm/marvell/98dx3236.txt | 23 ++ .../bindings/clock/mvebu-corediv-clock.txt | 1 + .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 + .../devicetree/bindings/net/marvell,prestera.txt | 50 ++++ .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 ++++ arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 254 +++++++++++++++++++++ arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 76 ++++++ arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 90 ++++++++ arch/arm/boot/dts/db-dxbc2.dts | 159 +++++++++++++ arch/arm/boot/dts/db-xc3-24g4xg.dts | 155 +++++++++++++ arch/arm/mach-mvebu/Makefile | 1 + arch/arm/mach-mvebu/common.h | 1 + arch/arm/mach-mvebu/platsmp.c | 43 ++++ arch/arm/mach-mvebu/pmsu-98dx3236.c | 52 +++++ drivers/clk/mvebu/armada-xp.c | 42 ++++ drivers/clk/mvebu/clk-corediv.c | 23 ++ drivers/clk/mvebu/clk-cpu.c | 31 ++- drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 155 +++++++++++++ 20 files changed, 1220 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.txt create mode 100644 Documentation/devicetree/bindings/net/marvell,prestera.txt create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt create mode 100644 arch/arm/boot/dts/armada-xp-98dx3236.dtsi create mode 100644 arch/arm/boot/dts/armada-xp-98dx3336.dtsi create mode 100644 arch/arm/boot/dts/armada-xp-98dx4251.dtsi create mode 100644 arch/arm/boot/dts/db-dxbc2.dts create mode 100644 arch/arm/boot/dts/db-xc3-24g4xg.dts create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c Interdiff to v2: diff --git a/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt b/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt index 520562a7dc2a..c7b4e3a6b2c6 100644 --- a/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt +++ b/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt @@ -7,6 +7,7 @@ Required properties: - compatible : must be "marvell,armada-370-corediv-clock", "marvell,armada-375-corediv-clock", "marvell,armada-380-corediv-clock", + "marvell,mv98dx3236-corediv-clock", - reg : must be the register address of Core Divider control register - #clock-cells : from common clock binding; shall be set to 1 diff --git a/Documentation/devicetree/bindings/net/marvell,prestera.txt b/Documentation/devicetree/bindings/net/marvell,prestera.txt new file mode 100644 index 000000000000..5fbab29718e8 --- /dev/null +++ b/Documentation/devicetree/bindings/net/marvell,prestera.txt @@ -0,0 +1,50 @@ +Marvell Prestera Switch Chip bindings +------------------------------------- + +Required properties: +- compatible: one of the following + "marvell,prestera-98dx3236", + "marvell,prestera-98dx3336", + "marvell,prestera-98dx4251", +- reg: address and length of the register set for the device. +- interrupts: interrupt for the device + +Optional properties: +- dfx: phandle reference to the "DFX Server" node + +Example: + +switch { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 MBUS_ID(0x03, 0x00) 0 0x100000>; + + packet-processor@0 { + compatible = "marvell,prestera-98dx3236"; + reg = <0 0x4000000>; + interrupts = <33>, <34>, <35>; + dfx = <&dfx>; + }; +}; + +DFX Server bindings +------------------- + +Required properties: +- compatible: must be "marvell,dfx-server" +- reg: address and length of the register set for the device. + +Example: + +dfx-registers { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 MBUS_ID(0x08, 0x00) 0 0x100000>; + + dfx: dfx@0 { + compatible = "marvell,dfx-server"; + reg = <0 0x100000>; + }; +}; diff --git a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi index 61bd3acc5cfe..4b7b2fe3b682 100644 --- a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi +++ b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi @@ -126,12 +126,7 @@ }; corediv-clock@18740 { - compatible = "marvell,mv98dx3236-corediv-clock"; - reg = <0xf8268 0xc>; - base = <&dfx>; - #clock-cells = <1>; - clocks = <&mainpll>; - clock-output-names = "nand"; + status = "disabled"; }; xor@60900 { @@ -194,6 +189,10 @@ #interrupt-cells = <2>; interrupts = <87>; }; + + nand: nand@d0000 { + clocks = <&dfx_coredivclk 0>; + }; }; dfx-registers { @@ -202,8 +201,16 @@ #size-cells = <1>; ranges = <0 MBUS_ID(0x08, 0x00) 0 0x100000>; + dfx_coredivclk: corediv-clock@f8268 { + compatible = "marvell,mv98dx3236-corediv-clock"; + reg = <0xf8268 0xc>; + #clock-cells = <1>; + clocks = <&mainpll>; + clock-output-names = "nand"; + }; + dfx: dfx@0 { - compatible = "simple-bus"; + compatible = "marvell,dfx-server"; reg = <0 0x100000>; }; }; @@ -214,7 +221,7 @@ #size-cells = <1>; ranges = <0 MBUS_ID(0x03, 0x00) 0 0x100000>; - packet-processor@0 { + pp0: packet-processor@0 { compatible = "marvell,prestera-98dx3236"; reg = <0 0x4000000>; interrupts = <33>, <34>, <35>; diff --git a/arch/arm/boot/dts/armada-xp-98dx3336.dtsi b/arch/arm/boot/dts/armada-xp-98dx3336.dtsi index 9c9aa565fd82..a9b0f47f8df9 100644 --- a/arch/arm/boot/dts/armada-xp-98dx3336.dtsi +++ b/arch/arm/boot/dts/armada-xp-98dx3336.dtsi @@ -68,11 +68,9 @@ reg = <0x20980 0x10>; }; }; - - switch { - packet-processor@0 { - compatible = "marvell,prestera-98dx3336"; - }; - }; }; }; + +&pp0 { + compatible = "marvell,prestera-98dx3336"; +}; diff --git a/arch/arm/boot/dts/armada-xp-98dx4251.dtsi b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi index 5f7edc23d5ae..446e6e65ec59 100644 --- a/arch/arm/boot/dts/armada-xp-98dx4251.dtsi +++ b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi @@ -68,12 +68,6 @@ reg = <0x20980 0x10>; }; }; - - switch { - packet-processor@0 { - compatible = "marvell,prestera-98dx4521"; - }; - }; }; }; @@ -90,3 +84,7 @@ marvell,function = "sd0"; }; }; + +&pp0 { + compatible = "marvell,prestera-98dx4251"; +}; diff --git a/arch/arm/mach-mvebu/pmsu-98dx3236.c b/arch/arm/mach-mvebu/pmsu-98dx3236.c index 87ca42ef40c7..1052674dd439 100644 --- a/arch/arm/mach-mvebu/pmsu-98dx3236.c +++ b/arch/arm/mach-mvebu/pmsu-98dx3236.c @@ -31,39 +31,22 @@ void mv98dx3236_resume_set_cpu_boot_addr(int hw_cpu, void *boot_addr) static int __init mv98dx3236_resume_init(void) { struct device_node *np; - struct resource res; - int ret = 0; + void __iomem *base; np = of_find_matching_node(NULL, of_mv98dx3236_resume_table); if (!np) return 0; - pr_info("Initializing 98DX3236 Resume\n"); - - if (of_address_to_resource(np, 0, &res)) { - pr_err("unable to get resource\n"); - ret = -ENOENT; - goto out; - } - - if (!request_mem_region(res.start, resource_size(&res), - np->full_name)) { - pr_err("unable to request region\n"); - ret = -EBUSY; - goto out; - } - - mv98dx3236_resume_base = ioremap(res.start, resource_size(&res)); - if (!mv98dx3236_resume_base) { + base = of_io_request_and_map(np, 0, of_node_full_name(np)); + if (IS_ERR(base)) { pr_err("unable to map registers\n"); - release_mem_region(res.start, resource_size(&res)); - ret = -ENOMEM; - goto out; + of_node_put(np); + return PTR_ERR(mv98dx3236_resume_base); } -out: + mv98dx3236_resume_base = base; of_node_put(np); - return ret; + return 0; } early_initcall(mv98dx3236_resume_init); diff --git a/drivers/clk/mvebu/Makefile b/drivers/clk/mvebu/Makefile index 6a3681e3d6db..d9ae97fb43c4 100644 --- a/drivers/clk/mvebu/Makefile +++ b/drivers/clk/mvebu/Makefile @@ -9,7 +9,7 @@ obj-$(CONFIG_ARMADA_39X_CLK) += armada-39x.o obj-$(CONFIG_ARMADA_37XX_CLK) += armada-37xx-xtal.o obj-$(CONFIG_ARMADA_37XX_CLK) += armada-37xx-tbg.o obj-$(CONFIG_ARMADA_37XX_CLK) += armada-37xx-periph.o -obj-$(CONFIG_ARMADA_XP_CLK) += armada-xp.o mv98dx3236-corediv.o +obj-$(CONFIG_ARMADA_XP_CLK) += armada-xp.o obj-$(CONFIG_ARMADA_AP806_SYSCON) += ap806-system-controller.o obj-$(CONFIG_ARMADA_CP110_SYSCON) += cp110-system-controller.o obj-$(CONFIG_DOVE_CLK) += dove.o dove-divider.o diff --git a/drivers/clk/mvebu/clk-corediv.c b/drivers/clk/mvebu/clk-corediv.c index d1e5863d3375..8491979f4096 100644 --- a/drivers/clk/mvebu/clk-corediv.c +++ b/drivers/clk/mvebu/clk-corediv.c @@ -71,6 +71,10 @@ static const struct clk_corediv_desc mvebu_corediv_desc[] = { { .mask = 0x3f, .offset = 8, .fieldbit = 1 }, /* NAND clock */ }; +static const struct clk_corediv_desc mv98dx3236_corediv_desc[] = { + { .mask = 0x0f, .offset = 6, .fieldbit = 26 }, /* NAND clock */ +}; + #define to_corediv_clk(p) container_of(p, struct clk_corediv, hw) static int clk_corediv_is_enabled(struct clk_hw *hwclk) @@ -232,6 +236,18 @@ static const struct clk_corediv_soc_desc armada375_corediv_soc = { .ratio_offset = 0x4, }; +static const struct clk_corediv_soc_desc mv98dx3236_corediv_soc = { + .descs = mv98dx3236_corediv_desc, + .ndescs = ARRAY_SIZE(mv98dx3236_corediv_desc), + .ops = { + .recalc_rate = clk_corediv_recalc_rate, + .round_rate = clk_corediv_round_rate, + .set_rate = clk_corediv_set_rate, + }, + .ratio_reload = BIT(10), + .ratio_offset = 0x8, +}; + static void __init mvebu_corediv_clk_init(struct device_node *node, const struct clk_corediv_soc_desc *soc_desc) @@ -313,3 +329,10 @@ static void __init armada380_corediv_clk_init(struct device_node *node) } CLK_OF_DECLARE(armada380_corediv_clk, "marvell,armada-380-corediv-clock", armada380_corediv_clk_init); + +static void __init mv98dx3236_corediv_clk_init(struct device_node *node) +{ + return mvebu_corediv_clk_init(node, &mv98dx3236_corediv_soc); +} +CLK_OF_DECLARE(mv98dx3236_corediv_clk, "marvell,mv98dx3236-corediv-clock", + mv98dx3236_corediv_clk_init); diff --git a/drivers/clk/mvebu/clk-cpu.c b/drivers/clk/mvebu/clk-cpu.c index 29f295e7a36b..3b8f0e14fa01 100644 --- a/drivers/clk/mvebu/clk-cpu.c +++ b/drivers/clk/mvebu/clk-cpu.c @@ -254,7 +254,7 @@ static void __init of_cpu_clk_setup(struct device_node *node) } CLK_OF_DECLARE(armada_xp_cpu_clock, "marvell,armada-xp-cpu-clock", - of_cpu_clk_setup); + of_cpu_clk_setup); /* Define the clock and operations for the mv98dx3236 - it cannot * perform * any operations. diff --git a/drivers/clk/mvebu/mv98dx3236-corediv.c b/drivers/clk/mvebu/mv98dx3236-corediv.c deleted file mode 100644 index 3060764a8e5d..000000000000 --- a/drivers/clk/mvebu/mv98dx3236-corediv.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * MV98DX3236 Core divider clock - * - * Copyright (C) 2015 Allied Telesis Labs - * - * Based on armada-xp-corediv.c - * Copyright (C) 2015 Marvell - * - * John Thompson <john.thompson@alliedtelesis.co.nz> - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ -#include <linux/kernel.h> -#include <linux/clk-provider.h> -#include <linux/of_address.h> -#include <linux/slab.h> -#include <linux/delay.h> -#include "common.h" - -#define CORE_CLK_DIV_RATIO_MASK 0xff - -#define CLK_DIV_RATIO_NAND_MASK 0x0f -#define CLK_DIV_RATIO_NAND_OFFSET 6 -#define CLK_DIV_RATIO_NAND_FORCE_RELOAD_BIT 26 - -#define RATIO_RELOAD_BIT BIT(10) -#define RATIO_REG_OFFSET 0x08 - -/* - * This structure represents one core divider clock for the clock - * framework, and is dynamically allocated for each core divider clock - * existing in the current SoC. - */ -struct clk_corediv { - struct clk_hw hw; - void __iomem *reg; - spinlock_t lock; -}; - -static struct clk_onecell_data clk_data; - - -#define to_corediv_clk(p) container_of(p, struct clk_corediv, hw) - -static int mv98dx3236_corediv_is_enabled(struct clk_hw *hwclk) -{ - /* Core divider is always active */ - return 1; -} - -static int mv98dx3236_corediv_enable(struct clk_hw *hwclk) -{ - /* always succeeds */ - return 0; -} - -static void mv98dx3236_corediv_disable(struct clk_hw *hwclk) -{ - /* can't be disabled so is left alone */ -} - -static unsigned long mv98dx3236_corediv_recalc_rate(struct clk_hw *hwclk, - unsigned long parent_rate) -{ - struct clk_corediv *corediv = to_corediv_clk(hwclk); - u32 reg, div; - - reg = readl(corediv->reg + RATIO_REG_OFFSET); - div = (reg >> CLK_DIV_RATIO_NAND_OFFSET) & CLK_DIV_RATIO_NAND_MASK; - return parent_rate / div; -} - -static long mv98dx3236_corediv_round_rate(struct clk_hw *hwclk, - unsigned long rate, unsigned long *parent_rate) -{ - /* Valid ratio are 1:4, 1:5, 1:6 and 1:8 */ - u32 div; - - div = *parent_rate / rate; - if (div < 4) - div = 4; - else if (div > 6) - div = 8; - - return *parent_rate / div; -} - -static int mv98dx3236_corediv_set_rate(struct clk_hw *hwclk, unsigned long rate, - unsigned long parent_rate) -{ - struct clk_corediv *corediv = to_corediv_clk(hwclk); - unsigned long flags = 0; - u32 reg, div; - - div = parent_rate / rate; - - spin_lock_irqsave(&corediv->lock, flags); - - /* Write new divider to the divider ratio register */ - reg = readl(corediv->reg + RATIO_REG_OFFSET); - reg &= ~(CLK_DIV_RATIO_NAND_MASK << CLK_DIV_RATIO_NAND_OFFSET); - reg |= (div & CLK_DIV_RATIO_NAND_MASK) << CLK_DIV_RATIO_NAND_OFFSET; - writel(reg, corediv->reg + RATIO_REG_OFFSET); - - /* Set reload-force for this clock */ - reg = readl(corediv->reg) | BIT(CLK_DIV_RATIO_NAND_FORCE_RELOAD_BIT); - writel(reg, corediv->reg); - - /* Now trigger the clock update */ - reg = readl(corediv->reg + RATIO_REG_OFFSET) | RATIO_RELOAD_BIT; - writel(reg, corediv->reg + RATIO_REG_OFFSET); - - /* - * Wait for clocks to settle down, and then clear all the - * ratios request and the reload request. - */ - udelay(1000); - reg &= ~(CORE_CLK_DIV_RATIO_MASK | RATIO_RELOAD_BIT); - writel(reg, corediv->reg + RATIO_REG_OFFSET); - udelay(1000); - - spin_unlock_irqrestore(&corediv->lock, flags); - - return 0; -} - -static const struct clk_ops ops = { - .enable = mv98dx3236_corediv_enable, - .disable = mv98dx3236_corediv_disable, - .is_enabled = mv98dx3236_corediv_is_enabled, - .recalc_rate = mv98dx3236_corediv_recalc_rate, - .round_rate = mv98dx3236_corediv_round_rate, - .set_rate = mv98dx3236_corediv_set_rate, -}; - -static void __init mv98dx3236_corediv_clk_init(struct device_node *node) -{ - struct clk_init_data init; - struct clk_corediv *corediv; - struct clk **clks; - void __iomem *base; - const __be32 *off; - const char *parent_name; - const char *clk_name; - int len; - struct device_node *dfx_node; - - dfx_node = of_parse_phandle(node, "base", 0); - if (WARN_ON(!dfx_node)) - return; - - off = of_get_property(node, "reg", &len); - if (WARN_ON(!off)) - return; - - base = of_iomap(dfx_node, 0); - if (WARN_ON(!base)) - return; - - of_node_put(dfx_node); - - parent_name = of_clk_get_parent_name(node, 0); - - clk_data.clk_num = 1; - - /* clks holds the clock array */ - clks = kcalloc(clk_data.clk_num, sizeof(struct clk *), - GFP_KERNEL); - if (WARN_ON(!clks)) - goto err_unmap; - /* corediv holds the clock specific array */ - corediv = kcalloc(clk_data.clk_num, sizeof(struct clk_corediv), - GFP_KERNEL); - if (WARN_ON(!corediv)) - goto err_free_clks; - - spin_lock_init(&corediv->lock); - - of_property_read_string_index(node, "clock-output-names", - 0, &clk_name); - - init.num_parents = 1; - init.parent_names = &parent_name; - init.name = clk_name; - init.ops = &ops; - init.flags = 0; - - corediv[0].reg = (void *)((int)base + be32_to_cpu(*off)); - corediv[0].hw.init = &init; - - clks[0] = clk_register(NULL, &corediv[0].hw); - WARN_ON(IS_ERR(clks[0])); - - clk_data.clks = clks; - of_clk_add_provider(node, of_clk_src_onecell_get, &clk_data); - return; - -err_free_clks: - kfree(clks); -err_unmap: - iounmap(base); -} - -CLK_OF_DECLARE(mv98dx3236_corediv_clk, "marvell,mv98dx3236-corediv-clock", - mv98dx3236_corediv_clk_init); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCHv3 1/5] clk: mvebu: support for 98DX3236 SoC 2017-01-06 4:14 ` Chris Packham @ 2017-01-06 4:14 ` Chris Packham 2017-01-09 18:39 ` Rob Herring 0 siblings, 1 reply; 15+ messages in thread From: Chris Packham @ 2017-01-06 4:14 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Michael Turquette, Stephen Boyd, Rob Herring, Mark Rutland, linux-clk, devicetree, linux-kernel The 98DX3236, 98DX3336, 98DX4521 and variants have a different TCLK from the Armada XP (200MHz vs 250MHz). The CPU core clock is fixed at 800MHz. The clock gating options are a subset of those on the Armada XP. The core clock divider is different to the Armada XP also. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- Changes in v2: - Update devicetree binding documentation for new compatible string Changes in v3: - Add 98dx3236 support to mvebu/clk-corediv.c rather than creating a new driver. - Document mv98dx3236-corediv-clock binding .../bindings/clock/mvebu-corediv-clock.txt | 1 + .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 + drivers/clk/mvebu/armada-xp.c | 42 ++++++++++++++++++++++ drivers/clk/mvebu/clk-corediv.c | 23 ++++++++++++ drivers/clk/mvebu/clk-cpu.c | 31 ++++++++++++++-- 5 files changed, 96 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt b/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt index 520562a7dc2a..c7b4e3a6b2c6 100644 --- a/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt +++ b/Documentation/devicetree/bindings/clock/mvebu-corediv-clock.txt @@ -7,6 +7,7 @@ Required properties: - compatible : must be "marvell,armada-370-corediv-clock", "marvell,armada-375-corediv-clock", "marvell,armada-380-corediv-clock", + "marvell,mv98dx3236-corediv-clock", - reg : must be the register address of Core Divider control register - #clock-cells : from common clock binding; shall be set to 1 diff --git a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt index 99c214660bdc..7f28506eaee7 100644 --- a/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt +++ b/Documentation/devicetree/bindings/clock/mvebu-cpu-clock.txt @@ -3,6 +3,7 @@ Device Tree Clock bindings for cpu clock of Marvell EBU platforms Required properties: - compatible : shall be one of the following: "marvell,armada-xp-cpu-clock" - cpu clocks for Armada XP + "marvell,mv98dx3236-cpu-clock" - cpu clocks for 98DX3236 SoC - reg : Address and length of the clock complex register set, followed by address and length of the PMU DFS registers - #clock-cells : should be set to 1. diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c index b3094315a3c0..0413bf8284e0 100644 --- a/drivers/clk/mvebu/armada-xp.c +++ b/drivers/clk/mvebu/armada-xp.c @@ -52,6 +52,12 @@ static u32 __init axp_get_tclk_freq(void __iomem *sar) return 250000000; } +/* MV98DX3236 TCLK frequency is fixed to 200MHz */ +static u32 __init mv98dx3236_get_tclk_freq(void __iomem *sar) +{ + return 200000000; +} + static const u32 axp_cpu_freqs[] __initconst = { 1000000000, 1066000000, @@ -89,6 +95,12 @@ static u32 __init axp_get_cpu_freq(void __iomem *sar) return cpu_freq; } +/* MV98DX3236 CLK frequency is fixed to 800MHz */ +static u32 __init mv98dx3236_get_cpu_freq(void __iomem *sar) +{ + return 800000000; +} + static const int axp_nbclk_ratios[32][2] __initconst = { {0, 1}, {1, 2}, {2, 2}, {2, 2}, {1, 2}, {1, 2}, {1, 1}, {2, 3}, @@ -158,6 +170,14 @@ static const struct coreclk_soc_desc axp_coreclks = { .num_ratios = ARRAY_SIZE(axp_coreclk_ratios), }; +static const struct coreclk_soc_desc mv98dx3236_coreclks = { + .get_tclk_freq = mv98dx3236_get_tclk_freq, + .get_cpu_freq = mv98dx3236_get_cpu_freq, + .get_clk_ratio = NULL, + .ratios = NULL, + .num_ratios = 0, +}; + /* * Clock Gating Control */ @@ -195,6 +215,15 @@ static const struct clk_gating_soc_desc axp_gating_desc[] __initconst = { { } }; +static const struct clk_gating_soc_desc mv98dx3236_gating_desc[] __initconst = { + { "ge1", NULL, 3, 0 }, + { "ge0", NULL, 4, 0 }, + { "pex00", NULL, 5, 0 }, + { "sdio", NULL, 17, 0 }, + { "xor0", NULL, 22, 0 }, + { } +}; + static void __init axp_clk_init(struct device_node *np) { struct device_node *cgnp = @@ -206,3 +235,16 @@ static void __init axp_clk_init(struct device_node *np) mvebu_clk_gating_setup(cgnp, axp_gating_desc); } CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); + +static void __init mv98dx3236_clk_init(struct device_node *np) +{ + struct device_node *cgnp = + of_find_compatible_node(NULL, NULL, "marvell,armada-xp-gating-clock"); + + mvebu_coreclk_setup(np, &mv98dx3236_coreclks); + + if (cgnp) + mvebu_clk_gating_setup(cgnp, mv98dx3236_gating_desc); +} +CLK_OF_DECLARE(mv98dx3236_clk, "marvell,mv98dx3236-core-clock", + mv98dx3236_clk_init); diff --git a/drivers/clk/mvebu/clk-corediv.c b/drivers/clk/mvebu/clk-corediv.c index d1e5863d3375..8491979f4096 100644 --- a/drivers/clk/mvebu/clk-corediv.c +++ b/drivers/clk/mvebu/clk-corediv.c @@ -71,6 +71,10 @@ static const struct clk_corediv_desc mvebu_corediv_desc[] = { { .mask = 0x3f, .offset = 8, .fieldbit = 1 }, /* NAND clock */ }; +static const struct clk_corediv_desc mv98dx3236_corediv_desc[] = { + { .mask = 0x0f, .offset = 6, .fieldbit = 26 }, /* NAND clock */ +}; + #define to_corediv_clk(p) container_of(p, struct clk_corediv, hw) static int clk_corediv_is_enabled(struct clk_hw *hwclk) @@ -232,6 +236,18 @@ static const struct clk_corediv_soc_desc armada375_corediv_soc = { .ratio_offset = 0x4, }; +static const struct clk_corediv_soc_desc mv98dx3236_corediv_soc = { + .descs = mv98dx3236_corediv_desc, + .ndescs = ARRAY_SIZE(mv98dx3236_corediv_desc), + .ops = { + .recalc_rate = clk_corediv_recalc_rate, + .round_rate = clk_corediv_round_rate, + .set_rate = clk_corediv_set_rate, + }, + .ratio_reload = BIT(10), + .ratio_offset = 0x8, +}; + static void __init mvebu_corediv_clk_init(struct device_node *node, const struct clk_corediv_soc_desc *soc_desc) @@ -313,3 +329,10 @@ static void __init armada380_corediv_clk_init(struct device_node *node) } CLK_OF_DECLARE(armada380_corediv_clk, "marvell,armada-380-corediv-clock", armada380_corediv_clk_init); + +static void __init mv98dx3236_corediv_clk_init(struct device_node *node) +{ + return mvebu_corediv_clk_init(node, &mv98dx3236_corediv_soc); +} +CLK_OF_DECLARE(mv98dx3236_corediv_clk, "marvell,mv98dx3236-corediv-clock", + mv98dx3236_corediv_clk_init); diff --git a/drivers/clk/mvebu/clk-cpu.c b/drivers/clk/mvebu/clk-cpu.c index 5837eb8a212f..3b8f0e14fa01 100644 --- a/drivers/clk/mvebu/clk-cpu.c +++ b/drivers/clk/mvebu/clk-cpu.c @@ -165,7 +165,9 @@ static const struct clk_ops cpu_ops = { .set_rate = clk_cpu_set_rate, }; -static void __init of_cpu_clk_setup(struct device_node *node) +/* Add parameter to allow this to support different clock operations. */ +static void __init _of_cpu_clk_setup(struct device_node *node, + const struct clk_ops *cpu_clk_ops) { struct cpu_clk *cpuclk; void __iomem *clock_complex_base = of_iomap(node, 0); @@ -218,7 +220,7 @@ static void __init of_cpu_clk_setup(struct device_node *node) cpuclk[cpu].hw.init = &init; init.name = cpuclk[cpu].clk_name; - init.ops = &cpu_ops; + init.ops = cpu_clk_ops; init.flags = 0; init.parent_names = &cpuclk[cpu].parent_name; init.num_parents = 1; @@ -243,5 +245,30 @@ static void __init of_cpu_clk_setup(struct device_node *node) iounmap(clock_complex_base); } +/* Use this function to call the generic setup with the correct + * clock operation + */ +static void __init of_cpu_clk_setup(struct device_node *node) +{ + _of_cpu_clk_setup(node, &cpu_ops); +} + CLK_OF_DECLARE(armada_xp_cpu_clock, "marvell,armada-xp-cpu-clock", of_cpu_clk_setup); + +/* Define the clock and operations for the mv98dx3236 - it cannot perform + * any operations. + */ +static const struct clk_ops mv98dx3236_cpu_ops = { + .recalc_rate = NULL, + .round_rate = NULL, + .set_rate = NULL, +}; + +static void __init of_mv98dx3236_cpu_clk_setup(struct device_node *node) +{ + _of_cpu_clk_setup(node, &mv98dx3236_cpu_ops); +} + +CLK_OF_DECLARE(mv98dx3236_cpu_clock, "marvell,mv98dx3236-cpu-clock", + of_mv98dx3236_cpu_clk_setup); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCHv3 1/5] clk: mvebu: support for 98DX3236 SoC 2017-01-06 4:14 ` [PATCHv3 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham @ 2017-01-09 18:39 ` Rob Herring 0 siblings, 0 replies; 15+ messages in thread From: Rob Herring @ 2017-01-09 18:39 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Michael Turquette, Stephen Boyd, Mark Rutland, linux-clk, devicetree, linux-kernel On Fri, Jan 06, 2017 at 05:14:58PM +1300, Chris Packham wrote: > The 98DX3236, 98DX3336, 98DX4521 and variants have a different TCLK from > the Armada XP (200MHz vs 250MHz). The CPU core clock is fixed at 800MHz. > > The clock gating options are a subset of those on the Armada XP. > > The core clock divider is different to the Armada XP also. > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > Changes in v2: > - Update devicetree binding documentation for new compatible string > > Changes in v3: > - Add 98dx3236 support to mvebu/clk-corediv.c rather than creating a new > driver. > - Document mv98dx3236-corediv-clock binding > > .../bindings/clock/mvebu-corediv-clock.txt | 1 + > .../devicetree/bindings/clock/mvebu-cpu-clock.txt | 1 + Acked-by: Rob Herring <robh@kernel.org> > drivers/clk/mvebu/armada-xp.c | 42 ++++++++++++++++++++++ > drivers/clk/mvebu/clk-corediv.c | 23 ++++++++++++ > drivers/clk/mvebu/clk-cpu.c | 31 ++++++++++++++-- > 5 files changed, 96 insertions(+), 2 deletions(-) ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2017-01-09 18:39 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-01-05 3:36 [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Chris Packham 2017-01-05 3:36 ` [PATCHv2 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham 2017-01-05 13:53 ` Mark Rutland 2017-01-05 23:05 ` Chris Packham 2017-01-05 4:07 ` [PATCHv2 0/5] Support for Marvell switches with integrated CPUs Florian Fainelli 2017-01-05 4:24 ` Chris Packham 2017-01-05 13:09 ` Andrew Lunn 2017-01-05 14:07 ` Marcin Wojtas 2017-01-05 19:46 ` Chris Packham 2017-01-05 19:52 ` Florian Fainelli 2017-01-05 14:09 ` Marcin Wojtas 2017-01-05 20:02 ` Chris Packham 2017-01-06 4:14 ` Chris Packham 2017-01-06 4:14 ` [PATCHv3 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham 2017-01-09 18:39 ` Rob Herring
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox