Re: [PATCH] ALSA: mts64: use new parport device model
From: Takashi Iwai
Date: Mon Feb 22 2016 - 09:02:49 EST
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
>
>