Update of /cvsroot/alsa/alsa-kernel/pci In directory sc8-pr-cvs1:/tmp/cvs-serv10067/pci
Modified Files: als4000.c azt3328.c cmipci.c ens1370.c es1968.c intel8x0.c via82xx.c Log Message: - removed joystick control from the card control API. added joystick (or joystick_port) module option instead. - updated documents for this joystick fix. - moved resource management for ALS4000 from sb-common header to the als4000 local code. Index: als4000.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/als4000.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- als4000.c 12 Aug 2003 14:10:12 -0000 1.21 +++ als4000.c 14 Oct 2003 13:59:20 -0000 1.22 @@ -63,6 +63,7 @@ #include <linux/init.h> #include <linux/pci.h> #include <linux/slab.h> +#include <linux/gameport.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/rawmidi.h> @@ -78,14 +79,15 @@ MODULE_CLASSES("{sound}"); MODULE_DEVICES("{{Avance Logic,ALS4000}}"); +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#define SUPPORT_JOYSTICK 1 +#endif + static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ -static int joystick_port[SNDRV_CARDS] = -#ifdef CONFIG_ISA - {0x200}; /* enable as default */ -#else - {0}; /* disabled */ +#ifdef SUPPORT_JOYSTICK +static int joystick_port[SNDRV_CARDS]; #endif MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); @@ -105,6 +107,11 @@ typedef struct { unsigned long gcr; + struct resource *res_gcr; +#ifdef SUPPORT_JOYSTICK + struct gameport gameport; + struct resource *res_joystick; +#endif } snd_card_als4000_t; static struct pci_device_id snd_als4000_ids[] = { @@ -523,7 +530,7 @@ /******************************************************************/ -static void __devinit snd_als4000_set_addr(unsigned long gcr, +static void snd_als4000_set_addr(unsigned long gcr, unsigned int sb, unsigned int mpu, unsigned int opl, @@ -574,6 +581,18 @@ snd_card_als4000_t * acard = (snd_card_als4000_t *)card->private_data; /* make sure that interrupts are disabled */ snd_als4000_gcr_write_addr( acard->gcr, 0x8c, 0); + /* free resources */ +#ifdef SUPPORT_JOYSTICK + if (acard->res_joystick) { + if (acard->gameport.io) + gameport_unregister_port(&acard->gameport); + snd_als4000_set_addr(acard->gcr, 0, 0, 0, 0); /* disable joystick */ + release_resource(acard->res_joystick); + kfree_nocheck(acard->res_joystick); + } +#endif + release_resource(acard->res_gcr); + kfree_nocheck(acard->res_gcr); } static int __devinit snd_card_als4000_probe(struct pci_dev *pci, @@ -588,6 +607,7 @@ opl3_t *opl3; unsigned short word; int err; + int joystick = 0; if (dev >= SNDRV_CARDS) return -ENODEV; @@ -617,9 +637,6 @@ pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO); pci_set_master(pci); - /* disable all legacy ISA stuff except for joystick */ - snd_als4000_set_addr(gcr, 0, 0, 0, joystick_port[dev]); - card = snd_card_new(index[dev], id[dev], THIS_MODULE, sizeof( snd_card_als4000_t ) ); if (card == NULL) { @@ -630,8 +647,17 @@ acard = (snd_card_als4000_t *)card->private_data; acard->gcr = gcr; + acard->res_gcr = res_gcr_port; card->private_free = snd_card_als4000_free; + /* disable all legacy ISA stuff except for joystick */ +#ifdef SUPPORT_JOYSTICK + if (joystick_port[dev] > 0 && + (acard->res_joystick = request_region(joystick_port[dev], 8, "ALS4000 gameport")) != NULL) + joystick = joystick_port[dev]; +#endif + snd_als4000_set_addr(gcr, 0, 0, 0, joystick); + if ((err = snd_sbdsp_create(card, gcr + 0x10, pci->irq, @@ -640,15 +666,12 @@ -1, SB_HW_ALS4000, &chip)) < 0) { - release_resource(res_gcr_port); - kfree_nocheck(res_gcr_port); snd_card_free(card); return err; } chip->pci = pci; chip->alt_port = gcr; - chip->res_alt_port = res_gcr_port; snd_als4000_configure(chip); @@ -680,6 +703,12 @@ } } +#ifdef SUPPORT_JOYSTICK + if (acard->res_joystick) { + acard->gameport.io = joystick; + gameport_register_port(&acard->gameport); + } +#endif strcpy(card->driver, "ALS4000"); strcpy(card->shortname, "Avance Logic ALS4000"); sprintf(card->longname, "%s at 0x%lx, irq %i", @@ -730,7 +759,7 @@ #ifndef MODULE -/* format is: snd-als4000=enable,index,id */ +/* format is: snd-als4000=enable,index,id,joystick_port */ static int __init alsa_card_als4000_setup(char *str) { @@ -740,7 +769,11 @@ return 0; (void)(get_option(&str,&enable[nr_dev]) == 2 && get_option(&str,&index[nr_dev]) == 2 && - get_id(&str,&id[nr_dev]) == 2); + get_id(&str,&id[nr_dev]) == 2 +#ifdef SUPPORT_JOYSTICK + && get_option(&str,&joystick_port[nr_dev]) == 2 +#endif + ); nr_dev++; return 1; } Index: azt3328.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/azt3328.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- azt3328.c 16 Aug 2003 09:58:29 -0000 1.4 +++ azt3328.c 14 Oct 2003 13:59:20 -0000 1.5 @@ -97,6 +97,7 @@ #include <linux/pci.h> #include <linux/delay.h> #include <linux/slab.h> +#include <linux/gameport.h> #include <sound/core.h> #include <sound/control.h> #include <sound/pcm.h> @@ -113,6 +114,10 @@ MODULE_CLASSES("{sound}"); MODULE_DEVICES("{{Aztech,AZF3328}}"); +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#define SUPPORT_JOYSTICK 1 +#endif + #define DEBUG_MISC 0 #define DEBUG_CALLS 0 #define DEBUG_MIXER 0 @@ -158,8 +163,10 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ +#ifdef SUPPORT_JOYSTICK static int joystick[SNDRV_CARDS] = {-1}; /* "unset" as default */ +#endif MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(index, "Index value for AZF3328 soundcard."); @@ -170,9 +177,11 @@ MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(enable, "Enable AZF3328 soundcard."); MODULE_PARM_SYNTAX(enable, SNDRV_INDEX_DESC); +#ifdef SUPPORT_JOYSTICK MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(joystick, "Forced joystick port enable for AZF3328 soundcard. (0 = force disable)"); MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED); +#endif typedef struct _snd_azf3328 azf3328_t; #define chip_t azf3328_t @@ -190,7 +199,11 @@ struct resource *res_synth_port; unsigned long mixer_port; struct resource *res_mixer_port; - unsigned long game_port; + +#ifdef SUPPORT_JOYSTICK + struct gameport gameport; + struct resource *res_joystick; +#endif struct pci_dev *pci; snd_card_t *card; @@ -1259,6 +1272,16 @@ synchronize_irq(chip->irq); __end_hw: +#ifdef SUPPORT_JOYSTICK + if (chip->res_joystick) { + gameport_unregister_port(&chip->gameport); + /* disable gameport */ + snd_azf3328_io2_write(chip, IDX_IO2_LEGACY_ADDR, + snd_azf3328_io2_read(chip, IDX_IO2_LEGACY_ADDR) & ~LEGACY_JOY); + release_resource(chip->res_joystick); + kfree_nocheck(chip->res_joystick); + } +#endif if (chip->res_codec_port) { release_resource(chip->res_codec_port); kfree_nocheck(chip->res_codec_port); @@ -1419,53 +1442,53 @@ return 0; } +#ifdef SUPPORT_JOYSTICK static void __devinit snd_azf3328_config_joystick(azf3328_t *chip, int joystick) { - int i, detected = 0, activate = 0; + int i, activate = 0; char *msg = NULL; unsigned char val; if (joystick == -1) /* auto detection/activation */ { + activate = 1; for (i=0x200; i <= 0x207; i++) - if (inb(i) != 0xff) - detected = 1; /* other joy found, don't activate */ + if (inb(i) != 0xff) { + activate = 0; + break; + } } - if ((joystick == -1) && (detected == 1)) - { - activate = 0; - msg = "DISABLED (address occupied by another joystick port)"; - } - else - if ((joystick == -1) && (detected == 0)) - { - activate = 1; - msg = "ENABLED (via autodetect)"; + if (activate || joystick == 1) { + if ((chip->res_joystick = request_region(0x200, 8, "AZF3328 gameport")) != NULL) { + chip->gameport.io = 0x200; + activate = 1; + } else + activate = 0; } - else if (joystick == 0) - { - activate = 0; msg = "DISABLED (forced)"; - } - else - if (joystick == 1) - { - activate = 1; + else if (joystick == 1 && activate) msg = "ENABLED (Warning: forced!)"; - } + else if (activate) + msg = "ENABLED (via autodetect)"; + else + msg = "DISABLED (address occupied by another joystick port)"; + val = inb(chip->io2_port + IDX_IO2_LEGACY_ADDR); if (activate) - val |= LEGACY_JOY; + val |= LEGACY_JOY; else - val &= ~LEGACY_JOY; + val &= ~LEGACY_JOY; outb(val, chip->io2_port + IDX_IO2_LEGACY_ADDR); #ifdef MODULE printk("azt3328: Joystick port: %s.\n", msg); #endif + if (activate) + gameport_register_port(&chip->gameport); } +#endif static int __devinit snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) @@ -1537,7 +1560,9 @@ "azt3328: Feel free to contact [EMAIL PROTECTED] for bug reports etc.!\n"); #endif +#ifdef SUPPORT_JOYSTICK snd_azf3328_config_joystick(chip, joystick[dev]); +#endif pci_set_drvdata(pci, chip); dev++; @@ -1598,7 +1623,7 @@ #ifndef MODULE -/* format is: snd-azf3328=enable,index,id */ +/* format is: snd-azf3328=enable,index,id,joystick */ static int __init alsa_card_azf3328_setup(char *str) { @@ -1610,12 +1635,16 @@ return 0; (void)(get_option(&str,&enable[nr_dev]) == 2 && get_option(&str,&index[nr_dev]) == 2 && - get_id(&str,&id[nr_dev]) == 2); + get_id(&str,&id[nr_dev]) == 2 +#ifdef SUPPORT_JOYSTICK + && get_option(&str,&joystick[nr_dev]) == 2 +#endif + ); nr_dev++; snd_azf3328_dbgcallleave(); return 1; } -__setup("snd-azf3328=", alsa_card_azf3328_setup); +__setup("snd-azt3328=", alsa_card_azf3328_setup); #endif /* ifndef MODULE */ Index: cmipci.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/cmipci.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- cmipci.c 14 Oct 2003 13:08:19 -0000 1.49 +++ cmipci.c 14 Oct 2003 13:59:20 -0000 1.50 @@ -31,6 +31,7 @@ #include <linux/init.h> #include <linux/pci.h> #include <linux/slab.h> +#include <linux/gameport.h> #include <sound/core.h> #include <sound/info.h> #include <sound/control.h> @@ -52,6 +53,10 @@ "{C-Media,CMI8338A}," "{C-Media,CMI8338B}}"); +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#define SUPPORT_JOYSTICK 1 +#endif + static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable switches */ @@ -60,6 +65,9 @@ #ifdef DO_SOFT_AC3 static int soft_ac3[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)]=1}; #endif +#ifdef SUPPORT_JOYSTICK +static int joystick[SNDRV_CARDS]; +#endif MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(index, "Index value for C-Media PCI soundcard."); @@ -81,6 +89,11 @@ MODULE_PARM_DESC(soft_ac3, "Sofware-conversion of raw SPDIF packets (model 033 only)."); MODULE_PARM_SYNTAX(soft_ac3, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC); #endif +#ifdef SUPPORT_JOYSTICK +MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(joystick, "Enable joystick."); +MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC); +#endif #ifndef PCI_DEVICE_ID_CMEDIA_CM8738 #define PCI_DEVICE_ID_CMEDIA_CM8738 0x0111 @@ -339,6 +352,10 @@ #define CM_EXTENT_MIDI 0x2 #define CM_EXTENT_SYNTH 0x4 +/* fixed legacy joystick address */ +#define CM_JOYSTICK_ADDR 0x200 + + /* * pci ids */ @@ -480,6 +497,11 @@ /* external MIDI */ snd_rawmidi_t *rmidi; +#ifdef SUPPORT_JOYSTICK + struct gameport gameport; + struct resource *res_joystick; +#endif + spinlock_t reg_lock; }; @@ -2599,7 +2621,7 @@ DEFINE_BIT_SWITCH_ARG(fourch, CM_REG_MISC_CTRL, CM_N4SPK3D, 0, 0); DEFINE_BIT_SWITCH_ARG(line_rear, CM_REG_MIXER1, CM_SPK4, 1, 0); DEFINE_BIT_SWITCH_ARG(line_bass, CM_REG_LEGACY_CTRL, CM_LINE_AS_BASS, 0, 0); -DEFINE_BIT_SWITCH_ARG(joystick, CM_REG_FUNCTRL1, CM_JYSTK_EN, 0, 0); +// DEFINE_BIT_SWITCH_ARG(joystick, CM_REG_FUNCTRL1, CM_JYSTK_EN, 0, 0); /* now module option */ DEFINE_SWITCH_ARG(modem, CM_REG_MISC_CTRL, CM_FLINKON|CM_FLINKOFF, CM_FLINKON, 0, 0); #define DEFINE_SWITCH(sname, stype, sarg) \ @@ -2693,7 +2715,7 @@ /* card control switches */ static snd_kcontrol_new_t snd_cmipci_control_switches[] __devinitdata = { - DEFINE_CARD_SWITCH("Joystick", joystick), + // DEFINE_CARD_SWITCH("Joystick", joystick), /* now module option */ DEFINE_CARD_SWITCH("Modem", modem), }; @@ -2901,6 +2923,14 @@ free_irq(cm->irq, (void *)cm); } +#ifdef SUPPORT_JOYSTICK + if (cm->res_joystick) { + gameport_unregister_port(&cm->gameport); + snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); + release_resource(cm->res_joystick); + kfree_nocheck(cm->res_joystick); + } +#endif if (cm->res_iobase) { release_resource(cm->res_iobase); kfree_nocheck(cm->res_iobase); @@ -3106,6 +3136,15 @@ snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPDIF48K|CM_SPDF_AC97); #endif /* USE_VAR48KRATE */ +#ifdef SUPPORT_JOYSTICK + if (joystick[dev] && + (cm->res_joystick = request_region(CM_JOYSTICK_ADDR, 8, "CMIPCI gameport")) != NULL) { + cm->gameport.io = CM_JOYSTICK_ADDR; + snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); + gameport_register_port(&cm->gameport); + } else + snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); +#endif *rcmipci = cm; return 0; @@ -3214,7 +3253,7 @@ #ifndef MODULE /* format is: snd-cmipci=enable,index,id, - mpu_port,fm_port */ + mpu_port,fm_port,soft_ac3,joystick */ static int __init alsa_card_cmipci_setup(char *str) { @@ -3226,7 +3265,14 @@ get_option(&str,&index[nr_dev]) == 2 && get_id(&str,&id[nr_dev]) == 2 && get_option_long(&str,&mpu_port[nr_dev]) == 2 && - get_option_long(&str,&fm_port[nr_dev]) == 2); + get_option_long(&str,&fm_port[nr_dev]) == 2 +#ifdef DO_SOFT_AC3 + && get_option(&str,&soft_ac3[nr_dev]) == 2 +#endif +#ifdef SUPPORT_JOYSTICK + && get_option(&str,&joystick[nr_dev]) == 2 +#endif + ); nr_dev++; return 1; } Index: ens1370.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/ens1370.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- ens1370.c 25 Sep 2003 18:55:43 -0000 1.50 +++ ens1370.c 14 Oct 2003 13:59:20 -0000 1.51 @@ -72,9 +72,20 @@ "{Ectiva,EV1938}}"); #endif +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#define SUPPORT_JOYSTICK +#endif + static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable switches */ +#ifdef SUPPORT_JOYSTICK +#ifdef CHIP1371 +static int joystick_port[SNDRV_CARDS]; +#else +static int joystick[SNDRV_CARDS]; +#endif +#endif MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(index, "Index value for Ensoniq AudioPCI soundcard."); @@ -85,6 +96,17 @@ MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(enable, "Enable Ensoniq AudioPCI soundcard."); MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); +#ifdef SUPPORT_JOYSTICK +#ifdef CHIP1371 +MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(joystick_port, "Joystick port address."); +MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED ",allows:{{0},{0x200},{0x208},{0x210},{0x218}},dialog:list"); +#else +MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(joystick, "Enable joystick."); +MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC); +#endif +#endif /* SUPPORT_JOYSTICK */ #ifndef PCI_DEVICE_ID_ENSONIQ_CT5880 #define PCI_DEVICE_ID_ENSONIQ_CT5880 0x5880 @@ -416,9 +438,8 @@ dma_addr_t bugbuf_addr; #endif -#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#ifdef SUPPORT_JOYSTICK struct gameport gameport; - struct semaphore joy_sem; // gameport configuration semaphore #endif }; @@ -1565,8 +1586,8 @@ #endif /* CHIP1371 */ -/* generic control callbacks for ens1370 and for joystick */ -#if defined(CHIP1370) || defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +/* generic control callbacks for ens1370 */ +#ifdef CHIP1370 #define ENSONIQ_CONTROL(xname, mask) \ { .iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = xname, .info = snd_ensoniq_control_info, \ .get = snd_ensoniq_control_get, .put = snd_ensoniq_control_put, \ @@ -1593,7 +1614,6 @@ return 0; } -#ifdef CHIP1370 static int snd_ensoniq_control_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) { ensoniq_t *ensoniq = snd_kcontrol_chip(kcontrol); @@ -1611,14 +1631,11 @@ spin_unlock_irqrestore(&ensoniq->reg_lock, flags); return change; } -#endif /* CHIP1370 */ -#endif /* CHIP1370 || GAMEPORT */ /* * ENS1370 mixer */ -#ifdef CHIP1370 static snd_kcontrol_new_t snd_es1370_controls[2] __devinitdata = { ENSONIQ_CONTROL("PCM 0 Output also on Line-In Jack", ES_1370_XCTL0), ENSONIQ_CONTROL("Mic +5V bias", ES_1370_XCTL1) @@ -1660,129 +1677,32 @@ #endif /* CHIP1370 */ -/* - * General Switches... - */ - -#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) -/* MQ: gameport driver connectivity */ -#define ENSONIQ_JOY_CONTROL(xname, mask) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = xname, .info = snd_ensoniq_control_info, \ - .get = snd_ensoniq_control_get, .put = snd_ensoniq_joy_control_put, \ - .private_value = mask } - -static int snd_ensoniq_joy_enable(ensoniq_t *ensoniq) +#ifdef SUPPORT_JOYSTICK +static int snd_ensoniq_joystick(ensoniq_t *ensoniq, long port) { - static unsigned long last_jiffies = 0; - unsigned long flags; - + ensoniq->gameport.io = port; if (!request_region(ensoniq->gameport.io, 8, "ens137x: gameport")) { -#define ES___GAMEPORT_LOG_DELAY (30*HZ) - // avoid log pollution: limit to 2 infos per minute - if (time_after(jiffies, last_jiffies + ES___GAMEPORT_LOG_DELAY)) { - last_jiffies = jiffies; - snd_printk("gameport io port 0x%03x in use", ensoniq->gameport.io); - } - return 0; + snd_printk("gameport io port 0x%03x in use", ensoniq->gameport.io); + return -EBUSY; } - spin_lock_irqsave(&ensoniq->reg_lock, flags); ensoniq->ctrl |= ES_JYSTK_EN; +#ifdef CHIP1371 + ensoniq->ctrl &= ~ES_1371_JOY_ASELM; + ensoniq->ctrl |= ES_1371_JOY_ASEL((ensoniq->gameport.io - 0x200) / 8); +#endif outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL)); - spin_unlock_irqrestore(&ensoniq->reg_lock, flags); gameport_register_port(&ensoniq->gameport); - return 1; + return 0; } -static int snd_ensoniq_joy_disable(ensoniq_t *ensoniq) +static void snd_ensoniq_joystick_free(ensoniq_t *ensoniq) { - unsigned long flags; - gameport_unregister_port(&ensoniq->gameport); - spin_lock_irqsave(&ensoniq->reg_lock, flags); ensoniq->ctrl &= ~ES_JYSTK_EN; outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL)); - spin_unlock_irqrestore(&ensoniq->reg_lock, flags); release_region(ensoniq->gameport.io, 8); - return 1; -} - -static int snd_ensoniq_joy_control_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) -{ - ensoniq_t *ensoniq = snd_kcontrol_chip(kcontrol); - unsigned int nval; - int change; - - down(&ensoniq->joy_sem); - nval = ucontrol->value.integer.value[0] ? ES_JYSTK_EN : 0; - change = (ensoniq->ctrl & ES_JYSTK_EN) != nval; // spinlock shouldn't be needed because of joy_sem - if (change) { - if (nval) // enable - change = snd_ensoniq_joy_enable(ensoniq); - else change = snd_ensoniq_joy_disable(ensoniq); - } - up(&ensoniq->joy_sem); - return change; } - -static snd_kcontrol_new_t snd_ensoniq_control_joystick __devinitdata = -ENSONIQ_JOY_CONTROL("Joystick Enable", ES_JYSTK_EN); - -#ifdef CHIP1371 - -#define ES1371_JOYSTICK_ADDR(xname) \ -{ .iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = xname, .info = snd_es1371_joystick_addr_info, \ - .get = snd_es1371_joystick_addr_get, .put = snd_es1371_joystick_addr_put } - -static int snd_es1371_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", (uinfo->value.enumerated.item * 8) + 0x200); - return 0; -} - -static int snd_es1371_joystick_addr_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) -{ - ensoniq_t *ensoniq = snd_kcontrol_chip(kcontrol); - unsigned long flags; - - spin_lock_irqsave(&ensoniq->reg_lock, flags); - ucontrol->value.enumerated.item[0] = ES_1371_JOY_ASELI(ensoniq->ctrl); - spin_unlock_irqrestore(&ensoniq->reg_lock, flags); - return 0; -} - -static int snd_es1371_joystick_addr_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) -{ - ensoniq_t *ensoniq = snd_kcontrol_chip(kcontrol); - unsigned long flags; - unsigned int nval; - int change; - - down(&ensoniq->joy_sem); - nval = ES_1371_JOY_ASEL(ucontrol->value.integer.value[0]); - spin_lock_irqsave(&ensoniq->reg_lock, flags); - if (!(change = !(ensoniq->ctrl & ES_JYSTK_EN))) - goto no_change; // FIXME: now we allow change only when joystick is disabled - change = (ensoniq->ctrl & ES_1371_JOY_ASELM) != nval; - ensoniq->ctrl &= ~ES_1371_JOY_ASELM; - ensoniq->ctrl |= nval; - outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL)); - ensoniq->gameport.io = 0x200 + ES_1371_JOY_ASELI(nval) * 8; -no_change: - spin_unlock_irqrestore(&ensoniq->reg_lock, flags); - up(&ensoniq->joy_sem); - return change; -} - -static snd_kcontrol_new_t snd_es1371_joystick_addr __devinitdata = -ES1371_JOYSTICK_ADDR("Joystick Address"); - -#endif /* CHIP1371 */ -#endif /* CONFIG_GAMEPORT */ +#endif /* SUPPORT_JOYSTICK */ /* @@ -1821,9 +1741,9 @@ static int snd_ensoniq_free(ensoniq_t *ensoniq) { -#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#ifdef SUPPORT_JOYSTICK if (ensoniq->ctrl & ES_JYSTK_EN) - snd_ensoniq_joy_disable(ensoniq); + snd_ensoniq_joystick_free(ensoniq); #endif if (ensoniq->irq < 0) goto __hw_end; @@ -2019,14 +1939,6 @@ outb(ensoniq->uartc = 0x00, ES_REG(ensoniq, UART_CONTROL)); outb(0x00, ES_REG(ensoniq, UART_RES)); outl(ensoniq->cssr, ES_REG(ensoniq, STATUS)); -#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) - init_MUTEX(&ensoniq->joy_sem); -#ifdef CHIP1371 - snd_ctl_add(card, snd_ctl_new1(&snd_es1371_joystick_addr, ensoniq)); -#endif - snd_ctl_add(card, snd_ctl_new1(&snd_ensoniq_control_joystick, ensoniq)); - ensoniq->gameport.io = 0x200; // FIXME: is ES1371 configured like this above ? -#endif synchronize_irq(ensoniq->irq); if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ensoniq, &ops)) < 0) { @@ -2331,6 +2243,21 @@ snd_card_free(card); return err; } +#ifdef SUPPORT_JOYSTICK +#ifdef CHIP1371 + switch (joystick_port[dev]) { + case 0x200: + case 0x208: + case 0x210: + case 0x218: + snd_ensoniq_joystick(ensoniq, joystick_port[dev]); + break; + } +#else + if (joystick[dev]) + snd_ensoniq_joystick(ensoniq, 0x200); +#endif +#endif /* SUPPORT_JOYSTICK */ strcpy(card->driver, DRIVER_NAME); strcpy(card->shortname, "Ensoniq AudioPCI"); @@ -2386,7 +2313,7 @@ #ifndef MODULE -/* format is: snd-ens1370=enable,index,id */ +/* format is: snd-ens1370=enable,index,id,joystick */ static int __init alsa_card_ens137x_setup(char *str) { @@ -2396,7 +2323,15 @@ return 0; (void)(get_option(&str,&enable[nr_dev]) == 2 && get_option(&str,&index[nr_dev]) == 2 && - get_id(&str,&id[nr_dev]) == 2); + get_id(&str,&id[nr_dev]) == 2 +#ifdef SUPPORT_JOYSTICK +#ifdef CHIP1371 + && get_option(&str,&joystick_port[nr_dev]) == 2 +#else + && get_option(&str,&joystick[nr_dev]) == 2 +#endif +#endif + ); nr_dev++; return 1; } Index: es1968.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/es1968.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- es1968.c 13 Oct 2003 13:42:06 -0000 1.54 +++ es1968.c 14 Oct 2003 13:59:20 -0000 1.55 @@ -101,6 +101,7 @@ #include <linux/init.h> #include <linux/pci.h> #include <linux/slab.h> +#include <linux/gameport.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/mpu401.h> @@ -121,6 +122,10 @@ "{ESS,Maestro 1}," "{TerraTec,DMX}}"); +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#define SUPPORT_JOYSTICK 1 +#endif + static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 1-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ @@ -130,6 +135,9 @@ static int clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; static int use_pm[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; static int enable_mpu[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2}; +#ifdef SUPPORT_JOYSTICK +static int joystick[SNDRV_CARDS]; +#endif MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard."); @@ -158,6 +166,11 @@ MODULE_PARM(enable_mpu, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(enable_mpu, "Enable MPU401. (0 = off, 1 = on, 2 = auto)"); MODULE_PARM_SYNTAX(enable_mpu, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC); +#ifdef SUPPORT_JOYSTICK +MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(joystick, "Enable joystick."); +MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC); +#endif /* PCI Dev ID's */ @@ -601,6 +614,11 @@ #ifdef CONFIG_PM u16 apu_map[NR_APUS][NR_APU_REGS]; #endif + +#ifdef SUPPORT_JOYSTICK + struct gameport gameport; + struct resource *res_joystick; +#endif }; static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs); @@ -2477,6 +2495,13 @@ if (chip->res_io_port) snd_es1968_reset(chip); +#ifdef SUPPORT_JOYSTICK + if (chip->res_joystick) { + gameport_unregister_port(&chip->gameport); + release_resource(chip->res_joystick); + kfree_nocheck(chip->res_joystick); + } +#endif snd_es1968_set_acpi(chip, ACPI_D3); chip->master_switch = NULL; chip->master_volume = NULL; @@ -2623,57 +2648,6 @@ /* - * joystick - */ - -static int snd_es1968_joystick_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 1; - return 0; -} - -static int snd_es1968_joystick_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) -{ - es1968_t *chip = snd_kcontrol_chip(kcontrol); - u16 val; - - pci_read_config_word(chip->pci, ESM_LEGACY_AUDIO_CONTROL, &val); - ucontrol->value.integer.value[0] = (val & 0x04) ? 1 : 0; - return 0; -} - -static int snd_es1968_joystick_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) -{ - es1968_t *chip = snd_kcontrol_chip(kcontrol); - u16 val, oval; - - pci_read_config_word(chip->pci, ESM_LEGACY_AUDIO_CONTROL, &oval); - val = oval & ~0x04; - if (ucontrol->value.integer.value[0]) - val |= 0x04; - if (val != oval) { - pci_write_config_word(chip->pci, ESM_LEGACY_AUDIO_CONTROL, val); - return 1; - } - return 0; -} - -#define num_controls(ary) (sizeof(ary) / sizeof(snd_kcontrol_new_t)) - -static snd_kcontrol_new_t snd_es1968_control_switches[] __devinitdata = { - { - .name = "Joystick", - .iface = SNDRV_CTL_ELEM_IFACE_CARD, - .info = snd_es1968_joystick_info, - .get = snd_es1968_joystick_get, - .put = snd_es1968_joystick_put, - } -}; - -/* */ static int __devinit snd_es1968_probe(struct pci_dev *pci, const struct pci_device_id *pci_id) @@ -2755,14 +2729,17 @@ } } - /* card switches */ - for (i = 0; i < num_controls(snd_es1968_control_switches); i++) { - err = snd_ctl_add(card, snd_ctl_new1(&snd_es1968_control_switches[i], chip)); - if (err < 0) { - snd_card_free(card); - return err; - } +#ifdef SUPPORT_JOYSTICK +#define JOYSTICK_ADDR 0x200 + if (joystick[dev] && + (chip->res_joystick = request_region(JOYSTICK_ADDR, 8, "ES1968 gameport")) != NULL) { + u16 val; + pci_read_config_word(pci, ESM_LEGACY_AUDIO_CONTROL, &val); + pci_write_config_word(pci, ESM_LEGACY_AUDIO_CONTROL, val | 0x04); + chip->gameport.io = JOYSTICK_ADDR; + gameport_register_port(&chip->gameport); } +#endif snd_es1968_start_irq(chip); @@ -2833,7 +2810,8 @@ pcm_substreams_c, clock, use_pm, - enable_mpu + enable_mpu, + joystick */ static int __init alsa_card_es1968_setup(char *str) @@ -2850,7 +2828,11 @@ get_option(&str,&pcm_substreams_c[nr_dev]) == 2 && get_option(&str,&clock[nr_dev]) == 2 && get_option(&str,&use_pm[nr_dev]) == 2 && - get_option(&str,&enable_mpu[nr_dev]) == 2); + get_option(&str,&enable_mpu[nr_dev]) == 2 +#ifdef SUPPORT_JOYSTICK + && get_option(&str,&joystick[nr_dev]) == 2 +#endif + ); nr_dev++; return 1; } Index: intel8x0.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/intel8x0.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -r1.93 -r1.94 --- intel8x0.c 14 Oct 2003 11:29:03 -0000 1.93 +++ intel8x0.c 14 Oct 2003 13:59:20 -0000 1.94 @@ -33,6 +33,7 @@ #include <linux/init.h> #include <linux/pci.h> #include <linux/slab.h> +#include <linux/gameport.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/ac97_codec.h> @@ -59,7 +60,9 @@ "{AMD,AMD8111}," "{ALI,M5455}}"); +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) #define SUPPORT_JOYSTICK 1 +#endif #define SUPPORT_MIDI 1 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ @@ -67,12 +70,7 @@ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; #ifdef SUPPORT_JOYSTICK -static int joystick_port[SNDRV_CARDS] = -#ifdef CONFIG_ISA - {0x200}; /* enable as default */ -#else - {0}; /* disabled */ -#endif +static int joystick[SNDRV_CARDS]; #endif #ifdef SUPPORT_MIDI static int mpu_port[SNDRV_CARDS]; /* disabled */ @@ -91,9 +89,9 @@ MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (0 = auto-detect)."); MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:0"); #ifdef SUPPORT_JOYSTICK -MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); -MODULE_PARM_DESC(joystick_port, "Joystick port address for Intel i8x0 soundcard. (0 = disabled)"); -MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED ",allows:{{0},{0x200}},dialog:list"); +MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(joystick, "Enable joystick for Intel i8x0 soundcard."); +MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC); #endif #ifdef SUPPORT_MIDI MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); @@ -2656,9 +2654,16 @@ * initialize joystick/midi addresses */ +#ifdef SUPPORT_JOYSTICK +/* there is only one available device, so we keep it here */ +static struct pci_dev *ich_gameport_pci; +static struct gameport ich_gameport = { .io = 0x200 }; +#endif + static int __devinit snd_intel8x0_joystick_probe(struct pci_dev *pci, const struct pci_device_id *id) { + u16 val; static int dev; if (dev >= SNDRV_CARDS) return -ENODEV; @@ -2667,17 +2672,24 @@ return -ENOENT; } - if (joystick_port[dev] > 0 || mpu_port[dev] > 0) { - u16 val; - pci_read_config_word(pci, 0xe6, &val); - if (joystick_port[dev] > 0) + pci_read_config_word(pci, 0xe6, &val); +#ifdef SUPPORT_JOYSTICK + if (joystick[dev]) { + if (! request_region(ich_gameport.io, 8, "ICH gameport")) { + printk(KERN_WARNING "intel8x0: cannot grab gameport 0x%x\n", ich_gameport.io); + joystick[dev] = 0; + } else { + ich_gameport_pci = pci; + gameport_register_port(&ich_gameport); val |= 0x100; - if (mpu_port[dev] == 0x300 || mpu_port[dev] == 0x330) - val |= 0x20; - pci_write_config_word(pci, 0xe6, val | 0x100); - + } + } +#endif +#ifdef SUPPORT_MIDI + if (mpu_port[dev] > 0) { if (mpu_port[dev] == 0x300 || mpu_port[dev] == 0x330) { u8 b; + val |= 0x20; pci_read_config_byte(pci, 0xe2, &b); if (mpu_port[dev] == 0x300) b |= 0x08; @@ -2686,9 +2698,27 @@ pci_write_config_byte(pci, 0xe2, b); } } +#endif + pci_write_config_word(pci, 0xe6, val); return 0; } +static void __devexit snd_intel8x0_joystick_remove(struct pci_dev *pci) +{ + u16 val; +#ifdef SUPPORT_JOYSTICK + if (ich_gameport_pci == pci) { + gameport_unregister_port(&ich_gameport); + release_region(ich_gameport.io, 8); + ich_gameport_pci = NULL; + } +#endif + /* disable joystick and MIDI */ + pci_read_config_word(pci, 0xe6, &val); + val &= ~0x120; + pci_write_config_word(pci, 0xe6, val); +} + static struct pci_device_id snd_intel8x0_joystick_ids[] = { { 0x8086, 0x2410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* 82801AA */ { 0x8086, 0x2420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* 82901AB */ @@ -2707,6 +2737,7 @@ .name = "Intel ICH Joystick", .id_table = snd_intel8x0_joystick_ids, .probe = snd_intel8x0_joystick_probe, + .remove = __devexit_p(snd_intel8x0_joystick_remove), }; static int have_joystick; @@ -2749,7 +2780,7 @@ #ifndef MODULE -/* format is: snd-intel8x0=enable,index,id,ac97_clock,mpu_port */ +/* format is: snd-intel8x0=enable,index,id,ac97_clock,mpu_port,joystick */ static int __init alsa_card_intel8x0_setup(char *str) { @@ -2763,6 +2794,9 @@ get_option(&str,&ac97_clock[nr_dev]) == 2 #ifdef SUPPORT_MIDI && get_option(&str,&mpu_port[nr_dev]) == 2 +#endif +#ifdef SUPPORT_JOYSTICK + && get_option(&str,&joystick[nr_dev]) == 2 #endif ); nr_dev++; Index: via82xx.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/via82xx.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- via82xx.c 14 Oct 2003 13:08:20 -0000 1.59 +++ via82xx.c 14 Oct 2003 13:59:20 -0000 1.60 @@ -50,6 +50,7 @@ #include <linux/init.h> #include <linux/pci.h> #include <linux/slab.h> +#include <linux/gameport.h> #include <sound/core.h> #include <sound/pcm.h> #include <sound/pcm_params.h> @@ -69,10 +70,17 @@ MODULE_CLASSES("{sound}"); MODULE_DEVICES("{{VIA,VT82C686A/B/C,pci},{VIA,VT8233A/C,8235}}"); +#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) +#define SUPPORT_JOYSTICK 1 +#endif + static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ static long mpu_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1}; +#ifdef SUPPORT_JOYSTICK +static int joystick[SNDRV_CARDS]; +#endif static int ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 48000}; static int dxs_support[SNDRV_CARDS]; @@ -86,8 +94,13 @@ MODULE_PARM_DESC(enable, "Enable audio part of VIA 82xx bridge."); MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); MODULE_PARM(mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l"); -MODULE_PARM_DESC(mpu_port, "MPU-401 port."); +MODULE_PARM_DESC(mpu_port, "MPU-401 port. (VT82C686x only)"); MODULE_PARM_SYNTAX(mpu_port, SNDRV_PORT_DESC); +#ifdef SUPPORT_JOYSTICK +MODULE_PARM(joystick, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +MODULE_PARM_DESC(joystick, "Enable joystick. (VT82C686x only)"); +MODULE_PARM_SYNTAX(joystick, SNDRV_ENABLE_DESC "," SNDRV_BOOLEAN_FALSE_DESC); +#endif MODULE_PARM(ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz)."); MODULE_PARM_SYNTAX(ac97_clock, SNDRV_ENABLED ",default:48000"); @@ -461,6 +474,11 @@ spinlock_t reg_lock; spinlock_t ac97_lock; snd_info_entry_t *proc_entry; + +#ifdef SUPPORT_JOYSTICK + struct gameport gameport; + struct resource *res_joystick; +#endif }; static struct pci_device_id snd_via82xx_ids[] = { @@ -1559,53 +1577,6 @@ } /* - * joystick - */ - -static int snd_via82xx_joystick_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) -{ - uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; - uinfo->count = 1; - uinfo->value.integer.min = 0; - uinfo->value.integer.max = 1; - return 0; -} - -static int snd_via82xx_joystick_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) -{ - via82xx_t *chip = snd_kcontrol_chip(kcontrol); - u16 val; - - pci_read_config_word(chip->pci, VIA_FUNC_ENABLE, &val); - ucontrol->value.integer.value[0] = (val & VIA_FUNC_ENABLE_GAME) ? 1 : 0; - return 0; -} - -static int snd_via82xx_joystick_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol) -{ - via82xx_t *chip = snd_kcontrol_chip(kcontrol); - u16 val, oval; - - pci_read_config_word(chip->pci, VIA_FUNC_ENABLE, &oval); - val = oval & ~VIA_FUNC_ENABLE_GAME; - if (ucontrol->value.integer.value[0]) - val |= VIA_FUNC_ENABLE_GAME; - if (val != oval) { - pci_write_config_word(chip->pci, VIA_FUNC_ENABLE, val); - return 1; - } - return 0; -} - -static snd_kcontrol_new_t snd_via82xx_joystick_control __devinitdata = { - .name = "Joystick", - .iface = SNDRV_CTL_ELEM_IFACE_CARD, - .info = snd_via82xx_joystick_info, - .get = snd_via82xx_joystick_get, - .put = snd_via82xx_joystick_put, -}; - -/* * */ @@ -1689,6 +1660,16 @@ legacy &= ~VIA_FUNC_ENABLE_MIDI; mpu_port[dev] = -1; } + +#ifdef SUPPORT_JOYSTICK +#define JOYSTICK_ADDR 0x200 + if (joystick[dev] && + (chip->res_joystick = request_region(JOYSTICK_ADDR, 8, "VIA686 gameport")) != NULL) { + legacy |= VIA_FUNC_ENABLE_GAME; + chip->gameport.io = JOYSTICK_ADDR; + } +#endif + pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy); pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, legacy_cfg); if (chip->mpu_res) { @@ -1702,9 +1683,13 @@ } pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy); } - - /* card switches */ - return snd_ctl_add(chip->card, snd_ctl_new1(&snd_via82xx_joystick_control, chip)); + +#ifdef SUPPORT_JOYSTICK + if (chip->res_joystick) + gameport_register_port(&chip->gameport); +#endif + + return 0; } @@ -1866,6 +1851,13 @@ if (chip->irq >= 0) free_irq(chip->irq, (void *)chip); if (chip->chip_type == TYPE_VIA686) { +#ifdef SUPPORT_JOYSTICK + if (chip->res_joystick) { + gameport_unregister_port(&chip->gameport); + release_resource(chip->res_joystick); + kfree_nocheck(chip->res_joystick); + } +#endif pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, chip->old_legacy); pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, chip->old_legacy_cfg); } @@ -2155,7 +2147,7 @@ #ifndef MODULE /* format is: snd-via82xx=enable,index,id, - mpu_port,ac97_clock,dxs_support */ + mpu_port,joystick,ac97_clock,dxs_support */ static int __init alsa_card_via82xx_setup(char *str) { @@ -2167,6 +2159,9 @@ get_option(&str,&index[nr_dev]) == 2 && get_id(&str,&id[nr_dev]) == 2 && get_option_long(&str,&mpu_port[nr_dev]) == 2 && +#ifdef SUPPORT_JOYSTICK + get_option(&str,&joystick[nr_dev]) == 2 && +#endif get_option(&str,&ac97_clock[nr_dev]) == 2 && get_option(&str,&dxs_support[nr_dev]) == 2); nr_dev++; ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. SourceForge.net hosts over 70,000 Open Source Projects. See the people who have HELPED US provide better services: Click here: http://sourceforge.net/supporters.php _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog