upstream u-boot with additional patches for our devices/boards:
https://lists.denx.de/pipermail/u-boot/2017-March/282789.html (AXP crashes) ;
Gbit ethernet patch for some LIME2 revisions ;
with SPI flash support
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.8 KiB
102 lines
2.8 KiB
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) Marvell International Ltd. and its affiliates
|
|
*/
|
|
|
|
#include "mv_ddr_regs.h"
|
|
#include "mv_ddr_sys_env_lib.h"
|
|
|
|
static u32 mv_ddr_board_id_get(void)
|
|
{
|
|
#if defined(CONFIG_TARGET_DB_88F6820_GP)
|
|
return DB_GP_68XX_ID;
|
|
#else
|
|
/*
|
|
* Return 0 here for custom board as this should not be used
|
|
* for custom boards.
|
|
*/
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
static u32 mv_ddr_board_id_index_get(u32 board_id)
|
|
{
|
|
/*
|
|
* Marvell Boards use 0x10 as base for Board ID:
|
|
* mask MSB to receive index for board ID
|
|
*/
|
|
return board_id & (MARVELL_BOARD_ID_MASK - 1);
|
|
}
|
|
|
|
/*
|
|
* read gpio input for suspend-wakeup indication
|
|
* return indicating suspend wakeup status:
|
|
* 0 - not supported,
|
|
* 1 - supported: read magic word detect wakeup,
|
|
* 2 - detected wakeup from gpio
|
|
*/
|
|
enum suspend_wakeup_status mv_ddr_sys_env_suspend_wakeup_check(void)
|
|
{
|
|
u32 reg, board_id_index, gpio;
|
|
struct board_wakeup_gpio board_gpio[] = MV_BOARD_WAKEUP_GPIO_INFO;
|
|
|
|
board_id_index = mv_ddr_board_id_index_get(mv_ddr_board_id_get());
|
|
if (!(sizeof(board_gpio) / sizeof(struct board_wakeup_gpio) >
|
|
board_id_index)) {
|
|
printf("\n_failed loading Suspend-Wakeup information (invalid board ID)\n");
|
|
return SUSPEND_WAKEUP_DISABLED;
|
|
}
|
|
|
|
/*
|
|
* - Detect if Suspend-Wakeup is supported on current board
|
|
* - Fetch the GPIO number for wakeup status input indication
|
|
*/
|
|
if (board_gpio[board_id_index].gpio_num == -1) {
|
|
/* Suspend to RAM is not supported */
|
|
return SUSPEND_WAKEUP_DISABLED;
|
|
} else if (board_gpio[board_id_index].gpio_num == -2) {
|
|
/*
|
|
* Suspend to RAM is supported but GPIO indication is
|
|
* not implemented - Skip
|
|
*/
|
|
return SUSPEND_WAKEUP_ENABLED;
|
|
} else {
|
|
gpio = board_gpio[board_id_index].gpio_num;
|
|
}
|
|
|
|
/* Initialize MPP for GPIO (set MPP = 0x0) */
|
|
reg = reg_read(MPP_CONTROL_REG(MPP_REG_NUM(gpio)));
|
|
/* reset MPP21 to 0x0, keep rest of MPP settings*/
|
|
reg &= ~MPP_MASK(gpio);
|
|
reg_write(MPP_CONTROL_REG(MPP_REG_NUM(gpio)), reg);
|
|
|
|
/* Initialize GPIO as input */
|
|
reg = reg_read(GPP_DATA_OUT_EN_REG(GPP_REG_NUM(gpio)));
|
|
reg |= GPP_MASK(gpio);
|
|
reg_write(GPP_DATA_OUT_EN_REG(GPP_REG_NUM(gpio)), reg);
|
|
|
|
/*
|
|
* Check GPP for input status from PIC: 0 - regular init,
|
|
* 1 - suspend wakeup
|
|
*/
|
|
reg = reg_read(GPP_DATA_IN_REG(GPP_REG_NUM(gpio)));
|
|
|
|
/* if GPIO is ON: wakeup from S2RAM indication detected */
|
|
return (reg & GPP_MASK(gpio)) ? SUSPEND_WAKEUP_ENABLED_GPIO_DETECTED :
|
|
SUSPEND_WAKEUP_DISABLED;
|
|
}
|
|
|
|
/*
|
|
* get bit mask of enabled cs
|
|
* return bit mask of enabled cs:
|
|
* 1 - only cs0 enabled,
|
|
* 3 - both cs0 and cs1 enabled
|
|
*/
|
|
u32 mv_ddr_sys_env_get_cs_ena_from_reg(void)
|
|
{
|
|
return reg_read(DDR3_RANK_CTRL_REG) &
|
|
((CS_EXIST_MASK << CS_EXIST_OFFS(0)) |
|
|
(CS_EXIST_MASK << CS_EXIST_OFFS(1)) |
|
|
(CS_EXIST_MASK << CS_EXIST_OFFS(2)) |
|
|
(CS_EXIST_MASK << CS_EXIST_OFFS(3)));
|
|
}
|
|
|