2f2c267989
Reduce the function pointer mess of the m68knommu timer code by calling directly to the local hardware's timer setup, and expose the local common timer interrupt handler to the lower level hardware timer. Ultimately this will save definitions of all these functions across all the platform code to setup the function pointers (which for any given m68knommu CPU family member can be only one set of hardware timer functions). Signed-off-by: Greg Ungerer <gerg@uclinux.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
98 lines
2.4 KiB
C
98 lines
2.4 KiB
C
/***************************************************************************/
|
|
|
|
/*
|
|
* linux/arch/m68knommu/platform/5206/config.c
|
|
*
|
|
* Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
|
|
* Copyright (C) 2000-2001, Lineo Inc. (www.lineo.com)
|
|
*/
|
|
|
|
/***************************************************************************/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/param.h>
|
|
#include <linux/init.h>
|
|
#include <linux/interrupt.h>
|
|
#include <asm/dma.h>
|
|
#include <asm/machdep.h>
|
|
#include <asm/coldfire.h>
|
|
#include <asm/mcftimer.h>
|
|
#include <asm/mcfsim.h>
|
|
#include <asm/mcfdma.h>
|
|
|
|
/***************************************************************************/
|
|
|
|
void coldfire_reset(void);
|
|
|
|
/***************************************************************************/
|
|
|
|
/*
|
|
* DMA channel base address table.
|
|
*/
|
|
unsigned int dma_base_addr[MAX_M68K_DMA_CHANNELS] = {
|
|
MCF_MBAR + MCFDMA_BASE0,
|
|
MCF_MBAR + MCFDMA_BASE1,
|
|
};
|
|
|
|
unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
|
|
|
|
/***************************************************************************/
|
|
|
|
void mcf_autovector(unsigned int vec)
|
|
{
|
|
volatile unsigned char *mbar;
|
|
unsigned char icr;
|
|
|
|
if ((vec >= 25) && (vec <= 31)) {
|
|
vec -= 25;
|
|
mbar = (volatile unsigned char *) MCF_MBAR;
|
|
icr = MCFSIM_ICR_AUTOVEC | (vec << 3);
|
|
*(mbar + MCFSIM_ICR1 + vec) = icr;
|
|
vec = 0x1 << (vec + 1);
|
|
mcf_setimr(mcf_getimr() & ~vec);
|
|
}
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
void mcf_settimericr(unsigned int timer, unsigned int level)
|
|
{
|
|
volatile unsigned char *icrp;
|
|
unsigned int icr, imr;
|
|
|
|
if (timer <= 2) {
|
|
switch (timer) {
|
|
case 2: icr = MCFSIM_TIMER2ICR; imr = MCFSIM_IMR_TIMER2; break;
|
|
default: icr = MCFSIM_TIMER1ICR; imr = MCFSIM_IMR_TIMER1; break;
|
|
}
|
|
|
|
icrp = (volatile unsigned char *) (MCF_MBAR + icr);
|
|
*icrp = MCFSIM_ICR_AUTOVEC | (level << 2) | MCFSIM_ICR_PRI3;
|
|
mcf_setimr(mcf_getimr() & ~imr);
|
|
}
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
int mcf_timerirqpending(int timer)
|
|
{
|
|
unsigned int imr = 0;
|
|
|
|
switch (timer) {
|
|
case 1: imr = MCFSIM_IMR_TIMER1; break;
|
|
case 2: imr = MCFSIM_IMR_TIMER2; break;
|
|
default: break;
|
|
}
|
|
return (mcf_getipr() & imr);
|
|
}
|
|
|
|
/***************************************************************************/
|
|
|
|
void config_BSP(char *commandp, int size)
|
|
{
|
|
mcf_setimr(MCFSIM_IMR_MASKALL);
|
|
mach_reset = coldfire_reset;
|
|
}
|
|
|
|
/***************************************************************************/
|