msm_shared: board: Add support for pmic info api

Add support for the pmic info Api, as per the new format
of smem info

Change-Id: I22aef9b81efdf9bcd297a2d06889072650d450d4
diff --git a/platform/msm_shared/board.c b/platform/msm_shared/board.c
index 220c6d3..58bf4a3 100644
--- a/platform/msm_shared/board.c
+++ b/platform/msm_shared/board.c
@@ -33,21 +33,23 @@
 #include <baseband.h>
 
 static struct board_data board = {UNKNOWN,
+	0,
 	HW_PLATFORM_UNKNOWN,
 	HW_PLATFORM_SUBTYPE_UNKNOWN,
 	LINUX_MACHTYPE_UNKNOWN,
 	BASEBAND_MSM,
-	PMIC_IS_INVALID,
-	0,
-	0};
+	{{PMIC_IS_INVALID, 0}, {PMIC_IS_INVALID, 0}, {PMIC_IS_INVALID, 0}},
+};
 
 static void platform_detect()
 {
 	struct smem_board_info_v6 board_info_v6;
 	struct smem_board_info_v7 board_info_v7;
+	struct smem_board_info_v8 board_info_v8;
 	unsigned int board_info_len = 0;
 	unsigned ret = 0;
 	unsigned format = 0;
+	uint8_t i;
 
 	ret = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
 						   &format, sizeof(format), 0);
@@ -83,8 +85,28 @@
 		board.platform_version = board_info_v7.board_info_v3.msm_version;
 		board.platform_hw = board_info_v7.board_info_v3.hw_platform;
 		board.platform_subtype = board_info_v7.platform_subtype;
-		board.pmic_type = board_info_v7.pmic_type;
-		board.pmic_version = board_info_v7.pmic_version;
+		board.pmic_info[0].pmic_type = board_info_v7.pmic_type;
+		board.pmic_info[0].pmic_version = board_info_v7.pmic_version;
+	}
+	else if (format == 8)
+	{
+		board_info_len = sizeof(board_info_v8);
+
+		ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
+				&board_info_v8,
+				board_info_len);
+		if (ret)
+			return;
+
+		board.platform = board_info_v8.board_info_v3.msm_id;
+		board.platform_version = board_info_v8.board_info_v3.msm_version;
+		board.platform_hw = board_info_v8.board_info_v3.hw_platform;
+		board.platform_subtype = board_info_v8.platform_subtype;
+
+		for (i = 0; i < SMEM_V8_SMEM_MAX_PMIC_DEVICES; i++) {
+			board.pmic_info[i].pmic_type = board_info_v8.pmic_info[i].pmic_type;
+			board.pmic_info[i].pmic_version = board_info_v8.pmic_info[i].pmic_version;
+		}
 	}
 	else
 	{
@@ -120,14 +142,17 @@
 	return board.platform_hw;
 }
 
-uint32_t board_pmic_type()
+uint8_t board_pmic_info(struct board_pmic_data *info, uint8_t num_ent)
 {
-	return board.pmic_type;
-}
+	uint8_t i;
 
-uint32_t board_pmic_ver()
-{
-	return board.pmic_version;
+	for (i = 0; i < num_ent && i < SMEM_MAX_PMIC_DEVICES; i++) {
+		info->pmic_type = board.pmic_info[i].pmic_type;
+		info->pmic_version = board.pmic_info[i].pmic_version;
+		info++;
+	}
+
+	return (i--);
 }
 
 uint32_t board_soc_version()
diff --git a/platform/msm_shared/include/board.h b/platform/msm_shared/include/board.h
index 7ede8ee..f863a26 100644
--- a/platform/msm_shared/include/board.h
+++ b/platform/msm_shared/include/board.h
@@ -30,8 +30,16 @@
 #ifndef __BOARD_H
 #define __BOARD_H
 
+#include <smem.h>
+
 #define LINUX_MACHTYPE_UNKNOWN 0
 #define BOARD_SOC_VERSION2     0x20000
+#define MAX_PMIC_DEVICES       SMEM_MAX_PMIC_DEVICES
+
+struct board_pmic_data {
+	uint32_t pmic_type;
+	uint32_t pmic_version;
+};
 
 struct board_data {
 	uint32_t platform;
@@ -40,8 +48,7 @@
 	uint32_t platform_subtype;
 	uint32_t target;
 	uint32_t baseband;
-	uint32_t pmic_type;
-	uint32_t pmic_version;
+	struct board_pmic_data pmic_info[MAX_PMIC_DEVICES];
 };
 
 void board_init();
@@ -51,8 +58,7 @@
 uint32_t board_target_id();
 uint32_t board_baseband();
 uint32_t board_hardware_id();
-uint32_t board_pmic_type();
-uint32_t board_pmic_ver();
+uint8_t board_pmic_info(struct board_pmic_data *, uint8_t num_ent);
 uint32_t board_soc_version();
 
 #endif