+
+ _err:
+ snd_card_free(card);
+ return err;
+}
+
+static int __devexit snd_cs4231_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_cs4231_suspend(struct platform_device *dev, pm_message_t state)
+{
+ struct snd_card *card;
+ struct snd_cs4231 *chip;
+ card = platform_get_drvdata(dev);
+ snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+ chip = card->private_data;
+ chip->suspend(chip);
+ return 0;
+}
+
+static int snd_cs4231_resume(struct platform_device *dev)
+{
+ struct snd_card *card;
+ struct snd_cs4231 *chip;
+ card = platform_get_drvdata(dev);
+ chip = card->private_data;
+ chip->resume(chip);
+ snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+ return 0;
+}
+#endif
+
+#define SND_CS4231_DRIVER "snd_cs4231"
+
+static struct platform_driver snd_cs4231_driver = {
+ .probe = snd_cs4231_probe,
+ .remove = __devexit_p(snd_cs4231_remove),
+#ifdef CONFIG_PM
+ .suspend = snd_cs4231_suspend,
+ .resume = snd_cs4231_resume,
+#endif
+ .driver = {
+ .name = SND_CS4231_DRIVER
+ },
+};
+
+static void __init_or_module snd_cs4231_unregister_all(void)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(devices); ++i)
+ platform_device_unregister(devices[i]);
+ platform_driver_unregister(&snd_cs4231_driver);