Update of /cvsroot/alsa/alsa-kernel/pci/ymfpci
In directory sc8-pr-cvs1:/tmp/cvs-serv10636/pci/ymfpci
Modified Files:
ymfpci.c ymfpci_main.c
Log Message:
Clemens Ladisch <[EMAIL PROTECTED]>
- allocate io port for the gameport
- register gameport with the generic gameport layer
- allow pci resource as gameport address (YMF754/755)
Index: ymfpci.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ymfpci/ymfpci.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- ymfpci.c 5 May 2003 14:14:59 -0000 1.22
+++ ymfpci.c 16 Jun 2003 07:31:38 -0000 1.23
@@ -229,9 +229,11 @@
return err;
}
}
+#if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
if ((err = snd_ymfpci_joystick(chip)) < 0) {
printk(KERN_WARNING "ymfpci: cannot initialize joystick,
skipping...\n");
}
+#endif
strcpy(card->driver, str);
sprintf(card->shortname, "Yamaha DS-XG PCI (%s)", str);
sprintf(card->longname, "%s at 0x%lx, irq %i",
Index: ymfpci_main.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ymfpci/ymfpci_main.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- ymfpci_main.c 5 May 2003 14:14:59 -0000 1.36
+++ ymfpci_main.c 16 Jun 2003 07:31:38 -0000 1.37
@@ -1708,24 +1708,65 @@
* joystick support
*/
+#if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
static int ymfpci_joystick_ports[4] = {
0x201, 0x202, 0x204, 0x205
};
+static int snd_ymfpci_get_joystick_port(ymfpci_t *chip, int index)
+{
+ if (index < 4)
+ return ymfpci_joystick_ports[index];
+ else
+ return pci_resource_start(chip->pci, 2);
+}
+
static void setup_joystick_base(ymfpci_t *chip)
{
- if (chip->pci->device >= 0x0010) /* YMF 744/754 */
+ if (chip->device_id >= 0x0010) /* YMF 744/754 */
pci_write_config_word(chip->pci, PCIR_DSXG_JOYBASE,
- ymfpci_joystick_ports[chip->joystick_port]);
+ snd_ymfpci_get_joystick_port(chip,
chip->joystick_port));
else {
u16 legacy_ctrl2;
pci_read_config_word(chip->pci, PCIR_DSXG_ELEGACY, &legacy_ctrl2);
- legacy_ctrl2 &= ~(3 << 6);
+ legacy_ctrl2 &= ~YMFPCI_LEGACY2_JSIO;
legacy_ctrl2 |= chip->joystick_port << 6;
pci_write_config_word(chip->pci, PCIR_DSXG_ELEGACY, legacy_ctrl2);
}
}
+static int snd_ymfpci_enable_joystick(ymfpci_t *chip)
+{
+ u16 val;
+
+ chip->gameport.io = snd_ymfpci_get_joystick_port(chip, chip->joystick_port);
+ chip->joystick_res = request_region(chip->gameport.io, 1, "YMFPCI gameport");
+ if (!chip->joystick_res) {
+ snd_printk(KERN_WARNING "gameport port %#x in use\n",
chip->gameport.io);
+ return 0;
+ }
+ setup_joystick_base(chip);
+ pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY, &val);
+ val |= YMFPCI_LEGACY_JPEN;
+ pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY, val);
+ gameport_register_port(&chip->gameport);
+ return 1;
+}
+
+static int snd_ymfpci_disable_joystick(ymfpci_t *chip)
+{
+ u16 val;
+
+ gameport_unregister_port(&chip->gameport);
+ pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY, &val);
+ val &= ~YMFPCI_LEGACY_JPEN;
+ pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY, val);
+ release_resource(chip->joystick_res);
+ kfree_nocheck(chip->joystick_res);
+ chip->joystick_res = NULL;
+ return 1;
+}
+
static int snd_ymfpci_joystick_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t
*uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
@@ -1741,36 +1782,41 @@
u16 val;
pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY, &val);
- ucontrol->value.integer.value[0] = (val & 0x04) ? 1 : 0;
+ ucontrol->value.integer.value[0] = (val & YMFPCI_LEGACY_JPEN) ? 1 : 0;
return 0;
}
static int snd_ymfpci_joystick_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t
*ucontrol)
{
ymfpci_t *chip = snd_kcontrol_chip(kcontrol);
- u16 val, oval;
+ int enabled, change;
- pci_read_config_word(chip->pci, PCIR_DSXG_LEGACY, &oval);
- val = oval & ~0x04;
- if (ucontrol->value.integer.value[0])
- val |= 0x04;
- if (val != oval) {
- setup_joystick_base(chip);
- pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY, val);
- return 1;
+ down(&chip->joystick_mutex);
+ enabled = chip->joystick_res != NULL;
+ change = enabled != !! ucontrol->value.integer.value[0];
+ if (change) {
+ if (!enabled)
+ change = snd_ymfpci_enable_joystick(chip);
+ else
+ change = snd_ymfpci_disable_joystick(chip);
}
- return 0;
+ up(&chip->joystick_mutex);
+ return change;
}
static int snd_ymfpci_joystick_addr_info(snd_kcontrol_t *kcontrol,
snd_ctl_elem_info_t *uinfo)
{
- uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
- uinfo->count = 1;
- uinfo->value.enumerated.items = 4;
- if (uinfo->value.enumerated.item >= 4)
- uinfo->value.enumerated.item = 3;
- sprintf(uinfo->value.enumerated.name, "port 0x%x",
ymfpci_joystick_ports[uinfo->value.enumerated.item]);
- return 0;
+ ymfpci_t *chip = snd_kcontrol_chip(kcontrol);
+ int ports = chip->device_id >= 0x0010 ? 5 : 4;
+
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+ uinfo->count = 1;
+ uinfo->value.enumerated.items = ports;
+ if (uinfo->value.enumerated.item >= ports)
+ uinfo->value.enumerated.item = ports - 1;
+ sprintf(uinfo->value.enumerated.name, "port 0x%x",
+ snd_ymfpci_get_joystick_port(chip, uinfo->value.enumerated.item));
+ return 0;
}
static int snd_ymfpci_joystick_addr_get(snd_kcontrol_t *kcontrol,
snd_ctl_elem_value_t *ucontrol)
@@ -1783,13 +1829,20 @@
static int snd_ymfpci_joystick_addr_put(snd_kcontrol_t *kcontrol,
snd_ctl_elem_value_t *ucontrol)
{
ymfpci_t *chip = snd_kcontrol_chip(kcontrol);
- if (ucontrol->value.enumerated.item[0] != chip->joystick_port) {
- snd_assert(ucontrol->value.enumerated.item[0] >= 0 &&
ucontrol->value.enumerated.item[0] < 4, return -EINVAL);
+ int change, enabled;
+
+ down(&chip->joystick_mutex);
+ change = ucontrol->value.enumerated.item[0] != chip->joystick_port;
+ if (change) {
+ enabled = chip->joystick_res != NULL;
+ if (enabled)
+ snd_ymfpci_disable_joystick(chip);
chip->joystick_port = ucontrol->value.enumerated.item[0];
- setup_joystick_base(chip);
- return 1;
+ if (enabled)
+ snd_ymfpci_enable_joystick(chip);
}
- return 0;
+ up(&chip->joystick_mutex);
+ return change;
}
static snd_kcontrol_new_t snd_ymfpci_control_joystick __devinitdata = {
@@ -1819,6 +1872,7 @@
return err;
return 0;
}
+#endif /* CONFIG_GAMEPORT */
/*
@@ -2067,6 +2121,10 @@
release_resource(chip->fm_res);
kfree_nocheck(chip->fm_res);
}
+#if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
+ if (chip->joystick_res)
+ snd_ymfpci_disable_joystick(chip);
+#endif
if (chip->reg_area_virt)
iounmap((void *)chip->reg_area_virt);
if (chip->work_ptr)
@@ -2216,6 +2274,9 @@
spin_lock_init(&chip->voice_lock);
init_waitqueue_head(&chip->interrupt_sleep);
atomic_set(&chip->interrupt_sleep_count, 0);
+#if defined(CONFIG_GAMEPORT) || defined(CONFIG_GAMEPORT_MODULE)
+ init_MUTEX(&chip->joystick_mutex);
+#endif
chip->card = card;
chip->pci = pci;
chip->irq = -1;
-------------------------------------------------------
This SF.NET email is sponsored by: eBay
Great deals on office technology -- on eBay now! Click here:
http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog