diff mbox

[v3,9/9] ARM: add initial support for Marvell Berlin SoCs

Message ID 1383661723-17956-10-git-send-email-sebastian.hesselbarth@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sebastian Hesselbarth Nov. 5, 2013, 2:28 p.m. UTC
This adds initial support for the Marvell Berlin SoC family with
Armada 1500 (88DE3100) and Armada 1500-mini (88DE3005) SoCs.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Reviewed-by: Jason Cooper <jason@lakedaemon.net>
Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
---
Changelog:
v2->v3:
- add Armada 1500-mini (BG2CD) Kconfig
v1->v2:
- replace 88DE3xxx numbering with SoC variant name
  (Requested by Jisheng Zhang)
- remove LOCAL_TIMERS dependency (Suggested by Dinh Nguyen)
RFCv2->v1:
- remove custom .init_time, adds dependency for arch-wide of_clk_init call
RFCv1->RFCv2:
- nuke .map_io (Reported by Arnd Bergmann)
- add copyright reference
- switch to mach-berlin instead of mach-mvebu

Cc: Russell King <linux@arm.linux.org.uk>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Olof Johansson <olof@lixom.net>
Cc: Kevin Hilman <khilman@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
---
 arch/arm/Kconfig              |    2 ++
 arch/arm/Makefile             |    1 +
 arch/arm/mach-berlin/Kconfig  |   30 ++++++++++++++++++++++++++++++
 arch/arm/mach-berlin/Makefile |    1 +
 arch/arm/mach-berlin/berlin.c |   39 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 73 insertions(+)
 create mode 100644 arch/arm/mach-berlin/Kconfig
 create mode 100644 arch/arm/mach-berlin/Makefile
 create mode 100644 arch/arm/mach-berlin/berlin.c

Comments

Jisheng Zhang Nov. 7, 2013, 5:40 a.m. UTC | #1
Dear Sebastian,

On Tue, 5 Nov 2013 06:28:43 -0800
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote:

