xref: /openbmc/u-boot/board/alliedtelesis/x530/x530.c (revision f49929772c5ea22e4af987bfb1e5ae13e9895093)
10e31666dSChris Packham // SPDX-License-Identifier: GPL-2.0+
20e31666dSChris Packham /*
30e31666dSChris Packham  * Copyright (C) 2017 Allied Telesis Labs
40e31666dSChris Packham  */
50e31666dSChris Packham 
60e31666dSChris Packham #include <common.h>
70e31666dSChris Packham #include <command.h>
80e31666dSChris Packham #include <dm.h>
90e31666dSChris Packham #include <i2c.h>
100e31666dSChris Packham #include <asm/gpio.h>
110e31666dSChris Packham #include <linux/mbus.h>
120e31666dSChris Packham #include <linux/io.h>
130e31666dSChris Packham #include <asm/arch/cpu.h>
140e31666dSChris Packham #include <asm/arch/soc.h>
150e31666dSChris Packham #include "../common/gpio_hog.h"
160e31666dSChris Packham 
170e31666dSChris Packham #include "../drivers/ddr/marvell/a38x/ddr3_init.h"
180e31666dSChris Packham #include <../serdes/a38x/high_speed_env_spec.h>
190e31666dSChris Packham 
200e31666dSChris Packham DECLARE_GLOBAL_DATA_PTR;
210e31666dSChris Packham 
220e31666dSChris Packham #define MVEBU_DEV_BUS_BASE		(MVEBU_REGISTER(0x10400))
230e31666dSChris Packham 
240e31666dSChris Packham #define CONFIG_NVS_LOCATION		0xf4800000
250e31666dSChris Packham #define CONFIG_NVS_SIZE			(512 << 10)
260e31666dSChris Packham 
270e31666dSChris Packham static struct serdes_map board_serdes_map[] = {
280e31666dSChris Packham 	{PEX0, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
290e31666dSChris Packham 	{DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
300e31666dSChris Packham 	{PEX1, SERDES_SPEED_5_GBPS, PEX_ROOT_COMPLEX_X1, 0, 0},
310e31666dSChris Packham 	{DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
320e31666dSChris Packham 	{DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0},
330e31666dSChris Packham 	{DEFAULT_SERDES, SERDES_SPEED_5_GBPS, SERDES_DEFAULT_MODE, 0, 0}
340e31666dSChris Packham };
350e31666dSChris Packham 
hws_board_topology_load(struct serdes_map ** serdes_map_array,u8 * count)360e31666dSChris Packham int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
370e31666dSChris Packham {
380e31666dSChris Packham 	*serdes_map_array = board_serdes_map;
390e31666dSChris Packham 	*count = ARRAY_SIZE(board_serdes_map);
400e31666dSChris Packham 	return 0;
410e31666dSChris Packham }
420e31666dSChris Packham 
430e31666dSChris Packham /*
440e31666dSChris Packham  * Define the DDR layout / topology here in the board file. This will
450e31666dSChris Packham  * be used by the DDR3 init code in the SPL U-Boot version to configure
460e31666dSChris Packham  * the DDR3 controller.
470e31666dSChris Packham  */
480e31666dSChris Packham static struct mv_ddr_topology_map board_topology_map = {
490e31666dSChris Packham 	DEBUG_LEVEL_ERROR,
500e31666dSChris Packham 	0x1, /* active interfaces */
510e31666dSChris Packham 	/* cs_mask, mirror, dqs_swap, ck_swap X PUPs */
520e31666dSChris Packham 	{ { { {0x1, 0, 0, 0},
530e31666dSChris Packham 	      {0x1, 0, 0, 0},
540e31666dSChris Packham 	      {0x1, 0, 0, 0},
550e31666dSChris Packham 	      {0x1, 0, 0, 0},
560e31666dSChris Packham 	      {0x1, 0, 0, 0} },
570e31666dSChris Packham 	    SPEED_BIN_DDR_1866M,	/* speed_bin */
580e31666dSChris Packham 	    MV_DDR_DEV_WIDTH_16BIT,	/* sdram device width */
590e31666dSChris Packham 	    MV_DDR_DIE_CAP_4GBIT,	/* die capacity */
60*a6ac775bSChris Packham 	    MV_DDR_FREQ_SAR,		/* frequency */
610e31666dSChris Packham 	    0, 0,			/* cas_l cas_wl */
620e31666dSChris Packham 	    MV_DDR_TEMP_LOW,		/* temperature */
630e31666dSChris Packham 	    MV_DDR_TIM_2T} },		/* timing */
640e31666dSChris Packham 	BUS_MASK_32BIT_ECC,		/* subphys mask */
650e31666dSChris Packham 	MV_DDR_CFG_DEFAULT,		/* ddr configuration data source */
660e31666dSChris Packham 	{ {0} },			/* raw spd data */
670e31666dSChris Packham 	{0}				/* timing parameters */
680e31666dSChris Packham };
690e31666dSChris Packham 
mv_ddr_topology_map_get(void)700e31666dSChris Packham struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
710e31666dSChris Packham {
720e31666dSChris Packham 	/* Return the board topology as defined in the board code */
730e31666dSChris Packham 	return &board_topology_map;
740e31666dSChris Packham }
750e31666dSChris Packham 
board_early_init_f(void)760e31666dSChris Packham int board_early_init_f(void)
770e31666dSChris Packham {
780e31666dSChris Packham 	/* Configure MPP */
790e31666dSChris Packham 	writel(0x00001111, MVEBU_MPP_BASE + 0x00);
800e31666dSChris Packham 	writel(0x00000000, MVEBU_MPP_BASE + 0x04);
810e31666dSChris Packham 	writel(0x55000000, MVEBU_MPP_BASE + 0x08);
820e31666dSChris Packham 	writel(0x55550550, MVEBU_MPP_BASE + 0x0c);
830e31666dSChris Packham 	writel(0x55555555, MVEBU_MPP_BASE + 0x10);
840e31666dSChris Packham 	writel(0x00100565, MVEBU_MPP_BASE + 0x14);
850e31666dSChris Packham 	writel(0x40000000, MVEBU_MPP_BASE + 0x18);
860e31666dSChris Packham 	writel(0x00004444, MVEBU_MPP_BASE + 0x1c);
870e31666dSChris Packham 
880e31666dSChris Packham 	return 0;
890e31666dSChris Packham }
900e31666dSChris Packham 
board_init(void)910e31666dSChris Packham int board_init(void)
920e31666dSChris Packham {
930e31666dSChris Packham 	/* address of boot parameters */
940e31666dSChris Packham 	gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100;
950e31666dSChris Packham 
960e31666dSChris Packham 	/* window for NVS */
970e31666dSChris Packham 	mbus_dt_setup_win(&mbus_state, CONFIG_NVS_LOCATION, CONFIG_NVS_SIZE,
980e31666dSChris Packham 			  CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_DEV_CS1);
990e31666dSChris Packham 
1000e31666dSChris Packham 	/* DEV_READYn is not needed for NVS, ignore it when accessing CS1 */
1010e31666dSChris Packham 	writel(0x00004001, MVEBU_DEV_BUS_BASE + 0xc8);
1020e31666dSChris Packham 
1030e31666dSChris Packham 	return 0;
1040e31666dSChris Packham }
1050e31666dSChris Packham 
led_7seg_init(unsigned int segments)1060e31666dSChris Packham static int led_7seg_init(unsigned int segments)
1070e31666dSChris Packham {
1080e31666dSChris Packham 	int node;
1090e31666dSChris Packham 	int ret;
1100e31666dSChris Packham 	int i;
1110e31666dSChris Packham 	struct gpio_desc desc[8];
1120e31666dSChris Packham 
1130e31666dSChris Packham 	node = fdt_node_offset_by_compatible(gd->fdt_blob, 0,
1140e31666dSChris Packham 					     "atl,of-led-7seg");
1150e31666dSChris Packham 	if (node < 0)
1160e31666dSChris Packham 		return -ENODEV;
1170e31666dSChris Packham 
1180e31666dSChris Packham 	ret = gpio_request_list_by_name_nodev(offset_to_ofnode(node),
1190e31666dSChris Packham 					      "segment-gpios", desc,
1200e31666dSChris Packham 					      ARRAY_SIZE(desc), GPIOD_IS_OUT);
1210e31666dSChris Packham 	if (ret < 0)
1220e31666dSChris Packham 		return ret;
1230e31666dSChris Packham 
1240e31666dSChris Packham 	for (i = 0; i < ARRAY_SIZE(desc); i++) {
1250e31666dSChris Packham 		ret = dm_gpio_set_value(&desc[i], !(segments & BIT(i)));
1260e31666dSChris Packham 		if (ret)
1270e31666dSChris Packham 			return ret;
1280e31666dSChris Packham 	}
1290e31666dSChris Packham 
1300e31666dSChris Packham 	return 0;
1310e31666dSChris Packham }
1320e31666dSChris Packham 
1330e31666dSChris Packham #ifdef CONFIG_MISC_INIT_R
misc_init_r(void)1340e31666dSChris Packham int misc_init_r(void)
1350e31666dSChris Packham {
1360e31666dSChris Packham 	static struct gpio_desc usb_en = {}, nand_wp = {}, phy_reset[2] = {},
1370e31666dSChris Packham 				led_en = {};
1380e31666dSChris Packham 
1390e31666dSChris Packham 	gpio_hog(&usb_en, "atl,usb-enable", "enable-gpio", 1);
1400e31666dSChris Packham 	gpio_hog(&nand_wp, "atl,nand-protect", "protect-gpio", 1);
1410e31666dSChris Packham 	gpio_hog_list(phy_reset, ARRAY_SIZE(phy_reset), "atl,phy-reset", "reset-gpio", 0);
1420e31666dSChris Packham 	gpio_hog(&led_en, "atl,led-enable", "enable-gpio", 1);
1430e31666dSChris Packham 
1440e31666dSChris Packham #ifdef MTDPARTS_MTDOOPS
1450e31666dSChris Packham 	env_set("mtdoops", MTDPARTS_MTDOOPS);
1460e31666dSChris Packham #endif
1470e31666dSChris Packham 
1480e31666dSChris Packham 	led_7seg_init(0xff);
1490e31666dSChris Packham 
1500e31666dSChris Packham 	return 0;
1510e31666dSChris Packham }
1520e31666dSChris Packham #endif
1530e31666dSChris Packham 
1540e31666dSChris Packham #ifdef CONFIG_DISPLAY_BOARDINFO
checkboard(void)1550e31666dSChris Packham int checkboard(void)
1560e31666dSChris Packham {
1570e31666dSChris Packham 	puts("Board: " CONFIG_SYS_BOARD "\n");
1580e31666dSChris Packham 
1590e31666dSChris Packham 	return 0;
1600e31666dSChris Packham }
1610e31666dSChris Packham #endif
162