summaryrefslogtreecommitdiff
path: root/drivers/misc/c55_ctrl.c
diff options
context:
space:
mode:
authorJee Su Chang <w20740@motorola.com>2014-06-06 15:43:44 -0500
committerJee Su Chang <w20740@motorola.com>2014-06-06 21:16:01 +0000
commit9b120e326fa6bdbe283d43260d5baec223f2344d (patch)
treef333bdc29d80aae4c8365833bb64714a75948d72 /drivers/misc/c55_ctrl.c
parenteba38cd199268a657fa2928e29626704cc9cc8c2 (diff)
downloadolio-linux-3.10-9b120e326fa6bdbe283d43260d5baec223f2344d.tar.xz
olio-linux-3.10-9b120e326fa6bdbe283d43260d5baec223f2344d.zip
IKXCLOCK-1967 C55: Ensure C55 is OFF when going into suspend
Change-Id: Iaee645f750625bcb541420f02c4dd66ffe4987c3
Diffstat (limited to 'drivers/misc/c55_ctrl.c')
-rw-r--r--drivers/misc/c55_ctrl.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/misc/c55_ctrl.c b/drivers/misc/c55_ctrl.c
index 9b5bf2587cb..f5bf3f4216d 100644
--- a/drivers/misc/c55_ctrl.c
+++ b/drivers/misc/c55_ctrl.c
@@ -361,8 +361,33 @@ static int c55_ctrl_remove(struct platform_device *pdev)
static int c55_ctrl_suspend(struct platform_device *dev, pm_message_t state)
{
struct c55_ctrl_data *cdata = dev_get_drvdata(&dev->dev);
+ struct m4sensorhub_data *m4sensorhub = m4sensorhub_client_get_drvdata();
+
+ if (cdata->c55_mode != C55_OFF) {
+ dev_warn(&dev->dev, "C55 still ON when going into suspend\n");
- pinctrl_select_state(cdata->pctrl, cdata->states[C55_OFF]);
+ /* Disable C55->AP IRQ when turning off C55 */
+ if (cdata->c55_ap_int_enabled) {
+ disable_irq_nosync(
+ __gpio_to_irq(cdata->c55_ap_int_gpio));
+ cdata->c55_ap_int_enabled = 0;
+ }
+
+ if (m4sensorhub_reg_write_1byte
+ (m4sensorhub, M4SH_REG_USERSETTINGS_SCREENSTATUS, 0x00, 0xFF
+ ) != 1) {
+ dev_err(&dev->dev,
+ "Unable to set screen status to 0x00\n");
+ }
+
+ /* AP->C55 interrupt needs to be set low when C55 is off
+ * for current drain reasons */
+ gpio_set_value(cdata->ap_c55_int_gpio, 0);
+
+ pinctrl_select_state(cdata->pctrl, cdata->states[C55_OFF]);
+
+ cdata->c55_mode = C55_OFF;
+ }
return 0;
}