> This adds initial support for the Marvell Berlin SoC family with
> Armada 1500 (88DE3100) and Armada 1500-mini (88DE3005) SoCs.
> 
> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> Reviewed-by: Jason Cooper <jason@lakedaemon.net>
> Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
> ---
> Changelog:
> v2->v3:
> - add Armada 1500-mini (BG2CD) Kconfig
> v1->v2:
> - replace 88DE3xxx numbering with SoC variant name
>   (Requested by Jisheng Zhang)
> - remove LOCAL_TIMERS dependency (Suggested by Dinh Nguyen)
> RFCv2->v1:
> - remove custom .init_time, adds dependency for arch-wide of_clk_init call
> RFCv1->RFCv2:
> - nuke .map_io (Reported by Arnd Bergmann)
> - add copyright reference
> - switch to mach-berlin instead of mach-mvebu
> 
> Cc: Russell King <linux@arm.linux.org.uk>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Olof Johansson <olof@lixom.net>
> Cc: Kevin Hilman <khilman@kernel.org>
> Cc: linux-arm-kernel@lists.infradead.org
> Cc: linux-kernel@vger.kernel.org
> ---
>  arch/arm/Kconfig              |    2 ++
>  arch/arm/Makefile             |    1 +
>  arch/arm/mach-berlin/Kconfig  |   30 ++++++++++++++++++++++++++++++
>  arch/arm/mach-berlin/Makefile |    1 +
>  arch/arm/mach-berlin/berlin.c |   39
> +++++++++++++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+)
>  create mode 100644 arch/arm/mach-berlin/Kconfig
>  create mode 100644 arch/arm/mach-berlin/Makefile
>  create mode 100644 arch/arm/mach-berlin/berlin.c
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 1ad6fb6..5692426 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -932,6 +932,8 @@ source "arch/arm/mach-bcm/Kconfig"
>  
>  source "arch/arm/mach-bcm2835/Kconfig"
>  
> +source "arch/arm/mach-berlin/Kconfig"
> +
>  source "arch/arm/mach-clps711x/Kconfig"
>  
>  source "arch/arm/mach-cns3xxx/Kconfig"
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index db50b62..07258c7 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -147,6 +147,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
>  machine-$(CONFIG_ARCH_AT91)		+= at91
>  machine-$(CONFIG_ARCH_BCM)		+= bcm
>  machine-$(CONFIG_ARCH_BCM2835)		+= bcm2835
> +machine-$(CONFIG_ARCH_BERLIN)		+= berlin
>  machine-$(CONFIG_ARCH_CLPS711X)		+= clps711x
>  machine-$(CONFIG_ARCH_CNS3XXX)		+= cns3xxx
>  machine-$(CONFIG_ARCH_DAVINCI)		+= davinci
> diff --git a/arch/arm/mach-berlin/Kconfig b/arch/arm/mach-berlin/Kconfig
> new file mode 100644
> index 0000000..c5b39b1
> --- /dev/null
> +++ b/arch/arm/mach-berlin/Kconfig
> @@ -0,0 +1,30 @@
> +config ARCH_BERLIN
> +	bool "Marvell Berlin SoCs" if ARCH_MULTI_V7
> +	select GENERIC_CLOCKEVENTS
> +	select GENERIC_IRQ_CHIP
> +	select COMMON_CLK
> +	select DW_APB_ICTL
> +	select DW_APB_TIMER_OF
> +
> +if ARCH_BERLIN
> +
> +menu "Marvell Berlin SoC variants"
> +
> +config MACH_BERLIN_BG2
> +	bool "Marvell Armada 1500 (BG2)"
> +	select ARM_GIC
ARM_GIC is common on berlin SoCs. we can put it below ARCH_BERLIN?
> +	select CACHE_L2X0
ditto
> +	select CPU_PJ4B
> +	select HAVE_ARM_TWD
> +	select HAVE_SMP
> +
> +config MACH_BERLIN_BG2CD
> +	bool "Marvell Armada 1500-mini (BG2CD)"
> +	select ARM_GIC
> +	select CACHE_L2X0
> +	select CPU_V7
> +	select HAVE_ARM_TWD
BG2CD is single core, I'm not sure it have twd. I will check with SoC people.
But can twd be really used in single CA9 system?
> +
> +endmenu
> +
> +endif
> diff --git a/arch/arm/mach-berlin/Makefile b/arch/arm/mach-berlin/Makefile
> new file mode 100644
> index 0000000..ab69fe9
> --- /dev/null
> +++ b/arch/arm/mach-berlin/Makefile
> @@ -0,0 +1 @@
> +obj-y += berlin.o
> diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c
> new file mode 100644
> index 0000000..16c2942
> --- /dev/null
> +++ b/arch/arm/mach-berlin/berlin.c
> @@ -0,0 +1,39 @@
> +/*
> + * Device Tree support for Marvell Berlin SoCs.
> + *
> + * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
> + *
> + * based on GPL'ed 2.6 kernel sources
> + *  (c) Marvell International Ltd.
> + *
> + * 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/init.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/of_platform.h>
> +#include <asm/hardware/cache-l2x0.h>
> +#include <asm/mach/arch.h>
> +
> +static void __init berlin_init_machine(void)
> +{
> +	/*
> +	 * with DT probing for L2CCs, berlin_init_machine can be removed.
> +	 * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc
> +	 */
> +	l2x0_of_init(0x70c00000, 0xfeffffff);
Per my experience, put l2x0 initialization in init_machine is too late. It
did cause some boot stability problems during our product massive bootup test.
In our internal 3.10.y tree, we put it in init_early, I also suggest we do
this too in mainline.
> +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
If l2 initialization is put in init_early, this is not needed any more.
> +}
> +
> +static const char * const berlin_dt_compat[] = {
> +	"marvell,berlin",
> +	NULL,
> +};
> +
> +DT_MACHINE_START(BERLIN_DT, "Marvell Berlin")
> +	.dt_compat      = berlin_dt_compat,
> +	.init_machine   = berlin_init_machine,
> +MACHINE_END
Jisheng Zhang Nov. 7, 2013, 7:01 a.m. UTC | #2
On Wed, 6 Nov 2013 21:40:33 -0800
Jisheng Zhang <jszhang@marvell.com> wrote:

...
> > +	select ARM_GIC  
> ARM_GIC is common on berlin SoCs. we can put it below ARCH_BERLIN?
> > +	select CACHE_L2X0  
> ditto

Sorry. After some consideration, CACHE_L2X0 is not common (BG3). So please ignore
this line

Thanks
Sebastian Hesselbarth Nov. 7, 2013, 10:12 a.m. UTC | #3
On 11/07/13 06:40, Jisheng Zhang wrote:
> On Tue, 5 Nov 2013 06:28:43 -0800
> Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote:
>
>> This adds initial support for the Marvell Berlin SoC family with
>> Armada 1500 (88DE3100) and Armada 1500-mini (88DE3005) SoCs.
>>
>> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
>> Reviewed-by: Jason Cooper <jason@lakedaemon.net>
>> Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
>> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
>> ---
[...]
>> diff --git a/arch/arm/mach-berlin/Kconfig b/arch/arm/mach-berlin/Kconfig
>> new file mode 100644
>> index 0000000..c5b39b1
>> --- /dev/null
>> +++ b/arch/arm/mach-berlin/Kconfig
>> @@ -0,0 +1,30 @@
>> +config ARCH_BERLIN
>> +	bool "Marvell Berlin SoCs" if ARCH_MULTI_V7
>> +	select GENERIC_CLOCKEVENTS
>> +	select GENERIC_IRQ_CHIP
>> +	select COMMON_CLK
>> +	select DW_APB_ICTL
>> +	select DW_APB_TIMER_OF
>> +
>> +if ARCH_BERLIN
>> +
>> +menu "Marvell Berlin SoC variants"
>> +
>> +config MACH_BERLIN_BG2
>> +	bool "Marvell Armada 1500 (BG2)"
>> +	select ARM_GIC
> ARM_GIC is common on berlin SoCs. we can put it below ARCH_BERLIN?

Sure, I guess BG3 is also using GIC?

>> +	select CACHE_L2X0
> ditto

You already re-replied to that. I leave L2X0 here, BG3 will be
different, as you stated.

>> +	select CPU_PJ4B
>> +	select HAVE_ARM_TWD
>> +	select HAVE_SMP
>> +
>> +config MACH_BERLIN_BG2CD
>> +	bool "Marvell Armada 1500-mini (BG2CD)"
>> +	select ARM_GIC
>> +	select CACHE_L2X0
>> +	select CPU_V7
>> +	select HAVE_ARM_TWD
> BG2CD is single core, I'm not sure it have twd. I will check with SoC people.
> But can twd be really used in single CA9 system?

 From a quick view into Cortex-A9 MPCore TRM, I cannot see why it
shouldn't be there even for single-core. If you can get more info,
that would be great.

Actually, IIRC smp_twd does not compile without SMP set, so the above
should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down
to non-SMP cores, you can disable it and it will fail to compile.

>> +
>> +endmenu
>> +
>> +endif
>> diff --git a/arch/arm/mach-berlin/Makefile b/arch/arm/mach-berlin/Makefile
>> new file mode 100644
>> index 0000000..ab69fe9
>> --- /dev/null
>> +++ b/arch/arm/mach-berlin/Makefile
>> @@ -0,0 +1 @@
>> +obj-y += berlin.o
>> diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c
>> new file mode 100644
>> index 0000000..16c2942
>> --- /dev/null
>> +++ b/arch/arm/mach-berlin/berlin.c
>> @@ -0,0 +1,39 @@
>> +/*
>> + * Device Tree support for Marvell Berlin SoCs.
>> + *
>> + * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
>> + *
>> + * based on GPL'ed 2.6 kernel sources
>> + *  (c) Marvell International Ltd.
>> + *
>> + * 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/init.h>
>> +#include <linux/io.h>
>> +#include <linux/kernel.h>
>> +#include <linux/of_platform.h>
>> +#include <asm/hardware/cache-l2x0.h>
>> +#include <asm/mach/arch.h>
>> +
>> +static void __init berlin_init_machine(void)
>> +{
>> +	/*
>> +	 * with DT probing for L2CCs, berlin_init_machine can be removed.
>> +	 * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc
>> +	 */
>> +	l2x0_of_init(0x70c00000, 0xfeffffff);
> Per my experience, put l2x0 initialization in init_machine is too late. It
> did cause some boot stability problems during our product massive bootup test.
> In our internal 3.10.y tree, we put it in init_early, I also suggest we do
> this too in mainline.

