u-boot/board/linkstation/linkstation.c
Guennadi Liakhovetski 61525f2ffa Support for LinkStation / KuroBox HD and HG PPC models
This patch is based on the port by Mihai Georgian (see linkstation.c for
Copyright information) and implements support for LinkStation / KuroBox HD
and HG PPC models from Buffalo Technology, whereby HD is deactivated at
the moment, pending network driver fixing.

Notice to users: this is pretty much a barebone port. Support for network
on HG models is already in the U-Boot mainline, but you might also want
patches to switch fan / phy modes depending on the negotiated ethernet
parameters. This patch also doesn't support console switching, booting EM
mode, Buffalo specific ext2 magic number. So, if you want to use any of
those, you need additional patches. Otherwise this patche provides a fully
functional u-boot with a network console on your system.

Signed-off-by: Guennadi Liakhovetski <lg@denx.de>
2008-04-13 23:08:40 -07:00

130 lines
3.4 KiB
C

/*
* linkstation.c
*
* Misc LinkStation specific functions
*
* Copyright (C) 2006 Mihai Georgian <u-boot@linuxnotincluded.org.uk>
*
* 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 <version.h>
#include <common.h>
#include <mpc824x.h>
#include <asm/io.h>
#include <ns16550.h>
#ifdef CONFIG_PCI
#include <pci.h>
#endif
extern void init_AVR_DUART(void);
int checkboard (void)
{
DECLARE_GLOBAL_DATA_PTR;
char *p;
bd_t *bd = gd->bd;
init_AVR_DUART();
if ((p = getenv ("console_nr")) != NULL) {
unsigned long con_nr = simple_strtoul (p, NULL, 10) & 3;
bd->bi_baudrate &= ~3;
bd->bi_baudrate |= con_nr & 3;
}
return 0;
}
long int initdram (int board_type)
{
return (get_ram_size(CFG_SDRAM_BASE, CFG_MAX_RAM_SIZE));
}
/*
* Initialize PCI Devices
*/
#ifdef CONFIG_PCI
#ifndef CONFIG_PCI_PNP
static struct pci_config_table pci_linkstation_config_table[] = {
/* vendor, device, class */
/* bus, dev, func */
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_ANY_ID, 0x0b, 0, /* AN983B or RTL8110S */
/* ethernet controller */
pci_cfgfunc_config_device, { PCI_ETH_IOADDR,
PCI_ETH_MEMADDR,
PCI_COMMAND_IO |
PCI_COMMAND_MEMORY |
PCI_COMMAND_MASTER }},
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_ANY_ID, 0x0c, 0, /* SII680 or IT8211AF */
/* ide controller */
pci_cfgfunc_config_device, { PCI_IDE_IOADDR,
PCI_IDE_MEMADDR,
PCI_COMMAND_IO |
PCI_COMMAND_MEMORY |
PCI_COMMAND_MASTER }},
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_ANY_ID, 0x0e, 0, /* D720101 USB controller, 1st USB 1.1 */
pci_cfgfunc_config_device, { PCI_USB0_IOADDR,
PCI_USB0_MEMADDR,
PCI_COMMAND_MEMORY |
PCI_COMMAND_MASTER }},
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_ANY_ID, 0x0e, 1, /* D720101 USB controller, 2nd USB 1.1 */
pci_cfgfunc_config_device, { PCI_USB1_IOADDR,
PCI_USB1_MEMADDR,
PCI_COMMAND_MEMORY |
PCI_COMMAND_MASTER }},
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_ANY_ID, 0x0e, 2, /* D720101 USB controller, USB 2.0 */
pci_cfgfunc_config_device, { PCI_USB2_IOADDR,
PCI_USB2_MEMADDR,
PCI_COMMAND_MEMORY |
PCI_COMMAND_MASTER }},
{ }
};
#endif
struct pci_controller hose = {
#ifndef CONFIG_PCI_PNP
config_table:pci_linkstation_config_table,
#endif
};
void pci_init_board (void)
{
pci_mpc824x_init (&hose);
/* Reset USB 1.1 */
/* Haven't seen any change without these on a HG, maybe it is
* needed on other models */
out_le32((volatile unsigned*)(PCI_USB0_MEMADDR + 8), 1);
out_le32((volatile unsigned*)(PCI_USB1_MEMADDR + 8), 1);
}
#endif /* CONFIG_PCI */
#define UART_DCR 0x80004511
int board_early_init_f (void)
{
/* set DUART mode */
out_8((volatile u8*)UART_DCR, 1);
return 0;
}