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
Kirill Smelkov
linux
Commits
84557b40
Commit
84557b40
authored
Feb 22, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-rmk
into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents
22a4bcc2
bcc3181b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
255 additions
and
103 deletions
+255
-103
arch/arm/Kconfig
arch/arm/Kconfig
+1
-1
arch/arm/common/sa1111.c
arch/arm/common/sa1111.c
+59
-0
arch/arm/mm/abort-lv4t.S
arch/arm/mm/abort-lv4t.S
+1
-1
drivers/pcmcia/sa1100_neponset.c
drivers/pcmcia/sa1100_neponset.c
+26
-27
drivers/pcmcia/sa1111_generic.c
drivers/pcmcia/sa1111_generic.c
+1
-1
drivers/pcmcia/sa1111_generic.h
drivers/pcmcia/sa1111_generic.h
+1
-1
drivers/pcmcia/sa11xx_core.c
drivers/pcmcia/sa11xx_core.c
+28
-21
drivers/pcmcia/sa11xx_core.h
drivers/pcmcia/sa11xx_core.h
+1
-0
drivers/video/acornfb.c
drivers/video/acornfb.c
+38
-31
drivers/video/acornfb.h
drivers/video/acornfb.h
+1
-4
include/asm-arm/arch-cl7500/acornfb.h
include/asm-arm/arch-cl7500/acornfb.h
+1
-1
include/asm-arm/arch-rpc/acornfb.h
include/asm-arm/arch-rpc/acornfb.h
+52
-15
include/asm-arm/hardware/sa1111.h
include/asm-arm/hardware/sa1111.h
+45
-0
No files found.
arch/arm/Kconfig
View file @
84557b40
...
...
@@ -615,7 +615,7 @@ source "drivers/char/Kconfig"
source "drivers/i2c/Kconfig"
source "drivers/l3/Kconfig"
#
source "drivers/l3/Kconfig"
source "drivers/media/Kconfig"
...
...
arch/arm/common/sa1111.c
View file @
84557b40
...
...
@@ -1100,6 +1100,62 @@ int sa1111_get_audio_rate(struct sa1111_dev *sadev)
return
__sa1111_pll_clock
(
sachip
)
/
(
256
*
div
);
}
void
sa1111_set_io_dir
(
struct
sa1111_dev
*
sadev
,
unsigned
int
bits
,
unsigned
int
dir
,
unsigned
int
sleep_dir
)
{
struct
sa1111
*
sachip
=
sa1111_chip_driver
(
sadev
);
unsigned
long
flags
;
unsigned
int
val
;
void
*
gpio
=
sachip
->
base
+
SA1111_GPIO
;
#define MODIFY_BITS(port, mask, dir) \
if (mask) { \
val = sa1111_readl(port); \
val &= ~(mask); \
val |= (dir) & (mask); \
sa1111_writel(val, port); \
}
spin_lock_irqsave
(
&
sachip
->
lock
,
flags
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PADDR
,
bits
&
15
,
dir
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PBDDR
,
(
bits
>>
8
)
&
255
,
dir
>>
8
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PCDDR
,
(
bits
>>
16
)
&
255
,
dir
>>
16
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PASDR
,
bits
&
15
,
sleep_dir
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PBSDR
,
(
bits
>>
8
)
&
255
,
sleep_dir
>>
8
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PCSDR
,
(
bits
>>
16
)
&
255
,
sleep_dir
>>
16
);
spin_unlock_irqrestore
(
&
sachip
->
lock
,
flags
);
}
void
sa1111_set_io
(
struct
sa1111_dev
*
sadev
,
unsigned
int
bits
,
unsigned
int
v
)
{
struct
sa1111
*
sachip
=
sa1111_chip_driver
(
sadev
);
unsigned
long
flags
;
unsigned
int
val
;
void
*
gpio
=
sachip
->
base
+
SA1111_GPIO
;
spin_lock_irqsave
(
&
sachip
->
lock
,
flags
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PADWR
,
bits
&
15
,
v
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PBDWR
,
(
bits
>>
8
)
&
255
,
v
>>
8
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PCDWR
,
(
bits
>>
16
)
&
255
,
v
>>
16
);
spin_unlock_irqrestore
(
&
sachip
->
lock
,
flags
);
}
void
sa1111_set_sleep_io
(
struct
sa1111_dev
*
sadev
,
unsigned
int
bits
,
unsigned
int
v
)
{
struct
sa1111
*
sachip
=
sa1111_chip_driver
(
sadev
);
unsigned
long
flags
;
unsigned
int
val
;
void
*
gpio
=
sachip
->
base
+
SA1111_GPIO
;
spin_lock_irqsave
(
&
sachip
->
lock
,
flags
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PASSR
,
bits
&
15
,
v
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PBSSR
,
(
bits
>>
8
)
&
255
,
v
>>
8
);
MODIFY_BITS
(
gpio
+
SA1111_GPIO_PCSSR
,
(
bits
>>
16
)
&
255
,
v
>>
16
);
spin_unlock_irqrestore
(
&
sachip
->
lock
,
flags
);
}
/*
* Individual device operations.
*/
...
...
@@ -1238,6 +1294,9 @@ EXPORT_SYMBOL(sa1111_check_dma_bug);
EXPORT_SYMBOL
(
sa1111_select_audio_mode
);
EXPORT_SYMBOL
(
sa1111_set_audio_rate
);
EXPORT_SYMBOL
(
sa1111_get_audio_rate
);
EXPORT_SYMBOL
(
sa1111_set_io_dir
);
EXPORT_SYMBOL
(
sa1111_set_io
);
EXPORT_SYMBOL
(
sa1111_set_sleep_io
);
EXPORT_SYMBOL
(
sa1111_enable_device
);
EXPORT_SYMBOL
(
sa1111_disable_device
);
EXPORT_SYMBOL
(
sa1111_pll_clock
);
...
...
arch/arm/mm/abort-lv4t.S
View file @
84557b40
...
...
@@ -220,6 +220,6 @@ ENTRY(v4t_late_abort)
and
r6
,
r6
,
#
15
@
number
of
regs
to
transfer
and
r5
,
r8
,
#
7
<<
8
ldr
r7
,
[
sp
,
r5
,
lsr
#
6
]
sub
r7
,
r7
,
r6
,
ls
r
#
2
@
always
decrement
sub
r7
,
r7
,
r6
,
ls
l
#
2
@
always
decrement
str
r7
,
[
sp
,
r5
,
lsr
#
6
]
mov
pc
,
lr
drivers/pcmcia/sa1100_neponset.c
View file @
84557b40
...
...
@@ -49,7 +49,7 @@ neponset_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt, const socket_
switch
(
skt
->
nr
)
{
case
0
:
pa_dwr_mask
=
GPIO_
GPIO0
|
GPIO_GPIO
1
;
pa_dwr_mask
=
GPIO_
A0
|
GPIO_A
1
;
ncr_mask
=
NCR_A0VPP
|
NCR_A1VPP
;
if
(
state
->
Vpp
==
0
)
...
...
@@ -66,7 +66,7 @@ neponset_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt, const socket_
break
;
case
1
:
pa_dwr_mask
=
GPIO_
GPIO2
|
GPIO_GPIO
3
;
pa_dwr_mask
=
GPIO_
A2
|
GPIO_A
3
;
ncr_mask
=
0
;
ncr_set
=
0
;
...
...
@@ -87,9 +87,9 @@ neponset_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt, const socket_
*/
switch
(
state
->
Vcc
)
{
default:
case
0
:
pa_dwr_set
=
0
;
break
;
case
33
:
pa_dwr_set
=
GPIO_
GPIO1
|
GPIO_GPIO
2
;
break
;
case
50
:
pa_dwr_set
=
GPIO_
GPIO0
|
GPIO_GPIO
3
;
break
;
case
0
:
pa_dwr_set
=
0
;
break
;
case
33
:
pa_dwr_set
=
GPIO_
A1
|
GPIO_A
2
;
break
;
case
50
:
pa_dwr_set
=
GPIO_
A0
|
GPIO_A
3
;
break
;
}
ret
=
sa1111_pcmcia_configure_socket
(
skt
,
state
);
...
...
@@ -99,8 +99,8 @@ neponset_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt, const socket_
local_irq_save
(
flags
);
NCR_0
=
(
NCR_0
&
~
ncr_mask
)
|
ncr_set
;
PA_DWR
=
(
PA_DWR
&
~
pa_dwr_mask
)
|
(
pa_dwr_set
&
pa_dwr_mask
);
local_irq_restore
(
flags
);
sa1111_set_io
(
SA1111_DEV
(
skt
->
dev
),
pa_dwr_mask
,
pa_dwr_set
);
}
return
0
;
...
...
@@ -111,33 +111,32 @@ static void neponset_pcmcia_socket_init(struct sa1100_pcmcia_socket *skt)
if
(
skt
->
nr
==
0
)
NCR_0
&=
~
(
NCR_A0VPP
|
NCR_A1VPP
);
sa1111_pcmcia_socket_init
(
skt
);
sa1111_pcmcia_socket_init
(
skt
);
}
static
struct
pcmcia_low_level
neponset_pcmcia_ops
=
{
.
owner
=
THIS_MODULE
,
.
hw_init
=
sa1111_pcmcia_hw_init
,
.
hw_shutdown
=
sa1111_pcmcia_hw_shutdown
,
.
socket_state
=
sa1111_pcmcia_socket_state
,
.
configure_socket
=
neponset_pcmcia_configure_socket
,
.
socket_init
=
neponset_pcmcia_socket_init
,
.
socket_suspend
=
sa1111_pcmcia_socket_suspend
,
.
owner
=
THIS_MODULE
,
.
hw_init
=
sa1111_pcmcia_hw_init
,
.
hw_shutdown
=
sa1111_pcmcia_hw_shutdown
,
.
socket_state
=
sa1111_pcmcia_socket_state
,
.
configure_socket
=
neponset_pcmcia_configure_socket
,
.
socket_init
=
neponset_pcmcia_socket_init
,
.
socket_suspend
=
sa1111_pcmcia_socket_suspend
,
};
int
__init
pcmcia_neponset_init
(
struct
device
*
dev
)
int
__init
pcmcia_neponset_init
(
struct
sa1111_dev
*
sa
dev
)
{
int
ret
=
-
ENODEV
;
if
(
machine_is_assabet
())
{
/*
* Set GPIO_A<3:0> to be outputs for the MAX1600,
* and switch to standby mode.
*/
PA_DDR
=
0
;
PA_DWR
=
0
;
PA_SDR
=
0
;
PA_SSR
=
0
;
ret
=
sa11xx_drv_pcmcia_probe
(
dev
,
&
neponset_pcmcia_ops
,
0
,
2
);
int
ret
=
-
ENODEV
;
if
(
machine_is_assabet
())
{
/*
* Set GPIO_A<3:0> to be outputs for the MAX1600,
* and switch to standby mode.
*/
sa1111_set_io_dir
(
sadev
,
GPIO_A0
|
GPIO_A1
|
GPIO_A2
|
GPIO_A3
,
0
,
0
);
sa1111_set_io
(
sadev
,
GPIO_A0
|
GPIO_A1
|
GPIO_A2
|
GPIO_A3
,
0
);
sa1111_set_sleep_io
(
sadev
,
GPIO_A0
|
GPIO_A1
|
GPIO_A2
|
GPIO_A3
,
0
);
ret
=
sa11xx_drv_pcmcia_probe
(
&
sadev
->
dev
,
&
neponset_pcmcia_ops
,
0
,
2
);
}
return
ret
;
...
...
drivers/pcmcia/sa1111_generic.c
View file @
84557b40
...
...
@@ -149,7 +149,7 @@ static int pcmcia_probe(struct sa1111_dev *dev)
pcmcia_jornada720_init
(
&
dev
->
dev
);
#endif
#ifdef CONFIG_ASSABET_NEPONSET
pcmcia_neponset_init
(
&
dev
->
dev
);
pcmcia_neponset_init
(
dev
);
#endif
#ifdef CONFIG_SA1100_PFS168
pcmcia_pfs_init
(
&
dev
->
dev
);
...
...
drivers/pcmcia/sa1111_generic.h
View file @
84557b40
...
...
@@ -9,5 +9,5 @@ extern void sa1111_pcmcia_socket_suspend(struct sa1100_pcmcia_socket *);
extern
int
pcmcia_badge4_init
(
struct
device
*
);
extern
int
pcmcia_jornada720_init
(
struct
device
*
);
extern
int
pcmcia_neponset_init
(
struct
device
*
);
extern
int
pcmcia_neponset_init
(
struct
sa1111_dev
*
);
drivers/pcmcia/sa11xx_core.c
View file @
84557b40
...
...
@@ -58,14 +58,6 @@
static
int
pc_debug
;
#endif
/* This structure maintains housekeeping state for each socket, such
* as the last known values of the card detect pins, or the Card Services
* callback value associated with the socket:
*/
static
struct
sa1100_pcmcia_socket
sa1100_pcmcia_socket
[
SA1100_PCMCIA_MAX_SOCK
];
#define PCMCIA_SOCKET(x) (sa1100_pcmcia_socket + (x))
#define to_sa1100_socket(x) container_of(x, struct sa1100_pcmcia_socket, socket)
/*
...
...
@@ -682,6 +674,9 @@ void sa11xx_enable_irqs(struct sa1100_pcmcia_socket *skt, struct pcmcia_irqs *ir
}
EXPORT_SYMBOL
(
sa11xx_enable_irqs
);
static
LIST_HEAD
(
sa1100_sockets
);
static
DECLARE_MUTEX
(
sa1100_sockets_lock
);
static
const
char
*
skt_names
[]
=
{
"PCMCIA socket 0"
,
"PCMCIA socket 1"
,
...
...
@@ -689,8 +684,12 @@ static const char *skt_names[] = {
struct
skt_dev_info
{
int
nskt
;
struct
sa1100_pcmcia_socket
skt
[
0
];
};
#define SKT_DEV_INFO_SIZE(n) \
(sizeof(struct skt_dev_info) + (n)*sizeof(struct sa1100_pcmcia_socket))
int
sa11xx_drv_pcmcia_probe
(
struct
device
*
dev
,
struct
pcmcia_low_level
*
ops
,
int
first
,
int
nr
)
{
struct
skt_dev_info
*
sinfo
;
...
...
@@ -704,13 +703,15 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
if
(
!
ops
->
socket_get_timing
)
ops
->
socket_get_timing
=
sa1100_pcmcia_default_mecr_timing
;
sinfo
=
kmalloc
(
sizeof
(
struct
skt_dev_info
),
GFP_KERNEL
);
down
(
&
sa1100_sockets_lock
);
sinfo
=
kmalloc
(
SKT_DEV_INFO_SIZE
(
nr
),
GFP_KERNEL
);
if
(
!
sinfo
)
{
ret
=
-
ENOMEM
;
goto
out
;
}
memset
(
sinfo
,
0
,
sizeof
(
struct
skt_dev_info
));
memset
(
sinfo
,
0
,
SKT_DEV_INFO_SIZE
(
nr
));
sinfo
->
nskt
=
nr
;
cpu_clock
=
cpufreq_get
(
0
);
...
...
@@ -719,8 +720,7 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
* Initialise the per-socket structure.
*/
for
(
i
=
0
;
i
<
nr
;
i
++
)
{
struct
sa1100_pcmcia_socket
*
skt
=
PCMCIA_SOCKET
(
i
);
memset
(
skt
,
0
,
sizeof
(
*
skt
));
struct
sa1100_pcmcia_socket
*
skt
=
&
sinfo
->
skt
[
i
];
skt
->
socket
.
ops
=
&
sa11xx_pcmcia_operations
;
skt
->
socket
.
owner
=
ops
->
owner
;
...
...
@@ -778,6 +778,8 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
goto
out_err_5
;
}
list_add
(
&
skt
->
node
,
&
sa1100_sockets
);
/*
* We initialize the MECR to default values here, because
* we are not guaranteed to see a SetIOMap operation at
...
...
@@ -809,10 +811,11 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
}
dev_set_drvdata
(
dev
,
sinfo
);
return
0
;
ret
=
0
;
goto
out
;
do
{
struct
sa1100_pcmcia_socket
*
skt
=
PCMCIA_SOCKET
(
i
)
;
struct
sa1100_pcmcia_socket
*
skt
=
&
sinfo
->
skt
[
i
]
;
del_timer_sync
(
&
skt
->
poll_timer
);
pcmcia_unregister_socket
(
&
skt
->
socket
);
...
...
@@ -822,6 +825,7 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
ops
->
hw_shutdown
(
skt
);
out_err_6:
list_del
(
&
skt
->
node
);
iounmap
(
skt
->
virt_io
);
out_err_5:
release_resource
(
&
skt
->
res_attr
);
...
...
@@ -838,6 +842,7 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
kfree
(
sinfo
);
out:
up
(
&
sa1100_sockets_lock
);
return
ret
;
}
EXPORT_SYMBOL
(
sa11xx_drv_pcmcia_probe
);
...
...
@@ -849,8 +854,9 @@ int sa11xx_drv_pcmcia_remove(struct device *dev)
dev_set_drvdata
(
dev
,
NULL
);
down
(
&
sa1100_sockets_lock
);
for
(
i
=
0
;
i
<
sinfo
->
nskt
;
i
++
)
{
struct
sa1100_pcmcia_socket
*
skt
=
PCMCIA_SOCKET
(
i
)
;
struct
sa1100_pcmcia_socket
*
skt
=
&
sinfo
->
skt
[
i
]
;
del_timer_sync
(
&
skt
->
poll_timer
);
...
...
@@ -862,6 +868,7 @@ int sa11xx_drv_pcmcia_remove(struct device *dev)
sa1100_pcmcia_config_skt
(
skt
,
&
dead_socket
);
list_del
(
&
skt
->
node
);
iounmap
(
skt
->
virt_io
);
skt
->
virt_io
=
NULL
;
release_resource
(
&
skt
->
res_attr
);
...
...
@@ -869,6 +876,7 @@ int sa11xx_drv_pcmcia_remove(struct device *dev)
release_resource
(
&
skt
->
res_io
);
release_resource
(
&
skt
->
res_skt
);
}
up
(
&
sa1100_sockets_lock
);
kfree
(
sinfo
);
...
...
@@ -886,13 +894,12 @@ EXPORT_SYMBOL(sa11xx_drv_pcmcia_remove);
*/
static
void
sa1100_pcmcia_update_mecr
(
unsigned
int
clock
)
{
unsigned
int
sock
;
struct
sa1100_pcmcia_socket
*
skt
;
for
(
sock
=
0
;
sock
<
SA1100_PCMCIA_MAX_SOCK
;
++
sock
)
{
struct
sa1100_pcmcia_socket
*
skt
=
PCMCIA_SOCKET
(
sock
);
if
(
skt
->
ops
)
sa1100_pcmcia_set_mecr
(
skt
,
clock
);
}
down
(
&
sa1100_sockets_lock
);
list_for_each_entry
(
skt
,
&
sa1100_sockets
,
node
)
sa1100_pcmcia_set_mecr
(
skt
,
clock
);
up
(
&
sa1100_sockets_lock
);
}
/* sa1100_pcmcia_notifier()
...
...
drivers/pcmcia/sa11xx_core.h
View file @
84557b40
...
...
@@ -73,6 +73,7 @@ struct sa1100_pcmcia_socket {
unsigned
int
irq_state
;
struct
timer_list
poll_timer
;
struct
list_head
node
;
};
struct
pcmcia_low_level
{
...
...
drivers/video/acornfb.c
View file @
84557b40
...
...
@@ -68,12 +68,12 @@
*/
#define NR_MONTYPES 6
static
struct
fb_monspecs
monspecs
[
NR_MONTYPES
]
__initdata
=
{
{
15469
,
15781
,
49
,
51
,
0
},
/* TV */
{
0
,
99999
,
0
,
99
,
0
},
/* Multi Freq */
{
58608
,
58608
,
64
,
64
,
0
},
/* Hi-res mono */
{
30000
,
70000
,
60
,
60
,
0
},
/* VGA */
{
30000
,
70000
,
56
,
75
,
0
},
/* SVGA */
{
30000
,
70000
,
60
,
60
,
0
}
{
15469
,
15781
,
49
,
51
,
0
},
/* TV */
{
0
,
99999
,
0
,
1
99
,
0
},
/* Multi Freq */
{
58608
,
58608
,
64
,
64
,
0
},
/* Hi-res mono */
{
30000
,
70000
,
60
,
60
,
0
},
/* VGA */
{
30000
,
70000
,
56
,
75
,
0
},
/* SVGA */
{
30000
,
70000
,
60
,
60
,
0
}
};
static
struct
fb_info
fb_info
;
...
...
@@ -127,10 +127,14 @@ static struct pixclock a5k_clocks[] = {
#endif
static
struct
pixclock
*
acornfb_valid_pixrate
(
u_long
pixclock
)
acornfb_valid_pixrate
(
struct
fb_var_screeninfo
*
var
)
{
u_long
pixclock
=
var
->
pixclock
;
u_int
i
;
if
(
!
var
->
pixclock
)
return
NULL
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
arc_clocks
);
i
++
)
if
(
pixclock
>
arc_clocks
[
i
].
min_clock
&&
pixclock
<
arc_clocks
[
i
].
max_clock
)
...
...
@@ -173,7 +177,7 @@ acornfb_set_timing(struct fb_var_screeninfo *var)
memset
(
&
vidc
,
0
,
sizeof
(
vidc
));
pclk
=
acornfb_valid_pixrate
(
var
->
pixclock
);
pclk
=
acornfb_valid_pixrate
(
var
);
vidc_ctl
=
pclk
->
vidc_ctl
;
vid_ctl
=
pclk
->
vid_ctl
;
...
...
@@ -345,9 +349,9 @@ acornfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
* vdsr : >= 1
* vder : >= vdsr
*/
static
void
acornfb_set_timing
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
)
static
void
acornfb_set_timing
(
struct
fb_info
*
info
)
{
struct
fb_var_screeninfo
*
var
=
&
info
->
var
;
struct
vidc_timing
vidc
;
u_int
vcr
,
fsize
;
u_int
ext_ctl
,
dat_ctl
;
...
...
@@ -448,9 +452,9 @@ acornfb_set_timing(struct fb_info *info, struct fb_var_screeninfo *var)
* 1MB VRAM 32bit
* 2MB VRAM 64bit
*/
if
(
current_par
.
using_vram
&&
current_par
.
vram_half_sam
==
2048
)
{
if
(
current_par
.
using_vram
&&
current_par
.
vram_half_sam
==
2048
)
dat_ctl
|=
VIDC20_DCTL_BUS_D63_0
;
}
else
else
dat_ctl
|=
VIDC20_DCTL_BUS_D31_0
;
vidc_writel
(
VIDC20_DCTL
|
dat_ctl
);
...
...
@@ -502,11 +506,20 @@ 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
;
if
(
regno
<
16
&&
info
->
fix
.
visual
==
FB_VISUAL_DIRECTCOLOR
)
{
u32
pseudo_val
;
pseudo_val
=
regno
<<
info
->
var
.
red
.
offset
;
pseudo_val
|=
regno
<<
info
->
var
.
green
.
offset
;
pseudo_val
|=
regno
<<
info
->
var
.
blue
.
offset
;
((
u32
*
)
info
->
pseudo_palette
)[
regno
]
=
pseudo_val
;
}
pal
.
p
=
0
;
pal
.
vidc20
.
red
=
red
>>
8
;
pal
.
vidc20
.
green
=
green
>>
8
;
...
...
@@ -514,16 +527,9 @@ acornfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
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
)
{
if
(
info
->
var
.
bits_per_pixel
==
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
)
{
...
...
@@ -677,8 +683,7 @@ acornfb_validate_timing(struct fb_var_screeninfo *var,
static
inline
void
acornfb_update_dma
(
struct
fb_info
*
info
,
struct
fb_var_screeninfo
*
var
)
{
u_int
off
=
(
var
->
yoffset
*
var
->
xres_virtual
*
var
->
bits_per_pixel
)
>>
3
;
u_int
off
=
var
->
yoffset
*
info
->
fix
.
line_length
;
#if defined(HAS_MEMC)
memc_write
(
VDMA_INIT
,
off
>>
2
);
...
...
@@ -698,6 +703,11 @@ acornfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
*/
fontht
=
8
;
var
->
red
.
msb_right
=
0
;
var
->
green
.
msb_right
=
0
;
var
->
blue
.
msb_right
=
0
;
var
->
transp
.
msb_right
=
0
;
switch
(
var
->
bits_per_pixel
)
{
case
1
:
case
2
:
case
4
:
case
8
:
var
->
red
.
offset
=
0
;
...
...
@@ -738,7 +748,7 @@ acornfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
/*
* Check to see if the pixel rate is valid.
*/
if
(
!
var
->
pixclock
||
!
acornfb_valid_pixrate
(
var
->
pixclock
))
if
(
!
acornfb_valid_pixrate
(
var
))
return
-
EINVAL
;
/*
...
...
@@ -782,13 +792,11 @@ static int acornfb_set_par(struct fb_info *info)
#ifdef HAS_VIDC20
case
16
:
current_par
.
palette_size
=
32
;
info
->
pseudo_palette
=
current_par
.
cmap
.
cfb16
;
info
->
fix
.
visual
=
FB_VISUAL_DIRECTCOLOR
;
break
;
case
32
:
current_par
.
palette_size
=
VIDC_PALETTE_SIZE
;
info
->
pseudo_palette
=
current_par
.
cmap
.
cfb32
;
info
->
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
info
->
fix
.
visual
=
FB_VISUAL_DIRECTCOLOR
;
break
;
#endif
default:
...
...
@@ -827,7 +835,7 @@ static int acornfb_set_par(struct fb_info *info)
#endif
acornfb_update_dma
(
info
,
&
info
->
var
);
acornfb_set_timing
(
info
,
&
info
->
var
);
acornfb_set_timing
(
info
);
return
0
;
}
...
...
@@ -869,9 +877,7 @@ acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma
/* This is an IO map - tell maydump to skip this VMA */
vma
->
vm_flags
|=
VM_IO
;
#ifdef CONFIG_CPU_32
pgprot_val
(
vma
->
vm_page_prot
)
&=
~
L_PTE_CACHEABLE
;
#endif
vma
->
vm_page_prot
=
pgprot_writecombine
(
vma
->
vm_page_prot
);
/*
* Don't alter the page protection flags; we want to keep the area
...
...
@@ -981,6 +987,7 @@ static void __init acornfb_init_fbinfo(void)
fb_info
.
fbops
=
&
acornfb_ops
;
fb_info
.
flags
=
FBINFO_FLAG_DEFAULT
;
fb_info
.
pseudo_palette
=
current_par
.
pseudo_palette
;
strcpy
(
fb_info
.
fix
.
id
,
"Acorn"
);
fb_info
.
fix
.
type
=
FB_TYPE_PACKED_PIXELS
;
...
...
drivers/video/acornfb.h
View file @
84557b40
...
...
@@ -57,10 +57,7 @@ struct acornfb_par {
union
palette
palette
[
VIDC_PALETTE_SIZE
];
union
{
unsigned
short
cfb16
[
16
];
unsigned
long
cfb32
[
16
];
}
cmap
;
u32
pseudo_palette
[
16
];
};
struct
vidc_timing
{
...
...
include/asm-arm/arch-cl7500/acornfb.h
View file @
84557b40
#include <linux/config.h>
#define acornfb_valid_pixrate(
rate) (rate >= 39325 && rate
<= 40119)
#define acornfb_valid_pixrate(
var) (var->pixclock >= 39325 && var->pixclock
<= 40119)
static
inline
void
acornfb_vidc20_find_rates
(
struct
vidc_timing
*
vidc
,
...
...
include/asm-arm/arch-rpc/acornfb.h
View file @
84557b40
...
...
@@ -10,7 +10,30 @@
* AcornFB architecture specific code
*/
#define acornfb_valid_pixrate(rate) (1)
#define acornfb_bandwidth(var) ((var)->pixclock * 8 / (var)->bits_per_pixel)
static
inline
int
acornfb_valid_pixrate
(
struct
fb_var_screeninfo
*
var
)
{
u_long
limit
;
if
(
!
var
->
pixclock
)
return
0
;
/*
* Limits below are taken from RISC OS bandwidthlimit file
*/
if
(
current_par
.
using_vram
)
{
if
(
current_par
.
vram_half_sam
==
2048
)
limit
=
6578
;
else
limit
=
13157
;
}
else
{
limit
=
26315
;
}
return
acornfb_bandwidth
(
var
)
>=
limit
;
}
/*
* Try to find the best PLL parameters for the pixel clock.
...
...
@@ -59,7 +82,7 @@ static inline void
acornfb_vidc20_find_rates
(
struct
vidc_timing
*
vidc
,
struct
fb_var_screeninfo
*
var
)
{
u_int
div
,
bandwidth
;
u_int
div
;
/* Select pixel-clock divisor to keep PLL in range */
div
=
var
->
pixclock
/
9090
;
/*9921*/
...
...
@@ -82,21 +105,35 @@ acornfb_vidc20_find_rates(struct vidc_timing *vidc,
case
8
:
vidc
->
control
|=
VIDC20_CTRL_PIX_CK8
;
break
;
}
/* Calculate bandwidth */
bandwidth
=
var
->
pixclock
*
8
/
var
->
bits_per_pixel
;
/* Encode bandwidth as VIDC20 setting */
if
(
bandwidth
>
33334
)
vidc
->
control
|=
VIDC20_CTRL_FIFO_16
;
/* < 30.0MB/s */
else
if
(
bandwidth
>
26666
)
vidc
->
control
|=
VIDC20_CTRL_FIFO_20
;
/* < 37.5MB/s */
else
if
(
bandwidth
>
22222
)
vidc
->
control
|=
VIDC20_CTRL_FIFO_24
;
/* < 45.0MB/s */
else
vidc
->
control
|=
VIDC20_CTRL_FIFO_28
;
/* > 45.0MB/s */
/*
* With VRAM, the FIFO can be set to the highest possible setting
* because there are no latency considerations for other memory
* accesses. However, in 64 bit bus mode the FIFO preload value
* must not be set to VIDC20_CTRL_FIFO_28 because this will let
* the FIFO overflow. See VIDC20 manual page 33 (6.0 Setting the
* FIFO preload value).
*/
if
(
current_par
.
using_vram
)
{
if
(
current_par
.
vram_half_sam
==
2048
)
vidc
->
control
|=
VIDC20_CTRL_FIFO_24
;
else
vidc
->
control
|=
VIDC20_CTRL_FIFO_28
;
}
else
{
unsigned
long
bandwidth
=
acornfb_bandwidth
(
var
);
/* Encode bandwidth as VIDC20 setting */
if
(
bandwidth
>
33334
)
/* < 30.0MB/s */
vidc
->
control
|=
VIDC20_CTRL_FIFO_16
;
else
if
(
bandwidth
>
26666
)
/* < 37.5MB/s */
vidc
->
control
|=
VIDC20_CTRL_FIFO_20
;
else
if
(
bandwidth
>
22222
)
/* < 45.0MB/s */
vidc
->
control
|=
VIDC20_CTRL_FIFO_24
;
else
/* > 45.0MB/s */
vidc
->
control
|=
VIDC20_CTRL_FIFO_28
;
}
/* Find the PLL values */
vidc
->
pll_ctl
=
acornfb_vidc20_find_pll
(
var
->
pixclock
/
div
);
vidc
->
pll_ctl
=
acornfb_vidc20_find_pll
(
var
->
pixclock
/
div
);
}
#define acornfb_default_control() (VIDC20_CTRL_PIX_VCLK)
...
...
include/asm-arm/hardware/sa1111.h
View file @
84557b40
...
...
@@ -364,6 +364,47 @@
#define _PC_SDR _SA1111( 0x1028 )
#define _PC_SSR _SA1111( 0x102c )
#define SA1111_GPIO 0x1000
#define SA1111_GPIO_PADDR (0x000)
#define SA1111_GPIO_PADRR (0x004)
#define SA1111_GPIO_PADWR (0x004)
#define SA1111_GPIO_PASDR (0x008)
#define SA1111_GPIO_PASSR (0x00c)
#define SA1111_GPIO_PBDDR (0x010)
#define SA1111_GPIO_PBDRR (0x014)
#define SA1111_GPIO_PBDWR (0x014)
#define SA1111_GPIO_PBSDR (0x018)
#define SA1111_GPIO_PBSSR (0x01c)
#define SA1111_GPIO_PCDDR (0x020)
#define SA1111_GPIO_PCDRR (0x024)
#define SA1111_GPIO_PCDWR (0x024)
#define SA1111_GPIO_PCSDR (0x028)
#define SA1111_GPIO_PCSSR (0x02c)
#define GPIO_A0 (1 << 0)
#define GPIO_A1 (1 << 1)
#define GPIO_A2 (1 << 2)
#define GPIO_A3 (1 << 3)
#define GPIO_B0 (1 << 8)
#define GPIO_B1 (1 << 9)
#define GPIO_B2 (1 << 10)
#define GPIO_B3 (1 << 11)
#define GPIO_B4 (1 << 12)
#define GPIO_B5 (1 << 13)
#define GPIO_B6 (1 << 14)
#define GPIO_B7 (1 << 15)
#define GPIO_C0 (1 << 16)
#define GPIO_C1 (1 << 17)
#define GPIO_C2 (1 << 18)
#define GPIO_C3 (1 << 19)
#define GPIO_C4 (1 << 20)
#define GPIO_C5 (1 << 21)
#define GPIO_C6 (1 << 22)
#define GPIO_C7 (1 << 23)
#define PA_DDR __CCREG(0x1000)
#define PA_DRR __CCREG(0x1004)
#define PA_DWR __CCREG(0x1004)
...
...
@@ -570,4 +611,8 @@ int sa1111_check_dma_bug(dma_addr_t addr);
int
sa1111_driver_register
(
struct
sa1111_driver
*
);
void
sa1111_driver_unregister
(
struct
sa1111_driver
*
);
void
sa1111_set_io_dir
(
struct
sa1111_dev
*
sadev
,
unsigned
int
bits
,
unsigned
int
dir
,
unsigned
int
sleep_dir
);
void
sa1111_set_io
(
struct
sa1111_dev
*
sadev
,
unsigned
int
bits
,
unsigned
int
v
);
void
sa1111_set_sleep_io
(
struct
sa1111_dev
*
sadev
,
unsigned
int
bits
,
unsigned
int
v
);
#endif
/* _ASM_ARCH_SA1111 */
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