summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2010-12-10 15:16:37 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:41:55 -0800
commit637ced4998739267fb9eca41951e9126a098be0e (patch)
tree72fffea4392fffcc307e751508e32aebb1b092ae /arch
parentf31853e7ec325ed79ef9ccd737fa464446c1efcd (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.h18
-rw-r--r--arch/arm/mach-tegra/common.c58
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