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
video
sunxvr1000.c
Go to the documentation of this file.
1
/* sunxvr1000.c: Sun XVR-1000 driver for sparc64 systems
2
*
3
* Copyright (C) 2010 David S. Miller (davem@davemloft.net)
4
*/
5
6
#include <linux/module.h>
7
#include <linux/kernel.h>
8
#include <linux/fb.h>
9
#include <
linux/init.h
>
10
#include <
linux/of_device.h
>
11
12
struct
gfb_info
{
13
struct
fb_info
*
info
;
14
15
char
__iomem
*
fb_base
;
16
unsigned
long
fb_base_phys
;
17
18
struct
device_node
*
of_node
;
19
20
unsigned
int
width
;
21
unsigned
int
height
;
22
unsigned
int
depth
;
23
unsigned
int
fb_size
;
24
25
u32
pseudo_palette
[16];
26
};
27
28
static
int
__devinit
gfb_get_props(
struct
gfb_info
*
gp
)
29
{
30
gp->
width
=
of_getintprop_default
(gp->
of_node
,
"width"
, 0);
31
gp->
height
=
of_getintprop_default
(gp->
of_node
,
"height"
, 0);
32
gp->
depth
=
of_getintprop_default
(gp->
of_node
,
"depth"
, 32);
33
34
if
(!gp->
width
|| !gp->
height
) {
35
printk
(
KERN_ERR
"gfb: Critical properties missing for %s\n"
,
36
gp->
of_node
->full_name);
37
return
-
EINVAL
;
38
}
39
40
return
0;
41
}
42
43
static
int
gfb_setcolreg(
unsigned
regno,
44
unsigned
red
,
unsigned
green
,
unsigned
blue
,
45
unsigned
transp
,
struct
fb_info
*
info
)
46
{
47
u32
value
;
48
49
if
(regno < 16) {
50
red >>= 8;
51
green >>= 8;
52
blue >>= 8;
53
54
value = (blue << 16) | (green << 8) |
red
;
55
((
u32
*)info->
pseudo_palette
)[regno] =
value
;
56
}
57
58
return
0;
59
}
60
61
static
struct
fb_ops
gfb_ops = {
62
.owner =
THIS_MODULE
,
63
.fb_setcolreg = gfb_setcolreg,
64
.fb_fillrect =
cfb_fillrect
,
65
.fb_copyarea =
cfb_copyarea
,
66
.fb_imageblit =
cfb_imageblit
,
67
};
68
69
static
int
__devinit
gfb_set_fbinfo(
struct
gfb_info
*
gp
)
70
{
71
struct
fb_info
*info = gp->
info
;
72
struct
fb_var_screeninfo
*var = &info->
var
;
73
74
info->
flags
=
FBINFO_DEFAULT
;
75
info->
fbops
= &gfb_ops;
76
info->
screen_base
= gp->
fb_base
;
77
info->
screen_size
= gp->
fb_size
;
78
79
info->
pseudo_palette
= gp->
pseudo_palette
;
80
81
/* Fill fix common fields */
82
strlcpy
(info->
fix
.id,
"gfb"
,
sizeof
(info->
fix
.id));
83
info->
fix
.smem_start = gp->
fb_base_phys
;
84
info->
fix
.smem_len = gp->
fb_size
;
85
info->
fix
.type =
FB_TYPE_PACKED_PIXELS
;
86
if
(gp->
depth
== 32 || gp->
depth
== 24)
87
info->
fix
.visual =
FB_VISUAL_TRUECOLOR
;
88
else
89
info->
fix
.visual =
FB_VISUAL_PSEUDOCOLOR
;
90
91
var->
xres
= gp->
width
;
92
var->
yres
= gp->
height
;
93
var->
xres_virtual
= var->
xres
;
94
var->
yres_virtual
= var->
yres
;
95
var->
bits_per_pixel
= gp->
depth
;
96
97
var->
red
.offset = 0;
98
var->
red
.length = 8;
99
var->
green
.offset = 8;
100
var->
green
.length = 8;
101
var->
blue
.offset = 16;
102
var->
blue
.length = 8;
103
var->
transp
.offset = 0;
104
var->
transp
.length = 0;
105
106
if
(
fb_alloc_cmap
(&info->
cmap
, 256, 0)) {
107
printk
(
KERN_ERR
"gfb: Cannot allocate color map.\n"
);
108
return
-
ENOMEM
;
109
}
110
111
return
0;
112
}
113
114
static
int
__devinit
gfb_probe(
struct
platform_device
*
op
)
115
{
116
struct
device_node
*
dp
= op->
dev
.of_node;
117
struct
fb_info
*
info
;
118
struct
gfb_info
*
gp
;
119
int
err
;
120
121
info =
framebuffer_alloc
(
sizeof
(
struct
gfb_info
), &op->
dev
);
122
if
(!info) {
123
printk
(
KERN_ERR
"gfb: Cannot allocate fb_info\n"
);
124
err = -
ENOMEM
;
125
goto
err_out;
126
}
127
128
gp = info->
par
;
129
gp->
info
=
info
;
130
gp->
of_node
=
dp
;
131
132
gp->
fb_base_phys
= op->
resource
[6].start;
133
134
err = gfb_get_props(gp);
135
if
(err)
136
goto
err_release_fb;
137
138
/* Framebuffer length is the same regardless of resolution. */
139
info->
fix
.line_length = 16384;
140
gp->
fb_size
= info->
fix
.line_length * gp->
height
;
141
142
gp->
fb_base
=
of_ioremap
(&op->
resource
[6], 0,
143
gp->
fb_size
,
"gfb fb"
);
144
if
(!gp->
fb_base
) {
145
err = -
ENOMEM
;
146
goto
err_release_fb;
147
}
148
149
err = gfb_set_fbinfo(gp);
150
if
(err)
151
goto
err_unmap_fb;
152
153
printk
(
"gfb: Found device at %s\n"
, dp->
full_name
);
154
155
err =
register_framebuffer
(info);
156
if
(err < 0) {
157
printk
(
KERN_ERR
"gfb: Could not register framebuffer %s\n"
,
158
dp->
full_name
);
159
goto
err_unmap_fb;
160
}
161
162
dev_set_drvdata
(&op->
dev
, info);
163
164
return
0;
165
166
err_unmap_fb:
167
of_iounmap
(&op->
resource
[6], gp->
fb_base
, gp->
fb_size
);
168
169
err_release_fb:
170
framebuffer_release
(info);
171
172
err_out:
173
return
err
;
174
}
175
176
static
int
__devexit
gfb_remove(
struct
platform_device
*op)
177
{
178
struct
fb_info
*info =
dev_get_drvdata
(&op->
dev
);
179
struct
gfb_info
*gp = info->
par
;
180
181
unregister_framebuffer
(info);
182
183
iounmap
(gp->
fb_base
);
184
185
of_iounmap
(&op->
resource
[6], gp->
fb_base
, gp->
fb_size
);
186
187
framebuffer_release
(info);
188
189
dev_set_drvdata
(&op->
dev
,
NULL
);
190
191
return
0;
192
}
193
194
static
const
struct
of_device_id
gfb_match[] = {
195
{
196
.name =
"SUNW,gfb"
,
197
},
198
{},
199
};
200
MODULE_DEVICE_TABLE
(of, ffb_match);
201
202
static
struct
platform_driver
gfb_driver = {
203
.probe = gfb_probe,
204
.remove =
__devexit_p
(gfb_remove),
205
.driver = {
206
.name =
"gfb"
,
207
.owner =
THIS_MODULE
,
208
.of_match_table = gfb_match,
209
},
210
};
211
212
static
int
__init
gfb_init(
void
)
213
{
214
if
(
fb_get_options
(
"gfb"
,
NULL
))
215
return
-
ENODEV
;
216
217
return
platform_driver_register
(&gfb_driver);
218
}
219
220
static
void
__exit
gfb_exit(
void
)
221
{
222
platform_driver_unregister
(&gfb_driver);
223
}
224
225
module_init
(gfb_init);
226
module_exit
(gfb_exit);
227
228
MODULE_DESCRIPTION
(
"framebuffer driver for Sun XVR-1000 graphics"
);
229
MODULE_AUTHOR
(
"David S. Miller <davem@davemloft.net>"
);
230
MODULE_VERSION
(
"1.0"
);
231
MODULE_LICENSE
(
"GPL"
);
Generated on Thu Jan 10 2013 14:42:06 for Linux Kernel by
1.8.2