/* * get the VU and peak meter values * @audio: the audio index * @capture: 0 = playback, 1 = capture operation * @info: the array of vx_vu_meter records (size = 2). */ static int vx_get_audio_vu_meter(struct vx_core *chip, int audio, int capture, struct vx_vu_meter *info) { struct vx_rmh rmh; int i, err; if (chip->chip_status & VX_STAT_IS_STALE) return -EBUSY; vx_init_rmh(&rmh, CMD_AUDIO_VU_PIC_METER); rmh.LgStat += 2 * VU_METER_CHANNELS; if (capture) rmh.Cmd[0] |= COMMAND_RECORD_MASK; /* Add Audio IO mask */ rmh.Cmd[1] = 0; for (i = 0; i < VU_METER_CHANNELS; i++) rmh.Cmd[1] |= 1 << (audio + i); err = vx_send_msg(chip, &rmh); if (err < 0) return err; /* Read response */ for (i = 0; i < 2 * VU_METER_CHANNELS; i +=2) { info->saturated = (rmh.Stat[0] & (1 << (audio + i))) ? 1 : 0; info->vu_level = rmh.Stat[i + 1]; info->peak_level = rmh.Stat[i + 2]; info++; } return 0; }
/* * vx_test_irq_src - query the source of interrupts * * called from irq handler only */ static int vx_test_irq_src(vx_core_t *chip, unsigned int *ret) { int err; vx_init_rmh(&chip->irq_rmh, CMD_TEST_IT); spin_lock(&chip->lock); err = vx_send_msg_nolock(chip, &chip->irq_rmh); if (err < 0) *ret = 0; else *ret = chip->irq_rmh.Stat[0]; spin_unlock(&chip->lock); return err; }
static int vx_read_audio_level(struct vx_core *chip, int audio, int capture, struct vx_audio_level *info) { int err; struct vx_rmh rmh; memset(info, 0, sizeof(*info)); vx_init_rmh(&rmh, CMD_GET_AUDIO_LEVELS); if (capture) rmh.Cmd[0] |= COMMAND_RECORD_MASK; /* Add Audio IO mask */ rmh.Cmd[1] = 1 << audio; err = vx_send_msg(chip, &rmh); if (err < 0) return err; info.level = rmh.Stat[0] & MASK_DSP_WORD_LEVEL; info.monitor_level = (rmh.Stat[0] >> 10) & MASK_DSP_WORD_LEVEL; info.mute = (rmh.Stat[i] & AUDIO_IO_HAS_MUTE_LEVEL) ? 1 : 0; info.monitor_mute = (rmh.Stat[i] & AUDIO_IO_HAS_MUTE_MONITORING_1) ? 1 : 0; return 0; }
static int vx_adjust_audio_level(struct vx_core *chip, int audio, int capture, struct vx_audio_level *info) { struct vx_rmh rmh; if (chip->chip_status & VX_STAT_IS_STALE) return -EBUSY; vx_init_rmh(&rmh, CMD_AUDIO_LEVEL_ADJUST); if (capture) rmh.Cmd[0] |= COMMAND_RECORD_MASK; /* Add Audio IO mask */ rmh.Cmd[1] = 1 << audio; rmh.Cmd[2] = 0; if (info->has_level) { rmh.Cmd[0] |= VALID_AUDIO_IO_DIGITAL_LEVEL; rmh.Cmd[2] |= info->level; } if (info->has_monitor_level) { rmh.Cmd[0] |= VALID_AUDIO_IO_MONITORING_LEVEL; rmh.Cmd[2] |= ((unsigned int)info->monitor_level << 10); } if (info->has_mute) { rmh.Cmd[0] |= VALID_AUDIO_IO_MUTE_LEVEL; if (info->mute) rmh.Cmd[2] |= AUDIO_IO_HAS_MUTE_LEVEL; } if (info->has_monitor_mute) { /* validate flag for M2 at least to unmute it */ rmh.Cmd[0] |= VALID_AUDIO_IO_MUTE_MONITORING_1 | VALID_AUDIO_IO_MUTE_MONITORING_2; if (info->monitor_mute) rmh.Cmd[2] |= AUDIO_IO_HAS_MUTE_MONITORING_1; } return vx_send_msg(chip, &rmh); }