platform: msm_shared: Add device tree selection for pmic info

Add support to select device tree base on pmic info(pmic model and
pmic major&minor). So change the parse logic to match updated table
of device tree image format.

LK logic starts with comparing best match in the following order,
it contains exact match and best match:

Exact match for LK:
1. Platform id --> contains msm id & foundry ID
	a. MSM ID
	b. Foundry ID. look for exact match, if not found choose
	device tree with foundry-id(0x0)
2. Platform subtype --> Subtype for the board
3. Platform type , hw_id --> CDP/MTP board type
4. HLOS subtype --> Such as DDR type (as of now we have only one)
5. Pmic model
Exact match items are in same priority since it cannot be accepted if
one of them cannot match

Best match for LK:
1. Soc version
2. Board major+minor
3. Pmic0 major+minor
4. Pmic1 major+minor
5. Pmic2 major+minor
6. Pmic3 major+minor
The priority order of best match is 1 > 2 > 3 > 4 > 5 > 6, so soc version
take the highest priority, pmic3 major+minor takes the least priority.

Change-Id: If1c34867844cbc29a1471c9d275fbf996387fbf1
diff --git a/platform/msm_shared/board.c b/platform/msm_shared/board.c
index 5c7dee8..fdc8553 100644
--- a/platform/msm_shared/board.c
+++ b/platform/msm_shared/board.c
@@ -50,6 +50,7 @@
 	unsigned int board_info_len = 0;
 	unsigned ret = 0;
 	unsigned format = 0;
+	unsigned pmic_type = 0;
 	uint8_t i;
 	uint16_t format_major = 0;
 	uint16_t format_minor = 0;
@@ -131,6 +132,17 @@
 			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;
+
+				/*
+				 * fill in pimc_board_info with pmic type and pmic version information
+				 * bit no  		  	    |31  24   | 23  16 	    | 15   8 	     |7		  0|
+				 * pimc_board_info = |Unused | Major version | Minor version|PMIC_MODEL|
+				 *
+				 */
+				pmic_type = board_info_v8.pmic_info[i].pmic_type == PMIC_IS_INVALID? 0 : board_info_v8.pmic_info[i].pmic_type;
+
+				board.pmic_info[i].pmic_target = (((board_info_v8.pmic_info[i].pmic_version >> 16) & 0xff) << 16) |
+					   ((board_info_v8.pmic_info[i].pmic_version & 0xff) << 8) | (pmic_type & 0xff);
 			}
 
 			if (format_minor == 0x9)
@@ -195,12 +207,21 @@
 	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->pmic_target = board.pmic_info[i].pmic_target;
 		info++;
 	}
 
 	return (i--);
 }
 
+uint32_t board_pmic_target(uint8_t num_ent)
+{
+	if (num_ent < SMEM_MAX_PMIC_DEVICES) {
+		return board.pmic_info[num_ent].pmic_target;
+	}
+	return 0;
+}
+
 uint32_t board_soc_version()
 {
 	return board.platform_version;