Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
6defd904
Commit
6defd904
authored
Oct 09, 2008
by
Russell King
Committed by
Russell King
Oct 09, 2008
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-rmk' of
git://git.marvell.com/orion
Merge branch 'orion-devel' into devel
parents
c97f6814
99c6bb39
Changes
31
Hide whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
1305 additions
and
66 deletions
+1305
-66
arch/arm/Kconfig
arch/arm/Kconfig
+1
-1
arch/arm/configs/orion5x_defconfig
arch/arm/configs/orion5x_defconfig
+3
-0
arch/arm/mach-kirkwood/addr-map.c
arch/arm/mach-kirkwood/addr-map.c
+8
-0
arch/arm/mach-kirkwood/common.c
arch/arm/mach-kirkwood/common.c
+65
-19
arch/arm/mach-kirkwood/common.h
arch/arm/mach-kirkwood/common.h
+3
-4
arch/arm/mach-kirkwood/db88f6281-bp-setup.c
arch/arm/mach-kirkwood/db88f6281-bp-setup.c
+0
-1
arch/arm/mach-kirkwood/include/mach/irqs.h
arch/arm/mach-kirkwood/include/mach/irqs.h
+1
-0
arch/arm/mach-kirkwood/include/mach/kirkwood.h
arch/arm/mach-kirkwood/include/mach/kirkwood.h
+14
-0
arch/arm/mach-kirkwood/include/mach/timex.h
arch/arm/mach-kirkwood/include/mach/timex.h
+0
-1
arch/arm/mach-kirkwood/pcie.c
arch/arm/mach-kirkwood/pcie.c
+6
-0
arch/arm/mach-kirkwood/rd88f6281-setup.c
arch/arm/mach-kirkwood/rd88f6281-setup.c
+0
-1
arch/arm/mach-mv78xx0/common.c
arch/arm/mach-mv78xx0/common.c
+6
-1
arch/arm/mach-mv78xx0/include/mach/entry-macro.S
arch/arm/mach-mv78xx0/include/mach/entry-macro.S
+13
-5
arch/arm/mach-mv78xx0/include/mach/irqs.h
arch/arm/mach-mv78xx0/include/mach/irqs.h
+6
-1
arch/arm/mach-mv78xx0/include/mach/mv78xx0.h
arch/arm/mach-mv78xx0/include/mach/mv78xx0.h
+2
-0
arch/arm/mach-mv78xx0/irq.c
arch/arm/mach-mv78xx0/irq.c
+1
-0
arch/arm/mach-orion5x/Kconfig
arch/arm/mach-orion5x/Kconfig
+26
-0
arch/arm/mach-orion5x/Makefile
arch/arm/mach-orion5x/Makefile
+4
-0
arch/arm/mach-orion5x/common.c
arch/arm/mach-orion5x/common.c
+68
-6
arch/arm/mach-orion5x/common.h
arch/arm/mach-orion5x/common.h
+2
-0
arch/arm/mach-orion5x/edmini_v2-setup.c
arch/arm/mach-orion5x/edmini_v2-setup.c
+262
-0
arch/arm/mach-orion5x/include/mach/orion5x.h
arch/arm/mach-orion5x/include/mach/orion5x.h
+5
-1
arch/arm/mach-orion5x/include/mach/timex.h
arch/arm/mach-orion5x/include/mach/timex.h
+0
-2
arch/arm/mach-orion5x/kurobox_pro-setup.c
arch/arm/mach-orion5x/kurobox_pro-setup.c
+1
-1
arch/arm/mach-orion5x/lsmini-setup.c
arch/arm/mach-orion5x/lsmini-setup.c
+279
-0
arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c
arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c
+117
-0
arch/arm/mach-orion5x/terastation_pro2-setup.c
arch/arm/mach-orion5x/terastation_pro2-setup.c
+369
-0
arch/arm/mach-orion5x/tsx09-common.c
arch/arm/mach-orion5x/tsx09-common.c
+2
-1
arch/arm/mm/Kconfig
arch/arm/mm/Kconfig
+8
-0
arch/arm/mm/cache-feroceon-l2.c
arch/arm/mm/cache-feroceon-l2.c
+25
-17
arch/arm/mm/proc-feroceon.S
arch/arm/mm/proc-feroceon.S
+8
-4
No files found.
arch/arm/Kconfig
View file @
6defd904
...
...
@@ -441,7 +441,7 @@ config ARCH_ORION5X
help
Support for the following Marvell Orion 5x series SoCs:
Orion-1 (5181), Orion-VoIP (5181L), Orion-NAS (5182),
Orion-2 (5281).
Orion-2 (5281)
, Orion-1-90 (6183)
.
config ARCH_PNX4008
bool "Philips Nexperia PNX4008 Mobile"
...
...
arch/arm/configs/orion5x_defconfig
View file @
6defd904
...
...
@@ -176,14 +176,17 @@ CONFIG_MACH_KUROBOX_PRO=y
CONFIG_MACH_DNS323=y
CONFIG_MACH_TS209=y
CONFIG_MACH_LINKSTATION_PRO=y
CONFIG_MACH_LINKSTATION_MINI=y
CONFIG_MACH_TS409=y
CONFIG_MACH_WRT350N_V2=y
CONFIG_MACH_TS78XX=y
CONFIG_MACH_MV2120=y
CONFIG_MACH_EDMINI_V2=y
CONFIG_MACH_MSS2=y
CONFIG_MACH_WNR854T=y
CONFIG_MACH_RD88F5181L_GE=y
CONFIG_MACH_RD88F5181L_FXO=y
CONFIG_MACH_RD88F6183AP_GE=y
#
# Boot options
...
...
arch/arm/mach-kirkwood/addr-map.c
View file @
6defd904
...
...
@@ -48,6 +48,7 @@
struct
mbus_dram_target_info
kirkwood_mbus_dram_info
;
static
int
__initdata
win_alloc_count
;
static
int
__init
cpu_win_can_remap
(
int
win
)
{
...
...
@@ -111,6 +112,8 @@ void __init kirkwood_setup_cpu_mbus(void)
setup_cpu_win
(
2
,
KIRKWOOD_NAND_MEM_PHYS_BASE
,
KIRKWOOD_NAND_MEM_SIZE
,
TARGET_DEV_BUS
,
ATTR_DEV_NAND
,
-
1
);
win_alloc_count
=
3
;
/*
* Setup MBUS dram target info.
*/
...
...
@@ -137,3 +140,8 @@ void __init kirkwood_setup_cpu_mbus(void)
}
kirkwood_mbus_dram_info
.
num_cs
=
cs
;
}
void
__init
kirkwood_setup_sram_win
(
u32
base
,
u32
size
)
{
setup_cpu_win
(
win_alloc_count
++
,
base
,
size
,
0x03
,
0x00
,
-
1
);
}
arch/arm/mach-kirkwood/common.c
View file @
6defd904
...
...
@@ -98,7 +98,6 @@ void __init kirkwood_ehci_init(void)
* GE00
****************************************************************************/
struct
mv643xx_eth_shared_platform_data
kirkwood_ge00_shared_data
=
{
.
t_clk
=
KIRKWOOD_TCLK
,
.
dram
=
&
kirkwood_mbus_dram_info
,
};
...
...
@@ -108,6 +107,11 @@ static struct resource kirkwood_ge00_shared_resources[] = {
.
start
=
GE00_PHYS_BASE
+
0x2000
,
.
end
=
GE00_PHYS_BASE
+
0x3fff
,
.
flags
=
IORESOURCE_MEM
,
},
{
.
name
=
"ge00 err irq"
,
.
start
=
IRQ_KIRKWOOD_GE00_ERR
,
.
end
=
IRQ_KIRKWOOD_GE00_ERR
,
.
flags
=
IORESOURCE_IRQ
,
},
};
...
...
@@ -117,7 +121,7 @@ static struct platform_device kirkwood_ge00_shared = {
.
dev
=
{
.
platform_data
=
&
kirkwood_ge00_shared_data
,
},
.
num_resources
=
1
,
.
num_resources
=
ARRAY_SIZE
(
kirkwood_ge00_shared_resources
)
,
.
resource
=
kirkwood_ge00_shared_resources
,
};
...
...
@@ -201,7 +205,6 @@ void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
* SPI
****************************************************************************/
static
struct
orion_spi_info
kirkwood_spi_plat_data
=
{
.
tclk
=
KIRKWOOD_TCLK
,
};
static
struct
resource
kirkwood_spi_resources
[]
=
{
...
...
@@ -239,7 +242,7 @@ static struct plat_serial8250_port kirkwood_uart0_data[] = {
.
flags
=
UPF_SKIP_TEST
|
UPF_BOOT_AUTOCONF
,
.
iotype
=
UPIO_MEM
,
.
regshift
=
2
,
.
uartclk
=
KIRKWOOD_TCLK
,
.
uartclk
=
0
,
},
{
},
};
...
...
@@ -283,7 +286,7 @@ static struct plat_serial8250_port kirkwood_uart1_data[] = {
.
flags
=
UPF_SKIP_TEST
|
UPF_BOOT_AUTOCONF
,
.
iotype
=
UPIO_MEM
,
.
regshift
=
2
,
.
uartclk
=
KIRKWOOD_TCLK
,
.
uartclk
=
0
,
},
{
},
};
...
...
@@ -525,9 +528,23 @@ void __init kirkwood_xor1_init(void)
/*****************************************************************************
* Time handling
****************************************************************************/
int
kirkwood_tclk
;
int
__init
kirkwood_find_tclk
(
void
)
{
u32
dev
,
rev
;
kirkwood_pcie_id
(
&
dev
,
&
rev
);
if
(
dev
==
MV88F6281_DEV_ID
&&
rev
==
MV88F6281_REV_A0
)
return
200000000
;
return
166666667
;
}
static
void
kirkwood_timer_init
(
void
)
{
orion_time_init
(
IRQ_KIRKWOOD_BRIDGE
,
KIRKWOOD_TCLK
);
kirkwood_tclk
=
kirkwood_find_tclk
();
orion_time_init
(
IRQ_KIRKWOOD_BRIDGE
,
kirkwood_tclk
);
}
struct
sys_timer
kirkwood_timer
=
{
...
...
@@ -538,33 +555,62 @@ struct sys_timer kirkwood_timer = {
/*****************************************************************************
* General
****************************************************************************/
/*
* Identify device ID and revision.
*/
static
char
*
__init
kirkwood_id
(
void
)
{
switch
(
readl
(
DEVICE_ID
)
&
0x3
)
{
case
0
:
return
"88F6180"
;
case
1
:
return
"88F6192"
;
case
2
:
return
"88F6281"
;
u32
dev
,
rev
;
kirkwood_pcie_id
(
&
dev
,
&
rev
);
if
(
dev
==
MV88F6281_DEV_ID
)
{
if
(
rev
==
MV88F6281_REV_Z0
)
return
"MV88F6281-Z0"
;
else
if
(
rev
==
MV88F6281_REV_A0
)
return
"MV88F6281-A0"
;
else
return
"MV88F6281-Rev-Unsupported"
;
}
else
if
(
dev
==
MV88F6192_DEV_ID
)
{
if
(
rev
==
MV88F6192_REV_Z0
)
return
"MV88F6192-Z0"
;
else
if
(
rev
==
MV88F6192_REV_A0
)
return
"MV88F6192-A0"
;
else
return
"MV88F6192-Rev-Unsupported"
;
}
else
if
(
dev
==
MV88F6180_DEV_ID
)
{
if
(
rev
==
MV88F6180_REV_A0
)
return
"MV88F6180-Rev-A0"
;
else
return
"MV88F6180-Rev-Unsupported"
;
}
else
{
return
"Device-Unknown"
;
}
return
"unknown 88F6000 variant"
;
}
static
int
__init
is_l2_writethrough
(
void
)
static
void
__init
kirkwood_l2_init
(
void
)
{
return
!!
(
readl
(
L2_CONFIG_REG
)
&
L2_WRITETHROUGH
);
#ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
writel
(
readl
(
L2_CONFIG_REG
)
|
L2_WRITETHROUGH
,
L2_CONFIG_REG
);
feroceon_l2_init
(
1
);
#else
writel
(
readl
(
L2_CONFIG_REG
)
&
~
L2_WRITETHROUGH
,
L2_CONFIG_REG
);
feroceon_l2_init
(
0
);
#endif
}
void
__init
kirkwood_init
(
void
)
{
printk
(
KERN_INFO
"Kirkwood: %s, TCLK=%d.
\n
"
,
kirkwood_id
(),
KIRKWOOD_TCLK
);
kirkwood_id
(),
kirkwood_tclk
);
kirkwood_ge00_shared_data
.
t_clk
=
kirkwood_tclk
;
kirkwood_spi_plat_data
.
tclk
=
kirkwood_tclk
;
kirkwood_uart0_data
[
0
].
uartclk
=
kirkwood_tclk
;
kirkwood_uart1_data
[
0
].
uartclk
=
kirkwood_tclk
;
kirkwood_setup_cpu_mbus
();
#ifdef CONFIG_CACHE_FEROCEON_L2
feroceon_l2_init
(
is_l2_writethrough
()
);
kirkwood_l2_init
(
);
#endif
}
arch/arm/mach-kirkwood/common.h
View file @
6defd904
...
...
@@ -23,10 +23,9 @@ void kirkwood_init_irq(void);
extern
struct
mbus_dram_target_info
kirkwood_mbus_dram_info
;
void
kirkwood_setup_cpu_mbus
(
void
);
void
kirkwood_setup_pcie_io_win
(
int
window
,
u32
base
,
u32
size
,
int
maj
,
int
min
);
void
kirkwood_setup_pcie_mem_win
(
int
window
,
u32
base
,
u32
size
,
int
maj
,
int
min
);
void
kirkwood_setup_sram_win
(
u32
base
,
u32
size
);
void
kirkwood_pcie_id
(
u32
*
dev
,
u32
*
rev
);
void
kirkwood_ehci_init
(
void
);
void
kirkwood_ge00_init
(
struct
mv643xx_eth_platform_data
*
eth_data
);
...
...
arch/arm/mach-kirkwood/db88f6281-bp-setup.c
View file @
6defd904
...
...
@@ -44,7 +44,6 @@ static void __init db88f6281_init(void)
kirkwood_rtc_init
();
kirkwood_sata_init
(
&
db88f6281_sata_data
);
kirkwood_uart0_init
();
kirkwood_uart1_init
();
}
static
int
__init
db88f6281_pci_init
(
void
)
...
...
arch/arm/mach-kirkwood/include/mach/irqs.h
View file @
6defd904
...
...
@@ -50,6 +50,7 @@
#define IRQ_KIRKWOOD_GPIO_HIGH_0_7 39
#define IRQ_KIRKWOOD_GPIO_HIGH_8_15 40
#define IRQ_KIRKWOOD_GPIO_HIGH_16_23 41
#define IRQ_KIRKWOOD_GE00_ERR 46
/*
* KIRKWOOD General Purpose Pins
...
...
arch/arm/mach-kirkwood/include/mach/kirkwood.h
View file @
6defd904
...
...
@@ -67,6 +67,20 @@
#define L2_CONFIG_REG (BRIDGE_VIRT_BASE | 0x0128)
#define L2_WRITETHROUGH 0x00000010
/*
* Supported devices and revisions.
*/
#define MV88F6281_DEV_ID 0x6281
#define MV88F6281_REV_Z0 0
#define MV88F6281_REV_A0 2
#define MV88F6192_DEV_ID 0x6192
#define MV88F6192_REV_Z0 0
#define MV88F6192_REV_A0 2
#define MV88F6180_DEV_ID 0x6180
#define MV88F6180_REV_A0 2
/*
* Register Map
*/
...
...
arch/arm/mach-kirkwood/include/mach/timex.h
View file @
6defd904
...
...
@@ -8,4 +8,3 @@
#define CLOCK_TICK_RATE (100 * HZ)
#define KIRKWOOD_TCLK 166666667
arch/arm/mach-kirkwood/pcie.c
View file @
6defd904
...
...
@@ -18,6 +18,12 @@
#define PCIE_BASE ((void __iomem *)PCIE_VIRT_BASE)
void
__init
kirkwood_pcie_id
(
u32
*
dev
,
u32
*
rev
)
{
*
dev
=
orion_pcie_dev_id
(
PCIE_BASE
);
*
rev
=
orion_pcie_rev
(
PCIE_BASE
);
}
static
int
pcie_valid_config
(
int
bus
,
int
dev
)
{
/*
...
...
arch/arm/mach-kirkwood/rd88f6281-setup.c
View file @
6defd904
...
...
@@ -90,7 +90,6 @@ static void __init rd88f6281_init(void)
kirkwood_rtc_init
();
kirkwood_sata_init
(
&
rd88f6281_sata_data
);
kirkwood_uart0_init
();
kirkwood_uart1_init
();
platform_device_register
(
&
rd88f6281_nand_flash
);
}
...
...
arch/arm/mach-mv78xx0/common.c
View file @
6defd904
...
...
@@ -285,6 +285,11 @@ static struct resource mv78xx0_ge00_shared_resources[] = {
.
start
=
GE00_PHYS_BASE
+
0x2000
,
.
end
=
GE00_PHYS_BASE
+
0x3fff
,
.
flags
=
IORESOURCE_MEM
,
},
{
.
name
=
"ge err irq"
,
.
start
=
IRQ_MV78XX0_GE_ERR
,
.
end
=
IRQ_MV78XX0_GE_ERR
,
.
flags
=
IORESOURCE_IRQ
,
},
};
...
...
@@ -294,7 +299,7 @@ static struct platform_device mv78xx0_ge00_shared = {
.
dev
=
{
.
platform_data
=
&
mv78xx0_ge00_shared_data
,
},
.
num_resources
=
1
,
.
num_resources
=
ARRAY_SIZE
(
mv78xx0_ge00_shared_resources
)
,
.
resource
=
mv78xx0_ge00_shared_resources
,
};
...
...
arch/arm/mach-mv78xx0/include/mach/entry-macro.S
View file @
6defd904
...
...
@@ -26,14 +26,22 @@
ldr
\
tmp
,
[
\
base
,
#
IRQ_MASK_LOW_OFF
]
mov
\
irqnr
,
#
31
ands
\
irqstat
,
\
irqstat
,
\
tmp
bne
1001
f
@
if
no
low
interrupts
set
,
check
high
interrupts
ldreq
\
irqstat
,
[
\
base
,
#
IRQ_CAUSE_HIGH_OFF
]
ldreq
\
tmp
,
[
\
base
,
#
IRQ_MASK_HIGH_OFF
]
moveq
\
irqnr
,
#
63
andeqs
\
irqstat
,
\
irqstat
,
\
tmp
ldr
\
irqstat
,
[
\
base
,
#
IRQ_CAUSE_HIGH_OFF
]
ldr
\
tmp
,
[
\
base
,
#
IRQ_MASK_HIGH_OFF
]
mov
\
irqnr
,
#
63
ands
\
irqstat
,
\
irqstat
,
\
tmp
bne
1001
f
@
if
no
high
interrupts
set
,
check
error
interrupts
ldr
\
irqstat
,
[
\
base
,
#
IRQ_CAUSE_ERR_OFF
]
ldr
\
tmp
,
[
\
base
,
#
IRQ_MASK_ERR_OFF
]
mov
\
irqnr
,
#
95
ands
\
irqstat
,
\
irqstat
,
\
tmp
@
find
first
active
interrupt
source
clzne
\
irqstat
,
\
irqstat
1001
:
clzne
\
irqstat
,
\
irqstat
subne
\
irqnr
,
\
irqnr
,
\
irqstat
.
endm
arch/arm/mach-mv78xx0/include/mach/irqs.h
View file @
6defd904
...
...
@@ -79,10 +79,15 @@
#define IRQ_MV78XX0_DB_IN 60
#define IRQ_MV78XX0_DB_OUT 61
/*
* MV78xx0 Error Interrupt Controller
*/
#define IRQ_MV78XX0_GE_ERR 70
/*
* MV78XX0 General Purpose Pins
*/
#define IRQ_MV78XX0_GPIO_START
64
#define IRQ_MV78XX0_GPIO_START
96
#define NR_GPIO_IRQS GPIO_MAX
#define NR_IRQS (IRQ_MV78XX0_GPIO_START + NR_GPIO_IRQS)
...
...
arch/arm/mach-mv78xx0/include/mach/mv78xx0.h
View file @
6defd904
...
...
@@ -71,8 +71,10 @@
#define BRIDGE_INT_TIMER1 0x0004
#define BRIDGE_INT_TIMER1_CLR (~0x0004)
#define IRQ_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0200)
#define IRQ_CAUSE_ERR_OFF 0x0000
#define IRQ_CAUSE_LOW_OFF 0x0004
#define IRQ_CAUSE_HIGH_OFF 0x0008
#define IRQ_MASK_ERR_OFF 0x000c
#define IRQ_MASK_LOW_OFF 0x0010
#define IRQ_MASK_HIGH_OFF 0x0014
#define TIMER_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0300)
...
...
arch/arm/mach-mv78xx0/irq.c
View file @
6defd904
...
...
@@ -19,4 +19,5 @@ void __init mv78xx0_init_irq(void)
{
orion_irq_init
(
0
,
(
void
__iomem
*
)(
IRQ_VIRT_BASE
+
IRQ_MASK_LOW_OFF
));
orion_irq_init
(
32
,
(
void
__iomem
*
)(
IRQ_VIRT_BASE
+
IRQ_MASK_HIGH_OFF
));
orion_irq_init
(
64
,
(
void
__iomem
*
)(
IRQ_VIRT_BASE
+
IRQ_MASK_ERR_OFF
));
}
arch/arm/mach-orion5x/Kconfig
View file @
6defd904
...
...
@@ -36,6 +36,12 @@ config MACH_TS209
Say 'Y' here if you want your kernel to support the
QNAP TS-109/TS-209 platform.
config MACH_TERASTATION_PRO2
bool "Buffalo Terastation Pro II/Live"
help
Say 'Y' here if you want your kernel to support the
Buffalo Terastation Pro II/Live platform.
config MACH_LINKSTATION_PRO
bool "Buffalo Linkstation Pro/Live"
select I2C_BOARDINFO
...
...
@@ -44,6 +50,13 @@ config MACH_LINKSTATION_PRO
Buffalo Linkstation Pro/Live platform. Both v1 and
v2 devices are supported.
config MACH_LINKSTATION_MINI
bool "Buffalo Linkstation Mini"
select I2C_BOARDINFO
help
Say 'Y' here if you want your kernel to support the
Buffalo Linkstation Mini platform.
config MACH_TS409
bool "QNAP TS-409"
help
...
...
@@ -68,6 +81,13 @@ config MACH_MV2120
Say 'Y' here if you want your kernel to support the
HP Media Vault mv2120 or mv5100.
config MACH_EDMINI_V2
bool "LaCie Ethernet Disk mini V2"
select I2C_BOARDINFO
help
Say 'Y' here if you want your kernel to support the
LaCie Ethernet Disk mini V2.
config MACH_MSS2
bool "Maxtor Shared Storage II"
help
...
...
@@ -92,6 +112,12 @@ config MACH_RD88F5181L_FXO
Say 'Y' here if you want your kernel to support the
Marvell Orion-VoIP FXO (88F5181L) RD.
config MACH_RD88F6183AP_GE
bool "Marvell Orion-1-90 AP GE Reference Design"
help
Say 'Y' here if you want your kernel to support the
Marvell Orion-1-90 (88F6183) AP GE RD.
endmenu
endif
arch/arm/mach-orion5x/Makefile
View file @
6defd904
...
...
@@ -2,14 +2,18 @@ obj-y += common.o addr-map.o pci.o gpio.o irq.o mpp.o
obj-$(CONFIG_MACH_DB88F5281)
+=
db88f5281-setup.o
obj-$(CONFIG_MACH_RD88F5182)
+=
rd88f5182-setup.o
obj-$(CONFIG_MACH_KUROBOX_PRO)
+=
kurobox_pro-setup.o
obj-$(CONFIG_MACH_TERASTATION_PRO2)
+=
terastation_pro2-setup.o
obj-$(CONFIG_MACH_LINKSTATION_PRO)
+=
kurobox_pro-setup.o
obj-$(CONFIG_MACH_LINKSTATION_MINI)
+=
lsmini-setup.o
obj-$(CONFIG_MACH_DNS323)
+=
dns323-setup.o
obj-$(CONFIG_MACH_TS209)
+=
ts209-setup.o tsx09-common.o
obj-$(CONFIG_MACH_TS409)
+=
ts409-setup.o tsx09-common.o
obj-$(CONFIG_MACH_WRT350N_V2)
+=
wrt350n-v2-setup.o
obj-$(CONFIG_MACH_TS78XX)
+=
ts78xx-setup.o
obj-$(CONFIG_MACH_MV2120)
+=
mv2120-setup.o
obj-$(CONFIG_MACH_EDMINI_V2)
+=
edmini_v2-setup.o
obj-$(CONFIG_MACH_MSS2)
+=
mss2-setup.o
obj-$(CONFIG_MACH_WNR854T)
+=
wnr854t-setup.o
obj-$(CONFIG_MACH_RD88F5181L_GE)
+=
rd88f5181l-ge-setup.o
obj-$(CONFIG_MACH_RD88F5181L_FXO)
+=
rd88f5181l-fxo-setup.o
obj-$(CONFIG_MACH_RD88F6183AP_GE)
+=
rd88f6183ap-ge-setup.o
arch/arm/mach-orion5x/common.c
View file @
6defd904
...
...
@@ -18,6 +18,7 @@
#include <linux/mv643xx_eth.h>
#include <linux/mv643xx_i2c.h>
#include <linux/ata_platform.h>
#include <linux/spi/orion_spi.h>
#include <asm/page.h>
#include <asm/setup.h>
#include <asm/timex.h>
...
...
@@ -146,7 +147,6 @@ void __init orion5x_ehci1_init(void)
****************************************************************************/
struct
mv643xx_eth_shared_platform_data
orion5x_eth_shared_data
=
{
.
dram
=
&
orion5x_mbus_dram_info
,
.
t_clk
=
ORION5X_TCLK
,
};
static
struct
resource
orion5x_eth_shared_resources
[]
=
{
...
...
@@ -154,6 +154,10 @@ static struct resource orion5x_eth_shared_resources[] = {
.
start
=
ORION5X_ETH_PHYS_BASE
+
0x2000
,
.
end
=
ORION5X_ETH_PHYS_BASE
+
0x3fff
,
.
flags
=
IORESOURCE_MEM
,
},
{
.
start
=
IRQ_ORION5X_ETH_ERR
,
.
end
=
IRQ_ORION5X_ETH_ERR
,
.
flags
=
IORESOURCE_IRQ
,
},
};
...
...
@@ -163,7 +167,7 @@ static struct platform_device orion5x_eth_shared = {
.
dev
=
{
.
platform_data
=
&
orion5x_eth_shared_data
,
},
.
num_resources
=
1
,
.
num_resources
=
ARRAY_SIZE
(
orion5x_eth_shared_resources
)
,
.
resource
=
orion5x_eth_shared_resources
,
};
...
...
@@ -267,6 +271,38 @@ void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data)
}
/*****************************************************************************
* SPI
****************************************************************************/
static
struct
orion_spi_info
orion5x_spi_plat_data
=
{
.
tclk
=
0
,
};
static
struct
resource
orion5x_spi_resources
[]
=
{
{
.
name
=
"spi base"
,
.
start
=
SPI_PHYS_BASE
,
.
end
=
SPI_PHYS_BASE
+
0x1f
,
.
flags
=
IORESOURCE_MEM
,
},
};
static
struct
platform_device
orion5x_spi
=
{
.
name
=
"orion_spi"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
orion5x_spi_plat_data
,
},
.
num_resources
=
ARRAY_SIZE
(
orion5x_spi_resources
),
.
resource
=
orion5x_spi_resources
,
};
void
__init
orion5x_spi_init
()
{
platform_device_register
(
&
orion5x_spi
);
}
/*****************************************************************************
* UART0
****************************************************************************/
...
...
@@ -278,7 +314,7 @@ static struct plat_serial8250_port orion5x_uart0_data[] = {
.
flags
=
UPF_SKIP_TEST
|
UPF_BOOT_AUTOCONF
,
.
iotype
=
UPIO_MEM
,
.
regshift
=
2
,
.
uartclk
=
ORION5X_TCLK
,
.
uartclk
=
0
,
},
{
},
};
...
...
@@ -322,7 +358,7 @@ static struct plat_serial8250_port orion5x_uart1_data[] = {
.
flags
=
UPF_SKIP_TEST
|
UPF_BOOT_AUTOCONF
,
.
iotype
=
UPIO_MEM
,
.
regshift
=
2
,
.
uartclk
=
ORION5X_TCLK
,
.
uartclk
=
0
,
},
{
},
};
...
...
@@ -455,9 +491,24 @@ void __init orion5x_xor_init(void)
/*****************************************************************************
* Time handling
****************************************************************************/
int
orion5x_tclk
;
int
__init
orion5x_find_tclk
(
void
)
{
u32
dev
,
rev
;
orion5x_pcie_id
(
&
dev
,
&
rev
);
if
(
dev
==
MV88F6183_DEV_ID
&&
(
readl
(
MPP_RESET_SAMPLE
)
&
0x00000200
)
==
0
)
return
133333333
;
return
166666667
;
}
static
void
orion5x_timer_init
(
void
)
{
orion_time_init
(
IRQ_ORION5X_BRIDGE
,
ORION5X_TCLK
);
orion5x_tclk
=
orion5x_find_tclk
();
orion_time_init
(
IRQ_ORION5X_BRIDGE
,
orion5x_tclk
);
}
struct
sys_timer
orion5x_timer
=
{
...
...
@@ -499,6 +550,12 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name)
}
else
{
*
dev_name
=
"MV88F5181(L)-Rev-Unsupported"
;
}
}
else
if
(
*
dev
==
MV88F6183_DEV_ID
)
{
if
(
*
rev
==
MV88F6183_REV_B0
)
{
*
dev_name
=
"MV88F6183-Rev-B0"
;
}
else
{
*
dev_name
=
"MV88F6183-Rev-Unsupported"
;
}
}
else
{
*
dev_name
=
"Device-Unknown"
;
}
...
...
@@ -510,7 +567,12 @@ void __init orion5x_init(void)
u32
dev
,
rev
;
orion5x_id
(
&
dev
,
&
rev
,
&
dev_name
);
printk
(
KERN_INFO
"Orion ID: %s. TCLK=%d.
\n
"
,
dev_name
,
ORION5X_TCLK
);
printk
(
KERN_INFO
"Orion ID: %s. TCLK=%d.
\n
"
,
dev_name
,
orion5x_tclk
);
orion5x_eth_shared_data
.
t_clk
=
orion5x_tclk
;
orion5x_spi_plat_data
.
tclk
=
orion5x_tclk
;
orion5x_uart0_data
[
0
].
uartclk
=
orion5x_tclk
;
orion5x_uart1_data
[
0
].
uartclk
=
orion5x_tclk
;
/*
* Setup Orion address map
...
...
arch/arm/mach-orion5x/common.h
View file @
6defd904
...
...
@@ -10,6 +10,7 @@ struct mv_sata_platform_data;
void
orion5x_map_io
(
void
);
void
orion5x_init_irq
(
void
);
void
orion5x_init
(
void
);
extern
int
orion5x_tclk
;
extern
struct
sys_timer
orion5x_timer
;
/*
...
...
@@ -30,6 +31,7 @@ void orion5x_ehci1_init(void);
void
orion5x_eth_init
(
struct
mv643xx_eth_platform_data
*
eth_data
);
void
orion5x_i2c_init
(
void
);
void
orion5x_sata_init
(
struct
mv_sata_platform_data
*
sata_data
);
void
orion5x_spi_init
(
void
);
void
orion5x_uart0_init
(
void
);
void
orion5x_uart1_init
(
void
);
void
orion5x_xor_init
(
void
);
...
...
arch/arm/mach-orion5x/edmini_v2-setup.c
0 → 100644
View file @
6defd904
/*
* arch/arm/mach-orion5x/edmini_v2-setup.c
*
* LaCie Ethernet Disk mini V2 Setup
*
* Copyright (C) 2008 Christopher Moore <moore@free.fr>
* Copyright (C) 2008 Albert Aribaud <albert.aribaud@free.fr>
*
* 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.
*/
/*
* TODO: add Orion USB device port init when kernel.org support is added.
* TODO: add flash write support: see below.
* TODO: add power-off support.
* TODO: add I2C EEPROM support.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/pci.h>
#include <linux/irq.h>
#include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h>
#include <linux/leds.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/i2c.h>
#include <linux/ata_platform.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/pci.h>
#include <mach/orion5x.h>
#include "common.h"
#include "mpp.h"
/*****************************************************************************
* EDMINI_V2 Info
****************************************************************************/
/*
* 512KB NOR flash Device bus boot chip select
*/
#define EDMINI_V2_NOR_BOOT_BASE 0xfff80000
#define EDMINI_V2_NOR_BOOT_SIZE SZ_512K
/*****************************************************************************
* 512KB NOR Flash on BOOT Device
****************************************************************************/
/*
* Currently the MTD code does not recognize the MX29LV400CBCT as a bottom
* -type device. This could cause risks of accidentally erasing critical
* flash sectors. We thus define a single, write-protected partition covering
* the whole flash.
* TODO: once the flash part TOP/BOTTOM detection issue is sorted out in the MTD
* code, break this into at least three partitions: 'u-boot code', 'u-boot
* environment' and 'whatever is left'.
*/
static
struct
mtd_partition
edmini_v2_partitions
[]
=
{
{
.
name
=
"Full512kb"
,
.
size
=
0x00080000
,
.
offset
=
0x00000000
,
.
mask_flags
=
MTD_WRITEABLE
,
},
};
static
struct
physmap_flash_data
edmini_v2_nor_flash_data
=
{
.
width
=
1
,
.
parts
=
edmini_v2_partitions
,
.
nr_parts
=
ARRAY_SIZE
(
edmini_v2_partitions
),
};
static
struct
resource
edmini_v2_nor_flash_resource
=
{
.
flags
=
IORESOURCE_MEM
,
.
start
=
EDMINI_V2_NOR_BOOT_BASE
,
.
end
=
EDMINI_V2_NOR_BOOT_BASE
+
EDMINI_V2_NOR_BOOT_SIZE
-
1
,
};
static
struct
platform_device
edmini_v2_nor_flash
=
{
.
name
=
"physmap-flash"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
edmini_v2_nor_flash_data
,
},
.
num_resources
=
1
,
.
resource
=
&
edmini_v2_nor_flash_resource
,
};
/*****************************************************************************
* Ethernet
****************************************************************************/
static
struct
mv643xx_eth_platform_data
edmini_v2_eth_data
=
{
.
phy_addr
=
8
,
};
/*****************************************************************************
* RTC 5C372a on I2C bus
****************************************************************************/
#define EDMINIV2_RTC_GPIO 3
static
struct
i2c_board_info
__initdata
edmini_v2_i2c_rtc
=
{
I2C_BOARD_INFO
(
"rs5c372a"
,
0x32
),
.
irq
=
0
,
};
/*****************************************************************************
* Sata
****************************************************************************/
static
struct
mv_sata_platform_data
edmini_v2_sata_data
=
{
.
n_ports
=
2
,
};
/*****************************************************************************
* GPIO LED (simple - doesn't use hardware blinking support)
****************************************************************************/
#define EDMINI_V2_GPIO_LED_POWER 16
static
struct
gpio_led
edmini_v2_leds
[]
=
{
{
.
name
=
"power:blue"
,
.
gpio
=
EDMINI_V2_GPIO_LED_POWER
,
.
active_low
=
1
,
},
};
static
struct
gpio_led_platform_data
edmini_v2_led_data
=
{
.
num_leds
=
ARRAY_SIZE
(
edmini_v2_leds
),
.
leds
=
edmini_v2_leds
,
};
static
struct
platform_device
edmini_v2_gpio_leds
=
{
.
name
=
"leds-gpio"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
&
edmini_v2_led_data
,
},
};
/****************************************************************************
* GPIO key
****************************************************************************/
#define EDMINI_V2_GPIO_KEY_POWER 18
static
struct
gpio_keys_button
edmini_v2_buttons
[]
=
{
{
.
code
=
KEY_POWER
,
.
gpio
=
EDMINI_V2_GPIO_KEY_POWER
,
.
desc
=
"Power Button"
,
.
active_low
=
0
,
},
};
static
struct
gpio_keys_platform_data
edmini_v2_button_data
=
{
.
buttons
=
edmini_v2_buttons
,
.
nbuttons
=
ARRAY_SIZE
(
edmini_v2_buttons
),
};
static
struct
platform_device
edmini_v2_gpio_buttons
=
{
.
name
=
"gpio-keys"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
&
edmini_v2_button_data
,
},
};
/*****************************************************************************
* General Setup
****************************************************************************/
static
struct
orion5x_mpp_mode
edminiv2_mpp_modes
[]
__initdata
=
{
{
0
,
MPP_UNUSED
},
{
1
,
MPP_UNUSED
},
{
2
,
MPP_UNUSED
},
{
3
,
MPP_GPIO
},
/* RTC interrupt */
{
4
,
MPP_UNUSED
},
{
5
,
MPP_UNUSED
},
{
6
,
MPP_UNUSED
},
{
7
,
MPP_UNUSED
},
{
8
,
MPP_UNUSED
},
{
9
,
MPP_UNUSED
},
{
10
,
MPP_UNUSED
},
{
11
,
MPP_UNUSED
},
{
12
,
MPP_SATA_LED
},
/* SATA 0 presence */
{
13
,
MPP_SATA_LED
},
/* SATA 1 presence */
{
14
,
MPP_SATA_LED
},
/* SATA 0 active */
{
15
,
MPP_SATA_LED
},
/* SATA 1 active */
/* 16: Power LED control (0 = On, 1 = Off) */
{
16
,
MPP_GPIO
},
/* 17: Power LED control select (0 = CPLD, 1 = GPIO16) */
{
17
,
MPP_GPIO
},
/* 18: Power button status (0 = Released, 1 = Pressed) */
{
18
,
MPP_GPIO
},
{
19
,
MPP_UNUSED
},
{
-
1
}
};
static
void
__init
edmini_v2_init
(
void
)
{
/*
* Setup basic Orion functions. Need to be called early.
*/
orion5x_init
();
orion5x_mpp_conf
(
edminiv2_mpp_modes
);
/*
* Configure peripherals.
*/
orion5x_ehci0_init
();
orion5x_eth_init
(
&
edmini_v2_eth_data
);
orion5x_i2c_init
();
orion5x_sata_init
(
&
edmini_v2_sata_data
);
orion5x_uart0_init
();
orion5x_setup_dev_boot_win
(
EDMINI_V2_NOR_BOOT_BASE
,
EDMINI_V2_NOR_BOOT_SIZE
);
platform_device_register
(
&
edmini_v2_nor_flash
);
platform_device_register
(
&
edmini_v2_gpio_leds
);
platform_device_register
(
&
edmini_v2_gpio_buttons
);
pr_notice
(
"edmini_v2: USB device port, flash write and power-off "
"are not yet supported.
\n
"
);
/* Get RTC IRQ and register the chip */
if
(
gpio_request
(
EDMINIV2_RTC_GPIO
,
"rtc"
)
==
0
)
{
if
(
gpio_direction_input
(
EDMINIV2_RTC_GPIO
)
==
0
)
edmini_v2_i2c_rtc
.
irq
=
gpio_to_irq
(
EDMINIV2_RTC_GPIO
);
else
gpio_free
(
EDMINIV2_RTC_GPIO
);
}
if
(
edmini_v2_i2c_rtc
.
irq
==
0
)
pr_warning
(
"edmini_v2: failed to get RTC IRQ
\n
"
);
i2c_register_board_info
(
0
,
&
edmini_v2_i2c_rtc
,
1
);
}
/* Warning: LaCie use a wrong mach-type (0x20e=526) in their bootloader. */
MACHINE_START
(
EDMINI_V2
,
"LaCie Ethernet Disk mini V2"
)
/* Maintainer: Christopher Moore <moore@free.fr> */
.
phys_io
=
ORION5X_REGS_PHYS_BASE
,
.
io_pg_offst
=
((
ORION5X_REGS_VIRT_BASE
)
>>
18
)
&
0xFFFC
,
.
boot_params
=
0x00000100
,
.
init_machine
=
edmini_v2_init
,
.
map_io
=
orion5x_map_io
,
.
init_irq
=
orion5x_init_irq
,
.
timer
=
&
orion5x_timer
,
.
fixup
=
tag_fixup_mem32
,
MACHINE_END
arch/arm/mach-orion5x/include/mach/orion5x.h
View file @
6defd904
...
...
@@ -2,7 +2,7 @@
* arch/arm/mach-orion5x/include/mach/orion5x.h
*
* Generic definitions of Orion SoC flavors:
* Orion-1, Orion-VoIP, Orion-NAS,
and Orion-2
.
* Orion-1, Orion-VoIP, Orion-NAS,
Orion-2, and Orion-1-90
.
*
* Maintainer: Tzachi Perelstein <tzachi@marvell.com>
*
...
...
@@ -76,6 +76,9 @@
#define MV88F5281_REV_D0 4
#define MV88F5281_REV_D1 5
#define MV88F5281_REV_D2 6
/* Orion-1-90 (88F6183) */
#define MV88F6183_DEV_ID 0x6183
#define MV88F6183_REV_B0 3
/*******************************************************************************
* Orion Registers Map
...
...
@@ -86,6 +89,7 @@
#define ORION5X_DEV_BUS_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x10000)
#define ORION5X_DEV_BUS_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x10000)
#define ORION5X_DEV_BUS_REG(x) (ORION5X_DEV_BUS_VIRT_BASE | (x))
#define SPI_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x0600)
#define I2C_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x1000)
#define UART0_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x2000)
#define UART0_VIRT_BASE (ORION5X_DEV_BUS_VIRT_BASE | 0x2000)
...
...
arch/arm/mach-orion5x/include/mach/timex.h
View file @
6defd904
...
...
@@ -9,5 +9,3 @@
*/
#define CLOCK_TICK_RATE (100 * HZ)
#define ORION5X_TCLK 166666667
arch/arm/mach-orion5x/kurobox_pro-setup.c
View file @
6defd904
...
...
@@ -293,7 +293,7 @@ static void kurobox_pro_power_off(void)
const
unsigned
char
shutdownwait
[]
=
{
0x00
,
0x0c
};
const
unsigned
char
poweroff
[]
=
{
0x00
,
0x06
};
/* 38400 baud divisor */
const
unsigned
divisor
=
((
ORION5X_TCLK
+
(
8
*
38400
))
/
(
16
*
38400
));
const
unsigned
divisor
=
((
orion5x_tclk
+
(
8
*
38400
))
/
(
16
*
38400
));
pr_info
(
"%s: triggering power-off...
\n
"
,
__func__
);
...
...
arch/arm/mach-orion5x/lsmini-setup.c
0 → 100644
View file @
6defd904
/*
* arch/arm/mach-orion5x/lsmini-setup.c
*
* Maintainer: Alexey Kopytko <alexey@kopytko.ru>
*
* 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/platform_device.h>
#include <linux/pci.h>
#include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h>
#include <linux/leds.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/i2c.h>
#include <linux/ata_platform.h>
#include <asm/mach-types.h>
#include <linux/gpio.h>
#include <asm/mach/arch.h>
#include "common.h"
#include "mpp.h"
#include "include/mach/system.h"
/*****************************************************************************
* Linkstation Mini Info
****************************************************************************/
/*
* 256K NOR flash Device bus boot chip select
*/
#define LSMINI_NOR_BOOT_BASE 0xf4000000
#define LSMINI_NOR_BOOT_SIZE SZ_256K
/*****************************************************************************
* 256KB NOR Flash on BOOT Device
****************************************************************************/
static
struct
physmap_flash_data
lsmini_nor_flash_data
=
{
.
width
=
1
,
};
static
struct
resource
lsmini_nor_flash_resource
=
{
.
flags
=
IORESOURCE_MEM
,
.
start
=
LSMINI_NOR_BOOT_BASE
,
.
end
=
LSMINI_NOR_BOOT_BASE
+
LSMINI_NOR_BOOT_SIZE
-
1
,
};
static
struct
platform_device
lsmini_nor_flash
=
{
.
name
=
"physmap-flash"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
lsmini_nor_flash_data
,
},
.
num_resources
=
1
,
.
resource
=
&
lsmini_nor_flash_resource
,
};
/*****************************************************************************
* Ethernet
****************************************************************************/
static
struct
mv643xx_eth_platform_data
lsmini_eth_data
=
{
.
phy_addr
=
8
,
};
/*****************************************************************************
* RTC 5C372a on I2C bus
****************************************************************************/
static
struct
i2c_board_info
__initdata
lsmini_i2c_rtc
=
{
I2C_BOARD_INFO
(
"rs5c372a"
,
0x32
),
};
/*****************************************************************************
* LEDs attached to GPIO
****************************************************************************/
#define LSMINI_GPIO_LED_ALARM 2
#define LSMINI_GPIO_LED_INFO 3
#define LSMINI_GPIO_LED_FUNC 9
#define LSMINI_GPIO_LED_PWR 14
static
struct
gpio_led
lsmini_led_pins
[]
=
{
{
.
name
=
"alarm:red"
,
.
gpio
=
LSMINI_GPIO_LED_ALARM
,
.
active_low
=
1
,
},
{
.
name
=
"info:amber"
,
.
gpio
=
LSMINI_GPIO_LED_INFO
,
.
active_low
=
1
,
},
{
.
name
=
"func:blue:top"
,
.
gpio
=
LSMINI_GPIO_LED_FUNC
,
.
active_low
=
1
,
},
{
.
name
=
"power:blue:bottom"
,
.
gpio
=
LSMINI_GPIO_LED_PWR
,
},
};
static
struct
gpio_led_platform_data
lsmini_led_data
=
{
.
leds
=
lsmini_led_pins
,
.
num_leds
=
ARRAY_SIZE
(
lsmini_led_pins
),
};
static
struct
platform_device
lsmini_leds
=
{
.
name
=
"leds-gpio"
,
.
id
=
-
1
,
.
dev
=
{
.
platform_data
=
&
lsmini_led_data
,
},
};
/****************************************************************************
* GPIO Attached Keys
****************************************************************************/
#define LSMINI_GPIO_KEY_FUNC 15
#define LSMINI_GPIO_KEY_POWER 18
#define LSMINI_GPIO_KEY_AUTOPOWER 17
#define LSMINI_SW_POWER 0x00
#define LSMINI_SW_AUTOPOWER 0x01
static
struct
gpio_keys_button
lsmini_buttons
[]
=
{
{
.
code
=
KEY_OPTION
,
.
gpio
=
LSMINI_GPIO_KEY_FUNC
,
.
desc
=
"Function Button"
,
.
active_low
=
1
,
},
{
.
type
=
EV_SW
,
.
code
=
LSMINI_SW_POWER
,
.
gpio
=
LSMINI_GPIO_KEY_POWER
,
.
desc
=
"Power-on Switch"
,
.
active_low
=
1
,
},
{
.
type
=
EV_SW
,
.
code
=
LSMINI_SW_AUTOPOWER
,
.
gpio
=
LSMINI_GPIO_KEY_AUTOPOWER
,
.
desc
=
"Power-auto Switch"
,
.
active_low
=
1
,
},
};
static
struct
gpio_keys_platform_data
lsmini_button_data
=
{
.
buttons
=
lsmini_buttons
,
.
nbuttons
=
ARRAY_SIZE
(
lsmini_buttons
),
};
static
struct
platform_device
lsmini_button_device
=
{
.
name
=
"gpio-keys"
,
.
id
=
-
1
,
.
num_resources
=
0
,
.
dev
=
{
.
platform_data
=
&
lsmini_button_data
,
},
};
/*****************************************************************************
* SATA
****************************************************************************/
static
struct
mv_sata_platform_data
lsmini_sata_data
=
{
.
n_ports
=
2
,
};
/*****************************************************************************
* Linkstation Mini specific power off method: reboot
****************************************************************************/
/*
* On the Linkstation Mini, the shutdown process is following:
* - Userland monitors key events until the power switch goes to off position
* - The board reboots
* - U-boot starts and goes into an idle mode waiting for the user
* to move the switch to ON position
*/
static
void
lsmini_power_off
(
void
)
{
arch_reset
(
0
);
}
/*****************************************************************************
* General Setup
****************************************************************************/
#define LSMINI_GPIO_USB_POWER 16
#define LSMINI_GPIO_AUTO_POWER 17
#define LSMINI_GPIO_POWER 18
#define LSMINI_GPIO_HDD_POWER0 1
#define LSMINI_GPIO_HDD_POWER1 19
static
struct
orion5x_mpp_mode
lsmini_mpp_modes
[]
__initdata
=
{
{
0
,
MPP_UNUSED
},
/* LED_RESERVE1 (unused) */
{
1
,
MPP_GPIO
},
/* HDD_PWR */
{
2
,
MPP_GPIO
},
/* LED_ALARM */
{
3
,
MPP_GPIO
},
/* LED_INFO */
{
4
,
MPP_UNUSED
},
{
5
,
MPP_UNUSED
},
{
6
,
MPP_UNUSED
},
{
7
,
MPP_UNUSED
},
{
8
,
MPP_UNUSED
},
{
9
,
MPP_GPIO
},
/* LED_FUNC */
{
10
,
MPP_UNUSED
},
{
11
,
MPP_UNUSED
},
/* LED_ETH (dummy) */
{
12
,
MPP_UNUSED
},
{
13
,
MPP_UNUSED
},
{
14
,
MPP_GPIO
},
/* LED_PWR */
{
15
,
MPP_GPIO
},
/* FUNC */
{
16
,
MPP_GPIO
},
/* USB_PWR */
{
17
,
MPP_GPIO
},
/* AUTO_POWER */
{
18
,
MPP_GPIO
},
/* POWER */
{
19
,
MPP_GPIO
},
/* HDD_PWR1 */
{
-
1
},
};
static
void
__init
lsmini_init
(
void
)
{
/*
* Setup basic Orion functions. Need to be called early.
*/
orion5x_init
();
orion5x_mpp_conf
(
lsmini_mpp_modes
);
/*
* Configure peripherals.
*/
orion5x_ehci0_init
();
orion5x_ehci1_init
();
orion5x_eth_init
(
&
lsmini_eth_data
);
orion5x_i2c_init
();
orion5x_sata_init
(
&
lsmini_sata_data
);
orion5x_uart0_init
();
orion5x_xor_init
();
orion5x_setup_dev_boot_win
(
LSMINI_NOR_BOOT_BASE
,
LSMINI_NOR_BOOT_SIZE
);
platform_device_register
(
&
lsmini_nor_flash
);
platform_device_register
(
&
lsmini_button_device
);
platform_device_register
(
&
lsmini_leds
);
i2c_register_board_info
(
0
,
&
lsmini_i2c_rtc
,
1
);
/* enable USB power */
gpio_set_value
(
LSMINI_GPIO_USB_POWER
,
1
);
/* register power-off method */
pm_power_off
=
lsmini_power_off
;
pr_info
(
"%s: finished
\n
"
,
__func__
);
}
#ifdef CONFIG_MACH_LINKSTATION_MINI
MACHINE_START
(
LINKSTATION_MINI
,
"Buffalo Linkstation Mini"
)
/* Maintainer: Alexey Kopytko <alexey@kopytko.ru> */
.
phys_io
=
ORION5X_REGS_PHYS_BASE
,
.
io_pg_offst
=
((
ORION5X_REGS_VIRT_BASE
)
>>
18
)
&
0xFFFC
,
.
boot_params
=
0x00000100
,
.
init_machine
=
lsmini_init
,
.
map_io
=
orion5x_map_io
,
.
init_irq
=
orion5x_init_irq
,
.
timer
=
&
orion5x_timer
,
.
fixup
=
tag_fixup_mem32
,
MACHINE_END
#endif
arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c
0 → 100644
View file @
6defd904
/*
* arch/arm/mach-orion5x/rd88f6183-ap-ge-setup.c
*
* Marvell Orion-1-90 AP GE Reference Design Setup
*
* 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/platform_device.h>
#include <linux/pci.h>
#include <linux/irq.h>
#include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h>
#include <linux/spi/spi.h>
#include <linux/spi/orion_spi.h>
#include <linux/spi/flash.h>
#include <linux/ethtool.h>
#include <asm/mach-types.h>
#include <asm/gpio.h>
#include <asm/leds.h>
#include <asm/mach/arch.h>
#include <asm/mach/pci.h>
#include <mach/orion5x.h>
#include "common.h"
#include "mpp.h"
static
struct
mv643xx_eth_platform_data
rd88f6183ap_ge_eth_data
=
{
.
phy_addr
=
-
1
,
.
speed
=
SPEED_1000
,
.
duplex
=
DUPLEX_FULL
,
};
static
struct
mtd_partition
rd88f6183ap_ge_partitions
[]
=
{
{
.
name
=
"kernel"
,
.
offset
=
0x00000000
,
.
size
=
0x00200000
,
},
{
.
name
=
"rootfs"
,
.
offset
=
0x00200000
,
.
size
=
0x00500000
,
},
{
.
name
=
"nvram"
,
.
offset
=
0x00700000
,
.
size
=
0x00080000
,
},
};
static
struct
flash_platform_data
rd88f6183ap_ge_spi_slave_data
=
{
.
type
=
"m25p64"
,
.
nr_parts
=
ARRAY_SIZE
(
rd88f6183ap_ge_partitions
),
.
parts
=
rd88f6183ap_ge_partitions
,
};
static
struct
spi_board_info
__initdata
rd88f6183ap_ge_spi_slave_info
[]
=
{
{
.
modalias
=
"m25p80"
,
.
platform_data
=
&
rd88f6183ap_ge_spi_slave_data
,
.
irq
=
NO_IRQ
,
.
max_speed_hz
=
20000000
,
.
bus_num
=
0
,
.
chip_select
=
0
,
},
};
static
void
__init
rd88f6183ap_ge_init
(
void
)
{
/*
* Setup basic Orion functions. Need to be called early.
*/
orion5x_init
();
/*
* Configure peripherals.
*/
orion5x_ehci0_init
();
orion5x_eth_init
(
&
rd88f6183ap_ge_eth_data
);
spi_register_board_info
(
rd88f6183ap_ge_spi_slave_info
,
ARRAY_SIZE
(
rd88f6183ap_ge_spi_slave_info
));
orion5x_spi_init
();
orion5x_uart0_init
();
}
static
struct
hw_pci
rd88f6183ap_ge_pci
__initdata
=
{
.
nr_controllers
=
2
,
.
swizzle
=
pci_std_swizzle
,
.
setup
=
orion5x_pci_sys_setup
,
.
scan
=
orion5x_pci_sys_scan_bus
,
.
map_irq
=
orion5x_pci_map_irq
,
};
static
int
__init
rd88f6183ap_ge_pci_init
(
void
)
{
if
(
machine_is_rd88f6183ap_ge
())
{
orion5x_pci_disable
();
pci_common_init
(
&
rd88f6183ap_ge_pci
);
}
return
0
;
}
subsys_initcall
(
rd88f6183ap_ge_pci_init
);
MACHINE_START
(
RD88F6183AP_GE
,
"Marvell Orion-1-90 AP GE Reference Design"
)
/* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */
.
phys_io
=
ORION5X_REGS_PHYS_BASE
,
.
io_pg_offst
=
((
ORION5X_REGS_VIRT_BASE
)
>>
18
)
&
0xFFFC
,
.
boot_params
=
0x00000100
,
.
init_machine
=
rd88f6183ap_ge_init
,
.
map_io
=
orion5x_map_io
,
.
init_irq
=
orion5x_init_irq
,
.
timer
=
&
orion5x_timer
,
.
fixup
=
tag_fixup_mem32
,
MACHINE_END
arch/arm/mach-orion5x/terastation_pro2-setup.c
0 → 100644
View file @
6defd904
/*
* Buffalo Terastation Pro II/Live Board Setup
*
* Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/pci.h>
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/mtd/physmap.h>
#include <linux/mv643xx_eth.h>
#include <linux/i2c.h>
#include <linux/serial_reg.h>
#include <asm/mach-types.h>
#include <asm/gpio.h>
#include <asm/mach/arch.h>
#include <asm/mach/pci.h>
#include <mach/orion5x.h>
#include "common.h"
#include "mpp.h"
/*****************************************************************************
* Terastation Pro 2/Live Info
****************************************************************************/
/*
* Terastation Pro 2 hardware :
* - Marvell 88F5281-D0
* - Marvell 88SX6042 SATA controller (PCI)
* - Marvell 88E1118 Gigabit Ethernet PHY
* - 256KB NOR flash
* - 128MB of DDR RAM
* - PCIe port (not equipped)
*/
/*
* 256K NOR flash Device bus boot chip select
*/
#define TSP2_NOR_BOOT_BASE 0xf4000000
#define TSP2_NOR_BOOT_SIZE SZ_256K
/*****************************************************************************
* 256KB NOR Flash on BOOT Device
****************************************************************************/
static
struct
physmap_flash_data
tsp2_nor_flash_data
=
{
.
width
=
1
,
};
static
struct
resource
tsp2_nor_flash_resource
=
{
.
flags
=
IORESOURCE_MEM
,
.
start
=
TSP2_NOR_BOOT_BASE
,
.
end
=
TSP2_NOR_BOOT_BASE
+
TSP2_NOR_BOOT_SIZE
-
1
,
};
static
struct
platform_device
tsp2_nor_flash
=
{
.
name
=
"physmap-flash"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tsp2_nor_flash_data
,
},
.
num_resources
=
1
,
.
resource
=
&
tsp2_nor_flash_resource
,
};
/*****************************************************************************
* PCI
****************************************************************************/
#define TSP2_PCI_SLOT0_OFFS 7
#define TSP2_PCI_SLOT0_IRQ_PIN 11
void
__init
tsp2_pci_preinit
(
void
)
{
int
pin
;
/*
* Configure PCI GPIO IRQ pins
*/
pin
=
TSP2_PCI_SLOT0_IRQ_PIN
;
if
(
gpio_request
(
pin
,
"PCI Int1"
)
==
0
)
{
if
(
gpio_direction_input
(
pin
)
==
0
)
{
set_irq_type
(
gpio_to_irq
(
pin
),
IRQ_TYPE_LEVEL_LOW
);
}
else
{
printk
(
KERN_ERR
"tsp2_pci_preinit failed "
"to set_irq_type pin %d
\n
"
,
pin
);
gpio_free
(
pin
);
}
}
else
{
printk
(
KERN_ERR
"tsp2_pci_preinit failed to "
"gpio_request %d
\n
"
,
pin
);
}
}
static
int
__init
tsp2_pci_map_irq
(
struct
pci_dev
*
dev
,
u8
slot
,
u8
pin
)
{
int
irq
;
/*
* Check for devices with hard-wired IRQs.
*/
irq
=
orion5x_pci_map_irq
(
dev
,
slot
,
pin
);
if
(
irq
!=
-
1
)
return
irq
;
/*
* PCI IRQs are connected via GPIOs.
*/
if
(
slot
==
TSP2_PCI_SLOT0_OFFS
)
return
gpio_to_irq
(
TSP2_PCI_SLOT0_IRQ_PIN
);
return
-
1
;
}
static
struct
hw_pci
tsp2_pci
__initdata
=
{
.
nr_controllers
=
2
,
.
preinit
=
tsp2_pci_preinit
,
.
swizzle
=
pci_std_swizzle
,
.
setup
=
orion5x_pci_sys_setup
,
.
scan
=
orion5x_pci_sys_scan_bus
,
.
map_irq
=
tsp2_pci_map_irq
,
};
static
int
__init
tsp2_pci_init
(
void
)
{
if
(
machine_is_terastation_pro2
())
pci_common_init
(
&
tsp2_pci
);
return
0
;
}
subsys_initcall
(
tsp2_pci_init
);
/*****************************************************************************
* Ethernet
****************************************************************************/
static
struct
mv643xx_eth_platform_data
tsp2_eth_data
=
{
.
phy_addr
=
0
,
};
/*****************************************************************************
* RTC 5C372a on I2C bus
****************************************************************************/
#define TSP2_RTC_GPIO 9
static
struct
i2c_board_info
__initdata
tsp2_i2c_rtc
=
{
I2C_BOARD_INFO
(
"rs5c372a"
,
0x32
),
};
/*****************************************************************************
* Terastation Pro II specific power off method via UART1-attached
* microcontroller
****************************************************************************/
#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
static
int
tsp2_miconread
(
unsigned
char
*
buf
,
int
count
)
{
int
i
;
int
timeout
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
timeout
=
10
;
while
(
!
(
readl
(
UART1_REG
(
LSR
))
&
UART_LSR_DR
))
{
if
(
--
timeout
==
0
)
break
;
udelay
(
1000
);
}
if
(
timeout
==
0
)
break
;
buf
[
i
]
=
readl
(
UART1_REG
(
RX
));
}
/* return read bytes */
return
i
;
}
static
int
tsp2_miconwrite
(
const
unsigned
char
*
buf
,
int
count
)
{
int
i
=
0
;
while
(
count
--
)
{
while
(
!
(
readl
(
UART1_REG
(
LSR
))
&
UART_LSR_THRE
))
barrier
();
writel
(
buf
[
i
++
],
UART1_REG
(
TX
));
}
return
0
;
}
static
int
tsp2_miconsend
(
const
unsigned
char
*
data
,
int
count
)
{
int
i
;
unsigned
char
checksum
=
0
;
unsigned
char
recv_buf
[
40
];
unsigned
char
send_buf
[
40
];
unsigned
char
correct_ack
[
3
];
int
retry
=
2
;
/* Generate checksum */
for
(
i
=
0
;
i
<
count
;
i
++
)
checksum
-=
data
[
i
];
do
{
/* Send data */
tsp2_miconwrite
(
data
,
count
);
/* send checksum */
tsp2_miconwrite
(
&
checksum
,
1
);
if
(
tsp2_miconread
(
recv_buf
,
sizeof
(
recv_buf
))
<=
3
)
{
printk
(
KERN_ERR
">%s: receive failed.
\n
"
,
__func__
);
/* send preamble to clear the receive buffer */
memset
(
&
send_buf
,
0xff
,
sizeof
(
send_buf
));
tsp2_miconwrite
(
send_buf
,
sizeof
(
send_buf
));
/* make dummy reads */
mdelay
(
100
);
tsp2_miconread
(
recv_buf
,
sizeof
(
recv_buf
));
}
else
{
/* Generate expected ack */
correct_ack
[
0
]
=
0x01
;
correct_ack
[
1
]
=
data
[
1
];
correct_ack
[
2
]
=
0x00
;
/* checksum Check */
if
((
recv_buf
[
0
]
+
recv_buf
[
1
]
+
recv_buf
[
2
]
+
recv_buf
[
3
])
&
0xFF
)
{
printk
(
KERN_ERR
">%s: Checksum Error : "
"Received data[%02x, %02x, %02x, %02x]"
"
\n
"
,
__func__
,
recv_buf
[
0
],
recv_buf
[
1
],
recv_buf
[
2
],
recv_buf
[
3
]);
}
else
{
/* Check Received Data */
if
(
correct_ack
[
0
]
==
recv_buf
[
0
]
&&
correct_ack
[
1
]
==
recv_buf
[
1
]
&&
correct_ack
[
2
]
==
recv_buf
[
2
])
{
/* Interval for next command */
mdelay
(
10
);
/* Receive ACK */
return
0
;
}
}
/* Received NAK or illegal Data */
printk
(
KERN_ERR
">%s: Error : NAK or Illegal Data "
"Received
\n
"
,
__func__
);
}
}
while
(
retry
--
);
/* Interval for next command */
mdelay
(
10
);
return
-
1
;
}
static
void
tsp2_power_off
(
void
)
{
const
unsigned
char
watchdogkill
[]
=
{
0x01
,
0x35
,
0x00
};
const
unsigned
char
shutdownwait
[]
=
{
0x00
,
0x0c
};
const
unsigned
char
poweroff
[]
=
{
0x00
,
0x06
};
/* 38400 baud divisor */
const
unsigned
divisor
=
((
orion5x_tclk
+
(
8
*
38400
))
/
(
16
*
38400
));
pr_info
(
"%s: triggering power-off...
\n
"
,
__func__
);
/* hijack uart1 and reset into sane state (38400,8n1,even parity) */
writel
(
0x83
,
UART1_REG
(
LCR
));
writel
(
divisor
&
0xff
,
UART1_REG
(
DLL
));
writel
((
divisor
>>
8
)
&
0xff
,
UART1_REG
(
DLM
));
writel
(
0x1b
,
UART1_REG
(
LCR
));
writel
(
0x00
,
UART1_REG
(
IER
));
writel
(
0x07
,
UART1_REG
(
FCR
));
writel
(
0x00
,
UART1_REG
(
MCR
));
/* Send the commands to shutdown the Terastation Pro II */
tsp2_miconsend
(
watchdogkill
,
sizeof
(
watchdogkill
))
;
tsp2_miconsend
(
shutdownwait
,
sizeof
(
shutdownwait
))
;
tsp2_miconsend
(
poweroff
,
sizeof
(
poweroff
));
}
/*****************************************************************************
* General Setup
****************************************************************************/
static
struct
orion5x_mpp_mode
tsp2_mpp_modes
[]
__initdata
=
{
{
0
,
MPP_PCIE_RST_OUTn
},
{
1
,
MPP_UNUSED
},
{
2
,
MPP_UNUSED
},
{
3
,
MPP_UNUSED
},
{
4
,
MPP_NAND
},
/* BOOT NAND Flash REn */
{
5
,
MPP_NAND
},
/* BOOT NAND Flash WEn */
{
6
,
MPP_NAND
},
/* BOOT NAND Flash HREn[0] */
{
7
,
MPP_NAND
},
/* BOOT NAND Flash WEn[0] */
{
8
,
MPP_GPIO
},
/* MICON int */
{
9
,
MPP_GPIO
},
/* RTC int */
{
10
,
MPP_UNUSED
},
{
11
,
MPP_GPIO
},
/* PCI Int A */
{
12
,
MPP_UNUSED
},
{
13
,
MPP_GPIO
},
/* UPS on UART0 enable */
{
14
,
MPP_GPIO
},
/* UPS low battery detection */
{
15
,
MPP_UNUSED
},
{
16
,
MPP_UART
},
/* UART1 RXD */
{
17
,
MPP_UART
},
/* UART1 TXD */
{
18
,
MPP_UART
},
/* UART1 CTSn */
{
19
,
MPP_UART
},
/* UART1 RTSn */
{
-
1
},
};
static
void
__init
tsp2_init
(
void
)
{
/*
* Setup basic Orion functions. Need to be called early.
*/
orion5x_init
();
orion5x_mpp_conf
(
tsp2_mpp_modes
);
/*
* Configure peripherals.
*/
orion5x_setup_dev_boot_win
(
TSP2_NOR_BOOT_BASE
,
TSP2_NOR_BOOT_SIZE
);
platform_device_register
(
&
tsp2_nor_flash
);
orion5x_ehci0_init
();
orion5x_eth_init
(
&
tsp2_eth_data
);
orion5x_i2c_init
();
orion5x_uart0_init
();
orion5x_uart1_init
();
/* Get RTC IRQ and register the chip */
if
(
gpio_request
(
TSP2_RTC_GPIO
,
"rtc"
)
==
0
)
{
if
(
gpio_direction_input
(
TSP2_RTC_GPIO
)
==
0
)
tsp2_i2c_rtc
.
irq
=
gpio_to_irq
(
TSP2_RTC_GPIO
);
else
gpio_free
(
TSP2_RTC_GPIO
);
}
if
(
tsp2_i2c_rtc
.
irq
==
0
)
pr_warning
(
"tsp2_init: failed to get RTC IRQ
\n
"
);
i2c_register_board_info
(
0
,
&
tsp2_i2c_rtc
,
1
);
/* register Terastation Pro II specific power-off method */
pm_power_off
=
tsp2_power_off
;
}
MACHINE_START
(
TERASTATION_PRO2
,
"Buffalo Terastation Pro II/Live"
)
/* Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> */
.
phys_io
=
ORION5X_REGS_PHYS_BASE
,
.
io_pg_offst
=
((
ORION5X_REGS_VIRT_BASE
)
>>
18
)
&
0xFFFC
,
.
boot_params
=
0x00000100
,
.
init_machine
=
tsp2_init
,
.
map_io
=
orion5x_map_io
,
.
init_irq
=
orion5x_init_irq
,
.
timer
=
&
orion5x_timer
,
.
fixup
=
tag_fixup_mem32
,
MACHINE_END
arch/arm/mach-orion5x/tsx09-common.c
View file @
6defd904
...
...
@@ -16,6 +16,7 @@
#include <linux/timex.h>
#include <linux/serial_reg.h>
#include "tsx09-common.h"
#include "common.h"
/*****************************************************************************
* QNAP TS-x09 specific power off method via UART1-attached PIC
...
...
@@ -26,7 +27,7 @@
void
qnap_tsx09_power_off
(
void
)
{
/* 19200 baud divisor */
const
unsigned
divisor
=
((
ORION5X_TCLK
+
(
8
*
19200
))
/
(
16
*
19200
));
const
unsigned
divisor
=
((
orion5x_tclk
+
(
8
*
19200
))
/
(
16
*
19200
));
pr_info
(
"%s: triggering power-off...
\n
"
,
__func__
);
...
...
arch/arm/mm/Kconfig
View file @
6defd904
...
...
@@ -735,6 +735,14 @@ config CACHE_FEROCEON_L2
help
This option enables the Feroceon L2 cache controller.
config CACHE_FEROCEON_L2_WRITETHROUGH
bool "Force Feroceon L2 cache write through"
depends on CACHE_FEROCEON_L2
default n
help
Say Y here to use the Feroceon L2 cache in writethrough mode.
Unless you specifically require this, say N for writeback mode.
config CACHE_L2X0
bool "Enable the L2x0 outer cache controller"
depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176
...
...
arch/arm/mm/cache-feroceon-l2.c
View file @
6defd904
...
...
@@ -48,11 +48,12 @@ static inline void l2_clean_mva_range(unsigned long start, unsigned long end)
* L2 is PIPT and range operations only do a TLB lookup on
* the start address.
*/
BUG_ON
((
start
^
end
)
&
~
(
PAGE_SIZE
-
1
)
);
BUG_ON
((
start
^
end
)
>>
PAGE_SHIFT
);
raw_local_irq_save
(
flags
);
__asm__
(
"mcr p15, 1, %0, c15, c9, 4"
:
:
"r"
(
start
));
__asm__
(
"mcr p15, 1, %0, c15, c9, 5"
:
:
"r"
(
end
));
__asm__
(
"mcr p15, 1, %0, c15, c9, 4
\n\t
"
"mcr p15, 1, %1, c15, c9, 5"
:
:
"r"
(
start
),
"r"
(
end
));
raw_local_irq_restore
(
flags
);
}
...
...
@@ -80,11 +81,12 @@ static inline void l2_inv_mva_range(unsigned long start, unsigned long end)
* L2 is PIPT and range operations only do a TLB lookup on
* the start address.
*/
BUG_ON
((
start
^
end
)
&
~
(
PAGE_SIZE
-
1
)
);
BUG_ON
((
start
^
end
)
>>
PAGE_SHIFT
);
raw_local_irq_save
(
flags
);
__asm__
(
"mcr p15, 1, %0, c15, c11, 4"
:
:
"r"
(
start
));
__asm__
(
"mcr p15, 1, %0, c15, c11, 5"
:
:
"r"
(
end
));
__asm__
(
"mcr p15, 1, %0, c15, c11, 4
\n\t
"
"mcr p15, 1, %1, c15, c11, 5"
:
:
"r"
(
start
),
"r"
(
end
));
raw_local_irq_restore
(
flags
);
}
...
...
@@ -205,7 +207,7 @@ static void feroceon_l2_flush_range(unsigned long start, unsigned long end)
* time. These are necessary because the L2 cache can only be enabled
* or disabled while the L1 Dcache and Icache are both disabled.
*/
static
void
__init
invalidate
_and_disable_dcache
(
void
)
static
int
__init
flush
_and_disable_dcache
(
void
)
{
u32
cr
;
...
...
@@ -217,7 +219,9 @@ static void __init invalidate_and_disable_dcache(void)
flush_cache_all
();
set_cr
(
cr
&
~
CR_C
);
raw_local_irq_restore
(
flags
);
return
1
;
}
return
0
;
}
static
void
__init
enable_dcache
(
void
)
...
...
@@ -225,18 +229,17 @@ static void __init enable_dcache(void)
u32
cr
;
cr
=
get_cr
();
if
(
!
(
cr
&
CR_C
))
set_cr
(
cr
|
CR_C
);
set_cr
(
cr
|
CR_C
);
}
static
void
__init
__invalidate_icache
(
void
)
{
int
dummy
;
__asm__
__volatile__
(
"mcr p15, 0, %0, c7, c5, 0
\n
"
:
"=r"
(
dummy
));
__asm__
__volatile__
(
"mcr p15, 0, %0, c7, c5, 0"
:
"=r"
(
dummy
));
}
static
void
__init
invalidate_and_disable_icache
(
void
)
static
int
__init
invalidate_and_disable_icache
(
void
)
{
u32
cr
;
...
...
@@ -244,7 +247,9 @@ static void __init invalidate_and_disable_icache(void)
if
(
cr
&
CR_I
)
{
set_cr
(
cr
&
~
CR_I
);
__invalidate_icache
();
return
1
;
}
return
0
;
}
static
void
__init
enable_icache
(
void
)
...
...
@@ -252,8 +257,7 @@ static void __init enable_icache(void)
u32
cr
;
cr
=
get_cr
();
if
(
!
(
cr
&
CR_I
))
set_cr
(
cr
|
CR_I
);
set_cr
(
cr
|
CR_I
);
}
static
inline
u32
read_extra_features
(
void
)
...
...
@@ -291,13 +295,17 @@ static void __init enable_l2(void)
u
=
read_extra_features
();
if
(
!
(
u
&
0x00400000
))
{
int
i
,
d
;
printk
(
KERN_INFO
"Feroceon L2: Enabling L2
\n
"
);
invalidate
_and_disable_dcache
();
invalidate_and_disable_icache
();
d
=
flush
_and_disable_dcache
();
i
=
i
nvalidate_and_disable_icache
();
write_extra_features
(
u
|
0x00400000
);
enable_icache
();
enable_dcache
();
if
(
i
)
enable_icache
();
if
(
d
)
enable_dcache
();
}
}
...
...
arch/arm/mm/proc-feroceon.S
View file @
6defd904
...
...
@@ -80,7 +80,8 @@ ENTRY(cpu_feroceon_proc_fin)
msr
cpsr_c
,
ip
bl
feroceon_flush_kern_cache_all
#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
#if defined(CONFIG_CACHE_FEROCEON_L2) && \
!
defined
(
CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
)
mov
r0
,
#
0
mcr
p15
,
1
,
r0
,
c15
,
c9
,
0
@
clean
L2
mcr
p15
,
0
,
r0
,
c7
,
c10
,
4
@
drain
WB
...
...
@@ -389,7 +390,8 @@ ENTRY(feroceon_range_cache_fns)
.
align
5
ENTRY
(
cpu_feroceon_dcache_clean_area
)
#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
#if defined(CONFIG_CACHE_FEROCEON_L2) && \
!
defined
(
CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
)
mov
r2
,
r0
mov
r3
,
r1
#endif
...
...
@@ -397,7 +399,8 @@ ENTRY(cpu_feroceon_dcache_clean_area)
add
r0
,
r0
,
#
CACHE_DLINESIZE
subs
r1
,
r1
,
#
CACHE_DLINESIZE
bhi
1
b
#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
#if defined(CONFIG_CACHE_FEROCEON_L2) && \
!
defined
(
CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
)
1
:
mcr
p15
,
1
,
r2
,
c15
,
c9
,
1
@
clean
L2
entry
add
r2
,
r2
,
#
CACHE_DLINESIZE
subs
r3
,
r3
,
#
CACHE_DLINESIZE
...
...
@@ -449,7 +452,8 @@ ENTRY(cpu_feroceon_set_pte_ext)
armv3_set_pte_ext
wc_disable
=
0
mov
r0
,
r0
mcr
p15
,
0
,
r0
,
c7
,
c10
,
1
@
clean
D
entry
#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
#if defined(CONFIG_CACHE_FEROCEON_L2) && \
!
defined
(
CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
)
mcr
p15
,
1
,
r0
,
c15
,
c9
,
1
@
clean
L2
entry
#endif
mcr
p15
,
0
,
r0
,
c7
,
c10
,
4
@
drain
WB
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment