summaryrefslogtreecommitdiff
path: root/drivers/gnss/sirf.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2019-01-22 18:22:54 +0100
committerJohan Hovold <johan@kernel.org>2019-01-25 10:58:54 +0100
commit4ceda5f654c350faa5b80f89625673a882735a54 (patch)
tree3609e6eb5f6445b27ae891d0f16b8ca0e5f87c92 /drivers/gnss/sirf.c
parent82f844c22588bf47132c82faeda50b6db473162c (diff)
gnss: sirf: force hibernate mode on probe
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>
Diffstat (limited to 'drivers/gnss/sirf.c')
-rw-r--r--drivers/gnss/sirf.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/gnss/sirf.c b/drivers/gnss/sirf.c
index 8e3f6a776e02..f9a9d00dec98 100644
--- a/drivers/gnss/sirf.c
+++ b/drivers/gnss/sirf.c
@@ -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);