* Re: [PATCH 12/12] ACPI: Fan: Drop force_power_state acpi_device option [not found] ` <20071022101921.2937.66363.stgit@samsung> @ 2007-10-24 21:51 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 21:51 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:19, Alexey Starikovskiy wrote: > force_power_state was used as a workaround for invalid cached > power state of the device. We do not cache power state, so no need for > workaround. > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- Acked-by: Rafael J. Wysocki <rjw@sisk.pl> > drivers/acpi/bus.c | 2 +- > drivers/acpi/fan.c | 40 ---------------------------------------- > include/acpi/acpi_bus.h | 3 +-- > 3 files changed, 2 insertions(+), 43 deletions(-) > > diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c > index fdee82d..49d432d 100644 > --- a/drivers/acpi/bus.c > +++ b/drivers/acpi/bus.c > @@ -201,7 +201,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) > * Get device's current power state > */ > acpi_bus_get_power(device->handle, &device->power.state); > - if ((state == device->power.state) && !device->flags.force_power_state) { > + if (state == device->power.state) { > ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", > state)); > return 0; > diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c > index a6e149d..a5a5532 100644 > --- a/drivers/acpi/fan.c > +++ b/drivers/acpi/fan.c > @@ -47,8 +47,6 @@ MODULE_LICENSE("GPL"); > > static int acpi_fan_add(struct acpi_device *device); > static int acpi_fan_remove(struct acpi_device *device, int type); > -static int acpi_fan_suspend(struct acpi_device *device, pm_message_t state); > -static int acpi_fan_resume(struct acpi_device *device); > > static const struct acpi_device_id fan_device_ids[] = { > {"PNP0C0B", 0}, > @@ -63,8 +61,6 @@ static struct acpi_driver acpi_fan_driver = { > .ops = { > .add = acpi_fan_add, > .remove = acpi_fan_remove, > - .suspend = acpi_fan_suspend, > - .resume = acpi_fan_resume, > }, > }; > > @@ -195,10 +191,6 @@ static int acpi_fan_add(struct acpi_device *device) > goto end; > } > > - device->flags.force_power_state = 1; > - acpi_bus_set_power(device->handle, state); > - device->flags.force_power_state = 0; > - > result = acpi_fan_add_fs(device); > if (result) > goto end; > @@ -224,38 +216,6 @@ static int acpi_fan_remove(struct acpi_device *device, int type) > return 0; > } > > -static int acpi_fan_suspend(struct acpi_device *device, pm_message_t state) > -{ > - if (!device) > - return -EINVAL; > - > - acpi_bus_set_power(device->handle, ACPI_STATE_D0); > - > - return AE_OK; > -} > - > -static int acpi_fan_resume(struct acpi_device *device) > -{ > - int result = 0; > - int power_state = 0; > - > - if (!device) > - return -EINVAL; > - > - result = acpi_bus_get_power(device->handle, &power_state); > - if (result) { > - ACPI_DEBUG_PRINT((ACPI_DB_ERROR, > - "Error reading fan power state\n")); > - return result; > - } > - > - device->flags.force_power_state = 1; > - acpi_bus_set_power(device->handle, power_state); > - device->flags.force_power_state = 0; > - > - return result; > -} > - > static int __init acpi_fan_init(void) > { > int result = 0; > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > index 7b74b60..19c3ead 100644 > --- a/include/acpi/acpi_bus.h > +++ b/include/acpi/acpi_bus.h > @@ -168,8 +168,7 @@ struct acpi_device_flags { > u32 power_manageable:1; > u32 performance_manageable:1; > u32 wake_capable:1; /* Wakeup(_PRW) supported? */ > - u32 force_power_state:1; > - u32 reserved:19; > + u32 reserved:20; > }; > > /* File System */ > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101915.2937.5590.stgit@samsung>]
* Re: [PATCH 11/12] ACPI: Fan: fan device does not need own structure [not found] ` <20071022101915.2937.5590.stgit@samsung> @ 2007-10-24 21:52 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 21:52 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:19, Alexey Starikovskiy wrote: > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- Acked-by: Rafael J. Wysocki <rjw@sisk.pl> > drivers/acpi/fan.c | 32 +++++++------------------------- > 1 files changed, 7 insertions(+), 25 deletions(-) > > diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c > index c81f6bd..a6e149d 100644 > --- a/drivers/acpi/fan.c > +++ b/drivers/acpi/fan.c > @@ -68,10 +68,6 @@ static struct acpi_driver acpi_fan_driver = { > }, > }; > > -struct acpi_fan { > - struct acpi_device * device; > -}; > - > /* -------------------------------------------------------------------------- > FS Interface (/proc) > -------------------------------------------------------------------------- */ > @@ -80,12 +76,12 @@ static struct proc_dir_entry *acpi_fan_dir; > > static int acpi_fan_read_state(struct seq_file *seq, void *offset) > { > - struct acpi_fan *fan = seq->private; > + struct acpi_device *device = seq->private; > int state = 0; > > > - if (fan) { > - if (acpi_bus_get_power(fan->device->handle, &state)) > + if (device) { > + if (acpi_bus_get_power(device->handle, &state)) > seq_printf(seq, "status: ERROR\n"); > else > seq_printf(seq, "status: %s\n", > @@ -105,11 +101,10 @@ acpi_fan_write_state(struct file *file, const char __user * buffer, > { > int result = 0; > struct seq_file *m = file->private_data; > - struct acpi_fan *fan = m->private; > + struct acpi_device *device = m->private; > char state_string[12] = { '\0' }; > > - > - if (!fan || (count > sizeof(state_string) - 1)) > + if (count > sizeof(state_string) - 1) > return -EINVAL; > > if (copy_from_user(state_string, buffer, count)) > @@ -117,7 +112,7 @@ acpi_fan_write_state(struct file *file, const char __user * buffer, > > state_string[count] = '\0'; > > - result = acpi_bus_set_power(fan->device->handle, > + result = acpi_bus_set_power(device->handle, > simple_strtoul(state_string, NULL, 0)); > if (result) > return result; > @@ -158,7 +153,7 @@ static int acpi_fan_add_fs(struct acpi_device *device) > return -ENODEV; > else { > entry->proc_fops = &acpi_fan_state_ops; > - entry->data = acpi_driver_data(device); > + entry->data = device; > entry->owner = THIS_MODULE; > } > > @@ -191,14 +186,8 @@ static int acpi_fan_add(struct acpi_device *device) > if (!device) > return -EINVAL; > > - fan = kzalloc(sizeof(struct acpi_fan), GFP_KERNEL); > - if (!fan) > - return -ENOMEM; > - > - fan->device = device; > strcpy(acpi_device_name(device), "Fan"); > strcpy(acpi_device_class(device), ACPI_FAN_CLASS); > - acpi_driver_data(device) = fan; > > result = acpi_bus_get_power(device->handle, &state); > if (result) { > @@ -227,18 +216,11 @@ static int acpi_fan_add(struct acpi_device *device) > > static int acpi_fan_remove(struct acpi_device *device, int type) > { > - struct acpi_fan *fan = NULL; > - > - > if (!device || !acpi_driver_data(device)) > return -EINVAL; > > - fan = acpi_driver_data(device); > - > acpi_fan_remove_fs(device); > > - kfree(fan); > - > return 0; > } > > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101909.2937.14958.stgit@samsung>]
* Re: [PATCH 10/12] ACPI: power: don't cache power resource state [not found] ` <20071022101909.2937.14958.stgit@samsung> @ 2007-10-24 21:57 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 21:57 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List On Monday, 22 October 2007 12:19, Alexey Starikovskiy wrote: > ACPI may change power resource state behind our back, so don't > keep our local copy, which may not be valid. > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- > > drivers/acpi/bus.c | 6 ++--- > drivers/acpi/power.c | 63 +++++++++++++++++++------------------------------- > 2 files changed, 26 insertions(+), 43 deletions(-) > > diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c > index fb2cff9..fdee82d 100644 > --- a/drivers/acpi/bus.c > +++ b/drivers/acpi/bus.c > @@ -198,11 +198,9 @@ int acpi_bus_set_power(acpi_handle handle, int state) > return -ENODEV; > } > /* > - * Get device's current power state if it's unknown > - * This means device power state isn't initialized or previous setting failed > + * Get device's current power state > */ > - if ((device->power.state == ACPI_STATE_UNKNOWN) || device->flags.force_power_state) > - acpi_bus_get_power(device->handle, &device->power.state); > + acpi_bus_get_power(device->handle, &device->power.state); > if ((state == device->power.state) && !device->flags.force_power_state) { > ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", > state)); > diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c > index 57b9a29..af1769a 100644 > --- a/drivers/acpi/power.c > +++ b/drivers/acpi/power.c > @@ -86,7 +86,6 @@ struct acpi_power_resource { > acpi_bus_id name; > u32 system_level; > u32 order; > - int state; > struct mutex resource_lock; > struct list_head reference; > }; > @@ -128,33 +127,31 @@ acpi_power_get_context(acpi_handle handle, > return 0; > } > > -static int acpi_power_get_state(struct acpi_power_resource *resource) > +static int acpi_power_get_state(struct acpi_power_resource *resource, int *state) > { > acpi_status status = AE_OK; > unsigned long sta = 0; > > > - if (!resource) > + if (!resource || !state) > return -EINVAL; > > status = acpi_evaluate_integer(resource->device->handle, "_STA", NULL, &sta); > if (ACPI_FAILURE(status)) > return -ENODEV; > > - if (sta & 0x01) > - resource->state = ACPI_POWER_RESOURCE_STATE_ON; > - else > - resource->state = ACPI_POWER_RESOURCE_STATE_OFF; > + *state = (sta & 0x01)?ACPI_POWER_RESOURCE_STATE_ON: > + ACPI_POWER_RESOURCE_STATE_OFF; > > ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n", > - resource->name, resource->state ? "on" : "off")); > + resource->name, state ? "on" : "off")); > > return 0; > } > > static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) > { > - int result = 0; > + int result = 0, state1; This is a tiny bit inconsistent with the instances below where the local variable is called "state" (ie. without the "1"). I'd just call the argument "state_p" and the auxiliary variable "state". > struct acpi_power_resource *resource = NULL; > u32 i = 0; > > @@ -168,11 +165,11 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) > result = acpi_power_get_context(list->handles[i], &resource); > if (result) > return result; > - result = acpi_power_get_state(resource); > + result = acpi_power_get_state(resource, &state1); > if (result) > return result; > > - *state = resource->state; > + *state = state1; > > if (*state != ACPI_POWER_RESOURCE_STATE_ON) > break; > @@ -186,7 +183,7 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) > > static int acpi_power_on(acpi_handle handle, struct acpi_device *dev) > { > - int result = 0; > + int result = 0, state; > int found = 0; > acpi_status status = AE_OK; > struct acpi_power_resource *resource = NULL; > @@ -224,20 +221,14 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev) > } > mutex_unlock(&resource->resource_lock); > > - if (resource->state == ACPI_POWER_RESOURCE_STATE_ON) { > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] already on\n", > - resource->name)); > - return 0; > - } > - > status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL); > if (ACPI_FAILURE(status)) > return -ENODEV; > > - result = acpi_power_get_state(resource); > + result = acpi_power_get_state(resource, &state); > if (result) > return result; > - if (resource->state != ACPI_POWER_RESOURCE_STATE_ON) > + if (state != ACPI_POWER_RESOURCE_STATE_ON) > return -ENOEXEC; > > /* Update the power resource's _device_ power state */ > @@ -250,7 +241,7 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev) > > static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev) > { > - int result = 0; > + int result = 0, state; > acpi_status status = AE_OK; > struct acpi_power_resource *resource = NULL; > struct list_head *node, *next; > @@ -281,20 +272,14 @@ static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev) > } > mutex_unlock(&resource->resource_lock); > > - if (resource->state == ACPI_POWER_RESOURCE_STATE_OFF) { > - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] already off\n", > - resource->name)); > - return 0; > - } > - > status = acpi_evaluate_object(resource->device->handle, "_OFF", NULL, NULL); > if (ACPI_FAILURE(status)) > return -ENODEV; > > - result = acpi_power_get_state(resource); > + result = acpi_power_get_state(resource, &state); > if (result) > return result; > - if (resource->state != ACPI_POWER_RESOURCE_STATE_OFF) > + if (state != ACPI_POWER_RESOURCE_STATE_OFF) > return -ENOEXEC; > > /* Update the power resource's _device_ power state */ > @@ -494,7 +479,7 @@ static struct proc_dir_entry *acpi_power_dir; > static int acpi_power_seq_show(struct seq_file *seq, void *offset) > { > int count = 0; > - int result = 0; > + int result = 0, state; > struct acpi_power_resource *resource = NULL; > struct list_head *node, *next; > struct acpi_power_reference *ref; > @@ -505,12 +490,12 @@ static int acpi_power_seq_show(struct seq_file *seq, void *offset) > if (!resource) > goto end; > > - result = acpi_power_get_state(resource); > + result = acpi_power_get_state(resource, &state); > if (result) > goto end; > > seq_puts(seq, "state: "); > - switch (resource->state) { > + switch (state) { > case ACPI_POWER_RESOURCE_STATE_ON: > seq_puts(seq, "on\n"); > break; > @@ -591,7 +576,7 @@ static int acpi_power_remove_fs(struct acpi_device *device) > > static int acpi_power_add(struct acpi_device *device) > { > - int result = 0; > + int result = 0, state; > acpi_status status = AE_OK; > struct acpi_power_resource *resource = NULL; > union acpi_object acpi_object; > @@ -622,11 +607,11 @@ static int acpi_power_add(struct acpi_device *device) > resource->system_level = acpi_object.power_resource.system_level; > resource->order = acpi_object.power_resource.resource_order; > > - result = acpi_power_get_state(resource); > + result = acpi_power_get_state(resource, &state); > if (result) > goto end; > > - switch (resource->state) { > + switch (state) { > case ACPI_POWER_RESOURCE_STATE_ON: > device->power.state = ACPI_STATE_D0; > break; > @@ -643,7 +628,7 @@ static int acpi_power_add(struct acpi_device *device) > goto end; > > printk(KERN_INFO PREFIX "%s [%s] (%s)\n", acpi_device_name(device), > - acpi_device_bid(device), resource->state ? "on" : "off"); > + acpi_device_bid(device), state ? "on" : "off"); > > end: > if (result) > @@ -680,7 +665,7 @@ static int acpi_power_remove(struct acpi_device *device, int type) > > static int acpi_power_resume(struct acpi_device *device) > { > - int result = 0; > + int result = 0, state; > struct acpi_power_resource *resource = NULL; > struct acpi_power_reference *ref; > > @@ -689,12 +674,12 @@ static int acpi_power_resume(struct acpi_device *device) > > resource = (struct acpi_power_resource *)acpi_driver_data(device); > > - result = acpi_power_get_state(resource); > + result = acpi_power_get_state(resource, &state); > if (result) > return result; > > mutex_lock(&resource->resource_lock); > - if ((resource->state == ACPI_POWER_RESOURCE_STATE_OFF) && > + if (state == ACPI_POWER_RESOURCE_STATE_OFF && > !list_empty(&resource->reference)) { > ref = container_of(resource->reference.next, struct acpi_power_reference, node); > mutex_unlock(&resource->resource_lock); > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101903.2937.29352.stgit@samsung>]
* Re: [PATCH 09/12] ACPI: EC: Output changes to operational mode [not found] ` <20071022101903.2937.29352.stgit@samsung> @ 2007-10-24 21:59 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 21:59 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:19, Alexey Starikovskiy wrote: > Insert printk() for every change in operational mode. > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- This has been requested by Len, IIRC. Acked-by: Rafael J. Wysocki <rjw@sisk.pl> > drivers/acpi/ec.c | 17 ++++++++++++++--- > 1 files changed, 14 insertions(+), 3 deletions(-) > > diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > index 202db57..bf60b24 100644 > --- a/drivers/acpi/ec.c > +++ b/drivers/acpi/ec.c > @@ -173,12 +173,17 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) > return 0; > clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > if (acpi_ec_check_status(ec, event)) { > - if (event == ACPI_EC_EVENT_OBF_1) > + if (event == ACPI_EC_EVENT_OBF_1) { > /* miss OBF = 1 GPE, don't expect it anymore */ > + printk(KERN_INFO PREFIX "missing OBF_1 confirmation," > + "switching to degraded mode.\n"); > set_bit(EC_FLAGS_ONLY_IBF_GPE, &ec->flags); > - else > + } else { > /* missing GPEs, switch back to poll mode */ > + printk(KERN_INFO PREFIX "missing IBF_1 confirmations," > + "switch off interrupt mode.\n"); > clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); > + } > return 0; > } > } else { > @@ -491,8 +496,12 @@ static u32 acpi_ec_gpe_handler(void *data) > if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) > status = acpi_os_execute(OSL_EC_BURST_HANDLER, > acpi_ec_gpe_query, ec); > - } else if (unlikely(!test_bit(EC_FLAGS_GPE_MODE, &ec->flags))) > + } else if (unlikely(!test_bit(EC_FLAGS_GPE_MODE, &ec->flags))) { > + /* this is non-query, must be confirmation */ > + printk(KERN_INFO PREFIX "non-query interrupt received," > + " switching to interrupt mode\n"); > set_bit(EC_FLAGS_GPE_MODE, &ec->flags); > + } > > return ACPI_SUCCESS(status) ? > ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; > @@ -740,6 +749,8 @@ static int acpi_ec_add(struct acpi_device *device) > acpi_ec_add_fs(device); > printk(KERN_INFO PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n", > ec->gpe, ec->command_addr, ec->data_addr); > + printk(KERN_INFO PREFIX "driver started in %s mode\n", > + (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))?"interrupt":"poll"); > return 0; > } > > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101850.2937.81791.stgit@samsung>]
* Re: [PATCH 07/12] ACPI: EC: Don't re-enable GPE for each transaction. [not found] ` <20071022101850.2937.81791.stgit@samsung> @ 2007-10-24 22:05 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 22:05 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:18, Alexey Starikovskiy wrote: > With the auto selection of operation mode, absence of GPEs does not > really degrade performance, so let PM code to handle > enabling/disabling GPEs. > This is a revert of 5d57a6a55ec0bdcb952dbcd3f8ffcde8a3ee9413, > which was meant to be temporary. > > Reference: http://bugzilla.kernel.org/show_bug.cgi?id=7977 > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- Acked-by: Rafael J. Wysocki <rjw@sisk.pl> [I'm not sure about the resolution of the above bug, though.] > drivers/acpi/ec.c | 5 ----- > 1 files changed, 0 insertions(+), 5 deletions(-) > > diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > index 50d55fe..41a21fc 100644 > --- a/drivers/acpi/ec.c > +++ b/drivers/acpi/ec.c > @@ -258,9 +258,6 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, > } > } > > - /* Make sure GPE is enabled before doing transaction */ > - acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); > - > status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0); > if (status) { > printk(KERN_ERR PREFIX > @@ -638,12 +635,10 @@ static struct acpi_ec *make_acpi_ec(void) > struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL); > if (!ec) > return NULL; > - > ec->flags = 1 << EC_FLAGS_QUERY_PENDING; > mutex_init(&ec->lock); > init_waitqueue_head(&ec->wait); > INIT_LIST_HEAD(&ec->list); > - > return ec; > } > > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101812.2937.49361.stgit@samsung>]
* Re: [PATCH 02/12] ACPI: suspend: Wrong order of GPE restore. [not found] ` <20071022101812.2937.49361.stgit@samsung> @ 2007-10-24 22:07 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 22:07 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:18, Alexey Starikovskiy wrote: > acpi_leave_sleep_state() should have correct list of wake and > runtime GPEs, which is available only after disable_wakeup_device() > is called. > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- > > drivers/acpi/sleep/main.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c > index 2f9d3c1..2c0b663 100644 > --- a/drivers/acpi/sleep/main.c > +++ b/drivers/acpi/sleep/main.c > @@ -167,8 +167,8 @@ static void acpi_pm_finish(void) > { > u32 acpi_state = acpi_target_sleep_state; > > - acpi_leave_sleep_state(acpi_state); > acpi_disable_wakeup_device(acpi_state); > + acpi_leave_sleep_state(acpi_state); > > /* reset firmware waking vector */ > acpi_set_firmware_waking_vector((acpi_physical_address) 0); > @@ -272,8 +272,8 @@ static void acpi_hibernation_finish(void) > * enable it here. > */ > acpi_enable(); > - acpi_leave_sleep_state(ACPI_STATE_S4); > acpi_disable_wakeup_device(ACPI_STATE_S4); > + acpi_leave_sleep_state(ACPI_STATE_S4); > > /* reset firmware waking vector */ > acpi_set_firmware_waking_vector((acpi_physical_address) 0); > > - > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101805.2937.92527.stgit@samsung>]
* Re: [PATCH 01/12] ACPI: sleep: Fix GPE suspend cleanup [not found] ` <20071022101805.2937.92527.stgit@samsung> @ 2007-10-24 22:10 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 22:10 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:18, Alexey Starikovskiy wrote: > Commit 9b039330808b83acac3597535da26f47ad1862ce removed > acpi_gpe_sleep_prepare(), the only function used at S5 transition > Add call to generic acpi_enable_wake_device(). > > Reference: https://bugzilla.novell.com/show_bug.cgi?id=299882 > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- Acked-by: Rafael J. Wysocki <rjw@sisk.pl> > drivers/acpi/sleep/main.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c > index f3d3867..2f9d3c1 100644 > --- a/drivers/acpi/sleep/main.c > +++ b/drivers/acpi/sleep/main.c > @@ -410,6 +410,7 @@ static void acpi_power_off(void) > /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ > printk("%s called\n", __FUNCTION__); > local_irq_disable(); > + acpi_enable_wakeup_device(ACPI_STATE_S5); > acpi_enter_sleep_state(ACPI_STATE_S5); > } > > > - > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101818.2937.8977.stgit@samsung>]
* Re: [PATCH 03/12] ACPI: button: send initial lid state after add and resume [not found] ` <20071022101818.2937.8977.stgit@samsung> @ 2007-10-24 22:11 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 22:11 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:18, Alexey Starikovskiy wrote: > Input layer should know about initial state of lid switch, > even before first notify. > > Reference: https://bugzilla.novell.com/show_bug.cgi?id=326814 > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- I've already acked this one, IIRC. > drivers/acpi/button.c | 37 +++++++++++++++++++++++++++++-------- > 1 files changed, 29 insertions(+), 8 deletions(-) > > diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c > index 301e832..24a7865 100644 > --- a/drivers/acpi/button.c > +++ b/drivers/acpi/button.c > @@ -78,6 +78,7 @@ MODULE_DEVICE_TABLE(acpi, button_device_ids); > > static int acpi_button_add(struct acpi_device *device); > static int acpi_button_remove(struct acpi_device *device, int type); > +static int acpi_button_resume(struct acpi_device *device); > static int acpi_button_info_open_fs(struct inode *inode, struct file *file); > static int acpi_button_state_open_fs(struct inode *inode, struct file *file); > > @@ -87,6 +88,7 @@ static struct acpi_driver acpi_button_driver = { > .ids = button_device_ids, > .ops = { > .add = acpi_button_add, > + .resume = acpi_button_resume, > .remove = acpi_button_remove, > }, > }; > @@ -253,6 +255,19 @@ static int acpi_button_remove_fs(struct acpi_device *device) > /* -------------------------------------------------------------------------- > Driver Interface > -------------------------------------------------------------------------- */ > +static int acpi_lid_send_state(struct acpi_button *button) > +{ > + unsigned long state; > + acpi_status status; > + > + status = acpi_evaluate_integer(button->device->handle, "_LID", NULL, > + &state); > + if (ACPI_FAILURE(status)) > + return -ENODEV; > + /* input layer checks if event is redundant */ > + input_report_switch(button->input, SW_LID, !state); > + return 0; > +} > > static void acpi_button_notify(acpi_handle handle, u32 event, void *data) > { > @@ -265,15 +280,8 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data) > switch (event) { > case ACPI_BUTTON_NOTIFY_STATUS: > input = button->input; > - > if (button->type == ACPI_BUTTON_TYPE_LID) { > - struct acpi_handle *handle = button->device->handle; > - unsigned long state; > - > - if (!ACPI_FAILURE(acpi_evaluate_integer(handle, "_LID", > - NULL, &state))) > - input_report_switch(input, SW_LID, !state); > - > + acpi_lid_send_state(button); > } else { > int keycode = test_bit(KEY_SLEEP, input->keybit) ? > KEY_SLEEP : KEY_POWER; > @@ -336,6 +344,17 @@ static int acpi_button_install_notify_handlers(struct acpi_button *button) > return ACPI_FAILURE(status) ? -ENODEV : 0; > } > > +static int acpi_button_resume(struct acpi_device *device) > +{ > + struct acpi_button *button; > + if (!device) > + return -EINVAL; > + button = acpi_driver_data(device); > + if (button && button->type == ACPI_BUTTON_TYPE_LID) > + return acpi_lid_send_state(button); > + return 0; > +} > + > static void acpi_button_remove_notify_handlers(struct acpi_button *button) > { > switch (button->type) { > @@ -453,6 +472,8 @@ static int acpi_button_add(struct acpi_device *device) > error = input_register_device(input); > if (error) > goto err_remove_handlers; > + if (button->type == ACPI_BUTTON_TYPE_LID) > + acpi_lid_send_state(button); > > if (device->wakeup.flags.valid) { > /* Button's GPE is run-wake GPE */ > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20071022101830.2937.52617.stgit@samsung>]
* Re: [PATCH 04/12] ACPI: EC: Replace atomic variables with bits [not found] ` <20071022101830.2937.52617.stgit@samsung> @ 2007-10-24 22:14 ` Rafael J. Wysocki 0 siblings, 0 replies; 9+ messages in thread From: Rafael J. Wysocki @ 2007-10-24 22:14 UTC (permalink / raw) To: Alexey Starikovskiy; +Cc: ACPI Devel Maling List, Len Brown On Monday, 22 October 2007 12:18, Alexey Starikovskiy wrote: > Number of flags is about to be increased, so it is better to > put them all into bits. > No functional changes. > > Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> > --- Looks ok. Acked-by: Rafael J. Wysocki <rjw@sisk.pl> > drivers/acpi/ec.c | 79 +++++++++++++++++++++++++---------------------------- > 1 files changed, 38 insertions(+), 41 deletions(-) > > diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c > index 7b41783..08fbe62 100644 > --- a/drivers/acpi/ec.c > +++ b/drivers/acpi/ec.c > @@ -65,7 +65,7 @@ enum ec_command { > /* EC events */ > enum ec_event { > ACPI_EC_EVENT_OBF_1 = 1, /* Output buffer full */ > - ACPI_EC_EVENT_IBF_0, /* Input buffer empty */ > + ACPI_EC_EVENT_IBF_0, /* Input buffer empty */ > }; > > #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ > @@ -76,6 +76,11 @@ static enum ec_mode { > EC_POLL, /* Input buffer empty */ > } acpi_ec_mode = EC_INTR; > > +enum { > + EC_FLAGS_WAIT_GPE = 0, /* Don't check status until GPE arrives */ > + EC_FLAGS_QUERY_PENDING, /* Query is pending */ > +}; > + > static int acpi_ec_remove(struct acpi_device *device, int type); > static int acpi_ec_start(struct acpi_device *device); > static int acpi_ec_stop(struct acpi_device *device, int type); > @@ -116,9 +121,8 @@ static struct acpi_ec { > unsigned long command_addr; > unsigned long data_addr; > unsigned long global_lock; > + unsigned long flags; > struct mutex lock; > - atomic_t query_pending; > - atomic_t event_count; > wait_queue_head_t wait; > struct list_head list; > u8 handlers_installed; > @@ -148,45 +152,42 @@ static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) > outb(data, ec->data_addr); > } > > -static inline int acpi_ec_check_status(struct acpi_ec *ec, enum ec_event event, > - unsigned old_count) > +static inline int acpi_ec_check_status(struct acpi_ec *ec, enum ec_event event) > { > - u8 status = acpi_ec_read_status(ec); > - if (old_count == atomic_read(&ec->event_count)) > + if (test_bit(EC_FLAGS_WAIT_GPE, &ec->flags)) > return 0; > if (event == ACPI_EC_EVENT_OBF_1) { > - if (status & ACPI_EC_FLAG_OBF) > + if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_OBF) > return 1; > } else if (event == ACPI_EC_EVENT_IBF_0) { > - if (!(status & ACPI_EC_FLAG_IBF)) > + if (!(acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)) > return 1; > } > > return 0; > } > > -static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, > - unsigned count, int force_poll) > +static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) > { > if (unlikely(force_poll) || acpi_ec_mode == EC_POLL) { > unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY); > + clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > while (time_before(jiffies, delay)) { > - if (acpi_ec_check_status(ec, event, 0)) > + if (acpi_ec_check_status(ec, event)) > return 0; > } > } else { > - if (wait_event_timeout(ec->wait, > - acpi_ec_check_status(ec, event, count), > - msecs_to_jiffies(ACPI_EC_DELAY)) || > - acpi_ec_check_status(ec, event, 0)) { > + if (wait_event_timeout(ec->wait, acpi_ec_check_status(ec, event), > + msecs_to_jiffies(ACPI_EC_DELAY))) > + return 0; > + clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > + if (acpi_ec_check_status(ec, event)) { > return 0; > - } else { > - printk(KERN_ERR PREFIX "acpi_ec_wait timeout," > - " status = %d, expect_event = %d\n", > - acpi_ec_read_status(ec), event); > } > } > - > + printk(KERN_ERR PREFIX "acpi_ec_wait timeout," > + " status = %d, expect_event = %d\n", > + acpi_ec_read_status(ec), event); > return -ETIME; > } > > @@ -196,39 +197,38 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command, > int force_poll) > { > int result = 0; > - unsigned count = atomic_read(&ec->event_count); > + set_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > acpi_ec_write_cmd(ec, command); > > for (; wdata_len > 0; --wdata_len) { > - result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, count, force_poll); > + result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, force_poll); > if (result) { > printk(KERN_ERR PREFIX > "write_cmd timeout, command = %d\n", command); > goto end; > } > - count = atomic_read(&ec->event_count); > + set_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > acpi_ec_write_data(ec, *(wdata++)); > } > > if (!rdata_len) { > - result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, count, force_poll); > + result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, force_poll); > if (result) { > printk(KERN_ERR PREFIX > "finish-write timeout, command = %d\n", command); > goto end; > } > - } else if (command == ACPI_EC_COMMAND_QUERY) { > - atomic_set(&ec->query_pending, 0); > - } > + } else if (command == ACPI_EC_COMMAND_QUERY) > + clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); > > for (; rdata_len > 0; --rdata_len) { > - result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1, count, force_poll); > + result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1, force_poll); > if (result) { > printk(KERN_ERR PREFIX "read timeout, command = %d\n", > command); > goto end; > } > - count = atomic_read(&ec->event_count); > + set_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > *(rdata++) = acpi_ec_read_data(ec); > } > end: > @@ -261,7 +261,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command, > /* Make sure GPE is enabled before doing transaction */ > acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR); > > - status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0, 0); > + status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0); > if (status) { > printk(KERN_ERR PREFIX > "input buffer is not empty, aborting transaction\n"); > @@ -476,20 +476,18 @@ static void acpi_ec_gpe_query(void *ec_cxt) > static u32 acpi_ec_gpe_handler(void *data) > { > acpi_status status = AE_OK; > - u8 value; > struct acpi_ec *ec = data; > > - atomic_inc(&ec->event_count); > + clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); > > if (acpi_ec_mode == EC_INTR) { > wake_up(&ec->wait); > } > > - value = acpi_ec_read_status(ec); > - if ((value & ACPI_EC_FLAG_SCI) && !atomic_read(&ec->query_pending)) { > - atomic_set(&ec->query_pending, 1); > - status = > - acpi_os_execute(OSL_EC_BURST_HANDLER, acpi_ec_gpe_query, ec); > + if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_SCI) { > + if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) > + status = acpi_os_execute(OSL_EC_BURST_HANDLER, > + acpi_ec_gpe_query, ec); > } > > return status == AE_OK ? > @@ -642,8 +640,7 @@ static struct acpi_ec *make_acpi_ec(void) > if (!ec) > return NULL; > > - atomic_set(&ec->query_pending, 1); > - atomic_set(&ec->event_count, 1); > + ec->flags = 1 << EC_FLAGS_QUERY_PENDING; > mutex_init(&ec->lock); > init_waitqueue_head(&ec->wait); > INIT_LIST_HEAD(&ec->list); > @@ -833,7 +830,7 @@ static int acpi_ec_start(struct acpi_device *device) > ret = ec_install_handlers(ec); > > /* EC is fully operational, allow queries */ > - atomic_set(&ec->query_pending, 0); > + clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); > return ret; > } > > > > -- "Premature optimization is the root of all evil." - Donald Knuth ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-10-24 21:59 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20071022101535.2937.79385.stgit@samsung>
[not found] ` <20071022101921.2937.66363.stgit@samsung>
2007-10-24 21:51 ` [PATCH 12/12] ACPI: Fan: Drop force_power_state acpi_device option Rafael J. Wysocki
[not found] ` <20071022101915.2937.5590.stgit@samsung>
2007-10-24 21:52 ` [PATCH 11/12] ACPI: Fan: fan device does not need own structure Rafael J. Wysocki
[not found] ` <20071022101909.2937.14958.stgit@samsung>
2007-10-24 21:57 ` [PATCH 10/12] ACPI: power: don't cache power resource state Rafael J. Wysocki
[not found] ` <20071022101903.2937.29352.stgit@samsung>
2007-10-24 21:59 ` [PATCH 09/12] ACPI: EC: Output changes to operational mode Rafael J. Wysocki
[not found] ` <20071022101850.2937.81791.stgit@samsung>
2007-10-24 22:05 ` [PATCH 07/12] ACPI: EC: Don't re-enable GPE for each transaction Rafael J. Wysocki
[not found] ` <20071022101812.2937.49361.stgit@samsung>
2007-10-24 22:07 ` [PATCH 02/12] ACPI: suspend: Wrong order of GPE restore Rafael J. Wysocki
[not found] ` <20071022101805.2937.92527.stgit@samsung>
2007-10-24 22:10 ` [PATCH 01/12] ACPI: sleep: Fix GPE suspend cleanup Rafael J. Wysocki
[not found] ` <20071022101818.2937.8977.stgit@samsung>
2007-10-24 22:11 ` [PATCH 03/12] ACPI: button: send initial lid state after add and resume Rafael J. Wysocki
[not found] ` <20071022101830.2937.52617.stgit@samsung>
2007-10-24 22:14 ` [PATCH 04/12] ACPI: EC: Replace atomic variables with bits Rafael J. Wysocki
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox