Commit 4ceda5f6 authored by Johan Hovold's avatar Johan Hovold

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: default avatarAndreas Kemnade <andreas@kemnade.info>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent 82f844c2
...@@ -320,6 +320,11 @@ static int sirf_probe(struct serdev_device *serdev) ...@@ -320,6 +320,11 @@ static int sirf_probe(struct serdev_device *serdev)
} }
if (data->wakeup) { 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); ret = gpiod_to_irq(data->wakeup);
if (ret < 0) if (ret < 0)
goto err_disable_vcc; goto err_disable_vcc;
...@@ -332,6 +337,18 @@ static int sirf_probe(struct serdev_device *serdev) ...@@ -332,6 +337,18 @@ static int sirf_probe(struct serdev_device *serdev)
goto err_disable_vcc; 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)) { if (IS_ENABLED(CONFIG_PM)) {
pm_runtime_set_suspended(dev); /* clear runtime_error flag */ pm_runtime_set_suspended(dev); /* clear runtime_error flag */
pm_runtime_enable(dev); pm_runtime_enable(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment