mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-09 06:13:21 +09:00
![Wolfgang Denk](/assets/img/avatar_default.png)
Signed-off-by: Wolfgang Denk <wd@denx.de> [trini: Fixup common/cmd_io.c] Signed-off-by: Tom Rini <trini@ti.com>
558 lines
15 KiB
C
558 lines
15 KiB
C
/*
|
|
* Copyright (c) 2011 The Chromium OS Authors.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
/* Tegra20 pin multiplexing functions */
|
|
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
#include <asm/arch/tegra.h>
|
|
#include <asm/arch/pinmux.h>
|
|
|
|
|
|
/*
|
|
* This defines the order of the pin mux control bits in the registers. For
|
|
* some reason there is no correspendence between the tristate, pin mux and
|
|
* pullup/pulldown registers.
|
|
*/
|
|
enum pmux_ctlid {
|
|
/* 0: APB_MISC_PP_PIN_MUX_CTL_A_0 */
|
|
MUXCTL_UAA,
|
|
MUXCTL_UAB,
|
|
MUXCTL_UAC,
|
|
MUXCTL_UAD,
|
|
MUXCTL_UDA,
|
|
MUXCTL_RESERVED5,
|
|
MUXCTL_ATE,
|
|
MUXCTL_RM,
|
|
|
|
MUXCTL_ATB,
|
|
MUXCTL_RESERVED9,
|
|
MUXCTL_ATD,
|
|
MUXCTL_ATC,
|
|
MUXCTL_ATA,
|
|
MUXCTL_KBCF,
|
|
MUXCTL_KBCE,
|
|
MUXCTL_SDMMC1,
|
|
|
|
/* 16: APB_MISC_PP_PIN_MUX_CTL_B_0 */
|
|
MUXCTL_GMA,
|
|
MUXCTL_GMC,
|
|
MUXCTL_HDINT,
|
|
MUXCTL_SLXA,
|
|
MUXCTL_OWC,
|
|
MUXCTL_SLXC,
|
|
MUXCTL_SLXD,
|
|
MUXCTL_SLXK,
|
|
|
|
MUXCTL_UCA,
|
|
MUXCTL_UCB,
|
|
MUXCTL_DTA,
|
|
MUXCTL_DTB,
|
|
MUXCTL_RESERVED28,
|
|
MUXCTL_DTC,
|
|
MUXCTL_DTD,
|
|
MUXCTL_DTE,
|
|
|
|
/* 32: APB_MISC_PP_PIN_MUX_CTL_C_0 */
|
|
MUXCTL_DDC,
|
|
MUXCTL_CDEV1,
|
|
MUXCTL_CDEV2,
|
|
MUXCTL_CSUS,
|
|
MUXCTL_I2CP,
|
|
MUXCTL_KBCA,
|
|
MUXCTL_KBCB,
|
|
MUXCTL_KBCC,
|
|
|
|
MUXCTL_IRTX,
|
|
MUXCTL_IRRX,
|
|
MUXCTL_DAP1,
|
|
MUXCTL_DAP2,
|
|
MUXCTL_DAP3,
|
|
MUXCTL_DAP4,
|
|
MUXCTL_GMB,
|
|
MUXCTL_GMD,
|
|
|
|
/* 48: APB_MISC_PP_PIN_MUX_CTL_D_0 */
|
|
MUXCTL_GME,
|
|
MUXCTL_GPV,
|
|
MUXCTL_GPU,
|
|
MUXCTL_SPDO,
|
|
MUXCTL_SPDI,
|
|
MUXCTL_SDB,
|
|
MUXCTL_SDC,
|
|
MUXCTL_SDD,
|
|
|
|
MUXCTL_SPIH,
|
|
MUXCTL_SPIG,
|
|
MUXCTL_SPIF,
|
|
MUXCTL_SPIE,
|
|
MUXCTL_SPID,
|
|
MUXCTL_SPIC,
|
|
MUXCTL_SPIB,
|
|
MUXCTL_SPIA,
|
|
|
|
/* 64: APB_MISC_PP_PIN_MUX_CTL_E_0 */
|
|
MUXCTL_LPW0,
|
|
MUXCTL_LPW1,
|
|
MUXCTL_LPW2,
|
|
MUXCTL_LSDI,
|
|
MUXCTL_LSDA,
|
|
MUXCTL_LSPI,
|
|
MUXCTL_LCSN,
|
|
MUXCTL_LDC,
|
|
|
|
MUXCTL_LSCK,
|
|
MUXCTL_LSC0,
|
|
MUXCTL_LSC1,
|
|
MUXCTL_LHS,
|
|
MUXCTL_LVS,
|
|
MUXCTL_LM0,
|
|
MUXCTL_LM1,
|
|
MUXCTL_LVP0,
|
|
|
|
/* 80: APB_MISC_PP_PIN_MUX_CTL_F_0 */
|
|
MUXCTL_LD0,
|
|
MUXCTL_LD1,
|
|
MUXCTL_LD2,
|
|
MUXCTL_LD3,
|
|
MUXCTL_LD4,
|
|
MUXCTL_LD5,
|
|
MUXCTL_LD6,
|
|
MUXCTL_LD7,
|
|
|
|
MUXCTL_LD8,
|
|
MUXCTL_LD9,
|
|
MUXCTL_LD10,
|
|
MUXCTL_LD11,
|
|
MUXCTL_LD12,
|
|
MUXCTL_LD13,
|
|
MUXCTL_LD14,
|
|
MUXCTL_LD15,
|
|
|
|
/* 96: APB_MISC_PP_PIN_MUX_CTL_G_0 */
|
|
MUXCTL_LD16,
|
|
MUXCTL_LD17,
|
|
MUXCTL_LHP1,
|
|
MUXCTL_LHP2,
|
|
MUXCTL_LVP1,
|
|
MUXCTL_LHP0,
|
|
MUXCTL_RESERVED102,
|
|
MUXCTL_LPP,
|
|
|
|
MUXCTL_LDI,
|
|
MUXCTL_PMC,
|
|
MUXCTL_CRTP,
|
|
MUXCTL_PTA,
|
|
MUXCTL_RESERVED108,
|
|
MUXCTL_KBCD,
|
|
MUXCTL_GPU7,
|
|
MUXCTL_DTF,
|
|
|
|
MUXCTL_NONE = -1,
|
|
};
|
|
|
|
/*
|
|
* And this defines the order of the pullup/pulldown controls which are again
|
|
* in a different order
|
|
*/
|
|
enum pmux_pullid {
|
|
/* 0: APB_MISC_PP_PULLUPDOWN_REG_A_0 */
|
|
PUCTL_ATA,
|
|
PUCTL_ATB,
|
|
PUCTL_ATC,
|
|
PUCTL_ATD,
|
|
PUCTL_ATE,
|
|
PUCTL_DAP1,
|
|
PUCTL_DAP2,
|
|
PUCTL_DAP3,
|
|
|
|
PUCTL_DAP4,
|
|
PUCTL_DTA,
|
|
PUCTL_DTB,
|
|
PUCTL_DTC,
|
|
PUCTL_DTD,
|
|
PUCTL_DTE,
|
|
PUCTL_DTF,
|
|
PUCTL_GPV,
|
|
|
|
/* 16: APB_MISC_PP_PULLUPDOWN_REG_B_0 */
|
|
PUCTL_RM,
|
|
PUCTL_I2CP,
|
|
PUCTL_PTA,
|
|
PUCTL_GPU7,
|
|
PUCTL_KBCA,
|
|
PUCTL_KBCB,
|
|
PUCTL_KBCC,
|
|
PUCTL_KBCD,
|
|
|
|
PUCTL_SPDI,
|
|
PUCTL_SPDO,
|
|
PUCTL_GPSLXAU,
|
|
PUCTL_CRTP,
|
|
PUCTL_SLXC,
|
|
PUCTL_SLXD,
|
|
PUCTL_SLXK,
|
|
|
|
/* 32: APB_MISC_PP_PULLUPDOWN_REG_C_0 */
|
|
PUCTL_CDEV1,
|
|
PUCTL_CDEV2,
|
|
PUCTL_SPIA,
|
|
PUCTL_SPIB,
|
|
PUCTL_SPIC,
|
|
PUCTL_SPID,
|
|
PUCTL_SPIE,
|
|
PUCTL_SPIF,
|
|
|
|
PUCTL_SPIG,
|
|
PUCTL_SPIH,
|
|
PUCTL_IRTX,
|
|
PUCTL_IRRX,
|
|
PUCTL_GME,
|
|
PUCTL_RESERVED45,
|
|
PUCTL_XM2D,
|
|
PUCTL_XM2C,
|
|
|
|
/* 48: APB_MISC_PP_PULLUPDOWN_REG_D_0 */
|
|
PUCTL_UAA,
|
|
PUCTL_UAB,
|
|
PUCTL_UAC,
|
|
PUCTL_UAD,
|
|
PUCTL_UCA,
|
|
PUCTL_UCB,
|
|
PUCTL_LD17,
|
|
PUCTL_LD19_18,
|
|
|
|
PUCTL_LD21_20,
|
|
PUCTL_LD23_22,
|
|
PUCTL_LS,
|
|
PUCTL_LC,
|
|
PUCTL_CSUS,
|
|
PUCTL_DDRC,
|
|
PUCTL_SDC,
|
|
PUCTL_SDD,
|
|
|
|
/* 64: APB_MISC_PP_PULLUPDOWN_REG_E_0 */
|
|
PUCTL_KBCF,
|
|
PUCTL_KBCE,
|
|
PUCTL_PMCA,
|
|
PUCTL_PMCB,
|
|
PUCTL_PMCC,
|
|
PUCTL_PMCD,
|
|
PUCTL_PMCE,
|
|
PUCTL_CK32,
|
|
|
|
PUCTL_UDA,
|
|
PUCTL_SDMMC1,
|
|
PUCTL_GMA,
|
|
PUCTL_GMB,
|
|
PUCTL_GMC,
|
|
PUCTL_GMD,
|
|
PUCTL_DDC,
|
|
PUCTL_OWC,
|
|
|
|
PUCTL_NONE = -1
|
|
};
|
|
|
|
struct tegra_pingroup_desc {
|
|
const char *name;
|
|
enum pmux_func funcs[4];
|
|
enum pmux_func func_safe;
|
|
enum pmux_vddio vddio;
|
|
enum pmux_ctlid ctl_id;
|
|
enum pmux_pullid pull_id;
|
|
};
|
|
|
|
|
|
/* Converts a pmux_pingrp number to a tristate register: 0=A, 1=B, 2=C, 3=D */
|
|
#define TRISTATE_REG(pmux_pingrp) ((pmux_pingrp) >> 5)
|
|
|
|
/* Mask value for a tristate (within TRISTATE_REG(id)) */
|
|
#define TRISTATE_MASK(pmux_pingrp) (1 << ((pmux_pingrp) & 0x1f))
|
|
|
|
/* Converts a PUCTL id to a pull register: 0=A, 1=B...4=E */
|
|
#define PULL_REG(pmux_pullid) ((pmux_pullid) >> 4)
|
|
|
|
/* Converts a PUCTL id to a shift position */
|
|
#define PULL_SHIFT(pmux_pullid) ((pmux_pullid << 1) & 0x1f)
|
|
|
|
/* Converts a MUXCTL id to a ctl register: 0=A, 1=B...6=G */
|
|
#define MUXCTL_REG(pmux_ctlid) ((pmux_ctlid) >> 4)
|
|
|
|
/* Converts a MUXCTL id to a shift position */
|
|
#define MUXCTL_SHIFT(pmux_ctlid) ((pmux_ctlid << 1) & 0x1f)
|
|
|
|
/* Convenient macro for defining pin group properties */
|
|
#define PINALL(pg_name, vdd, f0, f1, f2, f3, f_safe, mux, pupd) \
|
|
{ \
|
|
.vddio = PMUX_VDDIO_ ## vdd, \
|
|
.funcs = { \
|
|
PMUX_FUNC_ ## f0, \
|
|
PMUX_FUNC_ ## f1, \
|
|
PMUX_FUNC_ ## f2, \
|
|
PMUX_FUNC_ ## f3, \
|
|
}, \
|
|
.func_safe = PMUX_FUNC_ ## f_safe, \
|
|
.ctl_id = mux, \
|
|
.pull_id = pupd \
|
|
}
|
|
|
|
/* A normal pin group where the mux name and pull-up name match */
|
|
#define PIN(pg_name, vdd, f0, f1, f2, f3, f_safe) \
|
|
PINALL(pg_name, vdd, f0, f1, f2, f3, f_safe, \
|
|
MUXCTL_ ## pg_name, PUCTL_ ## pg_name)
|
|
|
|
/* A pin group where the pull-up name doesn't have a 1-1 mapping */
|
|
#define PINP(pg_name, vdd, f0, f1, f2, f3, f_safe, pupd) \
|
|
PINALL(pg_name, vdd, f0, f1, f2, f3, f_safe, \
|
|
MUXCTL_ ## pg_name, PUCTL_ ## pupd)
|
|
|
|
/* A pin group number which is not used */
|
|
#define PIN_RESERVED \
|
|
PIN(NONE, NONE, NONE, NONE, NONE, NONE, NONE)
|
|
|
|
const struct tegra_pingroup_desc tegra_soc_pingroups[PINGRP_COUNT] = {
|
|
PIN(ATA, NAND, IDE, NAND, GMI, RSVD, IDE),
|
|
PIN(ATB, NAND, IDE, NAND, GMI, SDIO4, IDE),
|
|
PIN(ATC, NAND, IDE, NAND, GMI, SDIO4, IDE),
|
|
PIN(ATD, NAND, IDE, NAND, GMI, SDIO4, IDE),
|
|
PIN(CDEV1, AUDIO, OSC, PLLA_OUT, PLLM_OUT1, AUDIO_SYNC, OSC),
|
|
PIN(CDEV2, AUDIO, OSC, AHB_CLK, APB_CLK, PLLP_OUT4, OSC),
|
|
PIN(CSUS, VI, PLLC_OUT1, PLLP_OUT2, PLLP_OUT3, VI_SENSOR_CLK,
|
|
PLLC_OUT1),
|
|
PIN(DAP1, AUDIO, DAP1, RSVD, GMI, SDIO2, DAP1),
|
|
|
|
PIN(DAP2, AUDIO, DAP2, TWC, RSVD, GMI, DAP2),
|
|
PIN(DAP3, BB, DAP3, RSVD, RSVD, RSVD, DAP3),
|
|
PIN(DAP4, UART, DAP4, RSVD, GMI, RSVD, DAP4),
|
|
PIN(DTA, VI, RSVD, SDIO2, VI, RSVD, RSVD4),
|
|
PIN(DTB, VI, RSVD, RSVD, VI, SPI1, RSVD1),
|
|
PIN(DTC, VI, RSVD, RSVD, VI, RSVD, RSVD1),
|
|
PIN(DTD, VI, RSVD, SDIO2, VI, RSVD, RSVD1),
|
|
PIN(DTE, VI, RSVD, RSVD, VI, SPI1, RSVD1),
|
|
|
|
PINP(GPU, UART, PWM, UARTA, GMI, RSVD, RSVD4,
|
|
GPSLXAU),
|
|
PIN(GPV, SD, PCIE, RSVD, RSVD, RSVD, PCIE),
|
|
PIN(I2CP, SYS, I2C, RSVD, RSVD, RSVD, RSVD4),
|
|
PIN(IRTX, UART, UARTA, UARTB, GMI, SPI4, UARTB),
|
|
PIN(IRRX, UART, UARTA, UARTB, GMI, SPI4, UARTB),
|
|
PIN(KBCB, SYS, KBC, NAND, SDIO2, MIO, KBC),
|
|
PIN(KBCA, SYS, KBC, NAND, SDIO2, EMC_TEST0_DLL, KBC),
|
|
PINP(PMC, SYS, PWR_ON, PWR_INTR, RSVD, RSVD, PWR_ON, NONE),
|
|
|
|
PIN(PTA, NAND, I2C2, HDMI, GMI, RSVD, RSVD4),
|
|
PIN(RM, UART, I2C, RSVD, RSVD, RSVD, RSVD4),
|
|
PIN(KBCE, SYS, KBC, NAND, OWR, RSVD, KBC),
|
|
PIN(KBCF, SYS, KBC, NAND, TRACE, MIO, KBC),
|
|
PIN(GMA, NAND, UARTE, SPI3, GMI, SDIO4, SPI3),
|
|
PIN(GMC, NAND, UARTD, SPI4, GMI, SFLASH, SPI4),
|
|
PIN(SDMMC1, BB, SDIO1, RSVD, UARTE, UARTA, RSVD2),
|
|
PIN(OWC, SYS, OWR, RSVD, RSVD, RSVD, OWR),
|
|
|
|
PIN(GME, NAND, RSVD, DAP5, GMI, SDIO4, GMI),
|
|
PIN(SDC, SD, PWM, TWC, SDIO3, SPI3, TWC),
|
|
PIN(SDD, SD, UARTA, PWM, SDIO3, SPI3, PWM),
|
|
PIN_RESERVED,
|
|
PINP(SLXA, SD, PCIE, SPI4, SDIO3, SPI2, PCIE, CRTP),
|
|
PIN(SLXC, SD, SPDIF, SPI4, SDIO3, SPI2, SPI4),
|
|
PIN(SLXD, SD, SPDIF, SPI4, SDIO3, SPI2, SPI4),
|
|
PIN(SLXK, SD, PCIE, SPI4, SDIO3, SPI2, PCIE),
|
|
|
|
PIN(SPDI, AUDIO, SPDIF, RSVD, I2C, SDIO2, RSVD2),
|
|
PIN(SPDO, AUDIO, SPDIF, RSVD, I2C, SDIO2, RSVD2),
|
|
PIN(SPIA, AUDIO, SPI1, SPI2, SPI3, GMI, GMI),
|
|
PIN(SPIB, AUDIO, SPI1, SPI2, SPI3, GMI, GMI),
|
|
PIN(SPIC, AUDIO, SPI1, SPI2, SPI3, GMI, GMI),
|
|
PIN(SPID, AUDIO, SPI2, SPI1, SPI2_ALT, GMI, GMI),
|
|
PIN(SPIE, AUDIO, SPI2, SPI1, SPI2_ALT, GMI, GMI),
|
|
PIN(SPIF, AUDIO, SPI3, SPI1, SPI2, RSVD, RSVD4),
|
|
|
|
PIN(SPIG, AUDIO, SPI3, SPI2, SPI2_ALT, I2C, SPI2_ALT),
|
|
PIN(SPIH, AUDIO, SPI3, SPI2, SPI2_ALT, I2C, SPI2_ALT),
|
|
PIN(UAA, BB, SPI3, MIPI_HS, UARTA, ULPI, MIPI_HS),
|
|
PIN(UAB, BB, SPI2, MIPI_HS, UARTA, ULPI, MIPI_HS),
|
|
PIN(UAC, BB, OWR, RSVD, RSVD, RSVD, RSVD4),
|
|
PIN(UAD, UART, UARTB, SPDIF, UARTA, SPI4, SPDIF),
|
|
PIN(UCA, UART, UARTC, RSVD, GMI, RSVD, RSVD4),
|
|
PIN(UCB, UART, UARTC, PWM, GMI, RSVD, RSVD4),
|
|
|
|
PIN_RESERVED,
|
|
PIN(ATE, NAND, IDE, NAND, GMI, RSVD, IDE),
|
|
PIN(KBCC, SYS, KBC, NAND, TRACE, EMC_TEST1_DLL, KBC),
|
|
PIN_RESERVED,
|
|
PIN_RESERVED,
|
|
PIN(GMB, NAND, IDE, NAND, GMI, GMI_INT, GMI),
|
|
PIN(GMD, NAND, RSVD, NAND, GMI, SFLASH, GMI),
|
|
PIN(DDC, LCD, I2C2, RSVD, RSVD, RSVD, RSVD4),
|
|
|
|
/* 64 */
|
|
PINP(LD0, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD1, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD2, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD3, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD4, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD5, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD6, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD7, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
|
|
PINP(LD8, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD9, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD10, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD11, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD12, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD13, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD14, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD15, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
|
|
PINP(LD16, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LD17),
|
|
PINP(LD17, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD17),
|
|
PINP(LHP0, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD21_20),
|
|
PINP(LHP1, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD19_18),
|
|
PINP(LHP2, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD19_18),
|
|
PINP(LVP0, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LC),
|
|
PINP(LVP1, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD21_20),
|
|
PINP(HDINT, LCD, HDMI, RSVD, RSVD, RSVD, HDMI , LC),
|
|
|
|
PINP(LM0, LCD, DISPA, DISPB, SPI3, RSVD, RSVD4, LC),
|
|
PINP(LM1, LCD, DISPA, DISPB, RSVD, CRT, RSVD3, LC),
|
|
PINP(LVS, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LC),
|
|
PINP(LSC0, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LC),
|
|
PINP(LSC1, LCD, DISPA, DISPB, SPI3, HDMI, DISPA, LS),
|
|
PINP(LSCK, LCD, DISPA, DISPB, SPI3, HDMI, DISPA, LS),
|
|
PINP(LDC, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LS),
|
|
PINP(LCSN, LCD, DISPA, DISPB, SPI3, RSVD, RSVD4, LS),
|
|
|
|
/* 96 */
|
|
PINP(LSPI, LCD, DISPA, DISPB, XIO, HDMI, DISPA, LC),
|
|
PINP(LSDA, LCD, DISPA, DISPB, SPI3, HDMI, DISPA, LS),
|
|
PINP(LSDI, LCD, DISPA, DISPB, SPI3, RSVD, DISPA, LS),
|
|
PINP(LPW0, LCD, DISPA, DISPB, SPI3, HDMI, DISPA, LS),
|
|
PINP(LPW1, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LS),
|
|
PINP(LPW2, LCD, DISPA, DISPB, SPI3, HDMI, DISPA, LS),
|
|
PINP(LDI, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD23_22),
|
|
PINP(LHS, LCD, DISPA, DISPB, XIO, RSVD, RSVD4, LC),
|
|
|
|
PINP(LPP, LCD, DISPA, DISPB, RSVD, RSVD, RSVD4, LD23_22),
|
|
PIN_RESERVED,
|
|
PIN(KBCD, SYS, KBC, NAND, SDIO2, MIO, KBC),
|
|
PIN(GPU7, SYS, RTCK, RSVD, RSVD, RSVD, RTCK),
|
|
PIN(DTF, VI, I2C3, RSVD, VI, RSVD, RSVD4),
|
|
PIN(UDA, BB, SPI1, RSVD, UARTD, ULPI, RSVD2),
|
|
PIN(CRTP, LCD, CRT, RSVD, RSVD, RSVD, RSVD),
|
|
PINP(SDB, SD, UARTA, PWM, SDIO3, SPI2, PWM, NONE),
|
|
|
|
/* these pin groups only have pullup and pull down control */
|
|
PINALL(CK32, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(DDRC, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(PMCA, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(PMCB, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(PMCC, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(PMCD, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(PMCE, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(XM2C, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
PINALL(XM2D, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, MUXCTL_NONE,
|
|
PUCTL_NONE),
|
|
};
|
|
|
|
void pinmux_set_tristate(enum pmux_pingrp pin, int enable)
|
|
{
|
|
struct pmux_tri_ctlr *pmt =
|
|
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
|
|
u32 *tri = &pmt->pmt_tri[TRISTATE_REG(pin)];
|
|
u32 reg;
|
|
|
|
reg = readl(tri);
|
|
if (enable)
|
|
reg |= TRISTATE_MASK(pin);
|
|
else
|
|
reg &= ~TRISTATE_MASK(pin);
|
|
writel(reg, tri);
|
|
}
|
|
|
|
void pinmux_tristate_enable(enum pmux_pingrp pin)
|
|
{
|
|
pinmux_set_tristate(pin, 1);
|
|
}
|
|
|
|
void pinmux_tristate_disable(enum pmux_pingrp pin)
|
|
{
|
|
pinmux_set_tristate(pin, 0);
|
|
}
|
|
|
|
void pinmux_set_pullupdown(enum pmux_pingrp pin, enum pmux_pull pupd)
|
|
{
|
|
struct pmux_tri_ctlr *pmt =
|
|
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
|
|
enum pmux_pullid pull_id = tegra_soc_pingroups[pin].pull_id;
|
|
u32 *pull = &pmt->pmt_pull[PULL_REG(pull_id)];
|
|
u32 mask_bit;
|
|
u32 reg;
|
|
mask_bit = PULL_SHIFT(pull_id);
|
|
|
|
reg = readl(pull);
|
|
reg &= ~(0x3 << mask_bit);
|
|
reg |= pupd << mask_bit;
|
|
writel(reg, pull);
|
|
}
|
|
|
|
void pinmux_set_func(enum pmux_pingrp pin, enum pmux_func func)
|
|
{
|
|
struct pmux_tri_ctlr *pmt =
|
|
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
|
|
enum pmux_ctlid mux_id = tegra_soc_pingroups[pin].ctl_id;
|
|
u32 *muxctl = &pmt->pmt_ctl[MUXCTL_REG(mux_id)];
|
|
u32 mask_bit;
|
|
int i, mux = -1;
|
|
u32 reg;
|
|
|
|
assert(pmux_func_isvalid(func));
|
|
|
|
/* Handle special values */
|
|
if (func >= PMUX_FUNC_RSVD1) {
|
|
mux = (func - PMUX_FUNC_RSVD1) & 0x3;
|
|
} else {
|
|
/* Search for the appropriate function */
|
|
for (i = 0; i < 4; i++) {
|
|
if (tegra_soc_pingroups[pin].funcs[i] == func) {
|
|
mux = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
assert(mux != -1);
|
|
|
|
mask_bit = MUXCTL_SHIFT(mux_id);
|
|
reg = readl(muxctl);
|
|
reg &= ~(0x3 << mask_bit);
|
|
reg |= mux << mask_bit;
|
|
writel(reg, muxctl);
|
|
}
|
|
|
|
void pinmux_config_pingroup(const struct pingroup_config *config)
|
|
{
|
|
enum pmux_pingrp pin = config->pingroup;
|
|
|
|
pinmux_set_func(pin, config->func);
|
|
pinmux_set_pullupdown(pin, config->pull);
|
|
pinmux_set_tristate(pin, config->tristate);
|
|
}
|
|
|
|
void pinmux_config_table(const struct pingroup_config *config, int len)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < len; i++)
|
|
pinmux_config_pingroup(&config[i]);
|
|
}
|