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
Kirill Smelkov
linux
Commits
fd5b1245
Commit
fd5b1245
authored
May 12, 2009
by
Paul Mundt
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into sh/clkfwk
parents
9fe5ee0e
8be5f1a6
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
2359 additions
and
557 deletions
+2359
-557
arch/sh/Kconfig
arch/sh/Kconfig
+3
-19
arch/sh/configs/sh7770_generic_defconfig
arch/sh/configs/sh7770_generic_defconfig
+700
-0
arch/sh/include/asm/timer.h
arch/sh/include/asm/timer.h
+0
-29
arch/sh/include/cpu-sh3/cpu/timer.h
arch/sh/include/cpu-sh3/cpu/timer.h
+0
-67
arch/sh/include/cpu-sh4/cpu/timer.h
arch/sh/include/cpu-sh4/cpu/timer.h
+0
-60
arch/sh/kernel/Makefile_32
arch/sh/kernel/Makefile_32
+1
-1
arch/sh/kernel/Makefile_64
arch/sh/kernel/Makefile_64
+1
-1
arch/sh/kernel/cpu/clock.c
arch/sh/kernel/cpu/clock.c
+0
-1
arch/sh/kernel/cpu/sh3/setup-sh7705.c
arch/sh/kernel/cpu/sh3/setup-sh7705.c
+108
-0
arch/sh/kernel/cpu/sh3/setup-sh770x.c
arch/sh/kernel/cpu/sh3/setup-sh770x.c
+108
-0
arch/sh/kernel/cpu/sh3/setup-sh7710.c
arch/sh/kernel/cpu/sh3/setup-sh7710.c
+108
-0
arch/sh/kernel/cpu/sh3/setup-sh7720.c
arch/sh/kernel/cpu/sh3/setup-sh7720.c
+270
-0
arch/sh/kernel/cpu/sh4/setup-sh4-202.c
arch/sh/kernel/cpu/sh4/setup-sh4-202.c
+163
-1
arch/sh/kernel/cpu/sh4a/setup-sh7343.c
arch/sh/kernel/cpu/sh4a/setup-sh7343.c
+98
-0
arch/sh/kernel/cpu/sh4a/setup-sh7366.c
arch/sh/kernel/cpu/sh4a/setup-sh7366.c
+98
-0
arch/sh/kernel/cpu/sh4a/setup-sh7724.c
arch/sh/kernel/cpu/sh4a/setup-sh7724.c
+195
-0
arch/sh/kernel/cpu/sh4a/setup-sh7763.c
arch/sh/kernel/cpu/sh4a/setup-sh7763.c
+204
-0
arch/sh/kernel/cpu/sh4a/setup-sh7770.c
arch/sh/kernel/cpu/sh4a/setup-sh7770.c
+300
-0
arch/sh/kernel/time.c
arch/sh/kernel/time.c
+2
-27
arch/sh/kernel/timers/Makefile
arch/sh/kernel/timers/Makefile
+0
-7
arch/sh/kernel/timers/timer-tmu.c
arch/sh/kernel/timers/timer-tmu.c
+0
-295
arch/sh/kernel/timers/timer.c
arch/sh/kernel/timers/timer.c
+0
-49
No files found.
arch/sh/Kconfig
View file @
fd5b1245
...
...
@@ -302,6 +302,7 @@ config CPU_SUBTYPE_SH7720
bool "Support SH7720 processor"
select CPU_SH3
select CPU_HAS_DSP
select SYS_SUPPORTS_CMT
help
Select SH7720 if you have a SH3-DSP SH7720 CPU.
...
...
@@ -309,6 +310,7 @@ config CPU_SUBTYPE_SH7721
bool "Support SH7721 processor"
select CPU_SH3
select CPU_HAS_DSP
select SYS_SUPPORTS_CMT
help
Select SH7721 if you have a SH3-DSP SH7721 CPU.
...
...
@@ -471,16 +473,9 @@ source "arch/sh/boards/Kconfig"
menu "Timer and clock configuration"
config SH_TMU
bool "TMU timer support"
depends on CPU_SH3 || CPU_SH4
default y
help
This enables the use of the TMU as the system timer.
config SH_TIMER_TMU
bool "TMU timer driver"
depends on
!SH_TMU &&
SYS_SUPPORTS_TMU
depends on SYS_SUPPORTS_TMU
default y
help
This enables the build of the TMU timer driver.
...
...
@@ -499,17 +494,6 @@ config SH_TIMER_MTU2
help
This enables build of the MTU2 timer driver.
config SH_TIMER_IRQ
int
default "28" if CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \
CPU_SUBTYPE_SH7763
default "86" if CPU_SUBTYPE_SH7619
default "140" if CPU_SUBTYPE_SH7206
default "142" if CPU_SUBTYPE_SH7203 && SH_CMT
default "153" if CPU_SUBTYPE_SH7203 && SH_MTU2
default "238" if CPU_SUBTYPE_MXG
default "16"
config SH_PCLK_FREQ
int "Peripheral clock frequency (in Hz)"
default "27000000" if CPU_SUBTYPE_SH7343
...
...
arch/sh/configs/sh7770_generic_defconfig
0 → 100644
View file @
fd5b1245
This diff is collapsed.
Click to expand it.
arch/sh/include/asm/timer.h
deleted
100644 → 0
View file @
9fe5ee0e
#ifndef __ASM_SH_TIMER_H
#define __ASM_SH_TIMER_H
#include <linux/sysdev.h>
#include <linux/clocksource.h>
#include <cpu/timer.h>
struct
sys_timer_ops
{
int
(
*
init
)(
void
);
int
(
*
start
)(
void
);
int
(
*
stop
)(
void
);
};
struct
sys_timer
{
const
char
*
name
;
struct
sys_device
dev
;
struct
sys_timer_ops
*
ops
;
};
extern
struct
sys_timer
tmu_timer
;
extern
struct
sys_timer
*
sys_timer
;
/* arch/sh/kernel/timers/timer.c */
struct
sys_timer
*
get_sys_timer
(
void
);
extern
struct
clocksource
clocksource_sh
;
#endif
/* __ASM_SH_TIMER_H */
arch/sh/include/cpu-sh3/cpu/timer.h
deleted
100644 → 0
View file @
9fe5ee0e
/*
* include/asm-sh/cpu-sh3/timer.h
*
* Copyright (C) 2004 Lineo Solutions, Inc.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
#ifndef __ASM_CPU_SH3_TIMER_H
#define __ASM_CPU_SH3_TIMER_H
/*
* ---------------------------------------------------------------------------
* TMU Common definitions for SH3 processors
* SH7706
* SH7709S
* SH7727
* SH7729R
* SH7710
* SH7720
* SH7710
* ---------------------------------------------------------------------------
*/
#if !defined(CONFIG_CPU_SUBTYPE_SH7720) && !defined(CONFIG_CPU_SUBTYPE_SH7721)
#define TMU_TOCR 0xfffffe90
/* Byte access */
#endif
#if defined(CONFIG_CPU_SUBTYPE_SH7710) || \
defined(CONFIG_CPU_SUBTYPE_SH7720) || \
defined(CONFIG_CPU_SUBTYPE_SH7721)
#define TMU_012_TSTR 0xa412fe92
/* Byte access */
#define TMU0_TCOR 0xa412fe94
/* Long access */
#define TMU0_TCNT 0xa412fe98
/* Long access */
#define TMU0_TCR 0xa412fe9c
/* Word access */
#define TMU1_TCOR 0xa412fea0
/* Long access */
#define TMU1_TCNT 0xa412fea4
/* Long access */
#define TMU1_TCR 0xa412fea8
/* Word access */
#define TMU2_TCOR 0xa412feac
/* Long access */
#define TMU2_TCNT 0xa412feb0
/* Long access */
#define TMU2_TCR 0xa412feb4
/* Word access */
#else
#define TMU_012_TSTR 0xfffffe92
/* Byte access */
#define TMU0_TCOR 0xfffffe94
/* Long access */
#define TMU0_TCNT 0xfffffe98
/* Long access */
#define TMU0_TCR 0xfffffe9c
/* Word access */
#define TMU1_TCOR 0xfffffea0
/* Long access */
#define TMU1_TCNT 0xfffffea4
/* Long access */
#define TMU1_TCR 0xfffffea8
/* Word access */
#define TMU2_TCOR 0xfffffeac
/* Long access */
#define TMU2_TCNT 0xfffffeb0
/* Long access */
#define TMU2_TCR 0xfffffeb4
/* Word access */
#if !defined(CONFIG_CPU_SUBTYPE_SH7720) && !defined(CONFIG_CPU_SUBTYPE_SH7721)
#define TMU2_TCPR2 0xfffffeb8
/* Long access */
#endif
#endif
#endif
/* __ASM_CPU_SH3_TIMER_H */
arch/sh/include/cpu-sh4/cpu/timer.h
deleted
100644 → 0
View file @
9fe5ee0e
/*
* include/asm-sh/cpu-sh4/timer.h
*
* Copyright (C) 2004 Lineo Solutions, Inc.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
#ifndef __ASM_CPU_SH4_TIMER_H
#define __ASM_CPU_SH4_TIMER_H
/*
* ---------------------------------------------------------------------------
* TMU Common definitions for SH4 processors
* SH7750S/SH7750R
* SH7751/SH7751R
* SH7760
* SH-X3
* ---------------------------------------------------------------------------
*/
#ifdef CONFIG_CPU_SUBTYPE_SHX3
#define TMU_012_BASE 0xffc10000
#define TMU_345_BASE 0xffc20000
#else
#define TMU_012_BASE 0xffd80000
#define TMU_345_BASE 0xfe100000
#endif
#define TMU_TOCR TMU_012_BASE
/* Not supported on all CPUs */
#define TMU_012_TSTR (TMU_012_BASE + 0x04)
#define TMU_345_TSTR (TMU_345_BASE + 0x04)
#define TMU0_TCOR (TMU_012_BASE + 0x08)
#define TMU0_TCNT (TMU_012_BASE + 0x0c)
#define TMU0_TCR (TMU_012_BASE + 0x10)
#define TMU1_TCOR (TMU_012_BASE + 0x14)
#define TMU1_TCNT (TMU_012_BASE + 0x18)
#define TMU1_TCR (TMU_012_BASE + 0x1c)
#define TMU2_TCOR (TMU_012_BASE + 0x20)
#define TMU2_TCNT (TMU_012_BASE + 0x24)
#define TMU2_TCR (TMU_012_BASE + 0x28)
#define TMU2_TCPR (TMU_012_BASE + 0x2c)
#define TMU3_TCOR (TMU_345_BASE + 0x08)
#define TMU3_TCNT (TMU_345_BASE + 0x0c)
#define TMU3_TCR (TMU_345_BASE + 0x10)
#define TMU4_TCOR (TMU_345_BASE + 0x14)
#define TMU4_TCNT (TMU_345_BASE + 0x18)
#define TMU4_TCR (TMU_345_BASE + 0x1c)
#define TMU5_TCOR (TMU_345_BASE + 0x20)
#define TMU5_TCNT (TMU_345_BASE + 0x24)
#define TMU5_TCR (TMU_345_BASE + 0x28)
#endif
/* __ASM_CPU_SH4_TIMER_H */
arch/sh/kernel/Makefile_32
View file @
fd5b1245
...
...
@@ -14,7 +14,7 @@ obj-y := debugtraps.o idle.o io.o io_generic.o irq.o \
sys_sh.o sys_sh32.o syscalls_32.o time.o topology.o \
traps.o traps_32.o
obj-y += cpu/
timers/
obj-y += cpu/
obj-$(CONFIG_VSYSCALL) += vsyscall/
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o
...
...
arch/sh/kernel/Makefile_64
View file @
fd5b1245
...
...
@@ -4,7 +4,7 @@ obj-y := debugtraps.o idle.o io.o io_generic.o irq.o machvec.o process_64.o \
ptrace_64.o setup.o signal_64.o sys_sh.o sys_sh64.o \
syscalls_64.o time.o topology.o traps.o traps_64.o
obj-y += cpu/
timers/
obj-y += cpu/
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o
obj-$(CONFIG_MODULES) += sh_ksyms_64.o module.o
...
...
arch/sh/kernel/cpu/clock.c
View file @
fd5b1245
...
...
@@ -30,7 +30,6 @@
#include <linux/platform_device.h>
#include <linux/proc_fs.h>
#include <asm/clock.h>
#include <asm/timer.h>
static
LIST_HEAD
(
clock_list
);
static
DEFINE_SPINLOCK
(
clock_lock
);
...
...
arch/sh/kernel/cpu/sh3/setup-sh7705.c
View file @
fd5b1245
...
...
@@ -13,6 +13,7 @@
#include <linux/irq.h>
#include <linux/serial.h>
#include <linux/serial_sci.h>
#include <linux/sh_timer.h>
#include <asm/rtc.h>
enum
{
...
...
@@ -116,7 +117,102 @@ static struct platform_device rtc_device = {
},
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x02
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xfffffe94
,
.
end
=
0xfffffe9f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0xe
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xfffffea0
,
.
end
=
0xfffffeab
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1a
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xfffffeac
,
.
end
=
0xfffffebb
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
platform_device
*
sh7705_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
sci_device
,
&
rtc_device
,
};
...
...
@@ -128,6 +224,18 @@ static int __init sh7705_devices_setup(void)
}
__initcall
(
sh7705_devices_setup
);
static
struct
platform_device
*
sh7705_early_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh7705_early_devices
,
ARRAY_SIZE
(
sh7705_early_devices
));
}
void
__init
plat_irq_setup
(
void
)
{
register_intc_controller
(
&
intc_desc
);
...
...
arch/sh/kernel/cpu/sh3/setup-sh770x.c
View file @
fd5b1245
...
...
@@ -18,6 +18,7 @@
#include <linux/platform_device.h>
#include <linux/serial.h>
#include <linux/serial_sci.h>
#include <linux/sh_timer.h>
enum
{
UNUSED
=
0
,
...
...
@@ -144,7 +145,102 @@ static struct platform_device sci_device = {
},
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x02
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xfffffe94
,
.
end
=
0xfffffe9f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0xe
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xfffffea0
,
.
end
=
0xfffffeab
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1a
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xfffffeac
,
.
end
=
0xfffffebb
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
platform_device
*
sh770x_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
sci_device
,
&
rtc_device
,
};
...
...
@@ -156,6 +252,18 @@ static int __init sh770x_devices_setup(void)
}
__initcall
(
sh770x_devices_setup
);
static
struct
platform_device
*
sh770x_early_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh770x_early_devices
,
ARRAY_SIZE
(
sh770x_early_devices
));
}
void
__init
plat_irq_setup
(
void
)
{
register_intc_controller
(
&
intc_desc
);
...
...
arch/sh/kernel/cpu/sh3/setup-sh7710.c
View file @
fd5b1245
...
...
@@ -13,6 +13,7 @@
#include <linux/irq.h>
#include <linux/serial.h>
#include <linux/serial_sci.h>
#include <linux/sh_timer.h>
#include <asm/rtc.h>
enum
{
...
...
@@ -120,7 +121,102 @@ static struct platform_device sci_device = {
},
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x02
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xa412fe94
,
.
end
=
0xa412fe9f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0xe
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xa412fea0
,
.
end
=
0xa412feab
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1a
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xa412feac
,
.
end
=
0xa412feb5
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
platform_device
*
sh7710_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
sci_device
,
&
rtc_device
,
};
...
...
@@ -132,6 +228,18 @@ static int __init sh7710_devices_setup(void)
}
__initcall
(
sh7710_devices_setup
);
static
struct
platform_device
*
sh7710_early_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh7710_early_devices
,
ARRAY_SIZE
(
sh7710_early_devices
));
}
void
__init
plat_irq_setup
(
void
)
{
register_intc_controller
(
&
intc_desc
);
...
...
arch/sh/kernel/cpu/sh3/setup-sh7720.c
View file @
fd5b1245
...
...
@@ -18,6 +18,7 @@
#include <linux/serial.h>
#include <linux/io.h>
#include <linux/serial_sci.h>
#include <linux/sh_timer.h>
#include <asm/rtc.h>
static
struct
resource
rtc_resources
[]
=
{
...
...
@@ -123,7 +124,259 @@ static struct platform_device usbf_device = {
.
resource
=
usbf_resources
,
};
static
struct
sh_timer_config
cmt0_platform_data
=
{
.
name
=
"CMT0"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
125
,
.
clocksource_rating
=
125
,
};
static
struct
resource
cmt0_resources
[]
=
{
[
0
]
=
{
.
name
=
"CMT0"
,
.
start
=
0x044a0010
,
.
end
=
0x044a001b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
104
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
cmt0_device
=
{
.
name
=
"sh_cmt"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
cmt0_platform_data
,
},
.
resource
=
cmt0_resources
,
.
num_resources
=
ARRAY_SIZE
(
cmt0_resources
),
};
static
struct
sh_timer_config
cmt1_platform_data
=
{
.
name
=
"CMT1"
,
.
channel_offset
=
0x20
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
};
static
struct
resource
cmt1_resources
[]
=
{
[
0
]
=
{
.
name
=
"CMT1"
,
.
start
=
0x044a0020
,
.
end
=
0x044a002b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
104
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
cmt1_device
=
{
.
name
=
"sh_cmt"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
cmt1_platform_data
,
},
.
resource
=
cmt1_resources
,
.
num_resources
=
ARRAY_SIZE
(
cmt1_resources
),
};
static
struct
sh_timer_config
cmt2_platform_data
=
{
.
name
=
"CMT2"
,
.
channel_offset
=
0x30
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
cmt2_resources
[]
=
{
[
0
]
=
{
.
name
=
"CMT2"
,
.
start
=
0x044a0030
,
.
end
=
0x044a003b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
104
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
cmt2_device
=
{
.
name
=
"sh_cmt"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
cmt2_platform_data
,
},
.
resource
=
cmt2_resources
,
.
num_resources
=
ARRAY_SIZE
(
cmt2_resources
),
};
static
struct
sh_timer_config
cmt3_platform_data
=
{
.
name
=
"CMT3"
,
.
channel_offset
=
0x40
,
.
timer_bit
=
3
,
.
clk
=
"module_clk"
,
};
static
struct
resource
cmt3_resources
[]
=
{
[
0
]
=
{
.
name
=
"CMT3"
,
.
start
=
0x044a0040
,
.
end
=
0x044a004b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
104
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
cmt3_device
=
{
.
name
=
"sh_cmt"
,
.
id
=
3
,
.
dev
=
{
.
platform_data
=
&
cmt3_platform_data
,
},
.
resource
=
cmt3_resources
,
.
num_resources
=
ARRAY_SIZE
(
cmt3_resources
),
};
static
struct
sh_timer_config
cmt4_platform_data
=
{
.
name
=
"CMT4"
,
.
channel_offset
=
0x50
,
.
timer_bit
=
4
,
.
clk
=
"module_clk"
,
};
static
struct
resource
cmt4_resources
[]
=
{
[
0
]
=
{
.
name
=
"CMT4"
,
.
start
=
0x044a0050
,
.
end
=
0x044a005b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
104
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
cmt4_device
=
{
.
name
=
"sh_cmt"
,
.
id
=
4
,
.
dev
=
{
.
platform_data
=
&
cmt4_platform_data
,
},
.
resource
=
cmt4_resources
,
.
num_resources
=
ARRAY_SIZE
(
cmt4_resources
),
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x02
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xa412fe94
,
.
end
=
0xa412fe9f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0xe
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xa412fea0
,
.
end
=
0xa412feab
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1a
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xa412feac
,
.
end
=
0xa412feb5
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
platform_device
*
sh7720_devices
[]
__initdata
=
{
&
cmt0_device
,
&
cmt1_device
,
&
cmt2_device
,
&
cmt3_device
,
&
cmt4_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
rtc_device
,
&
sci_device
,
&
usb_ohci_device
,
...
...
@@ -137,6 +390,23 @@ static int __init sh7720_devices_setup(void)
}
__initcall
(
sh7720_devices_setup
);
static
struct
platform_device
*
sh7720_early_devices
[]
__initdata
=
{
&
cmt0_device
,
&
cmt1_device
,
&
cmt2_device
,
&
cmt3_device
,
&
cmt4_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh7720_early_devices
,
ARRAY_SIZE
(
sh7720_early_devices
));
}
enum
{
UNUSED
=
0
,
...
...
arch/sh/kernel/cpu/sh4/setup-sh4-202.c
View file @
fd5b1245
...
...
@@ -2,6 +2,7 @@
* SH4-202 Setup
*
* Copyright (C) 2006 Paul Mundt
* Copyright (C) 2009 Magnus Damm
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
...
...
@@ -11,6 +12,8 @@
#include <linux/init.h>
#include <linux/serial.h>
#include <linux/serial_sci.h>
#include <linux/sh_timer.h>
#include <linux/io.h>
static
struct
plat_sci_port
sci_platform_data
[]
=
{
{
...
...
@@ -31,8 +34,103 @@ static struct platform_device sci_device = {
},
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xffd80008
,
.
end
=
0xffd80013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xffd80014
,
.
end
=
0xffd8001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xffd80020
,
.
end
=
0xffd8002f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
platform_device
*
sh4202_devices
[]
__initdata
=
{
&
sci_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
static
int
__init
sh4202_devices_setup
(
void
)
...
...
@@ -42,7 +140,71 @@ static int __init sh4202_devices_setup(void)
}
__initcall
(
sh4202_devices_setup
);
static
struct
platform_device
*
sh4202_early_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh4202_early_devices
,
ARRAY_SIZE
(
sh4202_early_devices
));
}
enum
{
UNUSED
=
0
,
/* interrupt sources */
IRL0
,
IRL1
,
IRL2
,
IRL3
,
/* only IRLM mode supported */
HUDI
,
TMU0
,
TMU1
,
TMU2
,
RTC
,
SCIF
,
WDT
,
};
static
struct
intc_vect
vectors
[]
__initdata
=
{
INTC_VECT
(
HUDI
,
0x600
),
INTC_VECT
(
TMU0
,
0x400
),
INTC_VECT
(
TMU1
,
0x420
),
INTC_VECT
(
TMU2
,
0x440
),
INTC_VECT
(
TMU2
,
0x460
),
INTC_VECT
(
RTC
,
0x480
),
INTC_VECT
(
RTC
,
0x4a0
),
INTC_VECT
(
RTC
,
0x4c0
),
INTC_VECT
(
SCIF
,
0x700
),
INTC_VECT
(
SCIF
,
0x720
),
INTC_VECT
(
SCIF
,
0x740
),
INTC_VECT
(
SCIF
,
0x760
),
INTC_VECT
(
WDT
,
0x560
),
};
static
struct
intc_prio_reg
prio_registers
[]
__initdata
=
{
{
0xffd00004
,
0
,
16
,
4
,
/* IPRA */
{
TMU0
,
TMU1
,
TMU2
,
RTC
}
},
{
0xffd00008
,
0
,
16
,
4
,
/* IPRB */
{
WDT
,
0
,
0
,
0
}
},
{
0xffd0000c
,
0
,
16
,
4
,
/* IPRC */
{
0
,
0
,
SCIF
,
HUDI
}
},
{
0xffd00010
,
0
,
16
,
4
,
/* IPRD */
{
IRL0
,
IRL1
,
IRL2
,
IRL3
}
},
};
static
DECLARE_INTC_DESC
(
intc_desc
,
"sh4-202"
,
vectors
,
NULL
,
NULL
,
prio_registers
,
NULL
);
static
struct
intc_vect
vectors_irlm
[]
__initdata
=
{
INTC_VECT
(
IRL0
,
0x240
),
INTC_VECT
(
IRL1
,
0x2a0
),
INTC_VECT
(
IRL2
,
0x300
),
INTC_VECT
(
IRL3
,
0x360
),
};
static
DECLARE_INTC_DESC
(
intc_desc_irlm
,
"sh4-202_irlm"
,
vectors_irlm
,
NULL
,
NULL
,
prio_registers
,
NULL
);
void
__init
plat_irq_setup
(
void
)
{
/* do nothing - all IRL interrupts are handled by the board code */
register_intc_controller
(
&
intc_desc
);
}
#define INTC_ICR 0xffd00000UL
#define INTC_ICR_IRLM (1<<7)
void
__init
plat_irq_setup_pins
(
int
mode
)
{
switch
(
mode
)
{
case
IRQ_MODE_IRQ
:
/* individual interrupt mode for IRL3-0 */
ctrl_outw
(
ctrl_inw
(
INTC_ICR
)
|
INTC_ICR_IRLM
,
INTC_ICR
);
register_intc_controller
(
&
intc_desc_irlm
);
break
;
default:
BUG
();
}
}
arch/sh/kernel/cpu/sh4a/setup-sh7343.c
View file @
fd5b1245
...
...
@@ -173,6 +173,98 @@ static struct platform_device cmt_device = {
.
num_resources
=
ARRAY_SIZE
(
cmt_resources
),
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"tmu0"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xffd80008
,
.
end
=
0xffd80013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"tmu0"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xffd80014
,
.
end
=
0xffd8001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"tmu0"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xffd80020
,
.
end
=
0xffd8002b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
plat_sci_port
sci_platform_data
[]
=
{
{
.
mapbase
=
0xffe00000
,
...
...
@@ -213,6 +305,9 @@ static struct platform_device sci_device = {
static
struct
platform_device
*
sh7343_devices
[]
__initdata
=
{
&
cmt_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
iic0_device
,
&
iic1_device
,
&
sci_device
,
...
...
@@ -234,6 +329,9 @@ __initcall(sh7343_devices_setup);
static
struct
platform_device
*
sh7343_early_devices
[]
__initdata
=
{
&
cmt_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
...
...
arch/sh/kernel/cpu/sh4a/setup-sh7366.c
View file @
fd5b1245
...
...
@@ -180,6 +180,98 @@ static struct platform_device cmt_device = {
.
num_resources
=
ARRAY_SIZE
(
cmt_resources
),
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"tmu0"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xffd80008
,
.
end
=
0xffd80013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"tmu0"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xffd80014
,
.
end
=
0xffd8001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"tmu0"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xffd80020
,
.
end
=
0xffd8002b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
plat_sci_port
sci_platform_data
[]
=
{
{
.
mapbase
=
0xffe00000
,
...
...
@@ -202,6 +294,9 @@ static struct platform_device sci_device = {
static
struct
platform_device
*
sh7366_devices
[]
__initdata
=
{
&
cmt_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
iic_device
,
&
sci_device
,
&
usb_host_device
,
...
...
@@ -223,6 +318,9 @@ __initcall(sh7366_devices_setup);
static
struct
platform_device
*
sh7366_early_devices
[]
__initdata
=
{
&
cmt_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
};
void
__init
plat_early_device_setup
(
void
)
...
...
arch/sh/kernel/cpu/sh4a/setup-sh7724.c
View file @
fd5b1245
...
...
@@ -268,8 +268,197 @@ static struct platform_device cmt_device = {
.
num_resources
=
ARRAY_SIZE
(
cmt_resources
),
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"tmu0"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xffd80008
,
.
end
=
0xffd80013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"tmu0"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xffd80014
,
.
end
=
0xffd8001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"tmu0"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xffd80020
,
.
end
=
0xffd8002b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
sh_timer_config
tmu3_platform_data
=
{
.
name
=
"TMU3"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"tmu1"
,
};
static
struct
resource
tmu3_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU3"
,
.
start
=
0xffd90008
,
.
end
=
0xffd90013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
57
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu3_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
3
,
.
dev
=
{
.
platform_data
=
&
tmu3_platform_data
,
},
.
resource
=
tmu3_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu3_resources
),
};
static
struct
sh_timer_config
tmu4_platform_data
=
{
.
name
=
"TMU4"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"tmu1"
,
};
static
struct
resource
tmu4_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU4"
,
.
start
=
0xffd90014
,
.
end
=
0xffd9001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
58
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu4_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
4
,
.
dev
=
{
.
platform_data
=
&
tmu4_platform_data
,
},
.
resource
=
tmu4_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu4_resources
),
};
static
struct
sh_timer_config
tmu5_platform_data
=
{
.
name
=
"TMU5"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"tmu1"
,
};
static
struct
resource
tmu5_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU5"
,
.
start
=
0xffd90020
,
.
end
=
0xffd9002b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
57
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu5_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
5
,
.
dev
=
{
.
platform_data
=
&
tmu5_platform_data
,
},
.
resource
=
tmu5_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu5_resources
),
};
static
struct
platform_device
*
sh7724_devices
[]
__initdata
=
{
&
cmt_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
tmu3_device
,
&
tmu4_device
,
&
tmu5_device
,
&
sci_device
,
&
rtc_device
,
&
iic0_device
,
...
...
@@ -292,6 +481,12 @@ device_initcall(sh7724_devices_setup);
static
struct
platform_device
*
sh7724_early_devices
[]
__initdata
=
{
&
cmt_device
,
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
tmu3_device
,
&
tmu4_device
,
&
tmu5_device
,
};
void
__init
plat_early_device_setup
(
void
)
...
...
arch/sh/kernel/cpu/sh4a/setup-sh7763.c
View file @
fd5b1245
...
...
@@ -12,6 +12,7 @@
#include <linux/platform_device.h>
#include <linux/init.h>
#include <linux/serial.h>
#include <linux/sh_timer.h>
#include <linux/io.h>
#include <linux/serial_sci.h>
...
...
@@ -113,7 +114,195 @@ static struct platform_device usbf_device = {
.
resource
=
usbf_resources
,
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xffd80008
,
.
end
=
0xffd80013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
28
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xffd80014
,
.
end
=
0xffd8001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
29
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xffd80020
,
.
end
=
0xffd8002f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
30
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
sh_timer_config
tmu3_platform_data
=
{
.
name
=
"TMU3"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu3_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU3"
,
.
start
=
0xffd88008
,
.
end
=
0xffd88013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
96
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu3_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
3
,
.
dev
=
{
.
platform_data
=
&
tmu3_platform_data
,
},
.
resource
=
tmu3_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu3_resources
),
};
static
struct
sh_timer_config
tmu4_platform_data
=
{
.
name
=
"TMU4"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu4_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU4"
,
.
start
=
0xffd88014
,
.
end
=
0xffd8801f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
97
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu4_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
4
,
.
dev
=
{
.
platform_data
=
&
tmu4_platform_data
,
},
.
resource
=
tmu4_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu4_resources
),
};
static
struct
sh_timer_config
tmu5_platform_data
=
{
.
name
=
"TMU5"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu5_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU5"
,
.
start
=
0xffd88020
,
.
end
=
0xffd8802b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
98
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu5_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
5
,
.
dev
=
{
.
platform_data
=
&
tmu5_platform_data
,
},
.
resource
=
tmu5_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu5_resources
),
};
static
struct
platform_device
*
sh7763_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
tmu3_device
,
&
tmu4_device
,
&
tmu5_device
,
&
rtc_device
,
&
sci_device
,
&
usb_ohci_device
,
...
...
@@ -127,6 +316,21 @@ static int __init sh7763_devices_setup(void)
}
__initcall
(
sh7763_devices_setup
);
static
struct
platform_device
*
sh7763_early_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
tmu3_device
,
&
tmu4_device
,
&
tmu5_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh7763_early_devices
,
ARRAY_SIZE
(
sh7763_early_devices
));
}
enum
{
UNUSED
=
0
,
...
...
arch/sh/kernel/cpu/sh4a/setup-sh7770.c
View file @
fd5b1245
...
...
@@ -11,6 +11,7 @@
#include <linux/init.h>
#include <linux/serial.h>
#include <linux/serial_sci.h>
#include <linux/sh_timer.h>
static
struct
plat_sci_port
sci_platform_data
[]
=
{
{
...
...
@@ -76,7 +77,288 @@ static struct platform_device sci_device = {
},
};
static
struct
sh_timer_config
tmu0_platform_data
=
{
.
name
=
"TMU0"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
.
clockevent_rating
=
200
,
};
static
struct
resource
tmu0_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU0"
,
.
start
=
0xffd80008
,
.
end
=
0xffd80013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
16
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu0_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
0
,
.
dev
=
{
.
platform_data
=
&
tmu0_platform_data
,
},
.
resource
=
tmu0_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu0_resources
),
};
static
struct
sh_timer_config
tmu1_platform_data
=
{
.
name
=
"TMU1"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
.
clocksource_rating
=
200
,
};
static
struct
resource
tmu1_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU1"
,
.
start
=
0xffd80014
,
.
end
=
0xffd8001f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
17
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu1_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
1
,
.
dev
=
{
.
platform_data
=
&
tmu1_platform_data
,
},
.
resource
=
tmu1_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu1_resources
),
};
static
struct
sh_timer_config
tmu2_platform_data
=
{
.
name
=
"TMU2"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu2_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU2"
,
.
start
=
0xffd80020
,
.
end
=
0xffd8002f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
18
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu2_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
2
,
.
dev
=
{
.
platform_data
=
&
tmu2_platform_data
,
},
.
resource
=
tmu2_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu2_resources
),
};
static
struct
sh_timer_config
tmu3_platform_data
=
{
.
name
=
"TMU3"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu3_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU3"
,
.
start
=
0xffd81008
,
.
end
=
0xffd81013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
19
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu3_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
3
,
.
dev
=
{
.
platform_data
=
&
tmu3_platform_data
,
},
.
resource
=
tmu3_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu3_resources
),
};
static
struct
sh_timer_config
tmu4_platform_data
=
{
.
name
=
"TMU4"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu4_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU4"
,
.
start
=
0xffd81014
,
.
end
=
0xffd8101f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
20
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu4_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
4
,
.
dev
=
{
.
platform_data
=
&
tmu4_platform_data
,
},
.
resource
=
tmu4_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu4_resources
),
};
static
struct
sh_timer_config
tmu5_platform_data
=
{
.
name
=
"TMU5"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu5_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU5"
,
.
start
=
0xffd81020
,
.
end
=
0xffd8102f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
21
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu5_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
5
,
.
dev
=
{
.
platform_data
=
&
tmu5_platform_data
,
},
.
resource
=
tmu5_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu5_resources
),
};
static
struct
sh_timer_config
tmu6_platform_data
=
{
.
name
=
"TMU6"
,
.
channel_offset
=
0x04
,
.
timer_bit
=
0
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu6_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU6"
,
.
start
=
0xffd82008
,
.
end
=
0xffd82013
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
22
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu6_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
6
,
.
dev
=
{
.
platform_data
=
&
tmu6_platform_data
,
},
.
resource
=
tmu6_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu6_resources
),
};
static
struct
sh_timer_config
tmu7_platform_data
=
{
.
name
=
"TMU7"
,
.
channel_offset
=
0x10
,
.
timer_bit
=
1
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu7_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU7"
,
.
start
=
0xffd82014
,
.
end
=
0xffd8201f
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
23
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu7_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
7
,
.
dev
=
{
.
platform_data
=
&
tmu7_platform_data
,
},
.
resource
=
tmu7_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu7_resources
),
};
static
struct
sh_timer_config
tmu8_platform_data
=
{
.
name
=
"TMU8"
,
.
channel_offset
=
0x1c
,
.
timer_bit
=
2
,
.
clk
=
"module_clk"
,
};
static
struct
resource
tmu8_resources
[]
=
{
[
0
]
=
{
.
name
=
"TMU8"
,
.
start
=
0xffd82020
,
.
end
=
0xffd8202b
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
24
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
struct
platform_device
tmu8_device
=
{
.
name
=
"sh_tmu"
,
.
id
=
8
,
.
dev
=
{
.
platform_data
=
&
tmu8_platform_data
,
},
.
resource
=
tmu8_resources
,
.
num_resources
=
ARRAY_SIZE
(
tmu8_resources
),
};
static
struct
platform_device
*
sh7770_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
tmu3_device
,
&
tmu4_device
,
&
tmu5_device
,
&
tmu6_device
,
&
tmu7_device
,
&
tmu8_device
,
&
sci_device
,
};
...
...
@@ -87,6 +369,24 @@ static int __init sh7770_devices_setup(void)
}
__initcall
(
sh7770_devices_setup
);
static
struct
platform_device
*
sh7770_early_devices
[]
__initdata
=
{
&
tmu0_device
,
&
tmu1_device
,
&
tmu2_device
,
&
tmu3_device
,
&
tmu4_device
,
&
tmu5_device
,
&
tmu6_device
,
&
tmu7_device
,
&
tmu8_device
,
};
void
__init
plat_early_device_setup
(
void
)
{
early_platform_add_devices
(
sh7770_early_devices
,
ARRAY_SIZE
(
sh7770_early_devices
));
}
void
__init
plat_irq_setup
(
void
)
{
}
arch/sh/kernel/time.c
View file @
fd5b1245
...
...
@@ -22,9 +22,6 @@
#include <linux/rtc.h>
#include <asm/clock.h>
#include <asm/rtc.h>
#include <asm/timer.h>
struct
sys_timer
*
sys_timer
;
/* Dummy RTC ops */
static
void
null_rtc_get_time
(
struct
timespec
*
tv
)
...
...
@@ -94,20 +91,9 @@ module_init(rtc_generic_init);
void
(
*
board_time_init
)(
void
);
struct
clocksource
clocksource_sh
=
{
.
name
=
"SuperH"
,
};
unsigned
long
long
sched_clock
(
void
)
{
unsigned
long
long
cycles
;
/* jiffies based sched_clock if no clocksource is installed */
if
(
!
clocksource_sh
.
rating
)
return
(
jiffies_64
-
INITIAL_JIFFIES
)
*
(
NSEC_PER_SEC
/
HZ
);
cycles
=
clocksource_sh
.
read
(
&
clocksource_sh
);
return
cyc2ns
(
&
clocksource_sh
,
cycles
);
return
(
jiffies_64
-
INITIAL_JIFFIES
)
*
(
NSEC_PER_SEC
/
HZ
);
}
static
void
__init
sh_late_time_init
(
void
)
...
...
@@ -117,18 +103,7 @@ static void __init sh_late_time_init(void)
* Run probe() for one "earlytimer" device.
*/
early_platform_driver_register_all
(
"earlytimer"
);
if
(
early_platform_driver_probe
(
"earlytimer"
,
1
,
0
))
return
;
/*
* Find the timer to use as the system timer, it will be
* initialized for us.
*/
sys_timer
=
get_sys_timer
();
if
(
unlikely
(
!
sys_timer
))
panic
(
"System timer missing.
\n
"
);
printk
(
KERN_INFO
"Using %s for system timer
\n
"
,
sys_timer
->
name
);
early_platform_driver_probe
(
"earlytimer"
,
1
,
0
);
}
void
__init
time_init
(
void
)
...
...
arch/sh/kernel/timers/Makefile
deleted
100644 → 0
View file @
9fe5ee0e
#
# Makefile for the various Linux/SuperH timers
#
obj-y
:=
timer.o
obj-$(CONFIG_SH_TMU)
+=
timer-tmu.o
arch/sh/kernel/timers/timer-tmu.c
deleted
100644 → 0
View file @
9fe5ee0e
/*
* arch/sh/kernel/timers/timer-tmu.c - TMU Timer Support
*
* Copyright (C) 2005 - 2007 Paul Mundt
*
* TMU handling code hacked out of arch/sh/kernel/time.c
*
* Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka
* Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
* Copyright (C) 2002, 2003, 2004 Paul Mundt
* Copyright (C) 2002 M. R. Brown <mrbrown@linux-sh.org>
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/seqlock.h>
#include <linux/clockchips.h>
#include <asm/timer.h>
#include <asm/rtc.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/clock.h>
#define TMU_TOCR_INIT 0x00
#define TMU_TCR_INIT 0x0020
#define TMU0 (0)
#define TMU1 (1)
static
inline
void
_tmu_start
(
int
tmu_num
)
{
ctrl_outb
(
ctrl_inb
(
TMU_012_TSTR
)
|
(
0x1
<<
tmu_num
),
TMU_012_TSTR
);
}
static
inline
void
_tmu_set_irq
(
int
tmu_num
,
int
enabled
)
{
register
unsigned
long
tmu_tcr
=
TMU0_TCR
+
(
0xc
*
tmu_num
);
ctrl_outw
(
(
enabled
?
ctrl_inw
(
tmu_tcr
)
|
(
1
<<
5
)
:
ctrl_inw
(
tmu_tcr
)
&
~
(
1
<<
5
)),
tmu_tcr
);
}
static
inline
void
_tmu_stop
(
int
tmu_num
)
{
ctrl_outb
(
ctrl_inb
(
TMU_012_TSTR
)
&
~
(
0x1
<<
tmu_num
),
TMU_012_TSTR
);
}
static
inline
void
_tmu_clear_status
(
int
tmu_num
)
{
register
unsigned
long
tmu_tcr
=
TMU0_TCR
+
(
0xc
*
tmu_num
);
/* Clear UNF bit */
ctrl_outw
(
ctrl_inw
(
tmu_tcr
)
&
~
0x100
,
tmu_tcr
);
}
static
inline
unsigned
long
_tmu_read
(
int
tmu_num
)
{
return
ctrl_inl
(
TMU0_TCNT
+
0xC
*
tmu_num
);
}
static
int
tmu_timer_start
(
void
)
{
_tmu_start
(
TMU0
);
_tmu_start
(
TMU1
);
_tmu_set_irq
(
TMU0
,
1
);
return
0
;
}
static
int
tmu_timer_stop
(
void
)
{
_tmu_stop
(
TMU0
);
_tmu_stop
(
TMU1
);
_tmu_clear_status
(
TMU0
);
return
0
;
}
/*
* also when the module_clk is scaled the TMU1
* will show the same frequency
*/
static
int
tmus_are_scaled
;
static
cycle_t
tmu_timer_read
(
struct
clocksource
*
cs
)
{
return
((
cycle_t
)(
~
_tmu_read
(
TMU1
)))
<<
tmus_are_scaled
;
}
static
unsigned
long
tmu_latest_interval
[
3
];
static
void
tmu_timer_set_interval
(
int
tmu_num
,
unsigned
long
interval
,
unsigned
int
reload
)
{
unsigned
long
tmu_tcnt
=
TMU0_TCNT
+
tmu_num
*
0xC
;
unsigned
long
tmu_tcor
=
TMU0_TCOR
+
tmu_num
*
0xC
;
_tmu_stop
(
tmu_num
);
ctrl_outl
(
interval
,
tmu_tcnt
);
tmu_latest_interval
[
tmu_num
]
=
interval
;
/*
* TCNT reloads from TCOR on underflow, clear it if we don't
* intend to auto-reload
*/
ctrl_outl
(
reload
?
interval
:
0
,
tmu_tcor
);
_tmu_start
(
tmu_num
);
}
static
int
tmu_set_next_event
(
unsigned
long
cycles
,
struct
clock_event_device
*
evt
)
{
tmu_timer_set_interval
(
TMU0
,
cycles
,
evt
->
mode
==
CLOCK_EVT_MODE_PERIODIC
);
_tmu_set_irq
(
TMU0
,
1
);
return
0
;
}
static
void
tmu_set_mode
(
enum
clock_event_mode
mode
,
struct
clock_event_device
*
evt
)
{
switch
(
mode
)
{
case
CLOCK_EVT_MODE_PERIODIC
:
ctrl_outl
(
tmu_latest_interval
[
TMU0
],
TMU0_TCOR
);
break
;
case
CLOCK_EVT_MODE_ONESHOT
:
ctrl_outl
(
0
,
TMU0_TCOR
);
break
;
case
CLOCK_EVT_MODE_UNUSED
:
case
CLOCK_EVT_MODE_SHUTDOWN
:
case
CLOCK_EVT_MODE_RESUME
:
break
;
}
}
static
struct
clock_event_device
tmu0_clockevent
=
{
.
name
=
"tmu0"
,
.
shift
=
32
,
.
features
=
CLOCK_EVT_FEAT_PERIODIC
|
CLOCK_EVT_FEAT_ONESHOT
,
.
set_mode
=
tmu_set_mode
,
.
set_next_event
=
tmu_set_next_event
,
};
static
irqreturn_t
tmu_timer_interrupt
(
int
irq
,
void
*
dummy
)
{
struct
clock_event_device
*
evt
=
&
tmu0_clockevent
;
_tmu_clear_status
(
TMU0
);
_tmu_set_irq
(
TMU0
,
tmu0_clockevent
.
mode
!=
CLOCK_EVT_MODE_ONESHOT
);
switch
(
tmu0_clockevent
.
mode
)
{
case
CLOCK_EVT_MODE_ONESHOT
:
case
CLOCK_EVT_MODE_PERIODIC
:
evt
->
event_handler
(
evt
);
break
;
default:
break
;
}
return
IRQ_HANDLED
;
}
static
struct
irqaction
tmu0_irq
=
{
.
name
=
"periodic/oneshot timer"
,
.
handler
=
tmu_timer_interrupt
,
.
flags
=
IRQF_DISABLED
|
IRQF_TIMER
|
IRQF_IRQPOLL
,
};
static
void
__init
tmu_clk_init
(
struct
clk
*
clk
)
{
u8
divisor
=
TMU_TCR_INIT
&
0x7
;
int
tmu_num
=
clk
->
name
[
3
]
-
'0'
;
ctrl_outw
(
TMU_TCR_INIT
,
TMU0_TCR
+
(
tmu_num
*
0xC
));
clk
->
rate
=
clk_get_rate
(
clk
->
parent
)
/
(
4
<<
(
divisor
<<
1
));
}
static
unsigned
long
tmu_clk_recalc
(
struct
clk
*
clk
)
{
int
tmu_num
=
clk
->
name
[
3
]
-
'0'
;
unsigned
long
new_rate
;
unsigned
long
flags
;
u8
divisor
=
ctrl_inw
(
TMU0_TCR
+
tmu_num
*
0xC
)
&
0x7
;
new_rate
=
clk_get_rate
(
clk
->
parent
)
/
(
4
<<
(
divisor
<<
1
));
if
(
clk
->
rate
==
new_rate
||
tmu_num
)
return
clk
->
rate
;
/* No more work on TMU1 */
local_irq_save
(
flags
);
tmus_are_scaled
=
(
clk
->
rate
>
new_rate
);
_tmu_stop
(
TMU0
);
tmu0_clockevent
.
mult
=
div_sc
(
clk
->
rate
,
NSEC_PER_SEC
,
tmu0_clockevent
.
shift
);
tmu0_clockevent
.
max_delta_ns
=
clockevent_delta2ns
(
-
1
,
&
tmu0_clockevent
);
tmu0_clockevent
.
min_delta_ns
=
clockevent_delta2ns
(
1
,
&
tmu0_clockevent
);
if
(
tmus_are_scaled
)
tmu_latest_interval
[
TMU0
]
>>=
1
;
else
tmu_latest_interval
[
TMU0
]
<<=
1
;
tmu_timer_set_interval
(
TMU0
,
tmu_latest_interval
[
TMU0
],
tmu0_clockevent
.
mode
==
CLOCK_EVT_MODE_PERIODIC
);
_tmu_start
(
TMU0
);
local_irq_restore
(
flags
);
return
new_rate
;
}
static
struct
clk_ops
tmu_clk_ops
=
{
.
init
=
tmu_clk_init
,
.
recalc
=
tmu_clk_recalc
,
};
static
struct
clk
tmu0_clk
=
{
.
name
=
"tmu0_clk"
,
.
ops
=
&
tmu_clk_ops
,
};
static
struct
clk
tmu1_clk
=
{
.
name
=
"tmu1_clk"
,
.
ops
=
&
tmu_clk_ops
,
};
static
int
tmu_timer_init
(
void
)
{
unsigned
long
interval
;
unsigned
long
frequency
;
setup_irq
(
CONFIG_SH_TIMER_IRQ
,
&
tmu0_irq
);
tmu0_clk
.
parent
=
clk_get
(
NULL
,
"module_clk"
);
tmu1_clk
.
parent
=
clk_get
(
NULL
,
"module_clk"
);
tmu_timer_stop
();
#if !defined(CONFIG_CPU_SUBTYPE_SH7720) && \
!defined(CONFIG_CPU_SUBTYPE_SH7721) && \
!defined(CONFIG_CPU_SUBTYPE_SH7760) && \
!defined(CONFIG_CPU_SUBTYPE_SH7785) && \
!defined(CONFIG_CPU_SUBTYPE_SH7786) && \
!defined(CONFIG_CPU_SUBTYPE_SHX3)
ctrl_outb
(
TMU_TOCR_INIT
,
TMU_TOCR
);
#endif
clk_register
(
&
tmu0_clk
);
clk_register
(
&
tmu1_clk
);
clk_enable
(
&
tmu0_clk
);
clk_enable
(
&
tmu1_clk
);
frequency
=
clk_get_rate
(
&
tmu0_clk
);
interval
=
(
frequency
+
HZ
/
2
)
/
HZ
;
tmu_timer_set_interval
(
TMU0
,
interval
,
1
);
tmu_timer_set_interval
(
TMU1
,
~
0
,
1
);
_tmu_start
(
TMU1
);
clocksource_sh
.
rating
=
200
;
clocksource_sh
.
mask
=
CLOCKSOURCE_MASK
(
32
);
clocksource_sh
.
read
=
tmu_timer_read
;
clocksource_sh
.
shift
=
10
;
clocksource_sh
.
mult
=
clocksource_hz2mult
(
clk_get_rate
(
&
tmu1_clk
),
clocksource_sh
.
shift
);
clocksource_sh
.
flags
=
CLOCK_SOURCE_IS_CONTINUOUS
;
clocksource_register
(
&
clocksource_sh
);
tmu0_clockevent
.
mult
=
div_sc
(
frequency
,
NSEC_PER_SEC
,
tmu0_clockevent
.
shift
);
tmu0_clockevent
.
max_delta_ns
=
clockevent_delta2ns
(
-
1
,
&
tmu0_clockevent
);
tmu0_clockevent
.
min_delta_ns
=
clockevent_delta2ns
(
1
,
&
tmu0_clockevent
);
tmu0_clockevent
.
cpumask
=
cpumask_of
(
0
);
tmu0_clockevent
.
rating
=
100
;
clockevents_register_device
(
&
tmu0_clockevent
);
return
0
;
}
static
struct
sys_timer_ops
tmu_timer_ops
=
{
.
init
=
tmu_timer_init
,
.
start
=
tmu_timer_start
,
.
stop
=
tmu_timer_stop
,
};
struct
sys_timer
tmu_timer
=
{
.
name
=
"tmu"
,
.
ops
=
&
tmu_timer_ops
,
};
arch/sh/kernel/timers/timer.c
deleted
100644 → 0
View file @
9fe5ee0e
/*
* arch/sh/kernel/timers/timer.c - Common timer code
*
* Copyright (C) 2005 Paul Mundt
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/string.h>
#include <asm/timer.h>
static
struct
sys_timer
*
sys_timers
[]
=
{
#ifdef CONFIG_SH_TMU
&
tmu_timer
,
#endif
NULL
,
};
static
char
timer_override
[
10
];
static
int
__init
timer_setup
(
char
*
str
)
{
if
(
str
)
strlcpy
(
timer_override
,
str
,
sizeof
(
timer_override
));
return
1
;
}
__setup
(
"timer="
,
timer_setup
);
struct
sys_timer
*
get_sys_timer
(
void
)
{
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
sys_timers
);
i
++
)
{
struct
sys_timer
*
t
=
sys_timers
[
i
];
if
(
unlikely
(
!
t
))
break
;
if
(
unlikely
(
timer_override
[
0
]))
if
((
strcmp
(
timer_override
,
t
->
name
)
!=
0
))
continue
;
if
(
likely
(
t
->
ops
->
init
()
==
0
))
return
t
;
}
return
NULL
;
}
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