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
sun_uflash.c
Go to the documentation of this file.
1
/* sun_uflash.c - Driver for user-programmable flash on
2
* Sun Microsystems SME boardsets.
3
*
4
* This driver does NOT provide access to the OBP-flash for
5
* safety reasons-- use <linux>/drivers/sbus/char/flash.c instead.
6
*
7
* Copyright (c) 2001 Eric Brower (
[email protected]
)
8
*/
9
10
#include <linux/kernel.h>
11
#include <linux/module.h>
12
#include <linux/fs.h>
13
#include <linux/errno.h>
14
#include <
linux/init.h
>
15
#include <
linux/ioport.h
>
16
#include <
linux/of.h
>
17
#include <
linux/of_device.h
>
18
#include <linux/slab.h>
19
#include <asm/prom.h>
20
#include <asm/uaccess.h>
21
#include <asm/io.h>
22
23
#include <
linux/mtd/mtd.h
>
24
#include <
linux/mtd/map.h
>
25
26
#define UFLASH_OBPNAME "flashprom"
27
#define DRIVER_NAME "sun_uflash"
28
#define PFX DRIVER_NAME ": "
29
30
#define UFLASH_WINDOW_SIZE 0x200000
31
#define UFLASH_BUSWIDTH 1
/* EBus is 8-bit */
32
33
MODULE_AUTHOR
(
"Eric Brower <
[email protected]
>"
);
34
MODULE_DESCRIPTION
(
"User-programmable flash device on Sun Microsystems boardsets"
);
35
MODULE_SUPPORTED_DEVICE
(
DRIVER_NAME
);
36
MODULE_LICENSE
(
"GPL"
);
37
MODULE_VERSION
(
"2.1"
);
38
39
struct
uflash_dev
{
40
const
char
*
name
;
/* device name */
41
struct
map_info
map
;
/* mtd map info */
42
struct
mtd_info
*
mtd
;
/* mtd info */
43
};
44
45
struct
map_info
uflash_map_templ
= {
46
.name =
"SUNW,???-????"
,
47
.size =
UFLASH_WINDOW_SIZE
,
48
.bankwidth =
UFLASH_BUSWIDTH
,
49
};
50
51
int
uflash_devinit
(
struct
platform_device
*
op
,
struct
device_node
*
dp
)
52
{
53
struct
uflash_dev
*
up
;
54
55
if
(op->
resource
[1].flags) {
56
/* Non-CFI userflash device-- once I find one we
57
* can work on supporting it.
58
*/
59
printk
(
KERN_ERR
PFX
"Unsupported device at %s, 0x%llx\n"
,
60
dp->
full_name
, (
unsigned
long
long
)op->
resource
[0].start);
61
62
return
-
ENODEV
;
63
}
64
65
up = kzalloc(
sizeof
(
struct
uflash_dev
),
GFP_KERNEL
);
66
if
(!up) {
67
printk
(
KERN_ERR
PFX
"Cannot allocate struct uflash_dev\n"
);
68
return
-
ENOMEM
;
69
}
70
71
/* copy defaults and tweak parameters */
72
memcpy
(&up->
map
, &uflash_map_templ,
sizeof
(uflash_map_templ));
73
74
up->
map
.size = resource_size(&op->
resource
[0]);
75
76
up->
name
=
of_get_property
(dp,
"model"
,
NULL
);
77
if
(up->
name
&& 0 <
strlen
(up->
name
))
78
up->
map
.name = (
char
*)up->
name
;
79
80
up->
map
.phys = op->
resource
[0].start;
81
82
up->
map
.virt =
of_ioremap
(&op->
resource
[0], 0, up->
map
.size,
83
DRIVER_NAME
);
84
if
(!up->
map
.virt) {
85
printk
(
KERN_ERR
PFX
"Failed to map device.\n"
);
86
kfree
(up);
87
88
return
-
EINVAL
;
89
}
90
91
simple_map_init
(&up->
map
);
92
93
/* MTD registration */
94
up->
mtd
=
do_map_probe
(
"cfi_probe"
, &up->
map
);
95
if
(!up->
mtd
) {
96
of_iounmap
(&op->
resource
[0], up->
map
.virt, up->
map
.size);
97
kfree
(up);
98
99
return
-
ENXIO
;
100
}
101
102
up->
mtd
->owner =
THIS_MODULE
;
103
104
mtd_device_register
(up->
mtd
,
NULL
, 0);
105
106
dev_set_drvdata
(&op->
dev
, up);
107
108
return
0;
109
}
110
111
static
int
__devinit
uflash_probe(
struct
platform_device
*
op
)
112
{
113
struct
device_node
*
dp
= op->
dev
.of_node;
114
115
/* Flashprom must have the "user" property in order to
116
* be used by this driver.
117
*/
118
if
(!
of_find_property
(dp,
"user"
,
NULL
))
119
return
-
ENODEV
;
120
121
return
uflash_devinit
(op, dp);
122
}
123
124
static
int
__devexit
uflash_remove(
struct
platform_device
*op)
125
{
126
struct
uflash_dev
*
up
=
dev_get_drvdata
(&op->
dev
);
127
128
if
(up->
mtd
) {
129
mtd_device_unregister
(up->
mtd
);
130
map_destroy
(up->
mtd
);
131
}
132
if
(up->
map
.virt) {
133
of_iounmap
(&op->
resource
[0], up->
map
.virt, up->
map
.size);
134
up->
map
.virt =
NULL
;
135
}
136
137
kfree
(up);
138
139
return
0;
140
}
141
142
static
const
struct
of_device_id
uflash_match[] = {
143
{
144
.name =
UFLASH_OBPNAME
,
145
},
146
{},
147
};
148
149
MODULE_DEVICE_TABLE
(of, uflash_match);
150
151
static
struct
platform_driver
uflash_driver = {
152
.driver = {
153
.name =
DRIVER_NAME
,
154
.owner =
THIS_MODULE
,
155
.of_match_table = uflash_match,
156
},
157
.probe = uflash_probe,
158
.remove =
__devexit_p
(uflash_remove),
159
};
160
161
module_platform_driver
(uflash_driver);
Generated on Thu Jan 10 2013 13:56:32 for Linux Kernel by
1.8.2