diff options
author | Nitin Kumbhar <nkumbhar@nvidia.com> | 2010-12-10 15:16:37 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:41:55 -0800 |
commit | 637ced4998739267fb9eca41951e9126a098be0e (patch) | |
tree | 72fffea4392fffcc307e751508e32aebb1b092ae /arch | |
parent | f31853e7ec325ed79ef9ccd737fa464446c1efcd (diff) |
tegra: add an api to get board info
Bootloader can pass "board_info" as kernel parameter to specify
board's id, sku, fab, major_revision and minor_revision. Based
on this parameter, an api is provided to fetch board information.
Original-Change-Id: Iacbc2f12562008908bf46ff85ea3064f31245e4c
Reviewed-on: http://git-master/r/12552
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
Rebase-Id: R333efe8d8ca0602bd064708b03d51b89b399cb2a
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-tegra/board.h | 18 | ||||
-rw-r--r-- | arch/arm/mach-tegra/common.c | 58 |
2 files changed, 76 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h index 2a2c193fcc9c..ba0891351a65 100644 --- a/arch/arm/mach-tegra/board.h +++ b/arch/arm/mach-tegra/board.h @@ -50,4 +50,22 @@ extern unsigned long tegra_lp0_vec_size; extern unsigned long tegra_grhost_aperture; extern struct sys_timer tegra_timer; + +enum board_fab { + BOARD_FAB_A = 0, + BOARD_FAB_B, + BOARD_FAB_C, + BOARD_FAB_D, +}; + +struct board_info { + u16 board_id; + u16 sku; + u8 fab; + u8 major_revision; + u8 minor_revision; +}; + +void tegra_get_board_info(struct board_info *); + #endif diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 58119781d297..b162244f07ad 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -67,6 +67,14 @@ void tegra_assert_system_reset(char mode, const char *cmd) writel_relaxed(reg, reset); } +static struct board_info tegra_board_info = { + .board_id = -1, + .sku = -1, + .fab = -1, + .major_revision = -1, + .minor_revision = -1, +}; + static __initdata struct tegra_clk_init_table common_clk_init_table[] = { /* name parent rate enabled */ { "clk_m", NULL, 0, true }, @@ -180,6 +188,56 @@ static int __init tegra_bootloader_fb_arg(char *options) } early_param("tegra_fbmem", tegra_bootloader_fb_arg); +static int __init tegra_board_info_parse(char *info) +{ + char *p; + int pos = 0; + struct board_info *bi = &tegra_board_info; + + while (info && *info) { + if ((p = strchr(info, ':'))) + *p++ = '\0'; + + if (strlen(info) > 0) { + switch(pos) { + case 0: + bi->board_id = simple_strtol(info, NULL, 16); + break; + case 1: + bi->sku = simple_strtol(info, NULL, 16); + break; + case 2: + bi->fab = simple_strtol(info, NULL, 16); + break; + case 3: + bi->major_revision = simple_strtol(info, NULL, 16); + break; + case 4: + bi->minor_revision = simple_strtol(info, NULL, 16); + break; + default: + break; + } + } + + info = p; + pos++; + } + + pr_info("board info: Id:%d%2d SKU:%d Fab:%d Rev:%c MinRev:%d\n", + bi->board_id >> 8 & 0xFF, bi->board_id & 0xFF, + bi->sku, bi->fab, bi->major_revision, bi->minor_revision); + + return 1; +} + +__setup("board_info=", tegra_board_info_parse); + +void tegra_get_board_info(struct board_info *bi) +{ + memcpy(bi, &tegra_board_info, sizeof(*bi)); +} + /* * Tegra has a protected aperture that prevents access by most non-CPU * memory masters to addresses above the aperture value. Enabling it |