Skip to content

Commit

Permalink
[ARM] 4331/3: Support for Micrel/Kendin KS8695 processor
Browse files Browse the repository at this point in the history
Add core support for the Kendin/Micrel KS8695 processor family.

It is an ARM922-T based SoC with integrated USART, 4-port Ethernet
Switch, WAN Ethernet port, and optional PCI Host bridge, etc.
 http://www.micrel.com/page.do?page=product-info/sys_on_chip.jsp

This patch is based on earlier patches from Lennert Buytenhek, Ben
Dooks and Greg Ungerer posted to the arm-linux-kernel mailing list in
March 2006;  and Micrel's 2.6.9 port.

Signed-off-by: Andrew Victor <andrew@sanpeople.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Andrew Victor authored and Russell King committed May 11, 2007
1 parent c42dcb3 commit c53c9cf
Show file tree
Hide file tree
Showing 35 changed files with 1,768 additions and 5 deletions.
13 changes: 11 additions & 2 deletions arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,12 @@ 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_KS8695
bool "Micrel/Kendin KS8695"
help
Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
System-on-Chip devices.

config ARCH_NS9XXX
bool "NetSilicon NS9xxx"
help
Expand Down Expand Up @@ -451,6 +457,8 @@ source "arch/arm/mach-ns9xxx/Kconfig"

source "arch/arm/mach-davinci/Kconfig"

source "arch/arm/mach-ks8695/Kconfig"

# Definitions to make life easier
config ARCH_ACORN
bool
Expand Down Expand Up @@ -511,7 +519,7 @@ config ISA_DMA_API
bool

config PCI
bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX
bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || 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
Expand Down Expand Up @@ -680,7 +688,8 @@ config LEDS
ARCH_LUBBOCK || MACH_MAINSTONE || ARCH_NETWINDER || \
ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
ARCH_AT91 || MACH_TRIZEPS4 || ARCH_DAVINCI
ARCH_AT91 || MACH_TRIZEPS4 || ARCH_DAVINCI || \
ARCH_KS8695
help
If you say Y here, the LEDs on your machine will be used
to provide useful information about your current system status.
Expand Down
1 change: 1 addition & 0 deletions arch/arm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ endif
machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
textofs-$(CONFIG_ARCH_NS9XXX) := 0x00108000
machine-$(CONFIG_ARCH_DAVINCI) := davinci
machine-$(CONFIG_ARCH_KS8695) := ks8695

ifeq ($(CONFIG_ARCH_EBSA110),y)
# This is what happens if you forget the IOCS16 line.
Expand Down
8 changes: 8 additions & 0 deletions arch/arm/mach-ks8695/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
if ARCH_KS8695

menu "Kendin/Micrel KS8695 Implementations"


endmenu

endif
14 changes: 14 additions & 0 deletions arch/arm/mach-ks8695/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# arch/arm/mach-ks8695/Makefile
#
# Makefile for KS8695 architecture support
#

obj-y := cpu.o irq.o time.o devices.o
obj-m :=
obj-n :=
obj- :=

# PCI support is optional
#obj-$(CONFIG_PCI) += pci.o

# Board-specific support
8 changes: 8 additions & 0 deletions arch/arm/mach-ks8695/Makefile.boot
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Note: the following conditions must always be true:
# ZRELADDR == virt_to_phys(TEXTADDR)
# PARAMS_PHYS must be within 4MB of ZRELADDR
# INITRD_PHYS must be in RAM

zreladdr-y := 0x00008000
params_phys-y := 0x00000100
initrd_phys-y := 0x00800000
73 changes: 73 additions & 0 deletions arch/arm/mach-ks8695/cpu.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* arch/arm/mach-ks8695/cpu.c
*
* Copyright (C) 2006 Ben Dooks <ben@simtec.co.uk>
* Copyright (C) 2006 Simtec Electronics
*
* KS8695 CPU support
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>

#include <asm/arch/regs-sys.h>
#include <asm/arch/regs-misc.h>


static struct __initdata map_desc ks8695_io_desc[] = {
{
.virtual = KS8695_IO_VA,
.pfn = __phys_to_pfn(KS8695_IO_PA),
.length = KS8695_IO_SIZE,
.type = MT_DEVICE,
}
};

static void __init ks8695_processor_info(void)
{
unsigned long id, rev;

id = __raw_readl(KS8695_MISC_VA + KS8695_DID);
rev = __raw_readl(KS8695_MISC_VA + KS8695_RID);

printk("KS8695 ID=%04lx SubID=%02lx Revision=%02lx\n", (id & DID_ID), (rev & RID_SUBID), (rev & RID_REVISION));
}

static unsigned int sysclk[8] = { 125000000, 100000000, 62500000, 50000000, 41700000, 33300000, 31300000, 25000000 };
static unsigned int cpuclk[8] = { 166000000, 166000000, 83000000, 83000000, 55300000, 55300000, 41500000, 41500000 };

static void __init ks8695_clock_info(void)
{
unsigned int scdc = __raw_readl(KS8695_SYS_VA + KS8695_CLKCON) & CLKCON_SCDC;

printk("Clocks: System %u MHz, CPU %u MHz\n",
sysclk[scdc] / 1000000, cpuclk[scdc] / 1000000);
}

