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
macintosh
nvram.c
Go to the documentation of this file.
1
/*
2
* /dev/nvram driver for Power Macintosh.
3
*/
4
5
#define NVRAM_VERSION "1.0"
6
7
#include <linux/module.h>
8
9
#include <linux/types.h>
10
#include <linux/errno.h>
11
#include <linux/fs.h>
12
#include <
linux/miscdevice.h
>
13
#include <linux/fcntl.h>
14
#include <linux/nvram.h>
15
#include <
linux/init.h
>
16
#include <asm/uaccess.h>
17
#include <asm/nvram.h>
18
19
#define NVRAM_SIZE 8192
20
21
static
loff_t nvram_llseek(
struct
file
*
file
, loff_t
offset
,
int
origin
)
22
{
23
switch
(origin) {
24
case
0:
25
break
;
26
case
1:
27
offset += file->
f_pos
;
28
break
;
29
case
2:
30
offset +=
NVRAM_SIZE
;
31
break
;
32
default
:
33
offset = -1;
34
}
35
if
(offset < 0)
36
return
-
EINVAL
;
37
38
file->
f_pos
=
offset
;
39
return
file->
f_pos
;
40
}
41
42
static
ssize_t
read_nvram(
struct
file
*
file
,
char
__user *
buf
,
43
size_t
count
, loff_t *ppos)
44
{
45
unsigned
int
i
;
46
char
__user
*
p
=
buf
;
47
48
if
(!
access_ok
(
VERIFY_WRITE
, buf, count))
49
return
-
EFAULT
;
50
if
(*ppos >=
NVRAM_SIZE
)
51
return
0;
52
for
(i = *ppos; count > 0 && i <
NVRAM_SIZE
; ++
i
, ++
p
, --
count
)
53
if
(
__put_user
(
nvram_read_byte
(i), p))
54
return
-
EFAULT
;
55
*ppos =
i
;
56
return
p -
buf
;
57
}
58
59
static
ssize_t
write_nvram(
struct
file *file,
const
char
__user *buf,
60
size_t
count, loff_t *ppos)
61
{
62
unsigned
int
i
;
63
const
char
__user
*p =
buf
;
64
char
c
;
65
66
if
(!
access_ok
(
VERIFY_READ
, buf, count))
67
return
-
EFAULT
;
68
if
(*ppos >= NVRAM_SIZE)
69
return
0;
70
for
(i = *ppos; count > 0 && i <
NVRAM_SIZE
; ++
i
, ++
p
, --
count
) {
71
if
(
__get_user
(c, p))
72
return
-
EFAULT
;
73
nvram_write_byte
(c, i);
74
}
75
*ppos =
i
;
76
return
p -
buf
;
77
}
78
79
static
long
nvram_ioctl(
struct
file *file,
unsigned
int
cmd
,
unsigned
long
arg
)
80
{
81
switch
(cmd) {
82
case
PMAC_NVRAM_GET_OFFSET:
83
{
84
int
part
,
offset
;
85
if
(
copy_from_user
(&part, (
void
__user*)arg,
sizeof
(part)) != 0)
86
return
-
EFAULT
;
87
if
(part < pmac_nvram_OF || part >
pmac_nvram_NR
)
88
return
-
EINVAL
;
89
offset =
pmac_get_partition
(part);
90
if
(
copy_to_user
((
void
__user*)arg, &offset,
sizeof
(offset)) != 0)
91
return
-
EFAULT
;
92
break
;
93
}
94
95
default
:
96
return
-
EINVAL
;
97
}
98
99
return
0;
100
}
101
102
const
struct
file_operations
nvram_fops
= {
103
.owner =
THIS_MODULE
,
104
.llseek = nvram_llseek,
105
.read = read_nvram,
106
.write = write_nvram,
107
.unlocked_ioctl = nvram_ioctl,
108
};
109
110
static
struct
miscdevice
nvram_dev = {
111
NVRAM_MINOR
,
112
"nvram"
,
113
&nvram_fops
114
};
115
116
int
__init
nvram_init
(
void
)
117
{
118
printk
(
KERN_INFO
"Macintosh non-volatile memory driver v%s\n"
,
119
NVRAM_VERSION
);
120
return
misc_register
(&nvram_dev);
121
}
122
123
void
__exit
nvram_cleanup
(
void
)
124
{
125
misc_deregister
( &nvram_dev );
126
}
127
128
module_init
(nvram_init);
129
module_exit
(
nvram_cleanup
);
130
MODULE_LICENSE
(
"GPL"
);
Generated on Thu Jan 10 2013 13:08:57 for Linux Kernel by
1.8.2