summaryrefslogtreecommitdiff
path: root/packages/linux/linux-ks8695/ks8695-base-r0.patch
diff options
context:
space:
mode:
authorMichael Lauer <mickey@vanille-media.de>2006-05-19 22:27:54 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2006-05-19 22:27:54 +0000
commitc2420f459bde3d91cc8fc4b585e1ba49edb858f0 (patch)
tree5555d6c466ce3edda8a9f70f7eb31e98f2ebe415 /packages/linux/linux-ks8695/ks8695-base-r0.patch
parent306d832e65d41aa3dd5966ed9eaf7aa60ff77e39 (diff)
add a machine configuration and a kernel for the Micrel KS8695 board that
is commonly found in PePlink manga boards and a lot of wireless media streamer boxes first 2.6.16 bits + defconfig. unfortunately the kernel is too large for my bootloader and i can't get it more slim, so i have to halt the work in this state. perhaps someone wants to pick that up.
Diffstat (limited to 'packages/linux/linux-ks8695/ks8695-base-r0.patch')
-rw-r--r--packages/linux/linux-ks8695/ks8695-base-r0.patch715
1 files changed, 715 insertions, 0 deletions
diff --git a/packages/linux/linux-ks8695/ks8695-base-r0.patch b/packages/linux/linux-ks8695/ks8695-base-r0.patch
new file mode 100644
index 0000000000..98477c7861
--- /dev/null
+++ b/packages/linux/linux-ks8695/ks8695-base-r0.patch
@@ -0,0 +1,715 @@
+This patch adds KS8695 CPU machine support.
+It is pretty much a standard ARM922T core.
+
+This patch inludes the cpu/machine configuration and Makefile changes,
+the architecture, timer, interrupt and PCI support.
+
+
+diff -Naur linux-2.6.16/arch/arm/Kconfig linux-2.6.16.ks8695/arch/arm/Kconfig
+--- linux-2.6.16/arch/arm/Kconfig 2006-03-20 15:53:29.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/Kconfig 2006-03-22 09:57:18.000000000 +1000
+@@ -141,6 +141,13 @@
+ help
+ Support for Intel's IXP2400/2800 (XScale) family of processors.
+
++config ARCH_KS8695
++ bool "Kendin-Micrel KS8695"
++ help
++ The Kendin-Micrel KS8695 "Centaur" family is an ARM920 based
++ System-On-Chip device. It is commonly used on small routers and
++ other small scale embedded devices.
++
+ config ARCH_L7200
+ bool "LinkUp-L7200"
+ select FIQ
+@@ -260,6 +267,8 @@
+
+ source "arch/arm/mach-ixp2000/Kconfig"
+
++source "arch/arm/mach-ks8695/Kconfig"
++
+ source "arch/arm/mach-pxa/Kconfig"
+
+ source "arch/arm/mach-sa1100/Kconfig"
+@@ -331,7 +340,7 @@
+ bool
+
+ config PCI
+- bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB
++ bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_KS8695
+ help
+ Find out whether you have a PCI motherboard. PCI is the name of a
+ bus system, i.e. the way the CPU talks to the other stuff inside
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/arch.c linux-2.6.16.ks8695/arch/arm/mach-ks8695/arch.c
+--- linux-2.6.16/arch/arm/mach-ks8695/arch.c 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/arch.c 2006-03-15 22:42:43.000000000 +1000
+@@ -0,0 +1,124 @@
++/*
++ * linux/arch/arm/mach-ks8695/arch.c
++ *
++ * Copyright (C) 2002 Micrel Inc.
++ *
++ * 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/config.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <asm/memory.h>
++#include <asm/hardware.h>
++#include <asm/setup.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/arch/ks8695-regs.h>
++
++extern void ks8695_map_io(void);
++extern void ks8695_init_irq(void);
++extern struct sys_timer ks8695_timer;
++
++#ifdef CONFIG_MACH_KS8695
++MACHINE_START(KS8695, "Micrel-KS8695")
++ /* Micrel Inc. */
++ .phys_ram = PHYS_OFFSET,
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT >> 18) & 0xfffc),
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
++#ifdef CONFIG_MACH_DSM320
++MACHINE_START(DSM320, "DLink-DSM320")
++ /* Maintainer: Ben Dooks <ben@simtec.co.uk> */
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT) >> 18) & 0xfffc,
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
++#ifdef CONFIG_MACH_LITE300
++MACHINE_START(LITE300, "Secure Computing SG300")
++ /* Secure Computing Inc. */
++ .phys_ram = PHYS_OFFSET,
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT >> 18) & 0xfffc),
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
++#ifdef CONFIG_MACH_SE4200
++MACHINE_START(SE4200, "Secure Computing SE4200")
++ /* Secure Computing Inc. */
++ .phys_ram = PHYS_OFFSET,
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT >> 18) & 0xfffc),
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
++#ifdef CONFIG_MACH_CM4002
++MACHINE_START(CM4002, "OpenGear/CM4002")
++ /* OpenGear Inc. */
++ .phys_ram = PHYS_OFFSET,
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT >> 18) & 0xfffc),
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
++#ifdef CONFIG_MACH_CM4008
++MACHINE_START(CM4008, "OpenGear/CM4008")
++ /* OpenGear Inc. */
++ .phys_ram = PHYS_OFFSET,
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT >> 18) & 0xfffc),
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
++#ifdef CONFIG_MACH_CM41xx
++MACHINE_START(CM41xx, "OpenGear/CM41xx")
++ /* OpenGear Inc. */
++ .phys_ram = PHYS_OFFSET,
++ .phys_io = KS8695_IO_BASE,
++ .io_pg_offst = ((KS8695_IO_VIRT >> 18) & 0xfffc),
++ .map_io = ks8695_map_io,
++ .init_irq = ks8695_init_irq,
++ .timer = &ks8695_timer,
++ .boot_params = 0x100,
++MACHINE_END
++#endif
++
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/irq.c linux-2.6.16.ks8695/arch/arm/mach-ks8695/irq.c
+--- linux-2.6.16/arch/arm/mach-ks8695/irq.c 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/irq.c 2006-03-11 00:01:51.000000000 +1000
+@@ -0,0 +1,71 @@
++/*
++ * linux/arch/arm/mach-ks8695/irq.c
++ *
++ * Copyright (C) 2002 Micrel Inc.
++ * Copyright (C) 2006 Greg Ungerer <gerg@snapgear.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <asm/hardware.h>
++#include <asm/irq.h>
++#include <asm/io.h>
++#include <asm/mach/irq.h>
++
++static void ks8695_irq_mask(unsigned int irq)
++{
++ unsigned long msk;
++ msk = __raw_readl(KS8695_REG(KS8695_INT_ENABLE));
++ msk &= ~(1 << irq);
++ __raw_writel(msk, KS8695_REG(KS8695_INT_ENABLE));
++}
++
++static void ks8695_irq_unmask(unsigned int irq)
++{
++ unsigned long msk;
++ msk = __raw_readl(KS8695_REG(KS8695_INT_ENABLE));
++ msk |= (1 << irq);
++ __raw_writel(msk, KS8695_REG(KS8695_INT_ENABLE));
++}
++
++static int ks8695_irq_set_type(unsigned int irq, unsigned int type)
++{
++ return 0;
++}
++
++struct irqchip ks8695_irq_chip = {
++ .ack = ks8695_irq_mask,
++ .mask = ks8695_irq_mask,
++ .unmask = ks8695_irq_unmask,
++ .set_type = ks8695_irq_set_type,
++};
++
++void __init ks8695_init_irq(void)
++{
++ unsigned int i;
++
++ /* Disable all interrupts initially. */
++ __raw_writel(0, KS8695_REG(KS8695_INT_CONTL));
++ __raw_writel(0, KS8695_REG(KS8695_INT_ENABLE));
++
++ for (i = 0; (i < NR_IRQS); i++) {
++ set_irq_chip(i, &ks8695_irq_chip);
++ set_irq_handler(i, do_level_IRQ);
++ set_irq_flags(i, IRQF_VALID);
++ }
++}
++
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/Kconfig linux-2.6.16.ks8695/arch/arm/mach-ks8695/Kconfig
+--- linux-2.6.16/arch/arm/mach-ks8695/Kconfig 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/Kconfig 2006-03-15 22:42:43.000000000 +1000
+@@ -0,0 +1,59 @@
++
++menu "Kendin-Micrel KS8695 Implementation Options"
++
++comment "KS8695 Platforms"
++
++config MACH_KS8695
++ bool "KS8695 development board"
++ help
++ Say 'Y' here if you want your kernel to run on the original
++ Kendin-Micrel KS8695 development board.
++
++config MACH_DSM320
++ bool "DLink DSM320 Media Player"
++ help
++ Say 'Y' here if you want your kernel to run on the DLink DSM320
++ Media Player.
++
++config MACH_CM4002
++ bool "OpenGear CM4002"
++ depends on ARCH_KS8695
++ help
++ Say 'Y' here if you want your kernel to support the OpenGear
++ CM4002 Secure Access Server. See http://www.opengear.com for
++ more details.
++
++config MACH_CM4008
++ bool "OpenGear CM4008"
++ depends on ARCH_KS8695
++ help
++ Say 'Y' here if you want your kernel to support the OpenGear
++ CM4008 Console Server. See http://www.opengear.com for more
++ details.
++
++config MACH_CM40xx
++ bool "OpenGear CM40xx"
++ help
++ depends on ARCH_KS8695
++ Say 'Y' here if you want your kernel to support the OpenGear
++ CM4016 or CM4048 Console Servers. See http://www.opengear.com for
++ more details.
++
++config MACH_LITE300
++ bool "Secure Computing / CyberGuard SG300"
++ depends on ARCH_KS8695
++ help
++ Say 'Y' here if you want your kernel to support the Secure
++ Computing / CyberGuard / SnapGear SG300 VPN Internet Router.
++ See http://www.securecomputing.com for more details.
++
++config MACH_SE4200
++ bool "Secure Computing / CyberGuard SE4200"
++ depends on ARCH_KS8695
++ help
++ Say 'Y' here if you want your kernel to support the Secure
++ Computing / CyberGuard / SnapGear SE4200 Secure Wireless VPN
++ Internet Router. See http://www.securecomputing.com for more
++ details.
++
++endmenu
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/Makefile linux-2.6.16.ks8695/arch/arm/mach-ks8695/Makefile
+--- linux-2.6.16/arch/arm/mach-ks8695/Makefile 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/Makefile 2006-03-15 22:42:43.000000000 +1000
+@@ -0,0 +1,7 @@
++#
++# Makefile for the KS8695 machines..
++#
++
++obj-y := arch.o irq.o mm.o time.o
++obj-$(CONFIG_PCI) += pci.o
++
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/Makefile.boot linux-2.6.16.ks8695/arch/arm/mach-ks8695/Makefile.boot
+--- linux-2.6.16/arch/arm/mach-ks8695/Makefile.boot 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/Makefile.boot 2006-02-17 11:57:24.000000000 +1000
+@@ -0,0 +1,3 @@
++ zreladdr-y := 0x00008000
++params_phys-y := 0x00000100
++
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/mm.c linux-2.6.16.ks8695/arch/arm/mach-ks8695/mm.c
+--- linux-2.6.16/arch/arm/mach-ks8695/mm.c 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/mm.c 2006-03-11 00:01:51.000000000 +1000
+@@ -0,0 +1,50 @@
++/*
++ * linux/arch/arm/mach-ks8695/mm.c
++ *
++ * Copyright (C) 1999,2000 Arm Limited
++ * Copyright (C) 2000 Deep Blue Solutions Ltd
++ *
++ * 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/mm.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/page.h>
++#include <asm/sizes.h>
++#include <asm/mach/map.h>
++
++/*
++ * The only fixed mapping we setup is for the internal register block.
++ * This contains the all the device peripheral registers.
++ *
++ * Logical Physical Comment
++ * -----------------------------------------
++ * FF000000 03FF0000 IO registers
++ */
++static struct map_desc ks8695_io_desc[] __initdata = {
++ {
++ .virtual = KS8695_IO_VIRT,
++ .pfn = __phys_to_pfn(KS8695_IO_BASE),
++ .length = SZ_64K,
++ .type = MT_DEVICE
++ },
++};
++
++void __init ks8695_map_io(void)
++{
++ iotable_init(ks8695_io_desc, ARRAY_SIZE(ks8695_io_desc));
++}
++
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/pci.c linux-2.6.16.ks8695/arch/arm/mach-ks8695/pci.c
+--- linux-2.6.16/arch/arm/mach-ks8695/pci.c 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/pci.c 2006-03-15 22:42:43.000000000 +1000
+@@ -0,0 +1,218 @@
++/*
++ * Copyright (c) 2003, Micrel Semiconductors
++ * Copyright (C) 2006, Greg Ungerer <gerg@snapgear.com>
++ *
++ * Written 2003 by LIQUN RUAN
++ *
++ * 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/config.h>
++#include <linux/kernel.h>
++#include <linux/pci.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <asm/io.h>
++#include <asm/mach/pci.h>
++#include <asm/hardware.h>
++#include <asm/arch/ks8695-regs.h>
++
++
++static u32 pcicmd(unsigned int bus, unsigned int devfn, int where)
++{
++ where &= 0xfffffffc;
++ return (0x80000000 | (bus << 16) | (devfn << 8) | where);
++}
++
++static void local_write_config(unsigned int bus, unsigned int devfn, int where, u32 value)
++{
++ __raw_writel(pcicmd(bus, devfn, where), KS8695_REG(KS8695_PBCA));
++ __raw_writel(value, KS8695_REG(KS8695_PBCD));
++}
++
++
++static int ks8695_pci_read_config(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
++{
++ u32 v;
++
++
++ __raw_writel(pcicmd(bus->number, devfn, where), KS8695_REG(KS8695_PBCA));
++ v = __raw_readl(KS8695_REG(KS8695_PBCD));
++
++ if (size == 1)
++ *value = (u8) (v >> ((where & 0x3) * 8));
++ else if (size == 2)
++ *value = (u16) (v >> ((where & 0x2) * 8));
++ else
++ *value = v;
++
++ return PCIBIOS_SUCCESSFUL;
++}
++
++static u32 bytemasks[] = {
++ 0xffffff00, 0xffff00ff, 0xff0ffff, 0x00ffffff,
++};
++static u32 wordmasks[] = {
++ 0xffff0000, 0x00000000, 0x0000ffff,
++};
++
++static int ks8695_pci_write_config(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
++{
++ u32 cmd, v;
++ int nr;
++
++ v = value;
++ cmd = pcicmd(bus->number, devfn, where);
++ __raw_writel(cmd, KS8695_REG(KS8695_PBCA));
++
++ if (size == 1) {
++ nr = where & 0x3;
++ v = __raw_readl(KS8695_REG(KS8695_PBCD));
++ v = (v & bytemasks[nr]) | ((value & 0xff) << (nr * 8));
++ } else if (size == 2) {
++ nr = where & 0x2;
++ v = __raw_readl(KS8695_REG(KS8695_PBCD));
++ v = (v & wordmasks[nr]) | ((value & 0xffff) << (nr * 8));
++ }
++
++ __raw_writel(v, KS8695_REG(KS8695_PBCD));
++
++ return PCIBIOS_SUCCESSFUL;
++}
++
++struct pci_ops ks8695_pci_ops = {
++ .read = ks8695_pci_read_config,
++ .write = ks8695_pci_write_config,
++};
++
++static struct pci_bus *ks8695_pci_scan_bus(int nr, struct pci_sys_data *sys)
++{
++ return pci_scan_bus(sys->busnr, &ks8695_pci_ops, sys);
++}
++
++static struct resource pci_mem = {
++ .name = "PCI memory space",
++ .start = KS8695P_PCI_MEM_BASE + 0x04000000,
++ .end = KS8695P_PCI_MEM_BASE + KS8695P_PCI_MEM_SIZE - 1,
++ .flags = IORESOURCE_MEM,
++};
++
++static struct resource pci_io = {
++ .name = "PCI IO space",
++ .start = KS8695P_PCI_IO_BASE,
++ .end = KS8695P_PCI_IO_BASE + KS8695P_PCI_IO_SIZE - 1,
++ .flags = IORESOURCE_IO,
++};
++
++static int __init ks8695_pci_setup(int nr, struct pci_sys_data *sys)
++{
++ if (nr > 0)
++ return 0;
++
++ /* Assign and enable processor bridge */
++ local_write_config(0, 0, PCI_BASE_ADDRESS_0, KS8695P_PCI_MEM_BASE);
++ local_write_config(0, 0, PCI_COMMAND,
++ PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
++
++ request_resource(&iomem_resource, &pci_mem);
++ request_resource(&ioport_resource, &pci_io);
++
++ sys->resource[0] = &pci_io;
++ sys->resource[1] = &pci_mem;
++ sys->resource[2] = NULL;
++
++ return 1;
++}
++
++/*
++ * EXT0 is used as PCI bus interrupt source.
++ * level detection (active low)
++ */
++static void __init ks8695_pci_configure_interrupt(void)
++{
++ u32 v;
++
++ v = __raw_readl(KS8695_REG(KS8695_GPIO_MODE));
++ v |= 0x00000001;
++ __raw_writel(v, KS8695_REG(KS8695_GPIO_MODE));
++
++ v = __raw_readl(KS8695_REG(KS8695_GPIO_CTRL));
++ v &= 0xfffffff8;
++ v |= 0x8;
++ __raw_writel(v, KS8695_REG(KS8695_GPIO_CTRL));
++
++ v = __raw_readl(KS8695_REG(KS8695_GPIO_MODE));
++ v &= ~0x00000001;
++ __raw_writel(v, KS8695_REG(KS8695_GPIO_MODE));
++}
++
++static void __init ks8695_pci_preinit(void)
++{
++#if defined(CONFIG_MACH_CM4008) || defined(CONFIG_MACH_CM41xx)
++ /* Reset the PCI bus - (GPIO line is hooked up to bus reset) */
++ u32 msk;
++ msk = __raw_readl(KS8695_REG(KS8695_GPIO_MODE));
++ __raw_writel(msk | 0x2, KS8695_REG(KS8695_GPIO_MODE));
++
++ msk = __raw_readl(KS8695_REG(KS8695_GPIO_DATA));
++ __raw_writel(msk & ~0x2, KS8695_REG(KS8695_GPIO_DATA));
++ udelay(1000);
++ __raw_writel(msk | 0x2, KS8695_REG(KS8695_GPIO_DATA));
++ udelay(1000);
++#endif
++
++ /* stage 1 initialization, subid, subdevice = 0x0001 */
++ __raw_writel(0x00010001, KS8695_REG(KS8695_CRCSID));
++
++ /* stage 2 initialization */
++ /* prefetch limits with 16 words, retru enable */
++ __raw_writel(0x40000000, KS8695_REG(KS8695_PBCS));
++
++ /* configure memory mapping */
++ __raw_writel(KS8695P_PCIBG_MEM_BASE, KS8695_REG(KS8695_PMBA));
++ __raw_writel(KS8695P_PCI_MEM_MASK, KS8695_REG(KS8695_PMBAM));
++ __raw_writel(KS8695P_PCI_MEM_BASE, KS8695_REG(KS8695_PMBAT));
++
++ /* configure IO mapping */
++ __raw_writel(KS8695P_PCIBG_IO_BASE, KS8695_REG(KS8695_PIOBA));
++ __raw_writel(KS8695P_PCI_IO_MASK, KS8695_REG(KS8695_PIOBAM));
++ __raw_writel(KS8695P_PCI_IO_BASE, KS8695_REG(KS8695_PIOBAT));
++
++ ks8695_pci_configure_interrupt();
++}
++
++static int __init ks8695_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
++{
++ return 2;
++}
++
++struct hw_pci ks8695_pci __initdata = {
++ .nr_controllers = 1,
++ .preinit = ks8695_pci_preinit,
++ .swizzle = pci_std_swizzle,
++ .setup = ks8695_pci_setup,
++ .scan = ks8695_pci_scan_bus,
++ .map_irq = ks8695_pci_map_irq,
++};
++
++static int __init ks8695_pci_init(void)
++{
++ pci_common_init(&ks8695_pci);
++ return 0;
++}
++
++subsys_initcall(ks8695_pci_init);
++
+diff -Naur linux-2.6.16/arch/arm/mach-ks8695/time.c linux-2.6.16.ks8695/arch/arm/mach-ks8695/time.c
+--- linux-2.6.16/arch/arm/mach-ks8695/time.c 1970-01-01 10:00:00.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mach-ks8695/time.c 2006-03-15 22:42:43.000000000 +1000
+@@ -0,0 +1,79 @@
++/*
++ * linux/arch/arm/mach-ks8695/time.c
++ *
++ * Copyright (C) 2002 Micrel Inc.
++ * Copyright (C) 2006 Greg Ungerer <gerg@snapgear.com>
++ *
++ * 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/config.h>
++#include <linux/kernel.h>
++#include <linux/interrupt.h>
++#include <linux/init.h>
++#include <linux/time.h>
++#include <asm/system.h>
++#include <asm/hardware.h>
++#include <asm/irq.h>
++#include <asm/io.h>
++#include <asm/mach/time.h>
++
++
++/*
++ * Cannout read back time on KS8695.
++ */
++static unsigned long ks8695_gettimeoffset(void)
++{
++ return 0;
++}
++
++static irqreturn_t ks8695_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++ write_seqlock(&xtime_lock);
++ __raw_writel(KS8695_INTMASK_TIMERINT1, KS8695_REG(KS8695_INT_STATUS));
++ timer_tick(regs);
++ write_sequnlock(&xtime_lock);
++ return IRQ_HANDLED;
++}
++
++static struct irqaction ks8695_timer_irq = {
++ .name = "KS8695 Timer Tick",
++ .flags = SA_INTERRUPT | SA_TIMER,
++ .handler = ks8695_timer_interrupt,
++};
++
++/*
++ * Set up timer interrupt, and return the current time in seconds.
++ */
++static void __init ks8695_timer_init(void)
++{
++ unsigned long tmout = CLOCK_TICK_RATE / HZ;
++
++ /* Initialise to a known state (all timers off) */
++ __raw_writel(0, KS8695_REG(KS8695_TIMER_CTRL));
++
++ /* enable timer 1 as HZ clock */
++ __raw_writel(tmout, KS8695_REG(KS8695_TIMER1));
++ __raw_writel(tmout / 2, KS8695_REG(KS8695_TIMER1_PCOUNT));
++ __raw_writel(0x02, KS8695_REG(KS8695_TIMER_CTRL));
++
++ setup_irq(KS8695_INT_TIMERINT1, &ks8695_timer_irq);
++}
++
++struct sys_timer ks8695_timer = {
++ .init = ks8695_timer_init,
++ .offset = ks8695_gettimeoffset,
++};
++
+diff -Naur linux-2.6.16/arch/arm/Makefile linux-2.6.16.ks8695/arch/arm/Makefile
+--- linux-2.6.16/arch/arm/Makefile 2006-03-20 15:53:29.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/Makefile 2006-03-21 17:07:44.000000000 +1000
+@@ -94,6 +94,7 @@
+ machine-$(CONFIG_ARCH_IOP3XX) := iop3xx
+ machine-$(CONFIG_ARCH_IXP4XX) := ixp4xx
+ machine-$(CONFIG_ARCH_IXP2000) := ixp2000
++ machine-$(CONFIG_ARCH_KS8695) := ks8695
+ machine-$(CONFIG_ARCH_OMAP1) := omap1
+ machine-$(CONFIG_ARCH_OMAP2) := omap2
+ incdir-$(CONFIG_ARCH_OMAP) := omap
+diff -Naur linux-2.6.16/arch/arm/mm/Kconfig linux-2.6.16.ks8695/arch/arm/mm/Kconfig
+--- linux-2.6.16/arch/arm/mm/Kconfig 2006-03-20 15:53:29.000000000 +1000
++++ linux-2.6.16.ks8695/arch/arm/mm/Kconfig 2006-03-21 17:07:46.000000000 +1000
+@@ -83,8 +83,8 @@
+ # ARM922T
+ config CPU_ARM922T
+ bool "Support ARM922T processor" if ARCH_INTEGRATOR
+- depends on ARCH_LH7A40X || ARCH_INTEGRATOR
+- default y if ARCH_LH7A40X
++ depends on ARCH_LH7A40X || ARCH_INTEGRATOR || ARCH_KS8695
++ default y if ARCH_LH7A40X || ARCH_KS8695
+ select CPU_32v4
+ select CPU_ABRT_EV4T
+ select CPU_CACHE_V4WT
+
+-------------------------------------------------------------------
+List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
+FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php
+Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php \ No newline at end of file