@@ -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)
289290static 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
299324static 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
309349static 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