summaryrefslogtreecommitdiff
path: root/drivers/misc/c55_ctrl.c
diff options
context:
space:
mode:
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;
}