diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/u-boot/board/ti/panda | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'roms/u-boot/board/ti/panda')
| -rw-r--r-- | roms/u-boot/board/ti/panda/Makefile | 8 | ||||
| -rw-r--r-- | roms/u-boot/board/ti/panda/panda.c | 323 | ||||
| -rw-r--r-- | roms/u-boot/board/ti/panda/panda_mux_data.h | 87 | 
3 files changed, 418 insertions, 0 deletions
diff --git a/roms/u-boot/board/ti/panda/Makefile b/roms/u-boot/board/ti/panda/Makefile new file mode 100644 index 00000000..c89f80d8 --- /dev/null +++ b/roms/u-boot/board/ti/panda/Makefile @@ -0,0 +1,8 @@ +# +# (C) Copyright 2000, 2001, 2002 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +obj-y	:= panda.o diff --git a/roms/u-boot/board/ti/panda/panda.c b/roms/u-boot/board/ti/panda/panda.c new file mode 100644 index 00000000..16368cbb --- /dev/null +++ b/roms/u-boot/board/ti/panda/panda.c @@ -0,0 +1,323 @@ +/* + * (C) Copyright 2010 + * Texas Instruments Incorporated, <www.ti.com> + * Steve Sakoman  <steve@sakoman.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#include <common.h> +#include <asm/arch/sys_proto.h> +#include <asm/arch/mmc_host_def.h> +#include <asm/arch/clock.h> +#include <asm/arch/gpio.h> +#include <asm/gpio.h> + +#include "panda_mux_data.h" + +#ifdef CONFIG_USB_EHCI +#include <usb.h> +#include <asm/arch/ehci.h> +#include <asm/ehci-omap.h> +#endif + +#define PANDA_ULPI_PHY_TYPE_GPIO       182 +#define PANDA_BOARD_ID_1_GPIO          101 +#define PANDA_ES_BOARD_ID_1_GPIO        48 +#define PANDA_BOARD_ID_2_GPIO          171 +#define PANDA_ES_BOARD_ID_3_GPIO         3 +#define PANDA_ES_BOARD_ID_4_GPIO         2 + +DECLARE_GLOBAL_DATA_PTR; + +const struct omap_sysinfo sysinfo = { +	"Board: OMAP4 Panda\n" +}; + +struct omap4_scrm_regs *const scrm = (struct omap4_scrm_regs *)0x4a30a000; + +/** + * @brief board_init + * + * @return 0 + */ +int board_init(void) +{ +	gpmc_init(); + +	gd->bd->bi_arch_number = MACH_TYPE_OMAP4_PANDA; +	gd->bd->bi_boot_params = (0x80000000 + 0x100); /* boot param addr */ + +	return 0; +} + +int board_eth_init(bd_t *bis) +{ +	return 0; +} + +/* +* Routine: get_board_revision +* Description: Detect if we are running on a panda revision A1-A6, +*              or an ES panda board. This can be done by reading +*              the level of GPIOs and checking the processor revisions. +*              This should result in: +*			Panda 4430: +*              GPIO171, GPIO101, GPIO182: 0 1 1 => A1-A5 +*              GPIO171, GPIO101, GPIO182: 1 0 1 => A6 +*			Panda ES: +*              GPIO2, GPIO3, GPIO171, GPIO48, GPIO182: 0 0 0 1 1 => B1/B2 +*              GPIO2, GPIO3, GPIO171, GPIO48, GPIO182: 0 0 1 1 1 => B3 +*/ +int get_board_revision(void) +{ +	int board_id0, board_id1, board_id2; +	int board_id3, board_id4; +	int board_id; + +	int processor_rev = omap_revision(); + +	/* Setup the mux for the common board ID pins (gpio 171 and 182) */ +	writew((IEN | M3), (*ctrl)->control_padconf_core_base + UNIPRO_TX0); +	writew((IEN | M3), (*ctrl)->control_padconf_core_base + FREF_CLK2_OUT); + +	board_id0 = gpio_get_value(PANDA_ULPI_PHY_TYPE_GPIO); +	board_id2 = gpio_get_value(PANDA_BOARD_ID_2_GPIO); + +	if ((processor_rev >= OMAP4460_ES1_0 && +	     processor_rev <= OMAP4460_ES1_1)) { +		/* +		 * Setup the mux for the ES specific board ID pins (gpio 101, +		 * 2 and 3. +		 */ +		writew((IEN | M3), (*ctrl)->control_padconf_core_base + +				GPMC_A24); +		writew((IEN | M3), (*ctrl)->control_padconf_core_base + +				UNIPRO_RY0); +		writew((IEN | M3), (*ctrl)->control_padconf_core_base + +				UNIPRO_RX1); + +		board_id1 = gpio_get_value(PANDA_ES_BOARD_ID_1_GPIO); +		board_id3 = gpio_get_value(PANDA_ES_BOARD_ID_3_GPIO); +		board_id4 = gpio_get_value(PANDA_ES_BOARD_ID_4_GPIO); + +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG +		setenv("board_name", strcat(CONFIG_SYS_BOARD, "-es")); +#endif +		board_id = ((board_id4 << 4) | (board_id3 << 3) | +			(board_id2 << 2) | (board_id1 << 1) | (board_id0)); +	} else { +		/* Setup the mux for the Ax specific board ID pins (gpio 101) */ +		writew((IEN | M3), (*ctrl)->control_padconf_core_base + +				FREF_CLK2_OUT); + +		board_id1 = gpio_get_value(PANDA_BOARD_ID_1_GPIO); +		board_id = ((board_id2 << 2) | (board_id1 << 1) | (board_id0)); + +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG +		if ((board_id >= 0x3) && (processor_rev == OMAP4430_ES2_3)) +			setenv("board_name", strcat(CONFIG_SYS_BOARD, "-a4")); +#endif +	} + +	return board_id; +} + +/** + * is_panda_es_rev_b3() - Detect if we are running on rev B3 of panda board ES + * + * + * Detect if we are running on B3 version of ES panda board, + * This can be done by reading the level of GPIO 171 and checking the + * processor revisions. + * GPIO171: 1 => Panda ES Rev B3 + * + * Return : return 1 if Panda ES Rev B3 , else return 0 + */ +u8 is_panda_es_rev_b3(void) +{ +        int processor_rev = omap_revision(); +        int ret = 0; + +        if ((processor_rev >= OMAP4460_ES1_0 && +             processor_rev <= OMAP4460_ES1_1)) { + +                /* Setup the mux for the common board ID pins (gpio 171) */ +                writew((IEN | M3), +			(*ctrl)->control_padconf_core_base + UNIPRO_TX0); + +                /* if processor_rev is panda ES and GPIO171 is 1,it is rev b3 */ +                ret = gpio_get_value(PANDA_BOARD_ID_2_GPIO); +        } +        return ret; +} + +#ifdef CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS +/* + * emif_get_reg_dump() - emif_get_reg_dump strong function + * + * @emif_nr - emif base + * @regs - reg dump of timing values + * + * Strong function to override emif_get_reg_dump weak function in sdram_elpida.c + */ +void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs) +{ +	u32 omap4_rev = omap_revision(); + +	/* Same devices and geometry on both EMIFs */ +	if (omap4_rev == OMAP4430_ES1_0) +		*regs = &emif_regs_elpida_380_mhz_1cs; +	else if (omap4_rev == OMAP4430_ES2_0) +		*regs = &emif_regs_elpida_200_mhz_2cs; +	else if (omap4_rev == OMAP4430_ES2_3) +		*regs = &emif_regs_elpida_400_mhz_1cs; +	else if (omap4_rev < OMAP4470_ES1_0) { +		if(is_panda_es_rev_b3()) +			*regs = &emif_regs_elpida_400_mhz_1cs; +		else +			*regs = &emif_regs_elpida_400_mhz_2cs; +	} +	else +		*regs = &emif_regs_elpida_400_mhz_1cs; +} +#endif + +/** + * @brief misc_init_r - Configure Panda board specific configurations + * such as power configurations, ethernet initialization as phase2 of + * boot sequence + * + * @return 0 + */ +int misc_init_r(void) +{ +	int phy_type; +	u32 auxclk, altclksrc; +	u32 id[4]; + +	/* EHCI is not supported on ES1.0 */ +	if (omap_revision() == OMAP4430_ES1_0) +		return 0; + +	get_board_revision(); + +	gpio_direction_input(PANDA_ULPI_PHY_TYPE_GPIO); +	phy_type = gpio_get_value(PANDA_ULPI_PHY_TYPE_GPIO); + +	if (phy_type == 1) { +		/* ULPI PHY supplied by auxclk3 derived from sys_clk */ +		debug("ULPI PHY supplied by auxclk3\n"); + +		auxclk = readl(&scrm->auxclk3); +		/* Select sys_clk */ +		auxclk &= ~AUXCLK_SRCSELECT_MASK; +		auxclk |=  AUXCLK_SRCSELECT_SYS_CLK << AUXCLK_SRCSELECT_SHIFT; +		/* Set the divisor to 2 */ +		auxclk &= ~AUXCLK_CLKDIV_MASK; +		auxclk |= AUXCLK_CLKDIV_2 << AUXCLK_CLKDIV_SHIFT; +		/* Request auxilary clock #3 */ +		auxclk |= AUXCLK_ENABLE_MASK; + +		writel(auxclk, &scrm->auxclk3); +	} else { +		/* ULPI PHY supplied by auxclk1 derived from PER dpll */ +		debug("ULPI PHY supplied by auxclk1\n"); + +		auxclk = readl(&scrm->auxclk1); +		/* Select per DPLL */ +		auxclk &= ~AUXCLK_SRCSELECT_MASK; +		auxclk |=  AUXCLK_SRCSELECT_PER_DPLL << AUXCLK_SRCSELECT_SHIFT; +		/* Set the divisor to 16 */ +		auxclk &= ~AUXCLK_CLKDIV_MASK; +		auxclk |= AUXCLK_CLKDIV_16 << AUXCLK_CLKDIV_SHIFT; +		/* Request auxilary clock #3 */ +		auxclk |= AUXCLK_ENABLE_MASK; + +		writel(auxclk, &scrm->auxclk1); +	} + +	altclksrc = readl(&scrm->altclksrc); + +	/* Activate alternate system clock supplier */ +	altclksrc &= ~ALTCLKSRC_MODE_MASK; +	altclksrc |= ALTCLKSRC_MODE_ACTIVE; + +	/* enable clocks */ +	altclksrc |= ALTCLKSRC_ENABLE_INT_MASK | ALTCLKSRC_ENABLE_EXT_MASK; + +	writel(altclksrc, &scrm->altclksrc); + +	id[0] = readl(STD_FUSE_DIE_ID_0); +	id[1] = readl(STD_FUSE_DIE_ID_1); +	id[2] = readl(STD_FUSE_DIE_ID_2); +	id[3] = readl(STD_FUSE_DIE_ID_3); +	usb_fake_mac_from_die_id(id); + +	return 0; +} + +void set_muxconf_regs_essential(void) +{ +	do_set_mux((*ctrl)->control_padconf_core_base, +		   core_padconf_array_essential, +		   sizeof(core_padconf_array_essential) / +		   sizeof(struct pad_conf_entry)); + +	do_set_mux((*ctrl)->control_padconf_wkup_base, +		   wkup_padconf_array_essential, +		   sizeof(wkup_padconf_array_essential) / +		   sizeof(struct pad_conf_entry)); + +	if (omap_revision() >= OMAP4460_ES1_0) +		do_set_mux((*ctrl)->control_padconf_wkup_base, +			   wkup_padconf_array_essential_4460, +			   sizeof(wkup_padconf_array_essential_4460) / +			   sizeof(struct pad_conf_entry)); +} + +#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC) +int board_mmc_init(bd_t *bis) +{ +	return omap_mmc_init(0, 0, 0, -1, -1); +} +#endif + +#ifdef CONFIG_USB_EHCI + +static struct omap_usbhs_board_data usbhs_bdata = { +	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, +	.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, +	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, +}; + +int ehci_hcd_init(int index, enum usb_init_type init, +		struct ehci_hccr **hccr, struct ehci_hcor **hcor) +{ +	int ret; +	unsigned int utmi_clk; + +	/* Now we can enable our port clocks */ +	utmi_clk = readl((void *)CM_L3INIT_HSUSBHOST_CLKCTRL); +	utmi_clk |= HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK; +	setbits_le32((void *)CM_L3INIT_HSUSBHOST_CLKCTRL, utmi_clk); + +	ret = omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor); +	if (ret < 0) +		return ret; + +	return 0; +} + +int ehci_hcd_stop(int index) +{ +	return omap_ehci_hcd_stop(); +} +#endif + +/* + * get_board_rev() - get board revision + */ +u32 get_board_rev(void) +{ +	return 0x20; +} diff --git a/roms/u-boot/board/ti/panda/panda_mux_data.h b/roms/u-boot/board/ti/panda/panda_mux_data.h new file mode 100644 index 00000000..53c70809 --- /dev/null +++ b/roms/u-boot/board/ti/panda/panda_mux_data.h @@ -0,0 +1,87 @@ +/* + * (C) Copyright 2010 + * Texas Instruments Incorporated, <www.ti.com> + * + *	Balaji Krishnamoorthy	<balajitk@ti.com> + *	Aneesh V		<aneesh@ti.com> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#ifndef _PANDA_MUX_DATA_H_ +#define _PANDA_MUX_DATA_H_ + +#include <asm/arch/mux_omap4.h> + + +const struct pad_conf_entry core_padconf_array_essential[] = { + +{GPMC_AD0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat0 */ +{GPMC_AD1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat1 */ +{GPMC_AD2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat2 */ +{GPMC_AD3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat3 */ +{GPMC_AD4, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat4 */ +{GPMC_AD5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat5 */ +{GPMC_AD6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat6 */ +{GPMC_AD7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_dat7 */ +{GPMC_NOE, (PTU | IEN | OFF_EN | OFF_OUT_PTD | M1)},	 /* sdmmc2_clk */ +{GPMC_NWE, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M1)}, /* sdmmc2_cmd */ +{SDMMC1_CLK, (PTU | OFF_EN | OFF_OUT_PTD | M0)},	 /* sdmmc1_clk */ +{SDMMC1_CMD, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_cmd */ +{SDMMC1_DAT0, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat0 */ +{SDMMC1_DAT1, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat1 */ +{SDMMC1_DAT2, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat2 */ +{SDMMC1_DAT3, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat3 */ +{SDMMC1_DAT4, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat4 */ +{SDMMC1_DAT5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat5 */ +{SDMMC1_DAT6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat6 */ +{SDMMC1_DAT7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat7 */ +{I2C1_SCL, (PTU | IEN | M0)},				/* i2c1_scl */ +{I2C1_SDA, (PTU | IEN | M0)},				/* i2c1_sda */ +{I2C2_SCL, (PTU | IEN | M0)},				/* i2c2_scl */ +{I2C2_SDA, (PTU | IEN | M0)},				/* i2c2_sda */ +{I2C3_SCL, (PTU | IEN | M0)},				/* i2c3_scl */ +{I2C3_SDA, (PTU | IEN | M0)},				/* i2c3_sda */ +{I2C4_SCL, (PTU | IEN | M0)},				/* i2c4_scl */ +{I2C4_SDA, (PTU | IEN | M0)},				/* i2c4_sda */ +{UART3_CTS_RCTX, (PTU | IEN | M0)},			/* uart3_tx */ +{UART3_RTS_SD, (M0)},					/* uart3_rts_sd */ +{UART3_RX_IRRX, (IEN | M0)},				/* uart3_rx */ +{UART3_TX_IRTX, (M0)},					/* uart3_tx */ +{USBB1_ULPITLL_CLK, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M4)},/* usbb1_ulpiphy_clk */ +{USBB1_ULPITLL_STP, (OFF_EN | OFF_OUT_PTD | M4)},		/* usbb1_ulpiphy_stp */ +{USBB1_ULPITLL_DIR, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dir */ +{USBB1_ULPITLL_NXT, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_nxt */ +{USBB1_ULPITLL_DAT0, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat0 */ +{USBB1_ULPITLL_DAT1, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat1 */ +{USBB1_ULPITLL_DAT2, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat2 */ +{USBB1_ULPITLL_DAT3, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat3 */ +{USBB1_ULPITLL_DAT4, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat4 */ +{USBB1_ULPITLL_DAT5, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat5 */ +{USBB1_ULPITLL_DAT6, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat6 */ +{USBB1_ULPITLL_DAT7, (IEN | OFF_EN | OFF_PD | OFF_IN | M4)},	/* usbb1_ulpiphy_dat7 */ +{USBB1_HSIC_DATA, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},	/* usbb1_hsic_data */ +{USBB1_HSIC_STROBE, (IEN | OFF_EN | OFF_PD | OFF_IN | M0)},	/* usbb1_hsic_strobe */ +{USBC1_ICUSB_DP, (IEN | M0)},					/* usbc1_icusb_dp */ +{USBC1_ICUSB_DM, (IEN | M0)},					/* usbc1_icusb_dm */ +{UNIPRO_TY2, (PTU | IEN | M3)},					/* gpio_1 */ +{GPMC_WAIT1,  (PTD | OFF_EN | OFF_PD | OFF_OUT_PTD | M3)},	/* gpio_62 */ +{FREF_CLK2_OUT, (PTU | IEN | M3)},				/* gpio_182 */ + +}; + +const struct pad_conf_entry wkup_padconf_array_essential[] = { + +{PAD1_SR_SCL, (PTU | IEN | M0)}, /* sr_scl */ +{PAD0_SR_SDA, (PTU | IEN | M0)}, /* sr_sda */ +{PAD1_SYS_32K, (IEN | M0)},	 /* sys_32k */ +{PAD0_FREF_CLK3_OUT, (M0)}, /* fref_clk3_out */ + +}; + +const struct pad_conf_entry wkup_padconf_array_essential_4460[] = { + +{PAD1_FREF_CLK4_REQ, (M3)}, /* gpio_wk7 for TPS: Mode 3 */ + +}; + +#endif /* _PANDA_MUX_DATA_H_ */  | 
