From 8723626dd9fcee629ddbd4d96d6d910b2301422d Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 2 Apr 2012 13:18:54 +0000 Subject: tegra: Set up PMU for Nvidia boards Adjust PMU to permit maximum frequency operation. Signed-off-by: Simon Glass Signed-off-by: Tom Warren --- board/nvidia/common/board.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'board/nvidia/common/board.c') diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c index 85dd359ec9..640b9c4475 100644 --- a/board/nvidia/common/board.c +++ b/board/nvidia/common/board.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #include @@ -81,6 +83,10 @@ int board_init(void) #error "You must define CONFIG_SYS_I2C_INIT_BOARD to use i2c on Nvidia boards" #endif i2c_init_board(); +# ifdef CONFIG_TEGRA_PMU + if (pmu_set_nominal()) + debug("Failed to select nominal voltages\n"); +# endif #endif #ifdef CONFIG_USB_EHCI_TEGRA -- cgit v1.2.3 From 67ac5797adb1fad3b027058100cd6fa58c5b6cb6 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 2 Apr 2012 13:18:57 +0000 Subject: tegra: Set up warmboot code on Nvidia boards Call the function to put warmboot boot in a suitable place for resume. Signed-off-by: Simon Glass Signed-off-by: Tom Warren --- board/nvidia/common/board.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'board/nvidia/common/board.c') diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c index 640b9c4475..b82e61a692 100644 --- a/board/nvidia/common/board.c +++ b/board/nvidia/common/board.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -94,6 +95,11 @@ int board_init(void) board_usb_init(gd->fdt_blob); #endif +#ifdef CONFIG_TEGRA2_LP0 + /* prepare the WB code to LP0 location */ + warmboot_prepare_code(TEGRA_LP0_ADDR, TEGRA_LP0_SIZE); +#endif + return 0; } -- cgit v1.2.3 From 5aff021c61fffa9f6a58038db98e8dc29598813b Mon Sep 17 00:00:00 2001 From: Wei Ni Date: Mon, 2 Apr 2012 13:18:58 +0000 Subject: tegra: Turn off power detect in board init Tegra core power rail has leakage voltage around 0.2V while system in suspend mode. The source of the leakage should be coming from PMC power detect logic for IO rails power detection. That can be disabled by writing a '0' to PWR_DET_LATCH followed by writing '0' to PWR_DET (APBDEV_PMC_PWR_DET_0). Signed-off-by: Simon Glass Signed-off-by: Tom Warren --- board/nvidia/common/board.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'board/nvidia/common/board.c') diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c index b82e61a692..1d6b002702 100644 --- a/board/nvidia/common/board.c +++ b/board/nvidia/common/board.c @@ -61,6 +61,21 @@ void __pin_mux_usb(void) void pin_mux_usb(void) __attribute__((weak, alias("__pin_mux_usb"))); +/* + * Routine: power_det_init + * Description: turn off power detects + */ +static void power_det_init(void) +{ +#if defined(CONFIG_TEGRA2) + struct pmc_ctlr *const pmc = (struct pmc_ctlr *)TEGRA2_PMC_BASE; + + /* turn off power detects */ + writel(0, &pmc->pmc_pwr_det_latch); + writel(0, &pmc->pmc_pwr_det); +#endif +} + /* * Routine: board_init * Description: Early hardware init. @@ -79,6 +94,9 @@ int board_init(void) #endif /* boot param addr */ gd->bd->bi_boot_params = (NV_PA_SDRAM_BASE + 0x100); + + power_det_init(); + #ifdef CONFIG_TEGRA_I2C #ifndef CONFIG_SYS_I2C_INIT_BOARD #error "You must define CONFIG_SYS_I2C_INIT_BOARD to use i2c on Nvidia boards" -- cgit v1.2.3 From c5b34a29acb17343479ace6219e8ae55677a9a26 Mon Sep 17 00:00:00 2001 From: Jimmy Zhang Date: Tue, 10 Apr 2012 05:17:06 +0000 Subject: tegra: Add EMC settings for Seaboard Set Seaboard to optimal memory settings based on the SOC in use (T20 or T25). Signed-off-by: Simon Glass Acked-by: Stephen Warren Signed-off-by: Jimmy Zhang Signed-off-by: Tom Warren --- board/nvidia/common/Makefile | 1 + board/nvidia/common/board.c | 14 ++++++++++-- board/nvidia/common/emc.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ board/nvidia/common/emc.h | 29 ++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 board/nvidia/common/emc.c create mode 100644 board/nvidia/common/emc.h (limited to 'board/nvidia/common/board.c') diff --git a/board/nvidia/common/Makefile b/board/nvidia/common/Makefile index 3e748fdd20..a93d4583e7 100644 --- a/board/nvidia/common/Makefile +++ b/board/nvidia/common/Makefile @@ -27,6 +27,7 @@ LIB = $(obj)lib$(VENDOR).o COBJS-y += board.o COBJS-$(CONFIG_SPI_UART_SWITCH) += uart-spi-switch.o +COBJS-$(CONFIG_TEGRA_CLOCK_SCALING) += emc.o COBJS := $(COBJS-y) SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c index 1d6b002702..2e22133591 100644 --- a/board/nvidia/common/board.c +++ b/board/nvidia/common/board.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +41,7 @@ #include #include #include "board.h" +#include "emc.h" DECLARE_GLOBAL_DATA_PTR; @@ -82,6 +85,8 @@ static void power_det_init(void) */ int board_init(void) { + __maybe_unused int err; + /* Do clocks and UART first so that printf() works */ clock_init(); clock_verify(); @@ -105,8 +110,13 @@ int board_init(void) # ifdef CONFIG_TEGRA_PMU if (pmu_set_nominal()) debug("Failed to select nominal voltages\n"); -# endif -#endif +# ifdef CONFIG_TEGRA_CLOCK_SCALING + err = board_emc_init(); + if (err) + debug("Memory controller init failed: %d\n", err); +# endif +# endif /* CONFIG_TEGRA_PMU */ +#endif /* CONFIG_TEGRA_I2C */ #ifdef CONFIG_USB_EHCI_TEGRA pin_mux_usb(); diff --git a/board/nvidia/common/emc.c b/board/nvidia/common/emc.c new file mode 100644 index 0000000000..8e4290ceed --- /dev/null +++ b/board/nvidia/common/emc.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * 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 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* These rates are hard-coded for now, until fdt provides them */ +#define EMC_SDRAM_RATE_T20 (333000 * 2 * 1000) +#define EMC_SDRAM_RATE_T25 (380000 * 2 * 1000) + +int board_emc_init(void) +{ + unsigned rate; + + switch (tegra_get_chip_type()) { + default: + case TEGRA_SOC_T20: + rate = EMC_SDRAM_RATE_T20; + break; + case TEGRA_SOC_T25: + rate = EMC_SDRAM_RATE_T25; + break; + } + return tegra_set_emc(gd->fdt_blob, rate); +} diff --git a/board/nvidia/common/emc.h b/board/nvidia/common/emc.h new file mode 100644 index 0000000000..ec1b115f45 --- /dev/null +++ b/board/nvidia/common/emc.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * (C) Copyright 2010,2011 NVIDIA Corporation + * + * 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 _NVIDIA_EMC_H_ +#define _NVIDIA_EMC_H_ + +int board_emc_init(void); + +#endif -- cgit v1.2.3