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 */