mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
ALSA: riptide - Fix joystick resource handling
The current code doesn't handle the multiple gameports properly, and uses unnecessary global static variables to store the data. This patch changes the probe / remove routines to use the driver data assigned to the dedicated pci device, and adds the support of multiple devices. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
a693a26fe0
commit
db1005ec6f
@ -2014,14 +2014,12 @@ static int __devinit snd_riptide_mixer(struct snd_riptide *chip)
|
||||
}
|
||||
|
||||
#ifdef SUPPORT_JOYSTICK
|
||||
static int have_joystick;
|
||||
static struct pci_dev *riptide_gameport_pci;
|
||||
static struct gameport *riptide_gameport;
|
||||
|
||||
static int __devinit
|
||||
snd_riptide_joystick_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
{
|
||||
static int dev;
|
||||
struct gameport *gameport;
|
||||
|
||||
if (dev >= SNDRV_CARDS)
|
||||
return -ENODEV;
|
||||
@ -2030,36 +2028,33 @@ snd_riptide_joystick_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
if (joystick_port[dev]) {
|
||||
riptide_gameport = gameport_allocate_port();
|
||||
if (riptide_gameport) {
|
||||
if (!request_region
|
||||
(joystick_port[dev], 8, "Riptide gameport")) {
|
||||
snd_printk(KERN_WARNING
|
||||
"Riptide: cannot grab gameport 0x%x\n",
|
||||
joystick_port[dev]);
|
||||
gameport_free_port(riptide_gameport);
|
||||
riptide_gameport = NULL;
|
||||
} else {
|
||||
riptide_gameport_pci = pci;
|
||||
riptide_gameport->io = joystick_port[dev];
|
||||
gameport_register_port(riptide_gameport);
|
||||
}
|
||||
}
|
||||
if (!joystick_port[dev++])
|
||||
return 0;
|
||||
|
||||
gameport = gameport_allocate_port();
|
||||
if (!gameport)
|
||||
return -ENOMEM;
|
||||
if (!request_region(joystick_port[dev], 8, "Riptide gameport")) {
|
||||
snd_printk(KERN_WARNING
|
||||
"Riptide: cannot grab gameport 0x%x\n",
|
||||
joystick_port[dev]);
|
||||
gameport_free_port(gameport);
|
||||
return -EBUSY;
|
||||
}
|
||||
dev++;
|
||||
|
||||
gameport->io = joystick_port[dev];
|
||||
gameport_register_port(gameport);
|
||||
pci_set_drvdata(pci, gameport);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __devexit snd_riptide_joystick_remove(struct pci_dev *pci)
|
||||
{
|
||||
if (riptide_gameport) {
|
||||
if (riptide_gameport_pci == pci) {
|
||||
release_region(riptide_gameport->io, 8);
|
||||
riptide_gameport_pci = NULL;
|
||||
gameport_unregister_port(riptide_gameport);
|
||||
riptide_gameport = NULL;
|
||||
}
|
||||
struct gameport *gameport = pci_get_drvdata(pci);
|
||||
if (gameport) {
|
||||
release_region(gameport->io, 8);
|
||||
gameport_unregister_port(gameport);
|
||||
pci_set_drvdata(pci, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -2198,14 +2193,11 @@ static struct pci_driver joystick_driver = {
|
||||
static int __init alsa_card_riptide_init(void)
|
||||
{
|
||||
int err;
|
||||
if ((err = pci_register_driver(&driver)) < 0)
|
||||
err = pci_register_driver(&driver);
|
||||
if (err < 0)
|
||||
return err;
|
||||
#if defined(SUPPORT_JOYSTICK)
|
||||
if (pci_register_driver(&joystick_driver) < 0) {
|
||||
have_joystick = 0;
|
||||
snd_printk(KERN_INFO "no joystick found\n");
|
||||
} else
|
||||
have_joystick = 1;
|
||||
pci_register_driver(&joystick_driver);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@ -2214,8 +2206,7 @@ static void __exit alsa_card_riptide_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&driver);
|
||||
#if defined(SUPPORT_JOYSTICK)
|
||||
if (have_joystick)
|
||||
pci_unregister_driver(&joystick_driver);
|
||||
pci_unregister_driver(&joystick_driver);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user