From 5e12bea0833e47117c31f13b528e31dc8112de57 Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 17 Nov 2005 17:17:08 +0100 Subject: [ALSA] powermac - Use platform_device Modules: PPC,PPC PMAC driver,PPC PowerMac driver Rewrite the probe/remove with platform_device. Move the PM support to platform_device's callbacks. Signed-off-by: Takashi Iwai --- sound/ppc/powermac.c | 67 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 16 deletions(-) (limited to 'sound/ppc/powermac.c') diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c index db139cdee28..efa06fe5f01 100644 --- a/sound/ppc/powermac.c +++ b/sound/ppc/powermac.c @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include #include @@ -46,15 +48,9 @@ MODULE_PARM_DESC(enable_beep, "Enable beep using PCM."); /* - * card entry */ -static struct snd_card *snd_pmac_card = NULL; - -/* - */ - -static int __init snd_pmac_probe(void) +static int __init snd_pmac_probe(struct platform_device *devptr) { struct snd_card *card; struct snd_pmac *chip; @@ -67,6 +63,7 @@ static int __init snd_pmac_probe(void) if ((err = snd_pmac_new(card, &chip)) < 0) goto __error; + card->private_data = chip; switch (chip->model) { case PMAC_BURGUNDY: @@ -131,13 +128,12 @@ static int __init snd_pmac_probe(void) if (enable_beep) snd_pmac_attach_beep(chip); - if ((err = snd_card_set_generic_dev(card)) < 0) - goto __error; + snd_card_set_dev(card, &devptr->dev); if ((err = snd_card_register(card)) < 0) goto __error; - snd_pmac_card = card; + platform_set_drvdata(devptr, card); return 0; __error: @@ -146,23 +142,62 @@ __error: } -/* - * MODULE stuff - */ +static int __devexit snd_pmac_remove(struct platform_device *devptr) +{ + snd_card_free(platform_get_drvdata(devptr)); + platform_set_drvdata(devptr, NULL); + return 0; +} + +#ifdef CONFIG_PM +static int snd_pmac_driver_suspend(struct platform_device *devptr, pm_message_t state) +{ + struct snd_card *card = platform_get_drvdata(devptr); + snd_pmac_suspend(card->private_data); + return 0; +} + +static int snd_pmac_driver_resume(struct platform_device *devptr) +{ + struct snd_card *card = platform_get_drvdata(devptr); + snd_pmac_resume(card->private_data); + return 0; +} +#endif + +#define SND_PMAC_DRIVER "snd_powermac" + +static struct platform_driver snd_pmac_driver = { + .probe = snd_pmac_probe, + .remove = __devexit_p(snd_pmac_remove), +#ifdef CONFIG_PM + .suspend = snd_pmac_driver_suspend, + .resume = snd_pmac_driver_resume, +#endif + .driver = { + .name = SND_PMAC_DRIVER + }, +}; static int __init alsa_card_pmac_init(void) { int err; - if ((err = snd_pmac_probe()) < 0) + struct platform_device *device; + + if ((err = platform_driver_register(&snd_pmac_driver)) < 0) return err; + device = platform_device_register_simple(SND_PMAC_DRIVER, -1, NULL, 0); + if (IS_ERR(device)) { + platform_driver_unregister(&snd_pmac_driver); + return PTR_ERR(device); + } return 0; } static void __exit alsa_card_pmac_exit(void) { - if (snd_pmac_card) - snd_card_free(snd_pmac_card); + platform_driver_unregister(&snd_pmac_driver); } module_init(alsa_card_pmac_init) -- cgit v1.2.3