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
6a48e1ca
Commit
6a48e1ca
authored
Jan 16, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
7f5ea7bc
5c157415
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
195 additions
and
470 deletions
+195
-470
arch/arm/kernel/bios32.c
arch/arm/kernel/bios32.c
+1
-1
arch/arm/kernel/process.c
arch/arm/kernel/process.c
+2
-1
arch/arm/tools/mach-types
arch/arm/tools/mach-types
+10
-2
drivers/acorn/block/fd1772.c
drivers/acorn/block/fd1772.c
+26
-12
drivers/ide/Kconfig
drivers/ide/Kconfig
+1
-1
drivers/video/Makefile
drivers/video/Makefile
+2
-2
drivers/video/acornfb.c
drivers/video/acornfb.c
+148
-446
drivers/video/sa1100fb.h
drivers/video/sa1100fb.h
+1
-3
include/asm-arm/arch-integrator/memory.h
include/asm-arm/arch-integrator/memory.h
+4
-2
No files found.
arch/arm/kernel/bios32.c
View file @
6a48e1ca
...
...
@@ -11,7 +11,7 @@
#include <linux/slab.h>
#include <linux/init.h>
#include <asm/
page.h>
/* for BUG() */
#include <asm/
bug.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
...
...
arch/arm/kernel/process.c
View file @
6a48e1ca
...
...
@@ -91,15 +91,16 @@ void default_idle(void)
void
cpu_idle
(
void
)
{
/* endless idle loop with no priority at all */
preempt_disable
();
while
(
1
)
{
void
(
*
idle
)(
void
)
=
pm_idle
;
if
(
!
idle
)
idle
=
default_idle
;
preempt_disable
();
leds_event
(
led_idle_start
);
while
(
!
need_resched
())
idle
();
leds_event
(
led_idle_end
);
preempt_enable
();
schedule
();
}
}
...
...
arch/arm/tools/mach-types
View file @
6a48e1ca
...
...
@@ -6,7 +6,7 @@
# To add an entry into this database, please see Documentation/arm/README,
# or contact rmk@arm.linux.org.uk
#
# Last update: Mon
Dec 23 18:49:04 2002
# Last update: Mon
Jan 13 22:55:16 2003
#
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
#
...
...
@@ -198,7 +198,7 @@ omaha ARCH_OMAHA OMAHA 186
ta7 ARCH_TA7 TA7 187
nova SA1100_NOVA NOVA 188
hmk ARCH_HMK HMK 189
inphinity ARCH_INPHINITY INPHINITY
190
karo ARCH_KARO KARO
190
fester SA1100_FESTER FESTER 191
gpi ARCH_GPI GPI 192
smdk2410 ARCH_SMDK2410 SMDK2410 193
...
...
@@ -273,3 +273,11 @@ prpmc1100 ARCH_PRPMC1100 PRPMC1100 261
at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 262
armstick ARCH_ARMSTICK ARMSTICK 263
armonie ARCH_ARMONIE ARMONIE 264
mport1 ARCH_MPORT1 MPORT1 265
s3c5410 ARCH_S3C5410 S3C5410 266
zcp320a ARCH_ZCP320A ZCP320A 267
i_box ARCH_I_BOX I_BOX 268
stlc1502 ARCH_STLC1502 STLC1502 269
siren ARCH_SIREN SIREN 270
greenlake ARCH_GREENLAKE GREENLAKE 271
argus ARCH_ARGUS ARGUS 272
drivers/acorn/block/fd1772.c
View file @
6a48e1ca
...
...
@@ -1528,7 +1528,7 @@ static struct gendisk *floppy_find(dev_t dev, int *part, void *data)
int
fd1772_init
(
void
)
{
static
spinlock_t
lock
=
SPIN_LOCK_UNLOCKED
;
int
i
;
int
i
,
err
=
-
ENOMEM
;
if
(
!
machine_is_archimedes
())
return
0
;
...
...
@@ -1536,27 +1536,25 @@ int fd1772_init(void)
for
(
i
=
0
;
i
<
FD_MAX_UNITS
;
i
++
)
{
disks
[
i
]
=
alloc_disk
(
1
);
if
(
!
disks
[
i
])
goto
out
;
goto
err_disk
;
}
if
(
register_blkdev
(
MAJOR_NR
,
"fd"
,
&
floppy_fops
))
{
err
=
register_blkdev
(
MAJOR_NR
,
"fd"
,
&
floppy_fops
);
if
(
err
)
{
printk
(
"Unable to get major %d for floppy
\n
"
,
MAJOR_NR
);
goto
out
;
goto
err_disk
;
}
err
=
-
EBUSY
;
if
(
request_dma
(
FLOPPY_DMA
,
"fd1772"
))
{
printk
(
"Unable to grab DMA%d for the floppy (1772) driver
\n
"
,
FLOPPY_DMA
);
unregister_blkdev
(
MAJOR_NR
,
"fd"
);
goto
out
;
goto
err_blkdev
;
};
if
(
request_dma
(
FIQ_FD1772
,
"fd1772 end"
))
{
printk
(
"Unable to grab DMA%d for the floppy (1772) driver
\n
"
,
FIQ_FD1772
);
unregister_blkdev
(
MAJOR_NR
,
"fd"
);
free_dma
(
FLOPPY_DMA
);
goto
out
;
goto
err_dma1
;
};
enable_dma
(
FIQ_FD1772
);
/* This inserts a call to our command end routine */
/* initialize variables */
SelectedDrive
=
-
1
;
...
...
@@ -1570,6 +1568,12 @@ int fd1772_init(void)
out of some special memory... */
DMABuffer
=
(
char
*
)
kmalloc
(
2048
);
/* Copes with pretty large sectors */
#endif
err
=
-
ENOMEM
;
if
(
!
DMAbuffer
)
goto
err_dma2
;
enable_dma
(
FIQ_FD1772
);
/* This inserts a call to our command end routine */
blk_init_queue
(
&
floppy_queue
,
do_fd_request
,
&
lock
);
for
(
i
=
0
;
i
<
FD_MAX_UNITS
;
i
++
)
{
unit
[
i
].
track
=
-
1
;
...
...
@@ -1590,8 +1594,18 @@ int fd1772_init(void)
config_types
();
return
0
;
out:
err_dma2:
free_dma
(
FIQ_FD1772
);
err_dma1:
free_dma
(
FLOPPY_DMA
);
err_blkdev:
unregister_blkdev
(
MAJOR_NR
,
"fd"
);
err_disk:
while
(
i
--
)
put_disk
(
disks
[
i
]);
return
1
;
return
err
;
}
drivers/ide/Kconfig
View file @
6a48e1ca
...
...
@@ -376,7 +376,7 @@ config IDEDMA_ONLYDISK
config BLK_DEV_IDEDMA
bool
depends on BLK_DEV_IDE
default BLK_DEV_IDEDMA_ICS if AR
M
default BLK_DEV_IDEDMA_ICS if AR
CH_ACORN
default BLK_DEV_IDEDMA_PMAC if ALL_PPC && BLK_DEV_IDE_PMAC
default BLK_DEV_IDEDMA_PCI if PCI && BLK_DEV_IDEPCI
...
...
drivers/video/Makefile
View file @
6a48e1ca
...
...
@@ -18,7 +18,7 @@ ifeq ($(CONFIG_FB),y)
obj-$(CONFIG_PPC)
+=
macmodes.o
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_PM2)
+=
pm2fb.o
obj-$(CONFIG_FB_PM3)
+=
pm3fb.o
...
...
@@ -77,7 +77,7 @@ obj-$(CONFIG_FB_I810) += i810/ cfbfillrect.o cfbcopyarea.o \
obj-$(CONFIG_FB_SUN3)
+=
sun3fb.o
obj-$(CONFIG_FB_HGA)
+=
hgafb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_SA1100)
+=
sa1100fb.o
obj-$(CONFIG_FB_SA1100)
+=
sa1100fb.o
cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_VIRTUAL)
+=
vfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_HIT)
+=
hitfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_E1355)
+=
epson1355fb.o
...
...
drivers/video/acornfb.c
View file @
6a48e1ca
...
...
@@ -12,6 +12,9 @@
* NOTE: Most of the modes with X!=640 will disappear shortly.
* NOTE: Startup setting of HS & VS polarity not supported.
* (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>
...
...
@@ -33,14 +36,6 @@
#include <asm/mach-types.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"
/*
...
...
@@ -58,25 +53,7 @@
*/
#define DEFAULT_XRES 640
#define DEFAULT_YRES 480
/*
* 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 DEFAULT_BPP 4
/*
* define this to debug the video mode selection
...
...
@@ -99,13 +76,10 @@ static struct fb_monspecs monspecs[NR_MONTYPES] __initdata = {
{
30000
,
70000
,
60
,
60
,
0
}
};
static
struct
display
global_disp
;
static
struct
fb_info
fb_info
;
static
struct
acornfb_par
current_par
;
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 */
#ifdef HAS_VIDC
...
...
@@ -333,34 +307,26 @@ acornfb_set_timing(struct fb_var_screeninfo *var)
#endif
}
static
inline
void
acornfb_palette_write
(
u_int
regno
,
union
palette
pal
)
{
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
)
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
;
if
(
regno
>=
current_par
.
palette_size
)
return
1
;
pal
.
p
=
0
;
pal
.
vidc
.
reg
=
regno
;
pal
.
vidc
.
red
=
red
>>
12
;
pal
.
vidc
.
green
=
green
>>
12
;
pal
.
vidc
.
blue
=
blue
>>
12
;
return
pal
;
}
static
void
acornfb_palette_decode
(
u_int
regno
,
u_int
*
red
,
u_int
*
green
,
u_int
*
blue
,
u_int
*
trans
)
{
*
red
=
EXTEND4
(
current_par
.
palette
[
regno
].
vidc
.
red
);
*
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
;
current_par
.
palette
[
regno
]
=
pal
;
vidc_writel
(
pal
.
p
);
return
0
;
}
#endif
...
...
@@ -513,34 +479,66 @@ acornfb_set_timing(struct fb_info *info, struct fb_var_screeninfo *var)
#endif
}
static
inline
void
acornfb_palette_write
(
u_int
regno
,
union
palette
pal
)
{
vidc_writel
(
0x10000000
|
regno
);
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
)
/*
* 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
=
info
->
var
.
bits_per_pixel
;
if
(
regno
>=
current_par
.
palette_size
)
return
1
;
pal
.
p
=
0
;
pal
.
vidc20
.
red
=
red
>>
8
;
pal
.
vidc20
.
green
=
green
>>
8
;
pal
.
vidc20
.
blue
=
blue
>>
8
;
return
pal
;
}
static
void
acornfb_palette_decode
(
u_int
regno
,
u_int
*
red
,
u_int
*
green
,
u_int
*
blue
,
u_int
*
trans
)
{
*
red
=
EXTEND8
(
current_par
.
palette
[
regno
].
vidc20
.
red
);
*
green
=
EXTEND8
(
current_par
.
palette
[
regno
].
vidc20
.
green
);
*
blue
=
EXTEND8
(
current_par
.
palette
[
regno
].
vidc20
.
blue
);
*
trans
=
EXTEND4
(
current_par
.
palette
[
regno
].
vidc20
.
ext
);
current_par
.
palette
[
regno
]
=
pal
;
if
(
bpp
==
32
&&
regno
<
16
)
{
current_par
.
cmap
.
cfb32
[
regno
]
=
regno
|
regno
<<
8
|
regno
<<
16
;
}
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
{
vidc_writel
(
0x10000000
|
regno
);
vidc_writel
(
pal
.
p
);
}
return
0
;
}
#endif
...
...
@@ -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.
*/
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
fontht
;
u_int
sam_size
,
min_size
,
size
;
u_int
nr_y
;
u_int
font_line_len
,
sam_size
,
min_size
,
size
,
nr_y
;
/* xres must be even */
var
->
xres
=
(
var
->
xres
+
1
)
&
~
1
;
...
...
@@ -565,17 +560,6 @@ acornfb_adjust_timing(struct fb_info *info, struct fb_var_screeninfo *var, int c
var
->
xres_virtual
=
var
->
xres
;
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
)
sam_size
=
current_par
.
vram_half_sam
*
2
;
else
...
...
@@ -693,8 +677,8 @@ acornfb_validate_timing(struct fb_var_screeninfo *var,
static
inline
void
acornfb_update_dma
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
)
{
int
off
=
(
var
->
yoffset
*
var
->
xres_virtual
*
var
->
bits_per_pixel
)
>>
3
;
u_
int
off
=
(
var
->
yoffset
*
var
->
xres_virtual
*
var
->
bits_per_pixel
)
>>
3
;
#if defined(HAS_MEMC)
memc_write
(
VDMA_INIT
,
off
>>
2
);
...
...
@@ -704,130 +688,27 @@ acornfb_update_dma(struct fb_info *info, struct fb_var_screeninfo *var)
}
static
int
acornfb_getcolreg
(
u_int
regno
,
u_int
*
red
,
u_int
*
green
,
u_int
*
blue
,
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
)
acornfb_check_var
(
struct
fb_var_screeninfo
*
var
,
struct
fb_info
*
info
)
{
u_int
fontht
;
int
err
;
#if defined(HAS_VIDC20)
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
8
;
var
->
green
=
var
->
red
;
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
/*
* FIXME: Find the font height
*/
fontht
=
8
;
switch
(
var
->
bits_per_pixel
)
{
#ifdef FBCON_HAS_MFB
case
1
:
break
;
#endif
#ifdef FBCON_HAS_CFB2
case
2
:
break
;
#endif
#ifdef FBCON_HAS_CFB4
case
4
:
break
;
#endif
#ifdef FBCON_HAS_CFB8
case
8
:
case
1
:
case
2
:
case
4
:
case
8
:
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
var
->
bits_per_pixel
;
var
->
green
=
var
->
red
;
var
->
blue
=
var
->
red
;
var
->
transp
.
offset
=
0
;
var
->
transp
.
length
=
0
;
break
;
#endif
#ifdef
FBCON_HAS_CFB16
#ifdef
HAS_VIDC20
case
16
:
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
5
;
...
...
@@ -838,8 +719,7 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
var
->
transp
.
offset
=
15
;
var
->
transp
.
length
=
1
;
break
;
#endif
#ifdef FBCON_HAS_CFB32
case
32
:
var
->
red
.
offset
=
0
;
var
->
red
.
length
=
8
;
...
...
@@ -865,7 +745,7 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
* Validate and adjust the resolution to
* match the video generator hardware.
*/
err
=
acornfb_adjust_timing
(
info
,
var
,
con
);
err
=
acornfb_adjust_timing
(
info
,
var
,
fontht
);
if
(
err
)
return
err
;
...
...
@@ -873,137 +753,61 @@ acornfb_decode_var(struct fb_info *info, struct fb_var_screeninfo *var, int con)
* Validate the timing against the
* monitor hardware.
*/
return
acornfb_validate_timing
(
var
,
&
fb_info
.
monspecs
);
return
acornfb_validate_timing
(
var
,
&
info
->
monspecs
);
}
static
int
acornfb_set_var
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
static
int
acornfb_set_par
(
struct
fb_info
*
info
)
{
struct
display
*
display
;
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
switch
(
info
->
var
.
bits_per_pixel
)
{
case
1
:
current_par
.
palette_size
=
2
;
display
->
dispsw
=
&
fbcon_mfb
;
visual
=
FB_VISUAL_MONO10
;
info
->
fix
.
visual
=
FB_VISUAL_MONO10
;
break
;
#endif
#ifdef FBCON_HAS_CFB2
case
2
:
current_par
.
palette_size
=
4
;
display
->
dispsw
=
&
fbcon_cfb2
;
visual
=
FB_VISUAL_PSEUDOCOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
break
;
#endif
#ifdef FBCON_HAS_CFB4
case
4
:
current_par
.
palette_size
=
16
;
display
->
dispsw
=
&
fbcon_cfb4
;
visual
=
FB_VISUAL_PSEUDOCOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
break
;
#endif
#ifdef FBCON_HAS_CFB8
case
8
:
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
display
->
dispsw
=
&
fbcon_cfb8
;
#ifdef HAS_VIDC
visual
=
FB_VISUAL_STATIC_PSEUDOCOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_STATIC_PSEUDOCOLOR
;
#else
visual
=
FB_VISUAL_PSEUDOCOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_PSEUDOCOLOR
;
#endif
break
;
#endif
#ifdef FBCON_HAS_CFB16
#ifdef HAS_VIDC20
case
16
:
current_par
.
palette_size
=
32
;
display
->
dispsw
=
&
fbcon_cfb16
;
display
->
dispsw_data
=
current_par
.
cmap
.
cfb16
;
visual
=
FB_VISUAL_DIRECTCOLOR
;
info
->
pseudo_palette
=
current_par
.
cmap
.
cfb16
;
info
->
fix
.
visual
=
FB_VISUAL_DIRECTCOLOR
;
break
;
#endif
#ifdef FBCON_HAS_CFB32
case
32
:
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
display
->
dispsw
=
&
fbcon_cfb32
;
display
->
dispsw_data
=
current_par
.
cmap
.
cfb32
;
visual
=
FB_VISUAL_TRUECOLOR
;
info
->
pseudo_palette
=
current_par
.
cmap
.
cfb32
;
info
->
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
break
;
#endif
default:
display
->
dispsw
=
&
fbcon_dummy
;
visual
=
FB_VISUAL_MONO10
;
break
;
BUG
();
}
display
->
next_line
=
(
var
->
xres
*
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
;
info
->
fix
.
line_length
=
(
info
->
var
.
xres
*
info
->
var
.
bits_per_pixel
)
/
8
;
#if defined(HAS_MEMC)
start
=
0
;
size
=
info
->
fix
.
smem_len
-
VDMA_XFERSIZE
;
control
=
0
;
{
unsigned
long
size
=
info
->
fix
.
smem_len
-
VDMA_XFERSIZE
;
memc_write
(
VDMA_START
,
start
);
memc_write
(
VDMA_START
,
0
);
memc_write
(
VDMA_END
,
size
>>
2
);
}
#elif defined(HAS_IOMD)
{
unsigned
long
start
,
size
;
u_int
control
;
start
=
info
->
fix
.
smem_start
;
size
=
current_par
.
screen_end
;
...
...
@@ -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
(
size
,
IOMD_VIDEND
);
iomd_writel
(
control
,
IOMD_VIDCR
);
}
#endif
acornfb_update_dma
(
info
,
var
);
acornfb_set_timing
(
info
,
var
);
if
(
display
->
cmap
.
len
)
cmap
=
&
display
->
cmap
;
else
cmap
=
fb_default_cmap
(
current_par
.
palette_size
);
acornfb_update_dma
(
info
,
&
info
->
var
);
acornfb_set_timing
(
info
,
&
info
->
var
);
fb_set_cmap
(
cmap
,
1
,
info
);
}
return
0
;
}
static
int
acornfb_pan_display
(
struct
fb_var_screeninfo
*
var
,
int
con
,
struct
fb_info
*
info
)
acornfb_pan_display
(
struct
fb_var_screeninfo
*
var
,
struct
fb_info
*
info
)
{
u_int
y_bottom
;
if
(
var
->
xoffset
)
return
-
EINVAL
;
y_bottom
=
var
->
yoffset
;
u_int
y_bottom
=
var
->
yoffset
;
if
(
!
(
var
->
vmode
&
FB_VMODE_YWRAP
))
y_bottom
+=
var
->
yres
;
if
(
y_bottom
>
fb_display
[
con
].
var
.
yres_virtual
)
return
-
EINVAL
;
BUG_ON
(
y_bottom
>
var
->
yres_virtual
);
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
;
}
...
...
@@ -1137,45 +888,16 @@ acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma
static
struct
fb_ops
acornfb_ops
=
{
.
owner
=
THIS_MODULE
,
.
fb_set_var
=
acornfb_set_var
,
.
fb_get_cmap
=
acornfb_get_cmap
,
.
fb_set_cmap
=
gen_set_cmap
,
.
fb_check_var
=
acornfb_check_var
,
.
fb_set_par
=
acornfb_set_par
,
.
fb_setcolreg
=
acornfb_setcolreg
,
.
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
,
};
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!!!
*/
...
...
@@ -1248,8 +970,7 @@ acornfb_default_mode = {
.
vmode
=
FB_VMODE_NONINTERLACED
};
static
void
__init
acornfb_init_fbinfo
(
void
)
static
void
__init
acornfb_init_fbinfo
(
void
)
{
static
int
first
=
1
;
...
...
@@ -1257,15 +978,8 @@ acornfb_init_fbinfo(void)
return
;
first
=
0
;
strcpy
(
fb_info
.
modename
,
"Acorn"
);
strcpy
(
fb_info
.
fontname
,
"Acorn8x8"
);
fb_info
.
node
=
NODEV
;
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
;
strcpy
(
fb_info
.
fix
.
id
,
"Acorn"
);
...
...
@@ -1277,28 +991,26 @@ acornfb_init_fbinfo(void)
fb_info
.
fix
.
line_length
=
0
;
fb_info
.
fix
.
accel
=
FB_ACCEL_NONE
;
global_disp
.
dispsw
=
&
fbcon_dummy
;
/*
* setup initial parameters
*/
memset
(
&
init_var
,
0
,
sizeof
(
init_
var
));
memset
(
&
fb_info
.
var
,
0
,
sizeof
(
fb_info
.
var
));
#if defined(HAS_VIDC20)
init_
var
.
red
.
length
=
8
;
init_var
.
transp
.
length
=
4
;
fb_info
.
var
.
red
.
length
=
8
;
fb_info
.
var
.
transp
.
length
=
4
;
#elif defined(HAS_VIDC)
init_
var
.
red
.
length
=
4
;
init_var
.
transp
.
length
=
1
;
fb_info
.
var
.
red
.
length
=
4
;
fb_info
.
var
.
transp
.
length
=
1
;
#endif
init_var
.
green
=
init_
var
.
red
;
init_var
.
blue
=
init_
var
.
red
;
init_var
.
nonstd
=
0
;
init_
var
.
activate
=
FB_ACTIVATE_NOW
;
init_var
.
height
=
-
1
;
init_var
.
width
=
-
1
;
init_var
.
vmode
=
FB_VMODE_NONINTERLACED
;
init_
var
.
accel_flags
=
FB_ACCELF_TEXT
;
fb_info
.
var
.
green
=
fb_info
.
var
.
red
;
fb_info
.
var
.
blue
=
fb_info
.
var
.
red
;
fb_info
.
var
.
nonstd
=
0
;
fb_info
.
var
.
activate
=
FB_ACTIVATE_NOW
;
fb_info
.
var
.
height
=
-
1
;
fb_info
.
var
.
width
=
-
1
;
fb_info
.
var
.
vmode
=
FB_VMODE_NONINTERLACED
;
fb_info
.
var
.
accel_flags
=
FB_ACCELF_TEXT
;
current_par
.
dram_size
=
0
;
current_par
.
montype
=
-
1
;
...
...
@@ -1308,9 +1020,6 @@ acornfb_init_fbinfo(void)
/*
* setup acornfb options:
*
* font:fontname
* Set fontname
*
* mon:hmin-hmax:vmin-vmax:dpms:width:height
* Set monitor parameters:
* hmin = horizontal minimum frequency (Hz)
...
...
@@ -1337,12 +1046,6 @@ acornfb_init_fbinfo(void)
* size can optionally be followed by 'M' or 'K' for
* MB or KB respectively.
*/
static
void
__init
acornfb_parse_font
(
char
*
opt
)
{
strcpy
(
fb_info
.
fontname
,
opt
);
}
static
void
__init
acornfb_parse_mon
(
char
*
opt
)
{
...
...
@@ -1373,12 +1076,12 @@ acornfb_parse_mon(char *opt)
if
(
*
p
!=
':'
)
goto
check_values
;
init_
var
.
width
=
simple_strtoul
(
p
+
1
,
&
p
,
0
);
fb_info
.
var
.
width
=
simple_strtoul
(
p
+
1
,
&
p
,
0
);
if
(
*
p
!=
':'
)
goto
check_values
;
init_
var
.
height
=
simple_strtoul
(
p
+
1
,
NULL
,
0
);
fb_info
.
var
.
height
=
simple_strtoul
(
p
+
1
,
NULL
,
0
);
check_values:
if
(
fb_info
.
monspecs
.
hfmax
<
fb_info
.
monspecs
.
hfmin
||
...
...
@@ -1460,7 +1163,6 @@ static struct options {
char
*
name
;
void
(
*
parse
)(
char
*
opt
);
}
opt_table
[]
__initdata
=
{
{
"font"
,
acornfb_parse_font
},
{
"mon"
,
acornfb_parse_mon
},
{
"montype"
,
acornfb_parse_montype
},
{
"dram"
,
acornfb_parse_dram
},
...
...
@@ -1658,7 +1360,7 @@ acornfb_init(void)
* the resolution, so we disable this feature.
*/
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
),
&
acornfb_default_mode
,
DEFAULT_BPP
);
/*
...
...
@@ -1667,7 +1369,7 @@ acornfb_init(void)
if
(
rc
==
1
)
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
);
/*
* If we found an exact match, all ok.
...
...
@@ -1675,13 +1377,13 @@ acornfb_init(void)
if
(
rc
==
1
)
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
),
&
acornfb_default_mode
,
DEFAULT_BPP
);
if
(
rc
)
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
);
}
while
(
0
);
...
...
@@ -1694,17 +1396,17 @@ acornfb_init(void)
return
-
EINVAL
;
}
h_sync
=
1953125000
/
init_
var
.
pixclock
;
h_sync
=
h_sync
*
512
/
(
init_var
.
xres
+
init_
var
.
left_margin
+
init_var
.
right_margin
+
init_
var
.
hsync_len
);
v_sync
=
h_sync
/
(
init_var
.
yres
+
init_
var
.
upper_margin
+
init_var
.
lower_margin
+
init_
var
.
vsync_len
);
h_sync
=
1953125000
/
fb_info
.
var
.
pixclock
;
h_sync
=
h_sync
*
512
/
(
fb_info
.
var
.
xres
+
fb_info
.
var
.
left_margin
+
fb_info
.
var
.
right_margin
+
fb_info
.
var
.
hsync_len
);
v_sync
=
h_sync
/
(
fb_info
.
var
.
yres
+
fb_info
.
var
.
upper_margin
+
fb_info
.
var
.
lower_margin
+
fb_info
.
var
.
vsync_len
);
printk
(
KERN_INFO
"Acornfb: %dkB %cRAM, %s, using %dx%d, "
"%d.%03dkHz, %dHz
\n
"
,
fb_info
.
fix
.
smem_len
/
1024
,
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
);
printk
(
KERN_INFO
"Acornfb: Monitor: %d.%03d-%d.%03dkHz, %d-%dHz%s
\n
"
,
...
...
@@ -1713,7 +1415,7 @@ acornfb_init(void)
fb_info
.
monspecs
.
vfmin
,
fb_info
.
monspecs
.
vfmax
,
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
"
);
if
(
register_framebuffer
(
&
fb_info
)
<
0
)
...
...
drivers/video/sa1100fb.h
View file @
6a48e1ca
...
...
@@ -103,9 +103,6 @@ struct sa1100fb_info {
wait_queue_head_t
ctrlr_wait
;
struct
work_struct
task
;
#ifdef CONFIG_PM
struct
pm_dev
*
pm
;
#endif
#ifdef CONFIG_CPU_FREQ
struct
notifier_block
freq_transition
;
struct
notifier_block
freq_policy
;
...
...
@@ -128,6 +125,7 @@ struct sa1100fb_info {
#define C_REENABLE (4)
#define C_DISABLE_PM (5)
#define C_ENABLE_PM (6)
#define C_STARTUP (7)
#define SA1100_NAME "SA1100"
...
...
include/asm-arm/arch-integrator/memory.h
View file @
6a48e1ca
...
...
@@ -46,6 +46,8 @@
#define __phys_to_virt__is_a_macro
#define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET)
#define BUS_OFFSET (0x80000000UL)
/*
* Virtual view <-> DMA view memory address translations
* virt_to_bus: Used to translate the virtual address to an
...
...
@@ -54,8 +56,8 @@
* to an address that the kernel can use.
*/
#define __virt_to_bus__is_a_macro
#define __virt_to_bus(x) (x - PAGE_OFFSET +
INTEGRATOR_HDR0_SDRAM_BASE
)
#define __virt_to_bus(x) (x - PAGE_OFFSET +
BUS_OFFSET
)
#define __bus_to_virt__is_a_macro
#define __bus_to_virt(x) (x -
INTEGRATOR_HDR0_SDRAM_BASE
+ PAGE_OFFSET)
#define __bus_to_virt(x) (x -
BUS_OFFSET
+ PAGE_OFFSET)
#endif
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