* [PATCH 0/5] Support for Marvell switches with integrated CPUs
@ 2016-12-22 4:13 Chris Packham
2016-12-22 4:13 ` Chris Packham
` (4 more replies)
0 siblings, 5 replies; 25+ messages in thread
From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw)
To: linux-arm-kernel
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
.../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++
.../devicetree/bindings/arm/marvell/98dx3236.txt | 10 +
.../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 ++++
arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 231 +++++++++++++++++++++
arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++
arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 78 +++++++
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 | 145 +++++++++++++
17 files changed, 1314 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] 25+ messages in thread* [PATCH 1/5] clk: mvebu: support for 98DX3236 SoC 2016-12-22 4:13 [PATCH 0/5] Support for Marvell switches with integrated CPUs Chris Packham @ 2016-12-22 4:13 ` Chris Packham 2016-12-22 4:13 ` Chris Packham ` (3 subsequent siblings) 4 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Michael Turquette, Stephen Boyd, Gregory CLEMENT, Thomas Petazzoni, Russell King, linux-kernel, linux-clk 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> --- 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 +++++++++++++++++++++++++++++++++ 4 files changed, 280 insertions(+), 4 deletions(-) create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c 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] 25+ messages in thread
* [PATCH 1/5] clk: mvebu: support for 98DX3236 SoC @ 2016-12-22 4:13 ` Chris Packham 0 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-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> --- 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 +++++++++++++++++++++++++++++++++ 4 files changed, 280 insertions(+), 4 deletions(-) create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c 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] 25+ messages in thread
* Re: [PATCH 1/5] clk: mvebu: support for 98DX3236 SoC 2016-12-22 4:13 ` Chris Packham (?) @ 2017-01-04 17:32 ` Gregory CLEMENT -1 siblings, 0 replies; 25+ messages in thread From: Gregory CLEMENT @ 2017-01-04 17:32 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Michael Turquette, Stephen Boyd, Thomas Petazzoni, Russell King, linux-kernel, linux-clk Hi Chris, =20 On jeu., d=C3=A9c. 22 2016, Chris Packham <chris.packham@alliedtelesis.co.= nz> 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. This patch looks good, however you should update the device tree binding documentation too. Thanks, Gregory > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > 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 +++++++++++++++++++++++++++= ++++++ > 4 files changed, 280 insertions(+), 4 deletions(-) > create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c > > 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) +=3D armada-39x.o > obj-$(CONFIG_ARMADA_37XX_CLK) +=3D armada-37xx-xtal.o > obj-$(CONFIG_ARMADA_37XX_CLK) +=3D armada-37xx-tbg.o > obj-$(CONFIG_ARMADA_37XX_CLK) +=3D armada-37xx-periph.o > -obj-$(CONFIG_ARMADA_XP_CLK) +=3D armada-xp.o > +obj-$(CONFIG_ARMADA_XP_CLK) +=3D armada-xp.o mv98dx3236-corediv.o > obj-$(CONFIG_ARMADA_AP806_SYSCON) +=3D ap806-system-controller.o > obj-$(CONFIG_ARMADA_CP110_SYSCON) +=3D cp110-system-controller.o > obj-$(CONFIG_DOVE_CLK) +=3D 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; > } >=20=20 > +/* 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 =3D { > 1000000000, > 1066000000, > @@ -89,6 +95,12 @@ static u32 __init axp_get_cpu_freq(void __iomem *sar) > return cpu_freq; > } >=20=20 > +/* 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 =3D { > {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 = =3D { > .num_ratios =3D ARRAY_SIZE(axp_coreclk_ratios), > }; >=20=20 > +static const struct coreclk_soc_desc mv98dx3236_coreclks =3D { > + .get_tclk_freq =3D mv98dx3236_get_tclk_freq, > + .get_cpu_freq =3D mv98dx3236_get_cpu_freq, > + .get_clk_ratio =3D NULL, > + .ratios =3D NULL, > + .num_ratios =3D 0, > +}; > + > /* > * Clock Gating Control > */ > @@ -195,6 +215,15 @@ static const struct clk_gating_soc_desc axp_gating_d= esc[] __initconst =3D { > { } > }; >=20=20 > +static const struct clk_gating_soc_desc mv98dx3236_gating_desc[] __initc= onst =3D { > + { "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 =3D > @@ -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 =3D > + 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 =3D { > .set_rate =3D clk_cpu_set_rate, > }; >=20=20 > -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 =3D of_iomap(node, 0); > @@ -218,7 +220,7 @@ static void __init of_cpu_clk_setup(struct device_nod= e *node) > cpuclk[cpu].hw.init =3D &init; >=20=20 > init.name =3D cpuclk[cpu].clk_name; > - init.ops =3D &cpu_ops; > + init.ops =3D cpu_clk_ops; > init.flags =3D 0; > init.parent_names =3D &cpuclk[cpu].parent_name; > init.num_parents =3D 1; > @@ -243,5 +245,30 @@ static void __init of_cpu_clk_setup(struct device_no= de *node) > iounmap(clock_complex_base); > } >=20=20 > +/* 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 =3D { > + .recalc_rate =3D NULL, > + .round_rate =3D NULL, > + .set_rate =3D 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/m= v98dx3236-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 =3D to_corediv_clk(hwclk); > + u32 reg, div; > + > + reg =3D readl(corediv->reg + RATIO_REG_OFFSET); > + div =3D (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 =3D *parent_rate / rate; > + if (div < 4) > + div =3D 4; > + else if (div > 6) > + div =3D 8; > + > + return *parent_rate / div; > +} > + > +static int mv98dx3236_corediv_set_rate(struct clk_hw *hwclk, unsigned lo= ng rate, > + unsigned long parent_rate) > +{ > + struct clk_corediv *corediv =3D to_corediv_clk(hwclk); > + unsigned long flags =3D 0; > + u32 reg, div; > + > + div =3D parent_rate / rate; > + > + spin_lock_irqsave(&corediv->lock, flags); > + > + /* Write new divider to the divider ratio register */ > + reg =3D readl(corediv->reg + RATIO_REG_OFFSET); > + reg &=3D ~(CLK_DIV_RATIO_NAND_MASK << CLK_DIV_RATIO_NAND_OFFSET); > + reg |=3D (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 =3D readl(corediv->reg) | BIT(CLK_DIV_RATIO_NAND_FORCE_RELOAD_BIT); > + writel(reg, corediv->reg); > + > + /* Now trigger the clock update */ > + reg =3D 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 &=3D ~(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 =3D { > + .enable =3D mv98dx3236_corediv_enable, > + .disable =3D mv98dx3236_corediv_disable, > + .is_enabled =3D mv98dx3236_corediv_is_enabled, > + .recalc_rate =3D mv98dx3236_corediv_recalc_rate, > + .round_rate =3D mv98dx3236_corediv_round_rate, > + .set_rate =3D 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 =3D of_parse_phandle(node, "base", 0); > + if (WARN_ON(!dfx_node)) > + return; > + > + off =3D of_get_property(node, "reg", &len); > + if (WARN_ON(!off)) > + return; > + > + base =3D of_iomap(dfx_node, 0); > + if (WARN_ON(!base)) > + return; > + > + of_node_put(dfx_node); > + > + parent_name =3D of_clk_get_parent_name(node, 0); > + > + clk_data.clk_num =3D 1; > + > + /* clks holds the clock array */ > + clks =3D kcalloc(clk_data.clk_num, sizeof(struct clk *), > + GFP_KERNEL); > + if (WARN_ON(!clks)) > + goto err_unmap; > + /* corediv holds the clock specific array */ > + corediv =3D 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 =3D 1; > + init.parent_names =3D &parent_name; > + init.name =3D clk_name; > + init.ops =3D &ops; > + init.flags =3D 0; > + > + corediv[0].reg =3D (void *)((int)base + be32_to_cpu(*off)); > + corediv[0].hw.init =3D &init; > + > + clks[0] =3D clk_register(NULL, &corediv[0].hw); > + WARN_ON(IS_ERR(clks[0])); > + > + clk_data.clks =3D 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); > --=20 > 2.11.0.24.ge6920cf > --=20 Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 1/5] clk: mvebu: support for 98DX3236 SoC @ 2017-01-04 17:32 ` Gregory CLEMENT 0 siblings, 0 replies; 25+ messages in thread From: Gregory CLEMENT @ 2017-01-04 17:32 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Michael Turquette, Stephen Boyd, Thomas Petazzoni, Russell King, linux-kernel, linux-clk Hi Chris, On jeu., déc. 22 2016, Chris Packham <chris.packham@alliedtelesis.co.nz> 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. This patch looks good, however you should update the device tree binding documentation too. Thanks, Gregory > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > 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 +++++++++++++++++++++++++++++++++ > 4 files changed, 280 insertions(+), 4 deletions(-) > create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c > > 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 > -- Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 1/5] clk: mvebu: support for 98DX3236 SoC @ 2017-01-04 17:32 ` Gregory CLEMENT 0 siblings, 0 replies; 25+ messages in thread From: Gregory CLEMENT @ 2017-01-04 17:32 UTC (permalink / raw) To: linux-arm-kernel Hi Chris, On jeu., d?c. 22 2016, Chris Packham <chris.packham@alliedtelesis.co.nz> 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. This patch looks good, however you should update the device tree binding documentation too. Thanks, Gregory > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > 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 +++++++++++++++++++++++++++++++++ > 4 files changed, 280 insertions(+), 4 deletions(-) > create mode 100644 drivers/clk/mvebu/mv98dx3236-corediv.c > > 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 > -- Gregory Clement, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 2/5] arm: mvebu: support for SMP on 98DX3336 SoC 2016-12-22 4:13 [PATCH 0/5] Support for Marvell switches with integrated CPUs Chris Packham @ 2016-12-22 4:13 ` Chris Packham 2016-12-22 4:13 ` Chris Packham ` (3 subsequent siblings) 4 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Compared to the armada-xp the 98DX3336 uses different registers to set the boot address for the secondary CPU so a new enable-method is needed. This will only work if the machine definition doesn't define an overall smp_ops because there is not currently a way of overriding this from the device tree if it is set in the machine definition. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++++++ 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 ++++++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt new file mode 100644 index 000000000000..8082ba872edd --- /dev/null +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt @@ -0,0 +1,18 @@ +Resume Control +-------------- +Available on Marvell SOCs: 98DX3336 and 98DX4251 + +Required properties: + +- compatible: must be "marvell,98dx3336-resume-ctrl" + +- reg: Should contain resume control registers location and length + +Example: + +resume at 20980 { + compatible = "marvell,98dx3336-resume-ctrl"; + reg = <0x20980 0x10>; +}; + + diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile index 6c6497e80a7b..2a2dd8324fb8 100644 --- a/arch/arm/mach-mvebu/Makefile +++ b/arch/arm/mach-mvebu/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_MACH_MVEBU_ANY) += system-controller.o mvebu-soc-id.o ifeq ($(CONFIG_MACH_MVEBU_V7),y) obj-y += cpu-reset.o board-v7.o coherency.o coherency_ll.o pmsu.o pmsu_ll.o +obj-y += pmsu-98dx3236.o obj-$(CONFIG_PM) += pm.o pm-board.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o platsmp-a9.o headsmp-a9.o diff --git a/arch/arm/mach-mvebu/common.h b/arch/arm/mach-mvebu/common.h index 6b775492cfad..099dabf23461 100644 --- a/arch/arm/mach-mvebu/common.h +++ b/arch/arm/mach-mvebu/common.h @@ -27,4 +27,5 @@ void __iomem *mvebu_get_scu_base(void); int mvebu_pm_suspend_init(void (*board_pm_enter)(void __iomem *sdram_reg, u32 srcmd)); +void mv98dx3236_resume_set_cpu_boot_addr(int hw_cpu, void *boot_addr); #endif diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c index 46c742d3bd41..3c9ab9a008ad 100644 --- a/arch/arm/mach-mvebu/platsmp.c +++ b/arch/arm/mach-mvebu/platsmp.c @@ -182,5 +182,48 @@ const struct smp_operations armada_xp_smp_ops __initconst = { #endif }; +static int mv98dx3236_boot_secondary(unsigned int cpu, struct task_struct *idle) +{ + int ret, hw_cpu; + + pr_info("Booting CPU %d\n", cpu); + + hw_cpu = cpu_logical_map(cpu); + set_secondary_cpu_clock(hw_cpu); + mv98dx3236_resume_set_cpu_boot_addr(hw_cpu, + armada_xp_secondary_startup); + + /* + * This is needed to wake up CPUs in the offline state after + * using CPU hotplug. + */ + arch_send_wakeup_ipi_mask(cpumask_of(cpu)); + + /* + * This is needed to take secondary CPUs out of reset on the + * initial boot. + */ + ret = mvebu_cpu_reset_deassert(hw_cpu); + if (ret) { + pr_warn("unable to boot CPU: %d\n", ret); + return ret; + } + + return 0; +} + +struct smp_operations mv98dx3236_smp_ops __initdata = { + .smp_init_cpus = armada_xp_smp_init_cpus, + .smp_prepare_cpus = armada_xp_smp_prepare_cpus, + .smp_boot_secondary = mv98dx3236_boot_secondary, + .smp_secondary_init = armada_xp_secondary_init, +#ifdef CONFIG_HOTPLUG_CPU + .cpu_die = armada_xp_cpu_die, + .cpu_kill = armada_xp_cpu_kill, +#endif +}; + CPU_METHOD_OF_DECLARE(armada_xp_smp, "marvell,armada-xp-smp", &armada_xp_smp_ops); +CPU_METHOD_OF_DECLARE(mv98dx3236_smp, "marvell,98dx3236-smp", + &mv98dx3236_smp_ops); diff --git a/arch/arm/mach-mvebu/pmsu-98dx3236.c b/arch/arm/mach-mvebu/pmsu-98dx3236.c new file mode 100644 index 000000000000..fadc81d0c051 --- /dev/null +++ b/arch/arm/mach-mvebu/pmsu-98dx3236.c @@ -0,0 +1,69 @@ +/** + * CPU resume support for 98DX4521 internal CPU (a.k.a. MSYS). + */ + +#define pr_fmt(fmt) "mv98dx3236-resume: " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "common.h" + +static void __iomem *mv98dx3236_resume_base; +#define MV98DX3236_CPU_RESUME_CTRL_OFFSET 0x08 +#define MV98DX3236_CPU_RESUME_ADDR_OFFSET 0x04 + +static const struct of_device_id of_mv98dx3236_resume_table[] = { + {.compatible = "marvell,98dx3336-resume-ctrl",}, + { /* end of list */ }, +}; + +void mv98dx3236_resume_set_cpu_boot_addr(int hw_cpu, void *boot_addr) +{ + WARN_ON(hw_cpu != 1); + + writel(0, mv98dx3236_resume_base + MV98DX3236_CPU_RESUME_CTRL_OFFSET); + writel(virt_to_phys(boot_addr), mv98dx3236_resume_base + + MV98DX3236_CPU_RESUME_ADDR_OFFSET); +} + +static int __init mv98dx3236_resume_init(void) +{ + struct device_node *np; + struct resource res; + int ret = 0; + + np = of_find_matching_node(NULL, of_mv98dx3236_resume_table); + if (!np) + return 0; + + pr_info("Initializing 98DX4521 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) { + pr_err("unable to map registers\n"); + release_mem_region(res.start, resource_size(&res)); + ret = -ENOMEM; + goto out; + } + +out: + of_node_put(np); + return ret; +} + +early_initcall(mv98dx3236_resume_init); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 2/5] arm: mvebu: support for SMP on 98DX3336 SoC @ 2016-12-22 4:13 ` Chris Packham 0 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Rob Herring, Mark Rutland, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, devicetree, linux-kernel Compared to the armada-xp the 98DX3336 uses different registers to set the boot address for the secondary CPU so a new enable-method is needed. This will only work if the machine definition doesn't define an overall smp_ops because there is not currently a way of overriding this from the device tree if it is set in the machine definition. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++++++ 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 ++++++++++++++++++++++ 5 files changed, 132 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt new file mode 100644 index 000000000000..8082ba872edd --- /dev/null +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt @@ -0,0 +1,18 @@ +Resume Control +-------------- +Available on Marvell SOCs: 98DX3336 and 98DX4251 + +Required properties: + +- compatible: must be "marvell,98dx3336-resume-ctrl" + +- reg: Should contain resume control registers location and length + +Example: + +resume@20980 { + compatible = "marvell,98dx3336-resume-ctrl"; + reg = <0x20980 0x10>; +}; + + diff --git a/arch/arm/mach-mvebu/Makefile b/arch/arm/mach-mvebu/Makefile index 6c6497e80a7b..2a2dd8324fb8 100644 --- a/arch/arm/mach-mvebu/Makefile +++ b/arch/arm/mach-mvebu/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_MACH_MVEBU_ANY) += system-controller.o mvebu-soc-id.o ifeq ($(CONFIG_MACH_MVEBU_V7),y) obj-y += cpu-reset.o board-v7.o coherency.o coherency_ll.o pmsu.o pmsu_ll.o +obj-y += pmsu-98dx3236.o obj-$(CONFIG_PM) += pm.o pm-board.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o platsmp-a9.o headsmp-a9.o diff --git a/arch/arm/mach-mvebu/common.h b/arch/arm/mach-mvebu/common.h index 6b775492cfad..099dabf23461 100644 --- a/arch/arm/mach-mvebu/common.h +++ b/arch/arm/mach-mvebu/common.h @@ -27,4 +27,5 @@ void __iomem *mvebu_get_scu_base(void); int mvebu_pm_suspend_init(void (*board_pm_enter)(void __iomem *sdram_reg, u32 srcmd)); +void mv98dx3236_resume_set_cpu_boot_addr(int hw_cpu, void *boot_addr); #endif diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c index 46c742d3bd41..3c9ab9a008ad 100644 --- a/arch/arm/mach-mvebu/platsmp.c +++ b/arch/arm/mach-mvebu/platsmp.c @@ -182,5 +182,48 @@ const struct smp_operations armada_xp_smp_ops __initconst = { #endif }; +static int mv98dx3236_boot_secondary(unsigned int cpu, struct task_struct *idle) +{ + int ret, hw_cpu; + + pr_info("Booting CPU %d\n", cpu); + + hw_cpu = cpu_logical_map(cpu); + set_secondary_cpu_clock(hw_cpu); + mv98dx3236_resume_set_cpu_boot_addr(hw_cpu, + armada_xp_secondary_startup); + + /* + * This is needed to wake up CPUs in the offline state after + * using CPU hotplug. + */ + arch_send_wakeup_ipi_mask(cpumask_of(cpu)); + + /* + * This is needed to take secondary CPUs out of reset on the + * initial boot. + */ + ret = mvebu_cpu_reset_deassert(hw_cpu); + if (ret) { + pr_warn("unable to boot CPU: %d\n", ret); + return ret; + } + + return 0; +} + +struct smp_operations mv98dx3236_smp_ops __initdata = { + .smp_init_cpus = armada_xp_smp_init_cpus, + .smp_prepare_cpus = armada_xp_smp_prepare_cpus, + .smp_boot_secondary = mv98dx3236_boot_secondary, + .smp_secondary_init = armada_xp_secondary_init, +#ifdef CONFIG_HOTPLUG_CPU + .cpu_die = armada_xp_cpu_die, + .cpu_kill = armada_xp_cpu_kill, +#endif +}; + CPU_METHOD_OF_DECLARE(armada_xp_smp, "marvell,armada-xp-smp", &armada_xp_smp_ops); +CPU_METHOD_OF_DECLARE(mv98dx3236_smp, "marvell,98dx3236-smp", + &mv98dx3236_smp_ops); diff --git a/arch/arm/mach-mvebu/pmsu-98dx3236.c b/arch/arm/mach-mvebu/pmsu-98dx3236.c new file mode 100644 index 000000000000..fadc81d0c051 --- /dev/null +++ b/arch/arm/mach-mvebu/pmsu-98dx3236.c @@ -0,0 +1,69 @@ +/** + * CPU resume support for 98DX4521 internal CPU (a.k.a. MSYS). + */ + +#define pr_fmt(fmt) "mv98dx3236-resume: " fmt + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of_address.h> +#include <linux/io.h> +#include "common.h" + +static void __iomem *mv98dx3236_resume_base; +#define MV98DX3236_CPU_RESUME_CTRL_OFFSET 0x08 +#define MV98DX3236_CPU_RESUME_ADDR_OFFSET 0x04 + +static const struct of_device_id of_mv98dx3236_resume_table[] = { + {.compatible = "marvell,98dx3336-resume-ctrl",}, + { /* end of list */ }, +}; + +void mv98dx3236_resume_set_cpu_boot_addr(int hw_cpu, void *boot_addr) +{ + WARN_ON(hw_cpu != 1); + + writel(0, mv98dx3236_resume_base + MV98DX3236_CPU_RESUME_CTRL_OFFSET); + writel(virt_to_phys(boot_addr), mv98dx3236_resume_base + + MV98DX3236_CPU_RESUME_ADDR_OFFSET); +} + +static int __init mv98dx3236_resume_init(void) +{ + struct device_node *np; + struct resource res; + int ret = 0; + + np = of_find_matching_node(NULL, of_mv98dx3236_resume_table); + if (!np) + return 0; + + pr_info("Initializing 98DX4521 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) { + pr_err("unable to map registers\n"); + release_mem_region(res.start, resource_size(&res)); + ret = -ENOMEM; + goto out; + } + +out: + of_node_put(np); + return ret; +} + +early_initcall(mv98dx3236_resume_init); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 2/5] arm: mvebu: support for SMP on 98DX3336 SoC @ 2016-12-22 22:47 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:47 UTC (permalink / raw) To: linux-arm-kernel On Thu, Dec 22, 2016 at 05:13:25PM +1300, Chris Packham wrote: > Compared to the armada-xp the 98DX3336 uses different registers to set > the boot address for the secondary CPU so a new enable-method is needed. > This will only work if the machine definition doesn't define an overall > smp_ops because there is not currently a way of overriding this from the > device tree if it is set in the machine definition. Doesn't look like you documented the enable-method value. > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++++++ > 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 ++++++++++++++++++++++ > 5 files changed, 132 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt > create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 2/5] arm: mvebu: support for SMP on 98DX3336 SoC @ 2016-12-22 22:47 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:47 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Mark Rutland, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, devicetree, linux-kernel On Thu, Dec 22, 2016 at 05:13:25PM +1300, Chris Packham wrote: > Compared to the armada-xp the 98DX3336 uses different registers to set > the boot address for the secondary CPU so a new enable-method is needed. > This will only work if the machine definition doesn't define an overall > smp_ops because there is not currently a way of overriding this from the > device tree if it is set in the machine definition. Doesn't look like you documented the enable-method value. > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++++++ > 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 ++++++++++++++++++++++ > 5 files changed, 132 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt > create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 2/5] arm: mvebu: support for SMP on 98DX3336 SoC @ 2016-12-22 22:47 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:47 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Mark Rutland, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA On Thu, Dec 22, 2016 at 05:13:25PM +1300, Chris Packham wrote: > Compared to the armada-xp the 98DX3336 uses different registers to set > the boot address for the secondary CPU so a new enable-method is needed. > This will only work if the machine definition doesn't define an overall > smp_ops because there is not currently a way of overriding this from the > device tree if it is set in the machine definition. Doesn't look like you documented the enable-method value. > Signed-off-by: Chris Packham <chris.packham-6g8wRflRTwXFdCa3tKVlE6U/zSkkHjvu@public.gmane.org> > --- > .../bindings/arm/marvell/98dx3236-resume-ctrl.txt | 18 ++++++ > 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 ++++++++++++++++++++++ > 5 files changed, 132 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236-resume-ctrl.txt > create mode 100644 arch/arm/mach-mvebu/pmsu-98dx3236.c -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC 2016-12-22 4:13 [PATCH 0/5] Support for Marvell switches with integrated CPUs Chris Packham 2016-12-22 4:13 ` Chris Packham @ 2016-12-22 4:13 ` Chris Packham 2016-12-22 4:13 ` Chris Packham ` (2 subsequent siblings) 4 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Cc: Mark Rutland, Thomas Petazzoni, linux-gpio, Linus Walleij, linux-kernel, Rob Herring, Kalyan Kinthada, devicetree, Chris Packham, Laxman Dewangan From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs from Marvell. Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 +++++++ drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 145 +++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt diff --git a/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt new file mode 100644 index 000000000000..34c1e380adaa --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt @@ -0,0 +1,46 @@ +* Marvell 98dx3236 pinctrl driver for mpp + +Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding +part and usage + +Required properties: +- compatible: "marvell,98dx3236-pinctrl" +- reg: register specifier of MPP registers + +This driver supports all 98dx3236, 98dx3336 and 98dx4251 variants + +name pins functions +================================================================================ +mpp0 0 gpio, spi0(mosi), dev(ad8) +mpp1 1 gpio, spi0(miso), dev(ad9) +mpp2 2 gpio, spi0(sck), dev(ad10) +mpp3 3 gpio, spi0(cs0), dev(ad11) +mpp4 4 gpio, spi0(cs1), smi(mdc), dev(cs0) +mpp5 5 gpio, pex(rsto), dev(bootcs) +mpp6 6 gpio, dev(a2) +mpp7 7 gpio, dev(ale0) +mpp8 8 gpio, dev(ale1) +mpp9 9 gpio, dev(ready0) +mpp10 10 gpio, dev(ad12) +mpp11 11 gpio, uart1(rxd), uart0(cts), dev(ad13) +mpp12 12 gpio, uart1(txd), uart0(rts), dev(ad14) +mpp13 13 gpio, intr(out), dev(ad15) +mpp14 14 gpio, i2c0(sck) +mpp15 15 gpio, i2c0(sda) +mpp16 16 gpio, dev(oe) +mpp17 17 gpio, dev(clk) +mpp18 18 gpio, uart1(txd) +mpp19 19 gpio, uart1(rxd), dev(rb) +mpp20 20 gpio, dev(we) +mpp21 21 gpio, dev(ad0) +mpp22 22 gpio, dev(ad1) +mpp23 23 gpio, dev(ad2) +mpp24 24 gpio, dev(ad3) +mpp25 25 gpio, dev(ad4) +mpp26 26 gpio, dev(ad5) +mpp27 27 gpio, dev(ad6) +mpp28 28 gpio, dev(ad7) +mpp29 29 gpio, dev(a0) +mpp30 30 gpio, dev(a1) +mpp31 31 gpio, slv_smi(mdc), smi(mdc), dev(we1) +mpp32 32 gpio, slv_smi(mdio), smi(mdio), dev(cs1) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c index e4ea71a9d985..2586903c59f0 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c @@ -49,6 +49,10 @@ enum armada_xp_variant { V_MV78460 = BIT(2), V_MV78230_PLUS = (V_MV78230 | V_MV78260 | V_MV78460), V_MV78260_PLUS = (V_MV78260 | V_MV78460), + V_98DX3236 = BIT(3), + V_98DX3336 = BIT(4), + V_98DX4251 = BIT(5), + V_98DX3236_PLUS = (V_98DX3236 | V_98DX3336 | V_98DX4251), }; static struct mvebu_mpp_mode armada_xp_mpp_modes[] = { @@ -360,6 +364,124 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = { MPP_VAR_FUNCTION(0x1, "dev", "ad31", V_MV78260_PLUS)), }; +static struct mvebu_mpp_mode mv98dx3236_mpp_modes[] = { + MPP_MODE(0, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "mosi", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad8", V_98DX3236_PLUS)), + MPP_MODE(1, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "miso", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad9", V_98DX3236_PLUS)), + MPP_MODE(2, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "csk", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad10", V_98DX3236_PLUS)), + MPP_MODE(3, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "cs0", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad11", V_98DX3236_PLUS)), + MPP_MODE(4, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "cs1", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "cs0", V_98DX3236_PLUS)), + MPP_MODE(5, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "pex", "rsto", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "bootcs0", V_98DX3236_PLUS)), + MPP_MODE(6, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "a2", V_98DX3236_PLUS)), + MPP_MODE(7, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ale0", V_98DX3236_PLUS)), + MPP_MODE(8, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ale1", V_98DX3236_PLUS)), + MPP_MODE(9, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ready0", V_98DX3236_PLUS)), + MPP_MODE(10, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad12", V_98DX3236_PLUS)), + MPP_MODE(11, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "uart1", "rxd", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart0", "cts", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad13", V_98DX3236_PLUS)), + MPP_MODE(12, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "uart1", "txd", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart0", "rts", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad14", V_98DX3236_PLUS)), + MPP_MODE(13, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "intr", "out", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad15", V_98DX3236_PLUS)), + MPP_MODE(14, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "i2c0", "sck", V_98DX3236_PLUS)), + MPP_MODE(15, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "i2c0", "sda", V_98DX3236_PLUS)), + MPP_MODE(16, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "oe", V_98DX3236_PLUS)), + MPP_MODE(17, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "clkout", V_98DX3236_PLUS)), + MPP_MODE(18, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart1", "txd", V_98DX3236_PLUS)), + MPP_MODE(19, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V_98DX3236_PLUS)), + MPP_MODE(20, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "we0", V_98DX3236_PLUS)), + MPP_MODE(21, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad0", V_98DX3236_PLUS)), + MPP_MODE(22, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad1", V_98DX3236_PLUS)), + MPP_MODE(23, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad2", V_98DX3236_PLUS)), + MPP_MODE(24, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad3", V_98DX3236_PLUS)), + MPP_MODE(25, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad4", V_98DX3236_PLUS)), + MPP_MODE(26, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad5", V_98DX3236_PLUS)), + MPP_MODE(27, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad6", V_98DX3236_PLUS)), + MPP_MODE(28, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad7", V_98DX3236_PLUS)), + MPP_MODE(29, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "a0", V_98DX3236_PLUS)), + MPP_MODE(30, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "a1", V_98DX3236_PLUS)), + MPP_MODE(31, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "slv_smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "we1", V_98DX3236_PLUS)), + MPP_MODE(32, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "slv_smi", "mdio", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdio", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "cs1", V_98DX3236_PLUS)), +}; + static struct mvebu_pinctrl_soc_info armada_xp_pinctrl_info; static const struct of_device_id armada_xp_pinctrl_of_match[] = { @@ -375,6 +497,10 @@ static const struct of_device_id armada_xp_pinctrl_of_match[] = { .compatible = "marvell,mv78460-pinctrl", .data = (void *) V_MV78460, }, + { + .compatible = "marvell,98dx3236-pinctrl", + .data = (void *) V_98DX3236, + }, { }, }; @@ -407,6 +533,14 @@ static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { MPP_GPIO_RANGE(2, 64, 64, 3), }; +static struct mvebu_mpp_ctrl mv98dx3236_mpp_controls[] = { + MPP_FUNC_CTRL(0, 32, NULL, armada_xp_mpp_ctrl), +}; + +static struct pinctrl_gpio_range mv98dx3236_mpp_gpio_ranges[] = { + MPP_GPIO_RANGE(0, 0, 0, 32), +}; + static int armada_xp_pinctrl_suspend(struct platform_device *pdev, pm_message_t state) { @@ -488,6 +622,17 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev) soc->gpioranges = mv78460_mpp_gpio_ranges; soc->ngpioranges = ARRAY_SIZE(mv78460_mpp_gpio_ranges); break; + case V_98DX3236: + case V_98DX3336: + case V_98DX4251: + /* fall-through */ + soc->controls = mv98dx3236_mpp_controls; + soc->ncontrols = ARRAY_SIZE(mv98dx3236_mpp_controls); + soc->modes = mv98dx3236_mpp_modes; + soc->nmodes = mv98dx3236_mpp_controls[0].npins; + soc->gpioranges = mv98dx3236_mpp_gpio_ranges; + soc->ngpioranges = ARRAY_SIZE(mv98dx3236_mpp_gpio_ranges); + break; } nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC @ 2016-12-22 4:13 ` Chris Packham 0 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Cc: Kalyan Kinthada, Chris Packham, Linus Walleij, Rob Herring, Mark Rutland, Laxman Dewangan, Thomas Petazzoni, linux-gpio, devicetree, linux-kernel From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs from Marvell. Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 +++++++ drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 145 +++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt diff --git a/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt new file mode 100644 index 000000000000..34c1e380adaa --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt @@ -0,0 +1,46 @@ +* Marvell 98dx3236 pinctrl driver for mpp + +Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding +part and usage + +Required properties: +- compatible: "marvell,98dx3236-pinctrl" +- reg: register specifier of MPP registers + +This driver supports all 98dx3236, 98dx3336 and 98dx4251 variants + +name pins functions +================================================================================ +mpp0 0 gpio, spi0(mosi), dev(ad8) +mpp1 1 gpio, spi0(miso), dev(ad9) +mpp2 2 gpio, spi0(sck), dev(ad10) +mpp3 3 gpio, spi0(cs0), dev(ad11) +mpp4 4 gpio, spi0(cs1), smi(mdc), dev(cs0) +mpp5 5 gpio, pex(rsto), dev(bootcs) +mpp6 6 gpio, dev(a2) +mpp7 7 gpio, dev(ale0) +mpp8 8 gpio, dev(ale1) +mpp9 9 gpio, dev(ready0) +mpp10 10 gpio, dev(ad12) +mpp11 11 gpio, uart1(rxd), uart0(cts), dev(ad13) +mpp12 12 gpio, uart1(txd), uart0(rts), dev(ad14) +mpp13 13 gpio, intr(out), dev(ad15) +mpp14 14 gpio, i2c0(sck) +mpp15 15 gpio, i2c0(sda) +mpp16 16 gpio, dev(oe) +mpp17 17 gpio, dev(clk) +mpp18 18 gpio, uart1(txd) +mpp19 19 gpio, uart1(rxd), dev(rb) +mpp20 20 gpio, dev(we) +mpp21 21 gpio, dev(ad0) +mpp22 22 gpio, dev(ad1) +mpp23 23 gpio, dev(ad2) +mpp24 24 gpio, dev(ad3) +mpp25 25 gpio, dev(ad4) +mpp26 26 gpio, dev(ad5) +mpp27 27 gpio, dev(ad6) +mpp28 28 gpio, dev(ad7) +mpp29 29 gpio, dev(a0) +mpp30 30 gpio, dev(a1) +mpp31 31 gpio, slv_smi(mdc), smi(mdc), dev(we1) +mpp32 32 gpio, slv_smi(mdio), smi(mdio), dev(cs1) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c index e4ea71a9d985..2586903c59f0 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c @@ -49,6 +49,10 @@ enum armada_xp_variant { V_MV78460 = BIT(2), V_MV78230_PLUS = (V_MV78230 | V_MV78260 | V_MV78460), V_MV78260_PLUS = (V_MV78260 | V_MV78460), + V_98DX3236 = BIT(3), + V_98DX3336 = BIT(4), + V_98DX4251 = BIT(5), + V_98DX3236_PLUS = (V_98DX3236 | V_98DX3336 | V_98DX4251), }; static struct mvebu_mpp_mode armada_xp_mpp_modes[] = { @@ -360,6 +364,124 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = { MPP_VAR_FUNCTION(0x1, "dev", "ad31", V_MV78260_PLUS)), }; +static struct mvebu_mpp_mode mv98dx3236_mpp_modes[] = { + MPP_MODE(0, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "mosi", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad8", V_98DX3236_PLUS)), + MPP_MODE(1, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "miso", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad9", V_98DX3236_PLUS)), + MPP_MODE(2, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "csk", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad10", V_98DX3236_PLUS)), + MPP_MODE(3, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "cs0", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad11", V_98DX3236_PLUS)), + MPP_MODE(4, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "cs1", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "cs0", V_98DX3236_PLUS)), + MPP_MODE(5, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "pex", "rsto", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "bootcs0", V_98DX3236_PLUS)), + MPP_MODE(6, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "a2", V_98DX3236_PLUS)), + MPP_MODE(7, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ale0", V_98DX3236_PLUS)), + MPP_MODE(8, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ale1", V_98DX3236_PLUS)), + MPP_MODE(9, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ready0", V_98DX3236_PLUS)), + MPP_MODE(10, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad12", V_98DX3236_PLUS)), + MPP_MODE(11, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "uart1", "rxd", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart0", "cts", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad13", V_98DX3236_PLUS)), + MPP_MODE(12, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "uart1", "txd", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart0", "rts", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad14", V_98DX3236_PLUS)), + MPP_MODE(13, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "intr", "out", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad15", V_98DX3236_PLUS)), + MPP_MODE(14, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "i2c0", "sck", V_98DX3236_PLUS)), + MPP_MODE(15, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "i2c0", "sda", V_98DX3236_PLUS)), + MPP_MODE(16, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "oe", V_98DX3236_PLUS)), + MPP_MODE(17, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "clkout", V_98DX3236_PLUS)), + MPP_MODE(18, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart1", "txd", V_98DX3236_PLUS)), + MPP_MODE(19, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V_98DX3236_PLUS)), + MPP_MODE(20, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "we0", V_98DX3236_PLUS)), + MPP_MODE(21, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad0", V_98DX3236_PLUS)), + MPP_MODE(22, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad1", V_98DX3236_PLUS)), + MPP_MODE(23, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad2", V_98DX3236_PLUS)), + MPP_MODE(24, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad3", V_98DX3236_PLUS)), + MPP_MODE(25, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad4", V_98DX3236_PLUS)), + MPP_MODE(26, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad5", V_98DX3236_PLUS)), + MPP_MODE(27, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad6", V_98DX3236_PLUS)), + MPP_MODE(28, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad7", V_98DX3236_PLUS)), + MPP_MODE(29, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "a0", V_98DX3236_PLUS)), + MPP_MODE(30, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "a1", V_98DX3236_PLUS)), + MPP_MODE(31, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "slv_smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "we1", V_98DX3236_PLUS)), + MPP_MODE(32, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "slv_smi", "mdio", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdio", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "cs1", V_98DX3236_PLUS)), +}; + static struct mvebu_pinctrl_soc_info armada_xp_pinctrl_info; static const struct of_device_id armada_xp_pinctrl_of_match[] = { @@ -375,6 +497,10 @@ static const struct of_device_id armada_xp_pinctrl_of_match[] = { .compatible = "marvell,mv78460-pinctrl", .data = (void *) V_MV78460, }, + { + .compatible = "marvell,98dx3236-pinctrl", + .data = (void *) V_98DX3236, + }, { }, }; @@ -407,6 +533,14 @@ static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { MPP_GPIO_RANGE(2, 64, 64, 3), }; +static struct mvebu_mpp_ctrl mv98dx3236_mpp_controls[] = { + MPP_FUNC_CTRL(0, 32, NULL, armada_xp_mpp_ctrl), +}; + +static struct pinctrl_gpio_range mv98dx3236_mpp_gpio_ranges[] = { + MPP_GPIO_RANGE(0, 0, 0, 32), +}; + static int armada_xp_pinctrl_suspend(struct platform_device *pdev, pm_message_t state) { @@ -488,6 +622,17 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev) soc->gpioranges = mv78460_mpp_gpio_ranges; soc->ngpioranges = ARRAY_SIZE(mv78460_mpp_gpio_ranges); break; + case V_98DX3236: + case V_98DX3336: + case V_98DX4251: + /* fall-through */ + soc->controls = mv98dx3236_mpp_controls; + soc->ncontrols = ARRAY_SIZE(mv98dx3236_mpp_controls); + soc->modes = mv98dx3236_mpp_modes; + soc->nmodes = mv98dx3236_mpp_controls[0].npins; + soc->gpioranges = mv98dx3236_mpp_gpio_ranges; + soc->ngpioranges = ARRAY_SIZE(mv98dx3236_mpp_gpio_ranges); + break; } nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC @ 2016-12-22 4:13 ` Chris Packham 0 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs from Marvell. Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 +++++++ drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 145 +++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt diff --git a/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt new file mode 100644 index 000000000000..34c1e380adaa --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt @@ -0,0 +1,46 @@ +* Marvell 98dx3236 pinctrl driver for mpp + +Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding +part and usage + +Required properties: +- compatible: "marvell,98dx3236-pinctrl" +- reg: register specifier of MPP registers + +This driver supports all 98dx3236, 98dx3336 and 98dx4251 variants + +name pins functions +================================================================================ +mpp0 0 gpio, spi0(mosi), dev(ad8) +mpp1 1 gpio, spi0(miso), dev(ad9) +mpp2 2 gpio, spi0(sck), dev(ad10) +mpp3 3 gpio, spi0(cs0), dev(ad11) +mpp4 4 gpio, spi0(cs1), smi(mdc), dev(cs0) +mpp5 5 gpio, pex(rsto), dev(bootcs) +mpp6 6 gpio, dev(a2) +mpp7 7 gpio, dev(ale0) +mpp8 8 gpio, dev(ale1) +mpp9 9 gpio, dev(ready0) +mpp10 10 gpio, dev(ad12) +mpp11 11 gpio, uart1(rxd), uart0(cts), dev(ad13) +mpp12 12 gpio, uart1(txd), uart0(rts), dev(ad14) +mpp13 13 gpio, intr(out), dev(ad15) +mpp14 14 gpio, i2c0(sck) +mpp15 15 gpio, i2c0(sda) +mpp16 16 gpio, dev(oe) +mpp17 17 gpio, dev(clk) +mpp18 18 gpio, uart1(txd) +mpp19 19 gpio, uart1(rxd), dev(rb) +mpp20 20 gpio, dev(we) +mpp21 21 gpio, dev(ad0) +mpp22 22 gpio, dev(ad1) +mpp23 23 gpio, dev(ad2) +mpp24 24 gpio, dev(ad3) +mpp25 25 gpio, dev(ad4) +mpp26 26 gpio, dev(ad5) +mpp27 27 gpio, dev(ad6) +mpp28 28 gpio, dev(ad7) +mpp29 29 gpio, dev(a0) +mpp30 30 gpio, dev(a1) +mpp31 31 gpio, slv_smi(mdc), smi(mdc), dev(we1) +mpp32 32 gpio, slv_smi(mdio), smi(mdio), dev(cs1) diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c index e4ea71a9d985..2586903c59f0 100644 --- a/drivers/pinctrl/mvebu/pinctrl-armada-xp.c +++ b/drivers/pinctrl/mvebu/pinctrl-armada-xp.c @@ -49,6 +49,10 @@ enum armada_xp_variant { V_MV78460 = BIT(2), V_MV78230_PLUS = (V_MV78230 | V_MV78260 | V_MV78460), V_MV78260_PLUS = (V_MV78260 | V_MV78460), + V_98DX3236 = BIT(3), + V_98DX3336 = BIT(4), + V_98DX4251 = BIT(5), + V_98DX3236_PLUS = (V_98DX3236 | V_98DX3336 | V_98DX4251), }; static struct mvebu_mpp_mode armada_xp_mpp_modes[] = { @@ -360,6 +364,124 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = { MPP_VAR_FUNCTION(0x1, "dev", "ad31", V_MV78260_PLUS)), }; +static struct mvebu_mpp_mode mv98dx3236_mpp_modes[] = { + MPP_MODE(0, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "mosi", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad8", V_98DX3236_PLUS)), + MPP_MODE(1, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "miso", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad9", V_98DX3236_PLUS)), + MPP_MODE(2, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "csk", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad10", V_98DX3236_PLUS)), + MPP_MODE(3, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "cs0", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad11", V_98DX3236_PLUS)), + MPP_MODE(4, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "spi0", "cs1", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "cs0", V_98DX3236_PLUS)), + MPP_MODE(5, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "pex", "rsto", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "bootcs0", V_98DX3236_PLUS)), + MPP_MODE(6, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "a2", V_98DX3236_PLUS)), + MPP_MODE(7, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ale0", V_98DX3236_PLUS)), + MPP_MODE(8, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ale1", V_98DX3236_PLUS)), + MPP_MODE(9, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ready0", V_98DX3236_PLUS)), + MPP_MODE(10, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad12", V_98DX3236_PLUS)), + MPP_MODE(11, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "uart1", "rxd", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart0", "cts", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad13", V_98DX3236_PLUS)), + MPP_MODE(12, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x2, "uart1", "txd", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart0", "rts", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad14", V_98DX3236_PLUS)), + MPP_MODE(13, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "intr", "out", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "ad15", V_98DX3236_PLUS)), + MPP_MODE(14, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "i2c0", "sck", V_98DX3236_PLUS)), + MPP_MODE(15, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "i2c0", "sda", V_98DX3236_PLUS)), + MPP_MODE(16, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "oe", V_98DX3236_PLUS)), + MPP_MODE(17, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "clkout", V_98DX3236_PLUS)), + MPP_MODE(18, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart1", "txd", V_98DX3236_PLUS)), + MPP_MODE(19, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "uart1", "rxd", V_98DX3236_PLUS)), + MPP_MODE(20, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "we0", V_98DX3236_PLUS)), + MPP_MODE(21, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad0", V_98DX3236_PLUS)), + MPP_MODE(22, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad1", V_98DX3236_PLUS)), + MPP_MODE(23, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad2", V_98DX3236_PLUS)), + MPP_MODE(24, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad3", V_98DX3236_PLUS)), + MPP_MODE(25, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad4", V_98DX3236_PLUS)), + MPP_MODE(26, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad5", V_98DX3236_PLUS)), + MPP_MODE(27, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad6", V_98DX3236_PLUS)), + MPP_MODE(28, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "ad7", V_98DX3236_PLUS)), + MPP_MODE(29, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "a0", V_98DX3236_PLUS)), + MPP_MODE(30, + MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "dev", "a1", V_98DX3236_PLUS)), + MPP_MODE(31, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "slv_smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdc", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "we1", V_98DX3236_PLUS)), + MPP_MODE(32, + MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x1, "slv_smi", "mdio", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x3, "smi", "mdio", V_98DX3236_PLUS), + MPP_VAR_FUNCTION(0x4, "dev", "cs1", V_98DX3236_PLUS)), +}; + static struct mvebu_pinctrl_soc_info armada_xp_pinctrl_info; static const struct of_device_id armada_xp_pinctrl_of_match[] = { @@ -375,6 +497,10 @@ static const struct of_device_id armada_xp_pinctrl_of_match[] = { .compatible = "marvell,mv78460-pinctrl", .data = (void *) V_MV78460, }, + { + .compatible = "marvell,98dx3236-pinctrl", + .data = (void *) V_98DX3236, + }, { }, }; @@ -407,6 +533,14 @@ static struct pinctrl_gpio_range mv78460_mpp_gpio_ranges[] = { MPP_GPIO_RANGE(2, 64, 64, 3), }; +static struct mvebu_mpp_ctrl mv98dx3236_mpp_controls[] = { + MPP_FUNC_CTRL(0, 32, NULL, armada_xp_mpp_ctrl), +}; + +static struct pinctrl_gpio_range mv98dx3236_mpp_gpio_ranges[] = { + MPP_GPIO_RANGE(0, 0, 0, 32), +}; + static int armada_xp_pinctrl_suspend(struct platform_device *pdev, pm_message_t state) { @@ -488,6 +622,17 @@ static int armada_xp_pinctrl_probe(struct platform_device *pdev) soc->gpioranges = mv78460_mpp_gpio_ranges; soc->ngpioranges = ARRAY_SIZE(mv78460_mpp_gpio_ranges); break; + case V_98DX3236: + case V_98DX3336: + case V_98DX4251: + /* fall-through */ + soc->controls = mv98dx3236_mpp_controls; + soc->ncontrols = ARRAY_SIZE(mv98dx3236_mpp_controls); + soc->modes = mv98dx3236_mpp_modes; + soc->nmodes = mv98dx3236_mpp_controls[0].npins; + soc->gpioranges = mv98dx3236_mpp_gpio_ranges; + soc->ngpioranges = ARRAY_SIZE(mv98dx3236_mpp_gpio_ranges); + break; } nregs = DIV_ROUND_UP(soc->nmodes, MVEBU_MPPS_PER_REG); -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC 2016-12-22 4:13 ` Chris Packham @ 2016-12-22 22:48 ` Rob Herring -1 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:48 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Kalyan Kinthada, Linus Walleij, Mark Rutland, Laxman Dewangan, Thomas Petazzoni, linux-gpio, devicetree, linux-kernel On Thu, Dec 22, 2016 at 05:13:26PM +1300, Chris Packham wrote: > From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > > This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs > from Marvell. > > Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 +++++++ Acked-by: Rob Herring <robh@kernel.org> > drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 145 +++++++++++++++++++++ > 2 files changed, 191 insertions(+) > create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC @ 2016-12-22 22:48 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:48 UTC (permalink / raw) To: linux-arm-kernel On Thu, Dec 22, 2016 at 05:13:26PM +1300, Chris Packham wrote: > From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > > This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs > from Marvell. > > Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > .../pinctrl/marvell,armada-98dx3236-pinctrl.txt | 46 +++++++ Acked-by: Rob Herring <robh@kernel.org> > drivers/pinctrl/mvebu/pinctrl-armada-xp.c | 145 +++++++++++++++++++++ > 2 files changed, 191 insertions(+) > create mode 100644 Documentation/devicetree/bindings/pinctrl/marvell,armada-98dx3236-pinctrl.txt ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC 2016-12-22 4:13 ` Chris Packham @ 2016-12-30 9:03 ` Linus Walleij -1 siblings, 0 replies; 25+ messages in thread From: Linus Walleij @ 2016-12-30 9:03 UTC (permalink / raw) To: Chris Packham, Sebastian Hesselbarth, Thomas Petazzoni Cc: linux-arm-kernel@lists.infradead.org, Kalyan Kinthada, Rob Herring, Mark Rutland, Laxman Dewangan, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org On Thu, Dec 22, 2016 at 5:13 AM, Chris Packham <chris.packham@alliedtelesis.co.nz> wrote: > From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > > This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs > from Marvell. > > Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Looks good to me, Sebastian and/or Thomas P can you ACK this patch? Yours, Linus Walleij ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC @ 2016-12-30 9:03 ` Linus Walleij 0 siblings, 0 replies; 25+ messages in thread From: Linus Walleij @ 2016-12-30 9:03 UTC (permalink / raw) To: linux-arm-kernel On Thu, Dec 22, 2016 at 5:13 AM, Chris Packham <chris.packham@alliedtelesis.co.nz> wrote: > From: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > > This pinctrl driver supports the 98DX3236, 98DX3336 and 98DX4251 SoCs > from Marvell. > > Signed-off-by: Kalyan Kinthada <kalyan.kinthada@alliedtelesis.co.nz> > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Looks good to me, Sebastian and/or Thomas P can you ACK this patch? Yours, Linus Walleij ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 4/5] arm: mvebu: Add device tree for 98DX3236 SoCs 2016-12-22 4:13 [PATCH 0/5] Support for Marvell switches with integrated CPUs Chris Packham @ 2016-12-22 4:13 ` Chris Packham 2016-12-22 4:13 ` Chris Packham ` (3 subsequent siblings) 4 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel The Marvell 98DX3236, 98DX3336, 98DX4521 and variants are switch ASICs with integrated CPUs. They are similar to the Armada XP SoCs but have different I/O interfaces. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../devicetree/bindings/arm/marvell/98dx3236.txt | 10 + arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 231 +++++++++++++++++++++ arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++ arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 78 +++++++ 4 files changed, 397 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.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 diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt new file mode 100644 index 000000000000..e7dc9b2dd90b --- /dev/null +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt @@ -0,0 +1,10 @@ +Marvell 98DX3236, 98DX3336 and 98DX4251 Platforms Device Tree Bindings +---------------------------------------------------------------------- + +Boards with a SoC of the Marvell 98DX3236, 98DX3336 and 98DX4251 families +shall have the following property: + +Required root node property: + +compatible: one of "marvell,armadaxp-98dx3236", "marvell,armadaxp-98dx3336" + or "marvell,armadaxp-98dx4251" diff --git a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi new file mode 100644 index 000000000000..bac53f8b44af --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi @@ -0,0 +1,231 @@ +/* + * Device Tree Include file for Marvell 98dx3236 family SoC + * + * Copyright (C) 2016 Allied Telesis Labs + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Contains definitions specific to the 98dx3236 SoC that are not + * common to all Armada XP SoCs. + */ + +#include "armada-xp.dtsi" + +/ { + model = "Marvell 98DX3236 SoC"; + compatible = "marvell,armadaxp-98dx3236", "marvell,armadaxp", "marvell,armada-370-xp"; + + aliases { + gpio0 = &gpio0; + gpio1 = &gpio1; + gpio2 = &gpio2; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + enable-method = "marvell,98dx3236-smp"; + + cpu at 0 { + device_type = "cpu"; + compatible = "marvell,sheeva-v7"; + reg = <0>; + clocks = <&cpuclk 0>; + clock-latency = <1000000>; + }; + }; + + soc { + ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 + MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 + MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 + MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000 + MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>; + + /* + * 98DX3236 has 1 x1 PCIe unit Gen2.0: One unit can be + */ + pcie-controller { + compatible = "marvell,armada-xp-pcie"; + status = "disabled"; + device_type = "pci"; + + #address-cells = <3>; + #size-cells = <2>; + + msi-parent = <&mpic>; + bus-range = <0x00 0xff>; + + ranges = + <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */ + 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ + 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */ + 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */>; + + pcie at 1,0 { + device_type = "pci"; + assigned-addresses = <0x82000800 0 0x40000 0 0x2000>; + reg = <0x0800 0 0 0 0>; + #address-cells = <3>; + #size-cells = <2>; + #interrupt-cells = <1>; + ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0 + 0x81000000 0 0 0x81000000 0x1 0 1 0>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &mpic 58>; + marvell,pcie-port = <0>; + marvell,pcie-lane = <0>; + clocks = <&gateclk 5>; + status = "disabled"; + }; + }; + + internal-regs { + coreclk: mvebu-sar at 18230 { + compatible = "marvell,mv98dx3236-core-clock"; + }; + + cpuclk: clock-complex at 18700 { + compatible = "marvell,mv98dx3236-cpu-clock"; + }; + + corediv-clock at 18740 { + compatible = "marvell,mv98dx3236-corediv-clock"; + reg = <0xf8268 0xc>; + base = <&dfx>; + #clock-cells = <1>; + clocks = <&mainpll>; + clock-output-names = "nand"; + }; + + xor at 60900 { + status = "disabled"; + }; + + xor at f0900 { + status = "disabled"; + }; + + xor at f0800 { + compatible = "marvell,orion-xor"; + reg = <0xf0800 0x100 + 0xf0a00 0x100>; + clocks = <&gateclk 22>; + status = "okay"; + + xor10 { + interrupts = <51>; + dmacap,memcpy; + dmacap,xor; + }; + xor11 { + interrupts = <52>; + dmacap,memcpy; + dmacap,xor; + dmacap,memset; + }; + }; + + gpio0: gpio at 18100 { + compatible = "marvell,orion-gpio"; + reg = <0x18100 0x40>; + ngpios = <32>; + gpio-controller; + #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <82>, <83>, <84>, <85>; + }; + + /* does not exist */ + gpio1: gpio at 18140 { + compatible = "marvell,orion-gpio"; + reg = <0x18140 0x40>; + status = "disabled"; + }; + + gpio2: gpio at 18180 { /* rework some properties */ + compatible = "marvell,orion-gpio"; + reg = <0x18180 0x40>; + ngpios = <1>; /* only gpio #32 */ + gpio-controller; + #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <87>; + }; + }; + + dfx-registers { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 MBUS_ID(0x08, 0x00) 0 0x100000>; + + dfx: dfx at 0 { + compatible = "simple-bus"; + reg = <0 0x100000>; + }; + }; + + switch { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 MBUS_ID(0x03, 0x00) 0 0x100000>; + + packet-processor at 0 { + compatible = "marvell,prestera-98dx3236"; + reg = <0 0x4000000>; + interrupts = <33>, <34>, <35>; + dfx = <&dfx>; + }; + }; + }; +}; + +&pinctrl { + compatible = "marvell,98dx3236-pinctrl"; + + spi0_pins: spi0-pins { + marvell,pins = "mpp0", "mpp1", + "mpp2", "mpp3"; + marvell,function = "spi0"; + }; +}; diff --git a/arch/arm/boot/dts/armada-xp-98dx3336.dtsi b/arch/arm/boot/dts/armada-xp-98dx3336.dtsi new file mode 100644 index 000000000000..9c9aa565fd82 --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-98dx3336.dtsi @@ -0,0 +1,78 @@ +/* + * Device Tree Include file for Marvell 98dx3336 family SoC + * + * Copyright (C) 2016 Allied Telesis Labs + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Contains definitions specific to the 98dx3336 SoC that are not + * common to all Armada XP SoCs. + */ + +#include "armada-xp-98dx3236.dtsi" + +/ { + model = "Marvell 98DX3336 SoC"; + compatible = "marvell,armadaxp-98dx3336", "marvell,armadaxp-98dx3236", "marvell,armadaxp", "marvell,armada-370-xp"; + + cpus { + cpu at 1 { + device_type = "cpu"; + compatible = "marvell,sheeva-v7"; + reg = <1>; + clocks = <&cpuclk 1>; + clock-latency = <1000000>; + }; + }; + + soc { + internal-regs { + resume at 20980 { + compatible = "marvell,98dx3336-resume-ctrl"; + reg = <0x20980 0x10>; + }; + }; + + switch { + packet-processor at 0 { + compatible = "marvell,prestera-98dx3336"; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/armada-xp-98dx4251.dtsi b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi new file mode 100644 index 000000000000..5d1da8513fae --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi @@ -0,0 +1,78 @@ +/* + * Device Tree Include file for Marvell 98dx4521 family SoC + * + * Copyright (C) 2016 Allied Telesis Labs + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Contains definitions specific to the 98dx4521 SoC that are not + * common to all Armada XP SoCs. + */ + +#include "armada-xp-98dx3236.dtsi" + +/ { + model = "Marvell 98DX4251 SoC"; + compatible = "marvell,armadaxp-98dx4521", "marvell,armadaxp-98dx3236", "marvell,armadaxp", "marvell,armada-370-xp"; + + cpus { + cpu at 1 { + device_type = "cpu"; + compatible = "marvell,sheeva-v7"; + reg = <1>; + clocks = <&cpuclk 1>; + clock-latency = <1000000>; + }; + }; + + soc { + internal-regs { + resume at 20980 { + compatible = "marvell,98dx3336-resume-ctrl"; + reg = <0x20980 0x10>; + }; + }; + + switch { + packet-processor at 0 { + compatible = "marvell,prestera-98dx4521"; + }; + }; + }; +}; -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 4/5] arm: mvebu: Add device tree for 98DX3236 SoCs @ 2016-12-22 4:13 ` Chris Packham 0 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Rob Herring, Mark Rutland, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, devicetree, linux-kernel The Marvell 98DX3236, 98DX3336, 98DX4521 and variants are switch ASICs with integrated CPUs. They are similar to the Armada XP SoCs but have different I/O interfaces. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- .../devicetree/bindings/arm/marvell/98dx3236.txt | 10 + arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 231 +++++++++++++++++++++ arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++ arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 78 +++++++ 4 files changed, 397 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.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 diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt new file mode 100644 index 000000000000..e7dc9b2dd90b --- /dev/null +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt @@ -0,0 +1,10 @@ +Marvell 98DX3236, 98DX3336 and 98DX4251 Platforms Device Tree Bindings +---------------------------------------------------------------------- + +Boards with a SoC of the Marvell 98DX3236, 98DX3336 and 98DX4251 families +shall have the following property: + +Required root node property: + +compatible: one of "marvell,armadaxp-98dx3236", "marvell,armadaxp-98dx3336" + or "marvell,armadaxp-98dx4251" diff --git a/arch/arm/boot/dts/armada-xp-98dx3236.dtsi b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi new file mode 100644 index 000000000000..bac53f8b44af --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-98dx3236.dtsi @@ -0,0 +1,231 @@ +/* + * Device Tree Include file for Marvell 98dx3236 family SoC + * + * Copyright (C) 2016 Allied Telesis Labs + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Contains definitions specific to the 98dx3236 SoC that are not + * common to all Armada XP SoCs. + */ + +#include "armada-xp.dtsi" + +/ { + model = "Marvell 98DX3236 SoC"; + compatible = "marvell,armadaxp-98dx3236", "marvell,armadaxp", "marvell,armada-370-xp"; + + aliases { + gpio0 = &gpio0; + gpio1 = &gpio1; + gpio2 = &gpio2; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + enable-method = "marvell,98dx3236-smp"; + + cpu@0 { + device_type = "cpu"; + compatible = "marvell,sheeva-v7"; + reg = <0>; + clocks = <&cpuclk 0>; + clock-latency = <1000000>; + }; + }; + + soc { + ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 + MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 + MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 + MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000 + MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>; + + /* + * 98DX3236 has 1 x1 PCIe unit Gen2.0: One unit can be + */ + pcie-controller { + compatible = "marvell,armada-xp-pcie"; + status = "disabled"; + device_type = "pci"; + + #address-cells = <3>; + #size-cells = <2>; + + msi-parent = <&mpic>; + bus-range = <0x00 0xff>; + + ranges = + <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */ + 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */ + 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */ + 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */>; + + pcie@1,0 { + device_type = "pci"; + assigned-addresses = <0x82000800 0 0x40000 0 0x2000>; + reg = <0x0800 0 0 0 0>; + #address-cells = <3>; + #size-cells = <2>; + #interrupt-cells = <1>; + ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0 + 0x81000000 0 0 0x81000000 0x1 0 1 0>; + interrupt-map-mask = <0 0 0 0>; + interrupt-map = <0 0 0 0 &mpic 58>; + marvell,pcie-port = <0>; + marvell,pcie-lane = <0>; + clocks = <&gateclk 5>; + status = "disabled"; + }; + }; + + internal-regs { + coreclk: mvebu-sar@18230 { + compatible = "marvell,mv98dx3236-core-clock"; + }; + + cpuclk: clock-complex@18700 { + compatible = "marvell,mv98dx3236-cpu-clock"; + }; + + corediv-clock@18740 { + compatible = "marvell,mv98dx3236-corediv-clock"; + reg = <0xf8268 0xc>; + base = <&dfx>; + #clock-cells = <1>; + clocks = <&mainpll>; + clock-output-names = "nand"; + }; + + xor@60900 { + status = "disabled"; + }; + + xor@f0900 { + status = "disabled"; + }; + + xor@f0800 { + compatible = "marvell,orion-xor"; + reg = <0xf0800 0x100 + 0xf0a00 0x100>; + clocks = <&gateclk 22>; + status = "okay"; + + xor10 { + interrupts = <51>; + dmacap,memcpy; + dmacap,xor; + }; + xor11 { + interrupts = <52>; + dmacap,memcpy; + dmacap,xor; + dmacap,memset; + }; + }; + + gpio0: gpio@18100 { + compatible = "marvell,orion-gpio"; + reg = <0x18100 0x40>; + ngpios = <32>; + gpio-controller; + #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <82>, <83>, <84>, <85>; + }; + + /* does not exist */ + gpio1: gpio@18140 { + compatible = "marvell,orion-gpio"; + reg = <0x18140 0x40>; + status = "disabled"; + }; + + gpio2: gpio@18180 { /* rework some properties */ + compatible = "marvell,orion-gpio"; + reg = <0x18180 0x40>; + ngpios = <1>; /* only gpio #32 */ + gpio-controller; + #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; + interrupts = <87>; + }; + }; + + dfx-registers { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 MBUS_ID(0x08, 0x00) 0 0x100000>; + + dfx: dfx@0 { + compatible = "simple-bus"; + reg = <0 0x100000>; + }; + }; + + 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>; + }; + }; + }; +}; + +&pinctrl { + compatible = "marvell,98dx3236-pinctrl"; + + spi0_pins: spi0-pins { + marvell,pins = "mpp0", "mpp1", + "mpp2", "mpp3"; + marvell,function = "spi0"; + }; +}; diff --git a/arch/arm/boot/dts/armada-xp-98dx3336.dtsi b/arch/arm/boot/dts/armada-xp-98dx3336.dtsi new file mode 100644 index 000000000000..9c9aa565fd82 --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-98dx3336.dtsi @@ -0,0 +1,78 @@ +/* + * Device Tree Include file for Marvell 98dx3336 family SoC + * + * Copyright (C) 2016 Allied Telesis Labs + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Contains definitions specific to the 98dx3336 SoC that are not + * common to all Armada XP SoCs. + */ + +#include "armada-xp-98dx3236.dtsi" + +/ { + model = "Marvell 98DX3336 SoC"; + compatible = "marvell,armadaxp-98dx3336", "marvell,armadaxp-98dx3236", "marvell,armadaxp", "marvell,armada-370-xp"; + + cpus { + cpu@1 { + device_type = "cpu"; + compatible = "marvell,sheeva-v7"; + reg = <1>; + clocks = <&cpuclk 1>; + clock-latency = <1000000>; + }; + }; + + soc { + internal-regs { + resume@20980 { + compatible = "marvell,98dx3336-resume-ctrl"; + reg = <0x20980 0x10>; + }; + }; + + switch { + packet-processor@0 { + compatible = "marvell,prestera-98dx3336"; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/armada-xp-98dx4251.dtsi b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi new file mode 100644 index 000000000000..5d1da8513fae --- /dev/null +++ b/arch/arm/boot/dts/armada-xp-98dx4251.dtsi @@ -0,0 +1,78 @@ +/* + * Device Tree Include file for Marvell 98dx4521 family SoC + * + * Copyright (C) 2016 Allied Telesis Labs + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Contains definitions specific to the 98dx4521 SoC that are not + * common to all Armada XP SoCs. + */ + +#include "armada-xp-98dx3236.dtsi" + +/ { + model = "Marvell 98DX4251 SoC"; + compatible = "marvell,armadaxp-98dx4521", "marvell,armadaxp-98dx3236", "marvell,armadaxp", "marvell,armada-370-xp"; + + cpus { + cpu@1 { + device_type = "cpu"; + compatible = "marvell,sheeva-v7"; + reg = <1>; + clocks = <&cpuclk 1>; + clock-latency = <1000000>; + }; + }; + + soc { + internal-regs { + resume@20980 { + compatible = "marvell,98dx3336-resume-ctrl"; + reg = <0x20980 0x10>; + }; + }; + + switch { + packet-processor@0 { + compatible = "marvell,prestera-98dx4521"; + }; + }; + }; +}; -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 4/5] arm: mvebu: Add device tree for 98DX3236 SoCs @ 2016-12-22 22:53 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:53 UTC (permalink / raw) To: linux-arm-kernel On Thu, Dec 22, 2016 at 05:13:27PM +1300, Chris Packham wrote: > The Marvell 98DX3236, 98DX3336, 98DX4521 and variants are switch ASICs > with integrated CPUs. They are similar to the Armada XP SoCs but have > different I/O interfaces. > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > .../devicetree/bindings/arm/marvell/98dx3236.txt | 10 + > arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 231 +++++++++++++++++++++ > arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++ > arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 78 +++++++ > 4 files changed, 397 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.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 > > diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > new file mode 100644 > index 000000000000..e7dc9b2dd90b > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > @@ -0,0 +1,10 @@ > +Marvell 98DX3236, 98DX3336 and 98DX4251 Platforms Device Tree Bindings > +---------------------------------------------------------------------- > + > +Boards with a SoC of the Marvell 98DX3236, 98DX3336 and 98DX4251 families > +shall have the following property: > + > +Required root node property: > + > +compatible: one of "marvell,armadaxp-98dx3236", "marvell,armadaxp-98dx3336" > + or "marvell,armadaxp-98dx4251" The 3336 and 4251 are compatible with 3236 according to the dts files. That needs to be expressed here. Rob ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 4/5] arm: mvebu: Add device tree for 98DX3236 SoCs @ 2016-12-22 22:53 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:53 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel, Mark Rutland, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, devicetree, linux-kernel On Thu, Dec 22, 2016 at 05:13:27PM +1300, Chris Packham wrote: > The Marvell 98DX3236, 98DX3336, 98DX4521 and variants are switch ASICs > with integrated CPUs. They are similar to the Armada XP SoCs but have > different I/O interfaces. > > Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> > --- > .../devicetree/bindings/arm/marvell/98dx3236.txt | 10 + > arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 231 +++++++++++++++++++++ > arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++ > arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 78 +++++++ > 4 files changed, 397 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.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 > > diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > new file mode 100644 > index 000000000000..e7dc9b2dd90b > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > @@ -0,0 +1,10 @@ > +Marvell 98DX3236, 98DX3336 and 98DX4251 Platforms Device Tree Bindings > +---------------------------------------------------------------------- > + > +Boards with a SoC of the Marvell 98DX3236, 98DX3336 and 98DX4251 families > +shall have the following property: > + > +Required root node property: > + > +compatible: one of "marvell,armadaxp-98dx3236", "marvell,armadaxp-98dx3336" > + or "marvell,armadaxp-98dx4251" The 3336 and 4251 are compatible with 3236 according to the dts files. That needs to be expressed here. Rob ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH 4/5] arm: mvebu: Add device tree for 98DX3236 SoCs @ 2016-12-22 22:53 ` Rob Herring 0 siblings, 0 replies; 25+ messages in thread From: Rob Herring @ 2016-12-22 22:53 UTC (permalink / raw) To: Chris Packham Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Mark Rutland, Jason Cooper, Andrew Lunn, Gregory Clement, Sebastian Hesselbarth, Russell King, devicetree-u79uwXL29TY76Z2rM5mHXA, linux-kernel-u79uwXL29TY76Z2rM5mHXA On Thu, Dec 22, 2016 at 05:13:27PM +1300, Chris Packham wrote: > The Marvell 98DX3236, 98DX3336, 98DX4521 and variants are switch ASICs > with integrated CPUs. They are similar to the Armada XP SoCs but have > different I/O interfaces. > > Signed-off-by: Chris Packham <chris.packham-6g8wRflRTwXFdCa3tKVlE6U/zSkkHjvu@public.gmane.org> > --- > .../devicetree/bindings/arm/marvell/98dx3236.txt | 10 + > arch/arm/boot/dts/armada-xp-98dx3236.dtsi | 231 +++++++++++++++++++++ > arch/arm/boot/dts/armada-xp-98dx3336.dtsi | 78 +++++++ > arch/arm/boot/dts/armada-xp-98dx4251.dtsi | 78 +++++++ > 4 files changed, 397 insertions(+) > create mode 100644 Documentation/devicetree/bindings/arm/marvell/98dx3236.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 > > diff --git a/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > new file mode 100644 > index 000000000000..e7dc9b2dd90b > --- /dev/null > +++ b/Documentation/devicetree/bindings/arm/marvell/98dx3236.txt > @@ -0,0 +1,10 @@ > +Marvell 98DX3236, 98DX3336 and 98DX4251 Platforms Device Tree Bindings > +---------------------------------------------------------------------- > + > +Boards with a SoC of the Marvell 98DX3236, 98DX3336 and 98DX4251 families > +shall have the following property: > + > +Required root node property: > + > +compatible: one of "marvell,armadaxp-98dx3236", "marvell,armadaxp-98dx3336" > + or "marvell,armadaxp-98dx4251" The 3336 and 4251 are compatible with 3236 according to the dts files. That needs to be expressed here. Rob -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH 5/5] arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards 2016-12-22 4:13 [PATCH 0/5] Support for Marvell switches with integrated CPUs Chris Packham @ 2016-12-22 4:13 ` Chris Packham 2016-12-22 4:13 ` Chris Packham ` (3 subsequent siblings) 4 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel These boards are Marvell's evaluation boards for the 98DX4251 and 98DX3336 SoCs. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- arch/arm/boot/dts/db-dxbc2.dts | 159 ++++++++++++++++++++++++++++++++++++ arch/arm/boot/dts/db-xc3-24g4xg.dts | 155 +++++++++++++++++++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 arch/arm/boot/dts/db-dxbc2.dts create mode 100644 arch/arm/boot/dts/db-xc3-24g4xg.dts diff --git a/arch/arm/boot/dts/db-dxbc2.dts b/arch/arm/boot/dts/db-dxbc2.dts new file mode 100644 index 000000000000..f56786cea5f8 --- /dev/null +++ b/arch/arm/boot/dts/db-dxbc2.dts @@ -0,0 +1,159 @@ +/* + * Device Tree file for DB-DXBC2 board + * + * Copyright (C) 2016 Allied Telesis Labs + * + * Based on armada-xp-db.dts + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Note: this Device Tree assumes that the bootloader has remapped the + * internal registers to 0xf1000000 (instead of the default + * 0xd0000000). The 0xf1000000 is the default used by the recent, + * DT-capable, U-Boot bootloaders provided by Marvell. Some earlier + * boards were delivered with an older version of the bootloader that + * left internal registers mapped at 0xd0000000. If you are in this + * situation, you should either update your bootloader (preferred + * solution) or the below Device Tree should be adjusted. + */ + +/dts-v1/; +#include "armada-xp-98dx4251.dtsi" + +/ { + model = "Marvell Bobcat2 Evaluation Board"; + compatible = "marvell,db-dxbc2", "marvell,armadaxp-98dx4251", "marvell,armadaxp", "marvell,armada-370-xp"; + + chosen { + bootargs = "console=ttyS0,115200 earlyprintk"; + }; + + memory { + device_type = "memory"; + reg = <0 0x00000000 0 0x20000000>; /* 512 MB */ + }; + + soc { + ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 + MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 + MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 + MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000 + MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>; + + devbus-bootcs { + status = "okay"; + + /* Device Bus parameters are required */ + + /* Read parameters */ + devbus,bus-width = <16>; + devbus,turn-off-ps = <60000>; + devbus,badr-skew-ps = <0>; + devbus,acc-first-ps = <124000>; + devbus,acc-next-ps = <248000>; + devbus,rd-setup-ps = <0>; + devbus,rd-hold-ps = <0>; + + /* Write parameters */ + devbus,sync-enable = <0>; + devbus,wr-high-ps = <60000>; + devbus,wr-low-ps = <60000>; + devbus,ale-wr-ps = <60000>; + }; + + internal-regs { + serial at 12000 { + status = "okay"; + }; + serial at 12100 { + status = "okay"; + }; + + i2c at 11000 { + clock-frequency = <100000>; + status = "okay"; + }; + + mvsdio at d4000 { + pinctrl-0 = <&sdio_pins>; + pinctrl-names = "default"; + status = "okay"; + /* No CD or WP GPIOs */ + broken-cd; + }; + + nand at d0000 { + status = "okay"; + num-cs = <1>; + marvell,nand-keep-config; + marvell,nand-enable-arbiter; + nand-on-flash-bbt; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + }; + }; + }; +}; + +&spi0 { + status = "okay"; + + spi-flash at 0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "m25p64"; + reg = <0>; /* Chip select 0 */ + spi-max-frequency = <20000000>; + m25p,fast-read; + + partition at u-boot { + reg = <0x00000000 0x00100000>; + label = "u-boot"; + }; + partition at u-boot-env { + reg = <0x00100000 0x00040000>; + label = "u-boot-env"; + }; + partition at unused { + reg = <0x00140000 0x00ec0000>; + label = "unused"; + }; + + }; +}; diff --git a/arch/arm/boot/dts/db-xc3-24g4xg.dts b/arch/arm/boot/dts/db-xc3-24g4xg.dts new file mode 100644 index 000000000000..5eb89ffb9a7d --- /dev/null +++ b/arch/arm/boot/dts/db-xc3-24g4xg.dts @@ -0,0 +1,155 @@ +/* + * Device Tree file for DB-XC3-24G4XG board + * + * Copyright (C) 2016 Allied Telesis Labs + * + * Based on armada-xp-db.dts + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Note: this Device Tree assumes that the bootloader has remapped the + * internal registers to 0xf1000000 (instead of the default + * 0xd0000000). The 0xf1000000 is the default used by the recent, + * DT-capable, U-Boot bootloaders provided by Marvell. Some earlier + * boards were delivered with an older version of the bootloader that + * left internal registers mapped at 0xd0000000. If you are in this + * situation, you should either update your bootloader (preferred + * solution) or the below Device Tree should be adjusted. + */ + +/dts-v1/; +#include "armada-xp-98dx3336.dtsi" + +/ { + model = "DB-XC3-24G4XG"; + compatible = "marvell,db-xc3-24g4xg", "marvell,armadaxp-98dx3336", "marvell,armadaxp", "marvell,armada-370-xp"; + + chosen { + bootargs = "console=ttyS0,115200 earlyprintk"; + }; + + memory { + device_type = "memory"; + reg = <0 0x00000000 0 0x40000000>; /* 1 GB */ + }; + + soc { + ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 + MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 + MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 + MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000 + MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>; + + devbus-bootcs { + status = "okay"; + + /* Device Bus parameters are required */ + + /* Read parameters */ + devbus,bus-width = <16>; + devbus,turn-off-ps = <60000>; + devbus,badr-skew-ps = <0>; + devbus,acc-first-ps = <124000>; + devbus,acc-next-ps = <248000>; + devbus,rd-setup-ps = <0>; + devbus,rd-hold-ps = <0>; + + /* Write parameters */ + devbus,sync-enable = <0>; + devbus,wr-high-ps = <60000>; + devbus,wr-low-ps = <60000>; + devbus,ale-wr-ps = <60000>; + }; + + internal-regs { + serial at 12000 { + status = "okay"; + }; + serial at 12100 { + status = "okay"; + }; + + i2c at 11000 { + clock-frequency = <100000>; + status = "okay"; + }; + + mvsdio at d4000 { + status = "disabled"; + }; + + nand at d0000 { + status = "okay"; + num-cs = <1>; + marvell,nand-keep-config; + marvell,nand-enable-arbiter; + nand-on-flash-bbt; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + }; + }; + }; +}; + +&spi0 { + status = "okay"; + + spi-flash at 0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "m25p64"; + reg = <0>; /* Chip select 0 */ + spi-max-frequency = <20000000>; + m25p,fast-read; + + partition at u-boot { + reg = <0x00000000 0x00100000>; + label = "u-boot"; + }; + partition at u-boot-env { + reg = <0x00100000 0x00040000>; + label = "u-boot-env"; + }; + partition at unused { + reg = <0x00140000 0x00ec0000>; + label = "unused"; + }; + + }; +}; -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH 5/5] arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards @ 2016-12-22 4:13 ` Chris Packham 0 siblings, 0 replies; 25+ messages in thread From: Chris Packham @ 2016-12-22 4:13 UTC (permalink / raw) To: linux-arm-kernel Cc: Chris Packham, Rob Herring, Mark Rutland, Russell King, devicetree, linux-kernel These boards are Marvell's evaluation boards for the 98DX4251 and 98DX3336 SoCs. Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> --- arch/arm/boot/dts/db-dxbc2.dts | 159 ++++++++++++++++++++++++++++++++++++ arch/arm/boot/dts/db-xc3-24g4xg.dts | 155 +++++++++++++++++++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 arch/arm/boot/dts/db-dxbc2.dts create mode 100644 arch/arm/boot/dts/db-xc3-24g4xg.dts diff --git a/arch/arm/boot/dts/db-dxbc2.dts b/arch/arm/boot/dts/db-dxbc2.dts new file mode 100644 index 000000000000..f56786cea5f8 --- /dev/null +++ b/arch/arm/boot/dts/db-dxbc2.dts @@ -0,0 +1,159 @@ +/* + * Device Tree file for DB-DXBC2 board + * + * Copyright (C) 2016 Allied Telesis Labs + * + * Based on armada-xp-db.dts + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Note: this Device Tree assumes that the bootloader has remapped the + * internal registers to 0xf1000000 (instead of the default + * 0xd0000000). The 0xf1000000 is the default used by the recent, + * DT-capable, U-Boot bootloaders provided by Marvell. Some earlier + * boards were delivered with an older version of the bootloader that + * left internal registers mapped at 0xd0000000. If you are in this + * situation, you should either update your bootloader (preferred + * solution) or the below Device Tree should be adjusted. + */ + +/dts-v1/; +#include "armada-xp-98dx4251.dtsi" + +/ { + model = "Marvell Bobcat2 Evaluation Board"; + compatible = "marvell,db-dxbc2", "marvell,armadaxp-98dx4251", "marvell,armadaxp", "marvell,armada-370-xp"; + + chosen { + bootargs = "console=ttyS0,115200 earlyprintk"; + }; + + memory { + device_type = "memory"; + reg = <0 0x00000000 0 0x20000000>; /* 512 MB */ + }; + + soc { + ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 + MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 + MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 + MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000 + MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>; + + devbus-bootcs { + status = "okay"; + + /* Device Bus parameters are required */ + + /* Read parameters */ + devbus,bus-width = <16>; + devbus,turn-off-ps = <60000>; + devbus,badr-skew-ps = <0>; + devbus,acc-first-ps = <124000>; + devbus,acc-next-ps = <248000>; + devbus,rd-setup-ps = <0>; + devbus,rd-hold-ps = <0>; + + /* Write parameters */ + devbus,sync-enable = <0>; + devbus,wr-high-ps = <60000>; + devbus,wr-low-ps = <60000>; + devbus,ale-wr-ps = <60000>; + }; + + internal-regs { + serial@12000 { + status = "okay"; + }; + serial@12100 { + status = "okay"; + }; + + i2c@11000 { + clock-frequency = <100000>; + status = "okay"; + }; + + mvsdio@d4000 { + pinctrl-0 = <&sdio_pins>; + pinctrl-names = "default"; + status = "okay"; + /* No CD or WP GPIOs */ + broken-cd; + }; + + nand@d0000 { + status = "okay"; + num-cs = <1>; + marvell,nand-keep-config; + marvell,nand-enable-arbiter; + nand-on-flash-bbt; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + }; + }; + }; +}; + +&spi0 { + status = "okay"; + + spi-flash@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "m25p64"; + reg = <0>; /* Chip select 0 */ + spi-max-frequency = <20000000>; + m25p,fast-read; + + partition@u-boot { + reg = <0x00000000 0x00100000>; + label = "u-boot"; + }; + partition@u-boot-env { + reg = <0x00100000 0x00040000>; + label = "u-boot-env"; + }; + partition@unused { + reg = <0x00140000 0x00ec0000>; + label = "unused"; + }; + + }; +}; diff --git a/arch/arm/boot/dts/db-xc3-24g4xg.dts b/arch/arm/boot/dts/db-xc3-24g4xg.dts new file mode 100644 index 000000000000..5eb89ffb9a7d --- /dev/null +++ b/arch/arm/boot/dts/db-xc3-24g4xg.dts @@ -0,0 +1,155 @@ +/* + * Device Tree file for DB-XC3-24G4XG board + * + * Copyright (C) 2016 Allied Telesis Labs + * + * Based on armada-xp-db.dts + * + * This file is dual-licensed: you can use it either under the terms + * of the GPL or the X11 license, at your option. Note that this dual + * licensing only applies to this file, and not this project as a + * whole. + * + * a) This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Or, alternatively + * + * b) Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Note: this Device Tree assumes that the bootloader has remapped the + * internal registers to 0xf1000000 (instead of the default + * 0xd0000000). The 0xf1000000 is the default used by the recent, + * DT-capable, U-Boot bootloaders provided by Marvell. Some earlier + * boards were delivered with an older version of the bootloader that + * left internal registers mapped at 0xd0000000. If you are in this + * situation, you should either update your bootloader (preferred + * solution) or the below Device Tree should be adjusted. + */ + +/dts-v1/; +#include "armada-xp-98dx3336.dtsi" + +/ { + model = "DB-XC3-24G4XG"; + compatible = "marvell,db-xc3-24g4xg", "marvell,armadaxp-98dx3336", "marvell,armadaxp", "marvell,armada-370-xp"; + + chosen { + bootargs = "console=ttyS0,115200 earlyprintk"; + }; + + memory { + device_type = "memory"; + reg = <0 0x00000000 0 0x40000000>; /* 1 GB */ + }; + + soc { + ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 + MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 + MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 + MBUS_ID(0x03, 0x00) 0 0 0xa8000000 0x4000000 + MBUS_ID(0x08, 0x00) 0 0 0xac000000 0x100000>; + + devbus-bootcs { + status = "okay"; + + /* Device Bus parameters are required */ + + /* Read parameters */ + devbus,bus-width = <16>; + devbus,turn-off-ps = <60000>; + devbus,badr-skew-ps = <0>; + devbus,acc-first-ps = <124000>; + devbus,acc-next-ps = <248000>; + devbus,rd-setup-ps = <0>; + devbus,rd-hold-ps = <0>; + + /* Write parameters */ + devbus,sync-enable = <0>; + devbus,wr-high-ps = <60000>; + devbus,wr-low-ps = <60000>; + devbus,ale-wr-ps = <60000>; + }; + + internal-regs { + serial@12000 { + status = "okay"; + }; + serial@12100 { + status = "okay"; + }; + + i2c@11000 { + clock-frequency = <100000>; + status = "okay"; + }; + + mvsdio@d4000 { + status = "disabled"; + }; + + nand@d0000 { + status = "okay"; + num-cs = <1>; + marvell,nand-keep-config; + marvell,nand-enable-arbiter; + nand-on-flash-bbt; + nand-ecc-strength = <4>; + nand-ecc-step-size = <512>; + }; + }; + }; +}; + +&spi0 { + status = "okay"; + + spi-flash@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "m25p64"; + reg = <0>; /* Chip select 0 */ + spi-max-frequency = <20000000>; + m25p,fast-read; + + partition@u-boot { + reg = <0x00000000 0x00100000>; + label = "u-boot"; + }; + partition@u-boot-env { + reg = <0x00100000 0x00040000>; + label = "u-boot-env"; + }; + partition@unused { + reg = <0x00140000 0x00ec0000>; + label = "unused"; + }; + + }; +}; -- 2.11.0.24.ge6920cf ^ permalink raw reply related [flat|nested] 25+ messages in thread
end of thread, other threads:[~2017-01-04 17:38 UTC | newest] Thread overview: 25+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-12-22 4:13 [PATCH 0/5] Support for Marvell switches with integrated CPUs Chris Packham 2016-12-22 4:13 ` [PATCH 1/5] clk: mvebu: support for 98DX3236 SoC Chris Packham 2016-12-22 4:13 ` Chris Packham 2017-01-04 17:32 ` Gregory CLEMENT 2017-01-04 17:32 ` Gregory CLEMENT 2017-01-04 17:32 ` Gregory CLEMENT 2016-12-22 4:13 ` [PATCH 2/5] arm: mvebu: support for SMP on 98DX3336 SoC Chris Packham 2016-12-22 4:13 ` Chris Packham 2016-12-22 22:47 ` Rob Herring 2016-12-22 22:47 ` Rob Herring 2016-12-22 22:47 ` Rob Herring 2016-12-22 4:13 ` [PATCH 3/5] pinctrl: mvebu: pinctrl driver for 98DX3236 SoC Chris Packham 2016-12-22 4:13 ` Chris Packham 2016-12-22 4:13 ` Chris Packham 2016-12-22 22:48 ` Rob Herring 2016-12-22 22:48 ` Rob Herring 2016-12-30 9:03 ` Linus Walleij 2016-12-30 9:03 ` Linus Walleij 2016-12-22 4:13 ` [PATCH 4/5] arm: mvebu: Add device tree for 98DX3236 SoCs Chris Packham 2016-12-22 4:13 ` Chris Packham 2016-12-22 22:53 ` Rob Herring 2016-12-22 22:53 ` Rob Herring 2016-12-22 22:53 ` Rob Herring 2016-12-22 4:13 ` [PATCH 5/5] arm: mvebu: Add device tree for db-dxbc2 and db-xc3-24g4xg boards Chris Packham 2016-12-22 4:13 ` Chris Packham
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.