[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:
parent
9fb1e350e1
commit
c9f6d3d5c6
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue