commit
c35cf8dc9f
@ -0,0 +1,231 @@ |
|||||||
|
/*
|
||||||
|
* TI PIPE3 PHY |
||||||
|
* |
||||||
|
* (C) Copyright 2013 |
||||||
|
* Texas Instruments, <www.ti.com> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <sata.h> |
||||||
|
#include <asm/arch/clock.h> |
||||||
|
#include <asm/arch/sys_proto.h> |
||||||
|
#include <asm/io.h> |
||||||
|
#include <asm/errno.h> |
||||||
|
#include "pipe3-phy.h" |
||||||
|
|
||||||
|
/* PLLCTRL Registers */ |
||||||
|
#define PLL_STATUS 0x00000004 |
||||||
|
#define PLL_GO 0x00000008 |
||||||
|
#define PLL_CONFIGURATION1 0x0000000C |
||||||
|
#define PLL_CONFIGURATION2 0x00000010 |
||||||
|
#define PLL_CONFIGURATION3 0x00000014 |
||||||
|
#define PLL_CONFIGURATION4 0x00000020 |
||||||
|
|
||||||
|
#define PLL_REGM_MASK 0x001FFE00 |
||||||
|
#define PLL_REGM_SHIFT 9 |
||||||
|
#define PLL_REGM_F_MASK 0x0003FFFF |
||||||
|
#define PLL_REGM_F_SHIFT 0 |
||||||
|
#define PLL_REGN_MASK 0x000001FE |
||||||
|
#define PLL_REGN_SHIFT 1 |
||||||
|
#define PLL_SELFREQDCO_MASK 0x0000000E |
||||||
|
#define PLL_SELFREQDCO_SHIFT 1 |
||||||
|
#define PLL_SD_MASK 0x0003FC00 |
||||||
|
#define PLL_SD_SHIFT 10 |
||||||
|
#define SET_PLL_GO 0x1 |
||||||
|
#define PLL_TICOPWDN BIT(16) |
||||||
|
#define PLL_LDOPWDN BIT(15) |
||||||
|
#define PLL_LOCK 0x2 |
||||||
|
#define PLL_IDLE 0x1 |
||||||
|
|
||||||
|
/* PHY POWER CONTROL Register */ |
||||||
|
#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK 0x003FC000 |
||||||
|
#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT 0xE |
||||||
|
|
||||||
|
#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_MASK 0xFFC00000 |
||||||
|
#define OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_SHIFT 0x16 |
||||||
|
|
||||||
|
#define OMAP_CTRL_PIPE3_PHY_TX_RX_POWERON 0x3 |
||||||
|
#define OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF 0x0 |
||||||
|
|
||||||
|
|
||||||
|
#define PLL_IDLE_TIME 100 /* in milliseconds */ |
||||||
|
#define PLL_LOCK_TIME 100 /* in milliseconds */ |
||||||
|
|
||||||
|
static inline u32 omap_pipe3_readl(void __iomem *addr, unsigned offset) |
||||||
|
{ |
||||||
|
return __raw_readl(addr + offset); |
||||||
|
} |
||||||
|
|
||||||
|
static inline void omap_pipe3_writel(void __iomem *addr, unsigned offset, |
||||||
|
u32 data) |
||||||
|
{ |
||||||
|
__raw_writel(data, addr + offset); |
||||||
|
} |
||||||
|
|
||||||
|
static struct pipe3_dpll_params *omap_pipe3_get_dpll_params(struct omap_pipe3 |
||||||
|
*pipe3) |
||||||
|
{ |
||||||
|
u32 rate; |
||||||
|
struct pipe3_dpll_map *dpll_map = pipe3->dpll_map; |
||||||
|
|
||||||
|
rate = get_sys_clk_freq(); |
||||||
|
|
||||||
|
for (; dpll_map->rate; dpll_map++) { |
||||||
|
if (rate == dpll_map->rate) |
||||||
|
return &dpll_map->params; |
||||||
|
} |
||||||
|
|
||||||
|
printf("%s: No DPLL configuration for %u Hz SYS CLK\n", |
||||||
|
__func__, rate); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
static int omap_pipe3_wait_lock(struct omap_pipe3 *phy) |
||||||
|
{ |
||||||
|
u32 val; |
||||||
|
int timeout = PLL_LOCK_TIME; |
||||||
|
|
||||||
|
do { |
||||||
|
mdelay(1); |
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS); |
||||||
|
if (val & PLL_LOCK) |
||||||
|
break; |
||||||
|
} while (--timeout); |
||||||
|
|
||||||
|
if (!(val & PLL_LOCK)) { |
||||||
|
printf("%s: DPLL failed to lock\n", __func__); |
||||||
|
return -EBUSY; |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static int omap_pipe3_dpll_program(struct omap_pipe3 *phy) |
||||||
|
{ |
||||||
|
u32 val; |
||||||
|
struct pipe3_dpll_params *dpll_params; |
||||||
|
|
||||||
|
dpll_params = omap_pipe3_get_dpll_params(phy); |
||||||
|
if (!dpll_params) { |
||||||
|
printf("%s: Invalid DPLL parameters\n", __func__); |
||||||
|
return -EINVAL; |
||||||
|
} |
||||||
|
|
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); |
||||||
|
val &= ~PLL_REGN_MASK; |
||||||
|
val |= dpll_params->n << PLL_REGN_SHIFT; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); |
||||||
|
|
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); |
||||||
|
val &= ~PLL_SELFREQDCO_MASK; |
||||||
|
val |= dpll_params->freq << PLL_SELFREQDCO_SHIFT; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val); |
||||||
|
|
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION1); |
||||||
|
val &= ~PLL_REGM_MASK; |
||||||
|
val |= dpll_params->m << PLL_REGM_SHIFT; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION1, val); |
||||||
|
|
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION4); |
||||||
|
val &= ~PLL_REGM_F_MASK; |
||||||
|
val |= dpll_params->mf << PLL_REGM_F_SHIFT; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION4, val); |
||||||
|
|
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION3); |
||||||
|
val &= ~PLL_SD_MASK; |
||||||
|
val |= dpll_params->sd << PLL_SD_SHIFT; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION3, val); |
||||||
|
|
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_GO, SET_PLL_GO); |
||||||
|
|
||||||
|
return omap_pipe3_wait_lock(phy); |
||||||
|
} |
||||||
|
|
||||||
|
static void omap_control_phy_power(struct omap_pipe3 *phy, int on) |
||||||
|
{ |
||||||
|
u32 val, rate; |
||||||
|
|
||||||
|
val = readl(phy->power_reg); |
||||||
|
|
||||||
|
rate = get_sys_clk_freq(); |
||||||
|
rate = rate/1000000; |
||||||
|
|
||||||
|
if (on) { |
||||||
|
val &= ~(OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK | |
||||||
|
OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_MASK); |
||||||
|
val |= OMAP_CTRL_PIPE3_PHY_TX_RX_POWERON << |
||||||
|
OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT; |
||||||
|
val |= rate << |
||||||
|
OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_FREQ_SHIFT; |
||||||
|
} else { |
||||||
|
val &= ~OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_MASK; |
||||||
|
val |= OMAP_CTRL_PIPE3_PHY_TX_RX_POWEROFF << |
||||||
|
OMAP_CTRL_PIPE3_PHY_PWRCTL_CLK_CMD_SHIFT; |
||||||
|
} |
||||||
|
|
||||||
|
writel(val, phy->power_reg); |
||||||
|
} |
||||||
|
|
||||||
|
int phy_pipe3_power_on(struct omap_pipe3 *phy) |
||||||
|
{ |
||||||
|
int ret; |
||||||
|
u32 val; |
||||||
|
|
||||||
|
/* Program the DPLL only if not locked */ |
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS); |
||||||
|
if (!(val & PLL_LOCK)) { |
||||||
|
ret = omap_pipe3_dpll_program(phy); |
||||||
|
if (ret) |
||||||
|
return ret; |
||||||
|
} else { |
||||||
|
/* else just bring it out of IDLE mode */ |
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); |
||||||
|
if (val & PLL_IDLE) { |
||||||
|
val &= ~PLL_IDLE; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, |
||||||
|
PLL_CONFIGURATION2, val); |
||||||
|
ret = omap_pipe3_wait_lock(phy); |
||||||
|
if (ret) |
||||||
|
return ret; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* Power up the PHY */ |
||||||
|
omap_control_phy_power(phy, 1); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int phy_pipe3_power_off(struct omap_pipe3 *phy) |
||||||
|
{ |
||||||
|
u32 val; |
||||||
|
int timeout = PLL_IDLE_TIME; |
||||||
|
|
||||||
|
/* Power down the PHY */ |
||||||
|
omap_control_phy_power(phy, 0); |
||||||
|
|
||||||
|
/* Put DPLL in IDLE mode */ |
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_CONFIGURATION2); |
||||||
|
val |= PLL_IDLE; |
||||||
|
omap_pipe3_writel(phy->pll_ctrl_base, PLL_CONFIGURATION2, val); |
||||||
|
|
||||||
|
/* wait for LDO and Oscillator to power down */ |
||||||
|
do { |
||||||
|
mdelay(1); |
||||||
|
val = omap_pipe3_readl(phy->pll_ctrl_base, PLL_STATUS); |
||||||
|
if ((val & PLL_TICOPWDN) && (val & PLL_LDOPWDN)) |
||||||
|
break; |
||||||
|
} while (--timeout); |
||||||
|
|
||||||
|
if (!(val & PLL_TICOPWDN) || !(val & PLL_LDOPWDN)) { |
||||||
|
printf("%s: Failed to power down DPLL: PLL_STATUS 0x%x\n", |
||||||
|
__func__, val); |
||||||
|
return -EBUSY; |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,36 @@ |
|||||||
|
/*
|
||||||
|
* TI PIPE3 PHY |
||||||
|
* |
||||||
|
* (C) Copyright 2013 |
||||||
|
* Texas Instruments, <www.ti.com> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef __OMAP_PIPE3_PHY_H |
||||||
|
#define __OMAP_PIPE3_PHY_H |
||||||
|
|
||||||
|
struct pipe3_dpll_params { |
||||||
|
u16 m; |
||||||
|
u8 n; |
||||||
|
u8 freq:3; |
||||||
|
u8 sd; |
||||||
|
u32 mf; |
||||||
|
}; |
||||||
|
|
||||||
|
struct pipe3_dpll_map { |
||||||
|
unsigned long rate; |
||||||
|
struct pipe3_dpll_params params; |
||||||
|
}; |
||||||
|
|
||||||
|
struct omap_pipe3 { |
||||||
|
void __iomem *pll_ctrl_base; |
||||||
|
void __iomem *power_reg; |
||||||
|
struct pipe3_dpll_map *dpll_map; |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
int phy_pipe3_power_on(struct omap_pipe3 *phy); |
||||||
|
int phy_pipe3_power_off(struct omap_pipe3 *pipe3); |
||||||
|
|
||||||
|
#endif /* __OMAP_PIPE3_PHY_H */ |
@ -0,0 +1,75 @@ |
|||||||
|
/*
|
||||||
|
* TI SATA platform driver |
||||||
|
* |
||||||
|
* (C) Copyright 2013 |
||||||
|
* Texas Instruments, <www.ti.com> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <ahci.h> |
||||||
|
#include <scsi.h> |
||||||
|
#include <asm/arch/clock.h> |
||||||
|
#include <asm/arch/sata.h> |
||||||
|
#include <asm/io.h> |
||||||
|
#include "pipe3-phy.h" |
||||||
|
|
||||||
|
static struct pipe3_dpll_map dpll_map_sata[] = { |
||||||
|
{12000000, {1000, 7, 4, 6, 0} }, /* 12 MHz */ |
||||||
|
{16800000, {714, 7, 4, 6, 0} }, /* 16.8 MHz */ |
||||||
|
{19200000, {625, 7, 4, 6, 0} }, /* 19.2 MHz */ |
||||||
|
{20000000, {600, 7, 4, 6, 0} }, /* 20 MHz */ |
||||||
|
{26000000, {461, 7, 4, 6, 0} }, /* 26 MHz */ |
||||||
|
{38400000, {312, 7, 4, 6, 0} }, /* 38.4 MHz */ |
||||||
|
{ }, /* Terminator */ |
||||||
|
}; |
||||||
|
|
||||||
|
struct omap_pipe3 sata_phy = { |
||||||
|
.pll_ctrl_base = (void __iomem *)TI_SATA_PLLCTRL_BASE, |
||||||
|
/* .power_reg is updated at runtime */ |
||||||
|
.dpll_map = dpll_map_sata, |
||||||
|
}; |
||||||
|
|
||||||
|
int omap_sata_init(void) |
||||||
|
{ |
||||||
|
int ret; |
||||||
|
u32 val; |
||||||
|
|
||||||
|
u32 const clk_domains_sata[] = { |
||||||
|
0 |
||||||
|
}; |
||||||
|
|
||||||
|
u32 const clk_modules_hw_auto_sata[] = { |
||||||
|
(*prcm)->cm_l3init_ocp2scp3_clkctrl, |
||||||
|
0 |
||||||
|
}; |
||||||
|
|
||||||
|
u32 const clk_modules_explicit_en_sata[] = { |
||||||
|
(*prcm)->cm_l3init_sata_clkctrl, |
||||||
|
0 |
||||||
|
}; |
||||||
|
|
||||||
|
do_enable_clocks(clk_domains_sata, |
||||||
|
clk_modules_hw_auto_sata, |
||||||
|
clk_modules_explicit_en_sata, |
||||||
|
0); |
||||||
|
|
||||||
|
/* Enable optional functional clock for SATA */ |
||||||
|
setbits_le32((*prcm)->cm_l3init_sata_clkctrl, |
||||||
|
SATA_CLKCTRL_OPTFCLKEN_MASK); |
||||||
|
|
||||||
|
sata_phy.power_reg = (void __iomem *)(*ctrl)->control_phy_power_sata; |
||||||
|
|
||||||
|
/* Power up the PHY */ |
||||||
|
phy_pipe3_power_on(&sata_phy); |
||||||
|
|
||||||
|
/* Enable SATA module, No Idle, No Standby */ |
||||||
|
val = TI_SATA_IDLE_NO | TI_SATA_STANDBY_NO; |
||||||
|
writel(val, TI_SATA_WRAPPER_BASE + TI_SATA_SYSCONFIG); |
||||||
|
|
||||||
|
ret = ahci_init(DWC_AHSATA_BASE); |
||||||
|
scsi_scan(1); |
||||||
|
|
||||||
|
return ret; |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
/*
|
||||||
|
* SATA Wrapper Register map |
||||||
|
* |
||||||
|
* (C) Copyright 2013 |
||||||
|
* Texas Instruments, <www.ti.com> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef _TI_SATA_H |
||||||
|
#define _TI_SATA_H |
||||||
|
|
||||||
|
/* SATA Wrapper module */ |
||||||
|
#define TI_SATA_WRAPPER_BASE (OMAP54XX_L4_CORE_BASE + 0x141100) |
||||||
|
/* SATA PHY Module */ |
||||||
|
#define TI_SATA_PLLCTRL_BASE (OMAP54XX_L4_CORE_BASE + 0x96800) |
||||||
|
|
||||||
|
/* SATA Wrapper register offsets */ |
||||||
|
#define TI_SATA_SYSCONFIG 0x00 |
||||||
|
#define TI_SATA_CDRLOCK 0x04 |
||||||
|
|
||||||
|
/* Register Set */ |
||||||
|
#define TI_SATA_SYSCONFIG_OVERRIDE0 (1 << 16) |
||||||
|
#define TI_SATA_SYSCONFIG_STANDBY_MASK (0x3 << 4) |
||||||
|
#define TI_SATA_SYSCONFIG_IDLE_MASK (0x3 << 2) |
||||||
|
|
||||||
|
/* Standby modes */ |
||||||
|
#define TI_SATA_STANDBY_FORCE 0x0 |
||||||
|
#define TI_SATA_STANDBY_NO (0x1 << 4) |
||||||
|
#define TI_SATA_STANDBY_SMART_WAKE (0x3 << 4) |
||||||
|
#define TI_SATA_STANDBY_SMART (0x2 << 4) |
||||||
|
|
||||||
|
/* Idle modes */ |
||||||
|
#define TI_SATA_IDLE_FORCE 0x0 |
||||||
|
#define TI_SATA_IDLE_NO (0x1 << 2) |
||||||
|
#define TI_SATA_IDLE_SMART_WAKE (0x3 << 2) |
||||||
|
#define TI_SATA_IDLE_SMART (0x2 << 2) |
||||||
|
|
||||||
|
#ifdef CONFIG_SCSI_AHCI_PLAT |
||||||
|
int omap_sata_init(void); |
||||||
|
#else |
||||||
|
static inline int omap_sata_init(void) |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
#endif /* CONFIG_SCSI_AHCI_PLAT */ |
||||||
|
|
||||||
|
#endif /* _TI_SATA_H */ |
@ -0,0 +1,10 @@ |
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 Compulab Ltd - http://compulab.co.il/
|
||||||
|
#
|
||||||
|
# Author: Ilya Ledvich <ilya@compulab.co.il>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-y += $(BOARD).o
|
||||||
|
obj-$(CONFIG_SPL_BUILD) += mux.o spl.o
|
@ -0,0 +1,162 @@ |
|||||||
|
/*
|
||||||
|
* Board functions for Compulab CM-T335 board |
||||||
|
* |
||||||
|
* Copyright (C) 2013, Compulab Ltd - http://compulab.co.il/
|
||||||
|
* |
||||||
|
* Author: Ilya Ledvich <ilya@compulab.co.il> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <errno.h> |
||||||
|
#include <miiphy.h> |
||||||
|
#include <cpsw.h> |
||||||
|
|
||||||
|
#include <asm/arch/sys_proto.h> |
||||||
|
#include <asm/arch/hardware_am33xx.h> |
||||||
|
#include <asm/io.h> |
||||||
|
#include <asm/gpio.h> |
||||||
|
|
||||||
|
#include "../common/eeprom.h" |
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR; |
||||||
|
|
||||||
|
/*
|
||||||
|
* Basic board specific setup. Pinmux has been handled already. |
||||||
|
*/ |
||||||
|
int board_init(void) |
||||||
|
{ |
||||||
|
gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; |
||||||
|
|
||||||
|
gpmc_init(); |
||||||
|
|
||||||
|
#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT) |
||||||
|
status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF); |
||||||
|
#endif |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
#if defined (CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD) |
||||||
|
static void cpsw_control(int enabled) |
||||||
|
{ |
||||||
|
/* VTP can be added here */ |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
static struct cpsw_slave_data cpsw_slave = { |
||||||
|
.slave_reg_ofs = 0x208, |
||||||
|
.sliver_reg_ofs = 0xd80, |
||||||
|
.phy_id = 0, |
||||||
|
.phy_if = PHY_INTERFACE_MODE_RGMII, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct cpsw_platform_data cpsw_data = { |
||||||
|
.mdio_base = CPSW_MDIO_BASE, |
||||||
|
.cpsw_base = CPSW_BASE, |
||||||
|
.mdio_div = 0xff, |
||||||
|
.channels = 8, |
||||||
|
.cpdma_reg_ofs = 0x800, |
||||||
|
.slaves = 1, |
||||||
|
.slave_data = &cpsw_slave, |
||||||
|
.ale_reg_ofs = 0xd00, |
||||||
|
.ale_entries = 1024, |
||||||
|
.host_port_reg_ofs = 0x108, |
||||||
|
.hw_stats_reg_ofs = 0x900, |
||||||
|
.bd_ram_ofs = 0x2000, |
||||||
|
.mac_control = (1 << 5), |
||||||
|
.control = cpsw_control, |
||||||
|
.host_port_num = 0, |
||||||
|
.version = CPSW_CTRL_VERSION_2, |
||||||
|
}; |
||||||
|
|
||||||
|
/* PHY reset GPIO */ |
||||||
|
#define GPIO_PHY_RST GPIO_PIN(3, 7) |
||||||
|
|
||||||
|
static void board_phy_init(void) |
||||||
|
{ |
||||||
|
gpio_request(GPIO_PHY_RST, "phy_rst"); |
||||||
|
gpio_direction_output(GPIO_PHY_RST, 0); |
||||||
|
mdelay(2); |
||||||
|
gpio_set_value(GPIO_PHY_RST, 1); |
||||||
|
mdelay(2); |
||||||
|
} |
||||||
|
|
||||||
|
static void get_efuse_mac_addr(uchar *enetaddr) |
||||||
|
{ |
||||||
|
uint32_t mac_hi, mac_lo; |
||||||
|
struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; |
||||||
|
|
||||||
|
mac_lo = readl(&cdev->macid0l); |
||||||
|
mac_hi = readl(&cdev->macid0h); |
||||||
|
enetaddr[0] = mac_hi & 0xFF; |
||||||
|
enetaddr[1] = (mac_hi & 0xFF00) >> 8; |
||||||
|
enetaddr[2] = (mac_hi & 0xFF0000) >> 16; |
||||||
|
enetaddr[3] = (mac_hi & 0xFF000000) >> 24; |
||||||
|
enetaddr[4] = mac_lo & 0xFF; |
||||||
|
enetaddr[5] = (mac_lo & 0xFF00) >> 8; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* Routine: handle_mac_address |
||||||
|
* Description: prepare MAC address for on-board Ethernet. |
||||||
|
*/ |
||||||
|
static int handle_mac_address(void) |
||||||
|
{ |
||||||
|
uchar enetaddr[6]; |
||||||
|
int rv; |
||||||
|
|
||||||
|
rv = eth_getenv_enetaddr("ethaddr", enetaddr); |
||||||
|
if (rv) |
||||||
|
return 0; |
||||||
|
|
||||||
|
rv = cl_eeprom_read_mac_addr(enetaddr); |
||||||
|
if (rv) |
||||||
|
get_efuse_mac_addr(enetaddr); |
||||||
|
|
||||||
|
if (!is_valid_ether_addr(enetaddr)) |
||||||
|
return -1; |
||||||
|
|
||||||
|
return eth_setenv_enetaddr("ethaddr", enetaddr); |
||||||
|
} |
||||||
|
|
||||||
|
#define AR8051_PHY_DEBUG_ADDR_REG 0x1d |
||||||
|
#define AR8051_PHY_DEBUG_DATA_REG 0x1e |
||||||
|
#define AR8051_DEBUG_RGMII_CLK_DLY_REG 0x5 |
||||||
|
#define AR8051_RGMII_TX_CLK_DLY 0x100 |
||||||
|
|
||||||
|
int board_eth_init(bd_t *bis) |
||||||
|
{ |
||||||
|
int rv, n = 0; |
||||||
|
const char *devname; |
||||||
|
struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; |
||||||
|
|
||||||
|
rv = handle_mac_address(); |
||||||
|
if (rv) |
||||||
|
printf("No MAC address found!\n"); |
||||||
|
|
||||||
|
writel(RGMII_MODE_ENABLE | RGMII_INT_DELAY, &cdev->miisel); |
||||||
|
|
||||||
|
board_phy_init(); |
||||||
|
|
||||||
|
rv = cpsw_register(&cpsw_data); |
||||||
|
if (rv < 0) |
||||||
|
printf("Error %d registering CPSW switch\n", rv); |
||||||
|
else |
||||||
|
n += rv; |
||||||
|
|
||||||
|
/*
|
||||||
|
* CPSW RGMII Internal Delay Mode is not supported in all PVT |
||||||
|
* operating points. So we must set the TX clock delay feature |
||||||
|
* in the AR8051 PHY. Since we only support a single ethernet |
||||||
|
* device, we only do this for the first instance. |
||||||
|
*/ |
||||||
|
devname = miiphy_get_current_dev(); |
||||||
|
|
||||||
|
miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_ADDR_REG, |
||||||
|
AR8051_DEBUG_RGMII_CLK_DLY_REG); |
||||||
|
miiphy_write(devname, 0x0, AR8051_PHY_DEBUG_DATA_REG, |
||||||
|
AR8051_RGMII_TX_CLK_DLY); |
||||||
|
return n; |
||||||
|
} |
||||||
|
#endif /* CONFIG_DRIVER_TI_CPSW && !CONFIG_SPL_BUILD */ |
@ -0,0 +1,117 @@ |
|||||||
|
/*
|
||||||
|
* Pinmux configuration for Compulab CM-T335 board |
||||||
|
* |
||||||
|
* Copyright (C) 2013, Compulab Ltd - http://compulab.co.il/
|
||||||
|
* |
||||||
|
* Author: Ilya Ledvich <ilya@compulab.co.il> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <asm/arch/sys_proto.h> |
||||||
|
#include <asm/arch/hardware.h> |
||||||
|
#include <asm/arch/mux.h> |
||||||
|
#include <asm/io.h> |
||||||
|
|
||||||
|
static struct module_pin_mux uart0_pin_mux[] = { |
||||||
|
{OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, |
||||||
|
{OFFSET(uart0_txd), (MODE(0) | PULLUDEN)}, |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux uart1_pin_mux[] = { |
||||||
|
{OFFSET(uart1_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, |
||||||
|
{OFFSET(uart1_txd), (MODE(0) | PULLUDEN)}, |
||||||
|
{OFFSET(uart1_ctsn), (MODE(0) | PULLUP_EN | RXACTIVE)}, |
||||||
|
{OFFSET(uart1_rtsn), (MODE(0) | PULLUDEN)}, |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux mmc0_pin_mux[] = { |
||||||
|
{OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, |
||||||
|
{OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, |
||||||
|
{OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, |
||||||
|
{OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, |
||||||
|
{OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, |
||||||
|
{OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux i2c0_pin_mux[] = { |
||||||
|
{OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | PULLUDDIS | SLEWCTRL)}, |
||||||
|
{OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | PULLUDDIS | SLEWCTRL)}, |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux i2c1_pin_mux[] = { |
||||||
|
/* I2C_DATA */ |
||||||
|
{OFFSET(uart0_ctsn), (MODE(3) | RXACTIVE | PULLUDDIS | SLEWCTRL)}, |
||||||
|
/* I2C_SCLK */ |
||||||
|
{OFFSET(uart0_rtsn), (MODE(3) | RXACTIVE | PULLUDDIS | SLEWCTRL)}, |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux rgmii1_pin_mux[] = { |
||||||
|
{OFFSET(mii1_txen), MODE(2)}, /* RGMII1_TCTL */ |
||||||
|
{OFFSET(mii1_rxdv), MODE(2) | RXACTIVE}, /* RGMII1_RCTL */ |
||||||
|
{OFFSET(mii1_txd3), MODE(2)}, /* RGMII1_TD3 */ |
||||||
|
{OFFSET(mii1_txd2), MODE(2)}, /* RGMII1_TD2 */ |
||||||
|
{OFFSET(mii1_txd1), MODE(2)}, /* RGMII1_TD1 */ |
||||||
|
{OFFSET(mii1_txd0), MODE(2)}, /* RGMII1_TD0 */ |
||||||
|
{OFFSET(mii1_txclk), MODE(2)}, /* RGMII1_TCLK */ |
||||||
|
{OFFSET(mii1_rxclk), MODE(2) | RXACTIVE}, /* RGMII1_RCLK */ |
||||||
|
{OFFSET(mii1_rxd3), MODE(2) | RXACTIVE}, /* RGMII1_RD3 */ |
||||||
|
{OFFSET(mii1_rxd2), MODE(2) | RXACTIVE}, /* RGMII1_RD2 */ |
||||||
|
{OFFSET(mii1_rxd1), MODE(2) | RXACTIVE}, /* RGMII1_RD1 */ |
||||||
|
{OFFSET(mii1_rxd0), MODE(2) | RXACTIVE}, /* RGMII1_RD0 */ |
||||||
|
{OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN},/* MDIO_DATA */ |
||||||
|
{OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */ |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux nand_pin_mux[] = { |
||||||
|
{OFFSET(gpmc_ad0), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD0 */ |
||||||
|
{OFFSET(gpmc_ad1), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD1 */ |
||||||
|
{OFFSET(gpmc_ad2), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD2 */ |
||||||
|
{OFFSET(gpmc_ad3), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD3 */ |
||||||
|
{OFFSET(gpmc_ad4), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD4 */ |
||||||
|
{OFFSET(gpmc_ad5), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD5 */ |
||||||
|
{OFFSET(gpmc_ad6), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD6 */ |
||||||
|
{OFFSET(gpmc_ad7), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD7 */ |
||||||
|
{OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NAND WAIT */ |
||||||
|
{OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN | RXACTIVE)}, /* NAND_WPN */ |
||||||
|
{OFFSET(gpmc_csn0), (MODE(0) | PULLUDEN)}, /* NAND_CS0 */ |
||||||
|
{OFFSET(gpmc_advn_ale), (MODE(0) | PULLUDEN)}, /* NAND_ADV_ALE */ |
||||||
|
{OFFSET(gpmc_oen_ren), (MODE(0) | PULLUDEN)}, /* NAND_OE */ |
||||||
|
{OFFSET(gpmc_wen), (MODE(0) | PULLUDEN)}, /* NAND_WEN */ |
||||||
|
{OFFSET(gpmc_be0n_cle), (MODE(0) | PULLUDEN)}, /* NAND_BE_CLE */ |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux eth_phy_rst_pin_mux[] = { |
||||||
|
{OFFSET(emu0), (MODE(7) | PULLUDDIS)}, /* GPIO3_7 */ |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct module_pin_mux status_led_pin_mux[] = { |
||||||
|
{OFFSET(gpmc_csn3), (MODE(7) | PULLUDEN)}, /* GPIO2_0 */ |
||||||
|
{-1}, |
||||||
|
}; |
||||||
|
|
||||||
|
void set_uart_mux_conf(void) |
||||||
|
{ |
||||||
|
configure_module_pin_mux(uart0_pin_mux); |
||||||
|
configure_module_pin_mux(uart1_pin_mux); |
||||||
|
} |
||||||
|
|
||||||
|
void set_mux_conf_regs(void) |
||||||
|
{ |
||||||
|
configure_module_pin_mux(i2c0_pin_mux); |
||||||
|
configure_module_pin_mux(i2c1_pin_mux); |
||||||
|
configure_module_pin_mux(rgmii1_pin_mux); |
||||||
|
configure_module_pin_mux(eth_phy_rst_pin_mux); |
||||||
|
configure_module_pin_mux(mmc0_pin_mux); |
||||||
|
configure_module_pin_mux(nand_pin_mux); |
||||||
|
configure_module_pin_mux(status_led_pin_mux); |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
/*
|
||||||
|
* SPL specific code for Compulab CM-T335 board |
||||||
|
* |
||||||
|
* Board functions for Compulab CM-T335 board |
||||||
|
* |
||||||
|
* Copyright (C) 2013, Compulab Ltd - http://compulab.co.il/
|
||||||
|
* |
||||||
|
* Author: Ilya Ledvich <ilya@compulab.co.il> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <common.h> |
||||||
|
#include <errno.h> |
||||||
|
|
||||||
|
#include <asm/arch/ddr_defs.h> |
||||||
|
#include <asm/arch/clock.h> |
||||||
|
#include <asm/arch/clocks_am33xx.h> |
||||||
|
#include <asm/arch/sys_proto.h> |
||||||
|
#include <asm/arch/hardware_am33xx.h> |
||||||
|
#include <asm/sizes.h> |
||||||
|
|
||||||
|
static const struct ddr_data ddr3_data = { |
||||||
|
.datardsratio0 = MT41J128MJT125_RD_DQS, |
||||||
|
.datawdsratio0 = MT41J128MJT125_WR_DQS, |
||||||
|
.datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE, |
||||||
|
.datawrsratio0 = MT41J128MJT125_PHY_WR_DATA, |
||||||
|
}; |
||||||
|
|
||||||
|
static const struct cmd_control ddr3_cmd_ctrl_data = { |
||||||
|
.cmd0csratio = MT41J128MJT125_RATIO, |
||||||
|
.cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT, |
||||||
|
|
||||||
|
.cmd1csratio = MT41J128MJT125_RATIO, |
||||||
|
.cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT, |
||||||
|
|
||||||
|
.cmd2csratio = MT41J128MJT125_RATIO, |
||||||
|
.cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT, |
||||||
|
}; |
||||||
|
|
||||||
|
static struct emif_regs ddr3_emif_reg_data = { |
||||||
|
.sdram_config = MT41J128MJT125_EMIF_SDCFG, |
||||||
|
.ref_ctrl = MT41J128MJT125_EMIF_SDREF, |
||||||
|
.sdram_tim1 = MT41J128MJT125_EMIF_TIM1, |
||||||
|
.sdram_tim2 = MT41J128MJT125_EMIF_TIM2, |
||||||
|
.sdram_tim3 = MT41J128MJT125_EMIF_TIM3, |
||||||
|
.zq_config = MT41J128MJT125_ZQ_CFG, |
||||||
|
.emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY | |
||||||
|
PHY_EN_DYN_PWRDN, |
||||||
|
}; |
||||||
|
|
||||||
|
const struct dpll_params dpll_ddr = { |
||||||
|
/* M N M2 M3 M4 M5 M6 */ |
||||||
|
303, (V_OSCK/1000000) - 1, 1, -1, -1, -1, -1}; |
||||||
|
|
||||||
|
void am33xx_spl_board_init(void) |
||||||
|
{ |
||||||
|
struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; |
||||||
|
|
||||||
|
/* Get the frequency */ |
||||||
|
dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); |
||||||
|
|
||||||
|
/* Set CORE Frequencies to OPP100 */ |
||||||
|
do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); |
||||||
|
|
||||||
|
/* Set MPU Frequency to what we detected now that voltages are set */ |
||||||
|
do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100); |
||||||
|
} |
||||||
|
|
||||||
|
const struct dpll_params *get_dpll_ddr_params(void) |
||||||
|
{ |
||||||
|
return &dpll_ddr; |
||||||
|
} |
||||||
|
|
||||||
|
static void probe_sdram_size(long size) |
||||||
|
{ |
||||||
|
switch (size) { |
||||||
|
case SZ_512M: |
||||||
|
ddr3_emif_reg_data.sdram_config = MT41J256MJT125_EMIF_SDCFG; |
||||||
|
break; |
||||||
|
case SZ_256M: |
||||||
|
ddr3_emif_reg_data.sdram_config = MT41J128MJT125_EMIF_SDCFG; |
||||||
|
break; |
||||||
|
case SZ_128M: |
||||||
|
ddr3_emif_reg_data.sdram_config = MT41J64MJT125_EMIF_SDCFG; |
||||||
|
break; |
||||||
|
default: |
||||||
|
puts("Failed configuring DRAM, resetting...\n\n"); |
||||||
|
reset_cpu(0); |
||||||
|
} |
||||||
|
debug("%s: setting DRAM size to %ldM\n", __func__, size >> 20); |
||||||
|
config_ddr(303, MT41J128MJT125_IOCTRL_VALUE, &ddr3_data, |
||||||
|
&ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0); |
||||||
|
} |
||||||
|
|
||||||
|
void sdram_init(void) |
||||||
|
{ |
||||||
|
long size = SZ_1G; |
||||||
|
|
||||||
|
do { |
||||||
|
size = size / 2; |
||||||
|
probe_sdram_size(size); |
||||||
|
} while (get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, size) < size); |
||||||
|
|
||||||
|
return; |
||||||
|
} |
@ -0,0 +1,101 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2004-2008 Texas Instruments |
||||||
|
* |
||||||
|
* (C) Copyright 2002 |
||||||
|
* Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") |
||||||
|
OUTPUT_ARCH(arm) |
||||||
|
ENTRY(_start) |
||||||
|
SECTIONS |
||||||
|
{ |
||||||
|
. = 0x00000000; |
||||||
|
|
||||||
|
. = ALIGN(4); |
||||||
|
.text : |
||||||
|
{ |
||||||
|
*(.__image_copy_start) |
||||||
|
CPUDIR/start.o (.text*) |
||||||
|
board/compulab/cm_t335/libcm_t335.o (.text*) |
||||||
|
*(.text*) |
||||||
|
} |
||||||
|
|
||||||
|
. = ALIGN(4); |
||||||
|
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } |
||||||
|
|
||||||
|
. = ALIGN(4); |
||||||
|
.data : { |
||||||
|
*(.data*) |
||||||
|
} |
||||||
|
|
||||||
|
. = ALIGN(4); |
||||||
|
|
||||||
|
. = .; |
||||||
|
|
||||||
|
. = ALIGN(4); |
||||||
|
.u_boot_list : { |
||||||
|
KEEP(*(SORT(.u_boot_list*))); |
||||||
|
} |
||||||
|
|
||||||
|
. = ALIGN(4); |
||||||
|
|
||||||
|
.image_copy_end : |
||||||
|
{ |
||||||
|
*(.__image_copy_end) |
||||||
|
} |
||||||
|
|
||||||
|
.rel_dyn_start : |
||||||
|
{ |
||||||
|
*(.__rel_dyn_start) |
||||||
|
} |
||||||
|
|
||||||
|
.rel.dyn : { |
||||||
|
*(.rel*) |
||||||
|
} |
||||||
|
|
||||||
|
.rel_dyn_end : |
||||||
|
{ |
||||||
|
*(.__rel_dyn_end) |
||||||
|
} |
||||||
|
|
||||||
|
_end = .; |
||||||
|
|
||||||
|
/* |
||||||
|
* Deprecated: this MMU section is used by pxa at present but |
||||||
|
* should not be used by new boards/CPUs. |
||||||
|
*/ |
||||||
|
. = ALIGN(4096); |
||||||
|
.mmutable : { |
||||||
|
*(.mmutable) |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c |
||||||
|
* __bss_base and __bss_limit are for linker only (overlay ordering) |
||||||
|
*/ |
||||||
|
|
||||||
|
.bss_start __rel_dyn_start (OVERLAY) : { |
||||||
|
KEEP(*(.__bss_start)); |
||||||
|
__bss_base = .; |
||||||
|
} |
||||||
|
|
||||||
|
.bss __bss_base (OVERLAY) : { |
||||||
|
*(.bss*) |
||||||
|
. = ALIGN(4); |
||||||
|
__bss_limit = .; |
||||||
|
} |
||||||
|
|
||||||
|
.bss_end __bss_limit (OVERLAY) : { |
||||||
|
KEEP(*(.__bss_end)); |
||||||
|
} |
||||||
|
|
||||||
|
/DISCARD/ : { *(.dynsym) } |
||||||
|
/DISCARD/ : { *(.dynstr*) } |
||||||
|
/DISCARD/ : { *(.dynamic*) } |
||||||
|
/DISCARD/ : { *(.plt*) } |
||||||
|
/DISCARD/ : { *(.interp*) } |
||||||
|
/DISCARD/ : { *(.gnu*) } |
||||||
|
} |
@ -0,0 +1,182 @@ |
|||||||
|
/*
|
||||||
|
* Config file for Compulab CM-T335 board |
||||||
|
* |
||||||
|
* Copyright (C) 2013, Compulab Ltd - http://compulab.co.il/
|
||||||
|
* |
||||||
|
* Author: Ilya Ledvich <ilya@compulab.co.il> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-2.0+ |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef __CONFIG_CM_T335_H |
||||||
|
#define __CONFIG_CM_T335_H |
||||||
|
|
||||||
|
#define CONFIG_CM_T335 |
||||||
|
#define CONFIG_NAND |
||||||
|
|
||||||
|
#include <configs/ti_am335x_common.h> |
||||||
|
|
||||||
|
#undef CONFIG_BOARD_LATE_INIT |
||||||
|
#undef CONFIG_SPI |
||||||
|
#undef CONFIG_OMAP3_SPI |
||||||
|
#undef CONFIG_CMD_SPI |
||||||
|
#undef CONFIG_SPL_OS_BOOT |
||||||
|
#undef CONFIG_BOOTCOUNT_LIMIT |
||||||
|
#undef CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC |
||||||
|
|
||||||
|
#undef CONFIG_MAX_RAM_BANK_SIZE |
||||||
|
#define CONFIG_MAX_RAM_BANK_SIZE (512 << 20) /* 512MB */ |
||||||
|
|
||||||
|
#undef CONFIG_SYS_PROMPT |
||||||
|
#define CONFIG_SYS_PROMPT "CM-T335 # " |
||||||
|
|
||||||
|
#define CONFIG_OMAP_COMMON |
||||||
|
|
||||||
|
#define MACH_TYPE_CM_T335 4586 /* Until the next sync */ |
||||||
|
#define CONFIG_MACH_TYPE MACH_TYPE_CM_T335 |
||||||
|
|
||||||
|
/* Clock Defines */ |
||||||
|
#define V_OSCK 25000000 /* Clock output from T2 */ |
||||||
|
#define V_SCLK (V_OSCK) |
||||||
|
|
||||||
|
#define CONFIG_ENV_SIZE (16 << 10) /* 16 KiB */ |
||||||
|
|
||||||
|
#ifndef CONFIG_SPL_BUILD |
||||||
|
#define MMCARGS \ |
||||||
|
"mmcdev=0\0" \
|
||||||
|
"mmcroot=/dev/mmcblk0p2 rw rootwait\0" \
|
||||||
|
"mmcrootfstype=ext4\0" \
|
||||||
|
"mmcargs=setenv bootargs console=${console} " \
|
||||||
|
"root=${mmcroot} " \
|
||||||
|
"rootfstype=${mmcrootfstype}\0" \
|
||||||
|
"mmcboot=echo Booting from mmc ...; " \
|
||||||
|
"run mmcargs; " \
|
||||||
|
"bootm ${loadaddr}\0" |
||||||
|
|
||||||
|
#define NANDARGS \ |
||||||
|
"mtdids=" MTDIDS_DEFAULT "\0" \
|
||||||
|
"mtdparts=" MTDPARTS_DEFAULT "\0" \
|
||||||
|
"nandroot=ubi0:rootfs rw\0" \
|
||||||
|
"nandrootfstype=ubifs\0" \
|
||||||
|
"nandargs=setenv bootargs console=${console} " \
|
||||||
|
"root=${nandroot} " \
|
||||||
|
"rootfstype=${nandrootfstype} " \
|
||||||
|
"ubi.mtd=${rootfs_name}\0" \
|
||||||
|
"nandboot=echo Booting from nand ...; " \
|
||||||
|
"run nandargs; " \
|
||||||
|
"nboot ${loadaddr} nand0 900000; " \
|
||||||
|
"bootm ${loadaddr}\0" |
||||||
|
|
||||||
|
|
||||||
|
#define CONFIG_EXTRA_ENV_SETTINGS \ |
||||||
|
"loadaddr=82000000\0" \
|
||||||
|
"console=ttyO0,115200n8\0" \
|
||||||
|
"rootfs_name=rootfs\0" \
|
||||||
|
"loadbootscript=fatload mmc ${mmcdev} ${loadaddr} boot.scr\0" \
|
||||||
|
"bootscript=echo Running bootscript from mmc ...; " \
|
||||||
|
"source ${loadaddr}\0" \
|
||||||
|
"loaduimage=fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
|
||||||
|
MMCARGS \
|
||||||
|
NANDARGS |
||||||
|
|
||||||
|
#define CONFIG_BOOTCOMMAND \ |
||||||
|
"mmc dev ${mmcdev}; if mmc rescan; then " \
|
||||||
|
"if run loadbootscript; then " \
|
||||||
|
"run bootscript; " \
|
||||||
|
"else " \
|
||||||
|
"if run loaduimage; then " \
|
||||||
|
"run mmcboot; " \
|
||||||
|
"else run nandboot; " \
|
||||||
|
"fi; " \
|
||||||
|
"fi; " \
|
||||||
|
"else run nandboot; fi" |
||||||
|
#endif /* CONFIG_SPL_BUILD */ |
||||||
|
|
||||||
|
#define CONFIG_TIMESTAMP |
||||||
|
#define CONFIG_SYS_AUTOLOAD "no" |
||||||
|
|
||||||
|
/* Serial console configuration */ |
||||||
|
#define CONFIG_CONS_INDEX 1 |
||||||
|
#define CONFIG_SERIAL1 1 /* UART0 */ |
||||||
|
|
||||||
|
/* NS16550 Configuration */ |
||||||
|
#define CONFIG_SYS_NS16550_COM1 0x44e09000 /* UART0 */ |
||||||
|
#define CONFIG_SYS_NS16550_COM2 0x48022000 /* UART1 */ |
||||||
|
#define CONFIG_BAUDRATE 115200 |
||||||
|
|
||||||
|
/* I2C Configuration */ |
||||||
|
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 /* Main EEPROM */ |
||||||
|
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1 |
||||||
|
|
||||||
|
/* SPL */ |
||||||
|
#define CONFIG_SPL_LDSCRIPT "$(CPUDIR)/am33xx/u-boot-spl.lds" |
||||||
|
|
||||||
|
/* Network. */ |
||||||
|
#define CONFIG_PHY_GIGE |
||||||
|
#define CONFIG_PHYLIB |
||||||
|
#define CONFIG_PHY_ADDR 0 |
||||||
|
#define CONFIG_PHY_ATHEROS |
||||||
|
|
||||||
|
/* NAND support */ |
||||||
|
#define CONFIG_SYS_NAND_5_ADDR_CYCLE |
||||||
|
#define CONFIG_SYS_NAND_PAGE_COUNT (CONFIG_SYS_NAND_BLOCK_SIZE / \ |
||||||
|
CONFIG_SYS_NAND_PAGE_SIZE) |
||||||
|
#define CONFIG_SYS_NAND_PAGE_SIZE 2048 |
||||||
|
#define CONFIG_SYS_NAND_OOBSIZE 64 |
||||||
|
#define CONFIG_SYS_NAND_BLOCK_SIZE (128 * 1024) |
||||||
|
#define CONFIG_SYS_NAND_BAD_BLOCK_POS NAND_LARGE_BADBLOCK_POS |
||||||
|
#define CONFIG_SYS_NAND_ECCPOS { 2, 3, 4, 5, 6, 7, 8, 9, \ |
||||||
|
10, 11, 12, 13, 14, 15, 16, 17, \
|
||||||
|
18, 19, 20, 21, 22, 23, 24, 25, \
|
||||||
|
26, 27, 28, 29, 30, 31, 32, 33, \
|
||||||
|
34, 35, 36, 37, 38, 39, 40, 41, \
|
||||||
|
42, 43, 44, 45, 46, 47, 48, 49, \
|
||||||
|
50, 51, 52, 53, 54, 55, 56, 57, } |
||||||
|
|
||||||
|
#define CONFIG_SYS_NAND_ECCSIZE 512 |
||||||
|
#define CONFIG_SYS_NAND_ECCBYTES 14 |
||||||
|
|
||||||
|
#define CONFIG_SYS_NAND_U_BOOT_START CONFIG_SYS_TEXT_BASE |
||||||
|
|
||||||
|
#undef CONFIG_SYS_NAND_U_BOOT_OFFS |
||||||
|
#define CONFIG_SYS_NAND_U_BOOT_OFFS 0x200000 |
||||||
|
|
||||||
|
#define CONFIG_CMD_NAND |
||||||
|
#define GPMC_NAND_ECC_LP_x8_LAYOUT |
||||||
|
#define MTDIDS_DEFAULT "nand0=nand" |
||||||
|
#define MTDPARTS_DEFAULT "mtdparts=nand:2m(spl)," \ |
||||||
|
"1m(u-boot),1m(u-boot-env)," \
|
||||||
|
"1m(dtb),4m(splash)," \
|
||||||
|
"6m(kernel),-(rootfs)" |
||||||
|
#define CONFIG_ENV_IS_IN_NAND |
||||||
|
#define CONFIG_ENV_OFFSET 0x300000 /* environment starts here */ |
||||||
|
#define CONFIG_SYS_ENV_SECT_SIZE (128 << 10) /* 128 KiB */ |
||||||
|
#define CONFIG_SYS_NAND_ONFI_DETECTION |
||||||
|
|
||||||
|
/* GPIO pin + bank to pin ID mapping */ |
||||||
|
#define GPIO_PIN(_bank, _pin) ((_bank << 5) + _pin) |
||||||
|
|
||||||
|
/* Status LED */ |
||||||
|
#define CONFIG_STATUS_LED |
||||||
|
#define CONFIG_GPIO_LED |
||||||
|
#define CONFIG_BOARD_SPECIFIC_LED |
||||||
|
#define STATUS_LED_BIT GPIO_PIN(2, 0) |
||||||
|
/* Status LED polarity is inversed, so init it in the "off" state */ |
||||||
|
#define STATUS_LED_STATE STATUS_LED_OFF |
||||||
|
#define STATUS_LED_PERIOD (CONFIG_SYS_HZ / 2) |
||||||
|
#define STATUS_LED_BOOT 0 |
||||||
|
|
||||||
|
#ifndef CONFIG_SPL_BUILD |
||||||
|
/*
|
||||||
|
* Enable PCA9555 at I2C0-0x26. |
||||||
|
* First select the I2C0 bus with "i2c dev 0", then use "pca953x" command. |
||||||
|
*/ |
||||||
|
#define CONFIG_PCA953X |
||||||
|
#define CONFIG_CMD_PCA953X |
||||||
|
#define CONFIG_CMD_PCA953X_INFO |
||||||
|
#define CONFIG_SYS_I2C_PCA953X_ADDR 0x26 |
||||||
|
#define CONFIG_SYS_I2C_PCA953X_WIDTH { {0x26, 16} } |
||||||
|
#endif /* CONFIG_SPL_BUILD */ |
||||||
|
|
||||||
|
#endif /* __CONFIG_CM_T335_H */ |
||||||
|
|
Loading…
Reference in new issue