
/*
 * arch/arm/cpu/armv8/gxb/sdio.c
 *
 * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
 *
 * 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; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

#include <config.h>
#include <asm/arch/io.h>
#include <asm/arch/cpu_sdio.h>
#include <asm/arch/secure_apb.h>
#include <asm/cpu_id.h>
#include <common.h>

void  cpu_sd_emmc_pwr_prepare(unsigned port)
{
    /** here you can add io pin voltage operation if you need.
		but now it was used to open emmc gate for gxm
    */

	if ((port == SDIO_PORT_C)
        && (get_cpu_id().family_id >= MESON_CPU_MAJOR_ID_GXM)
        && (readl(HHI_NAND_CLK_CNTL) != 0x80))
        writel(0x80, HHI_NAND_CLK_CNTL);

}
unsigned sd_debug_board_1bit_flag = 0;
int cpu_sd_emmc_init(unsigned port)
{

	//printf("inand sdio  port:%d\n",port);
	switch (port)
	{
	case SDIO_PORT_A:
        setbits_le32(P_PERIPHS_PIN_MUX_5, (0x3f << 26) | (0x1 << 24));
		break;
	case SDIO_PORT_B:
		if (sd_debug_board_1bit_flag == 1)
			setbits_le32(P_PERIPHS_PIN_MUX_6, 0x7 << 2);
        else {
            clrbits_le32(P_PERIPHS_PIN_MUX_6, 0x3f << 6);
			setbits_le32(P_PERIPHS_PIN_MUX_6, 0x3f << 0);
        }
		break;
	case SDIO_PORT_C://SDIOC GPIOB_2~GPIOB_7
		/* pull up data by default */
		setbits_le32(P_PAD_PULL_UP_EN_REG2, 0xffff);
		setbits_le32(P_PAD_PULL_UP_REG2, 0xffff);
		/* set pinmux */
		clrbits_le32(P_PERIPHS_PIN_MUX_7, 0xff | (0xff << 16));
		setbits_le32(P_PERIPHS_PIN_MUX_7, 0x7 << 29);
		/* hare ware reset with pull boot9 */
		clrbits_le32(P_PREG_PAD_GPIO2_EN_N, 1<<9);
		clrbits_le32(P_PREG_PAD_GPIO2_O, 1<<9);
		udelay(10);
		setbits_le32(P_PREG_PAD_GPIO2_O, 1<<9);
		break;
	default:
		return -1;
	}
	return 0;
}
