[alsa-devel] [PATCH] ALSA: mts64: use new parport device model

Takashi Iwai tiwai at suse.de
Mon Feb 22 15:02:42 CET 2016


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 at codethink.co.uk>
> ---
> 
> 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
> 
> 


More information about the Alsa-devel mailing list