[msm8660]: Add support to read status of specific GPIO pins for PM8058
Change-Id: I88ef878186ac741eb15323d8f7af1f0cb10b028c
CRs-Fixed: 275455
diff --git a/platform/msm8x60/pmic.c b/platform/msm8x60/pmic.c
index 24c044e..1dd0c23 100755
--- a/platform/msm8x60/pmic.c
+++ b/platform/msm8x60/pmic.c
@@ -32,6 +32,12 @@
#include <platform/iomap.h>
#include <platform/pmic.h>
+#define TRUE 1
+#define FALSE 0
+
+#define PM_IRQ_ID_TO_BLOCK_INDEX(id) (uint8_t)(id / 8)
+#define PM_IRQ_ID_TO_BIT_MASK(id) (uint8_t)(1 << (id % 8))
+
typedef int (*pm8058_write_func) (unsigned char *, unsigned short,
unsigned short);
extern int pa1_ssbi2_write_bytes(unsigned char *buffer, unsigned short length,
@@ -48,6 +54,43 @@
}
+int pm8058_get_gpio_status( pm_sec_gpio_irq_id_type gpio_irq, bool *rt_status)
+{
+ unsigned block_index, reg_data, reg_mask;
+ int errFlag;
+
+ block_index = PM_IRQ_ID_TO_BLOCK_INDEX(gpio_irq);
+
+ /* select the irq block */
+ errFlag =pa1_ssbi2_write_bytes(&block_index,1,IRQ_BLOCK_SEL_USR_ADDR);
+ if(errFlag)
+ {
+ dprintf(INFO,"Device Timeout");
+ return 1;
+ }
+
+ /* read real time status */
+ errFlag =pa1_ssbi2_read_bytes(®_data,1,IRQ_STATUS_RT_USR_ADDR);
+ if(errFlag)
+ {
+ dprintf(INFO,"Device Timeout");
+ return 1;
+ }
+ reg_mask = PM_IRQ_ID_TO_BIT_MASK(gpio_irq);
+
+ if ((reg_data & reg_mask) == reg_mask )
+ {
+ /* The RT Status is high. */
+ *rt_status = TRUE;
+ }
+ else
+ {
+ /* The RT Status is low. */
+ *rt_status = FALSE;
+ }
+ return 0;
+}
+
/*PM8901*/
extern int pa2_ssbi2_write_bytes(unsigned char *buffer, unsigned short length,
unsigned short slave_addr);