diff options
-rw-r--r-- | arch/arm/cpu/armv7/tegra-common/ap20.c | 43 | ||||
-rw-r--r-- | arch/arm/cpu/armv7/tegra-common/clock.c | 1 | ||||
-rw-r--r-- | arch/arm/include/asm/arch-tegra/ap20.h | 11 | ||||
-rw-r--r-- | arch/arm/include/asm/arch-tegra/tegra.h | 6 | ||||
-rw-r--r-- | board/nvidia/common/board.c | 33 | ||||
-rw-r--r-- | board/nvidia/common/board.h | 1 | ||||
-rw-r--r-- | board/nvidia/common/emc.c | 4 | ||||
-rw-r--r-- | board/nvidia/common/pmu.c | 2 |
8 files changed, 59 insertions, 42 deletions
diff --git a/arch/arm/cpu/armv7/tegra-common/ap20.c b/arch/arm/cpu/armv7/tegra-common/ap20.c index 787b3e4b3bc..913d8aaa778 100644 --- a/arch/arm/cpu/armv7/tegra-common/ap20.c +++ b/arch/arm/cpu/armv7/tegra-common/ap20.c @@ -23,18 +23,18 @@ #include <common.h> #include <asm/io.h> +#include <asm/arch/clock.h> +#include <asm/arch/pinmux.h> #include <asm/arch/tegra.h> +#include <asm/arch-tegra/ap20.h> #include <asm/arch-tegra/bitfield.h> #include <asm/arch-tegra/clk_rst.h> #include <asm/arch-tegra/flow.h> -#include <asm/arch/clock.h> +#include <asm/arch-tegra/fuse.h> +#include <asm/arch-tegra/i2c.h> #include <asm/arch-tegra/pmc.h> -#include <asm/arch/pinmux.h> #include <asm/arch-tegra/scu.h> -#include <asm/arch-tegra/i2c.h> #include <asm/arch-tegra/warmboot.h> -#include <asm/arch-tegra/ap20.h> -#include "../../../../../board/nvidia/common/board.h" struct clk_pll_table { u16 n; @@ -94,6 +94,39 @@ enum tegra_family_t { #define GP_HIDREV 0x804 +int tegra_get_chip_type(void) +{ + struct fuse_regs *fuse = (struct fuse_regs *)NV_PA_FUSE_BASE; + uint tegra_sku_id; + + tegra_sku_id = readl(&fuse->sku_info) & 0xff; + + switch (tegra_sku_id) { + case SKU_ID_T20: + return TEGRA_SOC_T20; + case SKU_ID_T25SE: + case SKU_ID_AP25: + case SKU_ID_T25: + case SKU_ID_AP25E: + case SKU_ID_T25E: + return TEGRA_SOC_T25; + case SKU_ID_T30: + /* + * T30 has two options. We will return TEGRA_SOC_T30 until + * we have the fdt set up when it may change to + * TEGRA_SOC_T30_408MHZ depending on what we set PLLP to. + */ + if (clock_get_rate(CLOCK_ID_PERIPH) == 408000000) + return TEGRA_SOC_T30_408MHZ; + else + return TEGRA_SOC_T30; + + default: + /* unknown sku id */ + return TEGRA_SOC_UNKNOWN; + } +} + static enum tegra_family_t ap20_get_family(void) { u32 reg, chip_id; diff --git a/arch/arm/cpu/armv7/tegra-common/clock.c b/arch/arm/cpu/armv7/tegra-common/clock.c index 65f74fcbc4b..1334df21c77 100644 --- a/arch/arm/cpu/armv7/tegra-common/clock.c +++ b/arch/arm/cpu/armv7/tegra-common/clock.c @@ -1398,4 +1398,5 @@ void clock_init(void) 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("Chip type = %d\n", tegra_get_chip_type()); } diff --git a/arch/arm/include/asm/arch-tegra/ap20.h b/arch/arm/include/asm/arch-tegra/ap20.h index 0bc239977b1..6c1e57eea31 100644 --- a/arch/arm/include/asm/arch-tegra/ap20.h +++ b/arch/arm/include/asm/arch-tegra/ap20.h @@ -118,3 +118,14 @@ void ap20_init_pllx(int slow); * @return number of CPUs (1-4) */ int ap20_get_num_cpus(void); + +/** + * Works out the SOC type used for clocks settings + * + * Note that T30 will return TEGRA_SOC_T30 until we have the fdt set up, + * when it may change to TEGRA_SOC_T30_408MHZ depending on what we set PLLP + * to. + * + * @return SOC type - see TEGRA_SOC... + */ +int tegra_get_chip_type(void); diff --git a/arch/arm/include/asm/arch-tegra/tegra.h b/arch/arm/include/asm/arch-tegra/tegra.h index 3820918c04f..b7119c00b0d 100644 --- a/arch/arm/include/asm/arch-tegra/tegra.h +++ b/arch/arm/include/asm/arch-tegra/tegra.h @@ -89,6 +89,12 @@ enum { SKU_ID_T30 = 0x81, /* TBD use real Cardhu value */ }; +/* + * These are used to distinguish SOC types for setting up clocks. Mostly + * we can tell the clocking required by looking at the SOC sku_id, but + * for T30 it is a user option as to whether to run PLLP in fast or slow + * mode, so we have two options there. + */ enum { TEGRA_SOC_T20, TEGRA_SOC_T25, diff --git a/board/nvidia/common/board.c b/board/nvidia/common/board.c index 7d0f9c9236e..599d082e4dc 100644 --- a/board/nvidia/common/board.c +++ b/board/nvidia/common/board.c @@ -26,8 +26,6 @@ #include <asm/clocks.h> #include <asm/io.h> -#include <asm/arch-tegra/fuse.h> - /* TBD: bring these over when Tegra3 is ready, then remove these #ifdefs */ #include <asm/arch-tegra/bitfield.h> #include <asm/arch-tegra/clk_rst.h> @@ -393,37 +391,6 @@ int board_mmc_init(bd_t *bd) } #endif -int tegra_get_chip_type(void) -{ - uint tegra_sku_id; - - struct fuse_regs *fuse = (struct fuse_regs *)NV_PA_FUSE_BASE; - - tegra_sku_id = readl(&fuse->sku_info) & 0xff; - - switch (tegra_sku_id) { - case SKU_ID_T20: - return TEGRA_SOC_T20; - case SKU_ID_T25SE: - case SKU_ID_AP25: - case SKU_ID_T25: - case SKU_ID_AP25E: - case SKU_ID_T25E: - return TEGRA_SOC_T25; - case SKU_ID_T30: -#ifdef CONFIG_SYS_PLLP_BASE_IS_408MHZ - return TEGRA_SOC_T30_408MHZ; -#else - return TEGRA_SOC_T30; -#endif - - default: - /* unknown sku id */ - return TEGRA_SOC_UNKNOWN; - } -} - - /* * Possible UART locations: we ignore UARTC at 0x70006200 and UARTE at * 0x70006400, since we don't have code to init them diff --git a/board/nvidia/common/board.h b/board/nvidia/common/board.h index 9ad9a731f50..67048fe369c 100644 --- a/board/nvidia/common/board.h +++ b/board/nvidia/common/board.h @@ -30,6 +30,5 @@ void gpio_config_mmc(void); int tegra_mmc_init(const void *blob); void lcd_early_init(const void *blob); int lcd_pinmux_early_init(const void *blob); -int tegra_get_chip_type(void); #endif /* BOARD_H */ diff --git a/board/nvidia/common/emc.c b/board/nvidia/common/emc.c index 53d6711ff4e..c74837aa3aa 100644 --- a/board/nvidia/common/emc.c +++ b/board/nvidia/common/emc.c @@ -6,13 +6,13 @@ #include <common.h> #include <asm/io.h> +#include <asm/arch-tegra/ap20.h> #include <asm/arch-tegra/bitfield.h> +#include <asm/arch-tegra/clk_rst.h> #include <asm/arch/tegra.h> #include <asm/arch/sys_proto.h> -#include <asm/arch-tegra/clk_rst.h> #include <asm/arch/clock.h> #include <asm/arch/emc.h> -#include "board.h" #include "pmu.h" static const struct tegra_emc_table *tegra_emc_table; diff --git a/board/nvidia/common/pmu.c b/board/nvidia/common/pmu.c index 266d2c5cc61..0ff3167a8cd 100644 --- a/board/nvidia/common/pmu.c +++ b/board/nvidia/common/pmu.c @@ -28,9 +28,9 @@ #include <asm/arch/sys_proto.h> #include <asm/arch/pmu.h> +#include <asm/arch-tegra/ap20.h> #include <asm/arch-tegra/pmc.h> #include <i2c.h> -#include "board.h" #include "pmu.h" /* |