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-davinci
common.c
Go to the documentation of this file.
1
/*
2
* Code commons to all DaVinci SoCs.
3
*
4
* Author: Mark A. Greer <
[email protected]
>
5
*
6
* 2009 (c) MontaVista Software, Inc. This file is licensed under
7
* the terms of the GNU General Public License version 2. This program
8
* is licensed "as is" without any warranty of any kind, whether express
9
* or implied.
10
*/
11
#include <linux/module.h>
12
#include <
linux/io.h
>
13
#include <
linux/etherdevice.h
>
14
#include <
linux/davinci_emac.h
>
15
#include <
linux/dma-mapping.h
>
16
17
#include <asm/tlb.h>
18
#include <
asm/mach/map.h
>
19
20
#include <mach/common.h>
21
#include <mach/cputype.h>
22
23
#include "
clock.h
"
24
25
struct
davinci_soc_info
davinci_soc_info
;
26
EXPORT_SYMBOL
(
davinci_soc_info
);
27
28
void
__iomem
*
davinci_intc_base
;
29
int
davinci_intc_type
;
30
31
void
davinci_get_mac_addr
(
struct
memory_accessor
*mem_acc,
void
*
context
)
32
{
33
char
*
mac_addr
=
davinci_soc_info
.
emac_pdata
->mac_addr;
34
off_t
offset
= (
off_t
)context;
35
36
/* Read MAC addr from EEPROM */
37
if
(mem_acc->
read
(mem_acc, mac_addr, offset,
ETH_ALEN
) ==
ETH_ALEN
)
38
pr_info
(
"Read MAC addr from EEPROM: %pM\n"
, mac_addr);
39
}
40
41
static
int
__init
davinci_init_id(
struct
davinci_soc_info
*soc_info)
42
{
43
int
i
;
44
struct
davinci_id
*dip;
45
u8
variant
;
46
u16
part_no
;
47
void
__iomem
*
base
;
48
49
base =
ioremap
(soc_info->
jtag_id_reg
,
SZ_4K
);
50
if
(!base) {
51
pr_err
(
"Unable to map JTAG ID register\n"
);
52
return
-
ENOMEM
;
53
}
54
55
soc_info->
jtag_id
=
__raw_readl
(base);
56
iounmap
(base);
57
58
variant = (soc_info->
jtag_id
& 0xf0000000) >> 28;
59
part_no = (soc_info->
jtag_id
& 0x0ffff000) >> 12;
60
61
for
(i = 0, dip = soc_info->
ids
; i < soc_info->ids_num;
62
i++, dip++)
63
/* Don't care about the manufacturer right now */
64
if
((dip->
part_no
== part_no) && (dip->
variant
==
variant
)) {
65
soc_info->
cpu_id
= dip->
cpu_id
;
66
pr_info
(
"DaVinci %s variant 0x%x\n"
, dip->
name
,
67
dip->
variant
);
68
return
0;
69
}
70
71
pr_err
(
"Unknown DaVinci JTAG ID 0x%x\n"
, soc_info->
jtag_id
);
72
return
-
EINVAL
;
73
}
74
75
void
__init
davinci_common_init
(
struct
davinci_soc_info
*soc_info)
76
{
77
int
ret
;
78
79
if
(!soc_info) {
80
ret = -
EINVAL
;
81
goto
err
;
82
}
83
84
memcpy
(&
davinci_soc_info
, soc_info,
sizeof
(
struct
davinci_soc_info
));
85
86
if
(
davinci_soc_info
.
io_desc
&& (
davinci_soc_info
.
io_desc_num
> 0))
87
iotable_init
(
davinci_soc_info
.
io_desc
,
88
davinci_soc_info
.
io_desc_num
);
89
90
init_consistent_dma_size(14 << 20);
91
92
/*
93
* Normally devicemaps_init() would flush caches and tlb after
94
* mdesc->map_io(), but we must also do it here because of the CPU
95
* revision check below.
96
*/
97
local_flush_tlb_all
();
98
flush_cache_all
();
99
100
/*
101
* We want to check CPU revision early for cpu_is_xxxx() macros.
102
* IO space mapping must be initialized before we can do that.
103
*/
104
ret = davinci_init_id(&
davinci_soc_info
);
105
if
(ret < 0)
106
goto
err
;
107
108
if
(
davinci_soc_info
.
cpu_clks
) {
109
ret =
davinci_clk_init
(
davinci_soc_info
.
cpu_clks
);
110
111
if
(ret != 0)
112
goto
err
;
113
}
114
115
return
;
116
117
err
:
118
panic
(
"davinci_common_init: SoC Initialization failed\n"
);
119
}
120
121
void
__init
davinci_init_late
(
void
)
122
{
123
davinci_cpufreq_init
();
124
davinci_pm_init
();
125
davinci_clk_disable_unused();
126
}
Generated on Thu Jan 10 2013 12:54:26 for Linux Kernel by
1.8.2