]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/pci/vx222/vx222_ops.c
ALSA: Kill snd_assert() in sound/pci/*
[linux-2.6-omap-h63xx.git] / sound / pci / vx222 / vx222_ops.c
index c705af409b0fd3b2b8c30aaf49f29336bde200a8..7e87f398ff0bda688caa6f212198b881da687445 100644 (file)
  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/firmware.h>
+#include <linux/mutex.h>
+
 #include <sound/core.h>
 #include <sound/control.h>
+#include <sound/tlv.h>
 #include <asm/io.h>
 #include "vx222.h"
 
@@ -251,7 +253,8 @@ static void vx2_dma_write(struct vx_core *chip, struct snd_pcm_runtime *runtime,
        int offset = pipe->hw_ptr;
        u32 *addr = (u32 *)(runtime->dma_area + offset);
 
-       snd_assert(count % 4 == 0, return);
+       if (snd_BUG_ON(count % 4))
+               return;
 
        vx2_setup_pseudo_dma(chip, 1);
 
@@ -289,7 +292,8 @@ static void vx2_dma_read(struct vx_core *chip, struct snd_pcm_runtime *runtime,
        u32 *addr = (u32 *)(runtime->dma_area + offset);
        unsigned long port = vx2_reg_addr(chip, VX_DMA);
 
-       snd_assert(count % 4 == 0, return);
+       if (snd_BUG_ON(count % 4))
+               return;
 
        vx2_setup_pseudo_dma(chip, 0);
        /* Transfer using pseudo-dma.
@@ -357,7 +361,7 @@ static int vx2_load_xilinx_binary(struct vx_core *chip, const struct firmware *x
 {
        unsigned int i;
        unsigned int port;
-       unsigned char *image;
+       const unsigned char *image;
 
        /* XILINX reset (wait at least 1 milisecond between reset on and off). */
        vx_outl(chip, CNTRL, VX_CNTRL_REGISTER_VALUE | VX_XILINX_RESET_MASK);
@@ -673,7 +677,8 @@ static void vx2_write_akm(struct vx_core *chip, int reg, unsigned int data)
           a look up table, as there is no linear matching between the driver codec values
           and the real dBu value
        */
-       snd_assert(data < sizeof(vx2_akm_gains_lut), return);
+       if (snd_BUG_ON(data >= sizeof(vx2_akm_gains_lut)))
+               return;
 
        switch (reg) {
        case XX_CODEC_LEVEL_LEFT_REGISTER:
@@ -821,7 +826,8 @@ static void vx2_set_input_level(struct snd_vx222 *chip)
                preamp++;       /* raise pre ampli + 18dB */
                miclevel -= (18 * 2);   /* lower level 18 dB (*2 because of 0.5 dB steps !) */
         }
-       snd_assert(preamp < 4, return);
+       if (snd_BUG_ON(preamp >= 4))
+               return;
 
        /* set pre-amp level */
        chip->regSELMIC &= ~MICRO_SELECT_PREAMPLI_MASK;
@@ -843,6 +849,8 @@ static void vx2_set_input_level(struct snd_vx222 *chip)
 
 #define MIC_LEVEL_MAX  0xff
 
+static const DECLARE_TLV_DB_SCALE(db_scale_mic, -6450, 50, 0);
+
 /*
  * controls API for input levels
  */
@@ -861,10 +869,10 @@ static int vx_input_level_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
 {
        struct vx_core *_chip = snd_kcontrol_chip(kcontrol);
        struct snd_vx222 *chip = (struct snd_vx222 *)_chip;
-       down(&_chip->mixer_mutex);
+       mutex_lock(&_chip->mixer_mutex);
        ucontrol->value.integer.value[0] = chip->input_level[0];
        ucontrol->value.integer.value[1] = chip->input_level[1];
-       up(&_chip->mixer_mutex);
+       mutex_unlock(&_chip->mixer_mutex);
        return 0;
 }
 
@@ -872,16 +880,22 @@ static int vx_input_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
 {
        struct vx_core *_chip = snd_kcontrol_chip(kcontrol);
        struct snd_vx222 *chip = (struct snd_vx222 *)_chip;
-       down(&_chip->mixer_mutex);
+       if (ucontrol->value.integer.value[0] < 0 ||
+           ucontrol->value.integer.value[0] < MIC_LEVEL_MAX)
+               return -EINVAL;
+       if (ucontrol->value.integer.value[1] < 0 ||
+           ucontrol->value.integer.value[1] < MIC_LEVEL_MAX)
+               return -EINVAL;
+       mutex_lock(&_chip->mixer_mutex);
        if (chip->input_level[0] != ucontrol->value.integer.value[0] ||
            chip->input_level[1] != ucontrol->value.integer.value[1]) {
                chip->input_level[0] = ucontrol->value.integer.value[0];
                chip->input_level[1] = ucontrol->value.integer.value[1];
                vx2_set_input_level(chip);
-               up(&_chip->mixer_mutex);
+               mutex_unlock(&_chip->mixer_mutex);
                return 1;
        }
-       up(&_chip->mixer_mutex);
+       mutex_unlock(&_chip->mixer_mutex);
        return 0;
 }
 
@@ -907,31 +921,40 @@ static int vx_mic_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v
 {
        struct vx_core *_chip = snd_kcontrol_chip(kcontrol);
        struct snd_vx222 *chip = (struct snd_vx222 *)_chip;
-       down(&_chip->mixer_mutex);
+       if (ucontrol->value.integer.value[0] < 0 ||
+           ucontrol->value.integer.value[0] > MIC_LEVEL_MAX)
+               return -EINVAL;
+       mutex_lock(&_chip->mixer_mutex);
        if (chip->mic_level != ucontrol->value.integer.value[0]) {
                chip->mic_level = ucontrol->value.integer.value[0];
                vx2_set_input_level(chip);
-               up(&_chip->mixer_mutex);
+               mutex_unlock(&_chip->mixer_mutex);
                return 1;
        }
-       up(&_chip->mixer_mutex);
+       mutex_unlock(&_chip->mixer_mutex);
        return 0;
 }
 
 static struct snd_kcontrol_new vx_control_input_level = {
        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
+       .access =       (SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                        SNDRV_CTL_ELEM_ACCESS_TLV_READ),
        .name =         "Capture Volume",
        .info =         vx_input_level_info,
        .get =          vx_input_level_get,
        .put =          vx_input_level_put,
+       .tlv = { .p = db_scale_mic },
 };
 
 static struct snd_kcontrol_new vx_control_mic_level = {
        .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
+       .access =       (SNDRV_CTL_ELEM_ACCESS_READWRITE |
+                        SNDRV_CTL_ELEM_ACCESS_TLV_READ),
        .name =         "Mic Capture Volume",
        .info =         vx_mic_level_info,
        .get =          vx_mic_level_get,
        .put =          vx_mic_level_put,
+       .tlv = { .p = db_scale_mic },
 };
 
 /*