From: matthieu castet <castet.matthieu@free.fr>
To: Clemens Ladisch <clemens@ladisch.de>
Cc: alsa-devel@alsa-project.org
Subject: Re: mpu401_pnp
Date: Mon, 07 Feb 2005 20:13:26 +0100 [thread overview]
Message-ID: <4207BDD6.3020808@free.fr> (raw)
In-Reply-To: <Pine.HPX.4.33n.0502071640410.3379-100000@studcom.urz.uni-halle.de>
[-- Attachment #1: Type: text/plain, Size: 271 bytes --]
Hi,
Clemens Ladisch wrote:
>>One question : does snd_card_set_dev(card, &device->dev) is important ?
>
>
> Well, this pointer should be set if possible, but I'm not sure if it's
> actually used anywhere.
>
Ok, I update my patch in order to use it.
Regards
Matthieu
[-- Attachment #2: mpu.patch --]
[-- Type: text/x-patch, Size: 4950 bytes --]
--- mpu401.c?rev=1.22 2005-02-07 20:08:05.000000000 +0100
+++ mpu401.c 2005-02-07 20:07:57.000000000 +0100
@@ -57,6 +57,53 @@
MODULE_PARM_DESC(irq, "IRQ # for MPU-401 device.");
static snd_card_t *snd_mpu401_legacy_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
+static int pnp_registered = 0;
+
+static int snd_card_mpu401_add(int dev)
+{
+ snd_card_t *card;
+ int err;
+
+ card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
+ if (card == NULL)
+ return -ENOMEM;
+ strcpy(card->driver, "MPU-401 UART");
+ strcpy(card->shortname, card->driver);
+ sprintf(card->longname, "%s at %#lx, ", card->shortname, port[dev]);
+ if (irq[dev] >= 0) {
+ sprintf(card->longname + strlen(card->longname), "irq %d", irq[dev]);
+ } else {
+ strcat(card->longname, "polled");
+ }
+
+ if (snd_mpu401_uart_new(card, 0,
+ MPU401_HW_MPU401,
+ port[dev], 0,
+ irq[dev], irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) {
+ printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]);
+ snd_card_free(card);
+ return -ENODEV;
+ }
+ if ((err = snd_card_register(card)) < 0) {
+ snd_card_free(card);
+ return err;
+ }
+ snd_mpu401_legacy_cards[dev] = card;
+ return 0;
+}
+
+static int __devinit snd_card_mpu401_probe(int dev)
+{
+ if (port[dev] == SNDRV_AUTO_PORT) {
+ snd_printk(KERN_ERR "specify port\n");
+ return -EINVAL;
+ }
+ if (irq[dev] == SNDRV_AUTO_IRQ) {
+ snd_printk(KERN_ERR "specify or disable IRQ\n");
+ return -EINVAL;
+ }
+ return snd_card_mpu401_add(dev);
+}
#ifdef CONFIG_PNP
@@ -91,72 +138,9 @@
} else {
irq[dev] = pnp_irq(device, 0);
}
- return 0;
+ return snd_card_mpu401_add(dev);
}
-#endif
-
-static int __devinit snd_card_mpu401_probe(int dev, struct pnp_dev *device,
- const struct pnp_device_id *pnp_id)
-{
- snd_card_t *card;
- int err;
-#ifdef CONFIG_PNP
- if (!device) {
-#endif
- if (port[dev] == SNDRV_AUTO_PORT) {
- snd_printk(KERN_ERR "specify port\n");
- return -EINVAL;
- }
- if (irq[dev] == SNDRV_AUTO_IRQ) {
- snd_printk(KERN_ERR "specify or disable IRQ\n");
- return -EINVAL;
- }
-#ifdef CONFIG_PNP
- } else {
- if ((err = snd_mpu401_pnp(dev, device, pnp_id)) < 0)
- return err;
- }
-#endif
-
- card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
- if (card == NULL)
- return -ENOMEM;
- strcpy(card->driver, "MPU-401 UART");
- strcpy(card->shortname, card->driver);
- sprintf(card->longname, "%s at %#lx, ", card->shortname, port[dev]);
- if (irq[dev] >= 0) {
- sprintf(card->longname + strlen(card->longname), "irq %d", irq[dev]);
- } else {
- strcat(card->longname, "polled");
- }
-#ifdef CONFIG_PNP
- if (device) {
- snd_card_set_dev(card, &device->dev);
- }
-#endif
- if (snd_mpu401_uart_new(card, 0,
- MPU401_HW_MPU401,
- port[dev], 0,
- irq[dev], irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) {
- printk(KERN_ERR "MPU401 not detected at 0x%lx\n", port[dev]);
- snd_card_free(card);
- return -ENODEV;
- }
- if ((err = snd_card_register(card)) < 0) {
- snd_card_free(card);
- return err;
- }
-#ifdef CONFIG_PNP
- if (device)
- pnp_set_drvdata(device, card);
- else
-#endif
- snd_mpu401_legacy_cards[dev] = card;
- return 0;
-}
-
-#ifdef CONFIG_PNP
static int __devinit snd_mpu401_pnp_probe(struct pnp_dev *pnp_dev,
const struct pnp_device_id *id)
{
@@ -166,9 +150,12 @@
for ( ; dev < SNDRV_CARDS; ++dev) {
if (!enable[dev] || !pnp[dev])
continue;
- err = snd_card_mpu401_probe(dev, pnp_dev, id);
+ err = snd_mpu401_pnp(dev, pnp_dev, id);
if (err < 0)
return err;
+ snd_card_set_dev(snd_mpu401_legacy_cards[dev], &device->dev);
+ pnp_set_drvdata(pnp_dev, snd_mpu401_legacy_cards[dev]);
+ snd_mpu401_legacy_cards[dev] = NULL;
++dev;
return 0;
}
@@ -189,11 +176,14 @@
.probe = snd_mpu401_pnp_probe,
.remove = __devexit_p(snd_mpu401_pnp_remove),
};
+#else
+static struct pnp_driver snd_mpu401_pnp_driver;
#endif
static int __init alsa_card_mpu401_init(void)
{
int dev, devices = 0;
+ int err;
for (dev = 0; dev < SNDRV_CARDS; dev++) {
if (!enable[dev])
@@ -202,19 +192,20 @@
if (pnp[dev])
continue;
#endif
- if (snd_card_mpu401_probe(dev, NULL, NULL) >= 0)
+ if (snd_card_mpu401_probe(dev) >= 0)
devices++;
}
-#ifdef CONFIG_PNP
- devices += pnp_register_driver(&snd_mpu401_pnp_driver);
-#endif
+ if ((err = pnp_register_driver(&snd_mpu401_pnp_driver)) >= 0) {
+ pnp_registered = 1;
+ devices += err;
+ }
+
if (!devices) {
#ifdef MODULE
printk(KERN_ERR "MPU-401 device not found or device busy\n");
#endif
-#ifdef CONFIG_PNP
- pnp_unregister_driver(&snd_mpu401_pnp_driver);
-#endif
+ if (pnp_registered)
+ pnp_unregister_driver(&snd_mpu401_pnp_driver);
return -ENODEV;
}
return 0;
@@ -224,9 +215,8 @@
{
int idx;
-#ifdef CONFIG_PNP
- pnp_unregister_driver(&snd_mpu401_pnp_driver);
-#endif
+ if (pnp_registered)
+ pnp_unregister_driver(&snd_mpu401_pnp_driver);
for (idx = 0; idx < SNDRV_CARDS; idx++)
snd_card_free(snd_mpu401_legacy_cards[idx]);
}
next prev parent reply other threads:[~2005-02-07 19:13 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-31 20:50 mpu401_pnp castet.matthieu
2005-02-07 8:46 ` mpu401_pnp Clemens Ladisch
2005-02-07 10:40 ` mpu401_pnp castet.matthieu
2005-02-07 12:10 ` mpu401_pnp matthieu castet
2005-02-07 12:59 ` mpu401_pnp matthieu castet
2005-02-07 15:54 ` mpu401_pnp Clemens Ladisch
2005-02-07 19:13 ` matthieu castet [this message]
2005-02-07 19:23 ` mpu401_pnp matthieu castet
2005-02-09 16:46 ` mpu401_pnp Clemens Ladisch
2005-02-09 14:17 ` mpu401_pnp matthieu castet
2005-02-11 10:00 ` mpu401_pnp Clemens Ladisch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4207BDD6.3020808@free.fr \
--to=castet.matthieu@free.fr \
--cc=alsa-devel@alsa-project.org \
--cc=clemens@ladisch.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox