[POWERPC] adb: Replace sleep notifier with platform driver suspend/resume hooks

This replaces the pmu sleep notifier that adb had with suspend/resume
hooks in a new platform driver/device.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Johannes Berg 2007-12-12 01:21:25 +11:00 committed by Paul Mackerras
parent 9fb1e350e1
commit c9f6d3d5c6
1 changed files with 57 additions and 39 deletions

View File

@ -89,14 +89,6 @@ static int sleepy_trackpad;
static int autopoll_devs;
int __adb_probe_sync;
#ifdef CONFIG_PM_SLEEP
static void adb_notify_sleep(struct pmu_sleep_notifier *self, int when);
static struct pmu_sleep_notifier adb_sleep_notifier = {
adb_notify_sleep,
SLEEP_LEVEL_ADB,
};
#endif
static int adb_scan_bus(void);
static int do_adb_reset_bus(void);
static void adbdev_init(void);
@ -281,6 +273,36 @@ adb_reset_bus(void)
return 0;
}
#ifdef CONFIG_PM
/*
* notify clients before sleep
*/
static int adb_suspend(struct platform_device *dev, pm_message_t state)
{
adb_got_sleep = 1;
/* We need to get a lock on the probe thread */
down(&adb_probe_mutex);
/* Stop autopoll */
if (adb_controller->autopoll)
adb_controller->autopoll(0);
blocking_notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
return 0;
}
/*
* reset bus after sleep
*/
static int adb_resume(struct platform_device *dev)
{
adb_got_sleep = 0;
up(&adb_probe_mutex);
adb_reset_bus();
return 0;
}
#endif /* CONFIG_PM */
int __init adb_init(void)
{
struct adb_driver *driver;
@ -313,14 +335,12 @@ int __init adb_init(void)
printk(KERN_WARNING "Warning: no ADB interface detected\n");
adb_controller = NULL;
} else {
#ifdef CONFIG_PM_SLEEP
pmu_register_sleep_notifier(&adb_sleep_notifier);
#endif /* CONFIG_PM */
#ifdef CONFIG_PPC
if (machine_is_compatible("AAPL,PowerBook1998") ||
machine_is_compatible("PowerBook1,1"))
sleepy_trackpad = 1;
#endif /* CONFIG_PPC */
init_completion(&adb_probe_task_comp);
adbdev_init();
adb_reset_bus();
@ -330,33 +350,6 @@ int __init adb_init(void)
__initcall(adb_init);
#ifdef CONFIG_PM
/*
* notify clients before sleep and reset bus afterwards
*/
void
adb_notify_sleep(struct pmu_sleep_notifier *self, int when)
{
switch (when) {
case PBOOK_SLEEP_REQUEST:
adb_got_sleep = 1;
/* We need to get a lock on the probe thread */
down(&adb_probe_mutex);
/* Stop autopoll */
if (adb_controller->autopoll)
adb_controller->autopoll(0);
blocking_notifier_call_chain(&adb_client_list,
ADB_MSG_POWERDOWN, NULL);
break;
case PBOOK_WAKE:
adb_got_sleep = 0;
up(&adb_probe_mutex);
adb_reset_bus();
break;
}
}
#endif /* CONFIG_PM */
static int
do_adb_reset_bus(void)
{
@ -864,7 +857,29 @@ static const struct file_operations adb_fops = {
.release = adb_release,
};
static void
static struct platform_driver adb_pfdrv = {
.driver = {
.name = "adb",
},
#ifdef CONFIG_PM
.suspend = adb_suspend,
.resume = adb_resume,
#endif
};
static struct platform_device adb_pfdev = {
.name = "adb",
};
static int __init
adb_dummy_probe(struct platform_device *dev)
{
if (dev == &adb_pfdev)
return 0;
return -ENODEV;
}
static void __init
adbdev_init(void)
{
if (register_chrdev(ADB_MAJOR, "adb", &adb_fops)) {
@ -876,4 +891,7 @@ adbdev_init(void)
if (IS_ERR(adb_dev_class))
return;
class_device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
platform_device_register(&adb_pfdev);
platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
}