diff options
author | Nitin Kumbhar <nkumbhar@nvidia.com> | 2010-12-10 15:16:37 +0530 |
---|---|---|
committer | Bharat Nihalani <bnihalani@nvidia.com> | 2010-12-14 04:16:40 -0800 |
commit | 3f5b985d676191a5e47ef3847e93fcbd6935af4b (patch) | |
tree | cab2d878c2f6ce3eca2d6d021cff598979ac9605 /arch | |
parent | 144065eea12d4750b83de547fabbe25ad8bc7dfb (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.
Change-Id: Iacbc2f12562008908bf46ff85ea3064f31245e4c
Reviewed-on: http://git-master/r/12552
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
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 04f1538b1a37..8a25cf664e8d 100644 --- a/arch/arm/mach-tegra/board.h +++ b/arch/arm/mach-tegra/board.h @@ -47,4 +47,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 a4b72dca2303..a602d05d3461 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c @@ -51,6 +51,14 @@ unsigned long tegra_lp0_vec_start; unsigned long tegra_lp0_vec_size; unsigned long tegra_grhost_aperture; +static struct board_info tegra_board_info = { + .board_id = -1, + .sku = -1, + .fab = -1, + .major_revision = -1, + .minor_revision = -1, +}; + void (*tegra_reset)(char mode, const char *cmd); static __initdata struct tegra_clk_init_table common_clk_init_table[] = { @@ -170,6 +178,56 @@ static int __init tegra_lp0_vec_arg(char *options) } early_param("lp0_vec", tegra_lp0_vec_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 |