greybus: arche-platform: Add wake detect state based on functionality
authorVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Wed, 24 Feb 2016 23:07:35 +0000 (04:37 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 26 Feb 2016 00:24:23 +0000 (16:24 -0800)
If driver needs to process wake/detect events from SVC, by enabling
interrupt support on wake/detect event, it becomes easier to maintain
state of wake/detect line based on functionality.

Testing Done: Tested on DB3.5 platform.

Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
Reviewed-by: Michael Scott <michael.scott@linaro.org>
Tested-by: Michael Scott <michael.scott@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/arche-platform.c

index 50991a6..dcc3844 100644 (file)
 
 #include <linux/usb/usb3613.h>
 
+enum svc_wakedetect_state {
+       WD_STATE_IDLE,                  /* Default state = pulled high/low */
+       WD_STATE_BOOT_INIT,             /* WD = falling edge (low) */
+       WD_STATE_COLDBOOT_TRIG,         /* WD = rising edge (high), > 30msec */
+       WD_STATE_STANDBYBOOT_TRIG,      /* As of now not used ?? */
+       WD_STATE_COLDBOOT_START,        /* Cold boot process started */
+       WD_STATE_STANDBYBOOT_START,     /* Not used */
+};
+
 struct arche_platform_drvdata {
        /* Control GPIO signals to and from AP <=> SVC */
        int svc_reset_gpio;
@@ -39,6 +48,8 @@ struct arche_platform_drvdata {
        int num_apbs;
 
        struct delayed_work delayed_work;
+       enum svc_wakedetect_state wake_detect_state;
+
        struct device *dev;
 };
 
@@ -145,6 +156,7 @@ static void arche_platform_poweroff_seq(struct arche_platform_drvdata *arche_pda
                /* Send disconnect/detach event to SVC */
                gpio_set_value(arche_pdata->wake_detect_gpio, 0);
                usleep_range(100, 200);
+               arche_pdata->wake_detect_state = WD_STATE_IDLE;
 
                clk_disable_unprepare(arche_pdata->svc_ref_clk);
        }
@@ -328,6 +340,7 @@ static int arche_platform_probe(struct platform_device *pdev)
        }
        /* deassert wake detect */
        gpio_direction_output(arche_pdata->wake_detect_gpio, 0);
+       arche_pdata->wake_detect_state = WD_STATE_IDLE;
 
        arche_pdata->dev = &pdev->dev;