cardhu.c 2.57 KB
Newer Older
1
/*
2
 *  (C) Copyright 2010-2013
3 4
 *  NVIDIA Corporation <www.nvidia.com>
 *
5
 * SPDX-License-Identifier:	GPL-2.0+
6 7 8
 */

#include <common.h>
9
#include <dm.h>
10
#include <asm/arch/pinmux.h>
11
#include <asm/arch/gp_padctrl.h>
12 13
#include <asm/arch/gpio.h>
#include <asm/gpio.h>
14
#include "pinmux-config-cardhu.h"
15 16 17 18
#include <i2c.h>

#define PMU_I2C_ADDRESS		0x2D
#define MAX_I2C_RETRY		3
19 20 21 22 23 24 25

/*
 * Routine: pinmux_init
 * Description: Do individual peripheral pinmux configs
 */
void pinmux_init(void)
{
26
	pinmux_config_pingrp_table(tegra3_pinmux_common,
27 28
		ARRAY_SIZE(tegra3_pinmux_common));

29
	pinmux_config_pingrp_table(unused_pins_lowpower,
30
		ARRAY_SIZE(unused_pins_lowpower));
31 32

	/* Initialize any non-default pad configs (APB_MISC_GP regs) */
33
	pinmux_config_drvgrp_table(cardhu_padctrl, ARRAY_SIZE(cardhu_padctrl));
34
}
35

36
#if defined(CONFIG_MMC_SDHCI_TEGRA)
37 38 39 40 41 42
/*
 * Do I2C/PMU writes to bring up SD card bus power
 *
 */
void board_sdmmc_voltage_init(void)
{
43
	struct udevice *dev;
44
	uchar reg, data_buffer[1];
45
	int ret;
46 47
	int i;

48
	ret = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev);
49 50 51 52
	if (ret) {
		debug("%s: Cannot find PMIC I2C chip\n", __func__);
		return;
	}
53 54 55 56 57 58

	/* TPS659110: LDO5_REG = 3.3v, ACTIVE to SDMMC1 */
	data_buffer[0] = 0x65;
	reg = 0x32;

	for (i = 0; i < MAX_I2C_RETRY; ++i) {
59
		if (dm_i2c_write(dev, reg, data_buffer, 1))
60 61 62 63 64 65 66 67
			udelay(100);
	}

	/* TPS659110: GPIO7_REG = PDEN, output a 1 to EN_3V3_SYS */
	data_buffer[0] = 0x09;
	reg = 0x67;

	for (i = 0; i < MAX_I2C_RETRY; ++i) {
68
		if (dm_i2c_write(dev, reg, data_buffer, 1))
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
			udelay(100);
	}
}

/*
 * Routine: pin_mux_mmc
 * Description: setup the MMC muxes, power rails, etc.
 */
void pin_mux_mmc(void)
{
	/*
	 * NOTE: We don't do mmc-specific pin muxes here.
	 * They were done globally in pinmux_init().
	 */

	/* Bring up the SDIO1 power rail */
	board_sdmmc_voltage_init();
}
#endif	/* MMC */
88 89 90 91 92 93 94 95

#ifdef CONFIG_PCI_TEGRA
int tegra_pcie_board_init(void)
{
	struct udevice *dev;
	u8 addr, data[1];
	int err;

96
	err = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev);
97 98 99 100 101 102 103 104 105
	if (err) {
		debug("failed to find PMU bus\n");
		return err;
	}

	/* TPS659110: LDO1_REG = 1.05V, ACTIVE */
	data[0] = 0x15;
	addr = 0x30;

106
	err = dm_i2c_write(dev, addr, data, 1);
107 108 109 110 111 112
	if (err) {
		debug("failed to set VDD supply\n");
		return err;
	}

	/* GPIO: PEX = 3.3V */
113
	err = gpio_request(TEGRA_GPIO(L, 7), "PEX");
114 115 116
	if (err < 0)
		return err;

117
	gpio_direction_output(TEGRA_GPIO(L, 7), 1);
118 119 120 121 122

	/* TPS659110: LDO2_REG = 1.05V, ACTIVE */
	data[0] = 0x15;
	addr = 0x31;

123
	err = dm_i2c_write(dev, addr, data, 1);
124 125 126 127 128 129 130 131
	if (err) {
		debug("failed to set AVDD supply\n");
		return err;
	}

	return 0;
}
#endif /* PCI */