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/phytec | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'roms/u-boot/board/phytec')
| -rw-r--r-- | roms/u-boot/board/phytec/pcm030/Makefile | 8 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm030/README | 42 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm030/mt46v32m16-75.h | 21 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm030/pcm030.c | 203 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm051/Makefile | 13 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm051/board.c | 256 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm051/board.h | 25 | ||||
| -rw-r--r-- | roms/u-boot/board/phytec/pcm051/mux.c | 127 | 
8 files changed, 695 insertions, 0 deletions
diff --git a/roms/u-boot/board/phytec/pcm030/Makefile b/roms/u-boot/board/phytec/pcm030/Makefile new file mode 100644 index 00000000..2bb49dc7 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm030/Makefile @@ -0,0 +1,8 @@ +# +# (C) Copyright 2003-2007 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +obj-y	:= pcm030.o diff --git a/roms/u-boot/board/phytec/pcm030/README b/roms/u-boot/board/phytec/pcm030/README new file mode 100644 index 00000000..05faab68 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm030/README @@ -0,0 +1,42 @@ +To build RAMBOOT, replace this section the main Makefile + +pcm030_config \ +pcm030_RAMBOOT_config \ +pcm030_LOWBOOT_config:	unconfig +	@ >include/config.h +	@[ -z "$(findstring LOWBOOT_,$@)" ] || \ +		{ echo "CONFIG_SYS_TEXT_BASE = 0xFF000000"	>board/phytec/pcm030/config.tmp ; \ +		  echo "... with LOWBOOT configuration" ; \ +		} +	@[ -z "$(findstring RAMBOOT_,$@)" ] || \ +	       { echo "CONFIG_SYS_TEXT_BASE = 0x00100000" >board/phycore_mpc5200b_tiny/\ +			config.tmp ; \ +		 echo "... with RAMBOOT configuration" ; \ +		 echo "... remember to make sure that MBAR is already \ +				switched to 0xF0000000 !!!" ; \ +	       } +	@$(MKCONFIG) -a pcm030 ppc mpc5xxx pcm030 phytec +	@ echo "remember to set pcm030_REV to 0 for rev 1245.0 rev or to 1 for rev 1245.1" + +Alternative SDRAM settings: + +#define SDRAM_MODE	0x018D0000 +#define SDRAM_EMODE	0x40090000 +#define SDRAM_CONTROL	0x715f0f00 +#define SDRAM_CONFIG1	0x73722930 +#define SDRAM_CONFIG2	0x47770000 + +/* Settings for XLB = 99 MHz */ +#define SDRAM_MODE	0x008D0000 +#define SDRAM_EMODE	0x40090000 +#define SDRAM_CONTROL	0x714b0f00 +#define SDRAM_CONFIG1	0x63611730 +#define SDRAM_CONFIG2	0x47670000 + +The board ships default with the environment in EEPROM +Moving the environment to flash can be more reliable + +#define CONFIG_ENV_IS_IN_FLASH	1 +#define CONFIG_ENV_ADDR		(CONFIG_SYS_FLASH_BASE + 0xfe0000) +#define CONFIG_ENV_SIZE		0x20000 +#define CONFIG_ENV_SECT_SIZE	0x20000 diff --git a/roms/u-boot/board/phytec/pcm030/mt46v32m16-75.h b/roms/u-boot/board/phytec/pcm030/mt46v32m16-75.h new file mode 100644 index 00000000..47fc7c04 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm030/mt46v32m16-75.h @@ -0,0 +1,21 @@ +/* + * (C) Copyright 2004 + * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com. + * + * Eric Schumann, Phytec Messtechnik + * adapted for mt46v32m16-75 DDR-RAM + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#define SDRAM_DDR	1		/* is DDR */ + +/* Settings for XLB = 132 MHz */ + +#define SDRAM_MODE	0x018D0000 +#define SDRAM_EMODE	0x40090000 +#define SDRAM_CONTROL	0x71500F00 +#define SDRAM_CONFIG1	0x73711930 +#define SDRAM_CONFIG2	0x47770000 + +#define SDRAM_TAPDELAY	0x10000000 /* reserved Bit in MPC5200 B3-Step */ diff --git a/roms/u-boot/board/phytec/pcm030/pcm030.c b/roms/u-boot/board/phytec/pcm030/pcm030.c new file mode 100644 index 00000000..ce515d83 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm030/pcm030.c @@ -0,0 +1,203 @@ +/* + * (C) Copyright 2003 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * (C) Copyright 2004 + * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com. + * + * (C) Copyright 2006 + * Eric Schumann, Phytec Messtechnik GmbH + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <mpc5xxx.h> +#include <pci.h> +#include <asm/io.h> + +#include "mt46v32m16-75.h" + +#ifndef CONFIG_SYS_RAMBOOT +static void sdram_start(int hi_addr) +{ +	volatile struct mpc5xxx_cdm *cdm = +		(struct mpc5xxx_cdm *)MPC5XXX_CDM; +	volatile struct mpc5xxx_sdram *sdram = +		(struct mpc5xxx_sdram *)MPC5XXX_SDRAM; + +	long hi_addr_bit = hi_addr ? 0x01000000 : 0; + +	/* unlock mode register */ +	out_be32 (&sdram->ctrl, +		(SDRAM_CONTROL | 0x80000000 | hi_addr_bit)); + +	/* precharge all banks */ +	out_be32 (&sdram->ctrl, +		(SDRAM_CONTROL | 0x80000002 | hi_addr_bit)); + +#ifdef SDRAM_DDR +	/* set mode register: extended mode */ +	out_be32 (&sdram->mode, (SDRAM_EMODE)); + +	/* set mode register: reset DLL */ +	out_be32 (&sdram->mode, +		(SDRAM_MODE | 0x04000000)); +#endif + +	/* precharge all banks */ +	out_be32 (&sdram->ctrl, +		(SDRAM_CONTROL | 0x80000002 | hi_addr_bit)); + +	/* auto refresh */ +	out_be32 (&sdram->ctrl, +		(SDRAM_CONTROL | 0x80000004 | hi_addr_bit)); + +	/* set mode register */ +	out_be32 (&sdram->mode, (SDRAM_MODE)); + +	/* normal operation */ +	out_be32 (&sdram->ctrl, +		(SDRAM_CONTROL | hi_addr_bit)); + +	/* set CDM clock enable register, set MPC5200B SDRAM bus */ +	/* to reduced driver strength */ +	out_be32 (&cdm->clock_enable, (0x00CFFFFF)); +} +#endif + +/* + * ATTENTION: Although partially referenced initdram does NOT make + *	real use of CONFIG_SYS_SDRAM_BASE. The code does not + *	work if CONFIG_SYS_SDRAM_BASE + *	is something else than 0x00000000. + */ + +phys_size_t initdram(int board_type) +{ +	volatile struct mpc5xxx_mmap_ctl *mm = +		(struct mpc5xxx_mmap_ctl *)CONFIG_SYS_MBAR; +	volatile struct mpc5xxx_cdm *cdm = +		(struct mpc5xxx_cdm *)MPC5XXX_CDM; +	volatile struct mpc5xxx_sdram *sdram = +		(struct mpc5xxx_sdram *)MPC5XXX_SDRAM; +	ulong dramsize = 0; +	ulong dramsize2 = 0; +#ifndef CONFIG_SYS_RAMBOOT +	ulong test1, test2; + +	/* setup SDRAM chip selects */ +							 /* 256MB at 0x0 */ +	out_be32 (&mm->sdram0, 0x0000001b); +							 /* disabled */ +	out_be32 (&mm->sdram1, 0x10000000); + +	/* setup config registers */ +	out_be32 (&sdram->config1, SDRAM_CONFIG1); +	out_be32 (&sdram->config2, SDRAM_CONFIG2); + +#if defined(SDRAM_DDR) && defined(SDRAM_TAPDELAY) +	/* set tap delay */ +	out_be32 (&cdm->porcfg, SDRAM_TAPDELAY); +#endif + +	/* find RAM size using SDRAM CS0 only */ +	sdram_start(0); +	test1 = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE, 0x10000000); +	sdram_start(1); +	test2 = get_ram_size((long *) CONFIG_SYS_SDRAM_BASE, 0x10000000); +	if (test1 > test2) { +		sdram_start(0); +		dramsize = test1; +	} else +		dramsize = test2; + +	/* memory smaller than 1MB is impossible */ +	if (dramsize < (1 << 20)) +		dramsize = 0; + +	/* set SDRAM CS0 size according to the amount of RAM found */ +	if (dramsize > 0) { +		out_be32 (&mm->sdram0, +			(0x13 + __builtin_ffs(dramsize >> 20) - 1)); +	} else { +							/* disabled */ +		out_be32 (&mm->sdram0, 0); +	} + +#else /* CONFIG_SYS_RAMBOOT */ + +	/* retrieve size of memory connected to SDRAM CS0 */ +	dramsize = in_be32(&mm->sdram0) & 0xFF; +	if (dramsize >= 0x13) +		dramsize = (1 << (dramsize - 0x13)) << 20; +	else +		dramsize = 0; + +	/* retrieve size of memory connected to SDRAM CS1 */ +	dramsize2 = in_be32(&mm->sdram1) & 0xFF; +	if (dramsize2 >= 0x13) +		dramsize2 = (1 << (dramsize2 - 0x13)) << 20; +	else +		dramsize2 = 0; + +#endif /* CONFIG_SYS_RAMBOOT */ + +	return dramsize + dramsize2; +} + +int checkboard(void) +{ +	puts("Board: phyCORE-MPC5200B-tiny\n"); +	return 0; +} + +#ifdef CONFIG_PCI +static struct pci_controller hose; + +extern void pci_mpc5xxx_init(struct pci_controller *); + +void pci_init_board(void) +{ +	pci_mpc5xxx_init(&hose); +} +#endif + +#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) +void ft_board_setup(void *blob, bd_t * bd) +{ +	ft_cpu_setup(blob, bd); +} +#endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */ + +#if defined(CONFIG_CMD_IDE) && defined(CONFIG_IDE_RESET) + +#define GPIO_PSC2_4	0x02000000UL + +void init_ide_reset(void) +{ +	volatile struct mpc5xxx_wu_gpio *wu_gpio = +		(struct mpc5xxx_wu_gpio *)MPC5XXX_WU_GPIO; +	debug("init_ide_reset\n"); + +	/* Configure PSC2_4 as GPIO output for ATA reset */ +	setbits_be32(&wu_gpio->enable, GPIO_PSC2_4); +	setbits_be32(&wu_gpio->ddr, GPIO_PSC2_4); +	/* Deassert reset */ +	setbits_be32(&wu_gpio->dvo, GPIO_PSC2_4); +} + +void ide_set_reset(int idereset) +{ +	volatile struct mpc5xxx_wu_gpio *wu_gpio = +		(struct mpc5xxx_wu_gpio *)MPC5XXX_WU_GPIO; +	debug("ide_reset(%d)\n", idereset); + +	if (idereset) { +		clrbits_be32(&wu_gpio->dvo, GPIO_PSC2_4); +		/* Make a delay. MPC5200 spec says 25 usec min */ +		udelay(500000); +	} else +		setbits_be32(&wu_gpio->dvo, GPIO_PSC2_4); +} +#endif /* defined(CONFIG_CMD_IDE) && defined(CONFIG_IDE_RESET) */ diff --git a/roms/u-boot/board/phytec/pcm051/Makefile b/roms/u-boot/board/phytec/pcm051/Makefile new file mode 100644 index 00000000..ecb1d616 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm051/Makefile @@ -0,0 +1,13 @@ +# +# Makefile +# +# Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +ifdef CONFIG_SPL_BUILD +obj-y	+= mux.o +endif + +obj-y	+= board.o diff --git a/roms/u-boot/board/phytec/pcm051/board.c b/roms/u-boot/board/phytec/pcm051/board.c new file mode 100644 index 00000000..1071662e --- /dev/null +++ b/roms/u-boot/board/phytec/pcm051/board.c @@ -0,0 +1,256 @@ +/* + * board.c + * + * Board functions for Phytec phyCORE-AM335x (pcm051) based boards + * + * Copyright (C) 2013 Lemonage Software GmbH + * Author Lars Poeschel <poeschel@lemonage.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <errno.h> +#include <spl.h> +#include <asm/arch/cpu.h> +#include <asm/arch/hardware.h> +#include <asm/arch/omap.h> +#include <asm/arch/ddr_defs.h> +#include <asm/arch/clock.h> +#include <asm/arch/gpio.h> +#include <asm/arch/mmc_host_def.h> +#include <asm/arch/sys_proto.h> +#include <asm/io.h> +#include <asm/emif.h> +#include <asm/gpio.h> +#include <i2c.h> +#include <miiphy.h> +#include <cpsw.h> +#include "board.h" + +DECLARE_GLOBAL_DATA_PTR; + +/* MII mode defines */ +#define RMII_RGMII2_MODE_ENABLE	0x49 + +static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; + +#ifdef CONFIG_SPL_BUILD + +/* DDR RAM defines */ +#define DDR_CLK_MHZ		303 /* DDR_DPLL_MULT value */ + +#define OSC	(V_OSCK/1000000) +const struct dpll_params dpll_ddr = { +		DDR_CLK_MHZ, OSC-1, 1, -1, -1, -1, -1}; + +const struct dpll_params *get_dpll_ddr_params(void) +{ +	return &dpll_ddr; +} + +#ifdef CONFIG_REV1 +const struct ctrl_ioregs ioregs = { +	.cm0ioctl		= MT41J256M8HX15E_IOCTRL_VALUE, +	.cm1ioctl		= MT41J256M8HX15E_IOCTRL_VALUE, +	.cm2ioctl		= MT41J256M8HX15E_IOCTRL_VALUE, +	.dt0ioctl		= MT41J256M8HX15E_IOCTRL_VALUE, +	.dt1ioctl		= MT41J256M8HX15E_IOCTRL_VALUE, +}; + +static const struct ddr_data ddr3_data = { +	.datardsratio0 = MT41J256M8HX15E_RD_DQS, +	.datawdsratio0 = MT41J256M8HX15E_WR_DQS, +	.datafwsratio0 = MT41J256M8HX15E_PHY_FIFO_WE, +	.datawrsratio0 = MT41J256M8HX15E_PHY_WR_DATA, +}; + +static const struct cmd_control ddr3_cmd_ctrl_data = { +	.cmd0csratio = MT41J256M8HX15E_RATIO, +	.cmd0iclkout = MT41J256M8HX15E_INVERT_CLKOUT, + +	.cmd1csratio = MT41J256M8HX15E_RATIO, +	.cmd1iclkout = MT41J256M8HX15E_INVERT_CLKOUT, + +	.cmd2csratio = MT41J256M8HX15E_RATIO, +	.cmd2iclkout = MT41J256M8HX15E_INVERT_CLKOUT, +}; + +static struct emif_regs ddr3_emif_reg_data = { +	.sdram_config = MT41J256M8HX15E_EMIF_SDCFG, +	.ref_ctrl = MT41J256M8HX15E_EMIF_SDREF, +	.sdram_tim1 = MT41J256M8HX15E_EMIF_TIM1, +	.sdram_tim2 = MT41J256M8HX15E_EMIF_TIM2, +	.sdram_tim3 = MT41J256M8HX15E_EMIF_TIM3, +	.zq_config = MT41J256M8HX15E_ZQ_CFG, +	.emif_ddr_phy_ctlr_1 = MT41J256M8HX15E_EMIF_READ_LATENCY | +				PHY_EN_DYN_PWRDN, +}; + +void sdram_init(void) +{ +	config_ddr(DDR_CLK_MHZ, &ioregs, &ddr3_data, +		   &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0); +} +#else +const struct ctrl_ioregs ioregs = { +	.cm0ioctl		= MT41K256M16HA125E_IOCTRL_VALUE, +	.cm1ioctl		= MT41K256M16HA125E_IOCTRL_VALUE, +	.cm2ioctl		= MT41K256M16HA125E_IOCTRL_VALUE, +	.dt0ioctl		= MT41K256M16HA125E_IOCTRL_VALUE, +	.dt1ioctl		= MT41K256M16HA125E_IOCTRL_VALUE, +}; + +static const struct ddr_data ddr3_data = { +	.datardsratio0 = MT41K256M16HA125E_RD_DQS, +	.datawdsratio0 = MT41K256M16HA125E_WR_DQS, +	.datafwsratio0 = MT41K256M16HA125E_PHY_FIFO_WE, +	.datawrsratio0 = MT41K256M16HA125E_PHY_WR_DATA, +}; + +static const struct cmd_control ddr3_cmd_ctrl_data = { +	.cmd0csratio = MT41K256M16HA125E_RATIO, +	.cmd0iclkout = MT41K256M16HA125E_INVERT_CLKOUT, + +	.cmd1csratio = MT41K256M16HA125E_RATIO, +	.cmd1iclkout = MT41K256M16HA125E_INVERT_CLKOUT, + +	.cmd2csratio = MT41K256M16HA125E_RATIO, +	.cmd2iclkout = MT41K256M16HA125E_INVERT_CLKOUT, +}; + +static struct emif_regs ddr3_emif_reg_data = { +	.sdram_config = MT41K256M16HA125E_EMIF_SDCFG, +	.ref_ctrl = MT41K256M16HA125E_EMIF_SDREF, +	.sdram_tim1 = MT41K256M16HA125E_EMIF_TIM1, +	.sdram_tim2 = MT41K256M16HA125E_EMIF_TIM2, +	.sdram_tim3 = MT41K256M16HA125E_EMIF_TIM3, +	.zq_config = MT41K256M16HA125E_ZQ_CFG, +	.emif_ddr_phy_ctlr_1 = MT41K256M16HA125E_EMIF_READ_LATENCY | +				PHY_EN_DYN_PWRDN, +}; + +void sdram_init(void) +{ +	config_ddr(DDR_CLK_MHZ, &ioregs, &ddr3_data, +		   &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data, 0); +} +#endif + +void set_uart_mux_conf(void) +{ +	enable_uart0_pin_mux(); +} + +void set_mux_conf_regs(void) +{ +	/* Initalize the board header */ +	enable_i2c0_pin_mux(); +	i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); + +	enable_board_pin_mux(); +} +#endif + +/* + * Basic board specific setup.  Pinmux has been handled already. + */ +int board_init(void) +{ +	i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE); + +	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; + +	return 0; +} + +#ifdef CONFIG_DRIVER_TI_CPSW +static void cpsw_control(int enabled) +{ +	/* VTP can be added here */ + +	return; +} + +static struct cpsw_slave_data cpsw_slaves[] = { +	{ +		.slave_reg_ofs	= 0x208, +		.sliver_reg_ofs	= 0xd80, +		.phy_addr	= 0, +		.phy_if		= PHY_INTERFACE_MODE_RGMII, +	}, +	{ +		.slave_reg_ofs	= 0x308, +		.sliver_reg_ofs	= 0xdc0, +		.phy_addr	= 1, +		.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_slaves, +	.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, +}; +#endif + +#if defined(CONFIG_DRIVER_TI_CPSW) || \ +	(defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) +int board_eth_init(bd_t *bis) +{ +	int rv, n = 0; +#ifdef CONFIG_DRIVER_TI_CPSW +	uint8_t mac_addr[6]; +	uint32_t mac_hi, mac_lo; + +	if (!eth_getenv_enetaddr("ethaddr", mac_addr)) { +		printf("<ethaddr> not set. Reading from E-fuse\n"); +		/* try reading mac address from efuse */ +		mac_lo = readl(&cdev->macid0l); +		mac_hi = readl(&cdev->macid0h); +		mac_addr[0] = mac_hi & 0xFF; +		mac_addr[1] = (mac_hi & 0xFF00) >> 8; +		mac_addr[2] = (mac_hi & 0xFF0000) >> 16; +		mac_addr[3] = (mac_hi & 0xFF000000) >> 24; +		mac_addr[4] = mac_lo & 0xFF; +		mac_addr[5] = (mac_lo & 0xFF00) >> 8; + +		if (is_valid_ether_addr(mac_addr)) +			eth_setenv_enetaddr("ethaddr", mac_addr); +		else +			goto try_usbether; +	} + +	writel(RMII_RGMII2_MODE_ENABLE, &cdev->miisel); + +	rv = cpsw_register(&cpsw_data); +	if (rv < 0) +		printf("Error %d registering CPSW switch\n", rv); +	else +		n += rv; +try_usbether: +#endif + +#if defined(CONFIG_USB_ETHER) && !defined(CONFIG_SPL_BUILD) +	rv = usb_eth_initialize(bis); +	if (rv < 0) +		printf("Error %d registering USB_ETHER\n", rv); +	else +		n += rv; +#endif +	return n; +} +#endif diff --git a/roms/u-boot/board/phytec/pcm051/board.h b/roms/u-boot/board/phytec/pcm051/board.h new file mode 100644 index 00000000..e0b39e03 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm051/board.h @@ -0,0 +1,25 @@ +/* + * board.h + * + * Phytec phyCORE-AM335x (pcm051) boards information header + * + * Copyright (C) 2013, Lemonage Software GmbH + * Author Lars Poeschel <poeschel@lemonage.de> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * We have three pin mux functions that must exist.  We must be able to enable + * uart0, for initial output and i2c0 to read the main EEPROM.  We then have a + * main pinmux function that can be overridden to enable all other pinmux that + * is required on the board. + */ +void enable_uart0_pin_mux(void); +void enable_i2c0_pin_mux(void); +void enable_board_pin_mux(void); +void enable_cbmux_pin_mux(void); +#endif diff --git a/roms/u-boot/board/phytec/pcm051/mux.c b/roms/u-boot/board/phytec/pcm051/mux.c new file mode 100644 index 00000000..6e9c3d25 --- /dev/null +++ b/roms/u-boot/board/phytec/pcm051/mux.c @@ -0,0 +1,127 @@ +/* + * mux.c + * + * Copyright (C) 2013 Lemonage Software GmbH + * Author Lars Poeschel <poeschel@lemonage.de> + * + * 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 version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <common.h> +#include <asm/arch/sys_proto.h> +#include <asm/arch/hardware.h> +#include <asm/arch/mux.h> +#include <asm/io.h> +#include "board.h" + +static struct module_pin_mux uart0_pin_mux[] = { +	{OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)},	/* UART0_RXD */ +	{OFFSET(uart0_txd), (MODE(0) | PULLUDEN)},		/* UART0_TXD */ +	{-1}, +}; + +#ifdef CONFIG_MMC +static struct module_pin_mux mmc0_pin_mux[] = { +	{OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)},	/* MMC0_DAT3 */ +	{OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)},	/* MMC0_DAT2 */ +	{OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)},	/* MMC0_DAT1 */ +	{OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)},	/* MMC0_DAT0 */ +	{OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)},	/* MMC0_CLK */ +	{OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)},	/* MMC0_CMD */ +	{OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)},	/* MMC0_CD */ +	{-1}, +}; +#endif + +#ifdef CONFIG_I2C +static struct module_pin_mux i2c0_pin_mux[] = { +	{OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | +			PULLUDEN | SLEWCTRL)}, /* I2C_DATA */ +	{OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | +			PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */ +	{-1}, +}; +#endif + +#ifdef CONFIG_SPI +static struct module_pin_mux spi0_pin_mux[] = { +	{OFFSET(spi0_sclk), (MODE(0) | RXACTIVE | PULLUDEN)},	/* SPI0_SCLK */ +	{OFFSET(spi0_d0), (MODE(0) | RXACTIVE | +			PULLUDEN | PULLUP_EN)},			/* SPI0_D0 */ +	{OFFSET(spi0_d1), (MODE(0) | RXACTIVE | PULLUDEN)},	/* SPI0_D1 */ +	{OFFSET(spi0_cs0), (MODE(0) | RXACTIVE | +			PULLUDEN | PULLUP_EN)},			/* SPI0_CS0 */ +	{-1}, +}; +#endif + +static struct module_pin_mux rmii1_pin_mux[] = { +	{OFFSET(mii1_crs), MODE(1) | RXACTIVE},     /* RMII1_CRS */ +	{OFFSET(mii1_rxerr), MODE(1) | RXACTIVE},   /* RMII1_RXERR */ +	{OFFSET(mii1_txen), MODE(1)},               /* RMII1_TXEN */ +	{OFFSET(mii1_txd1), MODE(1)},               /* RMII1_TXD1 */ +	{OFFSET(mii1_txd0), MODE(1)},               /* RMII1_TXD0 */ +	{OFFSET(mii1_rxd1), MODE(1) | RXACTIVE},    /* RMII1_RXD1 */ +	{OFFSET(mii1_rxd0), MODE(1) | RXACTIVE},    /* RMII1_RXD0 */ +	{OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */ +	{OFFSET(mdio_clk), MODE(0) | PULLUP_EN},    /* MDIO_CLK */ +	{OFFSET(rmii1_refclk), MODE(0) | RXACTIVE}, /* RMII1_REFCLK */ +	{-1}, +}; + +static struct module_pin_mux cbmux_pin_mux[] = { +	{OFFSET(uart0_ctsn), MODE(7) | RXACTIVE | PULLDOWN_EN}, /* JP3 */ +	{OFFSET(uart0_rtsn), MODE(7) | RXACTIVE | PULLUP_EN},	/* JP4 */ +	{-1}, +}; + +#ifdef CONFIG_NAND +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}, +}; +#endif + +void enable_uart0_pin_mux(void) +{ +	configure_module_pin_mux(uart0_pin_mux); +} + +void enable_i2c0_pin_mux(void) +{ +	configure_module_pin_mux(i2c0_pin_mux); +} + +void enable_board_pin_mux() +{ +	configure_module_pin_mux(rmii1_pin_mux); +	configure_module_pin_mux(mmc0_pin_mux); +	configure_module_pin_mux(cbmux_pin_mux); +#ifdef CONFIG_NAND +	configure_module_pin_mux(nand_pin_mux); +#endif +#ifdef CONFIG_SPI +	configure_module_pin_mux(spi0_pin_mux); +#endif +}  | 
