Takashi Iwai wrote:
> Clemens Ladisch wrote:
> > This removes the joystick enable/address card controls and makes
> > them a module option instead.
>
> i'm getting to agree with this, as it was before on 0.5.x, to use the
> module parameters for confinguring joysticks.
> changing the hardware ports on the control API would be dangerous.
>
> but anyway, if we do change this, we should fix all corresponding
> drivers, not only ymfpci.

ACK. Below is a patch for ENS1370/1. It compiles, but isn't tested.

There are three other drivers (cmipci, es1968, via82xx) using card
controls to enable the gameport, but those don't bother to call
gameport_register_port, so I'll have to look at the datasheets for the
I/O address ranges.

(There are quite a few other drivers not calling
gameport_register_port, either.)


Regards,
Clemens


-- 

Index: alsa-kernel/Documentation/ALSA-Configuration.txt
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/Documentation/ALSA-Configuration.txt,v
retrieving revision 1.18
diff -u -r1.18 ALSA-Configuration.txt
--- alsa-kernel/Documentation/ALSA-Configuration.txt    17 Sep 2003 13:34:33 -0000     
 1.18
+++ alsa-kernel/Documentation/ALSA-Configuration.txt    22 Sep 2003 07:53:04 -0000
@@ -377,6 +377,8 @@
                        * SoundBlaster PCI 64
                        * SoundBlaster PCI 128

+    joystick_port      - port # for joystick (0x200), -1 = disable (default)
+
     Module supports up to 8 cards and autoprobe.

   Module snd-ens1371
@@ -387,6 +389,9 @@
                        * SoundBlaster PCI 128
                        * SoundBlaster Vibra PCI

+    joystick_port      - port # for joystick (0x200,0x208,0x210,0x218),
+                         -1 = disable (default)
+
     Module supports up to 8 cards and autoprobe.

   Module snd-es968
Index: alsa-kernel/pci/ens1370.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ens1370.c,v
retrieving revision 1.49
diff -u -r1.49 ens1370.c
--- alsa-kernel/pci/ens1370.c   15 Sep 2003 07:38:00 -0000      1.49
+++ alsa-kernel/pci/ens1370.c   22 Sep 2003 07:53:04 -0000
@@ -68,6 +68,9 @@
 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 */
+#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
+static int joystick_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
+#endif

 MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(index, "Index value for Ensoniq AudioPCI soundcard.");
@@ -78,6 +81,15 @@
 MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(enable, "Enable Ensoniq AudioPCI soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
+#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
+MODULE_PARM(joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(joystick_port, "Joystick port address");
+#ifdef CHIP1371
+MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED 
",allows:{{0},{0x200},{0x208},{0x210},{0x218}},dialog:list");
+#else
+MODULE_PARM_SYNTAX(joystick_port, SNDRV_ENABLED ",allows:{{0},{0x200}},dialog:list");
+#endif
+#endif

 #ifndef PCI_DEVICE_ID_ENSONIQ_CT5880
 #define PCI_DEVICE_ID_ENSONIQ_CT5880    0x5880
@@ -411,7 +423,6 @@

 #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
        struct gameport gameport;
-       struct semaphore joy_sem;       // gameport configuration semaphore
 #endif
 };

@@ -1558,8 +1569,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, \
@@ -1586,7 +1597,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);
@@ -1604,14 +1614,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)
@@ -1653,128 +1660,33 @@

 #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)
+static int snd_ensoniq_joystick(ensoniq_t *ensoniq, int joystick_port)
 {
-       static unsigned long last_jiffies = 0;
-       unsigned long flags;
-
+       ensoniq->gameport.io = joystick_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(KERN_ERR "gameport port %#x in use\n", 
ensoniq->gameport.io);
+               return -EBUSY;
        }
-       spin_lock_irqsave(&ensoniq->reg_lock, flags);
        ensoniq->ctrl |= ES_JYSTK_EN;
+#ifdef CHIP1371
+       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 */

 /*
@@ -1816,7 +1728,7 @@
 {
 #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
        if (ensoniq->ctrl & ES_JYSTK_EN)
-               snd_ensoniq_joy_disable(ensoniq);
+               snd_ensoniq_joystick_free(ensoniq);
 #endif
        if (ensoniq->irq < 0)
                goto __hw_end;
@@ -2012,14 +1924,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) {
@@ -2324,6 +2228,18 @@
                snd_card_free(card);
                return err;
        }
+#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
+       switch (joystick_port[dev]) {
+       case 0x200:
+#ifdef CHIP1371
+       case 0x208:
+       case 0x210:
+       case 0x218:
+#endif
+               snd_ensoniq_joystick(ensoniq, joystick_port[dev]);
+               break;
+       }
+#endif
 #ifdef CHIP1370
        strcpy(card->driver, "ENS1370");
 #endif




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to