mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
x86: OLPC: move s/r-related EC cmds to EC driver
The new EC driver calls platform-specific suspend and resume hooks; run XO-1-specific EC commands from there, rather than deep in s/r code. If we attempt to run EC commands after the new EC driver has suspended, it is refused by the ec->suspended checks. Signed-off-by: Andres Salomon <dilinger@queued.net> Acked-by: Paul Fox <pgf@laptop.org> Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
99ecb01cdf
commit
1fcfd08bd0
2 changed files with 36 additions and 22 deletions
|
@ -52,16 +52,11 @@ EXPORT_SYMBOL_GPL(olpc_xo1_pm_wakeup_clear);
|
||||||
static int xo1_power_state_enter(suspend_state_t pm_state)
|
static int xo1_power_state_enter(suspend_state_t pm_state)
|
||||||
{
|
{
|
||||||
unsigned long saved_sci_mask;
|
unsigned long saved_sci_mask;
|
||||||
int r;
|
|
||||||
|
|
||||||
/* Only STR is supported */
|
/* Only STR is supported */
|
||||||
if (pm_state != PM_SUSPEND_MEM)
|
if (pm_state != PM_SUSPEND_MEM)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
r = olpc_ec_cmd(EC_SET_SCI_INHIBIT, NULL, 0, NULL, 0);
|
|
||||||
if (r)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save SCI mask (this gets lost since PM1_EN is used as a mask for
|
* Save SCI mask (this gets lost since PM1_EN is used as a mask for
|
||||||
* wakeup events, which is not necessarily the same event set)
|
* wakeup events, which is not necessarily the same event set)
|
||||||
|
@ -77,16 +72,6 @@ static int xo1_power_state_enter(suspend_state_t pm_state)
|
||||||
/* Restore SCI mask (using dword access to CS5536_PM1_EN) */
|
/* Restore SCI mask (using dword access to CS5536_PM1_EN) */
|
||||||
outl(saved_sci_mask, acpi_base + CS5536_PM1_STS);
|
outl(saved_sci_mask, acpi_base + CS5536_PM1_STS);
|
||||||
|
|
||||||
/* Tell the EC to stop inhibiting SCIs */
|
|
||||||
olpc_ec_cmd(EC_SET_SCI_INHIBIT_RELEASE, NULL, 0, NULL, 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tell the wireless module to restart USB communication.
|
|
||||||
* Must be done twice.
|
|
||||||
*/
|
|
||||||
olpc_ec_cmd(EC_WAKE_UP_WLAN, NULL, 0, NULL, 0);
|
|
||||||
olpc_ec_cmd(EC_WAKE_UP_WLAN, NULL, 0, NULL, 0);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -263,11 +263,6 @@ int olpc_ec_sci_query(u16 *sci_value)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(olpc_ec_sci_query);
|
EXPORT_SYMBOL_GPL(olpc_ec_sci_query);
|
||||||
|
|
||||||
static int olpc_ec_suspend(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
return olpc_ec_mask_write(ec_wakeup_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool __init check_ofw_architecture(struct device_node *root)
|
static bool __init check_ofw_architecture(struct device_node *root)
|
||||||
{
|
{
|
||||||
const char *olpc_arch;
|
const char *olpc_arch;
|
||||||
|
@ -339,9 +334,40 @@ static int olpc_xo1_ec_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
static int olpc_xo1_ec_suspend(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
olpc_ec_mask_write(ec_wakeup_mask);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Squelch SCIs while suspended. This is a fix for
|
||||||
|
* <http://dev.laptop.org/ticket/1835>.
|
||||||
|
*/
|
||||||
|
return olpc_ec_cmd(EC_SET_SCI_INHIBIT, NULL, 0, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int olpc_xo1_ec_resume(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
/* Tell the EC to stop inhibiting SCIs */
|
||||||
|
olpc_ec_cmd(EC_SET_SCI_INHIBIT_RELEASE, NULL, 0, NULL, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tell the wireless module to restart USB communication.
|
||||||
|
* Must be done twice.
|
||||||
|
*/
|
||||||
|
olpc_ec_cmd(EC_WAKE_UP_WLAN, NULL, 0, NULL, 0);
|
||||||
|
olpc_ec_cmd(EC_WAKE_UP_WLAN, NULL, 0, NULL, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct olpc_ec_driver ec_xo1_driver = {
|
static struct olpc_ec_driver ec_xo1_driver = {
|
||||||
.suspend = olpc_ec_suspend,
|
.probe = olpc_xo1_ec_probe,
|
||||||
|
.suspend = olpc_xo1_ec_suspend,
|
||||||
|
.resume = olpc_xo1_ec_resume,
|
||||||
|
.ec_cmd = olpc_xo1_ec_cmd,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct olpc_ec_driver ec_xo1_5_driver = {
|
||||||
.probe = olpc_xo1_ec_probe,
|
.probe = olpc_xo1_ec_probe,
|
||||||
.ec_cmd = olpc_xo1_ec_cmd,
|
.ec_cmd = olpc_xo1_ec_cmd,
|
||||||
};
|
};
|
||||||
|
@ -354,7 +380,10 @@ static int __init olpc_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* register the XO-1 and 1.5-specific EC handler */
|
/* register the XO-1 and 1.5-specific EC handler */
|
||||||
olpc_ec_driver_register(&ec_xo1_driver, NULL);
|
if (olpc_platform_info.boardrev < olpc_board_pre(0xd0)) /* XO-1 */
|
||||||
|
olpc_ec_driver_register(&ec_xo1_driver, NULL);
|
||||||
|
else
|
||||||
|
olpc_ec_driver_register(&ec_xo1_5_driver, NULL);
|
||||||
platform_device_register_simple("olpc-ec", -1, NULL, 0);
|
platform_device_register_simple("olpc-ec", -1, NULL, 0);
|
||||||
|
|
||||||
/* assume B1 and above models always have a DCON */
|
/* assume B1 and above models always have a DCON */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue