mpc83xx: add QE ethernet support
this patch adds support for the QUICC Engine based UCC gigabit ethernet device.
This commit is contained in:
@@ -29,7 +29,7 @@ LIB = $(obj)lib$(CPU).a
|
||||
|
||||
START = start.o
|
||||
COBJS = traps.o cpu.o cpu_init.o speed.o interrupts.o \
|
||||
i2c.o spd_sdram.o
|
||||
i2c.o spd_sdram.o qe_io.o
|
||||
|
||||
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2004 Freescale Semiconductor, Inc.
|
||||
* Copyright (C) 2004-2006 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
@@ -31,6 +31,30 @@
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifdef CONFIG_QE
|
||||
extern qe_iop_conf_t qe_iop_conf_tab[];
|
||||
extern void qe_config_iopin(u8 port, u8 pin, int dir,
|
||||
int open_drain, int assign);
|
||||
extern void qe_init(uint qe_base);
|
||||
extern void qe_reset(void);
|
||||
|
||||
static void config_qe_ioports(void)
|
||||
{
|
||||
u8 port, pin;
|
||||
int dir, open_drain, assign;
|
||||
int i;
|
||||
|
||||
for (i = 0; qe_iop_conf_tab[i].assign != QE_IOP_TAB_END; i++) {
|
||||
port = qe_iop_conf_tab[i].port;
|
||||
pin = qe_iop_conf_tab[i].pin;
|
||||
dir = qe_iop_conf_tab[i].dir;
|
||||
open_drain = qe_iop_conf_tab[i].open_drain;
|
||||
assign = qe_iop_conf_tab[i].assign;
|
||||
qe_config_iopin(port, pin, dir, open_drain, assign);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Breathe some life into the CPU...
|
||||
*
|
||||
@@ -100,6 +124,10 @@ void cpu_init_f (volatile immap_t * im)
|
||||
#ifdef CFG_SICRL
|
||||
im->sysconf.sicrl = CFG_SICRL;
|
||||
#endif
|
||||
#ifdef CONFIG_QE
|
||||
/* Config QE ioports */
|
||||
config_qe_ioports();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Memory Controller:
|
||||
@@ -188,12 +216,12 @@ void cpu_init_f (volatile immap_t * im)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Initialize higher level parts of CPU like time base and timers.
|
||||
*/
|
||||
|
||||
int cpu_init_r (void)
|
||||
{
|
||||
#ifdef CONFIG_QE
|
||||
uint qe_base = CFG_IMMRBAR + 0x00100000; /* QE immr base */
|
||||
qe_init(qe_base);
|
||||
qe_reset();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
85
cpu/mpc83xx/qe_io.c
Normal file
85
cpu/mpc83xx/qe_io.c
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (C) 2006 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* Dave Liu <daveliu@freescale.com>
|
||||
* based on source code of Shlomi Gridish
|
||||
*
|
||||
* 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 "common.h"
|
||||
#include "asm/errno.h"
|
||||
#include "asm/io.h"
|
||||
#include "asm/immap_83xx.h"
|
||||
|
||||
#if defined(CONFIG_QE)
|
||||
#define NUM_OF_PINS 32
|
||||
void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign)
|
||||
{
|
||||
u32 pin_2bit_mask;
|
||||
u32 pin_2bit_dir;
|
||||
u32 pin_2bit_assign;
|
||||
u32 pin_1bit_mask;
|
||||
u32 tmp_val;
|
||||
volatile immap_t *im = (volatile immap_t *)CFG_IMMRBAR;
|
||||
volatile gpio83xx_t *par_io =(volatile gpio83xx_t *)&im->gpio;
|
||||
|
||||
/* Caculate pin location and 2bit mask and dir */
|
||||
pin_2bit_mask = (u32)(0x3 << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
|
||||
pin_2bit_dir = (u32)(dir << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2));
|
||||
|
||||
/* Setup the direction */
|
||||
tmp_val = (pin > (NUM_OF_PINS/2) - 1) ? \
|
||||
in_be32(&par_io->ioport[port].dir2) :
|
||||
in_be32(&par_io->ioport[port].dir1);
|
||||
|
||||
if (pin > (NUM_OF_PINS/2) -1) {
|
||||
out_be32(&par_io->ioport[port].dir2, ~pin_2bit_mask & tmp_val);
|
||||
out_be32(&par_io->ioport[port].dir2, pin_2bit_dir | tmp_val);
|
||||
} else {
|
||||
out_be32(&par_io->ioport[port].dir1, ~pin_2bit_mask & tmp_val);
|
||||
out_be32(&par_io->ioport[port].dir1, pin_2bit_dir | tmp_val);
|
||||
}
|
||||
|
||||
/* Calculate pin location for 1bit mask */
|
||||
pin_1bit_mask = (u32)(1 << (NUM_OF_PINS - (pin+1)));
|
||||
|
||||
/* Setup the open drain */
|
||||
tmp_val = in_be32(&par_io->ioport[port].podr);
|
||||
if (open_drain) {
|
||||
out_be32(&par_io->ioport[port].podr, pin_1bit_mask | tmp_val);
|
||||
} else {
|
||||
out_be32(&par_io->ioport[port].podr, ~pin_1bit_mask & tmp_val);
|
||||
}
|
||||
|
||||
/* Setup the assignment */
|
||||
tmp_val = (pin > (NUM_OF_PINS/2) - 1) ?
|
||||
in_be32(&par_io->ioport[port].ppar2):
|
||||
in_be32(&par_io->ioport[port].ppar1);
|
||||
pin_2bit_assign = (u32)(assign
|
||||
<< (NUM_OF_PINS - (pin%(NUM_OF_PINS/2)+1)*2));
|
||||
|
||||
/* Clear and set 2 bits mask */
|
||||
if (pin > (NUM_OF_PINS/2) - 1) {
|
||||
out_be32(&par_io->ioport[port].ppar2, ~pin_2bit_mask & tmp_val);
|
||||
out_be32(&par_io->ioport[port].ppar2, pin_2bit_assign | tmp_val);
|
||||
} else {
|
||||
out_be32(&par_io->ioport[port].ppar1, ~pin_2bit_mask & tmp_val);
|
||||
out_be32(&par_io->ioport[port].ppar1, pin_2bit_assign | tmp_val);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_QE */
|
||||
Reference in New Issue
Block a user