|
@@ -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,23 +947,32 @@ 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;
|
|
|
+ }
|
|
|
+ err = mts64_probe(p);
|
|
|
+ if (err) {
|
|
|
+ err = -EIO;
|
|
|
+ goto release_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;
|
|
@@ -986,14 +982,6 @@ static int snd_mts64_probe(struct platform_device *pdev)
|
|
|
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 +997,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 +1016,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,
|