Ok.

>> +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
> If l2 initialization is put in init_early, this is not needed any more.

Right, that's already in the comment right above l2x0_of_init ;)

>> +}
>> +
>> +static const char * const berlin_dt_compat[] = {
>> +	"marvell,berlin",
>> +	NULL,
>> +};
>> +
>> +DT_MACHINE_START(BERLIN_DT, "Marvell Berlin")
>> +	.dt_compat      = berlin_dt_compat,
>> +	.init_machine   = berlin_init_machine,
>> +MACHINE_END
>
Arnd Bergmann Nov. 7, 2013, 4:20 p.m. UTC | #4
On Thursday 07 November 2013, Sebastian Hesselbarth wrote:
> Actually, IIRC smp_twd does not compile without SMP set, so the above
> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down
> to non-SMP cores, you can disable it and it will fail to compile.
> 

If there are UP-systems for which TWD is the best clocksource, we should
probably fix the code to allow that configuration. IIRC there were already
patches recently in this area, maybe it's already solved.

	Arnd
Sebastian Hesselbarth Nov. 7, 2013, 9:22 p.m. UTC | #5
On 11/07/2013 05:20 PM, Arnd Bergmann wrote:
> On Thursday 07 November 2013, Sebastian Hesselbarth wrote:
>> Actually, IIRC smp_twd does not compile without SMP set, so the above
>> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down
>> to non-SMP cores, you can disable it and it will fail to compile.
>
> If there are UP-systems for which TWD is the best clocksource, we should
> probably fix the code to allow that configuration. IIRC there were already
> patches recently in this area, maybe it's already solved.

I just tried barebox bootloader to use TWD as timer on berlin2cd and it
perfectly works, i.e. with time related commands I can see the timer
register decreasing. So the timer is available on this UP SoC.

As said before, compiling linux without CONFIG_SMP but with
CONFIG_HAVE_ARM_TWD gives:

warning: (SOC_OMAP5 && ARCH_ROCKCHIP && ARCH_SHMOBILE_MULTI && 
MACH_BERLIN_BG2 && MACH_BERLIN_BG2CD) selects HAVE_ARM_TWD which has 
unmet direct dependencies (SMP)

and

arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register':
arch/arm/kernel/smp_twd.c:391: error: 'setup_max_cpus' undeclared (first 
use in this function)
arch/arm/kernel/smp_twd.c:391: error: (Each undeclared identifier is 
reported only once
arch/arm/kernel/smp_twd.c:391: error: for each function it appears in.)
make[1]: *** [arch/arm/kernel/smp_twd.o] Error 1

I haven't looked deeper into this, but I guess it will not be hard
to make ARM_TWD independent of SMP.

Sebastian
Arnd Bergmann Nov. 7, 2013, 10:11 p.m. UTC | #6
On Thursday 07 November 2013, Sebastian Hesselbarth wrote:
> I haven't looked deeper into this, but I guess it will not be hard
> to make ARM_TWD independent of SMP.

Yes, I agree. Just make sure to look at the list archives to see if someone
already did that work.

	Arnd
Jisheng Zhang Nov. 8, 2013, 12:58 a.m. UTC | #7
Dear Sebastian,

On Thu, 7 Nov 2013 13:22:35 -0800
Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote:

> On 11/07/2013 05:20 PM, Arnd Bergmann wrote:
> > On Thursday 07 November 2013, Sebastian Hesselbarth wrote:
> >> Actually, IIRC smp_twd does not compile without SMP set, so the above
> >> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down
> >> to non-SMP cores, you can disable it and it will fail to compile.
> >
> > If there are UP-systems for which TWD is the best clocksource, we should
> > probably fix the code to allow that configuration. IIRC there were already
> > patches recently in this area, maybe it's already solved.

The problems is twd is not mandatory in CA9 UP system, so it may not exist.
However, I got answers from soc people, the BG2CD does configured and enabled
TWD. so we are lucky and can add HAVE_TWD for BG2CD.

> 
> I just tried barebox bootloader to use TWD as timer on berlin2cd and it
> perfectly works, i.e. with time related commands I can see the timer
> register decreasing. So the timer is available on this UP SoC.

Yep. It is available.

> 
> As said before, compiling linux without CONFIG_SMP but with
> CONFIG_HAVE_ARM_TWD gives:
> 
> warning: (SOC_OMAP5 && ARCH_ROCKCHIP && ARCH_SHMOBILE_MULTI && 
> MACH_BERLIN_BG2 && MACH_BERLIN_BG2CD) selects HAVE_ARM_TWD which has 
> unmet direct dependencies (SMP)
> 
> and
> 
> arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register':
> arch/arm/kernel/smp_twd.c:391: error: 'setup_max_cpus' undeclared (first 
> use in this function)
> arch/arm/kernel/smp_twd.c:391: error: (Each undeclared identifier is 
> reported only once
> arch/arm/kernel/smp_twd.c:391: error: for each function it appears in.)
> make[1]: *** [arch/arm/kernel/smp_twd.o] Error 1
> 
> I haven't looked deeper into this, but I guess it will not be hard
> to make ARM_TWD independent of SMP.
> 
> Sebastian
>
Sebastian Hesselbarth Nov. 8, 2013, 8:54 a.m. UTC | #8
On 11/08/2013 01:58 AM, Jisheng Zhang wrote:
> On Thu, 7 Nov 2013 13:22:35 -0800
> Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote:
>> On 11/07/2013 05:20 PM, Arnd Bergmann wrote:
>>> On Thursday 07 November 2013, Sebastian Hesselbarth wrote:
>>>> Actually, IIRC smp_twd does not compile without SMP set, so the above
>>>> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down
>>>> to non-SMP cores, you can disable it and it will fail to compile.
>>>
>>> If there are UP-systems for which TWD is the best clocksource, we should
>>> probably fix the code to allow that configuration. IIRC there were already
>>> patches recently in this area, maybe it's already solved.
>
> The problems is twd is not mandatory in CA9 UP system, so it may not exist.
> However, I got answers from soc people, the BG2CD does configured and enabled
> TWD. so we are lucky and can add HAVE_TWD for BG2CD.

Jisheng,

thanks for backing this up. As I said, I tried it with barebox and TWD
is sufficient for a timer there.

Currently, Linux requires SMP for TWD - but as you confirmed, there are
non-SMP systems with TWD. The build errors below are just from a check
for SMP systems, so if we remove that, TWD should be ready for non-SMP.

I'll see, if I can prepare a patch next week and put it on list.

Sebastian

>> I just tried barebox bootloader to use TWD as timer on berlin2cd and it
>> perfectly works, i.e. with time related commands I can see the timer
>> register decreasing. So the timer is available on this UP SoC.
>
> Yep. It is available.
>
>>
>> As said before, compiling linux without CONFIG_SMP but with
>> CONFIG_HAVE_ARM_TWD gives:
>>
>> warning: (SOC_OMAP5 && ARCH_ROCKCHIP && ARCH_SHMOBILE_MULTI &&
>> MACH_BERLIN_BG2 && MACH_BERLIN_BG2CD) selects HAVE_ARM_TWD which has
>> unmet direct dependencies (SMP)
>>
>> and
>>
>> arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register':
>> arch/arm/kernel/smp_twd.c:391: error: 'setup_max_cpus' undeclared (first
>> use in this function)
>> arch/arm/kernel/smp_twd.c:391: error: (Each undeclared identifier is
>> reported only once
>> arch/arm/kernel/smp_twd.c:391: error: for each function it appears in.)
>> make[1]: *** [arch/arm/kernel/smp_twd.o] Error 1
>>
>> I haven't looked deeper into this, but I guess it will not be hard
>> to make ARM_TWD independent of SMP.
diff mbox

Patch

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 1ad6fb6..5692426 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -932,6 +932,8 @@  source "arch/arm/mach-bcm/Kconfig"
 
 source "arch/arm/mach-bcm2835/Kconfig"
 
+source "arch/arm/mach-berlin/Kconfig"
+
 source "arch/arm/mach-clps711x/Kconfig"
 
 source "arch/arm/mach-cns3xxx/Kconfig"
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index db50b62..07258c7 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -147,6 +147,7 @@  textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
 machine-$(CONFIG_ARCH_AT91)		+= at91
 machine-$(CONFIG_ARCH_BCM)		+= bcm
 machine-$(CONFIG_ARCH_BCM2835)		+= bcm2835
+machine-$(CONFIG_ARCH_BERLIN)		+= berlin
 machine-$(CONFIG_ARCH_CLPS711X)		+= clps711x
 machine-$(CONFIG_ARCH_CNS3XXX)		+= cns3xxx
 machine-$(CONFIG_ARCH_DAVINCI)		+= davinci
diff --git a/arch/arm/mach-berlin/Kconfig b/arch/arm/mach-berlin/Kconfig
new file mode 100644
index 0000000..c5b39b1
--- /dev/null
+++ b/arch/arm/mach-berlin/Kconfig
@@ -0,0 +1,30 @@ 
+config ARCH_BERLIN
+	bool "Marvell Berlin SoCs" if ARCH_MULTI_V7
+	select GENERIC_CLOCKEVENTS
+	select GENERIC_IRQ_CHIP
+	select COMMON_CLK
+	select DW_APB_ICTL
+	select DW_APB_TIMER_OF
+
+if ARCH_BERLIN
+
+menu "Marvell Berlin SoC variants"
+
+config MACH_BERLIN_BG2
+	bool "Marvell Armada 1500 (BG2)"
+	select ARM_GIC
+	select CACHE_L2X0
+	select CPU_PJ4B
+	select HAVE_ARM_TWD
+	select HAVE_SMP
+
+config MACH_BERLIN_BG2CD
+	bool "Marvell Armada 1500-mini (BG2CD)"
+	select ARM_GIC
+	select CACHE_L2X0
+	select CPU_V7
+	select HAVE_ARM_TWD
+
+endmenu
+
+endif
diff --git a/arch/arm/mach-berlin/Makefile b/arch/arm/mach-berlin/Makefile
new file mode 100644
index 0000000..ab69fe9
--- /dev/null
+++ b/arch/arm/mach-berlin/Makefile
@@ -0,0 +1 @@ 
+obj-y += berlin.o
diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c
new file mode 100644
index 0000000..16c2942
--- /dev/null
+++ b/arch/arm/mach-berlin/berlin.c
@@ -0,0 +1,39 @@ 
+/*
+ * Device Tree support for Marvell Berlin SoCs.
+ *
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ *
+ * based on GPL'ed 2.6 kernel sources
+ *  (c) Marvell International Ltd.
+ *
+ * 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/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/of_platform.h>
+#include <asm/hardware/cache-l2x0.h>
+#include <asm/mach/arch.h>
+
+static void __init berlin_init_machine(void)
+{
+	/*
+	 * with DT probing for L2CCs, berlin_init_machine can be removed.
+	 * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc
+	 */
+	l2x0_of_init(0x70c00000, 0xfeffffff);
+	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static const char * const berlin_dt_compat[] = {
+	"marvell,berlin",
+	NULL,
+};
+
+DT_MACHINE_START(BERLIN_DT, "Marvell Berlin")
+	.dt_compat      = berlin_dt_compat,
+	.init_machine   = berlin_init_machine,
+MACHINE_END