Merge branch 'prima2/multiplatform' into next/multiplatform
This series enables multiplatform support on the SIRF prima2/marco/atlas6 platform. The code was already quite tidy, so this is a relatively simple change, and it follows similar changes we made to other ARMv7 based platforms recently. * prima2/multiplatform: ARM: sirf: enable support in multi_v7_defconfig ARM: sirf: enable multiplatform support ARM: sirf: use clocksource_of infrastructure ARM: sirf: move debug-macro.S to include/debug/sirf.S ARM: sirf: enable sparse IRQ ARM: sirf: move irq driver to drivers/irqchip ARM: sirf: fix prima2 interrupt lookup pinctrl: sirf: convert to linear irq domain clocksource: make CLOCKSOURCE_OF_DECLARE type safe ARM/dts: prima2: add .dtsi for atlas6 and .dts for atla6-evb board arm: prima2: add new SiRFatlas6 machine in common board ARM: smp_twd: convert to use CLKSRC_OF init clocksource: tegra20: use the device_node pointer passed to init clocksource: pass DT node pointer to init functions clocksource: add empty version of clocksource_of_init Conflicts: arch/arm/configs/multi_v7_defconfig arch/arm/mach-spear/spear13xx.c Tested-by: Barry Song <Barry.Song@csr.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
063ab6daeb
|
@ -49,7 +49,6 @@ config ARM
|
||||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||||
select HAVE_SYSCALL_TRACEPOINTS
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
select HAVE_UID16
|
select HAVE_UID16
|
||||||
select HAVE_VIRT_TO_BUS
|
|
||||||
select KTIME_SCALAR
|
select KTIME_SCALAR
|
||||||
select PERF_USE_VMALLOC
|
select PERF_USE_VMALLOC
|
||||||
select RTC_LIB
|
select RTC_LIB
|
||||||
|
@ -404,21 +403,6 @@ config ARCH_GEMINI
|
||||||
help
|
help
|
||||||
Support for the Cortina Systems Gemini family SoCs
|
Support for the Cortina Systems Gemini family SoCs
|
||||||
|
|
||||||
config ARCH_SIRF
|
|
||||||
bool "CSR SiRF"
|
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
|
||||||
select AUTO_ZRELADDR
|
|
||||||
select COMMON_CLK
|
|
||||||
select GENERIC_CLOCKEVENTS
|
|
||||||
select GENERIC_IRQ_CHIP
|
|
||||||
select MIGHT_HAVE_CACHE_L2X0
|
|
||||||
select NO_IOPORT
|
|
||||||
select PINCTRL
|
|
||||||
select PINCTRL_SIRF
|
|
||||||
select USE_OF
|
|
||||||
help
|
|
||||||
Support for CSR SiRFprimaII/Marco/Polo platforms
|
|
||||||
|
|
||||||
config ARCH_EBSA110
|
config ARCH_EBSA110
|
||||||
bool "EBSA-110"
|
bool "EBSA-110"
|
||||||
select ARCH_USES_GETTIMEOFFSET
|
select ARCH_USES_GETTIMEOFFSET
|
||||||
|
@ -1557,6 +1541,7 @@ config HAVE_ARM_ARCH_TIMER
|
||||||
config HAVE_ARM_TWD
|
config HAVE_ARM_TWD
|
||||||
bool
|
bool
|
||||||
depends on SMP
|
depends on SMP
|
||||||
|
select CLKSRC_OF if OF
|
||||||
help
|
help
|
||||||
This options enables support for the ARM timer and watchdog unit
|
This options enables support for the ARM timer and watchdog unit
|
||||||
|
|
||||||
|
|
|
@ -608,6 +608,7 @@ config DEBUG_LL_INCLUDE
|
||||||
default "debug/nomadik.S" if DEBUG_NOMADIK_UART
|
default "debug/nomadik.S" if DEBUG_NOMADIK_UART
|
||||||
default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
|
default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
|
||||||
default "debug/picoxcell.S" if DEBUG_PICOXCELL_UART
|
default "debug/picoxcell.S" if DEBUG_PICOXCELL_UART
|
||||||
|
default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1
|
||||||
default "debug/socfpga.S" if DEBUG_SOCFPGA_UART
|
default "debug/socfpga.S" if DEBUG_SOCFPGA_UART
|
||||||
default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1
|
default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1
|
||||||
default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \
|
default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* DTS file for CSR SiRFatlas6 Evaluation Board
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
|
||||||
|
*
|
||||||
|
* Licensed under GPLv2 or later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/include/ "atlas6.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "CSR SiRFatlas6 Evaluation Board";
|
||||||
|
compatible = "sirf,atlas6-cb", "sirf,atlas6";
|
||||||
|
|
||||||
|
memory {
|
||||||
|
reg = <0x00000000 0x20000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
axi {
|
||||||
|
peri-iobg {
|
||||||
|
uart@b0060000 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&uart1_pins_a>;
|
||||||
|
};
|
||||||
|
spi@b00d0000 {
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&spi0_pins_a>;
|
||||||
|
spi@0 {
|
||||||
|
compatible = "spidev";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <1000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
spi@b0170000 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&spi1_pins_a>;
|
||||||
|
};
|
||||||
|
i2c0: i2c@b00e0000 {
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&i2c0_pins_a>;
|
||||||
|
lcd@40 {
|
||||||
|
compatible = "sirf,lcd";
|
||||||
|
reg = <0x40>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
disp-iobg {
|
||||||
|
lcd@90010000 {
|
||||||
|
status = "okay";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&lcd_24pins_a>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
display: display@0 {
|
||||||
|
panels {
|
||||||
|
panel0: panel@0 {
|
||||||
|
panel-name = "Innolux TFT";
|
||||||
|
hactive = <800>;
|
||||||
|
vactive = <480>;
|
||||||
|
left_margin = <20>;
|
||||||
|
right_margin = <234>;
|
||||||
|
upper_margin = <3>;
|
||||||
|
lower_margin = <41>;
|
||||||
|
hsync_len = <3>;
|
||||||
|
vsync_len = <2>;
|
||||||
|
pixclock = <33264000>;
|
||||||
|
sync = <3>;
|
||||||
|
timing = <0x88>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,668 @@
|
||||||
|
/*
|
||||||
|
* DTS file for CSR SiRFatlas6 SoC
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
|
||||||
|
*
|
||||||
|
* Licensed under GPLv2 or later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/include/ "skeleton.dtsi"
|
||||||
|
/ {
|
||||||
|
compatible = "sirf,atlas6";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
cpu@0 {
|
||||||
|
reg = <0x0>;
|
||||||
|
d-cache-line-size = <32>;
|
||||||
|
i-cache-line-size = <32>;
|
||||||
|
d-cache-size = <32768>;
|
||||||
|
i-cache-size = <32768>;
|
||||||
|
/* from bootloader */
|
||||||
|
timebase-frequency = <0>;
|
||||||
|
bus-frequency = <0>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
axi {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x40000000 0x40000000 0x80000000>;
|
||||||
|
|
||||||
|
intc: interrupt-controller@80020000 {
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-controller;
|
||||||
|
compatible = "sirf,prima2-intc";
|
||||||
|
reg = <0x80020000 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sys-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x88000000 0x88000000 0x40000>;
|
||||||
|
|
||||||
|
clks: clock-controller@88000000 {
|
||||||
|
compatible = "sirf,atlas6-clkc";
|
||||||
|
reg = <0x88000000 0x1000>;
|
||||||
|
interrupts = <3>;
|
||||||
|
#clock-cells = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reset-controller@88010000 {
|
||||||
|
compatible = "sirf,prima2-rstc";
|
||||||
|
reg = <0x88010000 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
rsc-controller@88020000 {
|
||||||
|
compatible = "sirf,prima2-rsc";
|
||||||
|
reg = <0x88020000 0x1000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mem-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x90000000 0x90000000 0x10000>;
|
||||||
|
|
||||||
|
memory-controller@90000000 {
|
||||||
|
compatible = "sirf,prima2-memc";
|
||||||
|
reg = <0x90000000 0x10000>;
|
||||||
|
interrupts = <27>;
|
||||||
|
clocks = <&clks 5>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
disp-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x90010000 0x90010000 0x30000>;
|
||||||
|
|
||||||
|
lcd@90010000 {
|
||||||
|
compatible = "sirf,prima2-lcd";
|
||||||
|
reg = <0x90010000 0x20000>;
|
||||||
|
interrupts = <30>;
|
||||||
|
clocks = <&clks 34>;
|
||||||
|
display=<&display>;
|
||||||
|
/* later transfer to pwm */
|
||||||
|
bl-gpio = <&gpio 7 0>;
|
||||||
|
default-panel = <&panel0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vpp@90020000 {
|
||||||
|
compatible = "sirf,prima2-vpp";
|
||||||
|
reg = <0x90020000 0x10000>;
|
||||||
|
interrupts = <31>;
|
||||||
|
clocks = <&clks 35>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
graphics-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x98000000 0x98000000 0x8000000>;
|
||||||
|
|
||||||
|
graphics@98000000 {
|
||||||
|
compatible = "powervr,sgx510";
|
||||||
|
reg = <0x98000000 0x8000000>;
|
||||||
|
interrupts = <6>;
|
||||||
|
clocks = <&clks 32>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dsp-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0xa8000000 0xa8000000 0x2000000>;
|
||||||
|
|
||||||
|
dspif@a8000000 {
|
||||||
|
compatible = "sirf,prima2-dspif";
|
||||||
|
reg = <0xa8000000 0x10000>;
|
||||||
|
interrupts = <9>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gps@a8010000 {
|
||||||
|
compatible = "sirf,prima2-gps";
|
||||||
|
reg = <0xa8010000 0x10000>;
|
||||||
|
interrupts = <7>;
|
||||||
|
clocks = <&clks 9>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dsp@a9000000 {
|
||||||
|
compatible = "sirf,prima2-dsp";
|
||||||
|
reg = <0xa9000000 0x1000000>;
|
||||||
|
interrupts = <8>;
|
||||||
|
clocks = <&clks 8>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
peri-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0xb0000000 0xb0000000 0x180000>,
|
||||||
|
<0x56000000 0x56000000 0x1b00000>;
|
||||||
|
|
||||||
|
timer@b0020000 {
|
||||||
|
compatible = "sirf,prima2-tick";
|
||||||
|
reg = <0xb0020000 0x1000>;
|
||||||
|
interrupts = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
nand@b0030000 {
|
||||||
|
compatible = "sirf,prima2-nand";
|
||||||
|
reg = <0xb0030000 0x10000>;
|
||||||
|
interrupts = <41>;
|
||||||
|
clocks = <&clks 26>;
|
||||||
|
};
|
||||||
|
|
||||||
|
audio@b0040000 {
|
||||||
|
compatible = "sirf,prima2-audio";
|
||||||
|
reg = <0xb0040000 0x10000>;
|
||||||
|
interrupts = <35>;
|
||||||
|
clocks = <&clks 27>;
|
||||||
|
};
|
||||||
|
|
||||||
|
uart0: uart@b0050000 {
|
||||||
|
cell-index = <0>;
|
||||||
|
compatible = "sirf,prima2-uart";
|
||||||
|
reg = <0xb0050000 0x1000>;
|
||||||
|
interrupts = <17>;
|
||||||
|
fifosize = <128>;
|
||||||
|
clocks = <&clks 13>;
|
||||||
|
};
|
||||||
|
|
||||||
|
uart1: uart@b0060000 {
|
||||||
|
cell-index = <1>;
|
||||||
|
compatible = "sirf,prima2-uart";
|
||||||
|
reg = <0xb0060000 0x1000>;
|
||||||
|
interrupts = <18>;
|
||||||
|
fifosize = <32>;
|
||||||
|
clocks = <&clks 14>;
|
||||||
|
};
|
||||||
|
|
||||||
|
uart2: uart@b0070000 {
|
||||||
|
cell-index = <2>;
|
||||||
|
compatible = "sirf,prima2-uart";
|
||||||
|
reg = <0xb0070000 0x1000>;
|
||||||
|
interrupts = <19>;
|
||||||
|
fifosize = <128>;
|
||||||
|
clocks = <&clks 15>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usp0: usp@b0080000 {
|
||||||
|
cell-index = <0>;
|
||||||
|
compatible = "sirf,prima2-usp";
|
||||||
|
reg = <0xb0080000 0x10000>;
|
||||||
|
interrupts = <20>;
|
||||||
|
clocks = <&clks 28>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usp1: usp@b0090000 {
|
||||||
|
cell-index = <1>;
|
||||||
|
compatible = "sirf,prima2-usp";
|
||||||
|
reg = <0xb0090000 0x10000>;
|
||||||
|
interrupts = <21>;
|
||||||
|
clocks = <&clks 29>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dmac0: dma-controller@b00b0000 {
|
||||||
|
cell-index = <0>;
|
||||||
|
compatible = "sirf,prima2-dmac";
|
||||||
|
reg = <0xb00b0000 0x10000>;
|
||||||
|
interrupts = <12>;
|
||||||
|
clocks = <&clks 24>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dmac1: dma-controller@b0160000 {
|
||||||
|
cell-index = <1>;
|
||||||
|
compatible = "sirf,prima2-dmac";
|
||||||
|
reg = <0xb0160000 0x10000>;
|
||||||
|
interrupts = <13>;
|
||||||
|
clocks = <&clks 25>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vip@b00C0000 {
|
||||||
|
compatible = "sirf,prima2-vip";
|
||||||
|
reg = <0xb00C0000 0x10000>;
|
||||||
|
clocks = <&clks 31>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi0: spi@b00d0000 {
|
||||||
|
cell-index = <0>;
|
||||||
|
compatible = "sirf,prima2-spi";
|
||||||
|
reg = <0xb00d0000 0x10000>;
|
||||||
|
interrupts = <15>;
|
||||||
|
sirf,spi-num-chipselects = <1>;
|
||||||
|
cs-gpios = <&gpio 0 0>;
|
||||||
|
sirf,spi-dma-rx-channel = <25>;
|
||||||
|
sirf,spi-dma-tx-channel = <20>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
clocks = <&clks 19>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
spi1: spi@b0170000 {
|
||||||
|
cell-index = <1>;
|
||||||
|
compatible = "sirf,prima2-spi";
|
||||||
|
reg = <0xb0170000 0x10000>;
|
||||||
|
interrupts = <16>;
|
||||||
|
clocks = <&clks 20>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c0: i2c@b00e0000 {
|
||||||
|
cell-index = <0>;
|
||||||
|
compatible = "sirf,prima2-i2c";
|
||||||
|
reg = <0xb00e0000 0x10000>;
|
||||||
|
interrupts = <24>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
clocks = <&clks 17>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2c1: i2c@b00f0000 {
|
||||||
|
cell-index = <1>;
|
||||||
|
compatible = "sirf,prima2-i2c";
|
||||||
|
reg = <0xb00f0000 0x10000>;
|
||||||
|
interrupts = <25>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
clocks = <&clks 18>;
|
||||||
|
};
|
||||||
|
|
||||||
|
tsc@b0110000 {
|
||||||
|
compatible = "sirf,prima2-tsc";
|
||||||
|
reg = <0xb0110000 0x10000>;
|
||||||
|
interrupts = <33>;
|
||||||
|
clocks = <&clks 16>;
|
||||||
|
};
|
||||||
|
|
||||||
|
gpio: pinctrl@b0120000 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
compatible = "sirf,atlas6-pinctrl";
|
||||||
|
reg = <0xb0120000 0x10000>;
|
||||||
|
interrupts = <43 44 45 46 47>;
|
||||||
|
gpio-controller;
|
||||||
|
interrupt-controller;
|
||||||
|
|
||||||
|
lcd_16pins_a: lcd0@0 {
|
||||||
|
lcd {
|
||||||
|
sirf,pins = "lcd_16bitsgrp";
|
||||||
|
sirf,function = "lcd_16bits";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
lcd_18pins_a: lcd0@1 {
|
||||||
|
lcd {
|
||||||
|
sirf,pins = "lcd_18bitsgrp";
|
||||||
|
sirf,function = "lcd_18bits";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
lcd_24pins_a: lcd0@2 {
|
||||||
|
lcd {
|
||||||
|
sirf,pins = "lcd_24bitsgrp";
|
||||||
|
sirf,function = "lcd_24bits";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
lcdrom_pins_a: lcdrom0@0 {
|
||||||
|
lcd {
|
||||||
|
sirf,pins = "lcdromgrp";
|
||||||
|
sirf,function = "lcdrom";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uart0_pins_a: uart0@0 {
|
||||||
|
uart {
|
||||||
|
sirf,pins = "uart0grp";
|
||||||
|
sirf,function = "uart0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uart1_pins_a: uart1@0 {
|
||||||
|
uart {
|
||||||
|
sirf,pins = "uart1grp";
|
||||||
|
sirf,function = "uart1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uart2_pins_a: uart2@0 {
|
||||||
|
uart {
|
||||||
|
sirf,pins = "uart2grp";
|
||||||
|
sirf,function = "uart2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
uart2_noflow_pins_a: uart2@1 {
|
||||||
|
uart {
|
||||||
|
sirf,pins = "uart2_nostreamctrlgrp";
|
||||||
|
sirf,function = "uart2_nostreamctrl";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
spi0_pins_a: spi0@0 {
|
||||||
|
spi {
|
||||||
|
sirf,pins = "spi0grp";
|
||||||
|
sirf,function = "spi0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
spi1_pins_a: spi1@0 {
|
||||||
|
spi {
|
||||||
|
sirf,pins = "spi1grp";
|
||||||
|
sirf,function = "spi1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
i2c0_pins_a: i2c0@0 {
|
||||||
|
i2c {
|
||||||
|
sirf,pins = "i2c0grp";
|
||||||
|
sirf,function = "i2c0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
i2c1_pins_a: i2c1@0 {
|
||||||
|
i2c {
|
||||||
|
sirf,pins = "i2c1grp";
|
||||||
|
sirf,function = "i2c1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pwm0_pins_a: pwm0@0 {
|
||||||
|
pwm {
|
||||||
|
sirf,pins = "pwm0grp";
|
||||||
|
sirf,function = "pwm0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pwm1_pins_a: pwm1@0 {
|
||||||
|
pwm {
|
||||||
|
sirf,pins = "pwm1grp";
|
||||||
|
sirf,function = "pwm1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pwm2_pins_a: pwm2@0 {
|
||||||
|
pwm {
|
||||||
|
sirf,pins = "pwm2grp";
|
||||||
|
sirf,function = "pwm2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pwm3_pins_a: pwm3@0 {
|
||||||
|
pwm {
|
||||||
|
sirf,pins = "pwm3grp";
|
||||||
|
sirf,function = "pwm3";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pwm4_pins_a: pwm4@0 {
|
||||||
|
pwm {
|
||||||
|
sirf,pins = "pwm4grp";
|
||||||
|
sirf,function = "pwm4";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
gps_pins_a: gps@0 {
|
||||||
|
gps {
|
||||||
|
sirf,pins = "gpsgrp";
|
||||||
|
sirf,function = "gps";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
vip_pins_a: vip@0 {
|
||||||
|
vip {
|
||||||
|
sirf,pins = "vipgrp";
|
||||||
|
sirf,function = "vip";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sdmmc0_pins_a: sdmmc0@0 {
|
||||||
|
sdmmc0 {
|
||||||
|
sirf,pins = "sdmmc0grp";
|
||||||
|
sirf,function = "sdmmc0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sdmmc1_pins_a: sdmmc1@0 {
|
||||||
|
sdmmc1 {
|
||||||
|
sirf,pins = "sdmmc1grp";
|
||||||
|
sirf,function = "sdmmc1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sdmmc2_pins_a: sdmmc2@0 {
|
||||||
|
sdmmc2 {
|
||||||
|
sirf,pins = "sdmmc2grp";
|
||||||
|
sirf,function = "sdmmc2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sdmmc2_nowp_pins_a: sdmmc2_nowp@0 {
|
||||||
|
sdmmc2_nowp {
|
||||||
|
sirf,pins = "sdmmc2_nowpgrp";
|
||||||
|
sirf,function = "sdmmc2_nowp";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sdmmc3_pins_a: sdmmc3@0 {
|
||||||
|
sdmmc3 {
|
||||||
|
sirf,pins = "sdmmc3grp";
|
||||||
|
sirf,function = "sdmmc3";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sdmmc5_pins_a: sdmmc5@0 {
|
||||||
|
sdmmc5 {
|
||||||
|
sirf,pins = "sdmmc5grp";
|
||||||
|
sirf,function = "sdmmc5";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
i2s_pins_a: i2s@0 {
|
||||||
|
i2s {
|
||||||
|
sirf,pins = "i2sgrp";
|
||||||
|
sirf,function = "i2s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
i2s_no_din_pins_a: i2s_no_din@0 {
|
||||||
|
i2s_no_din {
|
||||||
|
sirf,pins = "i2s_no_dingrp";
|
||||||
|
sirf,function = "i2s_no_din";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
i2s_6chn_pins_a: i2s_6chn@0 {
|
||||||
|
i2s_6chn {
|
||||||
|
sirf,pins = "i2s_6chngrp";
|
||||||
|
sirf,function = "i2s_6chn";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ac97_pins_a: ac97@0 {
|
||||||
|
ac97 {
|
||||||
|
sirf,pins = "ac97grp";
|
||||||
|
sirf,function = "ac97";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
nand_pins_a: nand@0 {
|
||||||
|
nand {
|
||||||
|
sirf,pins = "nandgrp";
|
||||||
|
sirf,function = "nand";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
usp0_pins_a: usp0@0 {
|
||||||
|
usp0 {
|
||||||
|
sirf,pins = "usp0grp";
|
||||||
|
sirf,function = "usp0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
usp1_pins_a: usp1@0 {
|
||||||
|
usp1 {
|
||||||
|
sirf,pins = "usp1grp";
|
||||||
|
sirf,function = "usp1";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
usb0_upli_drvbus_pins_a: usb0_upli_drvbus@0 {
|
||||||
|
usb0_upli_drvbus {
|
||||||
|
sirf,pins = "usb0_upli_drvbusgrp";
|
||||||
|
sirf,function = "usb0_upli_drvbus";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
usb1_utmi_drvbus_pins_a: usb1_utmi_drvbus@0 {
|
||||||
|
usb1_utmi_drvbus {
|
||||||
|
sirf,pins = "usb1_utmi_drvbusgrp";
|
||||||
|
sirf,function = "usb1_utmi_drvbus";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
warm_rst_pins_a: warm_rst@0 {
|
||||||
|
warm_rst {
|
||||||
|
sirf,pins = "warm_rstgrp";
|
||||||
|
sirf,function = "warm_rst";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pulse_count_pins_a: pulse_count@0 {
|
||||||
|
pulse_count {
|
||||||
|
sirf,pins = "pulse_countgrp";
|
||||||
|
sirf,function = "pulse_count";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cko0_rst_pins_a: cko0_rst@0 {
|
||||||
|
cko0_rst {
|
||||||
|
sirf,pins = "cko0_rstgrp";
|
||||||
|
sirf,function = "cko0_rst";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cko1_rst_pins_a: cko1_rst@0 {
|
||||||
|
cko1_rst {
|
||||||
|
sirf,pins = "cko1_rstgrp";
|
||||||
|
sirf,function = "cko1_rst";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pwm@b0130000 {
|
||||||
|
compatible = "sirf,prima2-pwm";
|
||||||
|
reg = <0xb0130000 0x10000>;
|
||||||
|
clocks = <&clks 21>;
|
||||||
|
};
|
||||||
|
|
||||||
|
efusesys@b0140000 {
|
||||||
|
compatible = "sirf,prima2-efuse";
|
||||||
|
reg = <0xb0140000 0x10000>;
|
||||||
|
clocks = <&clks 22>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pulsec@b0150000 {
|
||||||
|
compatible = "sirf,prima2-pulsec";
|
||||||
|
reg = <0xb0150000 0x10000>;
|
||||||
|
interrupts = <48>;
|
||||||
|
clocks = <&clks 23>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pci-iobg {
|
||||||
|
compatible = "sirf,prima2-pciiobg", "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0x56000000 0x56000000 0x1b00000>;
|
||||||
|
|
||||||
|
sd0: sdhci@56000000 {
|
||||||
|
cell-index = <0>;
|
||||||
|
compatible = "sirf,prima2-sdhc";
|
||||||
|
reg = <0x56000000 0x100000>;
|
||||||
|
interrupts = <38>;
|
||||||
|
bus-width = <8>;
|
||||||
|
clocks = <&clks 36>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sd1: sdhci@56100000 {
|
||||||
|
cell-index = <1>;
|
||||||
|
compatible = "sirf,prima2-sdhc";
|
||||||
|
reg = <0x56100000 0x100000>;
|
||||||
|
interrupts = <38>;
|
||||||
|
status = "disabled";
|
||||||
|
clocks = <&clks 36>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sd2: sdhci@56200000 {
|
||||||
|
cell-index = <2>;
|
||||||
|
compatible = "sirf,prima2-sdhc";
|
||||||
|
reg = <0x56200000 0x100000>;
|
||||||
|
interrupts = <23>;
|
||||||
|
status = "disabled";
|
||||||
|
clocks = <&clks 37>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sd3: sdhci@56300000 {
|
||||||
|
cell-index = <3>;
|
||||||
|
compatible = "sirf,prima2-sdhc";
|
||||||
|
reg = <0x56300000 0x100000>;
|
||||||
|
interrupts = <23>;
|
||||||
|
status = "disabled";
|
||||||
|
clocks = <&clks 37>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sd5: sdhci@56500000 {
|
||||||
|
cell-index = <5>;
|
||||||
|
compatible = "sirf,prima2-sdhc";
|
||||||
|
reg = <0x56500000 0x100000>;
|
||||||
|
interrupts = <39>;
|
||||||
|
status = "disabled";
|
||||||
|
clocks = <&clks 38>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pci-copy@57900000 {
|
||||||
|
compatible = "sirf,prima2-pcicp";
|
||||||
|
reg = <0x57900000 0x100000>;
|
||||||
|
interrupts = <40>;
|
||||||
|
};
|
||||||
|
|
||||||
|
rom-interface@57a00000 {
|
||||||
|
compatible = "sirf,prima2-romif";
|
||||||
|
reg = <0x57a00000 0x100000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
rtc-iobg {
|
||||||
|
compatible = "sirf,prima2-rtciobg", "sirf-prima2-rtciobg-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
reg = <0x80030000 0x10000>;
|
||||||
|
|
||||||
|
gpsrtc@1000 {
|
||||||
|
compatible = "sirf,prima2-gpsrtc";
|
||||||
|
reg = <0x1000 0x1000>;
|
||||||
|
interrupts = <55 56 57>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sysrtc@2000 {
|
||||||
|
compatible = "sirf,prima2-sysrtc";
|
||||||
|
reg = <0x2000 0x1000>;
|
||||||
|
interrupts = <52 53 54>;
|
||||||
|
};
|
||||||
|
|
||||||
|
pwrc@3000 {
|
||||||
|
compatible = "sirf,prima2-pwrc";
|
||||||
|
reg = <0x3000 0x1000>;
|
||||||
|
interrupts = <32>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uus-iobg {
|
||||||
|
compatible = "simple-bus";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges = <0xb8000000 0xb8000000 0x40000>;
|
||||||
|
|
||||||
|
usb0: usb@b00e0000 {
|
||||||
|
compatible = "chipidea,ci13611a-prima2";
|
||||||
|
reg = <0xb8000000 0x10000>;
|
||||||
|
interrupts = <10>;
|
||||||
|
clocks = <&clks 40>;
|
||||||
|
};
|
||||||
|
|
||||||
|
usb1: usb@b00f0000 {
|
||||||
|
compatible = "chipidea,ci13611a-prima2";
|
||||||
|
reg = <0xb8010000 0x10000>;
|
||||||
|
interrupts = <11>;
|
||||||
|
clocks = <&clks 41>;
|
||||||
|
};
|
||||||
|
|
||||||
|
security@b00f0000 {
|
||||||
|
compatible = "sirf,prima2-security";
|
||||||
|
reg = <0xb8030000 0x10000>;
|
||||||
|
interrupts = <42>;
|
||||||
|
clocks = <&clks 7>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -3,6 +3,7 @@ CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_ARCH_MVEBU=y
|
CONFIG_ARCH_MVEBU=y
|
||||||
CONFIG_MACH_ARMADA_370=y
|
CONFIG_MACH_ARMADA_370=y
|
||||||
|
CONFIG_ARCH_SIRF=y
|
||||||
CONFIG_MACH_ARMADA_XP=y
|
CONFIG_MACH_ARMADA_XP=y
|
||||||
CONFIG_ARCH_HIGHBANK=y
|
CONFIG_ARCH_HIGHBANK=y
|
||||||
CONFIG_ARCH_SOCFPGA=y
|
CONFIG_ARCH_SOCFPGA=y
|
||||||
|
@ -40,12 +41,16 @@ CONFIG_KEYBOARD_SPEAR=y
|
||||||
CONFIG_SERIAL_AMBA_PL011=y
|
CONFIG_SERIAL_AMBA_PL011=y
|
||||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||||
CONFIG_SERIAL_OF_PLATFORM=y
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
|
CONFIG_SERIAL_SIRFSOC=y
|
||||||
|
CONFIG_SERIAL_SIRFSOC_CONSOLE=y
|
||||||
CONFIG_IPMI_HANDLER=y
|
CONFIG_IPMI_HANDLER=y
|
||||||
CONFIG_IPMI_SI=y
|
CONFIG_IPMI_SI=y
|
||||||
CONFIG_I2C=y
|
CONFIG_I2C=y
|
||||||
CONFIG_I2C_DESIGNWARE_PLATFORM=y
|
CONFIG_I2C_DESIGNWARE_PLATFORM=y
|
||||||
|
CONFIG_I2C_SIRF=y
|
||||||
CONFIG_SPI=y
|
CONFIG_SPI=y
|
||||||
CONFIG_SPI_PL022=y
|
CONFIG_SPI_PL022=y
|
||||||
|
CONFIG_SPI_SIRF=y
|
||||||
CONFIG_GPIO_PL061=y
|
CONFIG_GPIO_PL061=y
|
||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
CONFIG_FB_ARMCLCD=y
|
CONFIG_FB_ARMCLCD=y
|
||||||
|
@ -66,4 +71,5 @@ CONFIG_RTC_CLASS=y
|
||||||
CONFIG_RTC_DRV_PL031=y
|
CONFIG_RTC_DRV_PL031=y
|
||||||
CONFIG_DMADEVICES=y
|
CONFIG_DMADEVICES=y
|
||||||
CONFIG_PL330_DMA=y
|
CONFIG_PL330_DMA=y
|
||||||
|
CONFIG_SIRF_DMA=y
|
||||||
CONFIG_DW_DMAC=y
|
CONFIG_DW_DMAC=y
|
||||||
|
|
|
@ -34,12 +34,4 @@ struct twd_local_timer name __initdata = { \
|
||||||
|
|
||||||
int twd_local_timer_register(struct twd_local_timer *);
|
int twd_local_timer_register(struct twd_local_timer *);
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_ARM_TWD
|
|
||||||
void twd_local_timer_of_register(void);
|
|
||||||
#else
|
|
||||||
static inline void twd_local_timer_of_register(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-prima2/include/mach/uart.h
|
* arch/arm/mach-prima2/include/mach/debug-macro.S
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
||||||
*
|
*
|
||||||
* Licensed under GPLv2 or later.
|
* Licensed under GPLv2 or later.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __MACH_PRIMA2_SIRFSOC_UART_H
|
|
||||||
#define __MACH_PRIMA2_SIRFSOC_UART_H
|
|
||||||
|
|
||||||
/* UART-1: used as serial debug port */
|
|
||||||
#if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1)
|
#if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1)
|
||||||
#define SIRFSOC_UART1_PA_BASE 0xb0060000
|
#define SIRFSOC_UART1_PA_BASE 0xb0060000
|
||||||
#elif defined(CONFIG_DEBUG_SIRFMARCO_UART1)
|
#elif defined(CONFIG_DEBUG_SIRFMARCO_UART1)
|
||||||
|
@ -17,8 +13,8 @@
|
||||||
#else
|
#else
|
||||||
#define SIRFSOC_UART1_PA_BASE 0
|
#define SIRFSOC_UART1_PA_BASE 0
|
||||||
#endif
|
#endif
|
||||||
#define SIRFSOC_UART1_VA_BASE SIRFSOC_VA(0x060000)
|
|
||||||
#define SIRFSOC_UART1_SIZE SZ_4K
|
#define SIRFSOC_UART1_VA_BASE 0xFEC60000
|
||||||
|
|
||||||
#define SIRFSOC_UART_TXFIFO_STATUS 0x0114
|
#define SIRFSOC_UART_TXFIFO_STATUS 0x0114
|
||||||
#define SIRFSOC_UART_TXFIFO_DATA 0x0118
|
#define SIRFSOC_UART_TXFIFO_DATA 0x0118
|
||||||
|
@ -26,4 +22,21 @@
|
||||||
#define SIRFSOC_UART1_TXFIFO_FULL (1 << 5)
|
#define SIRFSOC_UART1_TXFIFO_FULL (1 << 5)
|
||||||
#define SIRFSOC_UART1_TXFIFO_EMPTY (1 << 6)
|
#define SIRFSOC_UART1_TXFIFO_EMPTY (1 << 6)
|
||||||
|
|
||||||
#endif
|
.macro addruart, rp, rv, tmp
|
||||||
|
ldr \rp, =SIRFSOC_UART1_PA_BASE @ physical
|
||||||
|
ldr \rv, =SIRFSOC_UART1_VA_BASE @ virtual
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro senduart,rd,rx
|
||||||
|
str \rd, [\rx, #SIRFSOC_UART_TXFIFO_DATA]
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro busyuart,rd,rx
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro waituart,rd,rx
|
||||||
|
1001: ldr \rd, [\rx, #SIRFSOC_UART_TXFIFO_STATUS]
|
||||||
|
tst \rd, #SIRFSOC_UART1_TXFIFO_EMPTY
|
||||||
|
beq 1001b
|
||||||
|
.endm
|
||||||
|
|
|
@ -362,25 +362,13 @@ int __init twd_local_timer_register(struct twd_local_timer *tlt)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
const static struct of_device_id twd_of_match[] __initconst = {
|
static void __init twd_local_timer_of_register(struct device_node *np)
|
||||||
{ .compatible = "arm,cortex-a9-twd-timer", },
|
|
||||||
{ .compatible = "arm,cortex-a5-twd-timer", },
|
|
||||||
{ .compatible = "arm,arm11mp-twd-timer", },
|
|
||||||
{ },
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init twd_local_timer_of_register(void)
|
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!is_smp() || !setup_max_cpus)
|
if (!is_smp() || !setup_max_cpus)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, twd_of_match);
|
|
||||||
if (!np)
|
|
||||||
return;
|
|
||||||
|
|
||||||
twd_ppi = irq_of_parse_and_map(np, 0);
|
twd_ppi = irq_of_parse_and_map(np, 0);
|
||||||
if (!twd_ppi) {
|
if (!twd_ppi) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
@ -398,4 +386,7 @@ void __init twd_local_timer_of_register(void)
|
||||||
out:
|
out:
|
||||||
WARN(err, "twd_local_timer_of_register failed (%d)\n", err);
|
WARN(err, "twd_local_timer_of_register failed (%d)\n", err);
|
||||||
}
|
}
|
||||||
|
CLOCKSOURCE_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);
|
||||||
|
CLOCKSOURCE_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register);
|
||||||
|
CLOCKSOURCE_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/cputype.h>
|
#include <asm/cputype.h>
|
||||||
#include <asm/smp_plat.h>
|
#include <asm/smp_plat.h>
|
||||||
#include <asm/smp_twd.h>
|
|
||||||
#include <asm/hardware/arm_timer.h>
|
#include <asm/hardware/arm_timer.h>
|
||||||
#include <asm/hardware/timer-sp.h>
|
#include <asm/hardware/timer-sp.h>
|
||||||
#include <asm/hardware/cache-l2x0.h>
|
#include <asm/hardware/cache-l2x0.h>
|
||||||
|
@ -119,10 +118,10 @@ static void __init highbank_timer_init(void)
|
||||||
sp804_clocksource_and_sched_clock_init(timer_base + 0x20, "timer1");
|
sp804_clocksource_and_sched_clock_init(timer_base + 0x20, "timer1");
|
||||||
sp804_clockevents_init(timer_base, irq, "timer0");
|
sp804_clockevents_init(timer_base, irq, "timer0");
|
||||||
|
|
||||||
twd_local_timer_of_register();
|
|
||||||
|
|
||||||
arch_timer_of_register();
|
arch_timer_of_register();
|
||||||
arch_timer_sched_clock_init();
|
arch_timer_sched_clock_init();
|
||||||
|
|
||||||
|
clocksource_of_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void highbank_power_off(void)
|
static void highbank_power_off(void)
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/clkdev.h>
|
#include <linux/clkdev.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
|
@ -28,11 +29,9 @@
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/micrel_phy.h>
|
#include <linux/micrel_phy.h>
|
||||||
#include <linux/mfd/syscon.h>
|
#include <linux/mfd/syscon.h>
|
||||||
#include <asm/smp_twd.h>
|
|
||||||
#include <asm/hardware/cache-l2x0.h>
|
#include <asm/hardware/cache-l2x0.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/time.h>
|
|
||||||
#include <asm/system_misc.h>
|
#include <asm/system_misc.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@ -292,7 +291,7 @@ static void __init imx6q_init_irq(void)
|
||||||
static void __init imx6q_timer_init(void)
|
static void __init imx6q_timer_init(void)
|
||||||
{
|
{
|
||||||
mx6q_clocks_init();
|
mx6q_clocks_init();
|
||||||
twd_local_timer_of_register();
|
clocksource_of_init();
|
||||||
imx_print_silicon_rev("i.MX6Q", imx6q_revision());
|
imx_print_silicon_rev("i.MX6Q", imx6q_revision());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -597,7 +597,7 @@ void __init omap4_local_timer_init(void)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (of_have_populated_dt()) {
|
if (of_have_populated_dt()) {
|
||||||
twd_local_timer_of_register();
|
clocksource_of_init();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,26 @@
|
||||||
|
config ARCH_SIRF
|
||||||
|
bool "CSR SiRF" if ARCH_MULTI_V7
|
||||||
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
|
select GENERIC_CLOCKEVENTS
|
||||||
|
select GENERIC_IRQ_CHIP
|
||||||
|
select MIGHT_HAVE_CACHE_L2X0
|
||||||
|
select NO_IOPORT
|
||||||
|
select PINCTRL
|
||||||
|
select PINCTRL_SIRF
|
||||||
|
help
|
||||||
|
Support for CSR SiRFprimaII/Marco/Polo platforms
|
||||||
|
|
||||||
if ARCH_SIRF
|
if ARCH_SIRF
|
||||||
|
|
||||||
menu "CSR SiRF primaII/Marco/Polo Specific Features"
|
menu "CSR SiRF atlas6/primaII/Marco/Polo Specific Features"
|
||||||
|
|
||||||
|
config ARCH_ATLAS6
|
||||||
|
bool "CSR SiRFSoC ATLAS6 ARM Cortex A9 Platform"
|
||||||
|
default y
|
||||||
|
select CPU_V7
|
||||||
|
select SIRF_IRQ
|
||||||
|
help
|
||||||
|
Support for CSR SiRFSoC ARM Cortex A9 Platform
|
||||||
|
|
||||||
config ARCH_PRIMA2
|
config ARCH_PRIMA2
|
||||||
bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
|
bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
|
||||||
|
|
|
@ -4,8 +4,7 @@ obj-y += rtciobrg.o
|
||||||
obj-$(CONFIG_DEBUG_LL) += lluart.o
|
obj-$(CONFIG_DEBUG_LL) += lluart.o
|
||||||
obj-$(CONFIG_CACHE_L2X0) += l2x0.o
|
obj-$(CONFIG_CACHE_L2X0) += l2x0.o
|
||||||
obj-$(CONFIG_SUSPEND) += pm.o sleep.o
|
obj-$(CONFIG_SUSPEND) += pm.o sleep.o
|
||||||
obj-$(CONFIG_SIRF_IRQ) += irq.o
|
|
||||||
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
|
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
|
||||||
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
||||||
obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o
|
|
||||||
obj-$(CONFIG_ARCH_MARCO) += timer-marco.o
|
CFLAGS_hotplug.o += -march=armv7-a
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
* Licensed under GPLv2 or later.
|
* Licensed under GPLv2 or later.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
|
@ -31,12 +32,38 @@ void __init sirfsoc_init_late(void)
|
||||||
sirfsoc_pm_init();
|
sirfsoc_pm_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __init void sirfsoc_init_time(void)
|
||||||
|
{
|
||||||
|
/* initialize clocking early, we want to set the OS timer */
|
||||||
|
sirfsoc_of_clk_init();
|
||||||
|
clocksource_of_init();
|
||||||
|
}
|
||||||
|
|
||||||
static __init void sirfsoc_map_io(void)
|
static __init void sirfsoc_map_io(void)
|
||||||
{
|
{
|
||||||
sirfsoc_map_lluart();
|
sirfsoc_map_lluart();
|
||||||
sirfsoc_map_scu();
|
sirfsoc_map_scu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_ATLAS6
|
||||||
|
static const char *atlas6_dt_match[] __initdata = {
|
||||||
|
"sirf,atlas6",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
DT_MACHINE_START(ATLAS6_DT, "Generic ATLAS6 (Flattened Device Tree)")
|
||||||
|
/* Maintainer: Barry Song <baohua.song@csr.com> */
|
||||||
|
.nr_irqs = 128,
|
||||||
|
.map_io = sirfsoc_map_io,
|
||||||
|
.init_irq = irqchip_init,
|
||||||
|
.init_time = sirfsoc_init_time,
|
||||||
|
.init_machine = sirfsoc_mach_init,
|
||||||
|
.init_late = sirfsoc_init_late,
|
||||||
|
.dt_compat = atlas6_dt_match,
|
||||||
|
.restart = sirfsoc_restart,
|
||||||
|
MACHINE_END
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_PRIMA2
|
#ifdef CONFIG_ARCH_PRIMA2
|
||||||
static const char *prima2_dt_match[] __initdata = {
|
static const char *prima2_dt_match[] __initdata = {
|
||||||
"sirf,prima2",
|
"sirf,prima2",
|
||||||
|
@ -45,12 +72,10 @@ static const char *prima2_dt_match[] __initdata = {
|
||||||
|
|
||||||
DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")
|
DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")
|
||||||
/* Maintainer: Barry Song <baohua.song@csr.com> */
|
/* Maintainer: Barry Song <baohua.song@csr.com> */
|
||||||
|
.nr_irqs = 128,
|
||||||
.map_io = sirfsoc_map_io,
|
.map_io = sirfsoc_map_io,
|
||||||
.init_irq = sirfsoc_of_irq_init,
|
.init_irq = irqchip_init,
|
||||||
.init_time = sirfsoc_prima2_timer_init,
|
.init_time = sirfsoc_init_time,
|
||||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
|
||||||
.handle_irq = sirfsoc_handle_irq,
|
|
||||||
#endif
|
|
||||||
.dma_zone_size = SZ_256M,
|
.dma_zone_size = SZ_256M,
|
||||||
.init_machine = sirfsoc_mach_init,
|
.init_machine = sirfsoc_mach_init,
|
||||||
.init_late = sirfsoc_init_late,
|
.init_late = sirfsoc_init_late,
|
||||||
|
@ -70,7 +95,7 @@ DT_MACHINE_START(MARCO_DT, "Generic MARCO (Flattened Device Tree)")
|
||||||
.smp = smp_ops(sirfsoc_smp_ops),
|
.smp = smp_ops(sirfsoc_smp_ops),
|
||||||
.map_io = sirfsoc_map_io,
|
.map_io = sirfsoc_map_io,
|
||||||
.init_irq = irqchip_init,
|
.init_irq = irqchip_init,
|
||||||
.init_time = sirfsoc_marco_timer_init,
|
.init_time = sirfsoc_init_time,
|
||||||
.init_machine = sirfsoc_mach_init,
|
.init_machine = sirfsoc_mach_init,
|
||||||
.init_late = sirfsoc_init_late,
|
.init_late = sirfsoc_init_late,
|
||||||
.dt_compat = marco_dt_match,
|
.dt_compat = marco_dt_match,
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
#include <asm/exception.h>
|
#include <asm/exception.h>
|
||||||
|
|
||||||
extern void sirfsoc_prima2_timer_init(void);
|
#define SIRFSOC_VA_BASE _AC(0xFEC00000, UL)
|
||||||
extern void sirfsoc_marco_timer_init(void);
|
#define SIRFSOC_VA(x) (SIRFSOC_VA_BASE + ((x) & 0x00FFF000))
|
||||||
|
|
||||||
extern struct smp_operations sirfsoc_smp_ops;
|
extern struct smp_operations sirfsoc_smp_ops;
|
||||||
extern void sirfsoc_secondary_startup(void);
|
extern void sirfsoc_secondary_startup(void);
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/clkdev.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_CLKDEV_H
|
|
||||||
#define __MACH_CLKDEV_H
|
|
||||||
|
|
||||||
#define __clk_get(clk) ({ 1; })
|
|
||||||
#define __clk_put(clk) do { } while (0)
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/debug-macro.S
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <mach/uart.h>
|
|
||||||
|
|
||||||
.macro addruart, rp, rv, tmp
|
|
||||||
ldr \rp, =SIRFSOC_UART1_PA_BASE @ physical
|
|
||||||
ldr \rv, =SIRFSOC_UART1_VA_BASE @ virtual
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro senduart,rd,rx
|
|
||||||
str \rd, [\rx, #SIRFSOC_UART_TXFIFO_DATA]
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro busyuart,rd,rx
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro waituart,rd,rx
|
|
||||||
1001: ldr \rd, [\rx, #SIRFSOC_UART_TXFIFO_STATUS]
|
|
||||||
tst \rd, #SIRFSOC_UART1_TXFIFO_EMPTY
|
|
||||||
beq 1001b
|
|
||||||
.endm
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/entry-macro.S
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
|
|
||||||
#define SIRFSOC_INT_ID 0x38
|
|
||||||
|
|
||||||
.macro get_irqnr_preamble, base, tmp
|
|
||||||
ldr \base, =sirfsoc_intc_base
|
|
||||||
ldr \base, [\base]
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
|
|
||||||
ldr \irqnr, [\base, #SIRFSOC_INT_ID] @ Get the highest priority irq
|
|
||||||
cmp \irqnr, #0x40 @ the irq num can't be larger than 0x3f
|
|
||||||
movges \irqnr, #0
|
|
||||||
.endm
|
|
|
@ -1,15 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/hardware.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_HARDWARE_H__
|
|
||||||
#define __MACH_HARDWARE_H__
|
|
||||||
|
|
||||||
#include <asm/sizes.h>
|
|
||||||
#include <mach/map.h>
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,17 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/irqs.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ASM_ARCH_IRQS_H
|
|
||||||
#define __ASM_ARCH_IRQS_H
|
|
||||||
|
|
||||||
#define SIRFSOC_INTENAL_IRQ_START 0
|
|
||||||
#define SIRFSOC_INTENAL_IRQ_END 127
|
|
||||||
#define SIRFSOC_GPIO_IRQ_START (SIRFSOC_INTENAL_IRQ_END + 1)
|
|
||||||
#define NR_IRQS 288
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
* memory & I/O static mapping definitions for CSR SiRFprimaII
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_PRIMA2_MAP_H__
|
|
||||||
#define __MACH_PRIMA2_MAP_H__
|
|
||||||
|
|
||||||
#include <linux/const.h>
|
|
||||||
|
|
||||||
#define SIRFSOC_VA_BASE _AC(0xFEC00000, UL)
|
|
||||||
|
|
||||||
#define SIRFSOC_VA(x) (SIRFSOC_VA_BASE + ((x) & 0x00FFF000))
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,14 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/timex.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_TIMEX_H__
|
|
||||||
#define __MACH_TIMEX_H__
|
|
||||||
|
|
||||||
#define CLOCK_TICK_RATE 1000000
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/arm/mach-prima2/include/mach/uncompress.h
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ASM_ARCH_UNCOMPRESS_H
|
|
||||||
#define __ASM_ARCH_UNCOMPRESS_H
|
|
||||||
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
#include <mach/uart.h>
|
|
||||||
|
|
||||||
void arch_decomp_setup(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ void putc(char c)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* during kernel decompression, all mappings are flat:
|
|
||||||
* virt_addr == phys_addr
|
|
||||||
*/
|
|
||||||
if (!SIRFSOC_UART1_PA_BASE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
while (__raw_readl((void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_STATUS)
|
|
||||||
& SIRFSOC_UART1_TXFIFO_FULL)
|
|
||||||
barrier();
|
|
||||||
|
|
||||||
__raw_writel(c, (void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_DATA);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void flush(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,129 +0,0 @@
|
||||||
/*
|
|
||||||
* interrupt controller support for CSR SiRFprimaII
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
|
||||||
*
|
|
||||||
* Licensed under GPLv2 or later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/of.h>
|
|
||||||
#include <linux/of_address.h>
|
|
||||||
#include <linux/irqdomain.h>
|
|
||||||
#include <linux/syscore_ops.h>
|
|
||||||
#include <asm/mach/irq.h>
|
|
||||||
#include <asm/exception.h>
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
|
|
||||||
#define SIRFSOC_INT_RISC_MASK0 0x0018
|
|
||||||
#define SIRFSOC_INT_RISC_MASK1 0x001C
|
|
||||||
#define SIRFSOC_INT_RISC_LEVEL0 0x0020
|
|
||||||
#define SIRFSOC_INT_RISC_LEVEL1 0x0024
|
|
||||||
#define SIRFSOC_INIT_IRQ_ID 0x0038
|
|
||||||
|
|
||||||
void __iomem *sirfsoc_intc_base;
|
|
||||||
|
|
||||||
static __init void
|
|
||||||
sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
|
|
||||||
{
|
|
||||||
struct irq_chip_generic *gc;
|
|
||||||
struct irq_chip_type *ct;
|
|
||||||
|
|
||||||
gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq);
|
|
||||||
ct = gc->chip_types;
|
|
||||||
|
|
||||||
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
|
||||||
ct->chip.irq_unmask = irq_gc_mask_set_bit;
|
|
||||||
ct->regs.mask = SIRFSOC_INT_RISC_MASK0;
|
|
||||||
|
|
||||||
irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static __init void sirfsoc_irq_init(void)
|
|
||||||
{
|
|
||||||
sirfsoc_alloc_gc(sirfsoc_intc_base, 0, 32);
|
|
||||||
sirfsoc_alloc_gc(sirfsoc_intc_base + 4, 32,
|
|
||||||
SIRFSOC_INTENAL_IRQ_END + 1 - 32);
|
|
||||||
|
|
||||||
writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL0);
|
|
||||||
writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL1);
|
|
||||||
|
|
||||||
writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK0);
|
|
||||||
writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1);
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
u32 irqstat, irqnr;
|
|
||||||
|
|
||||||
irqstat = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INIT_IRQ_ID);
|
|
||||||
irqnr = irqstat & 0xff;
|
|
||||||
|
|
||||||
handle_IRQ(irqnr, regs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct of_device_id intc_ids[] = {
|
|
||||||
{ .compatible = "sirf,prima2-intc" },
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init sirfsoc_of_irq_init(void)
|
|
||||||
{
|
|
||||||
struct device_node *np;
|
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, intc_ids);
|
|
||||||
if (!np)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sirfsoc_intc_base = of_iomap(np, 0);
|
|
||||||
if (!sirfsoc_intc_base)
|
|
||||||
panic("unable to map intc cpu registers\n");
|
|
||||||
|
|
||||||
irq_domain_add_legacy(np, SIRFSOC_INTENAL_IRQ_END + 1, 0, 0,
|
|
||||||
&irq_domain_simple_ops, NULL);
|
|
||||||
|
|
||||||
of_node_put(np);
|
|
||||||
|
|
||||||
sirfsoc_irq_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sirfsoc_irq_status {
|
|
||||||
u32 mask0;
|
|
||||||
u32 mask1;
|
|
||||||
u32 level0;
|
|
||||||
u32 level1;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sirfsoc_irq_status sirfsoc_irq_st;
|
|
||||||
|
|
||||||
static int sirfsoc_irq_suspend(void)
|
|
||||||
{
|
|
||||||
sirfsoc_irq_st.mask0 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK0);
|
|
||||||
sirfsoc_irq_st.mask1 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1);
|
|
||||||
sirfsoc_irq_st.level0 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL0);
|
|
||||||
sirfsoc_irq_st.level1 = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL1);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sirfsoc_irq_resume(void)
|
|
||||||
{
|
|
||||||
writel_relaxed(sirfsoc_irq_st.mask0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK0);
|
|
||||||
writel_relaxed(sirfsoc_irq_st.mask1, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1);
|
|
||||||
writel_relaxed(sirfsoc_irq_st.level0, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL0);
|
|
||||||
writel_relaxed(sirfsoc_irq_st.level1, sirfsoc_intc_base + SIRFSOC_INT_RISC_LEVEL1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct syscore_ops sirfsoc_irq_syscore_ops = {
|
|
||||||
.suspend = sirfsoc_irq_suspend,
|
|
||||||
.resume = sirfsoc_irq_resume,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init sirfsoc_irq_pm_init(void)
|
|
||||||
{
|
|
||||||
register_syscore_ops(&sirfsoc_irq_syscore_ops);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
device_initcall(sirfsoc_irq_pm_init);
|
|
|
@ -9,8 +9,18 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <mach/map.h>
|
#include "common.h"
|
||||||
#include <mach/uart.h>
|
|
||||||
|
#if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1)
|
||||||
|
#define SIRFSOC_UART1_PA_BASE 0xb0060000
|
||||||
|
#elif defined(CONFIG_DEBUG_SIRFMARCO_UART1)
|
||||||
|
#define SIRFSOC_UART1_PA_BASE 0xcc060000
|
||||||
|
#else
|
||||||
|
#define SIRFSOC_UART1_PA_BASE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SIRFSOC_UART1_VA_BASE SIRFSOC_VA(0x060000)
|
||||||
|
#define SIRFSOC_UART1_SIZE SZ_4K
|
||||||
|
|
||||||
void __init sirfsoc_map_lluart(void)
|
void __init sirfsoc_map_lluart(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/cputype.h>
|
#include <asm/cputype.h>
|
||||||
#include <mach/map.h>
|
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
|
|
@ -15,12 +15,12 @@
|
||||||
|
|
||||||
#include <linux/amba/pl022.h>
|
#include <linux/amba/pl022.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/dw_dmac.h>
|
#include <linux/dw_dmac.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <asm/hardware/cache-l2x0.h>
|
#include <asm/hardware/cache-l2x0.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/smp_twd.h>
|
|
||||||
#include "generic.h"
|
#include "generic.h"
|
||||||
#include <mach/spear.h>
|
#include <mach/spear.h>
|
||||||
|
|
||||||
|
@ -180,5 +180,5 @@ void __init spear13xx_timer_init(void)
|
||||||
clk_put(pclk);
|
clk_put(pclk);
|
||||||
|
|
||||||
spear_setup_of_timer();
|
spear_setup_of_timer();
|
||||||
twd_local_timer_of_register();
|
clocksource_of_init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/clksrc-dbx500-prcmu.h>
|
#include <linux/clksrc-dbx500-prcmu.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/platform_data/clocksource-nomadik-mtu.h>
|
#include <linux/platform_data/clocksource-nomadik-mtu.h>
|
||||||
|
@ -32,7 +33,7 @@ static void __init ux500_twd_init(void)
|
||||||
twd_local_timer = &u8500_twd_local_timer;
|
twd_local_timer = &u8500_twd_local_timer;
|
||||||
|
|
||||||
if (of_have_populated_dt())
|
if (of_have_populated_dt())
|
||||||
twd_local_timer_of_register();
|
clocksource_of_init();
|
||||||
else {
|
else {
|
||||||
err = twd_local_timer_register(twd_local_timer);
|
err = twd_local_timer_register(twd_local_timer);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <linux/amba/bus.h>
|
#include <linux/amba/bus.h>
|
||||||
#include <linux/amba/mmci.h>
|
#include <linux/amba/mmci.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
|
@ -25,7 +26,6 @@
|
||||||
#include <asm/arch_timer.h>
|
#include <asm/arch_timer.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/sizes.h>
|
#include <asm/sizes.h>
|
||||||
#include <asm/smp_twd.h>
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
@ -435,6 +435,7 @@ static void __init v2m_dt_timer_init(void)
|
||||||
|
|
||||||
vexpress_clk_of_init();
|
vexpress_clk_of_init();
|
||||||
|
|
||||||
|
clocksource_of_init();
|
||||||
do {
|
do {
|
||||||
node = of_find_compatible_node(node, NULL, "arm,sp804");
|
node = of_find_compatible_node(node, NULL, "arm,sp804");
|
||||||
} while (node && vexpress_get_site_by_node(node) != VEXPRESS_SITE_MB);
|
} while (node && vexpress_get_site_by_node(node) != VEXPRESS_SITE_MB);
|
||||||
|
@ -445,8 +446,7 @@ static void __init v2m_dt_timer_init(void)
|
||||||
irq_of_parse_and_map(node, 0));
|
irq_of_parse_and_map(node, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arch_timer_of_register() != 0)
|
arch_timer_of_register();
|
||||||
twd_local_timer_of_register();
|
|
||||||
|
|
||||||
if (arch_timer_sched_clock_init() != 0)
|
if (arch_timer_sched_clock_init() != 0)
|
||||||
versatile_sched_clock_init(vexpress_get_24mhz_clock_base(),
|
versatile_sched_clock_init(vexpress_get_24mhz_clock_base(),
|
||||||
|
|
|
@ -16,6 +16,8 @@ obj-$(CONFIG_CLKSRC_NOMADIK_MTU) += nomadik-mtu.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
|
obj-$(CONFIG_ARMADA_370_XP_TIMER) += time-armada-370-xp.o
|
||||||
obj-$(CONFIG_ARCH_BCM2835) += bcm2835_timer.o
|
obj-$(CONFIG_ARCH_BCM2835) += bcm2835_timer.o
|
||||||
|
obj-$(CONFIG_ARCH_MARCO) += timer-marco.o
|
||||||
|
obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o
|
||||||
obj-$(CONFIG_SUNXI_TIMER) += sunxi_timer.o
|
obj-$(CONFIG_SUNXI_TIMER) += sunxi_timer.o
|
||||||
obj-$(CONFIG_ARCH_TEGRA) += tegra20_timer.o
|
obj-$(CONFIG_ARCH_TEGRA) += tegra20_timer.o
|
||||||
obj-$(CONFIG_VT8500_TIMER) += vt8500_timer.o
|
obj-$(CONFIG_VT8500_TIMER) += vt8500_timer.o
|
||||||
|
|
|
@ -95,23 +95,13 @@ static irqreturn_t bcm2835_time_interrupt(int irq, void *dev_id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct of_device_id bcm2835_time_match[] __initconst = {
|
static void __init bcm2835_timer_init(struct device_node *node)
|
||||||
{ .compatible = "brcm,bcm2835-system-timer" },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init bcm2835_timer_init(void)
|
|
||||||
{
|
{
|
||||||
struct device_node *node;
|
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
u32 freq;
|
u32 freq;
|
||||||
int irq;
|
int irq;
|
||||||
struct bcm2835_timer *timer;
|
struct bcm2835_timer *timer;
|
||||||
|
|
||||||
node = of_find_matching_node(NULL, bcm2835_time_match);
|
|
||||||
if (!node)
|
|
||||||
panic("No bcm2835 timer node");
|
|
||||||
|
|
||||||
base = of_iomap(node, 0);
|
base = of_iomap(node, 0);
|
||||||
if (!base)
|
if (!base)
|
||||||
panic("Can't remap registers");
|
panic("Can't remap registers");
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
|
|
||||||
extern struct of_device_id __clksrc_of_table[];
|
extern struct of_device_id __clksrc_of_table[];
|
||||||
|
|
||||||
|
@ -26,10 +27,10 @@ void __init clocksource_of_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
void (*init_func)(void);
|
clocksource_of_init_fn init_func;
|
||||||
|
|
||||||
for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
|
for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
|
||||||
init_func = match->data;
|
init_func = match->data;
|
||||||
init_func();
|
init_func(np);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,29 +154,12 @@ static struct irqaction tegra_timer_irq = {
|
||||||
.dev_id = &tegra_clockevent,
|
.dev_id = &tegra_clockevent,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id timer_match[] __initconst = {
|
static void __init tegra20_init_timer(struct device_node *np)
|
||||||
{ .compatible = "nvidia,tegra20-timer" },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct of_device_id rtc_match[] __initconst = {
|
|
||||||
{ .compatible = "nvidia,tegra20-rtc" },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init tegra20_init_timer(void)
|
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, timer_match);
|
|
||||||
if (!np) {
|
|
||||||
pr_err("Failed to find timer DT node\n");
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
timer_reg_base = of_iomap(np, 0);
|
timer_reg_base = of_iomap(np, 0);
|
||||||
if (!timer_reg_base) {
|
if (!timer_reg_base) {
|
||||||
pr_err("Can't map timer registers\n");
|
pr_err("Can't map timer registers\n");
|
||||||
|
@ -200,30 +183,6 @@ static void __init tegra20_init_timer(void)
|
||||||
|
|
||||||
of_node_put(np);
|
of_node_put(np);
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, rtc_match);
|
|
||||||
if (!np) {
|
|
||||||
pr_err("Failed to find RTC DT node\n");
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
rtc_base = of_iomap(np, 0);
|
|
||||||
if (!rtc_base) {
|
|
||||||
pr_err("Can't map RTC registers");
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* rtc registers are used by read_persistent_clock, keep the rtc clock
|
|
||||||
* enabled
|
|
||||||
*/
|
|
||||||
clk = clk_get_sys("rtc-tegra", NULL);
|
|
||||||
if (IS_ERR(clk))
|
|
||||||
pr_warn("Unable to get rtc-tegra clock\n");
|
|
||||||
else
|
|
||||||
clk_prepare_enable(clk);
|
|
||||||
|
|
||||||
of_node_put(np);
|
|
||||||
|
|
||||||
switch (rate) {
|
switch (rate) {
|
||||||
case 12000000:
|
case 12000000:
|
||||||
timer_writel(0x000b, TIMERUS_USEC_CFG);
|
timer_writel(0x000b, TIMERUS_USEC_CFG);
|
||||||
|
@ -259,12 +218,34 @@ static void __init tegra20_init_timer(void)
|
||||||
tegra_clockevent.irq = tegra_timer_irq.irq;
|
tegra_clockevent.irq = tegra_timer_irq.irq;
|
||||||
clockevents_config_and_register(&tegra_clockevent, 1000000,
|
clockevents_config_and_register(&tegra_clockevent, 1000000,
|
||||||
0x1, 0x1fffffff);
|
0x1, 0x1fffffff);
|
||||||
#ifdef CONFIG_HAVE_ARM_TWD
|
}
|
||||||
twd_local_timer_of_register();
|
CLOCKSOURCE_OF_DECLARE(tegra20_timer, "nvidia,tegra20-timer", tegra20_init_timer);
|
||||||
#endif
|
|
||||||
|
static void __init tegra20_init_rtc(struct device_node *np)
|
||||||
|
{
|
||||||
|
struct clk *clk;
|
||||||
|
|
||||||
|
rtc_base = of_iomap(np, 0);
|
||||||
|
if (!rtc_base) {
|
||||||
|
pr_err("Can't map RTC registers");
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rtc registers are used by read_persistent_clock, keep the rtc clock
|
||||||
|
* enabled
|
||||||
|
*/
|
||||||
|
clk = clk_get_sys("rtc-tegra", NULL);
|
||||||
|
if (IS_ERR(clk))
|
||||||
|
pr_warn("Unable to get rtc-tegra clock\n");
|
||||||
|
else
|
||||||
|
clk_prepare_enable(clk);
|
||||||
|
|
||||||
|
of_node_put(np);
|
||||||
|
|
||||||
register_persistent_clock(NULL, tegra_read_persistent_clock);
|
register_persistent_clock(NULL, tegra_read_persistent_clock);
|
||||||
}
|
}
|
||||||
CLOCKSOURCE_OF_DECLARE(tegra20, "nvidia,tegra20-timer", tegra20_init_timer);
|
CLOCKSOURCE_OF_DECLARE(tegra20_rtc, "nvidia,tegra20-rtc", tegra20_init_rtc);
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static u32 usec_config;
|
static u32 usec_config;
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
#include <asm/localtimer.h>
|
#include <asm/localtimer.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
#define SIRFSOC_TIMER_32COUNTER_0_CTRL 0x0000
|
#define SIRFSOC_TIMER_32COUNTER_0_CTRL 0x0000
|
||||||
#define SIRFSOC_TIMER_32COUNTER_1_CTRL 0x0004
|
#define SIRFSOC_TIMER_32COUNTER_1_CTRL 0x0004
|
||||||
#define SIRFSOC_TIMER_MATCH_0 0x0018
|
#define SIRFSOC_TIMER_MATCH_0 0x0018
|
||||||
|
@ -53,7 +51,6 @@ static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = {
|
||||||
static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
|
static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
|
||||||
|
|
||||||
static void __iomem *sirfsoc_timer_base;
|
static void __iomem *sirfsoc_timer_base;
|
||||||
static void __init sirfsoc_of_timer_map(void);
|
|
||||||
|
|
||||||
/* disable count and interrupt */
|
/* disable count and interrupt */
|
||||||
static inline void sirfsoc_timer_count_disable(int idx)
|
static inline void sirfsoc_timer_count_disable(int idx)
|
||||||
|
@ -242,15 +239,12 @@ static void __init sirfsoc_clockevent_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize the kernel jiffy timer source */
|
/* initialize the kernel jiffy timer source */
|
||||||
void __init sirfsoc_marco_timer_init(void)
|
static void __init sirfsoc_marco_timer_init(void)
|
||||||
{
|
{
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
u32 timer_div;
|
u32 timer_div;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
|
|
||||||
/* initialize clocking early, we want to set the OS timer */
|
|
||||||
sirfsoc_of_clk_init();
|
|
||||||
|
|
||||||
/* timer's input clock is io clock */
|
/* timer's input clock is io clock */
|
||||||
clk = clk_get_sys("io", NULL);
|
clk = clk_get_sys("io", NULL);
|
||||||
|
|
||||||
|
@ -260,8 +254,6 @@ void __init sirfsoc_marco_timer_init(void)
|
||||||
BUG_ON(rate < CLOCK_TICK_RATE);
|
BUG_ON(rate < CLOCK_TICK_RATE);
|
||||||
BUG_ON(rate % CLOCK_TICK_RATE);
|
BUG_ON(rate % CLOCK_TICK_RATE);
|
||||||
|
|
||||||
sirfsoc_of_timer_map();
|
|
||||||
|
|
||||||
/* Initialize the timer dividers */
|
/* Initialize the timer dividers */
|
||||||
timer_div = rate / CLOCK_TICK_RATE - 1;
|
timer_div = rate / CLOCK_TICK_RATE - 1;
|
||||||
writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
|
writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
|
||||||
|
@ -286,18 +278,8 @@ void __init sirfsoc_marco_timer_init(void)
|
||||||
sirfsoc_clockevent_init();
|
sirfsoc_clockevent_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct of_device_id timer_ids[] = {
|
static void __init sirfsoc_of_timer_init(struct device_node *np)
|
||||||
{ .compatible = "sirf,marco-tick" },
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init sirfsoc_of_timer_map(void)
|
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, timer_ids);
|
|
||||||
if (!np)
|
|
||||||
return;
|
|
||||||
sirfsoc_timer_base = of_iomap(np, 0);
|
sirfsoc_timer_base = of_iomap(np, 0);
|
||||||
if (!sirfsoc_timer_base)
|
if (!sirfsoc_timer_base)
|
||||||
panic("unable to map timer cpu registers\n");
|
panic("unable to map timer cpu registers\n");
|
||||||
|
@ -312,5 +294,6 @@ static void __init sirfsoc_of_timer_map(void)
|
||||||
panic("No irq passed for timer1 via DT\n");
|
panic("No irq passed for timer1 via DT\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
of_node_put(np);
|
sirfsoc_marco_timer_init();
|
||||||
}
|
}
|
||||||
|
CLOCKSOURCE_OF_DECLARE(sirfsoc_marco_timer, "sirf,marco-tick", sirfsoc_of_timer_init );
|
|
@ -16,13 +16,11 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <mach/map.h>
|
|
||||||
#include <asm/sched_clock.h>
|
#include <asm/sched_clock.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
#define SIRFSOC_TIMER_COUNTER_LO 0x0000
|
#define SIRFSOC_TIMER_COUNTER_LO 0x0000
|
||||||
#define SIRFSOC_TIMER_COUNTER_HI 0x0004
|
#define SIRFSOC_TIMER_COUNTER_HI 0x0004
|
||||||
#define SIRFSOC_TIMER_MATCH_0 0x0008
|
#define SIRFSOC_TIMER_MATCH_0 0x0008
|
||||||
|
@ -55,7 +53,6 @@ static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = {
|
||||||
static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
|
static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
|
||||||
|
|
||||||
static void __iomem *sirfsoc_timer_base;
|
static void __iomem *sirfsoc_timer_base;
|
||||||
static void __init sirfsoc_of_timer_map(void);
|
|
||||||
|
|
||||||
/* timer0 interrupt handler */
|
/* timer0 interrupt handler */
|
||||||
static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id)
|
static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id)
|
||||||
|
@ -181,14 +178,11 @@ static void __init sirfsoc_clockevent_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize the kernel jiffy timer source */
|
/* initialize the kernel jiffy timer source */
|
||||||
void __init sirfsoc_prima2_timer_init(void)
|
static void __init sirfsoc_prima2_timer_init(struct device_node *np)
|
||||||
{
|
{
|
||||||
unsigned long rate;
|
unsigned long rate;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
|
|
||||||
/* initialize clocking early, we want to set the OS timer */
|
|
||||||
sirfsoc_of_clk_init();
|
|
||||||
|
|
||||||
/* timer's input clock is io clock */
|
/* timer's input clock is io clock */
|
||||||
clk = clk_get_sys("io", NULL);
|
clk = clk_get_sys("io", NULL);
|
||||||
|
|
||||||
|
@ -199,7 +193,11 @@ void __init sirfsoc_prima2_timer_init(void)
|
||||||
BUG_ON(rate < CLOCK_TICK_RATE);
|
BUG_ON(rate < CLOCK_TICK_RATE);
|
||||||
BUG_ON(rate % CLOCK_TICK_RATE);
|
BUG_ON(rate % CLOCK_TICK_RATE);
|
||||||
|
|
||||||
sirfsoc_of_timer_map();
|
sirfsoc_timer_base = of_iomap(np, 0);
|
||||||
|
if (!sirfsoc_timer_base)
|
||||||
|
panic("unable to map timer cpu registers\n");
|
||||||
|
|
||||||
|
sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0);
|
||||||
|
|
||||||
writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV);
|
writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV);
|
||||||
writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
|
writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
|
||||||
|
@ -214,28 +212,4 @@ void __init sirfsoc_prima2_timer_init(void)
|
||||||
|
|
||||||
sirfsoc_clockevent_init();
|
sirfsoc_clockevent_init();
|
||||||
}
|
}
|
||||||
|
CLOCKSOURCE_OF_DECLARE(sirfsoc_prima2_timer, "sirf,prima2-tick", sirfsoc_prima2_timer_init);
|
||||||
static struct of_device_id timer_ids[] = {
|
|
||||||
{ .compatible = "sirf,prima2-tick" },
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init sirfsoc_of_timer_map(void)
|
|
||||||
{
|
|
||||||
struct device_node *np;
|
|
||||||
const unsigned int *intspec;
|
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, timer_ids);
|
|
||||||
if (!np)
|
|
||||||
return;
|
|
||||||
sirfsoc_timer_base = of_iomap(np, 0);
|
|
||||||
if (!sirfsoc_timer_base)
|
|
||||||
panic("unable to map timer cpu registers\n");
|
|
||||||
|
|
||||||
/* Get the interrupts property */
|
|
||||||
intspec = of_get_property(np, "interrupts", NULL);
|
|
||||||
BUG_ON(!intspec);
|
|
||||||
sirfsoc_timer_irq.irq = be32_to_cpup(intspec);
|
|
||||||
|
|
||||||
of_node_put(np);
|
|
||||||
}
|
|
|
@ -129,22 +129,10 @@ static struct irqaction irq = {
|
||||||
.dev_id = &clockevent,
|
.dev_id = &clockevent,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct of_device_id vt8500_timer_ids[] = {
|
static void __init vt8500_timer_init(struct device_node *np)
|
||||||
{ .compatible = "via,vt8500-timer" },
|
|
||||||
{ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init vt8500_timer_init(void)
|
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
|
||||||
int timer_irq;
|
int timer_irq;
|
||||||
|
|
||||||
np = of_find_matching_node(NULL, vt8500_timer_ids);
|
|
||||||
if (!np) {
|
|
||||||
pr_err("%s: Timer description missing from Device Tree\n",
|
|
||||||
__func__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
regbase = of_iomap(np, 0);
|
regbase = of_iomap(np, 0);
|
||||||
if (!regbase) {
|
if (!regbase) {
|
||||||
pr_err("%s: Missing iobase description in Device Tree\n",
|
pr_err("%s: Missing iobase description in Device Tree\n",
|
||||||
|
@ -177,4 +165,4 @@ static void __init vt8500_timer_init(void)
|
||||||
4, 0xf0000000);
|
4, 0xf0000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init)
|
CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init);
|
||||||
|
|
|
@ -8,4 +8,5 @@ obj-$(CONFIG_ARCH_SUNXI) += irq-sunxi.o
|
||||||
obj-$(CONFIG_ARCH_SPEAR3XX) += spear-shirq.o
|
obj-$(CONFIG_ARCH_SPEAR3XX) += spear-shirq.o
|
||||||
obj-$(CONFIG_ARM_GIC) += irq-gic.o
|
obj-$(CONFIG_ARM_GIC) += irq-gic.o
|
||||||
obj-$(CONFIG_ARM_VIC) += irq-vic.o
|
obj-$(CONFIG_ARM_VIC) += irq-vic.o
|
||||||
|
obj-$(CONFIG_SIRF_IRQ) += irq-sirfsoc.o
|
||||||
obj-$(CONFIG_VERSATILE_FPGA_IRQ) += irq-versatile-fpga.o
|
obj-$(CONFIG_VERSATILE_FPGA_IRQ) += irq-versatile-fpga.o
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* interrupt controller support for CSR SiRFprimaII
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
||||||
|
*
|
||||||
|
* Licensed under GPLv2 or later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
|
#include <linux/irqdomain.h>
|
||||||
|
#include <linux/syscore_ops.h>
|
||||||
|
#include <asm/mach/irq.h>
|
||||||
|
#include <asm/exception.h>
|
||||||
|
#include "irqchip.h"
|
||||||
|
|
||||||
|
#define SIRFSOC_INT_RISC_MASK0 0x0018
|
||||||
|
#define SIRFSOC_INT_RISC_MASK1 0x001C
|
||||||
|
#define SIRFSOC_INT_RISC_LEVEL0 0x0020
|
||||||
|
#define SIRFSOC_INT_RISC_LEVEL1 0x0024
|
||||||
|
#define SIRFSOC_INIT_IRQ_ID 0x0038
|
||||||
|
|
||||||
|
#define SIRFSOC_NUM_IRQS 128
|
||||||
|
|
||||||
|
static struct irq_domain *sirfsoc_irqdomain;
|
||||||
|
|
||||||
|
static __init void
|
||||||
|
sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
|
||||||
|
{
|
||||||
|
struct irq_chip_generic *gc;
|
||||||
|
struct irq_chip_type *ct;
|
||||||
|
|
||||||
|
gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq);
|
||||||
|
ct = gc->chip_types;
|
||||||
|
|
||||||
|
ct->chip.irq_mask = irq_gc_mask_clr_bit;
|
||||||
|
ct->chip.irq_unmask = irq_gc_mask_set_bit;
|
||||||
|
ct->regs.mask = SIRFSOC_INT_RISC_MASK0;
|
||||||
|
|
||||||
|
irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
void __iomem *base = sirfsoc_irqdomain->host_data;
|
||||||
|
u32 irqstat, irqnr;
|
||||||
|
|
||||||
|
irqstat = readl_relaxed(base + SIRFSOC_INIT_IRQ_ID);
|
||||||
|
irqnr = irq_find_mapping(sirfsoc_irqdomain, irqstat & 0xff);
|
||||||
|
|
||||||
|
handle_IRQ(irqnr, regs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init sirfsoc_irq_init(struct device_node *np, struct device_node *parent)
|
||||||
|
{
|
||||||
|
void __iomem *base = of_iomap(np, 0);
|
||||||
|
if (!base)
|
||||||
|
panic("unable to map intc cpu registers\n");
|
||||||
|
|
||||||
|
/* using legacy because irqchip_generic does not work with linear */
|
||||||
|
sirfsoc_irqdomain = irq_domain_add_legacy(np, SIRFSOC_NUM_IRQS, 0, 0,
|
||||||
|
&irq_domain_simple_ops, base);
|
||||||
|
|
||||||
|
sirfsoc_alloc_gc(base, 0, 32);
|
||||||
|
sirfsoc_alloc_gc(base + 4, 32, SIRFSOC_NUM_IRQS - 32);
|
||||||
|
|
||||||
|
writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL0);
|
||||||
|
writel_relaxed(0, base + SIRFSOC_INT_RISC_LEVEL1);
|
||||||
|
|
||||||
|
writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK0);
|
||||||
|
writel_relaxed(0, base + SIRFSOC_INT_RISC_MASK1);
|
||||||
|
|
||||||
|
set_handle_irq(sirfsoc_handle_irq);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
IRQCHIP_DECLARE(sirfsoc_intc, "sirf,prima2-intc", sirfsoc_irq_init);
|
||||||
|
|
||||||
|
struct sirfsoc_irq_status {
|
||||||
|
u32 mask0;
|
||||||
|
u32 mask1;
|
||||||
|
u32 level0;
|
||||||
|
u32 level1;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct sirfsoc_irq_status sirfsoc_irq_st;
|
||||||
|
|
||||||
|
static int sirfsoc_irq_suspend(void)
|
||||||
|
{
|
||||||
|
void __iomem *base = sirfsoc_irqdomain->host_data;
|
||||||
|
|
||||||
|
sirfsoc_irq_st.mask0 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK0);
|
||||||
|
sirfsoc_irq_st.mask1 = readl_relaxed(base + SIRFSOC_INT_RISC_MASK1);
|
||||||
|
sirfsoc_irq_st.level0 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL0);
|
||||||
|
sirfsoc_irq_st.level1 = readl_relaxed(base + SIRFSOC_INT_RISC_LEVEL1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sirfsoc_irq_resume(void)
|
||||||
|
{
|
||||||
|
void __iomem *base = sirfsoc_irqdomain->host_data;
|
||||||
|
|
||||||
|
writel_relaxed(sirfsoc_irq_st.mask0, base + SIRFSOC_INT_RISC_MASK0);
|
||||||
|
writel_relaxed(sirfsoc_irq_st.mask1, base + SIRFSOC_INT_RISC_MASK1);
|
||||||
|
writel_relaxed(sirfsoc_irq_st.level0, base + SIRFSOC_INT_RISC_LEVEL0);
|
||||||
|
writel_relaxed(sirfsoc_irq_st.level1, base + SIRFSOC_INT_RISC_LEVEL1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct syscore_ops sirfsoc_irq_syscore_ops = {
|
||||||
|
.suspend = sirfsoc_irq_suspend,
|
||||||
|
.resume = sirfsoc_irq_resume,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init sirfsoc_irq_pm_init(void)
|
||||||
|
{
|
||||||
|
if (!sirfsoc_irqdomain)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
register_syscore_ops(&sirfsoc_irq_syscore_ops);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
device_initcall(sirfsoc_irq_pm_init);
|
|
@ -1347,7 +1347,7 @@ static inline int sirfsoc_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||||
struct sirfsoc_gpio_bank *bank = container_of(to_of_mm_gpio_chip(chip),
|
struct sirfsoc_gpio_bank *bank = container_of(to_of_mm_gpio_chip(chip),
|
||||||
struct sirfsoc_gpio_bank, chip);
|
struct sirfsoc_gpio_bank, chip);
|
||||||
|
|
||||||
return irq_find_mapping(bank->domain, offset);
|
return irq_create_mapping(bank->domain, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int sirfsoc_gpio_to_offset(unsigned int gpio)
|
static inline int sirfsoc_gpio_to_offset(unsigned int gpio)
|
||||||
|
@ -1485,7 +1485,6 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)
|
||||||
struct sirfsoc_gpio_bank *bank = irq_get_handler_data(irq);
|
struct sirfsoc_gpio_bank *bank = irq_get_handler_data(irq);
|
||||||
u32 status, ctrl;
|
u32 status, ctrl;
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
unsigned int first_irq;
|
|
||||||
struct irq_chip *chip = irq_get_chip(irq);
|
struct irq_chip *chip = irq_get_chip(irq);
|
||||||
|
|
||||||
chained_irq_enter(chip, desc);
|
chained_irq_enter(chip, desc);
|
||||||
|
@ -1499,8 +1498,6 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
first_irq = bank->domain->revmap_data.legacy.first_irq;
|
|
||||||
|
|
||||||
while (status) {
|
while (status) {
|
||||||
ctrl = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx));
|
ctrl = readl(bank->chip.regs + SIRFSOC_GPIO_CTRL(bank->id, idx));
|
||||||
|
|
||||||
|
@ -1511,7 +1508,7 @@ static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc)
|
||||||
if ((status & 0x1) && (ctrl & SIRFSOC_GPIO_CTL_INTR_EN_MASK)) {
|
if ((status & 0x1) && (ctrl & SIRFSOC_GPIO_CTL_INTR_EN_MASK)) {
|
||||||
pr_debug("%s: gpio id %d idx %d happens\n",
|
pr_debug("%s: gpio id %d idx %d happens\n",
|
||||||
__func__, bank->id, idx);
|
__func__, bank->id, idx);
|
||||||
generic_handle_irq(first_irq + idx);
|
generic_handle_irq(irq_find_mapping(bank->domain, idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
idx++;
|
idx++;
|
||||||
|
@ -1770,9 +1767,8 @@ static int sirfsoc_gpio_probe(struct device_node *np)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
bank->domain = irq_domain_add_legacy(np, SIRFSOC_GPIO_BANK_SIZE,
|
bank->domain = irq_domain_add_linear(np, SIRFSOC_GPIO_BANK_SIZE,
|
||||||
SIRFSOC_GPIO_IRQ_START + i * SIRFSOC_GPIO_BANK_SIZE, 0,
|
&sirfsoc_gpio_irq_simple_ops, bank);
|
||||||
&sirfsoc_gpio_irq_simple_ops, bank);
|
|
||||||
|
|
||||||
if (!bank->domain) {
|
if (!bank->domain) {
|
||||||
pr_err("%s: Failed to create irqdomain\n", np->full_name);
|
pr_err("%s: Failed to create irqdomain\n", np->full_name);
|
||||||
|
|
|
@ -332,15 +332,23 @@ extern int clocksource_mmio_init(void __iomem *, const char *,
|
||||||
|
|
||||||
extern int clocksource_i8253_init(void);
|
extern int clocksource_i8253_init(void);
|
||||||
|
|
||||||
|
struct device_node;
|
||||||
|
typedef void(*clocksource_of_init_fn)(struct device_node *);
|
||||||
#ifdef CONFIG_CLKSRC_OF
|
#ifdef CONFIG_CLKSRC_OF
|
||||||
extern void clocksource_of_init(void);
|
extern void clocksource_of_init(void);
|
||||||
|
|
||||||
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
||||||
static const struct of_device_id __clksrc_of_table_##name \
|
static const struct of_device_id __clksrc_of_table_##name \
|
||||||
__used __section(__clksrc_of_table) \
|
__used __section(__clksrc_of_table) \
|
||||||
= { .compatible = compat, .data = fn };
|
= { .compatible = compat, \
|
||||||
|
.data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
|
||||||
#else
|
#else
|
||||||
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)
|
static inline void clocksource_of_init(void) {}
|
||||||
|
#define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \
|
||||||
|
static const struct of_device_id __clksrc_of_table_##name \
|
||||||
|
__unused __section(__clksrc_of_table) \
|
||||||
|
= { .compatible = compat, \
|
||||||
|
.data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_CLOCKSOURCE_H */
|
#endif /* _LINUX_CLOCKSOURCE_H */
|
||||||
|
|
Loading…
Reference in New Issue