commit
951c6baaf4
@ -0,0 +1,333 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/gp_padctrl.h> |
||||
#include <asm/arch/pinmux.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch-tegra/clk_rst.h> |
||||
#include <asm/arch-tegra/pmc.h> |
||||
#include <asm/arch-tegra/scu.h> |
||||
#include "cpu.h" |
||||
|
||||
int get_num_cpus(void) |
||||
{ |
||||
struct apb_misc_gp_ctlr *gp; |
||||
uint rev; |
||||
|
||||
gp = (struct apb_misc_gp_ctlr *)NV_PA_APB_MISC_GP_BASE; |
||||
rev = (readl(&gp->hidrev) & HIDREV_CHIPID_MASK) >> HIDREV_CHIPID_SHIFT; |
||||
|
||||
switch (rev) { |
||||
case CHIPID_TEGRA20: |
||||
return 2; |
||||
break; |
||||
case CHIPID_TEGRA30: |
||||
case CHIPID_TEGRA114: |
||||
default: |
||||
return 4; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/*
|
||||
* Timing tables for each SOC for all four oscillator options. |
||||
*/ |
||||
struct clk_pll_table tegra_pll_x_table[TEGRA_SOC_CNT][CLOCK_OSC_FREQ_COUNT] = { |
||||
/* T20: 1 GHz */ |
||||
/* n, m, p, cpcon */ |
||||
{{ 1000, 13, 0, 12}, /* OSC 13M */ |
||||
{ 625, 12, 0, 8}, /* OSC 19.2M */ |
||||
{ 1000, 12, 0, 12}, /* OSC 12M */ |
||||
{ 1000, 26, 0, 12}, /* OSC 26M */ |
||||
}, |
||||
|
||||
/* T25: 1.2 GHz */ |
||||
{{ 923, 10, 0, 12}, |
||||
{ 750, 12, 0, 8}, |
||||
{ 600, 6, 0, 12}, |
||||
{ 600, 13, 0, 12}, |
||||
}, |
||||
|
||||
/* T30: 1.4 GHz */ |
||||
{{ 862, 8, 0, 8}, |
||||
{ 583, 8, 0, 4}, |
||||
{ 700, 6, 0, 8}, |
||||
{ 700, 13, 0, 8}, |
||||
}, |
||||
|
||||
/* T114: 1.4 GHz */ |
||||
{{ 862, 8, 0, 8}, |
||||
{ 583, 8, 0, 4}, |
||||
{ 696, 12, 0, 8}, |
||||
{ 700, 13, 0, 8}, |
||||
}, |
||||
}; |
||||
|
||||
void adjust_pllp_out_freqs(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
struct clk_pll *pll = &clkrst->crc_pll[CLOCK_ID_PERIPH]; |
||||
u32 reg; |
||||
|
||||
/* Set T30 PLLP_OUT1, 2, 3 & 4 freqs to 9.6, 48, 102 & 204MHz */ |
||||
reg = readl(&pll->pll_out[0]); /* OUTA, contains OUT2 / OUT1 */ |
||||
reg |= (IN_408_OUT_48_DIVISOR << PLLP_OUT2_RATIO) | PLLP_OUT2_OVR |
||||
| (IN_408_OUT_9_6_DIVISOR << PLLP_OUT1_RATIO) | PLLP_OUT1_OVR; |
||||
writel(reg, &pll->pll_out[0]); |
||||
|
||||
reg = readl(&pll->pll_out[1]); /* OUTB, contains OUT4 / OUT3 */ |
||||
reg |= (IN_408_OUT_204_DIVISOR << PLLP_OUT4_RATIO) | PLLP_OUT4_OVR |
||||
| (IN_408_OUT_102_DIVISOR << PLLP_OUT3_RATIO) | PLLP_OUT3_OVR; |
||||
writel(reg, &pll->pll_out[1]); |
||||
} |
||||
|
||||
int pllx_set_rate(struct clk_pll_simple *pll , u32 divn, u32 divm, |
||||
u32 divp, u32 cpcon) |
||||
{ |
||||
u32 reg; |
||||
|
||||
/* If PLLX is already enabled, just return */ |
||||
if (readl(&pll->pll_base) & PLL_ENABLE_MASK) { |
||||
debug("pllx_set_rate: PLLX already enabled, returning\n"); |
||||
return 0; |
||||
} |
||||
|
||||
debug(" pllx_set_rate entry\n"); |
||||
|
||||
/* Set BYPASS, m, n and p to PLLX_BASE */ |
||||
reg = PLL_BYPASS_MASK | (divm << PLL_DIVM_SHIFT); |
||||
reg |= ((divn << PLL_DIVN_SHIFT) | (divp << PLL_DIVP_SHIFT)); |
||||
writel(reg, &pll->pll_base); |
||||
|
||||
/* Set cpcon to PLLX_MISC */ |
||||
reg = (cpcon << PLL_CPCON_SHIFT); |
||||
|
||||
/* Set dccon to PLLX_MISC if freq > 600MHz */ |
||||
if (divn > 600) |
||||
reg |= (1 << PLL_DCCON_SHIFT); |
||||
writel(reg, &pll->pll_misc); |
||||
|
||||
/* Enable PLLX */ |
||||
reg = readl(&pll->pll_base); |
||||
reg |= PLL_ENABLE_MASK; |
||||
|
||||
/* Disable BYPASS */ |
||||
reg &= ~PLL_BYPASS_MASK; |
||||
writel(reg, &pll->pll_base); |
||||
|
||||
/* Set lock_enable to PLLX_MISC */ |
||||
reg = readl(&pll->pll_misc); |
||||
reg |= PLL_LOCK_ENABLE_MASK; |
||||
writel(reg, &pll->pll_misc); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void init_pllx(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
struct clk_pll_simple *pll = &clkrst->crc_pll_simple[SIMPLE_PLLX]; |
||||
int chip_type; |
||||
enum clock_osc_freq osc; |
||||
struct clk_pll_table *sel; |
||||
|
||||
debug("init_pllx entry\n"); |
||||
|
||||
/* get chip type */ |
||||
chip_type = tegra_get_chip_type(); |
||||
debug(" init_pllx: chip_type = %d\n", chip_type); |
||||
|
||||
/* get osc freq */ |
||||
osc = clock_get_osc_freq(); |
||||
debug(" init_pllx: osc = %d\n", osc); |
||||
|
||||
/* set pllx */ |
||||
sel = &tegra_pll_x_table[chip_type][osc]; |
||||
pllx_set_rate(pll, sel->n, sel->m, sel->p, sel->cpcon); |
||||
|
||||
/* adjust PLLP_out1-4 on T30/T114 */ |
||||
if (chip_type == TEGRA_SOC_T30 || chip_type == TEGRA_SOC_T114) { |
||||
debug(" init_pllx: adjusting PLLP out freqs\n"); |
||||
adjust_pllp_out_freqs(); |
||||
} |
||||
} |
||||
|
||||
void enable_cpu_clock(int enable) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 clk; |
||||
|
||||
/*
|
||||
* NOTE: |
||||
* Regardless of whether the request is to enable or disable the CPU |
||||
* clock, every processor in the CPU complex except the master (CPU 0) |
||||
* will have it's clock stopped because the AVP only talks to the |
||||
* master. |
||||
*/ |
||||
|
||||
if (enable) { |
||||
/* Initialize PLLX */ |
||||
init_pllx(); |
||||
|
||||
/* Wait until all clocks are stable */ |
||||
udelay(PLL_STABILIZATION_DELAY); |
||||
|
||||
writel(CCLK_BURST_POLICY, &clkrst->crc_cclk_brst_pol); |
||||
writel(SUPER_CCLK_DIVIDER, &clkrst->crc_super_cclk_div); |
||||
} |
||||
|
||||
/*
|
||||
* Read the register containing the individual CPU clock enables and |
||||
* always stop the clocks to CPUs > 0. |
||||
*/ |
||||
clk = readl(&clkrst->crc_clk_cpu_cmplx); |
||||
clk |= 1 << CPU1_CLK_STP_SHIFT; |
||||
if (get_num_cpus() == 4) |
||||
clk |= (1 << CPU2_CLK_STP_SHIFT) + (1 << CPU3_CLK_STP_SHIFT); |
||||
|
||||
/* Stop/Unstop the CPU clock */ |
||||
clk &= ~CPU0_CLK_STP_MASK; |
||||
clk |= !enable << CPU0_CLK_STP_SHIFT; |
||||
writel(clk, &clkrst->crc_clk_cpu_cmplx); |
||||
|
||||
clock_enable(PERIPH_ID_CPU); |
||||
} |
||||
|
||||
static int is_cpu_powered(void) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
|
||||
return (readl(&pmc->pmc_pwrgate_status) & CPU_PWRED) ? 1 : 0; |
||||
} |
||||
|
||||
static void remove_cpu_io_clamps(void) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
u32 reg; |
||||
|
||||
/* Remove the clamps on the CPU I/O signals */ |
||||
reg = readl(&pmc->pmc_remove_clamping); |
||||
reg |= CPU_CLMP; |
||||
writel(reg, &pmc->pmc_remove_clamping); |
||||
|
||||
/* Give I/O signals time to stabilize */ |
||||
udelay(IO_STABILIZATION_DELAY); |
||||
} |
||||
|
||||
void powerup_cpu(void) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
u32 reg; |
||||
int timeout = IO_STABILIZATION_DELAY; |
||||
|
||||
if (!is_cpu_powered()) { |
||||
/* Toggle the CPU power state (OFF -> ON) */ |
||||
reg = readl(&pmc->pmc_pwrgate_toggle); |
||||
reg &= PARTID_CP; |
||||
reg |= START_CP; |
||||
writel(reg, &pmc->pmc_pwrgate_toggle); |
||||
|
||||
/* Wait for the power to come up */ |
||||
while (!is_cpu_powered()) { |
||||
if (timeout-- == 0) |
||||
printf("CPU failed to power up!\n"); |
||||
else |
||||
udelay(10); |
||||
} |
||||
|
||||
/*
|
||||
* Remove the I/O clamps from CPU power partition. |
||||
* Recommended only on a Warm boot, if the CPU partition gets |
||||
* power gated. Shouldn't cause any harm when called after a |
||||
* cold boot according to HW, probably just redundant. |
||||
*/ |
||||
remove_cpu_io_clamps(); |
||||
} |
||||
} |
||||
|
||||
void reset_A9_cpu(int reset) |
||||
{ |
||||
/*
|
||||
* NOTE: Regardless of whether the request is to hold the CPU in reset |
||||
* or take it out of reset, every processor in the CPU complex |
||||
* except the master (CPU 0) will be held in reset because the |
||||
* AVP only talks to the master. The AVP does not know that there |
||||
* are multiple processors in the CPU complex. |
||||
*/ |
||||
int mask = crc_rst_cpu | crc_rst_de | crc_rst_debug; |
||||
int num_cpus = get_num_cpus(); |
||||
int cpu; |
||||
|
||||
debug("reset_a9_cpu entry\n"); |
||||
/* Hold CPUs 1 onwards in reset, and CPU 0 if asked */ |
||||
for (cpu = 1; cpu < num_cpus; cpu++) |
||||
reset_cmplx_set_enable(cpu, mask, 1); |
||||
reset_cmplx_set_enable(0, mask, reset); |
||||
|
||||
/* Enable/Disable master CPU reset */ |
||||
reset_set_enable(PERIPH_ID_CPU, reset); |
||||
} |
||||
|
||||
void clock_enable_coresight(int enable) |
||||
{ |
||||
u32 rst, src = 2; |
||||
int chip; |
||||
|
||||
debug("clock_enable_coresight entry\n"); |
||||
clock_set_enable(PERIPH_ID_CORESIGHT, enable); |
||||
reset_set_enable(PERIPH_ID_CORESIGHT, !enable); |
||||
|
||||
if (enable) { |
||||
/*
|
||||
* Put CoreSight on PLLP_OUT0 (216 MHz) and divide it down by |
||||
* 1.5, giving an effective frequency of 144MHz. |
||||
* Set PLLP_OUT0 [bits31:30 = 00], and use a 7.1 divisor |
||||
* (bits 7:0), so 00000001b == 1.5 (n+1 + .5) |
||||
* |
||||
* Clock divider request for 204MHz would setup CSITE clock as |
||||
* 144MHz for PLLP base 216MHz and 204MHz for PLLP base 408MHz |
||||
*/ |
||||
chip = tegra_get_chip_type(); |
||||
if (chip == TEGRA_SOC_T30 || chip == TEGRA_SOC_T114) |
||||
src = CLK_DIVIDER(NVBL_PLLP_KHZ, 204000); |
||||
else if (chip == TEGRA_SOC_T20 || chip == TEGRA_SOC_T25) |
||||
src = CLK_DIVIDER(NVBL_PLLP_KHZ, 144000); |
||||
else |
||||
printf("%s: Unknown chip type %X!\n", __func__, chip); |
||||
clock_ll_set_source_divisor(PERIPH_ID_CSI, 0, src); |
||||
|
||||
/* Unlock the CPU CoreSight interfaces */ |
||||
rst = CORESIGHT_UNLOCK; |
||||
writel(rst, CSITE_CPU_DBG0_LAR); |
||||
writel(rst, CSITE_CPU_DBG1_LAR); |
||||
if (get_num_cpus() == 4) { |
||||
writel(rst, CSITE_CPU_DBG2_LAR); |
||||
writel(rst, CSITE_CPU_DBG3_LAR); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void halt_avp(void) |
||||
{ |
||||
for (;;) { |
||||
writel((HALT_COP_EVENT_JTAG | HALT_COP_EVENT_IRQ_1 \
|
||||
| HALT_COP_EVENT_FIQ_1 | (FLOW_MODE_STOP<<29)), |
||||
FLOW_CTLR_HALT_COP_EVENTS); |
||||
} |
||||
} |
@ -0,0 +1,42 @@ |
||||
#
|
||||
# Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2000-2008
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = $(obj)lib$(SOC).o
|
||||
|
||||
#COBJS-y += cpu.o t11x.o
|
||||
COBJS-y += cpu.o
|
||||
|
||||
SRCS := $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||
|
||||
all: $(obj).depend $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk |
||||
|
||||
sinclude $(obj).depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,19 @@ |
||||
#
|
||||
# Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2002
|
||||
# Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
USE_PRIVATE_LIBGCC = yes
|
@ -0,0 +1,297 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/flow.h> |
||||
#include <asm/arch/pinmux.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch-tegra/clk_rst.h> |
||||
#include <asm/arch-tegra/pmc.h> |
||||
#include "../tegra-common/cpu.h" |
||||
|
||||
/* Tegra114-specific CPU init code */ |
||||
static void enable_cpu_power_rail(void) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 reg; |
||||
|
||||
debug("enable_cpu_power_rail entry\n"); |
||||
|
||||
/* un-tristate PWR_I2C SCL/SDA, rest of the defaults are correct */ |
||||
pinmux_tristate_disable(PINGRP_PWR_I2C_SCL); |
||||
pinmux_tristate_disable(PINGRP_PWR_I2C_SDA); |
||||
|
||||
/*
|
||||
* Set CPUPWRGOOD_TIMER - APB clock is 1/2 of SCLK (102MHz), |
||||
* set it for 25ms (102MHz * .025) |
||||
*/ |
||||
reg = 0x26E8F0; |
||||
writel(reg, &pmc->pmc_cpupwrgood_timer); |
||||
|
||||
/* Set polarity to 0 (normal) and enable CPUPWRREQ_OE */ |
||||
clrbits_le32(&pmc->pmc_cntrl, CPUPWRREQ_POL); |
||||
setbits_le32(&pmc->pmc_cntrl, CPUPWRREQ_OE); |
||||
|
||||
/*
|
||||
* Set CLK_RST_CONTROLLER_CPU_SOFTRST_CTRL2_0_CAR2PMC_CPU_ACK_WIDTH |
||||
* to 408 to satisfy the requirement of having at least 16 CPU clock |
||||
* cycles before clamp removal. |
||||
*/ |
||||
|
||||
clrbits_le32(&clkrst->crc_cpu_softrst_ctrl2, 0xFFF); |
||||
setbits_le32(&clkrst->crc_cpu_softrst_ctrl2, 408); |
||||
} |
||||
|
||||
static void enable_cpu_clocks(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 reg; |
||||
|
||||
debug("enable_cpu_clocks entry\n"); |
||||
|
||||
/* Wait for PLL-X to lock */ |
||||
do { |
||||
reg = readl(&clkrst->crc_pll_simple[SIMPLE_PLLX].pll_base); |
||||
} while ((reg & (1 << 27)) == 0); |
||||
|
||||
/* Wait until all clocks are stable */ |
||||
udelay(PLL_STABILIZATION_DELAY); |
||||
|
||||
writel(CCLK_BURST_POLICY, &clkrst->crc_cclk_brst_pol); |
||||
writel(SUPER_CCLK_DIVIDER, &clkrst->crc_super_cclk_div); |
||||
|
||||
/* Always enable the main CPU complex clocks */ |
||||
clock_enable(PERIPH_ID_CPU); |
||||
clock_enable(PERIPH_ID_CPULP); |
||||
clock_enable(PERIPH_ID_CPUG); |
||||
} |
||||
|
||||
static void remove_cpu_resets(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 reg; |
||||
|
||||
debug("remove_cpu_resets entry\n"); |
||||
/* Take the slow non-CPU partition out of reset */ |
||||
reg = readl(&clkrst->crc_rst_cpulp_cmplx_clr); |
||||
writel((reg | CLR_NONCPURESET), &clkrst->crc_rst_cpulp_cmplx_clr); |
||||
|
||||
/* Take the fast non-CPU partition out of reset */ |
||||
reg = readl(&clkrst->crc_rst_cpug_cmplx_clr); |
||||
writel((reg | CLR_NONCPURESET), &clkrst->crc_rst_cpug_cmplx_clr); |
||||
|
||||
/* Clear the SW-controlled reset of the slow cluster */ |
||||
reg = readl(&clkrst->crc_rst_cpulp_cmplx_clr); |
||||
reg |= (CLR_CPURESET0+CLR_DBGRESET0+CLR_CORERESET0+CLR_CXRESET0); |
||||
writel(reg, &clkrst->crc_rst_cpulp_cmplx_clr); |
||||
|
||||
/* Clear the SW-controlled reset of the fast cluster */ |
||||
reg = readl(&clkrst->crc_rst_cpug_cmplx_clr); |
||||
reg |= (CLR_CPURESET0+CLR_DBGRESET0+CLR_CORERESET0+CLR_CXRESET0); |
||||
reg |= (CLR_CPURESET1+CLR_DBGRESET1+CLR_CORERESET1+CLR_CXRESET1); |
||||
reg |= (CLR_CPURESET2+CLR_DBGRESET2+CLR_CORERESET2+CLR_CXRESET2); |
||||
reg |= (CLR_CPURESET3+CLR_DBGRESET3+CLR_CORERESET3+CLR_CXRESET3); |
||||
writel(reg, &clkrst->crc_rst_cpug_cmplx_clr); |
||||
} |
||||
|
||||
/**
|
||||
* The T114 requires some special clock initialization, including setting up |
||||
* the DVC I2C, turning on MSELECT and selecting the G CPU cluster |
||||
*/ |
||||
void t114_init_clocks(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
struct flow_ctlr *flow = (struct flow_ctlr *)NV_PA_FLOW_BASE; |
||||
u32 val; |
||||
|
||||
debug("t114_init_clocks entry\n"); |
||||
|
||||
/* Set active CPU cluster to G */ |
||||
clrbits_le32(&flow->cluster_control, 1); |
||||
|
||||
/*
|
||||
* Switch system clock to PLLP_OUT4 (108 MHz), AVP will now run |
||||
* at 108 MHz. This is glitch free as only the source is changed, no |
||||
* special precaution needed. |
||||
*/ |
||||
val = (SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_FIQ_SOURCE_SHIFT) | |
||||
(SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_IRQ_SOURCE_SHIFT) | |
||||
(SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_RUN_SOURCE_SHIFT) | |
||||
(SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_IDLE_SOURCE_SHIFT) | |
||||
(SCLK_SYS_STATE_RUN << SCLK_SYS_STATE_SHIFT); |
||||
writel(val, &clkrst->crc_sclk_brst_pol); |
||||
|
||||
writel(SUPER_SCLK_ENB_MASK, &clkrst->crc_super_sclk_div); |
||||
|
||||
debug("Setting up PLLX\n"); |
||||
init_pllx(); |
||||
|
||||
val = (1 << CLK_SYS_RATE_AHB_RATE_SHIFT); |
||||
writel(val, &clkrst->crc_clk_sys_rate); |
||||
|
||||
/* Enable clocks to required peripherals. TBD - minimize this list */ |
||||
debug("Enabling clocks\n"); |
||||
|
||||
clock_set_enable(PERIPH_ID_CACHE2, 1); |
||||
clock_set_enable(PERIPH_ID_GPIO, 1); |
||||
clock_set_enable(PERIPH_ID_TMR, 1); |
||||
clock_set_enable(PERIPH_ID_RTC, 1); |
||||
clock_set_enable(PERIPH_ID_CPU, 1); |
||||
clock_set_enable(PERIPH_ID_EMC, 1); |
||||
clock_set_enable(PERIPH_ID_I2C5, 1); |
||||
clock_set_enable(PERIPH_ID_FUSE, 1); |
||||
clock_set_enable(PERIPH_ID_PMC, 1); |
||||
clock_set_enable(PERIPH_ID_APBDMA, 1); |
||||
clock_set_enable(PERIPH_ID_MEM, 1); |
||||
clock_set_enable(PERIPH_ID_IRAMA, 1); |
||||
clock_set_enable(PERIPH_ID_IRAMB, 1); |
||||
clock_set_enable(PERIPH_ID_IRAMC, 1); |
||||
clock_set_enable(PERIPH_ID_IRAMD, 1); |
||||
clock_set_enable(PERIPH_ID_CORESIGHT, 1); |
||||
clock_set_enable(PERIPH_ID_MSELECT, 1); |
||||
clock_set_enable(PERIPH_ID_EMC1, 1); |
||||
clock_set_enable(PERIPH_ID_MC1, 1); |
||||
clock_set_enable(PERIPH_ID_DVFS, 1); |
||||
|
||||
/* Switch MSELECT clock to PLLP (00) */ |
||||
clock_ll_set_source(PERIPH_ID_MSELECT, 0); |
||||
|
||||
/*
|
||||
* Clock divider request for 102MHz would setup MSELECT clock as |
||||
* 102MHz for PLLP base 408MHz |
||||
*/ |
||||
clock_ll_set_source_divisor(PERIPH_ID_MSELECT, 0, |
||||
(NVBL_PLLP_KHZ/102000)); |
||||
|
||||
/* I2C5 (DVC) gets CLK_M and a divisor of 17 */ |
||||
clock_ll_set_source_divisor(PERIPH_ID_I2C5, 3, 16); |
||||
|
||||
/* Give clocks time to stabilize */ |
||||
udelay(1000); |
||||
|
||||
/* Take required peripherals out of reset */ |
||||
debug("Taking periphs out of reset\n"); |
||||
reset_set_enable(PERIPH_ID_CACHE2, 0); |
||||
reset_set_enable(PERIPH_ID_GPIO, 0); |
||||
reset_set_enable(PERIPH_ID_TMR, 0); |
||||
reset_set_enable(PERIPH_ID_COP, 0); |
||||
reset_set_enable(PERIPH_ID_EMC, 0); |
||||
reset_set_enable(PERIPH_ID_I2C5, 0); |
||||
reset_set_enable(PERIPH_ID_FUSE, 0); |
||||
reset_set_enable(PERIPH_ID_APBDMA, 0); |
||||
reset_set_enable(PERIPH_ID_MEM, 0); |
||||
reset_set_enable(PERIPH_ID_CORESIGHT, 0); |
||||
reset_set_enable(PERIPH_ID_MSELECT, 0); |
||||
reset_set_enable(PERIPH_ID_EMC1, 0); |
||||
reset_set_enable(PERIPH_ID_MC1, 0); |
||||
|
||||
debug("t114_init_clocks exit\n"); |
||||
} |
||||
|
||||
static int is_partition_powered(u32 mask) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
u32 reg; |
||||
|
||||
/* Get power gate status */ |
||||
reg = readl(&pmc->pmc_pwrgate_status); |
||||
return (reg & mask) == mask; |
||||
} |
||||
|
||||
static int is_clamp_enabled(u32 mask) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
u32 reg; |
||||
|
||||
/* Get clamp status. TODO: Add pmc_clamp_status alias to pmc.h */ |
||||
reg = readl(&pmc->pmc_pwrgate_timer_on); |
||||
return (reg & mask) == mask; |
||||
} |
||||
|
||||
static void power_partition(u32 status, u32 partid) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
|
||||
debug("%s: status = %08X, part ID = %08X\n", __func__, status, partid); |
||||
/* Is the partition already on? */ |
||||
if (!is_partition_powered(status)) { |
||||
/* No, toggle the partition power state (OFF -> ON) */ |
||||
debug("power_partition, toggling state\n"); |
||||
clrbits_le32(&pmc->pmc_pwrgate_toggle, 0x1F); |
||||
setbits_le32(&pmc->pmc_pwrgate_toggle, partid); |
||||
setbits_le32(&pmc->pmc_pwrgate_toggle, START_CP); |
||||
|
||||
/* Wait for the power to come up */ |
||||
while (!is_partition_powered(status)) |
||||
; |
||||
|
||||
/* Wait for the clamp status to be cleared */ |
||||
while (is_clamp_enabled(status)) |
||||
; |
||||
|
||||
/* Give I/O signals time to stabilize */ |
||||
udelay(IO_STABILIZATION_DELAY); |
||||
} |
||||
} |
||||
|
||||
void powerup_cpus(void) |
||||
{ |
||||
debug("powerup_cpus entry\n"); |
||||
|
||||
/* We boot to the fast cluster */ |
||||
debug("powerup_cpus entry: G cluster\n"); |
||||
/* Power up the fast cluster rail partition */ |
||||
power_partition(CRAIL, CRAILID); |
||||
|
||||
/* Power up the fast cluster non-CPU partition */ |
||||
power_partition(C0NC, C0NCID); |
||||
|
||||
/* Power up the fast cluster CPU0 partition */ |
||||
power_partition(CE0, CE0ID); |
||||
} |
||||
|
||||
void start_cpu(u32 reset_vector) |
||||
{ |
||||
debug("start_cpu entry, reset_vector = %x\n", reset_vector); |
||||
|
||||
t114_init_clocks(); |
||||
|
||||
/* Enable VDD_CPU */ |
||||
enable_cpu_power_rail(); |
||||
|
||||
/* Get the CPU(s) running */ |
||||
enable_cpu_clocks(); |
||||
|
||||
/* Enable CoreSight */ |
||||
clock_enable_coresight(1); |
||||
|
||||
/* Take CPU(s) out of reset */ |
||||
remove_cpu_resets(); |
||||
|
||||
/*
|
||||
* Set the entry point for CPU execution from reset, |
||||
* if it's a non-zero value. |
||||
*/ |
||||
if (reset_vector) |
||||
writel(reset_vector, EXCEP_VECTOR_CPU_RESET_VECTOR); |
||||
|
||||
/* If the CPU(s) don't already have power, power 'em up */ |
||||
powerup_cpus(); |
||||
} |
@ -0,0 +1,41 @@ |
||||
#
|
||||
# Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2000-2008
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = $(obj)lib$(SOC).o
|
||||
|
||||
COBJS-y += cpu.o
|
||||
|
||||
SRCS := $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||
|
||||
all: $(obj).depend $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk |
||||
|
||||
sinclude $(obj).depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,19 @@ |
||||
#
|
||||
# Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2002
|
||||
# Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
USE_PRIVATE_LIBGCC = yes
|
@ -0,0 +1,176 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/flow.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch-tegra/clk_rst.h> |
||||
#include <asm/arch-tegra/pmc.h> |
||||
#include <asm/arch-tegra/tegra_i2c.h> |
||||
#include "../tegra-common/cpu.h" |
||||
|
||||
/* Tegra30-specific CPU init code */ |
||||
void tegra_i2c_ll_write_addr(uint addr, uint config) |
||||
{ |
||||
struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE; |
||||
|
||||
writel(addr, ®->cmd_addr0); |
||||
writel(config, ®->cnfg); |
||||
} |
||||
|
||||
void tegra_i2c_ll_write_data(uint data, uint config) |
||||
{ |
||||
struct i2c_ctlr *reg = (struct i2c_ctlr *)TEGRA_DVC_BASE; |
||||
|
||||
writel(data, ®->cmd_data1); |
||||
writel(config, ®->cnfg); |
||||
} |
||||
|
||||
#define TPS65911_I2C_ADDR 0x5A |
||||
#define TPS65911_VDDCTRL_OP_REG 0x28 |
||||
#define TPS65911_VDDCTRL_SR_REG 0x27 |
||||
#define TPS65911_VDDCTRL_OP_DATA (0x2300 | TPS65911_VDDCTRL_OP_REG) |
||||
#define TPS65911_VDDCTRL_SR_DATA (0x0100 | TPS65911_VDDCTRL_SR_REG) |
||||
#define I2C_SEND_2_BYTES 0x0A02 |
||||
|
||||
static void enable_cpu_power_rail(void) |
||||
{ |
||||
struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; |
||||
u32 reg; |
||||
|
||||
debug("enable_cpu_power_rail entry\n"); |
||||
reg = readl(&pmc->pmc_cntrl); |
||||
reg |= CPUPWRREQ_OE; |
||||
writel(reg, &pmc->pmc_cntrl); |
||||
|
||||
/*
|
||||
* Bring up CPU VDD via the TPS65911x PMIC on the DVC I2C bus. |
||||
* First set VDD to 1.4V, then enable the VDD regulator. |
||||
*/ |
||||
tegra_i2c_ll_write_addr(TPS65911_I2C_ADDR, 2); |
||||
tegra_i2c_ll_write_data(TPS65911_VDDCTRL_OP_DATA, I2C_SEND_2_BYTES); |
||||
udelay(1000); |
||||
tegra_i2c_ll_write_data(TPS65911_VDDCTRL_SR_DATA, I2C_SEND_2_BYTES); |
||||
udelay(10 * 1000); |
||||
} |
||||
|
||||
/**
|
||||
* The T30 requires some special clock initialization, including setting up |
||||
* the dvc i2c, turning on mselect and selecting the G CPU cluster |
||||
*/ |
||||
void t30_init_clocks(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
struct flow_ctlr *flow = (struct flow_ctlr *)NV_PA_FLOW_BASE; |
||||
u32 val; |
||||
|
||||
debug("t30_init_clocks entry\n"); |
||||
/* Set active CPU cluster to G */ |
||||
clrbits_le32(flow->cluster_control, 1 << 0); |
||||
|
||||
/*
|
||||
* Switch system clock to PLLP_OUT4 (108 MHz), AVP will now run |
||||
* at 108 MHz. This is glitch free as only the source is changed, no |
||||
* special precaution needed. |
||||
*/ |
||||
val = (SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_FIQ_SOURCE_SHIFT) | |
||||
(SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_IRQ_SOURCE_SHIFT) | |
||||
(SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_RUN_SOURCE_SHIFT) | |
||||
(SCLK_SOURCE_PLLP_OUT4 << SCLK_SWAKEUP_IDLE_SOURCE_SHIFT) | |
||||
(SCLK_SYS_STATE_RUN << SCLK_SYS_STATE_SHIFT); |
||||
writel(val, &clkrst->crc_sclk_brst_pol); |
||||
|
||||
writel(SUPER_SCLK_ENB_MASK, &clkrst->crc_super_sclk_div); |
||||
|
||||
val = (0 << CLK_SYS_RATE_HCLK_DISABLE_SHIFT) | |
||||
(1 << CLK_SYS_RATE_AHB_RATE_SHIFT) | |
||||
(0 << CLK_SYS_RATE_PCLK_DISABLE_SHIFT) | |
||||
(0 << CLK_SYS_RATE_APB_RATE_SHIFT); |
||||
writel(val, &clkrst->crc_clk_sys_rate); |
||||
|
||||
/* Put i2c, mselect in reset and enable clocks */ |
||||
reset_set_enable(PERIPH_ID_DVC_I2C, 1); |
||||
clock_set_enable(PERIPH_ID_DVC_I2C, 1); |
||||
reset_set_enable(PERIPH_ID_MSELECT, 1); |
||||
clock_set_enable(PERIPH_ID_MSELECT, 1); |
||||
|
||||
/* Switch MSELECT clock to PLLP (00) */ |
||||
clock_ll_set_source(PERIPH_ID_MSELECT, 0); |
||||
|
||||
/*
|
||||
* Our high-level clock routines are not available prior to |
||||
* relocation. We use the low-level functions which require a |
||||
* hard-coded divisor. Use CLK_M with divide by (n + 1 = 17) |
||||
*/ |
||||
clock_ll_set_source_divisor(PERIPH_ID_DVC_I2C, 3, 16); |
||||
|
||||
/*
|
||||
* Give clocks time to stabilize, then take i2c and mselect out of |
||||
* reset |
||||
*/ |
||||
udelay(1000); |
||||
reset_set_enable(PERIPH_ID_DVC_I2C, 0); |
||||
reset_set_enable(PERIPH_ID_MSELECT, 0); |
||||
} |
||||
|
||||
static void set_cpu_running(int run) |
||||
{ |
||||
struct flow_ctlr *flow = (struct flow_ctlr *)NV_PA_FLOW_BASE; |
||||
|
||||
debug("set_cpu_running entry, run = %d\n", run); |
||||
writel(run ? FLOW_MODE_NONE : FLOW_MODE_STOP, &flow->halt_cpu_events); |
||||
} |
||||
|
||||
void start_cpu(u32 reset_vector) |
||||
{ |
||||
debug("start_cpu entry, reset_vector = %x\n", reset_vector); |
||||
t30_init_clocks(); |
||||
|
||||
/* Enable VDD_CPU */ |
||||
enable_cpu_power_rail(); |
||||
|
||||
set_cpu_running(0); |
||||
|
||||
/* Hold the CPUs in reset */ |
||||
reset_A9_cpu(1); |
||||
|
||||
/* Disable the CPU clock */ |
||||
enable_cpu_clock(0); |
||||
|
||||
/* Enable CoreSight */ |
||||
clock_enable_coresight(1); |
||||
|
||||
/*
|
||||
* Set the entry point for CPU execution from reset, |
||||
* if it's a non-zero value. |
||||
*/ |
||||
if (reset_vector) |
||||
writel(reset_vector, EXCEP_VECTOR_CPU_RESET_VECTOR); |
||||
|
||||
/* Enable the CPU clock */ |
||||
enable_cpu_clock(1); |
||||
|
||||
/* If the CPU doesn't already have power, power it up */ |
||||
powerup_cpu(); |
||||
|
||||
/* Take the CPU out of reset */ |
||||
reset_A9_cpu(0); |
||||
|
||||
set_cpu_running(1); |
||||
} |
@ -0,0 +1,18 @@ |
||||
options { |
||||
driveTag = 0x00; |
||||
flags = 0x01; |
||||
} |
||||
|
||||
sources { |
||||
u_boot_spl="spl/u-boot-spl.bin"; |
||||
u_boot="u-boot.bin"; |
||||
} |
||||
|
||||
section (0) { |
||||
load u_boot_spl > 0x0000; |
||||
load ivt (entry = 0x0014) > 0x8000; |
||||
call 0x8000; |
||||
|
||||
load u_boot > 0x40000100; |
||||
call 0x40000100; |
||||
} |
@ -0,0 +1,40 @@ |
||||
#
|
||||
# Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2000-2003
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = $(obj)lib$(SOC).o
|
||||
|
||||
COBJS := $(COBJS-y)
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
|
||||
all: $(obj).depend $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk |
||||
|
||||
sinclude $(obj).depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,19 @@ |
||||
#
|
||||
# Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2002
|
||||
# Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
CONFIG_ARCH_DEVICE_TREE := tegra114
|
@ -0,0 +1,40 @@ |
||||
#
|
||||
# Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2000-2003
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = $(obj)lib$(SOC).o
|
||||
|
||||
COBJS := $(COBJS-y)
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
|
||||
all: $(obj).depend $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk |
||||
|
||||
sinclude $(obj).depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,19 @@ |
||||
#
|
||||
# Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2002
|
||||
# Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
CONFIG_ARCH_DEVICE_TREE := tegra30
|
@ -0,0 +1,560 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra SoC common clock control functions */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch-tegra/clk_rst.h> |
||||
#include <asm/arch-tegra/timer.h> |
||||
#include <div64.h> |
||||
#include <fdtdec.h> |
||||
|
||||
/*
|
||||
* This is our record of the current clock rate of each clock. We don't |
||||
* fill all of these in since we are only really interested in clocks which |
||||
* we use as parents. |
||||
*/ |
||||
static unsigned pll_rate[CLOCK_ID_COUNT]; |
||||
|
||||
/*
|
||||
* The oscillator frequency is fixed to one of four set values. Based on this |
||||
* the other clocks are set up appropriately. |
||||
*/ |
||||
static unsigned osc_freq[CLOCK_OSC_FREQ_COUNT] = { |
||||
13000000, |
||||
19200000, |
||||
12000000, |
||||
26000000, |
||||
}; |
||||
|
||||
/* return 1 if a peripheral ID is in range */ |
||||
#define clock_type_id_isvalid(id) ((id) >= 0 && \ |
||||
(id) < CLOCK_TYPE_COUNT) |
||||
|
||||
char pllp_valid = 1; /* PLLP is set up correctly */ |
||||
|
||||
/* return 1 if a periphc_internal_id is in range */ |
||||
#define periphc_internal_id_isvalid(id) ((id) >= 0 && \ |
||||
(id) < PERIPHC_COUNT) |
||||
|
||||
/* number of clock outputs of a PLL */ |
||||
static const u8 pll_num_clkouts[] = { |
||||
1, /* PLLC */ |
||||
1, /* PLLM */ |
||||
4, /* PLLP */ |
||||
1, /* PLLA */ |
||||
0, /* PLLU */ |
||||
0, /* PLLD */ |
||||
}; |
||||
|
||||
int clock_get_osc_bypass(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 reg; |
||||
|
||||
reg = readl(&clkrst->crc_osc_ctrl); |
||||
return (reg & OSC_XOBP_MASK) >> OSC_XOBP_SHIFT; |
||||
} |
||||
|
||||
/* Returns a pointer to the registers of the given pll */ |
||||
static struct clk_pll *get_pll(enum clock_id clkid) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
|
||||
assert(clock_id_is_pll(clkid)); |
||||
return &clkrst->crc_pll[clkid]; |
||||
} |
||||
|
||||
int clock_ll_read_pll(enum clock_id clkid, u32 *divm, u32 *divn, |
||||
u32 *divp, u32 *cpcon, u32 *lfcon) |
||||
{ |
||||
struct clk_pll *pll = get_pll(clkid); |
||||
u32 data; |
||||
|
||||
assert(clkid != CLOCK_ID_USB); |
||||
|
||||
/* Safety check, adds to code size but is small */ |
||||
if (!clock_id_is_pll(clkid) || clkid == CLOCK_ID_USB) |
||||
return -1; |
||||
data = readl(&pll->pll_base); |
||||
*divm = (data & PLL_DIVM_MASK) >> PLL_DIVM_SHIFT; |
||||
*divn = (data & PLL_DIVN_MASK) >> PLL_DIVN_SHIFT; |
||||
*divp = (data & PLL_DIVP_MASK) >> PLL_DIVP_SHIFT; |
||||
data = readl(&pll->pll_misc); |
||||
*cpcon = (data & PLL_CPCON_MASK) >> PLL_CPCON_SHIFT; |
||||
*lfcon = (data & PLL_LFCON_MASK) >> PLL_LFCON_SHIFT; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
unsigned long clock_start_pll(enum clock_id clkid, u32 divm, u32 divn, |
||||
u32 divp, u32 cpcon, u32 lfcon) |
||||
{ |
||||
struct clk_pll *pll = get_pll(clkid); |
||||
u32 data; |
||||
|
||||
/*
|
||||
* We cheat by treating all PLL (except PLLU) in the same fashion. |
||||
* This works only because: |
||||
* - same fields are always mapped at same offsets, except DCCON |
||||
* - DCCON is always 0, doesn't conflict |
||||
* - M,N, P of PLLP values are ignored for PLLP |
||||
*/ |
||||
data = (cpcon << PLL_CPCON_SHIFT) | (lfcon << PLL_LFCON_SHIFT); |
||||
writel(data, &pll->pll_misc); |
||||
|
||||
data = (divm << PLL_DIVM_SHIFT) | (divn << PLL_DIVN_SHIFT) | |
||||
(0 << PLL_BYPASS_SHIFT) | (1 << PLL_ENABLE_SHIFT); |
||||
|
||||
if (clkid == CLOCK_ID_USB) |
||||
data |= divp << PLLU_VCO_FREQ_SHIFT; |
||||
else |
||||
data |= divp << PLL_DIVP_SHIFT; |
||||
writel(data, &pll->pll_base); |
||||
|
||||
/* calculate the stable time */ |
||||
return timer_get_us() + CLOCK_PLL_STABLE_DELAY_US; |
||||
} |
||||
|
||||
void clock_ll_set_source_divisor(enum periph_id periph_id, unsigned source, |
||||
unsigned divisor) |
||||
{ |
||||
u32 *reg = get_periph_source_reg(periph_id); |
||||
u32 value; |
||||
|
||||
value = readl(reg); |
||||
|
||||
value &= ~OUT_CLK_SOURCE_MASK; |
||||
value |= source << OUT_CLK_SOURCE_SHIFT; |
||||
|
||||
value &= ~OUT_CLK_DIVISOR_MASK; |
||||
value |= divisor << OUT_CLK_DIVISOR_SHIFT; |
||||
|
||||
writel(value, reg); |
||||
} |
||||
|
||||
void clock_ll_set_source(enum periph_id periph_id, unsigned source) |
||||
{ |
||||
u32 *reg = get_periph_source_reg(periph_id); |
||||
|
||||
clrsetbits_le32(reg, OUT_CLK_SOURCE_MASK, |
||||
source << OUT_CLK_SOURCE_SHIFT); |
||||
} |
||||
|
||||
/**
|
||||
* Given the parent's rate and the required rate for the children, this works |
||||
* out the peripheral clock divider to use, in 7.1 binary format. |
||||
* |
||||
* @param divider_bits number of divider bits (8 or 16) |
||||
* @param parent_rate clock rate of parent clock in Hz |
||||
* @param rate required clock rate for this clock |
||||
* @return divider which should be used |
||||
*/ |
||||
static int clk_get_divider(unsigned divider_bits, unsigned long parent_rate, |
||||
unsigned long rate) |
||||
{ |
||||
u64 divider = parent_rate * 2; |
||||
unsigned max_divider = 1 << divider_bits; |
||||
|
||||
divider += rate - 1; |
||||
do_div(divider, rate); |
||||
|
||||
if ((s64)divider - 2 < 0) |
||||
return 0; |
||||
|
||||
if ((s64)divider - 2 >= max_divider) |
||||
return -1; |
||||
|
||||
return divider - 2; |
||||
} |
||||
|
||||
int clock_set_pllout(enum clock_id clkid, enum pll_out_id pllout, unsigned rate) |
||||
{ |
||||
struct clk_pll *pll = get_pll(clkid); |
||||
int data = 0, div = 0, offset = 0; |
||||
|
||||
if (!clock_id_is_pll(clkid)) |
||||
return -1; |
||||
|
||||
if (pllout + 1 > pll_num_clkouts[clkid]) |
||||
return -1; |
||||
|
||||
div = clk_get_divider(8, pll_rate[clkid], rate); |
||||
|
||||
if (div < 0) |
||||
return -1; |
||||
|
||||
/* out2 and out4 are in the high part of the register */ |
||||
if (pllout == PLL_OUT2 || pllout == PLL_OUT4) |
||||
offset = 16; |
||||
|
||||
data = (div << PLL_OUT_RATIO_SHIFT) | |
||||
PLL_OUT_OVRRIDE | PLL_OUT_CLKEN | PLL_OUT_RSTN; |
||||
clrsetbits_le32(&pll->pll_out[pllout >> 1], |
||||
PLL_OUT_RATIO_MASK << offset, data << offset); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
/**
|
||||
* Given the parent's rate and the divider in 7.1 format, this works out the |
||||
* resulting peripheral clock rate. |
||||
* |
||||
* @param parent_rate clock rate of parent clock in Hz |
||||
* @param divider which should be used in 7.1 format |
||||
* @return effective clock rate of peripheral |
||||
*/ |
||||
static unsigned long get_rate_from_divider(unsigned long parent_rate, |
||||
int divider) |
||||
{ |
||||
u64 rate; |
||||
|
||||
rate = (u64)parent_rate * 2; |
||||
do_div(rate, divider + 2); |
||||
return rate; |
||||
} |
||||
|
||||
unsigned long clock_get_periph_rate(enum periph_id periph_id, |
||||
enum clock_id parent) |
||||
{ |
||||
u32 *reg = get_periph_source_reg(periph_id); |
||||
|
||||
return get_rate_from_divider(pll_rate[parent], |
||||
(readl(reg) & OUT_CLK_DIVISOR_MASK) >> OUT_CLK_DIVISOR_SHIFT); |
||||
} |
||||
|
||||
/**
|
||||
* Find the best available 7.1 format divisor given a parent clock rate and |
||||
* required child clock rate. This function assumes that a second-stage |
||||
* divisor is available which can divide by powers of 2 from 1 to 256. |
||||
* |
||||
* @param divider_bits number of divider bits (8 or 16) |
||||
* @param parent_rate clock rate of parent clock in Hz |
||||
* @param rate required clock rate for this clock |
||||
* @param extra_div value for the second-stage divisor (not set if this |
||||
* function returns -1. |
||||
* @return divider which should be used, or -1 if nothing is valid |
||||
* |
||||
*/ |
||||
static int find_best_divider(unsigned divider_bits, unsigned long parent_rate, |
||||
unsigned long rate, int *extra_div) |
||||
{ |
||||
int shift; |
||||
int best_divider = -1; |
||||
int best_error = rate; |
||||
|
||||
/* try dividers from 1 to 256 and find closest match */ |
||||
for (shift = 0; shift <= 8 && best_error > 0; shift++) { |
||||
unsigned divided_parent = parent_rate >> shift; |
||||
int divider = clk_get_divider(divider_bits, divided_parent, |
||||
rate); |
||||
unsigned effective_rate = get_rate_from_divider(divided_parent, |
||||
divider); |
||||
int error = rate - effective_rate; |
||||
|
||||
/* Given a valid divider, look for the lowest error */ |
||||
if (divider != -1 && error < best_error) { |
||||
best_error = error; |
||||
*extra_div = 1 << shift; |
||||
best_divider = divider; |
||||
} |
||||
} |
||||
|
||||
/* return what we found - *extra_div will already be set */ |
||||
return best_divider; |
||||
} |
||||
|
||||
/**
|
||||
* Adjust peripheral PLL to use the given divider and source. |
||||
* |
||||
* @param periph_id peripheral to adjust |
||||
* @param source Source number (0-3 or 0-7) |
||||
* @param mux_bits Number of mux bits (2 or 4) |
||||
* @param divider Required divider in 7.1 or 15.1 format |
||||
* @return 0 if ok, -1 on error (requesting a parent clock which is not valid |
||||
* for this peripheral) |
||||
*/ |
||||
static int adjust_periph_pll(enum periph_id periph_id, int source, |
||||
int mux_bits, unsigned divider) |
||||
{ |
||||
u32 *reg = get_periph_source_reg(periph_id); |
||||
|
||||
clrsetbits_le32(reg, OUT_CLK_DIVISOR_MASK, |
||||
divider << OUT_CLK_DIVISOR_SHIFT); |
||||
udelay(1); |
||||
|
||||
/* work out the source clock and set it */ |
||||
if (source < 0) |
||||
return -1; |
||||
if (mux_bits == 4) { |
||||
clrsetbits_le32(reg, OUT_CLK_SOURCE4_MASK, |
||||
source << OUT_CLK_SOURCE4_SHIFT); |
||||
} else { |
||||
clrsetbits_le32(reg, OUT_CLK_SOURCE_MASK, |
||||
source << OUT_CLK_SOURCE_SHIFT); |
||||
} |
||||
udelay(2); |
||||
return 0; |
||||
} |
||||
|
||||
unsigned clock_adjust_periph_pll_div(enum periph_id periph_id, |
||||
enum clock_id parent, unsigned rate, int *extra_div) |
||||
{ |
||||
unsigned effective_rate; |
||||
int mux_bits, divider_bits, source; |
||||
int divider; |
||||
|
||||
/* work out the source clock and set it */ |
||||
source = get_periph_clock_source(periph_id, parent, &mux_bits, |
||||
÷r_bits); |
||||
|
||||
if (extra_div) |
||||
divider = find_best_divider(divider_bits, pll_rate[parent], |
||||
rate, extra_div); |
||||
else |
||||
divider = clk_get_divider(divider_bits, pll_rate[parent], |
||||
rate); |
||||
assert(divider >= 0); |
||||
if (adjust_periph_pll(periph_id, source, mux_bits, divider)) |
||||
return -1U; |
||||
debug("periph %d, rate=%d, reg=%p = %x\n", periph_id, rate, |
||||
get_periph_source_reg(periph_id), |
||||
readl(get_periph_source_reg(periph_id))); |
||||
|
||||
/* Check what we ended up with. This shouldn't matter though */ |
||||
effective_rate = clock_get_periph_rate(periph_id, parent); |
||||
if (extra_div) |
||||
effective_rate /= *extra_div; |
||||
if (rate != effective_rate) |
||||
debug("Requested clock rate %u not honored (got %u)\n", |
||||
rate, effective_rate); |
||||
return effective_rate; |
||||
} |
||||
|
||||
unsigned clock_start_periph_pll(enum periph_id periph_id, |
||||
enum clock_id parent, unsigned rate) |
||||
{ |
||||
unsigned effective_rate; |
||||
|
||||
reset_set_enable(periph_id, 1); |
||||
clock_enable(periph_id); |
||||
|
||||
effective_rate = clock_adjust_periph_pll_div(periph_id, parent, rate, |
||||
NULL); |
||||
|
||||
reset_set_enable(periph_id, 0); |
||||
return effective_rate; |
||||
} |
||||
|
||||
void clock_enable(enum periph_id clkid) |
||||
{ |
||||
clock_set_enable(clkid, 1); |
||||
} |
||||
|
||||
void clock_disable(enum periph_id clkid) |
||||
{ |
||||
clock_set_enable(clkid, 0); |
||||
} |
||||
|
||||
void reset_periph(enum periph_id periph_id, int us_delay) |
||||
{ |
||||
/* Put peripheral into reset */ |
||||
reset_set_enable(periph_id, 1); |
||||
udelay(us_delay); |
||||
|
||||
/* Remove reset */ |
||||
reset_set_enable(periph_id, 0); |
||||
|
||||
udelay(us_delay); |
||||
} |
||||
|
||||
void reset_cmplx_set_enable(int cpu, int which, int reset) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 mask; |
||||
|
||||
/* Form the mask, which depends on the cpu chosen (2 or 4) */ |
||||
assert(cpu >= 0 && cpu < MAX_NUM_CPU); |
||||
mask = which << cpu; |
||||
|
||||
/* either enable or disable those reset for that CPU */ |
||||
if (reset) |
||||
writel(mask, &clkrst->crc_cpu_cmplx_set); |
||||
else |
||||
writel(mask, &clkrst->crc_cpu_cmplx_clr); |
||||
} |
||||
|
||||
unsigned clock_get_rate(enum clock_id clkid) |
||||
{ |
||||
struct clk_pll *pll; |
||||
u32 base; |
||||
u32 divm; |
||||
u64 parent_rate; |
||||
u64 rate; |
||||
|
||||
parent_rate = osc_freq[clock_get_osc_freq()]; |
||||
if (clkid == CLOCK_ID_OSC) |
||||
return parent_rate; |
||||
|
||||
pll = get_pll(clkid); |
||||
base = readl(&pll->pll_base); |
||||
|
||||
/* Oh for bf_unpack()... */ |
||||
rate = parent_rate * ((base & PLL_DIVN_MASK) >> PLL_DIVN_SHIFT); |
||||
divm = (base & PLL_DIVM_MASK) >> PLL_DIVM_SHIFT; |
||||
if (clkid == CLOCK_ID_USB) |
||||
divm <<= (base & PLLU_VCO_FREQ_MASK) >> PLLU_VCO_FREQ_SHIFT; |
||||
else |
||||
divm <<= (base & PLL_DIVP_MASK) >> PLL_DIVP_SHIFT; |
||||
do_div(rate, divm); |
||||
return rate; |
||||
} |
||||
|
||||
/**
|
||||
* Set the output frequency you want for each PLL clock. |
||||
* PLL output frequencies are programmed by setting their N, M and P values. |
||||
* The governing equations are: |
||||
* VCO = (Fi / m) * n, Fo = VCO / (2^p) |
||||
* where Fo is the output frequency from the PLL. |
||||
* Example: Set the output frequency to 216Mhz(Fo) with 12Mhz OSC(Fi) |
||||
* 216Mhz = ((12Mhz / m) * n) / (2^p) so n=432,m=12,p=1 |
||||
* Please see Tegra TRM section 5.3 to get the detail for PLL Programming |
||||
* |
||||
* @param n PLL feedback divider(DIVN) |
||||
* @param m PLL input divider(DIVN) |
||||
* @param p post divider(DIVP) |
||||
* @param cpcon base PLL charge pump(CPCON) |
||||
* @return 0 if ok, -1 on error (the requested PLL is incorrect and cannot |
||||
* be overriden), 1 if PLL is already correct |
||||
*/ |
||||
int clock_set_rate(enum clock_id clkid, u32 n, u32 m, u32 p, u32 cpcon) |
||||
{ |
||||
u32 base_reg; |
||||
u32 misc_reg; |
||||
struct clk_pll *pll; |
||||
|
||||
pll = get_pll(clkid); |
||||
|
||||
base_reg = readl(&pll->pll_base); |
||||
|
||||
/* Set BYPASS, m, n and p to PLL_BASE */ |
||||
base_reg &= ~PLL_DIVM_MASK; |
||||
base_reg |= m << PLL_DIVM_SHIFT; |
||||
|
||||
base_reg &= ~PLL_DIVN_MASK; |
||||
base_reg |= n << PLL_DIVN_SHIFT; |
||||
|
||||
base_reg &= ~PLL_DIVP_MASK; |
||||
base_reg |= p << PLL_DIVP_SHIFT; |
||||
|
||||
if (clkid == CLOCK_ID_PERIPH) { |
||||
/*
|
||||
* If the PLL is already set up, check that it is correct |
||||
* and record this info for clock_verify() to check. |
||||
*/ |
||||
if (base_reg & PLL_BASE_OVRRIDE_MASK) { |
||||
base_reg |= PLL_ENABLE_MASK; |
||||
if (base_reg != readl(&pll->pll_base)) |
||||
pllp_valid = 0; |
||||
return pllp_valid ? 1 : -1; |
||||
} |
||||
base_reg |= PLL_BASE_OVRRIDE_MASK; |
||||
} |
||||
|
||||
base_reg |= PLL_BYPASS_MASK; |
||||
writel(base_reg, &pll->pll_base); |
||||
|
||||
/* Set cpcon to PLL_MISC */ |
||||
misc_reg = readl(&pll->pll_misc); |
||||
misc_reg &= ~PLL_CPCON_MASK; |
||||
misc_reg |= cpcon << PLL_CPCON_SHIFT; |
||||
writel(misc_reg, &pll->pll_misc); |
||||
|
||||
/* Enable PLL */ |
||||
base_reg |= PLL_ENABLE_MASK; |
||||
writel(base_reg, &pll->pll_base); |
||||
|
||||
/* Disable BYPASS */ |
||||
base_reg &= ~PLL_BYPASS_MASK; |
||||
writel(base_reg, &pll->pll_base); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void clock_ll_start_uart(enum periph_id periph_id) |
||||
{ |
||||
/* Assert UART reset and enable clock */ |
||||
reset_set_enable(periph_id, 1); |
||||
clock_enable(periph_id); |
||||
clock_ll_set_source(periph_id, 0); /* UARTx_CLK_SRC = 00, PLLP_OUT0 */ |
||||
|
||||
/* wait for 2us */ |
||||
udelay(2); |
||||
|
||||
/* De-assert reset to UART */ |
||||
reset_set_enable(periph_id, 0); |
||||
} |
||||
|
||||
#ifdef CONFIG_OF_CONTROL |
||||
int clock_decode_periph_id(const void *blob, int node) |
||||
{ |
||||
enum periph_id id; |
||||
u32 cell[2]; |
||||
int err; |
||||
|
||||
err = fdtdec_get_int_array(blob, node, "clocks", cell, |
||||
ARRAY_SIZE(cell)); |
||||
if (err) |
||||
return -1; |
||||
id = clk_id_to_periph_id(cell[1]); |
||||
assert(clock_periph_id_isvalid(id)); |
||||
return id; |
||||
} |
||||
#endif /* CONFIG_OF_CONTROL */ |
||||
|
||||
int clock_verify(void) |
||||
{ |
||||
struct clk_pll *pll = get_pll(CLOCK_ID_PERIPH); |
||||
u32 reg = readl(&pll->pll_base); |
||||
|
||||
if (!pllp_valid) { |
||||
printf("Warning: PLLP %x is not correct\n", reg); |
||||
return -1; |
||||
} |
||||
debug("PLLP %x is correct\n", reg); |
||||
return 0; |
||||
} |
||||
|
||||
void clock_init(void) |
||||
{ |
||||
pll_rate[CLOCK_ID_MEMORY] = clock_get_rate(CLOCK_ID_MEMORY); |
||||
pll_rate[CLOCK_ID_PERIPH] = clock_get_rate(CLOCK_ID_PERIPH); |
||||
pll_rate[CLOCK_ID_CGENERAL] = clock_get_rate(CLOCK_ID_CGENERAL); |
||||
pll_rate[CLOCK_ID_OSC] = clock_get_rate(CLOCK_ID_OSC); |
||||
pll_rate[CLOCK_ID_SFROM32KHZ] = 32768; |
||||
pll_rate[CLOCK_ID_XCPU] = clock_get_rate(CLOCK_ID_XCPU); |
||||
debug("Osc = %d\n", pll_rate[CLOCK_ID_OSC]); |
||||
debug("PLLM = %d\n", pll_rate[CLOCK_ID_MEMORY]); |
||||
debug("PLLP = %d\n", pll_rate[CLOCK_ID_PERIPH]); |
||||
debug("PLLC = %d\n", pll_rate[CLOCK_ID_CGENERAL]); |
||||
debug("PLLX = %d\n", pll_rate[CLOCK_ID_XCPU]); |
||||
} |
@ -0,0 +1,41 @@ |
||||
#
|
||||
# Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2000-2008
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
LIB = $(obj)lib$(SOC)-common.o
|
||||
|
||||
COBJS-y += clock.o funcmux.o pinmux.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
|
||||
|
||||
all: $(obj).depend $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk |
||||
|
||||
sinclude $(obj).depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,655 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra114 Clock control functions */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch-tegra/clk_rst.h> |
||||
#include <asm/arch-tegra/timer.h> |
||||
#include <div64.h> |
||||
#include <fdtdec.h> |
||||
|
||||
/*
|
||||
* Clock types that we can use as a source. The Tegra114 has muxes for the |
||||
* peripheral clocks, and in most cases there are four options for the clock |
||||
* source. This gives us a clock 'type' and exploits what commonality exists |
||||
* in the device. |
||||
* |
||||
* Letters are obvious, except for T which means CLK_M, and S which means the |
||||
* clock derived from 32KHz. Beware that CLK_M (also called OSC in the |
||||
* datasheet) and PLL_M are different things. The former is the basic |
||||
* clock supplied to the SOC from an external oscillator. The latter is the |
||||
* memory clock PLL. |
||||
* |
||||
* See definitions in clock_id in the header file. |
||||
*/ |
||||
enum clock_type_id { |
||||
CLOCK_TYPE_AXPT, /* PLL_A, PLL_X, PLL_P, CLK_M */ |
||||
CLOCK_TYPE_MCPA, /* and so on */ |
||||
CLOCK_TYPE_MCPT, |
||||
CLOCK_TYPE_PCM, |
||||
CLOCK_TYPE_PCMT, |
||||
CLOCK_TYPE_PCMT16, |
||||
CLOCK_TYPE_PDCT, |
||||
CLOCK_TYPE_ACPT, |
||||
CLOCK_TYPE_ASPTE, |
||||
CLOCK_TYPE_PMDACD2T, |
||||
CLOCK_TYPE_PCST, |
||||
|
||||
CLOCK_TYPE_COUNT, |
||||
CLOCK_TYPE_NONE = -1, /* invalid clock type */ |
||||
}; |
||||
|
||||
enum { |
||||
CLOCK_MAX_MUX = 8 /* number of source options for each clock */ |
||||
}; |
||||
|
||||
enum { |
||||
MASK_BITS_31_30 = 2, /* num of bits used to specify clock source */ |
||||
MASK_BITS_31_29, |
||||
MASK_BITS_29_28, |
||||
}; |
||||
|
||||
/*
|
||||
* Clock source mux for each clock type. This just converts our enum into |
||||
* a list of mux sources for use by the code. |
||||
* |
||||
* Note: |
||||
* The extra column in each clock source array is used to store the mask |
||||
* bits in its register for the source. |
||||
*/ |
||||
#define CLK(x) CLOCK_ID_ ## x |
||||
static enum clock_id clock_source[CLOCK_TYPE_COUNT][CLOCK_MAX_MUX+1] = { |
||||
{ CLK(AUDIO), CLK(XCPU), CLK(PERIPH), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(AUDIO), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(NONE), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(DISPLAY), CLK(CGENERAL), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(AUDIO), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(AUDIO), CLK(SFROM32KHZ), CLK(PERIPH), CLK(OSC), |
||||
CLK(EPCI), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_29}, |
||||
{ CLK(PERIPH), CLK(MEMORY), CLK(DISPLAY), CLK(AUDIO), |
||||
CLK(CGENERAL), CLK(DISPLAY2), CLK(OSC), CLK(NONE), |
||||
MASK_BITS_31_29}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(SFROM32KHZ), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_29_28} |
||||
}; |
||||
|
||||
/*
|
||||
* Clock type for each peripheral clock source. We put the name in each |
||||
* record just so it is easy to match things up |
||||
*/ |
||||
#define TYPE(name, type) type |
||||
static enum clock_type_id clock_periph_type[PERIPHC_COUNT] = { |
||||
/* 0x00 */ |
||||
TYPE(PERIPHC_I2S1, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_I2S2, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_SPDIF_OUT, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_SPDIF_IN, CLOCK_TYPE_PCM), |
||||
TYPE(PERIPHC_PWM, CLOCK_TYPE_PCST), /* only PWM uses b29:28 */ |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SBC2, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SBC3, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x08 */ |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_I2C1, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_I2C5, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SBC1, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_DISP1, CLOCK_TYPE_PMDACD2T), |
||||
TYPE(PERIPHC_DISP2, CLOCK_TYPE_PMDACD2T), |
||||
|
||||
/* 0x10 */ |
||||
TYPE(PERIPHC_CVE, CLOCK_TYPE_PDCT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_VI, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SDMMC1, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SDMMC2, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_G3D, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_G2D, CLOCK_TYPE_MCPA), |
||||
|
||||
/* 0x18 */ |
||||
TYPE(PERIPHC_NDFLASH, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SDMMC4, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_VFIR, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_EPP, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_MPE, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_MIPI, CLOCK_TYPE_PCMT), /* MIPI base-band HSI */ |
||||
TYPE(PERIPHC_UART1, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_UART2, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x20 */ |
||||
TYPE(PERIPHC_HOST1X, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_TVO, CLOCK_TYPE_PDCT), |
||||
TYPE(PERIPHC_HDMI, CLOCK_TYPE_PMDACD2T), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_TVDAC, CLOCK_TYPE_PDCT), |
||||
TYPE(PERIPHC_I2C2, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_EMC, CLOCK_TYPE_MCPT), |
||||
|
||||
/* 0x28 */ |
||||
TYPE(PERIPHC_UART3, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_VI, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SBC4, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_I2C3, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_SDMMC3, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x30 */ |
||||
TYPE(PERIPHC_UART4, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_UART5, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_VDE, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_OWR, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_NOR, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_CSITE, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_I2S0, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
|
||||
/* 0x38h */ /* Jumps to reg offset 0x3B0h */ |
||||
TYPE(PERIPHC_G3D2, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_MSELECT, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_TSENSOR, CLOCK_TYPE_PCST), /* s/b PCTS */ |
||||
TYPE(PERIPHC_I2S3, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_I2S4, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_I2C4, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_SBC5, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SBC6, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x40 */ |
||||
TYPE(PERIPHC_AUDIO, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_DAM0, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_DAM1, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_DAM2, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_HDA2CODEC2X, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_ACTMON, CLOCK_TYPE_PCST), /* MASK 31:30 */ |
||||
TYPE(PERIPHC_EXTPERIPH1, CLOCK_TYPE_ASPTE), |
||||
|
||||
/* 0x48 */ |
||||
TYPE(PERIPHC_EXTPERIPH2, CLOCK_TYPE_ASPTE), |
||||
TYPE(PERIPHC_EXTPERIPH3, CLOCK_TYPE_ASPTE), |
||||
TYPE(PERIPHC_NANDSPEED, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_I2CSLOW, CLOCK_TYPE_PCST), /* MASK 31:30 */ |
||||
TYPE(PERIPHC_SYS, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SPEEDO, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
|
||||
/* 0x50 */ |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SATAOOB, CLOCK_TYPE_PCMT), /* offset 0x420h */ |
||||
TYPE(PERIPHC_SATA, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_HDA, CLOCK_TYPE_PCMT), |
||||
}; |
||||
|
||||
/*
|
||||
* This array translates a periph_id to a periphc_internal_id |
||||
* |
||||
* Not present/matched up: |
||||
* uint vi_sensor; _VI_SENSOR_0, 0x1A8 |
||||
* SPDIF - which is both 0x08 and 0x0c |
||||
* |
||||
*/ |
||||
#define NONE(name) (-1) |
||||
#define OFFSET(name, value) PERIPHC_ ## name |
||||
static s8 periph_id_to_internal_id[PERIPH_ID_COUNT] = { |
||||
/* Low word: 31:0 */ |
||||
NONE(CPU), |
||||
NONE(COP), |
||||
NONE(TRIGSYS), |
||||
NONE(RESERVED3), |
||||
NONE(RTC), |
||||
NONE(TMR), |
||||
PERIPHC_UART1, |
||||
PERIPHC_UART2, /* and vfir 0x68 */ |
||||
|
||||
/* 8 */ |
||||
NONE(GPIO), |
||||
PERIPHC_SDMMC2, |
||||
NONE(SPDIF), /* 0x08 and 0x0c, unclear which to use */ |
||||
PERIPHC_I2S1, |
||||
PERIPHC_I2C1, |
||||
PERIPHC_NDFLASH, |
||||
PERIPHC_SDMMC1, |
||||
PERIPHC_SDMMC4, |
||||
|
||||
/* 16 */ |
||||
NONE(RESERVED16), |
||||
PERIPHC_PWM, |
||||
PERIPHC_I2S2, |
||||
PERIPHC_EPP, |
||||
PERIPHC_VI, |
||||
PERIPHC_G2D, |
||||
NONE(USBD), |
||||
NONE(ISP), |
||||
|
||||
/* 24 */ |
||||
PERIPHC_G3D, |
||||
NONE(RESERVED25), |
||||
PERIPHC_DISP2, |
||||
PERIPHC_DISP1, |
||||
PERIPHC_HOST1X, |
||||
NONE(VCP), |
||||
PERIPHC_I2S0, |
||||
NONE(CACHE2), |
||||
|
||||
/* Middle word: 63:32 */ |
||||
NONE(MEM), |
||||
NONE(AHBDMA), |
||||
NONE(APBDMA), |
||||
NONE(RESERVED35), |
||||
NONE(RESERVED36), |
||||
NONE(STAT_MON), |
||||
NONE(RESERVED38), |
||||
NONE(RESERVED39), |
||||
|
||||
/* 40 */ |
||||
NONE(KFUSE), |
||||
NONE(SBC1), /* SBC1, 0x34, is this SPI1? */ |
||||
PERIPHC_NOR, |
||||
NONE(RESERVED43), |
||||
PERIPHC_SBC2, |
||||
NONE(RESERVED45), |
||||
PERIPHC_SBC3, |
||||
PERIPHC_I2C5, |
||||
|
||||
/* 48 */ |
||||
NONE(DSI), |
||||
PERIPHC_TVO, /* also CVE 0x40 */ |
||||
PERIPHC_MIPI, |
||||
PERIPHC_HDMI, |
||||
NONE(CSI), |
||||
PERIPHC_TVDAC, |
||||
PERIPHC_I2C2, |
||||
PERIPHC_UART3, |
||||
|
||||
/* 56 */ |
||||
NONE(RESERVED56), |
||||
PERIPHC_EMC, |
||||
NONE(USB2), |
||||
NONE(USB3), |
||||
PERIPHC_MPE, |
||||
PERIPHC_VDE, |
||||
NONE(BSEA), |
||||
NONE(BSEV), |
||||
|
||||
/* Upper word 95:64 */ |
||||
PERIPHC_SPEEDO, |
||||
PERIPHC_UART4, |
||||
PERIPHC_UART5, |
||||
PERIPHC_I2C3, |
||||
PERIPHC_SBC4, |
||||
PERIPHC_SDMMC3, |
||||
NONE(PCIE), |
||||
PERIPHC_OWR, |
||||
|
||||
/* 72 */ |
||||
NONE(AFI), |
||||
PERIPHC_CSITE, |
||||
NONE(PCIEXCLK), |
||||
NONE(AVPUCQ), |
||||
NONE(RESERVED76), |
||||
NONE(RESERVED77), |
||||
NONE(RESERVED78), |
||||
NONE(DTV), |
||||
|
||||
/* 80 */ |
||||
PERIPHC_NANDSPEED, |
||||
PERIPHC_I2CSLOW, |
||||
NONE(DSIB), |
||||
NONE(RESERVED83), |
||||
NONE(IRAMA), |
||||
NONE(IRAMB), |
||||
NONE(IRAMC), |
||||
NONE(IRAMD), |
||||
|
||||
/* 88 */ |
||||
NONE(CRAM2), |
||||
NONE(RESERVED89), |
||||
NONE(MDOUBLER), |
||||
NONE(RESERVED91), |
||||
NONE(SUSOUT), |
||||
NONE(RESERVED93), |
||||
NONE(RESERVED94), |
||||
NONE(RESERVED95), |
||||
|
||||
/* V word: 31:0 */ |
||||
NONE(CPUG), |
||||
NONE(CPULP), |
||||
PERIPHC_G3D2, |
||||
PERIPHC_MSELECT, |
||||
PERIPHC_TSENSOR, |
||||
PERIPHC_I2S3, |
||||
PERIPHC_I2S4, |
||||
PERIPHC_I2C4, |
||||
|
||||
/* 08 */ |
||||
PERIPHC_SBC5, |
||||
PERIPHC_SBC6, |
||||
PERIPHC_AUDIO, |
||||
NONE(APBIF), |
||||
PERIPHC_DAM0, |
||||
PERIPHC_DAM1, |
||||
PERIPHC_DAM2, |
||||
PERIPHC_HDA2CODEC2X, |
||||
|
||||
/* 16 */ |
||||
NONE(ATOMICS), |
||||
NONE(RESERVED17), |
||||
NONE(RESERVED18), |
||||
NONE(RESERVED19), |
||||
NONE(RESERVED20), |
||||
NONE(RESERVED21), |
||||
NONE(RESERVED22), |
||||
PERIPHC_ACTMON, |
||||
|
||||
/* 24 */ |
||||
NONE(RESERVED24), |
||||
NONE(RESERVED25), |
||||
NONE(RESERVED26), |
||||
NONE(RESERVED27), |
||||
PERIPHC_SATA, |
||||
PERIPHC_HDA, |
||||
NONE(RESERVED30), |
||||
NONE(RESERVED31), |
||||
|
||||
/* W word: 31:0 */ |
||||
NONE(HDA2HDMICODEC), |
||||
NONE(RESERVED1_SATACOLD), |
||||
NONE(RESERVED2_PCIERX0), |
||||
NONE(RESERVED3_PCIERX1), |
||||
NONE(RESERVED4_PCIERX2), |
||||
NONE(RESERVED5_PCIERX3), |
||||
NONE(RESERVED6_PCIERX4), |
||||
NONE(RESERVED7_PCIERX5), |
||||
|
||||
/* 40 */ |
||||
NONE(CEC), |
||||
NONE(PCIE2_IOBIST), |
||||
NONE(EMC_IOBIST), |
||||
NONE(HDMI_IOBIST), |
||||
NONE(SATA_IOBIST), |
||||
NONE(MIPI_IOBIST), |
||||
NONE(EMC1_IOBIST), |
||||
NONE(XUSB), |
||||
|
||||
/* 48 */ |
||||
NONE(CILAB), |
||||
NONE(CILCD), |
||||
NONE(CILE), |
||||
NONE(DSIA_LP), |
||||
NONE(DSIB_LP), |
||||
NONE(RESERVED21_ENTROPY), |
||||
NONE(RESERVED22_W), |
||||
NONE(RESERVED23_W), |
||||
|
||||
/* 56 */ |
||||
NONE(RESERVED24_W), |
||||
NONE(AMX0), |
||||
NONE(ADX0), |
||||
NONE(DVFS), |
||||
NONE(XUSB_SS), |
||||
NONE(EMC_DLL), |
||||
NONE(MC1), |
||||
NONE(EMC1), |
||||
}; |
||||
|
||||
/*
|
||||
* Get the oscillator frequency, from the corresponding hardware configuration |
||||
* field. Note that T30/T114 support 3 new higher freqs, but we map back |
||||
* to the old T20 freqs. Support for the higher oscillators is TBD. |
||||
*/ |
||||
enum clock_osc_freq clock_get_osc_freq(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 reg; |
||||
|
||||
reg = readl(&clkrst->crc_osc_ctrl); |
||||
reg = (reg & OSC_FREQ_MASK) >> OSC_FREQ_SHIFT; |
||||
|
||||
if (reg & 1) /* one of the newer freqs */ |
||||
printf("Warning: OSC_FREQ is unsupported! (%d)\n", reg); |
||||
|
||||
return reg >> 2; /* Map to most common (T20) freqs */ |
||||
} |
||||
|
||||
/* Returns a pointer to the clock source register for a peripheral */ |
||||
u32 *get_periph_source_reg(enum periph_id periph_id) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
enum periphc_internal_id internal_id; |
||||
|
||||
/* Coresight is a special case */ |
||||
if (periph_id == PERIPH_ID_CSI) |
||||
return &clkrst->crc_clk_src[PERIPH_ID_CSI+1]; |
||||
|
||||
assert(periph_id >= PERIPH_ID_FIRST && periph_id < PERIPH_ID_COUNT); |
||||
internal_id = periph_id_to_internal_id[periph_id]; |
||||
assert(internal_id != -1); |
||||
if (internal_id >= PERIPHC_VW_FIRST) { |
||||
internal_id -= PERIPHC_VW_FIRST; |
||||
return &clkrst->crc_clk_src_vw[internal_id]; |
||||
} else |
||||
return &clkrst->crc_clk_src[internal_id]; |
||||
} |
||||
|
||||
/**
|
||||
* Given a peripheral ID and the required source clock, this returns which |
||||
* value should be programmed into the source mux for that peripheral. |
||||
* |
||||
* There is special code here to handle the one source type with 5 sources. |
||||
* |
||||
* @param periph_id peripheral to start |
||||
* @param source PLL id of required parent clock |
||||
* @param mux_bits Set to number of bits in mux register: 2 or 4 |
||||
* @param divider_bits Set to number of divider bits (8 or 16) |
||||
* @return mux value (0-4, or -1 if not found) |
||||
*/ |
||||
int get_periph_clock_source(enum periph_id periph_id, |
||||
enum clock_id parent, int *mux_bits, int *divider_bits) |
||||
{ |
||||
enum clock_type_id type; |
||||
enum periphc_internal_id internal_id; |
||||
int mux; |
||||
|
||||
assert(clock_periph_id_isvalid(periph_id)); |
||||
|
||||
internal_id = periph_id_to_internal_id[periph_id]; |
||||
assert(periphc_internal_id_isvalid(internal_id)); |
||||
|
||||
type = clock_periph_type[internal_id]; |
||||
assert(clock_type_id_isvalid(type)); |
||||
|
||||
*mux_bits = clock_source[type][CLOCK_MAX_MUX]; |
||||
|
||||
if (type == CLOCK_TYPE_PCMT16) |
||||
*divider_bits = 16; |
||||
else |
||||
*divider_bits = 8; |
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) |
||||
if (clock_source[type][mux] == parent) |
||||
return mux; |
||||
|
||||
/* if we get here, either us or the caller has made a mistake */ |
||||
printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, |
||||
parent); |
||||
return -1; |
||||
} |
||||
|
||||
void clock_set_enable(enum periph_id periph_id, int enable) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 *clk; |
||||
u32 reg; |
||||
|
||||
/* Enable/disable the clock to this peripheral */ |
||||
assert(clock_periph_id_isvalid(periph_id)); |
||||
if ((int)periph_id < (int)PERIPH_ID_VW_FIRST) |
||||
clk = &clkrst->crc_clk_out_enb[PERIPH_REG(periph_id)]; |
||||
else |
||||
clk = &clkrst->crc_clk_out_enb_vw[PERIPH_REG(periph_id)]; |
||||
reg = readl(clk); |
||||
if (enable) |
||||
reg |= PERIPH_MASK(periph_id); |
||||
else |
||||
reg &= ~PERIPH_MASK(periph_id); |
||||
writel(reg, clk); |
||||
} |
||||
|
||||
void reset_set_enable(enum periph_id periph_id, int enable) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 *reset; |
||||
u32 reg; |
||||
|
||||
/* Enable/disable reset to the peripheral */ |
||||
assert(clock_periph_id_isvalid(periph_id)); |
||||
if (periph_id < PERIPH_ID_VW_FIRST) |
||||
reset = &clkrst->crc_rst_dev[PERIPH_REG(periph_id)]; |
||||
else |
||||
reset = &clkrst->crc_rst_dev_vw[PERIPH_REG(periph_id)]; |
||||
reg = readl(reset); |
||||
if (enable) |
||||
reg |= PERIPH_MASK(periph_id); |
||||
else |
||||
reg &= ~PERIPH_MASK(periph_id); |
||||
writel(reg, reset); |
||||
} |
||||
|
||||
#ifdef CONFIG_OF_CONTROL |
||||
/*
|
||||
* Convert a device tree clock ID to our peripheral ID. They are mostly |
||||
* the same but we are very cautious so we check that a valid clock ID is |
||||
* provided. |
||||
* |
||||
* @param clk_id Clock ID according to tegra114 device tree binding |
||||
* @return peripheral ID, or PERIPH_ID_NONE if the clock ID is invalid |
||||
*/ |
||||
enum periph_id clk_id_to_periph_id(int clk_id) |
||||
{ |
||||
if (clk_id > PERIPH_ID_COUNT) |
||||
return PERIPH_ID_NONE; |
||||
|
||||
switch (clk_id) { |
||||
case PERIPH_ID_RESERVED3: |
||||
case PERIPH_ID_RESERVED16: |
||||
case PERIPH_ID_RESERVED24: |
||||
case PERIPH_ID_RESERVED35: |
||||
case PERIPH_ID_RESERVED43: |
||||
case PERIPH_ID_RESERVED45: |
||||
case PERIPH_ID_RESERVED56: |
||||
case PERIPH_ID_RESERVED76: |
||||
case PERIPH_ID_RESERVED77: |
||||
case PERIPH_ID_RESERVED78: |
||||
case PERIPH_ID_RESERVED83: |
||||
case PERIPH_ID_RESERVED89: |
||||
case PERIPH_ID_RESERVED91: |
||||
case PERIPH_ID_RESERVED93: |
||||
case PERIPH_ID_RESERVED94: |
||||
case PERIPH_ID_RESERVED95: |
||||
return PERIPH_ID_NONE; |
||||
default: |
||||
return clk_id; |
||||
} |
||||
} |
||||
#endif /* CONFIG_OF_CONTROL */ |
||||
|
||||
void clock_early_init(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
|
||||
/*
|
||||
* PLLP output frequency set to 408Mhz |
||||
* PLLC output frequency set to 600Mhz |
||||
* PLLD output frequency set to 925Mhz |
||||
*/ |
||||
switch (clock_get_osc_freq()) { |
||||
case CLOCK_OSC_FREQ_12_0: /* OSC is 12Mhz */ |
||||
clock_set_rate(CLOCK_ID_PERIPH, 408, 12, 0, 8); |
||||
clock_set_rate(CLOCK_ID_CGENERAL, 600, 12, 0, 8); |
||||
clock_set_rate(CLOCK_ID_DISPLAY, 925, 12, 0, 12); |
||||
break; |
||||
|
||||
case CLOCK_OSC_FREQ_26_0: /* OSC is 26Mhz */ |
||||
clock_set_rate(CLOCK_ID_PERIPH, 408, 26, 0, 8); |
||||
clock_set_rate(CLOCK_ID_CGENERAL, 600, 26, 0, 8); |
||||
clock_set_rate(CLOCK_ID_DISPLAY, 925, 26, 0, 12); |
||||
break; |
||||
|
||||
case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */ |
||||
clock_set_rate(CLOCK_ID_PERIPH, 408, 13, 0, 8); |
||||
clock_set_rate(CLOCK_ID_CGENERAL, 600, 13, 0, 8); |
||||
clock_set_rate(CLOCK_ID_DISPLAY, 925, 13, 0, 12); |
||||
break; |
||||
case CLOCK_OSC_FREQ_19_2: |
||||
default: |
||||
/*
|
||||
* These are not supported. It is too early to print a |
||||
* message and the UART likely won't work anyway due to the |
||||
* oscillator being wrong. |
||||
*/ |
||||
break; |
||||
} |
||||
|
||||
/* PLLC_MISC2: Set dynramp_stepA/B. MISC2 maps to pll_out[1] */ |
||||
writel(0x00561600, &clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_out[1]); |
||||
|
||||
/* PLLC_MISC: Set LOCK_ENABLE */ |
||||
writel(0x01000000, &clkrst->crc_pll[CLOCK_ID_CGENERAL].pll_misc); |
||||
udelay(2); |
||||
|
||||
/* PLLD_MISC: Set CLKENABLE, CPCON 12, LFCON 1 */ |
||||
writel(0x40000C10, &clkrst->crc_pll[CLOCK_ID_DISPLAY].pll_misc); |
||||
udelay(2); |
||||
} |
@ -0,0 +1,63 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra114 high-level function multiplexing */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/funcmux.h> |
||||
#include <asm/arch/pinmux.h> |
||||
|
||||
int funcmux_select(enum periph_id id, int config) |
||||
{ |
||||
int bad_config = config != FUNCMUX_DEFAULT; |
||||
|
||||
switch (id) { |
||||
case PERIPH_ID_UART4: |
||||
switch (config) { |
||||
case FUNCMUX_UART4_GMI: |
||||
pinmux_set_func(PINGRP_GMI_A16, PMUX_FUNC_UARTD); |
||||
pinmux_set_func(PINGRP_GMI_A17, PMUX_FUNC_UARTD); |
||||
pinmux_set_func(PINGRP_GMI_A18, PMUX_FUNC_UARTD); |
||||
pinmux_set_func(PINGRP_GMI_A19, PMUX_FUNC_UARTD); |
||||
|
||||
pinmux_set_io(PINGRP_GMI_A16, PMUX_PIN_OUTPUT); |
||||
pinmux_set_io(PINGRP_GMI_A17, PMUX_PIN_INPUT); |
||||
pinmux_set_io(PINGRP_GMI_A18, PMUX_PIN_INPUT); |
||||
pinmux_set_io(PINGRP_GMI_A19, PMUX_PIN_OUTPUT); |
||||
|
||||
pinmux_tristate_disable(PINGRP_GMI_A16); |
||||
pinmux_tristate_disable(PINGRP_GMI_A17); |
||||
pinmux_tristate_disable(PINGRP_GMI_A18); |
||||
pinmux_tristate_disable(PINGRP_GMI_A19); |
||||
break; |
||||
} |
||||
break; |
||||
|
||||
/* Add other periph IDs here as needed */ |
||||
|
||||
default: |
||||
debug("%s: invalid periph_id %d", __func__, id); |
||||
return -1; |
||||
} |
||||
|
||||
if (bad_config) { |
||||
debug("%s: invalid config %d for periph_id %d", __func__, |
||||
config, id); |
||||
return -1; |
||||
} |
||||
return 0; |
||||
} |
@ -0,0 +1,506 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra114 pin multiplexing functions */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch/pinmux.h> |
||||
|
||||
struct tegra_pingroup_desc { |
||||
const char *name; |
||||
enum pmux_func funcs[4]; |
||||
enum pmux_func func_safe; |
||||
enum pmux_vddio vddio; |
||||
enum pmux_pin_io io; |
||||
}; |
||||
|
||||
#define PMUX_MUXCTL_SHIFT 0 |
||||
#define PMUX_PULL_SHIFT 2 |
||||
#define PMUX_TRISTATE_SHIFT 4 |
||||
#define PMUX_TRISTATE_MASK (1 << PMUX_TRISTATE_SHIFT) |
||||
#define PMUX_IO_SHIFT 5 |
||||
#define PMUX_OD_SHIFT 6 |
||||
#define PMUX_LOCK_SHIFT 7 |
||||
#define PMUX_IO_RESET_SHIFT 8 |
||||
|
||||
/* Convenient macro for defining pin group properties */ |
||||
#define PIN(pg_name, vdd, f0, f1, f2, f3, iod) \ |
||||
{ \
|
||||
.vddio = PMUX_VDDIO_ ## vdd, \
|
||||
.funcs = { \
|
||||
PMUX_FUNC_ ## f0, \
|
||||
PMUX_FUNC_ ## f1, \
|
||||
PMUX_FUNC_ ## f2, \
|
||||
PMUX_FUNC_ ## f3, \
|
||||
}, \
|
||||
.func_safe = PMUX_FUNC_RSVD1, \
|
||||
.io = PMUX_PIN_ ## iod, \
|
||||
} |
||||
|
||||
/* Input and output pins */ |
||||
#define PINI(pg_name, vdd, f0, f1, f2, f3) \ |
||||
PIN(pg_name, vdd, f0, f1, f2, f3, INPUT) |
||||
#define PINO(pg_name, vdd, f0, f1, f2, f3) \ |
||||
PIN(pg_name, vdd, f0, f1, f2, f3, OUTPUT) |
||||
|
||||
const struct tegra_pingroup_desc tegra_soc_pingroups[PINGRP_COUNT] = { |
||||
/* NAME VDD f0 f1 f2 f3 */ |
||||
PINI(ULPI_DATA0, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA1, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA2, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA3, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA4, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA5, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA6, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA7, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_CLK, BB, SPI1, SPI5, UARTD, ULPI), |
||||
PINI(ULPI_DIR, BB, SPI1, SPI5, UARTD, ULPI), |
||||
PINI(ULPI_NXT, BB, SPI1, SPI5, UARTD, ULPI), |
||||
PINI(ULPI_STP, BB, SPI1, SPI5, UARTD, ULPI), |
||||
PINI(DAP3_FS, BB, I2S2, SPI5, DISPA, DISPB), |
||||
PINI(DAP3_DIN, BB, I2S2, SPI5, DISPA, DISPB), |
||||
PINI(DAP3_DOUT, BB, I2S2, SPI5, DISPA, DISPB), |
||||
PINI(DAP3_SCLK, BB, I2S2, SPI5, DISPA, DISPB), |
||||
PINI(GPIO_PV0, BB, USB, RSVD2, RSVD3, RSVD4), |
||||
PINI(GPIO_PV1, BB, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC1_CLK, SDMMC1, SDMMC1, CLK12, RSVD3, RSVD4), |
||||
PINI(SDMMC1_CMD, SDMMC1, SDMMC1, SPDIF, SPI4, UARTA), |
||||
PINI(SDMMC1_DAT3, SDMMC1, SDMMC1, SPDIF, SPI4, UARTA), |
||||
PINI(SDMMC1_DAT2, SDMMC1, SDMMC1, PWM0, SPI4, UARTA), |
||||
PINI(SDMMC1_DAT1, SDMMC1, SDMMC1, PWM1, SPI4, UARTA), |
||||
PINI(SDMMC1_DAT0, SDMMC1, SDMMC1, RSVD2, SPI4, UARTA), |
||||
PINI(GPIO_PV2, BB, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(GPIO_PV3, BB, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK2_OUT, SDMMC1, EXTPERIPH2, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK2_REQ, SDMMC1, DAP, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_PWR1, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_PWR2, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_SDIN, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_SDOUT, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_WR_N, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_CS0_N, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_DC0, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_SCK, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_PWR0, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_PCLK, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_DE, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_HSYNC, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_VSYNC, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D0, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D1, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D2, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D3, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D4, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D5, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D6, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D7, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D8, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D9, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D10, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D11, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D12, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D13, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D14, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D15, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D16, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D17, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D18, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D19, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D20, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D21, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D22, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_D23, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_CS1_N, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_M1, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_DC1, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(HDMI_INT, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(DDC_SCL, LCD, I2C4, RSVD2, RSVD3, RSVD4), |
||||
PINI(DDC_SDA, LCD, I2C4, RSVD2, RSVD3, RSVD4), |
||||
PINI(CRT_HSYNC, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(CRT_VSYNC, LCD, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D0, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D1, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D2, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D3, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D4, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D5, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D6, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D7, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D8, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D9, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D10, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D11, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_PCLK, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_MCLK, VI, RSVD1, RSVD3, RSVD3, RSVD4), |
||||
PINI(VI_VSYNC, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_HSYNC, VI, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(UART2_RXD, UART, UARTB, SPDIF, UARTA, SPI4), |
||||
PINI(UART2_TXD, UART, UARTB, SPDIF, UARTA, SPI4), |
||||
PINI(UART2_RTS_N, UART, UARTA, UARTB, RSVD3, SPI4), |
||||
PINI(UART2_CTS_N, UART, UARTA, UARTB, RSVD3, SPI4), |
||||
PINI(UART3_TXD, UART, UARTC, RSVD2, RSVD3, SPI4), |
||||
PINI(UART3_RXD, UART, UARTC, RSVD2, RSVD3, SPI4), |
||||
PINI(UART3_CTS_N, UART, UARTC, SDMMC1, DTV, SPI4), |
||||
PINI(UART3_RTS_N, UART, UARTC, PWM0, DTV, DISPA), |
||||
PINI(GPIO_PU0, UART, OWR, UARTA, RSVD3, RSVD4), |
||||
PINI(GPIO_PU1, UART, RSVD1, UARTA, RSVD3, RSVD4), |
||||
PINI(GPIO_PU2, UART, RSVD1, UARTA, RSVD3, RSVD4), |
||||
PINI(GPIO_PU3, UART, PWM0, UARTA, DISPA, DISPB), |
||||
PINI(GPIO_PU4, UART, PWM1, UARTA, DISPA, DISPB), |
||||
PINI(GPIO_PU5, UART, PWM2, UARTA, DISPA, DISPB), |
||||
PINI(GPIO_PU6, UART, PWM3, UARTA, USB, DISPB), |
||||
PINI(GEN1_I2C_SDA, UART, I2C1, RSVD2, RSVD3, RSVD4), |
||||
PINI(GEN1_I2C_SCL, UART, I2C1, RSVD2, RSVD3, RSVD4), |
||||
PINI(DAP4_FS, UART, I2S3, RSVD2, DTV, RSVD4), |
||||
PINI(DAP4_DIN, UART, I2S3, RSVD2, RSVD3, RSVD4), |
||||
PINI(DAP4_DOUT, UART, I2S3, RSVD2, DTV, RSVD4), |
||||
PINI(DAP4_SCLK, UART, I2S3, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK3_OUT, UART, EXTPERIPH3, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK3_REQ, UART, DEV3, RSVD2, RSVD3, RSVD4), |
||||
PINI(GMI_WP_N, GMI, RSVD1, NAND, GMI, GMI_ALT), |
||||
PINI(GMI_IORDY, GMI, SDMMC2, RSVD2, GMI, TRACE), |
||||
PINI(GMI_WAIT, GMI, SPI4, NAND, GMI, DTV), |
||||
PINI(GMI_ADV_N, GMI, RSVD1, NAND, GMI, TRACE), |
||||
PINI(GMI_CLK, GMI, SDMMC2, NAND, GMI, TRACE), |
||||
PINI(GMI_CS0_N, GMI, RSVD1, NAND, GMI, USB), |
||||
PINI(GMI_CS1_N, GMI, RSVD1, NAND, GMI, SOC), |
||||
PINI(GMI_CS2_N, GMI, SDMMC2, NAND, GMI, TRACE), |
||||
PINI(GMI_CS3_N, GMI, SDMMC2, NAND, GMI, GMI_ALT), |
||||
PINI(GMI_CS4_N, GMI, USB, NAND, GMI, TRACE), |
||||
PINI(GMI_CS6_N, GMI, NAND, NAND_ALT, GMI, SPI4), |
||||
PINI(GMI_CS7_N, GMI, NAND, NAND_ALT, GMI, SDMMC2), |
||||
PINI(GMI_AD0, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD1, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD2, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD3, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD4, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD5, GMI, RSVD1, NAND, GMI, SPI4), |
||||
PINI(GMI_AD6, GMI, RSVD1, NAND, GMI, SPI4), |
||||
PINI(GMI_AD7, GMI, RSVD1, NAND, GMI, SPI4), |
||||
PINI(GMI_AD8, GMI, PWM0, NAND, GMI, DTV), |
||||
PINI(GMI_AD9, GMI, PWM1, NAND, GMI, CLDVFS), |
||||
PINI(GMI_AD10, GMI, PWM2, NAND, GMI, CLDVFS), |
||||
PINI(GMI_AD11, GMI, PWM3, NAND, GMI, USB), |
||||
PINI(GMI_AD12, GMI, SDMMC2, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD13, GMI, SDMMC2, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD14, GMI, SDMMC2, NAND, GMI, DTV), |
||||
PINI(GMI_AD15, GMI, SDMMC2, NAND, GMI, DTV), |
||||
PINI(GMI_A16, GMI, UARTD, TRACE, GMI, GMI_ALT), |
||||
PINI(GMI_A17, GMI, UARTD, RSVD2, GMI, TRACE), |
||||
PINI(GMI_A18, GMI, UARTD, RSVD2, GMI, TRACE), |
||||
PINI(GMI_A19, GMI, UARTD, SPI4, GMI, TRACE), |
||||
PINI(GMI_WR_N, GMI, RSVD1, NAND, GMI, SPI4), |
||||
PINI(GMI_OE_N, GMI, RSVD1, NAND, GMI, SOC), |
||||
PINI(GMI_DQS, GMI, SDMMC2, NAND, GMI, TRACE), |
||||
PINI(GMI_RST_N, GMI, NAND, NAND_ALT, GMI, RSVD4), |
||||
PINI(GEN2_I2C_SCL, GMI, I2C2, RSVD2, GMI, RSVD4), |
||||
PINI(GEN2_I2C_SDA, GMI, I2C2, RSVD2, GMI, RSVD4), |
||||
PINI(SDMMC4_CLK, SDMMC4, SDMMC4, RSVD2, GMI, RSVD4), |
||||
PINI(SDMMC4_CMD, SDMMC4, SDMMC4, RSVD2, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT0, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT1, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT2, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT3, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT4, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT5, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT6, SDMMC4, SDMMC4, SPI3, GMI, RSVD4), |
||||
PINI(SDMMC4_DAT7, SDMMC4, SDMMC4, RSVD2, GMI, RSVD4), |
||||
PINI(SDMMC4_RST_N, SDMMC4, RSVD1, RSVD2, RSVD3, SDMMC4), |
||||
PINI(CAM_MCLK, CAM, VI, VI_ALT1, VI_ALT2, RSVD4), |
||||
PINI(GPIO_PCC1, CAM, I2S4, RSVD2, RSVD3, RSVD4), |
||||
PINI(GPIO_PBB0, CAM, I2S4, VI, VI_ALT1, VI_ALT3), |
||||
PINI(CAM_I2C_SCL, CAM, VGP1, I2C3, RSVD3, RSVD4), |
||||
PINI(CAM_I2C_SDA, CAM, VGP2, I2C3, RSVD3, RSVD4), |
||||
PINI(GPIO_PBB3, CAM, VGP3, DISPA, DISPB, RSVD4), |
||||
PINI(GPIO_PBB4, CAM, VGP4, DISPA, DISPB, RSVD4), |
||||
PINI(GPIO_PBB5, CAM, VGP5, DISPA, DISPB, RSVD4), |
||||
PINI(GPIO_PBB6, CAM, VGP6, DISPA, DISPB, RSVD4), |
||||
PINI(GPIO_PBB7, CAM, I2S4, RSVD2, RSVD3, RSVD4), |
||||
PINI(GPIO_PCC2, CAM, I2S4, RSVD2, RSVD3, RSVD4), |
||||
PINI(JTAG_RTCK, SYS, RTCK, RSVD2, RSVD3, RSVD4), |
||||
PINI(PWR_I2C_SCL, SYS, I2CPWR, RSVD2, RSVD3, RSVD4), |
||||
PINI(PWR_I2C_SDA, SYS, I2CPWR, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_ROW0, SYS, KBC, RSVD2, DTV, RSVD4), |
||||
PINI(KB_ROW1, SYS, KBC, RSVD2, DTV, RSVD4), |
||||
PINI(KB_ROW2, SYS, KBC, RSVD2, DTV, SOC), |
||||
PINI(KB_ROW3, SYS, KBC, DISPA, RSVD3, DISPB), |
||||
PINI(KB_ROW4, SYS, KBC, DISPA, SPI2, DISPB), |
||||
PINI(KB_ROW5, SYS, KBC, DISPA, SPI2, DISPB), |
||||
PINI(KB_ROW6, SYS, KBC, DISPA, RSVD3, DISPB), |
||||
PINI(KB_ROW7, SYS, KBC, RSVD2, CLDVFS, UARTA), |
||||
PINI(KB_ROW8, SYS, KBC, RSVD2, RSVD3, UARTA), |
||||
PINI(KB_ROW9, SYS, KBC, RSVD2, RSVD3, UARTA), |
||||
PINI(KB_ROW10, SYS, KBC, RSVD2, RSVD3, UARTA), |
||||
PINI(KB_ROW11, SYS, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_ROW12, SYS, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_ROW13, SYS, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_ROW14, SYS, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_ROW15, SYS, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_COL0, SYS, KBC, USB, SPI2, EMC_DLL), |
||||
PINI(KB_COL1, SYS, KBC, RSVD2, SPI2, EMC_DLL), |
||||
PINI(KB_COL2, SYS, KBC, RSVD2, SPI2, RSVD4), |
||||
PINI(KB_COL3, SYS, KBC, DISPA, PWM2, UARTA), |
||||
PINI(KB_COL4, SYS, KBC, OWR, SDMMC3, UARTA), |
||||
PINI(KB_COL5, SYS, KBC, RSVD2, SDMMC1, RSVD4), |
||||
PINI(KB_COL6, SYS, KBC, RSVD2, SPI2, RSVD4), |
||||
PINI(KB_COL7, SYS, KBC, RSVD2, SPI2, RSVD4), |
||||
PINI(CLK_32K_OUT, SYS, BLINK, SOC, RSVD3, RSVD4), |
||||
PINI(SYS_CLK_REQ, SYS, SYSCLK, RSVD2, RSVD3, RSVD4), |
||||
PINI(CORE_PWR_REQ, SYS, PWRON, RSVD2, RSVD3, RSVD4), |
||||
PINI(CPU_PWR_REQ, SYS, CPU, RSVD2, RSVD3, RSVD4), |
||||
PINI(PWR_INT_N, SYS, PMI, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK_32K_IN, SYS, CLK, RSVD2, RSVD3, RSVD4), |
||||
PINI(OWR, SYS, OWR, RSVD2, RSVD3, RSVD4), |
||||
PINI(DAP1_FS, AUDIO, I2S0, HDA, GMI, RSVD4), |
||||
PINI(DAP1_DIN, AUDIO, I2S0, HDA, GMI, RSVD4), |
||||
PINI(DAP1_DOUT, AUDIO, I2S0, HDA, GMI, RSVD4), |
||||
PINI(DAP1_SCLK, AUDIO, I2S0, HDA, GMI, RSVD4), |
||||
PINI(CLK1_REQ, AUDIO, DAP, DAP1, RSVD3, RSVD4), |
||||
PINI(CLK1_OUT, AUDIO, EXTPERIPH1, DAP2, RSVD3, RSVD4), |
||||
PINI(SPDIF_IN, AUDIO, SPDIF, USB, RSVD3, RSVD4), |
||||
PINI(SPDIF_OUT, AUDIO, SPDIF, RSVD2, RSVD3, RSVD4), |
||||
PINI(DAP2_FS, AUDIO, I2S1, HDA, RSVD3, RSVD4), |
||||
PINI(DAP2_DIN, AUDIO, I2S1, HDA, RSVD3, RSVD4), |
||||
PINI(DAP2_DOUT, AUDIO, I2S1, HDA, RSVD3, RSVD4), |
||||
PINI(DAP2_SCLK, AUDIO, I2S1, HDA, RSVD3, RSVD4), |
||||
PINI(SPI2_MOSI, AUDIO, SPI6, CLDVFS, RSVD3, RSVD4), |
||||
PINI(SPI2_MISO, AUDIO, SPI6, RSVD2, RSVD3, RSVD4), |
||||
PINI(SPI2_CS0_N, AUDIO, SPI6, SPI1, RSVD3, RSVD4), |
||||
PINI(SPI2_SCK, AUDIO, SPI6, CLDVFS, RSVD3, RSVD4), |
||||
PINI(SPI1_MOSI, AUDIO, RSVD1, SPI1, SPI2, DAP2), |
||||
PINI(SPI1_SCK, AUDIO, RSVD1, SPI1, SPI2, RSVD4), |
||||
PINI(SPI1_CS0_N, AUDIO, SPI6, SPI1, SPI2, RSVD4), |
||||
PINI(SPI1_MISO, AUDIO, RSVD1, SPI1, SPI2, RSVD4), |
||||
PINI(SPI2_CS1_N, AUDIO, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SPI2_CS2_N, AUDIO, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC3_CLK, SDMMC3, SDMMC3, RSVD2, RSVD3, SPI3), |
||||
PINI(SDMMC3_CMD, SDMMC3, SDMMC3, PWM3, UARTA, SPI3), |
||||
PINI(SDMMC3_DAT0, SDMMC3, SDMMC3, RSVD2, RSVD3, SPI3), |
||||
PINI(SDMMC3_DAT1, SDMMC3, SDMMC3, PWM2, UARTA, SPI3), |
||||
PINI(SDMMC3_DAT2, SDMMC3, SDMMC3, PWM1, DISPA, SPI3), |
||||
PINI(SDMMC3_DAT3, SDMMC3, SDMMC3, PWM0, DISPB, SPI3), |
||||
PINI(SDMMC3_DAT4, SDMMC3, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC3_DAT5, SDMMC3, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC3_DAT6, SDMMC3, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC3_DAT7, SDMMC3, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(HDMI_CEC, SYS, CEC, SDMMC3, RSVD3, SOC), |
||||
PINI(SDMMC1_WP_N, SDMMC1, SDMMC1, CLK12, SPI4, UARTA), |
||||
PINI(SDMMC3_CD_N, SDMMC3, SDMMC3, OWR, RSVD3, RSVD4), |
||||
PINI(SPI1_CS1_N, AUDIO, SPI6, RSVD2, SPI2, I2C1), |
||||
PINI(SPI1_CS2_N, AUDIO, SPI6, SPI1, SPI2, I2C1), |
||||
PINI(USB_VBUS_EN0, SYS, USB, RSVD2, RSVD3, RSVD4), |
||||
PINI(USB_VBUS_EN1, SYS, USB, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC3_CLK_LB_IN, SDMMC3, SDMMC3, RSVD2, RSVD3, RSVD4), |
||||
PINO(SDMMC3_CLK_LB_OUT, SDMMC3, SDMMC3, RSVD2, RSVD3, RSVD4), |
||||
PINO(NAND_GMI_CLK_LB, GMI, SDMMC2, NAND, GMI, RSVD4), |
||||
PINO(RESET_OUT_N, SYS, RSVD1, RSVD2, RSVD3, RESET_OUT_N), |
||||
}; |
||||
|
||||
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_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
|
||||
reg = readl(tri); |
||||
if (enable) |
||||
reg |= PMUX_TRISTATE_MASK; |
||||
else |
||||
reg &= ~PMUX_TRISTATE_MASK; |
||||
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; |
||||
u32 *pull = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and pupd */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_pupd_isvalid(pupd)); |
||||
|
||||
reg = readl(pull); |
||||
reg &= ~(0x3 << PMUX_PULL_SHIFT); |
||||
reg |= (pupd << PMUX_PULL_SHIFT); |
||||
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; |
||||
u32 *muxctl = &pmt->pmt_ctl[pin]; |
||||
int i, mux = -1; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and func */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_func_isvalid(func)); |
||||
|
||||
/* Handle special values */ |
||||
if (func == PMUX_FUNC_SAFE) |
||||
func = tegra_soc_pingroups[pin].func_safe; |
||||
|
||||
if (func & PMUX_FUNC_RSVD1) { |
||||
mux = func & 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); |
||||
|
||||
reg = readl(muxctl); |
||||
reg &= ~(0x3 << PMUX_MUXCTL_SHIFT); |
||||
reg |= (mux << PMUX_MUXCTL_SHIFT); |
||||
writel(reg, muxctl); |
||||
|
||||
} |
||||
|
||||
void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_io = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and io */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_io_isvalid(io)); |
||||
|
||||
reg = readl(pin_io); |
||||
reg &= ~(0x1 << PMUX_IO_SHIFT); |
||||
reg |= (io & 0x1) << PMUX_IO_SHIFT; |
||||
writel(reg, pin_io); |
||||
} |
||||
|
||||
static int pinmux_set_lock(enum pmux_pingrp pin, enum pmux_pin_lock lock) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_lock = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and lock */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_lock_isvalid(lock)); |
||||
|
||||
if (lock == PMUX_PIN_LOCK_DEFAULT) |
||||
return 0; |
||||
|
||||
reg = readl(pin_lock); |
||||
reg &= ~(0x1 << PMUX_LOCK_SHIFT); |
||||
if (lock == PMUX_PIN_LOCK_ENABLE) |
||||
reg |= (0x1 << PMUX_LOCK_SHIFT); |
||||
else { |
||||
/* lock == DISABLE, which isn't possible */ |
||||
printf("%s: Warning: lock == %d, DISABLE is not allowed!\n", |
||||
__func__, lock); |
||||
} |
||||
writel(reg, pin_lock); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int pinmux_set_od(enum pmux_pingrp pin, enum pmux_pin_od od) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_od = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and od */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_od_isvalid(od)); |
||||
|
||||
if (od == PMUX_PIN_OD_DEFAULT) |
||||
return 0; |
||||
|
||||
reg = readl(pin_od); |
||||
reg &= ~(0x1 << PMUX_OD_SHIFT); |
||||
if (od == PMUX_PIN_OD_ENABLE) |
||||
reg |= (0x1 << PMUX_OD_SHIFT); |
||||
writel(reg, pin_od); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int pinmux_set_ioreset(enum pmux_pingrp pin, |
||||
enum pmux_pin_ioreset ioreset) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_ioreset = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and ioreset */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_ioreset_isvalid(ioreset)); |
||||
|
||||
if (ioreset == PMUX_PIN_IO_RESET_DEFAULT) |
||||
return 0; |
||||
|
||||
reg = readl(pin_ioreset); |
||||
reg &= ~(0x1 << PMUX_IO_RESET_SHIFT); |
||||
if (ioreset == PMUX_PIN_IO_RESET_ENABLE) |
||||
reg |= (0x1 << PMUX_IO_RESET_SHIFT); |
||||
writel(reg, pin_ioreset); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void pinmux_config_pingroup(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); |
||||
pinmux_set_io(pin, config->io); |
||||
pinmux_set_lock(pin, config->lock); |
||||
pinmux_set_od(pin, config->od); |
||||
pinmux_set_ioreset(pin, config->ioreset); |
||||
} |
||||
|
||||
void pinmux_config_table(struct pingroup_config *config, int len) |
||||
{ |
||||
int i; |
||||
|
||||
for (i = 0; i < len; i++) |
||||
pinmux_config_pingroup(&config[i]); |
||||
} |
@ -0,0 +1,44 @@ |
||||
#
|
||||
# Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
#
|
||||
# (C) Copyright 2000-2008
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms and conditions of the GNU General Public License,
|
||||
# version 2, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk |
||||
|
||||
# The AVP is ARMv4T architecture so we must use special compiler
|
||||
# flags for any startup files it might use.
|
||||
|
||||
LIB = $(obj)lib$(SOC)-common.o
|
||||
|
||||
COBJS-y += clock.o funcmux.o pinmux.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
|
||||
|
||||
all: $(obj).depend $(LIB) |
||||
|
||||
$(LIB): $(OBJS) |
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk |
||||
|
||||
sinclude $(obj).depend |
||||
|
||||
#########################################################################
|
@ -0,0 +1,618 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra30 Clock control functions */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch-tegra/clk_rst.h> |
||||
#include <asm/arch-tegra/timer.h> |
||||
#include <div64.h> |
||||
#include <fdtdec.h> |
||||
|
||||
/*
|
||||
* Clock types that we can use as a source. The Tegra30 has muxes for the |
||||
* peripheral clocks, and in most cases there are four options for the clock |
||||
* source. This gives us a clock 'type' and exploits what commonality exists |
||||
* in the device. |
||||
* |
||||
* Letters are obvious, except for T which means CLK_M, and S which means the |
||||
* clock derived from 32KHz. Beware that CLK_M (also called OSC in the |
||||
* datasheet) and PLL_M are different things. The former is the basic |
||||
* clock supplied to the SOC from an external oscillator. The latter is the |
||||
* memory clock PLL. |
||||
* |
||||
* See definitions in clock_id in the header file. |
||||
*/ |
||||
enum clock_type_id { |
||||
CLOCK_TYPE_AXPT, /* PLL_A, PLL_X, PLL_P, CLK_M */ |
||||
CLOCK_TYPE_MCPA, /* and so on */ |
||||
CLOCK_TYPE_MCPT, |
||||
CLOCK_TYPE_PCM, |
||||
CLOCK_TYPE_PCMT, |
||||
CLOCK_TYPE_PCMT16, |
||||
CLOCK_TYPE_PDCT, |
||||
CLOCK_TYPE_ACPT, |
||||
CLOCK_TYPE_ASPTE, |
||||
CLOCK_TYPE_PMDACD2T, |
||||
CLOCK_TYPE_PCST, |
||||
|
||||
CLOCK_TYPE_COUNT, |
||||
CLOCK_TYPE_NONE = -1, /* invalid clock type */ |
||||
}; |
||||
|
||||
enum { |
||||
CLOCK_MAX_MUX = 8 /* number of source options for each clock */ |
||||
}; |
||||
|
||||
enum { |
||||
MASK_BITS_31_30 = 2, /* num of bits used to specify clock source */ |
||||
MASK_BITS_31_29, |
||||
MASK_BITS_29_28, |
||||
}; |
||||
|
||||
/*
|
||||
* Clock source mux for each clock type. This just converts our enum into |
||||
* a list of mux sources for use by the code. |
||||
* |
||||
* Note: |
||||
* The extra column in each clock source array is used to store the mask |
||||
* bits in its register for the source. |
||||
*/ |
||||
#define CLK(x) CLOCK_ID_ ## x |
||||
static enum clock_id clock_source[CLOCK_TYPE_COUNT][CLOCK_MAX_MUX+1] = { |
||||
{ CLK(AUDIO), CLK(XCPU), CLK(PERIPH), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(AUDIO), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(MEMORY), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(NONE), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(MEMORY), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(PERIPH), CLK(DISPLAY), CLK(CGENERAL), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(AUDIO), CLK(CGENERAL), CLK(PERIPH), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_30}, |
||||
{ CLK(AUDIO), CLK(SFROM32KHZ), CLK(PERIPH), CLK(OSC), |
||||
CLK(EPCI), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_31_29}, |
||||
{ CLK(PERIPH), CLK(MEMORY), CLK(DISPLAY), CLK(AUDIO), |
||||
CLK(CGENERAL), CLK(DISPLAY2), CLK(OSC), CLK(NONE), |
||||
MASK_BITS_31_29}, |
||||
{ CLK(PERIPH), CLK(CGENERAL), CLK(SFROM32KHZ), CLK(OSC), |
||||
CLK(NONE), CLK(NONE), CLK(NONE), CLK(NONE), |
||||
MASK_BITS_29_28} |
||||
}; |
||||
|
||||
/*
|
||||
* Clock type for each peripheral clock source. We put the name in each |
||||
* record just so it is easy to match things up |
||||
*/ |
||||
#define TYPE(name, type) type |
||||
static enum clock_type_id clock_periph_type[PERIPHC_COUNT] = { |
||||
/* 0x00 */ |
||||
TYPE(PERIPHC_I2S1, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_I2S2, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_SPDIF_OUT, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_SPDIF_IN, CLOCK_TYPE_PCM), |
||||
TYPE(PERIPHC_PWM, CLOCK_TYPE_PCST), /* only PWM uses b29:28 */ |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SBC2, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SBC3, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x08 */ |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_I2C1, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_DVC_I2C, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SBC1, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_DISP1, CLOCK_TYPE_PMDACD2T), |
||||
TYPE(PERIPHC_DISP2, CLOCK_TYPE_PMDACD2T), |
||||
|
||||
/* 0x10 */ |
||||
TYPE(PERIPHC_CVE, CLOCK_TYPE_PDCT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_VI, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SDMMC1, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SDMMC2, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_G3D, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_G2D, CLOCK_TYPE_MCPA), |
||||
|
||||
/* 0x18 */ |
||||
TYPE(PERIPHC_NDFLASH, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SDMMC4, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_VFIR, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_EPP, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_MPE, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_MIPI, CLOCK_TYPE_PCMT), /* MIPI base-band HSI */ |
||||
TYPE(PERIPHC_UART1, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_UART2, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x20 */ |
||||
TYPE(PERIPHC_HOST1X, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_TVO, CLOCK_TYPE_PDCT), |
||||
TYPE(PERIPHC_HDMI, CLOCK_TYPE_PMDACD2T), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_TVDAC, CLOCK_TYPE_PDCT), |
||||
TYPE(PERIPHC_I2C2, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_EMC, CLOCK_TYPE_MCPT), |
||||
|
||||
/* 0x28 */ |
||||
TYPE(PERIPHC_UART3, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_VI, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SBC4, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_I2C3, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_SDMMC3, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x30 */ |
||||
TYPE(PERIPHC_UART4, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_UART5, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_VDE, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_OWR, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_NOR, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_CSITE, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_I2S0, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
|
||||
/* 0x38h */ /* Jumps to reg offset 0x3B0h - new for T30 */ |
||||
TYPE(PERIPHC_G3D2, CLOCK_TYPE_MCPA), |
||||
TYPE(PERIPHC_MSELECT, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_TSENSOR, CLOCK_TYPE_PCST), /* s/b PCTS */ |
||||
TYPE(PERIPHC_I2S3, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_I2S4, CLOCK_TYPE_AXPT), |
||||
TYPE(PERIPHC_I2C4, CLOCK_TYPE_PCMT16), |
||||
TYPE(PERIPHC_SBC5, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_SBC6, CLOCK_TYPE_PCMT), |
||||
|
||||
/* 0x40 */ |
||||
TYPE(PERIPHC_AUDIO, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_DAM0, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_DAM1, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_DAM2, CLOCK_TYPE_ACPT), |
||||
TYPE(PERIPHC_HDA2CODEC2X, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_ACTMON, CLOCK_TYPE_PCST), /* MASK 31:30 */ |
||||
TYPE(PERIPHC_EXTPERIPH1, CLOCK_TYPE_ASPTE), |
||||
|
||||
/* 0x48 */ |
||||
TYPE(PERIPHC_EXTPERIPH2, CLOCK_TYPE_ASPTE), |
||||
TYPE(PERIPHC_EXTPERIPH3, CLOCK_TYPE_ASPTE), |
||||
TYPE(PERIPHC_NANDSPEED, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_I2CSLOW, CLOCK_TYPE_PCST), /* MASK 31:30 */ |
||||
TYPE(PERIPHC_SYS, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SPEEDO, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
|
||||
/* 0x50 */ |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_NONE, CLOCK_TYPE_NONE), |
||||
TYPE(PERIPHC_SATAOOB, CLOCK_TYPE_PCMT), /* offset 0x420h */ |
||||
TYPE(PERIPHC_SATA, CLOCK_TYPE_PCMT), |
||||
TYPE(PERIPHC_HDA, CLOCK_TYPE_PCMT), |
||||
}; |
||||
|
||||
/*
|
||||
* This array translates a periph_id to a periphc_internal_id |
||||
* |
||||
* Not present/matched up: |
||||
* uint vi_sensor; _VI_SENSOR_0, 0x1A8 |
||||
* SPDIF - which is both 0x08 and 0x0c |
||||
* |
||||
*/ |
||||
#define NONE(name) (-1) |
||||
#define OFFSET(name, value) PERIPHC_ ## name |
||||
static s8 periph_id_to_internal_id[PERIPH_ID_COUNT] = { |
||||
/* Low word: 31:0 */ |
||||
NONE(CPU), |
||||
NONE(COP), |
||||
NONE(TRIGSYS), |
||||
NONE(RESERVED3), |
||||
NONE(RESERVED4), |
||||
NONE(TMR), |
||||
PERIPHC_UART1, |
||||
PERIPHC_UART2, /* and vfir 0x68 */ |
||||
|
||||
/* 8 */ |
||||
NONE(GPIO), |
||||
PERIPHC_SDMMC2, |
||||
NONE(SPDIF), /* 0x08 and 0x0c, unclear which to use */ |
||||
PERIPHC_I2S1, |
||||
PERIPHC_I2C1, |
||||
PERIPHC_NDFLASH, |
||||
PERIPHC_SDMMC1, |
||||
PERIPHC_SDMMC4, |
||||
|
||||
/* 16 */ |
||||
NONE(RESERVED16), |
||||
PERIPHC_PWM, |
||||
PERIPHC_I2S2, |
||||
PERIPHC_EPP, |
||||
PERIPHC_VI, |
||||
PERIPHC_G2D, |
||||
NONE(USBD), |
||||
NONE(ISP), |
||||
|
||||
/* 24 */ |
||||
PERIPHC_G3D, |
||||
NONE(RESERVED25), |
||||
PERIPHC_DISP2, |
||||
PERIPHC_DISP1, |
||||
PERIPHC_HOST1X, |
||||
NONE(VCP), |
||||
PERIPHC_I2S0, |
||||
NONE(CACHE2), |
||||
|
||||
/* Middle word: 63:32 */ |
||||
NONE(MEM), |
||||
NONE(AHBDMA), |
||||
NONE(APBDMA), |
||||
NONE(RESERVED35), |
||||
NONE(RESERVED36), |
||||
NONE(STAT_MON), |
||||
NONE(RESERVED38), |
||||
NONE(RESERVED39), |
||||
|
||||
/* 40 */ |
||||
NONE(KFUSE), |
||||
PERIPHC_SBC1, |
||||
PERIPHC_NOR, |
||||
NONE(RESERVED43), |
||||
PERIPHC_SBC2, |
||||
NONE(RESERVED45), |
||||
PERIPHC_SBC3, |
||||
PERIPHC_DVC_I2C, |
||||
|
||||
/* 48 */ |
||||
NONE(DSI), |
||||
PERIPHC_TVO, /* also CVE 0x40 */ |
||||
PERIPHC_MIPI, |
||||
PERIPHC_HDMI, |
||||
NONE(CSI), |
||||
PERIPHC_TVDAC, |
||||
PERIPHC_I2C2, |
||||
PERIPHC_UART3, |
||||
|
||||
/* 56 */ |
||||
NONE(RESERVED56), |
||||
PERIPHC_EMC, |
||||
NONE(USB2), |
||||
NONE(USB3), |
||||
PERIPHC_MPE, |
||||
PERIPHC_VDE, |
||||
NONE(BSEA), |
||||
NONE(BSEV), |
||||
|
||||
/* Upper word 95:64 */ |
||||
PERIPHC_SPEEDO, |
||||
PERIPHC_UART4, |
||||
PERIPHC_UART5, |
||||
PERIPHC_I2C3, |
||||
PERIPHC_SBC4, |
||||
PERIPHC_SDMMC3, |
||||
NONE(PCIE), |
||||
PERIPHC_OWR, |
||||
|
||||
/* 72 */ |
||||
NONE(AFI), |
||||
PERIPHC_CSITE, |
||||
NONE(PCIEXCLK), |
||||
NONE(AVPUCQ), |
||||
NONE(RESERVED76), |
||||
NONE(RESERVED77), |
||||
NONE(RESERVED78), |
||||
NONE(DTV), |
||||
|
||||
/* 80 */ |
||||
PERIPHC_NANDSPEED, |
||||
PERIPHC_I2CSLOW, |
||||
NONE(DSIB), |
||||
NONE(RESERVED83), |
||||
NONE(IRAMA), |
||||
NONE(IRAMB), |
||||
NONE(IRAMC), |
||||
NONE(IRAMD), |
||||
|
||||
/* 88 */ |
||||
NONE(CRAM2), |
||||
NONE(RESERVED89), |
||||
NONE(MDOUBLER), |
||||
NONE(RESERVED91), |
||||
NONE(SUSOUT), |
||||
NONE(RESERVED93), |
||||
NONE(RESERVED94), |
||||
NONE(RESERVED95), |
||||
|
||||
/* V word: 31:0 */ |
||||
NONE(CPUG), |
||||
NONE(CPULP), |
||||
PERIPHC_G3D2, |
||||
PERIPHC_MSELECT, |
||||
PERIPHC_TSENSOR, |
||||
PERIPHC_I2S3, |
||||
PERIPHC_I2S4, |
||||
PERIPHC_I2C4, |
||||
|
||||
/* 08 */ |
||||
PERIPHC_SBC5, |
||||
PERIPHC_SBC6, |
||||
PERIPHC_AUDIO, |
||||
NONE(APBIF), |
||||
PERIPHC_DAM0, |
||||
PERIPHC_DAM1, |
||||
PERIPHC_DAM2, |
||||
PERIPHC_HDA2CODEC2X, |
||||
|
||||
/* 16 */ |
||||
NONE(ATOMICS), |
||||
NONE(RESERVED17), |
||||
NONE(RESERVED18), |
||||
NONE(RESERVED19), |
||||
NONE(RESERVED20), |
||||
NONE(RESERVED21), |
||||
NONE(RESERVED22), |
||||
PERIPHC_ACTMON, |
||||
|
||||
/* 24 */ |
||||
NONE(RESERVED24), |
||||
NONE(RESERVED25), |
||||
NONE(RESERVED26), |
||||
NONE(RESERVED27), |
||||
PERIPHC_SATA, |
||||
PERIPHC_HDA, |
||||
NONE(RESERVED30), |
||||
NONE(RESERVED31), |
||||
|
||||
/* W word: 31:0 */ |
||||
NONE(HDA2HDMICODEC), |
||||
NONE(SATACOLD), |
||||
NONE(RESERVED0_PCIERX0), |
||||
NONE(RESERVED1_PCIERX1), |
||||
NONE(RESERVED2_PCIERX2), |
||||
NONE(RESERVED3_PCIERX3), |
||||
NONE(RESERVED4_PCIERX4), |
||||
NONE(RESERVED5_PCIERX5), |
||||
|
||||
/* 40 */ |
||||
NONE(CEC), |
||||
NONE(RESERVED6_PCIE2), |
||||
NONE(RESERVED7_EMC), |
||||
NONE(RESERVED8_HDMI), |
||||
NONE(RESERVED9_SATA), |
||||
NONE(RESERVED10_MIPI), |
||||
NONE(EX_RESERVED46), |
||||
NONE(EX_RESERVED47), |
||||
}; |
||||
|
||||
/*
|
||||
* Get the oscillator frequency, from the corresponding hardware configuration |
||||
* field. Note that T30 supports 3 new higher freqs, but we map back |
||||
* to the old T20 freqs. Support for the higher oscillators is TBD. |
||||
*/ |
||||
enum clock_osc_freq clock_get_osc_freq(void) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 reg; |
||||
|
||||
reg = readl(&clkrst->crc_osc_ctrl); |
||||
reg = (reg & OSC_FREQ_MASK) >> OSC_FREQ_SHIFT; |
||||
|
||||
if (reg & 1) /* one of the newer freqs */ |
||||
printf("Warning: OSC_FREQ is unsupported! (%d)\n", reg); |
||||
|
||||
return reg >> 2; /* Map to most common (T20) freqs */ |
||||
} |
||||
|
||||
/* Returns a pointer to the clock source register for a peripheral */ |
||||
u32 *get_periph_source_reg(enum periph_id periph_id) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
enum periphc_internal_id internal_id; |
||||
|
||||
/* Coresight is a special case */ |
||||
if (periph_id == PERIPH_ID_CSI) |
||||
return &clkrst->crc_clk_src[PERIPH_ID_CSI+1]; |
||||
|
||||
assert(periph_id >= PERIPH_ID_FIRST && periph_id < PERIPH_ID_COUNT); |
||||
internal_id = periph_id_to_internal_id[periph_id]; |
||||
assert(internal_id != -1); |
||||
if (internal_id >= PERIPHC_VW_FIRST) { |
||||
internal_id -= PERIPHC_VW_FIRST; |
||||
return &clkrst->crc_clk_src_vw[internal_id]; |
||||
} else |
||||
return &clkrst->crc_clk_src[internal_id]; |
||||
} |
||||
|
||||
/**
|
||||
* Given a peripheral ID and the required source clock, this returns which |
||||
* value should be programmed into the source mux for that peripheral. |
||||
* |
||||
* There is special code here to handle the one source type with 5 sources. |
||||
* |
||||
* @param periph_id peripheral to start |
||||
* @param source PLL id of required parent clock |
||||
* @param mux_bits Set to number of bits in mux register: 2 or 4 |
||||
* @param divider_bits Set to number of divider bits (8 or 16) |
||||
* @return mux value (0-4, or -1 if not found) |
||||
*/ |
||||
int get_periph_clock_source(enum periph_id periph_id, |
||||
enum clock_id parent, int *mux_bits, int *divider_bits) |
||||
{ |
||||
enum clock_type_id type; |
||||
enum periphc_internal_id internal_id; |
||||
int mux; |
||||
|
||||
assert(clock_periph_id_isvalid(periph_id)); |
||||
|
||||
internal_id = periph_id_to_internal_id[periph_id]; |
||||
assert(periphc_internal_id_isvalid(internal_id)); |
||||
|
||||
type = clock_periph_type[internal_id]; |
||||
assert(clock_type_id_isvalid(type)); |
||||
|
||||
*mux_bits = clock_source[type][CLOCK_MAX_MUX]; |
||||
|
||||
if (type == CLOCK_TYPE_PCMT16) |
||||
*divider_bits = 16; |
||||
else |
||||
*divider_bits = 8; |
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) |
||||
if (clock_source[type][mux] == parent) |
||||
return mux; |
||||
|
||||
/* if we get here, either us or the caller has made a mistake */ |
||||
printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, |
||||
parent); |
||||
return -1; |
||||
} |
||||
|
||||
void clock_set_enable(enum periph_id periph_id, int enable) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 *clk; |
||||
u32 reg; |
||||
|
||||
/* Enable/disable the clock to this peripheral */ |
||||
assert(clock_periph_id_isvalid(periph_id)); |
||||
if ((int)periph_id < (int)PERIPH_ID_VW_FIRST) |
||||
clk = &clkrst->crc_clk_out_enb[PERIPH_REG(periph_id)]; |
||||
else |
||||
clk = &clkrst->crc_clk_out_enb_vw[PERIPH_REG(periph_id)]; |
||||
reg = readl(clk); |
||||
if (enable) |
||||
reg |= PERIPH_MASK(periph_id); |
||||
else |
||||
reg &= ~PERIPH_MASK(periph_id); |
||||
writel(reg, clk); |
||||
} |
||||
|
||||
void reset_set_enable(enum periph_id periph_id, int enable) |
||||
{ |
||||
struct clk_rst_ctlr *clkrst = |
||||
(struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; |
||||
u32 *reset; |
||||
u32 reg; |
||||
|
||||
/* Enable/disable reset to the peripheral */ |
||||
assert(clock_periph_id_isvalid(periph_id)); |
||||
if (periph_id < PERIPH_ID_VW_FIRST) |
||||
reset = &clkrst->crc_rst_dev[PERIPH_REG(periph_id)]; |
||||
else |
||||
reset = &clkrst->crc_rst_dev_vw[PERIPH_REG(periph_id)]; |
||||
reg = readl(reset); |
||||
if (enable) |
||||
reg |= PERIPH_MASK(periph_id); |
||||
else |
||||
reg &= ~PERIPH_MASK(periph_id); |
||||
writel(reg, reset); |
||||
} |
||||
|
||||
#ifdef CONFIG_OF_CONTROL |
||||
/*
|
||||
* Convert a device tree clock ID to our peripheral ID. They are mostly |
||||
* the same but we are very cautious so we check that a valid clock ID is |
||||
* provided. |
||||
* |
||||
* @param clk_id Clock ID according to tegra30 device tree binding |
||||
* @return peripheral ID, or PERIPH_ID_NONE if the clock ID is invalid |
||||
*/ |
||||
enum periph_id clk_id_to_periph_id(int clk_id) |
||||
{ |
||||
if (clk_id > PERIPH_ID_COUNT) |
||||
return PERIPH_ID_NONE; |
||||
|
||||
switch (clk_id) { |
||||
case PERIPH_ID_RESERVED3: |
||||
case PERIPH_ID_RESERVED4: |
||||
case PERIPH_ID_RESERVED16: |
||||
case PERIPH_ID_RESERVED24: |
||||
case PERIPH_ID_RESERVED35: |
||||
case PERIPH_ID_RESERVED43: |
||||
case PERIPH_ID_RESERVED45: |
||||
case PERIPH_ID_RESERVED56: |
||||
case PERIPH_ID_RESERVED76: |
||||
case PERIPH_ID_RESERVED77: |
||||
case PERIPH_ID_RESERVED78: |
||||
case PERIPH_ID_RESERVED83: |
||||
case PERIPH_ID_RESERVED89: |
||||
case PERIPH_ID_RESERVED91: |
||||
case PERIPH_ID_RESERVED93: |
||||
case PERIPH_ID_RESERVED94: |
||||
case PERIPH_ID_RESERVED95: |
||||
return PERIPH_ID_NONE; |
||||
default: |
||||
return clk_id; |
||||
} |
||||
} |
||||
#endif /* CONFIG_OF_CONTROL */ |
||||
|
||||
void clock_early_init(void) |
||||
{ |
||||
/*
|
||||
* PLLP output frequency set to 408Mhz |
||||
* PLLC output frequency set to 228Mhz |
||||
*/ |
||||
switch (clock_get_osc_freq()) { |
||||
case CLOCK_OSC_FREQ_12_0: /* OSC is 12Mhz */ |
||||
clock_set_rate(CLOCK_ID_PERIPH, 408, 12, 0, 8); |
||||
clock_set_rate(CLOCK_ID_CGENERAL, 456, 12, 1, 8); |
||||
break; |
||||
|
||||
case CLOCK_OSC_FREQ_26_0: /* OSC is 26Mhz */ |
||||
clock_set_rate(CLOCK_ID_PERIPH, 408, 26, 0, 8); |
||||
clock_set_rate(CLOCK_ID_CGENERAL, 600, 26, 0, 8); |
||||
break; |
||||
|
||||
case CLOCK_OSC_FREQ_13_0: /* OSC is 13Mhz */ |
||||
clock_set_rate(CLOCK_ID_PERIPH, 408, 13, 0, 8); |
||||
clock_set_rate(CLOCK_ID_CGENERAL, 600, 13, 0, 8); |
||||
break; |
||||
case CLOCK_OSC_FREQ_19_2: |
||||
default: |
||||
/*
|
||||
* These are not supported. It is too early to print a |
||||
* message and the UART likely won't work anyway due to the |
||||
* oscillator being wrong. |
||||
*/ |
||||
break; |
||||
} |
||||
} |
@ -0,0 +1,57 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra30 high-level function multiplexing */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/arch/clock.h> |
||||
#include <asm/arch/funcmux.h> |
||||
#include <asm/arch/pinmux.h> |
||||
|
||||
int funcmux_select(enum periph_id id, int config) |
||||
{ |
||||
int bad_config = config != FUNCMUX_DEFAULT; |
||||
|
||||
switch (id) { |
||||
case PERIPH_ID_UART1: |
||||
switch (config) { |
||||
case FUNCMUX_UART1_ULPI: |
||||
pinmux_set_func(PINGRP_ULPI_DATA0, PMUX_FUNC_UARTA); |
||||
pinmux_set_func(PINGRP_ULPI_DATA1, PMUX_FUNC_UARTA); |
||||
pinmux_set_func(PINGRP_ULPI_DATA2, PMUX_FUNC_UARTA); |
||||
pinmux_set_func(PINGRP_ULPI_DATA3, PMUX_FUNC_UARTA); |
||||
pinmux_tristate_disable(PINGRP_ULPI_DATA0); |
||||
pinmux_tristate_disable(PINGRP_ULPI_DATA1); |
||||
pinmux_tristate_disable(PINGRP_ULPI_DATA2); |
||||
pinmux_tristate_disable(PINGRP_ULPI_DATA3); |
||||
break; |
||||
} |
||||
break; |
||||
|
||||
/* Add other periph IDs here as needed */ |
||||
|
||||
default: |
||||
debug("%s: invalid periph_id %d", __func__, id); |
||||
return -1; |
||||
} |
||||
|
||||
if (bad_config) { |
||||
debug("%s: invalid config %d for periph_id %d", __func__, |
||||
config, id); |
||||
return -1; |
||||
} |
||||
return 0; |
||||
} |
@ -0,0 +1,506 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra30 pin multiplexing functions */ |
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/tegra.h> |
||||
#include <asm/arch/pinmux.h> |
||||
|
||||
struct tegra_pingroup_desc { |
||||
const char *name; |
||||
enum pmux_func funcs[4]; |
||||
enum pmux_func func_safe; |
||||
enum pmux_vddio vddio; |
||||
enum pmux_pin_io io; |
||||
}; |
||||
|
||||
#define PMUX_MUXCTL_SHIFT 0 |
||||
#define PMUX_PULL_SHIFT 2 |
||||
#define PMUX_TRISTATE_SHIFT 4 |
||||
#define PMUX_TRISTATE_MASK (1 << PMUX_TRISTATE_SHIFT) |
||||
#define PMUX_IO_SHIFT 5 |
||||
#define PMUX_OD_SHIFT 6 |
||||
#define PMUX_LOCK_SHIFT 7 |
||||
#define PMUX_IO_RESET_SHIFT 8 |
||||
|
||||
/* Convenient macro for defining pin group properties */ |
||||
#define PIN(pg_name, vdd, f0, f1, f2, f3, iod) \ |
||||
{ \
|
||||
.vddio = PMUX_VDDIO_ ## vdd, \
|
||||
.funcs = { \
|
||||
PMUX_FUNC_ ## f0, \
|
||||
PMUX_FUNC_ ## f1, \
|
||||
PMUX_FUNC_ ## f2, \
|
||||
PMUX_FUNC_ ## f3, \
|
||||
}, \
|
||||
.func_safe = PMUX_FUNC_RSVD1, \
|
||||
.io = PMUX_PIN_ ## iod, \
|
||||
} |
||||
|
||||
/* Input and output pins */ |
||||
#define PINI(pg_name, vdd, f0, f1, f2, f3) \ |
||||
PIN(pg_name, vdd, f0, f1, f2, f3, INPUT) |
||||
#define PINO(pg_name, vdd, f0, f1, f2, f3) \ |
||||
PIN(pg_name, vdd, f0, f1, f2, f3, OUTPUT) |
||||
|
||||
const struct tegra_pingroup_desc tegra_soc_pingroups[PINGRP_COUNT] = { |
||||
/* NAME VDD f0 f1 f2 f3 */ |
||||
PINI(ULPI_DATA0, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA1, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA2, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA3, BB, SPI3, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA4, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA5, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA6, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_DATA7, BB, SPI2, HSI, UARTA, ULPI), |
||||
PINI(ULPI_CLK, BB, SPI1, RSVD2, UARTD, ULPI), |
||||
PINI(ULPI_DIR, BB, SPI1, RSVD2, UARTD, ULPI), |
||||
PINI(ULPI_NXT, BB, SPI1, RSVD2, UARTD, ULPI), |
||||
PINI(ULPI_STP, BB, SPI1, RSVD2, UARTD, ULPI), |
||||
PINI(DAP3_FS, BB, I2S2, RSVD2, DISPA, DISPB), |
||||
PINI(DAP3_DIN, BB, I2S2, RSVD2, DISPA, DISPB), |
||||
PINI(DAP3_DOUT, BB, I2S2, RSVD2, DISPA, DISPB), |
||||
PINI(DAP3_SCLK, BB, I2S2, RSVD2, DISPA, DISPB), |
||||
PINI(GPIO_PV0, BB, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(GPIO_PV1, BB, RSVD1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SDMMC1_CLK, SDMMC1, SDMMC1, RSVD2, RSVD3, UARTA), |
||||
PINI(SDMMC1_CMD, SDMMC1, SDMMC1, RSVD2, RSVD3, UARTA), |
||||
PINI(SDMMC1_DAT3, SDMMC1, SDMMC1, RSVD2, UARTE, UARTA), |
||||
PINI(SDMMC1_DAT2, SDMMC1, SDMMC1, RSVD2, UARTE, UARTA), |
||||
PINI(SDMMC1_DAT1, SDMMC1, SDMMC1, RSVD2, UARTE, UARTA), |
||||
PINI(SDMMC1_DAT0, SDMMC1, SDMMC1, RSVD2, UARTE, UARTA), |
||||
PINI(GPIO_PV2, SDMMC1, OWR, RSVD2, RSVD3, RSVD4), |
||||
PINI(GPIO_PV3, SDMMC1, CLK_12M_OUT, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK2_OUT, SDMMC1, EXTPERIPH2, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK2_REQ, SDMMC1, DAP, RSVD2, RSVD3, RSVD4), |
||||
PINO(LCD_PWR1, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_PWR2, LCD, DISPA, DISPB, SPI5, HDCP), |
||||
PINO(LCD_SDIN, LCD, DISPA, DISPB, SPI5, RSVD4), |
||||
PINO(LCD_SDOUT, LCD, DISPA, DISPB, SPI5, HDCP), |
||||
PINO(LCD_WR_N, LCD, DISPA, DISPB, SPI5, HDCP), |
||||
PINO(LCD_CS0_N, LCD, DISPA, DISPB, SPI5, RSVD4), |
||||
PINO(LCD_DC0, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_SCK, LCD, DISPA, DISPB, SPI5, HDCP), |
||||
PINO(LCD_PWR0, LCD, DISPA, DISPB, SPI5, HDCP), |
||||
PINO(LCD_PCLK, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_DE, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_HSYNC, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_VSYNC, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D0, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D1, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D2, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D3, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D4, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D5, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D6, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D7, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D8, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D9, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D10, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D11, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D12, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D13, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D14, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D15, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D16, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D17, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D18, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D19, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D20, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D21, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D22, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_D23, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_CS1_N, LCD, DISPA, DISPB, SPI5, RSVD4), |
||||
PINO(LCD_M1, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINO(LCD_DC1, LCD, DISPA, DISPB, RSVD3, RSVD4), |
||||
PINI(HDMI_INT, LCD, HDMI, RSVD2, RSVD3, RSVD4), |
||||
PINI(DDC_SCL, LCD, I2C4, RSVD2, RSVD3, RSVD4), |
||||
PINI(DDC_SDA, LCD, I2C4, RSVD2, RSVD3, RSVD4), |
||||
PINI(CRT_HSYNC, LCD, CRT, RSVD2, RSVD3, RSVD4), |
||||
PINI(CRT_VSYNC, LCD, CRT, RSVD2, RSVD3, RSVD4), |
||||
PINI(VI_D0, VI, DDR, RSVD2, VI, RSVD4), |
||||
PINI(VI_D1, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D2, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D3, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D4, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D5, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D6, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D7, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D8, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D9, VI, DDR, SDMMC2, VI, RSVD4), |
||||
PINI(VI_D10, VI, DDR, RSVD2, VI, RSVD4), |
||||
PINI(VI_D11, VI, DDR, RSVD2, VI, RSVD4), |
||||
PINI(VI_PCLK, VI, RSVD1, SDMMC2, VI, RSVD4), |
||||
PINI(VI_MCLK, VI, VI, VI, VI, VI), |
||||
PINI(VI_VSYNC, VI, DDR, RSVD2, VI, RSVD4), |
||||
PINI(VI_HSYNC, VI, DDR, RSVD2, VI, RSVD4), |
||||
PINI(UART2_RXD, UART, UARTB, SPDIF, UARTA, SPI4), |
||||
PINI(UART2_TXD, UART, UARTB, SPDIF, UARTA, SPI4), |
||||
PINI(UART2_RTS_N, UART, UARTA, UARTB, GMI, SPI4), |
||||
PINI(UART2_CTS_N, UART, UARTA, UARTB, GMI, SPI4), |
||||
PINI(UART3_TXD, UART, UARTC, RSVD2, GMI, RSVD4), |
||||
PINI(UART3_RXD, UART, UARTC, RSVD2, GMI, RSVD4), |
||||
PINI(UART3_CTS_N, UART, UARTC, RSVD2, GMI, RSVD4), |
||||
PINI(UART3_RTS_N, UART, UARTC, PWM0, GMI, RSVD4), |
||||
PINI(GPIO_PU0, UART, OWR, UARTA, GMI, RSVD4), |
||||
PINI(GPIO_PU1, UART, RSVD1, UARTA, GMI, RSVD4), |
||||
PINI(GPIO_PU2, UART, RSVD1, UARTA, GMI, RSVD4), |
||||
PINI(GPIO_PU3, UART, PWM0, UARTA, GMI, RSVD4), |
||||
PINI(GPIO_PU4, UART, PWM1, UARTA, GMI, RSVD4), |
||||
PINI(GPIO_PU5, UART, PWM2, UARTA, GMI, RSVD4), |
||||
PINI(GPIO_PU6, UART, PWM3, UARTA, GMI, RSVD4), |
||||
PINI(GEN1_I2C_SDA, UART, I2C1, RSVD2, RSVD3, RSVD4), |
||||
PINI(GEN1_I2C_SCL, UART, I2C1, RSVD2, RSVD3, RSVD4), |
||||
PINI(DAP4_FS, UART, I2S3, RSVD2, GMI, RSVD4), |
||||
PINI(DAP4_DIN, UART, I2S3, RSVD2, GMI, RSVD4), |
||||
PINI(DAP4_DOUT, UART, I2S3, RSVD2, GMI, RSVD4), |
||||
PINI(DAP4_SCLK, UART, I2S3, RSVD2, GMI, RSVD4), |
||||
PINI(CLK3_OUT, UART, EXTPERIPH3, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK3_REQ, UART, DEV3, RSVD2, RSVD3, RSVD4), |
||||
PINI(GMI_WP_N, GMI, RSVD1, NAND, GMI, GMI_ALT), |
||||
PINI(GMI_IORDY, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_WAIT, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_ADV_N, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_CLK, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_CS0_N, GMI, RSVD1, NAND, GMI, DTV), |
||||
PINI(GMI_CS1_N, GMI, RSVD1, NAND, GMI, DTV), |
||||
PINI(GMI_CS2_N, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_CS3_N, GMI, RSVD1, NAND, GMI, GMI_ALT), |
||||
PINI(GMI_CS4_N, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_CS6_N, GMI, NAND, NAND_ALT, GMI, SATA), |
||||
PINI(GMI_CS7_N, GMI, NAND, NAND_ALT, GMI, GMI_ALT), |
||||
PINI(GMI_AD0, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD1, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD2, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD3, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD4, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD5, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD6, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD7, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD8, GMI, PWM0, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD9, GMI, PWM1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD10, GMI, PWM2, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD11, GMI, PWM3, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD12, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD13, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD14, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_AD15, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_A16, GMI, UARTD, SPI4, GMI, GMI_ALT), |
||||
PINI(GMI_A17, GMI, UARTD, SPI4, GMI, DTV), |
||||
PINI(GMI_A18, GMI, UARTD, SPI4, GMI, DTV), |
||||
PINI(GMI_A19, GMI, UARTD, SPI4, GMI, RSVD4), |
||||
PINI(GMI_WR_N, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_OE_N, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_DQS, GMI, RSVD1, NAND, GMI, RSVD4), |
||||
PINI(GMI_RST_N, GMI, NAND, NAND_ALT, GMI, RSVD4), |
||||
PINI(GEN2_I2C_SCL, GMI, I2C2, HDCP, GMI, RSVD4), |
||||
PINI(GEN2_I2C_SDA, GMI, I2C2, HDCP, GMI, RSVD4), |
||||
PINI(SDMMC4_CLK, SDMMC4, RSVD1, NAND, GMI, SDMMC4), |
||||
PINI(SDMMC4_CMD, SDMMC4, I2C3, NAND, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT0, SDMMC4, UARTE, SPI3, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT1, SDMMC4, UARTE, SPI3, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT2, SDMMC4, UARTE, SPI3, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT3, SDMMC4, UARTE, SPI3, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT4, SDMMC4, I2C3, I2S4, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT5, SDMMC4, VGP3, I2S4, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT6, SDMMC4, VGP4, I2S4, GMI, SDMMC4), |
||||
PINI(SDMMC4_DAT7, SDMMC4, VGP5, I2S4, GMI, SDMMC4), |
||||
PINI(SDMMC4_RST_N, SDMMC4, VGP6, RSVD2, RSVD3, SDMMC4), |
||||
PINI(CAM_MCLK, CAM, VI, RSVD2, VI_ALT2, SDMMC4), |
||||
PINI(GPIO_PCC1, CAM, I2S4, RSVD2, RSVD3, SDMMC4), |
||||
PINI(GPIO_PBB0, CAM, I2S4, RSVD2, RSVD3, SDMMC4), |
||||
PINI(CAM_I2C_SCL, CAM, VGP1, I2C3, RSVD3, SDMMC4), |
||||
PINI(CAM_I2C_SDA, CAM, VGP2, I2C3, RSVD3, SDMMC4), |
||||
PINI(GPIO_PBB3, CAM, VGP3, DISPA, DISPB, SDMMC4), |
||||
PINI(GPIO_PBB4, CAM, VGP4, DISPA, DISPB, SDMMC4), |
||||
PINI(GPIO_PBB5, CAM, VGP5, DISPA, DISPB, SDMMC4), |
||||
PINI(GPIO_PBB6, CAM, VGP6, DISPA, DISPB, SDMMC4), |
||||
PINI(GPIO_PBB7, CAM, I2S4, RSVD2, RSVD3, SDMMC4), |
||||
PINI(GPIO_PCC2, CAM, I2S4, RSVD2, RSVD3, RSVD4), |
||||
PINI(JTAG_RTCK, SYS, RTCK, RSVD2, RSVD3, RSVD4), |
||||
PINI(PWR_I2C_SCL, SYS, I2CPWR, RSVD2, RSVD3, RSVD4), |
||||
PINI(PWR_I2C_SDA, SYS, I2CPWR, RSVD2, RSVD3, RSVD4), |
||||
PINI(KB_ROW0, SYS, KBC, NAND, RSVD3, RSVD4), |
||||
PINI(KB_ROW1, SYS, KBC, NAND, RSVD3, RSVD4), |
||||
PINI(KB_ROW2, SYS, KBC, NAND, RSVD3, RSVD4), |
||||
PINI(KB_ROW3, SYS, KBC, NAND, RSVD3, RSVD4), |
||||
PINI(KB_ROW4, SYS, KBC, NAND, TRACE, RSVD4), |
||||
PINI(KB_ROW5, SYS, KBC, NAND, TRACE, OWR), |
||||
PINI(KB_ROW6, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW7, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW8, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW9, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW10, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW11, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW12, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW13, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW14, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_ROW15, SYS, KBC, NAND, SDMMC2, MIO), |
||||
PINI(KB_COL0, SYS, KBC, NAND, TRACE, TEST), |
||||
PINI(KB_COL1, SYS, KBC, NAND, TRACE, TEST), |
||||
PINI(KB_COL2, SYS, KBC, NAND, TRACE, RSVD4), |
||||
PINI(KB_COL3, SYS, KBC, NAND, TRACE, RSVD4), |
||||
PINI(KB_COL4, SYS, KBC, NAND, TRACE, RSVD4), |
||||
PINI(KB_COL5, SYS, KBC, NAND, TRACE, RSVD4), |
||||
PINI(KB_COL6, SYS, KBC, NAND, TRACE, MIO), |
||||
PINI(KB_COL7, SYS, KBC, NAND, TRACE, MIO), |
||||
PINI(CLK_32K_OUT, SYS, BLINK, RSVD2, RSVD3, RSVD4), |
||||
PINI(SYS_CLK_REQ, SYS, SYSCLK, RSVD2, RSVD3, RSVD4), |
||||
PINI(CORE_PWR_REQ, SYS, CORE_PWR_REQ, RSVD2, RSVD3, RSVD4), |
||||
PINI(CPU_PWR_REQ, SYS, CPU_PWR_REQ, RSVD2, RSVD3, RSVD4), |
||||
PINI(PWR_INT_N, SYS, PWR_INT_N, RSVD2, RSVD3, RSVD4), |
||||
PINI(CLK_32K_IN, SYS, CLK_32K_IN, RSVD2, RSVD3, RSVD4), |
||||
PINI(OWR, SYS, OWR, CEC, RSVD3, RSVD4), |
||||
PINI(DAP1_FS, AUDIO, I2S0, HDA, GMI, SDMMC2), |
||||
PINI(DAP1_DIN, AUDIO, I2S0, HDA, GMI, SDMMC2), |
||||
PINI(DAP1_DOUT, AUDIO, I2S0, HDA, GMI, SDMMC2), |
||||
PINI(DAP1_SCLK, AUDIO, I2S0, HDA, GMI, SDMMC2), |
||||
PINI(CLK1_REQ, AUDIO, DAP, HDA, RSVD3, RSVD4), |
||||
PINI(CLK1_OUT, AUDIO, EXTPERIPH1, RSVD2, RSVD3, RSVD4), |
||||
PINI(SPDIF_IN, AUDIO, SPDIF, HDA, I2C1, SDMMC2), |
||||
PINI(SPDIF_OUT, AUDIO, SPDIF, RSVD2, I2C1, SDMMC2), |
||||
PINI(DAP2_FS, AUDIO, I2S1, HDA, RSVD3, GMI), |
||||
PINI(DAP2_DIN, AUDIO, I2S1, HDA, RSVD3, GMI), |
||||
PINI(DAP2_DOUT, AUDIO, I2S1, HDA, RSVD3, GMI), |
||||
PINI(DAP2_SCLK, AUDIO, I2S1, HDA, RSVD3, GMI), |
||||
PINI(SPI2_MOSI, AUDIO, SPI6, SPI2, GMI, GMI), |
||||
PINI(SPI2_MISO, AUDIO, SPI6, SPI2, GMI, GMI), |
||||
PINI(SPI2_CS0_N, AUDIO, SPI6, SPI2, GMI, GMI), |
||||
PINI(SPI2_SCK, AUDIO, SPI6, SPI2, GMI, GMI), |
||||
PINI(SPI1_MOSI, AUDIO, SPI2, SPI1, SPI2_ALT, GMI), |
||||
PINI(SPI1_SCK, AUDIO, SPI2, SPI1, SPI2_ALT, GMI), |
||||
PINI(SPI1_CS0_N, AUDIO, SPI2, SPI1, SPI2_ALT, GMI), |
||||
PINI(SPI1_MISO, AUDIO, SPI3, SPI1, SPI2_ALT, RSVD4), |
||||
PINI(SPI2_CS1_N, AUDIO, SPI3, SPI2, SPI2_ALT, I2C1), |
||||
PINI(SPI2_CS2_N, AUDIO, SPI3, SPI2, SPI2_ALT, I2C1), |
||||
PINI(SDMMC3_CLK, SDMMC3, UARTA, PWM2, SDMMC3, SPI3), |
||||
PINI(SDMMC3_CMD, SDMMC3, UARTA, PWM3, SDMMC3, SPI2), |
||||
PINI(SDMMC3_DAT0, SDMMC3, RSVD1, RSVD2, SDMMC3, SPI3), |
||||
PINI(SDMMC3_DAT1, SDMMC3, RSVD1, RSVD2, SDMMC3, SPI3), |
||||
PINI(SDMMC3_DAT2, SDMMC3, RSVD1, PWM1, SDMMC3, SPI3), |
||||
PINI(SDMMC3_DAT3, SDMMC3, RSVD1, PWM0, SDMMC3, SPI3), |
||||
PINI(SDMMC3_DAT4, SDMMC3, PWM1, SPI4, SDMMC3, SPI2), |
||||
PINI(SDMMC3_DAT5, SDMMC3, PWM0, SPI4, SDMMC3, SPI2), |
||||
PINI(SDMMC3_DAT6, SDMMC3, SPDIF, SPI4, SDMMC3, SPI2), |
||||
PINI(SDMMC3_DAT7, SDMMC3, SPDIF, SPI4, SDMMC3, SPI2), |
||||
PINI(PEX_L0_PRSNT_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L0_RST_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L0_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_WAKE_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L1_PRSNT_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L1_RST_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L1_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L2_PRSNT_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L2_RST_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(PEX_L2_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD3, RSVD4), |
||||
PINI(HDMI_CEC, SYS, CEC, RSVD2, RSVD3, RSVD4), |
||||
}; |
||||
|
||||
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_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
|
||||
reg = readl(tri); |
||||
if (enable) |
||||
reg |= PMUX_TRISTATE_MASK; |
||||
else |
||||
reg &= ~PMUX_TRISTATE_MASK; |
||||
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; |
||||
u32 *pull = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and pupd */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_pupd_isvalid(pupd)); |
||||
|
||||
reg = readl(pull); |
||||
reg &= ~(0x3 << PMUX_PULL_SHIFT); |
||||
reg |= (pupd << PMUX_PULL_SHIFT); |
||||
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; |
||||
u32 *muxctl = &pmt->pmt_ctl[pin]; |
||||
int i, mux = -1; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and func */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_func_isvalid(func)); |
||||
|
||||
/* Handle special values */ |
||||
if (func == PMUX_FUNC_SAFE) |
||||
func = tegra_soc_pingroups[pin].func_safe; |
||||
|
||||
if (func & PMUX_FUNC_RSVD1) { |
||||
mux = func & 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); |
||||
|
||||
reg = readl(muxctl); |
||||
reg &= ~(0x3 << PMUX_MUXCTL_SHIFT); |
||||
reg |= (mux << PMUX_MUXCTL_SHIFT); |
||||
writel(reg, muxctl); |
||||
|
||||
} |
||||
|
||||
void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_io = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and io */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_io_isvalid(io)); |
||||
|
||||
reg = readl(pin_io); |
||||
reg &= ~(0x1 << PMUX_IO_SHIFT); |
||||
reg |= (io & 0x1) << PMUX_IO_SHIFT; |
||||
writel(reg, pin_io); |
||||
} |
||||
|
||||
static int pinmux_set_lock(enum pmux_pingrp pin, enum pmux_pin_lock lock) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_lock = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and lock */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_lock_isvalid(lock)); |
||||
|
||||
if (lock == PMUX_PIN_LOCK_DEFAULT) |
||||
return 0; |
||||
|
||||
reg = readl(pin_lock); |
||||
reg &= ~(0x1 << PMUX_LOCK_SHIFT); |
||||
if (lock == PMUX_PIN_LOCK_ENABLE) |
||||
reg |= (0x1 << PMUX_LOCK_SHIFT); |
||||
else { |
||||
/* lock == DISABLE, which isn't possible */ |
||||
printf("%s: Warning: lock == %d, DISABLE is not allowed!\n", |
||||
__func__, lock); |
||||
} |
||||
writel(reg, pin_lock); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int pinmux_set_od(enum pmux_pingrp pin, enum pmux_pin_od od) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_od = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and od */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_od_isvalid(od)); |
||||
|
||||
if (od == PMUX_PIN_OD_DEFAULT) |
||||
return 0; |
||||
|
||||
reg = readl(pin_od); |
||||
reg &= ~(0x1 << PMUX_OD_SHIFT); |
||||
if (od == PMUX_PIN_OD_ENABLE) |
||||
reg |= (0x1 << PMUX_OD_SHIFT); |
||||
writel(reg, pin_od); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int pinmux_set_ioreset(enum pmux_pingrp pin, |
||||
enum pmux_pin_ioreset ioreset) |
||||
{ |
||||
struct pmux_tri_ctlr *pmt = |
||||
(struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE; |
||||
u32 *pin_ioreset = &pmt->pmt_ctl[pin]; |
||||
u32 reg; |
||||
|
||||
/* Error check on pin and ioreset */ |
||||
assert(pmux_pingrp_isvalid(pin)); |
||||
assert(pmux_pin_ioreset_isvalid(ioreset)); |
||||
|
||||
if (ioreset == PMUX_PIN_IO_RESET_DEFAULT) |
||||
return 0; |
||||
|
||||
reg = readl(pin_ioreset); |
||||
reg &= ~(0x1 << PMUX_IO_RESET_SHIFT); |
||||
if (ioreset == PMUX_PIN_IO_RESET_ENABLE) |
||||
reg |= (0x1 << PMUX_IO_RESET_SHIFT); |
||||
writel(reg, pin_ioreset); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void pinmux_config_pingroup(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); |
||||
pinmux_set_io(pin, config->io); |
||||
pinmux_set_lock(pin, config->lock); |
||||
pinmux_set_od(pin, config->od); |
||||
pinmux_set_ioreset(pin, config->ioreset); |
||||
} |
||||
|
||||
void pinmux_config_table(struct pingroup_config *config, int len) |
||||
{ |
||||
int i; |
||||
|
||||
for (i = 0; i < len; i++) |
||||
pinmux_config_pingroup(&config[i]); |
||||
} |
@ -0,0 +1,5 @@ |
||||
/include/ "skeleton.dtsi" |
||||
|
||||
/ { |
||||
compatible = "nvidia,tegra114"; |
||||
}; |
@ -0,0 +1,165 @@ |
||||
/include/ "skeleton.dtsi" |
||||
|
||||
/ { |
||||
compatible = "nvidia,tegra30"; |
||||
|
||||
tegra_car: clock@60006000 { |
||||
compatible = "nvidia,tegra30-car", "nvidia,tegra20-car"; |
||||
reg = <0x60006000 0x1000>; |
||||
#clock-cells = <1>; |
||||
}; |
||||
|
||||
apbdma: dma { |
||||
compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma"; |
||||
reg = <0x6000a000 0x1400>; |
||||
interrupts = <0 104 0x04 |
||||
0 105 0x04 |
||||
0 106 0x04 |
||||
0 107 0x04 |
||||
0 108 0x04 |
||||
0 109 0x04 |
||||
0 110 0x04 |
||||
0 111 0x04 |
||||
0 112 0x04 |
||||
0 113 0x04 |
||||
0 114 0x04 |
||||
0 115 0x04 |
||||
0 116 0x04 |
||||
0 117 0x04 |
||||
0 118 0x04 |
||||
0 119 0x04 |
||||
0 128 0x04 |
||||
0 129 0x04 |
||||
0 130 0x04 |
||||
0 131 0x04 |
||||
0 132 0x04 |
||||
0 133 0x04 |
||||
0 134 0x04 |
||||
0 135 0x04 |
||||
0 136 0x04 |
||||
0 137 0x04 |
||||
0 138 0x04 |
||||
0 139 0x04 |
||||
0 140 0x04 |
||||
0 141 0x04 |
||||
0 142 0x04 |
||||
0 143 0x04>; |
||||
}; |
||||
|
||||
i2c@7000c000 { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; |
||||
reg = <0x7000C000 0x100>; |
||||
/* PERIPH_ID_I2C1, CLK_M */ |
||||
clocks = <&tegra_car 12>; |
||||
}; |
||||
|
||||
i2c@7000c400 { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; |
||||
reg = <0x7000C400 0x100>; |
||||
/* PERIPH_ID_I2C2, CLK_M */ |
||||
clocks = <&tegra_car 54>; |
||||
}; |
||||
|
||||
i2c@7000c500 { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; |
||||
reg = <0x7000C500 0x100>; |
||||
/* PERIPH_ID_I2C3, CLK_M */ |
||||
clocks = <&tegra_car 67>; |
||||
}; |
||||
|
||||
i2c@7000c700 { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; |
||||
reg = <0x7000C700 0x100>; |
||||
/* PERIPH_ID_I2C4, CLK_M */ |
||||
clocks = <&tegra_car 103>; |
||||
}; |
||||
|
||||
i2c@7000d000 { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; |
||||
reg = <0x7000D000 0x100>; |
||||
/* PERIPH_ID_I2C_DVC, CLK_M */ |
||||
clocks = <&tegra_car 47>; |
||||
}; |
||||
|
||||
spi@7000d400 { |
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; |
||||
reg = <0x7000d400 0x200>; |
||||
interrupts = <0 59 0x04>; |
||||
nvidia,dma-request-selector = <&apbdma 15>; |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
status = "disabled"; |
||||
/* PERIPH_ID_SBC1, PLLP_OUT0 */ |
||||
clocks = <&tegra_car 41>; |
||||
}; |
||||
|
||||
spi@7000d600 { |
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; |
||||
reg = <0x7000d600 0x200>; |
||||
interrupts = <0 82 0x04>; |
||||
nvidia,dma-request-selector = <&apbdma 16>; |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
status = "disabled"; |
||||
/* PERIPH_ID_SBC2, PLLP_OUT0 */ |
||||
clocks = <&tegra_car 44>; |
||||
}; |
||||
|
||||
spi@7000d800 { |
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; |
||||
reg = <0x7000d480 0x200>; |
||||
interrupts = <0 83 0x04>; |
||||
nvidia,dma-request-selector = <&apbdma 17>; |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
status = "disabled"; |
||||
/* PERIPH_ID_SBC3, PLLP_OUT0 */ |
||||
clocks = <&tegra_car 46>; |
||||
}; |
||||
|
||||
spi@7000da00 { |
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; |
||||
reg = <0x7000da00 0x200>; |
||||
interrupts = <0 93 0x04>; |
||||
nvidia,dma-request-selector = <&apbdma 18>; |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
status = "disabled"; |
||||
/* PERIPH_ID_SBC4, PLLP_OUT0 */ |
||||
clocks = <&tegra_car 68>; |
||||
}; |
||||
|
||||
spi@7000dc00 { |
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; |
||||
reg = <0x7000dc00 0x200>; |
||||
interrupts = <0 94 0x04>; |
||||
nvidia,dma-request-selector = <&apbdma 27>; |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
status = "disabled"; |
||||
/* PERIPH_ID_SBC5, PLLP_OUT0 */ |
||||
clocks = <&tegra_car 104>; |
||||
}; |
||||
|
||||
spi@7000de00 { |
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; |
||||
reg = <0x7000de00 0x200>; |
||||
interrupts = <0 79 0x04>; |
||||
nvidia,dma-request-selector = <&apbdma 28>; |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
status = "disabled"; |
||||
/* PERIPH_ID_SBC6, PLLP_OUT0 */ |
||||
clocks = <&tegra_car 105>; |
||||
}; |
||||
}; |
@ -0,0 +1,355 @@ |
||||
/*
|
||||
* Copyright (C) 2009-2010 Amit Kucheria <amit.kucheria@canonical.com> |
||||
* Copyright (C) 2010 Freescale Semiconductor, Inc. |
||||
* |
||||
* The code contained herein is licensed under the GNU General Public |
||||
* License. You may obtain a copy of the GNU General Public License |
||||
* Version 2 or later at the following locations: |
||||
* |
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/ |
||||
|
||||
#ifndef __MACH_IOMUX_MX23_H__ |
||||
#define __MACH_IOMUX_MX23_H__ |
||||
|
||||
#include <asm/arch/iomux.h> |
||||
|
||||
/*
|
||||
* The naming convention for the pad modes is MX23_PAD_<padname>__<padmode> |
||||
* If <padname> or <padmode> refers to a GPIO, it is named GPIO_<unit>_<num> |
||||
* See also iomux.h |
||||
* |
||||
* BANK PIN MUX |
||||
*/ |
||||
/* MUXSEL_0 */ |
||||
#define MX23_PAD_GPMI_D00__GPMI_D00 MXS_IOMUX_PAD_NAKED(0, 0, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D01__GPMI_D01 MXS_IOMUX_PAD_NAKED(0, 1, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D02__GPMI_D02 MXS_IOMUX_PAD_NAKED(0, 2, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D03__GPMI_D03 MXS_IOMUX_PAD_NAKED(0, 3, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D04__GPMI_D04 MXS_IOMUX_PAD_NAKED(0, 4, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D05__GPMI_D05 MXS_IOMUX_PAD_NAKED(0, 5, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D06__GPMI_D06 MXS_IOMUX_PAD_NAKED(0, 6, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D07__GPMI_D07 MXS_IOMUX_PAD_NAKED(0, 7, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D08__GPMI_D08 MXS_IOMUX_PAD_NAKED(0, 8, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D09__GPMI_D09 MXS_IOMUX_PAD_NAKED(0, 9, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D10__GPMI_D10 MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D11__GPMI_D11 MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D12__GPMI_D12 MXS_IOMUX_PAD_NAKED(0, 12, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D13__GPMI_D13 MXS_IOMUX_PAD_NAKED(0, 13, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D14__GPMI_D14 MXS_IOMUX_PAD_NAKED(0, 14, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_D15__GPMI_D15 MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_CLE__GPMI_CLE MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_ALE__GPMI_ALE MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_CE2N__GPMI_CE2N MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_RDY0__GPMI_RDY0 MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_RDY1__GPMI_RDY1 MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_RDY2__GPMI_RDY2 MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_RDY3__GPMI_RDY3 MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_WPN__GPMI_WPN MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_WRN__GPMI_WRN MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_RDN__GPMI_RDN MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_0) |
||||
#define MX23_PAD_AUART1_CTS__AUART1_CTS MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_0) |
||||
#define MX23_PAD_AUART1_RTS__AUART1_RTS MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_0) |
||||
#define MX23_PAD_AUART1_RX__AUART1_RX MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_0) |
||||
#define MX23_PAD_AUART1_TX__AUART1_TX MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_0) |
||||
#define MX23_PAD_I2C_SCL__I2C_SCL MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_0) |
||||
#define MX23_PAD_I2C_SDA__I2C_SDA MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_0) |
||||
|
||||
#define MX23_PAD_LCD_D00__LCD_D00 MXS_IOMUX_PAD_NAKED(1, 0, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D01__LCD_D01 MXS_IOMUX_PAD_NAKED(1, 1, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D02__LCD_D02 MXS_IOMUX_PAD_NAKED(1, 2, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D03__LCD_D03 MXS_IOMUX_PAD_NAKED(1, 3, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D04__LCD_D04 MXS_IOMUX_PAD_NAKED(1, 4, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D05__LCD_D05 MXS_IOMUX_PAD_NAKED(1, 5, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D06__LCD_D06 MXS_IOMUX_PAD_NAKED(1, 6, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D07__LCD_D07 MXS_IOMUX_PAD_NAKED(1, 7, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D08__LCD_D08 MXS_IOMUX_PAD_NAKED(1, 8, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D09__LCD_D09 MXS_IOMUX_PAD_NAKED(1, 9, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D10__LCD_D10 MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D11__LCD_D11 MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D12__LCD_D12 MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D13__LCD_D13 MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D14__LCD_D14 MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D15__LCD_D15 MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D16__LCD_D16 MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_D17__LCD_D17 MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_RESET__LCD_RESET MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_RS__LCD_RS MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_WR__LCD_WR MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_CS__LCD_CS MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_DOTCK__LCD_DOTCK MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_ENABLE__LCD_ENABLE MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_HSYNC__LCD_HSYNC MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_0) |
||||
#define MX23_PAD_LCD_VSYNC__LCD_VSYNC MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_0) |
||||
#define MX23_PAD_PWM0__PWM0 MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_0) |
||||
#define MX23_PAD_PWM1__PWM1 MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_0) |
||||
#define MX23_PAD_PWM2__PWM2 MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_0) |
||||
#define MX23_PAD_PWM3__PWM3 MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_0) |
||||
#define MX23_PAD_PWM4__PWM4 MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_0) |
||||
|
||||
#define MX23_PAD_SSP1_CMD__SSP1_CMD MXS_IOMUX_PAD_NAKED(2, 0, PAD_MUXSEL_0) |
||||
#define MX23_PAD_SSP1_DETECT__SSP1_DETECT MXS_IOMUX_PAD_NAKED(2, 1, PAD_MUXSEL_0) |
||||
#define MX23_PAD_SSP1_DATA0__SSP1_DATA0 MXS_IOMUX_PAD_NAKED(2, 2, PAD_MUXSEL_0) |
||||
#define MX23_PAD_SSP1_DATA1__SSP1_DATA1 MXS_IOMUX_PAD_NAKED(2, 3, PAD_MUXSEL_0) |
||||
#define MX23_PAD_SSP1_DATA2__SSP1_DATA2 MXS_IOMUX_PAD_NAKED(2, 4, PAD_MUXSEL_0) |
||||
#define MX23_PAD_SSP1_DATA3__SSP1_DATA3 MXS_IOMUX_PAD_NAKED(2, 5, PAD_MUXSEL_0) |
||||
#define MX23_PAD_SSP1_SCK__SSP1_SCK MXS_IOMUX_PAD_NAKED(2, 6, PAD_MUXSEL_0) |
||||
#define MX23_PAD_ROTARYA__ROTARYA MXS_IOMUX_PAD_NAKED(2, 7, PAD_MUXSEL_0) |
||||
#define MX23_PAD_ROTARYB__ROTARYB MXS_IOMUX_PAD_NAKED(2, 8, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A00__EMI_A00 MXS_IOMUX_PAD_NAKED(2, 9, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A01__EMI_A01 MXS_IOMUX_PAD_NAKED(2, 10, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A02__EMI_A02 MXS_IOMUX_PAD_NAKED(2, 11, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A03__EMI_A03 MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A04__EMI_A04 MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A05__EMI_A05 MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A06__EMI_A06 MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A07__EMI_A07 MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A08__EMI_A08 MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A09__EMI_A09 MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A10__EMI_A10 MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A11__EMI_A11 MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_A12__EMI_A12 MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_BA0__EMI_BA0 MXS_IOMUX_PAD_NAKED(2, 22, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_BA1__EMI_BA1 MXS_IOMUX_PAD_NAKED(2, 23, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_CASN__EMI_CASN MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_CE0N__EMI_CE0N MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_CE1N__EMI_CE1N MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_CE1N__GPMI_CE1N MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_0) |
||||
#define MX23_PAD_GPMI_CE0N__GPMI_CE0N MXS_IOMUX_PAD_NAKED(2, 28, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_CKE__EMI_CKE MXS_IOMUX_PAD_NAKED(2, 29, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_RASN__EMI_RASN MXS_IOMUX_PAD_NAKED(2, 30, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_WEN__EMI_WEN MXS_IOMUX_PAD_NAKED(2, 31, PAD_MUXSEL_0) |
||||
|
||||
#define MX23_PAD_EMI_D00__EMI_D00 MXS_IOMUX_PAD_NAKED(3, 0, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D01__EMI_D01 MXS_IOMUX_PAD_NAKED(3, 1, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D02__EMI_D02 MXS_IOMUX_PAD_NAKED(3, 2, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D03__EMI_D03 MXS_IOMUX_PAD_NAKED(3, 3, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D04__EMI_D04 MXS_IOMUX_PAD_NAKED(3, 4, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D05__EMI_D05 MXS_IOMUX_PAD_NAKED(3, 5, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D06__EMI_D06 MXS_IOMUX_PAD_NAKED(3, 6, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D07__EMI_D07 MXS_IOMUX_PAD_NAKED(3, 7, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D08__EMI_D08 MXS_IOMUX_PAD_NAKED(3, 8, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D09__EMI_D09 MXS_IOMUX_PAD_NAKED(3, 9, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D10__EMI_D10 MXS_IOMUX_PAD_NAKED(3, 10, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D11__EMI_D11 MXS_IOMUX_PAD_NAKED(3, 11, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D12__EMI_D12 MXS_IOMUX_PAD_NAKED(3, 12, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D13__EMI_D13 MXS_IOMUX_PAD_NAKED(3, 13, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D14__EMI_D14 MXS_IOMUX_PAD_NAKED(3, 14, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_D15__EMI_D15 MXS_IOMUX_PAD_NAKED(3, 15, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_DQM0__EMI_DQM0 MXS_IOMUX_PAD_NAKED(3, 16, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_DQM1__EMI_DQM1 MXS_IOMUX_PAD_NAKED(3, 17, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_DQS0__EMI_DQS0 MXS_IOMUX_PAD_NAKED(3, 18, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_DQS1__EMI_DQS1 MXS_IOMUX_PAD_NAKED(3, 19, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_CLK__EMI_CLK MXS_IOMUX_PAD_NAKED(3, 20, PAD_MUXSEL_0) |
||||
#define MX23_PAD_EMI_CLKN__EMI_CLKN MXS_IOMUX_PAD_NAKED(3, 21, PAD_MUXSEL_0) |
||||
|
||||
/* MUXSEL_1 */ |
||||
#define MX23_PAD_GPMI_D00__LCD_D8 MXS_IOMUX_PAD_NAKED(0, 0, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D01__LCD_D9 MXS_IOMUX_PAD_NAKED(0, 1, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D02__LCD_D10 MXS_IOMUX_PAD_NAKED(0, 2, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D03__LCD_D11 MXS_IOMUX_PAD_NAKED(0, 3, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D04__LCD_D12 MXS_IOMUX_PAD_NAKED(0, 4, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D05__LCD_D13 MXS_IOMUX_PAD_NAKED(0, 5, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D06__LCD_D14 MXS_IOMUX_PAD_NAKED(0, 6, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D07__LCD_D15 MXS_IOMUX_PAD_NAKED(0, 7, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D08__LCD_D18 MXS_IOMUX_PAD_NAKED(0, 8, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D09__LCD_D19 MXS_IOMUX_PAD_NAKED(0, 9, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D10__LCD_D20 MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D11__LCD_D21 MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D12__LCD_D22 MXS_IOMUX_PAD_NAKED(0, 12, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D13__LCD_D23 MXS_IOMUX_PAD_NAKED(0, 13, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D14__AUART2_RX MXS_IOMUX_PAD_NAKED(0, 14, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_D15__AUART2_TX MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_CLE__LCD_D16 MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_ALE__LCD_D17 MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_1) |
||||
#define MX23_PAD_GPMI_CE2N__ATA_A2 MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_1) |
||||
#define MX23_PAD_AUART1_RTS__IR_CLK MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_1) |
||||
#define MX23_PAD_AUART1_RX__IR_RX MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_1) |
||||
#define MX23_PAD_AUART1_TX__IR_TX MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_1) |
||||
#define MX23_PAD_I2C_SCL__GPMI_RDY2 MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_1) |
||||
#define MX23_PAD_I2C_SDA__GPMI_CE2N MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_1) |
||||
|
||||
#define MX23_PAD_LCD_D00__ETM_DA8 MXS_IOMUX_PAD_NAKED(1, 0, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D01__ETM_DA9 MXS_IOMUX_PAD_NAKED(1, 1, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D02__ETM_DA10 MXS_IOMUX_PAD_NAKED(1, 2, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D03__ETM_DA11 MXS_IOMUX_PAD_NAKED(1, 3, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D04__ETM_DA12 MXS_IOMUX_PAD_NAKED(1, 4, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D05__ETM_DA13 MXS_IOMUX_PAD_NAKED(1, 5, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D06__ETM_DA14 MXS_IOMUX_PAD_NAKED(1, 6, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D07__ETM_DA15 MXS_IOMUX_PAD_NAKED(1, 7, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D08__ETM_DA0 MXS_IOMUX_PAD_NAKED(1, 8, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D09__ETM_DA1 MXS_IOMUX_PAD_NAKED(1, 9, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D10__ETM_DA2 MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D11__ETM_DA3 MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D12__ETM_DA4 MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D13__ETM_DA5 MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D14__ETM_DA6 MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_D15__ETM_DA7 MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_RESET__ETM_TCTL MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_RS__ETM_TCLK MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_DOTCK__GPMI_RDY3 MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_ENABLE__I2C_SCL MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_HSYNC__I2C_SDA MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_1) |
||||
#define MX23_PAD_LCD_VSYNC__LCD_BUSY MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_1) |
||||
#define MX23_PAD_PWM0__ROTARYA MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_1) |
||||
#define MX23_PAD_PWM1__ROTARYB MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_1) |
||||
#define MX23_PAD_PWM2__GPMI_RDY3 MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_1) |
||||
#define MX23_PAD_PWM3__ETM_TCTL MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_1) |
||||
#define MX23_PAD_PWM4__ETM_TCLK MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_1) |
||||
|
||||
#define MX23_PAD_SSP1_DETECT__GPMI_CE3N MXS_IOMUX_PAD_NAKED(2, 1, PAD_MUXSEL_1) |
||||
#define MX23_PAD_SSP1_DATA1__I2C_SCL MXS_IOMUX_PAD_NAKED(2, 3, PAD_MUXSEL_1) |
||||
#define MX23_PAD_SSP1_DATA2__I2C_SDA MXS_IOMUX_PAD_NAKED(2, 4, PAD_MUXSEL_1) |
||||
#define MX23_PAD_ROTARYA__AUART2_RTS MXS_IOMUX_PAD_NAKED(2, 7, PAD_MUXSEL_1) |
||||
#define MX23_PAD_ROTARYB__AUART2_CTS MXS_IOMUX_PAD_NAKED(2, 8, PAD_MUXSEL_1) |
||||
|
||||
/* MUXSEL_2 */ |
||||
#define MX23_PAD_GPMI_D00__SSP2_DATA0 MXS_IOMUX_PAD_NAKED(0, 0, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D01__SSP2_DATA1 MXS_IOMUX_PAD_NAKED(0, 1, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D02__SSP2_DATA2 MXS_IOMUX_PAD_NAKED(0, 2, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D03__SSP2_DATA3 MXS_IOMUX_PAD_NAKED(0, 3, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D04__SSP2_DATA4 MXS_IOMUX_PAD_NAKED(0, 4, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D05__SSP2_DATA5 MXS_IOMUX_PAD_NAKED(0, 5, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D06__SSP2_DATA6 MXS_IOMUX_PAD_NAKED(0, 6, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D07__SSP2_DATA7 MXS_IOMUX_PAD_NAKED(0, 7, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D08__SSP1_DATA4 MXS_IOMUX_PAD_NAKED(0, 8, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D09__SSP1_DATA5 MXS_IOMUX_PAD_NAKED(0, 9, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D10__SSP1_DATA6 MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D11__SSP1_DATA7 MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_D15__GPMI_CE3N MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_RDY0__SSP2_DETECT MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_RDY1__SSP2_CMD MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_2) |
||||
#define MX23_PAD_GPMI_WRN__SSP2_SCK MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_2) |
||||
#define MX23_PAD_AUART1_CTS__SSP1_DATA4 MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_2) |
||||
#define MX23_PAD_AUART1_RTS__SSP1_DATA5 MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_2) |
||||
#define MX23_PAD_AUART1_RX__SSP1_DATA6 MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_2) |
||||
#define MX23_PAD_AUART1_TX__SSP1_DATA7 MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_2) |
||||
#define MX23_PAD_I2C_SCL__AUART1_TX MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_2) |
||||
#define MX23_PAD_I2C_SDA__AUART1_RX MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_2) |
||||
|
||||
#define MX23_PAD_LCD_D08__SAIF2_SDATA0 MXS_IOMUX_PAD_NAKED(1, 8, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D09__SAIF1_SDATA0 MXS_IOMUX_PAD_NAKED(1, 9, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D10__SAIF_MCLK_BITCLK MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D11__SAIF_LRCLK MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D12__SAIF2_SDATA1 MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D13__SAIF2_SDATA2 MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D14__SAIF1_SDATA2 MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D15__SAIF1_SDATA1 MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_D16__SAIF_ALT_BITCLK MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_2) |
||||
#define MX23_PAD_LCD_RESET__GPMI_CE3N MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_2) |
||||
#define MX23_PAD_PWM0__DUART_RX MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_2) |
||||
#define MX23_PAD_PWM1__DUART_TX MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_2) |
||||
#define MX23_PAD_PWM3__AUART1_CTS MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_2) |
||||
#define MX23_PAD_PWM4__AUART1_RTS MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_2) |
||||
|
||||
#define MX23_PAD_SSP1_CMD__JTAG_TDO MXS_IOMUX_PAD_NAKED(2, 0, PAD_MUXSEL_2) |
||||
#define MX23_PAD_SSP1_DETECT__USB_OTG_ID MXS_IOMUX_PAD_NAKED(2, 1, PAD_MUXSEL_2) |
||||
#define MX23_PAD_SSP1_DATA0__JTAG_TDI MXS_IOMUX_PAD_NAKED(2, 2, PAD_MUXSEL_2) |
||||
#define MX23_PAD_SSP1_DATA1__JTAG_TCLK MXS_IOMUX_PAD_NAKED(2, 3, PAD_MUXSEL_2) |
||||
#define MX23_PAD_SSP1_DATA2__JTAG_RTCK MXS_IOMUX_PAD_NAKED(2, 4, PAD_MUXSEL_2) |
||||
#define MX23_PAD_SSP1_DATA3__JTAG_TMS MXS_IOMUX_PAD_NAKED(2, 5, PAD_MUXSEL_2) |
||||
#define MX23_PAD_SSP1_SCK__JTAG_TRST MXS_IOMUX_PAD_NAKED(2, 6, PAD_MUXSEL_2) |
||||
#define MX23_PAD_ROTARYA__SPDIF MXS_IOMUX_PAD_NAKED(2, 7, PAD_MUXSEL_2) |
||||
#define MX23_PAD_ROTARYB__GPMI_CE3N MXS_IOMUX_PAD_NAKED(2, 8, PAD_MUXSEL_2) |
||||
|
||||
/* MUXSEL_GPIO */ |
||||
#define MX23_PAD_GPMI_D00__GPIO_0_0 MXS_IOMUX_PAD_NAKED(0, 0, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D01__GPIO_0_1 MXS_IOMUX_PAD_NAKED(0, 1, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D02__GPIO_0_2 MXS_IOMUX_PAD_NAKED(0, 2, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D03__GPIO_0_3 MXS_IOMUX_PAD_NAKED(0, 3, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D04__GPIO_0_4 MXS_IOMUX_PAD_NAKED(0, 4, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D05__GPIO_0_5 MXS_IOMUX_PAD_NAKED(0, 5, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D06__GPIO_0_6 MXS_IOMUX_PAD_NAKED(0, 6, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D07__GPIO_0_7 MXS_IOMUX_PAD_NAKED(0, 7, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D08__GPIO_0_8 MXS_IOMUX_PAD_NAKED(0, 8, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D09__GPIO_0_9 MXS_IOMUX_PAD_NAKED(0, 9, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D10__GPIO_0_10 MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D11__GPIO_0_11 MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D12__GPIO_0_12 MXS_IOMUX_PAD_NAKED(0, 12, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D13__GPIO_0_13 MXS_IOMUX_PAD_NAKED(0, 13, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D14__GPIO_0_14 MXS_IOMUX_PAD_NAKED(0, 14, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_D15__GPIO_0_15 MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_CLE__GPIO_0_16 MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_ALE__GPIO_0_17 MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_CE2N__GPIO_0_18 MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_RDY0__GPIO_0_19 MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_RDY1__GPIO_0_20 MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_RDY2__GPIO_0_21 MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_RDY3__GPIO_0_22 MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_WPN__GPIO_0_23 MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_WRN__GPIO_0_24 MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_RDN__GPIO_0_25 MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_AUART1_CTS__GPIO_0_26 MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_AUART1_RTS__GPIO_0_27 MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_AUART1_RX__GPIO_0_28 MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_AUART1_TX__GPIO_0_29 MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_I2C_SCL__GPIO_0_30 MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_I2C_SDA__GPIO_0_31 MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_GPIO) |
||||
|
||||
#define MX23_PAD_LCD_D00__GPIO_1_0 MXS_IOMUX_PAD_NAKED(1, 0, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D01__GPIO_1_1 MXS_IOMUX_PAD_NAKED(1, 1, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D02__GPIO_1_2 MXS_IOMUX_PAD_NAKED(1, 2, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D03__GPIO_1_3 MXS_IOMUX_PAD_NAKED(1, 3, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D04__GPIO_1_4 MXS_IOMUX_PAD_NAKED(1, 4, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D05__GPIO_1_5 MXS_IOMUX_PAD_NAKED(1, 5, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D06__GPIO_1_6 MXS_IOMUX_PAD_NAKED(1, 6, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D07__GPIO_1_7 MXS_IOMUX_PAD_NAKED(1, 7, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D08__GPIO_1_8 MXS_IOMUX_PAD_NAKED(1, 8, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D09__GPIO_1_9 MXS_IOMUX_PAD_NAKED(1, 9, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D10__GPIO_1_10 MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D11__GPIO_1_11 MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D12__GPIO_1_12 MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D13__GPIO_1_13 MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D14__GPIO_1_14 MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D15__GPIO_1_15 MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D16__GPIO_1_16 MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_D17__GPIO_1_17 MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_RESET__GPIO_1_18 MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_RS__GPIO_1_19 MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_WR__GPIO_1_20 MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_CS__GPIO_1_21 MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_DOTCK__GPIO_1_22 MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_ENABLE__GPIO_1_23 MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_HSYNC__GPIO_1_24 MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_LCD_VSYNC__GPIO_1_25 MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_PWM0__GPIO_1_26 MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_PWM1__GPIO_1_27 MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_PWM2__GPIO_1_28 MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_PWM3__GPIO_1_29 MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_PWM4__GPIO_1_30 MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_GPIO) |
||||
|
||||
#define MX23_PAD_SSP1_CMD__GPIO_2_0 MXS_IOMUX_PAD_NAKED(2, 0, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_SSP1_DETECT__GPIO_2_1 MXS_IOMUX_PAD_NAKED(2, 1, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_SSP1_DATA0__GPIO_2_2 MXS_IOMUX_PAD_NAKED(2, 2, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_SSP1_DATA1__GPIO_2_3 MXS_IOMUX_PAD_NAKED(2, 3, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_SSP1_DATA2__GPIO_2_4 MXS_IOMUX_PAD_NAKED(2, 4, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_SSP1_DATA3__GPIO_2_5 MXS_IOMUX_PAD_NAKED(2, 5, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_SSP1_SCK__GPIO_2_6 MXS_IOMUX_PAD_NAKED(2, 6, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_ROTARYA__GPIO_2_7 MXS_IOMUX_PAD_NAKED(2, 7, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_ROTARYB__GPIO_2_8 MXS_IOMUX_PAD_NAKED(2, 8, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A00__GPIO_2_9 MXS_IOMUX_PAD_NAKED(2, 9, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A01__GPIO_2_10 MXS_IOMUX_PAD_NAKED(2, 10, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A02__GPIO_2_11 MXS_IOMUX_PAD_NAKED(2, 11, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A03__GPIO_2_12 MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A04__GPIO_2_13 MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A05__GPIO_2_14 MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A06__GPIO_2_15 MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A07__GPIO_2_16 MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A08__GPIO_2_17 MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A09__GPIO_2_18 MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A10__GPIO_2_19 MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A11__GPIO_2_20 MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_A12__GPIO_2_21 MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_BA0__GPIO_2_22 MXS_IOMUX_PAD_NAKED(2, 22, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_BA1__GPIO_2_23 MXS_IOMUX_PAD_NAKED(2, 23, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_CASN__GPIO_2_24 MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_CE0N__GPIO_2_25 MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_CE1N__GPIO_2_26 MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_CE1N__GPIO_2_27 MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_GPMI_CE0N__GPIO_2_28 MXS_IOMUX_PAD_NAKED(2, 28, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_CKE__GPIO_2_29 MXS_IOMUX_PAD_NAKED(2, 29, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_RASN__GPIO_2_30 MXS_IOMUX_PAD_NAKED(2, 30, PAD_MUXSEL_GPIO) |
||||
#define MX23_PAD_EMI_WEN__GPIO_2_31 MXS_IOMUX_PAD_NAKED(2, 31, PAD_MUXSEL_GPIO) |
||||
|
||||
#endif /* __MACH_IOMUX_MX23_H__ */ |
@ -0,0 +1,221 @@ |
||||
/*
|
||||
* Freescale i.MX23 CLKCTRL Register Definitions |
||||
* |
||||
* Copyright (C) 2012 Marek Vasut <marek.vasut@gmail.com> |
||||
* on behalf of DENX Software Engineering GmbH |
||||
* |
||||
* Based on code from LTIB: |
||||
* Copyright 2008-2010 Freescale Semiconductor, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
* |
||||
*/ |
||||
|
||||
#ifndef __MX23_REGS_CLKCTRL_H__ |
||||
#define __MX23_REGS_CLKCTRL_H__ |
||||
|
||||
#include <asm/arch/regs-common.h> |
||||
|
||||
#ifndef __ASSEMBLY__ |
||||
struct mxs_clkctrl_regs { |
||||
mxs_reg_32(hw_clkctrl_pll0ctrl0) /* 0x00 */ |
||||
uint32_t hw_clkctrl_pll0ctrl1; /* 0x10 */ |
||||
uint32_t reserved_pll0ctrl1[3]; /* 0x14-0x1c */ |
||||
mxs_reg_32(hw_clkctrl_cpu) /* 0x20 */ |
||||
mxs_reg_32(hw_clkctrl_hbus) /* 0x30 */ |
||||
mxs_reg_32(hw_clkctrl_xbus) /* 0x40 */ |
||||
mxs_reg_32(hw_clkctrl_xtal) /* 0x50 */ |
||||
mxs_reg_32(hw_clkctrl_pix) /* 0x60 */ |
||||
mxs_reg_32(hw_clkctrl_ssp0) /* 0x70 */ |
||||
mxs_reg_32(hw_clkctrl_gpmi) /* 0x80 */ |
||||
mxs_reg_32(hw_clkctrl_spdif) /* 0x90 */ |
||||
mxs_reg_32(hw_clkctrl_emi) /* 0xa0 */ |
||||
|
||||
uint32_t reserved1[4]; |
||||
|
||||
mxs_reg_32(hw_clkctrl_saif0) /* 0xc0 */ |
||||
mxs_reg_32(hw_clkctrl_tv) /* 0xd0 */ |
||||
mxs_reg_32(hw_clkctrl_etm) /* 0xe0 */ |
||||
mxs_reg_8(hw_clkctrl_frac0) /* 0xf0 */ |
||||
mxs_reg_8(hw_clkctrl_frac1) /* 0x100 */ |
||||
mxs_reg_32(hw_clkctrl_clkseq) /* 0x110 */ |
||||
mxs_reg_32(hw_clkctrl_reset) /* 0x120 */ |
||||
mxs_reg_32(hw_clkctrl_status) /* 0x130 */ |
||||
mxs_reg_32(hw_clkctrl_version) /* 0x140 */ |
||||
}; |
||||
#endif |
||||
|
||||
#define CLKCTRL_PLL0CTRL0_LFR_SEL_MASK (0x3 << 28) |
||||
#define CLKCTRL_PLL0CTRL0_LFR_SEL_OFFSET 28 |
||||
#define CLKCTRL_PLL0CTRL0_LFR_SEL_DEFAULT (0x0 << 28) |
||||
#define CLKCTRL_PLL0CTRL0_LFR_SEL_TIMES_2 (0x1 << 28) |
||||
#define CLKCTRL_PLL0CTRL0_LFR_SEL_TIMES_05 (0x2 << 28) |
||||
#define CLKCTRL_PLL0CTRL0_LFR_SEL_UNDEFINED (0x3 << 28) |
||||
#define CLKCTRL_PLL0CTRL0_CP_SEL_MASK (0x3 << 24) |
||||
#define CLKCTRL_PLL0CTRL0_CP_SEL_OFFSET 24 |
||||
#define CLKCTRL_PLL0CTRL0_CP_SEL_DEFAULT (0x0 << 24) |
||||
#define CLKCTRL_PLL0CTRL0_CP_SEL_TIMES_2 (0x1 << 24) |
||||
#define CLKCTRL_PLL0CTRL0_CP_SEL_TIMES_05 (0x2 << 24) |
||||
#define CLKCTRL_PLL0CTRL0_CP_SEL_UNDEFINED (0x3 << 24) |
||||
#define CLKCTRL_PLL0CTRL0_DIV_SEL_MASK (0x3 << 20) |
||||
#define CLKCTRL_PLL0CTRL0_DIV_SEL_OFFSET 20 |
||||
#define CLKCTRL_PLL0CTRL0_DIV_SEL_DEFAULT (0x0 << 20) |
||||
#define CLKCTRL_PLL0CTRL0_DIV_SEL_LOWER (0x1 << 20) |
||||
#define CLKCTRL_PLL0CTRL0_DIV_SEL_LOWEST (0x2 << 20) |
||||
#define CLKCTRL_PLL0CTRL0_DIV_SEL_UNDEFINED (0x3 << 20) |
||||
#define CLKCTRL_PLL0CTRL0_EN_USB_CLKS (1 << 18) |
||||
#define CLKCTRL_PLL0CTRL0_POWER (1 << 16) |
||||
|
||||
#define CLKCTRL_PLL0CTRL1_LOCK (1 << 31) |
||||
#define CLKCTRL_PLL0CTRL1_FORCE_LOCK (1 << 30) |
||||
#define CLKCTRL_PLL0CTRL1_LOCK_COUNT_MASK 0xffff |
||||
#define CLKCTRL_PLL0CTRL1_LOCK_COUNT_OFFSET 0 |
||||
|
||||
#define CLKCTRL_CPU_BUSY_REF_XTAL (1 << 29) |
||||
#define CLKCTRL_CPU_BUSY_REF_CPU (1 << 28) |
||||
#define CLKCTRL_CPU_DIV_XTAL_FRAC_EN (1 << 26) |
||||
#define CLKCTRL_CPU_DIV_XTAL_MASK (0x3ff << 16) |
||||
#define CLKCTRL_CPU_DIV_XTAL_OFFSET 16 |
||||
#define CLKCTRL_CPU_INTERRUPT_WAIT (1 << 12) |
||||
#define CLKCTRL_CPU_DIV_CPU_FRAC_EN (1 << 10) |
||||
#define CLKCTRL_CPU_DIV_CPU_MASK 0x3f |
||||
#define CLKCTRL_CPU_DIV_CPU_OFFSET 0 |
||||
|
||||
#define CLKCTRL_HBUS_BUSY (1 << 29) |
||||
#define CLKCTRL_HBUS_DCP_AS_ENABLE (1 << 28) |
||||
#define CLKCTRL_HBUS_PXP_AS_ENABLE (1 << 27) |
||||
#define CLKCTRL_HBUS_APBHDMA_AS_ENABLE (1 << 26) |
||||
#define CLKCTRL_HBUS_APBXDMA_AS_ENABLE (1 << 25) |
||||
#define CLKCTRL_HBUS_TRAFFIC_JAM_AS_ENABLE (1 << 24) |
||||
#define CLKCTRL_HBUS_TRAFFIC_AS_ENABLE (1 << 23) |
||||
#define CLKCTRL_HBUS_CPU_DATA_AS_ENABLE (1 << 22) |
||||
#define CLKCTRL_HBUS_CPU_INSTR_AS_ENABLE (1 << 21) |
||||
#define CLKCTRL_HBUS_AUTO_SLOW_MODE (1 << 20) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_MASK (0x7 << 16) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_OFFSET 16 |
||||
#define CLKCTRL_HBUS_SLOW_DIV_BY1 (0x0 << 16) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_BY2 (0x1 << 16) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_BY4 (0x2 << 16) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_BY8 (0x3 << 16) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_BY16 (0x4 << 16) |
||||
#define CLKCTRL_HBUS_SLOW_DIV_BY32 (0x5 << 16) |
||||
#define CLKCTRL_HBUS_DIV_FRAC_EN (1 << 5) |
||||
#define CLKCTRL_HBUS_DIV_MASK 0x1f |
||||
#define CLKCTRL_HBUS_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_XBUS_BUSY (1 << 31) |
||||
#define CLKCTRL_XBUS_DIV_FRAC_EN (1 << 10) |
||||
#define CLKCTRL_XBUS_DIV_MASK 0x3ff |
||||
#define CLKCTRL_XBUS_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_XTAL_UART_CLK_GATE (1 << 31) |
||||
#define CLKCTRL_XTAL_FILT_CLK24M_GATE (1 << 30) |
||||
#define CLKCTRL_XTAL_PWM_CLK24M_GATE (1 << 29) |
||||
#define CLKCTRL_XTAL_DRI_CLK24M_GATE (1 << 28) |
||||
#define CLKCTRL_XTAL_DIGCTRL_CLK1M_GATE (1 << 27) |
||||
#define CLKCTRL_XTAL_TIMROT_CLK32K_GATE (1 << 26) |
||||
#define CLKCTRL_XTAL_DIV_UART_MASK 0x3 |
||||
#define CLKCTRL_XTAL_DIV_UART_OFFSET 0 |
||||
|
||||
#define CLKCTRL_PIX_CLKGATE (1 << 31) |
||||
#define CLKCTRL_PIX_BUSY (1 << 29) |
||||
#define CLKCTRL_PIX_DIV_FRAC_EN (1 << 12) |
||||
#define CLKCTRL_PIX_DIV_MASK 0xfff |
||||
#define CLKCTRL_PIX_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_SSP_CLKGATE (1 << 31) |
||||
#define CLKCTRL_SSP_BUSY (1 << 29) |
||||
#define CLKCTRL_SSP_DIV_FRAC_EN (1 << 9) |
||||
#define CLKCTRL_SSP_DIV_MASK 0x1ff |
||||
#define CLKCTRL_SSP_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_GPMI_CLKGATE (1 << 31) |
||||
#define CLKCTRL_GPMI_BUSY (1 << 29) |
||||
#define CLKCTRL_GPMI_DIV_FRAC_EN (1 << 10) |
||||
#define CLKCTRL_GPMI_DIV_MASK 0x3ff |
||||
#define CLKCTRL_GPMI_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_SPDIF_CLKGATE (1 << 31) |
||||
|
||||
#define CLKCTRL_EMI_CLKGATE (1 << 31) |
||||
#define CLKCTRL_EMI_SYNC_MODE_EN (1 << 30) |
||||
#define CLKCTRL_EMI_BUSY_REF_XTAL (1 << 29) |
||||
#define CLKCTRL_EMI_BUSY_REF_EMI (1 << 28) |
||||
#define CLKCTRL_EMI_BUSY_REF_CPU (1 << 27) |
||||
#define CLKCTRL_EMI_BUSY_SYNC_MODE (1 << 26) |
||||
#define CLKCTRL_EMI_BUSY_DCC_RESYNC (1 << 17) |
||||
#define CLKCTRL_EMI_DCC_RESYNC_ENABLE (1 << 16) |
||||
#define CLKCTRL_EMI_DIV_XTAL_MASK (0xf << 8) |
||||
#define CLKCTRL_EMI_DIV_XTAL_OFFSET 8 |
||||
#define CLKCTRL_EMI_DIV_EMI_MASK 0x3f |
||||
#define CLKCTRL_EMI_DIV_EMI_OFFSET 0 |
||||
|
||||
#define CLKCTRL_IR_CLKGATE (1 << 31) |
||||
#define CLKCTRL_IR_AUTO_DIV (1 << 29) |
||||
#define CLKCTRL_IR_IR_BUSY (1 << 28) |
||||
#define CLKCTRL_IR_IROV_BUSY (1 << 27) |
||||
#define CLKCTRL_IR_IROV_DIV_MASK (0x1ff << 16) |
||||
#define CLKCTRL_IR_IROV_DIV_OFFSET 16 |
||||
#define CLKCTRL_IR_IR_DIV_MASK 0x3ff |
||||
#define CLKCTRL_IR_IR_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_SAIF0_CLKGATE (1 << 31) |
||||
#define CLKCTRL_SAIF0_BUSY (1 << 29) |
||||
#define CLKCTRL_SAIF0_DIV_FRAC_EN (1 << 16) |
||||
#define CLKCTRL_SAIF0_DIV_MASK 0xffff |
||||
#define CLKCTRL_SAIF0_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_TV_CLK_TV108M_GATE (1 << 31) |
||||
#define CLKCTRL_TV_CLK_TV_GATE (1 << 30) |
||||
|
||||
#define CLKCTRL_ETM_CLKGATE (1 << 31) |
||||
#define CLKCTRL_ETM_BUSY (1 << 29) |
||||
#define CLKCTRL_ETM_DIV_FRAC_EN (1 << 6) |
||||
#define CLKCTRL_ETM_DIV_MASK 0x3f |
||||
#define CLKCTRL_ETM_DIV_OFFSET 0 |
||||
|
||||
#define CLKCTRL_FRAC_CLKGATE (1 << 7) |
||||
#define CLKCTRL_FRAC_STABLE (1 << 6) |
||||
#define CLKCTRL_FRAC_FRAC_MASK 0x3f |
||||
#define CLKCTRL_FRAC_FRAC_OFFSET 0 |
||||
#define CLKCTRL_FRAC0_CPU 0 |
||||
#define CLKCTRL_FRAC0_EMI 1 |
||||
#define CLKCTRL_FRAC0_PIX 2 |
||||
#define CLKCTRL_FRAC0_IO0 3 |
||||
#define CLKCTRL_FRAC1_VID 3 |
||||
|
||||
#define CLKCTRL_CLKSEQ_BYPASS_ETM (1 << 8) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_CPU (1 << 7) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_EMI (1 << 6) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_SSP0 (1 << 5) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_GPMI (1 << 4) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_IR (1 << 3) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_PIX (1 << 1) |
||||
#define CLKCTRL_CLKSEQ_BYPASS_SAIF (1 << 0) |
||||
|
||||
#define CLKCTRL_RESET_CHIP (1 << 1) |
||||
#define CLKCTRL_RESET_DIG (1 << 0) |
||||
|
||||
#define CLKCTRL_STATUS_CPU_LIMIT_MASK (0x3 << 30) |
||||
#define CLKCTRL_STATUS_CPU_LIMIT_OFFSET 30 |
||||
|
||||
#define CLKCTRL_VERSION_MAJOR_MASK (0xff << 24) |
||||
#define CLKCTRL_VERSION_MAJOR_OFFSET 24 |
||||
#define CLKCTRL_VERSION_MINOR_MASK (0xff << 16) |
||||
#define CLKCTRL_VERSION_MINOR_OFFSET 16 |
||||
#define CLKCTRL_VERSION_STEP_MASK 0xffff |
||||
#define CLKCTRL_VERSION_STEP_OFFSET 0 |
||||
|
||||
#endif /* __MX23_REGS_CLKCTRL_H__ */ |
@ -0,0 +1,358 @@ |
||||
/*
|
||||
* Freescale i.MX23 Power Controller Register Definitions |
||||
* |
||||
* Copyright (C) 2012 Marek Vasut <marex@denx.de> |
||||
* |
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
* |
||||
*/ |
||||
|
||||
#ifndef __MX23_REGS_POWER_H__ |
||||
#define __MX23_REGS_POWER_H__ |
||||
|
||||
#include <asm/arch/regs-common.h> |
||||
|
||||
#ifndef __ASSEMBLY__ |
||||
struct mxs_power_regs { |
||||
mxs_reg_32(hw_power_ctrl) |
||||
mxs_reg_32(hw_power_5vctrl) |
||||
mxs_reg_32(hw_power_minpwr) |
||||
mxs_reg_32(hw_power_charge) |
||||
uint32_t hw_power_vdddctrl; |
||||
uint32_t reserved_vddd[3]; |
||||
uint32_t hw_power_vddactrl; |
||||
uint32_t reserved_vdda[3]; |
||||
uint32_t hw_power_vddioctrl; |
||||
uint32_t reserved_vddio[3]; |
||||
uint32_t hw_power_vddmemctrl; |
||||
uint32_t reserved_vddmem[3]; |
||||
uint32_t hw_power_dcdc4p2; |
||||
uint32_t reserved_dcdc4p2[3]; |
||||
uint32_t hw_power_misc; |
||||
uint32_t reserved_misc[3]; |
||||
uint32_t hw_power_dclimits; |
||||
uint32_t reserved_dclimits[3]; |
||||
mxs_reg_32(hw_power_loopctrl) |
||||
uint32_t hw_power_sts; |
||||
uint32_t reserved_sts[3]; |
||||
mxs_reg_32(hw_power_speed) |
||||
uint32_t hw_power_battmonitor; |
||||
uint32_t reserved_battmonitor[3]; |
||||
|
||||
uint32_t reserved1[4]; |
||||
|
||||
mxs_reg_32(hw_power_reset) |
||||
|
||||
uint32_t reserved2[4]; |
||||
|
||||
mxs_reg_32(hw_power_special) |
||||
mxs_reg_32(hw_power_version) |
||||
}; |
||||
#endif |
||||
|
||||
#define POWER_CTRL_CLKGATE (1 << 30) |
||||
#define POWER_CTRL_PSWITCH_MID_TRAN (1 << 27) |
||||
#define POWER_CTRL_DCDC4P2_BO_IRQ (1 << 24) |
||||
#define POWER_CTRL_ENIRQ_DCDC4P2_BO (1 << 23) |
||||
#define POWER_CTRL_VDD5V_DROOP_IRQ (1 << 22) |
||||
#define POWER_CTRL_ENIRQ_VDD5V_DROOP (1 << 21) |
||||
#define POWER_CTRL_PSWITCH_IRQ (1 << 20) |
||||
#define POWER_CTRL_PSWITCH_IRQ_SRC (1 << 19) |
||||
#define POWER_CTRL_POLARITY_PSWITCH (1 << 18) |
||||
#define POWER_CTRL_ENIRQ_PSWITCH (1 << 17) |
||||
#define POWER_CTRL_POLARITY_DC_OK (1 << 16) |
||||
#define POWER_CTRL_DC_OK_IRQ (1 << 15) |
||||
#define POWER_CTRL_ENIRQ_DC_OK (1 << 14) |
||||
#define POWER_CTRL_BATT_BO_IRQ (1 << 13) |
||||
#define POWER_CTRL_ENIRQ_BATT_BO (1 << 12) |
||||
#define POWER_CTRL_VDDIO_BO_IRQ (1 << 11) |
||||
#define POWER_CTRL_ENIRQ_VDDIO_BO (1 << 10) |
||||
#define POWER_CTRL_VDDA_BO_IRQ (1 << 9) |
||||
#define POWER_CTRL_ENIRQ_VDDA_BO (1 << 8) |
||||
#define POWER_CTRL_VDDD_BO_IRQ (1 << 7) |
||||
#define POWER_CTRL_ENIRQ_VDDD_BO (1 << 6) |
||||
#define POWER_CTRL_POLARITY_VBUSVALID (1 << 5) |
||||
#define POWER_CTRL_VBUS_VALID_IRQ (1 << 4) |
||||
#define POWER_CTRL_ENIRQ_VBUS_VALID (1 << 3) |
||||
#define POWER_CTRL_POLARITY_VDD5V_GT_VDDIO (1 << 2) |
||||
#define POWER_CTRL_VDD5V_GT_VDDIO_IRQ (1 << 1) |
||||
#define POWER_CTRL_ENIRQ_VDD5V_GT_VDDIO (1 << 0) |
||||
|
||||
#define POWER_5VCTRL_VBUSDROOP_TRSH_MASK (0x3 << 28) |
||||
#define POWER_5VCTRL_VBUSDROOP_TRSH_OFFSET 28 |
||||
#define POWER_5VCTRL_VBUSDROOP_TRSH_4V3 (0x0 << 28) |
||||
#define POWER_5VCTRL_VBUSDROOP_TRSH_4V4 (0x1 << 28) |
||||
#define POWER_5VCTRL_VBUSDROOP_TRSH_4V5 (0x2 << 28) |
||||
#define POWER_5VCTRL_VBUSDROOP_TRSH_4V7 (0x3 << 28) |
||||
#define POWER_5VCTRL_HEADROOM_ADJ_MASK (0x7 << 24) |
||||
#define POWER_5VCTRL_HEADROOM_ADJ_OFFSET 24 |
||||
#define POWER_5VCTRL_PWD_CHARGE_4P2_MASK (0x1 << 20) |
||||
#define POWER_5VCTRL_PWD_CHARGE_4P2_OFFSET 20 |
||||
#define POWER_5VCTRL_CHARGE_4P2_ILIMIT_MASK (0x3f << 12) |
||||
#define POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET 12 |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_MASK (0x7 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_OFFSET 8 |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_2V9 (0x0 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V0 (0x1 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V1 (0x2 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V2 (0x3 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V3 (0x4 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V4 (0x5 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V5 (0x6 << 8) |
||||
#define POWER_5VCTRL_VBUSVALID_TRSH_4V6 (0x7 << 8) |
||||
#define POWER_5VCTRL_PWDN_5VBRNOUT (1 << 7) |
||||
#define POWER_5VCTRL_ENABLE_LINREG_ILIMIT (1 << 6) |
||||
#define POWER_5VCTRL_DCDC_XFER (1 << 5) |
||||
#define POWER_5VCTRL_VBUSVALID_5VDETECT (1 << 4) |
||||
#define POWER_5VCTRL_VBUSVALID_TO_B (1 << 3) |
||||
#define POWER_5VCTRL_ILIMIT_EQ_ZERO (1 << 2) |
||||
#define POWER_5VCTRL_PWRUP_VBUS_CMPS (1 << 1) |
||||
#define POWER_5VCTRL_ENABLE_DCDC (1 << 0) |
||||
|
||||
#define POWER_MINPWR_LOWPWR_4P2 (1 << 14) |
||||
#define POWER_MINPWR_VDAC_DUMP_CTRL (1 << 13) |
||||
#define POWER_MINPWR_PWD_BO (1 << 12) |
||||
#define POWER_MINPWR_USE_VDDXTAL_VBG (1 << 11) |
||||
#define POWER_MINPWR_PWD_ANA_CMPS (1 << 10) |
||||
#define POWER_MINPWR_ENABLE_OSC (1 << 9) |
||||
#define POWER_MINPWR_SELECT_OSC (1 << 8) |
||||
#define POWER_MINPWR_VBG_OFF (1 << 7) |
||||
#define POWER_MINPWR_DOUBLE_FETS (1 << 6) |
||||
#define POWER_MINPWR_HALFFETS (1 << 5) |
||||
#define POWER_MINPWR_LESSANA_I (1 << 4) |
||||
#define POWER_MINPWR_PWD_XTAL24 (1 << 3) |
||||
#define POWER_MINPWR_DC_STOPCLK (1 << 2) |
||||
#define POWER_MINPWR_EN_DC_PFM (1 << 1) |
||||
#define POWER_MINPWR_DC_HALFCLK (1 << 0) |
||||
|
||||
#define POWER_CHARGE_ADJ_VOLT_MASK (0x7 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_OFFSET 24 |
||||
#define POWER_CHARGE_ADJ_VOLT_M025P (0x1 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_P050P (0x2 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_M075P (0x3 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_P025P (0x4 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_M050P (0x5 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_P075P (0x6 << 24) |
||||
#define POWER_CHARGE_ADJ_VOLT_M100P (0x7 << 24) |
||||
#define POWER_CHARGE_ENABLE_LOAD (1 << 22) |
||||
#define POWER_CHARGE_ENABLE_CHARGER_RESISTORS (1 << 21) |
||||
#define POWER_CHARGE_ENABLE_FAULT_DETECT (1 << 20) |
||||
#define POWER_CHARGE_CHRG_STS_OFF (1 << 19) |
||||
#define POWER_CHARGE_USE_EXTERN_R (1 << 17) |
||||
#define POWER_CHARGE_PWD_BATTCHRG (1 << 16) |
||||
#define POWER_CHARGE_STOP_ILIMIT_MASK (0xf << 8) |
||||
#define POWER_CHARGE_STOP_ILIMIT_OFFSET 8 |
||||
#define POWER_CHARGE_STOP_ILIMIT_10MA (0x1 << 8) |
||||
#define POWER_CHARGE_STOP_ILIMIT_20MA (0x2 << 8) |
||||
#define POWER_CHARGE_STOP_ILIMIT_50MA (0x4 << 8) |
||||
#define POWER_CHARGE_STOP_ILIMIT_100MA (0x8 << 8) |
||||
#define POWER_CHARGE_BATTCHRG_I_MASK 0x3f |
||||
#define POWER_CHARGE_BATTCHRG_I_OFFSET 0 |
||||
#define POWER_CHARGE_BATTCHRG_I_10MA 0x01 |
||||
#define POWER_CHARGE_BATTCHRG_I_20MA 0x02 |
||||
#define POWER_CHARGE_BATTCHRG_I_50MA 0x04 |
||||
#define POWER_CHARGE_BATTCHRG_I_100MA 0x08 |
||||
#define POWER_CHARGE_BATTCHRG_I_200MA 0x10 |
||||
#define POWER_CHARGE_BATTCHRG_I_400MA 0x20 |
||||
|
||||
#define POWER_VDDDCTRL_ADJTN_MASK (0xf << 28) |
||||
#define POWER_VDDDCTRL_ADJTN_OFFSET 28 |
||||
#define POWER_VDDDCTRL_PWDN_BRNOUT (1 << 23) |
||||
#define POWER_VDDDCTRL_DISABLE_STEPPING (1 << 22) |
||||
#define POWER_VDDDCTRL_ENABLE_LINREG (1 << 21) |
||||
#define POWER_VDDDCTRL_DISABLE_FET (1 << 20) |
||||
#define POWER_VDDDCTRL_LINREG_OFFSET_MASK (0x3 << 16) |
||||
#define POWER_VDDDCTRL_LINREG_OFFSET_OFFSET 16 |
||||
#define POWER_VDDDCTRL_LINREG_OFFSET_0STEPS (0x0 << 16) |
||||
#define POWER_VDDDCTRL_LINREG_OFFSET_1STEPS_ABOVE (0x1 << 16) |
||||
#define POWER_VDDDCTRL_LINREG_OFFSET_1STEPS_BELOW (0x2 << 16) |
||||
#define POWER_VDDDCTRL_LINREG_OFFSET_2STEPS_BELOW (0x3 << 16) |
||||
#define POWER_VDDDCTRL_BO_OFFSET_MASK (0x7 << 8) |
||||
#define POWER_VDDDCTRL_BO_OFFSET_OFFSET 8 |
||||
#define POWER_VDDDCTRL_TRG_MASK 0x1f |
||||
#define POWER_VDDDCTRL_TRG_OFFSET 0 |
||||
|
||||
#define POWER_VDDACTRL_PWDN_BRNOUT (1 << 19) |
||||
#define POWER_VDDACTRL_DISABLE_STEPPING (1 << 18) |
||||
#define POWER_VDDACTRL_ENABLE_LINREG (1 << 17) |
||||
#define POWER_VDDACTRL_DISABLE_FET (1 << 16) |
||||
#define POWER_VDDACTRL_LINREG_OFFSET_MASK (0x3 << 12) |
||||
#define POWER_VDDACTRL_LINREG_OFFSET_OFFSET 12 |
||||
#define POWER_VDDACTRL_LINREG_OFFSET_0STEPS (0x0 << 12) |
||||
#define POWER_VDDACTRL_LINREG_OFFSET_1STEPS_ABOVE (0x1 << 12) |
||||
#define POWER_VDDACTRL_LINREG_OFFSET_1STEPS_BELOW (0x2 << 12) |
||||
#define POWER_VDDACTRL_LINREG_OFFSET_2STEPS_BELOW (0x3 << 12) |
||||
#define POWER_VDDACTRL_BO_OFFSET_MASK (0x7 << 8) |
||||
#define POWER_VDDACTRL_BO_OFFSET_OFFSET 8 |
||||
#define POWER_VDDACTRL_TRG_MASK 0x1f |
||||
#define POWER_VDDACTRL_TRG_OFFSET 0 |
||||
|
||||
#define POWER_VDDIOCTRL_ADJTN_MASK (0xf << 20) |
||||
#define POWER_VDDIOCTRL_ADJTN_OFFSET 20 |
||||
#define POWER_VDDIOCTRL_PWDN_BRNOUT (1 << 18) |
||||
#define POWER_VDDIOCTRL_DISABLE_STEPPING (1 << 17) |
||||
#define POWER_VDDIOCTRL_DISABLE_FET (1 << 16) |
||||
#define POWER_VDDIOCTRL_LINREG_OFFSET_MASK (0x3 << 12) |
||||
#define POWER_VDDIOCTRL_LINREG_OFFSET_OFFSET 12 |
||||
#define POWER_VDDIOCTRL_LINREG_OFFSET_0STEPS (0x0 << 12) |
||||
#define POWER_VDDIOCTRL_LINREG_OFFSET_1STEPS_ABOVE (0x1 << 12) |
||||
#define POWER_VDDIOCTRL_LINREG_OFFSET_1STEPS_BELOW (0x2 << 12) |
||||
#define POWER_VDDIOCTRL_LINREG_OFFSET_2STEPS_BELOW (0x3 << 12) |
||||
#define POWER_VDDIOCTRL_BO_OFFSET_MASK (0x7 << 8) |
||||
#define POWER_VDDIOCTRL_BO_OFFSET_OFFSET 8 |
||||
#define POWER_VDDIOCTRL_TRG_MASK 0x1f |
||||
#define POWER_VDDIOCTRL_TRG_OFFSET 0 |
||||
|
||||
#define POWER_VDDMEMCTRL_PULLDOWN_ACTIVE (1 << 10) |
||||
#define POWER_VDDMEMCTRL_ENABLE_ILIMIT (1 << 9) |
||||
#define POWER_VDDMEMCTRL_ENABLE_LINREG (1 << 8) |
||||
#define POWER_VDDMEMCTRL_TRG_MASK 0x1f |
||||
#define POWER_VDDMEMCTRL_TRG_OFFSET 0 |
||||
|
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_MASK (0xf << 28) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_OFFSET 28 |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_200MV (0x3 << 30) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_100MV (0x2 << 30) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_50MV (0x1 << 30) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_25MV (0x0 << 30) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_SRC_4P2 (0x0 << 28) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_SRC_4P2_LT_BATT (0x1 << 28) |
||||
#define POWER_DCDC4P2_DROPOUT_CTRL_SRC_SEL (0x2 << 28) |
||||
#define POWER_DCDC4P2_ISTEAL_THRESH_MASK (0x3 << 24) |
||||
#define POWER_DCDC4P2_ISTEAL_THRESH_OFFSET 24 |
||||
#define POWER_DCDC4P2_ENABLE_4P2 (1 << 23) |
||||
#define POWER_DCDC4P2_ENABLE_DCDC (1 << 22) |
||||
#define POWER_DCDC4P2_HYST_DIR (1 << 21) |
||||
#define POWER_DCDC4P2_HYST_THRESH (1 << 20) |
||||
#define POWER_DCDC4P2_TRG_MASK (0x7 << 16) |
||||
#define POWER_DCDC4P2_TRG_OFFSET 16 |
||||
#define POWER_DCDC4P2_TRG_4V2 (0x0 << 16) |
||||
#define POWER_DCDC4P2_TRG_4V1 (0x1 << 16) |
||||
#define POWER_DCDC4P2_TRG_4V0 (0x2 << 16) |
||||
#define POWER_DCDC4P2_TRG_3V9 (0x3 << 16) |
||||
#define POWER_DCDC4P2_TRG_BATT (0x4 << 16) |
||||
#define POWER_DCDC4P2_BO_MASK (0x1f << 8) |
||||
#define POWER_DCDC4P2_BO_OFFSET 8 |
||||
#define POWER_DCDC4P2_CMPTRIP_MASK 0x1f |
||||
#define POWER_DCDC4P2_CMPTRIP_OFFSET 0 |
||||
|
||||
#define POWER_MISC_FREQSEL_MASK (0x7 << 4) |
||||
#define POWER_MISC_FREQSEL_OFFSET 4 |
||||
#define POWER_MISC_FREQSEL_20MHZ (0x1 << 4) |
||||
#define POWER_MISC_FREQSEL_24MHZ (0x2 << 4) |
||||
#define POWER_MISC_FREQSEL_19MHZ (0x3 << 4) |
||||
#define POWER_MISC_FREQSEL_14MHZ (0x4 << 4) |
||||
#define POWER_MISC_FREQSEL_18MHZ (0x5 << 4) |
||||
#define POWER_MISC_FREQSEL_21MHZ (0x6 << 4) |
||||
#define POWER_MISC_FREQSEL_17MHZ (0x7 << 4) |
||||
#define POWER_MISC_DISABLE_FET_BO_LOGIC (1 << 3) |
||||
#define POWER_MISC_DELAY_TIMING (1 << 2) |
||||
#define POWER_MISC_TEST (1 << 1) |
||||
#define POWER_MISC_SEL_PLLCLK (1 << 0) |
||||
|
||||
#define POWER_DCLIMITS_POSLIMIT_BUCK_MASK (0x7f << 8) |
||||
#define POWER_DCLIMITS_POSLIMIT_BUCK_OFFSET 8 |
||||
#define POWER_DCLIMITS_NEGLIMIT_MASK 0x7f |
||||
#define POWER_DCLIMITS_NEGLIMIT_OFFSET 0 |
||||
|
||||
#define POWER_LOOPCTRL_TOGGLE_DIF (1 << 20) |
||||
#define POWER_LOOPCTRL_HYST_SIGN (1 << 19) |
||||
#define POWER_LOOPCTRL_EN_CM_HYST (1 << 18) |
||||
#define POWER_LOOPCTRL_EN_DF_HYST (1 << 17) |
||||
#define POWER_LOOPCTRL_CM_HYST_THRESH (1 << 16) |
||||
#define POWER_LOOPCTRL_DF_HYST_THRESH (1 << 15) |
||||
#define POWER_LOOPCTRL_RCSCALE_THRESH (1 << 14) |
||||
#define POWER_LOOPCTRL_EN_RCSCALE_MASK (0x3 << 12) |
||||
#define POWER_LOOPCTRL_EN_RCSCALE_OFFSET 12 |
||||
#define POWER_LOOPCTRL_EN_RCSCALE_DIS (0x0 << 12) |
||||
#define POWER_LOOPCTRL_EN_RCSCALE_2X (0x1 << 12) |
||||
#define POWER_LOOPCTRL_EN_RCSCALE_4X (0x2 << 12) |
||||
#define POWER_LOOPCTRL_EN_RCSCALE_8X (0x3 << 12) |
||||
#define POWER_LOOPCTRL_DC_FF_MASK (0x7 << 8) |
||||
#define POWER_LOOPCTRL_DC_FF_OFFSET 8 |
||||
#define POWER_LOOPCTRL_DC_R_MASK (0xf << 4) |
||||
#define POWER_LOOPCTRL_DC_R_OFFSET 4 |
||||
#define POWER_LOOPCTRL_DC_C_MASK 0x3 |
||||
#define POWER_LOOPCTRL_DC_C_OFFSET 0 |
||||
#define POWER_LOOPCTRL_DC_C_MAX 0x0 |
||||
#define POWER_LOOPCTRL_DC_C_2X 0x1 |
||||
#define POWER_LOOPCTRL_DC_C_4X 0x2 |
||||
#define POWER_LOOPCTRL_DC_C_MIN 0x3 |
||||
|
||||
#define POWER_STS_PWRUP_SOURCE_MASK (0x3f << 24) |
||||
#define POWER_STS_PWRUP_SOURCE_OFFSET 24 |
||||
#define POWER_STS_PWRUP_SOURCE_5V (0x20 << 24) |
||||
#define POWER_STS_PWRUP_SOURCE_RTC (0x10 << 24) |
||||
#define POWER_STS_PWRUP_SOURCE_PSWITCH_HIGH (0x02 << 24) |
||||
#define POWER_STS_PWRUP_SOURCE_PSWITCH_MID (0x01 << 24) |
||||
#define POWER_STS_PSWITCH_MASK (0x3 << 20) |
||||
#define POWER_STS_PSWITCH_OFFSET 20 |
||||
#define POWER_STS_AVALID0_STATUS (1 << 17) |
||||
#define POWER_STS_BVALID0_STATUS (1 << 16) |
||||
#define POWER_STS_VBUSVALID0_STATUS (1 << 15) |
||||
#define POWER_STS_SESSEND0_STATUS (1 << 14) |
||||
#define POWER_STS_BATT_BO (1 << 13) |
||||
#define POWER_STS_VDD5V_FAULT (1 << 12) |
||||
#define POWER_STS_CHRGSTS (1 << 11) |
||||
#define POWER_STS_DCDC_4P2_BO (1 << 10) |
||||
#define POWER_STS_DC_OK (1 << 9) |
||||
#define POWER_STS_VDDIO_BO (1 << 8) |
||||
#define POWER_STS_VDDA_BO (1 << 7) |
||||
#define POWER_STS_VDDD_BO (1 << 6) |
||||
#define POWER_STS_VDD5V_GT_VDDIO (1 << 5) |
||||
#define POWER_STS_VDD5V_DROOP (1 << 4) |
||||
#define POWER_STS_AVALID0 (1 << 3) |
||||
#define POWER_STS_BVALID0 (1 << 2) |
||||
#define POWER_STS_VBUSVALID0 (1 << 1) |
||||
#define POWER_STS_SESSEND0 (1 << 0) |
||||
|
||||
#define POWER_SPEED_STATUS_MASK (0xff << 16) |
||||
#define POWER_SPEED_STATUS_OFFSET 16 |
||||
#define POWER_SPEED_CTRL_MASK 0x3 |
||||
#define POWER_SPEED_CTRL_OFFSET 0 |
||||
#define POWER_SPEED_CTRL_SS_OFF 0x0 |
||||
#define POWER_SPEED_CTRL_SS_ON 0x1 |
||||
#define POWER_SPEED_CTRL_SS_ENABLE 0x3 |
||||
|
||||
#define POWER_BATTMONITOR_BATT_VAL_MASK (0x3ff << 16) |
||||
#define POWER_BATTMONITOR_BATT_VAL_OFFSET 16 |
||||
#define POWER_BATTMONITOR_EN_BATADJ (1 << 10) |
||||
#define POWER_BATTMONITOR_PWDN_BATTBRNOUT (1 << 9) |
||||
#define POWER_BATTMONITOR_BRWNOUT_PWD (1 << 8) |
||||
#define POWER_BATTMONITOR_BRWNOUT_LVL_MASK 0x1f |
||||
#define POWER_BATTMONITOR_BRWNOUT_LVL_OFFSET 0 |
||||
|
||||
#define POWER_RESET_UNLOCK_MASK (0xffff << 16) |
||||
#define POWER_RESET_UNLOCK_OFFSET 16 |
||||
#define POWER_RESET_UNLOCK_KEY (0x3e77 << 16) |
||||
#define POWER_RESET_PWD_OFF (1 << 1) |
||||
#define POWER_RESET_PWD (1 << 0) |
||||
|
||||
#define POWER_DEBUG_VBUSVALIDPIOLOCK (1 << 3) |
||||
#define POWER_DEBUG_AVALIDPIOLOCK (1 << 2) |
||||
#define POWER_DEBUG_BVALIDPIOLOCK (1 << 1) |
||||
#define POWER_DEBUG_SESSENDPIOLOCK (1 << 0) |
||||
|
||||
#define POWER_SPECIAL_TEST_MASK 0xffffffff |
||||
#define POWER_SPECIAL_TEST_OFFSET 0 |
||||
|
||||
#define POWER_VERSION_MAJOR_MASK (0xff << 24) |
||||
#define POWER_VERSION_MAJOR_OFFSET 24 |
||||
#define POWER_VERSION_MINOR_MASK (0xff << 16) |
||||
#define POWER_VERSION_MINOR_OFFSET 16 |
||||
#define POWER_VERSION_STEP_MASK 0xffff |
||||
#define POWER_VERSION_STEP_OFFSET 0 |
||||
|
||||
#endif /* __MX23_REGS_POWER_H__ */ |
@ -0,0 +1,39 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra high-level function multiplexing */ |
||||
|
||||
#ifndef _TEGRA_FUNCMUX_H_ |
||||
#define _TEGRA_FUNCMUX_H_ |
||||
|
||||
/**
|
||||
* Select a config for a particular peripheral. |
||||
* |
||||
* Each peripheral can operate through a number of configurations, |
||||
* which are sets of pins that it uses to bring out its signals. |
||||
* The basic config is 0, and higher numbers indicate different |
||||
* pinmux settings to bring the peripheral out on other pins, |
||||
* |
||||
* This function also disables tristate for the function's pins, |
||||
* so that they operate in normal mode. |
||||
* |
||||
* @param id Peripheral id |
||||
* @param config Configuration to use (FUNCMUX_...), 0 for default |
||||
* @return 0 if ok, -1 on error (e.g. incorrect id or config) |
||||
*/ |
||||
int funcmux_select(enum periph_id id, int config); |
||||
|
||||
#endif /* _TEGRA_FUNCMUX_H_ */ |
@ -0,0 +1,40 @@ |
||||
/*
|
||||
* (C) Copyright 2010-2012 |
||||
* NVIDIA Corporation <www.nvidia.com> |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* 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., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#ifndef _TEGRA_GP_PADCTRL_H_ |
||||
#define _TEGRA_GP_PADCTRL_H_ |
||||
|
||||
#define GP_HIDREV 0x804 |
||||
|
||||
/* bit fields definitions for APB_MISC_GP_HIDREV register */ |
||||
#define HIDREV_CHIPID_SHIFT 8 |
||||
#define HIDREV_CHIPID_MASK (0xff << HIDREV_CHIPID_SHIFT) |
||||
#define HIDREV_MAJORPREV_SHIFT 4 |
||||
#define HIDREV_MAJORPREV_MASK (0xf << HIDREV_MAJORPREV_SHIFT) |
||||
|
||||
/* CHIPID field returned from APB_MISC_GP_HIDREV register */ |
||||
#define CHIPID_TEGRA20 0x20 |
||||
#define CHIPID_TEGRA30 0x30 |
||||
#define CHIPID_TEGRA114 0x35 |
||||
|
||||
#endif /* _TEGRA_GP_PADCTRL_H_ */ |
@ -0,0 +1,84 @@ |
||||
/*
|
||||
* NVIDIA Tegra SPI-SLINK controller |
||||
* |
||||
* Copyright 2010-2013 NVIDIA Corporation |
||||
* |
||||
* This software may be used and distributed according to the |
||||
* terms of the GNU Public License, Version 2, incorporated |
||||
* herein by reference. |
||||
* |
||||
* This program is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU General Public License |
||||
* Version 2 as published by the Free Software Foundation. |
||||
* |
||||
* 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., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
|
||||
#ifndef _TEGRA_SLINK_H_ |
||||
#define _TEGRA_SLINK_H_ |
||||
|
||||
#include <asm/types.h> |
||||
|
||||
struct slink_tegra { |
||||
u32 command; /* SLINK_COMMAND_0 register */ |
||||
u32 command2; /* SLINK_COMMAND2_0 reg */ |
||||
u32 status; /* SLINK_STATUS_0 register */ |
||||
u32 reserved; /* Reserved offset 0C */ |
||||
u32 mas_data; /* SLINK_MAS_DATA_0 reg */ |
||||
u32 slav_data; /* SLINK_SLAVE_DATA_0 reg */ |
||||
u32 dma_ctl; /* SLINK_DMA_CTL_0 register */ |
||||
u32 status2; /* SLINK_STATUS2_0 reg */ |
||||
u32 rsvd[56]; /* 0x20 to 0xFF reserved */ |
||||
u32 tx_fifo; /* SLINK_TX_FIFO_0 reg off 100h */ |
||||
u32 rsvd2[31]; /* 0x104 to 0x17F reserved */ |
||||
u32 rx_fifo; /* SLINK_RX_FIFO_0 reg off 180h */ |
||||
}; |
||||
|
||||
/* COMMAND */ |
||||
#define SLINK_CMD_ENB (1 << 31) |
||||
#define SLINK_CMD_GO (1 << 30) |
||||
#define SLINK_CMD_M_S (1 << 28) |
||||
#define SLINK_CMD_CK_SDA (1 << 21) |
||||
#define SLINK_CMD_CS_POL (1 << 13) |
||||
#define SLINK_CMD_CS_VAL (1 << 12) |
||||
#define SLINK_CMD_CS_SOFT (1 << 11) |
||||
#define SLINK_CMD_BIT_LENGTH (1 << 4) |
||||
#define SLINK_CMD_BIT_LENGTH_MASK 0x0000001F |
||||
/* COMMAND2 */ |
||||
#define SLINK_CMD2_TXEN (1 << 30) |
||||
#define SLINK_CMD2_RXEN (1 << 31) |
||||
#define SLINK_CMD2_SS_EN (1 << 18) |
||||
#define SLINK_CMD2_SS_EN_SHIFT 18 |
||||
#define SLINK_CMD2_SS_EN_MASK 0x000C0000 |
||||
#define SLINK_CMD2_CS_ACTIVE_BETWEEN (1 << 17) |
||||
/* STATUS */ |
||||
#define SLINK_STAT_BSY (1 << 31) |
||||
#define SLINK_STAT_RDY (1 << 30) |
||||
#define SLINK_STAT_ERR (1 << 29) |
||||
#define SLINK_STAT_RXF_FLUSH (1 << 27) |
||||
#define SLINK_STAT_TXF_FLUSH (1 << 26) |
||||
#define SLINK_STAT_RXF_OVF (1 << 25) |
||||
#define SLINK_STAT_TXF_UNR (1 << 24) |
||||
#define SLINK_STAT_RXF_EMPTY (1 << 23) |
||||
#define SLINK_STAT_RXF_FULL (1 << 22) |
||||
#define SLINK_STAT_TXF_EMPTY (1 << 21) |
||||
#define SLINK_STAT_TXF_FULL (1 << 20) |
||||
#define SLINK_STAT_TXF_OVF (1 << 19) |
||||
#define SLINK_STAT_RXF_UNR (1 << 18) |
||||
#define SLINK_STAT_CUR_BLKCNT (1 << 15) |
||||
/* STATUS2 */ |
||||
#define SLINK_STAT2_RXF_FULL_CNT (1 << 16) |
||||
#define SLINK_STAT2_TXF_FULL_CNT (1 << 0) |
||||
|
||||
#define SPI_TIMEOUT 1000 |
||||
#define TEGRA_SPI_MAX_FREQ 52000000 |
||||
|
||||
#endif /* _TEGRA_SLINK_H_ */ |
@ -0,0 +1,402 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra114 clock PLL tables */ |
||||
|
||||
#ifndef _TEGRA114_CLOCK_TABLES_H_ |
||||
#define _TEGRA114_CLOCK_TABLES_H_ |
||||
|
||||
/* The PLLs supported by the hardware */ |
||||
enum clock_id { |
||||
CLOCK_ID_FIRST, |
||||
CLOCK_ID_CGENERAL = CLOCK_ID_FIRST, |
||||
CLOCK_ID_MEMORY, |
||||
CLOCK_ID_PERIPH, |
||||
CLOCK_ID_AUDIO, |
||||
CLOCK_ID_USB, |
||||
CLOCK_ID_DISPLAY, |
||||
|
||||
/* now the simple ones */ |
||||
CLOCK_ID_FIRST_SIMPLE, |
||||
CLOCK_ID_XCPU = CLOCK_ID_FIRST_SIMPLE, |
||||
CLOCK_ID_EPCI, |
||||
CLOCK_ID_SFROM32KHZ, |
||||
|
||||
/* These are the base clocks (inputs to the Tegra SOC) */ |
||||
CLOCK_ID_32KHZ, |
||||
CLOCK_ID_OSC, |
||||
|
||||
CLOCK_ID_COUNT, /* number of PLLs */ |
||||
CLOCK_ID_DISPLAY2, /* placeholder */ |
||||
CLOCK_ID_NONE = -1, |
||||
}; |
||||
|
||||
/* The clocks supported by the hardware */ |
||||
enum periph_id { |
||||
PERIPH_ID_FIRST, |
||||
|
||||
/* Low word: 31:0 (DEVICES_L) */ |
||||
PERIPH_ID_CPU = PERIPH_ID_FIRST, |
||||
PERIPH_ID_COP, |
||||
PERIPH_ID_TRIGSYS, |
||||
PERIPH_ID_RESERVED3, |
||||
PERIPH_ID_RTC, |
||||
PERIPH_ID_TMR, |
||||
PERIPH_ID_UART1, |
||||
PERIPH_ID_UART2, |
||||
|
||||
/* 8 */ |
||||
PERIPH_ID_GPIO, |
||||
PERIPH_ID_SDMMC2, |
||||
PERIPH_ID_SPDIF, |
||||
PERIPH_ID_I2S1, |
||||
PERIPH_ID_I2C1, |
||||
PERIPH_ID_NDFLASH, |
||||
PERIPH_ID_SDMMC1, |
||||
PERIPH_ID_SDMMC4, |
||||
|
||||
/* 16 */ |
||||
PERIPH_ID_RESERVED16, |
||||
PERIPH_ID_PWM, |
||||
PERIPH_ID_I2S2, |
||||
PERIPH_ID_EPP, |
||||
PERIPH_ID_VI, |
||||
PERIPH_ID_2D, |
||||
PERIPH_ID_USBD, |
||||
PERIPH_ID_ISP, |
||||
|
||||
/* 24 */ |
||||
PERIPH_ID_3D, |
||||
PERIPH_ID_RESERVED24, |
||||
PERIPH_ID_DISP2, |
||||
PERIPH_ID_DISP1, |
||||
PERIPH_ID_HOST1X, |
||||
PERIPH_ID_VCP, |
||||
PERIPH_ID_I2S0, |
||||
PERIPH_ID_CACHE2, |
||||
|
||||
/* Middle word: 63:32 (DEVICES_H) */ |
||||
PERIPH_ID_MEM, |
||||
PERIPH_ID_AHBDMA, |
||||
PERIPH_ID_APBDMA, |
||||
PERIPH_ID_RESERVED35, |
||||
PERIPH_ID_KBC, |
||||
PERIPH_ID_STAT_MON, |
||||
PERIPH_ID_PMC, |
||||
PERIPH_ID_FUSE, |
||||
|
||||
/* 40 */ |
||||
PERIPH_ID_KFUSE, |
||||
PERIPH_ID_SBC1, |
||||
PERIPH_ID_SNOR, |
||||
PERIPH_ID_RESERVED43, |
||||
PERIPH_ID_SBC2, |
||||
PERIPH_ID_RESERVED45, |
||||
PERIPH_ID_SBC3, |
||||
PERIPH_ID_I2C5, |
||||
|
||||
/* 48 */ |
||||
PERIPH_ID_DSI, |
||||
PERIPH_ID_TVO, |
||||
PERIPH_ID_MIPI, |
||||
PERIPH_ID_HDMI, |
||||
PERIPH_ID_CSI, |
||||
PERIPH_ID_TVDAC, |
||||
PERIPH_ID_I2C2, |
||||
PERIPH_ID_UART3, |
||||
|
||||
/* 56 */ |
||||
PERIPH_ID_RESERVED56, |
||||
PERIPH_ID_EMC, |
||||
PERIPH_ID_USB2, |
||||
PERIPH_ID_USB3, |
||||
PERIPH_ID_MPE, |
||||
PERIPH_ID_VDE, |
||||
PERIPH_ID_BSEA, |
||||
PERIPH_ID_BSEV, |
||||
|
||||
/* Upper word 95:64 (DEVICES_U) */ |
||||
PERIPH_ID_SPEEDO, |
||||
PERIPH_ID_UART4, |
||||
PERIPH_ID_UART5, |
||||
PERIPH_ID_I2C3, |
||||
PERIPH_ID_SBC4, |
||||
PERIPH_ID_SDMMC3, |
||||
PERIPH_ID_PCIE, |
||||
PERIPH_ID_OWR, |
||||
|
||||
/* 72 */ |
||||
PERIPH_ID_AFI, |
||||
PERIPH_ID_CORESIGHT, |
||||
PERIPH_ID_PCIEXCLK, |
||||
PERIPH_ID_AVPUCQ, |
||||
PERIPH_ID_RESERVED76, |
||||
PERIPH_ID_RESERVED77, |
||||
PERIPH_ID_RESERVED78, |
||||
PERIPH_ID_DTV, |
||||
|
||||
/* 80 */ |
||||
PERIPH_ID_NANDSPEED, |
||||
PERIPH_ID_I2CSLOW, |
||||
PERIPH_ID_DSIB, |
||||
PERIPH_ID_RESERVED83, |
||||
PERIPH_ID_IRAMA, |
||||
PERIPH_ID_IRAMB, |
||||
PERIPH_ID_IRAMC, |
||||
PERIPH_ID_IRAMD, |
||||
|
||||
/* 88 */ |
||||
PERIPH_ID_CRAM2, |
||||
PERIPH_ID_RESERVED89, |
||||
PERIPH_ID_MDOUBLER, |
||||
PERIPH_ID_RESERVED91, |
||||
PERIPH_ID_SUSOUT, |
||||
PERIPH_ID_RESERVED93, |
||||
PERIPH_ID_RESERVED94, |
||||
PERIPH_ID_RESERVED95, |
||||
|
||||
PERIPH_ID_VW_FIRST, |
||||
/* V word: 31:0 */ |
||||
PERIPH_ID_CPUG = PERIPH_ID_VW_FIRST, |
||||
PERIPH_ID_CPULP, |
||||
PERIPH_ID_3D2, |
||||
PERIPH_ID_MSELECT, |
||||
PERIPH_ID_TSENSOR, |
||||
PERIPH_ID_I2S3, |
||||
PERIPH_ID_I2S4, |
||||
PERIPH_ID_I2C4, |
||||
|
||||
/* 104 */ |
||||
PERIPH_ID_SBC5, |
||||
PERIPH_ID_SBC6, |
||||
PERIPH_ID_AUDIO, |
||||
PERIPH_ID_APBIF, |
||||
PERIPH_ID_DAM0, |
||||
PERIPH_ID_DAM1, |
||||
PERIPH_ID_DAM2, |
||||
PERIPH_ID_HDA2CODEC2X, |
||||
|
||||
/* 112 */ |
||||
PERIPH_ID_ATOMICS, |
||||
PERIPH_ID_EX_RESERVED17, |
||||
PERIPH_ID_EX_RESERVED18, |
||||
PERIPH_ID_EX_RESERVED19, |
||||
PERIPH_ID_EX_RESERVED20, |
||||
PERIPH_ID_EX_RESERVED21, |
||||
PERIPH_ID_EX_RESERVED22, |
||||
PERIPH_ID_ACTMON, |
||||
|
||||
/* 120 */ |
||||
PERIPH_ID_EX_RESERVED24, |
||||
PERIPH_ID_EX_RESERVED25, |
||||
PERIPH_ID_EX_RESERVED26, |
||||
PERIPH_ID_EX_RESERVED27, |
||||
PERIPH_ID_SATA, |
||||
PERIPH_ID_HDA, |
||||
PERIPH_ID_EX_RESERVED30, |
||||
PERIPH_ID_EX_RESERVED31, |
||||
|
||||
/* W word: 31:0 */ |
||||
PERIPH_ID_HDA2HDMICODEC, |
||||
PERIPH_ID_RESERVED1_SATACOLD, |
||||
PERIPH_ID_RESERVED2_PCIERX0, |
||||
PERIPH_ID_RESERVED3_PCIERX1, |
||||
PERIPH_ID_RESERVED4_PCIERX2, |
||||
PERIPH_ID_RESERVED5_PCIERX3, |
||||
PERIPH_ID_RESERVED6_PCIERX4, |
||||
PERIPH_ID_RESERVED7_PCIERX5, |
||||
|
||||
/* 136 */ |
||||
PERIPH_ID_CEC, |
||||
PERIPH_ID_PCIE2_IOBIST, |
||||
PERIPH_ID_EMC_IOBIST, |
||||
PERIPH_ID_HDMI_IOBIST, |
||||
PERIPH_ID_SATA_IOBIST, |
||||
PERIPH_ID_MIPI_IOBIST, |
||||
PERIPH_ID_EMC1_IOBIST, |
||||
PERIPH_ID_XUSB, |
||||
|
||||
/* 144 */ |
||||
PERIPH_ID_CILAB, |
||||
PERIPH_ID_CILCD, |
||||
PERIPH_ID_CILE, |
||||
PERIPH_ID_DSIA_LP, |
||||
PERIPH_ID_DSIB_LP, |
||||
PERIPH_ID_RESERVED21_ENTROPY, |
||||
PERIPH_ID_RESERVED22_W, |
||||
PERIPH_ID_RESERVED23_W, |
||||
|
||||
/* 152 */ |
||||
PERIPH_ID_RESERVED24_W, |
||||
PERIPH_ID_AMX0, |
||||
PERIPH_ID_ADX0, |
||||
PERIPH_ID_DVFS, |
||||
PERIPH_ID_XUSB_SS, |
||||
PERIPH_ID_EMC_DLL, |
||||
PERIPH_ID_MC1, |
||||
PERIPH_ID_EMC1, |
||||
|
||||
PERIPH_ID_COUNT, |
||||
PERIPH_ID_NONE = -1, |
||||
}; |
||||
|
||||
enum pll_out_id { |
||||
PLL_OUT1, |
||||
PLL_OUT2, |
||||
PLL_OUT3, |
||||
PLL_OUT4 |
||||
}; |
||||
|
||||
/*
|
||||
* Clock peripheral IDs which sadly don't match up with PERIPH_ID. we want |
||||
* callers to use the PERIPH_ID for all access to peripheral clocks to avoid |
||||
* confusion bewteen PERIPH_ID_... and PERIPHC_... |
||||
* |
||||
* We don't call this CLOCK_PERIPH_ID or PERIPH_CLOCK_ID as it would just be |
||||
* confusing. |
||||
*/ |
||||
enum periphc_internal_id { |
||||
/* 0x00 */ |
||||
PERIPHC_I2S1, |
||||
PERIPHC_I2S2, |
||||
PERIPHC_SPDIF_OUT, |
||||
PERIPHC_SPDIF_IN, |
||||
PERIPHC_PWM, |
||||
PERIPHC_05h, |
||||
PERIPHC_SBC2, |
||||
PERIPHC_SBC3, |
||||
|
||||
/* 0x08 */ |
||||
PERIPHC_08h, |
||||
PERIPHC_I2C1, |
||||
PERIPHC_I2C5, |
||||
PERIPHC_0bh, |
||||
PERIPHC_0ch, |
||||
PERIPHC_SBC1, |
||||
PERIPHC_DISP1, |
||||
PERIPHC_DISP2, |
||||
|
||||
/* 0x10 */ |
||||
PERIPHC_CVE, |
||||
PERIPHC_11h, |
||||
PERIPHC_VI, |
||||
PERIPHC_13h, |
||||
PERIPHC_SDMMC1, |
||||
PERIPHC_SDMMC2, |
||||
PERIPHC_G3D, |
||||
PERIPHC_G2D, |
||||
|
||||
/* 0x18 */ |
||||
PERIPHC_NDFLASH, |
||||
PERIPHC_SDMMC4, |
||||
PERIPHC_VFIR, |
||||
PERIPHC_EPP, |
||||
PERIPHC_MPE, |
||||
PERIPHC_MIPI, |
||||
PERIPHC_UART1, |
||||
PERIPHC_UART2, |
||||
|
||||
/* 0x20 */ |
||||
PERIPHC_HOST1X, |
||||
PERIPHC_21h, |
||||
PERIPHC_TVO, |
||||
PERIPHC_HDMI, |
||||
PERIPHC_24h, |
||||
PERIPHC_TVDAC, |
||||
PERIPHC_I2C2, |
||||
PERIPHC_EMC, |
||||
|
||||
/* 0x28 */ |
||||
PERIPHC_UART3, |
||||
PERIPHC_29h, |
||||
PERIPHC_VI_SENSOR, |
||||
PERIPHC_2bh, |
||||
PERIPHC_2ch, |
||||
PERIPHC_SBC4, |
||||
PERIPHC_I2C3, |
||||
PERIPHC_SDMMC3, |
||||
|
||||
/* 0x30 */ |
||||
PERIPHC_UART4, |
||||
PERIPHC_UART5, |
||||
PERIPHC_VDE, |
||||
PERIPHC_OWR, |
||||
PERIPHC_NOR, |
||||
PERIPHC_CSITE, |
||||
PERIPHC_I2S0, |
||||
PERIPHC_37h, |
||||
|
||||
PERIPHC_VW_FIRST, |
||||
/* 0x38 */ |
||||
PERIPHC_G3D2 = PERIPHC_VW_FIRST, |
||||
PERIPHC_MSELECT, |
||||
PERIPHC_TSENSOR, |
||||
PERIPHC_I2S3, |
||||
PERIPHC_I2S4, |
||||
PERIPHC_I2C4, |
||||
PERIPHC_SBC5, |
||||
PERIPHC_SBC6, |
||||
|
||||
/* 0x40 */ |
||||
PERIPHC_AUDIO, |
||||
PERIPHC_41h, |
||||
PERIPHC_DAM0, |
||||
PERIPHC_DAM1, |
||||
PERIPHC_DAM2, |
||||
PERIPHC_HDA2CODEC2X, |
||||
PERIPHC_ACTMON, |
||||
PERIPHC_EXTPERIPH1, |
||||
|
||||
/* 0x48 */ |
||||
PERIPHC_EXTPERIPH2, |
||||
PERIPHC_EXTPERIPH3, |
||||
PERIPHC_NANDSPEED, |
||||
PERIPHC_I2CSLOW, |
||||
PERIPHC_SYS, |
||||
PERIPHC_SPEEDO, |
||||
PERIPHC_4eh, |
||||
PERIPHC_4fh, |
||||
|
||||
/* 0x50 */ |
||||
PERIPHC_50h, |
||||
PERIPHC_51h, |
||||
PERIPHC_52h, |
||||
PERIPHC_53h, |
||||
PERIPHC_SATAOOB, |
||||
PERIPHC_SATA, |
||||
PERIPHC_HDA, |
||||
|
||||
PERIPHC_COUNT, |
||||
|
||||
PERIPHC_NONE = -1, |
||||
}; |
||||
|
||||
/* Converts a clock number to a clock register: 0=L, 1=H, 2=U, 0=V, 1=W */ |
||||
#define PERIPH_REG(id) \ |
||||
(id < PERIPH_ID_VW_FIRST) ? \
|
||||
((id) >> 5) : ((id - PERIPH_ID_VW_FIRST) >> 5) |
||||
|
||||
/* Mask value for a clock (within PERIPH_REG(id)) */ |
||||
#define PERIPH_MASK(id) (1 << ((id) & 0x1f)) |
||||
|
||||
/* return 1 if a PLL ID is in range */ |
||||
#define clock_id_is_pll(id) ((id) >= CLOCK_ID_FIRST && (id) < CLOCK_ID_COUNT) |
||||
|
||||
/* return 1 if a peripheral ID is in range */ |
||||
#define clock_periph_id_isvalid(id) ((id) >= PERIPH_ID_FIRST && \ |
||||
(id) < PERIPH_ID_COUNT) |
||||
|
||||
#endif /* _TEGRA114_CLOCK_TABLES_H_ */ |
@ -0,0 +1,28 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra114 clock control functions */ |
||||
|
||||
#ifndef _TEGRA114_CLOCK_H_ |
||||
#define _TEGRA114_CLOCK_H_ |
||||
|
||||
#include <asm/arch-tegra/clock.h> |
||||
|
||||
/* CLK_RST_CONTROLLER_OSC_CTRL_0 */ |
||||
#define OSC_FREQ_SHIFT 28 |
||||
#define OSC_FREQ_MASK (0xF << OSC_FREQ_SHIFT) |
||||
|
||||
#endif /* _TEGRA114_CLOCK_H_ */ |
@ -0,0 +1,35 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_FLOW_H_ |
||||
#define _TEGRA114_FLOW_H_ |
||||
|
||||
struct flow_ctlr { |
||||
u32 halt_cpu_events; |
||||
u32 halt_cop_events; |
||||
u32 cpu_csr; |
||||
u32 cop_csr; |
||||
u32 xrq_events; |
||||
u32 halt_cpu1_events; |
||||
u32 cpu1_csr; |
||||
u32 halt_cpu2_events; |
||||
u32 cpu2_csr; |
||||
u32 halt_cpu3_events; |
||||
u32 cpu3_csr; |
||||
u32 cluster_control; |
||||
}; |
||||
|
||||
#endif /* _TEGRA114_FLOW_H_ */ |
@ -0,0 +1,31 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra114 high-level function multiplexing */ |
||||
|
||||
#ifndef _TEGRA114_FUNCMUX_H_ |
||||
#define _TEGRA114_FUNCMUX_H_ |
||||
|
||||
#include <asm/arch-tegra/funcmux.h> |
||||
|
||||
/* Configs supported by the func mux */ |
||||
enum { |
||||
FUNCMUX_DEFAULT = 0, /* default config */ |
||||
|
||||
/* UART configs */ |
||||
FUNCMUX_UART4_GMI = 0, |
||||
}; |
||||
#endif /* _TEGRA114_FUNCMUX_H_ */ |
@ -0,0 +1,59 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_GP_PADCTRL_H_ |
||||
#define _TEGRA114_GP_PADCTRL_H_ |
||||
|
||||
#include <asm/arch-tegra/gp_padctrl.h> |
||||
|
||||
/* APB_MISC_GP and padctrl registers */ |
||||
struct apb_misc_gp_ctlr { |
||||
u32 modereg; /* 0x00: APB_MISC_GP_MODEREG */ |
||||
u32 hidrev; /* 0x04: APB_MISC_GP_HIDREV */ |
||||
u32 reserved0[22]; /* 0x08 - 0x5C: */ |
||||
u32 emu_revid; /* 0x60: APB_MISC_GP_EMU_REVID */ |
||||
u32 xactor_scratch; /* 0x64: APB_MISC_GP_XACTOR_SCRATCH */ |
||||
u32 aocfg1; /* 0x68: APB_MISC_GP_AOCFG1PADCTRL */ |
||||
u32 aocfg2; /* 0x6c: APB_MISC_GP_AOCFG2PADCTRL */ |
||||
u32 atcfg1; /* 0x70: APB_MISC_GP_ATCFG1PADCTRL */ |
||||
u32 atcfg2; /* 0x74: APB_MISC_GP_ATCFG2PADCTRL */ |
||||
u32 atcfg3; /* 0x78: APB_MISC_GP_ATCFG3PADCTRL */ |
||||
u32 atcfg4; /* 0x7C: APB_MISC_GP_ATCFG4PADCTRL */ |
||||
u32 atcfg5; /* 0x80: APB_MISC_GP_ATCFG5PADCTRL */ |
||||
u32 cdev1cfg; /* 0x84: APB_MISC_GP_CDEV1CFGPADCTRL */ |
||||
u32 cdev2cfg; /* 0x88: APB_MISC_GP_CDEV2CFGPADCTRL */ |
||||
u32 csuscfg; /* 0x8C: APB_MISC_GP_CSUSCFGPADCTRL */ |
||||
u32 dap1cfg; /* 0x90: APB_MISC_GP_DAP1CFGPADCTRL */ |
||||
u32 dap2cfg; /* 0x94: APB_MISC_GP_DAP2CFGPADCTRL */ |
||||
u32 dap3cfg; /* 0x98: APB_MISC_GP_DAP3CFGPADCTRL */ |
||||
u32 dap4cfg; /* 0x9C: APB_MISC_GP_DAP4CFGPADCTRL */ |
||||
u32 dbgcfg; /* 0xA0: APB_MISC_GP_DBGCFGPADCTRL */ |
||||
u32 lcdcfg1; /* 0xA4: APB_MISC_GP_LCDCFG1PADCTRL */ |
||||
u32 lcdcfg2; /* 0xA8: APB_MISC_GP_LCDCFG2PADCTRL */ |
||||
u32 sdio2cfg; /* 0xAC: APB_MISC_GP_SDIO2CFGPADCTRL */ |
||||
u32 sdio3cfg; /* 0xB0: APB_MISC_GP_SDIO3CFGPADCTRL */ |
||||
u32 spicfg; /* 0xB4: APB_MISC_GP_SPICFGPADCTRL */ |
||||
u32 uaacfg; /* 0xB8: APB_MISC_GP_UAACFGPADCTRL */ |
||||
u32 uabcfg; /* 0xBC: APB_MISC_GP_UABCFGPADCTRL */ |
||||
u32 uart2cfg; /* 0xC0: APB_MISC_GP_UART2CFGPADCTRL */ |
||||
u32 uart3cfg; /* 0xC4: APB_MISC_GP_UART3CFGPADCTRL */ |
||||
u32 vicfg1; /* 0xC8: APB_MISC_GP_VICFG1PADCTRL */ |
||||
u32 vivttgen; /* 0xCC: APB_MISC_GP_VIVTTGENPADCTRL */ |
||||
u32 reserved1[7]; /* 0xD0-0xE8: */ |
||||
u32 sdio1cfg; /* 0xEC: APB_MISC_GP_SDIO1CFGPADCTRL */ |
||||
}; |
||||
|
||||
#endif /* _TEGRA114_GP_PADCTRL_H_ */ |
@ -0,0 +1,30 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_GPIO_H_ |
||||
#define _TEGRA114_GPIO_H_ |
||||
|
||||
/*
|
||||
* The Tegra114 GPIO controller has 246 GPIOS in 8 banks of 4 ports, |
||||
* each with 8 GPIOs. |
||||
*/ |
||||
#define TEGRA_GPIO_PORTS 4 /* number of ports per bank */ |
||||
#define TEGRA_GPIO_BANKS 8 /* number of banks */ |
||||
|
||||
#include <asm/arch-tegra/gpio.h> |
||||
#include <asm/arch-tegra30/gpio.h> |
||||
|
||||
#endif /* _TEGRA114_GPIO_H_ */ |
@ -0,0 +1,22 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_HARDWARE_H_ |
||||
#define _TEGRA114_HARDWARE_H_ |
||||
|
||||
/* include tegra specific hardware definitions */ |
||||
|
||||
#endif /* _TEGRA114_HARDWARE_H_ */ |
@ -0,0 +1,618 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_PINMUX_H_ |
||||
#define _TEGRA114_PINMUX_H_ |
||||
|
||||
/*
|
||||
* Pin groups which we adjust. There are three basic attributes of each pin |
||||
* group which use this enum: |
||||
* |
||||
* - function |
||||
* - pullup / pulldown |
||||
* - tristate or normal |
||||
*/ |
||||
enum pmux_pingrp { |
||||
PINGRP_ULPI_DATA0 = 0, /* offset 0x3000 */ |
||||
PINGRP_ULPI_DATA1, |
||||
PINGRP_ULPI_DATA2, |
||||
PINGRP_ULPI_DATA3, |
||||
PINGRP_ULPI_DATA4, |
||||
PINGRP_ULPI_DATA5, |
||||
PINGRP_ULPI_DATA6, |
||||
PINGRP_ULPI_DATA7, |
||||
PINGRP_ULPI_CLK, |
||||
PINGRP_ULPI_DIR, |
||||
PINGRP_ULPI_NXT, |
||||
PINGRP_ULPI_STP, |
||||
PINGRP_DAP3_FS, |
||||
PINGRP_DAP3_DIN, |
||||
PINGRP_DAP3_DOUT, |
||||
PINGRP_DAP3_SCLK, |
||||
PINGRP_GPIO_PV0, |
||||
PINGRP_GPIO_PV1, |
||||
PINGRP_SDMMC1_CLK, |
||||
PINGRP_SDMMC1_CMD, |
||||
PINGRP_SDMMC1_DAT3, |
||||
PINGRP_SDMMC1_DAT2, |
||||
PINGRP_SDMMC1_DAT1, |
||||
PINGRP_SDMMC1_DAT0, |
||||
PINGRP_GPIO_PV2, |
||||
PINGRP_GPIO_PV3, |
||||
PINGRP_CLK2_OUT, |
||||
PINGRP_CLK2_REQ, |
||||
PINGRP_LCD_PWR1, |
||||
PINGRP_LCD_PWR2, |
||||
PINGRP_LCD_SDIN, |
||||
PINGRP_LCD_SDOUT, |
||||
PINGRP_LCD_WR_N, |
||||
PINGRP_LCD_CS0_N, |
||||
PINGRP_LCD_DC0, |
||||
PINGRP_LCD_SCK, |
||||
PINGRP_LCD_PWR0, |
||||
PINGRP_LCD_PCLK, |
||||
PINGRP_LCD_DE, |
||||
PINGRP_LCD_HSYNC, |
||||
PINGRP_LCD_VSYNC, |
||||
PINGRP_LCD_D0, |
||||
PINGRP_LCD_D1, |
||||
PINGRP_LCD_D2, |
||||
PINGRP_LCD_D3, |
||||
PINGRP_LCD_D4, |
||||
PINGRP_LCD_D5, |
||||
PINGRP_LCD_D6, |
||||
PINGRP_LCD_D7, |
||||
PINGRP_LCD_D8, |
||||
PINGRP_LCD_D9, |
||||
PINGRP_LCD_D10, |
||||
PINGRP_LCD_D11, |
||||
PINGRP_LCD_D12, |
||||
PINGRP_LCD_D13, |
||||
PINGRP_LCD_D14, |
||||
PINGRP_LCD_D15, |
||||
PINGRP_LCD_D16, |
||||
PINGRP_LCD_D17, |
||||
PINGRP_LCD_D18, |
||||
PINGRP_LCD_D19, |
||||
PINGRP_LCD_D20, |
||||
PINGRP_LCD_D21, |
||||
PINGRP_LCD_D22, |
||||
PINGRP_LCD_D23, |
||||
PINGRP_LCD_CS1_N, |
||||
PINGRP_LCD_M1, |
||||
PINGRP_LCD_DC1, |
||||
PINGRP_HDMI_INT, |
||||
PINGRP_DDC_SCL, |
||||
PINGRP_DDC_SDA, |
||||
PINGRP_CRT_HSYNC, |
||||
PINGRP_CRT_VSYNC, |
||||
PINGRP_VI_D0, |
||||
PINGRP_VI_D1, |
||||
PINGRP_VI_D2, |
||||
PINGRP_VI_D3, |
||||
PINGRP_VI_D4, |
||||
PINGRP_VI_D5, |
||||
PINGRP_VI_D6, |
||||
PINGRP_VI_D7, |
||||
PINGRP_VI_D8, |
||||
PINGRP_VI_D9, |
||||
PINGRP_VI_D10, |
||||
PINGRP_VI_D11, |
||||
PINGRP_VI_PCLK, |
||||
PINGRP_VI_MCLK, |
||||
PINGRP_VI_VSYNC, |
||||
PINGRP_VI_HSYNC, |
||||
PINGRP_UART2_RXD, |
||||
PINGRP_UART2_TXD, |
||||
PINGRP_UART2_RTS_N, |
||||
PINGRP_UART2_CTS_N, |
||||
PINGRP_UART3_TXD, |
||||
PINGRP_UART3_RXD, |
||||
PINGRP_UART3_CTS_N, |
||||
PINGRP_UART3_RTS_N, |
||||
PINGRP_GPIO_PU0, |
||||
PINGRP_GPIO_PU1, |
||||
PINGRP_GPIO_PU2, |
||||
PINGRP_GPIO_PU3, |
||||
PINGRP_GPIO_PU4, |
||||
PINGRP_GPIO_PU5, |
||||
PINGRP_GPIO_PU6, |
||||
PINGRP_GEN1_I2C_SDA, |
||||
PINGRP_GEN1_I2C_SCL, |
||||
PINGRP_DAP4_FS, |
||||
PINGRP_DAP4_DIN, |
||||
PINGRP_DAP4_DOUT, |
||||
PINGRP_DAP4_SCLK, |
||||
PINGRP_CLK3_OUT, |
||||
PINGRP_CLK3_REQ, |
||||
PINGRP_GMI_WP_N, |
||||
PINGRP_GMI_IORDY, |
||||
PINGRP_GMI_WAIT, |
||||
PINGRP_GMI_ADV_N, |
||||
PINGRP_GMI_CLK, |
||||
PINGRP_GMI_CS0_N, |
||||
PINGRP_GMI_CS1_N, |
||||
PINGRP_GMI_CS2_N, |
||||
PINGRP_GMI_CS3_N, |
||||
PINGRP_GMI_CS4_N, |
||||
PINGRP_GMI_CS6_N, |
||||
PINGRP_GMI_CS7_N, |
||||
PINGRP_GMI_AD0, |
||||
PINGRP_GMI_AD1, |
||||
PINGRP_GMI_AD2, |
||||
PINGRP_GMI_AD3, |
||||
PINGRP_GMI_AD4, |
||||
PINGRP_GMI_AD5, |
||||
PINGRP_GMI_AD6, |
||||
PINGRP_GMI_AD7, |
||||
PINGRP_GMI_AD8, |
||||
PINGRP_GMI_AD9, |
||||
PINGRP_GMI_AD10, |
||||
PINGRP_GMI_AD11, |
||||
PINGRP_GMI_AD12, |
||||
PINGRP_GMI_AD13, |
||||
PINGRP_GMI_AD14, |
||||
PINGRP_GMI_AD15, |
||||
PINGRP_GMI_A16, |
||||
PINGRP_GMI_A17, |
||||
PINGRP_GMI_A18, |
||||
PINGRP_GMI_A19, |
||||
PINGRP_GMI_WR_N, |
||||
PINGRP_GMI_OE_N, |
||||
PINGRP_GMI_DQS, |
||||
PINGRP_GMI_RST_N, |
||||
PINGRP_GEN2_I2C_SCL, |
||||
PINGRP_GEN2_I2C_SDA, |
||||
PINGRP_SDMMC4_CLK, |
||||
PINGRP_SDMMC4_CMD, |
||||
PINGRP_SDMMC4_DAT0, |
||||
PINGRP_SDMMC4_DAT1, |
||||
PINGRP_SDMMC4_DAT2, |
||||
PINGRP_SDMMC4_DAT3, |
||||
PINGRP_SDMMC4_DAT4, |
||||
PINGRP_SDMMC4_DAT5, |
||||
PINGRP_SDMMC4_DAT6, |
||||
PINGRP_SDMMC4_DAT7, |
||||
PINGRP_SDMMC4_RST_N, |
||||
PINGRP_CAM_MCLK, |
||||
PINGRP_GPIO_PCC1, |
||||
PINGRP_GPIO_PBB0, |
||||
PINGRP_CAM_I2C_SCL, |
||||
PINGRP_CAM_I2C_SDA, |
||||
PINGRP_GPIO_PBB3, |
||||
PINGRP_GPIO_PBB4, |
||||
PINGRP_GPIO_PBB5, |
||||
PINGRP_GPIO_PBB6, |
||||
PINGRP_GPIO_PBB7, |
||||
PINGRP_GPIO_PCC2, |
||||
PINGRP_JTAG_RTCK, |
||||
PINGRP_PWR_I2C_SCL, |
||||
PINGRP_PWR_I2C_SDA, |
||||
PINGRP_KB_ROW0, |
||||
PINGRP_KB_ROW1, |
||||
PINGRP_KB_ROW2, |
||||
PINGRP_KB_ROW3, |
||||
PINGRP_KB_ROW4, |
||||
PINGRP_KB_ROW5, |
||||
PINGRP_KB_ROW6, |
||||
PINGRP_KB_ROW7, |
||||
PINGRP_KB_ROW8, |
||||
PINGRP_KB_ROW9, |
||||
PINGRP_KB_ROW10, |
||||
PINGRP_KB_ROW11, |
||||
PINGRP_KB_ROW12, |
||||
PINGRP_KB_ROW13, |
||||
PINGRP_KB_ROW14, |
||||
PINGRP_KB_ROW15, |
||||
PINGRP_KB_COL0, |
||||
PINGRP_KB_COL1, |
||||
PINGRP_KB_COL2, |
||||
PINGRP_KB_COL3, |
||||
PINGRP_KB_COL4, |
||||
PINGRP_KB_COL5, |
||||
PINGRP_KB_COL6, |
||||
PINGRP_KB_COL7, |
||||
PINGRP_CLK_32K_OUT, |
||||
PINGRP_SYS_CLK_REQ, |
||||
PINGRP_CORE_PWR_REQ, |
||||
PINGRP_CPU_PWR_REQ, |
||||
PINGRP_PWR_INT_N, |
||||
PINGRP_CLK_32K_IN, |
||||
PINGRP_OWR, |
||||
PINGRP_DAP1_FS, |
||||
PINGRP_DAP1_DIN, |
||||
PINGRP_DAP1_DOUT, |
||||
PINGRP_DAP1_SCLK, |
||||
PINGRP_CLK1_REQ, |
||||
PINGRP_CLK1_OUT, |
||||
PINGRP_SPDIF_IN, |
||||
PINGRP_SPDIF_OUT, |
||||
PINGRP_DAP2_FS, |
||||
PINGRP_DAP2_DIN, |
||||
PINGRP_DAP2_DOUT, |
||||
PINGRP_DAP2_SCLK, |
||||
PINGRP_SPI2_MOSI, |
||||
PINGRP_SPI2_MISO, |
||||
PINGRP_SPI2_CS0_N, |
||||
PINGRP_SPI2_SCK, |
||||
PINGRP_SPI1_MOSI, |
||||
PINGRP_SPI1_SCK, |
||||
PINGRP_SPI1_CS0_N, |
||||
PINGRP_SPI1_MISO, |
||||
PINGRP_SPI2_CS1_N, |
||||
PINGRP_SPI2_CS2_N, |
||||
PINGRP_SDMMC3_CLK, |
||||
PINGRP_SDMMC3_CMD, |
||||
PINGRP_SDMMC3_DAT0, |
||||
PINGRP_SDMMC3_DAT1, |
||||
PINGRP_SDMMC3_DAT2, |
||||
PINGRP_SDMMC3_DAT3, |
||||
PINGRP_SDMMC3_DAT4, |
||||
PINGRP_SDMMC3_DAT5, |
||||
PINGRP_SDMMC3_DAT6, |
||||
PINGRP_SDMMC3_DAT7, |
||||
PINGRP_PEX_L0_PRSNT_N, |
||||
PINGRP_PEX_L0_RST_N, |
||||
PINGRP_PEX_L0_CLKREQ_N, |
||||
PINGRP_PEX_WAKE_N, |
||||
PINGRP_PEX_L1_PRSNT_N, |
||||
PINGRP_PEX_L1_RST_N, |
||||
PINGRP_PEX_L1_CLKREQ_N, |
||||
PINGRP_PEX_L2_PRSNT_N, |
||||
PINGRP_PEX_L2_RST_N, |
||||
PINGRP_PEX_L2_CLKREQ_N, |
||||
PINGRP_HDMI_CEC, /* offset 0x33e0 */ |
||||
PINGRP_SDMMC1_WP_N, |
||||
PINGRP_SDMMC3_CD_N, |
||||
PINGRP_SPI1_CS1_N, |
||||
PINGRP_SPI1_CS2_N, |
||||
PINGRP_USB_VBUS_EN0, /* offset 0x33f4 */ |
||||
PINGRP_USB_VBUS_EN1, |
||||
PINGRP_SDMMC3_CLK_LB_IN, |
||||
PINGRP_SDMMC3_CLK_LB_OUT, |
||||
PINGRP_NAND_GMI_CLK_LB, |
||||
PINGRP_RESET_OUT_N, |
||||
PINGRP_COUNT, |
||||
}; |
||||
|
||||
enum pdrive_pingrp { |
||||
PDRIVE_PINGROUP_AO1 = 0, /* offset 0x868 */ |
||||
PDRIVE_PINGROUP_AO2, |
||||
PDRIVE_PINGROUP_AT1, |
||||
PDRIVE_PINGROUP_AT2, |
||||
PDRIVE_PINGROUP_AT3, |
||||
PDRIVE_PINGROUP_AT4, |
||||
PDRIVE_PINGROUP_AT5, |
||||
PDRIVE_PINGROUP_CDEV1, |
||||
PDRIVE_PINGROUP_CDEV2, |
||||
PDRIVE_PINGROUP_CSUS, |
||||
PDRIVE_PINGROUP_DAP1, |
||||
PDRIVE_PINGROUP_DAP2, |
||||
PDRIVE_PINGROUP_DAP3, |
||||
PDRIVE_PINGROUP_DAP4, |
||||
PDRIVE_PINGROUP_DBG, |
||||
PDRIVE_PINGROUP_LCD1, |
||||
PDRIVE_PINGROUP_LCD2, |
||||
PDRIVE_PINGROUP_SDIO2, |
||||
PDRIVE_PINGROUP_SDIO3, |
||||
PDRIVE_PINGROUP_SPI, |
||||
PDRIVE_PINGROUP_UAA, |
||||
PDRIVE_PINGROUP_UAB, |
||||
PDRIVE_PINGROUP_UART2, |
||||
PDRIVE_PINGROUP_UART3, |
||||
PDRIVE_PINGROUP_VI1 = 24, /* offset 0x8c8 */ |
||||
PDRIVE_PINGROUP_SDIO1 = 33, /* offset 0x8ec */ |
||||
PDRIVE_PINGROUP_CRT = 36, /* offset 0x8f8 */ |
||||
PDRIVE_PINGROUP_DDC, |
||||
PDRIVE_PINGROUP_GMA, |
||||
PDRIVE_PINGROUP_GMB, |
||||
PDRIVE_PINGROUP_GMC, |
||||
PDRIVE_PINGROUP_GMD, |
||||
PDRIVE_PINGROUP_GME, |
||||
PDRIVE_PINGROUP_GMF, |
||||
PDRIVE_PINGROUP_GMG, |
||||
PDRIVE_PINGROUP_GMH, |
||||
PDRIVE_PINGROUP_OWR, |
||||
PDRIVE_PINGROUP_UAD, |
||||
PDRIVE_PINGROUP_GPV, |
||||
PDRIVE_PINGROUP_DEV3 = 49, /* offset 0x92c */ |
||||
PDRIVE_PINGROUP_CEC = 52, /* offset 0x938 */ |
||||
PDRIVE_PINGROUP_AT6, |
||||
PDRIVE_PINGROUP_DAP5, |
||||
PDRIVE_PINGROUP_VBUS, |
||||
PDRIVE_PINGROUP_COUNT, |
||||
}; |
||||
|
||||
/*
|
||||
* Functions which can be assigned to each of the pin groups. The values here |
||||
* bear no relation to the values programmed into pinmux registers and are |
||||
* purely a convenience. The translation is done through a table search. |
||||
*/ |
||||
enum pmux_func { |
||||
PMUX_FUNC_AHB_CLK, |
||||
PMUX_FUNC_APB_CLK, |
||||
PMUX_FUNC_AUDIO_SYNC, |
||||
PMUX_FUNC_CRT, |
||||
PMUX_FUNC_DAP1, |
||||
PMUX_FUNC_DAP2, |
||||
PMUX_FUNC_DAP3, |
||||
PMUX_FUNC_DAP4, |
||||
PMUX_FUNC_DAP5, |
||||
PMUX_FUNC_DISPA, |
||||
PMUX_FUNC_DISPB, |
||||
PMUX_FUNC_EMC_TEST0_DLL, |
||||
PMUX_FUNC_EMC_TEST1_DLL, |
||||
PMUX_FUNC_GMI, |
||||
PMUX_FUNC_GMI_INT, |
||||
PMUX_FUNC_HDMI, |
||||
PMUX_FUNC_I2C1, |
||||
PMUX_FUNC_I2C2, |
||||
PMUX_FUNC_I2C3, |
||||
PMUX_FUNC_IDE, |
||||
PMUX_FUNC_KBC, |
||||
PMUX_FUNC_MIO, |
||||
PMUX_FUNC_MIPI_HS, |
||||
PMUX_FUNC_NAND, |
||||
PMUX_FUNC_OSC, |
||||
PMUX_FUNC_OWR, |
||||
PMUX_FUNC_PCIE, |
||||
PMUX_FUNC_PLLA_OUT, |
||||
PMUX_FUNC_PLLC_OUT1, |
||||
PMUX_FUNC_PLLM_OUT1, |
||||
PMUX_FUNC_PLLP_OUT2, |
||||
PMUX_FUNC_PLLP_OUT3, |
||||
PMUX_FUNC_PLLP_OUT4, |
||||
PMUX_FUNC_PWM, |
||||
PMUX_FUNC_PWR_INTR, |
||||
PMUX_FUNC_PWR_ON, |
||||
PMUX_FUNC_RTCK, |
||||
PMUX_FUNC_SDMMC1, |
||||
PMUX_FUNC_SDMMC2, |
||||
PMUX_FUNC_SDMMC3, |
||||
PMUX_FUNC_SDMMC4, |
||||
PMUX_FUNC_SFLASH, |
||||
PMUX_FUNC_SPDIF, |
||||
PMUX_FUNC_SPI1, |
||||
PMUX_FUNC_SPI2, |
||||
PMUX_FUNC_SPI2_ALT, |
||||
PMUX_FUNC_SPI3, |
||||
PMUX_FUNC_SPI4, |
||||
PMUX_FUNC_TRACE, |
||||
PMUX_FUNC_TWC, |
||||
PMUX_FUNC_UARTA, |
||||
PMUX_FUNC_UARTB, |
||||
PMUX_FUNC_UARTC, |
||||
PMUX_FUNC_UARTD, |
||||
PMUX_FUNC_UARTE, |
||||
PMUX_FUNC_ULPI, |
||||
PMUX_FUNC_VI, |
||||
PMUX_FUNC_VI_SENSOR_CLK, |
||||
PMUX_FUNC_XIO, |
||||
PMUX_FUNC_BLINK, |
||||
PMUX_FUNC_CEC, |
||||
PMUX_FUNC_CLK12, |
||||
PMUX_FUNC_DAP, |
||||
PMUX_FUNC_DAPSDMMC2, |
||||
PMUX_FUNC_DDR, |
||||
PMUX_FUNC_DEV3, |
||||
PMUX_FUNC_DTV, |
||||
PMUX_FUNC_VI_ALT1, |
||||
PMUX_FUNC_VI_ALT2, |
||||
PMUX_FUNC_VI_ALT3, |
||||
PMUX_FUNC_EMC_DLL, |
||||
PMUX_FUNC_EXTPERIPH1, |
||||
PMUX_FUNC_EXTPERIPH2, |
||||
PMUX_FUNC_EXTPERIPH3, |
||||
PMUX_FUNC_GMI_ALT, |
||||
PMUX_FUNC_HDA, |
||||
PMUX_FUNC_HSI, |
||||
PMUX_FUNC_I2C4, |
||||
PMUX_FUNC_I2C5, |
||||
PMUX_FUNC_I2CPWR, |
||||
PMUX_FUNC_I2S0, |
||||
PMUX_FUNC_I2S1, |
||||
PMUX_FUNC_I2S2, |
||||
PMUX_FUNC_I2S3, |
||||
PMUX_FUNC_I2S4, |
||||
PMUX_FUNC_NAND_ALT, |
||||
PMUX_FUNC_POPSDIO4, |
||||
PMUX_FUNC_POPSDMMC4, |
||||
PMUX_FUNC_PWM0, |
||||
PMUX_FUNC_PWM1, |
||||
PMUX_FUNC_PWM2, |
||||
PMUX_FUNC_PWM3, |
||||
PMUX_FUNC_SATA, |
||||
PMUX_FUNC_SPI5, |
||||
PMUX_FUNC_SPI6, |
||||
PMUX_FUNC_SYSCLK, |
||||
PMUX_FUNC_VGP1, |
||||
PMUX_FUNC_VGP2, |
||||
PMUX_FUNC_VGP3, |
||||
PMUX_FUNC_VGP4, |
||||
PMUX_FUNC_VGP5, |
||||
PMUX_FUNC_VGP6, |
||||
|
||||
PMUX_FUNC_USB, |
||||
PMUX_FUNC_SOC, |
||||
PMUX_FUNC_CPU, |
||||
PMUX_FUNC_CLK, |
||||
PMUX_FUNC_PWRON, |
||||
PMUX_FUNC_PMI, |
||||
PMUX_FUNC_CLDVFS, |
||||
PMUX_FUNC_RESET_OUT_N, |
||||
|
||||
PMUX_FUNC_SAFE, |
||||
PMUX_FUNC_MAX, |
||||
|
||||
PMUX_FUNC_RSVD1 = 0x8000, |
||||
PMUX_FUNC_RSVD2 = 0x8001, |
||||
PMUX_FUNC_RSVD3 = 0x8002, |
||||
PMUX_FUNC_RSVD4 = 0x8003, |
||||
}; |
||||
|
||||
/* return 1 if a pmux_func is in range */ |
||||
#define pmux_func_isvalid(func) ((((func) >= 0) && ((func) < PMUX_FUNC_MAX)) \ |
||||
|| (((func) >= PMUX_FUNC_RSVD1) && ((func) <= PMUX_FUNC_RSVD4))) |
||||
|
||||
/* return 1 if a pingrp is in range */ |
||||
#define pmux_pingrp_isvalid(pin) (((pin) >= 0) && ((pin) < PINGRP_COUNT)) |
||||
|
||||
/* The pullup/pulldown state of a pin group */ |
||||
enum pmux_pull { |
||||
PMUX_PULL_NORMAL = 0, |
||||
PMUX_PULL_DOWN, |
||||
PMUX_PULL_UP, |
||||
}; |
||||
/* return 1 if a pin_pupd_is in range */ |
||||
#define pmux_pin_pupd_isvalid(pupd) (((pupd) >= PMUX_PULL_NORMAL) && \ |
||||
((pupd) <= PMUX_PULL_UP)) |
||||
|
||||
/* Defines whether a pin group is tristated or in normal operation */ |
||||
enum pmux_tristate { |
||||
PMUX_TRI_NORMAL = 0, |
||||
PMUX_TRI_TRISTATE = 1, |
||||
}; |
||||
/* return 1 if a pin_tristate_is in range */ |
||||
#define pmux_pin_tristate_isvalid(tristate) (((tristate) >= PMUX_TRI_NORMAL) \ |
||||
&& ((tristate) <= PMUX_TRI_TRISTATE)) |
||||
|
||||
enum pmux_pin_io { |
||||
PMUX_PIN_OUTPUT = 0, |
||||
PMUX_PIN_INPUT = 1, |
||||
}; |
||||
/* return 1 if a pin_io_is in range */ |
||||
#define pmux_pin_io_isvalid(io) (((io) >= PMUX_PIN_OUTPUT) && \ |
||||
((io) <= PMUX_PIN_INPUT)) |
||||
|
||||
enum pmux_pin_lock { |
||||
PMUX_PIN_LOCK_DEFAULT = 0, |
||||
PMUX_PIN_LOCK_DISABLE, |
||||
PMUX_PIN_LOCK_ENABLE, |
||||
}; |
||||
/* return 1 if a pin_lock is in range */ |
||||
#define pmux_pin_lock_isvalid(lock) (((lock) >= PMUX_PIN_LOCK_DEFAULT) && \ |
||||
((lock) <= PMUX_PIN_LOCK_ENABLE)) |
||||
|
||||
enum pmux_pin_od { |
||||
PMUX_PIN_OD_DEFAULT = 0, |
||||
PMUX_PIN_OD_DISABLE, |
||||
PMUX_PIN_OD_ENABLE, |
||||
}; |
||||
/* return 1 if a pin_od is in range */ |
||||
#define pmux_pin_od_isvalid(od) (((od) >= PMUX_PIN_OD_DEFAULT) && \ |
||||
((od) <= PMUX_PIN_OD_ENABLE)) |
||||
|
||||
enum pmux_pin_ioreset { |
||||
PMUX_PIN_IO_RESET_DEFAULT = 0, |
||||
PMUX_PIN_IO_RESET_DISABLE, |
||||
PMUX_PIN_IO_RESET_ENABLE, |
||||
}; |
||||
/* return 1 if a pin_ioreset_is in range */ |
||||
#define pmux_pin_ioreset_isvalid(ioreset) \ |
||||
(((ioreset) >= PMUX_PIN_IO_RESET_DEFAULT) && \
|
||||
((ioreset) <= PMUX_PIN_IO_RESET_ENABLE)) |
||||
|
||||
/* Available power domains used by pin groups */ |
||||
enum pmux_vddio { |
||||
PMUX_VDDIO_BB = 0, |
||||
PMUX_VDDIO_LCD, |
||||
PMUX_VDDIO_VI, |
||||
PMUX_VDDIO_UART, |
||||
PMUX_VDDIO_DDR, |
||||
PMUX_VDDIO_NAND, |
||||
PMUX_VDDIO_SYS, |
||||
PMUX_VDDIO_AUDIO, |
||||
PMUX_VDDIO_SD, |
||||
PMUX_VDDIO_CAM, |
||||
PMUX_VDDIO_GMI, |
||||
PMUX_VDDIO_PEXCTL, |
||||
PMUX_VDDIO_SDMMC1, |
||||
PMUX_VDDIO_SDMMC3, |
||||
PMUX_VDDIO_SDMMC4, |
||||
|
||||
PMUX_VDDIO_NONE |
||||
}; |
||||
|
||||
/* T114 pin drive group and pin mux registers */ |
||||
#define PDRIVE_PINGROUP_OFFSET (0x868 >> 2) |
||||
#define PMUX_OFFSET ((0x3000 >> 2) - PDRIVE_PINGROUP_OFFSET - \ |
||||
PDRIVE_PINGROUP_COUNT) |
||||
struct pmux_tri_ctlr { |
||||
uint pmt_reserved0; /* ABP_MISC_PP_ reserved offset 00 */ |
||||
uint pmt_reserved1; /* ABP_MISC_PP_ reserved offset 04 */ |
||||
uint pmt_strap_opt_a; /* _STRAPPING_OPT_A_0, offset 08 */ |
||||
uint pmt_reserved2; /* ABP_MISC_PP_ reserved offset 0C */ |
||||
uint pmt_reserved3; /* ABP_MISC_PP_ reserved offset 10 */ |
||||
uint pmt_reserved4[4]; /* _TRI_STATE_REG_A/B/C/D in t20 */ |
||||
uint pmt_cfg_ctl; /* _CONFIG_CTL_0, offset 24 */ |
||||
|
||||
uint pmt_reserved[528]; /* ABP_MISC_PP_ reserved offs 28-864 */ |
||||
|
||||
uint pmt_drive[PDRIVE_PINGROUP_COUNT]; /* pin drive grps offs 868 */ |
||||
uint pmt_reserved5[PMUX_OFFSET]; |
||||
uint pmt_ctl[PINGRP_COUNT]; /* mux/pupd/tri regs, offset 0x3000 */ |
||||
}; |
||||
|
||||
/*
|
||||
* This defines the configuration for a pin, including the function assigned, |
||||
* pull up/down settings and tristate settings. Having set up one of these |
||||
* you can call pinmux_config_pingroup() to configure a pin in one step. Also |
||||
* available is pinmux_config_table() to configure a list of pins. |
||||
*/ |
||||
struct pingroup_config { |
||||
enum pmux_pingrp pingroup; /* pin group PINGRP_... */ |
||||
enum pmux_func func; /* function to assign FUNC_... */ |
||||
enum pmux_pull pull; /* pull up/down/normal PMUX_PULL_...*/ |
||||
enum pmux_tristate tristate; /* tristate or normal PMUX_TRI_... */ |
||||
enum pmux_pin_io io; /* input or output PMUX_PIN_... */ |
||||
enum pmux_pin_lock lock; /* lock enable/disable PMUX_PIN... */ |
||||
enum pmux_pin_od od; /* open-drain or push-pull driver */ |
||||
enum pmux_pin_ioreset ioreset; /* input/output reset PMUX_PIN... */ |
||||
}; |
||||
|
||||
/* Set a pin group to tristate */ |
||||
void pinmux_tristate_enable(enum pmux_pingrp pin); |
||||
|
||||
/* Set a pin group to normal (non tristate) */ |
||||
void pinmux_tristate_disable(enum pmux_pingrp pin); |
||||
|
||||
/* Set the pull up/down feature for a pin group */ |
||||
void pinmux_set_pullupdown(enum pmux_pingrp pin, enum pmux_pull pupd); |
||||
|
||||
/* Set the mux function for a pin group */ |
||||
void pinmux_set_func(enum pmux_pingrp pin, enum pmux_func func); |
||||
|
||||
/* Set the complete configuration for a pin group */ |
||||
void pinmux_config_pingroup(struct pingroup_config *config); |
||||
|
||||
/* Set a pin group to tristate or normal */ |
||||
void pinmux_set_tristate(enum pmux_pingrp pin, int enable); |
||||
|
||||
/* Set a pin group as input or output */ |
||||
void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io); |
||||
|
||||
/**
|
||||
* Configure a list of pin groups |
||||
* |
||||
* @param config List of config items |
||||
* @param len Number of config items in list |
||||
*/ |
||||
void pinmux_config_table(struct pingroup_config *config, int len); |
||||
|
||||
/* Set a group of pins from a table */ |
||||
void pinmux_init(void); |
||||
|
||||
#endif /* _TEGRA114_PINMUX_H_ */ |
@ -0,0 +1,23 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_PMU_H_ |
||||
#define _TEGRA114_PMU_H_ |
||||
|
||||
/* Set core and CPU voltages to nominal levels */ |
||||
int pmu_set_nominal(void); |
||||
|
||||
#endif /* _TEGRA114_PMU_H_ */ |
@ -0,0 +1,22 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _ASM_ARCH_SPL_H_ |
||||
#define _ASM_ARCH_SPL_H_ |
||||
|
||||
#define BOOT_DEVICE_RAM 1 |
||||
|
||||
#endif |
@ -0,0 +1,33 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2013, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA114_H_ |
||||
#define _TEGRA114_H_ |
||||
|
||||
#define NV_PA_SDRAM_BASE 0x80000000 /* 0x80000000 for real T114 */ |
||||
|
||||
#include <asm/arch-tegra/tegra.h> |
||||
|
||||
#define BCT_ODMDATA_OFFSET 1752 /* offset to ODMDATA word */ |
||||
|
||||
#undef NVBOOTINFOTABLE_BCTSIZE |
||||
#undef NVBOOTINFOTABLE_BCTPTR |
||||
#define NVBOOTINFOTABLE_BCTSIZE 0x48 /* BCT size in BIT in IRAM */ |
||||
#define NVBOOTINFOTABLE_BCTPTR 0x4C /* BCT pointer in BIT in IRAM */ |
||||
|
||||
#define MAX_NUM_CPU 4 |
||||
|
||||
#endif /* TEGRA114_H */ |
@ -0,0 +1,382 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra30 clock PLL tables */ |
||||
|
||||
#ifndef _TEGRA30_CLOCK_TABLES_H_ |
||||
#define _TEGRA30_CLOCK_TABLES_H_ |
||||
|
||||
/* The PLLs supported by the hardware */ |
||||
enum clock_id { |
||||
CLOCK_ID_FIRST, |
||||
CLOCK_ID_CGENERAL = CLOCK_ID_FIRST, |
||||
CLOCK_ID_MEMORY, |
||||
CLOCK_ID_PERIPH, |
||||
CLOCK_ID_AUDIO, |
||||
CLOCK_ID_USB, |
||||
CLOCK_ID_DISPLAY, |
||||
|
||||
/* now the simple ones */ |
||||
CLOCK_ID_FIRST_SIMPLE, |
||||
CLOCK_ID_XCPU = CLOCK_ID_FIRST_SIMPLE, |
||||
CLOCK_ID_EPCI, |
||||
CLOCK_ID_SFROM32KHZ, |
||||
|
||||
/* These are the base clocks (inputs to the Tegra SOC) */ |
||||
CLOCK_ID_32KHZ, |
||||
CLOCK_ID_OSC, |
||||
|
||||
CLOCK_ID_COUNT, /* number of PLLs */ |
||||
CLOCK_ID_DISPLAY2, /* Tegra3, placeholder */ |
||||
CLOCK_ID_NONE = -1, |
||||
}; |
||||
|
||||
/* The clocks supported by the hardware */ |
||||
enum periph_id { |
||||
PERIPH_ID_FIRST, |
||||
|
||||
/* Low word: 31:0 */ |
||||
PERIPH_ID_CPU = PERIPH_ID_FIRST, |
||||
PERIPH_ID_COP, |
||||
PERIPH_ID_TRIGSYS, |
||||
PERIPH_ID_RESERVED3, |
||||
PERIPH_ID_RESERVED4, |
||||
PERIPH_ID_TMR, |
||||
PERIPH_ID_UART1, |
||||
PERIPH_ID_UART2, |
||||
|
||||
/* 8 */ |
||||
PERIPH_ID_GPIO, |
||||
PERIPH_ID_SDMMC2, |
||||
PERIPH_ID_SPDIF, |
||||
PERIPH_ID_I2S1, |
||||
PERIPH_ID_I2C1, |
||||
PERIPH_ID_NDFLASH, |
||||
PERIPH_ID_SDMMC1, |
||||
PERIPH_ID_SDMMC4, |
||||
|
||||
/* 16 */ |
||||
PERIPH_ID_RESERVED16, |
||||
PERIPH_ID_PWM, |
||||
PERIPH_ID_I2S2, |
||||
PERIPH_ID_EPP, |
||||
PERIPH_ID_VI, |
||||
PERIPH_ID_2D, |
||||
PERIPH_ID_USBD, |
||||
PERIPH_ID_ISP, |
||||
|
||||
/* 24 */ |
||||
PERIPH_ID_3D, |
||||
PERIPH_ID_RESERVED24, |
||||
PERIPH_ID_DISP2, |
||||
PERIPH_ID_DISP1, |
||||
PERIPH_ID_HOST1X, |
||||
PERIPH_ID_VCP, |
||||
PERIPH_ID_I2S0, |
||||
PERIPH_ID_CACHE2, |
||||
|
||||
/* Middle word: 63:32 */ |
||||
PERIPH_ID_MEM, |
||||
PERIPH_ID_AHBDMA, |
||||
PERIPH_ID_APBDMA, |
||||
PERIPH_ID_RESERVED35, |
||||
PERIPH_ID_KBC, |
||||
PERIPH_ID_STAT_MON, |
||||
PERIPH_ID_PMC, |
||||
PERIPH_ID_FUSE, |
||||
|
||||
/* 40 */ |
||||
PERIPH_ID_KFUSE, |
||||
PERIPH_ID_SBC1, |
||||
PERIPH_ID_SNOR, |
||||
PERIPH_ID_RESERVED43, |
||||
PERIPH_ID_SBC2, |
||||
PERIPH_ID_RESERVED45, |
||||
PERIPH_ID_SBC3, |
||||
PERIPH_ID_DVC_I2C, |
||||
|
||||
/* 48 */ |
||||
PERIPH_ID_DSI, |
||||
PERIPH_ID_TVO, |
||||
PERIPH_ID_MIPI, |
||||
PERIPH_ID_HDMI, |
||||
PERIPH_ID_CSI, |
||||
PERIPH_ID_TVDAC, |
||||
PERIPH_ID_I2C2, |
||||
PERIPH_ID_UART3, |
||||
|
||||
/* 56 */ |
||||
PERIPH_ID_RESERVED56, |
||||
PERIPH_ID_EMC, |
||||
PERIPH_ID_USB2, |
||||
PERIPH_ID_USB3, |
||||
PERIPH_ID_MPE, |
||||
PERIPH_ID_VDE, |
||||
PERIPH_ID_BSEA, |
||||
PERIPH_ID_BSEV, |
||||
|
||||
/* Upper word 95:64 */ |
||||
PERIPH_ID_SPEEDO, |
||||
PERIPH_ID_UART4, |
||||
PERIPH_ID_UART5, |
||||
PERIPH_ID_I2C3, |
||||
PERIPH_ID_SBC4, |
||||
PERIPH_ID_SDMMC3, |
||||
PERIPH_ID_PCIE, |
||||
PERIPH_ID_OWR, |
||||
|
||||
/* 72 */ |
||||
PERIPH_ID_AFI, |
||||
PERIPH_ID_CORESIGHT, |
||||
PERIPH_ID_PCIEXCLK, |
||||
PERIPH_ID_AVPUCQ, |
||||
PERIPH_ID_RESERVED76, |
||||
PERIPH_ID_RESERVED77, |
||||
PERIPH_ID_RESERVED78, |
||||
PERIPH_ID_DTV, |
||||
|
||||
/* 80 */ |
||||
PERIPH_ID_NANDSPEED, |
||||
PERIPH_ID_I2CSLOW, |
||||
PERIPH_ID_DSIB, |
||||
PERIPH_ID_RESERVED83, |
||||
PERIPH_ID_IRAMA, |
||||
PERIPH_ID_IRAMB, |
||||
PERIPH_ID_IRAMC, |
||||
PERIPH_ID_IRAMD, |
||||
|
||||
/* 88 */ |
||||
PERIPH_ID_CRAM2, |
||||
PERIPH_ID_RESERVED89, |
||||
PERIPH_ID_MDOUBLER, |
||||
PERIPH_ID_RESERVED91, |
||||
PERIPH_ID_SUSOUT, |
||||
PERIPH_ID_RESERVED93, |
||||
PERIPH_ID_RESERVED94, |
||||
PERIPH_ID_RESERVED95, |
||||
|
||||
PERIPH_ID_VW_FIRST, |
||||
/* V word: 31:0 */ |
||||
PERIPH_ID_CPUG = PERIPH_ID_VW_FIRST, |
||||
PERIPH_ID_CPULP, |
||||
PERIPH_ID_3D2, |
||||
PERIPH_ID_MSELECT, |
||||
PERIPH_ID_TSENSOR, |
||||
PERIPH_ID_I2S3, |
||||
PERIPH_ID_I2S4, |
||||
PERIPH_ID_I2C4, |
||||
|
||||
/* 08 */ |
||||
PERIPH_ID_SBC5, |
||||
PERIPH_ID_SBC6, |
||||
PERIPH_ID_AUDIO, |
||||
PERIPH_ID_APBIF, |
||||
PERIPH_ID_DAM0, |
||||
PERIPH_ID_DAM1, |
||||
PERIPH_ID_DAM2, |
||||
PERIPH_ID_HDA2CODEC2X, |
||||
|
||||
/* 16 */ |
||||
PERIPH_ID_ATOMICS, |
||||
PERIPH_ID_EX_RESERVED17, |
||||
PERIPH_ID_EX_RESERVED18, |
||||
PERIPH_ID_EX_RESERVED19, |
||||
PERIPH_ID_EX_RESERVED20, |
||||
PERIPH_ID_EX_RESERVED21, |
||||
PERIPH_ID_EX_RESERVED22, |
||||
PERIPH_ID_ACTMON, |
||||
|
||||
/* 24 */ |
||||
PERIPH_ID_EX_RESERVED24, |
||||
PERIPH_ID_EX_RESERVED25, |
||||
PERIPH_ID_EX_RESERVED26, |
||||
PERIPH_ID_EX_RESERVED27, |
||||
PERIPH_ID_SATA, |
||||
PERIPH_ID_HDA, |
||||
PERIPH_ID_EX_RESERVED30, |
||||
PERIPH_ID_EX_RESERVED31, |
||||
|
||||
/* W word: 31:0 */ |
||||
PERIPH_ID_HDA2HDMICODEC, |
||||
PERIPH_ID_SATACOLD, |
||||
PERIPH_ID_RESERVED0_PCIERX0, |
||||
PERIPH_ID_RESERVED1_PCIERX1, |
||||
PERIPH_ID_RESERVED2_PCIERX2, |
||||
PERIPH_ID_RESERVED3_PCIERX3, |
||||
PERIPH_ID_RESERVED4_PCIERX4, |
||||
PERIPH_ID_RESERVED5_PCIERX5, |
||||
|
||||
/* 40 */ |
||||
PERIPH_ID_CEC, |
||||
PERIPH_ID_RESERVED6_PCIE2, |
||||
PERIPH_ID_RESERVED7_EMC, |
||||
PERIPH_ID_RESERVED8_HDMI, |
||||
PERIPH_ID_RESERVED9_SATA, |
||||
PERIPH_ID_RESERVED10_MIPI, |
||||
PERIPH_ID_EX_RESERVED46, |
||||
PERIPH_ID_EX_RESERVED47, |
||||
|
||||
PERIPH_ID_COUNT, |
||||
PERIPH_ID_NONE = -1, |
||||
}; |
||||
|
||||
enum pll_out_id { |
||||
PLL_OUT1, |
||||
PLL_OUT2, |
||||
PLL_OUT3, |
||||
PLL_OUT4 |
||||
}; |
||||
|
||||
/*
|
||||
* Clock peripheral IDs which sadly don't match up with PERIPH_ID. we want |
||||
* callers to use the PERIPH_ID for all access to peripheral clocks to avoid |
||||
* confusion bewteen PERIPH_ID_... and PERIPHC_... |
||||
* |
||||
* We don't call this CLOCK_PERIPH_ID or PERIPH_CLOCK_ID as it would just be |
||||
* confusing. |
||||
*/ |
||||
enum periphc_internal_id { |
||||
/* 0x00 */ |
||||
PERIPHC_I2S1, |
||||
PERIPHC_I2S2, |
||||
PERIPHC_SPDIF_OUT, |
||||
PERIPHC_SPDIF_IN, |
||||
PERIPHC_PWM, |
||||
PERIPHC_05h, |
||||
PERIPHC_SBC2, |
||||
PERIPHC_SBC3, |
||||
|
||||
/* 0x08 */ |
||||
PERIPHC_08h, |
||||
PERIPHC_I2C1, |
||||
PERIPHC_DVC_I2C, |
||||
PERIPHC_0bh, |
||||
PERIPHC_0ch, |
||||
PERIPHC_SBC1, |
||||
PERIPHC_DISP1, |
||||
PERIPHC_DISP2, |
||||
|
||||
/* 0x10 */ |
||||
PERIPHC_CVE, |
||||
PERIPHC_11h, |
||||
PERIPHC_VI, |
||||
PERIPHC_13h, |
||||
PERIPHC_SDMMC1, |
||||
PERIPHC_SDMMC2, |
||||
PERIPHC_G3D, |
||||
PERIPHC_G2D, |
||||
|
||||
/* 0x18 */ |
||||
PERIPHC_NDFLASH, |
||||
PERIPHC_SDMMC4, |
||||
PERIPHC_VFIR, |
||||
PERIPHC_EPP, |
||||
PERIPHC_MPE, |
||||
PERIPHC_MIPI, |
||||
PERIPHC_UART1, |
||||
PERIPHC_UART2, |
||||
|
||||
/* 0x20 */ |
||||
PERIPHC_HOST1X, |
||||
PERIPHC_21h, |
||||
PERIPHC_TVO, |
||||
PERIPHC_HDMI, |
||||
PERIPHC_24h, |
||||
PERIPHC_TVDAC, |
||||
PERIPHC_I2C2, |
||||
PERIPHC_EMC, |
||||
|
||||
/* 0x28 */ |
||||
PERIPHC_UART3, |
||||
PERIPHC_29h, |
||||
PERIPHC_VI_SENSOR, |
||||
PERIPHC_2bh, |
||||
PERIPHC_2ch, |
||||
PERIPHC_SBC4, |
||||
PERIPHC_I2C3, |
||||
PERIPHC_SDMMC3, |
||||
|
||||
/* 0x30 */ |
||||
PERIPHC_UART4, |
||||
PERIPHC_UART5, |
||||
PERIPHC_VDE, |
||||
PERIPHC_OWR, |
||||
PERIPHC_NOR, |
||||
PERIPHC_CSITE, |
||||
PERIPHC_I2S0, |
||||
PERIPHC_37h, |
||||
|
||||
PERIPHC_VW_FIRST, |
||||
/* 0x38 */ |
||||
PERIPHC_G3D2 = PERIPHC_VW_FIRST, |
||||
PERIPHC_MSELECT, |
||||
PERIPHC_TSENSOR, |
||||
PERIPHC_I2S3, |
||||
PERIPHC_I2S4, |
||||
PERIPHC_I2C4, |
||||
PERIPHC_SBC5, |
||||
PERIPHC_SBC6, |
||||
|
||||
/* 0x40 */ |
||||
PERIPHC_AUDIO, |
||||
PERIPHC_41h, |
||||
PERIPHC_DAM0, |
||||
PERIPHC_DAM1, |
||||
PERIPHC_DAM2, |
||||
PERIPHC_HDA2CODEC2X, |
||||
PERIPHC_ACTMON, |
||||
PERIPHC_EXTPERIPH1, |
||||
|
||||
/* 0x48 */ |
||||
PERIPHC_EXTPERIPH2, |
||||
PERIPHC_EXTPERIPH3, |
||||
PERIPHC_NANDSPEED, |
||||
PERIPHC_I2CSLOW, |
||||
PERIPHC_SYS, |
||||
PERIPHC_SPEEDO, |
||||
PERIPHC_4eh, |
||||
PERIPHC_4fh, |
||||
|
||||
/* 0x50 */ |
||||
PERIPHC_50h, |
||||
PERIPHC_51h, |
||||
PERIPHC_52h, |
||||
PERIPHC_53h, |
||||
PERIPHC_SATAOOB, |
||||
PERIPHC_SATA, |
||||
PERIPHC_HDA, |
||||
|
||||
PERIPHC_COUNT, |
||||
|
||||
PERIPHC_NONE = -1, |
||||
}; |
||||
|
||||
/* Converts a clock number to a clock register: 0=L, 1=H, 2=U, 0=V, 1=W */ |
||||
#define PERIPH_REG(id) \ |
||||
(id < PERIPH_ID_VW_FIRST) ? \
|
||||
((id) >> 5) : ((id - PERIPH_ID_VW_FIRST) >> 5) |
||||
|
||||
/* Mask value for a clock (within PERIPH_REG(id)) */ |
||||
#define PERIPH_MASK(id) (1 << ((id) & 0x1f)) |
||||
|
||||
/* return 1 if a PLL ID is in range */ |
||||
#define clock_id_is_pll(id) ((id) >= CLOCK_ID_FIRST && (id) < CLOCK_ID_COUNT) |
||||
|
||||
/* return 1 if a peripheral ID is in range */ |
||||
#define clock_periph_id_isvalid(id) ((id) >= PERIPH_ID_FIRST && \ |
||||
(id) < PERIPH_ID_COUNT) |
||||
|
||||
#endif /* _TEGRA30_CLOCK_TABLES_H_ */ |
@ -0,0 +1,28 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra30 clock control functions */ |
||||
|
||||
#ifndef _TEGRA30_CLOCK_H_ |
||||
#define _TEGRA30_CLOCK_H_ |
||||
|
||||
#include <asm/arch-tegra/clock.h> |
||||
|
||||
/* CLK_RST_CONTROLLER_OSC_CTRL_0 */ |
||||
#define OSC_FREQ_SHIFT 28 |
||||
#define OSC_FREQ_MASK (0xF << OSC_FREQ_SHIFT) |
||||
|
||||
#endif /* _TEGRA30_CLOCK_H_ */ |
@ -0,0 +1,35 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_FLOW_H_ |
||||
#define _TEGRA30_FLOW_H_ |
||||
|
||||
struct flow_ctlr { |
||||
u32 halt_cpu_events; |
||||
u32 halt_cop_events; |
||||
u32 cpu_csr; |
||||
u32 cop_csr; |
||||
u32 xrq_events; |
||||
u32 halt_cpu1_events; |
||||
u32 cpu1_csr; |
||||
u32 halt_cpu2_events; |
||||
u32 cpu2_csr; |
||||
u32 halt_cpu3_events; |
||||
u32 cpu3_csr; |
||||
u32 cluster_control; |
||||
}; |
||||
|
||||
#endif /* _TEGRA30_FLOW_H_ */ |
@ -0,0 +1,31 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
/* Tegra30 high-level function multiplexing */ |
||||
|
||||
#ifndef _TEGRA30_FUNCMUX_H_ |
||||
#define _TEGRA30_FUNCMUX_H_ |
||||
|
||||
#include <asm/arch-tegra/funcmux.h> |
||||
|
||||
/* Configs supported by the func mux */ |
||||
enum { |
||||
FUNCMUX_DEFAULT = 0, /* default config */ |
||||
|
||||
/* UART configs */ |
||||
FUNCMUX_UART1_ULPI = 0, |
||||
}; |
||||
#endif /* _TEGRA30_FUNCMUX_H_ */ |
@ -0,0 +1,59 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_GP_PADCTRL_H_ |
||||
#define _TEGRA30_GP_PADCTRL_H_ |
||||
|
||||
#include <asm/arch-tegra/gp_padctrl.h> |
||||
|
||||
/* APB_MISC_GP and padctrl registers */ |
||||
struct apb_misc_gp_ctlr { |
||||
u32 modereg; /* 0x00: APB_MISC_GP_MODEREG */ |
||||
u32 hidrev; /* 0x04: APB_MISC_GP_HIDREV */ |
||||
u32 reserved0[22]; /* 0x08 - 0x5C: */ |
||||
u32 emu_revid; /* 0x60: APB_MISC_GP_EMU_REVID */ |
||||
u32 xactor_scratch; /* 0x64: APB_MISC_GP_XACTOR_SCRATCH */ |
||||
u32 aocfg1; /* 0x68: APB_MISC_GP_AOCFG1PADCTRL */ |
||||
u32 aocfg2; /* 0x6c: APB_MISC_GP_AOCFG2PADCTRL */ |
||||
u32 atcfg1; /* 0x70: APB_MISC_GP_ATCFG1PADCTRL */ |
||||
u32 atcfg2; /* 0x74: APB_MISC_GP_ATCFG2PADCTRL */ |
||||
u32 atcfg3; /* 0x78: APB_MISC_GP_ATCFG3PADCTRL */ |
||||
u32 atcfg4; /* 0x7C: APB_MISC_GP_ATCFG4PADCTRL */ |
||||
u32 atcfg5; /* 0x80: APB_MISC_GP_ATCFG5PADCTRL */ |
||||
u32 cdev1cfg; /* 0x84: APB_MISC_GP_CDEV1CFGPADCTRL */ |
||||
u32 cdev2cfg; /* 0x88: APB_MISC_GP_CDEV2CFGPADCTRL */ |
||||
u32 csuscfg; /* 0x8C: APB_MISC_GP_CSUSCFGPADCTRL */ |
||||
u32 dap1cfg; /* 0x90: APB_MISC_GP_DAP1CFGPADCTRL */ |
||||
u32 dap2cfg; /* 0x94: APB_MISC_GP_DAP2CFGPADCTRL */ |
||||
u32 dap3cfg; /* 0x98: APB_MISC_GP_DAP3CFGPADCTRL */ |
||||
u32 dap4cfg; /* 0x9C: APB_MISC_GP_DAP4CFGPADCTRL */ |
||||
u32 dbgcfg; /* 0xA0: APB_MISC_GP_DBGCFGPADCTRL */ |
||||
u32 lcdcfg1; /* 0xA4: APB_MISC_GP_LCDCFG1PADCTRL */ |
||||
u32 lcdcfg2; /* 0xA8: APB_MISC_GP_LCDCFG2PADCTRL */ |
||||
u32 sdio2cfg; /* 0xAC: APB_MISC_GP_SDIO2CFGPADCTRL */ |
||||
u32 sdio3cfg; /* 0xB0: APB_MISC_GP_SDIO3CFGPADCTRL */ |
||||
u32 spicfg; /* 0xB4: APB_MISC_GP_SPICFGPADCTRL */ |
||||
u32 uaacfg; /* 0xB8: APB_MISC_GP_UAACFGPADCTRL */ |
||||
u32 uabcfg; /* 0xBC: APB_MISC_GP_UABCFGPADCTRL */ |
||||
u32 uart2cfg; /* 0xC0: APB_MISC_GP_UART2CFGPADCTRL */ |
||||
u32 uart3cfg; /* 0xC4: APB_MISC_GP_UART3CFGPADCTRL */ |
||||
u32 vicfg1; /* 0xC8: APB_MISC_GP_VICFG1PADCTRL */ |
||||
u32 vivttgen; /* 0xCC: APB_MISC_GP_VIVTTGENPADCTRL */ |
||||
u32 reserved1[7]; /* 0xD0-0xE8: */ |
||||
u32 sdio1cfg; /* 0xEC: APB_MISC_GP_SDIO1CFGPADCTRL */ |
||||
}; |
||||
|
||||
#endif /* _TEGRA30_GP_PADCTRL_H_ */ |
@ -0,0 +1,304 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_GPIO_H_ |
||||
#define _TEGRA30_GPIO_H_ |
||||
|
||||
/*
|
||||
* The Tegra 3x GPIO controller has 246 GPIOS in 8 banks of 4 ports, |
||||
* each with 8 GPIOs. |
||||
*/ |
||||
#define TEGRA_GPIO_PORTS 4 /* number of ports per bank */ |
||||
#define TEGRA_GPIO_BANKS 8 /* number of banks */ |
||||
|
||||
#include <asm/arch-tegra/gpio.h> |
||||
|
||||
/* GPIO Controller registers for a single bank */ |
||||
struct gpio_ctlr_bank { |
||||
uint gpio_config[TEGRA_GPIO_PORTS]; |
||||
uint gpio_dir_out[TEGRA_GPIO_PORTS]; |
||||
uint gpio_out[TEGRA_GPIO_PORTS]; |
||||
uint gpio_in[TEGRA_GPIO_PORTS]; |
||||
uint gpio_int_status[TEGRA_GPIO_PORTS]; |
||||
uint gpio_int_enable[TEGRA_GPIO_PORTS]; |
||||
uint gpio_int_level[TEGRA_GPIO_PORTS]; |
||||
uint gpio_int_clear[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_config[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_dir_out[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_out[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_in[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_int_status[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_int_enable[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_int_level[TEGRA_GPIO_PORTS]; |
||||
uint gpio_masked_int_clear[TEGRA_GPIO_PORTS]; |
||||
}; |
||||
|
||||
struct gpio_ctlr { |
||||
struct gpio_ctlr_bank gpio_bank[TEGRA_GPIO_BANKS]; |
||||
}; |
||||
|
||||
enum gpio_pin { |
||||
GPIO_PA0 = 0, /* pin 0 */ |
||||
GPIO_PA1, |
||||
GPIO_PA2, |
||||
GPIO_PA3, |
||||
GPIO_PA4, |
||||
GPIO_PA5, |
||||
GPIO_PA6, |
||||
GPIO_PA7, |
||||
GPIO_PB0, /* pin 8 */ |
||||
GPIO_PB1, |
||||
GPIO_PB2, |
||||
GPIO_PB3, |
||||
GPIO_PB4, |
||||
GPIO_PB5, |
||||
GPIO_PB6, |
||||
GPIO_PB7, |
||||
GPIO_PC0, /* pin 16 */ |
||||
GPIO_PC1, |
||||
GPIO_PC2, |
||||
GPIO_PC3, |
||||
GPIO_PC4, |
||||
GPIO_PC5, |
||||
GPIO_PC6, |
||||
GPIO_PC7, |
||||
GPIO_PD0, /* pin 24 */ |
||||
GPIO_PD1, |
||||
GPIO_PD2, |
||||
GPIO_PD3, |
||||
GPIO_PD4, |
||||
GPIO_PD5, |
||||
GPIO_PD6, |
||||
GPIO_PD7, |
||||
GPIO_PE0, /* pin 32 */ |
||||
GPIO_PE1, |
||||
GPIO_PE2, |
||||
GPIO_PE3, |
||||
GPIO_PE4, |
||||
GPIO_PE5, |
||||
GPIO_PE6, |
||||
GPIO_PE7, |
||||
GPIO_PF0, /* pin 40 */ |
||||
GPIO_PF1, |
||||
GPIO_PF2, |
||||
GPIO_PF3, |
||||
GPIO_PF4, |
||||
GPIO_PF5, |
||||
GPIO_PF6, |
||||
GPIO_PF7, |
||||
GPIO_PG0, /* pin 48 */ |
||||
GPIO_PG1, |
||||
GPIO_PG2, |
||||
GPIO_PG3, |
||||
GPIO_PG4, |
||||
GPIO_PG5, |
||||
GPIO_PG6, |
||||
GPIO_PG7, |
||||
GPIO_PH0, /* pin 56 */ |
||||
GPIO_PH1, |
||||
GPIO_PH2, |
||||
GPIO_PH3, |
||||
GPIO_PH4, |
||||
GPIO_PH5, |
||||
GPIO_PH6, |
||||
GPIO_PH7, |
||||
GPIO_PI0, /* pin 64 */ |
||||
GPIO_PI1, |
||||
GPIO_PI2, |
||||
GPIO_PI3, |
||||
GPIO_PI4, |
||||
GPIO_PI5, |
||||
GPIO_PI6, |
||||
GPIO_PI7, |
||||
GPIO_PJ0, /* pin 72 */ |
||||
GPIO_PJ1, |
||||
GPIO_PJ2, |
||||
GPIO_PJ3, |
||||
GPIO_PJ4, |
||||
GPIO_PJ5, |
||||
GPIO_PJ6, |
||||
GPIO_PJ7, |
||||
GPIO_PK0, /* pin 80 */ |
||||
GPIO_PK1, |
||||
GPIO_PK2, |
||||
GPIO_PK3, |
||||
GPIO_PK4, |
||||
GPIO_PK5, |
||||
GPIO_PK6, |
||||
GPIO_PK7, |
||||
GPIO_PL0, /* pin 88 */ |
||||
GPIO_PL1, |
||||
GPIO_PL2, |
||||
GPIO_PL3, |
||||
GPIO_PL4, |
||||
GPIO_PL5, |
||||
GPIO_PL6, |
||||
GPIO_PL7, |
||||
GPIO_PM0, /* pin 96 */ |
||||
GPIO_PM1, |
||||
GPIO_PM2, |
||||
GPIO_PM3, |
||||
GPIO_PM4, |
||||
GPIO_PM5, |
||||
GPIO_PM6, |
||||
GPIO_PM7, |
||||
GPIO_PN0, /* pin 104 */ |
||||
GPIO_PN1, |
||||
GPIO_PN2, |
||||
GPIO_PN3, |
||||
GPIO_PN4, |
||||
GPIO_PN5, |
||||
GPIO_PN6, |
||||
GPIO_PN7, |
||||
GPIO_PO0, /* pin 112 */ |
||||
GPIO_PO1, |
||||
GPIO_PO2, |
||||
GPIO_PO3, |
||||
GPIO_PO4, |
||||
GPIO_PO5, |
||||
GPIO_PO6, |
||||
GPIO_PO7, |
||||
GPIO_PP0, /* pin 120 */ |
||||
GPIO_PP1, |
||||
GPIO_PP2, |
||||
GPIO_PP3, |
||||
GPIO_PP4, |
||||
GPIO_PP5, |
||||
GPIO_PP6, |
||||
GPIO_PP7, |
||||
GPIO_PQ0, /* pin 128 */ |
||||
GPIO_PQ1, |
||||
GPIO_PQ2, |
||||
GPIO_PQ3, |
||||
GPIO_PQ4, |
||||
GPIO_PQ5, |
||||
GPIO_PQ6, |
||||
GPIO_PQ7, |
||||
GPIO_PR0, /* pin 136 */ |
||||
GPIO_PR1, |
||||
GPIO_PR2, |
||||
GPIO_PR3, |
||||
GPIO_PR4, |
||||
GPIO_PR5, |
||||
GPIO_PR6, |
||||
GPIO_PR7, |
||||
GPIO_PS0, /* pin 144 */ |
||||
GPIO_PS1, |
||||
GPIO_PS2, |
||||
GPIO_PS3, |
||||
GPIO_PS4, |
||||
GPIO_PS5, |
||||
GPIO_PS6, |
||||
GPIO_PS7, |
||||
GPIO_PT0, /* pin 152 */ |
||||
GPIO_PT1, |
||||
GPIO_PT2, |
||||
GPIO_PT3, |
||||
GPIO_PT4, |
||||
GPIO_PT5, |
||||
GPIO_PT6, |
||||
GPIO_PT7, |
||||
GPIO_PU0, /* pin 160 */ |
||||
GPIO_PU1, |
||||
GPIO_PU2, |
||||
GPIO_PU3, |
||||
GPIO_PU4, |
||||
GPIO_PU5, |
||||
GPIO_PU6, |
||||
GPIO_PU7, |
||||
GPIO_PV0, /* pin 168 */ |
||||
GPIO_PV1, |
||||
GPIO_PV2, |
||||
GPIO_PV3, |
||||
GPIO_PV4, |
||||
GPIO_PV5, |
||||
GPIO_PV6, |
||||
GPIO_PV7, |
||||
GPIO_PW0, /* pin 176 */ |
||||
GPIO_PW1, |
||||
GPIO_PW2, |
||||
GPIO_PW3, |
||||
GPIO_PW4, |
||||
GPIO_PW5, |
||||
GPIO_PW6, |
||||
GPIO_PW7, |
||||
GPIO_PX0, /* pin 184 */ |
||||
GPIO_PX1, |
||||
GPIO_PX2, |
||||
GPIO_PX3, |
||||
GPIO_PX4, |
||||
GPIO_PX5, |
||||
GPIO_PX6, |
||||
GPIO_PX7, |
||||
GPIO_PY0, /* pin 192 */ |
||||
GPIO_PY1, |
||||
GPIO_PY2, |
||||
GPIO_PY3, |
||||
GPIO_PY4, |
||||
GPIO_PY5, |
||||
GPIO_PY6, |
||||
GPIO_PY7, |
||||
GPIO_PZ0, /* pin 200 */ |
||||
GPIO_PZ1, |
||||
GPIO_PZ2, |
||||
GPIO_PZ3, |
||||
GPIO_PZ4, |
||||
GPIO_PZ5, |
||||
GPIO_PZ6, |
||||
GPIO_PZ7, |
||||
GPIO_PAA0, /* pin 208 */ |
||||
GPIO_PAA1, |
||||
GPIO_PAA2, |
||||
GPIO_PAA3, |
||||
GPIO_PAA4, |
||||
GPIO_PAA5, |
||||
GPIO_PAA6, |
||||
GPIO_PAA7, |
||||
GPIO_PBB0, /* pin 216 */ |
||||
GPIO_PBB1, |
||||
GPIO_PBB2, |
||||
GPIO_PBB3, |
||||
GPIO_PBB4, |
||||
GPIO_PBB5, |
||||
GPIO_PBB6, |
||||
GPIO_PBB7, |
||||
GPIO_PCC0, /* pin 224 */ |
||||
GPIO_PCC1, |
||||
GPIO_PCC2, |
||||
GPIO_PCC3, |
||||
GPIO_PCC4, |
||||
GPIO_PCC5, |
||||
GPIO_PCC6, |
||||
GPIO_PCC7, |
||||
GPIO_PDD0, /* pin 232 */ |
||||
GPIO_PDD1, |
||||
GPIO_PDD2, |
||||
GPIO_PDD3, |
||||
GPIO_PDD4, |
||||
GPIO_PDD5, |
||||
GPIO_PDD6, |
||||
GPIO_PDD7, |
||||
GPIO_PEE0, /* pin 240 */ |
||||
GPIO_PEE1, |
||||
GPIO_PEE2, |
||||
GPIO_PEE3, |
||||
GPIO_PEE4, |
||||
GPIO_PEE5, |
||||
GPIO_PEE6, |
||||
GPIO_PEE7, /* pin 247 */ |
||||
}; |
||||
|
||||
#endif /* _TEGRA30_GPIO_H_ */ |
@ -0,0 +1,22 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_HARDWARE_H_ |
||||
#define _TEGRA30_HARDWARE_H_ |
||||
|
||||
/* include tegra specific hardware definitions */ |
||||
|
||||
#endif /* _TEGRA30-HARDWARE_H_ */ |
@ -0,0 +1,603 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_PINMUX_H_ |
||||
#define _TEGRA30_PINMUX_H_ |
||||
|
||||
/*
|
||||
* Pin groups which we adjust. There are three basic attributes of each pin |
||||
* group which use this enum: |
||||
* |
||||
* - function |
||||
* - pullup / pulldown |
||||
* - tristate or normal |
||||
*/ |
||||
enum pmux_pingrp { |
||||
PINGRP_ULPI_DATA0 = 0, /* offset 0x3000 */ |
||||
PINGRP_ULPI_DATA1, |
||||
PINGRP_ULPI_DATA2, |
||||
PINGRP_ULPI_DATA3, |
||||
PINGRP_ULPI_DATA4, |
||||
PINGRP_ULPI_DATA5, |
||||
PINGRP_ULPI_DATA6, |
||||
PINGRP_ULPI_DATA7, |
||||
PINGRP_ULPI_CLK, |
||||
PINGRP_ULPI_DIR, |
||||
PINGRP_ULPI_NXT, |
||||
PINGRP_ULPI_STP, |
||||
PINGRP_DAP3_FS, |
||||
PINGRP_DAP3_DIN, |
||||
PINGRP_DAP3_DOUT, |
||||
PINGRP_DAP3_SCLK, |
||||
PINGRP_GPIO_PV0, |
||||
PINGRP_GPIO_PV1, |
||||
PINGRP_SDMMC1_CLK, |
||||
PINGRP_SDMMC1_CMD, |
||||
PINGRP_SDMMC1_DAT3, |
||||
PINGRP_SDMMC1_DAT2, |
||||
PINGRP_SDMMC1_DAT1, |
||||
PINGRP_SDMMC1_DAT0, |
||||
PINGRP_GPIO_PV2, |
||||
PINGRP_GPIO_PV3, |
||||
PINGRP_CLK2_OUT, |
||||
PINGRP_CLK2_REQ, |
||||
PINGRP_LCD_PWR1, |
||||
PINGRP_LCD_PWR2, |
||||
PINGRP_LCD_SDIN, |
||||
PINGRP_LCD_SDOUT, |
||||
PINGRP_LCD_WR_N, |
||||
PINGRP_LCD_CS0_N, |
||||
PINGRP_LCD_DC0, |
||||
PINGRP_LCD_SCK, |
||||
PINGRP_LCD_PWR0, |
||||
PINGRP_LCD_PCLK, |
||||
PINGRP_LCD_DE, |
||||
PINGRP_LCD_HSYNC, |
||||
PINGRP_LCD_VSYNC, |
||||
PINGRP_LCD_D0, |
||||
PINGRP_LCD_D1, |
||||
PINGRP_LCD_D2, |
||||
PINGRP_LCD_D3, |
||||
PINGRP_LCD_D4, |
||||
PINGRP_LCD_D5, |
||||
PINGRP_LCD_D6, |
||||
PINGRP_LCD_D7, |
||||
PINGRP_LCD_D8, |
||||
PINGRP_LCD_D9, |
||||
PINGRP_LCD_D10, |
||||
PINGRP_LCD_D11, |
||||
PINGRP_LCD_D12, |
||||
PINGRP_LCD_D13, |
||||
PINGRP_LCD_D14, |
||||
PINGRP_LCD_D15, |
||||
PINGRP_LCD_D16, |
||||
PINGRP_LCD_D17, |
||||
PINGRP_LCD_D18, |
||||
PINGRP_LCD_D19, |
||||
PINGRP_LCD_D20, |
||||
PINGRP_LCD_D21, |
||||
PINGRP_LCD_D22, |
||||
PINGRP_LCD_D23, |
||||
PINGRP_LCD_CS1_N, |
||||
PINGRP_LCD_M1, |
||||
PINGRP_LCD_DC1, |
||||
PINGRP_HDMI_INT, |
||||
PINGRP_DDC_SCL, |
||||
PINGRP_DDC_SDA, |
||||
PINGRP_CRT_HSYNC, |
||||
PINGRP_CRT_VSYNC, |
||||
PINGRP_VI_D0, |
||||
PINGRP_VI_D1, |
||||
PINGRP_VI_D2, |
||||
PINGRP_VI_D3, |
||||
PINGRP_VI_D4, |
||||
PINGRP_VI_D5, |
||||
PINGRP_VI_D6, |
||||
PINGRP_VI_D7, |
||||
PINGRP_VI_D8, |
||||
PINGRP_VI_D9, |
||||
PINGRP_VI_D10, |
||||
PINGRP_VI_D11, |
||||
PINGRP_VI_PCLK, |
||||
PINGRP_VI_MCLK, |
||||
PINGRP_VI_VSYNC, |
||||
PINGRP_VI_HSYNC, |
||||
PINGRP_UART2_RXD, |
||||
PINGRP_UART2_TXD, |
||||
PINGRP_UART2_RTS_N, |
||||
PINGRP_UART2_CTS_N, |
||||
PINGRP_UART3_TXD, |
||||
PINGRP_UART3_RXD, |
||||
PINGRP_UART3_CTS_N, |
||||
PINGRP_UART3_RTS_N, |
||||
PINGRP_GPIO_PU0, |
||||
PINGRP_GPIO_PU1, |
||||
PINGRP_GPIO_PU2, |
||||
PINGRP_GPIO_PU3, |
||||
PINGRP_GPIO_PU4, |
||||
PINGRP_GPIO_PU5, |
||||
PINGRP_GPIO_PU6, |
||||
PINGRP_GEN1_I2C_SDA, |
||||
PINGRP_GEN1_I2C_SCL, |
||||
PINGRP_DAP4_FS, |
||||
PINGRP_DAP4_DIN, |
||||
PINGRP_DAP4_DOUT, |
||||
PINGRP_DAP4_SCLK, |
||||
PINGRP_CLK3_OUT, |
||||
PINGRP_CLK3_REQ, |
||||
PINGRP_GMI_WP_N, |
||||
PINGRP_GMI_IORDY, |
||||
PINGRP_GMI_WAIT, |
||||
PINGRP_GMI_ADV_N, |
||||
PINGRP_GMI_CLK, |
||||
PINGRP_GMI_CS0_N, |
||||
PINGRP_GMI_CS1_N, |
||||
PINGRP_GMI_CS2_N, |
||||
PINGRP_GMI_CS3_N, |
||||
PINGRP_GMI_CS4_N, |
||||
PINGRP_GMI_CS6_N, |
||||
PINGRP_GMI_CS7_N, |
||||
PINGRP_GMI_AD0, |
||||
PINGRP_GMI_AD1, |
||||
PINGRP_GMI_AD2, |
||||
PINGRP_GMI_AD3, |
||||
PINGRP_GMI_AD4, |
||||
PINGRP_GMI_AD5, |
||||
PINGRP_GMI_AD6, |
||||
PINGRP_GMI_AD7, |
||||
PINGRP_GMI_AD8, |
||||
PINGRP_GMI_AD9, |
||||
PINGRP_GMI_AD10, |
||||
PINGRP_GMI_AD11, |
||||
PINGRP_GMI_AD12, |
||||
PINGRP_GMI_AD13, |
||||
PINGRP_GMI_AD14, |
||||
PINGRP_GMI_AD15, |
||||
PINGRP_GMI_A16, |
||||
PINGRP_GMI_A17, |
||||
PINGRP_GMI_A18, |
||||
PINGRP_GMI_A19, |
||||
PINGRP_GMI_WR_N, |
||||
PINGRP_GMI_OE_N, |
||||
PINGRP_GMI_DQS, |
||||
PINGRP_GMI_RST_N, |
||||
PINGRP_GEN2_I2C_SCL, |
||||
PINGRP_GEN2_I2C_SDA, |
||||
PINGRP_SDMMC4_CLK, |
||||
PINGRP_SDMMC4_CMD, |
||||
PINGRP_SDMMC4_DAT0, |
||||
PINGRP_SDMMC4_DAT1, |
||||
PINGRP_SDMMC4_DAT2, |
||||
PINGRP_SDMMC4_DAT3, |
||||
PINGRP_SDMMC4_DAT4, |
||||
PINGRP_SDMMC4_DAT5, |
||||
PINGRP_SDMMC4_DAT6, |
||||
PINGRP_SDMMC4_DAT7, |
||||
PINGRP_SDMMC4_RST_N, |
||||
PINGRP_CAM_MCLK, |
||||
PINGRP_GPIO_PCC1, |
||||
PINGRP_GPIO_PBB0, |
||||
PINGRP_CAM_I2C_SCL, |
||||
PINGRP_CAM_I2C_SDA, |
||||
PINGRP_GPIO_PBB3, |
||||
PINGRP_GPIO_PBB4, |
||||
PINGRP_GPIO_PBB5, |
||||
PINGRP_GPIO_PBB6, |
||||
PINGRP_GPIO_PBB7, |
||||
PINGRP_GPIO_PCC2, |
||||
PINGRP_JTAG_RTCK, |
||||
PINGRP_PWR_I2C_SCL, |
||||
PINGRP_PWR_I2C_SDA, |
||||
PINGRP_KB_ROW0, |
||||
PINGRP_KB_ROW1, |
||||
PINGRP_KB_ROW2, |
||||
PINGRP_KB_ROW3, |
||||
PINGRP_KB_ROW4, |
||||
PINGRP_KB_ROW5, |
||||
PINGRP_KB_ROW6, |
||||
PINGRP_KB_ROW7, |
||||
PINGRP_KB_ROW8, |
||||
PINGRP_KB_ROW9, |
||||
PINGRP_KB_ROW10, |
||||
PINGRP_KB_ROW11, |
||||
PINGRP_KB_ROW12, |
||||
PINGRP_KB_ROW13, |
||||
PINGRP_KB_ROW14, |
||||
PINGRP_KB_ROW15, |
||||
PINGRP_KB_COL0, |
||||
PINGRP_KB_COL1, |
||||
PINGRP_KB_COL2, |
||||
PINGRP_KB_COL3, |
||||
PINGRP_KB_COL4, |
||||
PINGRP_KB_COL5, |
||||
PINGRP_KB_COL6, |
||||
PINGRP_KB_COL7, |
||||
PINGRP_CLK_32K_OUT, |
||||
PINGRP_SYS_CLK_REQ, |
||||
PINGRP_CORE_PWR_REQ, |
||||
PINGRP_CPU_PWR_REQ, |
||||
PINGRP_PWR_INT_N, |
||||
PINGRP_CLK_32K_IN, |
||||
PINGRP_OWR, |
||||
PINGRP_DAP1_FS, |
||||
PINGRP_DAP1_DIN, |
||||
PINGRP_DAP1_DOUT, |
||||
PINGRP_DAP1_SCLK, |
||||
PINGRP_CLK1_REQ, |
||||
PINGRP_CLK1_OUT, |
||||
PINGRP_SPDIF_IN, |
||||
PINGRP_SPDIF_OUT, |
||||
PINGRP_DAP2_FS, |
||||
PINGRP_DAP2_DIN, |
||||
PINGRP_DAP2_DOUT, |
||||
PINGRP_DAP2_SCLK, |
||||
PINGRP_SPI2_MOSI, |
||||
PINGRP_SPI2_MISO, |
||||
PINGRP_SPI2_CS0_N, |
||||
PINGRP_SPI2_SCK, |
||||
PINGRP_SPI1_MOSI, |
||||
PINGRP_SPI1_SCK, |
||||
PINGRP_SPI1_CS0_N, |
||||
PINGRP_SPI1_MISO, |
||||
PINGRP_SPI2_CS1_N, |
||||
PINGRP_SPI2_CS2_N, |
||||
PINGRP_SDMMC3_CLK, |
||||
PINGRP_SDMMC3_CMD, |
||||
PINGRP_SDMMC3_DAT0, |
||||
PINGRP_SDMMC3_DAT1, |
||||
PINGRP_SDMMC3_DAT2, |
||||
PINGRP_SDMMC3_DAT3, |
||||
PINGRP_SDMMC3_DAT4, |
||||
PINGRP_SDMMC3_DAT5, |
||||
PINGRP_SDMMC3_DAT6, |
||||
PINGRP_SDMMC3_DAT7, |
||||
PINGRP_PEX_L0_PRSNT_N, |
||||
PINGRP_PEX_L0_RST_N, |
||||
PINGRP_PEX_L0_CLKREQ_N, |
||||
PINGRP_PEX_WAKE_N, |
||||
PINGRP_PEX_L1_PRSNT_N, |
||||
PINGRP_PEX_L1_RST_N, |
||||
PINGRP_PEX_L1_CLKREQ_N, |
||||
PINGRP_PEX_L2_PRSNT_N, |
||||
PINGRP_PEX_L2_RST_N, |
||||
PINGRP_PEX_L2_CLKREQ_N, |
||||
PINGRP_HDMI_CEC, /* offset 0x33e0 */ |
||||
PINGRP_COUNT, |
||||
}; |
||||
|
||||
enum pdrive_pingrp { |
||||
PDRIVE_PINGROUP_AO1 = 0, /* offset 0x868 */ |
||||
PDRIVE_PINGROUP_AO2, |
||||
PDRIVE_PINGROUP_AT1, |
||||
PDRIVE_PINGROUP_AT2, |
||||
PDRIVE_PINGROUP_AT3, |
||||
PDRIVE_PINGROUP_AT4, |
||||
PDRIVE_PINGROUP_AT5, |
||||
PDRIVE_PINGROUP_CDEV1, |
||||
PDRIVE_PINGROUP_CDEV2, |
||||
PDRIVE_PINGROUP_CSUS, |
||||
PDRIVE_PINGROUP_DAP1, |
||||
PDRIVE_PINGROUP_DAP2, |
||||
PDRIVE_PINGROUP_DAP3, |
||||
PDRIVE_PINGROUP_DAP4, |
||||
PDRIVE_PINGROUP_DBG, |
||||
PDRIVE_PINGROUP_LCD1, |
||||
PDRIVE_PINGROUP_LCD2, |
||||
PDRIVE_PINGROUP_SDIO2, |
||||
PDRIVE_PINGROUP_SDIO3, |
||||
PDRIVE_PINGROUP_SPI, |
||||
PDRIVE_PINGROUP_UAA, |
||||
PDRIVE_PINGROUP_UAB, |
||||
PDRIVE_PINGROUP_UART2, |
||||
PDRIVE_PINGROUP_UART3, |
||||
PDRIVE_PINGROUP_VI1 = 24, /* offset 0x8c8 */ |
||||
PDRIVE_PINGROUP_SDIO1 = 33, /* offset 0x8ec */ |
||||
PDRIVE_PINGROUP_CRT = 36, /* offset 0x8f8 */ |
||||
PDRIVE_PINGROUP_DDC, |
||||
PDRIVE_PINGROUP_GMA, |
||||
PDRIVE_PINGROUP_GMB, |
||||
PDRIVE_PINGROUP_GMC, |
||||
PDRIVE_PINGROUP_GMD, |
||||
PDRIVE_PINGROUP_GME, |
||||
PDRIVE_PINGROUP_GMF, |
||||
PDRIVE_PINGROUP_GMG, |
||||
PDRIVE_PINGROUP_GMH, |
||||
PDRIVE_PINGROUP_OWR, |
||||
PDRIVE_PINGROUP_UAD, |
||||
PDRIVE_PINGROUP_GPV, |
||||
PDRIVE_PINGROUP_DEV3 = 49, /* offset 0x92c */ |
||||
PDRIVE_PINGROUP_CEC = 52, /* offset 0x938 */ |
||||
PDRIVE_PINGROUP_COUNT, |
||||
}; |
||||
|
||||
/*
|
||||
* Functions which can be assigned to each of the pin groups. The values here |
||||
* bear no relation to the values programmed into pinmux registers and are |
||||
* purely a convenience. The translation is done through a table search. |
||||
*/ |
||||
enum pmux_func { |
||||
PMUX_FUNC_AHB_CLK, |
||||
PMUX_FUNC_APB_CLK, |
||||
PMUX_FUNC_AUDIO_SYNC, |
||||
PMUX_FUNC_CRT, |
||||
PMUX_FUNC_DAP1, |
||||
PMUX_FUNC_DAP2, |
||||
PMUX_FUNC_DAP3, |
||||
PMUX_FUNC_DAP4, |
||||
PMUX_FUNC_DAP5, |
||||
PMUX_FUNC_DISPA, |
||||
PMUX_FUNC_DISPB, |
||||
PMUX_FUNC_EMC_TEST0_DLL, |
||||
PMUX_FUNC_EMC_TEST1_DLL, |
||||
PMUX_FUNC_GMI, |
||||
PMUX_FUNC_GMI_INT, |
||||
PMUX_FUNC_HDMI, |
||||
PMUX_FUNC_I2C1, |
||||
PMUX_FUNC_I2C2, |
||||
PMUX_FUNC_I2C3, |
||||
PMUX_FUNC_IDE, |
||||
PMUX_FUNC_KBC, |
||||
PMUX_FUNC_MIO, |
||||
PMUX_FUNC_MIPI_HS, |
||||
PMUX_FUNC_NAND, |
||||
PMUX_FUNC_OSC, |
||||
PMUX_FUNC_OWR, |
||||
PMUX_FUNC_PCIE, |
||||
PMUX_FUNC_PLLA_OUT, |
||||
PMUX_FUNC_PLLC_OUT1, |
||||
PMUX_FUNC_PLLM_OUT1, |
||||
PMUX_FUNC_PLLP_OUT2, |
||||
PMUX_FUNC_PLLP_OUT3, |
||||
PMUX_FUNC_PLLP_OUT4, |
||||
PMUX_FUNC_PWM, |
||||
PMUX_FUNC_PWR_INTR, |
||||
PMUX_FUNC_PWR_ON, |
||||
PMUX_FUNC_RTCK, |
||||
PMUX_FUNC_SDMMC1, |
||||
PMUX_FUNC_SDMMC2, |
||||
PMUX_FUNC_SDMMC3, |
||||
PMUX_FUNC_SDMMC4, |
||||
PMUX_FUNC_SFLASH, |
||||
PMUX_FUNC_SPDIF, |
||||
PMUX_FUNC_SPI1, |
||||
PMUX_FUNC_SPI2, |
||||
PMUX_FUNC_SPI2_ALT, |
||||
PMUX_FUNC_SPI3, |
||||
PMUX_FUNC_SPI4, |
||||
PMUX_FUNC_TRACE, |
||||
PMUX_FUNC_TWC, |
||||
PMUX_FUNC_UARTA, |
||||
PMUX_FUNC_UARTB, |
||||
PMUX_FUNC_UARTC, |
||||
PMUX_FUNC_UARTD, |
||||
PMUX_FUNC_UARTE, |
||||
PMUX_FUNC_ULPI, |
||||
PMUX_FUNC_VI, |
||||
PMUX_FUNC_VI_SENSOR_CLK, |
||||
PMUX_FUNC_XIO, |
||||
PMUX_FUNC_BLINK, |
||||
PMUX_FUNC_CEC, |
||||
PMUX_FUNC_CLK12, |
||||
PMUX_FUNC_DAP, |
||||
PMUX_FUNC_DAPSDMMC2, |
||||
PMUX_FUNC_DDR, |
||||
PMUX_FUNC_DEV3, |
||||
PMUX_FUNC_DTV, |
||||
PMUX_FUNC_VI_ALT1, |
||||
PMUX_FUNC_VI_ALT2, |
||||
PMUX_FUNC_VI_ALT3, |
||||
PMUX_FUNC_EMC_DLL, |
||||
PMUX_FUNC_EXTPERIPH1, |
||||
PMUX_FUNC_EXTPERIPH2, |
||||
PMUX_FUNC_EXTPERIPH3, |
||||
PMUX_FUNC_GMI_ALT, |
||||
PMUX_FUNC_HDA, |
||||
PMUX_FUNC_HSI, |
||||
PMUX_FUNC_I2C4, |
||||
PMUX_FUNC_I2C5, |
||||
PMUX_FUNC_I2CPWR, |
||||
PMUX_FUNC_I2S0, |
||||
PMUX_FUNC_I2S1, |
||||
PMUX_FUNC_I2S2, |
||||
PMUX_FUNC_I2S3, |
||||
PMUX_FUNC_I2S4, |
||||
PMUX_FUNC_NAND_ALT, |
||||
PMUX_FUNC_POPSDIO4, |
||||
PMUX_FUNC_POPSDMMC4, |
||||
PMUX_FUNC_PWM0, |
||||
PMUX_FUNC_PWM1, |
||||
PMUX_FUNC_PWM2, |
||||
PMUX_FUNC_PWM3, |
||||
PMUX_FUNC_SATA, |
||||
PMUX_FUNC_SPI5, |
||||
PMUX_FUNC_SPI6, |
||||
PMUX_FUNC_SYSCLK, |
||||
PMUX_FUNC_VGP1, |
||||
PMUX_FUNC_VGP2, |
||||
PMUX_FUNC_VGP3, |
||||
PMUX_FUNC_VGP4, |
||||
PMUX_FUNC_VGP5, |
||||
PMUX_FUNC_VGP6, |
||||
PMUX_FUNC_CLK_12M_OUT, |
||||
PMUX_FUNC_HDCP, |
||||
PMUX_FUNC_TEST, |
||||
PMUX_FUNC_CORE_PWR_REQ, |
||||
PMUX_FUNC_CPU_PWR_REQ, |
||||
PMUX_FUNC_PWR_INT_N, |
||||
PMUX_FUNC_CLK_32K_IN, |
||||
PMUX_FUNC_SAFE, |
||||
|
||||
PMUX_FUNC_MAX, |
||||
|
||||
PMUX_FUNC_RSVD1 = 0x8000, |
||||
PMUX_FUNC_RSVD2 = 0x8001, |
||||
PMUX_FUNC_RSVD3 = 0x8002, |
||||
PMUX_FUNC_RSVD4 = 0x8003, |
||||
}; |
||||
|
||||
/* return 1 if a pmux_func is in range */ |
||||
#define pmux_func_isvalid(func) ((((func) >= 0) && ((func) < PMUX_FUNC_MAX)) \ |
||||
|| (((func) >= PMUX_FUNC_RSVD1) && ((func) <= PMUX_FUNC_RSVD4))) |
||||
|
||||
/* return 1 if a pingrp is in range */ |
||||
#define pmux_pingrp_isvalid(pin) (((pin) >= 0) && ((pin) < PINGRP_COUNT)) |
||||
|
||||
/* The pullup/pulldown state of a pin group */ |
||||
enum pmux_pull { |
||||
PMUX_PULL_NORMAL = 0, |
||||
PMUX_PULL_DOWN, |
||||
PMUX_PULL_UP, |
||||
}; |
||||
/* return 1 if a pin_pupd_is in range */ |
||||
#define pmux_pin_pupd_isvalid(pupd) (((pupd) >= PMUX_PULL_NORMAL) && \ |
||||
((pupd) <= PMUX_PULL_UP)) |
||||
|
||||
/* Defines whether a pin group is tristated or in normal operation */ |
||||
enum pmux_tristate { |
||||
PMUX_TRI_NORMAL = 0, |
||||
PMUX_TRI_TRISTATE = 1, |
||||
}; |
||||
/* return 1 if a pin_tristate_is in range */ |
||||
#define pmux_pin_tristate_isvalid(tristate) (((tristate) >= PMUX_TRI_NORMAL) \ |
||||
&& ((tristate) <= PMUX_TRI_TRISTATE)) |
||||
|
||||
enum pmux_pin_io { |
||||
PMUX_PIN_OUTPUT = 0, |
||||
PMUX_PIN_INPUT = 1, |
||||
}; |
||||
/* return 1 if a pin_io_is in range */ |
||||
#define pmux_pin_io_isvalid(io) (((io) >= PMUX_PIN_OUTPUT) && \ |
||||
((io) <= PMUX_PIN_INPUT)) |
||||
|
||||
enum pmux_pin_lock { |
||||
PMUX_PIN_LOCK_DEFAULT = 0, |
||||
PMUX_PIN_LOCK_DISABLE, |
||||
PMUX_PIN_LOCK_ENABLE, |
||||
}; |
||||
/* return 1 if a pin_lock is in range */ |
||||
#define pmux_pin_lock_isvalid(lock) (((lock) >= PMUX_PIN_LOCK_DEFAULT) && \ |
||||
((lock) <= PMUX_PIN_LOCK_ENABLE)) |
||||
|
||||
enum pmux_pin_od { |
||||
PMUX_PIN_OD_DEFAULT = 0, |
||||
PMUX_PIN_OD_DISABLE, |
||||
PMUX_PIN_OD_ENABLE, |
||||
}; |
||||
/* return 1 if a pin_od is in range */ |
||||
#define pmux_pin_od_isvalid(od) (((od) >= PMUX_PIN_OD_DEFAULT) && \ |
||||
((od) <= PMUX_PIN_OD_ENABLE)) |
||||
|
||||
enum pmux_pin_ioreset { |
||||
PMUX_PIN_IO_RESET_DEFAULT = 0, |
||||
PMUX_PIN_IO_RESET_DISABLE, |
||||
PMUX_PIN_IO_RESET_ENABLE, |
||||
}; |
||||
/* return 1 if a pin_ioreset_is in range */ |
||||
#define pmux_pin_ioreset_isvalid(ioreset) \ |
||||
(((ioreset) >= PMUX_PIN_IO_RESET_DEFAULT) && \
|
||||
((ioreset) <= PMUX_PIN_IO_RESET_ENABLE)) |
||||
|
||||
/* Available power domains used by pin groups */ |
||||
enum pmux_vddio { |
||||
PMUX_VDDIO_BB = 0, |
||||
PMUX_VDDIO_LCD, |
||||
PMUX_VDDIO_VI, |
||||
PMUX_VDDIO_UART, |
||||
PMUX_VDDIO_DDR, |
||||
PMUX_VDDIO_NAND, |
||||
PMUX_VDDIO_SYS, |
||||
PMUX_VDDIO_AUDIO, |
||||
PMUX_VDDIO_SD, |
||||
PMUX_VDDIO_CAM, |
||||
PMUX_VDDIO_GMI, |
||||
PMUX_VDDIO_PEXCTL, |
||||
PMUX_VDDIO_SDMMC1, |
||||
PMUX_VDDIO_SDMMC3, |
||||
PMUX_VDDIO_SDMMC4, |
||||
|
||||
PMUX_VDDIO_NONE |
||||
}; |
||||
|
||||
/* t30 pin drive group and pin mux registers */ |
||||
#define PDRIVE_PINGROUP_OFFSET (0x868 >> 2) |
||||
#define PMUX_OFFSET ((0x3000 >> 2) - PDRIVE_PINGROUP_OFFSET - \ |
||||
PDRIVE_PINGROUP_COUNT) |
||||
struct pmux_tri_ctlr { |
||||
uint pmt_reserved0; /* ABP_MISC_PP_ reserved offset 00 */ |
||||
uint pmt_reserved1; /* ABP_MISC_PP_ reserved offset 04 */ |
||||
uint pmt_strap_opt_a; /* _STRAPPING_OPT_A_0, offset 08 */ |
||||
uint pmt_reserved2; /* ABP_MISC_PP_ reserved offset 0C */ |
||||
uint pmt_reserved3; /* ABP_MISC_PP_ reserved offset 10 */ |
||||
uint pmt_reserved4[4]; /* _TRI_STATE_REG_A/B/C/D in t20 */ |
||||
uint pmt_cfg_ctl; /* _CONFIG_CTL_0, offset 24 */ |
||||
|
||||
uint pmt_reserved[528]; /* ABP_MISC_PP_ reserved offs 28-864 */ |
||||
|
||||
uint pmt_drive[PDRIVE_PINGROUP_COUNT]; /* pin drive grps offs 868 */ |
||||
uint pmt_reserved5[PMUX_OFFSET]; |
||||
uint pmt_ctl[PINGRP_COUNT]; /* mux/pupd/tri regs, offset 0x3000 */ |
||||
}; |
||||
|
||||
/*
|
||||
* This defines the configuration for a pin, including the function assigned, |
||||
* pull up/down settings and tristate settings. Having set up one of these |
||||
* you can call pinmux_config_pingroup() to configure a pin in one step. Also |
||||
* available is pinmux_config_table() to configure a list of pins. |
||||
*/ |
||||
struct pingroup_config { |
||||
enum pmux_pingrp pingroup; /* pin group PINGRP_... */ |
||||
enum pmux_func func; /* function to assign FUNC_... */ |
||||
enum pmux_pull pull; /* pull up/down/normal PMUX_PULL_...*/ |
||||
enum pmux_tristate tristate; /* tristate or normal PMUX_TRI_... */ |
||||
enum pmux_pin_io io; /* input or output PMUX_PIN_... */ |
||||
enum pmux_pin_lock lock; /* lock enable/disable PMUX_PIN... */ |
||||
enum pmux_pin_od od; /* open-drain or push-pull driver */ |
||||
enum pmux_pin_ioreset ioreset; /* input/output reset PMUX_PIN... */ |
||||
}; |
||||
|
||||
/* Set a pin group to tristate */ |
||||
void pinmux_tristate_enable(enum pmux_pingrp pin); |
||||
|
||||
/* Set a pin group to normal (non tristate) */ |
||||
void pinmux_tristate_disable(enum pmux_pingrp pin); |
||||
|
||||
/* Set the pull up/down feature for a pin group */ |
||||
void pinmux_set_pullupdown(enum pmux_pingrp pin, enum pmux_pull pupd); |
||||
|
||||
/* Set the mux function for a pin group */ |
||||
void pinmux_set_func(enum pmux_pingrp pin, enum pmux_func func); |
||||
|
||||
/* Set the complete configuration for a pin group */ |
||||
void pinmux_config_pingroup(struct pingroup_config *config); |
||||
|
||||
/* Set a pin group to tristate or normal */ |
||||
void pinmux_set_tristate(enum pmux_pingrp pin, int enable); |
||||
|
||||
/* Set a pin group as input or output */ |
||||
void pinmux_set_io(enum pmux_pingrp pin, enum pmux_pin_io io); |
||||
|
||||
/**
|
||||
* Configure a list of pin groups |
||||
* |
||||
* @param config List of config items |
||||
* @param len Number of config items in list |
||||
*/ |
||||
void pinmux_config_table(struct pingroup_config *config, int len); |
||||
|
||||
/* Set a group of pins from a table */ |
||||
void pinmux_init(void); |
||||
|
||||
#endif /* _TEGRA30_PINMUX_H_ */ |
@ -0,0 +1,23 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_PMU_H_ |
||||
#define _TEGRA30_PMU_H_ |
||||
|
||||
/* Set core and CPU voltages to nominal levels */ |
||||
int pmu_set_nominal(void); |
||||
|
||||
#endif /* _TEGRA30_PMU_H_ */ |
@ -0,0 +1,28 @@ |
||||
/*
|
||||
* (C) Copyright 2012 |
||||
* NVIDIA Corporation <www.nvidia.com> |
||||
* |
||||
* See file CREDITS for list of people who contributed to this |
||||
* project. |
||||
* |
||||
* 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., 59 Temple Place, Suite 330, Boston, |
||||
* MA 02111-1307 USA |
||||
*/ |
||||
#ifndef _ASM_ARCH_SPL_H_ |
||||
#define _ASM_ARCH_SPL_H_ |
||||
|
||||
#define BOOT_DEVICE_RAM 1 |
||||
|
||||
#endif |
@ -0,0 +1,28 @@ |
||||
/*
|
||||
* Copyright (c) 2010-2012, NVIDIA CORPORATION. All rights reserved. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms and conditions of the GNU General Public License, |
||||
* version 2, as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef _TEGRA30_H_ |
||||
#define _TEGRA30_H_ |
||||
|
||||
#define NV_PA_SDRAM_BASE 0x80000000 /* 0x80000000 for real T30 */ |
||||
|
||||
#include <asm/arch-tegra/tegra.h> |
||||
|
||||
#define BCT_ODMDATA_OFFSET 6116 /* 12 bytes from end of BCT */ |
||||
|
||||
#define MAX_NUM_CPU 4 |
||||
|
||||
#endif /* TEGRA30_H */ |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue