minor improvements for ACPI dock and acpiphp drivers
Subsystems (4)
v3 cover minor improvements for ACPI dock and acpiphp drivers
From: Jiang Liu <[email protected]>
This is an following up patchset of "[PATCH 0/3] ACPI / dock / PCI: Fix problems with dock and PCI hotplug" with minor code cleanups and refinements. It applies togit://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
Due to hardware resource limitation, I have only done compilation and boot tests.
V2->V3:
The first four patches are the same as previous version and rework all other patches according to review comments.
Jiang Liu (10):
ACPI, DOCK: avoid initializing acpi_dock_notifier_list multiple times ACPI, DOCK: kill redundant spin lock in dock station object ACPI, DOCK: mark initialization functions with __init ACPI, DOCK: simplify implementation of dock_create_acpi_device()
ACPI: introduce helper function acpi_has_method()
ACPI: introduce helper function acpi_execute_simple_method()
ACPI: introduce two helper functions to simplify code
ACPI: change acpi_[bay|dock]_match() in scan.c as global functions
ACPI: simplify dock driver with new helper functions
ACPI: simplify acpiphp driver with new helper functions
drivers/acpi/battery.c | 19 +--- drivers/acpi/bus.c | 6 +- drivers/acpi/dock.c | 152 ++++------------------------- drivers/acpi/ec.c | 4 +- drivers/acpi/power.c | 4 +- drivers/acpi/processor_perflib.c | 22 ++--- drivers/acpi/resource.c | 4 +- drivers/acpi/scan.c | 189 +++++++++++++------------------------ drivers/acpi/sleep.c | 7 +- drivers/acpi/thermal.c | 18 +--- drivers/acpi/utils.c | 70 ++++++++++++++ drivers/acpi/video.c | 56 ++++------- drivers/acpi/video_detect.c | 19 ++-- drivers/pci/hotplug/acpiphp_glue.c | 30 ++---- include/acpi/acpi_bus.h | 10 ++ 15 files changed, 218 insertions(+), 392 deletions(-)
Signature · 1 line
1.8.1.2
PATCH v3 1/10 ACPI, DOCK: avoid initializing acpi_dock_notifier_list multiple times
From: Jiang Liu <[email protected]>
Function dock_add() will be called multiple times if there are multiple dock stations, which causes acpi_dock_notifier_list being initialized multiple times. So move initialization of acpi_dock_notifier_list from dock_add() to acpi_dock_init().
--- drivers/acpi/dock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/dock.c +1 -1
@@ -1007,7 +1007,6 @@ static int __init dock_add(acpi_handle handle)mutex_init (&dock_station->hp_lock);spin_lock_init (&dock_station->dd_lock);INIT_LIST_HEAD (&dock_station->sibling); -ATOMIC_INIT_NOTIFIER_HEAD (&dock_notifier_list);INIT_LIST_HEAD (&dock_station->dependent_devices);/* we want the dock device to send uevents */
@@ -1078,6 +1077,7 @@ int __init acpi_dock_init(void)return 0 ; } +ATOMIC_INIT_NOTIFIER_HEAD (&dock_notifier_list);register_acpi_bus_notifier (&dock_acpi_notifier);pr_info (PREFIX "%s: %d docks/bays found\n" ,ACPI_DOCK_DRIVER_DESCRIPTION , dock_station_count);
Signature · 1 line
1.8.1.2
PATCH v3 2/10 ACPI, DOCK: kill redundant spin lock in dock station object
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
All dock station objects are created during initialization and don't change at runtime, so kill the redundant spin lock in dock station object.
--- drivers/acpi/dock.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-)
drivers/acpi/dock.c +3 -12
@@ -63,7 +63,6 @@ struct dock_station {acpi_handle handle;unsigned long last_dock_time;u32 flags; -spinlock_t dd_lock;struct mutex hp_lock;struct list_head dependent_devices;
@@ -112,10 +111,7 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) dd->handle = handle;INIT_LIST_HEAD (&dd->list); - -spin_lock (&ds->dd_lock);list_add_tail (&dd->list, &ds->dependent_devices); -spin_unlock (&ds->dd_lock);return 0 ; }
@@ -220,14 +216,10 @@ find_dock_dependent_device(struct dock_station *ds, acpi_handle handle) {struct dock_dependent_device *dd; -spin_lock (&ds->dd_lock); -list_for_each_entry (dd, &ds->dependent_devices, list) { -if (handle == dd->handle) { -spin_unlock (&ds->dd_lock); +list_for_each_entry (dd, &ds->dependent_devices, list) +if (handle == dd->handle)return dd; - } - } -spin_unlock (&ds->dd_lock); +return NULL ; }
@@ -1005,7 +997,6 @@ static int __init dock_add(acpi_handle handle) dock_station->last_dock_time = jiffies -HZ ;mutex_init (&dock_station->hp_lock); -spin_lock_init (&dock_station->dd_lock);INIT_LIST_HEAD (&dock_station->sibling);INIT_LIST_HEAD (&dock_station->dependent_devices);
Signature · 1 line
1.8.1.2
PATCH v3 3/10 ACPI, DOCK: mark initialization functions with __init
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Mark all initialization functions with __init to reduce runtime memory consumption.
--- drivers/acpi/dock.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/acpi/dock.c +6 -6
@@ -100,7 +100,7 @@ struct dock_dependent_device {* * Add the dependent device to the dock's dependent device list. */ -static int +static int __init add_dock_dependent_device (struct dock_station *ds,acpi_handle handle) {struct dock_dependent_device *dd;
@@ -244,7 +244,7 @@ static int is_dock(acpi_handle handle)return 1 ; } -static int is_ejectable (acpi_handle handle) +static int __init is_ejectable (acpi_handle handle) {acpi_status status;acpi_handle tmp;
@@ -255,7 +255,7 @@ static int is_ejectable(acpi_handle handle)return 1 ; } -static int is_ata (acpi_handle handle) +static int __init is_ata (acpi_handle handle) {acpi_handle tmp;
@@ -268,7 +268,7 @@ static int is_ata(acpi_handle handle)return 0 ; } -static int is_battery (acpi_handle handle) +static int __init is_battery (acpi_handle handle) {struct acpi_device_info *info;int ret =1 ;
@@ -284,7 +284,7 @@ static int is_battery(acpi_handle handle)return ret; } -static int is_ejectable_bay (acpi_handle handle) +static int __init is_ejectable_bay (acpi_handle handle) {acpi_handle phandle;
@@ -848,7 +848,7 @@ static struct notifier_block dock_acpi_notifier = {* check to see if an object has an _EJD method. If it does, then it * will see if it is dependent on the dock station. */ -static acpi_status +static acpi_status __init find_dock_devices (acpi_handle handle,u32 lvl,void *context,void **rv) {acpi_status status;
Signature · 1 line
1.8.1.2
PATCH v3 4/10 ACPI, DOCK: simplify implementation of dock_create_acpi_device()
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
The return value of dock_create_acpi_device() is not used at all, so change the signature to return void and simplify implementation.
--- drivers/acpi/dock.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/acpi/dock.c +1 -6
@@ -351,10 +351,8 @@ static int dock_present(struct dock_station *ds)* handle if one does not exist already. This should cause * acpi to scan for drivers for the given devices, and call * matching driver's add routine. -* -* Returns a pointer to the acpi_device corresponding to the handle. */ -static struct acpi_device *dock_create_acpi_device (acpi_handle handle) +static void dock_create_acpi_device (acpi_handle handle) {struct acpi_device *device;int ret;
@@ -367,10 +365,7 @@ static struct acpi_device * dock_create_acpi_device(acpi_handle handle) ret =acpi_bus_scan (handle);if (ret)pr_debug ("error adding bus, %x\n" , -ret); - -acpi_bus_get_device (handle, &device); } -return device; }/**
Signature · 1 line
1.8.1.2
PATCH v3 5/10 ACPI: introduce helper function acpi_has_method()
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Introduce helper function acpi_has_method() to simplify code.
--- drivers/acpi/battery.c | 11 ++--- drivers/acpi/ec.c | 4 +- drivers/acpi/processor_perflib.c | 22 +++------ drivers/acpi/resource.c | 4 +- drivers/acpi/scan.c | 99 ++++++++++++---------------------------- drivers/acpi/utils.c | 15 ++++++ drivers/acpi/video.c | 39 +++++----------- drivers/acpi/video_detect.c | 19 ++++---- include/acpi/acpi_bus.h | 3 ++ 9 files changed, 80 insertions(+), 136 deletions(-)
drivers/acpi/battery.c +3 -8
@@ -548,12 +548,8 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery)static int acpi_battery_init_alarm (struct acpi_battery *battery) { -acpi_status status =AE_OK ; -acpi_handle handle =NULL ; -/* See if alarms are supported, and if so, set default */ - status =acpi_get_handle (battery->device->handle,"_BTP" , &handle); -if (ACPI_FAILURE (status)) { +if (!acpi_has_method (battery->device->handle,"_BTP" )) {clear_bit (ACPI_BATTERY_ALARM_PRESENT , &battery->flags);return 0 ; }
@@ -1066,7 +1062,7 @@ static int acpi_battery_add(struct acpi_device *device) {int result =0 ;struct acpi_battery *battery =NULL ; -acpi_handle handle; +if (!device)return -EINVAL ; battery =kzalloc (sizeof (struct acpi_battery ),GFP_KERNEL );
@@ -1078,8 +1074,7 @@ static int acpi_battery_add(struct acpi_device *device) device->driver_data = battery;mutex_init (&battery->lock);mutex_init (&battery->sysfs_lock); -if (ACPI_SUCCESS (acpi_get_handle (battery->device->handle, -"_BIX" , &handle))) +if (acpi_has_method (battery->device->handle,"_BIX" ))set_bit (ACPI_BATTERY_XINFO_PRESENT , &battery->flags); result =acpi_battery_update (battery);if (result)
drivers/acpi/ec.c +1 -3
@@ -1049,10 +1049,8 @@ int __init acpi_ec_ecdt_probe(void)* which needs it, has fake EC._INI method, so use it as flag. * Keep boot_ec struct as it will be needed soon. */ -acpi_handle dummy;if (!dmi_name_in_vendors ("ASUS" ) || -ACPI_FAILURE (acpi_get_handle (boot_ec->handle,"_INI" , - &dummy))) + !acpi_has_method (boot_ec->handle,"_INI" ))return -ENODEV ; } install:
drivers/acpi/processor_perflib.c +7 -15
@@ -164,17 +164,12 @@ static void acpi_processor_ppc_ost(acpi_handle handle, int status) {.type = ACPI_TYPE_INTEGER,}, };struct acpi_object_list arg_list = {2 , params}; -acpi_handle temp; - params[0 ].integer.value =ACPI_PROCESSOR_NOTIFY_PERFORMANCE ; - params[1 ].integer.value = status; - -/* when there is no _OST , skip it */ -if (ACPI_FAILURE (acpi_get_handle (handle,"_OST" , &temp))) -return ; - -acpi_evaluate_object (handle,"_OST" , &arg_list,NULL ); -return ; +if (acpi_has_method (handle,"_OST" )) { + params[0 ].integer.value =ACPI_PROCESSOR_NOTIFY_PERFORMANCE ; + params[1 ].integer.value = status; +acpi_evaluate_object (handle,"_OST" , &arg_list,NULL ); + } }int acpi_processor_ppc_has_changed (struct acpi_processor *pr,int event_flag)
@@ -468,14 +463,11 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)int acpi_processor_get_performance_info (struct acpi_processor *pr) {int result =0 ; -acpi_status status =AE_OK ; -acpi_handle handle =NULL ;if (!pr || !pr->performance || !pr->handle)return -EINVAL ; - status =acpi_get_handle (pr->handle,"_PCT" , &handle); -if (ACPI_FAILURE (status)) { +if (!acpi_has_method (pr->handle,"_PCT" )) {ACPI_DEBUG_PRINT ((ACPI_DB_INFO ,"ACPI-based processor performance control unavailable\n" ));return -ENODEV ;
@@ -501,7 +493,7 @@ int acpi_processor_get_performance_info(struct acpi_processor *pr)*/ update_bios:#ifdef CONFIG_X86 -if (ACPI_SUCCESS (acpi_get_handle (pr->handle,"_PPC" , &handle))){ +if (acpi_has_method (pr->handle,"_PPC" )) {if (boot_cpu_has (X86_FEATURE_EST )) printk(KERN_WARNING FW_BUG "BIOS needs update for CPU ""frequency support\n" );
drivers/acpi/resource.c +1 -3
@@ -505,14 +505,12 @@ int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list, void *preproc_data) {struct res_proc_context c; -acpi_handle not_used;acpi_status status;if (!adev || !adev->handle || !list_empty (list))return -EINVAL ; - status =acpi_get_handle (adev->handle,METHOD_NAME__CRS , ¬_used); -if (ACPI_FAILURE (status)) +if (!acpi_has_method (adev->handle,METHOD_NAME__CRS ))return 0 ; c.list = list;
drivers/acpi/scan.c +30 -69
240 lines not on this page · raw message
drivers/acpi/utils.c +15 -0
@@ -495,3 +495,18 @@ acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...)kfree (buffer.pointer); }EXPORT_SYMBOL (acpi_handle_printk); + +/** +* acpi_has_method: Check whether @handle has a method named @name +* @handle: ACPI device handle +* @name: name of object or method +* +* Check whether @handle has a method named @name. +*/ +bool acpi_has_method (acpi_handle handle,char *name) +{ +acpi_handle tmp; + +return ACPI_SUCCESS (acpi_get_handle (handle, name, &tmp)); +} +EXPORT_SYMBOL (acpi_has_method);
drivers/acpi/video.c +12 -27
@@ -875,28 +875,21 @@ out:static void acpi_video_device_find_cap (struct acpi_video_device *device) { -acpi_handle h_dummy1; - -if (ACPI_SUCCESS (acpi_get_handle (device->dev->handle,"_ADR" , &h_dummy1))) { +if (acpi_has_method (device->dev->handle,"_ADR" )) device->cap._ADR =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (device->dev->handle,"_BCL" , &h_dummy1))) { +if (acpi_has_method (device->dev->handle,"_BCL" )) device->cap._BCL =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (device->dev->handle,"_BCM" , &h_dummy1))) { +if (acpi_has_method (device->dev->handle,"_BCM" )) device->cap._BCM =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (device->dev->handle,"_BQC" ,&h_dummy1))) +if (acpi_has_method (device->dev->handle,"_BQC" )) { device->cap._BQC =1 ; -else if (ACPI_SUCCESS (acpi_get_handle (device->dev->handle,"_BCQ" , - &h_dummy1))) { + }else if (acpi_has_method (device->dev->handle,"_BCQ" )) { printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n"); device->cap._BCQ =1 ; } -if (ACPI_SUCCESS (acpi_get_handle (device->dev->handle,"_DDC" , &h_dummy1))) { +if (acpi_has_method (device->dev->handle,"_DDC" )) device->cap._DDC =1 ; - }if (acpi_video_backlight_support ()) {struct backlight_properties props;
@@ -984,26 +977,18 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)static void acpi_video_bus_find_cap (struct acpi_video_bus *video) { -acpi_handle h_dummy1; - -if (ACPI_SUCCESS (acpi_get_handle (video->device->handle,"_DOS" , &h_dummy1))) { +if (acpi_has_method (video->device->handle,"_DOS" )) video->cap._DOS =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (video->device->handle,"_DOD" , &h_dummy1))) { +if (acpi_has_method (video->device->handle,"_DOD" )) video->cap._DOD =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (video->device->handle,"_ROM" , &h_dummy1))) { +if (acpi_has_method (video->device->handle,"_ROM" )) video->cap._ROM =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (video->device->handle,"_GPD" , &h_dummy1))) { +if (acpi_has_method (video->device->handle,"_GPD" )) video->cap._GPD =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (video->device->handle,"_SPD" , &h_dummy1))) { +if (acpi_has_method (video->device->handle,"_SPD" )) video->cap._SPD =1 ; - } -if (ACPI_SUCCESS (acpi_get_handle (video->device->handle,"_VPO" , &h_dummy1))) { +if (acpi_has_method (video->device->handle,"_VPO" )) video->cap._VPO =1 ; - } }/*
drivers/acpi/video_detect.c +8 -11
@@ -51,14 +51,13 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context, void **retyurn_value) {long *cap = context; -acpi_handle h_dummy; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_BCM" , &h_dummy)) && -ACPI_SUCCESS (acpi_get_handle (handle,"_BCL" , &h_dummy))) { +if (acpi_has_method (handle,"_BCM" ) && +acpi_has_method (handle,"_BCL" )) {ACPI_DEBUG_PRINT ((ACPI_DB_INFO ,"Found generic backlight " "support\n" )); *cap |=ACPI_VIDEO_BACKLIGHT ; -if (ACPI_FAILURE (acpi_get_handle (handle,"_BQC" , &h_dummy))) +if (!acpi_has_method (handle,"_BQC" )) printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, ""cannot determine initial brightness\n" );/* We have backlight support, no need to scan further */
@@ -77,22 +76,20 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,*/ long acpi_is_video_device (acpi_handle handle) { -acpi_handle h_dummy;long video_caps =0 ;/* Is this device able to support video switching ? */ -if (ACPI_SUCCESS (acpi_get_handle (handle,"_DOD" , &h_dummy)) || -ACPI_SUCCESS (acpi_get_handle (handle,"_DOS" , &h_dummy))) +if (acpi_has_method (handle,"_DOD" ) ||acpi_has_method (handle,"_DOS" )) video_caps |=ACPI_VIDEO_OUTPUT_SWITCHING ;/* Is this device able to retrieve a video ROM ? */ -if (ACPI_SUCCESS (acpi_get_handle (handle,"_ROM" , &h_dummy))) +if (acpi_has_method (handle,"_ROM" )) video_caps |=ACPI_VIDEO_ROM_AVAILABLE ;/* Is this device able to configure which video head to be POSTed ? */ -if (ACPI_SUCCESS (acpi_get_handle (handle,"_VPO" , &h_dummy)) && -ACPI_SUCCESS (acpi_get_handle (handle,"_GPD" , &h_dummy)) && -ACPI_SUCCESS (acpi_get_handle (handle,"_SPD" , &h_dummy))) +if (acpi_has_method (handle,"_VPO" ) && +acpi_has_method (handle,"_GPD" ) && +acpi_has_method (handle,"_SPD" )) video_caps |=ACPI_VIDEO_DEVICE_POSTING ;/* Only check for backlight functionality if one of the above hit. */
include/acpi/acpi_bus.h +3 -0
@@ -56,6 +56,9 @@ acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,acpi_status acpi_get_physical_device_location (acpi_handle handle,struct acpi_pld_info **pld); + +bool acpi_has_method (acpi_handle handle,char *name); +#ifdef CONFIG_ACPI #include <linux/proc_fs.h>
Signature · 1 line
1.8.1.2
PATCH v3 6/10 ACPI: introduce helper function acpi_execute_simple_method()
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Introduce helper function acpi_execute_simple_method() to simplify code.
--- drivers/acpi/battery.c | 8 ++------ drivers/acpi/bus.c | 6 +----- drivers/acpi/power.c | 4 +--- drivers/acpi/sleep.c | 7 ++----- drivers/acpi/thermal.c | 18 ++++-------------- drivers/acpi/utils.c | 12 ++++++++++++ drivers/acpi/video.c | 17 +++++------------ include/acpi/acpi_bus.h | 2 ++ 8 files changed, 29 insertions(+), 45 deletions(-)
drivers/acpi/battery.c +2 -6
@@ -525,18 +525,14 @@ static int acpi_battery_get_state(struct acpi_battery *battery)static int acpi_battery_set_alarm (struct acpi_battery *battery) {acpi_status status =0 ; -union acpi_object arg0 = { .type =ACPI_TYPE_INTEGER }; -struct acpi_object_list arg_list = {1 , &arg0 };if (!acpi_battery_present (battery) || !test_bit (ACPI_BATTERY_ALARM_PRESENT , &battery->flags))return -ENODEV ; - arg0.integer.value = battery->alarm; -mutex_lock (&battery->lock); - status =acpi_evaluate_object (battery->device->handle,"_BTP" , - &arg_list,NULL ); + status =acpi_execute_simple_method (battery->device->handle,"_BTP" , + battery->alarm);mutex_unlock (&battery->lock);if (ACPI_FAILURE (status))
drivers/acpi/bus.c +1 -5
@@ -593,8 +593,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)static int __init acpi_bus_init_irq (void ) {acpi_status status; -union acpi_object arg = {ACPI_TYPE_INTEGER }; -struct acpi_object_list arg_list = {1 , &arg };char *message =NULL ;
@@ -623,9 +621,7 @@ static int __init acpi_bus_init_irq(void) printk(KERN_INFO PREFIX "Using %s for interrupt routing\n", message); - arg.integer.value = acpi_irq_model; - - status =acpi_evaluate_object (NULL ,"\\_PIC" , &arg_list,NULL ); + status =acpi_execute_simple_method (NULL ,"\\_PIC" , acpi_irq_model);if (ACPI_FAILURE (status) && (status !=AE_NOT_FOUND )) {ACPI_EXCEPTION ((AE_INFO , status,"Evaluating _PIC" ));return -ENODEV ;
drivers/acpi/power.c +1 -3
@@ -637,9 +637,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev, }/* Execute _PSW */ - arg_list.count =1 ; - in_arg[0 ].integer.value = enable; - status =acpi_evaluate_object (dev->handle,"_PSW" , &arg_list,NULL ); + status =acpi_execute_simple_method (dev->handle,"_PSW" , enable);if (ACPI_FAILURE (status) && (status !=AE_NOT_FOUND )) { printk(KERN_ERR PREFIX "_PSW execution failed\n"); dev->wakeup.flags.valid =0 ;
drivers/acpi/sleep.c +2 -5
@@ -31,12 +31,9 @@ static u8 sleep_states[ACPI_S_STATE_COUNT];static void acpi_sleep_tts_switch (u32 acpi_state) { -union acpi_object in_arg = {ACPI_TYPE_INTEGER }; -struct acpi_object_list arg_list = {1 , &in_arg }; -acpi_status status =AE_OK ; +acpi_status status; - in_arg.integer.value = acpi_state; - status =acpi_evaluate_object (NULL ,"\\_TTS" , &arg_list,NULL ); + status =acpi_execute_simple_method (NULL ,"\\_TTS" , acpi_state);if (ACPI_FAILURE (status) && status !=AE_NOT_FOUND ) {/* * OS can't evaluate the _TTS object correctly. Some warning
drivers/acpi/thermal.c +4 -14
@@ -239,26 +239,16 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)static int acpi_thermal_set_cooling_mode (struct acpi_thermal *tz,int mode) { -acpi_status status =AE_OK ; -union acpi_object arg0 = {ACPI_TYPE_INTEGER }; -struct acpi_object_list arg_list = {1 , &arg0 }; -acpi_handle handle =NULL ; - -if (!tz)return -EINVAL ; - status =acpi_get_handle (tz->device->handle,"_SCP" , &handle); -if (ACPI_FAILURE (status)) { +if (!acpi_has_method (tz->device->handle,"_SCP" )) {ACPI_DEBUG_PRINT ((ACPI_DB_INFO ,"_SCP not present\n" ));return -ENODEV ; - } - - arg0.integer.value = mode; - - status =acpi_evaluate_object (handle,NULL , &arg_list,NULL ); -if (ACPI_FAILURE (status)) + }else if (ACPI_FAILURE (acpi_execute_simple_method (tz->device->handle, +"_SCP" , mode))) {return -ENODEV ; + }return 0 ; }
drivers/acpi/utils.c +12 -0
@@ -510,3 +510,15 @@ bool acpi_has_method(acpi_handle handle, char *name)return ACPI_SUCCESS (acpi_get_handle (handle, name, &tmp)); }EXPORT_SYMBOL (acpi_has_method); + +acpi_status acpi_execute_simple_method (acpi_handle handle,char *method, +u64 arg) +{ +union acpi_object obj = { .type =ACPI_TYPE_INTEGER }; +struct acpi_object_list arg_list = { .count =1 , .pointer = &obj, }; + + obj.integer.value = arg; + +return acpi_evaluate_object (handle, method, &arg_list,NULL ); +} +EXPORT_SYMBOL (acpi_execute_simple_method);
drivers/acpi/video.c +5 -12
@@ -353,14 +353,10 @@ static int acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level) { int status; -union acpi_object arg0 = {ACPI_TYPE_INTEGER }; -struct acpi_object_list args = {1 , &arg0 };int state; - arg0.integer.value = level; - - status =acpi_evaluate_object (device->dev->handle,"_BCM" , - &args,NULL ); + status =acpi_execute_simple_method (device->dev->handle, +"_BCM" , level);if (ACPI_FAILURE (status)) {ACPI_ERROR ((AE_INFO ,"Evaluating _BCM failed" ));return -EIO ;
@@ -628,18 +624,15 @@ static int acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) { acpi_status status; -union acpi_object arg0 = {ACPI_TYPE_INTEGER }; -struct acpi_object_list args = {1 , &arg0 };if (!video->cap._DOS)return 0 ;if (bios_flag <0 || bios_flag >3 || lcd_flag <0 || lcd_flag >1 )return -EINVAL ; - arg0.integer.value = (lcd_flag <<2 ) | bios_flag; - video->dos_setting = arg0.integer.value; - status =acpi_evaluate_object (video->device->handle,"_DOS" , - &args,NULL ); + video->dos_setting = (lcd_flag <<2 ) | bios_flag; + status =acpi_execute_simple_method (video->device->handle,"_DOS" , + (lcd_flag <<2 ) | bios_flag);if (ACPI_FAILURE (status))return -EIO ;
include/acpi/acpi_bus.h +2 -0
@@ -58,6 +58,8 @@ acpi_status acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld);bool acpi_has_method (acpi_handle handle,char *name); +acpi_status acpi_execute_simple_method (acpi_handle handle,char *method, +u64 arg);#ifdef CONFIG_ACPI
Signature · 1 line
1.8.1.2
PATCH v3 7/10 ACPI: introduce two helper functions to simplify code
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Introduce two helper functions, acpi_evaluate_ej0() and acpi_evaluate_lck() to simplify code.
--- drivers/acpi/scan.c | 31 ++++++------------------------- drivers/acpi/utils.c | 43 +++++++++++++++++++++++++++++++++++++++++++ include/acpi/acpi_bus.h | 2 ++ 3 files changed, 51 insertions(+), 25 deletions(-)
drivers/acpi/scan.c +6 -25
@@ -194,8 +194,6 @@ static acpi_status acpi_bus_online_companions(acpi_handle handle, u32 lvl,static int acpi_scan_hot_remove (struct acpi_device *device) {acpi_handle handle = device->handle; -struct acpi_object_list arg_list; -union acpi_object arg;struct device *errdev;acpi_status status;unsigned long long sta;
@@ -258,32 +256,15 @@ static int acpi_scan_hot_remove(struct acpi_device *device)put_device (&device->dev); device =NULL ; -if (acpi_has_method (handle,"_LCK" )) { - 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 ; - +acpi_evaluate_lck (handle,0 );/* * 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 ; - } - } + status =acpi_evaluate_ej0 (handle); +if (status ==AE_NOT_FOUND ) +return -ENODEV ; +else if (ACPI_FAILURE (status)) +return -EIO ;/* * Verify if eject was indeed successful. If not, log an error
drivers/acpi/utils.c +43 -0
46 lines not on this page · raw message
include/acpi/acpi_bus.h +2 -0
@@ -60,6 +60,8 @@ acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pldbool acpi_has_method (acpi_handle handle,char *name);acpi_status acpi_execute_simple_method (acpi_handle handle,char *method,u64 arg); +acpi_status acpi_evaluate_ej0 (acpi_handle handle); +acpi_status acpi_evaluate_lck (acpi_handle handle,int lock);#ifdef CONFIG_ACPI
Signature · 1 line
1.8.1.2
PATCH v3 8/10 ACPI: change acpi_[bay|dock]_match() in scan.c as global functions
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Function acpi_[bay|dock]_match() in scan.c could be shared with dock.c to reduce duplicated code, so refine and change them as global functions. Also add a new function acpi_ata_match() to check whether an ACPI object device is an ATA device.
--- drivers/acpi/scan.c | 77 +++++++++++++++++++++++-------------------------- include/acpi/acpi_bus.h | 3 ++ 2 files changed, 39 insertions(+), 41 deletions(-)
drivers/acpi/scan.c +36 -41
@@ -1481,43 +1481,45 @@ static void acpi_device_get_busid(struct acpi_device *device) }/* +* acpi_ata_match - see if an acpi object is an ATA device +* +* If an acpi object has one of the ACPI ATA methods defined, +* then we can safely call it an ATA device. +*/ +bool acpi_ata_match (acpi_handle handle) +{ +return acpi_has_method (handle,"_GTF" ) || +acpi_has_method (handle,"_GTM" ) || +acpi_has_method (handle,"_STM" ) || +acpi_has_method (handle,"_SDD" ); +} + +/* * acpi_bay_match - see if an acpi object is an ejectable driver bay * * If an acpi object is ejectable and has one of the ACPI ATA methods defined, * then we can safely call it an ejectable drive bay */ -static int acpi_bay_match (acpi_handle handle) +bool acpi_bay_match (acpi_handle handle) {acpi_handle phandle;if (!acpi_has_method (handle,"_EJ0" )) -return -ENODEV ; +return false; +if (acpi_ata_match (handle)) +return true; +if (ACPI_FAILURE (acpi_get_parent (handle, &phandle))) +return false; -if (acpi_has_method (handle,"_GTF" ) || -acpi_has_method (handle,"_GTM" ) || -acpi_has_method (handle,"_STM" ) || -acpi_has_method (handle,"_SDD" )) -return 0 ; - -if (acpi_get_parent (handle, &phandle)) -return -ENODEV ; - -if (acpi_has_method (phandle,"_GTF" ) || -acpi_has_method (phandle,"_GTM" ) || -acpi_has_method (phandle,"_STM" ) || -acpi_has_method (phandle,"_SDD" )) -return 0 ; - -return -ENODEV ; +return acpi_ata_match (phandle); }/* * acpi_dock_match - see if an acpi object has a _DCK method */ -static int acpi_dock_match (acpi_handle handle) +bool acpi_dock_match (acpi_handle handle) { -acpi_handle tmp; -return acpi_get_handle (handle,"_DCK" , &tmp); +return acpi_has_method (handle,"_DCK" ); }const char *acpi_device_hid (struct acpi_device *device)
@@ -1555,33 +1557,26 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)* lacks the SMBUS01 HID and the methods do not have the necessary "_" * prefix. Work around this. */ -static int acpi_ibm_smbus_match (acpi_handle handle) +static bool acpi_ibm_smbus_match (acpi_handle handle) { -struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER ,NULL }; -int result; +char node_name[ACPI_PATH_SEGMENT_LENGTH ]; +struct acpi_buffer path = {sizeof (node_name), node_name };if (!dmi_name_in_vendors ("IBM" )) -return -ENODEV ; +return false;/* Look for SMBS object */ - result =acpi_get_name (handle,ACPI_SINGLE_NAME , &path); -if (result) -return result; - -if (strcmp ("SMBS" , path.pointer)) { - result = -ENODEV ; - goto out; - } +if (ACPI_FAILURE (acpi_get_name (handle,ACPI_SINGLE_NAME , &path)) || +strcmp ("SMBS" , path.pointer)) +return false;/* Does it have the necessary (but misnamed) methods? */ - result = -ENODEV ;if (acpi_has_method (handle,"SBI" ) &&acpi_has_method (handle,"SBR" ) &&acpi_has_method (handle,"SBW" )) - result =0 ; -out: -kfree (path.pointer); -return result; +return true; + +return false; } static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
@@ -1629,11 +1624,11 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,*/ if (acpi_is_video_device (handle))acpi_add_id (pnp,ACPI_VIDEO_HID ); -else if (ACPI_SUCCESS (acpi_bay_match (handle))) +else if (acpi_bay_match (handle))acpi_add_id (pnp,ACPI_BAY_HID ); -else if (ACPI_SUCCESS (acpi_dock_match (handle))) +else if (acpi_dock_match (handle))acpi_add_id (pnp,ACPI_DOCK_HID ); -else if (!acpi_ibm_smbus_match (handle)) +else if (acpi_ibm_smbus_match (handle))acpi_add_id (pnp,ACPI_SMBUS_IBM_HID );else if (list_empty (&pnp->ids) && handle ==ACPI_ROOT_OBJECT ) {acpi_add_id (pnp,ACPI_BUS_HID );/* \_SB, LNXSYBUS */
include/acpi/acpi_bus.h +3 -0
@@ -62,6 +62,9 @@ acpi_status acpi_execute_simple_method(acpi_handle handle, char *method, u64 arg);acpi_status acpi_evaluate_ej0 (acpi_handle handle);acpi_status acpi_evaluate_lck (acpi_handle handle,int lock); +bool acpi_ata_match (acpi_handle handle); +bool acpi_bay_match (acpi_handle handle); +bool acpi_dock_match (acpi_handle handle);#ifdef CONFIG_ACPI
Signature · 1 line
1.8.1.2
PATCH v3 9/10 ACPI: simplify dock driver with new helper functions
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Use new helper functions to simplify ACPI dock driver.
--- drivers/acpi/dock.c | 122 ++++++---------------------------------------------- 1 file changed, 12 insertions(+), 110 deletions(-)
drivers/acpi/dock.c +12 -110
@@ -226,48 +226,6 @@ find_dock_dependent_device(struct dock_station *ds, acpi_handle handle)/***************************************************************************** * Dock functions * *****************************************************************************/ -/** -* is_dock - see if a device is a dock station -* @handle: acpi handle of the device -* -* 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) -{ -acpi_status status; -acpi_handle tmp; - - status =acpi_get_handle (handle,"_DCK" , &tmp); -if (ACPI_FAILURE (status)) -return 0 ; -return 1 ; -} - -static int __init 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 ; -} - -static int __init is_ata (acpi_handle handle) -{ -acpi_handle tmp; - -if ((ACPI_SUCCESS (acpi_get_handle (handle,"_GTF" , &tmp))) || - (ACPI_SUCCESS (acpi_get_handle (handle,"_GTM" , &tmp))) || - (ACPI_SUCCESS (acpi_get_handle (handle,"_STM" , &tmp))) || - (ACPI_SUCCESS (acpi_get_handle (handle,"_SDD" , &tmp)))) -return 1 ; - -return 0 ; -} -static int __init is_battery (acpi_handle handle) {struct acpi_device_info *info;
@@ -284,17 +242,13 @@ static int __init is_battery(acpi_handle handle)return ret; } -static int __init is_ejectable_bay (acpi_handle handle) +/* Check whether ACPI object is an ejectable battery or disk bay */ +static bool __init is_ejectable_bay (acpi_handle handle) { -acpi_handle phandle; +if (acpi_has_method (handle,"_EJ0" ) &&is_battery (handle)) +return true; -if (!is_ejectable (handle)) -return 0 ; -if (is_battery (handle) ||is_ata (handle)) -return 1 ; -if (!acpi_get_parent (handle, &phandle) &&is_ata (phandle)) -return 1 ; -return 0 ; +return acpi_bay_match (handle); }/**
@@ -312,7 +266,7 @@ int is_dock_device(acpi_handle handle)if (!dock_station_count)return 0 ; -if (is_dock (handle)) +if (acpi_dock_match (handle))return 1 ;list_for_each_entry (dock_station, &dock_stations, sibling)
@@ -447,37 +401,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
@@ -537,27 +460,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
@@ -692,8 +594,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 ;
@@ -752,7 +654,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 ; }
@@ -998,9 +900,9 @@ static int __init dock_add(acpi_handle handle)/* we want the dock device to send uevents */ dev_set_uevent_suppress (&dd->dev,0 ); -if (is_dock (handle)) +if (acpi_dock_match (handle)) dock_station->flags |=DOCK_IS_DOCK ; -if (is_ata (handle)) +if (acpi_ata_match (handle)) dock_station->flags |=DOCK_IS_ATA ;if (is_battery (handle)) dock_station->flags |=DOCK_IS_BAT ;
@@ -1043,7 +945,7 @@ err_unregister:static __init acpi_status find_dock_and_bay (acpi_handle handle,u32 lvl,void *context,void **rv) { -if (is_dock (handle) ||is_ejectable_bay (handle)) +if (acpi_dock_match (handle) ||is_ejectable_bay (handle))dock_add (handle);return AE_OK ;
Signature · 1 line
1.8.1.2
PATCH v3 10/10 ACPI: simplify acpiphp driver with new helper functions
In reply to Jiang LiuFrom: Jiang Liu <[email protected]>
Use new helper functions to simplify acpiphp driver.
--- drivers/pci/hotplug/acpiphp_glue.c | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-)
drivers/pci/hotplug/acpiphp_glue.c +8 -22
@@ -201,7 +201,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context;struct acpiphp_slot *slot;struct acpiphp_func *newfunc; -acpi_handle tmp;acpi_status status =AE_OK ;unsigned long long adr, sun;int device, function, retval, found =0 ;
@@ -232,19 +231,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) +if (acpi_has_method (handle,"_EJ0" )) newfunc->flags =FUNC_HAS_EJ0 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp))) +if (acpi_has_method (handle,"_STA" )) newfunc->flags |=FUNC_HAS_STA ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_PS0" , &tmp))) +if (acpi_has_method (handle,"_PS0" )) newfunc->flags |=FUNC_HAS_PS0 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_PS3" , &tmp))) +if (acpi_has_method (handle,"_PS3" )) newfunc->flags |=FUNC_HAS_PS3 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_DCK" , &tmp))) +if (acpi_has_method (handle,"_DCK" )) newfunc->flags |=FUNC_HAS_DCK ; status =acpi_evaluate_integer (handle,"_SUN" ,NULL , &sun);
@@ -843,25 +842,14 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)*/ 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__); +if (ACPI_FAILURE (acpi_evaluate_ej0 (func->handle)))return -1 ; - }else +else break ; } }
@@ -1171,7 +1159,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,*/ void acpiphp_enumerate_slots (struct pci_bus *bus,acpi_handle handle) { -acpi_handle dummy_handle;struct acpiphp_bridge *bridge;if (acpiphp_disabled)
@@ -1200,8 +1187,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)get_device (&bus->dev);if (!pci_is_root_bus (bridge->pci_bus) && -ACPI_SUCCESS (acpi_get_handle (bridge->handle, -"_EJ0" , &dummy_handle))) { +acpi_has_method (bridge->handle,"_EJ0" )) {dbg ("found ejectable p2p bridge\n" ); bridge->flags |=BRIDGE_HAS_EJ0 ; bridge->func =acpiphp_bridge_handle_to_function (handle);
Signature · 1 line
1.8.1.2
Re: [PATCH v3 10/10] ACPI: simplify acpiphp driver with new helper functions
Quoted 5 lines · Jiang Liu
From: Jiang Liu <[email protected]>
Use new helper functions to simplify acpiphp driver.
Signed-off-by Jiang Liu <[email protected]>
I assume this will be merged via linux-pm with the rest of the series.
Quoted 99 lines
Cc Jiang Liu <[email protected]>Cc Bjorn Helgaas <[email protected]>Cc Yinghai Lu <[email protected]>Cc Len Brown <[email protected]>Cc "Rafael J. Wysocki" <[email protected]>Cc Yijing Wang <[email protected]>--- drivers/pci/hotplug/acpiphp_glue.c | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-)drivers/pci/hotplug/acpiphp_glue.c +8
-23@@ -201,7 +201,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context;struct acpiphp_slot *slot;struct acpiphp_func *newfunc; -acpi_handle tmp;acpi_status status =AE_OK ;unsigned long long adr, sun;int device, function, retval, found =0 ;@@ -232,19 +231,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) +if (acpi_has_method (handle,"_EJ0" )) newfunc->flags =FUNC_HAS_EJ0 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp))) +if (acpi_has_method (handle,"_STA" )) newfunc->flags |=FUNC_HAS_STA ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_PS0" , &tmp))) +if (acpi_has_method (handle,"_PS0" )) newfunc->flags |=FUNC_HAS_PS0 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_PS3" , &tmp))) +if (acpi_has_method (handle,"_PS3" )) newfunc->flags |=FUNC_HAS_PS3 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_DCK" , &tmp))) +if (acpi_has_method (handle,"_DCK" )) newfunc->flags |=FUNC_HAS_DCK ; status =acpi_evaluate_integer (handle,"_SUN" ,NULL , &sun);@@ -843,25 +842,14 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)*/ 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__); +if (ACPI_FAILURE (acpi_evaluate_ej0 (func->handle)))return -1 ; - }else +else break ; } }@@ -1171,7 +1159,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,*/ void acpiphp_enumerate_slots (struct pci_bus *bus,acpi_handle handle) { -acpi_handle dummy_handle;struct acpiphp_bridge *bridge;if (acpiphp_disabled)@@ -1200,8 +1187,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)get_device (&bus->dev);if (!pci_is_root_bus (bridge->pci_bus) && -ACPI_SUCCESS (acpi_get_handle (bridge->handle, -"_EJ0" , &dummy_handle))) { +acpi_has_method (bridge->handle,"_EJ0" )) {dbg ("found ejectable p2p bridge\n" ); bridge->flags |=BRIDGE_HAS_EJ0 ; bridge->func =acpiphp_bridge_handle_to_function (handle); --1.8.1.2
Re: [PATCH v3 10/10] ACPI: simplify acpiphp driver with new helper functions
Quoted 10 lines · Bjorn Helgaas
Quoted 5 lines · Jiang Liu
From: Jiang Liu <[email protected]>
Use new helper functions to simplify acpiphp driver.
Signed-off-by Jiang Liu <[email protected]>Acked-by Bjorn Helgaas <[email protected]>I assume this will be merged via linux-pm with the rest of the series.
Yup, into 3.12.
Thanks,
Rafael
Quoted 99 lines
Quoted 99 lines
Cc Jiang Liu <[email protected]>Cc Bjorn Helgaas <[email protected]>Cc Yinghai Lu <[email protected]>Cc Len Brown <[email protected]>Cc "Rafael J. Wysocki" <[email protected]>Cc Yijing Wang <[email protected]>--- drivers/pci/hotplug/acpiphp_glue.c | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-)drivers/pci/hotplug/acpiphp_glue.c +8
-23@@ -201,7 +201,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context;struct acpiphp_slot *slot;struct acpiphp_func *newfunc; -acpi_handle tmp;acpi_status status =AE_OK ;unsigned long long adr, sun;int device, function, retval, found =0 ;@@ -232,19 +231,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) newfunc->handle = handle; newfunc->function = function; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_EJ0" , &tmp))) +if (acpi_has_method (handle,"_EJ0" )) newfunc->flags =FUNC_HAS_EJ0 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_STA" , &tmp))) +if (acpi_has_method (handle,"_STA" )) newfunc->flags |=FUNC_HAS_STA ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_PS0" , &tmp))) +if (acpi_has_method (handle,"_PS0" )) newfunc->flags |=FUNC_HAS_PS0 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_PS3" , &tmp))) +if (acpi_has_method (handle,"_PS3" )) newfunc->flags |=FUNC_HAS_PS3 ; -if (ACPI_SUCCESS (acpi_get_handle (handle,"_DCK" , &tmp))) +if (acpi_has_method (handle,"_DCK" )) newfunc->flags |=FUNC_HAS_DCK ; status =acpi_evaluate_integer (handle,"_SUN" ,NULL , &sun);@@ -843,25 +842,14 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)*/ 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__); +if (ACPI_FAILURE (acpi_evaluate_ej0 (func->handle)))return -1 ; - }else +else break ; } }@@ -1171,7 +1159,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,*/ void acpiphp_enumerate_slots (struct pci_bus *bus,acpi_handle handle) { -acpi_handle dummy_handle;struct acpiphp_bridge *bridge;if (acpiphp_disabled)@@ -1200,8 +1187,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)get_device (&bus->dev);if (!pci_is_root_bus (bridge->pci_bus) && -ACPI_SUCCESS (acpi_get_handle (bridge->handle, -"_EJ0" , &dummy_handle))) { +acpi_has_method (bridge->handle,"_EJ0" )) {dbg ("found ejectable p2p bridge\n" ); bridge->flags |=BRIDGE_HAS_EJ0 ; bridge->func =acpiphp_bridge_handle_to_function (handle); --1.8.1.2
Signature · 2 lines
I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center.
Quoted 26 lines · Jiang Liu
From: Jiang Liu <[email protected]>
This is an following up patchset of "[PATCH 0/3] ACPI / dock / PCI: Fix problems with dock and PCI hotplug" with minor code cleanups and refinements. It applies to
git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.gitlinux-nextDue to hardware resource limitation, I have only done compilation and boot tests.
V2->V3:
The first four patches are the same as previous version and rework all other patches according to review comments.Jiang Liu (10):
ACPI, DOCK: avoid initializingacpi_dock_notifier_listmultiple times ACPI, DOCK: kill redundant spin lock in dock station object ACPI, DOCK: mark initialization functions with__initACPI, DOCK: simplify implementation ofdock_create_acpi_device()
ACPI: introduce helper functionacpi_has_method()
ACPI: introduce helper functionacpi_execute_simple_method()
ACPI: introduce two helper functions to simplify code
ACPI: change acpi_[bay|dock]_match() inscan.cas global functions
ACPI: simplify dock driver with new helper functions
ACPI: simplify acpiphp driver with new helper functions
Quoted 16 lines
drivers/acpi/battery.c | 19 +--- drivers/acpi/bus.c | 6 +- drivers/acpi/dock.c | 152 ++++------------------------- drivers/acpi/ec.c | 4 +- drivers/acpi/power.c | 4 +- drivers/acpi/processor_perflib.c | 22 ++--- drivers/acpi/resource.c | 4 +- drivers/acpi/scan.c | 189 +++++++++++++------------------------ drivers/acpi/sleep.c | 7 +- drivers/acpi/thermal.c | 18 +--- drivers/acpi/utils.c | 70 ++++++++++++++ drivers/acpi/video.c | 56 ++++------- drivers/acpi/video_detect.c | 19 ++-- drivers/pci/hotplug/acpiphp_glue.c | 30 ++---- include/acpi/acpi_bus.h | 10 ++ 15 files changed, 218 insertions(+), 392 deletions(-)
Looks good, thanks!
I'll queue all 10 up for 3.12.
Rafael