On Mon, 22 Feb 2016 14:22:08 +0100, Sudip Mukherjee wrote: > > Modify mts64 driver to use the new parallel port device model. > The advantage of using the device model is that the driver gets binded > to the hardware, we get the feature of hotplug, we can bind/unbind the > driver at runtime. > The changes are in the way the driver gets registered with the parallel > port subsystem and the temporary device to probe mts64 card is removed > and mts64_probe() is used in the probe callback. > > Signed-off-by: Sudip Mukherjee <sudip.mukherjee@xxxxxxxxxxxxxxx> > --- > > exactly same changes as done in portman2x4. Thanks, it looks like a nice cleanup. Applied now. > BTW, there is one portman2x4 available on ebay. I was bidding for it but > someone is more desperate than I am and outbidding me everytime :( It's surprising that such a hardware is still beloved! :) Good luck! Takashi > sound/drivers/mts64.c | 95 +++++++++++++++++++++++---------------------------- > 1 file changed, 43 insertions(+), 52 deletions(-) > > diff --git a/sound/drivers/mts64.c b/sound/drivers/mts64.c > index 2a008a9..c76bd87 100644 > --- a/sound/drivers/mts64.c > +++ b/sound/drivers/mts64.c > @@ -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, > -- > 1.9.1 > > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel