Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
arm
mach-nomadik
cpu-8815.c
Go to the documentation of this file.
1
/*
2
* Copyright STMicroelectronics, 2007.
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*/
18
19
#include <linux/types.h>
20
#include <
linux/init.h
>
21
#include <linux/device.h>
22
#include <
linux/amba/bus.h
>
23
#include <
linux/platform_device.h
>
24
#include <
linux/io.h
>
25
#include <linux/slab.h>
26
#include <
linux/irq.h
>
27
#include <
linux/dma-mapping.h
>
28
#include <
linux/platform_data/clk-nomadik.h
>
29
30
#include <
plat/gpio-nomadik.h
>
31
#include <mach/hardware.h>
32
#include <mach/irqs.h>
33
#include <
asm/mach/map.h
>
34
#include <
asm/hardware/vic.h
>
35
36
#include <asm/cacheflush.h>
37
#include <
asm/hardware/cache-l2x0.h
>
38
39
#include "
cpu-8815.h
"
40
41
/* The 8815 has 4 GPIO blocks, let's register them immediately */
42
static
resource_size_t
__initdata
cpu8815_gpio_base[] = {
43
NOMADIK_GPIO0_BASE
,
44
NOMADIK_GPIO1_BASE
,
45
NOMADIK_GPIO2_BASE
,
46
NOMADIK_GPIO3_BASE
,
47
};
48
49
static
struct
platform_device
*
50
cpu8815_add_gpio(
int
id
,
resource_size_t
addr
,
int
irq,
51
struct
nmk_gpio_platform_data
*
pdata
)
52
{
53
struct
resource
resources
[] = {
54
{
55
.start =
addr
,
56
.end = addr + 127,
57
.flags =
IORESOURCE_MEM
,
58
},
59
{
60
.start = irq,
61
.end = irq,
62
.flags =
IORESOURCE_IRQ
,
63
}
64
};
65
66
return
platform_device_register_resndata(
NULL
,
"gpio"
,
id
,
67
resources,
ARRAY_SIZE
(resources),
68
pdata,
sizeof
(*pdata));
69
}
70
71
void
cpu8815_add_gpios
(
resource_size_t
*base,
int
num,
int
irq,
72
struct
nmk_gpio_platform_data
*pdata)
73
{
74
int
first
= 0;
75
int
i
;
76
77
for
(i = 0; i < num; i++, first += 32, irq++) {
78
pdata->
first_gpio
=
first
;
79
pdata->
first_irq
=
NOMADIK_GPIO_TO_IRQ
(first);
80
pdata->
num_gpio
= 32;
81
82
cpu8815_add_gpio(i, base[i], irq, pdata);
83
}
84
}
85
86
static
inline
void
87
cpu8815_add_pinctrl(
struct
device
*
parent
,
const
char
*
name
)
88
{
89
struct
platform_device_info
pdevinfo = {
90
.
parent
=
parent
,
91
.name =
name
,
92
.id = -1,
93
};
94
95
platform_device_register_full
(&pdevinfo);
96
}
97
98
static
int
__init
cpu8815_init(
void
)
99
{
100
struct
nmk_gpio_platform_data
pdata = {
101
/* No custom data yet */
102
};
103
104
cpu8815_add_gpios
(cpu8815_gpio_base,
ARRAY_SIZE
(cpu8815_gpio_base),
105
IRQ_GPIO0
, &pdata);
106
cpu8815_add_pinctrl(
NULL
,
"pinctrl-stn8815"
);
107
amba_apb_device_add
(
NULL
,
"rng"
,
NOMADIK_RNG_BASE
,
SZ_4K
, 0, 0,
NULL
, 0);
108
amba_apb_device_add
(
NULL
,
"rtc-pl031"
,
NOMADIK_RTC_BASE
,
SZ_4K
,
IRQ_RTC_RTT
, 0,
NULL
, 0);
109
return
0;
110
}
111
arch_initcall
(cpu8815_init);
112
113
/* All SoC devices live in the same area (see hardware.h) */
114
static
struct
map_desc
nomadik_io_desc[]
__initdata
= {
115
{
116
.virtual =
NOMADIK_IO_VIRTUAL
,
117
.pfn =
__phys_to_pfn
(
NOMADIK_IO_PHYSICAL
),
118
.length =
NOMADIK_IO_SIZE
,
119
.type =
MT_DEVICE
,
120
}
121
/* static ram and secured ram may be added later */
122
};
123
124
void
__init
cpu8815_map_io
(
void
)
125
{
126
iotable_init
(nomadik_io_desc,
ARRAY_SIZE
(nomadik_io_desc));
127
}
128
129
void
__init
cpu8815_init_irq
(
void
)
130
{
131
/* This modified VIC cell has two register blocks, at 0 and 0x20 */
132
vic_init
(
io_p2v
(
NOMADIK_IC_BASE
+ 0x00),
IRQ_VIC_START
+ 0, ~0, 0);
133
vic_init
(
io_p2v
(
NOMADIK_IC_BASE
+ 0x20),
IRQ_VIC_START
+ 32, ~0, 0);
134
135
/*
136
* Init clocks here so that they are available for system timer
137
* initialization.
138
*/
139
nomadik_clk_init
();
140
}
141
142
/*
143
* This function is called from the board init ("init_machine").
144
*/
145
void
__init
cpu8815_platform_init
(
void
)
146
{
147
#ifdef CONFIG_CACHE_L2X0
148
/* At full speed latency must be >=2, so 0x249 in low bits */
149
l2x0_init
(
io_p2v
(
NOMADIK_L2CC_BASE
), 0x00730249, 0xfe000fff);
150
#endif
151
return
;
152
}
153
154
void
cpu8815_restart
(
char
mode
,
const
char
*
cmd
)
155
{
156
void
__iomem
*src_rstsr =
io_p2v
(
NOMADIK_SRC_BASE
+ 0x18);
157
158
/* FIXME: use egpio when implemented */
159
160
/* Write anything to Reset status register */
161
writel
(1, src_rstsr);
162
}
Generated on Thu Jan 10 2013 13:00:06 for Linux Kernel by
1.8.2