gnss: sirf: force hibernate mode on probe
authorJohan Hovold <johan@kernel.org>
Tue, 22 Jan 2019 17:22:54 +0000 (18:22 +0100)
committerJohan Hovold <johan@kernel.org>
Fri, 25 Jan 2019 09:58:54 +0000 (10:58 +0100)
Make sure to put the receiver in hibernate mode in case it is already
active during probe in order to avoid wasting power until first open or
suspend.

This can happen, for example, after a reset or non-clean shutdown, and
possibly also due to glitches during power-on.

Reported-by: Andreas Kemnade <andreas@kemnade.info>
Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/gnss/sirf.c

index 8e3f6a776e02e13a60242c2b71f884eecd7eedaa..f9a9d00dec9896d11442206c673ae26bb6411c02 100644 (file)
@@ -320,6 +320,11 @@ static int sirf_probe(struct serdev_device *serdev)
        }
 
        if (data->wakeup) {
+               ret = gpiod_get_value_cansleep(data->wakeup);
+               if (ret < 0)
+                       goto err_disable_vcc;
+               data->active = ret;
+
                ret = gpiod_to_irq(data->wakeup);
                if (ret < 0)
                        goto err_disable_vcc;
@@ -332,6 +337,18 @@ static int sirf_probe(struct serdev_device *serdev)
                        goto err_disable_vcc;
        }
 
+       if (data->on_off) {
+               /* Force hibernate mode if already active. */
+               if (data->active) {
+                       ret = sirf_set_active(data, false);
+                       if (ret) {
+                               dev_err(dev, "failed to set hibernate mode: %d\n",
+                                               ret);
+                               goto err_free_irq;
+                       }
+               }
+       }
+
        if (IS_ENABLED(CONFIG_PM)) {
                pm_runtime_set_suspended(dev);  /* clear runtime_error flag */
                pm_runtime_enable(dev);