Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
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