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 <mgreer@mvista.com>
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