Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 199800
b: refs/heads/master
c: b42f5b0
h: refs/heads/master
v: v3
  • Loading branch information
Len Brown committed Jun 2, 2010
1 parent 044fa08 commit f6176cc
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0a76a34ff0804f1f413807b2e2d12117c2b602ca
refs/heads/master: b42f5b0f0fd8c1c442c1b29a3fbcb338e8bd7732
22 changes: 16 additions & 6 deletions trunk/drivers/acpi/ec.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ enum {
EC_FLAGS_GPE_STORM, /* GPE storm detected */
EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and
* OpReg are installed */
EC_FLAGS_FROZEN, /* Transactions are suspended */
EC_FLAGS_BLOCKED, /* Transactions are blocked */
};

/* If we find an EC via the ECDT, we need to keep a ptr to its context */
Expand Down Expand Up @@ -293,7 +293,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
if (t->rdata)
memset(t->rdata, 0, t->rlen);
mutex_lock(&ec->lock);
if (test_bit(EC_FLAGS_FROZEN, &ec->flags)) {
if (test_bit(EC_FLAGS_BLOCKED, &ec->flags)) {
status = -EINVAL;
goto unlock;
}
Expand Down Expand Up @@ -459,7 +459,7 @@ int ec_transaction(u8 command,

EXPORT_SYMBOL(ec_transaction);

void acpi_ec_suspend_transactions(void)
void acpi_ec_block_transactions(void)
{
struct acpi_ec *ec = first_ec;

Expand All @@ -468,11 +468,11 @@ void acpi_ec_suspend_transactions(void)

mutex_lock(&ec->lock);
/* Prevent transactions from being carried out */
set_bit(EC_FLAGS_FROZEN, &ec->flags);
set_bit(EC_FLAGS_BLOCKED, &ec->flags);
mutex_unlock(&ec->lock);
}

void acpi_ec_resume_transactions(void)
void acpi_ec_unblock_transactions(void)
{
struct acpi_ec *ec = first_ec;

Expand All @@ -481,10 +481,20 @@ void acpi_ec_resume_transactions(void)

mutex_lock(&ec->lock);
/* Allow transactions to be carried out again */
clear_bit(EC_FLAGS_FROZEN, &ec->flags);
clear_bit(EC_FLAGS_BLOCKED, &ec->flags);
mutex_unlock(&ec->lock);
}

void acpi_ec_unblock_transactions_early(void)
{
/*
* Allow transactions to happen again (this function is called from
* atomic context during wakeup, so we don't need to acquire the mutex).
*/
if (first_ec)
clear_bit(EC_FLAGS_BLOCKED, &first_ec->flags);
}

static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data)
{
int result;
Expand Down
5 changes: 3 additions & 2 deletions trunk/drivers/acpi/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ void acpi_early_processor_set_pdc(void);
int acpi_ec_init(void);
int acpi_ec_ecdt_probe(void);
int acpi_boot_ec_enable(void);
void acpi_ec_suspend_transactions(void);
void acpi_ec_resume_transactions(void);
void acpi_ec_block_transactions(void);
void acpi_ec_unblock_transactions(void);
void acpi_ec_unblock_transactions_early(void);

/*--------------------------------------------------------------------------
Suspend/Resume
Expand Down
57 changes: 30 additions & 27 deletions trunk/drivers/acpi/sleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,13 @@ void __init acpi_old_suspend_ordering(void)
}

/**
* acpi_pm_disable_gpes - Disable the GPEs.
* acpi_pm_freeze - Disable the GPEs and suspend EC transactions.
*/
static int acpi_pm_disable_gpes(void)
static int acpi_pm_freeze(void)
{
acpi_disable_all_gpes();
acpi_os_wait_events_complete(NULL);
acpi_ec_block_transactions();
return 0;
}

Expand Down Expand Up @@ -126,7 +128,8 @@ static int acpi_pm_prepare(void)
int error = __acpi_pm_prepare();

if (!error)
acpi_disable_all_gpes();
acpi_pm_freeze();

return error;
}

Expand Down Expand Up @@ -256,6 +259,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
* acpi_leave_sleep_state will reenable specific GPEs later
*/
acpi_disable_all_gpes();
/* Allow EC transactions to happen. */
acpi_ec_unblock_transactions_early();

local_irq_restore(flags);
printk(KERN_DEBUG "Back to C!\n");
Expand All @@ -267,6 +272,12 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
return ACPI_SUCCESS(status) ? 0 : -EFAULT;
}

static void acpi_suspend_finish(void)
{
acpi_ec_unblock_transactions();
acpi_pm_finish();
}

static int acpi_suspend_state_valid(suspend_state_t pm_state)
{
u32 acpi_state;
Expand All @@ -288,7 +299,7 @@ static struct platform_suspend_ops acpi_suspend_ops = {
.begin = acpi_suspend_begin,
.prepare_late = acpi_pm_prepare,
.enter = acpi_suspend_enter,
.wake = acpi_pm_finish,
.wake = acpi_suspend_finish,
.end = acpi_pm_end,
};

Expand All @@ -314,9 +325,9 @@ static int acpi_suspend_begin_old(suspend_state_t pm_state)
static struct platform_suspend_ops acpi_suspend_ops_old = {
.valid = acpi_suspend_state_valid,
.begin = acpi_suspend_begin_old,
.prepare_late = acpi_pm_disable_gpes,
.prepare_late = acpi_pm_freeze,
.enter = acpi_suspend_enter,
.wake = acpi_pm_finish,
.wake = acpi_suspend_finish,
.end = acpi_pm_end,
.recover = acpi_pm_finish,
};
Expand Down Expand Up @@ -433,6 +444,7 @@ static int acpi_hibernation_enter(void)
static void acpi_hibernation_finish(void)
{
hibernate_nvs_free();
acpi_ec_unblock_transactions();
acpi_pm_finish();
}

Expand All @@ -453,19 +465,13 @@ static void acpi_hibernation_leave(void)
}
/* Restore the NVS memory area */
hibernate_nvs_restore();
/* Allow EC transactions to happen. */
acpi_ec_unblock_transactions_early();
}

static int acpi_pm_pre_restore(void)
{
acpi_disable_all_gpes();
acpi_os_wait_events_complete(NULL);
acpi_ec_suspend_transactions();
return 0;
}

static void acpi_pm_restore_cleanup(void)
static void acpi_pm_thaw(void)
{
acpi_ec_resume_transactions();
acpi_ec_unblock_transactions();
acpi_enable_all_runtime_gpes();
}

Expand All @@ -477,8 +483,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops = {
.prepare = acpi_pm_prepare,
.enter = acpi_hibernation_enter,
.leave = acpi_hibernation_leave,
.pre_restore = acpi_pm_pre_restore,
.restore_cleanup = acpi_pm_restore_cleanup,
.pre_restore = acpi_pm_freeze,
.restore_cleanup = acpi_pm_thaw,
};

/**
Expand Down Expand Up @@ -510,12 +516,9 @@ static int acpi_hibernation_begin_old(void)

static int acpi_hibernation_pre_snapshot_old(void)
{
int error = acpi_pm_disable_gpes();

if (!error)
hibernate_nvs_save();

return error;
acpi_pm_freeze();
hibernate_nvs_save();
return 0;
}

/*
Expand All @@ -527,11 +530,11 @@ static struct platform_hibernation_ops acpi_hibernation_ops_old = {
.end = acpi_pm_end,
.pre_snapshot = acpi_hibernation_pre_snapshot_old,
.finish = acpi_hibernation_finish,
.prepare = acpi_pm_disable_gpes,
.prepare = acpi_pm_freeze,
.enter = acpi_hibernation_enter,
.leave = acpi_hibernation_leave,
.pre_restore = acpi_pm_pre_restore,
.restore_cleanup = acpi_pm_restore_cleanup,
.pre_restore = acpi_pm_freeze,
.restore_cleanup = acpi_pm_thaw,
.recover = acpi_pm_finish,
};
#endif /* CONFIG_HIBERNATION */
Expand Down

0 comments on commit f6176cc

Please sign in to comment.