[ALSA] PCI modem drivers update
Sasha Khapyorsky [Sun, 29 May 2005 13:10:07 +0000 (15:10 +0200)]
ATIIXP-modem driver,Intel8x0-modem driver,VIA82xx-modem driver
Modem drivers (atiixp-modem, intel8x0m, via82xx-modem) migration
for using MC97 generic modem mixer for off-hook operation.

Signed-off-by: Sasha Khapyorsky <sashak@smlink.com>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>

sound/pci/atiixp_modem.c
sound/pci/intel8x0m.c
sound/pci/via82xx_modem.c

index 9220aae..a6b4b8d 100644 (file)
@@ -463,6 +463,11 @@ static unsigned short snd_atiixp_ac97_read(ac97_t *ac97, unsigned short reg)
 static void snd_atiixp_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val)
 {
        atiixp_t *chip = ac97->private_data;
+       if (reg == AC97_GPIO_STATUS) {
+               atiixp_write(chip, MODEM_OUT_GPIO,
+                       (val << ATI_REG_MODEM_OUT_GPIO_DATA_SHIFT) | ATI_REG_MODEM_OUT_GPIO_EN);
+               return;
+       }
        snd_atiixp_codec_write(chip, ac97->num, reg, val);
 }
 
@@ -663,44 +668,33 @@ static int snd_atiixp_pcm_trigger(snd_pcm_substream_t *substream, int cmd)
 {
        atiixp_t *chip = snd_pcm_substream_chip(substream);
        atiixp_dma_t *dma = (atiixp_dma_t *)substream->runtime->private_data;
-       unsigned int reg = 0;
-       int i;
+       int err = 0;
 
        snd_assert(dma->ops->enable_transfer && dma->ops->flush_dma, return -EINVAL);
 
-       if (cmd != SNDRV_PCM_TRIGGER_START && cmd != SNDRV_PCM_TRIGGER_STOP)
-               return -EINVAL;
-
        spin_lock(&chip->reg_lock);
-
-       /* hook off/on: via GPIO_OUT */
-       for (i = 0; i < NUM_ATI_CODECS; i++) {
-               if (chip->ac97[i]) {
-                       reg = snd_ac97_read(chip->ac97[i], AC97_GPIO_STATUS);
-                       break;
-       }
-       }
-       if(cmd == SNDRV_PCM_TRIGGER_START)
-               reg |= AC97_GPIO_LINE1_OH;
-       else
-               reg &= ~AC97_GPIO_LINE1_OH;
-       reg = (reg << ATI_REG_MODEM_OUT_GPIO_DATA_SHIFT) | ATI_REG_MODEM_OUT_GPIO_EN ;
-       atiixp_write(chip, MODEM_OUT_GPIO, reg);
-
-       if (cmd == SNDRV_PCM_TRIGGER_START) {
+       switch(cmd) {
+       case SNDRV_PCM_TRIGGER_START:
                dma->ops->enable_transfer(chip, 1);
                dma->running = 1;
-       } else {
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
                dma->ops->enable_transfer(chip, 0);
                dma->running = 0;
+               break;
+       default:
+               err = -EINVAL;
+               break;
        }
+       if (! err) {
        snd_atiixp_check_bus_busy(chip);
        if (cmd == SNDRV_PCM_TRIGGER_STOP) {
                dma->ops->flush_dma(chip);
                snd_atiixp_check_bus_busy(chip);
        }
+       }
        spin_unlock(&chip->reg_lock);
-       return 0;
+       return err;
 }
 
 
index f655cf9..bb758c7 100644 (file)
@@ -35,7 +35,6 @@
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
 #include <sound/info.h>
-#include <sound/control.h>
 #include <sound/initval.h>
 
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
@@ -292,60 +291,9 @@ static struct pci_device_id snd_intel8x0m_ids[] = {
 #endif
        { 0, }
 };
-static int snd_intel8x0m_switch_default_get(snd_kcontrol_t *kcontrol,
-                                           snd_ctl_elem_value_t *ucontrol);
-static int snd_intel8x0m_switch_default_put(snd_kcontrol_t *kcontrol,
-                                           snd_ctl_elem_value_t *ucontrol);
-static int snd_intel8x0m_switch_default_info(snd_kcontrol_t *kcontrol,
-                                            snd_ctl_elem_info_t *uinfo);
-
-#define PRIVATE_VALUE_INITIALIZER(r,m) (((r) & 0xffff) << 16 | ((m) & 0xffff))
-#define PRIVATE_VALUE_MASK(control) ((control)->private_value & 0xffff)
-#define PRIVATE_VALUE_REG(control) (((control)->private_value >> 16) & 0xffff)
-
-static snd_kcontrol_new_t snd_intel8x0m_mixer_switches[] __devinitdata = {
-  { .name  = "Off-hook Switch",
-    .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-    .info  = snd_intel8x0m_switch_default_info,
-    .get   = snd_intel8x0m_switch_default_get,
-    .put   = snd_intel8x0m_switch_default_put,
-    .private_value = PRIVATE_VALUE_INITIALIZER(AC97_GPIO_STATUS,AC97_GPIO_LINE1_OH)
-  }
-};
 
 MODULE_DEVICE_TABLE(pci, snd_intel8x0m_ids);
 
-static int snd_intel8x0m_switch_default_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_intel8x0m_switch_default_get(snd_kcontrol_t *kcontrol,
-                                           snd_ctl_elem_value_t *ucontrol)
-{
-       unsigned short mask = PRIVATE_VALUE_MASK(kcontrol);
-       unsigned short reg = PRIVATE_VALUE_REG(kcontrol);
-       intel8x0_t *chip = snd_kcontrol_chip(kcontrol);
-       unsigned int status;
-       status = snd_ac97_read(chip->ac97, reg) & mask ? 1 : 0;
-       ucontrol->value.integer.value[0] = status;
-       return 0;
-}
-static int snd_intel8x0m_switch_default_put(snd_kcontrol_t *kcontrol,
-                                           snd_ctl_elem_value_t *ucontrol)
-{
-       unsigned short mask = PRIVATE_VALUE_MASK(kcontrol);
-       unsigned short reg = PRIVATE_VALUE_REG(kcontrol);
-       intel8x0_t *chip = snd_kcontrol_chip(kcontrol);
-       unsigned short new_status = ucontrol->value.integer.value[0] ? mask : ~mask;
-       return snd_ac97_update_bits(chip->ac97, reg,
-                                   mask, new_status);
-}
 /*
  *  Lowlevel I/O - busmaster
  */
@@ -700,21 +648,6 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(snd_pcm_substream_t * substrea
        return bytes_to_frames(substream->runtime, ptr);
 }
 
-static int snd_intel8x0m_pcm_trigger(snd_pcm_substream_t *substream, int cmd)
-{
-       /* hook off/on on start/stop */
-       /* Moved this to mixer control */
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-               break;
-       case SNDRV_PCM_TRIGGER_STOP:
-               break;
-       default:
-               return -EINVAL;
-       }
-       return snd_intel8x0_pcm_trigger(substream,cmd);
-}
-
 static int snd_intel8x0m_pcm_prepare(snd_pcm_substream_t * substream)
 {
        intel8x0_t *chip = snd_pcm_substream_chip(substream);
@@ -810,7 +743,7 @@ static snd_pcm_ops_t snd_intel8x0m_playback_ops = {
        .hw_params =    snd_intel8x0_hw_params,
        .hw_free =      snd_intel8x0_hw_free,
        .prepare =      snd_intel8x0m_pcm_prepare,
-       .trigger =      snd_intel8x0m_pcm_trigger,
+       .trigger =      snd_intel8x0_pcm_trigger,
        .pointer =      snd_intel8x0_pcm_pointer,
 };
 
@@ -821,7 +754,7 @@ static snd_pcm_ops_t snd_intel8x0m_capture_ops = {
        .hw_params =    snd_intel8x0_hw_params,
        .hw_free =      snd_intel8x0_hw_free,
        .prepare =      snd_intel8x0m_pcm_prepare,
-       .trigger =      snd_intel8x0m_pcm_trigger,
+       .trigger =      snd_intel8x0_pcm_trigger,
        .pointer =      snd_intel8x0_pcm_pointer,
 };
 
@@ -949,7 +882,6 @@ static int __devinit snd_intel8x0_mixer(intel8x0_t *chip, int ac97_clock)
        ac97_t *x97;
        int err;
        unsigned int glob_sta = 0;
-       unsigned int idx;
        static ac97_bus_ops_t ops = {
                .write = snd_intel8x0_codec_write,
                .read = snd_intel8x0_codec_read,
@@ -985,10 +917,6 @@ static int __devinit snd_intel8x0_mixer(intel8x0_t *chip, int ac97_clock)
                chip->ichd[ICHD_MDMIN].ac97 = x97;
                chip->ichd[ICHD_MDMOUT].ac97 = x97;
        }
-       for (idx = 0; idx < ARRAY_SIZE(snd_intel8x0m_mixer_switches); idx++) {
-               if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_intel8x0m_mixer_switches[idx], chip))) < 0)
-                       goto __err;
-       }
 
        chip->in_ac97_init = 0;
        return 0;
index 276ce52..e10fceb 100644 (file)
@@ -420,7 +420,10 @@ static void snd_via82xx_codec_write(ac97_t *ac97,
 {
        via82xx_t *chip = ac97->private_data;
        unsigned int xval;
-       
+       if(reg == AC97_GPIO_STATUS) {
+               outl(val, VIAREG(chip, GPI_STATUS));
+               return;
+       }       
        xval = !ac97->num ? VIA_REG_AC97_CODEC_ID_PRIMARY : VIA_REG_AC97_CODEC_ID_SECONDARY;
        xval <<= VIA_REG_AC97_CODEC_ID_SHIFT;
        xval |= reg << VIA_REG_AC97_CMD_SHIFT;
@@ -544,25 +547,6 @@ static int snd_via82xx_pcm_trigger(snd_pcm_substream_t * substream, int cmd)
        return 0;
 }
 
-static int snd_via82xx_modem_pcm_trigger(snd_pcm_substream_t * substream, int cmd)
-{
-       via82xx_t *chip = snd_pcm_substream_chip(substream);
-       unsigned int val = 0;
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-               val = snd_ac97_read(chip->ac97, AC97_GPIO_STATUS);
-               outl(val|AC97_GPIO_LINE1_OH, VIAREG(chip, GPI_STATUS));
-               break;
-       case SNDRV_PCM_TRIGGER_STOP:
-               val = snd_ac97_read(chip->ac97, AC97_GPIO_STATUS);
-               outl(val&~AC97_GPIO_LINE1_OH, VIAREG(chip, GPI_STATUS));
-               break;
-       default:
-               break;
-       }
-       return snd_via82xx_pcm_trigger(substream, cmd);
-}
-
 /*
  * pointer callbacks
  */
@@ -806,7 +790,7 @@ static snd_pcm_ops_t snd_via686_playback_ops = {
        .hw_params =    snd_via82xx_hw_params,
        .hw_free =      snd_via82xx_hw_free,
        .prepare =      snd_via82xx_pcm_prepare,
-       .trigger =      snd_via82xx_modem_pcm_trigger,
+       .trigger =      snd_via82xx_pcm_trigger,
        .pointer =      snd_via686_pcm_pointer,
        .page =         snd_pcm_sgbuf_ops_page,
 };
@@ -819,7 +803,7 @@ static snd_pcm_ops_t snd_via686_capture_ops = {
        .hw_params =    snd_via82xx_hw_params,
        .hw_free =      snd_via82xx_hw_free,
        .prepare =      snd_via82xx_pcm_prepare,
-       .trigger =      snd_via82xx_modem_pcm_trigger,
+       .trigger =      snd_via82xx_pcm_trigger,
        .pointer =      snd_via686_pcm_pointer,
        .page =         snd_pcm_sgbuf_ops_page,
 };