9
0
Fork 0
barebox/board/eco920/eco920.c

213 lines
4.9 KiB
C

/*
* (C) Copyright 2007 Pengutronix
* Sascha Hauer, <s.hauer@pengutronix.de>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* 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/arch/AT91RM9200.h>
#include <at91rm9200_net.h>
#include <dm9161.h>
#include <miiphy.h>
#include <splash.h>
#include <s1d13706fb.h>
#include <net.h>
#include <cfi_flash.h>
#include <init.h>
DECLARE_GLOBAL_DATA_PTR;
/* ------------------------------------------------------------------------- */
/*
* Miscelaneous platform dependent initialisations
*/
static struct cfi_platform_data cfi_info = {
};
struct device_d cfi_dev = {
.name = "cfi_flash",
.id = "nor0",
.map_base = 0x11000000,
.size = 16 * 1024 * 1024,
.platform_data = &cfi_info,
};
struct device_d sdram_dev = {
.name = "ram",
.id = "ram0",
.map_base = 0x20000000,
.size = 32 * 1024 * 1024,
};
static struct device_d at91_ath_dev = {
.name = "at91_eth",
.id = "eth0",
.type = DEVICE_TYPE_ETHER,
};
static int devices_init (void)
{
register_device(&cfi_dev);
register_device(&sdram_dev);
register_device(&at91_ath_dev);
return 0;
}
device_initcall(devices_init);
static unsigned int phy_is_connected (AT91PS_EMAC p_mac)
{
return 1;
}
static unsigned char phy_init_bogus (AT91PS_EMAC p_mac)
{
unsigned short val;
int timeout, adr, speed, fullduplex;
at91rm9200_EmacEnableMDIO (p_mac);
/* Scan through phy addresses to find a phy */
for (adr = 0; adr < 16; adr++) {
at91rm9200_EmacReadPhy(p_mac, PHY_PHYIDR1 | (adr << 5), &val);
if (val != 0xffff)
break;
}
adr <<= 5;
val = PHY_BMCR_RESET;
at91rm9200_EmacWritePhy(p_mac, PHY_BMCR | adr, &val);
udelay(1000);
val = 0x01e1; /* ADVERTISE_100FULL | ADVERTISE_100HALF |
* ADVERTISE_10FULL | ADVERTISE_10HALF |
* ADVERTISE_CSMA */
at91rm9200_EmacWritePhy(p_mac, PHY_ANAR | adr, &val);
at91rm9200_EmacReadPhy(p_mac, PHY_BMCR | adr, &val);
val |= PHY_BMCR_AUTON | PHY_BMCR_RST_NEG;
at91rm9200_EmacWritePhy(p_mac, PHY_BMCR | adr, &val);
timeout = 500;
do {
/* at91rm9200_EmacReadPhy() has a udelay(10000)
* in it, so this should be about 5 deconds
*/
if ((timeout--) == 0) {
printf("Autonegotiation timeout\n");
goto out;
}
at91rm9200_EmacReadPhy(p_mac, PHY_BMSR | adr, &val);
} while (!(val & PHY_BMSR_LS));
at91rm9200_EmacReadPhy(p_mac, PHY_ANLPAR | adr, &val);
if (val & PHY_ANLPAR_100) {
speed = 100;
p_mac->EMAC_CFG |= AT91C_EMAC_SPD;
} else {
speed = 10;
p_mac->EMAC_CFG &= ~AT91C_EMAC_SPD;
}
if (val & (PHY_ANLPAR_TXFD | PHY_ANLPAR_10FD)) {
fullduplex = 1;
p_mac->EMAC_CFG |= AT91C_EMAC_FD;
} else {
fullduplex = 0;
p_mac->EMAC_CFG &= ~AT91C_EMAC_FD;
}
printf("running at %d-%sDuplex\n",speed, fullduplex ? "FUll" : "Half");
out:
at91rm9200_EmacDisableMDIO (p_mac);
return 1;
}
void at91rm9200_GetPhyInterface(AT91PS_PhyOps p_phyops)
{
p_phyops->Init = phy_init_bogus;
p_phyops->IsPhyConnected = phy_is_connected;
/* This is not used anywhere */
p_phyops->GetLinkSpeed = NULL;
/* ditto */
p_phyops->AutoNegotiate = NULL;
}
#ifdef CONFIG_DRIVER_VIDEO_S1D13706
static int efb_init(struct efb_info *efb)
{
writeb(GPIO_CONTROL0_GPO, efb->regs + EFB_GPIO_CONTROL1);
writeb(PCLK_SOURCE_CLKI2, efb->regs + EFB_PCLK_CONF);
writeb(0x1, efb->regs + 0x26); /* FIXME: display specific, should be set to zero
* according to datasheet
*/
return 0;
}
/* Nanya STN Display */
static struct efb_info efb = {
.fbd = {
.xres = 320,
.yres = 240,
.bpp = 8,
.fb = (void*)0x40020000,
},
.init = efb_init,
.regs = (void*)0x40000000,
.pixclock = 100000,
.hsync_len = 1,
.left_margin = 22,
.right_margin = 1,
.vsync_len = 1,
.upper_margin = 0,
.lower_margin = 1,
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
.panel_type = PANEL_TYPE_STN | PANEL_TYPE_WIDTH_8 |
PANEL_TYPE_COLOR | PANEL_TYPE_FORMAT_2,
};
#endif
#define SMC_CSR3 0xFFFFFF7C
int misc_init_r(void)
{
/* Initialization of the Static Memory Controller for Chip Select 3 */
*(volatile unsigned long*)SMC_CSR3 = 0x00002185;
#ifdef CONFIG_DRIVER_VIDEO_S1D13706
s1d13706fb_init(&efb);
#endif
#ifdef CONFIG_CMD_SPLASH
splash_set_fb_data(&efb.fbd);
#endif
return 0;
}