Re: [BUGFIX 9/9] ACPI: use new helper functions to simpilify code

From: Rafael J. Wysocki
Date: Thu Jun 13 2013 - 14:29:50 EST


On Friday, June 14, 2013 12:32:32 AM Jiang Liu wrote:
> Use new helper functions to simpilify ACPI dock, acpiphp code.
>
> Signed-off-by: Jiang Liu <jiang.liu@xxxxxxxxxx>

Not 3.10 material.

For now, please *only* send the patches from this series that are *necessary*
to fix the regression. All of the other related stuff should be sent in a
separate series for 3.11, ideally later (hint: when the essential changes have
been tested and approved).

So it looks like we need to focus on [1-2/9] from this series for now.

Thanks,
Rafael


> ---
> drivers/acpi/dock.c | 78 ++++----------------------------------
> drivers/acpi/scan.c | 53 ++++++--------------------
> drivers/pci/hotplug/acpiphp_glue.c | 15 ++------
> 3 files changed, 21 insertions(+), 125 deletions(-)
>
> diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
> index 72cf97e..1811f4f 100644
> --- a/drivers/acpi/dock.c
> +++ b/drivers/acpi/dock.c
> @@ -181,26 +181,14 @@ find_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
> * If an acpi object has a _DCK method, then it is by definition a dock
> * station, so return true.
> */
> -static int is_dock(acpi_handle handle)
> +static inline int is_dock(acpi_handle handle)
> {
> - acpi_status status;
> - acpi_handle tmp;
> -
> - status = acpi_get_handle(handle, "_DCK", &tmp);
> - if (ACPI_FAILURE(status))
> - return 0;
> - return 1;
> + return acpi_has_method(handle, "_DCK");
> }
>
> -static int __init is_ejectable(acpi_handle handle)
> +static inline int is_ejectable(acpi_handle handle)
> {
> - acpi_status status;
> - acpi_handle tmp;
> -
> - status = acpi_get_handle(handle, "_EJ0", &tmp);
> - if (ACPI_FAILURE(status))
> - return 0;
> - return 1;
> + return acpi_has_method(handle, "_EJ0");
> }
>
> static int __init is_ata(acpi_handle handle)
> @@ -409,37 +397,6 @@ static void dock_event(struct dock_station *ds, u32 event, int num)
> }
>
> /**
> - * eject_dock - respond to a dock eject request
> - * @ds: the dock station
> - *
> - * This is called after _DCK is called, to execute the dock station's
> - * _EJ0 method.
> - */
> -static void eject_dock(struct dock_station *ds)
> -{
> - struct acpi_object_list arg_list;
> - union acpi_object arg;
> - acpi_status status;
> - acpi_handle tmp;
> -
> - /* all dock devices should have _EJ0, but check anyway */
> - status = acpi_get_handle(ds->handle, "_EJ0", &tmp);
> - if (ACPI_FAILURE(status)) {
> - pr_debug("No _EJ0 support for dock device\n");
> - return;
> - }
> -
> - arg_list.count = 1;
> - arg_list.pointer = &arg;
> - arg.type = ACPI_TYPE_INTEGER;
> - arg.integer.value = 1;
> -
> - status = acpi_evaluate_object(ds->handle, "_EJ0", &arg_list, NULL);
> - if (ACPI_FAILURE(status))
> - pr_debug("Failed to evaluate _EJ0!\n");
> -}
> -
> -/**
> * handle_dock - handle a dock event
> * @ds: the dock station
> * @dock: to dock, or undock - that is the question
> @@ -499,27 +456,6 @@ static inline void complete_undock(struct dock_station *ds)
> ds->flags &= ~(DOCK_UNDOCKING);
> }
>
> -static void dock_lock(struct dock_station *ds, int lock)
> -{
> - struct acpi_object_list arg_list;
> - union acpi_object arg;
> - acpi_status status;
> -
> - arg_list.count = 1;
> - arg_list.pointer = &arg;
> - arg.type = ACPI_TYPE_INTEGER;
> - arg.integer.value = !!lock;
> - status = acpi_evaluate_object(ds->handle, "_LCK", &arg_list, NULL);
> - if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
> - if (lock)
> - acpi_handle_warn(ds->handle,
> - "Locking device failed (0x%x)\n", status);
> - else
> - acpi_handle_warn(ds->handle,
> - "Unlocking device failed (0x%x)\n", status);
> - }
> -}
> -
> /**
> * dock_in_progress - see if we are in the middle of handling a dock event
> * @ds: the dock station
> @@ -653,8 +589,8 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
>
> hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST);
> undock(ds);
> - dock_lock(ds, 0);
> - eject_dock(ds);
> + acpi_evaluate_lck(ds->handle, 0);
> + acpi_evaluate_ej0(ds->handle);
> if (dock_present(ds)) {
> acpi_handle_err(ds->handle, "Unable to undock!\n");
> return -EBUSY;
> @@ -713,7 +649,7 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
> hotplug_dock_devices(ds, event);
> complete_dock(ds);
> dock_event(ds, event, DOCK_EVENT);
> - dock_lock(ds, 1);
> + acpi_evaluate_lck(ds->handle, 1);
> acpi_update_all_gpes();
> break;
> }
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index 4148163..3372505 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -123,9 +123,6 @@ static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL);
> static int acpi_scan_hot_remove(struct acpi_device *device)
> {
> acpi_handle handle = device->handle;
> - acpi_handle not_used;
> - struct acpi_object_list arg_list;
> - union acpi_object arg;
> acpi_status status;
> unsigned long long sta;
>
> @@ -144,31 +141,12 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
> put_device(&device->dev);
> device = NULL;
>
> - if (ACPI_SUCCESS(acpi_get_handle(handle, "_LCK", &not_used))) {
> - arg_list.count = 1;
> - arg_list.pointer = &arg;
> - arg.type = ACPI_TYPE_INTEGER;
> - arg.integer.value = 0;
> - acpi_evaluate_object(handle, "_LCK", &arg_list, NULL);
> - }
> -
> - arg_list.count = 1;
> - arg_list.pointer = &arg;
> - arg.type = ACPI_TYPE_INTEGER;
> - arg.integer.value = 1;
> -
> - /*
> - * TBD: _EJD support.
> - */
> - status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL);
> - if (ACPI_FAILURE(status)) {
> - if (status == AE_NOT_FOUND) {
> - return -ENODEV;
> - } else {
> - acpi_handle_warn(handle, "Eject failed (0x%x)\n",
> - status);
> - return -EIO;
> - }
> + acpi_evaluate_lck(handle, 0);
> + status = acpi_evaluate_ej0(handle);
> + if (status == AE_NOT_FOUND) {
> + return -ENODEV;
> + } else if (ACPI_FAILURE(status)) {
> + return -EIO;
> }
>
> /*
> @@ -536,7 +514,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
> {
> struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
> acpi_status status;
> - acpi_handle temp;
> unsigned long long sun;
> int result = 0;
>
> @@ -562,8 +539,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
> /*
> * If device has _STR, 'description' file is created
> */
> - status = acpi_get_handle(dev->handle, "_STR", &temp);
> - if (ACPI_SUCCESS(status)) {
> + if (acpi_has_method(dev->handle, "_STR")) {
> status = acpi_evaluate_object(dev->handle, "_STR",
> NULL, &buffer);
> if (ACPI_FAILURE(status))
> @@ -593,8 +569,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
> * If device has _EJ0, 'eject' file is created that is used to trigger
> * hot-removal function from userland.
> */
> - status = acpi_get_handle(dev->handle, "_EJ0", &temp);
> - if (ACPI_SUCCESS(status)) {
> + if (acpi_has_method(dev->handle, "_EJ0")) {
> result = device_create_file(&dev->dev, &dev_attr_eject);
> if (result)
> return result;
> @@ -616,9 +591,6 @@ end:
>
> static void acpi_device_remove_files(struct acpi_device *dev)
> {
> - acpi_status status;
> - acpi_handle temp;
> -
> if (dev->flags.power_manageable) {
> device_remove_file(&dev->dev, &dev_attr_power_state);
> if (dev->power.flags.power_resources)
> @@ -629,20 +601,17 @@ static void acpi_device_remove_files(struct acpi_device *dev)
> /*
> * If device has _STR, remove 'description' file
> */
> - status = acpi_get_handle(dev->handle, "_STR", &temp);
> - if (ACPI_SUCCESS(status)) {
> + if (acpi_has_method(dev->handle, "_STR")) {
> kfree(dev->pnp.str_obj);
> device_remove_file(&dev->dev, &dev_attr_description);
> }
> /*
> * If device has _EJ0, remove 'eject' file.
> */
> - status = acpi_get_handle(dev->handle, "_EJ0", &temp);
> - if (ACPI_SUCCESS(status))
> + if (acpi_has_method(dev->handle, "_EJ0"))
> device_remove_file(&dev->dev, &dev_attr_eject);
>
> - status = acpi_get_handle(dev->handle, "_SUN", &temp);
> - if (ACPI_SUCCESS(status))
> + if (acpi_has_method(dev->handle, "_SUN"))
> device_remove_file(&dev->dev, &dev_attr_sun);
>
> if (dev->pnp.unique_id)
> diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
> index 699b8ca..d0699ed 100644
> --- a/drivers/pci/hotplug/acpiphp_glue.c
> +++ b/drivers/pci/hotplug/acpiphp_glue.c
> @@ -828,23 +828,14 @@ int acpiphp_eject_slot(struct acpiphp_slot *slot)
> {
> acpi_status status;
> struct acpiphp_func *func;
> - struct acpi_object_list arg_list;
> - union acpi_object arg;
>
> list_for_each_entry(func, &slot->funcs, sibling) {
> /* We don't want to call _EJ0 on non-existing functions. */
> if ((func->flags & FUNC_HAS_EJ0)) {
> - /* _EJ0 method take one argument */
> - arg_list.count = 1;
> - arg_list.pointer = &arg;
> - arg.type = ACPI_TYPE_INTEGER;
> - arg.integer.value = 1;
> -
> - status = acpi_evaluate_object(func->handle, "_EJ0", &arg_list, NULL);
> - if (ACPI_FAILURE(status)) {
> - warn("%s: _EJ0 failed\n", __func__);
> + status = acpi_evaluate_ej0(func->handle);
> + if (ACPI_FAILURE(status))
> return -1;
> - } else
> + else
> break;
> }
> }
>
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/