+static int __init snd_opl3sa2_nonpnp_probe(struct platform_device *pdev)
+{
+ struct snd_card *card;
+ int err;
+ int dev = pdev->id;
+
+ if (port[dev] == SNDRV_AUTO_PORT) {
+ snd_printk(KERN_ERR PFX "specify port\n");
+ return -EINVAL;
+ }
+ if (wss_port[dev] == SNDRV_AUTO_PORT) {
+ snd_printk(KERN_ERR PFX "specify wss_port\n");
+ return -EINVAL;
+ }
+ if (fm_port[dev] == SNDRV_AUTO_PORT) {
+ snd_printk(KERN_ERR PFX "specify fm_port\n");
+ return -EINVAL;
+ }
+ if (midi_port[dev] == SNDRV_AUTO_PORT) {
+ snd_printk(KERN_ERR PFX "specify midi_port\n");
+ return -EINVAL;
+ }
+
+ card = snd_opl3sa2_card_new(dev);
+ if (! card)
+ return -ENOMEM;
+ snd_card_set_dev(card, &pdev->dev);
+ if ((err = snd_opl3sa2_probe(card, dev)) < 0) {
+ snd_card_free(card);
+ return err;
+ }
+ platform_set_drvdata(pdev, card);
+ return 0;
+}
+
+static int snd_opl3sa2_nonpnp_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_opl3sa2_nonpnp_suspend(struct platform_device *dev, pm_message_t state)
+{
+ return snd_opl3sa2_suspend(platform_get_drvdata(dev), state);
+}
+
+static int snd_opl3sa2_nonpnp_resume(struct platform_device *dev)
+{
+ return snd_opl3sa2_resume(platform_get_drvdata(dev));
+}
+#endif
+
+#define OPL3SA2_DRIVER "snd_opl3sa2"
+
+static struct platform_driver snd_opl3sa2_nonpnp_driver = {
+ .probe = snd_opl3sa2_nonpnp_probe,
+ .remove = snd_opl3sa2_nonpnp_remove,
+#ifdef CONFIG_PM
+ .suspend = snd_opl3sa2_nonpnp_suspend,
+ .resume = snd_opl3sa2_nonpnp_resume,
+#endif
+ .driver = {
+ .name = OPL3SA2_DRIVER
+ },
+};
+