Skip to content

Commit 8fafef4

Browse files
akemnadejhovold
authored andcommitted
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>
1 parent 176f011 commit 8fafef4

1 file changed

Lines changed: 52 additions & 6 deletions

File tree

drivers/gnss/sirf.c

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct sirf_data {
4040
struct serdev_device *serdev;
4141
speed_t speed;
4242
struct regulator *vcc;
43+
struct regulator *lna;
4344
struct gpio_desc *on_off;
4445
struct gpio_desc *wakeup;
4546
int irq;
@@ -289,21 +290,60 @@ static int sirf_set_active(struct sirf_data *data, bool active)
289290
static int sirf_runtime_suspend(struct device *dev)
290291
{
291292
struct sirf_data *data = dev_get_drvdata(dev);
293+
int ret2;
294+
int ret;
295+
296+
if (data->on_off)
297+
ret = sirf_set_active(data, false);
298+
else
299+
ret = regulator_disable(data->vcc);
300+
301+
if (ret)
302+
return ret;
303+
304+
ret = regulator_disable(data->lna);
305+
if (ret)
306+
goto err_reenable;
307+
308+
return 0;
309+
310+
err_reenable:
311+
if (data->on_off)
312+
ret2 = sirf_set_active(data, true);
313+
else
314+
ret2 = regulator_enable(data->vcc);
292315

293-
if (!data->on_off)
294-
return regulator_disable(data->vcc);
316+
if (ret2)
317+
dev_err(dev,
318+
"failed to reenable power on failed suspend: %d\n",
319+
ret2);
295320

296-
return sirf_set_active(data, false);
321+
return ret;
297322
}
298323

299324
static int sirf_runtime_resume(struct device *dev)
300325
{
301326
struct sirf_data *data = dev_get_drvdata(dev);
327+
int ret;
302328

303-
if (!data->on_off)
304-
return regulator_enable(data->vcc);
329+
ret = regulator_enable(data->lna);
330+
if (ret)
331+
return ret;
332+
333+
if (data->on_off)
334+
ret = sirf_set_active(data, true);
335+
else
336+
ret = regulator_enable(data->vcc);
337+
338+
if (ret)
339+
goto err_disable_lna;
305340

306-
return sirf_set_active(data, true);
341+
return 0;
342+
343+
err_disable_lna:
344+
regulator_disable(data->lna);
345+
346+
return ret;
307347
}
308348

309349
static int __maybe_unused sirf_suspend(struct device *dev)
@@ -391,6 +431,12 @@ static int sirf_probe(struct serdev_device *serdev)
391431
goto err_put_device;
392432
}
393433

434+
data->lna = devm_regulator_get(dev, "lna");
435+
if (IS_ERR(data->lna)) {
436+
ret = PTR_ERR(data->lna);
437+
goto err_put_device;
438+
}
439+
394440
data->on_off = devm_gpiod_get_optional(dev, "sirf,onoff",
395441
GPIOD_OUT_LOW);
396442
if (IS_ERR(data->on_off))

0 commit comments

Comments
 (0)