Merge "apq8064: Add support for pm8917"
diff --git a/platform/msm8960/gpio.c b/platform/msm8960/gpio.c
index c185ca6..58a582b 100644
--- a/platform/msm8960/gpio.c
+++ b/platform/msm8960/gpio.c
@@ -206,46 +206,68 @@
 	PM8XXX_GPIO_OUTPUT(PM_GPIO(9), 0),
 };
 
+/* pm8917 GPIO configuration for APQ8064 keypad */
+static struct pm8xxx_gpio_init pm8917_keypad_gpios_apq[] = {
+	/* keys GPIOs */
+	PM8XXX_GPIO_INPUT(PM_GPIO(35), PM_GPIO_PULL_UP_31_5),
+	PM8XXX_GPIO_INPUT(PM_GPIO(30), PM_GPIO_PULL_UP_31_5),
+	PM8XXX_GPIO_OUTPUT(PM_GPIO(9), 0),
+};
+
+
 void msm8960_keypad_gpio_init()
 {
-		int i = 0;
-		int num = 0;
+	int i = 0;
+	int num = 0;
 
-		num = ARRAY_SIZE(pm8921_keypad_gpios);
+	num = ARRAY_SIZE(pm8921_keypad_gpios);
 
-		for(i=0; i < num; i++)
-		{
-			pm8921_gpio_config(pm8921_keypad_gpios[i].gpio,
-								&(pm8921_keypad_gpios[i].config));
-		}
+	for(i=0; i < num; i++)
+	{
+		pm8921_gpio_config(pm8921_keypad_gpios[i].gpio,
+							&(pm8921_keypad_gpios[i].config));
+	}
 }
 
 void msm8930_keypad_gpio_init()
 {
-		int i = 0;
-		int num = 0;
+	int i = 0;
+	int num = 0;
 
-		num = ARRAY_SIZE(pm8038_keypad_gpios);
+	num = ARRAY_SIZE(pm8038_keypad_gpios);
 
-		for(i=0; i < num; i++)
-		{
-			pm8921_gpio_config(pm8038_keypad_gpios[i].gpio,
-								&(pm8038_keypad_gpios[i].config));
-		}
+	for(i=0; i < num; i++)
+	{
+		pm8921_gpio_config(pm8038_keypad_gpios[i].gpio,
+							&(pm8038_keypad_gpios[i].config));
+	}
 }
 
 void apq8064_keypad_gpio_init()
 {
-		int i = 0;
-		int num = 0;
+	int i = 0;
+	int num = 0;
+	struct pm8xxx_gpio_init *gpio_array;
+	uint32_t pmic_type;
 
+	pmic_type = board_pmic_type();
+
+	if (pmic_type == PMIC_IS_PM8917)
+	{
+		num = ARRAY_SIZE(pm8917_keypad_gpios_apq);
+		gpio_array = pm8917_keypad_gpios_apq;
+	}
+	else
+	{
 		num = ARRAY_SIZE(pm8921_keypad_gpios_apq);
+		gpio_array = pm8921_keypad_gpios_apq;
+	}
 
-		for(i=0; i < num; i++)
-		{
-			pm8921_gpio_config(pm8921_keypad_gpios_apq[i].gpio,
-								&(pm8921_keypad_gpios_apq[i].config));
-		}
+	for(i = 0; i < num; i++)
+	{
+		pm8921_gpio_config(gpio_array[i].gpio,
+							&(gpio_array[i].config));
+	}
 }
 
 #define PM8921_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
diff --git a/platform/msm_shared/board.c b/platform/msm_shared/board.c
index 5bc9996..ae0f4c4 100644
--- a/platform/msm_shared/board.c
+++ b/platform/msm_shared/board.c
@@ -36,7 +36,9 @@
 	HW_PLATFORM_UNKNOWN,
 	HW_PLATFORM_SUBTYPE_UNKNOWN,
 	LINUX_MACHTYPE_UNKNOWN,
-	BASEBAND_MSM};
+	BASEBAND_MSM,
+	PMIC_IS_INVALID,
+	0};
 
 static void platform_detect()
 {
@@ -78,7 +80,8 @@
 		board.platform = board_info_v7.board_info_v3.msm_id;
 		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;
 	}
 	else
 	{
@@ -113,3 +116,13 @@
 {
 	return board.platform_hw;
 }
+
+uint32_t board_pmic_type()
+{
+	return board.pmic_type;
+}
+
+uint32_t board_pmic_ver()
+{
+	return board.pmic_version;
+}
diff --git a/platform/msm_shared/include/board.h b/platform/msm_shared/include/board.h
index 9aca934..9869b5b 100644
--- a/platform/msm_shared/include/board.h
+++ b/platform/msm_shared/include/board.h
@@ -38,6 +38,8 @@
 	uint32_t platform_subtype;
 	uint32_t target;
 	uint32_t baseband;
+	uint32_t pmic_type;
+	uint32_t pmic_version;
 };
 
 void board_init();
@@ -47,5 +49,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();
 
 #endif
diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h
index 9c44436..5fb5099 100644
--- a/platform/msm_shared/smem.h
+++ b/platform/msm_shared/smem.h
@@ -89,7 +89,9 @@
    PMIC_IS_PM8014,
    PMIC_IS_PM8821,
    PMIC_IS_PM8038,
-   PMIC_IS_INVALID,
+   PMIC_IS_PM8922,
+   PMIC_IS_PM8917,
+   PMIC_IS_INVALID = 0xffffffff,
 } pm_model_type;
 
 struct smem_board_info_v3 {
diff --git a/target/msm8960/keypad.c b/target/msm8960/keypad.c
index e63a449..e331606 100644
--- a/target/msm8960/keypad.c
+++ b/target/msm8960/keypad.c
@@ -35,6 +35,8 @@
 #include <dev/pm8921.h>
 #include <platform/gpio.h>
 #include <sys/types.h>
+#include <board.h>
+#include <smem.h>
 
 #define BITS_IN_ELEMENT(x) (sizeof(x) * 8)
 #define KEYMAP_INDEX(row, col) (row)* BITS_IN_ELEMENT(unsigned int) + (col)
@@ -82,15 +84,28 @@
 	[KEYMAP_INDEX(0, 1)] = KEY_VOLUMEDOWN,	/* Volume key on the device/CDP */
 };
 
-unsigned int apq8064_keys_gpiomap[] = {
+unsigned int apq8064_pm8921_keys_gpiomap[] = {
 	[KEYMAP_INDEX(0, 0)] = PM_GPIO(35),	/* Volume key on the device/CDP */
 	[KEYMAP_INDEX(0, 1)] = PM_GPIO(38),	/* Volume key on the device/CDP */
 };
 
+unsigned int apq8064_pm8917_keys_gpiomap[] = {
+	[KEYMAP_INDEX(0, 0)] = PM_GPIO(35),	/* Volume key on the device/CDP */
+	[KEYMAP_INDEX(0, 1)] = PM_GPIO(30),	/* Volume key on the device/CDP */
+};
 
-struct qwerty_keypad_info apq8064_qwerty_keypad = {
+struct qwerty_keypad_info apq8064_pm8921_qwerty_keypad = {
 	.keymap = apq8064_qwerty_keymap,
-	.gpiomap = apq8064_keys_gpiomap,
+	.gpiomap = apq8064_pm8921_keys_gpiomap,
+	.mapsize = ARRAY_SIZE(apq8064_qwerty_keymap),
+	.key_gpio_get = &pm8921_gpio_get,
+	.settle_time = 5 /* msec */ ,
+	.poll_time = 20 /* msec */ ,
+};
+
+struct qwerty_keypad_info apq8064_pm8917_qwerty_keypad = {
+	.keymap = apq8064_qwerty_keymap,
+	.gpiomap = apq8064_pm8917_keys_gpiomap,
 	.mapsize = ARRAY_SIZE(apq8064_qwerty_keymap),
 	.key_gpio_get = &pm8921_gpio_get,
 	.settle_time = 5 /* msec */ ,
@@ -111,8 +126,14 @@
 
 void apq8064_keypad_init(void)
 {
+	uint32_t pm_type = board_pmic_type();
+
 	apq8064_keypad_gpio_init();
-	ssbi_gpio_keypad_init(&apq8064_qwerty_keypad);
+
+	if (pm_type == PMIC_IS_PM8917)
+		ssbi_gpio_keypad_init(&apq8064_pm8917_qwerty_keypad);
+	else
+		ssbi_gpio_keypad_init(&apq8064_pm8921_qwerty_keypad);
 }
 
 /* Configure keypad_drv through pwm or DBUS inputs or manually */