1
0
Fork 0

gnss: sirf: add a separate supply for a lna

Devices might have a separate lna between antenna input of the gps
chip and the antenna which might have a separate supply.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
Signed-off-by: Johan Hovold <johan@kernel.org>
hifive-unleashed-5.1
Andreas Kemnade 2019-01-24 07:34:38 +01:00 committed by Johan Hovold
parent 176f011bda
commit 8fafef42c7
1 changed files with 52 additions and 6 deletions

View File

@ -40,6 +40,7 @@ struct sirf_data {
struct serdev_device *serdev; struct serdev_device *serdev;
speed_t speed; speed_t speed;
struct regulator *vcc; struct regulator *vcc;
struct regulator *lna;
struct gpio_desc *on_off; struct gpio_desc *on_off;
struct gpio_desc *wakeup; struct gpio_desc *wakeup;
int irq; int irq;
@ -289,21 +290,60 @@ static int sirf_set_active(struct sirf_data *data, bool active)
static int sirf_runtime_suspend(struct device *dev) static int sirf_runtime_suspend(struct device *dev)
{ {
struct sirf_data *data = dev_get_drvdata(dev); struct sirf_data *data = dev_get_drvdata(dev);
int ret2;
int ret;
if (!data->on_off) if (data->on_off)
return regulator_disable(data->vcc); ret = sirf_set_active(data, false);
else
ret = regulator_disable(data->vcc);
return sirf_set_active(data, false); if (ret)
return ret;
ret = regulator_disable(data->lna);
if (ret)
goto err_reenable;
return 0;
err_reenable:
if (data->on_off)
ret2 = sirf_set_active(data, true);
else
ret2 = regulator_enable(data->vcc);
if (ret2)
dev_err(dev,
"failed to reenable power on failed suspend: %d\n",
ret2);
return ret;
} }
static int sirf_runtime_resume(struct device *dev) static int sirf_runtime_resume(struct device *dev)
{ {
struct sirf_data *data = dev_get_drvdata(dev); struct sirf_data *data = dev_get_drvdata(dev);
int ret;
if (!data->on_off) ret = regulator_enable(data->lna);
return regulator_enable(data->vcc); if (ret)
return ret;
return sirf_set_active(data, true); if (data->on_off)
ret = sirf_set_active(data, true);
else
ret = regulator_enable(data->vcc);
if (ret)
goto err_disable_lna;
return 0;
err_disable_lna:
regulator_disable(data->lna);
return ret;
} }
static int __maybe_unused sirf_suspend(struct device *dev) static int __maybe_unused sirf_suspend(struct device *dev)
@ -391,6 +431,12 @@ static int sirf_probe(struct serdev_device *serdev)
goto err_put_device; goto err_put_device;
} }
data->lna = devm_regulator_get(dev, "lna");
if (IS_ERR(data->lna)) {
ret = PTR_ERR(data->lna);
goto err_put_device;
}
data->on_off = devm_gpiod_get_optional(dev, "sirf,onoff", data->on_off = devm_gpiod_get_optional(dev, "sirf,onoff",
GPIOD_OUT_LOW); GPIOD_OUT_LOW);
if (IS_ERR(data->on_off)) if (IS_ERR(data->on_off))