[ARM] 4198/2: S3C2443: arch/arm/mach-s3c2443 and related support
Add arch/arm/mach-s3c2443 for support of the Samsung S3C2443 SoC This patch adds the core CPU support, clock framework, times and initial IRQ support, as well as adding the directory into the build tree. Signed-off-by: Ben Dooks <ben-linux@fluff.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
17908ed715
commit
e4d06e3953
11 changed files with 1306 additions and 2 deletions
|
@ -303,7 +303,7 @@ config ARCH_SA1100
|
|||
Support for StrongARM 11x0 based boards.
|
||||
|
||||
config ARCH_S3C2410
|
||||
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442"
|
||||
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"
|
||||
help
|
||||
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
|
||||
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
|
||||
|
@ -371,6 +371,7 @@ source "arch/arm/mach-s3c2410/Kconfig"
|
|||
source "arch/arm/mach-s3c2412/Kconfig"
|
||||
source "arch/arm/mach-s3c2440/Kconfig"
|
||||
source "arch/arm/mach-s3c2442/Kconfig"
|
||||
source "arch/arm/mach-s3c2443/Kconfig"
|
||||
endif
|
||||
|
||||
source "arch/arm/mach-lh7a40x/Kconfig"
|
||||
|
|
|
@ -165,6 +165,7 @@ core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2400/
|
|||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2412/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2440/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2442/
|
||||
core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2443/
|
||||
core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
|
||||
core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
|
||||
core-$(CONFIG_VFP) += arch/arm/vfp/
|
||||
|
|
18
arch/arm/mach-s3c2443/Kconfig
Normal file
18
arch/arm/mach-s3c2443/Kconfig
Normal file
|
@ -0,0 +1,18 @@
|
|||
# arch/arm/mach-s3c2443/Kconfig
|
||||
#
|
||||
# Copyright 2007 Simtec Electronics
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
config CPU_S3C2443
|
||||
bool
|
||||
depends on ARCH_S3C2410
|
||||
select S3C2443_PM if PM
|
||||
select S3C2443_DMA if S3C2410_DMA
|
||||
help
|
||||
Support for the S3C2443 SoC from the S3C24XX line
|
||||
|
||||
menu "S3C2443 Machines"
|
||||
|
||||
endmenu
|
||||
|
16
arch/arm/mach-s3c2443/Makefile
Normal file
16
arch/arm/mach-s3c2443/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
|||
# arch/arm/mach-s3c2443/Makefile
|
||||
#
|
||||
# Copyright 2007 Simtec Electronics
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
obj-y :=
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2443) += s3c2443.o
|
||||
obj-$(CONFIG_CPU_S3C2443) += irq.o
|
||||
obj-$(CONFIG_CPU_S3C2443) += clock.o
|
||||
|
||||
# Machine support
|
1007
arch/arm/mach-s3c2443/clock.c
Normal file
1007
arch/arm/mach-s3c2443/clock.c
Normal file
File diff suppressed because it is too large
Load diff
130
arch/arm/mach-s3c2443/irq.c
Normal file
130
arch/arm/mach-s3c2443/irq.c
Normal file
|
@ -0,0 +1,130 @@
|
|||
/* linux/arch/arm/mach-s3c2443/irq.c
|
||||
*
|
||||
* Copyright (c) 2007 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
|
||||
*
|
||||
*/
|
||||
|
||||
#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 <asm/plat-s3c24xx/cpu.h>
|
||||
#include <asm/plat-s3c24xx/pm.h>
|
||||
#include <asm/plat-s3c24xx/irq.h>
|
||||
|
||||
/* WDT/AC97 */
|
||||
|
||||
static void s3c_irq_demux_wdtac97(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
unsigned int subsrc, submsk;
|
||||
struct irq_desc *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 >>= 27;
|
||||
subsrc &= 3;
|
||||
|
||||
if (subsrc != 0) {
|
||||
if (subsrc & 1) {
|
||||
mydesc = irq_desc + IRQ_S3C2443_WDT;
|
||||
desc_handle_irq(IRQ_S3C2443_WDT, mydesc);
|
||||
}
|
||||
if (subsrc & 2) {
|
||||
mydesc = irq_desc + IRQ_S3C2443_AC97;
|
||||
desc_handle_irq(IRQ_S3C2443_AC97, mydesc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0))
|
||||
|
||||
static void
|
||||
s3c_irq_wdtac97_mask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_mask(irqno, INTMSK_WDT, 3<<27);
|
||||
}
|
||||
|
||||
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<<27);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_wdtac97 = {
|
||||
.mask = s3c_irq_wdtac97_mask,
|
||||
.unmask = s3c_irq_wdtac97_unmask,
|
||||
.ack = s3c_irq_wdtac97_ack,
|
||||
};
|
||||
|
||||
static int s3c2443_irq_add(struct sys_device *sysdev)
|
||||
{
|
||||
unsigned int irqno;
|
||||
|
||||
printk("S3C2443: IRQ Support\n");
|
||||
|
||||
/* add new chained handler for wdt, ac7 */
|
||||
|
||||
set_irq_chip(IRQ_WDT, &s3c_irq_level_chip);
|
||||
set_irq_handler(IRQ_WDT, handle_level_irq);
|
||||
set_irq_chained_handler(IRQ_WDT, s3c_irq_demux_wdtac97);
|
||||
|
||||
for (irqno = IRQ_S3C2443_WDT; irqno <= IRQ_S3C2443_AC97; irqno++) {
|
||||
set_irq_chip(irqno, &s3c_irq_wdtac97);
|
||||
set_irq_handler(irqno, handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver s3c2443_irq_driver = {
|
||||
.add = s3c2443_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2443_irq_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2443_sysclass, &s3c2443_irq_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2443_irq_init);
|
||||
|
87
arch/arm/mach-s3c2443/s3c2443.c
Normal file
87
arch/arm/mach-s3c2443/s3c2443.c
Normal file
|
@ -0,0 +1,87 @@
|
|||
/* linux/arch/arm/mach-s3c2443/s3c2443.c
|
||||
*
|
||||
* Copyright (c) 2007 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Samsung S3C2443 Mobile CPU 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.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/arch/regs-serial.h>
|
||||
|
||||
#include <asm/plat-s3c24xx/s3c2443.h>
|
||||
#include <asm/plat-s3c24xx/devs.h>
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
|
||||
static struct map_desc s3c2443_iodesc[] __initdata = {
|
||||
IODESC_ENT(WATCHDOG),
|
||||
IODESC_ENT(CLKPWR),
|
||||
IODESC_ENT(TIMER),
|
||||
};
|
||||
|
||||
struct sysdev_class s3c2443_sysclass = {
|
||||
set_kset_name("s3c2443-core"),
|
||||
};
|
||||
|
||||
static struct sys_device s3c2443_sysdev = {
|
||||
.cls = &s3c2443_sysclass,
|
||||
};
|
||||
|
||||
int __init s3c2443_init(void)
|
||||
{
|
||||
printk("S3C2443: Initialising architecture\n");
|
||||
|
||||
return sysdev_register(&s3c2443_sysdev);
|
||||
}
|
||||
|
||||
void __init s3c2443_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
||||
{
|
||||
s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
|
||||
}
|
||||
|
||||
/* s3c2443_map_io
|
||||
*
|
||||
* register the standard cpu IO areas, and any passed in from the
|
||||
* machine specific initialisation.
|
||||
*/
|
||||
|
||||
void __init s3c2443_map_io(struct map_desc *mach_desc, int mach_size)
|
||||
{
|
||||
iotable_init(s3c2443_iodesc, ARRAY_SIZE(s3c2443_iodesc));
|
||||
iotable_init(mach_desc, mach_size);
|
||||
}
|
||||
|
||||
/* need to register class before we actually register the device, and
|
||||
* we also need to ensure that it has been initialised before any of the
|
||||
* drivers even try to use it (even if not on an s3c2443 based system)
|
||||
* as a driver which may support both 2443 and 2440 may try and use it.
|
||||
*/
|
||||
|
||||
static int __init s3c2443_core_init(void)
|
||||
{
|
||||
return sysdev_class_register(&s3c2443_sysclass);
|
||||
}
|
||||
|
||||
core_initcall(s3c2443_core_init);
|
|
@ -49,6 +49,7 @@
|
|||
#include "s3c244x.h"
|
||||
#include <asm/plat-s3c24xx/s3c2440.h>
|
||||
#include <asm/plat-s3c24xx/s3c2442.h>
|
||||
#include <asm/plat-s3c24xx/s3c2443.h>
|
||||
|
||||
struct cpu_table {
|
||||
unsigned long idcode;
|
||||
|
@ -67,6 +68,7 @@ static const char name_s3c2410[] = "S3C2410";
|
|||
static const char name_s3c2412[] = "S3C2412";
|
||||
static const char name_s3c2440[] = "S3C2440";
|
||||
static const char name_s3c2442[] = "S3C2442";
|
||||
static const char name_s3c2443[] = "S3C2443";
|
||||
static const char name_s3c2410a[] = "S3C2410A";
|
||||
static const char name_s3c2440a[] = "S3C2440A";
|
||||
|
||||
|
@ -134,6 +136,15 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||
.init = s3c2412_init,
|
||||
.name = name_s3c2412,
|
||||
},
|
||||
{
|
||||
.idcode = 0x32443001,
|
||||
.idmask = 0xffffffff,
|
||||
.map_io = s3c2443_map_io,
|
||||
.init_clocks = s3c2443_init_clocks,
|
||||
.init_uarts = s3c2443_init_uarts,
|
||||
.init = s3c2443_init,
|
||||
.name = name_s3c2443,
|
||||
},
|
||||
{
|
||||
.idcode = 0x0, /* S3C2400 doesn't have an idcode */
|
||||
.idmask = 0xffffffff,
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Copyright (c) 2004-2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Samsung S3C2440 and S3C2442 Mobile CPU support
|
||||
* Samsung S3C2440 and S3C2442 Mobile CPU support (not S3C2443)
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -67,3 +67,4 @@ extern struct sysdev_class s3c2410_sysclass;
|
|||
extern struct sysdev_class s3c2412_sysclass;
|
||||
extern struct sysdev_class s3c2440_sysclass;
|
||||
extern struct sysdev_class s3c2442_sysclass;
|
||||
extern struct sysdev_class s3c2443_sysclass;
|
||||
|
|
32
include/asm-arm/plat-s3c24xx/s3c2443.h
Normal file
32
include/asm-arm/plat-s3c24xx/s3c2443.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* linux/include/asm-arm/plat-s3c24xx/s3c2443.h
|
||||
*
|
||||
* Copyright (c) 2004-2005 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Header file for s3c2443 cpu 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.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2443
|
||||
|
||||
struct s3c2410_uartcfg;
|
||||
|
||||
extern int s3c2443_init(void);
|
||||
|
||||
extern void s3c2443_map_io(struct map_desc *mach_desc, int size);
|
||||
|
||||
extern void s3c2443_init_uarts(struct s3c2410_uartcfg *cfg, int no);
|
||||
|
||||
extern void s3c2443_init_clocks(int xtal);
|
||||
|
||||
extern int s3c2443_baseclk_add(void);
|
||||
|
||||
#else
|
||||
#define s3c2443_init_clocks NULL
|
||||
#define s3c2443_init_uarts NULL
|
||||
#define s3c2443_map_io NULL
|
||||
#define s3c2443_init NULL
|
||||
#endif
|
Loading…
Reference in a new issue