diff options
| author | Jee Su Chang <w20740@motorola.com> | 2014-06-06 15:43:44 -0500 |
|---|---|---|
| committer | Jee Su Chang <w20740@motorola.com> | 2014-06-06 21:16:01 +0000 |
| commit | 9b120e326fa6bdbe283d43260d5baec223f2344d (patch) | |
| tree | f333bdc29d80aae4c8365833bb64714a75948d72 /drivers/misc/c55_ctrl.c | |
| parent | eba38cd199268a657fa2928e29626704cc9cc8c2 (diff) | |
| download | olio-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.c | 27 |
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; } |