Skip to content

Commit

Permalink
[POWERPC] adb: Replace sleep notifier with platform driver suspend/re…
Browse files Browse the repository at this point in the history
…sume 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>
  • Loading branch information
Johannes Berg authored and Paul Mackerras committed Dec 19, 2007
1 parent 9fb1e35 commit c9f6d3d
Showing 1 changed file with 57 additions and 39 deletions.
96 changes: 57 additions & 39 deletions drivers/macintosh/adb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -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)
{
Expand Down Expand Up @@ -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)) {
Expand All @@ -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);
}

0 comments on commit c9f6d3d

Please sign in to comment.