mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-04-21 12:27:27 +03:00
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@379 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
@@ -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
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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)
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user