void __init ks8695_map_io(void)
{
iotable_init(ks8695_io_desc, ARRAY_SIZE(ks8695_io_desc));

ks8695_processor_info();
ks8695_clock_info();
}
191 changes: 191 additions & 0 deletions arch/arm/mach-ks8695/devices.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
/*
* arch/arm/mach-ks8695/devices.c
*
* Copyright (C) 2006 Andrew Victor
*
* 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.
*
* 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 <asm/mach/arch.h>
#include <asm/mach/map.h>

#include <linux/platform_device.h>

#include <asm/arch/regs-wan.h>
#include <asm/arch/regs-lan.h>
#include <asm/arch/regs-hpna.h>


/* --------------------------------------------------------------------
* Ethernet
* -------------------------------------------------------------------- */

#if defined(CONFIG_ARM_KS8695_ETHER) || defined(CONFIG_ARM_KS8695_ETHER_MODULE)
static u64 eth_dmamask = 0xffffffffUL;

static struct resource ks8695_wan_resources[] = {
[0] = {
.start = KS8695_WAN_VA,
.end = KS8695_WAN_VA + 0x00ff,
.flags = IORESOURCE_MEM,
},
[1] = {
.name = "WAN RX",
.start = KS8695_IRQ_WAN_RX_STATUS,
.end = KS8695_IRQ_WAN_RX_STATUS,
.flags = IORESOURCE_IRQ,
},
[2] = {
.name = "WAN TX",
.start = KS8695_IRQ_WAN_TX_STATUS,
.end = KS8695_IRQ_WAN_TX_STATUS,
.flags = IORESOURCE_IRQ,
},
[3] = {
.name = "WAN Link",
.start = KS8695_IRQ_WAN_LINK,
.end = KS8695_IRQ_WAN_LINK,
.flags = IORESOURCE_IRQ,
},
};

static struct platform_device ks8695_wan_device = {
.name = "ks8695_ether",
.id = 0,
.dev = {
.dma_mask = &eth_dmamask,
.coherent_dma_mask = 0xffffffff,
},
.resource = ks8695_wan_resources,
.num_resources = ARRAY_SIZE(ks8695_wan_resources),
};


static struct resource ks8695_lan_resources[] = {
[0] = {
.start = KS8695_LAN_VA,
.end = KS8695_LAN_VA + 0x00ff,
.flags = IORESOURCE_MEM,
},
[1] = {
.name = "LAN RX",
.start = KS8695_IRQ_LAN_RX_STATUS,
.end = KS8695_IRQ_LAN_RX_STATUS,
.flags = IORESOURCE_IRQ,
},
[2] = {
.name = "LAN TX",
.start = KS8695_IRQ_LAN_TX_STATUS,
.end = KS8695_IRQ_LAN_TX_STATUS,
.flags = IORESOURCE_IRQ,
},
};

static struct platform_device ks8695_lan_device = {
.name = "ks8695_ether",
.id = 1,
.dev = {
.dma_mask = &eth_dmamask,
.coherent_dma_mask = 0xffffffff,
},
.resource = ks8695_lan_resources,
.num_resources = ARRAY_SIZE(ks8695_lan_resources),
};


static struct resource ks8695_hpna_resources[] = {
[0] = {
.start = KS8695_HPNA_VA,
.end = KS8695_HPNA_VA + 0x00ff,
.flags = IORESOURCE_MEM,
},
[1] = {
.name = "HPNA RX",
.start = KS8695_IRQ_HPNA_RX_STATUS,
.end = KS8695_IRQ_HPNA_RX_STATUS,
.flags = IORESOURCE_IRQ,
},
[2] = {
.name = "HPNA TX",
.start = KS8695_IRQ_HPNA_TX_STATUS,
.end = KS8695_IRQ_HPNA_TX_STATUS,
.flags = IORESOURCE_IRQ,
},
};

static struct platform_device ks8695_hpna_device = {
.name = "ks8695_ether",
.id = 2,
.dev = {
.dma_mask = &eth_dmamask,
.coherent_dma_mask = 0xffffffff,
},
.resource = ks8695_hpna_resources,
.num_resources = ARRAY_SIZE(ks8695_hpna_resources),
};

void __init ks8695_add_device_wan(void)
{
platform_device_register(&ks8695_wan_device);
}

void __init ks8695_add_device_lan(void)
{
platform_device_register(&ks8695_lan_device);
}

void __init ks8696_add_device_hpna(void)
{
platform_device_register(&ks8695_hpna_device);
}
#else
void __init ks8695_add_device_wan(void) {}
void __init ks8695_add_device_lan(void) {}
void __init ks8696_add_device_hpna(void) {}
#endif


/* --------------------------------------------------------------------
* Watchdog
* -------------------------------------------------------------------- */

#if defined(CONFIG_KS8695_WATCHDOG) || defined(CONFIG_KS8695_WATCHDOG_MODULE)
static struct platform_device ks8695_wdt_device = {
.name = "ks8695_wdt",
.id = -1,
.num_resources = 0,
};

static void __init ks8695_add_device_watchdog(void)
{
platform_device_register(&ks8695_wdt_device);
}
#else
static void __init ks8695_add_device_watchdog(void) {}
#endif


/* -------------------------------------------------------------------- */

/*
* These devices are always present and don't need any board-specific
* setup.
*/
static int __init ks8695_add_standard_devices(void)
{
ks8695_add_device_watchdog();
return 0;
}

arch_initcall(ks8695_add_standard_devices);
15 changes: 15 additions & 0 deletions arch/arm/mach-ks8695/generic.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* arch/arm/mach-ks8695/generic.h
*
* Copyright (C) 2006 Ben Dooks <ben@simtec.co.uk>
* Copyright (C) 2006 Simtec Electronics
*
* 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.
*/

extern __init void ks8695_map_io(void);
extern __init void ks8695_init_irq(void);
extern struct sys_timer ks8695_timer;
Loading

0 comments on commit c53c9cf

Please sign in to comment.