diff options
Diffstat (limited to 'board/siemens')
| -rw-r--r-- | board/siemens/common/board.c | 171 | ||||
| -rw-r--r-- | board/siemens/common/factoryset.c | 284 | ||||
| -rw-r--r-- | board/siemens/common/factoryset.h | 27 | ||||
| -rw-r--r-- | board/siemens/dxr2/Makefile | 49 | ||||
| -rw-r--r-- | board/siemens/dxr2/board.c | 241 | ||||
| -rw-r--r-- | board/siemens/dxr2/board.h | 69 | ||||
| -rw-r--r-- | board/siemens/dxr2/mux.c | 112 | ||||
| -rw-r--r-- | board/siemens/pxm2/Makefile | 49 | ||||
| -rw-r--r-- | board/siemens/pxm2/board.c | 429 | ||||
| -rw-r--r-- | board/siemens/pxm2/board.h | 22 | ||||
| -rw-r--r-- | board/siemens/pxm2/mux.c | 186 | ||||
| -rw-r--r-- | board/siemens/pxm2/pmic.h | 71 | ||||
| -rw-r--r-- | board/siemens/rut/Makefile | 49 | ||||
| -rw-r--r-- | board/siemens/rut/board.c | 432 | ||||
| -rw-r--r-- | board/siemens/rut/board.h | 22 | ||||
| -rw-r--r-- | board/siemens/rut/mux.c | 347 | 
16 files changed, 2560 insertions, 0 deletions
| diff --git a/board/siemens/common/board.c b/board/siemens/common/board.c new file mode 100644 index 000000000..6279c3281 --- /dev/null +++ b/board/siemens/common/board.c @@ -0,0 +1,171 @@ +/* + * Common board functions for siemens AM335X based boards + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * U-Boot file:/board/ti/am335x/board.c + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * 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 <watchdog.h> +#include "../common/factoryset.h" + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_SPL_BUILD +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_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +	if (read_eeprom() < 0) +		puts("Could not get board ID.\n"); + +	enable_board_pin_mux(); +} + +void sdram_init(void) +{ +	spl_siemens_board_init(); +	board_init_ddr(); + +	return; +} +#endif /* #ifdef CONFIG_SPL_BUILD */ + +#ifndef CONFIG_SPL_BUILD +/* + * Basic board specific setup.  Pinmux has been handled already. + */ +int board_init(void) +{ +#if defined(CONFIG_HW_WATCHDOG) +	hw_watchdog_init(); +#endif /* defined(CONFIG_HW_WATCHDOG) */ +	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +	if (read_eeprom() < 0) +		puts("Could not get board ID.\n"); + +	gd->bd->bi_arch_number = CONFIG_MACH_TYPE; +	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100; + +#ifdef CONFIG_FACTORYSET +	factoryset_read_eeprom(CONFIG_SYS_I2C_EEPROM_ADDR); +#endif +	gpmc_init(); + +#ifdef CONFIG_VIDEO +	board_video_init(); +#endif + +	return 0; +} +#endif /* #ifndef CONFIG_SPL_BUILD */ + +#define OSC	(V_OSCK/1000000) +const struct dpll_params dpll_ddr = { +		DDR_PLL_FREQ, OSC-1, 1, -1, -1, -1, -1}; + +const struct dpll_params *get_dpll_ddr_params(void) +{ +	return &dpll_ddr; +} + +#ifdef CONFIG_BOARD_LATE_INIT +int board_late_init(void) +{ +	omap_nand_switch_ecc(1, 8); + +	return 0; +} +#endif + +#ifndef CONFIG_SPL_BUILD +#if defined(BOARD_DFU_BUTTON_GPIO) +/* + * This command returns the status of the user button on + * Input - none + * Returns -	1 if button is held down + *		0 if button is not held down + */ +static int +do_userbutton(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	int button = 0; +	int gpio; + +	gpio = BOARD_DFU_BUTTON_GPIO; +	gpio_request(gpio, "DFU"); +	gpio_direction_input(gpio); +	if (gpio_get_value(gpio)) +		button = 1; +	else +		button = 0; + +	gpio_free(gpio); +	if (!button) { +		/* LED0 - RED=1: GPIO2_0 2*32 = 64 */ +		gpio_request(BOARD_DFU_BUTTON_LED, ""); +		gpio_direction_output(BOARD_DFU_BUTTON_LED, 1); +		gpio_set_value(BOARD_DFU_BUTTON_LED, 1); +	} + +	return button; +} + +U_BOOT_CMD( +	dfubutton, CONFIG_SYS_MAXARGS, 1, do_userbutton, +	"Return the status of the DFU button", +	"" +); +#endif + +static int +do_usertestwdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	printf("\n\n\n Go into infinite loop\n\n\n"); +	while (1) +		; +	return 0; +}; + +U_BOOT_CMD( +	testwdt, CONFIG_SYS_MAXARGS, 1,	do_usertestwdt, +	"Sends U-Boot into infinite loop", +	"" +); + +#ifndef CONFIG_SYS_DCACHE_OFF +void enable_caches(void) +{ +	printf("Enable d-cache\n"); +	/* Enable D-cache. I-cache is already enabled in start.S */ +	dcache_enable(); +} +#endif /* CONFIG_SYS_DCACHE_OFF */ +#endif /* !CONFIG_SPL_BUILD */ diff --git a/board/siemens/common/factoryset.c b/board/siemens/common/factoryset.c new file mode 100644 index 000000000..eda9141c5 --- /dev/null +++ b/board/siemens/common/factoryset.c @@ -0,0 +1,284 @@ +/* + * + * Read FactorySet information from EEPROM into global structure. + * (C) Copyright 2013 Siemens Schweiz AG + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#if !defined(CONFIG_SPL_BUILD) + +#include <common.h> +#include <i2c.h> +#include <asm/io.h> +#include <asm/arch/cpu.h> +#include <asm/arch/sys_proto.h> +#include <asm/unaligned.h> +#include <net.h> +#include <usbdescriptors.h> +#include "factoryset.h" + +#define EEPR_PG_SZ		0x80 +#define EEPROM_FATORYSET_OFFSET	0x400 +#define OFF_PG            EEPROM_FATORYSET_OFFSET/EEPR_PG_SZ + +/* Global variable that contains necessary information from FactorySet */ +struct factorysetcontainer factory_dat; + +#define fact_get_char(i) *((char *)&eeprom_buf[i]) + +static int fact_match(unsigned char *eeprom_buf, uchar *s1, int i2) +{ +	if (s1 == NULL) +		return -1; + +	while (*s1 == fact_get_char(i2++)) +		if (*s1++ == '=') +			return i2; + +	if (*s1 == '\0' && fact_get_char(i2-1) == '=') +		return i2; + +	return -1; +} + +static int get_factory_val(unsigned char *eeprom_buf, int size, uchar *name, +			uchar *buf, int len) +{ +	int i, nxt = 0; + +	for (i = 0; fact_get_char(i) != '\0'; i = nxt + 1) { +		int val, n; + +		for (nxt = i; fact_get_char(nxt) != '\0'; ++nxt) { +			if (nxt >= size) +				return -1; +		} + +		val = fact_match(eeprom_buf, (uchar *)name, i); +		if (val < 0) +			continue; + +		/* found; copy out */ +		for (n = 0; n < len; ++n, ++buf) { +			*buf = fact_get_char(val++); +			if (*buf == '\0') +				return n; +		} + +		if (n) +			*--buf = '\0'; + +		printf("env_buf [%d bytes] too small for value of \"%s\"\n", +		       len, name); + +		return n; +	} +	return -1; +} + +static +int get_factory_record_val(unsigned char *eeprom_buf, int size,	uchar *record, +	uchar *name, uchar *buf, int len) +{ +	int ret = -1; +	int i, nxt = 0; +	int c; +	unsigned char end = 0xff; + +	for (i = 0; fact_get_char(i) != end; i = nxt) { +		nxt = i + 1; +		if (fact_get_char(i) == '>') { +			int pos; +			int endpos; +			int z; + +			c = strncmp((char *)&eeprom_buf[i + 1], (char *)record, +				    strlen((char *)record)); +			if (c == 0) { +				/* record found */ +				pos = i + strlen((char *)record) + 2; +				nxt = pos; +				/* search for "<" */ +				c = -1; +				for (z = pos; fact_get_char(z) != end; z++) { +					if ((fact_get_char(z) == '<')  || +					    (fact_get_char(z) == '>')) { +						endpos = z; +						nxt = endpos; +						c = 0; +						break; +					} +				} +			} +			if (c == 0) { +				/* end found -> call get_factory_val */ +				eeprom_buf[endpos] = end; +				ret = get_factory_val(&eeprom_buf[pos], +					size - pos, name, buf, len); +				/* fix buffer */ +				eeprom_buf[endpos] = '<'; +				debug("%s: %s.%s = %s\n", +				      __func__, record, name, buf); +				return ret; +			} +		} +	} +	return ret; +} + +int factoryset_read_eeprom(int i2c_addr) +{ +	int i, pages = 0, size = 0; +	unsigned char eeprom_buf[0x3c00], hdr[4], buf[MAX_STRING_LENGTH]; +	unsigned char *cp, *cp1; + +#if defined(CONFIG_DFU_FUNCTION) +	factory_dat.usb_vendor_id = CONFIG_G_DNL_VENDOR_NUM; +	factory_dat.usb_product_id = CONFIG_G_DNL_PRODUCT_NUM; +#endif +	if (i2c_probe(i2c_addr)) +		goto err; + +	if (i2c_read(i2c_addr, EEPROM_FATORYSET_OFFSET, 2, hdr, sizeof(hdr))) +		goto err; + +	if ((hdr[0] != 0x99) || (hdr[1] != 0x80)) { +		printf("FactorySet is not right in eeprom.\n"); +		return 1; +	} + +	/* get FactorySet size */ +	size = (hdr[2] << 8) + hdr[3] + sizeof(hdr); +	if (size > 0x3bfa) +		size = 0x3bfa; + +	pages = size / EEPR_PG_SZ; + +	/* +	 * read the eeprom using i2c +	 * I can not read entire eeprom in once, so separate into several +	 * times. Furthermore, fetch eeprom take longer time, so we fetch +	 * data after every time we got a record from eeprom +	 */ +	debug("Read eeprom page :\n"); +	for (i = 0; i < pages; i++) +		if (i2c_read(i2c_addr, (OFF_PG + i) * EEPR_PG_SZ, 2, +			     eeprom_buf + (i * EEPR_PG_SZ), EEPR_PG_SZ)) +			goto err; + +	if (size % EEPR_PG_SZ) +		if (i2c_read(i2c_addr, (OFF_PG + pages) * EEPR_PG_SZ, 2, +			     eeprom_buf + (pages * EEPR_PG_SZ), +			     (size % EEPR_PG_SZ))) +			goto err; + +	/* we do below just for eeprom align */ +	for (i = 0; i < size; i++) +		if (eeprom_buf[i] == '\n') +			eeprom_buf[i] = 0; + +	/* skip header */ +	size -= sizeof(hdr); +	cp = (uchar *)eeprom_buf + sizeof(hdr); + +	/* get mac address */ +	get_factory_record_val(cp, size, (uchar *)"ETH1", (uchar *)"mac", +			       buf, MAX_STRING_LENGTH); +	cp1 = buf; +	for (i = 0; i < 6; i++) { +		factory_dat.mac[i] = simple_strtoul((char *)cp1, NULL, 16); +		cp1 += 3; +	} + +#if defined(CONFIG_DFU_FUNCTION) +	/* read vid and pid for dfu mode */ +	if (0 <= get_factory_record_val(cp, size, (uchar *)"USBD1", +					(uchar *)"vid", buf, +					MAX_STRING_LENGTH)) { +		factory_dat.usb_vendor_id = simple_strtoul((char *)buf, +							   NULL, 16); +	} + +	if (0 <= get_factory_record_val(cp, size, (uchar *)"USBD1", +					(uchar *)"pid", buf, +					MAX_STRING_LENGTH)) { +		factory_dat.usb_product_id = simple_strtoul((char *)buf, +							    NULL, 16); +	} +	printf("DFU USB: VID = 0x%4x, PID = 0x%4x\n", factory_dat.usb_vendor_id, +	       factory_dat.usb_product_id); +#endif +	if (0 <= get_factory_record_val(cp, size, (uchar *)"DEV", +					(uchar *)"id", buf, +					MAX_STRING_LENGTH)) { +		if (strncmp((const char *)buf, "PXM50", 5) == 0) +			factory_dat.pxm50 = 1; +		else +			factory_dat.pxm50 = 0; +	} +	debug("PXM50: %d\n", factory_dat.pxm50); +#if defined(CONFIG_VIDEO) +	if (0 <= get_factory_record_val(cp, size, (uchar *)"DISP1", +					(uchar *)"name", factory_dat.disp_name, +					MAX_STRING_LENGTH)) { +		debug("display name: %s\n", factory_dat.disp_name); +	} + +#endif +	return 0; + +err: +	printf("Could not read the EEPROM; something fundamentally wrong on the I2C bus.\n"); +	return 1; +} + +static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; + +static int factoryset_mac_setenv(void) +{ +	uint8_t mac_addr[6]; + +	debug("FactorySet: Set mac address\n"); +	if (is_valid_ether_addr(factory_dat.mac)) { +		memcpy(mac_addr, factory_dat.mac, 6); +	} else { +		uint32_t mac_hi, mac_lo; + +		debug("Warning: FactorySet: <ethaddr> not set. Fallback to E-fuse\n"); +		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)) { +			printf("Warning: ethaddr not set by FactorySet or E-fuse. Set <ethaddr> variable to overcome this.\n"); +			return -1; +		} +	} + +	eth_setenv_enetaddr("ethaddr", mac_addr); +	return 0; +} + +int factoryset_setenv(void) +{ +	int ret = 0; + +	if (factoryset_mac_setenv() < 0) +		ret = -1; + +	return ret; +} + +int g_dnl_bind_fixup(struct usb_device_descriptor *dev) +{ +	put_unaligned(factory_dat.usb_vendor_id, &dev->idVendor); +	put_unaligned(factory_dat.usb_product_id, &dev->idProduct); +	return 0; +} +#endif /* defined(CONFIG_SPL_BUILD) */ diff --git a/board/siemens/common/factoryset.h b/board/siemens/common/factoryset.h new file mode 100644 index 000000000..445f3842d --- /dev/null +++ b/board/siemens/common/factoryset.h @@ -0,0 +1,27 @@ +/* + * Common board functions for siemens AM335X based boards + * (C) Copyright 2013 Siemens Schweiz AG + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef __FACTORYSET_H +#define __FACTORYSET_H + +#define MAX_STRING_LENGTH	32 + +struct factorysetcontainer { +	uchar mac[6]; +	int usb_vendor_id; +	int usb_product_id; +	int pxm50; +#if defined(CONFIG_VIDEO) +	unsigned char disp_name[MAX_STRING_LENGTH]; +#endif +}; + +int factoryset_read_eeprom(int i2c_addr); +int factoryset_setenv(void); +extern struct factorysetcontainer factory_dat; + +#endif /* __FACTORYSET_H */ diff --git a/board/siemens/dxr2/Makefile b/board/siemens/dxr2/Makefile new file mode 100644 index 000000000..a09b467d5 --- /dev/null +++ b/board/siemens/dxr2/Makefile @@ -0,0 +1,49 @@ +# +# Makefile +# +# (C) Copyright 2013 Siemens Schweiz AG +# (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. +# +# Based on: +# u-boot:/board/ti/am335x/Makefile +# Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +include $(TOPDIR)/config.mk +ifneq ($(OBJTREE),$(SRCTREE)) +$(shell mkdir -p $(obj)../common) +endif + +LIB	= $(obj)lib$(BOARD).o + +ifdef CONFIG_SPL_BUILD +COBJS	:= mux.o +endif + +COBJS	+= board.o +ifndef CONFIG_SPL_BUILD +COBJS += ../common/factoryset.o +endif +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(call cmd_link_o_target, $(OBJS) $(SOBJS)) + +clean: +	rm -f $(SOBJS) $(OBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak $(obj).depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/siemens/dxr2/board.c b/board/siemens/dxr2/board.c new file mode 100644 index 000000000..af9d84f12 --- /dev/null +++ b/board/siemens/dxr2/board.c @@ -0,0 +1,241 @@ +/* + * Board functions for TI AM335X based dxr2 board + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * + * Board functions for TI AM335X based boards + * u-boot:/board/ti/am335x/board.c + * + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * 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 <watchdog.h> +#include "board.h" +#include "../common/factoryset.h" + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_SPL_BUILD +static struct dxr2_baseboard_id __attribute__((section(".data"))) settings; + +const struct ddr3_data ddr3_default = { +	0x33524444, 0x56312e33, 0x0100, 0x0001, 0x003A, 0x008A, 0x010B, +	0x00C4, 0x0888A39B, 0x26247FDA, 0x501F821F, 0x0006, 0x61C04AB2, +	0x00000618, +}; + +static void set_default_ddr3_timings(void) +{ +	printf("Set default DDR3 settings\n"); +	settings.ddr3 = ddr3_default; +} + +static void print_ddr3_timings(void) +{ +	printf("\n\nDDR3 Timing parameters:\n"); +	printf("Diff     Eeprom  Default\n"); +	PRINTARGS(magic); +	PRINTARGS(version); +	PRINTARGS(ddr3_sratio); +	PRINTARGS(iclkout); + +	PRINTARGS(dt0rdsratio0); +	PRINTARGS(dt0wdsratio0); +	PRINTARGS(dt0fwsratio0); +	PRINTARGS(dt0wrsratio0); + +	PRINTARGS(sdram_tim1); +	PRINTARGS(sdram_tim2); +	PRINTARGS(sdram_tim3); + +	PRINTARGS(emif_ddr_phy_ctlr_1); + +	PRINTARGS(sdram_config); +	PRINTARGS(ref_ctrl); +} + +static void print_chip_data(void) +{ +	printf("\n"); +	printf("Device: '%s'\n", settings.chip.sdevname); +	printf("HW version: '%s'\n", settings.chip.shwver); +} +#endif /* CONFIG_SPL_BUILD */ + +/* + * Read header information from EEPROM into global structure. + */ +static int read_eeprom(void) +{ +	/* Check if baseboard eeprom is available */ +	if (i2c_probe(CONFIG_SYS_I2C_EEPROM_ADDR)) { +		printf("Could not probe the EEPROM; something fundamentally wrong on the I2C bus.\n"); +		return 1; +	} + +#ifdef CONFIG_SPL_BUILD +	/* Read Siemens eeprom data (DDR3) */ +	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, EEPROM_ADDR_DDR3, 2, +		     (uchar *)&settings.ddr3, sizeof(struct ddr3_data))) { +		printf("Could not read the EEPROM; something fundamentally wrong on the I2C bus.\nUse default DDR3 timings\n"); +		set_default_ddr3_timings(); +	} +	/* Read Siemens eeprom data (CHIP) */ +	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, EEPROM_ADDR_CHIP, 2, +		     (uchar *)&settings.chip, sizeof(settings.chip))) +		printf("Could not read chip settings\n"); + +	if (ddr3_default.magic == settings.ddr3.magic && +	    ddr3_default.version == settings.ddr3.version) { +		printf("Using DDR3 settings from EEPROM\n"); +	} else { +		if (ddr3_default.magic != settings.ddr3.magic) +			printf("Error: No valid DDR3 data in eeprom.\n"); +		if (ddr3_default.version != settings.ddr3.version) +			printf("Error: DDR3 data version does not match.\n"); + +		printf("Using default settings\n"); +		set_default_ddr3_timings(); +	} + +	if (MAGIC_CHIP == settings.chip.magic) { +		printf("Valid chip data in eeprom\n"); +		print_chip_data(); +	} else { +		printf("Error: No chip data in eeprom\n"); +	} + +	print_ddr3_timings(); +#endif +	return 0; +} + +#ifdef CONFIG_SPL_BUILD +static void board_init_ddr(void) +{ +struct emif_regs dxr2_ddr3_emif_reg_data = { +	.zq_config = 0x50074BE4, +}; + +struct ddr_data dxr2_ddr3_data = { +	.datadldiff0 = PHY_DLL_LOCK_DIFF, +}; + +struct cmd_control dxr2_ddr3_cmd_ctrl_data = { +	.cmd0dldiff = 0, +	.cmd1dldiff = 0, +	.cmd2dldiff = 0, +}; +	/* pass values from eeprom */ +	dxr2_ddr3_emif_reg_data.sdram_tim1 = settings.ddr3.sdram_tim1; +	dxr2_ddr3_emif_reg_data.sdram_tim2 = settings.ddr3.sdram_tim2; +	dxr2_ddr3_emif_reg_data.sdram_tim3 = settings.ddr3.sdram_tim3; +	dxr2_ddr3_emif_reg_data.emif_ddr_phy_ctlr_1 = +		settings.ddr3.emif_ddr_phy_ctlr_1; +	dxr2_ddr3_emif_reg_data.sdram_config = settings.ddr3.sdram_config; +	dxr2_ddr3_emif_reg_data.ref_ctrl = settings.ddr3.ref_ctrl; + +	dxr2_ddr3_data.datardsratio0 = settings.ddr3.dt0rdsratio0; +	dxr2_ddr3_data.datawdsratio0 = settings.ddr3.dt0wdsratio0; +	dxr2_ddr3_data.datafwsratio0 = settings.ddr3.dt0fwsratio0; +	dxr2_ddr3_data.datawrsratio0 = settings.ddr3.dt0wrsratio0; + +	dxr2_ddr3_cmd_ctrl_data.cmd0csratio = settings.ddr3.ddr3_sratio; +	dxr2_ddr3_cmd_ctrl_data.cmd0iclkout = settings.ddr3.iclkout; +	dxr2_ddr3_cmd_ctrl_data.cmd1csratio = settings.ddr3.ddr3_sratio; +	dxr2_ddr3_cmd_ctrl_data.cmd1iclkout = settings.ddr3.iclkout; +	dxr2_ddr3_cmd_ctrl_data.cmd2csratio = settings.ddr3.ddr3_sratio; +	dxr2_ddr3_cmd_ctrl_data.cmd2iclkout = settings.ddr3.iclkout; + +	config_ddr(DDR_PLL_FREQ, DXR2_IOCTRL_VAL, &dxr2_ddr3_data, +		   &dxr2_ddr3_cmd_ctrl_data, &dxr2_ddr3_emif_reg_data, 0); +} + +static void spl_siemens_board_init(void) +{ +	return; +} +#endif /* if def CONFIG_SPL_BUILD */ + +#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ +	(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) +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_id		= 0, +		.phy_if		= PHY_INTERFACE_MODE_MII, +	}, +}; + +static struct cpsw_platform_data cpsw_data = { +	.mdio_base		= CPSW_MDIO_BASE, +	.cpsw_base		= CPSW_BASE, +	.mdio_div		= 0xff, +	.channels		= 4, +	.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, +}; + +#if defined(CONFIG_DRIVER_TI_CPSW) || \ +	(defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) +int board_eth_init(bd_t *bis) +{ +	struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; +	int n = 0; +	int rv; + +	factoryset_setenv(); + +	/* Set rgmii mode and enable rmii clock to be sourced from chip */ +	writel((RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE), &cdev->miisel); + +	rv = cpsw_register(&cpsw_data); +	if (rv < 0) +		printf("Error %d registering CPSW switch\n", rv); +	else +		n += rv; +	return n; +} +#endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */ +#endif /* #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) */ + +#include "../common/board.c" diff --git a/board/siemens/dxr2/board.h b/board/siemens/dxr2/board.h new file mode 100644 index 000000000..2be78fbab --- /dev/null +++ b/board/siemens/dxr2/board.h @@ -0,0 +1,69 @@ +/* + * board.h + * + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * TI AM335x boards information header + * u-boot:/board/ti/am335x/board.h + * + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#define PARGS3(x)	settings.ddr3.x-ddr3_default.x, \ +			settings.ddr3.x, ddr3_default.x +#define PRINTARGS(y)	printf("%x, %8x, %8x : "#y"\n", PARGS3(y)) +#define MAGIC_CHIP	0x50494843 + +/* Automatic generated definition */ +/* Wed, 19 Jun 2013 10:57:48 +0200 */ +/* From file: draco/ddr3-data-micron.txt */ +struct ddr3_data { +	unsigned int magic;			/* 0x33524444 */ +	unsigned int version;			/* 0x56312e33 */ +	unsigned short int ddr3_sratio;		/* 0x0100 */ +	unsigned short int iclkout;		/* 0x0001 */ +	unsigned short int dt0rdsratio0;	/* 0x003A */ +	unsigned short int dt0wdsratio0;	/* 0x008A */ +	unsigned short int dt0fwsratio0;	/* 0x010B */ +	unsigned short int dt0wrsratio0;	/* 0x00C4 */ +	unsigned int sdram_tim1;		/* 0x0888A39B */ +	unsigned int sdram_tim2;		/* 0x26247FDA */ +	unsigned int sdram_tim3;		/* 0x501F821F */ +	unsigned short int emif_ddr_phy_ctlr_1;	/* 0x0006 */ +	unsigned int sdram_config;		/* 0x61C04AB2 */ +	unsigned int ref_ctrl;			/* 0x00000618 */ +}; + +struct chip_data { +	unsigned int  magic; +	char sdevname[16]; +	char shwver[7]; +}; + +struct dxr2_baseboard_id { +	struct ddr3_data ddr3; +	struct chip_data chip; +}; + +/* + * 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_uart1_pin_mux(void); +void enable_uart2_pin_mux(void); +void enable_uart3_pin_mux(void); +void enable_uart4_pin_mux(void); +void enable_uart5_pin_mux(void); +void enable_i2c0_pin_mux(void); +void enable_board_pin_mux(void); +#endif diff --git a/board/siemens/dxr2/mux.c b/board/siemens/dxr2/mux.c new file mode 100644 index 000000000..bc80b79d7 --- /dev/null +++ b/board/siemens/dxr2/mux.c @@ -0,0 +1,112 @@ +/* + * pinmux setup for siemens dxr2 board + * + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * u-boot:/board/ti/am335x/mux.c + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * 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> +#include <i2c.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}, +}; + +static struct module_pin_mux uart3_pin_mux[] = { +	{OFFSET(spi0_cs1), (MODE(1) | PULLUP_EN | RXACTIVE)},	/* UART3_RXD */ +	{OFFSET(ecap0_in_pwm0_out), (MODE(1) | PULLUDEN)},	/* UART3_TXD */ +	{-1}, +}; + +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}, +}; + +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 gpios_pin_mux[] = { +	/* DFU button GPIO0_27*/ +	{OFFSET(gpmc_ad11), (MODE(7) | PULLUDEN | RXACTIVE)}, +	{OFFSET(gpmc_csn3), MODE(7) },			/* LED0 GPIO2_0 */ +	{OFFSET(emu0), MODE(7)},			/* LED1 GPIO3_7 */ +	{-1}, +}; + +static struct module_pin_mux ethernet_pin_mux[] = { +	{OFFSET(mii1_col), (MODE(3) | RXACTIVE)}, +	{OFFSET(mii1_crs), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxerr), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_txen), (MODE(1))}, +	{OFFSET(mii1_rxdv), (MODE(3) | RXACTIVE)}, +	{OFFSET(mii1_txd3), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_txd2), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_txd1), (MODE(1))}, +	{OFFSET(mii1_txd0), (MODE(1))}, +	{OFFSET(mii1_txclk), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxclk), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxd3), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxd2), (MODE(1))}, +	{OFFSET(mii1_rxd1), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxd0), (MODE(1) | RXACTIVE)}, +	{OFFSET(rmii1_refclk), (MODE(0) | RXACTIVE)}, +	{OFFSET(mdio_data), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(mdio_clk), (MODE(0) | PULLUP_EN)}, +	{-1}, +}; + +void enable_uart0_pin_mux(void) +{ +	configure_module_pin_mux(uart0_pin_mux); +} + +void enable_uart3_pin_mux(void) +{ +	configure_module_pin_mux(uart3_pin_mux); +} + +void enable_i2c0_pin_mux(void) +{ +	configure_module_pin_mux(i2c0_pin_mux); +} + +void enable_board_pin_mux(void) +{ +	enable_uart3_pin_mux(); +	configure_module_pin_mux(nand_pin_mux); +	configure_module_pin_mux(ethernet_pin_mux); +	configure_module_pin_mux(gpios_pin_mux); +} diff --git a/board/siemens/pxm2/Makefile b/board/siemens/pxm2/Makefile new file mode 100644 index 000000000..a09b467d5 --- /dev/null +++ b/board/siemens/pxm2/Makefile @@ -0,0 +1,49 @@ +# +# Makefile +# +# (C) Copyright 2013 Siemens Schweiz AG +# (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. +# +# Based on: +# u-boot:/board/ti/am335x/Makefile +# Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +include $(TOPDIR)/config.mk +ifneq ($(OBJTREE),$(SRCTREE)) +$(shell mkdir -p $(obj)../common) +endif + +LIB	= $(obj)lib$(BOARD).o + +ifdef CONFIG_SPL_BUILD +COBJS	:= mux.o +endif + +COBJS	+= board.o +ifndef CONFIG_SPL_BUILD +COBJS += ../common/factoryset.o +endif +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(call cmd_link_o_target, $(OBJS) $(SOBJS)) + +clean: +	rm -f $(SOBJS) $(OBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak $(obj).depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/siemens/pxm2/board.c b/board/siemens/pxm2/board.c new file mode 100644 index 000000000..2c1841f8a --- /dev/null +++ b/board/siemens/pxm2/board.c @@ -0,0 +1,429 @@ +/* + * Board functions for TI AM335X based pxm2 board + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * u-boot:/board/ti/am335x/board.c + * + * Board functions for TI AM335X based boards + * + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * 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 "../../../drivers/video/da8xx-fb.h" +#include <asm/io.h> +#include <asm/emif.h> +#include <asm/gpio.h> +#include <i2c.h> +#include <miiphy.h> +#include <cpsw.h> +#include <watchdog.h> +#include "board.h" +#include "../common/factoryset.h" +#include "pmic.h" +#include <nand.h> +#include <bmp_layout.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_SPL_BUILD +static void board_init_ddr(void) +{ +struct emif_regs pxm2_ddr3_emif_reg_data = { +	.sdram_config = 0x41805332, +	.sdram_tim1 = 0x666b3c9, +	.sdram_tim2 = 0x243631ca, +	.sdram_tim3 = 0x33f, +	.emif_ddr_phy_ctlr_1 = 0x100005, +	.zq_config = 0, +	.ref_ctrl = 0x81a, +}; + +struct ddr_data pxm2_ddr3_data = { +	.datardsratio0 = 0x81204812, +	.datawdsratio0 = 0, +	.datafwsratio0 = 0x8020080, +	.datawrsratio0 = 0x4010040, +	.datauserank0delay = 1, +	.datadldiff0 = PHY_DLL_LOCK_DIFF, +}; + +struct cmd_control pxm2_ddr3_cmd_ctrl_data = { +	.cmd0csratio = 0x80, +	.cmd0dldiff = 0, +	.cmd0iclkout = 0, +	.cmd1csratio = 0x80, +	.cmd1dldiff = 0, +	.cmd1iclkout = 0, +	.cmd2csratio = 0x80, +	.cmd2dldiff = 0, +	.cmd2iclkout = 0, +}; + +	config_ddr(DDR_PLL_FREQ, DXR2_IOCTRL_VAL, &pxm2_ddr3_data, +		   &pxm2_ddr3_cmd_ctrl_data, &pxm2_ddr3_emif_reg_data, 0); +} + +/* + * voltage switching for MPU frequency switching. + * @module = mpu - 0, core - 1 + * @vddx_op_vol_sel = vdd voltage to set + */ + +#define MPU	0 +#define CORE	1 + +int voltage_update(unsigned int module, unsigned char vddx_op_vol_sel) +{ +	uchar buf[4]; +	unsigned int reg_offset; + +	if (module == MPU) +		reg_offset = PMIC_VDD1_OP_REG; +	else +		reg_offset = PMIC_VDD2_OP_REG; + +	/* Select VDDx OP   */ +	if (i2c_read(PMIC_CTRL_I2C_ADDR, reg_offset, 1, buf, 1)) +		return 1; + +	buf[0] &= ~PMIC_OP_REG_CMD_MASK; + +	if (i2c_write(PMIC_CTRL_I2C_ADDR, reg_offset, 1, buf, 1)) +		return 1; + +	/* Configure VDDx OP  Voltage */ +	if (i2c_read(PMIC_CTRL_I2C_ADDR, reg_offset, 1, buf, 1)) +		return 1; + +	buf[0] &= ~PMIC_OP_REG_SEL_MASK; +	buf[0] |= vddx_op_vol_sel; + +	if (i2c_write(PMIC_CTRL_I2C_ADDR, reg_offset, 1, buf, 1)) +		return 1; + +	if (i2c_read(PMIC_CTRL_I2C_ADDR, reg_offset, 1, buf, 1)) +		return 1; + +	if ((buf[0] & PMIC_OP_REG_SEL_MASK) != vddx_op_vol_sel) +		return 1; + +	return 0; +} + +#define OSC     (V_OSCK/1000000) + +const struct dpll_params dpll_mpu_pxm2 = { +		720, OSC-1, 1, -1, -1, -1, -1}; + +void spl_siemens_board_init(void) +{ +	uchar buf[4]; +	/* +	 * pxm2 PMIC code.  All boards currently want an MPU voltage +	 * of 1.2625V and CORE voltage of 1.1375V to operate at +	 * 720MHz. +	 */ +	if (i2c_probe(PMIC_CTRL_I2C_ADDR)) +		return; + +	/* VDD1/2 voltage selection register access by control i/f */ +	if (i2c_read(PMIC_CTRL_I2C_ADDR, PMIC_DEVCTRL_REG, 1, buf, 1)) +		return; + +	buf[0] |= PMIC_DEVCTRL_REG_SR_CTL_I2C_SEL_CTL_I2C; + +	if (i2c_write(PMIC_CTRL_I2C_ADDR, PMIC_DEVCTRL_REG, 1, buf, 1)) +		return; + +	/* Frequency switching for OPP 120 */ +	if (voltage_update(MPU, PMIC_OP_REG_SEL_1_2_6) || +	    voltage_update(CORE, PMIC_OP_REG_SEL_1_1_3)) { +		printf("voltage update failed\n"); +	} +} +#endif /* if def CONFIG_SPL_BUILD */ + +int read_eeprom(void) +{ +	/* nothing ToDo here for this board */ + +	return 0; +} + +#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ +	(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) +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_id		= 0, +		.phy_if		= PHY_INTERFACE_MODE_RMII, +	}, +	{ +		.slave_reg_ofs	= 0x308, +		.sliver_reg_ofs	= 0xdc0, +		.phy_id		= 1, +		.phy_if		= PHY_INTERFACE_MODE_RMII, +	}, +}; + +static struct cpsw_platform_data cpsw_data = { +	.mdio_base		= CPSW_MDIO_BASE, +	.cpsw_base		= CPSW_BASE, +	.mdio_div		= 0xff, +	.channels		= 4, +	.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_SPL_BUILD)) */ + +#if defined(CONFIG_DRIVER_TI_CPSW) || \ +	(defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) +int board_eth_init(bd_t *bis) +{ +	int n = 0; +#if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) || \ +	(defined(CONFIG_SPL_ETH_SUPPORT) && defined(CONFIG_SPL_BUILD)) +	struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; +#ifdef CONFIG_FACTORYSET +	int rv; +	if (!is_valid_ether_addr(factory_dat.mac)) +		printf("Error: no valid mac address\n"); +	else +		eth_setenv_enetaddr("ethaddr", factory_dat.mac); +#endif /* #ifdef CONFIG_FACTORYSET */ + +	/* Set rgmii mode and enable rmii clock to be sourced from chip */ +	writel(RGMII_MODE_ENABLE , &cdev->miisel); + +	rv = cpsw_register(&cpsw_data); +	if (rv < 0) +		printf("Error %d registering CPSW switch\n", rv); +	else +		n += rv; +#endif +	return n; +} +#endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */ + +#if defined(CONFIG_VIDEO) && !defined(CONFIG_SPL_BUILD) +static struct da8xx_panel lcd_panels[] = { +	/* AUO G156XW01 V1 */ +	[0] = { +		.name = "AUO_G156XW01_V1", +		.width = 1376, +		.height = 768, +		.hfp = 14, +		.hbp = 64, +		.hsw = 56, +		.vfp = 1, +		.vbp = 28, +		.vsw = 3, +		.pxl_clk = 60000000, +		.invert_pxl_clk = 0, +	}, +	/* AUO B101EVN06 V0 */ +	[1] = { +		.name = "AUO_B101EVN06_V0", +		.width = 1280, +		.height = 800, +		.hfp = 52, +		.hbp = 84, +		.hsw = 36, +		.vfp = 3, +		.vbp = 14, +		.vsw = 6, +		.pxl_clk = 60000000, +		.invert_pxl_clk = 0, +	}, +	/* +	 * Settings from factoryset +	 * stored in EEPROM +	 */ +	[2] = { +		.name = "factoryset", +		.width = 0, +		.height = 0, +		.hfp = 0, +		.hbp = 0, +		.hsw = 0, +		.vfp = 0, +		.vbp = 0, +		.vsw = 0, +		.pxl_clk = 60000000, +		.invert_pxl_clk = 0, +	}, +}; + +static const struct display_panel disp_panel = { +	WVGA, +	32, +	16, +	COLOR_ACTIVE, +}; + +static const struct lcd_ctrl_config lcd_cfg = { +	&disp_panel, +	.ac_bias		= 255, +	.ac_bias_intrpt		= 0, +	.dma_burst_sz		= 16, +	.bpp			= 32, +	.fdd			= 0x80, +	.tft_alt_mode		= 0, +	.stn_565_mode		= 0, +	.mono_8bit_mode		= 0, +	.invert_line_clock	= 1, +	.invert_frm_clock	= 1, +	.sync_edge		= 0, +	.sync_ctrl		= 1, +	.raster_order		= 0, +}; + +static int set_gpio(int gpio, int state) +{ +	gpio_request(gpio, "temp"); +	gpio_direction_output(gpio, state); +	gpio_set_value(gpio, state); +	gpio_free(gpio); +	return 0; +} + +static int enable_backlight(void) +{ +	set_gpio(BOARD_LCD_POWER, 1); +	set_gpio(BOARD_BACK_LIGHT, 1); +	set_gpio(BOARD_TOUCH_POWER, 1); +	return 0; +} + +static int enable_pwm(void) +{ +	struct pwmss_regs *pwmss = (struct pwmss_regs *)PWMSS0_BASE; +	struct pwmss_ecap_regs *ecap; +	int ticks = PWM_TICKS; +	int duty = PWM_DUTY; + +	ecap = (struct pwmss_ecap_regs *)AM33XX_ECAP0_BASE; +	/* enable clock */ +	setbits_le32(&pwmss->clkconfig, ECAP_CLK_EN); +	/* TimeStam Counter register */ +	writel(0xdb9, &ecap->tsctr); +	/* config period */ +	writel(ticks - 1, &ecap->cap3); +	writel(ticks - 1, &ecap->cap1); +	setbits_le16(&ecap->ecctl2, +		     (ECTRL2_MDSL_ECAP | ECTRL2_SYNCOSEL_MASK | 0xd0)); +	/* config duty */ +	writel(duty, &ecap->cap2); +	writel(duty, &ecap->cap4); +	/* start */ +	setbits_le16(&ecap->ecctl2, ECTRL2_CTRSTP_FREERUN); +	return 0; +} + +static struct dpll_regs dpll_lcd_regs = { +	.cm_clkmode_dpll = CM_WKUP + 0x98, +	.cm_idlest_dpll = CM_WKUP + 0x48, +	.cm_clksel_dpll = CM_WKUP + 0x54, +}; + +/* no console on this board */ +int board_cfb_skip(void) +{ +	return 1; +} + +#define PLL_GET_M(v) ((v >> 8) & 0x7ff) +#define PLL_GET_N(v) (v & 0x7f) + +static int get_clk(struct dpll_regs *dpll_regs) +{ +	unsigned int val; +	unsigned int m, n; +	int f = 0; + +	val = readl(dpll_regs->cm_clksel_dpll); +	m = PLL_GET_M(val); +	n = PLL_GET_N(val); +	f = (m * V_OSCK) / n; + +	return f; +}; + +int clk_get(int clk) +{ +	return get_clk(&dpll_lcd_regs); +}; + +static int conf_disp_pll(int m, int n) +{ +	struct cm_perpll *cmper = (struct cm_perpll *)CM_PER; +	struct cm_dpll *cmdpll = (struct cm_dpll *)CM_DPLL; +	struct dpll_params dpll_lcd = {m, n, -1, -1, -1, -1, -1}; + +	u32 *const clk_domains[] = { +		&cmper->lcdclkctrl, +		0 +	}; +	u32 *const clk_modules_explicit_en[] = { +		&cmper->lcdclkctrl, +		&cmper->lcdcclkstctrl, +		&cmper->epwmss0clkctrl, +		0 +	}; +	do_enable_clocks(clk_domains, clk_modules_explicit_en, 1); +	writel(0x0, &cmdpll->clklcdcpixelclk); + +	do_setup_dpll(&dpll_lcd_regs, &dpll_lcd); + +	return 0; +} + +static int board_video_init(void) +{ +	/* set 300 MHz */ +	conf_disp_pll(25, 2); +	if (factory_dat.pxm50) +		da8xx_video_init(&lcd_panels[0], &lcd_cfg, lcd_cfg.bpp); +	else +		da8xx_video_init(&lcd_panels[1], &lcd_cfg, lcd_cfg.bpp); + +	enable_pwm(); +	enable_backlight(); + +	return 0; +} +#endif +#include "../common/board.c" diff --git a/board/siemens/pxm2/board.h b/board/siemens/pxm2/board.h new file mode 100644 index 000000000..03626129d --- /dev/null +++ b/board/siemens/pxm2/board.h @@ -0,0 +1,22 @@ +/* + * board.h + * + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * TI AM335x boards information header + * u-boot:/board/ti/am335x/board.h + * + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +void enable_uart0_pin_mux(void); +void enable_i2c0_pin_mux(void); +void enable_board_pin_mux(void); +#endif diff --git a/board/siemens/pxm2/mux.c b/board/siemens/pxm2/mux.c new file mode 100644 index 000000000..c64b0d23d --- /dev/null +++ b/board/siemens/pxm2/mux.c @@ -0,0 +1,186 @@ +/* + * pinmux setup for siemens pxm2 board + * + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * u-boot:/board/ti/am335x/mux.c + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * 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> +#include <i2c.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 */ +	{OFFSET(nnmi), (MODE(0) | PULLUP_EN | RXACTIVE)},	/* UART0_TXD */ +	{-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 */ +	{OFFSET(gpmc_a11), MODE(7) | RXACTIVE | PULLUP_EN}, /* RGMII2_RD0 */ +	{OFFSET(mcasp0_ahclkx), MODE(7) | PULLUDEN},	/* MCASP0_AHCLKX */ +	{-1}, +}; +#endif + +static struct module_pin_mux i2c0_pin_mux[] = { +	{OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)}, +	{OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)}, +	{-1}, +}; + +static struct module_pin_mux i2c1_pin_mux[] = { +	{OFFSET(spi0_d1), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, +	{OFFSET(spi0_cs0), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, +	{-1}, +}; + +#ifndef CONFIG_NO_ETH +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 rgmii2_pin_mux[] = { +	{OFFSET(gpmc_a0), MODE(2)},			/* RGMII2_TCTL */ +	{OFFSET(gpmc_a1), MODE(2) | RXACTIVE},		/* RGMII2_RCTL */ +	{OFFSET(gpmc_a2), MODE(2)},			/* RGMII2_TD3 */ +	{OFFSET(gpmc_a3), MODE(2)},			/* RGMII2_TD2 */ +	{OFFSET(gpmc_a4), MODE(2)},			/* RGMII2_TD1 */ +	{OFFSET(gpmc_a5), MODE(2)},			/* RGMII2_TD0 */ +	{OFFSET(gpmc_a6), MODE(7)},			/* RGMII2_TCLK */ +	{OFFSET(gpmc_a7), MODE(2) | RXACTIVE},		/* RGMII2_RCLK */ +	{OFFSET(gpmc_a8), MODE(2) | RXACTIVE},		/* RGMII2_RD3 */ +	{OFFSET(gpmc_a9), MODE(7)},			/* RGMII2_RD2 */ +	{OFFSET(gpmc_a10), MODE(2) | RXACTIVE},		/* RGMII2_RD1 */ +	{OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */ +	{OFFSET(mdio_clk), MODE(0) | PULLUP_EN},	/* MDIO_CLK */ +	{-1}, +}; +#endif + +#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(mcasp0_aclkr), (MODE(4) | RXACTIVE)},		/* MMC0_WP */ +	{OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUDEN)},	/* MMC0_CD */ +	{-1}, +}; +#endif + +static struct module_pin_mux lcdc_pin_mux[] = { +	{OFFSET(lcd_data0), (MODE(0) | PULLUDDIS)},	/* LCD_DAT0 */ +	{OFFSET(lcd_data1), (MODE(0) | PULLUDDIS)},	/* LCD_DAT1 */ +	{OFFSET(lcd_data2), (MODE(0) | PULLUDDIS)},	/* LCD_DAT2 */ +	{OFFSET(lcd_data3), (MODE(0) | PULLUDDIS)},	/* LCD_DAT3 */ +	{OFFSET(lcd_data4), (MODE(0) | PULLUDDIS)},	/* LCD_DAT4 */ +	{OFFSET(lcd_data5), (MODE(0) | PULLUDDIS)},	/* LCD_DAT5 */ +	{OFFSET(lcd_data6), (MODE(0) | PULLUDDIS)},	/* LCD_DAT6 */ +	{OFFSET(lcd_data7), (MODE(0) | PULLUDDIS)},	/* LCD_DAT7 */ +	{OFFSET(lcd_data8), (MODE(0) | PULLUDDIS)},	/* LCD_DAT8 */ +	{OFFSET(lcd_data9), (MODE(0) | PULLUDDIS)},	/* LCD_DAT9 */ +	{OFFSET(lcd_data10), (MODE(0) | PULLUDDIS)},	/* LCD_DAT10 */ +	{OFFSET(lcd_data11), (MODE(0) | PULLUDDIS)},	/* LCD_DAT11 */ +	{OFFSET(lcd_data12), (MODE(0) | PULLUDDIS)},	/* LCD_DAT12 */ +	{OFFSET(lcd_data13), (MODE(0) | PULLUDDIS)},	/* LCD_DAT13 */ +	{OFFSET(lcd_data14), (MODE(0) | PULLUDDIS)},	/* LCD_DAT14 */ +	{OFFSET(lcd_data15), (MODE(0) | PULLUDDIS)},	/* LCD_DAT15 */ +	{OFFSET(gpmc_ad8), (MODE(1))},			/* LCD_DAT16 */ +	{OFFSET(gpmc_ad9), (MODE(1))},		/* LCD_DAT17 */ +	{OFFSET(gpmc_ad10), (MODE(1))},		/* LCD_DAT18 */ +	{OFFSET(gpmc_ad11), (MODE(1))},		/* LCD_DAT19 */ +	{OFFSET(gpmc_ad12), (MODE(1))},		/* LCD_DAT20 */ +	{OFFSET(gpmc_ad13), (MODE(1))},		/* LCD_DAT21 */ +	{OFFSET(gpmc_ad14), (MODE(1))},		/* LCD_DAT22 */ +	{OFFSET(gpmc_ad15), (MODE(1))},		/* LCD_DAT23 */ +	{OFFSET(lcd_vsync), (MODE(0))},		/* LCD_VSYNC */ +	{OFFSET(lcd_hsync), (MODE(0))},		/* LCD_HSYNC */ +	{OFFSET(lcd_pclk), (MODE(0))},		/* LCD_PCLK */ +	{OFFSET(lcd_ac_bias_en), (MODE(0))},	/* LCD_AC_BIAS_EN */ +	{-1}, +}; + +static struct module_pin_mux ecap0_pin_mux[] = { +	{OFFSET(ecap0_in_pwm0_out), (MODE(0))}, +	{-1}, +}; + +static struct module_pin_mux gpio_pin_mux[] = { +	{OFFSET(mcasp0_fsx), MODE(7)}, /* GPIO3_15 LCD power*/ +	{OFFSET(mcasp0_axr0), MODE(7)}, /* GPIO3_16 Backlight */ +	{OFFSET(gpmc_a9), MODE(7)}, /* GPIO1_25 Touch power */ +	{-1}, +}; +void enable_i2c0_pin_mux(void) +{ +	configure_module_pin_mux(i2c0_pin_mux); +} + +void enable_uart0_pin_mux(void) +{ +	configure_module_pin_mux(uart0_pin_mux); +} + +void enable_board_pin_mux(void) +{ +	configure_module_pin_mux(uart0_pin_mux); +	configure_module_pin_mux(i2c1_pin_mux); +#ifdef CONFIG_NAND +	configure_module_pin_mux(nand_pin_mux); +#endif +#ifndef CONFIG_NO_ETH +	configure_module_pin_mux(rgmii1_pin_mux); +	configure_module_pin_mux(rgmii2_pin_mux); +#endif +#ifdef CONFIG_MMC +	configure_module_pin_mux(mmc0_pin_mux); +#endif +	configure_module_pin_mux(lcdc_pin_mux); +	configure_module_pin_mux(gpio_pin_mux); +	configure_module_pin_mux(ecap0_pin_mux); +} diff --git a/board/siemens/pxm2/pmic.h b/board/siemens/pxm2/pmic.h new file mode 100644 index 000000000..c6347e512 --- /dev/null +++ b/board/siemens/pxm2/pmic.h @@ -0,0 +1,71 @@ +/* + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * SPDX-License-Identifier:	GPL-2.0+ + */ +#ifndef PMIC_H +#define PMIC_H + +/* + * The PMIC on this board is a TPS65910. + */ + +#define PMIC_SR_I2C_ADDR		0x12 +#define PMIC_CTRL_I2C_ADDR		0x2D +/* PMIC Register offsets */ +#define PMIC_VDD1_REG			0x21 +#define PMIC_VDD1_OP_REG		0x22 +#define PMIC_VDD2_REG			0x24 +#define PMIC_VDD2_OP_REG		0x25 +#define PMIC_DEVCTRL_REG		0x3f + +/* VDD2 & VDD1 control register (VDD2_REG & VDD1_REG) */ +#define PMIC_VGAIN_SEL_MASK		(0x3 << 6) +#define PMIC_ILMAX_MASK			(0x1 << 5) +#define PMIC_TSTEP_MASK			(0x7 << 2) +#define PMIC_ST_MASK			(0x3) + +#define PMIC_REG_VGAIN_SEL_X1		(0x0 << 6) +#define PMIC_REG_VGAIN_SEL_X1_0		(0x1 << 6) +#define PMIC_REG_VGAIN_SEL_X3		(0x2 << 6) +#define PMIC_REG_VGAIN_SEL_X4		(0x3 << 6) + +#define PMIC_REG_ILMAX_1_0_A		(0x0 << 5) +#define PMIC_REG_ILMAX_1_5_A		(0x1 << 5) + +#define PMIC_REG_TSTEP_			(0x0 << 2) +#define PMIC_REG_TSTEP_12_5		(0x1 << 2) +#define PMIC_REG_TSTEP_9_4		(0x2 << 2) +#define PMIC_REG_TSTEP_7_5		(0x3 << 2) +#define PMIC_REG_TSTEP_6_25		(0x4 << 2) +#define PMIC_REG_TSTEP_4_7		(0x5 << 2) +#define PMIC_REG_TSTEP_3_12		(0x6 << 2) +#define PMIC_REG_TSTEP_2_5		(0x7 << 2) + +#define PMIC_REG_ST_OFF			(0x0) +#define PMIC_REG_ST_ON_HI_POW		(0x1) +#define PMIC_REG_ST_OFF_1		(0x2) +#define PMIC_REG_ST_ON_LOW_POW		(0x3) + + +/* VDD2 & VDD1 voltage selection register. (VDD2_OP_REG & VDD1_OP_REG) */ +#define PMIC_OP_REG_SEL				(0x7F) + +#define PMIC_OP_REG_CMD_MASK			(0x1 << 7) +#define PMIC_OP_REG_CMD_OP			(0x0 << 7) +#define PMIC_OP_REG_CMD_SR			(0x1 << 7) + +#define PMIC_OP_REG_SEL_MASK			(0x7F) +#define PMIC_OP_REG_SEL_1_1_3			(0x2E)	/* 1.1375 V */ +#define PMIC_OP_REG_SEL_1_2_6			(0x38)	/* 1.2625 V */ + +/* Device control register . (DEVCTRL_REG) */ +#define PMIC_DEVCTRL_REG_SR_CTL_I2C_MASK	(0x1 << 4) +#define PMIC_DEVCTRL_REG_SR_CTL_I2C_SEL_SR_I2C	(0x0 << 4) +#define PMIC_DEVCTRL_REG_SR_CTL_I2C_SEL_CTL_I2C	(0x1 << 4) + +#endif diff --git a/board/siemens/rut/Makefile b/board/siemens/rut/Makefile new file mode 100644 index 000000000..a09b467d5 --- /dev/null +++ b/board/siemens/rut/Makefile @@ -0,0 +1,49 @@ +# +# Makefile +# +# (C) Copyright 2013 Siemens Schweiz AG +# (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. +# +# Based on: +# u-boot:/board/ti/am335x/Makefile +# Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ +# +# SPDX-License-Identifier:	GPL-2.0+ +# + +include $(TOPDIR)/config.mk +ifneq ($(OBJTREE),$(SRCTREE)) +$(shell mkdir -p $(obj)../common) +endif + +LIB	= $(obj)lib$(BOARD).o + +ifdef CONFIG_SPL_BUILD +COBJS	:= mux.o +endif + +COBJS	+= board.o +ifndef CONFIG_SPL_BUILD +COBJS += ../common/factoryset.o +endif +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(call cmd_link_o_target, $(OBJS) $(SOBJS)) + +clean: +	rm -f $(SOBJS) $(OBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak $(obj).depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/siemens/rut/board.c b/board/siemens/rut/board.c new file mode 100644 index 000000000..f2b047681 --- /dev/null +++ b/board/siemens/rut/board.c @@ -0,0 +1,432 @@ +/* + * Board functions for TI AM335X based rut board + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * u-boot:/board/ti/am335x/board.c + * + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <common.h> +#include <errno.h> +#include <spi.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 <video.h> +#include <watchdog.h> +#include "board.h" +#include "../common/factoryset.h" +#include "../../../drivers/video/da8xx-fb.h" + +DECLARE_GLOBAL_DATA_PTR; + +/* + * Read header information from EEPROM into global structure. + */ +static int read_eeprom(void) +{ +	return 0; +} + +#ifdef CONFIG_SPL_BUILD +static void board_init_ddr(void) +{ +struct emif_regs rut_ddr3_emif_reg_data = { +	.sdram_config = 0x61C04AB2, +	.sdram_tim1 = 0x0888A39B, +	.sdram_tim2 = 0x26337FDA, +	.sdram_tim3 = 0x501F830F, +	.emif_ddr_phy_ctlr_1 = 0x6, +	.zq_config = 0x50074BE4, +	.ref_ctrl = 0x93B, +}; + +struct ddr_data rut_ddr3_data = { +	.datardsratio0 = 0x3b, +	.datawdsratio0 = 0x85, +	.datafwsratio0 = 0x100, +	.datawrsratio0 = 0xc1, +	.datauserank0delay = 1, +	.datadldiff0 = PHY_DLL_LOCK_DIFF, +}; + +struct cmd_control rut_ddr3_cmd_ctrl_data = { +	.cmd0csratio = 0x40, +	.cmd0dldiff = 0, +	.cmd0iclkout = 1, +	.cmd1csratio = 0x40, +	.cmd1dldiff = 0, +	.cmd1iclkout = 1, +	.cmd2csratio = 0x40, +	.cmd2dldiff = 0, +	.cmd2iclkout = 1, +}; + +	config_ddr(DDR_PLL_FREQ, RUT_IOCTRL_VAL, &rut_ddr3_data, +		   &rut_ddr3_cmd_ctrl_data, &rut_ddr3_emif_reg_data, 0); +} + +static void spl_siemens_board_init(void) +{ +	return; +} +#endif /* if def CONFIG_SPL_BUILD */ + +#if defined(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_id		= 1, +		.phy_if		= PHY_INTERFACE_MODE_RMII, +	}, +	{ +		.slave_reg_ofs	= 0x308, +		.sliver_reg_ofs	= 0xdc0, +		.phy_id		= 0, +		.phy_if		= PHY_INTERFACE_MODE_RMII, +	}, +}; + +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, +}; + +#if defined(CONFIG_DRIVER_TI_CPSW) || \ +	(defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET)) +int board_eth_init(bd_t *bis) +{ +	struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE; +	int n = 0; +	int rv; + +#ifndef CONFIG_SPL_BUILD +	factoryset_setenv(); +#endif + +	/* Set rgmii mode and enable rmii clock to be sourced from chip */ +	writel((RMII_MODE_ENABLE | RMII_CHIPCKL_ENABLE), &cdev->miisel); + +	rv = cpsw_register(&cpsw_data); +	if (rv < 0) +		printf("Error %d registering CPSW switch\n", rv); +	else +		n += rv; +	return n; +} +#endif /* #if defined(CONFIG_DRIVER_TI_CPSW) */ +#endif /* #if (defined(CONFIG_DRIVER_TI_CPSW) && !defined(CONFIG_SPL_BUILD)) */ + +#if defined(CONFIG_HW_WATCHDOG) +static bool hw_watchdog_init_done; +static int  hw_watchdog_trigger_level; + +void hw_watchdog_reset(void) +{ +	if (!hw_watchdog_init_done) +		return; + +	hw_watchdog_trigger_level = hw_watchdog_trigger_level ? 0 : 1; +	gpio_set_value(WATCHDOG_TRIGGER_GPIO, hw_watchdog_trigger_level); +} + +void hw_watchdog_init(void) +{ +	gpio_request(WATCHDOG_TRIGGER_GPIO, "watchdog_trigger"); +	gpio_direction_output(WATCHDOG_TRIGGER_GPIO, hw_watchdog_trigger_level); + +	hw_watchdog_reset(); + +	hw_watchdog_init_done = 1; +} +#endif /* defined(CONFIG_HW_WATCHDOG) */ + +#if defined(CONFIG_VIDEO) && !defined(CONFIG_SPL_BUILD) +static struct da8xx_panel lcd_panels[] = { +	/* FORMIKE, 4.3", 480x800, KWH043MC17-F01 */ +	[0] = { +		.name   = "KWH043MC17-F01", +		.width  = 480, +		.height = 800, +		.hfp = 50,              /* no spec, "don't care" values */ +		.hbp = 50, +		.hsw = 50, +		.vfp = 50, +		.vbp = 50, +		.vsw = 50, +		.pxl_clk = 35910000,    /* tCYCD=20ns, max 50MHz, 60fps */ +		.invert_pxl_clk = 1, +	}, +	/* FORMIKE, 4.3", 480x800, KWH043ST20-F01 */ +	[1] = { +		.name   = "KWH043ST20-F01", +		.width  = 480, +		.height = 800, +		.hfp = 50,              /* no spec, "don't care" values */ +		.hbp = 50, +		.hsw = 50, +		.vfp = 50, +		.vbp = 50, +		.vsw = 50, +		.pxl_clk = 35910000,    /* tCYCD=20ns, max 50MHz, 60fps */ +		.invert_pxl_clk = 1, +	}, +	/* Multi-Inno, 4.3", 480x800, MI0430VT-1 */ +	[2] = { +		.name   = "MI0430VT-1", +		.width  = 480, +		.height = 800, +		.hfp = 50,              /* no spec, "don't care" values */ +		.hbp = 50, +		.hsw = 50, +		.vfp = 50, +		.vbp = 50, +		.vsw = 50, +		.pxl_clk = 35910000,    /* tCYCD=20ns, max 50MHz, 60fps */ +		.invert_pxl_clk = 1, +	}, +}; + +static const struct display_panel disp_panels[] = { +	[0] = { +		WVGA, +		16,	/* RGB 888 */ +		16, +		COLOR_ACTIVE, +	}, +	[1] = { +		WVGA, +		16,	/* RGB 888 */ +		16, +		COLOR_ACTIVE, +	}, +	[2] = { +		WVGA, +		24,	/* RGB 888 */ +		16, +		COLOR_ACTIVE, +	}, +}; + +static const struct lcd_ctrl_config lcd_cfgs[] = { +	[0] = { +		&disp_panels[0], +		.ac_bias		= 255, +		.ac_bias_intrpt		= 0, +		.dma_burst_sz		= 16, +		.bpp			= 16, +		.fdd			= 0x80, +		.tft_alt_mode		= 0, +		.stn_565_mode		= 0, +		.mono_8bit_mode		= 0, +		.invert_line_clock	= 1, +		.invert_frm_clock	= 1, +		.sync_edge		= 0, +		.sync_ctrl		= 1, +		.raster_order		= 0, +	}, +	[1] = { +		&disp_panels[1], +		.ac_bias		= 255, +		.ac_bias_intrpt		= 0, +		.dma_burst_sz		= 16, +		.bpp			= 16, +		.fdd			= 0x80, +		.tft_alt_mode		= 0, +		.stn_565_mode		= 0, +		.mono_8bit_mode		= 0, +		.invert_line_clock	= 1, +		.invert_frm_clock	= 1, +		.sync_edge		= 0, +		.sync_ctrl		= 1, +		.raster_order		= 0, +	}, +	[2] = { +		&disp_panels[2], +		.ac_bias		= 255, +		.ac_bias_intrpt		= 0, +		.dma_burst_sz		= 16, +		.bpp			= 24, +		.fdd			= 0x80, +		.tft_alt_mode		= 0, +		.stn_565_mode		= 0, +		.mono_8bit_mode		= 0, +		.invert_line_clock	= 1, +		.invert_frm_clock	= 1, +		.sync_edge		= 0, +		.sync_ctrl		= 1, +		.raster_order		= 0, +	}, + +}; + +/* no console on this board */ +int board_cfb_skip(void) +{ +	return 1; +} + +#define PLL_GET_M(v) ((v >> 8) & 0x7ff) +#define PLL_GET_N(v) (v & 0x7f) + +static struct dpll_regs dpll_lcd_regs = { +	.cm_clkmode_dpll = CM_WKUP + 0x98, +	.cm_idlest_dpll = CM_WKUP + 0x48, +	.cm_clksel_dpll = CM_WKUP + 0x54, +}; + +static int get_clk(struct dpll_regs *dpll_regs) +{ +	unsigned int val; +	unsigned int m, n; +	int f = 0; + +	val = readl(dpll_regs->cm_clksel_dpll); +	m = PLL_GET_M(val); +	n = PLL_GET_N(val); +	f = (m * V_OSCK) / n; + +	return f; +}; + + + +int clk_get(int clk) +{ +	return get_clk(&dpll_lcd_regs); +}; + +static int conf_disp_pll(int m, int n) +{ +	struct cm_perpll *cmper = (struct cm_perpll *)CM_PER; +	struct cm_dpll *cmdpll = (struct cm_dpll *)CM_DPLL; +	struct dpll_params dpll_lcd = {m, n, -1, -1, -1, -1, -1}; +#if defined(DISPL_PLL_SPREAD_SPECTRUM) +	struct cm_wkuppll *cmwkup = (struct cm_wkuppll *)CM_WKUP; +#endif + +	u32 *const clk_domains[] = { +		&cmper->lcdclkctrl, +		0 +	}; +	u32 *const clk_modules_explicit_en[] = { +		&cmper->lcdclkctrl, +		&cmper->lcdcclkstctrl, +		&cmper->spi1clkctrl, +		0 +	}; +	do_enable_clocks(clk_domains, clk_modules_explicit_en, 1); +	/* 0x44e0_0500 write lcdc pixel clock mux Linux hat hier 0 */ +	writel(0x0, &cmdpll->clklcdcpixelclk); + +	do_setup_dpll(&dpll_lcd_regs, &dpll_lcd); + +#if defined(DISPL_PLL_SPREAD_SPECTRUM) +	writel(0x64, &cmwkup->resv6[3]); /* 0x50 */ +	writel(0x800, &cmwkup->resv6[2]); /* 0x4c */ +	writel(readl(&cmwkup->clkmoddplldisp) | (1 << 12), +	       &cmwkup->clkmoddplldisp); /* 0x98 */ +#endif +	return 0; +} + +static int set_gpio(int gpio, int state) +{ +	gpio_request(gpio, "temp"); +	gpio_direction_output(gpio, state); +	gpio_set_value(gpio, state); +	gpio_free(gpio); +	return 0; +} + +static int enable_lcd(void) +{ +	unsigned char buf[1]; + +	set_gpio(BOARD_LCD_RESET, 1); + +	/* spi lcd init */ +	kwh043st20_f01_spi_startup(1, 0, 5000000, SPI_MODE_3); + +	/* backlight on */ +	buf[0] = 0xf; +	i2c_write(0x24, 0x7, 1, buf, 1); +	buf[0] = 0x3f; +	i2c_write(0x24, 0x8, 1, buf, 1); +	return 0; +} + +int arch_early_init_r(void) +{ +	enable_lcd(); +	return 0; +} + +static int board_video_init(void) +{ +	int i; +	int anzdisp = ARRAY_SIZE(lcd_panels); +	int display = 1; + +	for (i = 0; i < anzdisp; i++) { +		if (strncmp((const char *)factory_dat.disp_name, +			    lcd_panels[i].name, +		    strlen((const char *)factory_dat.disp_name)) == 0) { +			printf("DISPLAY: %s\n", factory_dat.disp_name); +			break; +		} +	} +	if (i == anzdisp) { +		i = 1; +		printf("%s: %s not found, using default %s\n", __func__, +		       factory_dat.disp_name, lcd_panels[i].name); +	} +	conf_disp_pll(25, 2); +	da8xx_video_init(&lcd_panels[display], &lcd_cfgs[display], +			 lcd_cfgs[display].bpp); + +	return 0; +} + + +#endif /* ifdef CONFIG_VIDEO */ +#include "../common/board.c" diff --git a/board/siemens/rut/board.h b/board/siemens/rut/board.h new file mode 100644 index 000000000..03626129d --- /dev/null +++ b/board/siemens/rut/board.h @@ -0,0 +1,22 @@ +/* + * board.h + * + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * TI AM335x boards information header + * u-boot:/board/ti/am335x/board.h + * + * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/ + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +void enable_uart0_pin_mux(void); +void enable_i2c0_pin_mux(void); +void enable_board_pin_mux(void); +#endif diff --git a/board/siemens/rut/mux.c b/board/siemens/rut/mux.c new file mode 100644 index 000000000..1eced013c --- /dev/null +++ b/board/siemens/rut/mux.c @@ -0,0 +1,347 @@ +/* + * pinmux setup for siemens rut board + * + * (C) Copyright 2013 Siemens Schweiz AG + * (C) Heiko Schocher, DENX Software Engineering, hs@denx.de. + * + * Based on: + * u-boot:/board/ti/am335x/mux.c + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * 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> +#include <i2c.h> + +static struct module_pin_mux uart0_pin_mux[] = { +	{OFFSET(uart0_rxd), (MODE(0) | PULLUDDIS | RXACTIVE)},	/* UART0_RXD */ +	{OFFSET(uart0_txd), (MODE(0) | PULLUDDIS)},		/* UART0_TXD */ +	{-1}, +}; + +static struct module_pin_mux ddr_pin_mux[] = { +	{OFFSET(ddr_resetn), (MODE(0))}, +	{OFFSET(ddr_csn0), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_ck), (MODE(0))}, +	{OFFSET(ddr_nck), (MODE(0))}, +	{OFFSET(ddr_casn), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_rasn), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_wen), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_ba0), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_ba1), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_ba2), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a0), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a1), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a2), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a3), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a4), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a5), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a6), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a7), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a8), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a9), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a10), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a11), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a12), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a13), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a14), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_a15), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_odt), (MODE(0))}, +	{OFFSET(ddr_d0), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d1), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d2), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d3), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d4), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d5), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d6), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d7), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d8), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d9), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d10), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d11), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d12), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d13), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d14), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_d15), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_dqm0), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_dqm1), (MODE(0) | PULLUP_EN)}, +	{OFFSET(ddr_dqs0), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_dqsn0), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(ddr_dqs1), (MODE(0) | RXACTIVE)}, +	{OFFSET(ddr_dqsn1), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(ddr_vref), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ddr_vtp), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux lcd_pin_mux[] = { +	{OFFSET(gpmc_ad8), (MODE(1))}, +	{OFFSET(gpmc_ad9), (MODE(1))}, +	{OFFSET(gpmc_ad10), (MODE(1))}, +	{OFFSET(gpmc_ad11), (MODE(1))}, +	{OFFSET(gpmc_ad12), (MODE(1))}, +	{OFFSET(gpmc_ad13), (MODE(1))}, +	{OFFSET(gpmc_ad14), (MODE(1))}, +	{OFFSET(gpmc_ad15), (MODE(1))}, +	{OFFSET(lcd_data0), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data1), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data2), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data3), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data4), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data5), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data6), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data7), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data8), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data9), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data10), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data11), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data12), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data13), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data14), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_data15), (MODE(0) | PULLUDDIS)}, +	{OFFSET(lcd_vsync), (MODE(0))}, +	{OFFSET(lcd_hsync), (MODE(0))}, +	{OFFSET(lcd_pclk), (MODE(0))}, +	{OFFSET(lcd_ac_bias_en), (MODE(0))}, +	{-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 mii_pin_mux[] = { +	{OFFSET(mii1_crs), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxerr), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_txen), (MODE(1))}, +	{OFFSET(mii1_txd1), (MODE(1))}, +	{OFFSET(mii1_txd0), (MODE(1))}, +	{OFFSET(mii1_rxd1), (MODE(1) | RXACTIVE)}, +	{OFFSET(mii1_rxd0), (MODE(1) | RXACTIVE)}, +	{OFFSET(rmii1_refclk), (MODE(0) | RXACTIVE)}, +	{OFFSET(mdio_data), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(mdio_clk), (MODE(0) | PULLUP_EN)}, +	{-1}, +}; + +static struct module_pin_mux gpio_pin_mux[] = { +	{OFFSET(mii1_col), (MODE(7) | RXACTIVE)}, +	{OFFSET(uart1_ctsn), (MODE(7) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(uart1_rtsn), (MODE(7) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(uart1_rxd), (MODE(7) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(uart1_txd), (MODE(7) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(mii1_rxdv), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_txd3), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_txd2), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_txclk), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_rxclk), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_rxd3), (MODE(7) | RXACTIVE)}, +	{OFFSET(mii1_rxd2), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a0), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a1), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a4), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a5), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a6), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a7), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a8), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a9), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a10), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_a11), (MODE(7) | RXACTIVE)}, +	{OFFSET(gpmc_wpn), (MODE(7) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(gpmc_be1n), (MODE(7) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(gpmc_csn1), (MODE(7) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(gpmc_csn2), (MODE(7) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(gpmc_csn3), (MODE(7) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(mcasp0_aclkr), (MODE(7) | RXACTIVE)}, +	{OFFSET(mcasp0_fsr), (MODE(7))}, +	{OFFSET(mcasp0_axr1), (MODE(7) | RXACTIVE)}, +	{OFFSET(mcasp0_ahclkx), (MODE(7) | RXACTIVE)}, +	{OFFSET(xdma_event_intr0), (MODE(7) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(xdma_event_intr1), (MODE(7) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux i2c0_pin_mux[] = { +	{OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux i2c1_pin_mux[] = { +	{OFFSET(uart0_ctsn), (MODE(3) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(uart0_rtsn), (MODE(3) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux usb0_pin_mux[] = { +	{OFFSET(usb0_dm), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb0_dp), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb0_ce), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb0_id), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb0_vbus), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb0_drvvbus), (MODE(0))}, +	{-1}, +}; + +static struct module_pin_mux usb1_pin_mux[] = { +	{OFFSET(usb1_dm), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb1_dp), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb1_ce), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb1_id), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb1_vbus), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(usb1_drvvbus), (MODE(0))}, +	{-1}, +}; + +static struct module_pin_mux spi0_pin_mux[] = { +	{OFFSET(spi0_sclk), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(spi0_d0), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(spi0_d1), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(spi0_cs0), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(spi0_cs1), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux spi1_pin_mux[] = { +	{OFFSET(mcasp0_aclkx), (MODE(3) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(mcasp0_fsx), (MODE(3) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(mcasp0_axr0), (MODE(3) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(mcasp0_ahclkr), (MODE(3) | RXACTIVE | PULLUP_EN)}, +	{-1}, +}; + +static struct module_pin_mux jtag_pin_mux[] = { +	{OFFSET(tms), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(tdi), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(tdo), (MODE(0) | PULLUP_EN)}, +	{OFFSET(tck), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(ntrst), (MODE(0) | RXACTIVE)}, +	{-1}, +}; + +static struct module_pin_mux nand_pin_mux[] = { +	{OFFSET(gpmc_ad0), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad1), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad2), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad3), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad4), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad5), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad6), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_ad7), (MODE(0) | RXACTIVE)}, +	{OFFSET(gpmc_advn_ale), (MODE(0) | PULLUP_EN)}, +	{OFFSET(gpmc_be0n_cle), (MODE(0) | PULLUP_EN)}, +	{OFFSET(gpmc_csn0), (MODE(0) | PULLUP_EN)}, +	{OFFSET(gpmc_oen_ren), (MODE(0) | PULLUP_EN)}, +	{OFFSET(gpmc_wen), (MODE(0) | PULLUP_EN)}, +	{-1}, +}; + +static struct module_pin_mux ainx_pin_mux[] = { +	{OFFSET(ain7), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain6), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain5), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain4), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain3), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain2), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain1), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ain0), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux rtc_pin_mux[] = { +	{OFFSET(osc1_in), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(osc1_out), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(rtc_porz), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(enz_kaldo_1p8v), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux gpmc_pin_mux[] = { +	{OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(gpmc_clk), (MODE(0) | RXACTIVE)}, +	{-1}, +}; + +static struct module_pin_mux pmic_pin_mux[] = { +	{OFFSET(pmic_power_en), (MODE(0) | PULLUP_EN)}, +	{-1}, +}; + +static struct module_pin_mux osc_pin_mux[] = { +	{OFFSET(osc0_in), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(osc0_out), (MODE(0) | PULLUP_EN)}, +	{-1}, +}; + +static struct module_pin_mux pwm_pin_mux[] = { +	{OFFSET(ecap0_in_pwm0_out), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(gpmc_a2), (MODE(6))}, +	{OFFSET(gpmc_a3), (MODE(6))}, +	{-1}, +}; + +static struct module_pin_mux emu_pin_mux[] = { +	{OFFSET(emu0), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{OFFSET(emu1), (MODE(0) | RXACTIVE | PULLUP_EN)}, +	{-1}, +}; + +static struct module_pin_mux vref_pin_mux[] = { +	{OFFSET(vrefp), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(vrefn), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{-1}, +}; + +static struct module_pin_mux misc_pin_mux[] = { +	{OFFSET(porz), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(nnmi), (MODE(0) | RXACTIVE | PULLUDDIS)}, +	{OFFSET(ext_wakeup), (MODE(0) | RXACTIVE)}, +	{-1}, +}; + +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(void) +{ +	configure_module_pin_mux(ddr_pin_mux); +	configure_module_pin_mux(lcd_pin_mux); +	configure_module_pin_mux(mmc0_pin_mux); +	configure_module_pin_mux(mii_pin_mux); +	configure_module_pin_mux(gpio_pin_mux); +	configure_module_pin_mux(i2c1_pin_mux); +	configure_module_pin_mux(usb0_pin_mux); +	configure_module_pin_mux(usb1_pin_mux); +	configure_module_pin_mux(spi0_pin_mux); +	configure_module_pin_mux(spi1_pin_mux); +	configure_module_pin_mux(jtag_pin_mux); +	configure_module_pin_mux(nand_pin_mux); +	configure_module_pin_mux(ainx_pin_mux); +	configure_module_pin_mux(rtc_pin_mux); +	configure_module_pin_mux(gpmc_pin_mux); +	configure_module_pin_mux(pmic_pin_mux); +	configure_module_pin_mux(osc_pin_mux); +	configure_module_pin_mux(pwm_pin_mux); +	configure_module_pin_mux(emu_pin_mux); +	configure_module_pin_mux(vref_pin_mux); +	configure_module_pin_mux(misc_pin_mux); +} |