]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/drivers/mts64.c
ARM: bcm2835: Enable CONFIG_PM.
[karo-tx-linux.git] / sound / drivers / mts64.c
index 2a008a9ccf85c48f743b7eb7ffd7cece8d76758c..fd4d18df84d3666c62482c07da0a6cf694f61e47 100644 (file)
@@ -65,8 +65,6 @@ struct mts64 {
        struct snd_card *card;
        struct snd_rawmidi *rmidi;
        struct pardevice *pardev;
-       int pardev_claimed;
-
        int open_count;
        int current_midi_output_port;
        int current_midi_input_port;
@@ -850,30 +848,6 @@ __out:
        spin_unlock(&mts->lock);
 }
 
-static int snd_mts64_probe_port(struct parport *p)
-{
-       struct pardevice *pardev;
-       int res;
-
-       pardev = parport_register_device(p, DRIVER_NAME,
-                                        NULL, NULL, NULL,
-                                        0, NULL);
-       if (!pardev)
-               return -EIO;
-       
-       if (parport_claim(pardev)) {
-               parport_unregister_device(pardev);
-               return -EIO;
-       }
-
-       res = mts64_probe(p);
-
-       parport_release(pardev);
-       parport_unregister_device(pardev);
-
-       return res;
-}
-
 static void snd_mts64_attach(struct parport *p)
 {
        struct platform_device *device;
@@ -907,10 +881,20 @@ static void snd_mts64_detach(struct parport *p)
        /* nothing to do here */
 }
 
+static int snd_mts64_dev_probe(struct pardevice *pardev)
+{
+       if (strcmp(pardev->name, DRIVER_NAME))
+               return -ENODEV;
+
+       return 0;
+}
+
 static struct parport_driver mts64_parport_driver = {
-       .name   = "mts64",
-       .attach = snd_mts64_attach,
-       .detach = snd_mts64_detach
+       .name           = "mts64",
+       .probe          = snd_mts64_dev_probe,
+       .match_port     = snd_mts64_attach,
+       .detach         = snd_mts64_detach,
+       .devmodel       = true,
 };
 
 /*********************************************************************
@@ -922,8 +906,7 @@ static void snd_mts64_card_private_free(struct snd_card *card)
        struct pardevice *pardev = mts->pardev;
 
        if (pardev) {
-               if (mts->pardev_claimed)
-                       parport_release(pardev);
+               parport_release(pardev);
                parport_unregister_device(pardev);
        }
 
@@ -938,6 +921,12 @@ static int snd_mts64_probe(struct platform_device *pdev)
        struct snd_card *card = NULL;
        struct mts64 *mts = NULL;
        int err;
+       struct pardev_cb mts64_cb = {
+               .preempt = NULL,
+               .wakeup = NULL,
+               .irq_func = snd_mts64_interrupt,        /* ISR */
+               .flags = PARPORT_DEV_EXCL,              /* flags */
+       };
 
        p = platform_get_drvdata(pdev);
        platform_set_drvdata(pdev, NULL);
@@ -946,8 +935,6 @@ static int snd_mts64_probe(struct platform_device *pdev)
                return -ENODEV;
        if (!enable[dev]) 
                return -ENOENT;
-       if ((err = snd_mts64_probe_port(p)) < 0)
-               return err;
 
        err = snd_card_new(&pdev->dev, index[dev], id[dev], THIS_MODULE,
                           0, &card);
@@ -960,40 +947,42 @@ static int snd_mts64_probe(struct platform_device *pdev)
        sprintf(card->longname,  "%s at 0x%lx, irq %i", 
                card->shortname, p->base, p->irq);
 
-       pardev = parport_register_device(p,                   /* port */
-                                        DRIVER_NAME,         /* name */
-                                        NULL,                /* preempt */
-                                        NULL,                /* wakeup */
-                                        snd_mts64_interrupt, /* ISR */
-                                        PARPORT_DEV_EXCL,    /* flags */
-                                        (void *)card);       /* private */
-       if (pardev == NULL) {
+       mts64_cb.private = card;                         /* private */
+       pardev = parport_register_dev_model(p,           /* port */
+                                           DRIVER_NAME, /* name */
+                                           &mts64_cb,   /* callbacks */
+                                           pdev->id);   /* device number */
+       if (!pardev) {
                snd_printd("Cannot register pardevice\n");
                err = -EIO;
                goto __err;
        }
 
+       /* claim parport */
+       if (parport_claim(pardev)) {
+               snd_printd("Cannot claim parport 0x%lx\n", pardev->port->base);
+               err = -EIO;
+               goto free_pardev;
+       }
+
        if ((err = snd_mts64_create(card, pardev, &mts)) < 0) {
                snd_printd("Cannot create main component\n");
-               parport_unregister_device(pardev);
-               goto __err;
+               goto release_pardev;
        }
        card->private_data = mts;
        card->private_free = snd_mts64_card_private_free;
+
+       err = mts64_probe(p);
+       if (err) {
+               err = -EIO;
+               goto __err;
+       }
        
        if ((err = snd_mts64_rawmidi_create(card)) < 0) {
                snd_printd("Creating Rawmidi component failed\n");
                goto __err;
        }
 
-       /* claim parport */
-       if (parport_claim(pardev)) {
-               snd_printd("Cannot claim parport 0x%lx\n", pardev->port->base);
-               err = -EIO;
-               goto __err;
-       }
-       mts->pardev_claimed = 1;
-
        /* init device */
        if ((err = mts64_device_init(p)) < 0)
                goto __err;
@@ -1009,6 +998,10 @@ static int snd_mts64_probe(struct platform_device *pdev)
        snd_printk(KERN_INFO "ESI Miditerminal 4140 on 0x%lx\n", p->base);
        return 0;
 
+release_pardev:
+       parport_release(pardev);
+free_pardev:
+       parport_unregister_device(pardev);
 __err:
        snd_card_free(card);
        return err;
@@ -1024,7 +1017,6 @@ static int snd_mts64_remove(struct platform_device *pdev)
        return 0;
 }
 
-
 static struct platform_driver snd_mts64_driver = {
        .probe  = snd_mts64_probe,
        .remove = snd_mts64_remove,