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
fc00a627
Commit
fc00a627
authored
Jul 26, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/rmk/linux-2.6-arm
parents
0983f050
a8d11e3d
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
445 additions
and
338 deletions
+445
-338
arch/arm/mach-s3c2410/Makefile
arch/arm/mach-s3c2410/Makefile
+2
-0
arch/arm/mach-s3c2410/clock.c
arch/arm/mach-s3c2410/clock.c
+0
-57
arch/arm/mach-s3c2410/irq.c
arch/arm/mach-s3c2410/irq.c
+5
-255
arch/arm/mach-s3c2410/irq.h
arch/arm/mach-s3c2410/irq.h
+99
-0
arch/arm/mach-s3c2410/mach-bast.c
arch/arm/mach-s3c2410/mach-bast.c
+5
-8
arch/arm/mach-s3c2410/s3c2440-clock.c
arch/arm/mach-s3c2410/s3c2440-clock.c
+116
-0
arch/arm/mach-s3c2410/s3c2440-irq.c
arch/arm/mach-s3c2410/s3c2440-irq.c
+207
-0
drivers/pcmcia/sa1100_jornada720.c
drivers/pcmcia/sa1100_jornada720.c
+4
-15
include/asm-arm/arch-s3c2410/regs-iis.h
include/asm-arm/arch-s3c2410/regs-iis.h
+7
-3
No files found.
arch/arm/mach-s3c2410/Makefile
View file @
fc00a627
...
...
@@ -23,6 +23,8 @@ obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
# S3C2440 support
obj-$(CONFIG_CPU_S3C2440)
+=
s3c2440.o s3c2440-dsc.o
obj-$(CONFIG_CPU_S3C2440)
+=
s3c2440-irq.o
obj-$(CONFIG_CPU_S3C2440)
+=
s3c2440-clock.o
# machine specific support
...
...
arch/arm/mach-s3c2410/clock.c
View file @
fc00a627
...
...
@@ -448,60 +448,3 @@ int __init s3c24xx_setup_clocks(unsigned long xtal,
return
0
;
}
/* S3C2440 extended clock support */
#ifdef CONFIG_CPU_S3C2440
static
struct
clk
s3c2440_clk_upll
=
{
.
name
=
"upll"
,
.
id
=
-
1
,
};
static
struct
clk
s3c2440_clk_cam
=
{
.
name
=
"camif"
,
.
parent
=
&
clk_h
,
.
id
=
-
1
,
.
enable
=
s3c24xx_clkcon_enable
,
.
ctrlbit
=
S3C2440_CLKCON_CAMERA
,
};
static
struct
clk
s3c2440_clk_ac97
=
{
.
name
=
"ac97"
,
.
parent
=
&
clk_p
,
.
id
=
-
1
,
.
enable
=
s3c24xx_clkcon_enable
,
.
ctrlbit
=
S3C2440_CLKCON_CAMERA
,
};
static
int
s3c2440_clk_add
(
struct
sys_device
*
sysdev
)
{
unsigned
long
upllcon
=
__raw_readl
(
S3C2410_UPLLCON
);
s3c2440_clk_upll
.
rate
=
s3c2410_get_pll
(
upllcon
,
clk_xtal
.
rate
);
printk
(
"S3C2440: Clock Support, UPLL %ld.%03ld MHz
\n
"
,
print_mhz
(
s3c2440_clk_upll
.
rate
));
s3c24xx_register_clock
(
&
s3c2440_clk_ac97
);
s3c24xx_register_clock
(
&
s3c2440_clk_cam
);
s3c24xx_register_clock
(
&
s3c2440_clk_upll
);
clk_disable
(
&
s3c2440_clk_ac97
);
clk_disable
(
&
s3c2440_clk_cam
);
return
0
;
}
static
struct
sysdev_driver
s3c2440_clk_driver
=
{
.
add
=
s3c2440_clk_add
,
};
static
int
s3c24xx_clk_driver
(
void
)
{
return
sysdev_driver_register
(
&
s3c2440_sysclass
,
&
s3c2440_clk_driver
);
}
arch_initcall
(
s3c24xx_clk_driver
);
#endif
/* CONFIG_CPU_S3C2440 */
arch/arm/mach-s3c2410/irq.c
View file @
fc00a627
...
...
@@ -45,6 +45,9 @@
*
* 28-Jun-2005 Ben Dooks
* Mark IRQ_LCD valid
*
* 25-Jul-2005 Ben Dooks
* Split the S3C2440 IRQ code to seperate file
*/
#include <linux/init.h>
...
...
@@ -65,11 +68,7 @@
#include "cpu.h"
#include "pm.h"
#define irqdbf(x...)
#define irqdbf2(x...)
#define EXTINT_OFF (IRQ_EINT4 - 4)
#include "irq.h"
/* wakeup irq control */
...
...
@@ -181,7 +180,7 @@ s3c_irq_unmask(unsigned int irqno)
__raw_writel
(
mask
,
S3C2410_INTMSK
);
}
st
atic
st
ruct
irqchip
s3c_irq_level_chip
=
{
struct
irqchip
s3c_irq_level_chip
=
{
.
ack
=
s3c_irq_maskack
,
.
mask
=
s3c_irq_mask
,
.
unmask
=
s3c_irq_unmask
,
...
...
@@ -370,84 +369,6 @@ static struct irqchip s3c_irq_eint0t4 = {
#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))
#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))
static
inline
void
s3c_irqsub_mask
(
unsigned
int
irqno
,
unsigned
int
parentbit
,
int
subcheck
)
{
unsigned
long
mask
;
unsigned
long
submask
;
submask
=
__raw_readl
(
S3C2410_INTSUBMSK
);
mask
=
__raw_readl
(
S3C2410_INTMSK
);
submask
|=
(
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
));
/* check to see if we need to mask the parent IRQ */
if
((
submask
&
subcheck
)
==
subcheck
)
{
__raw_writel
(
mask
|
parentbit
,
S3C2410_INTMSK
);
}
/* write back masks */
__raw_writel
(
submask
,
S3C2410_INTSUBMSK
);
}
static
inline
void
s3c_irqsub_unmask
(
unsigned
int
irqno
,
unsigned
int
parentbit
)
{
unsigned
long
mask
;
unsigned
long
submask
;
submask
=
__raw_readl
(
S3C2410_INTSUBMSK
);
mask
=
__raw_readl
(
S3C2410_INTMSK
);
submask
&=
~
(
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
));
mask
&=
~
parentbit
;
/* write back masks */
__raw_writel
(
submask
,
S3C2410_INTSUBMSK
);
__raw_writel
(
mask
,
S3C2410_INTMSK
);
}
static
inline
void
s3c_irqsub_maskack
(
unsigned
int
irqno
,
unsigned
int
parentmask
,
unsigned
int
group
)
{
unsigned
int
bit
=
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
);
s3c_irqsub_mask
(
irqno
,
parentmask
,
group
);
__raw_writel
(
bit
,
S3C2410_SUBSRCPND
);
/* only ack parent if we've got all the irqs (seems we must
* ack, all and hope that the irq system retriggers ok when
* the interrupt goes off again)
*/
if
(
1
)
{
__raw_writel
(
parentmask
,
S3C2410_SRCPND
);
__raw_writel
(
parentmask
,
S3C2410_INTPND
);
}
}
static
inline
void
s3c_irqsub_ack
(
unsigned
int
irqno
,
unsigned
int
parentmask
,
unsigned
int
group
)
{
unsigned
int
bit
=
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
);
__raw_writel
(
bit
,
S3C2410_SUBSRCPND
);
/* only ack parent if we've got all the irqs (seems we must
* ack, all and hope that the irq system retriggers ok when
* the interrupt goes off again)
*/
if
(
1
)
{
__raw_writel
(
parentmask
,
S3C2410_SRCPND
);
__raw_writel
(
parentmask
,
S3C2410_INTPND
);
}
}
/* UART0 */
...
...
@@ -794,174 +715,3 @@ void __init s3c24xx_init_irq(void)
irqdbf
(
"s3c2410: registered interrupt handlers
\n
"
);
}
/* s3c2440 irq code
*/
#ifdef CONFIG_CPU_S3C2440
/* WDT/AC97 */
static
void
s3c_irq_demux_wdtac97
(
unsigned
int
irq
,
struct
irqdesc
*
desc
,
struct
pt_regs
*
regs
)
{
unsigned
int
subsrc
,
submsk
;
struct
irqdesc
*
mydesc
;
/* read the current pending interrupts, and the mask
* for what it is available */
subsrc
=
__raw_readl
(
S3C2410_SUBSRCPND
);
submsk
=
__raw_readl
(
S3C2410_INTSUBMSK
);
subsrc
&=
~
submsk
;
subsrc
>>=
13
;
subsrc
&=
3
;
if
(
subsrc
!=
0
)
{
if
(
subsrc
&
1
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_WDT
;
mydesc
->
handle
(
IRQ_S3C2440_WDT
,
mydesc
,
regs
);
}
if
(
subsrc
&
2
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_AC97
;
mydesc
->
handle
(
IRQ_S3C2440_AC97
,
mydesc
,
regs
);
}
}
}
#define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0))
static
void
s3c_irq_wdtac97_mask
(
unsigned
int
irqno
)
{
s3c_irqsub_mask
(
irqno
,
INTMSK_WDT
,
3
<<
13
);
}
static
void
s3c_irq_wdtac97_unmask
(
unsigned
int
irqno
)
{
s3c_irqsub_unmask
(
irqno
,
INTMSK_WDT
);
}
static
void
s3c_irq_wdtac97_ack
(
unsigned
int
irqno
)
{
s3c_irqsub_maskack
(
irqno
,
INTMSK_WDT
,
3
<<
13
);
}
static
struct
irqchip
s3c_irq_wdtac97
=
{
.
mask
=
s3c_irq_wdtac97_mask
,
.
unmask
=
s3c_irq_wdtac97_unmask
,
.
ack
=
s3c_irq_wdtac97_ack
,
};
/* camera irq */
static
void
s3c_irq_demux_cam
(
unsigned
int
irq
,
struct
irqdesc
*
desc
,
struct
pt_regs
*
regs
)
{
unsigned
int
subsrc
,
submsk
;
struct
irqdesc
*
mydesc
;
/* read the current pending interrupts, and the mask
* for what it is available */
subsrc
=
__raw_readl
(
S3C2410_SUBSRCPND
);
submsk
=
__raw_readl
(
S3C2410_INTSUBMSK
);
subsrc
&=
~
submsk
;
subsrc
>>=
11
;
subsrc
&=
3
;
if
(
subsrc
!=
0
)
{
if
(
subsrc
&
1
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_CAM_C
;
mydesc
->
handle
(
IRQ_S3C2440_WDT
,
mydesc
,
regs
);
}
if
(
subsrc
&
2
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_CAM_P
;
mydesc
->
handle
(
IRQ_S3C2440_AC97
,
mydesc
,
regs
);
}
}
}
#define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0))
static
void
s3c_irq_cam_mask
(
unsigned
int
irqno
)
{
s3c_irqsub_mask
(
irqno
,
INTMSK_CAM
,
3
<<
11
);
}
static
void
s3c_irq_cam_unmask
(
unsigned
int
irqno
)
{
s3c_irqsub_unmask
(
irqno
,
INTMSK_CAM
);
}
static
void
s3c_irq_cam_ack
(
unsigned
int
irqno
)
{
s3c_irqsub_maskack
(
irqno
,
INTMSK_CAM
,
3
<<
11
);
}
static
struct
irqchip
s3c_irq_cam
=
{
.
mask
=
s3c_irq_cam_mask
,
.
unmask
=
s3c_irq_cam_unmask
,
.
ack
=
s3c_irq_cam_ack
,
};
static
int
s3c2440_irq_add
(
struct
sys_device
*
sysdev
)
{
unsigned
int
irqno
;
printk
(
"S3C2440: IRQ Support
\n
"
);
set_irq_chip
(
IRQ_NFCON
,
&
s3c_irq_level_chip
);
set_irq_handler
(
IRQ_NFCON
,
do_level_IRQ
);
set_irq_flags
(
IRQ_NFCON
,
IRQF_VALID
);
/* add new chained handler for wdt, ac7 */
set_irq_chip
(
IRQ_WDT
,
&
s3c_irq_level_chip
);
set_irq_handler
(
IRQ_WDT
,
do_level_IRQ
);
set_irq_chained_handler
(
IRQ_WDT
,
s3c_irq_demux_wdtac97
);
for
(
irqno
=
IRQ_S3C2440_WDT
;
irqno
<=
IRQ_S3C2440_AC97
;
irqno
++
)
{
set_irq_chip
(
irqno
,
&
s3c_irq_wdtac97
);
set_irq_handler
(
irqno
,
do_level_IRQ
);
set_irq_flags
(
irqno
,
IRQF_VALID
);
}
/* add chained handler for camera */
set_irq_chip
(
IRQ_CAM
,
&
s3c_irq_level_chip
);
set_irq_handler
(
IRQ_CAM
,
do_level_IRQ
);
set_irq_chained_handler
(
IRQ_CAM
,
s3c_irq_demux_cam
);
for
(
irqno
=
IRQ_S3C2440_CAM_C
;
irqno
<=
IRQ_S3C2440_CAM_P
;
irqno
++
)
{
set_irq_chip
(
irqno
,
&
s3c_irq_cam
);
set_irq_handler
(
irqno
,
do_level_IRQ
);
set_irq_flags
(
irqno
,
IRQF_VALID
);
}
return
0
;
}
static
struct
sysdev_driver
s3c2440_irq_driver
=
{
.
add
=
s3c2440_irq_add
,
};
static
int
s3c24xx_irq_driver
(
void
)
{
return
sysdev_driver_register
(
&
s3c2440_sysclass
,
&
s3c2440_irq_driver
);
}
arch_initcall
(
s3c24xx_irq_driver
);
#endif
/* CONFIG_CPU_S3C2440 */
arch/arm/mach-s3c2410/irq.h
0 → 100644
View file @
fc00a627
/* arch/arm/mach-s3c2410/irq.h
*
* Copyright (c) 2004-2005 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
*
* Header file for S3C24XX CPU IRQ support
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Modifications:
*/
#define irqdbf(x...)
#define irqdbf2(x...)
#define EXTINT_OFF (IRQ_EINT4 - 4)
extern
struct
irqchip
s3c_irq_level_chip
;
static
inline
void
s3c_irqsub_mask
(
unsigned
int
irqno
,
unsigned
int
parentbit
,
int
subcheck
)
{
unsigned
long
mask
;
unsigned
long
submask
;
submask
=
__raw_readl
(
S3C2410_INTSUBMSK
);
mask
=
__raw_readl
(
S3C2410_INTMSK
);
submask
|=
(
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
));
/* check to see if we need to mask the parent IRQ */
if
((
submask
&
subcheck
)
==
subcheck
)
{
__raw_writel
(
mask
|
parentbit
,
S3C2410_INTMSK
);
}
/* write back masks */
__raw_writel
(
submask
,
S3C2410_INTSUBMSK
);
}
static
inline
void
s3c_irqsub_unmask
(
unsigned
int
irqno
,
unsigned
int
parentbit
)
{
unsigned
long
mask
;
unsigned
long
submask
;
submask
=
__raw_readl
(
S3C2410_INTSUBMSK
);
mask
=
__raw_readl
(
S3C2410_INTMSK
);
submask
&=
~
(
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
));
mask
&=
~
parentbit
;
/* write back masks */
__raw_writel
(
submask
,
S3C2410_INTSUBMSK
);
__raw_writel
(
mask
,
S3C2410_INTMSK
);
}
static
inline
void
s3c_irqsub_maskack
(
unsigned
int
irqno
,
unsigned
int
parentmask
,
unsigned
int
group
)
{
unsigned
int
bit
=
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
);
s3c_irqsub_mask
(
irqno
,
parentmask
,
group
);
__raw_writel
(
bit
,
S3C2410_SUBSRCPND
);
/* only ack parent if we've got all the irqs (seems we must
* ack, all and hope that the irq system retriggers ok when
* the interrupt goes off again)
*/
if
(
1
)
{
__raw_writel
(
parentmask
,
S3C2410_SRCPND
);
__raw_writel
(
parentmask
,
S3C2410_INTPND
);
}
}
static
inline
void
s3c_irqsub_ack
(
unsigned
int
irqno
,
unsigned
int
parentmask
,
unsigned
int
group
)
{
unsigned
int
bit
=
1UL
<<
(
irqno
-
IRQ_S3CUART_RX0
);
__raw_writel
(
bit
,
S3C2410_SUBSRCPND
);
/* only ack parent if we've got all the irqs (seems we must
* ack, all and hope that the irq system retriggers ok when
* the interrupt goes off again)
*/
if
(
1
)
{
__raw_writel
(
parentmask
,
S3C2410_SRCPND
);
__raw_writel
(
parentmask
,
S3C2410_INTPND
);
}
}
arch/arm/mach-s3c2410/mach-bast.c
View file @
fc00a627
...
...
@@ -25,10 +25,11 @@
* 14-Jan-2005 BJD Add support for muitlple NAND devices
* 03-Mar-2005 BJD Ensured that bast-cpld.h is included
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
* 14-Mar-2006 BJD Updated for __iomem changes
* 22-Jun-2006 BJD Added DM9000 platform information
* 28-Jun-2006 BJD Moved pm functionality out to common code
* 17-Jul-2006 BJD Changed to platform device for SuperIO 16550s
* 14-Mar-2005 BJD Updated for __iomem changes
* 22-Jun-2005 BJD Added DM9000 platform information
* 28-Jun-2005 BJD Moved pm functionality out to common code
* 17-Jul-2005 BJD Changed to platform device for SuperIO 16550s
* 25-Jul-2005 BJD Removed ASIX static mappings
*/
#include <linux/kernel.h>
...
...
@@ -116,7 +117,6 @@ static struct map_desc bast_iodesc[] __initdata = {
/* slow, byte */
{
VA_C2
(
BAST_VA_ISAIO
),
PA_CS2
(
BAST_PA_ISAIO
),
SZ_16M
,
MT_DEVICE
},
{
VA_C2
(
BAST_VA_ISAMEM
),
PA_CS2
(
BAST_PA_ISAMEM
),
SZ_16M
,
MT_DEVICE
},
{
VA_C2
(
BAST_VA_ASIXNET
),
PA_CS3
(
BAST_PA_ASIXNET
),
SZ_1M
,
MT_DEVICE
},
{
VA_C2
(
BAST_VA_SUPERIO
),
PA_CS2
(
BAST_PA_SUPERIO
),
SZ_1M
,
MT_DEVICE
},
{
VA_C2
(
BAST_VA_IDEPRI
),
PA_CS3
(
BAST_PA_IDEPRI
),
SZ_1M
,
MT_DEVICE
},
{
VA_C2
(
BAST_VA_IDESEC
),
PA_CS3
(
BAST_PA_IDESEC
),
SZ_1M
,
MT_DEVICE
},
...
...
@@ -126,7 +126,6 @@ static struct map_desc bast_iodesc[] __initdata = {
/* slow, word */
{
VA_C3
(
BAST_VA_ISAIO
),
PA_CS3
(
BAST_PA_ISAIO
),
SZ_16M
,
MT_DEVICE
},
{
VA_C3
(
BAST_VA_ISAMEM
),
PA_CS3
(
BAST_PA_ISAMEM
),
SZ_16M
,
MT_DEVICE
},
{
VA_C3
(
BAST_VA_ASIXNET
),
PA_CS3
(
BAST_PA_ASIXNET
),
SZ_1M
,
MT_DEVICE
},
{
VA_C3
(
BAST_VA_SUPERIO
),
PA_CS3
(
BAST_PA_SUPERIO
),
SZ_1M
,
MT_DEVICE
},
{
VA_C3
(
BAST_VA_IDEPRI
),
PA_CS3
(
BAST_PA_IDEPRI
),
SZ_1M
,
MT_DEVICE
},
{
VA_C3
(
BAST_VA_IDESEC
),
PA_CS3
(
BAST_PA_IDESEC
),
SZ_1M
,
MT_DEVICE
},
...
...
@@ -136,7 +135,6 @@ static struct map_desc bast_iodesc[] __initdata = {
/* fast, byte */
{
VA_C4
(
BAST_VA_ISAIO
),
PA_CS4
(
BAST_PA_ISAIO
),
SZ_16M
,
MT_DEVICE
},
{
VA_C4
(
BAST_VA_ISAMEM
),
PA_CS4
(
BAST_PA_ISAMEM
),
SZ_16M
,
MT_DEVICE
},
{
VA_C4
(
BAST_VA_ASIXNET
),
PA_CS5
(
BAST_PA_ASIXNET
),
SZ_1M
,
MT_DEVICE
},
{
VA_C4
(
BAST_VA_SUPERIO
),
PA_CS4
(
BAST_PA_SUPERIO
),
SZ_1M
,
MT_DEVICE
},
{
VA_C4
(
BAST_VA_IDEPRI
),
PA_CS5
(
BAST_PA_IDEPRI
),
SZ_1M
,
MT_DEVICE
},
{
VA_C4
(
BAST_VA_IDESEC
),
PA_CS5
(
BAST_PA_IDESEC
),
SZ_1M
,
MT_DEVICE
},
...
...
@@ -146,7 +144,6 @@ static struct map_desc bast_iodesc[] __initdata = {
/* fast, word */
{
VA_C5
(
BAST_VA_ISAIO
),
PA_CS5
(
BAST_PA_ISAIO
),
SZ_16M
,
MT_DEVICE
},
{
VA_C5
(
BAST_VA_ISAMEM
),
PA_CS5
(
BAST_PA_ISAMEM
),
SZ_16M
,
MT_DEVICE
},
{
VA_C5
(
BAST_VA_ASIXNET
),
PA_CS5
(
BAST_PA_ASIXNET
),
SZ_1M
,
MT_DEVICE
},
{
VA_C5
(
BAST_VA_SUPERIO
),
PA_CS5
(
BAST_PA_SUPERIO
),
SZ_1M
,
MT_DEVICE
},
{
VA_C5
(
BAST_VA_IDEPRI
),
PA_CS5
(
BAST_PA_IDEPRI
),
SZ_1M
,
MT_DEVICE
},
{
VA_C5
(
BAST_VA_IDESEC
),
PA_CS5
(
BAST_PA_IDESEC
),
SZ_1M
,
MT_DEVICE
},
...
...
arch/arm/mach-s3c2410/s3c2440-clock.c
0 → 100644
View file @
fc00a627
/* linux/arch/arm/mach-s3c2410/s3c2440-clock.c
*
* Copyright (c) 2004-2005 Simtec Electronics
* http://armlinux.simtec.co.uk/
* Ben Dooks <ben@simtec.co.uk>
*
* S3C2440 Clock support
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/device.h>
#include <linux/sysdev.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <asm/hardware.h>
#include <asm/atomic.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/hardware/clock.h>
#include <asm/arch/regs-clock.h>
#include "clock.h"
#include "cpu.h"
/* S3C2440 extended clock support */
static
struct
clk
s3c2440_clk_upll
=
{
.
name
=
"upll"
,
.
id
=
-
1
,
};
static
struct
clk
s3c2440_clk_cam
=
{
.
name
=
"camif"
,
.
id
=
-
1
,
.
enable
=
s3c24xx_clkcon_enable
,
.
ctrlbit
=
S3C2440_CLKCON_CAMERA
,
};
static
struct
clk
s3c2440_clk_ac97
=
{
.
name
=
"ac97"
,
.
id
=
-
1
,
.
enable
=
s3c24xx_clkcon_enable
,
.
ctrlbit
=
S3C2440_CLKCON_CAMERA
,
};
static
int
s3c2440_clk_add
(
struct
sys_device
*
sysdev
)
{
unsigned
long
upllcon
=
__raw_readl
(
S3C2410_UPLLCON
);
struct
clk
*
clk_h
;
struct
clk
*
clk_p
;
struct
clk
*
clk_xtal
;
clk_xtal
=
clk_get
(
NULL
,
"xtal"
);
if
(
IS_ERR
(
clk_xtal
))
{
printk
(
KERN_ERR
"S3C2440: Failed to get clk_xtal
\n
"
);
return
-
EINVAL
;
}
s3c2440_clk_upll
.
rate
=
s3c2410_get_pll
(
upllcon
,
clk_xtal
->
rate
);
printk
(
"S3C2440: Clock Support, UPLL %ld.%03ld MHz
\n
"
,
print_mhz
(
s3c2440_clk_upll
.
rate
));
clk_p
=
clk_get
(
NULL
,
"pclk"
);
clk_h
=
clk_get
(
NULL
,
"hclk"
);
if
(
IS_ERR
(
clk_p
)
||
IS_ERR
(
clk_h
))
{
printk
(
KERN_ERR
"S3C2440: Failed to get parent clocks
\n
"
);
return
-
EINVAL
;
}
s3c2440_clk_cam
.
parent
=
clk_h
;
s3c2440_clk_ac97
.
parent
=
clk_p
;
s3c24xx_register_clock
(
&
s3c2440_clk_ac97
);
s3c24xx_register_clock
(
&
s3c2440_clk_cam
);
s3c24xx_register_clock
(
&
s3c2440_clk_upll
);
clk_disable
(
&
s3c2440_clk_ac97
);
clk_disable
(
&
s3c2440_clk_cam
);
return
0
;
}
static
struct
sysdev_driver
s3c2440_clk_driver
=
{
.
add
=
s3c2440_clk_add
,
};
static
__init
int
s3c24xx_clk_driver
(
void
)
{
return
sysdev_driver_register
(
&
s3c2440_sysclass
,
&
s3c2440_clk_driver
);
}
arch_initcall
(
s3c24xx_clk_driver
);
arch/arm/mach-s3c2410/s3c2440-irq.c
0 → 100644
View file @
fc00a627
/* linux/arch/arm/mach-s3c2410/s3c2440-irq.c
*
* Copyright (c) 2003,2004 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Changelog:
* 25-Jul-2005 BJD Split from irq.c
*
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/ptrace.h>
#include <linux/sysdev.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/mach/irq.h>
#include <asm/arch/regs-irq.h>
#include <asm/arch/regs-gpio.h>
#include "cpu.h"
#include "pm.h"
#include "irq.h"
/* WDT/AC97 */
static
void
s3c_irq_demux_wdtac97
(
unsigned
int
irq
,
struct
irqdesc
*
desc
,
struct
pt_regs
*
regs
)
{
unsigned
int
subsrc
,
submsk
;
struct
irqdesc
*
mydesc
;
/* read the current pending interrupts, and the mask
* for what it is available */
subsrc
=
__raw_readl
(
S3C2410_SUBSRCPND
);
submsk
=
__raw_readl
(
S3C2410_INTSUBMSK
);
subsrc
&=
~
submsk
;
subsrc
>>=
13
;
subsrc
&=
3
;
if
(
subsrc
!=
0
)
{
if
(
subsrc
&
1
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_WDT
;
mydesc
->
handle
(
IRQ_S3C2440_WDT
,
mydesc
,
regs
);
}
if
(
subsrc
&
2
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_AC97
;
mydesc
->
handle
(
IRQ_S3C2440_AC97
,
mydesc
,
regs
);
}
}
}
#define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0))
static
void
s3c_irq_wdtac97_mask
(
unsigned
int
irqno
)
{
s3c_irqsub_mask
(
irqno
,
INTMSK_WDT
,
3
<<
13
);
}
static
void
s3c_irq_wdtac97_unmask
(
unsigned
int
irqno
)
{
s3c_irqsub_unmask
(
irqno
,
INTMSK_WDT
);
}
static
void
s3c_irq_wdtac97_ack
(
unsigned
int
irqno
)
{
s3c_irqsub_maskack
(
irqno
,
INTMSK_WDT
,
3
<<
13
);
}
static
struct
irqchip
s3c_irq_wdtac97
=
{
.
mask
=
s3c_irq_wdtac97_mask
,
.
unmask
=
s3c_irq_wdtac97_unmask
,
.
ack
=
s3c_irq_wdtac97_ack
,
};
/* camera irq */
static
void
s3c_irq_demux_cam
(
unsigned
int
irq
,
struct
irqdesc
*
desc
,
struct
pt_regs
*
regs
)
{
unsigned
int
subsrc
,
submsk
;
struct
irqdesc
*
mydesc
;
/* read the current pending interrupts, and the mask
* for what it is available */
subsrc
=
__raw_readl
(
S3C2410_SUBSRCPND
);
submsk
=
__raw_readl
(
S3C2410_INTSUBMSK
);
subsrc
&=
~
submsk
;
subsrc
>>=
11
;
subsrc
&=
3
;
if
(
subsrc
!=
0
)
{
if
(
subsrc
&
1
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_CAM_C
;
mydesc
->
handle
(
IRQ_S3C2440_WDT
,
mydesc
,
regs
);
}
if
(
subsrc
&
2
)
{
mydesc
=
irq_desc
+
IRQ_S3C2440_CAM_P
;
mydesc
->
handle
(
IRQ_S3C2440_AC97
,
mydesc
,
regs
);
}
}
}
#define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0))
static
void
s3c_irq_cam_mask
(
unsigned
int
irqno
)
{
s3c_irqsub_mask
(
irqno
,
INTMSK_CAM
,
3
<<
11
);
}
static
void
s3c_irq_cam_unmask
(
unsigned
int
irqno
)
{
s3c_irqsub_unmask
(
irqno
,
INTMSK_CAM
);
}
static
void
s3c_irq_cam_ack
(
unsigned
int
irqno
)
{
s3c_irqsub_maskack
(
irqno
,
INTMSK_CAM
,
3
<<
11
);
}
static
struct
irqchip
s3c_irq_cam
=
{
.
mask
=
s3c_irq_cam_mask
,
.
unmask
=
s3c_irq_cam_unmask
,
.
ack
=
s3c_irq_cam_ack
,
};
static
int
s3c2440_irq_add
(
struct
sys_device
*
sysdev
)
{
unsigned
int
irqno
;
printk
(
"S3C2440: IRQ Support
\n
"
);
set_irq_chip
(
IRQ_NFCON
,
&
s3c_irq_level_chip
);
set_irq_handler
(
IRQ_NFCON
,
do_level_IRQ
);
set_irq_flags
(
IRQ_NFCON
,
IRQF_VALID
);
/* add new chained handler for wdt, ac7 */
set_irq_chip
(
IRQ_WDT
,
&
s3c_irq_level_chip
);
set_irq_handler
(
IRQ_WDT
,
do_level_IRQ
);
set_irq_chained_handler
(
IRQ_WDT
,
s3c_irq_demux_wdtac97
);
for
(
irqno
=
IRQ_S3C2440_WDT
;
irqno
<=
IRQ_S3C2440_AC97
;
irqno
++
)
{
set_irq_chip
(
irqno
,
&
s3c_irq_wdtac97
);
set_irq_handler
(
irqno
,
do_level_IRQ
);
set_irq_flags
(
irqno
,
IRQF_VALID
);
}
/* add chained handler for camera */
set_irq_chip
(
IRQ_CAM
,
&
s3c_irq_level_chip
);
set_irq_handler
(
IRQ_CAM
,
do_level_IRQ
);
set_irq_chained_handler
(
IRQ_CAM
,
s3c_irq_demux_cam
);
for
(
irqno
=
IRQ_S3C2440_CAM_C
;
irqno
<=
IRQ_S3C2440_CAM_P
;
irqno
++
)
{
set_irq_chip
(
irqno
,
&
s3c_irq_cam
);
set_irq_handler
(
irqno
,
do_level_IRQ
);
set_irq_flags
(
irqno
,
IRQF_VALID
);
}
return
0
;
}
static
struct
sysdev_driver
s3c2440_irq_driver
=
{
.
add
=
s3c2440_irq_add
,
};
static
int
s3c24xx_irq_driver
(
void
)
{
return
sysdev_driver_register
(
&
s3c2440_sysclass
,
&
s3c2440_irq_driver
);
}
arch_initcall
(
s3c24xx_irq_driver
);
drivers/pcmcia/sa1100_jornada720.c
View file @
fc00a627
...
...
@@ -30,20 +30,9 @@ static int jornada720_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
*/
GRER
|=
0x00000002
;
/* Set GPIO_A<3:1> to be outputs for PCMCIA/CF power controller: */
PA_DDR
=
0
;
PA_DWR
=
0
;
PA_SDR
=
0
;
PA_SSR
=
0
;
PB_DDR
=
0
;
PB_DWR
=
0x01
;
PB_SDR
=
0
;
PB_SSR
=
0
;
PC_DDR
=
0x88
;
PC_DWR
=
0x20
;
PC_SDR
=
0
;
PC_SSR
=
0
;
sa1111_set_io_dir
(
SA1111_DEV
(
skt
->
dev
),
GPIO_A0
|
GPIO_A1
|
GPIO_A2
|
GPIO_A3
,
0
,
0
);
sa1111_set_io
(
SA1111_DEV
(
skt
->
dev
),
GPIO_A0
|
GPIO_A1
|
GPIO_A2
|
GPIO_A3
,
0
);
sa1111_set_sleep_io
(
SA1111_DEV
(
skt
->
dev
),
GPIO_A0
|
GPIO_A1
|
GPIO_A2
|
GPIO_A3
,
0
);
return
sa1111_pcmcia_hw_init
(
skt
);
}
...
...
@@ -95,7 +84,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
unsigned
long
flags
;
local_irq_save
(
flags
);
PA_DWR
=
(
PA_DWR
&
~
pa_dwr_mask
)
|
pa_dwr_set
;
sa1111_set_io
(
SA1111_DEV
(
skt
->
dev
),
pa_dwr_mask
,
pa_dwr_set
)
;
local_irq_restore
(
flags
);
}
...
...
include/asm-arm/arch-s3c2410/regs-iis.h
View file @
fc00a627
...
...
@@ -15,6 +15,9 @@
* 12-03-2004 BJD Updated include protection
* 07-03-2005 BJD Added FIFO size flags and S3C2440 MPLL
* 05-04-2005 LCVR Added IISFCON definitions for the S3C2400
* 18-07-2005 DA Change IISCON_MPLL to IISMOD_MPLL
* Correct IISMOD_256FS and IISMOD_384FS
* Add IISCON_PSCEN
*/
#ifndef __ASM_ARCH_REGS_IIS_H
...
...
@@ -22,7 +25,6 @@
#define S3C2410_IISCON (0x00)
#define S3C2440_IISCON_MPLL (1<<9)
#define S3C2410_IISCON_LRINDEX (1<<8)
#define S3C2410_IISCON_TXFIFORDY (1<<7)
#define S3C2410_IISCON_RXFIFORDY (1<<6)
...
...
@@ -30,10 +32,12 @@
#define S3C2410_IISCON_RXDMAEN (1<<4)
#define S3C2410_IISCON_TXIDLE (1<<3)
#define S3C2410_IISCON_RXIDLE (1<<2)
#define S3C2410_IISCON_PSCEN (1<<1)
#define S3C2410_IISCON_IISEN (1<<0)
#define S3C2410_IISMOD (0x04)
#define S3C2440_IISMOD_MPLL (1<<9)
#define S3C2410_IISMOD_SLAVE (1<<8)
#define S3C2410_IISMOD_NOXFER (0<<6)
#define S3C2410_IISMOD_RXMODE (1<<6)
...
...
@@ -46,8 +50,8 @@
#define S3C2410_IISMOD_8BIT (0<<3)
#define S3C2410_IISMOD_16BIT (1<<3)
#define S3C2410_IISMOD_BITMASK (1<<3)
#define S3C2410_IISMOD_256FS (0<<
1
)
#define S3C2410_IISMOD_384FS (1<<
1
)
#define S3C2410_IISMOD_256FS (0<<
2
)
#define S3C2410_IISMOD_384FS (1<<
2
)
#define S3C2410_IISMOD_16FS (0<<0)
#define S3C2410_IISMOD_32FS (1<<0)
#define S3C2410_IISMOD_48FS (2<<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