summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorNitin Kumbhar <nkumbhar@nvidia.com>2010-12-10 15:16:37 +0530
committerBharat Nihalani <bnihalani@nvidia.com>2010-12-14 04:16:40 -0800
commit3f5b985d676191a5e47ef3847e93fcbd6935af4b (patch)
treecab2d878c2f6ce3eca2d6d021cff598979ac9605 /arch
parent144065eea12d4750b83de547fabbe25ad8bc7dfb (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.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 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