Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm: (117 commits) [ARM] 4058/2: iop32x: set ->broken_parity_status on n2100 onboard r8169 ports [ARM] 4140/1: AACI stability add ac97 timeout and retries [ARM] 4139/1: AACI record support [ARM] 4138/1: AACI: multiple channel support for IRQ handling [ARM] 4211/1: Provide a defconfig for ns9xxx [ARM] 4210/1: base for new machine type "NetSilicon NS9360" [ARM] 4222/1: S3C2443: Remove reference to missing S3C2443_PM [ARM] 4221/1: S3C2443: DMA support [ARM] 4220/1: S3C24XX: DMA system initialised from sysdev [ARM] 4219/1: S3C2443: DMA source definitions [ARM] 4218/1: S3C2412: fix CONFIG_CPU_S3C2412_ONLY wrt to S3C2443 [ARM] 4217/1: S3C24XX: remove the dma channel show at startup [ARM] 4090/2: avoid clash between PXA and SA1111 defines [ARM] 4216/1: add .gitignore entries for ARM specific files [ARM] 4214/2: S3C2410: Add Armzone QT2410 [ARM] 4215/1: s3c2410 usb device: per-platform vbus_draw [ARM] 4213/1: S3C2410 - Update definition of ADCTSC_XY_PST [ARM] 4098/1: ARM: rtc_lock only used with rtc_cmos [ARM] 4137/1: Add kexec support [ARM] 4201/1: SMP barriers pair needed for the secondary boot process ... Fix up conflict due to typedef removal in sound/arm/aaci.h
This commit is contained in:
commit
59b8175c77
320 changed files with 16219 additions and 5786 deletions
46
Documentation/arm/Samsung-S3C24XX/DMA.txt
Normal file
46
Documentation/arm/Samsung-S3C24XX/DMA.txt
Normal file
|
@ -0,0 +1,46 @@
|
|||
S3C2410 DMA
|
||||
===========
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
The kernel provides an interface to manage DMA transfers
|
||||
using the DMA channels in the cpu, so that the central
|
||||
duty of managing channel mappings, and programming the
|
||||
channel generators is in one place.
|
||||
|
||||
|
||||
DMA Channel Ordering
|
||||
--------------------
|
||||
|
||||
Many of the range do not have connections for the DMA
|
||||
channels to all sources, which means that some devices
|
||||
have a restricted number of channels that can be used.
|
||||
|
||||
To allow flexibilty for each cpu type and board, the
|
||||
dma code can be given an dma ordering structure which
|
||||
allows the order of channel search to be specified, as
|
||||
well as allowing the prohibition of certain claims.
|
||||
|
||||
struct s3c24xx_dma_order has a list of channels, and
|
||||
each channel within has a slot for a list of dma
|
||||
channel numbers. The slots are searched in order, for
|
||||
the presence of a dma channel number with DMA_CH_VALID
|
||||
orred in.
|
||||
|
||||
If the order has the flag DMA_CH_NEVER set, then after
|
||||
checking the channel list, the system will return no
|
||||
found channel, thus denying the request.
|
||||
|
||||
A board support file can call s3c24xx_dma_order_set()
|
||||
to register an complete ordering set. The routine will
|
||||
copy the data, so the original can be discared with
|
||||
__initdata.
|
||||
|
||||
|
||||
Authour
|
||||
-------
|
||||
|
||||
Ben Dooks,
|
||||
Copyright (c) 2007 Ben Dooks, Simtec Electronics
|
||||
Licensed under the GPL v2
|
|
@ -8,13 +8,10 @@ Introduction
|
|||
|
||||
The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported
|
||||
by the 's3c2410' architecture of ARM Linux. Currently the S3C2410,
|
||||
S3C2440 and S3C2442 devices are supported.
|
||||
S3C2412, S3C2413, S3C2440 and S3C2442 devices are supported.
|
||||
|
||||
Support for the S3C2400 series is in progress.
|
||||
|
||||
Support for the S3C2412 and S3C2413 CPUs is being merged.
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
|
@ -26,6 +23,22 @@ Configuration
|
|||
please check the machine specific documentation.
|
||||
|
||||
|
||||
Layout
|
||||
------
|
||||
|
||||
The core support files are located in the platform code contained in
|
||||
arch/arm/plat-s3c24xx with headers in include/asm-arm/plat-s3c24xx.
|
||||
This directory should be kept to items shared between the platform
|
||||
code (arch/arm/plat-s3c24xx) and the arch/arm/mach-s3c24* code.
|
||||
|
||||
Each cpu has a directory with the support files for it, and the
|
||||
machines that carry the device. For example S3C2410 is contained
|
||||
in arch/arm/mach-s3c2410 and S3C2440 in arch/arm/mach-s3c2440
|
||||
|
||||
Register, kernel and platform data definitions are held in the
|
||||
include/asm-arm/arch-s3c2410 directory.
|
||||
|
||||
|
||||
Machines
|
||||
--------
|
||||
|
||||
|
|
|
@ -245,6 +245,8 @@ config ARCH_IOP33X
|
|||
|
||||
config ARCH_IOP13XX
|
||||
bool "IOP13xx-based"
|
||||
depends on MMU
|
||||
select PLAT_IOP
|
||||
select PCI
|
||||
help
|
||||
Support for Intel's IOP13XX (XScale) family of processors.
|
||||
|
@ -283,6 +285,14 @@ config ARCH_L7200
|
|||
If you have any questions or comments about the Linux kernel port
|
||||
to this board, send e-mail to <sjhill@cotw.com>.
|
||||
|
||||
config ARCH_NS9XXX
|
||||
bool "NetSilicon NS9xxx"
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a NetSilicon NS9xxx
|
||||
System.
|
||||
|
||||
<http://www.digi.com/products/microprocessors/index.jsp>
|
||||
|
||||
config ARCH_PNX4008
|
||||
bool "Philips Nexperia PNX4008 Mobile"
|
||||
help
|
||||
|
@ -292,6 +302,7 @@ config ARCH_PXA
|
|||
bool "PXA2xx-based"
|
||||
depends on MMU
|
||||
select ARCH_MTD_XIP
|
||||
select GENERIC_TIME
|
||||
help
|
||||
Support for Intel's PXA2XX processor line.
|
||||
|
||||
|
@ -316,7 +327,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
|
||||
|
@ -376,7 +387,16 @@ source "arch/arm/mach-omap1/Kconfig"
|
|||
|
||||
source "arch/arm/mach-omap2/Kconfig"
|
||||
|
||||
source "arch/arm/plat-s3c24xx/Kconfig"
|
||||
|
||||
if ARCH_S3C2410
|
||||
source "arch/arm/mach-s3c2400/Kconfig"
|
||||
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"
|
||||
|
||||
|
@ -390,10 +410,12 @@ source "arch/arm/mach-aaec2000/Kconfig"
|
|||
|
||||
source "arch/arm/mach-realview/Kconfig"
|
||||
|
||||
source "arch/arm/mach-at91rm9200/Kconfig"
|
||||
source "arch/arm/mach-at91/Kconfig"
|
||||
|
||||
source "arch/arm/mach-netx/Kconfig"
|
||||
|
||||
source "arch/arm/mach-ns9xxx/Kconfig"
|
||||
|
||||
# Definitions to make life easier
|
||||
config ARCH_ACORN
|
||||
bool
|
||||
|
@ -751,6 +773,20 @@ config XIP_PHYS_ADDR
|
|||
be linked for and stored to. This address is dependent on your
|
||||
own flash usage.
|
||||
|
||||
config KEXEC
|
||||
bool "Kexec system call (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
but it is indepedent of the system firmware. And like a reboot
|
||||
you can start any kernel with it, not just Linux.
|
||||
|
||||
It is an ongoing process to be certain the hardware in a machine
|
||||
is properly shutdown, so do not be surprised if this code does not
|
||||
initially work for you. It may help to enable device hotplugging
|
||||
support.
|
||||
|
||||
endmenu
|
||||
|
||||
if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX )
|
||||
|
|
|
@ -124,10 +124,12 @@ endif
|
|||
machine-$(CONFIG_ARCH_H720X) := h720x
|
||||
machine-$(CONFIG_ARCH_AAEC2000) := aaec2000
|
||||
machine-$(CONFIG_ARCH_REALVIEW) := realview
|
||||
machine-$(CONFIG_ARCH_AT91) := at91rm9200
|
||||
machine-$(CONFIG_ARCH_EP93XX) := ep93xx
|
||||
machine-$(CONFIG_ARCH_PNX4008) := pnx4008
|
||||
machine-$(CONFIG_ARCH_NETX) := netx
|
||||
machine-$(CONFIG_ARCH_AT91) := at91rm9200
|
||||
machine-$(CONFIG_ARCH_EP93XX) := ep93xx
|
||||
machine-$(CONFIG_ARCH_PNX4008) := pnx4008
|
||||
machine-$(CONFIG_ARCH_NETX) := netx
|
||||
machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
|
||||
textofs-$(CONFIG_ARCH_NS9XXX) := 0x00108000
|
||||
|
||||
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
||||
# This is what happens if you forget the IOCS16 line.
|
||||
|
@ -149,7 +151,7 @@ MACHINE := arch/arm/mach-$(machine-y)/
|
|||
else
|
||||
MACHINE :=
|
||||
endif
|
||||
|
||||
|
||||
export TEXT_OFFSET GZFLAGS MMUEXT
|
||||
|
||||
# Do we have FASTFPE?
|
||||
|
@ -161,6 +163,11 @@ endif
|
|||
# If we have a machine-specific directory, then include it in the build.
|
||||
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
|
||||
core-y += $(MACHINE)
|
||||
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/
|
||||
|
@ -168,6 +175,7 @@ core-$(CONFIG_VFP) += arch/arm/vfp/
|
|||
# If we have a common platform directory, then include it in the build.
|
||||
core-$(CONFIG_PLAT_IOP) += arch/arm/plat-iop/
|
||||
core-$(CONFIG_ARCH_OMAP) += arch/arm/plat-omap/
|
||||
core-$(CONFIG_PLAT_S3C24XX) += arch/arm/plat-s3c24xx/
|
||||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/
|
||||
drivers-$(CONFIG_ARCH_CLPS7500) += drivers/acorn/char/
|
||||
|
|
2
arch/arm/boot/.gitignore
vendored
Normal file
2
arch/arm/boot/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
Image
|
||||
zImage
|
1
arch/arm/boot/compressed/.gitignore
vendored
Normal file
1
arch/arm/boot/compressed/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
piggy.gz
|
|
@ -32,7 +32,6 @@
|
|||
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#undef DEBUG
|
||||
#undef STATS
|
||||
|
||||
#ifdef STATS
|
||||
|
@ -66,14 +65,13 @@ struct dmabounce_pool {
|
|||
};
|
||||
|
||||
struct dmabounce_device_info {
|
||||
struct list_head node;
|
||||
|
||||
struct device *dev;
|
||||
struct list_head safe_buffers;
|
||||
#ifdef STATS
|
||||
unsigned long total_allocs;
|
||||
unsigned long map_op_count;
|
||||
unsigned long bounce_count;
|
||||
int attr_res;
|
||||
#endif
|
||||
struct dmabounce_pool small;
|
||||
struct dmabounce_pool large;
|
||||
|
@ -81,34 +79,24 @@ struct dmabounce_device_info {
|
|||
rwlock_t lock;
|
||||
};
|
||||
|
||||
static LIST_HEAD(dmabounce_devs);
|
||||
|
||||
#ifdef STATS
|
||||
static void print_alloc_stats(struct dmabounce_device_info *device_info)
|
||||
static ssize_t dmabounce_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
printk(KERN_INFO
|
||||
"%s: dmabounce: sbp: %lu, lbp: %lu, other: %lu, total: %lu\n",
|
||||
device_info->dev->bus_id,
|
||||
device_info->small.allocs, device_info->large.allocs,
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
return sprintf(buf, "%lu %lu %lu %lu %lu %lu\n",
|
||||
device_info->small.allocs,
|
||||
device_info->large.allocs,
|
||||
device_info->total_allocs - device_info->small.allocs -
|
||||
device_info->large.allocs,
|
||||
device_info->total_allocs);
|
||||
device_info->total_allocs,
|
||||
device_info->map_op_count,
|
||||
device_info->bounce_count);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(dmabounce_stats, 0400, dmabounce_show, NULL);
|
||||
#endif
|
||||
|
||||
/* find the given device in the dmabounce device list */
|
||||
static inline struct dmabounce_device_info *
|
||||
find_dmabounce_dev(struct device *dev)
|
||||
{
|
||||
struct dmabounce_device_info *d;
|
||||
|
||||
list_for_each_entry(d, &dmabounce_devs, node)
|
||||
if (d->dev == dev)
|
||||
return d;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* allocate a 'safe' buffer and keep track of it */
|
||||
static inline struct safe_buffer *
|
||||
|
@ -162,8 +150,6 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
|
|||
if (pool)
|
||||
pool->allocs++;
|
||||
device_info->total_allocs++;
|
||||
if (device_info->total_allocs % 1000 == 0)
|
||||
print_alloc_stats(device_info);
|
||||
#endif
|
||||
|
||||
write_lock_irqsave(&device_info->lock, flags);
|
||||
|
@ -218,20 +204,11 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *
|
|||
|
||||
/* ************************************************** */
|
||||
|
||||
#ifdef STATS
|
||||
static void print_map_stats(struct dmabounce_device_info *device_info)
|
||||
{
|
||||
dev_info(device_info->dev,
|
||||
"dmabounce: map_op_count=%lu, bounce_count=%lu\n",
|
||||
device_info->map_op_count, device_info->bounce_count);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline dma_addr_t
|
||||
map_single(struct device *dev, void *ptr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
dma_addr_t dma_addr;
|
||||
int needs_bounce = 0;
|
||||
|
||||
|
@ -281,10 +258,14 @@ map_single(struct device *dev, void *ptr, size_t size,
|
|||
ptr = buf->safe;
|
||||
|
||||
dma_addr = buf->safe_dma_addr;
|
||||
} else {
|
||||
/*
|
||||
* We don't need to sync the DMA buffer since
|
||||
* it was allocated via the coherent allocators.
|
||||
*/
|
||||
consistent_sync(ptr, size, dir);
|
||||
}
|
||||
|
||||
consistent_sync(ptr, size, dir);
|
||||
|
||||
return dma_addr;
|
||||
}
|
||||
|
||||
|
@ -292,7 +273,7 @@ static inline void
|
|||
unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
struct safe_buffer *buf = NULL;
|
||||
|
||||
/*
|
||||
|
@ -317,12 +298,12 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
|||
DO_STATS ( device_info->bounce_count++ );
|
||||
|
||||
if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
|
||||
unsigned long ptr;
|
||||
void *ptr = buf->ptr;
|
||||
|
||||
dev_dbg(dev,
|
||||
"%s: copy back safe %p to unsafe %p size %d\n",
|
||||
__func__, buf->safe, buf->ptr, size);
|
||||
memcpy(buf->ptr, buf->safe, size);
|
||||
__func__, buf->safe, ptr, size);
|
||||
memcpy(ptr, buf->safe, size);
|
||||
|
||||
/*
|
||||
* DMA buffers must have the same cache properties
|
||||
|
@ -332,8 +313,8 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
|||
* bidirectional case because we know the cache
|
||||
* lines will be coherent with the data written.
|
||||
*/
|
||||
ptr = (unsigned long)buf->ptr;
|
||||
dmac_clean_range(ptr, ptr + size);
|
||||
outer_clean_range(__pa(ptr), __pa(ptr) + size);
|
||||
}
|
||||
free_safe_buffer(device_info, buf);
|
||||
}
|
||||
|
@ -343,7 +324,7 @@ static inline void
|
|||
sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
struct safe_buffer *buf = NULL;
|
||||
|
||||
if (device_info)
|
||||
|
@ -397,7 +378,10 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
|||
default:
|
||||
BUG();
|
||||
}
|
||||
consistent_sync(buf->safe, size, dir);
|
||||
/*
|
||||
* No need to sync the safe buffer - it was allocated
|
||||
* via the coherent allocators.
|
||||
*/
|
||||
} else {
|
||||
consistent_sync(dma_to_virt(dev, dma_addr), size, dir);
|
||||
}
|
||||
|
@ -604,9 +588,10 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
|||
device_info->total_allocs = 0;
|
||||
device_info->map_op_count = 0;
|
||||
device_info->bounce_count = 0;
|
||||
device_info->attr_res = device_create_file(dev, &dev_attr_dmabounce_stats);
|
||||
#endif
|
||||
|
||||
list_add(&device_info->node, &dmabounce_devs);
|
||||
dev->archdata.dmabounce = device_info;
|
||||
|
||||
printk(KERN_INFO "dmabounce: registered device %s on %s bus\n",
|
||||
dev->bus_id, dev->bus->name);
|
||||
|
@ -623,7 +608,9 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
|||
void
|
||||
dmabounce_unregister_dev(struct device *dev)
|
||||
{
|
||||
struct dmabounce_device_info *device_info = find_dmabounce_dev(dev);
|
||||
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
|
||||
|
||||
dev->archdata.dmabounce = NULL;
|
||||
|
||||
if (!device_info) {
|
||||
printk(KERN_WARNING
|
||||
|
@ -645,12 +632,10 @@ dmabounce_unregister_dev(struct device *dev)
|
|||
dma_pool_destroy(device_info->large.pool);
|
||||
|
||||
#ifdef STATS
|
||||
print_alloc_stats(device_info);
|
||||
print_map_stats(device_info);
|
||||
if (device_info->attr_res == 0)
|
||||
device_remove_file(dev, &dev_attr_dmabounce_stats);
|
||||
#endif
|
||||
|
||||
list_del(&device_info->node);
|
||||
|
||||
kfree(device_info);
|
||||
|
||||
printk(KERN_INFO "dmabounce: device %s on %s bus unregistered\n",
|
||||
|
|
|
@ -14,7 +14,9 @@
|
|||
*
|
||||
* o There is one CPU Interface per CPU, which sends interrupts sent
|
||||
* by the Distributor, and interrupts generated locally, to the
|
||||
* associated CPU.
|
||||
* associated CPU. The base address of the CPU interface is usually
|
||||
* aliased so that the same address points to different chips depending
|
||||
* on the CPU it is accessed from.
|
||||
*
|
||||
* Note that IRQs 0-31 are special - they are local to each CPU.
|
||||
* As such, the enable set/clear, pending set/clear and active bit
|
||||
|
@ -31,10 +33,38 @@
|
|||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
static void __iomem *gic_dist_base;
|
||||
static void __iomem *gic_cpu_base;
|
||||
static DEFINE_SPINLOCK(irq_controller_lock);
|
||||
|
||||
struct gic_chip_data {
|
||||
unsigned int irq_offset;
|
||||
void __iomem *dist_base;
|
||||
void __iomem *cpu_base;
|
||||
};
|
||||
|
||||
#ifndef MAX_GIC_NR
|
||||
#define MAX_GIC_NR 1
|
||||
#endif
|
||||
|
||||
static struct gic_chip_data gic_data[MAX_GIC_NR];
|
||||
|
||||
static inline void __iomem *gic_dist_base(unsigned int irq)
|
||||
{
|
||||
struct gic_chip_data *gic_data = get_irq_chip_data(irq);
|
||||
return gic_data->dist_base;
|
||||
}
|
||||
|
||||
static inline void __iomem *gic_cpu_base(unsigned int irq)
|
||||
{
|
||||
struct gic_chip_data *gic_data = get_irq_chip_data(irq);
|
||||
return gic_data->cpu_base;
|
||||
}
|
||||
|
||||
static inline unsigned int gic_irq(unsigned int irq)
|
||||
{
|
||||
struct gic_chip_data *gic_data = get_irq_chip_data(irq);
|
||||
return irq - gic_data->irq_offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* Routines to acknowledge, disable and enable interrupts
|
||||
*
|
||||
|
@ -55,8 +85,8 @@ static void gic_ack_irq(unsigned int irq)
|
|||
u32 mask = 1 << (irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4);
|
||||
writel(irq, gic_cpu_base + GIC_CPU_EOI);
|
||||
writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_CLEAR + (gic_irq(irq) / 32) * 4);
|
||||
writel(gic_irq(irq), gic_cpu_base(irq) + GIC_CPU_EOI);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
|
@ -65,7 +95,7 @@ static void gic_mask_irq(unsigned int irq)
|
|||
u32 mask = 1 << (irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4);
|
||||
writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_CLEAR + (gic_irq(irq) / 32) * 4);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
|
@ -74,14 +104,14 @@ static void gic_unmask_irq(unsigned int irq)
|
|||
u32 mask = 1 << (irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_SET + (irq / 32) * 4);
|
||||
writel(mask, gic_dist_base(irq) + GIC_DIST_ENABLE_SET + (gic_irq(irq) / 32) * 4);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
|
||||
{
|
||||
void __iomem *reg = gic_dist_base + GIC_DIST_TARGET + (irq & ~3);
|
||||
void __iomem *reg = gic_dist_base(irq) + GIC_DIST_TARGET + (gic_irq(irq) & ~3);
|
||||
unsigned int shift = (irq % 4) * 8;
|
||||
unsigned int cpu = first_cpu(mask_val);
|
||||
u32 val;
|
||||
|
@ -95,6 +125,37 @@ static void gic_set_cpu(unsigned int irq, cpumask_t mask_val)
|
|||
}
|
||||
#endif
|
||||
|
||||
static void fastcall gic_handle_cascade_irq(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
struct gic_chip_data *chip_data = get_irq_data(irq);
|
||||
struct irq_chip *chip = get_irq_chip(irq);
|
||||
unsigned int cascade_irq;
|
||||
unsigned long status;
|
||||
|
||||
/* primary controller ack'ing */
|
||||
chip->ack(irq);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
status = readl(chip_data->cpu_base + GIC_CPU_INTACK);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
|
||||
cascade_irq = (status & 0x3ff);
|
||||
if (cascade_irq > 1020)
|
||||
goto out;
|
||||
if (cascade_irq < 32 || cascade_irq >= NR_IRQS) {
|
||||
do_bad_IRQ(cascade_irq, desc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
cascade_irq += chip_data->irq_offset;
|
||||
generic_handle_irq(cascade_irq);
|
||||
|
||||
out:
|
||||
/* primary controller unmasking */
|
||||
chip->unmask(irq);
|
||||
}
|
||||
|
||||
static struct irq_chip gic_chip = {
|
||||
.name = "GIC",
|
||||
.ack = gic_ack_irq,
|
||||
|
@ -105,15 +166,29 @@ static struct irq_chip gic_chip = {
|
|||
#endif
|
||||
};
|
||||
|
||||
void __init gic_dist_init(void __iomem *base)
|
||||
void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
|
||||
{
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
if (set_irq_data(irq, &gic_data[gic_nr]) != 0)
|
||||
BUG();
|
||||
set_irq_chained_handler(irq, gic_handle_cascade_irq);
|
||||
}
|
||||
|
||||
void __init gic_dist_init(unsigned int gic_nr, void __iomem *base,
|
||||
unsigned int irq_start)
|
||||
{
|
||||
unsigned int max_irq, i;
|
||||
u32 cpumask = 1 << smp_processor_id();
|
||||
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
|
||||
cpumask |= cpumask << 8;
|
||||
cpumask |= cpumask << 16;
|
||||
|
||||
gic_dist_base = base;
|
||||
gic_data[gic_nr].dist_base = base;
|
||||
gic_data[gic_nr].irq_offset = (irq_start - 1) & ~31;
|
||||
|
||||
writel(0, base + GIC_DIST_CTRL);
|
||||
|
||||
|
@ -158,8 +233,9 @@ void __init gic_dist_init(void __iomem *base)
|
|||
/*
|
||||
* Setup the Linux IRQ subsystem.
|
||||
*/
|
||||
for (i = 29; i < max_irq; i++) {
|
||||
for (i = irq_start; i < gic_data[gic_nr].irq_offset + max_irq; i++) {
|
||||
set_irq_chip(i, &gic_chip);
|
||||
set_irq_chip_data(i, &gic_data[gic_nr]);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
|
||||
}
|
||||
|
@ -167,9 +243,13 @@ void __init gic_dist_init(void __iomem *base)
|
|||
writel(1, base + GIC_DIST_CTRL);
|
||||
}
|
||||
|
||||
void __cpuinit gic_cpu_init(void __iomem *base)
|
||||
void __cpuinit gic_cpu_init(unsigned int gic_nr, void __iomem *base)
|
||||
{
|
||||
gic_cpu_base = base;
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
|
||||
gic_data[gic_nr].cpu_base = base;
|
||||
|
||||
writel(0xf0, base + GIC_CPU_PRIMASK);
|
||||
writel(1, base + GIC_CPU_CTRL);
|
||||
}
|
||||
|
@ -179,6 +259,7 @@ void gic_raise_softirq(cpumask_t cpumask, unsigned int irq)
|
|||
{
|
||||
unsigned long map = *cpus_addr(cpumask);
|
||||
|
||||
writel(map << 16 | irq, gic_dist_base + GIC_DIST_SOFTINT);
|
||||
/* this always happens on GIC0 */
|
||||
writel(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
|
||||
}
|
||||
#endif
|
||||
|
|
1184
arch/arm/configs/at91sam9263ek_defconfig
Normal file
1184
arch/arm/configs/at91sam9263ek_defconfig
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1066,7 +1066,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||
# CONFIG_RTC_DRV_RS5C372 is not set
|
||||
# CONFIG_RTC_DRV_M48T86 is not set
|
||||
CONFIG_RTC_DRV_AT91=y
|
||||
CONFIG_RTC_DRV_AT91RM9200=y
|
||||
# CONFIG_RTC_DRV_TEST is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -355,10 +355,12 @@ CONFIG_MTD_CFI_UTIL=y
|
|||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_PHYSMAP_START=0
|
||||
CONFIG_MTD_PHYSMAP_LEN=0
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=0
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
CONFIG_MTD_CSB337=y
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -986,7 +988,7 @@ CONFIG_RTC_DRV_DS1307=y
|
|||
# CONFIG_RTC_DRV_PCF8583 is not set
|
||||
# CONFIG_RTC_DRV_RS5C372 is not set
|
||||
# CONFIG_RTC_DRV_M48T86 is not set
|
||||
CONFIG_RTC_DRV_AT91=y
|
||||
CONFIG_RTC_DRV_AT91RM9200=y
|
||||
# CONFIG_RTC_DRV_TEST is not set
|
||||
# CONFIG_RTC_DRV_V3020 is not set
|
||||
|
||||
|
|
|
@ -355,10 +355,12 @@ CONFIG_MTD_CFI_UTIL=y
|
|||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_PHYSMAP_START=0
|
||||
CONFIG_MTD_PHYSMAP_LEN=0
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=0
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
CONFIG_MTD_CSB637=y
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
|
|
@ -718,7 +718,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||
# CONFIG_RTC_DRV_RS5C372 is not set
|
||||
# CONFIG_RTC_DRV_M48T86 is not set
|
||||
CONFIG_RTC_DRV_AT91=y
|
||||
CONFIG_RTC_DRV_AT91RM9200=y
|
||||
# CONFIG_RTC_DRV_TEST is not set
|
||||
|
||||
#
|
||||
|
|
621
arch/arm/configs/ns9xxx_defconfig
Normal file
621
arch/arm/configs/ns9xxx_defconfig
Normal file
|
@ -0,0 +1,621 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.20
|
||||
# Thu Feb 15 20:51:47 2007
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
# CONFIG_GENERIC_TIME is not set
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_IPC_NS is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_UTS_NS is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
# CONFIG_IOSCHED_AS is not set
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
# CONFIG_DEFAULT_AS is not set
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
CONFIG_DEFAULT_NOOP=y
|
||||
CONFIG_DEFAULT_IOSCHED="noop"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_AT91 is not set
|
||||
# CONFIG_ARCH_CLPS7500 is not set
|
||||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_EP93XX is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_NETX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_IOP32X is not set
|
||||
# CONFIG_ARCH_IOP33X is not set
|
||||
# CONFIG_ARCH_IOP13XX is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_IXP23XX is not set
|
||||
# CONFIG_ARCH_L7200 is not set
|
||||
CONFIG_ARCH_NS9XXX=y
|
||||
# CONFIG_ARCH_PNX4008 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
# CONFIG_ARCH_SA1100 is not set
|
||||
# CONFIG_ARCH_S3C2410 is not set
|
||||
# CONFIG_ARCH_SHARK is not set
|
||||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
|
||||
#
|
||||
# NS9xxx Implementations
|
||||
#
|
||||
CONFIG_MACH_CC9P9360DEV=y
|
||||
CONFIG_PROCESSOR_NS9360=y
|
||||
CONFIG_BOARD_A9M9750DEV=y
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
#
|
||||
CONFIG_CPU_32=y
|
||||
CONFIG_CPU_ARM926T=y
|
||||
CONFIG_CPU_32v5=y
|
||||
CONFIG_CPU_ABRT_EV5TJ=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_COPY_V4WB=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
#
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||
|
||||
#
|
||||
# Bus support
|
||||
#
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
CONFIG_HZ=100
|
||||
# CONFIG_AEABI is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE=""
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
# Floating point emulation
|
||||
#
|
||||
|
||||
#
|
||||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
# CONFIG_FPE_NWFPE_XP is not set
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
# CONFIG_VFP is not set
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_AOUT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
# CONFIG_ARTHUR is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
# CONFIG_APM is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
# CONFIG_NET is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
|
||||
#
|
||||
# Serial ATA (prod) and Parallel ATA (experimental) drivers
|
||||
#
|
||||
# CONFIG_ATA is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
# CONFIG_SERIAL_8250_MANY_PORTS is not set
|
||||
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_RSA is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# HID Devices
|
||||
#
|
||||
CONFIG_HID=y
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_ICEDCC=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_IOMAP_COPY=y
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.19-rc4
|
||||
# Fri Nov 3 17:41:31 2006
|
||||
# Linux kernel version: 2.6.20
|
||||
# Thu Feb 15 11:26:24 2007
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
# CONFIG_GENERIC_TIME is not set
|
||||
|
@ -11,6 +11,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
|||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
|
@ -37,13 +39,14 @@ CONFIG_SYSVIPC=y
|
|||
# CONFIG_UTS_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
|
@ -76,7 +79,9 @@ CONFIG_KMOD=y
|
|||
# Block layer
|
||||
#
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -110,6 +115,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
|||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_IOP32X is not set
|
||||
# CONFIG_ARCH_IOP33X is not set
|
||||
# CONFIG_ARCH_IOP13XX is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_IXP23XX is not set
|
||||
|
@ -122,54 +128,73 @@ CONFIG_ARCH_S3C2410=y
|
|||
# CONFIG_ARCH_SHARK is not set
|
||||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
CONFIG_PLAT_S3C24XX=y
|
||||
CONFIG_CPU_S3C244X=y
|
||||
CONFIG_PM_SIMTEC=y
|
||||
# CONFIG_S3C2410_BOOT_WATCHDOG is not set
|
||||
# CONFIG_S3C2410_BOOT_ERROR_RESET is not set
|
||||
# CONFIG_S3C2410_PM_DEBUG is not set
|
||||
# CONFIG_S3C2410_PM_CHECK is not set
|
||||
CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
|
||||
CONFIG_S3C2410_DMA=y
|
||||
# CONFIG_S3C2410_DMA_DEBUG is not set
|
||||
CONFIG_MACH_SMDK=y
|
||||
|
||||
#
|
||||
# S3C24XX Implementations
|
||||
# S3C2400 Machines
|
||||
#
|
||||
CONFIG_CPU_S3C2410=y
|
||||
CONFIG_CPU_S3C2410_DMA=y
|
||||
CONFIG_S3C2410_PM=y
|
||||
CONFIG_S3C2410_GPIO=y
|
||||
CONFIG_S3C2410_CLOCK=y
|
||||
|
||||
#
|
||||
# S3C2410 Machines
|
||||
#
|
||||
CONFIG_ARCH_SMDK2410=y
|
||||
CONFIG_ARCH_H1940=y
|
||||
CONFIG_PM_H1940=y
|
||||
CONFIG_MACH_N30=y
|
||||
CONFIG_ARCH_BAST=y
|
||||
CONFIG_MACH_OTOM=y
|
||||
CONFIG_MACH_AML_M5900=y
|
||||
CONFIG_BAST_PC104_IRQ=y
|
||||
CONFIG_MACH_VR1000=y
|
||||
CONFIG_CPU_S3C2412=y
|
||||
CONFIG_S3C2412_DMA=y
|
||||
CONFIG_S3C2412_PM=y
|
||||
|
||||
#
|
||||
# S3C2412 Machines
|
||||
#
|
||||
CONFIG_MACH_SMDK2413=y
|
||||
CONFIG_MACH_S3C2413=y
|
||||
CONFIG_MACH_VSTMS=y
|
||||
CONFIG_CPU_S3C2440=y
|
||||
CONFIG_S3C2440_DMA=y
|
||||
|
||||
#
|
||||
# S3C2440 Machines
|
||||
#
|
||||
# CONFIG_MACH_AML_M5900 is not set
|
||||
CONFIG_MACH_ANUBIS=y
|
||||
CONFIG_MACH_OSIRIS=y
|
||||
CONFIG_ARCH_BAST=y
|
||||
CONFIG_BAST_PC104_IRQ=y
|
||||
CONFIG_ARCH_H1940=y
|
||||
CONFIG_MACH_N30=y
|
||||
CONFIG_MACH_SMDK=y
|
||||
CONFIG_ARCH_SMDK2410=y
|
||||
CONFIG_ARCH_S3C2440=y
|
||||
CONFIG_SMDK2440_CPU2440=y
|
||||
CONFIG_SMDK2440_CPU2442=y
|
||||
CONFIG_MACH_S3C2413=y
|
||||
CONFIG_MACH_SMDK2413=y
|
||||
CONFIG_MACH_VR1000=y
|
||||
CONFIG_MACH_RX3715=y
|
||||
CONFIG_MACH_OTOM=y
|
||||
CONFIG_ARCH_S3C2440=y
|
||||
CONFIG_MACH_NEXCODER_2440=y
|
||||
CONFIG_MACH_VSTMS=y
|
||||
CONFIG_S3C2410_CLOCK=y
|
||||
CONFIG_S3C2410_PM=y
|
||||
CONFIG_CPU_S3C2410_DMA=y
|
||||
CONFIG_CPU_S3C2410=y
|
||||
CONFIG_S3C2412_PM=y
|
||||
CONFIG_CPU_S3C2412=y
|
||||
CONFIG_CPU_S3C244X=y
|
||||
CONFIG_CPU_S3C2440=y
|
||||
CONFIG_SMDK2440_CPU2440=y
|
||||
CONFIG_CPU_S3C2442=y
|
||||
|
||||
#
|
||||
# S3C2410 Boot
|
||||
# S3C2442 Machines
|
||||
#
|
||||
# CONFIG_S3C2410_BOOT_WATCHDOG is not set
|
||||
# CONFIG_S3C2410_BOOT_ERROR_RESET is not set
|
||||
CONFIG_SMDK2440_CPU2442=y
|
||||
CONFIG_CPU_S3C2443=y
|
||||
|
||||
#
|
||||
# S3C2410 Setup
|
||||
# S3C2443 Machines
|
||||
#
|
||||
CONFIG_S3C2410_DMA=y
|
||||
# CONFIG_S3C2410_DMA_DEBUG is not set
|
||||
# CONFIG_S3C2410_PM_DEBUG is not set
|
||||
# CONFIG_S3C2410_PM_CHECK is not set
|
||||
CONFIG_PM_SIMTEC=y
|
||||
CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
|
||||
CONFIG_MACH_SMDK2443=y
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -196,6 +221,7 @@ CONFIG_CPU_CP15_MMU=y
|
|||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||
# CONFIG_OUTER_CACHE is not set
|
||||
|
||||
#
|
||||
# Bus support
|
||||
|
@ -303,6 +329,7 @@ CONFIG_INET_TCP_DIAG=y
|
|||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
|
@ -385,6 +412,7 @@ CONFIG_MTD_CMDLINE_PARTS=y
|
|||
# User Modules And Translation Layers
|
||||
#
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLKDEVS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
|
@ -530,6 +558,11 @@ CONFIG_BLK_DEV_IDE_BAST=y
|
|||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
|
||||
#
|
||||
# Serial ATA (prod) and Parallel ATA (experimental) drivers
|
||||
#
|
||||
# CONFIG_ATA is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
|
@ -682,7 +715,7 @@ CONFIG_SERIAL_NONSTANDARD=y
|
|||
# CONFIG_DIGIEPCA is not set
|
||||
# CONFIG_MOXA_INTELLIO is not set
|
||||
# CONFIG_MOXA_SMARTIO is not set
|
||||
# CONFIG_ISI is not set
|
||||
# CONFIG_MOXA_SMARTIO_NEW is not set
|
||||
# CONFIG_SYNCLINKMP is not set
|
||||
# CONFIG_N_HDLC is not set
|
||||
# CONFIG_RISCOM8 is not set
|
||||
|
@ -700,13 +733,14 @@ CONFIG_SERIAL_8250_NR_UARTS=8
|
|||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_RSA is not set
|
||||
# CONFIG_SERIAL_8250_FOURPORT is not set
|
||||
# CONFIG_SERIAL_8250_ACCENT is not set
|
||||
# CONFIG_SERIAL_8250_BOCA is not set
|
||||
# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
|
||||
# CONFIG_SERIAL_8250_HUB6 is not set
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_RSA is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
|
@ -755,10 +789,6 @@ CONFIG_HW_RANDOM=y
|
|||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -863,6 +893,7 @@ CONFIG_SENSORS_LM85=m
|
|||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_PC87427 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -870,6 +901,7 @@ CONFIG_SENSORS_LM85=m
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83791D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83793 is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
@ -951,6 +983,11 @@ CONFIG_FONT_8x16=y
|
|||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# HID Devices
|
||||
#
|
||||
CONFIG_HID=y
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
|
@ -1028,6 +1065,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
|||
# CONFIG_USB_KAWETH is not set
|
||||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET_MII is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
CONFIG_USB_MON=y
|
||||
|
||||
|
@ -1179,9 +1217,6 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
CONFIG_JFFS_FS=y
|
||||
CONFIG_JFFS_FS_VERBOSE=0
|
||||
# CONFIG_JFFS_PROC_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
|
@ -1191,7 +1226,7 @@ CONFIG_JFFS2_FS_WRITEBUFFER=y
|
|||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
# CONFIG_JFFS2_RUBIN is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
|
@ -1284,6 +1319,11 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
|
@ -1296,6 +1336,8 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
|
@ -1311,12 +1353,10 @@ CONFIG_DEBUG_MUTEXES=y
|
|||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
|
@ -1339,6 +1379,7 @@ CONFIG_DEBUG_S3C2410_UART=0
|
|||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_BITREVERSE=y
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
|
@ -1346,3 +1387,4 @@ CONFIG_CRC32=y
|
|||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_IOMAP_COPY=y
|
||||
|
|
|
@ -18,6 +18,7 @@ obj-$(CONFIG_ARTHUR) += arthur.o
|
|||
obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
||||
obj-$(CONFIG_PCI) += bios32.o isa.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
|
||||
|
||||
obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
|
||||
|
|
|
@ -356,6 +356,7 @@
|
|||
CALL(sys_move_pages)
|
||||
/* 345 */ CALL(sys_getcpu)
|
||||
CALL(sys_ni_syscall) /* eventually epoll_pwait */
|
||||
CALL(sys_kexec_load)
|
||||
#ifndef syscalls_counted
|
||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||
#define syscalls_counted
|
||||
|
|
|
@ -75,6 +75,7 @@ static struct notifier_block crunch_notifier_block = {
|
|||
static int __init crunch_init(void)
|
||||
{
|
||||
thread_register_notifier(&crunch_notifier_block);
|
||||
elf_hwcap |= HWCAP_CRUNCH;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1009,7 +1009,7 @@ ecard_probe(int slot, card_type_t type)
|
|||
ec->fiqmask = 4;
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(blacklist) / sizeof(*blacklist); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(blacklist); i++)
|
||||
if (blacklist[i].manufacturer == ec->cid.manufacturer &&
|
||||
blacklist[i].product == ec->cid.product) {
|
||||
ec->card_desc = blacklist[i].type;
|
||||
|
|
|
@ -99,7 +99,6 @@ common_invalid:
|
|||
@ cpsr_<exception>, "old_r0"
|
||||
|
||||
mov r0, sp
|
||||
and r2, r6, #0x1f
|
||||
b bad_mode
|
||||
|
||||
/*
|
||||
|
|
78
arch/arm/kernel/machine_kexec.c
Normal file
78
arch/arm/kernel/machine_kexec.c
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* machine_kexec.c - handle transition of Linux booting another kernel
|
||||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
const extern unsigned char relocate_new_kernel[];
|
||||
const extern unsigned int relocate_new_kernel_size;
|
||||
|
||||
extern void setup_mm_for_reboot(char mode);
|
||||
|
||||
extern unsigned long kexec_start_address;
|
||||
extern unsigned long kexec_indirection_page;
|
||||
extern unsigned long kexec_mach_type;
|
||||
|
||||
/*
|
||||
* Provide a dummy crash_notes definition while crash dump arrives to arm.
|
||||
* This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
|
||||
*/
|
||||
|
||||
int machine_kexec_prepare(struct kimage *image)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void machine_kexec_cleanup(struct kimage *image)
|
||||
{
|
||||
}
|
||||
|
||||
void machine_shutdown(void)
|
||||
{
|
||||
}
|
||||
|
||||
void machine_crash_shutdown(struct pt_regs *regs)
|
||||
{
|
||||
}
|
||||
|
||||
void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list;
|
||||
unsigned long reboot_code_buffer_phys;
|
||||
void *reboot_code_buffer;
|
||||
|
||||
|
||||
page_list = image->head & PAGE_MASK;
|
||||
|
||||
/* we need both effective and real address here */
|
||||
reboot_code_buffer_phys =
|
||||
page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
||||
reboot_code_buffer = page_address(image->control_code_page);
|
||||
|
||||
/* Prepare parameters for reboot_code_buffer*/
|
||||
kexec_start_address = image->start;
|
||||
kexec_indirection_page = page_list;
|
||||
kexec_mach_type = machine_arch_type;
|
||||
|
||||
/* copy our kernel relocation code to the control code page */
|
||||
memcpy(reboot_code_buffer,
|
||||
relocate_new_kernel, relocate_new_kernel_size);
|
||||
|
||||
|
||||
flush_icache_range((unsigned long) reboot_code_buffer,
|
||||
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE);
|
||||
printk(KERN_INFO "Bye!\n");
|
||||
|
||||
cpu_proc_fin();
|
||||
setup_mm_for_reboot(0); /* mode is not used, so just pass 0*/
|
||||
cpu_reset(reboot_code_buffer_phys);
|
||||
}
|
|
@ -36,7 +36,13 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
extern const char *processor_modes[];
|
||||
static const char *processor_modes[] = {
|
||||
"USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
|
||||
"UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
|
||||
"USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "UK6_32" , "ABT_32" ,
|
||||
"UK8_32" , "UK9_32" , "UK10_32", "UND_32" , "UK12_32", "UK13_32", "UK14_32", "SYS_32"
|
||||
};
|
||||
|
||||
extern void setup_mm_for_reboot(char mode);
|
||||
|
||||
static volatile int hlt_counter;
|
||||
|
|
74
arch/arm/kernel/relocate_kernel.S
Normal file
74
arch/arm/kernel/relocate_kernel.S
Normal file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* relocate_kernel.S - put the kernel image in place to boot
|
||||
*/
|
||||
|
||||
#include <asm/kexec.h>
|
||||
|
||||
.globl relocate_new_kernel
|
||||
relocate_new_kernel:
|
||||
|
||||
ldr r0,kexec_indirection_page
|
||||
ldr r1,kexec_start_address
|
||||
|
||||
|
||||
0: /* top, read another word for the indirection page */
|
||||
ldr r3, [r0],#4
|
||||
|
||||
/* Is it a destination page. Put destination address to r4 */
|
||||
tst r3,#1,0
|
||||
beq 1f
|
||||
bic r4,r3,#1
|
||||
b 0b
|
||||
1:
|
||||
/* Is it an indirection page */
|
||||
tst r3,#2,0
|
||||
beq 1f
|
||||
bic r0,r3,#2
|
||||
b 0b
|
||||
1:
|
||||
|
||||
/* are we done ? */
|
||||
tst r3,#4,0
|
||||
beq 1f
|
||||
b 2f
|
||||
|
||||
1:
|
||||
/* is it source ? */
|
||||
tst r3,#8,0
|
||||
beq 0b
|
||||
bic r3,r3,#8
|
||||
mov r6,#1024
|
||||
9:
|
||||
ldr r5,[r3],#4
|
||||
str r5,[r4],#4
|
||||
subs r6,r6,#1
|
||||
bne 9b
|
||||
b 0b
|
||||
|
||||
2:
|
||||
/* Jump to relocated kernel */
|
||||
mov lr,r1
|
||||
mov r0,#0
|
||||
ldr r1,kexec_mach_type
|
||||
mov r2,#0
|
||||
mov pc,lr
|
||||
|
||||
.globl kexec_start_address
|
||||
kexec_start_address:
|
||||
.long 0x0
|
||||
|
||||
.globl kexec_indirection_page
|
||||
kexec_indirection_page:
|
||||
.long 0x0
|
||||
|
||||
.globl kexec_mach_type
|
||||
kexec_mach_type:
|
||||
.long 0x0
|
||||
|
||||
relocate_new_kernel_end:
|
||||
|
||||
.globl relocate_new_kernel_size
|
||||
relocate_new_kernel_size:
|
||||
.long relocate_new_kernel_end - relocate_new_kernel
|
||||
|
||||
|
|
@ -88,6 +88,9 @@ struct cpu_user_fns cpu_user;
|
|||
#ifdef MULTI_CACHE
|
||||
struct cpu_cache_fns cpu_cache;
|
||||
#endif
|
||||
#ifdef CONFIG_OUTER_CACHE
|
||||
struct outer_cache_fns outer_cache;
|
||||
#endif
|
||||
|
||||
struct stack {
|
||||
u32 irq[3];
|
||||
|
|
|
@ -40,12 +40,14 @@
|
|||
*/
|
||||
struct sys_timer *system_timer;
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE)
|
||||
/* this needs a better home */
|
||||
DEFINE_SPINLOCK(rtc_lock);
|
||||
|
||||
#ifdef CONFIG_SA1100_RTC_MODULE
|
||||
#ifdef CONFIG_RTC_DRV_CMOS_MODULE
|
||||
EXPORT_SYMBOL(rtc_lock);
|
||||
#endif
|
||||
#endif /* pc-style 'CMOS' RTC support */
|
||||
|
||||
/* change this if you have some constant time drift */
|
||||
#define USECS_PER_JIFFY (1000000/HZ)
|
||||
|
|
|
@ -32,13 +32,6 @@
|
|||
#include "ptrace.h"
|
||||
#include "signal.h"
|
||||
|
||||
const char *processor_modes[]=
|
||||
{ "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" ,
|
||||
"UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26",
|
||||
"USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "UK6_32" , "ABT_32" ,
|
||||
"UK8_32" , "UK9_32" , "UK10_32", "UND_32" , "UK12_32", "UK13_32", "UK14_32", "SYS_32"
|
||||
};
|
||||
|
||||
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
|
||||
|
||||
#ifdef CONFIG_DEBUG_USER
|
||||
|
@ -289,7 +282,10 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
|
|||
regs->ARM_pc -= correction;
|
||||
|
||||
pc = (void __user *)instruction_pointer(regs);
|
||||
if (thumb_mode(regs)) {
|
||||
|
||||
if (processor_mode(regs) == SVC_MODE) {
|
||||
instr = *(u32 *) pc;
|
||||
} else if (thumb_mode(regs)) {
|
||||
get_user(instr, (u16 __user *)pc);
|
||||
} else {
|
||||
get_user(instr, (u32 __user *)pc);
|
||||
|
@ -337,12 +333,11 @@ asmlinkage void do_unexp_fiq (struct pt_regs *regs)
|
|||
* It never returns, and never tries to sync. We hope that we can at least
|
||||
* dump out some state information...
|
||||
*/
|
||||
asmlinkage void bad_mode(struct pt_regs *regs, int reason, int proc_mode)
|
||||
asmlinkage void bad_mode(struct pt_regs *regs, int reason)
|
||||
{
|
||||
console_verbose();
|
||||
|
||||
printk(KERN_CRIT "Bad mode in %s handler detected: mode %s\n",
|
||||
handler[reason], processor_modes[proc_mode]);
|
||||
printk(KERN_CRIT "Bad mode in %s handler detected\n", handler[reason]);
|
||||
|
||||
die("Oops - bad mode", regs, 0);
|
||||
local_irq_disable();
|
||||
|
|
|
@ -9,11 +9,14 @@ config ARCH_AT91RM9200
|
|||
bool "AT91RM9200"
|
||||
|
||||
config ARCH_AT91SAM9260
|
||||
bool "AT91SAM9260"
|
||||
bool "AT91SAM9260 or AT91SAM9XE"
|
||||
|
||||
config ARCH_AT91SAM9261
|
||||
bool "AT91SAM9261"
|
||||
|
||||
config ARCH_AT91SAM9263
|
||||
bool "AT91SAM9263"
|
||||
|
||||
endchoice
|
||||
|
||||
# ----------------------------------------------------------
|
||||
|
@ -90,13 +93,22 @@ endif
|
|||
|
||||
if ARCH_AT91SAM9260
|
||||
|
||||
comment "AT91SAM9260 Board Type"
|
||||
comment "AT91SAM9260 Variants"
|
||||
|
||||
config MACH_AT91SAM9260EK
|
||||
bool "Atmel AT91SAM9260-EK Evaluation Kit"
|
||||
config ARCH_AT91SAM9260_SAM9XE
|
||||
bool "AT91SAM9XE"
|
||||
depends on ARCH_AT91SAM9260
|
||||
help
|
||||
Select this if you are using Atmel's AT91SAM9260-EK Evaluation Kit.
|
||||
Select this if you are using Atmel's AT91SAM9XE System-on-Chip.
|
||||
They are basicaly AT91SAM9260s with various sizes of embedded Flash.
|
||||
|
||||
comment "AT91SAM9260 / AT91SAM9XE Board Type"
|
||||
|
||||
config MACH_AT91SAM9260EK
|
||||
bool "Atmel AT91SAM9260-EK / AT91SAM9XE Evaluation Kit"
|
||||
depends on ARCH_AT91SAM9260
|
||||
help
|
||||
Select this if you are using Atmel's AT91SAM9260-EK or AT91SAM9XE Evaluation Kit
|
||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3933>
|
||||
|
||||
endif
|
||||
|
@ -118,17 +130,32 @@ endif
|
|||
|
||||
# ----------------------------------------------------------
|
||||
|
||||
if ARCH_AT91SAM9263
|
||||
|
||||
comment "AT91SAM9263 Board Type"
|
||||
|
||||
config MACH_AT91SAM9263EK
|
||||
bool "Atmel AT91SAM9263-EK Evaluation Kit"
|
||||
depends on ARCH_AT91SAM9263
|
||||
help
|
||||
Select this if you are using Atmel's AT91SAM9263-EK Evaluation Kit.
|
||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4057>
|
||||
|
||||
endif
|
||||
|
||||
# ----------------------------------------------------------
|
||||
|
||||
comment "AT91 Board Options"
|
||||
|
||||
config MTD_AT91_DATAFLASH_CARD
|
||||
bool "Enable DataFlash Card support"
|
||||
depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK)
|
||||
depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK)
|
||||
help
|
||||
Enable support for the DataFlash card.
|
||||
|
||||
config MTD_NAND_AT91_BUSWIDTH_16
|
||||
bool "Enable 16-bit data bus interface to NAND flash"
|
||||
depends on (MACH_AT91SAM9261EK || MACH_AT91SAM9260EK)
|
||||
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK)
|
||||
help
|
||||
On AT91SAM926x boards both types of NAND flash can be present
|
||||
(8 and 16 bit data bus width).
|
|
@ -13,6 +13,7 @@ obj-$(CONFIG_PM) += pm.o
|
|||
obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o
|
||||
|
||||
# AT91RM9200 board-specific support
|
||||
obj-$(CONFIG_MACH_ONEARM) += board-1arm.o
|
||||
|
@ -31,6 +32,9 @@ obj-$(CONFIG_MACH_AT91SAM9260EK) += board-sam9260ek.o
|
|||
# AT91SAM9261 board-specific support
|
||||
obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o
|
||||
|
||||
# AT91SAM9263 board-specific support
|
||||
obj-$(CONFIG_MACH_AT91SAM9263EK) += board-sam9263ek.o
|
||||
|
||||
# LEDs support
|
||||
led-$(CONFIG_ARCH_AT91RM9200DK) += leds.o
|
||||
led-$(CONFIG_MACH_AT91RM9200EK) += leds.o
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/at91rm9200.c
|
||||
* arch/arm/mach-at91/at91rm9200.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
|
@ -117,6 +117,36 @@ static struct clk pioD_clk = {
|
|||
.pmc_mask = 1 << AT91RM9200_ID_PIOD,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc0_clk = {
|
||||
.name = "tc0_clk",
|
||||
.pmc_mask = 1 << AT91RM9200_ID_TC0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc1_clk = {
|
||||
.name = "tc1_clk",
|
||||
.pmc_mask = 1 << AT91RM9200_ID_TC1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc2_clk = {
|
||||
.name = "tc2_clk",
|
||||
.pmc_mask = 1 << AT91RM9200_ID_TC2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc3_clk = {
|
||||
.name = "tc3_clk",
|
||||
.pmc_mask = 1 << AT91RM9200_ID_TC3,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc4_clk = {
|
||||
.name = "tc4_clk",
|
||||
.pmc_mask = 1 << AT91RM9200_ID_TC4,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc5_clk = {
|
||||
.name = "tc5_clk",
|
||||
.pmc_mask = 1 << AT91RM9200_ID_TC5,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
|
||||
static struct clk *periph_clocks[] __initdata = {
|
||||
&pioA_clk,
|
||||
|
@ -132,7 +162,12 @@ static struct clk *periph_clocks[] __initdata = {
|
|||
&twi_clk,
|
||||
&spi_clk,
|
||||
// ssc 0 .. ssc2
|
||||
// tc0 .. tc5
|
||||
&tc0_clk,
|
||||
&tc1_clk,
|
||||
&tc2_clk,
|
||||
&tc3_clk,
|
||||
&tc4_clk,
|
||||
&tc5_clk,
|
||||
&ohci_clk,
|
||||
ðer_clk,
|
||||
// irq0 .. irq6
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/at91rm9200_devices.c
|
||||
* arch/arm/mach-at91/at91rm9200_devices.c
|
||||
*
|
||||
* Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
|
||||
* Copyright (C) 2005 David Brownell
|
||||
|
@ -315,7 +315,7 @@ static struct platform_device at91rm9200_mmc_device = {
|
|||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
@ -361,7 +361,7 @@ void __init at91_add_device_mmc(struct at91_mmc_data *data)
|
|||
platform_device_register(&at91rm9200_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -594,6 +594,10 @@ u8 at91_leds_timer;
|
|||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/at91rm9200_time.c
|
||||
* linux/arch/arm/mach-at91/at91rm9200_time.c
|
||||
*
|
||||
* Copyright (C) 2003 SAN People
|
||||
* Copyright (C) 2003 ATMEL
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/at91sam9260.c
|
||||
* arch/arm/mach-at91/at91sam9260.c
|
||||
*
|
||||
* Copyright (C) 2006 SAN People
|
||||
*
|
||||
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <asm/arch/at91sam9260.h>
|
||||
#include <asm/arch/at91_pmc.h>
|
||||
#include <asm/arch/at91_rstc.h>
|
||||
|
@ -27,7 +28,11 @@ static struct map_desc at91sam9260_io_desc[] __initdata = {
|
|||
.pfn = __phys_to_pfn(AT91_BASE_SYS),
|
||||
.length = SZ_16K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
}
|
||||
};
|
||||
|
||||
static struct map_desc at91sam9260_sram_desc[] __initdata = {
|
||||
{
|
||||
.virtual = AT91_IO_VIRT_BASE - AT91SAM9260_SRAM0_SIZE,
|
||||
.pfn = __phys_to_pfn(AT91SAM9260_SRAM0_BASE),
|
||||
.length = AT91SAM9260_SRAM0_SIZE,
|
||||
|
@ -37,7 +42,14 @@ static struct map_desc at91sam9260_io_desc[] __initdata = {
|
|||
.pfn = __phys_to_pfn(AT91SAM9260_SRAM1_BASE),
|
||||
.length = AT91SAM9260_SRAM1_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
static struct map_desc at91sam9xe_sram_desc[] __initdata = {
|
||||
{
|
||||
.pfn = __phys_to_pfn(AT91SAM9XE_SRAM_BASE),
|
||||
.type = MT_DEVICE,
|
||||
}
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
|
@ -107,13 +119,28 @@ static struct clk spi1_clk = {
|
|||
.pmc_mask = 1 << AT91SAM9260_ID_SPI1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc0_clk = {
|
||||
.name = "tc0_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_TC0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc1_clk = {
|
||||
.name = "tc1_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_TC1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc2_clk = {
|
||||
.name = "tc2_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_TC2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ohci_clk = {
|
||||
.name = "ohci_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_UHP,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ether_clk = {
|
||||
.name = "ether_clk",
|
||||
static struct clk macb_clk = {
|
||||
.name = "macb_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_EMAC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
|
@ -137,6 +164,21 @@ static struct clk usart5_clk = {
|
|||
.pmc_mask = 1 << AT91SAM9260_ID_US5,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc3_clk = {
|
||||
.name = "tc3_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_TC3,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc4_clk = {
|
||||
.name = "tc4_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_TC4,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc5_clk = {
|
||||
.name = "tc5_clk",
|
||||
.pmc_mask = 1 << AT91SAM9260_ID_TC5,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
|
||||
static struct clk *periph_clocks[] __initdata = {
|
||||
&pioA_clk,
|
||||
|
@ -152,14 +194,18 @@ static struct clk *periph_clocks[] __initdata = {
|
|||
&spi0_clk,
|
||||
&spi1_clk,
|
||||
// ssc
|
||||
// tc0 .. tc2
|
||||
&tc0_clk,
|
||||
&tc1_clk,
|
||||
&tc2_clk,
|
||||
&ohci_clk,
|
||||
ðer_clk,
|
||||
&macb_clk,
|
||||
&isi_clk,
|
||||
&usart3_clk,
|
||||
&usart4_clk,
|
||||
&usart5_clk,
|
||||
// tc3 .. tc5
|
||||
&tc3_clk,
|
||||
&tc4_clk,
|
||||
&tc5_clk,
|
||||
// irq0 .. irq2
|
||||
};
|
||||
|
||||
|
@ -213,7 +259,7 @@ static struct at91_gpio_bank at91sam9260_gpio[] = {
|
|||
|
||||
static void at91sam9260_reset(void)
|
||||
{
|
||||
at91_sys_write(AT91_RSTC_CR, (0xA5 << 24) | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||
at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||
}
|
||||
|
||||
|
||||
|
@ -221,11 +267,37 @@ static void at91sam9260_reset(void)
|
|||
* AT91SAM9260 processor initialization
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
static void __init at91sam9xe_initialize(void)
|
||||
{
|
||||
unsigned long cidr, sram_size;
|
||||
|
||||
cidr = at91_sys_read(AT91_DBGU_CIDR);
|
||||
|
||||
switch (cidr & AT91_CIDR_SRAMSIZ) {
|
||||
case AT91_CIDR_SRAMSIZ_32K:
|
||||
sram_size = 2 * SZ_16K;
|
||||
break;
|
||||
case AT91_CIDR_SRAMSIZ_16K:
|
||||
default:
|
||||
sram_size = SZ_16K;
|
||||
}
|
||||
|
||||
at91sam9xe_sram_desc->virtual = AT91_IO_VIRT_BASE - sram_size;
|
||||
at91sam9xe_sram_desc->length = sram_size;
|
||||
|
||||
iotable_init(at91sam9xe_sram_desc, ARRAY_SIZE(at91sam9xe_sram_desc));
|
||||
}
|
||||
|
||||
void __init at91sam9260_initialize(unsigned long main_clock)
|
||||
{
|
||||
/* Map peripherals */
|
||||
iotable_init(at91sam9260_io_desc, ARRAY_SIZE(at91sam9260_io_desc));
|
||||
|
||||
if (cpu_is_at91sam9xe())
|
||||
at91sam9xe_initialize();
|
||||
else
|
||||
iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc));
|
||||
|
||||
at91_arch_reset = at91sam9260_reset;
|
||||
at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1)
|
||||
| (1 << AT91SAM9260_ID_IRQ2);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/at91sam9260_devices.c
|
||||
* arch/arm/mach-at91/at91sam9260_devices.c
|
||||
*
|
||||
* Copyright (C) 2006 Atmel
|
||||
*
|
||||
|
@ -128,7 +128,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
|||
|
||||
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
|
||||
static u64 eth_dmamask = 0xffffffffUL;
|
||||
static struct eth_platform_data eth_data;
|
||||
static struct at91_eth_data eth_data;
|
||||
|
||||
static struct resource eth_resources[] = {
|
||||
[0] = {
|
||||
|
@ -155,7 +155,7 @@ static struct platform_device at91sam9260_eth_device = {
|
|||
.num_resources = ARRAY_SIZE(eth_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_eth(struct eth_platform_data *data)
|
||||
void __init at91_add_device_eth(struct at91_eth_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
@ -192,7 +192,7 @@ void __init at91_add_device_eth(struct eth_platform_data *data)
|
|||
platform_device_register(&at91sam9260_eth_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_eth(struct eth_platform_data *data) {}
|
||||
void __init at91_add_device_eth(struct at91_eth_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -229,7 +229,7 @@ static struct platform_device at91sam9260_mmc_device = {
|
|||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
@ -275,7 +275,7 @@ void __init at91_add_device_mmc(struct at91_mmc_data *data)
|
|||
platform_device_register(&at91sam9260_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -515,6 +515,10 @@ u8 at91_leds_timer;
|
|||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/at91sam9261.c
|
||||
* arch/arm/mach-at91/at91sam9261.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
|
@ -97,6 +97,21 @@ static struct clk spi1_clk = {
|
|||
.pmc_mask = 1 << AT91SAM9261_ID_SPI1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc0_clk = {
|
||||
.name = "tc0_clk",
|
||||
.pmc_mask = 1 << AT91SAM9261_ID_TC0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc1_clk = {
|
||||
.name = "tc1_clk",
|
||||
.pmc_mask = 1 << AT91SAM9261_ID_TC1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tc2_clk = {
|
||||
.name = "tc2_clk",
|
||||
.pmc_mask = 1 << AT91SAM9261_ID_TC2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ohci_clk = {
|
||||
.name = "ohci_clk",
|
||||
.pmc_mask = 1 << AT91SAM9261_ID_UHP,
|
||||
|
@ -121,7 +136,9 @@ static struct clk *periph_clocks[] __initdata = {
|
|||
&spi0_clk,
|
||||
&spi1_clk,
|
||||
// ssc 0 .. ssc2
|
||||
// tc0 .. tc2
|
||||
&tc0_clk,
|
||||
&tc1_clk,
|
||||
&tc2_clk,
|
||||
&ohci_clk,
|
||||
&lcdc_clk,
|
||||
// irq0 .. irq2
|
||||
|
@ -208,7 +225,7 @@ static struct at91_gpio_bank at91sam9261_gpio[] = {
|
|||
|
||||
static void at91sam9261_reset(void)
|
||||
{
|
||||
at91_sys_write(AT91_RSTC_CR, (0xA5 << 24) | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||
at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||
}
|
||||
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/at91sam9261_devices.c
|
||||
* arch/arm/mach-at91/at91sam9261_devices.c
|
||||
*
|
||||
* Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
|
||||
* Copyright (C) 2005 David Brownell
|
||||
|
@ -159,7 +159,7 @@ static struct platform_device at91sam9261_mmc_device = {
|
|||
.num_resources = ARRAY_SIZE(mmc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(struct at91_mmc_data *data)
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
@ -192,7 +192,7 @@ void __init at91_add_device_mmc(struct at91_mmc_data *data)
|
|||
platform_device_register(&at91sam9261_mmc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(struct at91_mmc_data *data) {}
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -513,6 +513,10 @@ u8 at91_leds_timer;
|
|||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
}
|
313
arch/arm/mach-at91/at91sam9263.c
Normal file
313
arch/arm/mach-at91/at91sam9263.c
Normal file
|
@ -0,0 +1,313 @@
|
|||
/*
|
||||
* arch/arm/mach-at91/at91sam9263.c
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/arch/at91sam9263.h>
|
||||
#include <asm/arch/at91_pmc.h>
|
||||
#include <asm/arch/at91_rstc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "clock.h"
|
||||
|
||||
static struct map_desc at91sam9263_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = AT91_VA_BASE_SYS,
|
||||
.pfn = __phys_to_pfn(AT91_BASE_SYS),
|
||||
.length = SZ_16K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = AT91_IO_VIRT_BASE - AT91SAM9263_SRAM0_SIZE,
|
||||
.pfn = __phys_to_pfn(AT91SAM9263_SRAM0_BASE),
|
||||
.length = AT91SAM9263_SRAM0_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = AT91_IO_VIRT_BASE - AT91SAM9263_SRAM0_SIZE - AT91SAM9263_SRAM1_SIZE,
|
||||
.pfn = __phys_to_pfn(AT91SAM9263_SRAM1_BASE),
|
||||
.length = AT91SAM9263_SRAM1_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Clocks
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* The peripheral clocks.
|
||||
*/
|
||||
static struct clk pioA_clk = {
|
||||
.name = "pioA_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_PIOA,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk pioB_clk = {
|
||||
.name = "pioB_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_PIOB,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk pioCDE_clk = {
|
||||
.name = "pioCDE_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_PIOCDE,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk usart0_clk = {
|
||||
.name = "usart0_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_US0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk usart1_clk = {
|
||||
.name = "usart1_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_US1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk usart2_clk = {
|
||||
.name = "usart2_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_US2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mmc0_clk = {
|
||||
.name = "mci0_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_MCI0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mmc1_clk = {
|
||||
.name = "mci1_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_MCI1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk twi_clk = {
|
||||
.name = "twi_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_TWI,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk spi0_clk = {
|
||||
.name = "spi0_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_SPI0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk spi1_clk = {
|
||||
.name = "spi1_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_SPI1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tcb_clk = {
|
||||
.name = "tcb_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_TCB,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk macb_clk = {
|
||||
.name = "macb_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_EMAC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk udc_clk = {
|
||||
.name = "udc_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_UDP,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk isi_clk = {
|
||||
.name = "isi_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_ISI,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk lcdc_clk = {
|
||||
.name = "lcdc_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_ISI,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ohci_clk = {
|
||||
.name = "ohci_clk",
|
||||
.pmc_mask = 1 << AT91SAM9263_ID_UHP,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
|
||||
static struct clk *periph_clocks[] __initdata = {
|
||||
&pioA_clk,
|
||||
&pioB_clk,
|
||||
&pioCDE_clk,
|
||||
&usart0_clk,
|
||||
&usart1_clk,
|
||||
&usart2_clk,
|
||||
&mmc0_clk,
|
||||
&mmc1_clk,
|
||||
// can
|
||||
&twi_clk,
|
||||
&spi0_clk,
|
||||
&spi1_clk,
|
||||
// ssc0 .. ssc1
|
||||
// ac97
|
||||
&tcb_clk,
|
||||
// pwmc
|
||||
&macb_clk,
|
||||
// 2dge
|
||||
&udc_clk,
|
||||
&isi_clk,
|
||||
&lcdc_clk,
|
||||
// dma
|
||||
&ohci_clk,
|
||||
// irq0 .. irq1
|
||||
};
|
||||
|
||||
/*
|
||||
* The four programmable clocks.
|
||||
* You must configure pin multiplexing to bring these signals out.
|
||||
*/
|
||||
static struct clk pck0 = {
|
||||
.name = "pck0",
|
||||
.pmc_mask = AT91_PMC_PCK0,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 0,
|
||||
};
|
||||
static struct clk pck1 = {
|
||||
.name = "pck1",
|
||||
.pmc_mask = AT91_PMC_PCK1,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 1,
|
||||
};
|
||||
static struct clk pck2 = {
|
||||
.name = "pck2",
|
||||
.pmc_mask = AT91_PMC_PCK2,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 2,
|
||||
};
|
||||
static struct clk pck3 = {
|
||||
.name = "pck3",
|
||||
.pmc_mask = AT91_PMC_PCK3,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 3,
|
||||
};
|
||||
|
||||
static void __init at91sam9263_register_clocks(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||
clk_register(periph_clocks[i]);
|
||||
|
||||
clk_register(&pck0);
|
||||
clk_register(&pck1);
|
||||
clk_register(&pck2);
|
||||
clk_register(&pck3);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* GPIO
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
static struct at91_gpio_bank at91sam9263_gpio[] = {
|
||||
{
|
||||
.id = AT91SAM9263_ID_PIOA,
|
||||
.offset = AT91_PIOA,
|
||||
.clock = &pioA_clk,
|
||||
}, {
|
||||
.id = AT91SAM9263_ID_PIOB,
|
||||
.offset = AT91_PIOB,
|
||||
.clock = &pioB_clk,
|
||||
}, {
|
||||
.id = AT91SAM9263_ID_PIOCDE,
|
||||
.offset = AT91_PIOC,
|
||||
.clock = &pioCDE_clk,
|
||||
}, {
|
||||
.id = AT91SAM9263_ID_PIOCDE,
|
||||
.offset = AT91_PIOD,
|
||||
.clock = &pioCDE_clk,
|
||||
}, {
|
||||
.id = AT91SAM9263_ID_PIOCDE,
|
||||
.offset = AT91_PIOE,
|
||||
.clock = &pioCDE_clk,
|
||||
}
|
||||
};
|
||||
|
||||
static void at91sam9263_reset(void)
|
||||
{
|
||||
at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* AT91SAM9263 processor initialization
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
void __init at91sam9263_initialize(unsigned long main_clock)
|
||||
{
|
||||
/* Map peripherals */
|
||||
iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc));
|
||||
|
||||
at91_arch_reset = at91sam9263_reset;
|
||||
at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1);
|
||||
|
||||
/* Init clock subsystem */
|
||||
at91_clock_init(main_clock);
|
||||
|
||||
/* Register the processor-specific clocks */
|
||||
at91sam9263_register_clocks();
|
||||
|
||||
/* Register GPIO subsystem */
|
||||
at91_gpio_init(at91sam9263_gpio, 5);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Interrupt initialization
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* The default interrupt priority levels (0 = lowest, 7 = highest).
|
||||
*/
|
||||
static unsigned int at91sam9263_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
||||
7, /* Advanced Interrupt Controller (FIQ) */
|
||||
7, /* System Peripherals */
|
||||
0, /* Parallel IO Controller A */
|
||||
0, /* Parallel IO Controller B */
|
||||
0, /* Parallel IO Controller C, D and E */
|
||||
0,
|
||||
0,
|
||||
6, /* USART 0 */
|
||||
6, /* USART 1 */
|
||||
6, /* USART 2 */
|
||||
0, /* Multimedia Card Interface 0 */
|
||||
0, /* Multimedia Card Interface 1 */
|
||||
4, /* CAN */
|
||||
0, /* Two-Wire Interface */
|
||||
6, /* Serial Peripheral Interface 0 */
|
||||
6, /* Serial Peripheral Interface 1 */
|
||||
5, /* Serial Synchronous Controller 0 */
|
||||
5, /* Serial Synchronous Controller 1 */
|
||||
6, /* AC97 Controller */
|
||||
0, /* Timer Counter 0, 1 and 2 */
|
||||
0, /* Pulse Width Modulation Controller */
|
||||
3, /* Ethernet */
|
||||
0,
|
||||
0, /* 2D Graphic Engine */
|
||||
3, /* USB Device Port */
|
||||
0, /* Image Sensor Interface */
|
||||
3, /* LDC Controller */
|
||||
0, /* DMA Controller */
|
||||
0,
|
||||
3, /* USB Host port */
|
||||
0, /* Advanced Interrupt Controller (IRQ0) */
|
||||
0, /* Advanced Interrupt Controller (IRQ1) */
|
||||
};
|
||||
|
||||
void __init at91sam9263_init_interrupts(unsigned int priority[NR_AIC_IRQS])
|
||||
{
|
||||
if (!priority)
|
||||
priority = at91sam9263_default_irq_priority;
|
||||
|
||||
/* Initialize the AIC interrupt controller */
|
||||
at91_aic_init(priority);
|
||||
|
||||
/* Enable GPIO interrupts */
|
||||
at91_gpio_irq_setup();
|
||||
}
|
818
arch/arm/mach-at91/at91sam9263_devices.c
Normal file
818
arch/arm/mach-at91/at91sam9263_devices.c
Normal file
|
@ -0,0 +1,818 @@
|
|||
/*
|
||||
* arch/arm/mach-at91/at91sam9263_devices.c
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/at91sam9263.h>
|
||||
#include <asm/arch/at91sam926x_mc.h>
|
||||
#include <asm/arch/at91sam9263_matrix.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
#define SZ_512 0x00000200
|
||||
#define SZ_256 0x00000100
|
||||
#define SZ_16 0x00000010
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* USB Host
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static u64 ohci_dmamask = 0xffffffffUL;
|
||||
static struct at91_usbh_data usbh_data;
|
||||
|
||||
static struct resource usbh_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_UHP_BASE,
|
||||
.end = AT91SAM9263_UHP_BASE + SZ_1M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_UHP,
|
||||
.end = AT91SAM9263_ID_UHP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91_usbh_device = {
|
||||
.name = "at91_ohci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &ohci_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.platform_data = &usbh_data,
|
||||
},
|
||||
.resource = usbh_resources,
|
||||
.num_resources = ARRAY_SIZE(usbh_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_usbh(struct at91_usbh_data *data)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* Enable VBus control for UHP ports */
|
||||
for (i = 0; i < data->ports; i++) {
|
||||
if (data->vbus_pin[i])
|
||||
at91_set_gpio_output(data->vbus_pin[i], 0);
|
||||
}
|
||||
|
||||
usbh_data = *data;
|
||||
platform_device_register(&at91_usbh_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* USB Device (Gadget)
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_USB_GADGET_AT91
|
||||
static struct at91_udc_data udc_data;
|
||||
|
||||
static struct resource udc_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_UDP,
|
||||
.end = AT91SAM9263_BASE_UDP + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_UDP,
|
||||
.end = AT91SAM9263_ID_UDP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91_udc_device = {
|
||||
.name = "at91_udc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &udc_data,
|
||||
},
|
||||
.resource = udc_resources,
|
||||
.num_resources = ARRAY_SIZE(udc_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_udc(struct at91_udc_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
if (data->vbus_pin) {
|
||||
at91_set_gpio_input(data->vbus_pin, 0);
|
||||
at91_set_deglitch(data->vbus_pin, 1);
|
||||
}
|
||||
|
||||
/* Pullup pin is handled internally by USB device peripheral */
|
||||
|
||||
udc_data = *data;
|
||||
platform_device_register(&at91_udc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Ethernet
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
|
||||
static u64 eth_dmamask = 0xffffffffUL;
|
||||
static struct at91_eth_data eth_data;
|
||||
|
||||
static struct resource eth_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_EMAC,
|
||||
.end = AT91SAM9263_BASE_EMAC + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_EMAC,
|
||||
.end = AT91SAM9263_ID_EMAC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_eth_device = {
|
||||
.name = "macb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = ð_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.platform_data = ð_data,
|
||||
},
|
||||
.resource = eth_resources,
|
||||
.num_resources = ARRAY_SIZE(eth_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_eth(struct at91_eth_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
if (data->phy_irq_pin) {
|
||||
at91_set_gpio_input(data->phy_irq_pin, 0);
|
||||
at91_set_deglitch(data->phy_irq_pin, 1);
|
||||
}
|
||||
|
||||
/* Pins used for MII and RMII */
|
||||
at91_set_A_periph(AT91_PIN_PE21, 0); /* ETXCK_EREFCK */
|
||||
at91_set_B_periph(AT91_PIN_PC25, 0); /* ERXDV */
|
||||
at91_set_A_periph(AT91_PIN_PE25, 0); /* ERX0 */
|
||||
at91_set_A_periph(AT91_PIN_PE26, 0); /* ERX1 */
|
||||
at91_set_A_periph(AT91_PIN_PE27, 0); /* ERXER */
|
||||
at91_set_A_periph(AT91_PIN_PE28, 0); /* ETXEN */
|
||||
at91_set_A_periph(AT91_PIN_PE23, 0); /* ETX0 */
|
||||
at91_set_A_periph(AT91_PIN_PE24, 0); /* ETX1 */
|
||||
at91_set_A_periph(AT91_PIN_PE30, 0); /* EMDIO */
|
||||
at91_set_A_periph(AT91_PIN_PE29, 0); /* EMDC */
|
||||
|
||||
if (!data->is_rmii) {
|
||||
at91_set_A_periph(AT91_PIN_PE22, 0); /* ECRS */
|
||||
at91_set_B_periph(AT91_PIN_PC26, 0); /* ECOL */
|
||||
at91_set_B_periph(AT91_PIN_PC22, 0); /* ERX2 */
|
||||
at91_set_B_periph(AT91_PIN_PC23, 0); /* ERX3 */
|
||||
at91_set_B_periph(AT91_PIN_PC27, 0); /* ERXCK */
|
||||
at91_set_B_periph(AT91_PIN_PC20, 0); /* ETX2 */
|
||||
at91_set_B_periph(AT91_PIN_PC21, 0); /* ETX3 */
|
||||
at91_set_B_periph(AT91_PIN_PC24, 0); /* ETXER */
|
||||
}
|
||||
|
||||
eth_data = *data;
|
||||
platform_device_register(&at91sam9263_eth_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_eth(struct at91_eth_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* MMC / SD
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = 0xffffffffUL;
|
||||
static struct at91_mmc_data mmc0_data, mmc1_data;
|
||||
|
||||
static struct resource mmc0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_MCI0,
|
||||
.end = AT91SAM9263_BASE_MCI0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_MCI0,
|
||||
.end = AT91SAM9263_ID_MCI0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_mmc0_device = {
|
||||
.name = "at91_mci",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.platform_data = &mmc0_data,
|
||||
},
|
||||
.resource = mmc0_resources,
|
||||
.num_resources = ARRAY_SIZE(mmc0_resources),
|
||||
};
|
||||
|
||||
static struct resource mmc1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_MCI1,
|
||||
.end = AT91SAM9263_BASE_MCI1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_MCI1,
|
||||
.end = AT91SAM9263_ID_MCI1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_mmc1_device = {
|
||||
.name = "at91_mci",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.platform_data = &mmc1_data,
|
||||
},
|
||||
.resource = mmc1_resources,
|
||||
.num_resources = ARRAY_SIZE(mmc1_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
||||
{
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* input/irq */
|
||||
if (data->det_pin) {
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
at91_set_deglitch(data->det_pin, 1);
|
||||
}
|
||||
if (data->wp_pin)
|
||||
at91_set_gpio_input(data->wp_pin, 1);
|
||||
if (data->vcc_pin)
|
||||
at91_set_gpio_output(data->vcc_pin, 0);
|
||||
|
||||
if (mmc_id == 0) { /* MCI0 */
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA12, 0);
|
||||
|
||||
if (data->slot_b) {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA16, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA17, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA18, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA19, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA20, 1);
|
||||
}
|
||||
} else {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA1, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA0, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA3, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA4, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA5, 1);
|
||||
}
|
||||
}
|
||||
|
||||
mmc0_data = *data;
|
||||
at91_clock_associate("mci0_clk", &at91sam9263_mmc1_device.dev, "mci_clk");
|
||||
platform_device_register(&at91sam9263_mmc0_device);
|
||||
} else { /* MCI1 */
|
||||
/* CLK */
|
||||
at91_set_A_periph(AT91_PIN_PA6, 0);
|
||||
|
||||
if (data->slot_b) {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA21, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA22, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA23, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA24, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA25, 1);
|
||||
}
|
||||
} else {
|
||||
/* CMD */
|
||||
at91_set_A_periph(AT91_PIN_PA7, 1);
|
||||
|
||||
/* DAT0, maybe DAT1..DAT3 */
|
||||
at91_set_A_periph(AT91_PIN_PA8, 1);
|
||||
if (data->wire4) {
|
||||
at91_set_A_periph(AT91_PIN_PA9, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA10, 1);
|
||||
at91_set_A_periph(AT91_PIN_PA11, 1);
|
||||
}
|
||||
}
|
||||
|
||||
mmc1_data = *data;
|
||||
at91_clock_associate("mci1_clk", &at91sam9263_mmc1_device.dev, "mci_clk");
|
||||
platform_device_register(&at91sam9263_mmc1_device);
|
||||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
static struct at91_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
||||
static struct resource nand_resources[] = {
|
||||
{
|
||||
.start = NAND_BASE,
|
||||
.end = NAND_BASE + SZ_256M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_nand_device = {
|
||||
.name = "at91_nand",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &nand_data,
|
||||
},
|
||||
.resource = nand_resources,
|
||||
.num_resources = ARRAY_SIZE(nand_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_nand(struct at91_nand_data *data)
|
||||
{
|
||||
unsigned long csa, mode;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
csa = at91_sys_read(AT91_MATRIX_EBI0CSA);
|
||||
at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC);
|
||||
|
||||
/* set the bus interface characteristics */
|
||||
at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)
|
||||
| AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));
|
||||
|
||||
at91_sys_write(AT91_SMC_PULSE(3), AT91_SMC_NWEPULSE_(3) | AT91_SMC_NCS_WRPULSE_(3)
|
||||
| AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(3));
|
||||
|
||||
at91_sys_write(AT91_SMC_CYCLE(3), AT91_SMC_NWECYCLE_(5) | AT91_SMC_NRDCYCLE_(5));
|
||||
|
||||
if (data->bus_width_16)
|
||||
mode = AT91_SMC_DBW_16;
|
||||
else
|
||||
mode = AT91_SMC_DBW_8;
|
||||
at91_sys_write(AT91_SMC_MODE(3), mode | AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_TDF_(2));
|
||||
|
||||
/* enable pin */
|
||||
if (data->enable_pin)
|
||||
at91_set_gpio_output(data->enable_pin, 1);
|
||||
|
||||
/* ready/busy pin */
|
||||
if (data->rdy_pin)
|
||||
at91_set_gpio_input(data->rdy_pin, 1);
|
||||
|
||||
/* card detect pin */
|
||||
if (data->det_pin)
|
||||
at91_set_gpio_input(data->det_pin, 1);
|
||||
|
||||
nand_data = *data;
|
||||
platform_device_register(&at91sam9263_nand_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_nand(struct at91_nand_data *data) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* TWI (i2c)
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
|
||||
|
||||
static struct resource twi_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_TWI,
|
||||
.end = AT91SAM9263_BASE_TWI + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_TWI,
|
||||
.end = AT91SAM9263_ID_TWI,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_twi_device = {
|
||||
.name = "at91_i2c",
|
||||
.id = -1,
|
||||
.resource = twi_resources,
|
||||
.num_resources = ARRAY_SIZE(twi_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_i2c(void)
|
||||
{
|
||||
/* pins used for TWI interface */
|
||||
at91_set_A_periph(AT91_PIN_PB4, 0); /* TWD */
|
||||
at91_set_multi_drive(AT91_PIN_PB4, 1);
|
||||
|
||||
at91_set_A_periph(AT91_PIN_PB5, 0); /* TWCK */
|
||||
at91_set_multi_drive(AT91_PIN_PB5, 1);
|
||||
|
||||
platform_device_register(&at91sam9263_twi_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_i2c(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* SPI
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||
static u64 spi_dmamask = 0xffffffffUL;
|
||||
|
||||
static struct resource spi0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_SPI0,
|
||||
.end = AT91SAM9263_BASE_SPI0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_SPI0,
|
||||
.end = AT91SAM9263_ID_SPI0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_spi0_device = {
|
||||
.name = "atmel_spi",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.resource = spi0_resources,
|
||||
.num_resources = ARRAY_SIZE(spi0_resources),
|
||||
};
|
||||
|
||||
static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA5, AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PB11 };
|
||||
|
||||
static struct resource spi1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_SPI1,
|
||||
.end = AT91SAM9263_BASE_SPI1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_SPI1,
|
||||
.end = AT91SAM9263_ID_SPI1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_spi1_device = {
|
||||
.name = "atmel_spi",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.resource = spi1_resources,
|
||||
.num_resources = ARRAY_SIZE(spi1_resources),
|
||||
};
|
||||
|
||||
static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB15, AT91_PIN_PB16, AT91_PIN_PB17, AT91_PIN_PB18 };
|
||||
|
||||
void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
||||
{
|
||||
int i;
|
||||
unsigned long cs_pin;
|
||||
short enable_spi0 = 0;
|
||||
short enable_spi1 = 0;
|
||||
|
||||
/* Choose SPI chip-selects */
|
||||
for (i = 0; i < nr_devices; i++) {
|
||||
if (devices[i].controller_data)
|
||||
cs_pin = (unsigned long) devices[i].controller_data;
|
||||
else if (devices[i].bus_num == 0)
|
||||
cs_pin = spi0_standard_cs[devices[i].chip_select];
|
||||
else
|
||||
cs_pin = spi1_standard_cs[devices[i].chip_select];
|
||||
|
||||
if (devices[i].bus_num == 0)
|
||||
enable_spi0 = 1;
|
||||
else
|
||||
enable_spi1 = 1;
|
||||
|
||||
/* enable chip-select pin */
|
||||
at91_set_gpio_output(cs_pin, 1);
|
||||
|
||||
/* pass chip-select pin to driver */
|
||||
devices[i].controller_data = (void *) cs_pin;
|
||||
}
|
||||
|
||||
spi_register_board_info(devices, nr_devices);
|
||||
|
||||
/* Configure SPI bus(es) */
|
||||
if (enable_spi0) {
|
||||
at91_set_B_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */
|
||||
at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||
at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */
|
||||
|
||||
at91_clock_associate("spi0_clk", &at91sam9263_spi0_device.dev, "spi_clk");
|
||||
platform_device_register(&at91sam9263_spi0_device);
|
||||
}
|
||||
if (enable_spi1) {
|
||||
at91_set_A_periph(AT91_PIN_PB12, 0); /* SPI1_MISO */
|
||||
at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */
|
||||
at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */
|
||||
|
||||
at91_clock_associate("spi1_clk", &at91sam9263_spi1_device.dev, "spi_clk");
|
||||
platform_device_register(&at91sam9263_spi1_device);
|
||||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
u8 at91_leds_cpu;
|
||||
u8 at91_leds_timer;
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
}
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* UART
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SERIAL_ATMEL)
|
||||
|
||||
static struct resource dbgu_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91_VA_BASE_SYS + AT91_DBGU,
|
||||
.end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91_ID_SYS,
|
||||
.end = AT91_ID_SYS,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct atmel_uart_data dbgu_data = {
|
||||
.use_dma_tx = 0,
|
||||
.use_dma_rx = 0, /* DBGU not capable of receive DMA */
|
||||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_dbgu_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &dbgu_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.resource = dbgu_resources,
|
||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
||||
};
|
||||
|
||||
static inline void configure_dbgu_pins(void)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */
|
||||
at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */
|
||||
}
|
||||
|
||||
static struct resource uart0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_US0,
|
||||
.end = AT91SAM9263_BASE_US0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_US0,
|
||||
.end = AT91SAM9263_ID_US0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct atmel_uart_data uart0_data = {
|
||||
.use_dma_tx = 1,
|
||||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_uart0_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &uart0_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.resource = uart0_resources,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart0_pins(void)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA26, 1); /* TXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA27, 0); /* RXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA28, 0); /* RTS0 */
|
||||
at91_set_A_periph(AT91_PIN_PA29, 0); /* CTS0 */
|
||||
}
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_US1,
|
||||
.end = AT91SAM9263_BASE_US1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_US1,
|
||||
.end = AT91SAM9263_ID_US1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct atmel_uart_data uart1_data = {
|
||||
.use_dma_tx = 1,
|
||||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_uart1_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &uart1_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.resource = uart1_resources,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart1_pins(void)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */
|
||||
at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */
|
||||
at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */
|
||||
}
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_US2,
|
||||
.end = AT91SAM9263_BASE_US2 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_US2,
|
||||
.end = AT91SAM9263_ID_US2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct atmel_uart_data uart2_data = {
|
||||
.use_dma_tx = 1,
|
||||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_uart2_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &uart2_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.resource = uart2_resources,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart2_pins(void)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */
|
||||
at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */
|
||||
at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */
|
||||
at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */
|
||||
}
|
||||
|
||||
struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
||||
|
||||
void __init at91_init_serial(struct at91_uart_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Fill in list of supported UARTs */
|
||||
for (i = 0; i < config->nr_tty; i++) {
|
||||
switch (config->tty_map[i]) {
|
||||
case 0:
|
||||
configure_usart0_pins();
|
||||
at91_uarts[i] = &at91sam9263_uart0_device;
|
||||
at91_clock_associate("usart0_clk", &at91sam9263_uart0_device.dev, "usart");
|
||||
break;
|
||||
case 1:
|
||||
configure_usart1_pins();
|
||||
at91_uarts[i] = &at91sam9263_uart1_device;
|
||||
at91_clock_associate("usart1_clk", &at91sam9263_uart1_device.dev, "usart");
|
||||
break;
|
||||
case 2:
|
||||
configure_usart2_pins();
|
||||
at91_uarts[i] = &at91sam9263_uart2_device;
|
||||
at91_clock_associate("usart2_clk", &at91sam9263_uart2_device.dev, "usart");
|
||||
break;
|
||||
case 3:
|
||||
configure_dbgu_pins();
|
||||
at91_uarts[i] = &at91sam9263_dbgu_device;
|
||||
at91_clock_associate("mck", &at91sam9263_dbgu_device.dev, "usart");
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
at91_uarts[i]->id = i; /* update ID number to mapped ID */
|
||||
}
|
||||
|
||||
/* Set serial console device */
|
||||
if (config->console_tty < ATMEL_MAX_UART)
|
||||
atmel_default_console_device = at91_uarts[config->console_tty];
|
||||
if (!atmel_default_console_device)
|
||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_add_device_serial(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ATMEL_MAX_UART; i++) {
|
||||
if (at91_uarts[i])
|
||||
platform_device_register(at91_uarts[i]);
|
||||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init at91_add_device_serial(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/*
|
||||
* These devices are always present and don't need any board-specific
|
||||
* setup.
|
||||
*/
|
||||
static int __init at91_add_standard_devices(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(at91_add_standard_devices);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/at91sam926x_time.c
|
||||
* linux/arch/arm/mach-at91/at91sam926x_time.c
|
||||
*
|
||||
* Copyright (C) 2005-2006 M. Amine SAYA, ATMEL Rousset, France
|
||||
* Revision 2005 M. Nicolas Diremdjian, ATMEL Rousset, France
|
||||
|
@ -30,7 +30,6 @@
|
|||
* Returns number of microseconds since last timer interrupt. Note that interrupts
|
||||
* will have been disabled by do_gettimeofday()
|
||||
* 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy.
|
||||
* 'tick' is usecs per jiffy (linux/timex.h).
|
||||
*/
|
||||
static unsigned long at91sam926x_gettimeoffset(void)
|
||||
{
|
||||
|
@ -39,7 +38,7 @@ static unsigned long at91sam926x_gettimeoffset(void)
|
|||
|
||||
elapsed = (PIT_PICNT(t) * LATCH) + PIT_CPIV(t); /* hardware clock cycles */
|
||||
|
||||
return (unsigned long)(elapsed * 1000000) / LATCH;
|
||||
return (unsigned long)(elapsed * jiffies_to_usecs(1)) / LATCH;
|
||||
}
|
||||
|
||||
/*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-1arm.c
|
||||
* linux/arch/arm/mach-at91/board-1arm.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-carmeva.c
|
||||
* linux/arch/arm/mach-at91/board-carmeva.c
|
||||
*
|
||||
* Copyright (c) 2005 Peer Georgi
|
||||
* Conitec Datasystems
|
||||
|
@ -134,7 +134,7 @@ static void __init carmeva_board_init(void)
|
|||
/* Compact Flash */
|
||||
// at91_add_device_cf(&carmeva_cf_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(&carmeva_mmc_data);
|
||||
at91_add_device_mmc(0, &carmeva_mmc_data);
|
||||
}
|
||||
|
||||
MACHINE_START(CARMEVA, "Carmeva")
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-csb337.c
|
||||
* linux/arch/arm/mach-at91/board-csb337.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
|
@ -24,6 +24,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
|
@ -112,6 +113,42 @@ static struct spi_board_info csb337_spi_devices[] = {
|
|||
},
|
||||
};
|
||||
|
||||
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
|
||||
#define CSB_FLASH_SIZE 0x800000
|
||||
|
||||
static struct mtd_partition csb_flash_partitions[] = {
|
||||
{
|
||||
.name = "uMON flash",
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.mask_flags = MTD_WRITEABLE, /* read only */
|
||||
}
|
||||
};
|
||||
|
||||
static struct physmap_flash_data csb_flash_data = {
|
||||
.width = 2,
|
||||
.parts = csb_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(csb_flash_partitions),
|
||||
};
|
||||
|
||||
static struct resource csb_flash_resources[] = {
|
||||
{
|
||||
.start = CSB_FLASH_BASE,
|
||||
.end = CSB_FLASH_BASE + CSB_FLASH_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device csb_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &csb_flash_data,
|
||||
},
|
||||
.resource = csb_flash_resources,
|
||||
.num_resources = ARRAY_SIZE(csb_flash_resources),
|
||||
};
|
||||
|
||||
static void __init csb337_board_init(void)
|
||||
{
|
||||
/* Serial */
|
||||
|
@ -130,7 +167,9 @@ static void __init csb337_board_init(void)
|
|||
/* SPI */
|
||||
at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(&csb337_mmc_data);
|
||||
at91_add_device_mmc(0, &csb337_mmc_data);
|
||||
/* NOR flash */
|
||||
platform_device_register(&csb_flash);
|
||||
}
|
||||
|
||||
MACHINE_START(CSB337, "Cogent CSB337")
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-csb637.c
|
||||
* linux/arch/arm/mach-at91/board-csb637.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
|
@ -23,6 +23,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
|
@ -81,6 +82,42 @@ static struct at91_udc_data __initdata csb637_udc_data = {
|
|||
.pullup_pin = AT91_PIN_PB1,
|
||||
};
|
||||
|
||||
#define CSB_FLASH_BASE AT91_CHIPSELECT_0
|
||||
#define CSB_FLASH_SIZE 0x1000000
|
||||
|
||||
static struct mtd_partition csb_flash_partitions[] = {
|
||||
{
|
||||
.name = "uMON flash",
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.mask_flags = MTD_WRITEABLE, /* read only */
|
||||
}
|
||||
};
|
||||
|
||||
static struct physmap_flash_data csb_flash_data = {
|
||||
.width = 2,
|
||||
.parts = csb_flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(csb_flash_partitions),
|
||||
};
|
||||
|
||||
static struct resource csb_flash_resources[] = {
|
||||
{
|
||||
.start = CSB_FLASH_BASE,
|
||||
.end = CSB_FLASH_BASE + CSB_FLASH_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device csb_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &csb_flash_data,
|
||||
},
|
||||
.resource = csb_flash_resources,
|
||||
.num_resources = ARRAY_SIZE(csb_flash_resources),
|
||||
};
|
||||
|
||||
static void __init csb637_board_init(void)
|
||||
{
|
||||
/* Serial */
|
||||
|
@ -95,6 +132,8 @@ static void __init csb637_board_init(void)
|
|||
at91_add_device_i2c();
|
||||
/* SPI */
|
||||
at91_add_device_spi(NULL, 0);
|
||||
/* NOR flash */
|
||||
platform_device_register(&csb_flash);
|
||||
}
|
||||
|
||||
MACHINE_START(CSB637, "Cogent CSB637")
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-dk.c
|
||||
* linux/arch/arm/mach-at91/board-dk.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
|
@ -194,7 +194,7 @@ static void __init dk_board_init(void)
|
|||
#else
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
||||
at91_add_device_mmc(&dk_mmc_data);
|
||||
at91_add_device_mmc(0, &dk_mmc_data);
|
||||
#endif
|
||||
/* NAND */
|
||||
at91_add_device_nand(&dk_nand_data);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-eb9200.c
|
||||
* linux/arch/arm/mach-at91/board-eb9200.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People, adapted for ATEB9200 from Embest
|
||||
* by Andrew Patrikalakis
|
||||
|
@ -109,7 +109,7 @@ static void __init eb9200_board_init(void)
|
|||
at91_add_device_spi(NULL, 0);
|
||||
/* MMC */
|
||||
/* only supports 1 or 4 bit interface, not wired through to SPI */
|
||||
at91_add_device_mmc(&eb9200_mmc_data);
|
||||
at91_add_device_mmc(0, &eb9200_mmc_data);
|
||||
}
|
||||
|
||||
MACHINE_START(ATEB9200, "Embest ATEB9200")
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-ek.c
|
||||
* linux/arch/arm/mach-at91/board-ek.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
|
@ -154,7 +154,7 @@ static void __init ek_board_init(void)
|
|||
#else
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */
|
||||
at91_add_device_mmc(&ek_mmc_data);
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
#endif
|
||||
/* NOR Flash */
|
||||
platform_device_register(&ek_flash);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-kafa.c
|
||||
* linux/arch/arm/mach-at91/board-kafa.c
|
||||
*
|
||||
* Copyright (C) 2006 Sperry-Sun
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-kb9202.c
|
||||
* linux/arch/arm/mach-at91/board-kb9202.c
|
||||
*
|
||||
* Copyright (c) 2005 kb_admin
|
||||
* KwikByte, Inc.
|
||||
|
@ -122,7 +122,7 @@ static void __init kb9202_board_init(void)
|
|||
/* USB Device */
|
||||
at91_add_device_udc(&kb9202_udc_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(&kb9202_mmc_data);
|
||||
at91_add_device_mmc(0, &kb9202_mmc_data);
|
||||
/* I2C */
|
||||
at91_add_device_i2c();
|
||||
/* SPI */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-ek.c
|
||||
* linux/arch/arm/mach-at91/board-sam9260ek.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
* Copyright (C) 2006 Atmel
|
||||
|
@ -118,7 +118,7 @@ static struct spi_board_info ek_spi_devices[] = {
|
|||
/*
|
||||
* MACB Ethernet device
|
||||
*/
|
||||
static struct __initdata eth_platform_data ek_macb_data = {
|
||||
static struct __initdata at91_eth_data ek_macb_data = {
|
||||
.phy_irq_pin = AT91_PIN_PA7,
|
||||
.is_rmii = 1,
|
||||
};
|
||||
|
@ -187,7 +187,7 @@ static void __init ek_board_init(void)
|
|||
/* Ethernet */
|
||||
at91_add_device_eth(&ek_macb_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(&ek_mmc_data);
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
}
|
||||
|
||||
MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-ek.c
|
||||
* linux/arch/arm/mach-at91/board-sam9261ek.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
* Copyright (C) 2006 Atmel
|
||||
|
@ -243,7 +243,7 @@ static void __init ek_board_init(void)
|
|||
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
|
||||
#else
|
||||
/* MMC */
|
||||
at91_add_device_mmc(&ek_mmc_data);
|
||||
at91_add_device_mmc(0, &ek_mmc_data);
|
||||
#endif
|
||||
}
|
||||
|
176
arch/arm/mach-at91/board-sam9263ek.c
Normal file
176
arch/arm/mach-at91/board-sam9263ek.c
Normal file
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91/board-sam9263ek.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* 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/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/at91sam926x_mc.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
|
||||
/*
|
||||
* Serial port configuration.
|
||||
* 0 .. 2 = USART0 .. USART2
|
||||
* 3 = DBGU
|
||||
*/
|
||||
static struct at91_uart_config __initdata ek_uart_config = {
|
||||
.console_tty = 0, /* ttyS0 */
|
||||
.nr_tty = 2,
|
||||
.tty_map = { 3, 0, -1, -1, } /* ttyS0, ..., ttyS3 */
|
||||
};
|
||||
|
||||
static void __init ek_map_io(void)
|
||||
{
|
||||
/* Initialize processor: 16.367 MHz crystal */
|
||||
at91sam9263_initialize(16367660);
|
||||
|
||||
/* Setup the serial ports and console */
|
||||
at91_init_serial(&ek_uart_config);
|
||||
}
|
||||
|
||||
static void __init ek_init_irq(void)
|
||||
{
|
||||
at91sam9263_init_interrupts(NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* USB Host port
|
||||
*/
|
||||
static struct at91_usbh_data __initdata ek_usbh_data = {
|
||||
.ports = 2,
|
||||
.vbus_pin = { AT91_PIN_PA24, AT91_PIN_PA21 },
|
||||
};
|
||||
|
||||
/*
|
||||
* USB Device port
|
||||
*/
|
||||
static struct at91_udc_data __initdata ek_udc_data = {
|
||||
.vbus_pin = AT91_PIN_PA25,
|
||||
.pullup_pin = 0, /* pull-up driven by UDC */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info ek_spi_devices[] = {
|
||||
#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
|
||||
{ /* DataFlash card */
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 15 * 1000 * 1000,
|
||||
.bus_num = 0,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.wire4 = 1,
|
||||
.det_pin = AT91_PIN_PE18,
|
||||
.wp_pin = AT91_PIN_PE19,
|
||||
// .vcc_pin = ... not connected
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* NAND flash
|
||||
*/
|
||||
static struct mtd_partition __initdata ek_nand_partition[] = {
|
||||
{
|
||||
.name = "Partition 1",
|
||||
.offset = 0,
|
||||
.size = 64 * 1024 * 1024,
|
||||
},
|
||||
{
|
||||
.name = "Partition 2",
|
||||
.offset = 64 * 1024 * 1024,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition *nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(ek_nand_partition);
|
||||
return ek_nand_partition;
|
||||
}
|
||||
|
||||
static struct at91_nand_data __initdata ek_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
// .det_pin = ... not connected
|
||||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
/* Serial */
|
||||
at91_add_device_serial();
|
||||
/* USB Host */
|
||||
at91_add_device_usbh(&ek_usbh_data);
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&ek_udc_data);
|
||||
/* SPI */
|
||||
at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
|
||||
/* MMC */
|
||||
at91_add_device_mmc(1, &ek_mmc_data);
|
||||
/* NAND */
|
||||
at91_add_device_nand(&ek_nand_data);
|
||||
}
|
||||
|
||||
MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
|
||||
/* Maintainer: Atmel */
|
||||
.phys_io = AT91_BASE_SYS,
|
||||
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
|
||||
.boot_params = AT91_SDRAM_BASE + 0x100,
|
||||
.timer = &at91sam926x_timer,
|
||||
.map_io = ek_map_io,
|
||||
.init_irq = ek_init_irq,
|
||||
.init_machine = ek_board_init,
|
||||
MACHINE_END
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/clock.c
|
||||
* linux/arch/arm/mach-at91/clock.c
|
||||
*
|
||||
* Copyright (C) 2005 David Brownell
|
||||
* Copyright (C) 2005 Ivan Kokshaysky
|
||||
|
@ -525,27 +525,6 @@ fail:
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Several unused clocks may be active. Turn them off.
|
||||
*/
|
||||
static void __init at91_periphclk_reset(void)
|
||||
{
|
||||
unsigned long reg;
|
||||
struct clk *clk;
|
||||
|
||||
reg = at91_sys_read(AT91_PMC_PCSR);
|
||||
|
||||
list_for_each_entry(clk, &clocks, node) {
|
||||
if (clk->mode != pmc_periph_mode)
|
||||
continue;
|
||||
|
||||
if (clk->users > 0)
|
||||
reg &= ~clk->pmc_mask;
|
||||
}
|
||||
|
||||
at91_sys_write(AT91_PMC_PCDR, reg);
|
||||
}
|
||||
|
||||
static struct clk *const standard_pmc_clocks[] __initdata = {
|
||||
/* four primary clocks */
|
||||
&clk32k,
|
||||
|
@ -586,7 +565,7 @@ int __init at91_clock_init(unsigned long main_clock)
|
|||
pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);
|
||||
|
||||
/*
|
||||
* USB clock init: choose 48 MHz PLLB value, turn all clocks off,
|
||||
* USB clock init: choose 48 MHz PLLB value,
|
||||
* disable 48MHz clock during usb peripheral suspend.
|
||||
*
|
||||
* REVISIT: assumes MCK doesn't derive from PLLB!
|
||||
|
@ -596,16 +575,10 @@ int __init at91_clock_init(unsigned long main_clock)
|
|||
if (cpu_is_at91rm9200()) {
|
||||
uhpck.pmc_mask = AT91RM9200_PMC_UHP;
|
||||
udpck.pmc_mask = AT91RM9200_PMC_UDP;
|
||||
at91_sys_write(AT91_PMC_SCDR, AT91RM9200_PMC_UHP | AT91RM9200_PMC_UDP);
|
||||
at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP);
|
||||
} else if (cpu_is_at91sam9260()) {
|
||||
} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263()) {
|
||||
uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
|
||||
udpck.pmc_mask = AT91SAM926x_PMC_UDP;
|
||||
at91_sys_write(AT91_PMC_SCDR, AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP);
|
||||
} else if (cpu_is_at91sam9261()) {
|
||||
uhpck.pmc_mask = (AT91SAM926x_PMC_UHP | AT91_PMC_HCK0);
|
||||
udpck.pmc_mask = AT91SAM926x_PMC_UDP;
|
||||
at91_sys_write(AT91_PMC_SCDR, AT91SAM926x_PMC_UHP | AT91_PMC_HCK0 | AT91SAM926x_PMC_UDP);
|
||||
}
|
||||
at91_sys_write(AT91_CKGR_PLLBR, 0);
|
||||
|
||||
|
@ -634,11 +607,34 @@ int __init at91_clock_init(unsigned long main_clock)
|
|||
(unsigned) main_clock / 1000000,
|
||||
((unsigned) main_clock % 1000000) / 1000);
|
||||
|
||||
/* disable all programmable clocks */
|
||||
at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK0 | AT91_PMC_PCK1 | AT91_PMC_PCK2 | AT91_PMC_PCK3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* disable all other unused peripheral clocks */
|
||||
at91_periphclk_reset();
|
||||
/*
|
||||
* Several unused clocks may be active. Turn them off.
|
||||
*/
|
||||
static int __init at91_clock_reset(void)
|
||||
{
|
||||
unsigned long pcdr = 0;
|
||||
unsigned long scdr = 0;
|
||||
struct clk *clk;
|
||||
|
||||
list_for_each_entry(clk, &clocks, node) {
|
||||
if (clk->users > 0)
|
||||
continue;
|
||||
|
||||
if (clk->mode == pmc_periph_mode)
|
||||
pcdr |= clk->pmc_mask;
|
||||
|
||||
if (clk->mode == pmc_sys_mode)
|
||||
scdr |= clk->pmc_mask;
|
||||
|
||||
pr_debug("Clocks: disable unused %s\n", clk->name);
|
||||
}
|
||||
|
||||
at91_sys_write(AT91_PMC_PCDR, pcdr);
|
||||
at91_sys_write(AT91_PMC_SCDR, scdr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(at91_clock_reset);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/clock.h
|
||||
* linux/arch/arm/mach-at91/clock.h
|
||||
*
|
||||
* 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
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/generic.h
|
||||
* linux/arch/arm/mach-at91/generic.h
|
||||
*
|
||||
* Copyright (C) 2005 David Brownell
|
||||
*
|
||||
|
@ -12,11 +12,13 @@
|
|||
extern void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks);
|
||||
extern void __init at91sam9260_initialize(unsigned long main_clock);
|
||||
extern void __init at91sam9261_initialize(unsigned long main_clock);
|
||||
extern void __init at91sam9263_initialize(unsigned long main_clock);
|
||||
|
||||
/* Interrupts */
|
||||
extern void __init at91rm9200_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91sam9260_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91sam9261_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91sam9263_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91_aic_init(unsigned int priority[]);
|
||||
|
||||
/* Timer */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/gpio.c
|
||||
* linux/arch/arm/mach-at91/gpio.c
|
||||
*
|
||||
* Copyright (C) 2005 HP Labs
|
||||
*
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/irq.c
|
||||
* linux/arch/arm/mach-at91/irq.c
|
||||
*
|
||||
* Copyright (C) 2004 SAN People
|
||||
* Copyright (C) 2004 ATMEL
|
|
@ -86,10 +86,6 @@ static int __init leds_init(void)
|
|||
if (!at91_leds_timer || !at91_leds_cpu)
|
||||
return -ENODEV;
|
||||
|
||||
/* Enable PIO to access the LEDs */
|
||||
at91_set_gpio_output(at91_leds_timer, 1);
|
||||
at91_set_gpio_output(at91_leds_cpu, 1);
|
||||
|
||||
leds_event = at91_leds_event;
|
||||
|
||||
leds_event(led_start);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-at91rm9200/pm.c
|
||||
* arch/arm/mach-at91/pm.c
|
||||
* AT91 Power Management
|
||||
*
|
||||
* Copyright (C) 2005 David Brownell
|
||||
|
@ -80,6 +80,8 @@ static int at91_pm_verify_clocks(void)
|
|||
#warning "Check SAM9260 USB clocks"
|
||||
} else if (cpu_is_at91sam9261()) {
|
||||
#warning "Check SAM9261 USB clocks"
|
||||
} else if (cpu_is_at91sam9263()) {
|
||||
#warning "Check SAM9263 USB clocks"
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
|
|
@ -51,6 +51,31 @@ config MACH_GESBC9312
|
|||
Say 'Y' here if you want your kernel to support the Glomation
|
||||
GESBC-9312-sx board.
|
||||
|
||||
config MACH_MICRO9
|
||||
bool
|
||||
default n
|
||||
|
||||
config MACH_MICRO9H
|
||||
bool "Support Contec Hypercontrol Micro9-H"
|
||||
select MACH_MICRO9
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Contec Hypercontrol Micro9-H board.
|
||||
|
||||
config MACH_MICRO9M
|
||||
bool "Support Contec Hypercontrol Micro9-M"
|
||||
select MACH_MICRO9
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Contec Hypercontrol Micro9-M board.
|
||||
|
||||
config MACH_MICRO9L
|
||||
bool "Support Contec Hypercontrol Micro9-L"
|
||||
select MACH_MICRO9
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Contec Hypercontrol Micro9-L board.
|
||||
|
||||
config MACH_TS72XX
|
||||
bool "Support Technologic Systems TS-72xx SBC"
|
||||
help
|
||||
|
|
|
@ -13,4 +13,5 @@ obj-$(CONFIG_MACH_EDB9312) += edb9312.o
|
|||
obj-$(CONFIG_MACH_EDB9315) += edb9315.o
|
||||
obj-$(CONFIG_MACH_EDB9315A) += edb9315a.o
|
||||
obj-$(CONFIG_MACH_GESBC9312) += gesbc9312.o
|
||||
obj-$(CONFIG_MACH_MICRO9) += micro9.o
|
||||
obj-$(CONFIG_MACH_TS72XX) += ts72xx.o
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/hardware.h>
|
||||
|
@ -124,7 +125,7 @@ static unsigned long calc_pll_rate(u32 config_word)
|
|||
return (unsigned long)rate;
|
||||
}
|
||||
|
||||
void ep93xx_clock_init(void)
|
||||
static int __init ep93xx_clock_init(void)
|
||||
{
|
||||
u32 value;
|
||||
|
||||
|
@ -153,4 +154,7 @@ void ep93xx_clock_init(void)
|
|||
printk(KERN_INFO "ep93xx: FCLK %ld MHz, HCLK %ld MHz, PCLK %ld MHz\n",
|
||||
clk_f.rate / 1000000, clk_h.rate / 1000000,
|
||||
clk_p.rate / 1000000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(ep93xx_clock_init);
|
||||
|
|
|
@ -152,22 +152,30 @@ struct sys_timer ep93xx_timer = {
|
|||
/*************************************************************************
|
||||
* GPIO handling for EP93xx
|
||||
*************************************************************************/
|
||||
static unsigned char gpio_int_enable[2];
|
||||
static unsigned char gpio_int_type1[2];
|
||||
static unsigned char gpio_int_type2[2];
|
||||
static unsigned char gpio_int_unmasked[3];
|
||||
static unsigned char gpio_int_enabled[3];
|
||||
static unsigned char gpio_int_type1[3];
|
||||
static unsigned char gpio_int_type2[3];
|
||||
|
||||
static void update_gpio_ab_int_params(int port)
|
||||
static void update_gpio_int_params(int abf)
|
||||
{
|
||||
if (port == 0) {
|
||||
if (abf == 0) {
|
||||
__raw_writeb(0, EP93XX_GPIO_A_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_type2[0], EP93XX_GPIO_A_INT_TYPE2);
|
||||
__raw_writeb(gpio_int_type1[0], EP93XX_GPIO_A_INT_TYPE1);
|
||||
__raw_writeb(gpio_int_enable[0], EP93XX_GPIO_A_INT_ENABLE);
|
||||
} else if (port == 1) {
|
||||
__raw_writeb(gpio_int_unmasked[0] & gpio_int_enabled[0], EP93XX_GPIO_A_INT_ENABLE);
|
||||
} else if (abf == 1) {
|
||||
__raw_writeb(0, EP93XX_GPIO_B_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_type2[1], EP93XX_GPIO_B_INT_TYPE2);
|
||||
__raw_writeb(gpio_int_type1[1], EP93XX_GPIO_B_INT_TYPE1);
|
||||
__raw_writeb(gpio_int_enable[1], EP93XX_GPIO_B_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_unmasked[1] & gpio_int_enabled[1], EP93XX_GPIO_B_INT_ENABLE);
|
||||
} else if (abf == 2) {
|
||||
__raw_writeb(0, EP93XX_GPIO_F_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_type2[2], EP93XX_GPIO_F_INT_TYPE2);
|
||||
__raw_writeb(gpio_int_type1[2], EP93XX_GPIO_F_INT_TYPE1);
|
||||
__raw_writeb(gpio_int_unmasked[2] & gpio_int_enabled[2], EP93XX_GPIO_F_INT_ENABLE);
|
||||
} else {
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -192,8 +200,13 @@ void gpio_line_config(int line, int direction)
|
|||
local_irq_save(flags);
|
||||
if (direction == GPIO_OUT) {
|
||||
if (line >= 0 && line < 16) {
|
||||
gpio_int_enable[line >> 3] &= ~(1 << (line & 7));
|
||||
update_gpio_ab_int_params(line >> 3);
|
||||
/* Port A/B. */
|
||||
gpio_int_unmasked[line >> 3] &= ~(1 << (line & 7));
|
||||
update_gpio_int_params(line >> 3);
|
||||
} else if (line >= 40 && line < 48) {
|
||||
/* Port F. */
|
||||
gpio_int_unmasked[2] &= ~(1 << (line & 7));
|
||||
update_gpio_int_params(2);
|
||||
}
|
||||
|
||||
v = __raw_readb(data_direction_register);
|
||||
|
@ -244,8 +257,7 @@ EXPORT_SYMBOL(gpio_line_set);
|
|||
/*************************************************************************
|
||||
* EP93xx IRQ handling
|
||||
*************************************************************************/
|
||||
static void ep93xx_gpio_ab_irq_handler(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
static void ep93xx_gpio_ab_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
unsigned char status;
|
||||
int i;
|
||||
|
@ -267,37 +279,46 @@ static void ep93xx_gpio_ab_irq_handler(unsigned int irq,
|
|||
}
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_ab_irq_mask_ack(unsigned int irq)
|
||||
static void ep93xx_gpio_f_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
int gpio_irq = IRQ_EP93XX_GPIO(16) + (((irq + 1) & 7) ^ 4);
|
||||
|
||||
desc_handle_irq(gpio_irq, irq_desc + gpio_irq);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_mask_ack(unsigned int irq)
|
||||
{
|
||||
int line = irq - IRQ_EP93XX_GPIO(0);
|
||||
int port = line >> 3;
|
||||
|
||||
gpio_int_enable[port] &= ~(1 << (line & 7));
|
||||
update_gpio_ab_int_params(port);
|
||||
gpio_int_unmasked[port] &= ~(1 << (line & 7));
|
||||
update_gpio_int_params(port);
|
||||
|
||||
if (line >> 3) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_B_INT_ACK);
|
||||
} else {
|
||||
if (port == 0) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_A_INT_ACK);
|
||||
} else if (port == 1) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_B_INT_ACK);
|
||||
} else if (port == 2) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_F_INT_ACK);
|
||||
}
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_ab_irq_mask(unsigned int irq)
|
||||
static void ep93xx_gpio_irq_mask(unsigned int irq)
|
||||
{
|
||||
int line = irq - IRQ_EP93XX_GPIO(0);
|
||||
int port = line >> 3;
|
||||
|
||||
gpio_int_enable[port] &= ~(1 << (line & 7));
|
||||
update_gpio_ab_int_params(port);
|
||||
gpio_int_unmasked[port] &= ~(1 << (line & 7));
|
||||
update_gpio_int_params(port);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_ab_irq_unmask(unsigned int irq)
|
||||
static void ep93xx_gpio_irq_unmask(unsigned int irq)
|
||||
{
|
||||
int line = irq - IRQ_EP93XX_GPIO(0);
|
||||
int port = line >> 3;
|
||||
|
||||
gpio_int_enable[port] |= 1 << (line & 7);
|
||||
update_gpio_ab_int_params(port);
|
||||
gpio_int_unmasked[port] |= 1 << (line & 7);
|
||||
update_gpio_int_params(port);
|
||||
}
|
||||
|
||||
|
||||
|
@ -306,40 +327,51 @@ static void ep93xx_gpio_ab_irq_unmask(unsigned int irq)
|
|||
* edge (1) triggered, while gpio_int_type2 controls whether it
|
||||
* triggers on low/falling (0) or high/rising (1).
|
||||
*/
|
||||
static int ep93xx_gpio_ab_irq_type(unsigned int irq, unsigned int type)
|
||||
static int ep93xx_gpio_irq_type(unsigned int irq, unsigned int type)
|
||||
{
|
||||
int port;
|
||||
int line;
|
||||
|
||||
line = irq - IRQ_EP93XX_GPIO(0);
|
||||
gpio_line_config(line, GPIO_IN);
|
||||
if (line >= 0 && line < 16) {
|
||||
gpio_line_config(line, GPIO_IN);
|
||||
} else {
|
||||
gpio_line_config(EP93XX_GPIO_LINE_F(line), GPIO_IN);
|
||||
}
|
||||
|
||||
port = line >> 3;
|
||||
line &= 7;
|
||||
|
||||
if (type & IRQT_RISING) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] |= 1 << line;
|
||||
gpio_int_type2[port] |= 1 << line;
|
||||
} else if (type & IRQT_FALLING) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] |= 1 << line;
|
||||
gpio_int_type2[port] &= ~(1 << line);
|
||||
} else if (type & IRQT_HIGH) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] &= ~(1 << line);
|
||||
gpio_int_type2[port] |= 1 << line;
|
||||
} else if (type & IRQT_LOW) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] &= ~(1 << line);
|
||||
gpio_int_type2[port] &= ~(1 << line);
|
||||
} else {
|
||||
gpio_int_enabled[port] &= ~(1 << line);
|
||||
}
|
||||
update_gpio_ab_int_params(port);
|
||||
update_gpio_int_params(port);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip ep93xx_gpio_ab_irq_chip = {
|
||||
.ack = ep93xx_gpio_ab_irq_mask_ack,
|
||||
.mask = ep93xx_gpio_ab_irq_mask,
|
||||
.unmask = ep93xx_gpio_ab_irq_unmask,
|
||||
.set_type = ep93xx_gpio_ab_irq_type,
|
||||
static struct irq_chip ep93xx_gpio_irq_chip = {
|
||||
.name = "GPIO",
|
||||
.ack = ep93xx_gpio_irq_mask_ack,
|
||||
.mask = ep93xx_gpio_irq_mask,
|
||||
.unmask = ep93xx_gpio_irq_unmask,
|
||||
.set_type = ep93xx_gpio_irq_type,
|
||||
};
|
||||
|
||||
|
||||
|
@ -350,12 +382,21 @@ void __init ep93xx_init_irq(void)
|
|||
vic_init((void *)EP93XX_VIC1_BASE, 0, EP93XX_VIC1_VALID_IRQ_MASK);
|
||||
vic_init((void *)EP93XX_VIC2_BASE, 32, EP93XX_VIC2_VALID_IRQ_MASK);
|
||||
|
||||
for (irq = IRQ_EP93XX_GPIO(0) ; irq <= IRQ_EP93XX_GPIO(15); irq++) {
|
||||
set_irq_chip(irq, &ep93xx_gpio_ab_irq_chip);
|
||||
for (irq = IRQ_EP93XX_GPIO(0); irq <= IRQ_EP93XX_GPIO(23); irq++) {
|
||||
set_irq_chip(irq, &ep93xx_gpio_irq_chip);
|
||||
set_irq_handler(irq, handle_level_irq);
|
||||
set_irq_flags(irq, IRQF_VALID);
|
||||
}
|
||||
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO_AB, ep93xx_gpio_ab_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO0MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO1MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO2MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO3MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO4MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO5MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO6MUX, ep93xx_gpio_f_irq_handler);
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO7MUX, ep93xx_gpio_f_irq_handler);
|
||||
}
|
||||
|
||||
|
||||
|
@ -461,8 +502,6 @@ void __init ep93xx_init_devices(void)
|
|||
{
|
||||
unsigned int v;
|
||||
|
||||
ep93xx_clock_init();
|
||||
|
||||
/*
|
||||
* Disallow access to MaverickCrunch initially.
|
||||
*/
|
||||
|
@ -477,8 +516,4 @@ void __init ep93xx_init_devices(void)
|
|||
|
||||
platform_device_register(&ep93xx_rtc_device);
|
||||
platform_device_register(&ep93xx_ohci_device);
|
||||
|
||||
#ifdef CONFIG_CRUNCH
|
||||
elf_hwcap |= HWCAP_CRUNCH;
|
||||
#endif
|
||||
}
|
||||
|
|
157
arch/arm/mach-ep93xx/micro9.c
Normal file
157
arch/arm/mach-ep93xx/micro9.c
Normal file
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-ep93xx/micro9.c
|
||||
*
|
||||
* Copyright (C) 2006 Contec Steuerungstechnik & Automation GmbH
|
||||
* Manfred Gruber <manfred.gruber@contec.at>
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
static struct ep93xx_eth_data micro9_eth_data = {
|
||||
.phy_id = 0x1f,
|
||||
};
|
||||
|
||||
static struct resource micro9_eth_resource[] = {
|
||||
{
|
||||
.start = EP93XX_ETHERNET_PHYS_BASE,
|
||||
.end = EP93XX_ETHERNET_PHYS_BASE + 0xffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = IRQ_EP93XX_ETHERNET,
|
||||
.end = IRQ_EP93XX_ETHERNET,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device micro9_eth_device = {
|
||||
.name = "ep93xx-eth",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = µ9_eth_data,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(micro9_eth_resource),
|
||||
.resource = micro9_eth_resource,
|
||||
};
|
||||
|
||||
static void __init micro9_eth_init(void)
|
||||
{
|
||||
memcpy(micro9_eth_data.dev_addr,
|
||||
(void *)(EP93XX_ETHERNET_BASE + 0x50), 6);
|
||||
platform_device_register(µ9_eth_device);
|
||||
}
|
||||
|
||||
static void __init micro9_init(void)
|
||||
{
|
||||
micro9_eth_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* Micro9-H
|
||||
*/
|
||||
#ifdef CONFIG_MACH_MICRO9H
|
||||
static struct physmap_flash_data micro9h_flash_data = {
|
||||
.width = 4,
|
||||
};
|
||||
|
||||
static struct resource micro9h_flash_resource = {
|
||||
.start = 0x10000000,
|
||||
.end = 0x13ffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct platform_device micro9h_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = µ9h_flash_data,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = µ9h_flash_resource,
|
||||
};
|
||||
|
||||
static void __init micro9h_init(void)
|
||||
{
|
||||
platform_device_register(µ9h_flash);
|
||||
}
|
||||
|
||||
static void __init micro9h_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
micro9_init();
|
||||
micro9h_init();
|
||||
}
|
||||
|
||||
MACHINE_START(MICRO9, "Contec Hypercontrol Micro9-H")
|
||||
/* Maintainer: Manfred Gruber <manfred.gruber@contec.at> */
|
||||
.phys_io = EP93XX_APB_PHYS_BASE,
|
||||
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
|
||||
.boot_params = 0x00000100,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.timer = &ep93xx_timer,
|
||||
.init_machine = micro9h_init_machine,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Micro9-M
|
||||
*/
|
||||
#ifdef CONFIG_MACH_MICRO9M
|
||||
static void __init micro9m_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
micro9_init();
|
||||
}
|
||||
|
||||
MACHINE_START(MICRO9M, "Contec Hypercontrol Micro9-M")
|
||||
/* Maintainer: Manfred Gruber <manfred.gruber@contec.at> */
|
||||
.phys_io = EP93XX_APB_PHYS_BASE,
|
||||
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
|
||||
.boot_params = 0x00000100,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.timer = &ep93xx_timer,
|
||||
.init_machine = micro9m_init_machine,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Micro9-L
|
||||
*/
|
||||
#ifdef CONFIG_MACH_MICRO9L
|
||||
static void __init micro9l_init_machine(void)
|
||||
{
|
||||
ep93xx_init_devices();
|
||||
micro9_init();
|
||||
}
|
||||
|
||||
MACHINE_START(MICRO9L, "Contec Hypercontrol Micro9-L")
|
||||
/* Maintainer: Manfred Gruber <manfred.gruber@contec.at> */
|
||||
.phys_io = EP93XX_APB_PHYS_BASE,
|
||||
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
|
||||
.boot_params = 0x00000100,
|
||||
.map_io = ep93xx_map_io,
|
||||
.init_irq = ep93xx_init_irq,
|
||||
.timer = &ep93xx_timer,
|
||||
.init_machine = micro9l_init_machine,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
|
@ -250,11 +250,14 @@ static struct irq_chip iop13xx_irqchip4 = {
|
|||
.unmask = iop13xx_irq_unmask3,
|
||||
};
|
||||
|
||||
extern void iop_init_cp6_handler(void);
|
||||
|
||||
void __init iop13xx_init_irq(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
u32 cp_flags = iop13xx_cp6_save();
|
||||
iop_init_cp6_handler();
|
||||
|
||||
/* disable all interrupts */
|
||||
write_intctl_0(0);
|
||||
|
|
|
@ -60,6 +60,8 @@ void __init iop32x_init_irq(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
iop_init_cp6_handler();
|
||||
|
||||
intctl_write(0);
|
||||
intstr_write(0);
|
||||
if (machine_is_glantank() ||
|
||||
|
|
|
@ -120,6 +120,20 @@ static struct hw_pci n2100_pci __initdata = {
|
|||
.map_irq = n2100_pci_map_irq,
|
||||
};
|
||||
|
||||
/*
|
||||
* Both r8169 chips on the n2100 exhibit PCI parity problems. Set
|
||||
* the ->broken_parity_status flag for both ports so that the r8169
|
||||
* driver knows it should ignore error interrupts.
|
||||
*/
|
||||
static void n2100_fixup_r8169(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->bus->number == 0 &&
|
||||
(dev->devfn == PCI_DEVFN(1, 0) ||
|
||||
dev->devfn == PCI_DEVFN(2, 0)))
|
||||
dev->broken_parity_status = 1;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_REALTEK, PCI_ANY_ID, n2100_fixup_r8169);
|
||||
|
||||
static int __init n2100_pci_init(void)
|
||||
{
|
||||
if (machine_is_n2100())
|
||||
|
|
|
@ -110,6 +110,8 @@ void __init iop33x_init_irq(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
iop_init_cp6_handler();
|
||||
|
||||
intctl0_write(0);
|
||||
intctl1_write(0);
|
||||
intstr0_write(0);
|
||||
|
|
|
@ -17,7 +17,7 @@ config MACH_NSLU2
|
|||
NSLU2 NAS device. For more information on this platform,
|
||||
see http://www.nslu2-linux.org
|
||||
|
||||
config ARCH_AVILA
|
||||
config MACH_AVILA
|
||||
bool "Avila"
|
||||
select PCI
|
||||
help
|
||||
|
@ -25,6 +25,14 @@ config ARCH_AVILA
|
|||
Avila Network Platform. For more information on this platform,
|
||||
see <file:Documentation/arm/IXP4xx>.
|
||||
|
||||
config MACH_LOFT
|
||||
bool "Loft"
|
||||
depends on MACH_AVILA
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the Giant
|
||||
Shoulder Inc Loft board (a minor variation on the standard
|
||||
Gateworks Avila Network Platform).
|
||||
|
||||
config ARCH_ADI_COYOTE
|
||||
bool "Coyote"
|
||||
select PCI
|
||||
|
@ -86,7 +94,7 @@ config MACH_NAS100D
|
|||
#
|
||||
config ARCH_IXDP4XX
|
||||
bool
|
||||
depends on ARCH_IXDP425 || ARCH_AVILA || MACH_IXDP465
|
||||
depends on ARCH_IXDP425 || MACH_IXDP465
|
||||
default y
|
||||
|
||||
#
|
||||
|
|
|
@ -6,6 +6,7 @@ obj-pci-y :=
|
|||
obj-pci-n :=
|
||||
|
||||
obj-pci-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o
|
||||
obj-pci-$(CONFIG_MACH_AVILA) += avila-pci.o
|
||||
obj-pci-$(CONFIG_MACH_IXDPG425) += ixdpg425-pci.o
|
||||
obj-pci-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o
|
||||
obj-pci-$(CONFIG_MACH_GTWX5715) += gtwx5715-pci.o
|
||||
|
@ -15,6 +16,7 @@ obj-pci-$(CONFIG_MACH_NAS100D) += nas100d-pci.o
|
|||
obj-y += common.o
|
||||
|
||||
obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-setup.o
|
||||
obj-$(CONFIG_MACH_AVILA) += avila-setup.o
|
||||
obj-$(CONFIG_MACH_IXDPG425) += coyote-setup.o
|
||||
obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-setup.o
|
||||
obj-$(CONFIG_MACH_GTWX5715) += gtwx5715-setup.o
|
||||
|
|
78
arch/arm/mach-ixp4xx/avila-pci.c
Normal file
78
arch/arm/mach-ixp4xx/avila-pci.c
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* arch/arm/mach-ixp4xx/avila-pci.c
|
||||
*
|
||||
* Gateworks Avila board-level PCI initialization
|
||||
*
|
||||
* Author: Michael-Luke Jones <mlj28@cam.ac.uk>
|
||||
*
|
||||
* Based on ixdp-pci.c
|
||||
* Copyright (C) 2002 Intel Corporation.
|
||||
* Copyright (C) 2003-2004 MontaVista Software, Inc.
|
||||
*
|
||||
* Maintainer: Deepak Saxena <dsaxena@plexity.net>
|
||||
*
|
||||
* 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/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
void __init avila_pci_preinit(void)
|
||||
{
|
||||
set_irq_type(IRQ_AVILA_PCI_INTA, IRQT_LOW);
|
||||
set_irq_type(IRQ_AVILA_PCI_INTB, IRQT_LOW);
|
||||
set_irq_type(IRQ_AVILA_PCI_INTC, IRQT_LOW);
|
||||
set_irq_type(IRQ_AVILA_PCI_INTD, IRQT_LOW);
|
||||
|
||||
ixp4xx_pci_preinit();
|
||||
}
|
||||
|
||||
static int __init avila_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
static int pci_irq_table[AVILA_PCI_IRQ_LINES] = {
|
||||
IRQ_AVILA_PCI_INTA,
|
||||
IRQ_AVILA_PCI_INTB,
|
||||
IRQ_AVILA_PCI_INTC,
|
||||
IRQ_AVILA_PCI_INTD
|
||||
};
|
||||
|
||||
int irq = -1;
|
||||
|
||||
if (slot >= 1 &&
|
||||
slot <= (machine_is_loft() ? LOFT_PCI_MAX_DEV : AVILA_PCI_MAX_DEV) &&
|
||||
pin >= 1 && pin <= AVILA_PCI_IRQ_LINES) {
|
||||
irq = pci_irq_table[(slot + pin - 2) % 4];
|
||||
}
|
||||
|
||||
return irq;
|
||||
}
|
||||
|
||||
struct hw_pci avila_pci __initdata = {
|
||||
.nr_controllers = 1,
|
||||
.preinit = avila_pci_preinit,
|
||||
.swizzle = pci_std_swizzle,
|
||||
.setup = ixp4xx_setup,
|
||||
.scan = ixp4xx_scan_bus,
|
||||
.map_irq = avila_map_irq,
|
||||
};
|
||||
|
||||
int __init avila_pci_init(void)
|
||||
{
|
||||
if (machine_is_avila() || machine_is_loft())
|
||||
pci_common_init(&avila_pci);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(avila_pci_init);
|
||||
|
192
arch/arm/mach-ixp4xx/avila-setup.c
Normal file
192
arch/arm/mach-ixp4xx/avila-setup.c
Normal file
|
@ -0,0 +1,192 @@
|
|||
/*
|
||||
* arch/arm/mach-ixp4xx/avila-setup.c
|
||||
*
|
||||
* Gateworks Avila board-setup
|
||||
*
|
||||
* Author: Michael-Luke Jones <mlj28@cam.ac.uk>
|
||||
*
|
||||
* Based on ixdp-setup.c
|
||||
* Copyright (C) 2003-2005 MontaVista Software, Inc.
|
||||
*
|
||||
* Author: Deepak Saxena <dsaxena@plexity.net>
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
static struct flash_platform_data avila_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.width = 2,
|
||||
};
|
||||
|
||||
static struct resource avila_flash_resource = {
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct platform_device avila_flash = {
|
||||
.name = "IXP4XX-Flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &avila_flash_data,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = &avila_flash_resource,
|
||||
};
|
||||
|
||||
static struct ixp4xx_i2c_pins avila_i2c_gpio_pins = {
|
||||
.sda_pin = AVILA_SDA_PIN,
|
||||
.scl_pin = AVILA_SCL_PIN,
|
||||
};
|
||||
|
||||
static struct platform_device avila_i2c_controller = {
|
||||
.name = "IXP4XX-I2C",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &avila_i2c_gpio_pins,
|
||||
},
|
||||
.num_resources = 0
|
||||
};
|
||||
|
||||
static struct resource avila_uart_resources[] = {
|
||||
{
|
||||
.start = IXP4XX_UART1_BASE_PHYS,
|
||||
.end = IXP4XX_UART1_BASE_PHYS + 0x0fff,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
{
|
||||
.start = IXP4XX_UART2_BASE_PHYS,
|
||||
.end = IXP4XX_UART2_BASE_PHYS + 0x0fff,
|
||||
.flags = IORESOURCE_MEM
|
||||
}
|
||||
};
|
||||
|
||||
static struct plat_serial8250_port avila_uart_data[] = {
|
||||
{
|
||||
.mapbase = IXP4XX_UART1_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART1,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
},
|
||||
{
|
||||
.mapbase = IXP4XX_UART2_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART2,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device avila_uart = {
|
||||
.name = "serial8250",
|
||||
.id = PLAT8250_DEV_PLATFORM,
|
||||
.dev.platform_data = avila_uart_data,
|
||||
.num_resources = 2,
|
||||
.resource = avila_uart_resources
|
||||
};
|
||||
|
||||
static struct resource avila_pata_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
{
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "intrq",
|
||||
.start = IRQ_IXP4XX_GPIO12,
|
||||
.end = IRQ_IXP4XX_GPIO12,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ixp4xx_pata_data avila_pata_data = {
|
||||
.cs0_bits = 0xbfff0043,
|
||||
.cs1_bits = 0xbfff0043,
|
||||
};
|
||||
|
||||
static struct platform_device avila_pata = {
|
||||
.name = "pata_ixp4xx_cf",
|
||||
.id = 0,
|
||||
.dev.platform_data = &avila_pata_data,
|
||||
.num_resources = ARRAY_SIZE(avila_pata_resources),
|
||||
.resource = avila_pata_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *avila_devices[] __initdata = {
|
||||
&avila_i2c_controller,
|
||||
&avila_flash,
|
||||
&avila_uart
|
||||
};
|
||||
|
||||
static void __init avila_init(void)
|
||||
{
|
||||
ixp4xx_sys_init();
|
||||
|
||||
avila_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
|
||||
avila_flash_resource.end =
|
||||
IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;
|
||||
|
||||
platform_add_devices(avila_devices, ARRAY_SIZE(avila_devices));
|
||||
|
||||
avila_pata_resources[0].start = IXP4XX_EXP_BUS_BASE(1);
|
||||
avila_pata_resources[0].end = IXP4XX_EXP_BUS_END(1);
|
||||
|
||||
avila_pata_resources[1].start = IXP4XX_EXP_BUS_BASE(2);
|
||||
avila_pata_resources[1].end = IXP4XX_EXP_BUS_END(2);
|
||||
|
||||
avila_pata_data.cs0_cfg = IXP4XX_EXP_CS1;
|
||||
avila_pata_data.cs1_cfg = IXP4XX_EXP_CS2;
|
||||
|
||||
platform_device_register(&avila_pata);
|
||||
|
||||
}
|
||||
|
||||
MACHINE_START(AVILA, "Gateworks Avila Network Platform")
|
||||
/* Maintainer: Deepak Saxena <dsaxena@plexity.net> */
|
||||
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||
.map_io = ixp4xx_map_io,
|
||||
.init_irq = ixp4xx_init_irq,
|
||||
.timer = &ixp4xx_timer,
|
||||
.boot_params = 0x0100,
|
||||
.init_machine = avila_init,
|
||||
MACHINE_END
|
||||
|
||||
/*
|
||||
* Loft is functionally equivalent to Avila except that it has a
|
||||
* different number for the maximum PCI devices. The MACHINE
|
||||
* structure below is identical to Avila except for the comment.
|
||||
*/
|
||||
#ifdef CONFIG_MACH_LOFT
|
||||
MACHINE_START(LOFT, "Giant Shoulder Inc Loft board")
|
||||
/* Maintainer: Tom Billman <kernel@giantshoulderinc.com> */
|
||||
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||
.map_io = ixp4xx_map_io,
|
||||
.init_irq = ixp4xx_init_irq,
|
||||
.timer = &ixp4xx_timer,
|
||||
.boot_params = 0x0100,
|
||||
.init_machine = avila_init,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
|
@ -66,7 +66,7 @@ struct hw_pci ixdp425_pci __initdata = {
|
|||
int __init ixdp425_pci_init(void)
|
||||
{
|
||||
if (machine_is_ixdp425() || machine_is_ixcdp1100() ||
|
||||
machine_is_avila() || machine_is_ixdp465())
|
||||
machine_is_ixdp465())
|
||||
pci_common_init(&ixdp425_pci);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -156,23 +156,3 @@ MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform")
|
|||
.init_machine = ixdp425_init,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Avila is functionally equivalent to IXDP425 except that it adds
|
||||
* a CF IDE slot hanging off the expansion bus. When we have a
|
||||
* driver for IXP4xx CF IDE with driver model support we'll move
|
||||
* Avila to it's own setup file.
|
||||
*/
|
||||
#ifdef CONFIG_ARCH_AVILA
|
||||
MACHINE_START(AVILA, "Gateworks Avila Network Platform")
|
||||
/* Maintainer: Deepak Saxena <dsaxena@plexity.net> */
|
||||
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||
.map_io = ixp4xx_map_io,
|
||||
.init_irq = ixp4xx_init_irq,
|
||||
.timer = &ixp4xx_timer,
|
||||
.boot_params = 0x0100,
|
||||
.init_machine = ixdp425_init,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
|
|
21
arch/arm/mach-ns9xxx/Kconfig
Normal file
21
arch/arm/mach-ns9xxx/Kconfig
Normal file
|
@ -0,0 +1,21 @@
|
|||
if ARCH_NS9XXX
|
||||
|
||||
menu "NS9xxx Implementations"
|
||||
|
||||
config MACH_CC9P9360DEV
|
||||
bool "Connect Core 9P 9360 on an A9M9750 Devboard"
|
||||
select PROCESSOR_NS9360
|
||||
select BOARD_A9M9750DEV
|
||||
help
|
||||
Say Y here if you are using the Digi Connect Core 9P 9360
|
||||
on an A9M9750 Development Board.
|
||||
|
||||
config PROCESSOR_NS9360
|
||||
bool
|
||||
|
||||
config BOARD_A9M9750DEV
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
5
arch/arm/mach-ns9xxx/Makefile
Normal file
5
arch/arm/mach-ns9xxx/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
obj-y := irq.o time.o generic.o
|
||||
|
||||
obj-$(CONFIG_MACH_CC9P9360DEV) += mach-cc9p9360dev.o
|
||||
|
||||
obj-$(CONFIG_BOARD_A9M9750DEV) += board-a9m9750dev.o
|
2
arch/arm/mach-ns9xxx/Makefile.boot
Normal file
2
arch/arm/mach-ns9xxx/Makefile.boot
Normal file
|
@ -0,0 +1,2 @@
|
|||
zreladdr-y := 0x108000
|
||||
params_phys-y := 0x100
|
199
arch/arm/mach-ns9xxx/board-a9m9750dev.c
Normal file
199
arch/arm/mach-ns9xxx/board-a9m9750dev.c
Normal file
|
@ -0,0 +1,199 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/board-a9m9750dev.c
|
||||
*
|
||||
* Copyright (C) 2006,2007 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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/platform_device.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/arch-ns9xxx/board.h>
|
||||
#include <asm/arch-ns9xxx/regs-sys.h>
|
||||
#include <asm/arch-ns9xxx/regs-mem.h>
|
||||
#include <asm/arch-ns9xxx/regs-bbu.h>
|
||||
#include <asm/arch-ns9xxx/regs-board-a9m9750dev.h>
|
||||
|
||||
#include "board-a9m9750dev.h"
|
||||
|
||||
static struct map_desc board_a9m9750dev_io_desc[] __initdata = {
|
||||
{ /* FPGA on CS0 */
|
||||
.virtual = io_p2v(NS9XXX_CSxSTAT_PHYS(0)),
|
||||
.pfn = __phys_to_pfn(NS9XXX_CSxSTAT_PHYS(0)),
|
||||
.length = NS9XXX_CS0STAT_LENGTH,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
void __init board_a9m9750dev_map_io(void)
|
||||
{
|
||||
iotable_init(board_a9m9750dev_io_desc,
|
||||
ARRAY_SIZE(board_a9m9750dev_io_desc));
|
||||
}
|
||||
|
||||
static void a9m9750dev_fpga_ack_irq(unsigned int irq)
|
||||
{
|
||||
/* nothing */
|
||||
}
|
||||
|
||||
static void a9m9750dev_fpga_mask_irq(unsigned int irq)
|
||||
{
|
||||
FPGA_IER &= ~(1 << (irq - FPGA_IRQ(0)));
|
||||
}
|
||||
|
||||
static void a9m9750dev_fpga_maskack_irq(unsigned int irq)
|
||||
{
|
||||
a9m9750dev_fpga_mask_irq(irq);
|
||||
a9m9750dev_fpga_ack_irq(irq);
|
||||
}
|
||||
|
||||
static void a9m9750dev_fpga_unmask_irq(unsigned int irq)
|
||||
{
|
||||
FPGA_IER |= 1 << (irq - FPGA_IRQ(0));
|
||||
}
|
||||
|
||||
static struct irq_chip a9m9750dev_fpga_chip = {
|
||||
.ack = a9m9750dev_fpga_ack_irq,
|
||||
.mask = a9m9750dev_fpga_mask_irq,
|
||||
.mask_ack = a9m9750dev_fpga_maskack_irq,
|
||||
.unmask = a9m9750dev_fpga_unmask_irq,
|
||||
};
|
||||
|
||||
static void a9m9750dev_fpga_demux_handler(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
int stat = FPGA_ISR;
|
||||
|
||||
while (stat != 0) {
|
||||
int irqno = fls(stat) - 1;
|
||||
|
||||
stat &= ~(1 << irqno);
|
||||
|
||||
desc = irq_desc + FPGA_IRQ(irqno);
|
||||
|
||||
desc_handle_irq(irqno, desc);
|
||||
}
|
||||
}
|
||||
|
||||
void __init board_a9m9750dev_init_irq(void)
|
||||
{
|
||||
u32 reg;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* configure gpio for IRQ_EXT2
|
||||
* use GPIO 11, because GPIO 32 is used for the LCD
|
||||
*/
|
||||
/* XXX: proper GPIO handling */
|
||||
BBU_GC(2) &= ~0x2000;
|
||||
|
||||
for (i = FPGA_IRQ(0); i <= FPGA_IRQ(7); ++i) {
|
||||
set_irq_chip(i, &a9m9750dev_fpga_chip);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
}
|
||||
|
||||
/* IRQ_EXT2: level sensitive + active low */
|
||||
reg = SYS_EIC(2);
|
||||
REGSET(reg, SYS_EIC, PLTY, AL);
|
||||
REGSET(reg, SYS_EIC, LVEDG, LEVEL);
|
||||
SYS_EIC(2) = reg;
|
||||
|
||||
set_irq_chained_handler(IRQ_EXT2,
|
||||
a9m9750dev_fpga_demux_handler);
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port board_a9m9750dev_serial8250_port[] = {
|
||||
{
|
||||
.iobase = FPGA_UARTA_BASE,
|
||||
.membase = (unsigned char*)FPGA_UARTA_BASE,
|
||||
.mapbase = FPGA_UARTA_BASE,
|
||||
.irq = IRQ_FPGA_UARTA,
|
||||
.iotype = UPIO_MEM,
|
||||
.uartclk = 18432000,
|
||||
.regshift = 0,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ,
|
||||
}, {
|
||||
.iobase = FPGA_UARTB_BASE,
|
||||
.membase = (unsigned char*)FPGA_UARTB_BASE,
|
||||
.mapbase = FPGA_UARTB_BASE,
|
||||
.irq = IRQ_FPGA_UARTB,
|
||||
.iotype = UPIO_MEM,
|
||||
.uartclk = 18432000,
|
||||
.regshift = 0,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ,
|
||||
}, {
|
||||
.iobase = FPGA_UARTC_BASE,
|
||||
.membase = (unsigned char*)FPGA_UARTC_BASE,
|
||||
.mapbase = FPGA_UARTC_BASE,
|
||||
.irq = IRQ_FPGA_UARTC,
|
||||
.iotype = UPIO_MEM,
|
||||
.uartclk = 18432000,
|
||||
.regshift = 0,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ,
|
||||
}, {
|
||||
.iobase = FPGA_UARTD_BASE,
|
||||
.membase = (unsigned char*)FPGA_UARTD_BASE,
|
||||
.mapbase = FPGA_UARTD_BASE,
|
||||
.irq = IRQ_FPGA_UARTD,
|
||||
.iotype = UPIO_MEM,
|
||||
.uartclk = 18432000,
|
||||
.regshift = 0,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ,
|
||||
}, {
|
||||
/* end marker */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device board_a9m9750dev_serial_device = {
|
||||
.name = "serial8250",
|
||||
.dev = {
|
||||
.platform_data = board_a9m9750dev_serial8250_port,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *board_a9m9750dev_devices[] __initdata = {
|
||||
&board_a9m9750dev_serial_device,
|
||||
};
|
||||
|
||||
void __init board_a9m9750dev_init_machine(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
/* setup static CS0: memory base ... */
|
||||
REGSETIM(SYS_SMCSSMB(0), SYS_SMCSSMB, CSxB,
|
||||
NS9XXX_CSxSTAT_PHYS(0) >> 12);
|
||||
|
||||
/* ... and mask */
|
||||
reg = SYS_SMCSSMM(0);
|
||||
REGSETIM(reg, SYS_SMCSSMM, CSxM, 0xfffff);
|
||||
REGSET(reg, SYS_SMCSSMM, CSEx, EN);
|
||||
SYS_SMCSSMM(0) = reg;
|
||||
|
||||
/* setup static CS0: memory configuration */
|
||||
reg = MEM_SMC(0);
|
||||
REGSET(reg, MEM_SMC, WSMC, OFF);
|
||||
REGSET(reg, MEM_SMC, BSMC, OFF);
|
||||
REGSET(reg, MEM_SMC, EW, OFF);
|
||||
REGSET(reg, MEM_SMC, PB, 1);
|
||||
REGSET(reg, MEM_SMC, PC, AL);
|
||||
REGSET(reg, MEM_SMC, PM, DIS);
|
||||
REGSET(reg, MEM_SMC, MW, 8);
|
||||
MEM_SMC(0) = reg;
|
||||
|
||||
/* setup static CS0: timing */
|
||||
MEM_SMWED(0) = 0x2;
|
||||
MEM_SMOED(0) = 0x2;
|
||||
MEM_SMRD(0) = 0x6;
|
||||
MEM_SMWD(0) = 0x6;
|
||||
|
||||
platform_add_devices(board_a9m9750dev_devices,
|
||||
ARRAY_SIZE(board_a9m9750dev_devices));
|
||||
}
|
||||
|
15
arch/arm/mach-ns9xxx/board-a9m9750dev.h
Normal file
15
arch/arm/mach-ns9xxx/board-a9m9750dev.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/board-a9m9750dev.h
|
||||
*
|
||||
* Copyright (C) 2006 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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/init.h>
|
||||
|
||||
void __init board_a9m9750dev_map_io(void);
|
||||
void __init board_a9m9750dev_init_machine(void);
|
||||
void __init board_a9m9750dev_init_irq(void);
|
42
arch/arm/mach-ns9xxx/generic.c
Normal file
42
arch/arm/mach-ns9xxx/generic.c
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/generic.c
|
||||
*
|
||||
* Copyright (C) 2006 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/arch-ns9xxx/regs-sys.h>
|
||||
#include <asm/arch-ns9xxx/regs-mem.h>
|
||||
#include <asm/arch-ns9xxx/board.h>
|
||||
|
||||
static struct map_desc standard_io_desc[] __initdata = {
|
||||
{ /* BBus */
|
||||
.virtual = io_p2v(0x90000000),
|
||||
.pfn = __phys_to_pfn(0x90000000),
|
||||
.length = 0x00700000,
|
||||
.type = MT_DEVICE,
|
||||
}, { /* AHB */
|
||||
.virtual = io_p2v(0xa0100000),
|
||||
.pfn = __phys_to_pfn(0xa0100000),
|
||||
.length = 0x00900000,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
void __init ns9xxx_map_io(void)
|
||||
{
|
||||
iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
|
||||
}
|
||||
|
||||
void __init ns9xxx_init_machine(void)
|
||||
{
|
||||
}
|
19
arch/arm/mach-ns9xxx/generic.h
Normal file
19
arch/arm/mach-ns9xxx/generic.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/generic.h
|
||||
*
|
||||
* Copyright (C) 2006 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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/time.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
void __init ns9xxx_init_irq(void);
|
||||
void __init ns9xxx_map_io(void);
|
||||
void __init ns9xxx_init_machine(void);
|
||||
|
||||
extern struct sys_timer ns9xxx_timer;
|
94
arch/arm/mach-ns9xxx/irq.c
Normal file
94
arch/arm/mach-ns9xxx/irq.c
Normal file
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/irq.c
|
||||
*
|
||||
* Copyright (C) 2006,2007 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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/interrupt.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/arch-ns9xxx/regs-sys.h>
|
||||
#include <asm/arch-ns9xxx/irqs.h>
|
||||
#include <asm/arch-ns9xxx/board.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
static void ns9xxx_ack_irq_timer(unsigned int irq)
|
||||
{
|
||||
u32 tc = SYS_TC(irq - IRQ_TIMER0);
|
||||
|
||||
REGSET(tc, SYS_TCx, INTC, SET);
|
||||
SYS_TC(irq - IRQ_TIMER0) = tc;
|
||||
|
||||
REGSET(tc, SYS_TCx, INTC, UNSET);
|
||||
SYS_TC(irq - IRQ_TIMER0) = tc;
|
||||
}
|
||||
|
||||
void (*ns9xxx_ack_irq_functions[NR_IRQS])(unsigned int) = {
|
||||
[IRQ_TIMER0] = ns9xxx_ack_irq_timer,
|
||||
[IRQ_TIMER1] = ns9xxx_ack_irq_timer,
|
||||
[IRQ_TIMER2] = ns9xxx_ack_irq_timer,
|
||||
[IRQ_TIMER3] = ns9xxx_ack_irq_timer,
|
||||
};
|
||||
|
||||
static void ns9xxx_mask_irq(unsigned int irq)
|
||||
{
|
||||
/* XXX: better use cpp symbols */
|
||||
SYS_IC(irq / 4) &= ~(1 << (7 + 8 * (3 - (irq & 3))));
|
||||
}
|
||||
|
||||
static void ns9xxx_ack_irq(unsigned int irq)
|
||||
{
|
||||
if (!ns9xxx_ack_irq_functions[irq]) {
|
||||
printk(KERN_ERR "no ack function for irq %u\n", irq);
|
||||
BUG();
|
||||
}
|
||||
|
||||
ns9xxx_ack_irq_functions[irq](irq);
|
||||
SYS_ISRADDR = 0;
|
||||
}
|
||||
|
||||
static void ns9xxx_maskack_irq(unsigned int irq)
|
||||
{
|
||||
ns9xxx_mask_irq(irq);
|
||||
ns9xxx_ack_irq(irq);
|
||||
}
|
||||
|
||||
static void ns9xxx_unmask_irq(unsigned int irq)
|
||||
{
|
||||
/* XXX: better use cpp symbols */
|
||||
SYS_IC(irq / 4) |= 1 << (7 + 8 * (3 - (irq & 3)));
|
||||
}
|
||||
|
||||
static struct irq_chip ns9xxx_chip = {
|
||||
.ack = ns9xxx_ack_irq,
|
||||
.mask = ns9xxx_mask_irq,
|
||||
.mask_ack = ns9xxx_maskack_irq,
|
||||
.unmask = ns9xxx_unmask_irq,
|
||||
};
|
||||
|
||||
void __init ns9xxx_init_irq(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* disable all IRQs */
|
||||
for (i = 0; i < 8; ++i)
|
||||
SYS_IC(i) = (4 * i) << 24 | (4 * i + 1) << 16 |
|
||||
(4 * i + 2) << 8 | (4 * i + 3);
|
||||
|
||||
/* simple interrupt prio table:
|
||||
* prio(x) < prio(y) <=> x < y
|
||||
*/
|
||||
for (i = 0; i < 32; ++i)
|
||||
SYS_IVA(i) = i;
|
||||
|
||||
for (i = IRQ_WATCHDOG; i <= IRQ_EXT3; ++i) {
|
||||
set_irq_chip(i, &ns9xxx_chip);
|
||||
set_irq_handler(i, handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
}
|
||||
}
|
41
arch/arm/mach-ns9xxx/mach-cc9p9360dev.c
Normal file
41
arch/arm/mach-ns9xxx/mach-cc9p9360dev.c
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/mach-cc9p9360dev.c
|
||||
*
|
||||
* Copyright (C) 2006 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include "board-a9m9750dev.h"
|
||||
#include "generic.h"
|
||||
|
||||
static void __init mach_cc9p9360dev_map_io(void)
|
||||
{
|
||||
ns9xxx_map_io();
|
||||
board_a9m9750dev_map_io();
|
||||
}
|
||||
|
||||
static void __init mach_cc9p9360dev_init_irq(void)
|
||||
{
|
||||
ns9xxx_init_irq();
|
||||
board_a9m9750dev_init_irq();
|
||||
}
|
||||
|
||||
static void __init mach_cc9p9360dev_init_machine(void)
|
||||
{
|
||||
ns9xxx_init_machine();
|
||||
board_a9m9750dev_init_machine();
|
||||
}
|
||||
|
||||
MACHINE_START(CC9P9360DEV, "Connect Core 9P 9360 on an A9M9750 Devboard")
|
||||
.map_io = mach_cc9p9360dev_map_io,
|
||||
.init_irq = mach_cc9p9360dev_init_irq,
|
||||
.init_machine = mach_cc9p9360dev_init_machine,
|
||||
.timer = &ns9xxx_timer,
|
||||
.boot_params = 0x100,
|
||||
MACHINE_END
|
88
arch/arm/mach-ns9xxx/time.c
Normal file
88
arch/arm/mach-ns9xxx/time.c
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* arch/arm/mach-ns9xxx/time.c
|
||||
*
|
||||
* Copyright (C) 2006 by Digi International Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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/jiffies.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/arch-ns9xxx/regs-sys.h>
|
||||
#include <asm/arch-ns9xxx/clock.h>
|
||||
#include <asm/arch-ns9xxx/irqs.h>
|
||||
#include <asm/arch/system.h>
|
||||
#include "generic.h"
|
||||
|
||||
#define TIMERCLOCKSELECT 64
|
||||
|
||||
static u32 usecs_per_tick;
|
||||
|
||||
static irqreturn_t
|
||||
ns9xxx_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
write_seqlock(&xtime_lock);
|
||||
timer_tick();
|
||||
write_sequnlock(&xtime_lock);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static unsigned long ns9xxx_timer_gettimeoffset(void)
|
||||
{
|
||||
/* return the microseconds which have passed since the last interrupt
|
||||
* was _serviced_. That is, if an interrupt is pending or the counter
|
||||
* reloads, return one periode more. */
|
||||
|
||||
u32 counter1 = SYS_TR(0);
|
||||
int pending = SYS_ISR & (1 << IRQ_TIMER0);
|
||||
u32 counter2 = SYS_TR(0);
|
||||
u32 elapsed;
|
||||
|
||||
if (pending || counter2 > counter1)
|
||||
elapsed = 2 * SYS_TRC(0) - counter2;
|
||||
else
|
||||
elapsed = SYS_TRC(0) - counter1;
|
||||
|
||||
return (elapsed * usecs_per_tick) >> 16;
|
||||
|
||||
}
|
||||
|
||||
static struct irqaction ns9xxx_timer_irq = {
|
||||
.name = "NS9xxx Timer Tick",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER,
|
||||
.handler = ns9xxx_timer_interrupt,
|
||||
};
|
||||
|
||||
static void __init ns9xxx_timer_init(void)
|
||||
{
|
||||
int tc;
|
||||
|
||||
usecs_per_tick =
|
||||
SH_DIV(1000000 * TIMERCLOCKSELECT, ns9xxx_cpuclock(), 16);
|
||||
|
||||
/* disable timer */
|
||||
if ((tc = SYS_TC(0)) & SYS_TCx_TEN)
|
||||
SYS_TC(0) = tc & ~SYS_TCx_TEN;
|
||||
|
||||
SYS_TRC(0) = SH_DIV(ns9xxx_cpuclock(), (TIMERCLOCKSELECT * HZ), 0);
|
||||
|
||||
REGSET(tc, SYS_TCx, TEN, EN);
|
||||
REGSET(tc, SYS_TCx, TLCS, DIV64); /* This must match TIMERCLOCKSELECT */
|
||||
REGSET(tc, SYS_TCx, INTS, EN);
|
||||
REGSET(tc, SYS_TCx, UDS, DOWN);
|
||||
REGSET(tc, SYS_TCx, TDBG, STOP);
|
||||
REGSET(tc, SYS_TCx, TSZ, 32);
|
||||
REGSET(tc, SYS_TCx, REN, EN);
|
||||
SYS_TC(0) = tc;
|
||||
|
||||
setup_irq(IRQ_TIMER0, &ns9xxx_timer_irq);
|
||||
}
|
||||
|
||||
struct sys_timer ns9xxx_timer = {
|
||||
.init = ns9xxx_timer_init,
|
||||
.offset = ns9xxx_timer_gettimeoffset,
|
||||
};
|
|
@ -338,6 +338,27 @@ static struct platform_device i2c_device = {
|
|||
.num_resources = ARRAY_SIZE(i2c_resources),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PXA27x
|
||||
static struct resource i2c_power_resources[] = {
|
||||
{
|
||||
.start = 0x40f00180,
|
||||
.end = 0x40f001a3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = IRQ_PWRI2C,
|
||||
.end = IRQ_PWRI2C,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device i2c_power_device = {
|
||||
.name = "pxa2xx-i2c",
|
||||
.id = 1,
|
||||
.resource = i2c_power_resources,
|
||||
.num_resources = ARRAY_SIZE(i2c_resources),
|
||||
};
|
||||
#endif
|
||||
|
||||
void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info)
|
||||
{
|
||||
i2c_device.dev.platform_data = info;
|
||||
|
@ -392,6 +413,9 @@ static struct platform_device *devices[] __initdata = {
|
|||
&stuart_device,
|
||||
&pxaficp_device,
|
||||
&i2c_device,
|
||||
#ifdef CONFIG_PXA27x
|
||||
&i2c_power_device,
|
||||
#endif
|
||||
&i2s_device,
|
||||
&pxartc_device,
|
||||
};
|
||||
|
|
|
@ -10,10 +10,21 @@ config MACH_REALVIEW_EB
|
|||
config REALVIEW_MPCORE
|
||||
bool "Support MPcore tile"
|
||||
depends on MACH_REALVIEW_EB
|
||||
select CACHE_L2X0
|
||||
help
|
||||
Enable support for the MPCore tile on the Realview platform.
|
||||
Since there are device address and interrupt differences, a
|
||||
kernel built with this option enabled is not compatible with
|
||||
other tiles.
|
||||
|
||||
config REALVIEW_MPCORE_REVB
|
||||
bool "Support MPcore RevB tile"
|
||||
depends on REALVIEW_MPCORE
|
||||
default n
|
||||
help
|
||||
Enable support for the MPCore RevB tile on the Realview platform.
|
||||
Since there are device address differences, a
|
||||
kernel built with this option enabled is not compatible with
|
||||
other tiles.
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -52,13 +52,14 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
|||
* core (e.g. timer irq), then they will not have been enabled
|
||||
* for us: do so
|
||||
*/
|
||||
gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE));
|
||||
gic_cpu_init(0, __io_address(REALVIEW_GIC_CPU_BASE));
|
||||
|
||||
/*
|
||||
* let the primary processor know we're out of the
|
||||
* pen, then head off into the C entry point
|
||||
*/
|
||||
pen_release = -1;
|
||||
smp_wmb();
|
||||
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
|
@ -102,6 +103,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|||
|
||||
timeout = jiffies + (1 * HZ);
|
||||
while (time_before(jiffies, timeout)) {
|
||||
smp_rmb();
|
||||
if (pen_release == -1)
|
||||
break;
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
#include <asm/hardware/icst307.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -57,7 +58,26 @@ static struct map_desc realview_eb_io_desc[] __initdata = {
|
|||
.pfn = __phys_to_pfn(REALVIEW_GIC_DIST_BASE),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
#ifdef CONFIG_REALVIEW_MPCORE
|
||||
{
|
||||
.virtual = IO_ADDRESS(REALVIEW_GIC1_CPU_BASE),
|
||||
.pfn = __phys_to_pfn(REALVIEW_GIC1_CPU_BASE),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = IO_ADDRESS(REALVIEW_GIC1_DIST_BASE),
|
||||
.pfn = __phys_to_pfn(REALVIEW_GIC1_DIST_BASE),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = IO_ADDRESS(REALVIEW_MPCORE_L220_BASE),
|
||||
.pfn = __phys_to_pfn(REALVIEW_MPCORE_L220_BASE),
|
||||
.length = SZ_8K,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.virtual = IO_ADDRESS(REALVIEW_SCTL_BASE),
|
||||
.pfn = __phys_to_pfn(REALVIEW_SCTL_BASE),
|
||||
.length = SZ_4K,
|
||||
|
@ -138,19 +158,29 @@ static void __init gic_init_irq(void)
|
|||
#ifdef CONFIG_REALVIEW_MPCORE
|
||||
unsigned int pldctrl;
|
||||
writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK));
|
||||
pldctrl = readl(__io_address(REALVIEW_SYS_BASE) + 0xd8);
|
||||
pldctrl = readl(__io_address(REALVIEW_SYS_BASE) + REALVIEW_MPCORE_SYS_PLD_CTRL1);
|
||||
pldctrl |= 0x00800000; /* New irq mode */
|
||||
writel(pldctrl, __io_address(REALVIEW_SYS_BASE) + 0xd8);
|
||||
writel(pldctrl, __io_address(REALVIEW_SYS_BASE) + REALVIEW_MPCORE_SYS_PLD_CTRL1);
|
||||
writel(0x00000000, __io_address(REALVIEW_SYS_LOCK));
|
||||
#endif
|
||||
gic_dist_init(__io_address(REALVIEW_GIC_DIST_BASE));
|
||||
gic_cpu_init(__io_address(REALVIEW_GIC_CPU_BASE));
|
||||
gic_dist_init(0, __io_address(REALVIEW_GIC_DIST_BASE), 29);
|
||||
gic_cpu_init(0, __io_address(REALVIEW_GIC_CPU_BASE));
|
||||
#ifdef CONFIG_REALVIEW_MPCORE
|
||||
gic_dist_init(1, __io_address(REALVIEW_GIC1_DIST_BASE), 64);
|
||||
gic_cpu_init(1, __io_address(REALVIEW_GIC1_CPU_BASE));
|
||||
gic_cascade_irq(1, IRQ_EB_IRQ1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init realview_eb_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_REALVIEW_MPCORE
|
||||
/* 1MB (128KB/way), 8-way associativity, evmon/parity/share enabled
|
||||
* Bits: .... ...0 0111 1001 0000 .... .... .... */
|
||||
l2x0_init(__io_address(REALVIEW_MPCORE_L220_BASE), 0x00790000, 0xfe000fff);
|
||||
#endif
|
||||
clk_register(&realview_clcd_clk);
|
||||
|
||||
platform_device_register(&realview_flash_device);
|
||||
|
|
13
arch/arm/mach-s3c2400/Kconfig
Normal file
13
arch/arm/mach-s3c2400/Kconfig
Normal file
|
@ -0,0 +1,13 @@
|
|||
# arch/arm/mach-s3c2400/Kconfig
|
||||
#
|
||||
# Copyright 2007 Simtec Electronics
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
|
||||
|
||||
menu "S3C2400 Machines"
|
||||
|
||||
|
||||
endmenu
|
||||
|
15
arch/arm/mach-s3c2400/Makefile
Normal file
15
arch/arm/mach-s3c2400/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
# arch/arm/mach-s3c2400/Makefile
|
||||
#
|
||||
# Copyright 2007 Simtec Electronics
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
obj-y :=
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2400) += gpio.o
|
||||
|
||||
# Machine support
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
/* linux/arch/arm/mach-s3c2410/s3c2400-gpio.c
|
||||
/* linux/arch/arm/mach-s3c2400/gpio.c
|
||||
*
|
||||
* Copyright (c) 2006 Lucas Correia Villa Real <lucasvr@gobolinux.org>
|
||||
*
|
|
@ -1,30 +1,69 @@
|
|||
if ARCH_S3C2410
|
||||
# arch/arm/mach-s3c2410/Kconfig
|
||||
#
|
||||
# Copyright 2007 Simtec Electronics
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
menu "S3C24XX Implementations"
|
||||
config CPU_S3C2410
|
||||
bool
|
||||
depends on ARCH_S3C2410
|
||||
select S3C2410_CLOCK
|
||||
select S3C2410_GPIO
|
||||
select S3C2410_PM if PM
|
||||
help
|
||||
Support for S3C2410 and S3C2410A family from the S3C24XX line
|
||||
of Samsung Mobile CPUs.
|
||||
|
||||
config MACH_AML_M5900
|
||||
bool "AML M5900 Series"
|
||||
config CPU_S3C2410_DMA
|
||||
bool
|
||||
depends on S3C2410_DMA && (CPU_S3C2410 || CPU_S3C2442)
|
||||
default y if CPU_S3C2410 || CPU_S3C2442
|
||||
help
|
||||
DMA device selection for S3C2410 and compatible CPUs
|
||||
|
||||
config S3C2410_PM
|
||||
bool
|
||||
help
|
||||
Power Management code common to S3C2410 and better
|
||||
|
||||
config S3C2410_GPIO
|
||||
bool
|
||||
help
|
||||
GPIO code for S3C2410 and similar processors
|
||||
|
||||
config S3C2410_CLOCK
|
||||
bool
|
||||
help
|
||||
Clock code for the S3C2410, and similar processors
|
||||
|
||||
|
||||
menu "S3C2410 Machines"
|
||||
|
||||
config ARCH_SMDK2410
|
||||
bool "SMDK2410/A9M2410"
|
||||
select CPU_S3C2410
|
||||
select PM_SIMTEC if PM
|
||||
select MACH_SMDK
|
||||
help
|
||||
Say Y here if you are using the American Microsystems M5900 Series
|
||||
<http://www.amltd.com>
|
||||
Say Y here if you are using the SMDK2410 or the derived module A9M2410
|
||||
<http://www.fsforth.de>
|
||||
|
||||
config MACH_ANUBIS
|
||||
bool "Simtec Electronics ANUBIS"
|
||||
select CPU_S3C2440
|
||||
select PM_SIMTEC if PM
|
||||
config ARCH_H1940
|
||||
bool "IPAQ H1940"
|
||||
select CPU_S3C2410
|
||||
select PM_H1940 if PM
|
||||
help
|
||||
Say Y here if you are using the Simtec Electronics ANUBIS
|
||||
development system
|
||||
Say Y here if you are using the HP IPAQ H1940
|
||||
|
||||
config MACH_OSIRIS
|
||||
bool "Simtec IM2440D20 (OSIRIS) module"
|
||||
select CPU_S3C2440
|
||||
select PM_SIMTEC if PM
|
||||
config PM_H1940
|
||||
bool
|
||||
help
|
||||
Say Y here if you are using the Simtec IM2440D20 module, also
|
||||
known as the Osiris.
|
||||
Internal node for H1940 and related PM
|
||||
|
||||
config MACH_N30
|
||||
bool "Acer N30"
|
||||
select CPU_S3C2410
|
||||
help
|
||||
Say Y here if you are using the Acer N30
|
||||
|
||||
config ARCH_BAST
|
||||
bool "Simtec Electronics BAST (EB2410ITX)"
|
||||
|
@ -35,7 +74,19 @@ config ARCH_BAST
|
|||
Say Y here if you are using the Simtec Electronics EB2410ITX
|
||||
development board (also known as BAST)
|
||||
|
||||
Product page: <http://www.simtec.co.uk/products/EB2410ITX/>.
|
||||
config MACH_OTOM
|
||||
bool "NexVision OTOM Board"
|
||||
select CPU_S3C2410
|
||||
help
|
||||
Say Y here if you are using the Nex Vision OTOM board
|
||||
|
||||
config MACH_AML_M5900
|
||||
bool "AML M5900 Series"
|
||||
select CPU_S3C2410
|
||||
select PM_SIMTEC if PM
|
||||
help
|
||||
Say Y here if you are using the American Microsystems M5900 Series
|
||||
<http://www.amltd.com>
|
||||
|
||||
config BAST_PC104_IRQ
|
||||
bool "BAST PC104 IRQ support"
|
||||
|
@ -45,74 +96,6 @@ config BAST_PC104_IRQ
|
|||
Say Y here to enable the PC104 IRQ routing on the
|
||||
Simtec BAST (EB2410ITX)
|
||||
|
||||
config PM_H1940
|
||||
bool
|
||||
help
|
||||
Internal node for H1940 and related PM
|
||||
|
||||
config ARCH_H1940
|
||||
bool "IPAQ H1940"
|
||||
select CPU_S3C2410
|
||||
select PM_H1940 if PM
|
||||
help
|
||||
Say Y here if you are using the HP IPAQ H1940
|
||||
|
||||
<http://www.handhelds.org/projects/h1940.html>.
|
||||
|
||||
config MACH_N30
|
||||
bool "Acer N30"
|
||||
select CPU_S3C2410
|
||||
help
|
||||
Say Y here if you are using the Acer N30
|
||||
|
||||
<http://zoo.weinigel.se/n30>.
|
||||
|
||||
config MACH_SMDK
|
||||
bool
|
||||
help
|
||||
Common machine code for SMDK2410 and SMDK2440
|
||||
|
||||
config ARCH_SMDK2410
|
||||
bool "SMDK2410/A9M2410"
|
||||
select CPU_S3C2410
|
||||
select MACH_SMDK
|
||||
help
|
||||
Say Y here if you are using the SMDK2410 or the derived module A9M2410
|
||||
<http://www.fsforth.de>
|
||||
|
||||
config ARCH_S3C2440
|
||||
bool "SMDK2440"
|
||||
select CPU_S3C2440
|
||||
select MACH_SMDK
|
||||
help
|
||||
Say Y here if you are using the SMDK2440.
|
||||
|
||||
config SMDK2440_CPU2440
|
||||
bool "SMDK2440 with S3C2440 CPU module"
|
||||
depends on ARCH_S3C2440
|
||||
default y if ARCH_S3C2440
|
||||
select CPU_S3C2440
|
||||
|
||||
config SMDK2440_CPU2442
|
||||
bool "SMDM2440 with S3C2442 CPU module"
|
||||
depends on ARCH_S3C2440
|
||||
select CPU_S3C2442
|
||||
|
||||
config MACH_S3C2413
|
||||
bool
|
||||
help
|
||||
Internal node for S3C2413 version of SMDK2413, so that
|
||||
machine_is_s3c2413() will work when MACH_SMDK2413 is
|
||||
selected
|
||||
|
||||
config MACH_SMDK2413
|
||||
bool "SMDK2413"
|
||||
select CPU_S3C2412
|
||||
select MACH_S3C2413
|
||||
select MACH_SMDK
|
||||
help
|
||||
Say Y here if you are using an SMDK2413
|
||||
|
||||
config MACH_VR1000
|
||||
bool "Thorcom VR1000"
|
||||
select PM_SIMTEC if PM
|
||||
|
@ -120,202 +103,11 @@ config MACH_VR1000
|
|||
help
|
||||
Say Y here if you are using the Thorcom VR1000 board.
|
||||
|
||||
This linux port is currently being maintained by Simtec, on behalf
|
||||
of Thorcom. Any queries, please contact Thorcom first.
|
||||
|
||||
config MACH_RX3715
|
||||
bool "HP iPAQ rx3715"
|
||||
select CPU_S3C2440
|
||||
select PM_H1940 if PM
|
||||
config MACH_QT2410
|
||||
bool "QT2410"
|
||||
select CPU_S3C2410
|
||||
help
|
||||
Say Y here if you are using the HP iPAQ rx3715.
|
||||
|
||||
See <http://www.handhelds.org/projects/rx3715.html> for more
|
||||
information on this project
|
||||
|
||||
config MACH_OTOM
|
||||
bool "NexVision OTOM Board"
|
||||
select CPU_S3C2410
|
||||
help
|
||||
Say Y here if you are using the Nex Vision OTOM board
|
||||
|
||||
config MACH_NEXCODER_2440
|
||||
bool "NexVision NEXCODER 2440 Light Board"
|
||||
select CPU_S3C2440
|
||||
help
|
||||
Say Y here if you are using the Nex Vision NEXCODER 2440 Light Board
|
||||
|
||||
config MACH_VSTMS
|
||||
bool "VMSTMS"
|
||||
select CPU_S3C2412
|
||||
help
|
||||
Say Y here if you are using an VSTMS board
|
||||
Say Y here if you are using the Armzone QT2410
|
||||
|
||||
endmenu
|
||||
|
||||
config S3C2410_CLOCK
|
||||
bool
|
||||
help
|
||||
Clock code for the S3C2410, and similar processors
|
||||
|
||||
config S3C2410_PM
|
||||
bool
|
||||
help
|
||||
Power Management code common to S3C2410 and better
|
||||
|
||||
config CPU_S3C2410_DMA
|
||||
bool
|
||||
depends on S3C2410_DMA && (CPU_S3C2410 || CPU_S3C2442)
|
||||
default y if CPU_S3C2410 || CPU_S3C2442
|
||||
help
|
||||
DMA device selection for S3C2410 and compatible CPUs
|
||||
|
||||
config CPU_S3C2410
|
||||
bool
|
||||
depends on ARCH_S3C2410
|
||||
select S3C2410_CLOCK
|
||||
select S3C2410_PM if PM
|
||||
help
|
||||
Support for S3C2410 and S3C2410A family from the S3C24XX line
|
||||
of Samsung Mobile CPUs.
|
||||
|
||||
# internal node to signify if we are only dealing with an S3C2412
|
||||
|
||||
config CPU_S3C2412_ONLY
|
||||
bool
|
||||
depends on ARCH_S3C2410 && !CPU_S3C2400 && !CPU_S3C2410 && \
|
||||
!CPU_S3C2440 && !CPU_S3C2442 && CPU_S3C2412
|
||||
default y if CPU_S3C2412
|
||||
|
||||
config S3C2412_PM
|
||||
bool
|
||||
help
|
||||
Internal config node to apply S3C2412 power management
|
||||
|
||||
config CPU_S3C2412
|
||||
bool
|
||||
depends on ARCH_S3C2410
|
||||
select S3C2412_PM if PM
|
||||
help
|
||||
Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line
|
||||
|
||||
config CPU_S3C244X
|
||||
bool
|
||||
depends on ARCH_S3C2410 && (CPU_S3C2440 || CPU_S3C2442)
|
||||
help
|
||||
Support for S3C2440 and S3C2442 Samsung Mobile CPU based systems.
|
||||
|
||||
config CPU_S3C2440
|
||||
bool
|
||||
depends on ARCH_S3C2410
|
||||
select S3C2410_CLOCK
|
||||
select S3C2410_PM if PM
|
||||
select CPU_S3C244X
|
||||
help
|
||||
Support for S3C2440 Samsung Mobile CPU based systems.
|
||||
|
||||
config CPU_S3C2442
|
||||
bool
|
||||
depends on ARCH_S3C2420
|
||||
select S3C2410_CLOCK
|
||||
select S3C2410_PM if PM
|
||||
select CPU_S3C244X
|
||||
help
|
||||
Support for S3C2442 Samsung Mobile CPU based systems.
|
||||
|
||||
comment "S3C2410 Boot"
|
||||
|
||||
config S3C2410_BOOT_WATCHDOG
|
||||
bool "S3C2410 Initialisation watchdog"
|
||||
depends on ARCH_S3C2410 && S3C2410_WATCHDOG
|
||||
help
|
||||
Say y to enable the watchdog during the kernel decompression
|
||||
stage. If the kernel fails to uncompress, then the watchdog
|
||||
will trigger a reset and the system should restart.
|
||||
|
||||
Although this uses the same hardware unit as the kernel watchdog
|
||||
driver, it is not a replacement for it. If you use this option,
|
||||
you will have to use the watchdg driver to either stop the timeout
|
||||
or restart it. If you do not, then your kernel will reboot after
|
||||
startup.
|
||||
|
||||
The driver uses a fixed timeout value, so the exact time till the
|
||||
system resets depends on the value of PCLK. The timeout on an
|
||||
200MHz s3c2410 should be about 30 seconds.
|
||||
|
||||
config S3C2410_BOOT_ERROR_RESET
|
||||
bool "S3C2410 Reboot on decompression error"
|
||||
depends on ARCH_S3C2410
|
||||
help
|
||||
Say y here to use the watchdog to reset the system if the
|
||||
kernel decompressor detects an error during decompression.
|
||||
|
||||
|
||||
comment "S3C2410 Setup"
|
||||
|
||||
config S3C2410_DMA
|
||||
bool "S3C2410 DMA support"
|
||||
depends on ARCH_S3C2410
|
||||
help
|
||||
S3C2410 DMA support. This is needed for drivers like sound which
|
||||
use the S3C2410's DMA system to move data to and from the
|
||||
peripheral blocks.
|
||||
|
||||
config S3C2410_DMA_DEBUG
|
||||
bool "S3C2410 DMA support debug"
|
||||
depends on ARCH_S3C2410 && S3C2410_DMA
|
||||
help
|
||||
Enable debugging output for the DMA code. This option sends info
|
||||
to the kernel log, at priority KERN_DEBUG.
|
||||
|
||||
Note, it is easy to create and fill the log buffer in a small
|
||||
amount of time, as well as using an significant percentage of
|
||||
the CPU time doing so.
|
||||
|
||||
|
||||
config S3C2410_PM_DEBUG
|
||||
bool "S3C2410 PM Suspend debug"
|
||||
depends on ARCH_S3C2410 && PM
|
||||
help
|
||||
Say Y here if you want verbose debugging from the PM Suspend and
|
||||
Resume code. See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt>
|
||||
for more information.
|
||||
|
||||
config S3C2410_PM_CHECK
|
||||
bool "S3C2410 PM Suspend Memory CRC"
|
||||
depends on ARCH_S3C2410 && PM && CRC32
|
||||
help
|
||||
Enable the PM code's memory area checksum over sleep. This option
|
||||
will generate CRCs of all blocks of memory, and store them before
|
||||
going to sleep. The blocks are then checked on resume for any
|
||||
errors.
|
||||
|
||||
config S3C2410_PM_CHECK_CHUNKSIZE
|
||||
int "S3C2410 PM Suspend CRC Chunksize (KiB)"
|
||||
depends on ARCH_S3C2410 && PM && S3C2410_PM_CHECK
|
||||
default 64
|
||||
help
|
||||
Set the chunksize in Kilobytes of the CRC for checking memory
|
||||
corruption over suspend and resume. A smaller value will mean that
|
||||
the CRC data block will take more memory, but wil identify any
|
||||
faults with better precision.
|
||||
|
||||
config PM_SIMTEC
|
||||
bool
|
||||
help
|
||||
Common power management code for systems that are
|
||||
compatible with the Simtec style of power management
|
||||
|
||||
config S3C2410_LOWLEVEL_UART_PORT
|
||||
int "S3C2410 UART to use for low-level messages"
|
||||
default 0
|
||||
help
|
||||
Choice of which UART port to use for the low-level messages,
|
||||
such as the `Uncompressing...` at start time. The value of
|
||||
this configuration should be between zero and two. The port
|
||||
must have been initialised by the boot-loader before use.
|
||||
|
||||
Note, this does not affect the port used by the debug messages,
|
||||
which is a separate configuration.
|
||||
|
||||
endif
|
||||
|
|
|
@ -1,92 +1,31 @@
|
|||
|
||||
# arch/arm/mach-s3c2410/Makefile
|
||||
#
|
||||
# Makefile for the linux kernel.
|
||||
# Copyright 2007 Simtec Electronics
|
||||
#
|
||||
# Licensed under GPLv2
|
||||
|
||||
# Object file lists.
|
||||
|
||||
obj-y := cpu.o irq.o time.o gpio.o clock.o devs.o
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
obj-dma-y :=
|
||||
obj-dma-n :=
|
||||
|
||||
# DMA
|
||||
obj-$(CONFIG_S3C2410_DMA) += dma.o
|
||||
|
||||
# S3C2400 support files
|
||||
obj-$(CONFIG_CPU_S3C2400) += s3c2400-gpio.o
|
||||
|
||||
# S3C2410 support files
|
||||
obj-y :=
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2410) += s3c2410.o
|
||||
obj-$(CONFIG_CPU_S3C2410) += s3c2410-gpio.o
|
||||
obj-$(CONFIG_CPU_S3C2410) += s3c2410-irq.o
|
||||
obj-$(CONFIG_CPU_S3C2410) += irq.o
|
||||
obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o
|
||||
obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o
|
||||
obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o
|
||||
obj-$(CONFIG_S3C2410_GPIO) += gpio.o
|
||||
obj-$(CONFIG_S3C2410_CLOCK) += clock.o
|
||||
|
||||
obj-$(CONFIG_S3C2410_PM) += s3c2410-pm.o s3c2410-sleep.o
|
||||
obj-$(CONFIG_CPU_S3C2410_DMA) += s3c2410-dma.o
|
||||
# Machine support
|
||||
|
||||
# Power Management support
|
||||
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
|
||||
obj-$(CONFIG_PM_H1940) += pm-h1940.o
|
||||
|
||||
# S3C2412 support
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412-irq.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412-clock.o
|
||||
obj-dma-$(CONFIG_CPU_S3C2412) += s3c2412-dma.o
|
||||
|
||||
obj-$(CONFIG_S3C2412_PM) += s3c2412-pm.o
|
||||
|
||||
#
|
||||
# S3C244X support
|
||||
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x.o
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x-irq.o
|
||||
|
||||
# Clock control
|
||||
|
||||
obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.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
|
||||
obj-$(CONFIG_CPU_S3C2440) += s3c2410-gpio.o
|
||||
obj-dma-$(CONFIG_CPU_S3C2440) += s3c2440-dma.o
|
||||
|
||||
# S3C2442 support
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2442) += s3c2442.o
|
||||
obj-$(CONFIG_CPU_S3C2442) += s3c2442-clock.o
|
||||
|
||||
# bast extras
|
||||
|
||||
obj-$(CONFIG_BAST_PC104_IRQ) += bast-irq.o
|
||||
|
||||
# merge in dma objects
|
||||
|
||||
obj-y += $(obj-dma-y)
|
||||
|
||||
# machine specific support
|
||||
|
||||
obj-$(CONFIG_MACH_AML_M5900) += mach-amlm5900.o
|
||||
obj-$(CONFIG_MACH_ANUBIS) += mach-anubis.o
|
||||
obj-$(CONFIG_MACH_OSIRIS) += mach-osiris.o
|
||||
obj-$(CONFIG_ARCH_BAST) += mach-bast.o usb-simtec.o
|
||||
obj-$(CONFIG_ARCH_H1940) += mach-h1940.o
|
||||
obj-$(CONFIG_MACH_N30) += mach-n30.o
|
||||
obj-$(CONFIG_ARCH_SMDK2410) += mach-smdk2410.o
|
||||
obj-$(CONFIG_MACH_SMDK2413) += mach-smdk2413.o
|
||||
obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
|
||||
obj-$(CONFIG_MACH_VR1000) += mach-vr1000.o usb-simtec.o
|
||||
obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o
|
||||
obj-$(CONFIG_ARCH_H1940) += mach-h1940.o
|
||||
obj-$(CONFIG_PM_H1940) += pm-h1940.o
|
||||
obj-$(CONFIG_MACH_N30) += mach-n30.o
|
||||
obj-$(CONFIG_ARCH_BAST) += mach-bast.o usb-simtec.o
|
||||
obj-$(CONFIG_MACH_OTOM) += mach-otom.o
|
||||
obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
|
||||
obj-$(CONFIG_MACH_VSTMS) += mach-vstms.o
|
||||
|
||||
obj-$(CONFIG_MACH_SMDK) += common-smdk.o
|
||||
obj-$(CONFIG_MACH_AML_M5900) += mach-amlm5900.o
|
||||
obj-$(CONFIG_BAST_PC104_IRQ) += bast-irq.o
|
||||
obj-$(CONFIG_MACH_VR1000) += mach-vr1000.o usb-simtec.o
|
||||
obj-$(CONFIG_MACH_QT2410) += mach-qt2410.o
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include <asm/arch/bast-map.h>
|
||||
#include <asm/arch/bast-irq.h>
|
||||
|
||||
#include "irq.h"
|
||||
#include <asm/plat-s3c24xx/irq.h>
|
||||
|
||||
#if 0
|
||||
#include <asm/debug-ll.h>
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
|
||||
/* linux/arch/arm/mach-s3c2410/bast.h
|
||||
extern void bast_init_irq(void);
|
||||
|
|
|
@ -1,15 +1,9 @@
|
|||
/* linux/arch/arm/mach-s3c2410/clock.c
|
||||
*
|
||||
* Copyright (c) 2004-2005 Simtec Electronics
|
||||
* Copyright (c) 2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C24XX Core clock control support
|
||||
*
|
||||
* Based on, and code from linux/arch/arm/mach-versatile/clock.c
|
||||
**
|
||||
** Copyright (C) 2004 ARM Limited.
|
||||
** Written by Deep Blue Solutions Limited.
|
||||
*
|
||||
* S3C2410,S3C2440,S3C2442 Clock control 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
|
||||
|
@ -32,418 +26,251 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/serial_core.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/regs-serial.h>
|
||||
#include <asm/arch/regs-clock.h>
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "cpu.h"
|
||||
#include <asm/plat-s3c24xx/s3c2410.h>
|
||||
#include <asm/plat-s3c24xx/clock.h>
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
|
||||
/* clock information */
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
|
||||
DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
/* enable and disable calls for use with the clk struct */
|
||||
|
||||
static int clk_null_enable(struct clk *clk, int enable)
|
||||
int s3c2410_clkcon_enable(struct clk *clk, int enable)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
unsigned int clocks = clk->ctrlbit;
|
||||
unsigned long clkcon;
|
||||
|
||||
/* Clock API calls */
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *p;
|
||||
struct clk *clk = ERR_PTR(-ENOENT);
|
||||
int idno;
|
||||
|
||||
if (dev == NULL || dev->bus != &platform_bus_type)
|
||||
idno = -1;
|
||||
else
|
||||
idno = to_platform_device(dev)->id;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
list_for_each_entry(p, &clocks, list) {
|
||||
if (p->id == idno &&
|
||||
strcmp(id, p->name) == 0 &&
|
||||
try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* check for the case where a device was supplied, but the
|
||||
* clock that was being searched for is not device specific */
|
||||
|
||||
if (IS_ERR(clk)) {
|
||||
list_for_each_entry(p, &clocks, list) {
|
||||
if (p->id == -1 && strcmp(id, p->name) == 0 &&
|
||||
try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return clk;
|
||||
}
|
||||
|
||||
void clk_put(struct clk *clk)
|
||||
{
|
||||
module_put(clk->owner);
|
||||
}
|
||||
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
if (IS_ERR(clk) || clk == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
clk_enable(clk->parent);
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
if ((clk->usage++) == 0)
|
||||
(clk->enable)(clk, 1);
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void clk_disable(struct clk *clk)
|
||||
{
|
||||
if (IS_ERR(clk) || clk == NULL)
|
||||
return;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
if ((--clk->usage) == 0)
|
||||
(clk->enable)(clk, 0);
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
clk_disable(clk->parent);
|
||||
}
|
||||
|
||||
|
||||
unsigned long clk_get_rate(struct clk *clk)
|
||||
{
|
||||
if (IS_ERR(clk))
|
||||
return 0;
|
||||
|
||||
if (clk->rate != 0)
|
||||
return clk->rate;
|
||||
|
||||
if (clk->get_rate != NULL)
|
||||
return (clk->get_rate)(clk);
|
||||
|
||||
if (clk->parent != NULL)
|
||||
return clk_get_rate(clk->parent);
|
||||
|
||||
return clk->rate;
|
||||
}
|
||||
|
||||
long clk_round_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
if (!IS_ERR(clk) && clk->round_rate)
|
||||
return (clk->round_rate)(clk, rate);
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
int clk_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (IS_ERR(clk))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
ret = (clk->set_rate)(clk, rate);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct clk *clk_get_parent(struct clk *clk)
|
||||
{
|
||||
return clk->parent;
|
||||
}
|
||||
|
||||
int clk_set_parent(struct clk *clk, struct clk *parent)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (IS_ERR(clk))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
if (clk->set_parent)
|
||||
ret = (clk->set_parent)(clk, parent);
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(clk_get);
|
||||
EXPORT_SYMBOL(clk_put);
|
||||
EXPORT_SYMBOL(clk_enable);
|
||||
EXPORT_SYMBOL(clk_disable);
|
||||
EXPORT_SYMBOL(clk_get_rate);
|
||||
EXPORT_SYMBOL(clk_round_rate);
|
||||
EXPORT_SYMBOL(clk_set_rate);
|
||||
EXPORT_SYMBOL(clk_get_parent);
|
||||
EXPORT_SYMBOL(clk_set_parent);
|
||||
|
||||
/* base clocks */
|
||||
|
||||
struct clk clk_xtal = {
|
||||
.name = "xtal",
|
||||
.id = -1,
|
||||
.rate = 0,
|
||||
.parent = NULL,
|
||||
.ctrlbit = 0,
|
||||
};
|
||||
|
||||
struct clk clk_mpll = {
|
||||
.name = "mpll",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
struct clk clk_upll = {
|
||||
.name = "upll",
|
||||
.id = -1,
|
||||
.parent = NULL,
|
||||
.ctrlbit = 0,
|
||||
};
|
||||
|
||||
struct clk clk_f = {
|
||||
.name = "fclk",
|
||||
.id = -1,
|
||||
.rate = 0,
|
||||
.parent = &clk_mpll,
|
||||
.ctrlbit = 0,
|
||||
};
|
||||
|
||||
struct clk clk_h = {
|
||||
.name = "hclk",
|
||||
.id = -1,
|
||||
.rate = 0,
|
||||
.parent = NULL,
|
||||
.ctrlbit = 0,
|
||||
};
|
||||
|
||||
struct clk clk_p = {
|
||||
.name = "pclk",
|
||||
.id = -1,
|
||||
.rate = 0,
|
||||
.parent = NULL,
|
||||
.ctrlbit = 0,
|
||||
};
|
||||
|
||||
struct clk clk_usb_bus = {
|
||||
.name = "usb-bus",
|
||||
.id = -1,
|
||||
.rate = 0,
|
||||
.parent = &clk_upll,
|
||||
};
|
||||
|
||||
/* clocks that could be registered by external code */
|
||||
|
||||
static int s3c24xx_dclk_enable(struct clk *clk, int enable)
|
||||
{
|
||||
unsigned long dclkcon = __raw_readl(S3C24XX_DCLKCON);
|
||||
clkcon = __raw_readl(S3C2410_CLKCON);
|
||||
|
||||
if (enable)
|
||||
dclkcon |= clk->ctrlbit;
|
||||
clkcon |= clocks;
|
||||
else
|
||||
dclkcon &= ~clk->ctrlbit;
|
||||
clkcon &= ~clocks;
|
||||
|
||||
__raw_writel(dclkcon, S3C24XX_DCLKCON);
|
||||
/* ensure none of the special function bits set */
|
||||
clkcon &= ~(S3C2410_CLKCON_IDLE|S3C2410_CLKCON_POWER);
|
||||
|
||||
__raw_writel(clkcon, S3C2410_CLKCON);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c24xx_dclk_setparent(struct clk *clk, struct clk *parent)
|
||||
static int s3c2410_upll_enable(struct clk *clk, int enable)
|
||||
{
|
||||
unsigned long dclkcon;
|
||||
unsigned int uclk;
|
||||
unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW);
|
||||
unsigned long orig = clkslow;
|
||||
|
||||
if (parent == &clk_upll)
|
||||
uclk = 1;
|
||||
else if (parent == &clk_p)
|
||||
uclk = 0;
|
||||
if (enable)
|
||||
clkslow &= ~S3C2410_CLKSLOW_UCLK_OFF;
|
||||
else
|
||||
return -EINVAL;
|
||||
clkslow |= S3C2410_CLKSLOW_UCLK_OFF;
|
||||
|
||||
clk->parent = parent;
|
||||
__raw_writel(clkslow, S3C2410_CLKSLOW);
|
||||
|
||||
dclkcon = __raw_readl(S3C24XX_DCLKCON);
|
||||
/* if we started the UPLL, then allow to settle */
|
||||
|
||||
if (clk->ctrlbit == S3C2410_DCLKCON_DCLK0EN) {
|
||||
if (uclk)
|
||||
dclkcon |= S3C2410_DCLKCON_DCLK0_UCLK;
|
||||
else
|
||||
dclkcon &= ~S3C2410_DCLKCON_DCLK0_UCLK;
|
||||
} else {
|
||||
if (uclk)
|
||||
dclkcon |= S3C2410_DCLKCON_DCLK1_UCLK;
|
||||
else
|
||||
dclkcon &= ~S3C2410_DCLKCON_DCLK1_UCLK;
|
||||
if (enable && (orig & S3C2410_CLKSLOW_UCLK_OFF))
|
||||
udelay(200);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* standard clock definitions */
|
||||
|
||||
static struct clk init_clocks_disable[] = {
|
||||
{
|
||||
.name = "nand",
|
||||
.id = -1,
|
||||
.parent = &clk_h,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_NAND,
|
||||
}, {
|
||||
.name = "sdi",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_SDI,
|
||||
}, {
|
||||
.name = "adc",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_ADC,
|
||||
}, {
|
||||
.name = "i2c",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_IIC,
|
||||
}, {
|
||||
.name = "iis",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_IIS,
|
||||
}, {
|
||||
.name = "spi",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_SPI,
|
||||
}
|
||||
};
|
||||
|
||||
static struct clk init_clocks[] = {
|
||||
{
|
||||
.name = "lcd",
|
||||
.id = -1,
|
||||
.parent = &clk_h,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_LCDC,
|
||||
}, {
|
||||
.name = "gpio",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_GPIO,
|
||||
}, {
|
||||
.name = "usb-host",
|
||||
.id = -1,
|
||||
.parent = &clk_h,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_USBH,
|
||||
}, {
|
||||
.name = "usb-device",
|
||||
.id = -1,
|
||||
.parent = &clk_h,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_USBD,
|
||||
}, {
|
||||
.name = "timers",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_PWMT,
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 0,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_UART0,
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_UART1,
|
||||
}, {
|
||||
.name = "uart",
|
||||
.id = 2,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_UART2,
|
||||
}, {
|
||||
.name = "rtc",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2410_CLKCON_RTC,
|
||||
}, {
|
||||
.name = "watchdog",
|
||||
.id = -1,
|
||||
.parent = &clk_p,
|
||||
.ctrlbit = 0,
|
||||
}, {
|
||||
.name = "usb-bus-host",
|
||||
.id = -1,
|
||||
.parent = &clk_usb_bus,
|
||||
}, {
|
||||
.name = "usb-bus-gadget",
|
||||
.id = -1,
|
||||
.parent = &clk_usb_bus,
|
||||
},
|
||||
};
|
||||
|
||||
/* s3c2410_baseclk_add()
|
||||
*
|
||||
* Add all the clocks used by the s3c2410 or compatible CPUs
|
||||
* such as the S3C2440 and S3C2442.
|
||||
*
|
||||
* We cannot use a system device as we are needed before any
|
||||
* of the init-calls that initialise the devices are actually
|
||||
* done.
|
||||
*/
|
||||
|
||||
int __init s3c2410_baseclk_add(void)
|
||||
{
|
||||
unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW);
|
||||
unsigned long clkcon = __raw_readl(S3C2410_CLKCON);
|
||||
struct clk *clkp;
|
||||
struct clk *xtal;
|
||||
int ret;
|
||||
int ptr;
|
||||
|
||||
clk_upll.enable = s3c2410_upll_enable;
|
||||
|
||||
if (s3c24xx_register_clock(&clk_usb_bus) < 0)
|
||||
printk(KERN_ERR "failed to register usb bus clock\n");
|
||||
|
||||
/* register clocks from clock array */
|
||||
|
||||
clkp = init_clocks;
|
||||
for (ptr = 0; ptr < ARRAY_SIZE(init_clocks); ptr++, clkp++) {
|
||||
/* ensure that we note the clock state */
|
||||
|
||||
clkp->usage = clkcon & clkp->ctrlbit ? 1 : 0;
|
||||
|
||||
ret = s3c24xx_register_clock(clkp);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "Failed to register clock %s (%d)\n",
|
||||
clkp->name, ret);
|
||||
}
|
||||
}
|
||||
|
||||
__raw_writel(dclkcon, S3C24XX_DCLKCON);
|
||||
/* We must be careful disabling the clocks we are not intending to
|
||||
* be using at boot time, as subsytems such as the LCD which do
|
||||
* their own DMA requests to the bus can cause the system to lockup
|
||||
* if they where in the middle of requesting bus access.
|
||||
*
|
||||
* Disabling the LCD clock if the LCD is active is very dangerous,
|
||||
* and therefore the bootloader should be careful to not enable
|
||||
* the LCD clock if it is not needed.
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* install (and disable) the clocks we do not need immediately */
|
||||
|
||||
clkp = init_clocks_disable;
|
||||
for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) {
|
||||
|
||||
static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent)
|
||||
{
|
||||
unsigned long mask;
|
||||
unsigned long source;
|
||||
ret = s3c24xx_register_clock(clkp);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "Failed to register clock %s (%d)\n",
|
||||
clkp->name, ret);
|
||||
}
|
||||
|
||||
/* calculate the MISCCR setting for the clock */
|
||||
|
||||
if (parent == &clk_xtal)
|
||||
source = S3C2410_MISCCR_CLK0_MPLL;
|
||||
else if (parent == &clk_upll)
|
||||
source = S3C2410_MISCCR_CLK0_UPLL;
|
||||
else if (parent == &clk_f)
|
||||
source = S3C2410_MISCCR_CLK0_FCLK;
|
||||
else if (parent == &clk_h)
|
||||
source = S3C2410_MISCCR_CLK0_HCLK;
|
||||
else if (parent == &clk_p)
|
||||
source = S3C2410_MISCCR_CLK0_PCLK;
|
||||
else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0)
|
||||
source = S3C2410_MISCCR_CLK0_DCLK0;
|
||||
else if (clk == &s3c24xx_clkout1 && parent == &s3c24xx_dclk1)
|
||||
source = S3C2410_MISCCR_CLK0_DCLK0;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
clk->parent = parent;
|
||||
|
||||
if (clk == &s3c24xx_dclk0)
|
||||
mask = S3C2410_MISCCR_CLK0_MASK;
|
||||
else {
|
||||
source <<= 4;
|
||||
mask = S3C2410_MISCCR_CLK1_MASK;
|
||||
s3c2410_clkcon_enable(clkp, 0);
|
||||
}
|
||||
|
||||
s3c2410_modify_misccr(mask, source);
|
||||
return 0;
|
||||
}
|
||||
/* show the clock-slow value */
|
||||
|
||||
/* external clock definitions */
|
||||
xtal = clk_get(NULL, "xtal");
|
||||
|
||||
struct clk s3c24xx_dclk0 = {
|
||||
.name = "dclk0",
|
||||
.id = -1,
|
||||
.ctrlbit = S3C2410_DCLKCON_DCLK0EN,
|
||||
.enable = s3c24xx_dclk_enable,
|
||||
.set_parent = s3c24xx_dclk_setparent,
|
||||
};
|
||||
|
||||
struct clk s3c24xx_dclk1 = {
|
||||
.name = "dclk1",
|
||||
.id = -1,
|
||||
.ctrlbit = S3C2410_DCLKCON_DCLK0EN,
|
||||
.enable = s3c24xx_dclk_enable,
|
||||
.set_parent = s3c24xx_dclk_setparent,
|
||||
};
|
||||
|
||||
struct clk s3c24xx_clkout0 = {
|
||||
.name = "clkout0",
|
||||
.id = -1,
|
||||
.set_parent = s3c24xx_clkout_setparent,
|
||||
};
|
||||
|
||||
struct clk s3c24xx_clkout1 = {
|
||||
.name = "clkout1",
|
||||
.id = -1,
|
||||
.set_parent = s3c24xx_clkout_setparent,
|
||||
};
|
||||
|
||||
struct clk s3c24xx_uclk = {
|
||||
.name = "uclk",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
/* initialise the clock system */
|
||||
|
||||
int s3c24xx_register_clock(struct clk *clk)
|
||||
{
|
||||
clk->owner = THIS_MODULE;
|
||||
|
||||
if (clk->enable == NULL)
|
||||
clk->enable = clk_null_enable;
|
||||
|
||||
/* add to the list of available clocks */
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->list, &clocks);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* initalise all the clocks */
|
||||
|
||||
int __init s3c24xx_setup_clocks(unsigned long xtal,
|
||||
unsigned long fclk,
|
||||
unsigned long hclk,
|
||||
unsigned long pclk)
|
||||
{
|
||||
printk(KERN_INFO "S3C24XX Clocks, (c) 2004 Simtec Electronics\n");
|
||||
|
||||
/* initialise the main system clocks */
|
||||
|
||||
clk_xtal.rate = xtal;
|
||||
clk_upll.rate = s3c2410_get_pll(__raw_readl(S3C2410_UPLLCON), xtal);
|
||||
|
||||
clk_mpll.rate = fclk;
|
||||
clk_h.rate = hclk;
|
||||
clk_p.rate = pclk;
|
||||
clk_f.rate = fclk;
|
||||
|
||||
/* assume uart clocks are correctly setup */
|
||||
|
||||
/* register our clocks */
|
||||
|
||||
if (s3c24xx_register_clock(&clk_xtal) < 0)
|
||||
printk(KERN_ERR "failed to register master xtal\n");
|
||||
|
||||
if (s3c24xx_register_clock(&clk_mpll) < 0)
|
||||
printk(KERN_ERR "failed to register mpll clock\n");
|
||||
|
||||
if (s3c24xx_register_clock(&clk_upll) < 0)
|
||||
printk(KERN_ERR "failed to register upll clock\n");
|
||||
|
||||
if (s3c24xx_register_clock(&clk_f) < 0)
|
||||
printk(KERN_ERR "failed to register cpu fclk\n");
|
||||
|
||||
if (s3c24xx_register_clock(&clk_h) < 0)
|
||||
printk(KERN_ERR "failed to register cpu hclk\n");
|
||||
|
||||
if (s3c24xx_register_clock(&clk_p) < 0)
|
||||
printk(KERN_ERR "failed to register cpu pclk\n");
|
||||
printk("CLOCK: Slow mode (%ld.%ld MHz), %s, MPLL %s, UPLL %s\n",
|
||||
print_mhz(clk_get_rate(xtal) /
|
||||
( 2 * S3C2410_CLKSLOW_GET_SLOWVAL(clkslow))),
|
||||
(clkslow & S3C2410_CLKSLOW_SLOW) ? "slow" : "fast",
|
||||
(clkslow & S3C2410_CLKSLOW_MPLL_OFF) ? "off" : "on",
|
||||
(clkslow & S3C2410_CLKSLOW_UCLK_OFF) ? "off" : "on");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,9 +1,9 @@
|
|||
/* linux/arch/arm/mach-s3c2410/gpio.c
|
||||
*
|
||||
* Copyright (c) 2004-2005 Simtec Electronics
|
||||
* Copyright (c) 2004-2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C24XX GPIO support
|
||||
* S3C2410 GPIO 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
|
||||
|
@ -18,8 +18,7 @@
|
|||
* 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/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -33,156 +32,40 @@
|
|||
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
|
||||
int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,
|
||||
unsigned int config)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long mask;
|
||||
unsigned long con;
|
||||
void __iomem *reg = S3C24XX_EINFLT0;
|
||||
unsigned long flags;
|
||||
unsigned long val;
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB) {
|
||||
mask = 1 << S3C2410_GPIO_OFFSET(pin);
|
||||
} else {
|
||||
mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
|
||||
}
|
||||
if (pin < S3C2410_GPG8 || pin > S3C2410_GPG15)
|
||||
return -1;
|
||||
|
||||
switch (function) {
|
||||
case S3C2410_GPIO_LEAVE:
|
||||
mask = 0;
|
||||
function = 0;
|
||||
break;
|
||||
config &= 0xff;
|
||||
|
||||
case S3C2410_GPIO_INPUT:
|
||||
case S3C2410_GPIO_OUTPUT:
|
||||
case S3C2410_GPIO_SFN2:
|
||||
case S3C2410_GPIO_SFN3:
|
||||
if (pin < S3C2410_GPIO_BANKB) {
|
||||
function -= 1;
|
||||
function &= 1;
|
||||
function <<= S3C2410_GPIO_OFFSET(pin);
|
||||
} else {
|
||||
function &= 3;
|
||||
function <<= S3C2410_GPIO_OFFSET(pin)*2;
|
||||
}
|
||||
}
|
||||
|
||||
/* modify the specified register wwith IRQs off */
|
||||
pin -= S3C2410_GPG8;
|
||||
reg += pin & ~3;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
con = __raw_readl(base + 0x00);
|
||||
con &= ~mask;
|
||||
con |= function;
|
||||
/* update filter width and clock source */
|
||||
|
||||
__raw_writel(con, base + 0x00);
|
||||
val = __raw_readl(reg);
|
||||
val &= ~(0xff << ((pin & 3) * 8));
|
||||
val |= config << ((pin & 3) * 8);
|
||||
__raw_writel(val, reg);
|
||||
|
||||
/* update filter enable */
|
||||
|
||||
val = __raw_readl(S3C24XX_EXTINT2);
|
||||
val &= ~(1 << ((pin * 4) + 3));
|
||||
val |= on << ((pin * 4) + 3);
|
||||
__raw_writel(val, S3C24XX_EXTINT2);
|
||||
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_cfgpin);
|
||||
|
||||
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long val = __raw_readl(base);
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB) {
|
||||
val >>= S3C2410_GPIO_OFFSET(pin);
|
||||
val &= 1;
|
||||
val += 1;
|
||||
} else {
|
||||
val >>= S3C2410_GPIO_OFFSET(pin)*2;
|
||||
val &= 3;
|
||||
}
|
||||
|
||||
return val | S3C2410_GPIO_INPUT;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getcfg);
|
||||
|
||||
void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
unsigned long flags;
|
||||
unsigned long up;
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB)
|
||||
return;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
up = __raw_readl(base + 0x08);
|
||||
up &= ~(1L << offs);
|
||||
up |= to << offs;
|
||||
__raw_writel(up, base + 0x08);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_pullup);
|
||||
|
||||
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
unsigned long flags;
|
||||
unsigned long dat;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
dat = __raw_readl(base + 0x04);
|
||||
dat &= ~(1 << offs);
|
||||
dat |= to << offs;
|
||||
__raw_writel(dat, base + 0x04);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_setpin);
|
||||
|
||||
unsigned int s3c2410_gpio_getpin(unsigned int pin)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
|
||||
return __raw_readl(base + 0x04) & (1<< offs);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getpin);
|
||||
|
||||
unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long misccr;
|
||||
|
||||
local_irq_save(flags);
|
||||
misccr = __raw_readl(S3C24XX_MISCCR);
|
||||
misccr &= ~clear;
|
||||
misccr ^= change;
|
||||
__raw_writel(misccr, S3C24XX_MISCCR);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return misccr;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_modify_misccr);
|
||||
|
||||
int s3c2410_gpio_getirq(unsigned int pin)
|
||||
{
|
||||
if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15)
|
||||
return -1; /* not valid interrupts */
|
||||
|
||||
if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7)
|
||||
return -1; /* not valid pin */
|
||||
|
||||
if (pin < S3C2410_GPF4)
|
||||
return (pin - S3C2410_GPF0) + IRQ_EINT0;
|
||||
|
||||
if (pin < S3C2410_GPG0)
|
||||
return (pin - S3C2410_GPF4) + IRQ_EINT4;
|
||||
|
||||
return (pin - S3C2410_GPG0) + IRQ_EINT8;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getirq);
|
||||
EXPORT_SYMBOL(s3c2410_gpio_irqfilter);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* linux/arch/arm/mach-s3c2410/irq.c
|
||||
*
|
||||
* Copyright (c) 2003,2004 Simtec Electronics
|
||||
* Copyright (c) 2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -17,37 +17,6 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Changelog:
|
||||
*
|
||||
* 22-Jul-2004 Ben Dooks <ben@simtec.co.uk>
|
||||
* Fixed compile warnings
|
||||
*
|
||||
* 22-Jul-2004 Roc Wu <cooloney@yahoo.com.cn>
|
||||
* Fixed s3c_extirq_type
|
||||
*
|
||||
* 21-Jul-2004 Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>
|
||||
* Addition of ADC/TC demux
|
||||
*
|
||||
* 04-Oct-2004 Klaus Fetscher <k.fetscher@fetron.de>
|
||||
* Fix for set_irq_type() on low EINT numbers
|
||||
*
|
||||
* 05-Oct-2004 Ben Dooks <ben@simtec.co.uk>
|
||||
* Tidy up KF's patch and sort out new release
|
||||
*
|
||||
* 05-Oct-2004 Ben Dooks <ben@simtec.co.uk>
|
||||
* Add support for power management controls
|
||||
*
|
||||
* 04-Nov-2004 Ben Dooks
|
||||
* Fix standard IRQ wake for EINT0..4 and RTC
|
||||
*
|
||||
* 22-Feb-2005 Ben Dooks
|
||||
* Fixed edge-triggering on ADC IRQ
|
||||
*
|
||||
* 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>
|
||||
|
@ -57,745 +26,23 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/sysdev.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
#include <asm/plat-s3c24xx/pm.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"
|
||||
|
||||
/* wakeup irq control */
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
/* state for IRQs over sleep */
|
||||
|
||||
/* default is to allow for EINT0..EINT15, and IRQ_RTC as wakeup sources
|
||||
*
|
||||
* set bit to 1 in allow bitfield to enable the wakeup settings on it
|
||||
*/
|
||||
|
||||
unsigned long s3c_irqwake_intallow = 1L << (IRQ_RTC - IRQ_EINT0) | 0xfL;
|
||||
unsigned long s3c_irqwake_intmask = 0xffffffffL;
|
||||
unsigned long s3c_irqwake_eintallow = 0x0000fff0L;
|
||||
unsigned long s3c_irqwake_eintmask = 0xffffffffL;
|
||||
|
||||
int
|
||||
s3c_irq_wake(unsigned int irqno, unsigned int state)
|
||||
static int s3c2410_irq_add(struct sys_device *sysdev)
|
||||
{
|
||||
unsigned long irqbit = 1 << (irqno - IRQ_EINT0);
|
||||
|
||||
if (!(s3c_irqwake_intallow & irqbit))
|
||||
return -ENOENT;
|
||||
|
||||
printk(KERN_INFO "wake %s for irq %d\n",
|
||||
state ? "enabled" : "disabled", irqno);
|
||||
|
||||
if (!state)
|
||||
s3c_irqwake_intmask |= irqbit;
|
||||
else
|
||||
s3c_irqwake_intmask &= ~irqbit;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
s3c_irqext_wake(unsigned int irqno, unsigned int state)
|
||||
{
|
||||
unsigned long bit = 1L << (irqno - EXTINT_OFF);
|
||||
|
||||
if (!(s3c_irqwake_eintallow & bit))
|
||||
return -ENOENT;
|
||||
|
||||
printk(KERN_INFO "wake %s for irq %d\n",
|
||||
state ? "enabled" : "disabled", irqno);
|
||||
|
||||
if (!state)
|
||||
s3c_irqwake_eintmask |= bit;
|
||||
else
|
||||
s3c_irqwake_eintmask &= ~bit;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#define s3c_irqext_wake NULL
|
||||
#define s3c_irq_wake NULL
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
s3c_irq_mask(unsigned int irqno)
|
||||
{
|
||||
unsigned long mask;
|
||||
|
||||
irqno -= IRQ_EINT0;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
mask |= 1UL << irqno;
|
||||
__raw_writel(mask, S3C2410_INTMSK);
|
||||
}
|
||||
|
||||
static inline void
|
||||
s3c_irq_ack(unsigned int irqno)
|
||||
{
|
||||
unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
|
||||
|
||||
__raw_writel(bitval, S3C2410_SRCPND);
|
||||
__raw_writel(bitval, S3C2410_INTPND);
|
||||
}
|
||||
|
||||
static inline void
|
||||
s3c_irq_maskack(unsigned int irqno)
|
||||
{
|
||||
unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask|bitval, S3C2410_INTMSK);
|
||||
|
||||
__raw_writel(bitval, S3C2410_SRCPND);
|
||||
__raw_writel(bitval, S3C2410_INTPND);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
s3c_irq_unmask(unsigned int irqno)
|
||||
{
|
||||
unsigned long mask;
|
||||
|
||||
if (irqno != IRQ_TIMER4 && irqno != IRQ_EINT8t23)
|
||||
irqdbf2("s3c_irq_unmask %d\n", irqno);
|
||||
|
||||
irqno -= IRQ_EINT0;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
mask &= ~(1UL << irqno);
|
||||
__raw_writel(mask, S3C2410_INTMSK);
|
||||
}
|
||||
|
||||
struct irq_chip s3c_irq_level_chip = {
|
||||
.name = "s3c-level",
|
||||
.ack = s3c_irq_maskack,
|
||||
.mask = s3c_irq_mask,
|
||||
.unmask = s3c_irq_unmask,
|
||||
.set_wake = s3c_irq_wake
|
||||
static struct sysdev_driver s3c2410_irq_driver = {
|
||||
.add = s3c2410_irq_add,
|
||||
.suspend = s3c24xx_irq_suspend,
|
||||
.resume = s3c24xx_irq_resume,
|
||||
};
|
||||
|
||||
static struct irq_chip s3c_irq_chip = {
|
||||
.name = "s3c",
|
||||
.ack = s3c_irq_ack,
|
||||
.mask = s3c_irq_mask,
|
||||
.unmask = s3c_irq_unmask,
|
||||
.set_wake = s3c_irq_wake
|
||||
};
|
||||
|
||||
static void
|
||||
s3c_irqext_mask(unsigned int irqno)
|
||||
static int s3c2410_irq_init(void)
|
||||
{
|
||||
unsigned long mask;
|
||||
|
||||
irqno -= EXTINT_OFF;
|
||||
|
||||
mask = __raw_readl(S3C24XX_EINTMASK);
|
||||
mask |= ( 1UL << irqno);
|
||||
__raw_writel(mask, S3C24XX_EINTMASK);
|
||||
return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_irq_driver);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irqext_ack(unsigned int irqno)
|
||||
{
|
||||
unsigned long req;
|
||||
unsigned long bit;
|
||||
unsigned long mask;
|
||||
|
||||
bit = 1UL << (irqno - EXTINT_OFF);
|
||||
|
||||
mask = __raw_readl(S3C24XX_EINTMASK);
|
||||
|
||||
__raw_writel(bit, S3C24XX_EINTPEND);
|
||||
|
||||
req = __raw_readl(S3C24XX_EINTPEND);
|
||||
req &= ~mask;
|
||||
|
||||
/* not sure if we should be acking the parent irq... */
|
||||
|
||||
if (irqno <= IRQ_EINT7 ) {
|
||||
if ((req & 0xf0) == 0)
|
||||
s3c_irq_ack(IRQ_EINT4t7);
|
||||
} else {
|
||||
if ((req >> 8) == 0)
|
||||
s3c_irq_ack(IRQ_EINT8t23);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irqext_unmask(unsigned int irqno)
|
||||
{
|
||||
unsigned long mask;
|
||||
|
||||
irqno -= EXTINT_OFF;
|
||||
|
||||
mask = __raw_readl(S3C24XX_EINTMASK);
|
||||
mask &= ~( 1UL << irqno);
|
||||
__raw_writel(mask, S3C24XX_EINTMASK);
|
||||
}
|
||||
|
||||
int
|
||||
s3c_irqext_type(unsigned int irq, unsigned int type)
|
||||
{
|
||||
void __iomem *extint_reg;
|
||||
void __iomem *gpcon_reg;
|
||||
unsigned long gpcon_offset, extint_offset;
|
||||
unsigned long newvalue = 0, value;
|
||||
|
||||
if ((irq >= IRQ_EINT0) && (irq <= IRQ_EINT3))
|
||||
{
|
||||
gpcon_reg = S3C2410_GPFCON;
|
||||
extint_reg = S3C24XX_EXTINT0;
|
||||
gpcon_offset = (irq - IRQ_EINT0) * 2;
|
||||
extint_offset = (irq - IRQ_EINT0) * 4;
|
||||
}
|
||||
else if ((irq >= IRQ_EINT4) && (irq <= IRQ_EINT7))
|
||||
{
|
||||
gpcon_reg = S3C2410_GPFCON;
|
||||
extint_reg = S3C24XX_EXTINT0;
|
||||
gpcon_offset = (irq - (EXTINT_OFF)) * 2;
|
||||
extint_offset = (irq - (EXTINT_OFF)) * 4;
|
||||
}
|
||||
else if ((irq >= IRQ_EINT8) && (irq <= IRQ_EINT15))
|
||||
{
|
||||
gpcon_reg = S3C2410_GPGCON;
|
||||
extint_reg = S3C24XX_EXTINT1;
|
||||
gpcon_offset = (irq - IRQ_EINT8) * 2;
|
||||
extint_offset = (irq - IRQ_EINT8) * 4;
|
||||
}
|
||||
else if ((irq >= IRQ_EINT16) && (irq <= IRQ_EINT23))
|
||||
{
|
||||
gpcon_reg = S3C2410_GPGCON;
|
||||
extint_reg = S3C24XX_EXTINT2;
|
||||
gpcon_offset = (irq - IRQ_EINT8) * 2;
|
||||
extint_offset = (irq - IRQ_EINT16) * 4;
|
||||
} else
|
||||
return -1;
|
||||
|
||||
/* Set the GPIO to external interrupt mode */
|
||||
value = __raw_readl(gpcon_reg);
|
||||
value = (value & ~(3 << gpcon_offset)) | (0x02 << gpcon_offset);
|
||||
__raw_writel(value, gpcon_reg);
|
||||
|
||||
/* Set the external interrupt to pointed trigger type */
|
||||
switch (type)
|
||||
{
|
||||
case IRQT_NOEDGE:
|
||||
printk(KERN_WARNING "No edge setting!\n");
|
||||
break;
|
||||
|
||||
case IRQT_RISING:
|
||||
newvalue = S3C2410_EXTINT_RISEEDGE;
|
||||
break;
|
||||
|
||||
case IRQT_FALLING:
|
||||
newvalue = S3C2410_EXTINT_FALLEDGE;
|
||||
break;
|
||||
|
||||
case IRQT_BOTHEDGE:
|
||||
newvalue = S3C2410_EXTINT_BOTHEDGE;
|
||||
break;
|
||||
|
||||
case IRQT_LOW:
|
||||
newvalue = S3C2410_EXTINT_LOWLEV;
|
||||
break;
|
||||
|
||||
case IRQT_HIGH:
|
||||
newvalue = S3C2410_EXTINT_HILEV;
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "No such irq type %d", type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
value = __raw_readl(extint_reg);
|
||||
value = (value & ~(7 << extint_offset)) | (newvalue << extint_offset);
|
||||
__raw_writel(value, extint_reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irqext_chip = {
|
||||
.name = "s3c-ext",
|
||||
.mask = s3c_irqext_mask,
|
||||
.unmask = s3c_irqext_unmask,
|
||||
.ack = s3c_irqext_ack,
|
||||
.set_type = s3c_irqext_type,
|
||||
.set_wake = s3c_irqext_wake
|
||||
};
|
||||
|
||||
static struct irq_chip s3c_irq_eint0t4 = {
|
||||
.name = "s3c-ext0",
|
||||
.ack = s3c_irq_ack,
|
||||
.mask = s3c_irq_mask,
|
||||
.unmask = s3c_irq_unmask,
|
||||
.set_wake = s3c_irq_wake,
|
||||
.set_type = s3c_irqext_type,
|
||||
};
|
||||
|
||||
/* mask values for the parent registers for each of the interrupt types */
|
||||
|
||||
#define INTMSK_UART0 (1UL << (IRQ_UART0 - IRQ_EINT0))
|
||||
#define INTMSK_UART1 (1UL << (IRQ_UART1 - IRQ_EINT0))
|
||||
#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))
|
||||
#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))
|
||||
|
||||
|
||||
/* UART0 */
|
||||
|
||||
static void
|
||||
s3c_irq_uart0_mask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_mask(irqno, INTMSK_UART0, 7);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_uart0_unmask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_unmask(irqno, INTMSK_UART0);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_uart0_ack(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_maskack(irqno, INTMSK_UART0, 7);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_uart0 = {
|
||||
.name = "s3c-uart0",
|
||||
.mask = s3c_irq_uart0_mask,
|
||||
.unmask = s3c_irq_uart0_unmask,
|
||||
.ack = s3c_irq_uart0_ack,
|
||||
};
|
||||
|
||||
/* UART1 */
|
||||
|
||||
static void
|
||||
s3c_irq_uart1_mask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_mask(irqno, INTMSK_UART1, 7 << 3);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_uart1_unmask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_unmask(irqno, INTMSK_UART1);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_uart1_ack(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_maskack(irqno, INTMSK_UART1, 7 << 3);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_uart1 = {
|
||||
.name = "s3c-uart1",
|
||||
.mask = s3c_irq_uart1_mask,
|
||||
.unmask = s3c_irq_uart1_unmask,
|
||||
.ack = s3c_irq_uart1_ack,
|
||||
};
|
||||
|
||||
/* UART2 */
|
||||
|
||||
static void
|
||||
s3c_irq_uart2_mask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_mask(irqno, INTMSK_UART2, 7 << 6);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_uart2_unmask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_unmask(irqno, INTMSK_UART2);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_uart2_ack(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_maskack(irqno, INTMSK_UART2, 7 << 6);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_uart2 = {
|
||||
.name = "s3c-uart2",
|
||||
.mask = s3c_irq_uart2_mask,
|
||||
.unmask = s3c_irq_uart2_unmask,
|
||||
.ack = s3c_irq_uart2_ack,
|
||||
};
|
||||
|
||||
/* ADC and Touchscreen */
|
||||
|
||||
static void
|
||||
s3c_irq_adc_mask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_mask(irqno, INTMSK_ADCPARENT, 3 << 9);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_adc_unmask(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_unmask(irqno, INTMSK_ADCPARENT);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_adc_ack(unsigned int irqno)
|
||||
{
|
||||
s3c_irqsub_ack(irqno, INTMSK_ADCPARENT, 3 << 9);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_adc = {
|
||||
.name = "s3c-adc",
|
||||
.mask = s3c_irq_adc_mask,
|
||||
.unmask = s3c_irq_adc_unmask,
|
||||
.ack = s3c_irq_adc_ack,
|
||||
};
|
||||
|
||||
/* irq demux for adc */
|
||||
static void s3c_irq_demux_adc(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
unsigned int subsrc, submsk;
|
||||
unsigned int offset = 9;
|
||||
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 >>= offset;
|
||||
subsrc &= 3;
|
||||
|
||||
if (subsrc != 0) {
|
||||
if (subsrc & 1) {
|
||||
mydesc = irq_desc + IRQ_TC;
|
||||
desc_handle_irq(IRQ_TC, mydesc);
|
||||
}
|
||||
if (subsrc & 2) {
|
||||
mydesc = irq_desc + IRQ_ADC;
|
||||
desc_handle_irq(IRQ_ADC, mydesc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void s3c_irq_demux_uart(unsigned int start)
|
||||
{
|
||||
unsigned int subsrc, submsk;
|
||||
unsigned int offset = start - IRQ_S3CUART_RX0;
|
||||
struct irq_desc *desc;
|
||||
|
||||
/* read the current pending interrupts, and the mask
|
||||
* for what it is available */
|
||||
|
||||
subsrc = __raw_readl(S3C2410_SUBSRCPND);
|
||||
submsk = __raw_readl(S3C2410_INTSUBMSK);
|
||||
|
||||
irqdbf2("s3c_irq_demux_uart: start=%d (%d), subsrc=0x%08x,0x%08x\n",
|
||||
start, offset, subsrc, submsk);
|
||||
|
||||
subsrc &= ~submsk;
|
||||
subsrc >>= offset;
|
||||
subsrc &= 7;
|
||||
|
||||
if (subsrc != 0) {
|
||||
desc = irq_desc + start;
|
||||
|
||||
if (subsrc & 1)
|
||||
desc_handle_irq(start, desc);
|
||||
|
||||
desc++;
|
||||
|
||||
if (subsrc & 2)
|
||||
desc_handle_irq(start+1, desc);
|
||||
|
||||
desc++;
|
||||
|
||||
if (subsrc & 4)
|
||||
desc_handle_irq(start+2, desc);
|
||||
}
|
||||
}
|
||||
|
||||
/* uart demux entry points */
|
||||
|
||||
static void
|
||||
s3c_irq_demux_uart0(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
irq = irq;
|
||||
s3c_irq_demux_uart(IRQ_S3CUART_RX0);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_demux_uart1(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
irq = irq;
|
||||
s3c_irq_demux_uart(IRQ_S3CUART_RX1);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_demux_uart2(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
irq = irq;
|
||||
s3c_irq_demux_uart(IRQ_S3CUART_RX2);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_demux_extint8(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
|
||||
unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);
|
||||
|
||||
eintpnd &= ~eintmsk;
|
||||
eintpnd &= ~0xff; /* ignore lower irqs */
|
||||
|
||||
/* we may as well handle all the pending IRQs here */
|
||||
|
||||
while (eintpnd) {
|
||||
irq = __ffs(eintpnd);
|
||||
eintpnd &= ~(1<<irq);
|
||||
|
||||
irq += (IRQ_EINT4 - 4);
|
||||
desc_handle_irq(irq, irq_desc + irq);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_demux_extint4t7(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
|
||||
unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);
|
||||
|
||||
eintpnd &= ~eintmsk;
|
||||
eintpnd &= 0xff; /* only lower irqs */
|
||||
|
||||
/* we may as well handle all the pending IRQs here */
|
||||
|
||||
while (eintpnd) {
|
||||
irq = __ffs(eintpnd);
|
||||
eintpnd &= ~(1<<irq);
|
||||
|
||||
irq += (IRQ_EINT4 - 4);
|
||||
|
||||
desc_handle_irq(irq, irq_desc + irq);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static struct sleep_save irq_save[] = {
|
||||
SAVE_ITEM(S3C2410_INTMSK),
|
||||
SAVE_ITEM(S3C2410_INTSUBMSK),
|
||||
};
|
||||
|
||||
/* the extint values move between the s3c2410/s3c2440 and the s3c2412
|
||||
* so we use an array to hold them, and to calculate the address of
|
||||
* the register at run-time
|
||||
*/
|
||||
|
||||
static unsigned long save_extint[3];
|
||||
static unsigned long save_eintflt[4];
|
||||
static unsigned long save_eintmask;
|
||||
|
||||
int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(save_extint); i++)
|
||||
save_extint[i] = __raw_readl(S3C24XX_EXTINT0 + (i*4));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
|
||||
save_eintflt[i] = __raw_readl(S3C24XX_EINFLT0 + (i*4));
|
||||
|
||||
s3c2410_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
|
||||
save_eintmask = __raw_readl(S3C24XX_EINTMASK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int s3c24xx_irq_resume(struct sys_device *dev)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(save_extint); i++)
|
||||
__raw_writel(save_extint[i], S3C24XX_EXTINT0 + (i*4));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
|
||||
__raw_writel(save_eintflt[i], S3C24XX_EINFLT0 + (i*4));
|
||||
|
||||
s3c2410_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
|
||||
__raw_writel(save_eintmask, S3C24XX_EINTMASK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#define s3c24xx_irq_suspend NULL
|
||||
#define s3c24xx_irq_resume NULL
|
||||
#endif
|
||||
|
||||
/* s3c24xx_init_irq
|
||||
*
|
||||
* Initialise S3C2410 IRQ system
|
||||
*/
|
||||
|
||||
void __init s3c24xx_init_irq(void)
|
||||
{
|
||||
unsigned long pend;
|
||||
unsigned long last;
|
||||
int irqno;
|
||||
int i;
|
||||
|
||||
irqdbf("s3c2410_init_irq: clearing interrupt status flags\n");
|
||||
|
||||
/* first, clear all interrupts pending... */
|
||||
|
||||
last = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
pend = __raw_readl(S3C24XX_EINTPEND);
|
||||
|
||||
if (pend == 0 || pend == last)
|
||||
break;
|
||||
|
||||
__raw_writel(pend, S3C24XX_EINTPEND);
|
||||
printk("irq: clearing pending ext status %08x\n", (int)pend);
|
||||
last = pend;
|
||||
}
|
||||
|
||||
last = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
pend = __raw_readl(S3C2410_INTPND);
|
||||
|
||||
if (pend == 0 || pend == last)
|
||||
break;
|
||||
|
||||
__raw_writel(pend, S3C2410_SRCPND);
|
||||
__raw_writel(pend, S3C2410_INTPND);
|
||||
printk("irq: clearing pending status %08x\n", (int)pend);
|
||||
last = pend;
|
||||
}
|
||||
|
||||
last = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
pend = __raw_readl(S3C2410_SUBSRCPND);
|
||||
|
||||
if (pend == 0 || pend == last)
|
||||
break;
|
||||
|
||||
printk("irq: clearing subpending status %08x\n", (int)pend);
|
||||
__raw_writel(pend, S3C2410_SUBSRCPND);
|
||||
last = pend;
|
||||
}
|
||||
|
||||
/* register the main interrupts */
|
||||
|
||||
irqdbf("s3c2410_init_irq: registering s3c2410 interrupt handlers\n");
|
||||
|
||||
for (irqno = IRQ_EINT4t7; irqno <= IRQ_ADCPARENT; irqno++) {
|
||||
/* set all the s3c2410 internal irqs */
|
||||
|
||||
switch (irqno) {
|
||||
/* deal with the special IRQs (cascaded) */
|
||||
|
||||
case IRQ_EINT4t7:
|
||||
case IRQ_EINT8t23:
|
||||
case IRQ_UART0:
|
||||
case IRQ_UART1:
|
||||
case IRQ_UART2:
|
||||
case IRQ_ADCPARENT:
|
||||
set_irq_chip(irqno, &s3c_irq_level_chip);
|
||||
set_irq_handler(irqno, handle_level_irq);
|
||||
break;
|
||||
|
||||
case IRQ_RESERVED6:
|
||||
case IRQ_RESERVED24:
|
||||
/* no IRQ here */
|
||||
break;
|
||||
|
||||
default:
|
||||
//irqdbf("registering irq %d (s3c irq)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irq_chip);
|
||||
set_irq_handler(irqno, handle_edge_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
}
|
||||
|
||||
/* setup the cascade irq handlers */
|
||||
|
||||
set_irq_chained_handler(IRQ_EINT4t7, s3c_irq_demux_extint4t7);
|
||||
set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint8);
|
||||
|
||||
set_irq_chained_handler(IRQ_UART0, s3c_irq_demux_uart0);
|
||||
set_irq_chained_handler(IRQ_UART1, s3c_irq_demux_uart1);
|
||||
set_irq_chained_handler(IRQ_UART2, s3c_irq_demux_uart2);
|
||||
set_irq_chained_handler(IRQ_ADCPARENT, s3c_irq_demux_adc);
|
||||
|
||||
/* external interrupts */
|
||||
|
||||
for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
|
||||
irqdbf("registering irq %d (ext int)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irq_eint0t4);
|
||||
set_irq_handler(irqno, handle_edge_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {
|
||||
irqdbf("registering irq %d (extended s3c irq)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irqext_chip);
|
||||
set_irq_handler(irqno, handle_edge_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
/* register the uart interrupts */
|
||||
|
||||
irqdbf("s3c2410: registering external interrupts\n");
|
||||
|
||||
for (irqno = IRQ_S3CUART_RX0; irqno <= IRQ_S3CUART_ERR0; irqno++) {
|
||||
irqdbf("registering irq %d (s3c uart0 irq)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irq_uart0);
|
||||
set_irq_handler(irqno, handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
for (irqno = IRQ_S3CUART_RX1; irqno <= IRQ_S3CUART_ERR1; irqno++) {
|
||||
irqdbf("registering irq %d (s3c uart1 irq)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irq_uart1);
|
||||
set_irq_handler(irqno, handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
for (irqno = IRQ_S3CUART_RX2; irqno <= IRQ_S3CUART_ERR2; irqno++) {
|
||||
irqdbf("registering irq %d (s3c uart2 irq)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irq_uart2);
|
||||
set_irq_handler(irqno, handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
for (irqno = IRQ_TC; irqno <= IRQ_ADC; irqno++) {
|
||||
irqdbf("registering irq %d (s3c adc irq)\n", irqno);
|
||||
set_irq_chip(irqno, &s3c_irq_adc);
|
||||
set_irq_handler(irqno, handle_edge_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
irqdbf("s3c2410: registered interrupt handlers\n");
|
||||
}
|
||||
arch_initcall(s3c2410_irq_init);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/***********************************************************************
|
||||
/* linux/arch/arm/mach-s3c2410/mach-amlm5900.c
|
||||
*
|
||||
* linux/arch/arm/mach-s3c2410/mach-amlm5900.c
|
||||
*
|
||||
|
@ -35,7 +35,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/proc_fs.h>
|
||||
|
||||
#include <linux/serial_core.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -52,8 +52,8 @@
|
|||
#include <asm/arch/regs-lcd.h>
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
#include "devs.h"
|
||||
#include "cpu.h"
|
||||
#include <asm/plat-s3c24xx/devs.h>
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
|
||||
|
@ -113,12 +113,6 @@ static struct platform_device amlm5900_device_nor = {
|
|||
#endif
|
||||
|
||||
static struct map_desc amlm5900_iodesc[] __initdata = {
|
||||
{
|
||||
.virtual = (u32)S3C24XX_VA_SPI,
|
||||
.pfn = __phys_to_pfn(S3C2410_PA_SPI),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
};
|
||||
|
||||
#define UCON S3C2410_UCON_DEFAULT
|
||||
|
|
|
@ -50,9 +50,9 @@
|
|||
|
||||
#include <linux/serial_8250.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "devs.h"
|
||||
#include "cpu.h"
|
||||
#include <asm/plat-s3c24xx/clock.h>
|
||||
#include <asm/plat-s3c24xx/devs.h>
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
#include "usb-simtec.h"
|
||||
|
||||
#define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue