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
bfa166fa
Commit
bfa166fa
authored
Mar 06, 2005
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.6/linux
parents
fe2839b3
4595e947
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
235 additions
and
118 deletions
+235
-118
arch/arm/common/rtctime.c
arch/arm/common/rtctime.c
+21
-17
arch/arm/mach-ebsa110/io.c
arch/arm/mach-ebsa110/io.c
+32
-55
arch/arm/mach-sa1100/assabet.c
arch/arm/mach-sa1100/assabet.c
+5
-3
arch/arm/mm/mm-armv.c
arch/arm/mm/mm-armv.c
+5
-3
arch/arm/tools/mach-types
arch/arm/tools/mach-types
+44
-3
drivers/serial/s3c2410.c
drivers/serial/s3c2410.c
+116
-25
include/asm-arm/arch-s3c2410/regs-serial.h
include/asm-arm/arch-s3c2410/regs-serial.h
+5
-0
include/asm-arm/io.h
include/asm-arm/io.h
+6
-6
include/asm-arm/pgtable.h
include/asm-arm/pgtable.h
+0
-6
include/asm-arm/rtc.h
include/asm-arm/rtc.h
+1
-0
No files found.
arch/arm/common/rtctime.c
View file @
bfa166fa
...
...
@@ -94,15 +94,11 @@ void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
EXPORT_SYMBOL
(
rtc_time_to_tm
);
/*
*
Convert Gregorian date to seconds since 01-01-1970 00:00:00.
*
Does the rtc_time represent a valid date/time?
*/
int
rtc_
tm_to_time
(
struct
rtc_time
*
tm
,
unsigned
long
*
time
)
int
rtc_
valid_tm
(
struct
rtc_time
*
tm
)
{
unsigned
int
yrs
=
tm
->
tm_year
+
1900
;
*
time
=
0
;
if
(
yrs
<
1970
||
if
(
tm
->
tm_year
<
70
||
tm
->
tm_mon
>=
12
||
tm
->
tm_mday
<
1
||
tm
->
tm_mday
>
month_days
(
tm
->
tm_mon
,
yrs
)
||
...
...
@@ -111,7 +107,16 @@ int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time)
tm
->
tm_sec
>=
60
)
return
-
EINVAL
;
*
time
=
mktime
(
yrs
,
tm
->
tm_mon
+
1
,
tm
->
tm_mday
,
return
0
;
}
EXPORT_SYMBOL
(
rtc_valid_tm
);
/*
* Convert Gregorian date to seconds since 01-01-1970 00:00:00.
*/
int
rtc_tm_to_time
(
struct
rtc_time
*
tm
,
unsigned
long
*
time
)
{
*
time
=
mktime
(
tm
->
tm_year
+
1900
,
tm
->
tm_mon
+
1
,
tm
->
tm_mday
,
tm
->
tm_hour
,
tm
->
tm_min
,
tm
->
tm_sec
);
return
0
;
...
...
@@ -144,7 +149,13 @@ static inline void rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
static
inline
int
rtc_set_time
(
struct
rtc_ops
*
ops
,
struct
rtc_time
*
tm
)
{
return
ops
->
set_time
(
tm
);
int
ret
;
ret
=
rtc_valid_tm
(
tm
);
if
(
ret
==
0
)
ret
=
ops
->
set_time
(
tm
);
return
ret
;
}
static
inline
int
rtc_read_alarm
(
struct
rtc_ops
*
ops
,
struct
rtc_wkalrm
*
alrm
)
...
...
@@ -412,7 +423,6 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo
struct
rtc_wkalrm
alrm
;
struct
rtc_time
tm
;
char
*
p
=
page
;
int
len
;
rtc_read_time
(
ops
,
&
tm
);
...
...
@@ -461,13 +471,7 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo
if
(
ops
->
proc
)
p
+=
ops
->
proc
(
p
);
len
=
(
p
-
page
)
-
off
;
if
(
len
<
0
)
len
=
0
;
*
eof
=
len
<=
count
;
*
start
=
page
+
off
;
return
len
;
return
p
-
page
;
}
int
register_rtc
(
struct
rtc_ops
*
ops
)
...
...
arch/arm/mach-ebsa110/io.c
View file @
bfa166fa
...
...
@@ -153,9 +153,9 @@ u8 __inb8(unsigned int port)
* The SuperIO registers use sane addressing techniques...
*/
if
(
SUPERIO_PORT
(
port
))
ret
=
__raw_readb
(
ISAIO_BASE
+
(
port
<<
2
));
ret
=
__raw_readb
(
(
void
__iomem
*
)
ISAIO_BASE
+
(
port
<<
2
));
else
{
void
__iomem
*
a
=
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
void
__iomem
*
a
=
(
void
__iomem
*
)
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
/*
* Shame nothing else does
...
...
@@ -174,45 +174,33 @@ u8 __inb8(unsigned int port)
*/
u8
__inb16
(
unsigned
int
port
)
{
u
32
r
et
;
u
nsigned
int
offs
et
;
/*
* The SuperIO registers use sane addressing techniques...
*/
if
(
SUPERIO_PORT
(
port
))
ret
=
__raw_readb
(
ISAIO_BASE
+
(
port
<<
2
))
;
else
{
void
__iomem
*
a
=
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
offset
=
port
<<
2
;
else
offset
=
(
port
&
~
1
)
<<
1
|
(
port
&
1
);
/*
* Shame nothing else does
*/
ret
=
__raw_readb
(
a
+
(
port
&
1
));
}
return
ret
;
return
__raw_readb
((
void
__iomem
*
)
ISAIO_BASE
+
offset
);
}
u16
__inw
(
unsigned
int
port
)
{
u
32
r
et
;
u
nsigned
int
offs
et
;
/*
* The SuperIO registers use sane addressing techniques...
*/
if
(
SUPERIO_PORT
(
port
))
ret
=
__raw_readw
(
ISAIO_BASE
+
(
port
<<
2
))
;
offset
=
port
<<
2
;
else
{
void
__iomem
*
a
=
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
/*
* Shame nothing else does
*/
if
(
port
&
1
)
BUG
();
ret
=
__raw_readw
(
a
);
offset
=
port
<<
1
;
BUG_ON
(
port
&
1
);
}
return
ret
;
return
__raw_readw
((
void
__iomem
*
)
ISAIO_BASE
+
offset
)
;
}
/*
...
...
@@ -225,7 +213,7 @@ u32 __inl(unsigned int port)
if
(
SUPERIO_PORT
(
port
)
||
port
&
3
)
BUG
();
a
=
ISAIO_BASE
+
(
port
<<
1
);
a
=
(
void
__iomem
*
)
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
return
__raw_readw
(
a
)
|
__raw_readw
(
a
+
4
)
<<
16
;
}
...
...
@@ -241,9 +229,9 @@ void __outb8(u8 val, unsigned int port)
* The SuperIO registers use sane addressing techniques...
*/
if
(
SUPERIO_PORT
(
port
))
__raw_writeb
(
val
,
ISAIO_BASE
+
(
port
<<
2
));
__raw_writeb
(
val
,
(
void
__iomem
*
)
ISAIO_BASE
+
(
port
<<
2
));
else
{
void
__iomem
*
a
=
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
void
__iomem
*
a
=
(
void
__iomem
*
)
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
/*
* Shame nothing else does
...
...
@@ -257,37 +245,33 @@ void __outb8(u8 val, unsigned int port)
void
__outb16
(
u8
val
,
unsigned
int
port
)
{
unsigned
int
offset
;
/*
* The SuperIO registers use sane addressing techniques...
*/
if
(
SUPERIO_PORT
(
port
))
__raw_writeb
(
val
,
ISAIO_BASE
+
(
port
<<
2
))
;
else
{
void
__iomem
*
a
=
ISAIO_BASE
+
((
port
&
~
1
)
<<
1
);
offset
=
port
<<
2
;
else
offset
=
(
port
&
~
1
)
<<
1
|
(
port
&
1
);
/*
* Shame nothing else does
*/
__raw_writeb
(
val
,
a
+
(
port
&
1
));
}
__raw_writeb
(
val
,
(
void
__iomem
*
)
ISAIO_BASE
+
offset
);
}
void
__outw
(
u16
val
,
unsigned
int
port
)
{
u
32
off
;
u
nsigned
int
offset
;
/*
* The SuperIO registers use sane addressing techniques...
*/
if
(
SUPERIO_PORT
(
port
))
off
=
port
<<
2
;
off
set
=
port
<<
2
;
else
{
off
=
port
<<
1
;
if
(
port
&
1
)
BUG
();
offset
=
port
<<
1
;
BUG_ON
(
port
&
1
);
}
__raw_writew
(
val
,
ISAIO_BASE
+
off
);
__raw_writew
(
val
,
(
void
__iomem
*
)
ISAIO_BASE
+
offset
);
}
void
__outl
(
u32
val
,
unsigned
int
port
)
...
...
@@ -300,13 +284,6 @@ EXPORT_SYMBOL(__outb16);
EXPORT_SYMBOL
(
__outw
);
EXPORT_SYMBOL
(
__outl
);
extern
void
__arch_writesb
(
unsigned
long
virt
,
const
void
*
from
,
int
len
);
extern
void
__arch_writesw
(
unsigned
long
virt
,
const
void
*
from
,
int
len
);
extern
void
__arch_writesl
(
unsigned
long
virt
,
const
void
*
from
,
int
len
);
extern
void
__arch_readsb
(
unsigned
long
virt
,
void
*
from
,
int
len
);
extern
void
__arch_readsw
(
unsigned
long
virt
,
void
*
from
,
int
len
);
extern
void
__arch_readsl
(
unsigned
long
virt
,
void
*
from
,
int
len
);
void
outsb
(
unsigned
int
port
,
const
void
*
from
,
int
len
)
{
u32
off
;
...
...
@@ -319,7 +296,7 @@ void outsb(unsigned int port, const void *from, int len)
BUG
();
}
__raw_writesb
(
ISAIO_BASE
+
off
,
from
,
len
);
__raw_writesb
(
(
void
__iomem
*
)
ISAIO_BASE
+
off
,
from
,
len
);
}
void
insb
(
unsigned
int
port
,
void
*
from
,
int
len
)
...
...
@@ -334,7 +311,7 @@ void insb(unsigned int port, void *from, int len)
BUG
();
}
__raw_readsb
(
ISAIO_BASE
+
off
,
from
,
len
);
__raw_readsb
(
(
void
__iomem
*
)
ISAIO_BASE
+
off
,
from
,
len
);
}
EXPORT_SYMBOL
(
outsb
);
...
...
@@ -352,7 +329,7 @@ void outsw(unsigned int port, const void *from, int len)
BUG
();
}
__raw_writesw
(
ISAIO_BASE
+
off
,
from
,
len
);
__raw_writesw
(
(
void
__iomem
*
)
ISAIO_BASE
+
off
,
from
,
len
);
}
void
insw
(
unsigned
int
port
,
void
*
from
,
int
len
)
...
...
@@ -367,7 +344,7 @@ void insw(unsigned int port, void *from, int len)
BUG
();
}
__raw_readsw
(
ISAIO_BASE
+
off
,
from
,
len
);
__raw_readsw
(
(
void
__iomem
*
)
ISAIO_BASE
+
off
,
from
,
len
);
}
EXPORT_SYMBOL
(
outsw
);
...
...
@@ -384,7 +361,7 @@ void outsl(unsigned int port, const void *from, int len)
if
(
SUPERIO_PORT
(
port
)
||
port
&
3
)
BUG
();
__raw_writesw
(
ISAIO_BASE
+
off
,
from
,
len
<<
1
);
__raw_writesw
(
(
void
__iomem
*
)
ISAIO_BASE
+
off
,
from
,
len
<<
1
);
}
void
insl
(
unsigned
int
port
,
void
*
from
,
int
len
)
...
...
@@ -394,7 +371,7 @@ void insl(unsigned int port, void *from, int len)
if
(
SUPERIO_PORT
(
port
)
||
port
&
3
)
BUG
();
__raw_readsw
(
ISAIO_BASE
+
off
,
from
,
len
<<
1
);
__raw_readsw
(
(
void
__iomem
*
)
ISAIO_BASE
+
off
,
from
,
len
<<
1
);
}
EXPORT_SYMBOL
(
outsl
);
...
...
arch/arm/mach-sa1100/assabet.c
View file @
bfa166fa
...
...
@@ -259,9 +259,11 @@ static void __init map_sa1100_gpio_regs( void )
unsigned
long
phys
=
__PREG
(
GPLR
)
&
PMD_MASK
;
unsigned
long
virt
=
io_p2v
(
phys
);
int
prot
=
PMD_TYPE_SECT
|
PMD_SECT_AP_WRITE
|
PMD_DOMAIN
(
DOMAIN_IO
);
pmd_t
pmd
;
pmd_val
(
pmd
)
=
phys
|
prot
;
set_pmd
(
pmd_offset
(
pgd_offset_k
(
virt
),
virt
),
pmd
);
pmd_t
*
pmd
;
pmd
=
pmd_offset
(
pgd_offset_k
(
virt
),
virt
);
*
pmd
=
__pmd
(
phys
|
prot
);
flush_pmd_entry
(
pmd
);
}
/*
...
...
arch/arm/mm/mm-armv.c
View file @
bfa166fa
...
...
@@ -252,7 +252,8 @@ alloc_init_section(unsigned long virt, unsigned long phys, int prot)
if
(
virt
&
(
1
<<
20
))
pmdp
++
;
set_pmd
(
pmdp
,
__pmd
(
phys
|
prot
));
*
pmdp
=
__pmd
(
phys
|
prot
);
flush_pmd_entry
(
pmdp
);
}
/*
...
...
@@ -568,8 +569,9 @@ void setup_mm_for_reboot(char mode)
if
(
cpu_arch
<=
CPU_ARCH_ARMv5
)
pmdval
|=
PMD_BIT4
;
pmd
=
pmd_offset
(
pgd
+
i
,
i
<<
PGDIR_SHIFT
);
set_pmd
(
pmd
,
__pmd
(
pmdval
));
set_pmd
(
pmd
+
1
,
__pmd
(
pmdval
+
(
1
<<
(
PGDIR_SHIFT
-
1
))));
pmd
[
0
]
=
__pmd
(
pmdval
);
pmd
[
1
]
=
__pmd
(
pmdval
+
(
1
<<
(
PGDIR_SHIFT
-
1
)));
flush_pmd_entry
(
pmd
);
}
}
...
...
arch/arm/tools/mach-types
View file @
bfa166fa
...
...
@@ -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:
Thu Jan 6 00:10:2
3 2005
# Last update:
Wed Mar 2 11:32:5
3 2005
#
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
#
...
...
@@ -226,7 +226,7 @@ dnp1110 SA1100_DNP1110 DNP1110 214
pnp1110 SA1100_PNP1110 PNP1110 215
csb226 ARCH_CSB226 CSB226 216
arnold SA1100_ARNOLD ARNOLD 217
voiceblue
SA1100_PSIBOARD PSIBOARD
218
voiceblue
MACH_VOICEBLUE VOICEBLUE
218
jz8028 ARCH_JZ8028 JZ8028 219
h5400 ARCH_H5400 H5400 220
forte SA1100_FORTE FORTE 221
...
...
@@ -381,7 +381,7 @@ s5c7375 ARCH_S5C7375 S5C7375 369
spearhead ARCH_SPEARHEAD SPEARHEAD 370
pantera ARCH_PANTERA PANTERA 371
prayoglite ARCH_PRAYOGLITE PRAYOGLITE 372
gumsti
k
ARCH_GUMSTIK GUMSTIK 373
gumsti
x
ARCH_GUMSTIK GUMSTIK 373
rcube ARCH_RCUBE RCUBE 374
rea_olv ARCH_REA_OLV REA_OLV 375
pxa_iphone ARCH_PXA_IPHONE PXA_IPHONE 376
...
...
@@ -667,3 +667,44 @@ n30 MACH_N30 N30 656
manga_ks8695 MACH_MANGA_KS8695 MANGA_KS8695 657
ajax MACH_AJAX AJAX 658
nec_mp900 MACH_NEC_MP900 NEC_MP900 659
vvtk1000 MACH_VVTK1000 VVTK1000 661
kafa MACH_KAFA KAFA 662
vvtk3000 MACH_VVTK3000 VVTK3000 663
pimx1 MACH_PIMX1 PIMX1 664
ollie MACH_OLLIE OLLIE 665
skymax MACH_SKYMAX SKYMAX 666
jazz MACH_JAZZ JAZZ 667
tel_t3 MACH_TEL_T3 TEL_T3 668
aisino_fcr255 MACH_AISINO_FCR255 AISINO_FCR255 669
btweb MACH_BTWEB BTWEB 670
dbg_lh79520 MACH_DBG_LH79520 DBG_LH79520 671
cm41xx MACH_CM41XX CM41XX 672
ts72xx MACH_TS72XX TS72XX 673
nggpxa MACH_NGGPXA NGGPXA 674
csb535 MACH_CSB535 CSB535 675
csb536 MACH_CSB536 CSB536 676
pxa_trakpod MACH_PXA_TRAKPOD PXA_TRAKPOD 677
praxis MACH_PRAXIS PRAXIS 678
lh75411 MACH_LH75411 LH75411 679
otom MACH_OTOM OTOM 680
nexcoder_2440 MACH_NEXCODER_2440 NEXCODER_2440 681
loox410 MACH_LOOX410 LOOX410 682
westlake MACH_WESTLAKE WESTLAKE 683
nsb MACH_NSB NSB 684
esl_sarva_stn MACH_ESL_SARVA_STN ESL_SARVA_STN 685
esl_sarva_tft MACH_ESL_SARVA_TFT ESL_SARVA_TFT 686
esl_sarva_iad MACH_ESL_SARVA_IAD ESL_SARVA_IAD 687
esl_sarva_acc MACH_ESL_SARVA_ACC ESL_SARVA_ACC 688
typhoon MACH_TYPHOON TYPHOON 689
cnav MACH_CNAV CNAV 690
a730 MACH_A730 A730 691
netstar MACH_NETSTAR NETSTAR 692
supercon MACH_PHASEFALE_SUPERCON PHASEFALE_SUPERCON 693
shiva1100 MACH_SHIVA1100 SHIVA1100 694
etexsc MACH_ETEXSC ETEXSC 695
ixdpg465 MACH_IXDPG465 IXDPG465 696
a9m2410 MACH_A9M2410 A9M2410 697
a9m2440 MACH_A9M2440 A9M2440 698
a9m9750 MACH_A9M9750 A9M9750 699
a9m9360 MACH_A9M9360 A9M9360 700
unc90 MACH_UNC90 UNC90 701
drivers/serial/s3c2410.c
View file @
bfa166fa
...
...
@@ -5,7 +5,8 @@
*
* Based on drivers/char/serial.c and drivers/char/21285.c
*
* Ben Dooks, (c) 2003 Simtec Electronics
* Ben Dooks, (c) 2003-2005 Simtec Electronics
* http://www.simtec.co.uk/products/SWLINUX/
*
* Changelog:
*
...
...
@@ -24,6 +25,15 @@
* - spin-lock initialisation (Dimitry Andric)
* - added clock control
* - updated init code to use platform_device info
*
* 06-Mar-2005 BJD Add s3c2440 fclk clock source
*/
/* Note on 2440 fclk clock source handling
*
* Whilst it is possible to use the fclk as clock source, the method
* of properly switching too/from this is currently un-implemented, so
* whichever way is configured at startup is the one that will be used.
*/
/* Hote on 2410 error handling
...
...
@@ -87,6 +97,9 @@ struct s3c24xx_uart_info {
int
(
*
get_clksrc
)(
struct
uart_port
*
,
struct
s3c24xx_uart_clksrc
*
clk
);
int
(
*
set_clksrc
)(
struct
uart_port
*
,
struct
s3c24xx_uart_clksrc
*
clk
);
/* uart controls */
int
(
*
reset_port
)(
struct
uart_port
*
,
struct
s3c2410_uartcfg
*
);
};
struct
s3c24xx_uart_port
{
...
...
@@ -606,11 +619,6 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level,
* baud clocks (and the resultant actual baud rates) and then tries to
* pick the closest one and select that.
*
* NOTES:
* 1) there is no current code to properly select/deselect FCLK on
* the s3c2440, so only specify FCLK or non-FCLK in the clock
* sources for the UART
*
*/
...
...
@@ -658,6 +666,7 @@ static int s3c24xx_serial_calcbaud(struct baud_calc *calc,
return
0
;
rate
=
clk_get_rate
(
calc
->
src
);
rate
/=
clksrc
->
divisor
;
calc
->
clksrc
=
clksrc
;
calc
->
quot
=
(
rate
+
(
8
*
baud
))
/
(
16
*
baud
);
...
...
@@ -685,6 +694,27 @@ static unsigned int s3c24xx_serial_getclk(struct uart_port *port,
if
(
cfg
->
clocks_size
==
0
)
clkp
=
&
tmp_clksrc
;
/* check to see if we're sourcing fclk, and if so we're
* going to have to update the clock source
*/
if
(
strcmp
(
clkp
->
name
,
"fclk"
)
==
0
)
{
struct
s3c24xx_uart_clksrc
src
;
s3c24xx_serial_getsource
(
port
,
&
src
);
/* check that the port already using fclk, and if
* not, then re-select fclk
*/
if
(
strcmp
(
src
.
name
,
clkp
->
name
)
==
0
)
{
s3c24xx_serial_setsource
(
port
,
clkp
);
s3c24xx_serial_getsource
(
port
,
&
src
);
}
clkp
->
divisor
=
src
.
divisor
;
}
s3c24xx_serial_calcbaud
(
res
,
port
,
clkp
,
baud
);
best
=
res
;
resptr
=
best
+
1
;
...
...
@@ -993,24 +1023,18 @@ static struct s3c24xx_uart_port s3c24xx_serial_ports[NR_PORTS] = {
#endif
};
/* s3c24xx_serial_resetport
*
* wrapper to call the specific reset for this port (reset the fifos
* and the settings)
*/
static
in
t
s3c24xx_serial_resetport
(
struct
uart_port
*
port
,
struct
s3c2410_uartcfg
*
cfg
)
static
in
line
int
s3c24xx_serial_resetport
(
struct
uart_port
*
port
,
struct
s3c2410_uartcfg
*
cfg
)
{
/* ensure registers are setup */
dbg
(
"s3c24xx_serial_resetport: port=%p (%08lx), cfg=%p
\n
"
,
port
,
port
->
mapbase
,
cfg
);
wr_regl
(
port
,
S3C2410_UCON
,
cfg
->
ucon
);
wr_regl
(
port
,
S3C2410_ULCON
,
cfg
->
ulcon
);
/* reset both fifos */
wr_regl
(
port
,
S3C2410_UFCON
,
cfg
->
ufcon
|
S3C2410_UFCON_RESETBOTH
);
wr_regl
(
port
,
S3C2410_UFCON
,
cfg
->
ufcon
);
struct
s3c24xx_uart_info
*
info
=
s3c24xx_port_to_info
(
port
);
return
0
;
return
(
info
->
reset_port
)(
port
,
cfg
)
;
}
/* s3c24xx_serial_init_port
...
...
@@ -1201,6 +1225,23 @@ static int s3c2410_serial_getsource(struct uart_port *port,
return
0
;
}
static
int
s3c2410_serial_resetport
(
struct
uart_port
*
port
,
struct
s3c2410_uartcfg
*
cfg
)
{
dbg
(
"s3c2410_serial_resetport: port=%p (%08lx), cfg=%p
\n
"
,
port
,
port
->
mapbase
,
cfg
);
wr_regl
(
port
,
S3C2410_UCON
,
cfg
->
ucon
);
wr_regl
(
port
,
S3C2410_ULCON
,
cfg
->
ulcon
);
/* reset both fifos */
wr_regl
(
port
,
S3C2410_UFCON
,
cfg
->
ufcon
|
S3C2410_UFCON_RESETBOTH
);
wr_regl
(
port
,
S3C2410_UFCON
,
cfg
->
ufcon
);
return
0
;
}
static
struct
s3c24xx_uart_info
s3c2410_uart_inf
=
{
.
name
=
"Samsung S3C2410 UART"
,
.
type
=
PORT_S3C2410
,
...
...
@@ -1213,6 +1254,7 @@ static struct s3c24xx_uart_info s3c2410_uart_inf = {
.
tx_fifoshift
=
S3C2410_UFSTAT_TXSHIFT
,
.
get_clksrc
=
s3c2410_serial_getsource
,
.
set_clksrc
=
s3c2410_serial_setsource
,
.
reset_port
=
s3c2410_serial_resetport
,
};
/* device management */
...
...
@@ -1288,6 +1330,7 @@ static int s3c2440_serial_getsource(struct uart_port *port,
struct
s3c24xx_uart_clksrc
*
clk
)
{
unsigned
long
ucon
=
rd_regl
(
port
,
S3C2410_UCON
);
unsigned
long
ucon0
,
ucon1
,
ucon2
;
switch
(
ucon
&
S3C2440_UCON_CLKMASK
)
{
case
S3C2440_UCON_UCLK
:
...
...
@@ -1302,7 +1345,33 @@ static int s3c2440_serial_getsource(struct uart_port *port,
break
;
case
S3C2440_UCON_FCLK
:
clk
->
divisor
=
7
;
/* todo - work out divisor */
/* the fun of calculating the uart divisors on
* the s3c2440 */
ucon0
=
__raw_readl
(
S3C2410_VA_UART0
+
S3C2410_UCON
);
ucon1
=
__raw_readl
(
S3C2410_VA_UART1
+
S3C2410_UCON
);
ucon2
=
__raw_readl
(
S3C2410_VA_UART2
+
S3C2410_UCON
);
printk
(
"ucons: %08lx, %08lx, %08lx
\n
"
,
ucon0
,
ucon1
,
ucon2
);
ucon0
&=
S3C2440_UCON0_DIVMASK
;
ucon1
&=
S3C2440_UCON1_DIVMASK
;
ucon2
&=
S3C2440_UCON2_DIVMASK
;
if
(
ucon0
!=
0
)
{
clk
->
divisor
=
ucon0
>>
S3C2440_UCON_DIVSHIFT
;
clk
->
divisor
+=
6
;
}
else
if
(
ucon1
!=
0
)
{
clk
->
divisor
=
ucon1
>>
S3C2440_UCON_DIVSHIFT
;
clk
->
divisor
+=
21
;
}
else
if
(
ucon2
!=
0
)
{
clk
->
divisor
=
ucon2
>>
S3C2440_UCON_DIVSHIFT
;
clk
->
divisor
+=
36
;
}
else
{
/* manual calims 44, seems to be 9 */
clk
->
divisor
=
9
;
}
clk
->
name
=
"fclk"
;
break
;
}
...
...
@@ -1310,6 +1379,28 @@ static int s3c2440_serial_getsource(struct uart_port *port,
return
0
;
}
static
int
s3c2440_serial_resetport
(
struct
uart_port
*
port
,
struct
s3c2410_uartcfg
*
cfg
)
{
unsigned
long
ucon
=
rd_regl
(
port
,
S3C2410_UCON
);
dbg
(
"s3c2440_serial_resetport: port=%p (%08lx), cfg=%p
\n
"
,
port
,
port
->
mapbase
,
cfg
);
/* ensure we don't change the clock settings... */
ucon
&=
(
S3C2440_UCON0_DIVMASK
|
(
3
<<
10
));
wr_regl
(
port
,
S3C2410_UCON
,
ucon
|
cfg
->
ucon
);
wr_regl
(
port
,
S3C2410_ULCON
,
cfg
->
ulcon
);
/* reset both fifos */
wr_regl
(
port
,
S3C2410_UFCON
,
cfg
->
ufcon
|
S3C2410_UFCON_RESETBOTH
);
wr_regl
(
port
,
S3C2410_UFCON
,
cfg
->
ufcon
);
return
0
;
}
static
struct
s3c24xx_uart_info
s3c2440_uart_inf
=
{
.
name
=
"Samsung S3C2440 UART"
,
...
...
@@ -1322,7 +1413,8 @@ static struct s3c24xx_uart_info s3c2440_uart_inf = {
.
tx_fifomask
=
S3C2440_UFSTAT_TXMASK
,
.
tx_fifoshift
=
S3C2440_UFSTAT_TXSHIFT
,
.
get_clksrc
=
s3c2440_serial_getsource
,
.
set_clksrc
=
s3c2440_serial_setsource
.
set_clksrc
=
s3c2440_serial_setsource
,
.
reset_port
=
s3c2440_serial_resetport
,
};
/* device management */
...
...
@@ -1503,7 +1595,7 @@ s3c24xx_serial_get_options(struct uart_port *port, int *baud,
clk
=
clk_get
(
port
->
dev
,
clksrc
.
name
);
if
(
!
IS_ERR
(
clk
)
&&
clk
!=
NULL
)
rate
=
clk_get_rate
(
clk
);
rate
=
clk_get_rate
(
clk
)
/
clksrc
.
divisor
;
else
rate
=
1
;
...
...
@@ -1597,7 +1689,6 @@ static struct console s3c24xx_serial_console =
.
setup
=
s3c24xx_serial_console_setup
};
static
int
s3c24xx_serial_initconsole
(
void
)
{
struct
s3c24xx_uart_info
*
info
;
...
...
include/asm-arm/arch-s3c2410/regs-serial.h
View file @
bfa166fa
...
...
@@ -73,6 +73,11 @@
#define S3C2440_UCON_UCLK (1<<10)
#define S3C2440_UCON_PCLK2 (2<<10)
#define S3C2440_UCON_FCLK (3<<10)
#define S3C2440_UCON2_FCLK_EN (1<<15)
#define S3C2440_UCON0_DIVMASK (15 << 12)
#define S3C2440_UCON1_DIVMASK (15 << 12)
#define S3C2440_UCON2_DIVMASK (7 << 12)
#define S3C2440_UCON_DIVSHIFT (12)
#define S3C2410_UCON_UCLK (1<<10)
#define S3C2410_UCON_SBREAK (1<<4)
...
...
include/asm-arm/io.h
View file @
bfa166fa
...
...
@@ -47,13 +47,13 @@ extern void __raw_readsb(void __iomem *addr, void *data, int bytelen);
extern
void
__raw_readsw
(
void
__iomem
*
addr
,
void
*
data
,
int
wordlen
);
extern
void
__raw_readsl
(
void
__iomem
*
addr
,
void
*
data
,
int
longlen
);
#define __raw_writeb(v,a) (*(volatile unsigned char __force *)(a) = (v))
#define __raw_writew(v,a) (*(volatile unsigned short __force *)(a) = (v))
#define __raw_writel(v,a) (*(volatile unsigned int __force *)(a) = (v))
#define __raw_writeb(v,a) (
__chk_io_ptr(a),
*(volatile unsigned char __force *)(a) = (v))
#define __raw_writew(v,a) (
__chk_io_ptr(a),
*(volatile unsigned short __force *)(a) = (v))
#define __raw_writel(v,a) (
__chk_io_ptr(a),
*(volatile unsigned int __force *)(a) = (v))
#define __raw_readb(a) (*(volatile unsigned char __force *)(a))
#define __raw_readw(a) (*(volatile unsigned short __force *)(a))
#define __raw_readl(a) (*(volatile unsigned int __force *)(a))
#define __raw_readb(a) (
__chk_io_ptr(a),
*(volatile unsigned char __force *)(a))
#define __raw_readw(a) (
__chk_io_ptr(a),
*(volatile unsigned short __force *)(a))
#define __raw_readl(a) (
__chk_io_ptr(a),
*(volatile unsigned int __force *)(a))
/*
* Bad read/write accesses...
...
...
include/asm-arm/pgtable.h
View file @
bfa166fa
...
...
@@ -317,12 +317,6 @@ PTE_BIT_FUNC(mkyoung, |= L_PTE_YOUNG);
#define pmd_present(pmd) (pmd_val(pmd))
#define pmd_bad(pmd) (pmd_val(pmd) & 2)
#define set_pmd(pmdp,pmd) \
do { \
*(pmdp) = pmd; \
flush_pmd_entry(pmdp); \
} while (0)
#define copy_pmd(pmdpd,pmdps) \
do { \
pmdpd[0] = pmdps[0]; \
...
...
include/asm-arm/rtc.h
View file @
bfa166fa
...
...
@@ -27,6 +27,7 @@ struct rtc_ops {
void
rtc_time_to_tm
(
unsigned
long
,
struct
rtc_time
*
);
int
rtc_tm_to_time
(
struct
rtc_time
*
,
unsigned
long
*
);
int
rtc_valid_tm
(
struct
rtc_time
*
);
void
rtc_next_alarm_time
(
struct
rtc_time
*
,
struct
rtc_time
*
,
struct
rtc_time
*
);
void
rtc_update
(
unsigned
long
,
unsigned
long
);
int
register_rtc
(
struct
rtc_ops
*
);
...
...
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