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
drivers
mtd
maps
uclinux.c
Go to the documentation of this file.
1
/****************************************************************************/
2
3
/*
4
* uclinux.c -- generic memory mapped MTD driver for uclinux
5
*
6
* (C) Copyright 2002, Greg Ungerer (
[email protected]
)
7
*/
8
9
/****************************************************************************/
10
11
#include <linux/module.h>
12
#include <linux/types.h>
13
#include <
linux/init.h
>
14
#include <linux/kernel.h>
15
#include <linux/fs.h>
16
#include <
linux/mm.h
>
17
#include <
linux/major.h
>
18
#include <
linux/mtd/mtd.h
>
19
#include <
linux/mtd/map.h
>
20
#include <
linux/mtd/partitions.h
>
21
#include <asm/io.h>
22
#include <asm/sections.h>
23
24
/****************************************************************************/
25
26
struct
map_info
uclinux_ram_map
= {
27
.name =
"RAM"
,
28
.phys = (
unsigned
long
)
__bss_stop
,
29
.
size
= 0,
30
};
31
32
static
struct
mtd_info
*uclinux_ram_mtdinfo;
33
34
/****************************************************************************/
35
36
static
struct
mtd_partition
uclinux_romfs[] = {
37
{ .
name
=
"ROMfs"
}
38
};
39
40
#define NUM_PARTITIONS ARRAY_SIZE(uclinux_romfs)
41
42
/****************************************************************************/
43
44
static
int
uclinux_point(
struct
mtd_info
*mtd, loff_t
from
,
size_t
len,
45
size_t
*retlen,
void
**virt,
resource_size_t
*
phys
)
46
{
47
struct
map_info
*
map
= mtd->
priv
;
48
*virt = map->
virt
+
from
;
49
if
(phys)
50
*phys = map->
phys
+
from
;
51
*retlen = len;
52
return
(0);
53
}
54
55
/****************************************************************************/
56
57
static
int
__init
uclinux_mtd_init(
void
)
58
{
59
struct
mtd_info
*mtd;
60
struct
map_info
*mapp;
61
62
mapp = &
uclinux_ram_map
;
63
if
(!mapp->
size
)
64
mapp->
size
=
PAGE_ALIGN
(
ntohl
(*((
unsigned
long
*)(mapp->
phys
+ 8))));
65
mapp->
bankwidth
= 4;
66
67
printk
(
"uclinux[mtd]: RAM probe address=0x%x size=0x%x\n"
,
68
(
int
) mapp->
phys
, (
int
) mapp->
size
);
69
70
/*
71
* The filesystem is guaranteed to be in direct mapped memory. It is
72
* directly following the kernels own bss region. Following the same
73
* mechanism used by architectures setting up traditional initrds we
74
* use phys_to_virt to get the virtual address of its start.
75
*/
76
mapp->
virt
=
phys_to_virt
(mapp->
phys
);
77
78
if
(mapp->
virt
== 0) {
79
printk
(
"uclinux[mtd]: no virtual mapping?\n"
);
80
return
(-
EIO
);
81
}
82
83
simple_map_init
(mapp);
84
85
mtd =
do_map_probe
(
"map_ram"
, mapp);
86
if
(!mtd) {
87
printk
(
"uclinux[mtd]: failed to find a mapping?\n"
);
88
return
(-
ENXIO
);
89
}
90
91
mtd->
owner
=
THIS_MODULE
;
92
mtd->
_point
= uclinux_point;
93
mtd->
priv
= mapp;
94
95
uclinux_ram_mtdinfo = mtd;
96
mtd_device_register
(mtd, uclinux_romfs,
NUM_PARTITIONS
);
97
98
return
(0);
99
}
100
101
/****************************************************************************/
102
103
static
void
__exit
uclinux_mtd_cleanup(
void
)
104
{
105
if
(uclinux_ram_mtdinfo) {
106
mtd_device_unregister
(uclinux_ram_mtdinfo);
107
map_destroy
(uclinux_ram_mtdinfo);
108
uclinux_ram_mtdinfo =
NULL
;
109
}
110
if
(uclinux_ram_map.
virt
)
111
uclinux_ram_map.
virt
= 0;
112
}
113
114
/****************************************************************************/
115
116
module_init
(uclinux_mtd_init);
117
module_exit
(uclinux_mtd_cleanup);
118
119
MODULE_LICENSE
(
"GPL"
);
120
MODULE_AUTHOR
(
"Greg Ungerer <
[email protected]
>"
);
121
MODULE_DESCRIPTION
(
"Generic RAM based MTD for uClinux"
);
122
123
/****************************************************************************/
Generated on Thu Jan 10 2013 13:56:33 for Linux Kernel by
1.8.2