xref: /rk3399_rockchip-uboot/board/avionic-design/common/tamonten-ng.c (revision dc557e9a1fe00ca9d884bd88feef5bebf23fede4)
18f380381SAlban Bedel /*
28f380381SAlban Bedel  * (C) Copyright 2013
38f380381SAlban Bedel  * Avionic Design GmbH <www.avionic-design.de>
48f380381SAlban Bedel  *
58f380381SAlban Bedel  * SPDX-License-Identifier:	GPL-2.0+
68f380381SAlban Bedel  */
78f380381SAlban Bedel 
88f380381SAlban Bedel #include <common.h>
9b0e6ef46SSimon Glass #include <dm.h>
108f380381SAlban Bedel #include <asm/arch/pinmux.h>
118f380381SAlban Bedel #include <asm/arch/gp_padctrl.h>
128f380381SAlban Bedel #include <asm/arch/gpio.h>
138f380381SAlban Bedel #include <asm/gpio.h>
148f380381SAlban Bedel #include "pinmux-config-tamonten-ng.h"
158f380381SAlban Bedel #include <i2c.h>
168f380381SAlban Bedel 
178f380381SAlban Bedel #define PMU_I2C_ADDRESS		0x2D
188f380381SAlban Bedel 
198f380381SAlban Bedel #define PMU_REG_LDO5		0x32
208f380381SAlban Bedel 
218f380381SAlban Bedel #define PMU_REG_LDO_HIGH_POWER	1
228f380381SAlban Bedel 
238f380381SAlban Bedel /* Voltage selection for the LDOs with 100mV resolution */
248f380381SAlban Bedel #define PMU_REG_LDO_SEL_100(mV)	((((mV - 1000) / 100) + 2) << 2)
258f380381SAlban Bedel 
268f380381SAlban Bedel #define PMU_REG_LDO_100(st, mV)	(PMU_REG_LDO_##st | PMU_REG_LDO_SEL_100(mV))
278f380381SAlban Bedel 
288f380381SAlban Bedel #define PMU_LDO5(st, mV)	PMU_REG_LDO_100(st, mV)
298f380381SAlban Bedel 
pinmux_init(void)308f380381SAlban Bedel void pinmux_init(void)
318f380381SAlban Bedel {
32dfb42fc9SStephen Warren 	pinmux_config_pingrp_table(tamonten_ng_pinmux_common,
338f380381SAlban Bedel 		ARRAY_SIZE(tamonten_ng_pinmux_common));
34dfb42fc9SStephen Warren 	pinmux_config_pingrp_table(unused_pins_lowpower,
358f380381SAlban Bedel 		ARRAY_SIZE(unused_pins_lowpower));
368f380381SAlban Bedel 
378f380381SAlban Bedel 	/* Initialize any non-default pad configs (APB_MISC_GP regs) */
38dfb42fc9SStephen Warren 	pinmux_config_drvgrp_table(tamonten_ng_padctrl,
398f380381SAlban Bedel 		ARRAY_SIZE(tamonten_ng_padctrl));
408f380381SAlban Bedel }
418f380381SAlban Bedel 
gpio_early_init(void)428f380381SAlban Bedel void gpio_early_init(void)
438f380381SAlban Bedel {
448f380381SAlban Bedel 	/* Turn on the alive signal */
45*01a97a11SStephen Warren 	gpio_request(TEGRA_GPIO(V, 2), "ALIVE");
46*01a97a11SStephen Warren 	gpio_direction_output(TEGRA_GPIO(V, 2), 1);
478f380381SAlban Bedel 
488f380381SAlban Bedel 	/* Remove the reset on the external periph */
49*01a97a11SStephen Warren 	gpio_request(TEGRA_GPIO(I, 4), "nRST_PERIPH");
50*01a97a11SStephen Warren 	gpio_direction_output(TEGRA_GPIO(I, 4), 1);
518f380381SAlban Bedel }
528f380381SAlban Bedel 
pmu_write(uchar reg,uchar data)538f380381SAlban Bedel void pmu_write(uchar reg, uchar data)
548f380381SAlban Bedel {
55b0e6ef46SSimon Glass 	struct udevice *dev;
56b0e6ef46SSimon Glass 	int ret;
57b0e6ef46SSimon Glass 
5825ab4b03SSimon Glass 	ret = i2c_get_chip_for_busnum(4, PMU_I2C_ADDRESS, 1, &dev);
59b0e6ef46SSimon Glass 	if (ret) {
60b0e6ef46SSimon Glass 		debug("%s: Cannot find PMIC I2C chip\n", __func__);
61b0e6ef46SSimon Glass 		return;
62b0e6ef46SSimon Glass 	}
63f9a4c2daSSimon Glass 	dm_i2c_write(dev, reg, &data, 1);
648f380381SAlban Bedel }
658f380381SAlban Bedel 
668f380381SAlban Bedel /*
678f380381SAlban Bedel  * Do I2C/PMU writes to bring up SD card bus power
688f380381SAlban Bedel  *
698f380381SAlban Bedel  */
board_sdmmc_voltage_init(void)708f380381SAlban Bedel void board_sdmmc_voltage_init(void)
718f380381SAlban Bedel {
728f380381SAlban Bedel 	/* Enable LDO5 with 3.3v for SDMMC3 */
738f380381SAlban Bedel 	pmu_write(PMU_REG_LDO5, PMU_LDO5(HIGH_POWER, 3300));
748f380381SAlban Bedel 
758f380381SAlban Bedel 	/* Switch the power on */
76*01a97a11SStephen Warren 	gpio_request(TEGRA_GPIO(J, 2), "EN_3V3_EMMC");
77*01a97a11SStephen Warren 	gpio_direction_output(TEGRA_GPIO(J, 2), 1);
788f380381SAlban Bedel }
798f380381SAlban Bedel 
808f380381SAlban Bedel /*
818f380381SAlban Bedel  * Routine: pin_mux_mmc
828f380381SAlban Bedel  * Description: setup the MMC muxes, power rails, etc.
838f380381SAlban Bedel  */
pin_mux_mmc(void)848f380381SAlban Bedel void pin_mux_mmc(void)
858f380381SAlban Bedel {
868f380381SAlban Bedel 	/*
878f380381SAlban Bedel 	 * NOTE: We don't do mmc-specific pin muxes here.
888f380381SAlban Bedel 	 * They were done globally in pinmux_init().
898f380381SAlban Bedel 	 */
908f380381SAlban Bedel 
918f380381SAlban Bedel 	/* Bring up the SDIO1 power rail */
928f380381SAlban Bedel 	board_sdmmc_voltage_init();
938f380381SAlban Bedel }
94