xref: /openbmc/u-boot/board/nvidia/cardhu/cardhu.c (revision 0adb5b76)
1 /*
2  *  (C) Copyright 2010-2013
3  *  NVIDIA Corporation <www.nvidia.com>
4  *
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 #include <asm/arch/gpio.h>
13 #include <asm/gpio.h>
14 #include "pinmux-config-cardhu.h"
15 #include <i2c.h>
16 #include <netdev.h>
17 
18 #define PMU_I2C_ADDRESS		0x2D
19 #define MAX_I2C_RETRY		3
20 
21 /*
22  * Routine: pinmux_init
23  * Description: Do individual peripheral pinmux configs
24  */
25 void pinmux_init(void)
26 {
27 	pinmux_config_pingrp_table(tegra3_pinmux_common,
28 		ARRAY_SIZE(tegra3_pinmux_common));
29 
30 	pinmux_config_pingrp_table(unused_pins_lowpower,
31 		ARRAY_SIZE(unused_pins_lowpower));
32 
33 	/* Initialize any non-default pad configs (APB_MISC_GP regs) */
34 	pinmux_config_drvgrp_table(cardhu_padctrl, ARRAY_SIZE(cardhu_padctrl));
35 }
36 
37 #if defined(CONFIG_TEGRA_MMC)
38 /*
39  * Do I2C/PMU writes to bring up SD card bus power
40  *
41  */
42 void board_sdmmc_voltage_init(void)
43 {
44 	struct udevice *dev;
45 	uchar reg, data_buffer[1];
46 	int ret;
47 	int i;
48 
49 	ret = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev);
50 	if (ret) {
51 		debug("%s: Cannot find PMIC I2C chip\n", __func__);
52 		return;
53 	}
54 
55 	/* TPS659110: LDO5_REG = 3.3v, ACTIVE to SDMMC1 */
56 	data_buffer[0] = 0x65;
57 	reg = 0x32;
58 
59 	for (i = 0; i < MAX_I2C_RETRY; ++i) {
60 		if (dm_i2c_write(dev, reg, data_buffer, 1))
61 			udelay(100);
62 	}
63 
64 	/* TPS659110: GPIO7_REG = PDEN, output a 1 to EN_3V3_SYS */
65 	data_buffer[0] = 0x09;
66 	reg = 0x67;
67 
68 	for (i = 0; i < MAX_I2C_RETRY; ++i) {
69 		if (dm_i2c_write(dev, reg, data_buffer, 1))
70 			udelay(100);
71 	}
72 }
73 
74 /*
75  * Routine: pin_mux_mmc
76  * Description: setup the MMC muxes, power rails, etc.
77  */
78 void pin_mux_mmc(void)
79 {
80 	/*
81 	 * NOTE: We don't do mmc-specific pin muxes here.
82 	 * They were done globally in pinmux_init().
83 	 */
84 
85 	/* Bring up the SDIO1 power rail */
86 	board_sdmmc_voltage_init();
87 }
88 #endif	/* MMC */
89 
90 #ifdef CONFIG_PCI_TEGRA
91 int tegra_pcie_board_init(void)
92 {
93 	struct udevice *dev;
94 	u8 addr, data[1];
95 	int err;
96 
97 	err = i2c_get_chip_for_busnum(0, PMU_I2C_ADDRESS, 1, &dev);
98 	if (err) {
99 		debug("failed to find PMU bus\n");
100 		return err;
101 	}
102 
103 	/* TPS659110: LDO1_REG = 1.05V, ACTIVE */
104 	data[0] = 0x15;
105 	addr = 0x30;
106 
107 	err = dm_i2c_write(dev, addr, data, 1);
108 	if (err) {
109 		debug("failed to set VDD supply\n");
110 		return err;
111 	}
112 
113 	/* GPIO: PEX = 3.3V */
114 	err = gpio_request(GPIO_PL7, "PEX");
115 	if (err < 0)
116 		return err;
117 
118 	gpio_direction_output(GPIO_PL7, 1);
119 
120 	/* TPS659110: LDO2_REG = 1.05V, ACTIVE */
121 	data[0] = 0x15;
122 	addr = 0x31;
123 
124 	err = dm_i2c_write(dev, addr, data, 1);
125 	if (err) {
126 		debug("failed to set AVDD supply\n");
127 		return err;
128 	}
129 
130 	return 0;
131 }
132 
133 int board_eth_init(bd_t *bis)
134 {
135 	return pci_eth_init(bis);
136 }
137 #endif /* PCI */
138