Skip to content

Commit 58ca21d

Browse files
committed
ACPI: TAD: Improve runtime PM using guard macros
Use guard pm_runtime_active_try to simplify runtime PM cleanup and implement runtime resume error handling in multiple places. Also use guard pm_runtime_noresume to simplify acpi_tad_remove(). Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/13881356.uLZWGnKmhe@rafael.j.wysocki
1 parent f9f5e22 commit 58ca21d

1 file changed

Lines changed: 38 additions & 34 deletions

File tree

drivers/acpi/acpi_tad.c

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,18 @@ static int acpi_tad_set_real_time(struct device *dev, struct acpi_tad_rt *rt)
9090
args[0].buffer.pointer = (u8 *)rt;
9191
args[0].buffer.length = sizeof(*rt);
9292

93-
pm_runtime_get_sync(dev);
93+
ACQUIRE(pm_runtime_active_try, pm)(dev);
94+
if (ACQUIRE_ERR(pm_runtime_active_try, &pm))
95+
return -ENXIO;
9496

9597
status = acpi_evaluate_integer(handle, "_SRT", &arg_list, &retval);
96-
97-
pm_runtime_put_sync(dev);
98-
9998
if (ACPI_FAILURE(status) || retval)
10099
return -EIO;
101100

102101
return 0;
103102
}
104103

105-
static int acpi_tad_get_real_time(struct device *dev, struct acpi_tad_rt *rt)
104+
static int acpi_tad_evaluate_grt(struct device *dev, struct acpi_tad_rt *rt)
106105
{
107106
acpi_handle handle = ACPI_HANDLE(dev);
108107
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER };
@@ -111,12 +110,7 @@ static int acpi_tad_get_real_time(struct device *dev, struct acpi_tad_rt *rt)
111110
acpi_status status;
112111
int ret = -EIO;
113112

114-
pm_runtime_get_sync(dev);
115-
116113
status = acpi_evaluate_object(handle, "_GRT", NULL, &output);
117-
118-
pm_runtime_put_sync(dev);
119-
120114
if (ACPI_FAILURE(status))
121115
goto out_free;
122116

@@ -139,6 +133,21 @@ static int acpi_tad_get_real_time(struct device *dev, struct acpi_tad_rt *rt)
139133
return ret;
140134
}
141135

136+
static int acpi_tad_get_real_time(struct device *dev, struct acpi_tad_rt *rt)
137+
{
138+
int ret;
139+
140+
ACQUIRE(pm_runtime_active_try, pm)(dev);
141+
if (ACQUIRE_ERR(pm_runtime_active_try, &pm))
142+
return -ENXIO;
143+
144+
ret = acpi_tad_evaluate_grt(dev, rt);
145+
if (ret)
146+
return ret;
147+
148+
return 0;
149+
}
150+
142151
static char *acpi_tad_rt_next_field(char *s, int *val)
143152
{
144153
char *p;
@@ -266,12 +275,11 @@ static int acpi_tad_wake_set(struct device *dev, char *method, u32 timer_id,
266275
args[0].integer.value = timer_id;
267276
args[1].integer.value = value;
268277

269-
pm_runtime_get_sync(dev);
278+
ACQUIRE(pm_runtime_active_try, pm)(dev);
279+
if (ACQUIRE_ERR(pm_runtime_active_try, &pm))
280+
return -ENXIO;
270281

271282
status = acpi_evaluate_integer(handle, method, &arg_list, &retval);
272-
273-
pm_runtime_put_sync(dev);
274-
275283
if (ACPI_FAILURE(status) || retval)
276284
return -EIO;
277285

@@ -314,12 +322,11 @@ static ssize_t acpi_tad_wake_read(struct device *dev, char *buf, char *method,
314322

315323
args[0].integer.value = timer_id;
316324

317-
pm_runtime_get_sync(dev);
325+
ACQUIRE(pm_runtime_active_try, pm)(dev);
326+
if (ACQUIRE_ERR(pm_runtime_active_try, &pm))
327+
return -ENXIO;
318328

319329
status = acpi_evaluate_integer(handle, method, &arg_list, &retval);
320-
321-
pm_runtime_put_sync(dev);
322-
323330
if (ACPI_FAILURE(status))
324331
return -EIO;
325332

@@ -370,12 +377,11 @@ static int acpi_tad_clear_status(struct device *dev, u32 timer_id)
370377

371378
args[0].integer.value = timer_id;
372379

373-
pm_runtime_get_sync(dev);
380+
ACQUIRE(pm_runtime_active_try, pm)(dev);
381+
if (ACQUIRE_ERR(pm_runtime_active_try, &pm))
382+
return -ENXIO;
374383

375384
status = acpi_evaluate_integer(handle, "_CWS", &arg_list, &retval);
376-
377-
pm_runtime_put_sync(dev);
378-
379385
if (ACPI_FAILURE(status) || retval)
380386
return -EIO;
381387

@@ -411,12 +417,11 @@ static ssize_t acpi_tad_status_read(struct device *dev, char *buf, u32 timer_id)
411417

412418
args[0].integer.value = timer_id;
413419

414-
pm_runtime_get_sync(dev);
420+
ACQUIRE(pm_runtime_active_try, pm)(dev);
421+
if (ACQUIRE_ERR(pm_runtime_active_try, &pm))
422+
return -ENXIO;
415423

416424
status = acpi_evaluate_integer(handle, "_GWS", &arg_list, &retval);
417-
418-
pm_runtime_put_sync(dev);
419-
420425
if (ACPI_FAILURE(status))
421426
return -EIO;
422427

@@ -571,16 +576,15 @@ static void acpi_tad_remove(struct platform_device *pdev)
571576

572577
sysfs_remove_group(&dev->kobj, &acpi_tad_attr_group);
573578

574-
pm_runtime_get_noresume(dev);
575-
576-
acpi_tad_disable_timer(dev, ACPI_TAD_AC_TIMER);
577-
acpi_tad_clear_status(dev, ACPI_TAD_AC_TIMER);
578-
if (dd->capabilities & ACPI_TAD_DC_WAKE) {
579-
acpi_tad_disable_timer(dev, ACPI_TAD_DC_TIMER);
580-
acpi_tad_clear_status(dev, ACPI_TAD_DC_TIMER);
579+
scoped_guard(pm_runtime_noresume, dev) {
580+
acpi_tad_disable_timer(dev, ACPI_TAD_AC_TIMER);
581+
acpi_tad_clear_status(dev, ACPI_TAD_AC_TIMER);
582+
if (dd->capabilities & ACPI_TAD_DC_WAKE) {
583+
acpi_tad_disable_timer(dev, ACPI_TAD_DC_TIMER);
584+
acpi_tad_clear_status(dev, ACPI_TAD_DC_TIMER);
585+
}
581586
}
582587

583-
pm_runtime_put_noidle(dev);
584588
pm_runtime_suspend(dev);
585589
pm_runtime_disable(dev);
586590
acpi_remove_cmos_rtc_space_handler(handle);

0 commit comments

Comments
 (0)