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>
This commit is contained in:
Родитель
176f011bda
Коммит
8fafef42c7
|
@ -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))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче