forked from luck/tmp_suning_uos_patched
Merge branch 'mvebu/newsoc' into next/newsoc
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> You'll find in this patch set the nineth version of the initial support for a new family of ARMv7-compatible Marvell SoCs. As for the previous releases, both the Armada 370 and the Armada XP SoCs are supported in this directory, and we are able to build a single kernel image that boots on both SoCs. Both SoCs use the PJ4B processor, a Marvell-developed ARM core that implements the ARMv7 instruction set. We are currently using Marvell evaluation boards for both of those SoCs, and the support for those boards is added in this patch set. This patch set, and the support for those SoCs, started as a collaborative effort from Marvell engineers (who have done the initial development work) and Free Electrons engineers (who are reshaping the code for mainline submission, adding device tree support, etc.). This effort has also received contributions from Ben Dooks from Codethink. * mvebu/newsoc: ARM: mvebu: MPIC: read number of interrupts from control register arm: mach-mvebu: add entry to MAINTAINERS arm: mach-mvebu: add compilation/configuration change arm: mach-mvebu: add defconfig arm: mach-mvebu: add documentation for new device tree bindings arm: mach-mvebu: add support for Armada 370 and Armada XP with DT arm: mach-mvebu: add source files arm: mach-mvebu: add header clocksource: time-armada-370-xp: Marvell Armada 370/XP SoC timer driver Changes from Arnd * Pulled from git://github.com/Marvell-Semi/EBU_mainline_public.git mvebu_for-next-V9 * rebased onto v3.5-rc5 because it was originally based on an old arm-soc/for-next branch Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
81ab1f74ef
23
Documentation/devicetree/bindings/arm/armada-370-xp-mpic.txt
Normal file
23
Documentation/devicetree/bindings/arm/armada-370-xp-mpic.txt
Normal file
|
@ -0,0 +1,23 @@
|
|||
Marvell Armada 370 and Armada XP Interrupt Controller
|
||||
-----------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "marvell,mpic"
|
||||
- interrupt-controller: Identifies the node as an interrupt controller.
|
||||
- #interrupt-cells: The number of cells to define the interrupts. Should be 1.
|
||||
The cell is the IRQ number
|
||||
- reg: Should contain PMIC registers location and length. First pair
|
||||
for the main interrupt registers, second pair for the per-CPU
|
||||
interrupt registers
|
||||
|
||||
Example:
|
||||
|
||||
mpic: interrupt-controller@d0020000 {
|
||||
compatible = "marvell,mpic";
|
||||
#interrupt-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-controller;
|
||||
reg = <0xd0020000 0x1000>,
|
||||
<0xd0021000 0x1000>;
|
||||
};
|
|
@ -0,0 +1,11 @@
|
|||
Marvell Armada 370 and Armada XP Global Timers
|
||||
----------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "marvell,armada-370-xp-timer"
|
||||
- interrupts: Should contain the list of Global Timer interrupts
|
||||
- reg: Should contain the base address of the Global Timer registers
|
||||
|
||||
Optional properties:
|
||||
- marvell,timer-25Mhz: Tells whether the Global timer supports the 25
|
||||
Mhz fixed mode (available on Armada XP and not on Armada 370)
|
24
Documentation/devicetree/bindings/arm/armada-370-xp.txt
Normal file
24
Documentation/devicetree/bindings/arm/armada-370-xp.txt
Normal file
|
@ -0,0 +1,24 @@
|
|||
Marvell Armada 370 and Armada XP Platforms Device Tree Bindings
|
||||
---------------------------------------------------------------
|
||||
|
||||
Boards with a SoC of the Marvell Armada 370 and Armada XP families
|
||||
shall have the following property:
|
||||
|
||||
Required root node property:
|
||||
|
||||
compatible: must contain "marvell,armada-370-xp"
|
||||
|
||||
In addition, boards using the Marvell Armada 370 SoC shall have the
|
||||
following property:
|
||||
|
||||
Required root node property:
|
||||
|
||||
compatible: must contain "marvell,armada370"
|
||||
|
||||
In addition, boards using the Marvell Armada XP SoC shall have the
|
||||
following property:
|
||||
|
||||
Required root node property:
|
||||
|
||||
compatible: must contain "marvell,armadaxp"
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
MVEBU System Controller
|
||||
-----------------------
|
||||
MVEBU (Marvell SOCs: Armada 370/XP, Dove, mv78xx0, Kirkwood, Orion5x)
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: one of:
|
||||
- "marvell,orion-system-controller"
|
||||
- "marvell,armada-370-xp-system-controller"
|
||||
- reg: Should contain system controller registers location and length.
|
||||
|
||||
Example:
|
||||
|
||||
system-controller@d0018200 {
|
||||
compatible = "marvell,armada-370-xp-system-controller";
|
||||
reg = <0xd0018200 0x500>;
|
||||
};
|
|
@ -894,6 +894,14 @@ ARM/MAGICIAN MACHINE SUPPORT
|
|||
M: Philipp Zabel <philipp.zabel@gmail.com>
|
||||
S: Maintained
|
||||
|
||||
ARM/Marvell Armada 370 and Armada XP SOC support
|
||||
M: Jason Cooper <jason@lakedaemon.net>
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
M: Gregory Clement <gregory.clement@free-electrons.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/mach-mvebu/
|
||||
|
||||
ARM/Marvell Dove/Kirkwood/MV78xx0/Orion SOC support
|
||||
M: Jason Cooper <jason@lakedaemon.net>
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
|
|
|
@ -533,6 +533,18 @@ config ARCH_IXP4XX
|
|||
help
|
||||
Support for Intel's IXP4XX (XScale) family of processors.
|
||||
|
||||
config ARCH_MVEBU
|
||||
bool "Marvell SOCs with Device Tree support"
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select MULTI_IRQ_HANDLER
|
||||
select SPARSE_IRQ
|
||||
select CLKSRC_MMIO
|
||||
select GENERIC_IRQ_CHIP
|
||||
select IRQ_DOMAIN
|
||||
select COMMON_CLK
|
||||
help
|
||||
Support for the Marvell SoC Family with device tree support
|
||||
|
||||
config ARCH_DOVE
|
||||
bool "Marvell Dove"
|
||||
select CPU_V7
|
||||
|
@ -987,6 +999,8 @@ endchoice
|
|||
# Kconfigs may be included either alphabetically (according to the
|
||||
# plat- suffix) or along side the corresponding mach-* source.
|
||||
#
|
||||
source "arch/arm/mach-mvebu/Kconfig"
|
||||
|
||||
source "arch/arm/mach-at91/Kconfig"
|
||||
|
||||
source "arch/arm/mach-bcmring/Kconfig"
|
||||
|
|
|
@ -157,6 +157,7 @@ machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0
|
|||
machine-$(CONFIG_ARCH_IMX_V4_V5) := imx
|
||||
machine-$(CONFIG_ARCH_IMX_V6_V7) := imx
|
||||
machine-$(CONFIG_ARCH_MXS) := mxs
|
||||
machine-$(CONFIG_ARCH_MVEBU) := mvebu
|
||||
machine-$(CONFIG_ARCH_NETX) := netx
|
||||
machine-$(CONFIG_ARCH_NOMADIK) := nomadik
|
||||
machine-$(CONFIG_ARCH_OMAP1) := omap1
|
||||
|
|
42
arch/arm/boot/dts/armada-370-db.dts
Normal file
42
arch/arm/boot/dts/armada-370-db.dts
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Device Tree file for Marvell Armada 370 evaluation board
|
||||
* (DB-88F6710-BP-DDR3)
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "armada-370.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada 370 Evaluation Board";
|
||||
compatible = "marvell,a370-db", "marvell,armada370", "marvell,armada-370-xp";
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200 earlyprintk";
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x20000000>; /* 512 MB */
|
||||
};
|
||||
|
||||
soc {
|
||||
serial@d0012000 {
|
||||
clock-frequency = <200000000>;
|
||||
status = "okay";
|
||||
};
|
||||
timer@d0020300 {
|
||||
clock-frequency = <600000000>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
68
arch/arm/boot/dts/armada-370-xp.dtsi
Normal file
68
arch/arm/boot/dts/armada-370-xp.dtsi
Normal file
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* Device Tree Include file for Marvell Armada 370 and Armada XP SoC
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
* Ben Dooks <ben.dooks@codethink.co.uk>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This file contains the definitions that are common to the Armada
|
||||
* 370 and Armada XP SoC.
|
||||
*/
|
||||
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada 370 and XP SoC";
|
||||
compatible = "marvell,armada_370_xp";
|
||||
|
||||
cpus {
|
||||
cpu@0 {
|
||||
compatible = "marvell,sheeva-v7";
|
||||
};
|
||||
};
|
||||
|
||||
mpic: interrupt-controller@d0020000 {
|
||||
compatible = "marvell,mpic";
|
||||
#interrupt-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-controller;
|
||||
};
|
||||
|
||||
soc {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "simple-bus";
|
||||
interrupt-parent = <&mpic>;
|
||||
ranges;
|
||||
|
||||
serial@d0012000 {
|
||||
compatible = "ns16550";
|
||||
reg = <0xd0012000 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <41>;
|
||||
status = "disabled";
|
||||
};
|
||||
serial@d0012100 {
|
||||
compatible = "ns16550";
|
||||
reg = <0xd0012100 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <42>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
timer@d0020300 {
|
||||
compatible = "marvell,armada-370-xp-timer";
|
||||
reg = <0xd0020300 0x30>;
|
||||
interrupts = <37>, <38>, <39>, <40>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
35
arch/arm/boot/dts/armada-370.dtsi
Normal file
35
arch/arm/boot/dts/armada-370.dtsi
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Device Tree Include file for Marvell Armada 370 family SoC
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Contains definitions specific to the Armada 370 SoC that are not
|
||||
* common to all Armada SoCs.
|
||||
*/
|
||||
|
||||
/include/ "armada-370-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada 370 family SoC";
|
||||
compatible = "marvell,armada370", "marvell,armada-370-xp";
|
||||
|
||||
mpic: interrupt-controller@d0020000 {
|
||||
reg = <0xd0020a00 0x1d0>,
|
||||
<0xd0021870 0x58>;
|
||||
};
|
||||
|
||||
soc {
|
||||
system-controller@d0018200 {
|
||||
compatible = "marvell,armada-370-xp-system-controller";
|
||||
reg = <0xd0018200 0x100>;
|
||||
};
|
||||
};
|
||||
};
|
50
arch/arm/boot/dts/armada-xp-db.dts
Normal file
50
arch/arm/boot/dts/armada-xp-db.dts
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Device Tree file for Marvell Armada XP evaluation board
|
||||
* (DB-78460-BP)
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "armada-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP Evaluation Board";
|
||||
compatible = "marvell,axp-db", "marvell,armadaxp", "marvell,armada-370-xp";
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200 earlyprintk";
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x80000000>; /* 2 GB */
|
||||
};
|
||||
|
||||
soc {
|
||||
serial@d0012000 {
|
||||
clock-frequency = <250000000>;
|
||||
status = "okay";
|
||||
};
|
||||
serial@d0012100 {
|
||||
clock-frequency = <250000000>;
|
||||
status = "okay";
|
||||
};
|
||||
serial@d0012200 {
|
||||
clock-frequency = <250000000>;
|
||||
status = "okay";
|
||||
};
|
||||
serial@d0012300 {
|
||||
clock-frequency = <250000000>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
55
arch/arm/boot/dts/armada-xp.dtsi
Normal file
55
arch/arm/boot/dts/armada-xp.dtsi
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Device Tree Include file for Marvell Armada XP family SoC
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
* Ben Dooks <ben.dooks@codethink.co.uk>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Contains definitions specific to the Armada 370 SoC that are not
|
||||
* common to all Armada SoCs.
|
||||
*/
|
||||
|
||||
/include/ "armada-370-xp.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Marvell Armada XP family SoC";
|
||||
compatible = "marvell,armadaxp", "marvell,armada-370-xp";
|
||||
|
||||
mpic: interrupt-controller@d0020000 {
|
||||
reg = <0xd0020a00 0x1d0>,
|
||||
<0xd0021870 0x58>;
|
||||
};
|
||||
|
||||
soc {
|
||||
serial@d0012200 {
|
||||
compatible = "ns16550";
|
||||
reg = <0xd0012200 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <43>;
|
||||
status = "disabled";
|
||||
};
|
||||
serial@d0012300 {
|
||||
compatible = "ns16550";
|
||||
reg = <0xd0012300 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <44>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
timer@d0020300 {
|
||||
marvell,timer-25Mhz;
|
||||
};
|
||||
|
||||
system-controller@d0018200 {
|
||||
compatible = "marvell,armada-370-xp-system-controller";
|
||||
reg = <0xd0018200 0x500>;
|
||||
};
|
||||
};
|
||||
};
|
46
arch/arm/configs/mvebu_defconfig
Normal file
46
arch/arm/configs/mvebu_defconfig
Normal file
|
@ -0,0 +1,46 @@
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_ARCH_MVEBU=y
|
||||
CONFIG_MACH_ARMADA_370_XP=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
# CONFIG_EXT3_FS_XATTR is not set
|
||||
CONFIG_ISO9660_FS=y
|
||||
CONFIG_JOLIET=y
|
||||
CONFIG_UDF_FS=m
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_850=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_2=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
CONFIG_TIMER_STATS=y
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_EARLY_PRINTK=y
|
16
arch/arm/mach-mvebu/Kconfig
Normal file
16
arch/arm/mach-mvebu/Kconfig
Normal file
|
@ -0,0 +1,16 @@
|
|||
if ARCH_MVEBU
|
||||
|
||||
menu "Marvell SOC with device tree"
|
||||
|
||||
config MACH_ARMADA_370_XP
|
||||
bool "Marvell Armada 370 and Aramada XP boards"
|
||||
select ARMADA_370_XP_TIMER
|
||||
select CPU_V7
|
||||
help
|
||||
|
||||
Say 'Y' here if you want your kernel to support boards based on
|
||||
Marvell Armada 370 or Armada XP with device tree.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
2
arch/arm/mach-mvebu/Makefile
Normal file
2
arch/arm/mach-mvebu/Makefile
Normal file
|
@ -0,0 +1,2 @@
|
|||
obj-y += system-controller.o
|
||||
obj-$(CONFIG_MACH_ARMADA_370_XP) += armada-370-xp.o irq-armada-370-xp.o
|
1
arch/arm/mach-mvebu/Makefile.boot
Normal file
1
arch/arm/mach-mvebu/Makefile.boot
Normal file
|
@ -0,0 +1 @@
|
|||
zreladdr-y := 0x00008000
|
63
arch/arm/mach-mvebu/armada-370-xp.c
Normal file
63
arch/arm/mach-mvebu/armada-370-xp.c
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* Device Tree support for Armada 370 and XP platforms.
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/time-armada-370-xp.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/armada-370-xp.h>
|
||||
#include "common.h"
|
||||
|
||||
static struct map_desc armada_370_xp_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = ARMADA_370_XP_REGS_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(ARMADA_370_XP_REGS_PHYS_BASE),
|
||||
.length = ARMADA_370_XP_REGS_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
void __init armada_370_xp_map_io(void)
|
||||
{
|
||||
iotable_init(armada_370_xp_io_desc, ARRAY_SIZE(armada_370_xp_io_desc));
|
||||
}
|
||||
|
||||
struct sys_timer armada_370_xp_timer = {
|
||||
.init = armada_370_xp_timer_init,
|
||||
};
|
||||
|
||||
static void __init armada_370_xp_dt_init(void)
|
||||
{
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char * const armada_370_xp_dt_board_dt_compat[] = {
|
||||
"marvell,a370-db",
|
||||
"marvell,axp-db",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(ARMADA_XP_DT, "Marvell Aramada 370/XP (Device Tree)")
|
||||
.init_machine = armada_370_xp_dt_init,
|
||||
.map_io = armada_370_xp_map_io,
|
||||
.init_irq = armada_370_xp_init_irq,
|
||||
.handle_irq = armada_370_xp_handle_irq,
|
||||
.timer = &armada_370_xp_timer,
|
||||
.restart = mvebu_restart,
|
||||
.dt_compat = armada_370_xp_dt_board_dt_compat,
|
||||
MACHINE_END
|
23
arch/arm/mach-mvebu/common.h
Normal file
23
arch/arm/mach-mvebu/common.h
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Core functions for Marvell System On Chip
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_MVEBU_COMMON_H
|
||||
#define __ARCH_MVEBU_COMMON_H
|
||||
|
||||
void mvebu_restart(char mode, const char *cmd);
|
||||
|
||||
void armada_370_xp_init_irq(void);
|
||||
void armada_370_xp_handle_irq(struct pt_regs *regs);
|
||||
|
||||
#endif
|
22
arch/arm/mach-mvebu/include/mach/armada-370-xp.h
Normal file
22
arch/arm/mach-mvebu/include/mach/armada-370-xp.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Generic definitions for Marvell Armada_370_XP SoCs
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_ARMADA_370_XP_H
|
||||
#define __MACH_ARMADA_370_XP_H
|
||||
|
||||
#define ARMADA_370_XP_REGS_PHYS_BASE 0xd0000000
|
||||
#define ARMADA_370_XP_REGS_VIRT_BASE 0xfeb00000
|
||||
#define ARMADA_370_XP_REGS_SIZE SZ_1M
|
||||
|
||||
#endif /* __MACH_ARMADA_370_XP_H */
|
24
arch/arm/mach-mvebu/include/mach/debug-macro.S
Normal file
24
arch/arm/mach-mvebu/include/mach/debug-macro.S
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Early serial output macro for Marvell SoC
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory Clement <gregory.clement@free-electrons.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <mach/armada-370-xp.h>
|
||||
|
||||
.macro addruart, rp, rv, tmp
|
||||
ldr \rp, =ARMADA_370_XP_REGS_PHYS_BASE
|
||||
ldr \rv, =ARMADA_370_XP_REGS_VIRT_BASE
|
||||
orr \rp, \rp, #0x00012000
|
||||
orr \rv, \rv, #0x00012000
|
||||
.endm
|
||||
|
||||
#define UART_SHIFT 2
|
||||
#include <asm/hardware/debug-8250.S>
|
13
arch/arm/mach-mvebu/include/mach/timex.h
Normal file
13
arch/arm/mach-mvebu/include/mach/timex.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* Marvell Armada SoC time definitions
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define CLOCK_TICK_RATE (100 * HZ)
|
43
arch/arm/mach-mvebu/include/mach/uncompress.h
Normal file
43
arch/arm/mach-mvebu/include/mach/uncompress.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Marvell Armada SoC kernel uncompression UART routines
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
*
|
||||
* 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 <mach/armada-370-xp.h>
|
||||
|
||||
#define UART_THR ((volatile unsigned char *)(ARMADA_370_XP_REGS_PHYS_BASE\
|
||||
+ 0x12000))
|
||||
#define UART_LSR ((volatile unsigned char *)(ARMADA_370_XP_REGS_PHYS_BASE\
|
||||
+ 0x12014))
|
||||
|
||||
#define LSR_THRE 0x20
|
||||
|
||||
static void putc(const char c)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 0x1000; i++) {
|
||||
/* Transmit fifo not full? */
|
||||
if (*UART_LSR & LSR_THRE)
|
||||
break;
|
||||
}
|
||||
|
||||
*UART_THR = c;
|
||||
}
|
||||
|
||||
static void flush(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* nothing to do
|
||||
*/
|
||||
#define arch_decomp_setup()
|
||||
#define arch_decomp_wdog()
|
133
arch/arm/mach-mvebu/irq-armada-370-xp.c
Normal file
133
arch/arm/mach-mvebu/irq-armada-370-xp.c
Normal file
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Marvell Armada 370 and Armada XP SoC IRQ handling
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
* Ben Dooks <ben.dooks@codethink.co.uk>
|
||||
*
|
||||
* 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/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/exception.h>
|
||||
|
||||
/* Interrupt Controller Registers Map */
|
||||
#define ARMADA_370_XP_INT_SET_MASK_OFFS (0x48)
|
||||
#define ARMADA_370_XP_INT_CLEAR_MASK_OFFS (0x4C)
|
||||
|
||||
#define ARMADA_370_XP_INT_CONTROL (0x00)
|
||||
#define ARMADA_370_XP_INT_SET_ENABLE_OFFS (0x30)
|
||||
#define ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS (0x34)
|
||||
|
||||
#define ARMADA_370_XP_CPU_INTACK_OFFS (0x44)
|
||||
|
||||
static void __iomem *per_cpu_int_base;
|
||||
static void __iomem *main_int_base;
|
||||
static struct irq_domain *armada_370_xp_mpic_domain;
|
||||
|
||||
static void armada_370_xp_irq_mask(struct irq_data *d)
|
||||
{
|
||||
writel(irqd_to_hwirq(d),
|
||||
per_cpu_int_base + ARMADA_370_XP_INT_SET_MASK_OFFS);
|
||||
}
|
||||
|
||||
static void armada_370_xp_irq_unmask(struct irq_data *d)
|
||||
{
|
||||
writel(irqd_to_hwirq(d),
|
||||
per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
||||
}
|
||||
|
||||
static struct irq_chip armada_370_xp_irq_chip = {
|
||||
.name = "armada_370_xp_irq",
|
||||
.irq_mask = armada_370_xp_irq_mask,
|
||||
.irq_mask_ack = armada_370_xp_irq_mask,
|
||||
.irq_unmask = armada_370_xp_irq_unmask,
|
||||
};
|
||||
|
||||
static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
|
||||
unsigned int virq, irq_hw_number_t hw)
|
||||
{
|
||||
armada_370_xp_irq_mask(irq_get_irq_data(virq));
|
||||
writel(hw, main_int_base + ARMADA_370_XP_INT_SET_ENABLE_OFFS);
|
||||
|
||||
irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
|
||||
handle_level_irq);
|
||||
irq_set_status_flags(virq, IRQ_LEVEL);
|
||||
set_irq_flags(virq, IRQF_VALID | IRQF_PROBE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_domain_ops armada_370_xp_mpic_irq_ops = {
|
||||
.map = armada_370_xp_mpic_irq_map,
|
||||
.xlate = irq_domain_xlate_onecell,
|
||||
};
|
||||
|
||||
static int __init armada_370_xp_mpic_of_init(struct device_node *node,
|
||||
struct device_node *parent)
|
||||
{
|
||||
u32 control;
|
||||
|
||||
main_int_base = of_iomap(node, 0);
|
||||
per_cpu_int_base = of_iomap(node, 1);
|
||||
|
||||
BUG_ON(!main_int_base);
|
||||
BUG_ON(!per_cpu_int_base);
|
||||
|
||||
control = readl(main_int_base + ARMADA_370_XP_INT_CONTROL);
|
||||
|
||||
armada_370_xp_mpic_domain =
|
||||
irq_domain_add_linear(node, (control >> 2) & 0x3ff,
|
||||
&armada_370_xp_mpic_irq_ops, NULL);
|
||||
|
||||
if (!armada_370_xp_mpic_domain)
|
||||
panic("Unable to add Armada_370_Xp MPIC irq domain (DT)\n");
|
||||
|
||||
irq_set_default_host(armada_370_xp_mpic_domain);
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage void __exception_irq_entry armada_370_xp_handle_irq(struct pt_regs
|
||||
*regs)
|
||||
{
|
||||
u32 irqstat, irqnr;
|
||||
|
||||
do {
|
||||
irqstat = readl_relaxed(per_cpu_int_base +
|
||||
ARMADA_370_XP_CPU_INTACK_OFFS);
|
||||
irqnr = irqstat & 0x3FF;
|
||||
|
||||
if (irqnr < 1023) {
|
||||
irqnr =
|
||||
irq_find_mapping(armada_370_xp_mpic_domain, irqnr);
|
||||
handle_IRQ(irqnr, regs);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static const struct of_device_id mpic_of_match[] __initconst = {
|
||||
{.compatible = "marvell,mpic", .data = armada_370_xp_mpic_of_init},
|
||||
{},
|
||||
};
|
||||
|
||||
void __init armada_370_xp_init_irq(void)
|
||||
{
|
||||
of_irq_init(mpic_of_match);
|
||||
}
|
105
arch/arm/mach-mvebu/system-controller.c
Normal file
105
arch/arm/mach-mvebu/system-controller.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* System controller support for Armada 370 and XP platforms.
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* The Armada 370 and Armada XP SoCs both have a range of
|
||||
* miscellaneous registers, that do not belong to a particular device,
|
||||
* but rather provide system-level features. This basic
|
||||
* system-controller driver provides a device tree binding for those
|
||||
* registers, and implements utility functions offering various
|
||||
* features related to those registers.
|
||||
*
|
||||
* For now, the feature set is limited to restarting the platform by a
|
||||
* soft-reset, but it might be extended in the future.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
static void __iomem *system_controller_base;
|
||||
|
||||
struct mvebu_system_controller {
|
||||
u32 rstoutn_mask_offset;
|
||||
u32 system_soft_reset_offset;
|
||||
|
||||
u32 rstoutn_mask_reset_out_en;
|
||||
u32 system_soft_reset;
|
||||
};
|
||||
static struct mvebu_system_controller *mvebu_sc;
|
||||
|
||||
const struct mvebu_system_controller armada_370_xp_system_controller = {
|
||||
.rstoutn_mask_offset = 0x60,
|
||||
.system_soft_reset_offset = 0x64,
|
||||
.rstoutn_mask_reset_out_en = 0x1,
|
||||
.system_soft_reset = 0x1,
|
||||
};
|
||||
|
||||
const struct mvebu_system_controller orion_system_controller = {
|
||||
.rstoutn_mask_offset = 0x108,
|
||||
.system_soft_reset_offset = 0x10c,
|
||||
.rstoutn_mask_reset_out_en = 0x4,
|
||||
.system_soft_reset = 0x1,
|
||||
};
|
||||
|
||||
static struct of_device_id of_system_controller_table[] = {
|
||||
{
|
||||
.compatible = "marvell,orion-system-controller",
|
||||
.data = (void *) &orion_system_controller,
|
||||
}, {
|
||||
.compatible = "marvell,armada-370-xp-system-controller",
|
||||
.data = (void *) &armada_370_xp_system_controller,
|
||||
},
|
||||
{ /* end of list */ },
|
||||
};
|
||||
|
||||
void mvebu_restart(char mode, const char *cmd)
|
||||
{
|
||||
if (!system_controller_base) {
|
||||
pr_err("Cannot restart, system-controller not available: check the device tree\n");
|
||||
} else {
|
||||
/*
|
||||
* Enable soft reset to assert RSTOUTn.
|
||||
*/
|
||||
writel(mvebu_sc->rstoutn_mask_reset_out_en,
|
||||
system_controller_base +
|
||||
mvebu_sc->rstoutn_mask_offset);
|
||||
/*
|
||||
* Assert soft reset.
|
||||
*/
|
||||
writel(mvebu_sc->system_soft_reset,
|
||||
system_controller_base +
|
||||
mvebu_sc->system_soft_reset_offset);
|
||||
}
|
||||
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
static int __init mvebu_system_controller_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_matching_node(NULL, of_system_controller_table);
|
||||
if (np) {
|
||||
const struct of_device_id *match =
|
||||
of_match_node(of_system_controller_table, np);
|
||||
BUG_ON(!match);
|
||||
system_controller_base = of_iomap(np, 0);
|
||||
mvebu_sc = (struct mvebu_system_controller *)match->data;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(mvebu_system_controller_init);
|
|
@ -16,6 +16,9 @@ config CLKSRC_MMIO
|
|||
config DW_APB_TIMER
|
||||
bool
|
||||
|
||||
config ARMADA_370_XP_TIMER
|
||||
bool
|
||||
|
||||
config CLKSRC_DBX500_PRCMU
|
||||
bool "Clocksource PRCMU Timer"
|
||||
depends on UX500_SOC_DB8500
|
||||
|
|
|
@ -10,4 +10,5 @@ obj-$(CONFIG_EM_TIMER_STI) += em_sti.o
|
|||
obj-$(CONFIG_CLKBLD_I8253) += i8253.o
|
||||
obj-$(CONFIG_CLKSRC_MMIO) += mmio.o
|
||||
obj-$(CONFIG_DW_APB_TIMER) += dw_apb_timer.o
|
||||
obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o
|
||||
obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o
|
||||
obj-$(CONFIG_ARMADA_370_XP_TIMER) += time-armada-370-xp.o
|
||||
|
|
226
drivers/clocksource/time-armada-370-xp.c
Normal file
226
drivers/clocksource/time-armada-370-xp.c
Normal file
|
@ -0,0 +1,226 @@
|
|||
/*
|
||||
* Marvell Armada 370/XP SoC timer handling.
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Timer 0 is used as free-running clocksource, while timer 1 is
|
||||
* used as clock_event_device.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/sched_clock.h>
|
||||
|
||||
/*
|
||||
* Timer block registers.
|
||||
*/
|
||||
#define TIMER_CTRL_OFF 0x0000
|
||||
#define TIMER0_EN 0x0001
|
||||
#define TIMER0_RELOAD_EN 0x0002
|
||||
#define TIMER0_25MHZ 0x0800
|
||||
#define TIMER0_DIV(div) ((div) << 19)
|
||||
#define TIMER1_EN 0x0004
|
||||
#define TIMER1_RELOAD_EN 0x0008
|
||||
#define TIMER1_25MHZ 0x1000
|
||||
#define TIMER1_DIV(div) ((div) << 22)
|
||||
#define TIMER_EVENTS_STATUS 0x0004
|
||||
#define TIMER0_CLR_MASK (~0x1)
|
||||
#define TIMER1_CLR_MASK (~0x100)
|
||||
#define TIMER0_RELOAD_OFF 0x0010
|
||||
#define TIMER0_VAL_OFF 0x0014
|
||||
#define TIMER1_RELOAD_OFF 0x0018
|
||||
#define TIMER1_VAL_OFF 0x001c
|
||||
|
||||
/* Global timers are connected to the coherency fabric clock, and the
|
||||
below divider reduces their incrementing frequency. */
|
||||
#define TIMER_DIVIDER_SHIFT 5
|
||||
#define TIMER_DIVIDER (1 << TIMER_DIVIDER_SHIFT)
|
||||
|
||||
/*
|
||||
* SoC-specific data.
|
||||
*/
|
||||
static void __iomem *timer_base;
|
||||
static int timer_irq;
|
||||
|
||||
/*
|
||||
* Number of timer ticks per jiffy.
|
||||
*/
|
||||
static u32 ticks_per_jiffy;
|
||||
|
||||
static u32 notrace armada_370_xp_read_sched_clock(void)
|
||||
{
|
||||
return ~readl(timer_base + TIMER0_VAL_OFF);
|
||||
}
|
||||
|
||||
/*
|
||||
* Clockevent handling.
|
||||
*/
|
||||
static int
|
||||
armada_370_xp_clkevt_next_event(unsigned long delta,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
u32 u;
|
||||
|
||||
/*
|
||||
* Clear clockevent timer interrupt.
|
||||
*/
|
||||
writel(TIMER1_CLR_MASK, timer_base + TIMER_EVENTS_STATUS);
|
||||
|
||||
/*
|
||||
* Setup new clockevent timer value.
|
||||
*/
|
||||
writel(delta, timer_base + TIMER1_VAL_OFF);
|
||||
|
||||
/*
|
||||
* Enable the timer.
|
||||
*/
|
||||
u = readl(timer_base + TIMER_CTRL_OFF);
|
||||
u = ((u & ~TIMER1_RELOAD_EN) | TIMER1_EN |
|
||||
TIMER1_DIV(TIMER_DIVIDER_SHIFT));
|
||||
writel(u, timer_base + TIMER_CTRL_OFF);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
armada_370_xp_clkevt_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
u32 u;
|
||||
|
||||
if (mode == CLOCK_EVT_MODE_PERIODIC) {
|
||||
/*
|
||||
* Setup timer to fire at 1/HZ intervals.
|
||||
*/
|
||||
writel(ticks_per_jiffy - 1, timer_base + TIMER1_RELOAD_OFF);
|
||||
writel(ticks_per_jiffy - 1, timer_base + TIMER1_VAL_OFF);
|
||||
|
||||
/*
|
||||
* Enable timer.
|
||||
*/
|
||||
u = readl(timer_base + TIMER_CTRL_OFF);
|
||||
|
||||
writel((u | TIMER1_EN | TIMER1_RELOAD_EN |
|
||||
TIMER1_DIV(TIMER_DIVIDER_SHIFT)),
|
||||
timer_base + TIMER_CTRL_OFF);
|
||||
} else {
|
||||
/*
|
||||
* Disable timer.
|
||||
*/
|
||||
u = readl(timer_base + TIMER_CTRL_OFF);
|
||||
writel(u & ~TIMER1_EN, timer_base + TIMER_CTRL_OFF);
|
||||
|
||||
/*
|
||||
* ACK pending timer interrupt.
|
||||
*/
|
||||
writel(TIMER1_CLR_MASK, timer_base + TIMER_EVENTS_STATUS);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device armada_370_xp_clkevt = {
|
||||
.name = "armada_370_xp_tick",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
|
||||
.shift = 32,
|
||||
.rating = 300,
|
||||
.set_next_event = armada_370_xp_clkevt_next_event,
|
||||
.set_mode = armada_370_xp_clkevt_mode,
|
||||
};
|
||||
|
||||
static irqreturn_t armada_370_xp_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
/*
|
||||
* ACK timer interrupt and call event handler.
|
||||
*/
|
||||
|
||||
writel(TIMER1_CLR_MASK, timer_base + TIMER_EVENTS_STATUS);
|
||||
armada_370_xp_clkevt.event_handler(&armada_370_xp_clkevt);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction armada_370_xp_timer_irq = {
|
||||
.name = "armada_370_xp_tick",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER,
|
||||
.handler = armada_370_xp_timer_interrupt
|
||||
};
|
||||
|
||||
void __init armada_370_xp_timer_init(void)
|
||||
{
|
||||
u32 u;
|
||||
struct device_node *np;
|
||||
unsigned int timer_clk;
|
||||
int ret;
|
||||
np = of_find_compatible_node(NULL, NULL, "marvell,armada-370-xp-timer");
|
||||
timer_base = of_iomap(np, 0);
|
||||
WARN_ON(!timer_base);
|
||||
|
||||
if (of_find_property(np, "marvell,timer-25Mhz", NULL)) {
|
||||
/* The fixed 25MHz timer is available so let's use it */
|
||||
u = readl(timer_base + TIMER_CTRL_OFF);
|
||||
writel(u | TIMER0_25MHZ | TIMER1_25MHZ,
|
||||
timer_base + TIMER_CTRL_OFF);
|
||||
timer_clk = 25000000;
|
||||
} else {
|
||||
u32 clk = 0;
|
||||
ret = of_property_read_u32(np, "clock-frequency", &clk);
|
||||
WARN_ON(!clk || ret < 0);
|
||||
u = readl(timer_base + TIMER_CTRL_OFF);
|
||||
writel(u & ~(TIMER0_25MHZ | TIMER1_25MHZ),
|
||||
timer_base + TIMER_CTRL_OFF);
|
||||
timer_clk = clk / TIMER_DIVIDER;
|
||||
}
|
||||
|
||||
/* We use timer 0 as clocksource, and timer 1 for
|
||||
clockevents */
|
||||
timer_irq = irq_of_parse_and_map(np, 1);
|
||||
|
||||
ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;
|
||||
|
||||
/*
|
||||
* Set scale and timer for sched_clock.
|
||||
*/
|
||||
setup_sched_clock(armada_370_xp_read_sched_clock, 32, timer_clk);
|
||||
|
||||
/*
|
||||
* Setup free-running clocksource timer (interrupts
|
||||
* disabled).
|
||||
*/
|
||||
writel(0xffffffff, timer_base + TIMER0_VAL_OFF);
|
||||
writel(0xffffffff, timer_base + TIMER0_RELOAD_OFF);
|
||||
|
||||
u = readl(timer_base + TIMER_CTRL_OFF);
|
||||
|
||||
writel((u | TIMER0_EN | TIMER0_RELOAD_EN |
|
||||
TIMER0_DIV(TIMER_DIVIDER_SHIFT)), timer_base + TIMER_CTRL_OFF);
|
||||
|
||||
clocksource_mmio_init(timer_base + TIMER0_VAL_OFF,
|
||||
"armada_370_xp_clocksource",
|
||||
timer_clk, 300, 32, clocksource_mmio_readl_down);
|
||||
|
||||
/*
|
||||
* Setup clockevent timer (interrupt-driven).
|
||||
*/
|
||||
setup_irq(timer_irq, &armada_370_xp_timer_irq);
|
||||
armada_370_xp_clkevt.cpumask = cpumask_of(0);
|
||||
clockevents_config_and_register(&armada_370_xp_clkevt,
|
||||
timer_clk, 1, 0xfffffffe);
|
||||
}
|
||||
|
18
include/linux/time-armada-370-xp.h
Normal file
18
include/linux/time-armada-370-xp.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Marvell Armada 370/XP SoC timer handling.
|
||||
*
|
||||
* Copyright (C) 2012 Marvell
|
||||
*
|
||||
* Lior Amsalem <alior@marvell.com>
|
||||
* Gregory CLEMENT <gregory.clement@free-electrons.com>
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
*
|
||||
*/
|
||||
#ifndef __TIME_ARMADA_370_XPPRCMU_H
|
||||
#define __TIME_ARMADA_370_XPPRCMU_H
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
void __init armada_370_xp_timer_init(void);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user