diff options
| author | wbx <wbx@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-03-16 13:50:00 +0000 | 
|---|---|---|
| committer | wbx <wbx@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2005-03-16 13:50:00 +0000 | 
| commit | 4f531230a3c9c8984c5a8e8b38874be7f608f2d1 (patch) | |
| tree | 1f132d8a78f19c1172bf4dbd9fba583bbb45423d /package/linux/kernel-source/arch/mips/brcm-boards/generic | |
| parent | c7df5a6a2cd4103e0c52018ba81c0fd0ee60f74d (diff) | |
add all source code from linksys/broadcom which is free, to cvs for better maintainence inside
openwrt. this gives us the ability to better support different hardware models, without changing
any external tar-balls. only et.o and wl.o is missing and is fetched from my webserver.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@379 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/linux/kernel-source/arch/mips/brcm-boards/generic')
4 files changed, 327 insertions, 0 deletions
| diff --git a/package/linux/kernel-source/arch/mips/brcm-boards/generic/Makefile b/package/linux/kernel-source/arch/mips/brcm-boards/generic/Makefile new file mode 100644 index 000000000..e16a80e56 --- /dev/null +++ b/package/linux/kernel-source/arch/mips/brcm-boards/generic/Makefile @@ -0,0 +1,26 @@ +# +# Makefile for generic Broadcom MIPS boards +# +# Copyright 2004, Broadcom Corporation +# All Rights Reserved. +#  +# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY +# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM +# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. +# +# $Id$ +# + +.S.s: +	$(CPP) $(AFLAGS) $< -o $*.s +.S.o: +	$(CC) $(AFLAGS) -c $< -o $*.o + +O_TARGET	:= brcm.o + +obj-y		:= int-handler.o irq.o + +obj-$(CONFIG_REMOTE_DEBUG)	+= gdb_hook.o + +include $(TOPDIR)/Rules.make diff --git a/package/linux/kernel-source/arch/mips/brcm-boards/generic/gdb_hook.c b/package/linux/kernel-source/arch/mips/brcm-boards/generic/gdb_hook.c new file mode 100644 index 000000000..1345289bb --- /dev/null +++ b/package/linux/kernel-source/arch/mips/brcm-boards/generic/gdb_hook.c @@ -0,0 +1,120 @@ +/* + * Copyright 2004, Broadcom Corporation       + * All Rights Reserved.       + *        + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       + * + * Carsten Langgaard, carstenl@mips.com + * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved. + * + * ######################################################################## + * + *  This program is free software; you can distribute it and/or modify it + *  under the terms of the GNU General Public License (Version 2) as + *  published by the Free Software Foundation. + * + *  This program is distributed in the hope 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. + * + * ######################################################################## + * + * This is the interface to the remote debugger stub. + * + */ + +#include <linux/serialP.h> +#include <linux/serial_reg.h> + +#include <asm/serial.h> +#include <asm/io.h> + +static struct async_struct kdb_port_info = {0}; + +static __inline__ unsigned int serial_in(struct async_struct *info, int offset) +{ +	return readb((unsigned long) info->iomem_base + +		     (offset<<info->iomem_reg_shift)); +} + +static __inline__ void serial_out(struct async_struct *info, int offset, +				  int value) +{ +	writeb(value, (unsigned long) info->iomem_base + +	       (offset<<info->iomem_reg_shift)); +} + +void rs_kgdb_hook(struct serial_state *ser) { +	int t; + +	kdb_port_info.state = ser; +	kdb_port_info.magic = SERIAL_MAGIC; +	kdb_port_info.port = ser->port; +	kdb_port_info.flags = ser->flags; +	kdb_port_info.iomem_base = ser->iomem_base; +	kdb_port_info.iomem_reg_shift = ser->iomem_reg_shift; +	kdb_port_info.MCR = UART_MCR_DTR | UART_MCR_RTS; + +	/* +	 * Clear all interrupts +	 */ +	serial_in(&kdb_port_info, UART_LSR); +	serial_in(&kdb_port_info, UART_RX); +	serial_in(&kdb_port_info, UART_IIR); +	serial_in(&kdb_port_info, UART_MSR); + +	/* +	 * Now, initialize the UART  +	 */ +	serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8);	/* reset DLAB */ +	serial_out(&kdb_port_info, UART_MCR, kdb_port_info.MCR); +	 +	/* +	 * and set the speed of the serial port +	 * (currently hardwired to 115200 8N1 +	 */ + +	/* baud rate is fixed to 115200 (is this sufficient?)*/ +	t = kdb_port_info.state->baud_base / 115200;	 +	/* set DLAB */ +	serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB); +	serial_out(&kdb_port_info, UART_DLL, t & 0xff);/* LS of divisor */ +	serial_out(&kdb_port_info, UART_DLM, t >> 8);  /* MS of divisor */ +	/* reset DLAB */ +	serial_out(&kdb_port_info, UART_LCR, UART_LCR_WLEN8); +} + +int putDebugChar(char c) +{ + +	if (!kdb_port_info.state) { 	/* need to init device first */ +		return 0; +	} + +	while ((serial_in(&kdb_port_info, UART_LSR) & UART_LSR_THRE) == 0) +		; + +	serial_out(&kdb_port_info, UART_TX, c); + +	return 1; +} + +char getDebugChar(void)  +{ +	if (!kdb_port_info.state) { 	/* need to init device first */ +		return 0; +	} + +	while (!(serial_in(&kdb_port_info, UART_LSR) & 1)) +		; + +	return(serial_in(&kdb_port_info, UART_RX)); +} diff --git a/package/linux/kernel-source/arch/mips/brcm-boards/generic/int-handler.S b/package/linux/kernel-source/arch/mips/brcm-boards/generic/int-handler.S new file mode 100644 index 000000000..de8f115c2 --- /dev/null +++ b/package/linux/kernel-source/arch/mips/brcm-boards/generic/int-handler.S @@ -0,0 +1,51 @@ +/* + * Generic interrupt handler for Broadcom MIPS boards + * + * Copyright 2004, Broadcom Corporation + * All Rights Reserved. + *  + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id$ + */ + +#include <linux/config.h> + +#include <asm/asm.h> +#include <asm/mipsregs.h> +#include <asm/regdef.h> +#include <asm/stackframe.h> + +/* + *	MIPS IRQ	Source + *      --------        ------ + *             0	Software (ignored) + *             1        Software (ignored) + *             2        Combined hardware interrupt (hw0) + *             3        Hardware + *             4        Hardware + *             5        Hardware + *             6        Hardware + *             7        R4k timer + */ + +	.text +	.set	noreorder +	.set	noat +	.align	5 +	NESTED(brcmIRQ, PT_SIZE, sp) +	SAVE_ALL +	CLI +	.set	at +    .set    noreorder + +	jal	    brcm_irq_dispatch +	 move	a0, sp + +	j	    ret_from_irq +	 nop +		 +	END(brcmIRQ) diff --git a/package/linux/kernel-source/arch/mips/brcm-boards/generic/irq.c b/package/linux/kernel-source/arch/mips/brcm-boards/generic/irq.c new file mode 100644 index 000000000..157c6b380 --- /dev/null +++ b/package/linux/kernel-source/arch/mips/brcm-boards/generic/irq.c @@ -0,0 +1,130 @@ +/* + * Generic interrupt control functions for Broadcom MIPS boards + * + * Copyright 2004, Broadcom Corporation + * All Rights Reserved. + *  + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id$ + */ + +#include <linux/config.h> +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/interrupt.h> +#include <linux/irq.h> + +#include <asm/irq.h> +#include <asm/mipsregs.h> +#include <asm/gdb-stub.h> + +#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5) + +extern asmlinkage void brcmIRQ(void); +extern asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs); + +void +brcm_irq_dispatch(struct pt_regs *regs) +{ +	u32 cause; + +	cause = read_c0_cause() & +		read_c0_status() & +		CAUSEF_IP; + +#ifdef CONFIG_KERNPROF +	change_c0_status(cause | 1, 1); +#else +	clear_c0_status(cause); +#endif + +	if (cause & CAUSEF_IP7) +		do_IRQ(7, regs); +	if (cause & CAUSEF_IP2) +		do_IRQ(2, regs); +	if (cause & CAUSEF_IP3) +		do_IRQ(3, regs); +	if (cause & CAUSEF_IP4) +		do_IRQ(4, regs); +	if (cause & CAUSEF_IP5) +		do_IRQ(5, regs); +	if (cause & CAUSEF_IP6) +		do_IRQ(6, regs); +} + +static void +enable_brcm_irq(unsigned int irq) +{ +	if (irq < 8) +		set_c0_status(1 << (irq + 8)); +	else +		set_c0_status(IE_IRQ0); +} + +static void +disable_brcm_irq(unsigned int irq) +{ +	if (irq < 8) +		clear_c0_status(1 << (irq + 8)); +	else +		clear_c0_status(IE_IRQ0); +} + +static void +ack_brcm_irq(unsigned int irq) +{ +	/* Already done in brcm_irq_dispatch */ +} + +static unsigned int +startup_brcm_irq(unsigned int irq) +{  +	enable_brcm_irq(irq); + +	return 0; /* never anything pending */ +} + +static void +end_brcm_irq(unsigned int irq) +{ +	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) +		enable_brcm_irq(irq); +} + +static struct hw_interrupt_type brcm_irq_type = { +	typename: "MIPS", +	startup: startup_brcm_irq, +	shutdown: disable_brcm_irq, +	enable: enable_brcm_irq, +	disable: disable_brcm_irq, +	ack: ack_brcm_irq, +	end: end_brcm_irq, +	NULL +}; + +void __init +init_IRQ(void) +{ +	int i; + +	for (i = 0; i < NR_IRQS; i++) { +		irq_desc[i].status = IRQ_DISABLED; +		irq_desc[i].action = 0; +		irq_desc[i].depth = 1; +		irq_desc[i].handler = &brcm_irq_type; +	} + +    	set_except_vector(0, brcmIRQ); +	change_c0_status(ST0_IM, ALLINTS); + +#ifdef CONFIG_REMOTE_DEBUG +	printk("Breaking into debugger...\n"); +	set_debug_traps(); +	breakpoint();  +#endif +} | 
