Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
e3608581
Commit
e3608581
authored
Jan 16, 2003
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM] Update acornfb for new fbcon layer.
parent
e1aada59
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
149 additions
and
447 deletions
+149
-447
drivers/video/Makefile
drivers/video/Makefile
+1
-1
drivers/video/acornfb.c
drivers/video/acornfb.c
+148
-446
No files found.
drivers/video/Makefile
View file @
e3608581
...
@@ -18,7 +18,7 @@ ifeq ($(CONFIG_FB),y)
...
@@ -18,7 +18,7 @@ ifeq ($(CONFIG_FB),y)
obj-$(CONFIG_PPC)
+=
macmodes.o
obj-$(CONFIG_PPC)
+=
macmodes.o
endif
endif
obj-$(CONFIG_FB_ACORN)
+=
acornfb.o
obj-$(CONFIG_FB_ACORN)
+=
acornfb.o
cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_AMIGA)
+=
amifb.o
obj-$(CONFIG_FB_AMIGA)
+=
amifb.o
obj-$(CONFIG_FB_PM2)
+=
pm2fb.o
obj-$(CONFIG_FB_PM2)
+=
pm2fb.o
obj-$(CONFIG_FB_PM3)
+=
pm3fb.o
obj-$(CONFIG_FB_PM3)
+=
pm3fb.o
...
...
drivers/video/acornfb.c
View file @
e3608581
...
@@ -12,6 +12,9 @@
...
@@ -12,6 +12,9 @@
* NOTE: Most of the modes with X!=640 will disappear shortly.
* NOTE: Most of the modes with X!=640 will disappear shortly.
* NOTE: Startup setting of HS & VS polarity not supported.
* NOTE: Startup setting of HS & VS polarity not supported.
* (do we need to support it if we're coming up in 640x480?)
* (do we need to support it if we're coming up in 640x480?)
*
* FIXME: (things broken by the "new improved" FBCON API)
* - Blanking 8bpp displays with VIDC
*/
*/
#include <linux/config.h>
#include <linux/config.h>
...
@@ -33,14 +36,6 @@
...
@@ -33,14 +36,6 @@
#include <asm/mach-types.h>
#include <asm/mach-types.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include <video/fbcon.h>
#include <video/fbcon-mfb.h>
#include <video/fbcon-cfb2.h>
#include <video/fbcon-cfb4.h>
#include <video/fbcon-cfb8.h>
#include <video/fbcon-cfb16.h>
#include <video/fbcon-cfb32.h>
#include "acornfb.h"
#include "acornfb.h"
/*
/*
...
@@ -58,25 +53,7 @@
...
@@ -58,25 +53,7 @@
*/
*/
#define DEFAULT_XRES 640
#define DEFAULT_XRES 640
#define DEFAULT_YRES 480
#define DEFAULT_YRES 480
/*
#define DEFAULT_BPP 4
* The order here defines which BPP we
* pick depending on which resolutions
* we have configured.
*/
#if defined(FBCON_HAS_CFB4)
# define DEFAULT_BPP 4
#elif defined(FBCON_HAS_CFB8)
# define DEFAULT_BPP 8
#elif defined(FBCON_HAS_CFB16)
# define DEFAULT_BPP 16
#elif defined(FBCON_HAS_CFB2)
# define DEFAULT_BPP 2
#elif defined(FBCON_HAS_MFB)
# define DEFAULT_BPP 1
#else
#error No suitable framebuffers configured
#endif
/*
/*
* define this to debug the video mode selection
* define this to debug the video mode selection
...
@@ -99,13 +76,10 @@ static struct fb_monspecs monspecs[NR_MONTYPES] __initdata = {
...
@@ -99,13 +76,10 @@ static struct fb_monspecs monspecs[NR_MONTYPES] __initdata = {
{
30000
,
70000
,
60
,
60
,
0
}
{
30000
,
70000
,
60
,
60
,
0
}
};
};
static
struct
display
global_disp
;
static
struct
fb_info
fb_info
;
static
struct
fb_info
fb_info
;
static
struct
acornfb_par
current_par
;
static
struct
acornfb_par
current_par
;
static
struct
vidc_timing
current_vidc
;
static
struct
vidc_timing
current_vidc
;
static
struct
fb_var_screeninfo
__initdata
init_var
=
{};
extern
int
acornfb_depth
;
/* set by setup.c */
extern
unsigned
int
vram_size
;
/* set by setup.c */
extern
unsigned
int
vram_size
;
/* set by setup.c */
#ifdef HAS_VIDC
#ifdef HAS_VIDC
...
@@ -333,34 +307,26 @@ acornfb_set_timing(struct fb_var_screeninfo *var)
...
@@ -333,34 +307,26 @@ acornfb_set_timing(struct fb_var_screeninfo *var)
#endif
#endif
}
}
static
inline
void
static
int
acornfb_palette_write
(
u_int
regno
,
union
palette
pal
)
acornfb_setcolreg
(
u_int
regno
,
u_int
red
,
u_int
green
,
u_int
blue
,
{
u_int
trans
,
struct
fb_info
*
info
)
vidc_writel
(
pal
.
p
);
}
static
inline
union
palette
acornfb_palette_encode
(
u_int
regno
,
u_int
red
,
u_int
green
,
u_int
blue
,
u_int
trans
)
{
{
union
palette
pal
;
union
palette
pal
;
if
(
regno
>=
current_par
.
palette_size
)
return
1
;
pal
.
p
=
0
;
pal
.
p
=
0
;
pal
.
vidc
.
reg
=
regno
;
pal
.
vidc
.
reg
=
regno
;
pal
.
vidc
.
red
=
red
>>
12
;
pal
.
vidc
.
red
=
red
>>
12
;
pal
.
vidc
.
green
=
green
>>
12
;
pal
.
vidc
.
green
=
green
>>
12
;
pal
.
vidc
.
blue
=
blue
>>
12
;
pal
.
vidc
.
blue
=
blue
>>
12
;
return
pal
;
}
static
void
current_par
.
palette
[
regno
]
=
pal
;
acornfb_palette_decode
(
u_int
regno
,
u_int
*
red
,
u_int
*
green
,
u_int
*
blue
,
u_int
*
trans
)
vidc_writel
(
pal
.
p
);
{
*
red
=
EXTEND4
(
current_par
.
palette
[
regno
].
vidc
.
red
);
return
0
;
*
green
=
EXTEND4
(
current_par
.
palette
[
regno
].
vidc
.
green
);
*
blue
=
EXTEND4
(
current_par
.
palette
[
regno
].
vidc
.
blue
);
*
trans
=
current_par
.
palette
[
regno
].
vidc
.
trans
?
-
1
:
0
;
}
}
#endif
#endif
...
@@ -513,34 +479,66 @@ acornfb_set_timing(struct fb_info *info, struct fb_var_screeninfo *var)
...
@@ -513,34 +479,66 @@ acornfb_set_timing(struct fb_info *info, struct fb_var_screeninfo *var)
#endif
#endif
}
}
static
inline
void
/*
acornfb_palette_write
(
u_int
regno
,
union
palette
pal
)
* We have to take note of the VIDC20's 16-bit palette here.
{
* The VIDC20 looks up a 16 bit pixel as follows:
vidc_writel
(
0x10000000
|
regno
);
*
vidc_writel
(
pal
.
p
);
* bits 111111
}
* 5432109876543210
* red ++++++++ (8 bits, 7 to 0)
static
inline
union
palette
* green ++++++++ (8 bits, 11 to 4)
acornfb_palette_encode
(
u_int
regno
,
u_int
red
,
u_int
green
,
u_int
blue
,
* blue ++++++++ (8 bits, 15 to 8)
u_int
trans
)
*
* We use a pixel which looks like:
*
* bits 111111
* 5432109876543210
* red +++++ (5 bits, 4 to 0)
* green +++++ (5 bits, 9 to 5)
* blue +++++ (5 bits, 14 to 10)
*/
static
int
acornfb_setcolreg
(
u_int
regno
,
u_int
red
,
u_int
green
,
u_int
blue
,
u_int
trans
,
struct
fb_info
*
info
)
{
{
union
palette
pal
;
union
palette
pal
;
int
bpp
=
info
->
var
.
bits_per_pixel
;
if
(
regno
>=
current_par
.
palette_size
)
return
1
;
pal
.
p
=
0
;
pal
.
p
=
0
;
pal
.
vidc20
.
red
=
red
>>
8
;
pal
.
vidc20
.
red
=
red
>>
8
;
pal
.
vidc20
.
green
=
green
>>
8
;
pal
.
vidc20
.
green
=
green
>>
8
;
pal
.
vidc20
.
blue
=
blue
>>
8
;
pal
.
vidc20
.
blue
=
blue
>>
8
;
return
pal
;
}
static
void
current_par
.
palette
[
regno
]
=
pal
;
acornfb_palette_decode
(
u_int
regno
,
u_int
*
red
,
u_int
*
green
,
u_int
*
blue
,
u_int
*
trans
)
if
(
bpp
==
32
&&
regno
<
16
)
{
{
current_par
.
cmap
.
cfb32
[
regno
]
=
*
red
=
EXTEND8
(
current_par
.
palette
[
regno
].
vidc20
.
red
);
regno
|
regno
<<
8
|
regno
<<
16
;
*
green
=
EXTEND8
(
current_par
.
palette
[
regno
].
vidc20
.
green
);
}
*
blue
=
EXTEND8
(
current_par
.
palette
[
regno
].
vidc20
.
blue
);
if
(
bpp
==
16
&&
regno
<
16
)
{
*
trans
=
EXTEND4
(
current_par
.
palette
[
regno
].
vidc20
.
ext
);
int
i
;
current_par
.
cmap
.
cfb16
[
regno
]
=
regno
|
regno
<<
5
|
regno
<<
10
;
pal
.
p
=
0
;
vidc_writel
(
0x10000000
);
for
(
i
=
0
;
i
<
256
;
i
+=
1
)
{
pal
.
vidc20
.
red
=
current_par
.
palette
[
i
&
31
].
vidc20
.
red
;
pal
.
vidc20
.
green
=
current_par
.
palette
[(
i
>>
1
)
&
31
].
vidc20
.
green
;
pal
.
vidc20
.
blue
=
current_par
.
palette
[(
i
>>
2
)
&
31
].
vidc20
.
blue
;
vidc_writel
(
pal
.
p
);
/* Palette register pointer auto-increments */
}
}
else
{
vidc_writel
(
0x10000000
|
regno
);
vidc_writel
(
pal
.
p
);
}
return
0
;
}
}
#endif
#endif
...
@@ -549,12 +547,9 @@ acornfb_palette_decode(u_int regno, u_int *red, u_int *green, u_int *blue,
...
@@ -549,12 +547,9 @@ acornfb_palette_decode(u_int regno, u_int *red, u_int *green, u_int *blue,
* the resolution to fit the rules.
* the resolution to fit the rules.
*/
*/
static
int
static
int
acornfb_adjust_timing
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
,
int
con
)
acornfb_adjust_timing
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
,
u_int
fontht
)
{
{
u_int
font_line_len
;
u_int
font_line_len
,
sam_size
,
min_size
,
size
,
nr_y
;
u_int
fontht
;
u_int
sam_size
,
min_size
,
size
;
u_int
nr_y
;
/* xres must be even */
/* xres must be even */
var
->
xres
=
(
var
->
xres
+
1
)
&
~
1
;
var
->
xres
=
(
var
->
xres
+
1
)
&
~
1
;
...
@@ -565,17 +560,6 @@ acornfb_adjust_timing(struct fb_info *info, struct fb_var_screeninfo *var, int c
...
@@ -565,17 +560,6 @@ acornfb_adjust_timing(struct fb_info *info, struct fb_var_screeninfo *var, int c
var
->
xres_virtual
=
var
->
xres
;
var
->
xres_virtual
=
var
->
xres
;
var
->
xoffset
=
0
;
var
->
xoffset
=
0
;
/*
* Find the font height
*/
if
(
con
==
-
1
)
fontht
=
fontheight
(
&
global_disp
);
else
fontht
=
fontheight
(
fb_display
+
con
);
if
(
fontht
==
0
)
fontht
=
8
;
if
(
current_par
.
using_vram
)
if
(
current_par
.
using_vram
)
sam_size
=
current_par
.
vram_half_sam
*
2
;
sam_size
=
current_par
.
vram_half_sam
*
2
;
else
else
...
@@ -693,8 +677,8 @@ acornfb_validate_timing(struct fb_var_screeninfo *var,
...
@@ -693,8 +677,8 @@ acornfb_validate_timing(struct fb_var_screeninfo *var,
static
inline
void
static
inline
void
acornfb_update_dma
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
)
acornfb_update_dma
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
)
{
{
int
off
=
(
var
->
yoffset
*
var
->
xres_virtual
*
u_
int
off
=
(
var
->
yoffset
*
var
->
xres_virtual
*
var
->
bits_per_pixel
)
>>
3
;
var
->
bits_per_pixel
)
>>
3
;
#if defined(HAS_MEMC)
#if defined(HAS_MEMC)
memc_write
(
VDMA_INIT
,
off
>>
2
);
memc_write
(
VDMA_INIT
,
off
>>
2
);
...
@@ -704,130 +688,27 @@ acornfb_update_dma(struct fb_info *info, struct fb_var_screeninfo *var)
...
@@ -704,130 +688,27 @@ acornfb_update_dma(struct fb_info *info, struct fb_var_screeninfo *var)
}
}
static
int
static
int
acornfb_getcolreg
(
u_int
regno
,
u_int
*
red
,
u_int
*
green
,
u_int
*
blue
,
acornfb_check_var
(
struct
fb_var_screeninfo
*
var
,
struct
fb_info
*
info
)
u_int
*
trans
,
struct
fb_info
*
info
)
{
if
(
regno
>=
current_par
.
palette_size
)
return
1
;
acornfb_palette_decode
(
regno
,
red
,
green
,
blue
,
trans
);
return
0
;
}
/*
* We have to take note of the VIDC20's 16-bit palette here.
* The VIDC20 looks up a 16 bit pixel as follows:
*
* bits 111111
* 5432109876543210
* red ++++++++ (8 bits, 7 to 0)
* green ++++++++ (8 bits, 11 to 4)
* blue ++++++++ (8 bits, 15 to 8)
*
* We use a pixel which looks like:
*
* bits 111111
* 5432109876543210
* red +++++ (5 bits, 4 to 0)
* green +++++ (5 bits, 9 to 5)
* blue +++++ (5 bits, 14 to 10)
*/
static
int
acornfb_setcolreg
(
u_int
regno
,
u_int
red
,
u_int
green
,
u_int
blue
,
u_int
trans
,
struct
fb_info
*
info
)
{
union
palette
pal
;
int
bpp
=
fb_display
[
info
->
currcon
].
var
.
bits_per_pixel
;
if
(
regno
>=
current_par
.
palette_size
)
return
1
;
pal
=
acornfb_palette_encode
(
regno
,
red
,
green
,
blue
,
trans
);
current_par
.
palette
[
regno
]
=
pal
;
#ifdef FBCON_HAS_CFB32
if
(
bpp
==
32
&&
regno
<
16
)
{
current_par
.
cmap
.
cfb32
[
regno
]
=
regno
|
regno
<<
8
|
regno
<<
16
;
}
#endif
#ifdef FBCON_HAS_CFB16
if
(
bpp
==
16
&&
regno
<
16
)
{
int
i
;
current_par
.
cmap
.
cfb16
[
regno
]
=
regno
|
regno
<<
5
|
regno
<<
10
;
pal
.
p
=
0
;
vidc_writel
(
0x10000000
);
for
(
i
=
0
;
i
<
256
;
i
+=
1
)
{
pal
.
vidc20
.
red
=
current_par
.
palette
[
i
&
31
].
vidc20
.
red
;
pal
.
vidc20
.
green
=
current_par
.
palette
[(
i
>>
1
)
&
31
].
vidc20
.
green
;
pal
.
vidc20
.
blue
=
current_par
.
palette
[(
i
>>
2
)
&
31
].
vidc20
.
blue
;
vidc_writel
(
pal
.
p
);
/* Palette register pointer auto-increments */
}
}
else
#endif
acornfb_palette_write
(
regno
,
pal
);
return
0
;
}
static
int
acornfb_get_cmap
(
struct
fb_cmap
*
cmap
,
int
kspc
,
int
con
,
struct
fb_info
*
info
)
{
int
err
=
0
;
if
(
con
==
info
->
currcon
)
err
=
fb_get_cmap
(
cmap
,
kspc
,
acornfb_getcolreg
,
info
);
else
if
(
fb_display
[
con
].
cmap
.
len
)
fb_copy_cmap
(
&
fb_display
[
con
].
cmap
,
cmap
,
kspc
?
0
:
2
);
else
fb_copy_cmap
(
fb_default_cmap
(
current_par
.
palette_size
),
cmap
,
kspc
?
0
:
2
);
return
err
;
}
static
int
acornfb_decode_var
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
,
int
con
)
{
{
u_int
fontht
;
int
err
;
int
err
;
#if defined(HAS_VIDC20)
/*
var
->
red
.
offset
=
0
;
* FIXME: Find the font height
var
->
red
.
length
=
8
;
*/
var
->
green
=
var
->
red
;
fontht
=
8
;
var
->
blue
=
var
->
red
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
4
;
#elif defined(HAS_VIDC)
var
->
red
.
length
=
4
;
var
->
green
=
var
->
red
;
var
->
blue
=
var
->
red
;
var
->
transp
.
length
=
1
;
#endif
switch
(
var
->
bits_per_pixel
)
{
switch
(
var
->
bits_per_pixel
)
{
#ifdef FBCON_HAS_MFB
case
1
:
case
2
:
case
4
:
case
8
:
case
1
:
var
->
red
.
offset
=
0
;
break
;
var
->
red
.
length
=
var
->
bits_per_pixel
;
#endif
var
->
green
=
var
->
red
;
#ifdef FBCON_HAS_CFB2
var
->
blue
=
var
->
red
;
case
2
:
var
->
transp
.
offset
=
0
;
break
;
var
->
transp
.
length
=
0
;
#endif
#ifdef FBCON_HAS_CFB4
case
4
:
break
;
#endif
#ifdef FBCON_HAS_CFB8
case
8
:
break
;
break
;
#endif
#ifdef
FBCON_HAS_CFB16
#ifdef
HAS_VIDC20
case
16
:
case
16
:
var
->
red
.
offset
=
0
;
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
5
;
var
->
red
.
length
=
5
;
...
@@ -838,8 +719,7 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
...
@@ -838,8 +719,7 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
var
->
transp
.
offset
=
15
;
var
->
transp
.
offset
=
15
;
var
->
transp
.
length
=
1
;
var
->
transp
.
length
=
1
;
break
;
break
;
#endif
#ifdef FBCON_HAS_CFB32
case
32
:
case
32
:
var
->
red
.
offset
=
0
;
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
8
;
var
->
red
.
length
=
8
;
...
@@ -865,7 +745,7 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
...
@@ -865,7 +745,7 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
* Validate and adjust the resolution to
* Validate and adjust the resolution to
* match the video generator hardware.
* match the video generator hardware.
*/
*/
err
=
acornfb_adjust_timing
(
info
,
var
,
con
);
err
=
acornfb_adjust_timing
(
info
,
var
,
fontht
);
if
(
err
)
if
(
err
)
return
err
;
return
err
;
...
@@ -873,137 +753,61 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
...
@@ -873,137 +753,61 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
* Validate the timing against the
* Validate the timing against the
* monitor hardware.
* monitor hardware.
*/
*/
return
acornfb_validate_timing
(
var
,
&
fb_info
.
monspecs
);
return
acornfb_validate_timing
(
var
,
&
info
->
monspecs
);
}
}
static
int
static
int
acornfb_set_par
(
struct
fb_info
*
info
)
acornfb_set_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
{
{
struct
display
*
display
;
switch
(
info
->
var
.
bits_per_pixel
)
{
unsigned
int
visual
,
chgvar
=
0
;
int
err
;
if
(
con
>=
0
)
display
=
fb_display
+
con
;
else
display
=
&
global_disp
;
err
=
acornfb_decode_var
(
info
,
var
,
con
);
if
(
err
)
return
err
;
switch
(
var
->
activate
&
FB_ACTIVATE_MASK
)
{
case
FB_ACTIVATE_TEST
:
return
0
;
case
FB_ACTIVATE_NXTOPEN
:
case
FB_ACTIVATE_NOW
:
break
;
default:
return
-
EINVAL
;
}
if
(
con
>=
0
)
{
if
(
display
->
var
.
xres
!=
var
->
xres
)
chgvar
=
1
;
if
(
display
->
var
.
yres
!=
var
->
yres
)
chgvar
=
1
;
if
(
display
->
var
.
xres_virtual
!=
var
->
xres_virtual
)
chgvar
=
1
;
if
(
display
->
var
.
yres_virtual
!=
var
->
yres_virtual
)
chgvar
=
1
;
if
(
memcmp
(
&
display
->
var
.
red
,
&
var
->
red
,
sizeof
(
var
->
red
)))
chgvar
=
1
;
if
(
memcmp
(
&
display
->
var
.
green
,
&
var
->
green
,
sizeof
(
var
->
green
)))
chgvar
=
1
;
if
(
memcmp
(
&
display
->
var
.
blue
,
&
var
->
blue
,
sizeof
(
var
->
blue
)))
chgvar
=
1
;
}
display
->
var
=
*
var
;
display
->
var
.
activate
&=
~
FB_ACTIVATE_ALL
;
if
(
var
->
activate
&
FB_ACTIVATE_ALL
)
global_disp
.
var
=
display
->
var
;
switch
(
display
->
var
.
bits_per_pixel
)
{
#ifdef FBCON_HAS_MFB
case
1
:
case
1
:
current_par
.
palette_size
=
2
;
current_par
.
palette_size
=
2
;
display
->
dispsw
=
&
fbcon_mfb
;
info
->
fix
.
visual
=
FB_VISUAL_MONO10
;
visual
=
FB_VISUAL_MONO10
;
break
;
break
;
#endif
#ifdef FBCON_HAS_CFB2
case
2
:
case
2
:
current_par
.
palette_size
=
4
;
current_par
.
palette_size
=
4
;
display
->
dispsw
=
&
fbcon_cfb2
;
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
visual
=
FB_VISUAL_PSEUDOCOLOR
;
break
;
break
;
#endif
#ifdef FBCON_HAS_CFB4
case
4
:
case
4
:
current_par
.
palette_size
=
16
;
current_par
.
palette_size
=
16
;
display
->
dispsw
=
&
fbcon_cfb4
;
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
visual
=
FB_VISUAL_PSEUDOCOLOR
;
break
;
break
;
#endif
#ifdef FBCON_HAS_CFB8
case
8
:
case
8
:
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
display
->
dispsw
=
&
fbcon_cfb8
;
#ifdef HAS_VIDC
#ifdef HAS_VIDC
visual
=
FB_VISUAL_STATIC_PSEUDOCOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_STATIC_PSEUDOCOLOR
;
#else
#else
visual
=
FB_VISUAL_PSEUDOCOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
#endif
#endif
break
;
break
;
#endif
#ifdef HAS_VIDC20
#ifdef FBCON_HAS_CFB16
case
16
:
case
16
:
current_par
.
palette_size
=
32
;
current_par
.
palette_size
=
32
;
display
->
dispsw
=
&
fbcon_cfb16
;
info
->
pseudo_palette
=
current_par
.
cmap
.
cfb16
;
display
->
dispsw_data
=
current_par
.
cmap
.
cfb16
;
info
->
fix
.
visual
=
FB_VISUAL_DIRECTCOLOR
;
visual
=
FB_VISUAL_DIRECTCOLOR
;
break
;
break
;
#endif
#ifdef FBCON_HAS_CFB32
case
32
:
case
32
:
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
display
->
dispsw
=
&
fbcon_cfb32
;
info
->
pseudo_palette
=
current_par
.
cmap
.
cfb32
;
display
->
dispsw_data
=
current_par
.
cmap
.
cfb32
;
info
->
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
visual
=
FB_VISUAL_TRUECOLOR
;
break
;
break
;
#endif
#endif
default:
default:
display
->
dispsw
=
&
fbcon_dummy
;
BUG
();
visual
=
FB_VISUAL_MONO10
;
break
;
}
}
display
->
next_line
=
(
var
->
xres
*
var
->
bits_per_pixel
)
/
8
;
info
->
fix
.
line_length
=
(
info
->
var
.
xres
*
info
->
var
.
bits_per_pixel
)
/
8
;
display
->
can_soft_blank
=
visual
==
FB_VISUAL_PSEUDOCOLOR
?
1
:
0
;
display
->
inverse
=
0
;
if
(
chgvar
&&
info
&&
info
->
changevar
)
info
->
changevar
(
con
);
if
(
con
==
info
->
currcon
)
{
struct
fb_cmap
*
cmap
;
unsigned
long
start
,
size
;
int
control
;
info
->
fix
.
visual
=
visual
;
#if defined(HAS_MEMC)
#if defined(HAS_MEMC)
start
=
0
;
{
size
=
info
->
fix
.
smem_len
-
VDMA_XFERSIZE
;
unsigned
long
size
=
info
->
fix
.
smem_len
-
VDMA_XFERSIZE
;
control
=
0
;
memc_write
(
VDMA_START
,
start
);
memc_write
(
VDMA_START
,
0
);
memc_write
(
VDMA_END
,
size
>>
2
);
memc_write
(
VDMA_END
,
size
>>
2
);
}
#elif defined(HAS_IOMD)
#elif defined(HAS_IOMD)
{
unsigned
long
start
,
size
;
u_int
control
;
start
=
info
->
fix
.
smem_start
;
start
=
info
->
fix
.
smem_start
;
size
=
current_par
.
screen_end
;
size
=
current_par
.
screen_end
;
...
@@ -1019,80 +823,27 @@ acornfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
...
@@ -1019,80 +823,27 @@ acornfb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info)
iomd_writel
(
start
,
IOMD_VIDSTART
);
iomd_writel
(
start
,
IOMD_VIDSTART
);
iomd_writel
(
size
,
IOMD_VIDEND
);
iomd_writel
(
size
,
IOMD_VIDEND
);
iomd_writel
(
control
,
IOMD_VIDCR
);
iomd_writel
(
control
,
IOMD_VIDCR
);
}
#endif
#endif
acornfb_update_dma
(
info
,
var
);
acornfb_set_timing
(
info
,
var
);
if
(
display
->
cmap
.
len
)
acornfb_update_dma
(
info
,
&
info
->
var
);
cmap
=
&
display
->
cmap
;
acornfb_set_timing
(
info
,
&
info
->
var
);
else
cmap
=
fb_default_cmap
(
current_par
.
palette_size
);
fb_set_cmap
(
cmap
,
1
,
info
);
}
return
0
;
return
0
;
}
}
static
int
static
int
acornfb_pan_display
(
struct
fb_var_screeninfo
*
var
,
int
con
,
acornfb_pan_display
(
struct
fb_var_screeninfo
*
var
,
struct
fb_info
*
info
)
struct
fb_info
*
info
)
{
{
u_int
y_bottom
;
u_int
y_bottom
=
var
->
yoffset
;
if
(
var
->
xoffset
)
return
-
EINVAL
;
y_bottom
=
var
->
yoffset
;
if
(
!
(
var
->
vmode
&
FB_VMODE_YWRAP
))
if
(
!
(
var
->
vmode
&
FB_VMODE_YWRAP
))
y_bottom
+=
var
->
yres
;
y_bottom
+=
var
->
yres
;
if
(
y_bottom
>
fb_display
[
con
].
var
.
yres_virtual
)
BUG_ON
(
y_bottom
>
var
->
yres_virtual
);
return
-
EINVAL
;
acornfb_update_dma
(
info
,
var
);
acornfb_update_dma
(
info
,
var
);
fb_display
[
con
].
var
.
yoffset
=
var
->
yoffset
;
if
(
var
->
vmode
&
FB_VMODE_YWRAP
)
fb_display
[
con
].
var
.
vmode
|=
FB_VMODE_YWRAP
;
else
fb_display
[
con
].
var
.
vmode
&=
~
FB_VMODE_YWRAP
;
return
0
;
}
static
int
acornfb_blank
(
int
blank
,
struct
fb_info
*
info
)
{
union
palette
p
;
int
i
,
bpp
=
fb_display
[
info
->
currcon
].
var
.
bits_per_pixel
;
#ifdef FBCON_HAS_CFB16
if
(
bpp
==
16
)
{
p
.
p
=
0
;
for
(
i
=
0
;
i
<
256
;
i
++
)
{
if
(
blank
)
p
=
acornfb_palette_encode
(
i
,
0
,
0
,
0
,
0
);
else
{
p
.
vidc20
.
red
=
current_par
.
palette
[
i
&
31
].
vidc20
.
red
;
p
.
vidc20
.
green
=
current_par
.
palette
[(
i
>>
1
)
&
31
].
vidc20
.
green
;
p
.
vidc20
.
blue
=
current_par
.
palette
[(
i
>>
2
)
&
31
].
vidc20
.
blue
;
}
acornfb_palette_write
(
i
,
current_par
.
palette
[
i
]);
}
}
else
#endif
{
for
(
i
=
0
;
i
<
current_par
.
palette_size
;
i
++
)
{
if
(
blank
)
p
=
acornfb_palette_encode
(
i
,
0
,
0
,
0
,
0
);
else
p
=
current_par
.
palette
[
i
];
acornfb_palette_write
(
i
,
p
);
}
}
return
0
;
return
0
;
}
}
...
@@ -1137,45 +888,16 @@ acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma
...
@@ -1137,45 +888,16 @@ acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma
static
struct
fb_ops
acornfb_ops
=
{
static
struct
fb_ops
acornfb_ops
=
{
.
owner
=
THIS_MODULE
,
.
owner
=
THIS_MODULE
,
.
fb_set_var
=
acornfb_set_var
,
.
fb_check_var
=
acornfb_check_var
,
.
fb_get_cmap
=
acornfb_get_cmap
,
.
fb_set_par
=
acornfb_set_par
,
.
fb_set_cmap
=
gen_set_cmap
,
.
fb_setcolreg
=
acornfb_setcolreg
,
.
fb_setcolreg
=
acornfb_setcolreg
,
.
fb_pan_display
=
acornfb_pan_display
,
.
fb_pan_display
=
acornfb_pan_display
,
.
fb_blank
=
acornfb_blank
,
.
fb_fillrect
=
cfb_fillrect
,
.
fb_copyarea
=
cfb_copyarea
,
.
fb_imageblit
=
cfb_imageblit
,
.
fb_mmap
=
acornfb_mmap
,
.
fb_mmap
=
acornfb_mmap
,
};
};
static
int
acornfb_updatevar
(
int
con
,
struct
fb_info
*
info
)
{
if
(
con
==
info
->
currcon
)
acornfb_update_dma
(
info
,
&
fb_display
[
con
].
var
);
return
0
;
}
static
int
acornfb_switch
(
int
con
,
struct
fb_info
*
info
)
{
struct
fb_cmap
*
cmap
;
if
(
info
->
currcon
>=
0
)
{
cmap
=
&
fb_display
[
info
->
currcon
].
cmap
;
if
(
cmap
->
len
)
fb_get_cmap
(
cmap
,
1
,
acornfb_getcolreg
,
info
);
}
info
->
currcon
=
con
;
fb_display
[
con
].
var
.
activate
=
FB_ACTIVATE_NOW
;
acornfb_set_var
(
&
fb_display
[
con
].
var
,
con
,
info
);
return
0
;
}
/*
/*
* Everything after here is initialisation!!!
* Everything after here is initialisation!!!
*/
*/
...
@@ -1248,8 +970,7 @@ acornfb_default_mode = {
...
@@ -1248,8 +970,7 @@ acornfb_default_mode = {
.
vmode
=
FB_VMODE_NONINTERLACED
.
vmode
=
FB_VMODE_NONINTERLACED
};
};
static
void
__init
static
void
__init
acornfb_init_fbinfo
(
void
)
acornfb_init_fbinfo
(
void
)
{
{
static
int
first
=
1
;
static
int
first
=
1
;
...
@@ -1257,15 +978,8 @@ acornfb_init_fbinfo(void)
...
@@ -1257,15 +978,8 @@ acornfb_init_fbinfo(void)
return
;
return
;
first
=
0
;
first
=
0
;
strcpy
(
fb_info
.
modename
,
"Acorn"
);
strcpy
(
fb_info
.
fontname
,
"Acorn8x8"
);
fb_info
.
node
=
NODEV
;
fb_info
.
node
=
NODEV
;
fb_info
.
fbops
=
&
acornfb_ops
;
fb_info
.
fbops
=
&
acornfb_ops
;
fb_info
.
disp
=
&
global_disp
;
fb_info
.
changevar
=
NULL
;
fb_info
.
switch_con
=
acornfb_switch
;
fb_info
.
updatevar
=
acornfb_updatevar
;
fb_info
.
flags
=
FBINFO_FLAG_DEFAULT
;
fb_info
.
flags
=
FBINFO_FLAG_DEFAULT
;
strcpy
(
fb_info
.
fix
.
id
,
"Acorn"
);
strcpy
(
fb_info
.
fix
.
id
,
"Acorn"
);
...
@@ -1277,28 +991,26 @@ acornfb_init_fbinfo(void)
...
@@ -1277,28 +991,26 @@ acornfb_init_fbinfo(void)
fb_info
.
fix
.
line_length
=
0
;
fb_info
.
fix
.
line_length
=
0
;
fb_info
.
fix
.
accel
=
FB_ACCEL_NONE
;
fb_info
.
fix
.
accel
=
FB_ACCEL_NONE
;
global_disp
.
dispsw
=
&
fbcon_dummy
;
/*
/*
* setup initial parameters
* setup initial parameters
*/
*/
memset
(
&
init_var
,
0
,
sizeof
(
init_
var
));
memset
(
&
fb_info
.
var
,
0
,
sizeof
(
fb_info
.
var
));
#if defined(HAS_VIDC20)
#if defined(HAS_VIDC20)
init_
var
.
red
.
length
=
8
;
fb_info
.
var
.
red
.
length
=
8
;
init_var
.
transp
.
length
=
4
;
fb_info
.
var
.
transp
.
length
=
4
;
#elif defined(HAS_VIDC)
#elif defined(HAS_VIDC)
init_
var
.
red
.
length
=
4
;
fb_info
.
var
.
red
.
length
=
4
;
init_var
.
transp
.
length
=
1
;
fb_info
.
var
.
transp
.
length
=
1
;
#endif
#endif
init_var
.
green
=
init_
var
.
red
;
fb_info
.
var
.
green
=
fb_info
.
var
.
red
;
init_var
.
blue
=
init_
var
.
red
;
fb_info
.
var
.
blue
=
fb_info
.
var
.
red
;
init_var
.
nonstd
=
0
;
fb_info
.
var
.
nonstd
=
0
;
init_
var
.
activate
=
FB_ACTIVATE_NOW
;
fb_info
.
var
.
activate
=
FB_ACTIVATE_NOW
;
init_var
.
height
=
-
1
;
fb_info
.
var
.
height
=
-
1
;
init_var
.
width
=
-
1
;
fb_info
.
var
.
width
=
-
1
;
init_var
.
vmode
=
FB_VMODE_NONINTERLACED
;
fb_info
.
var
.
vmode
=
FB_VMODE_NONINTERLACED
;
init_
var
.
accel_flags
=
FB_ACCELF_TEXT
;
fb_info
.
var
.
accel_flags
=
FB_ACCELF_TEXT
;
current_par
.
dram_size
=
0
;
current_par
.
dram_size
=
0
;
current_par
.
montype
=
-
1
;
current_par
.
montype
=
-
1
;
...
@@ -1308,9 +1020,6 @@ acornfb_init_fbinfo(void)
...
@@ -1308,9 +1020,6 @@ acornfb_init_fbinfo(void)
/*
/*
* setup acornfb options:
* setup acornfb options:
*
*
* font:fontname
* Set fontname
*
* mon:hmin-hmax:vmin-vmax:dpms:width:height
* mon:hmin-hmax:vmin-vmax:dpms:width:height
* Set monitor parameters:
* Set monitor parameters:
* hmin = horizontal minimum frequency (Hz)
* hmin = horizontal minimum frequency (Hz)
...
@@ -1337,12 +1046,6 @@ acornfb_init_fbinfo(void)
...
@@ -1337,12 +1046,6 @@ acornfb_init_fbinfo(void)
* size can optionally be followed by 'M' or 'K' for
* size can optionally be followed by 'M' or 'K' for
* MB or KB respectively.
* MB or KB respectively.
*/
*/
static
void
__init
acornfb_parse_font
(
char
*
opt
)
{
strcpy
(
fb_info
.
fontname
,
opt
);
}
static
void
__init
static
void
__init
acornfb_parse_mon
(
char
*
opt
)
acornfb_parse_mon
(
char
*
opt
)
{
{
...
@@ -1373,12 +1076,12 @@ acornfb_parse_mon(char *opt)
...
@@ -1373,12 +1076,12 @@ acornfb_parse_mon(char *opt)
if
(
*
p
!=
':'
)
if
(
*
p
!=
':'
)
goto
check_values
;
goto
check_values
;
init_
var
.
width
=
simple_strtoul
(
p
+
1
,
&
p
,
0
);
fb_info
.
var
.
width
=
simple_strtoul
(
p
+
1
,
&
p
,
0
);
if
(
*
p
!=
':'
)
if
(
*
p
!=
':'
)
goto
check_values
;
goto
check_values
;
init_
var
.
height
=
simple_strtoul
(
p
+
1
,
NULL
,
0
);
fb_info
.
var
.
height
=
simple_strtoul
(
p
+
1
,
NULL
,
0
);
check_values:
check_values:
if
(
fb_info
.
monspecs
.
hfmax
<
fb_info
.
monspecs
.
hfmin
||
if
(
fb_info
.
monspecs
.
hfmax
<
fb_info
.
monspecs
.
hfmin
||
...
@@ -1460,7 +1163,6 @@ static struct options {
...
@@ -1460,7 +1163,6 @@ static struct options {
char
*
name
;
char
*
name
;
void
(
*
parse
)(
char
*
opt
);
void
(
*
parse
)(
char
*
opt
);
}
opt_table
[]
__initdata
=
{
}
opt_table
[]
__initdata
=
{
{
"font"
,
acornfb_parse_font
},
{
"mon"
,
acornfb_parse_mon
},
{
"mon"
,
acornfb_parse_mon
},
{
"montype"
,
acornfb_parse_montype
},
{
"montype"
,
acornfb_parse_montype
},
{
"dram"
,
acornfb_parse_dram
},
{
"dram"
,
acornfb_parse_dram
},
...
@@ -1658,7 +1360,7 @@ acornfb_init(void)
...
@@ -1658,7 +1360,7 @@ acornfb_init(void)
* the resolution, so we disable this feature.
* the resolution, so we disable this feature.
*/
*/
do
{
do
{
rc
=
fb_find_mode
(
&
init_
var
,
&
fb_info
,
NULL
,
modedb
,
rc
=
fb_find_mode
(
&
fb_info
.
var
,
&
fb_info
,
NULL
,
modedb
,
sizeof
(
modedb
)
/
sizeof
(
*
modedb
),
sizeof
(
modedb
)
/
sizeof
(
*
modedb
),
&
acornfb_default_mode
,
DEFAULT_BPP
);
&
acornfb_default_mode
,
DEFAULT_BPP
);
/*
/*
...
@@ -1667,7 +1369,7 @@ acornfb_init(void)
...
@@ -1667,7 +1369,7 @@ acornfb_init(void)
if
(
rc
==
1
)
if
(
rc
==
1
)
break
;
break
;
rc
=
fb_find_mode
(
&
init_
var
,
&
fb_info
,
NULL
,
NULL
,
0
,
rc
=
fb_find_mode
(
&
fb_info
.
var
,
&
fb_info
,
NULL
,
NULL
,
0
,
&
acornfb_default_mode
,
DEFAULT_BPP
);
&
acornfb_default_mode
,
DEFAULT_BPP
);
/*
/*
* If we found an exact match, all ok.
* If we found an exact match, all ok.
...
@@ -1675,13 +1377,13 @@ acornfb_init(void)
...
@@ -1675,13 +1377,13 @@ acornfb_init(void)
if
(
rc
==
1
)
if
(
rc
==
1
)
break
;
break
;
rc
=
fb_find_mode
(
&
init_
var
,
&
fb_info
,
NULL
,
modedb
,
rc
=
fb_find_mode
(
&
fb_info
.
var
,
&
fb_info
,
NULL
,
modedb
,
sizeof
(
modedb
)
/
sizeof
(
*
modedb
),
sizeof
(
modedb
)
/
sizeof
(
*
modedb
),
&
acornfb_default_mode
,
DEFAULT_BPP
);
&
acornfb_default_mode
,
DEFAULT_BPP
);
if
(
rc
)
if
(
rc
)
break
;
break
;
rc
=
fb_find_mode
(
&
init_
var
,
&
fb_info
,
NULL
,
NULL
,
0
,
rc
=
fb_find_mode
(
&
fb_info
.
var
,
&
fb_info
,
NULL
,
NULL
,
0
,
&
acornfb_default_mode
,
DEFAULT_BPP
);
&
acornfb_default_mode
,
DEFAULT_BPP
);
}
while
(
0
);
}
while
(
0
);
...
@@ -1694,17 +1396,17 @@ acornfb_init(void)
...
@@ -1694,17 +1396,17 @@ acornfb_init(void)
return
-
EINVAL
;
return
-
EINVAL
;
}
}
h_sync
=
1953125000
/
init_
var
.
pixclock
;
h_sync
=
1953125000
/
fb_info
.
var
.
pixclock
;
h_sync
=
h_sync
*
512
/
(
init_var
.
xres
+
init_
var
.
left_margin
+
h_sync
=
h_sync
*
512
/
(
fb_info
.
var
.
xres
+
fb_info
.
var
.
left_margin
+
init_var
.
right_margin
+
init_
var
.
hsync_len
);
fb_info
.
var
.
right_margin
+
fb_info
.
var
.
hsync_len
);
v_sync
=
h_sync
/
(
init_var
.
yres
+
init_
var
.
upper_margin
+
v_sync
=
h_sync
/
(
fb_info
.
var
.
yres
+
fb_info
.
var
.
upper_margin
+
init_var
.
lower_margin
+
init_
var
.
vsync_len
);
fb_info
.
var
.
lower_margin
+
fb_info
.
var
.
vsync_len
);
printk
(
KERN_INFO
"Acornfb: %dkB %cRAM, %s, using %dx%d, "
printk
(
KERN_INFO
"Acornfb: %dkB %cRAM, %s, using %dx%d, "
"%d.%03dkHz, %dHz
\n
"
,
"%d.%03dkHz, %dHz
\n
"
,
fb_info
.
fix
.
smem_len
/
1024
,
fb_info
.
fix
.
smem_len
/
1024
,
current_par
.
using_vram
?
'V'
:
'D'
,
current_par
.
using_vram
?
'V'
:
'D'
,
VIDC_NAME
,
init_var
.
xres
,
init_
var
.
yres
,
VIDC_NAME
,
fb_info
.
var
.
xres
,
fb_info
.
var
.
yres
,
h_sync
/
1000
,
h_sync
%
1000
,
v_sync
);
h_sync
/
1000
,
h_sync
%
1000
,
v_sync
);
printk
(
KERN_INFO
"Acornfb: Monitor: %d.%03d-%d.%03dkHz, %d-%dHz%s
\n
"
,
printk
(
KERN_INFO
"Acornfb: Monitor: %d.%03d-%d.%03dkHz, %d-%dHz%s
\n
"
,
...
@@ -1713,7 +1415,7 @@ acornfb_init(void)
...
@@ -1713,7 +1415,7 @@ acornfb_init(void)
fb_info
.
monspecs
.
vfmin
,
fb_info
.
monspecs
.
vfmax
,
fb_info
.
monspecs
.
vfmin
,
fb_info
.
monspecs
.
vfmax
,
fb_info
.
monspecs
.
dpms
?
", DPMS"
:
""
);
fb_info
.
monspecs
.
dpms
?
", DPMS"
:
""
);
if
(
acornfb_set_var
(
&
init_var
,
-
1
,
&
fb_info
))
if
(
fb_set_var
(
&
fb_info
.
var
,
&
fb_info
))
printk
(
KERN_ERR
"Acornfb: unable to set display parameters
\n
"
);
printk
(
KERN_ERR
"Acornfb: unable to set display parameters
\n
"
);
if
(
register_framebuffer
(
&
fb_info
)
<
0
)
if
(
register_framebuffer
(
&
fb_info
)
<
0
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment