cregit-Linux how code gets into the kernel

Release 4.8 sound/drivers/vx/vx_uer.c

Directory: sound/drivers/vx
/*
 * Driver for Digigram VX soundcards
 *
 * IEC958 stuff
 *
 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#include <linux/delay.h>
#include <sound/core.h>
#include <sound/vx_core.h>
#include "vx_cmd.h"


/*
 * vx_modify_board_clock - tell the board that its clock has been modified
 * @sync: DSP needs to resynchronize its FIFO
 */

static int vx_modify_board_clock(struct vx_core *chip, int sync) { struct vx_rmh rmh; vx_init_rmh(&rmh, CMD_MODIFY_CLOCK); /* Ask the DSP to resynchronize its FIFO. */ if (sync) rmh.Cmd[0] |= CMD_MODIFY_CLOCK_S_BIT; return vx_send_msg(chip, &rmh); }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela4795.92%150.00%
takashi iwaitakashi iwai24.08%150.00%
Total49100.00%2100.00%

/* * vx_modify_board_inputs - resync audio inputs */
static int vx_modify_board_inputs(struct vx_core *chip) { struct vx_rmh rmh; vx_init_rmh(&rmh, CMD_RESYNC_AUDIO_INPUTS); rmh.Cmd[0] |= 1 << 0; /* reference: AUDIO 0 */ return vx_send_msg(chip, &rmh); }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela4295.45%150.00%
takashi iwaitakashi iwai24.55%150.00%
Total44100.00%2100.00%

/* * vx_read_one_cbit - read one bit from UER config * @index: the bit index * returns 0 or 1. */
static int vx_read_one_cbit(struct vx_core *chip, int index) { int val; mutex_lock(&chip->lock); if (chip->type >= VX_TYPE_VXPOCKET) { vx_outb(chip, CSUER, 1); /* read */ vx_outb(chip, RUER, index & XX_UER_CBITS_OFFSET_MASK); val = (vx_inb(chip, RUER) >> 7) & 0x01; } else { vx_outl(chip, CSUER, 1); /* read */ vx_outl(chip, RUER, index & XX_UER_CBITS_OFFSET_MASK); val = (vx_inl(chip, RUER) >> 7) & 0x01; } mutex_unlock(&chip->lock); return val; }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela11796.69%133.33%
takashi iwaitakashi iwai43.31%266.67%
Total121100.00%3100.00%

/* * vx_write_one_cbit - write one bit to UER config * @index: the bit index * @val: bit value, 0 or 1 */
static void vx_write_one_cbit(struct vx_core *chip, int index, int val) { val = !!val; /* 0 or 1 */ mutex_lock(&chip->lock); if (vx_is_pcmcia(chip)) { vx_outb(chip, CSUER, 0); /* write */ vx_outb(chip, RUER, (val << 7) | (index & XX_UER_CBITS_OFFSET_MASK)); } else { vx_outl(chip, CSUER, 0); /* write */ vx_outl(chip, RUER, (val << 7) | (index & XX_UER_CBITS_OFFSET_MASK)); } mutex_unlock(&chip->lock); }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela10696.36%133.33%
takashi iwaitakashi iwai43.64%266.67%
Total110100.00%3100.00%

/* * vx_read_uer_status - read the current UER status * @mode: pointer to store the UER mode, VX_UER_MODE_XXX * * returns the frequency of UER, or 0 if not sync, * or a negative error code. */
static int vx_read_uer_status(struct vx_core *chip, unsigned int *mode) { int val, freq; /* Default values */ freq = 0; /* Read UER status */ if (vx_is_pcmcia(chip)) val = vx_inb(chip, CSUER); else val = vx_inl(chip, CSUER); if (val < 0) return val; /* If clock is present, read frequency */ if (val & VX_SUER_CLOCK_PRESENT_MASK) { switch (val & VX_SUER_FREQ_MASK) { case VX_SUER_FREQ_32KHz_MASK: freq = 32000; break; case VX_SUER_FREQ_44KHz_MASK: freq = 44100; break; case VX_SUER_FREQ_48KHz_MASK: freq = 48000; break; } } if (val & VX_SUER_DATA_PRESENT_MASK) /* bit 0 corresponds to consumer/professional bit */ *mode = vx_read_one_cbit(chip, 0) ? VX_UER_MODE_PROFESSIONAL : VX_UER_MODE_CONSUMER; else *mode = VX_UER_MODE_NOT_PRESENT; return freq; }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela13097.74%133.33%
takashi iwaitakashi iwai21.50%133.33%
hannes ederhannes eder10.75%133.33%
Total133100.00%3100.00%

/* * compute the sample clock value from frequency * * The formula is as follows: * * HexFreq = (dword) ((double) ((double) 28224000 / (double) Frequency)) * switch ( HexFreq & 0x00000F00 ) * case 0x00000100: ; * case 0x00000200: * case 0x00000300: HexFreq -= 0x00000201 ; * case 0x00000400: * case 0x00000500: * case 0x00000600: * case 0x00000700: HexFreq = (dword) (((double) 28224000 / (double) (Frequency*2)) - 1) * default : HexFreq = (dword) ((double) 28224000 / (double) (Frequency*4)) - 0x000001FF */
static int vx_calc_clock_from_freq(struct vx_core *chip, int freq) { int hexfreq; if (snd_BUG_ON(freq <= 0)) return 0; hexfreq = (28224000 * 10) / freq; hexfreq = (hexfreq + 5) / 10; /* max freq = 55125 Hz */ if (snd_BUG_ON(hexfreq <= 0x00000200)) return 0; if (hexfreq <= 0x03ff) return hexfreq - 0x00000201; if (hexfreq <= 0x07ff) return (hexfreq / 2) - 1; if (hexfreq <= 0x0fff) return (hexfreq / 4) + 0x000001ff; return 0x5fe; /* min freq = 6893 Hz */ }

Contributors

PersonTokensPropCommitsCommitProp
takashi iwaitakashi iwai8579.44%375.00%
jaroslav kyselajaroslav kysela2220.56%125.00%
Total107100.00%4100.00%

/* * vx_change_clock_source - change the clock source * @source: the new source */
static void vx_change_clock_source(struct vx_core *chip, int source) { /* we mute DAC to prevent clicks */ vx_toggle_dac_mute(chip, 1); mutex_lock(&chip->lock); chip->ops->set_clock_source(chip, source); chip->clock_source = source; mutex_unlock(&chip->lock); /* unmute */ vx_toggle_dac_mute(chip, 0); }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela5993.65%250.00%
takashi iwaitakashi iwai46.35%250.00%
Total63100.00%4100.00%

/* * set the internal clock */
void vx_set_internal_clock(struct vx_core *chip, unsigned int freq) { int clock; /* Get real clock value */ clock = vx_calc_clock_from_freq(chip, freq); snd_printdd(KERN_DEBUG "set internal clock to 0x%x from freq %d\n", clock, freq); mutex_lock(&chip->lock); if (vx_is_pcmcia(chip)) { vx_outb(chip, HIFREQ, (clock >> 8) & 0x0f); vx_outb(chip, LOFREQ, clock & 0xff); } else { vx_outl(chip, HIFREQ, (clock >> 8) & 0x0f); vx_outl(chip, LOFREQ, clock & 0xff); } mutex_unlock(&chip->lock); }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela11396.58%133.33%
takashi iwaitakashi iwai43.42%266.67%
Total117100.00%3100.00%

/* * set the iec958 status bits * @bits: 32-bit status bits */
void vx_set_iec958_status(struct vx_core *chip, unsigned int bits) { int i; if (chip->chip_status & VX_STAT_IS_STALE) return; for (i = 0; i < 32; i++) vx_write_one_cbit(chip, i, bits & (1 << i)); }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela5296.30%150.00%
takashi iwaitakashi iwai23.70%150.00%
Total54100.00%2100.00%

/* * vx_set_clock - change the clock and audio source if necessary */
int vx_set_clock(struct vx_core *chip, unsigned int freq) { int src_changed = 0; if (chip->chip_status & VX_STAT_IS_STALE) return 0; /* change the audio source if possible */ vx_sync_audio_source(chip); if (chip->clock_mode == VX_CLOCK_MODE_EXTERNAL || (chip->clock_mode == VX_CLOCK_MODE_AUTO && chip->audio_source == VX_AUDIO_SRC_DIGITAL)) { if (chip->clock_source != UER_SYNC) { vx_change_clock_source(chip, UER_SYNC); mdelay(6); src_changed = 1; } } else if (chip->clock_mode == VX_CLOCK_MODE_INTERNAL || (chip->clock_mode == VX_CLOCK_MODE_AUTO && chip->audio_source != VX_AUDIO_SRC_DIGITAL)) { if (chip->clock_source != INTERNAL_QUARTZ) { vx_change_clock_source(chip, INTERNAL_QUARTZ); src_changed = 1; } if (chip->freq == freq) return 0; vx_set_internal_clock(chip, freq); if (src_changed) vx_modify_board_inputs(chip); } if (chip->freq == freq) return 0; chip->freq = freq; vx_modify_board_clock(chip, 1); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela18498.92%266.67%
takashi iwaitakashi iwai21.08%133.33%
Total186100.00%3100.00%

/* * vx_change_frequency - called from interrupt handler */
int vx_change_frequency(struct vx_core *chip) { int freq; if (chip->chip_status & VX_STAT_IS_STALE) return 0; if (chip->clock_source == INTERNAL_QUARTZ) return 0; /* * Read the real UER board frequency */ freq = vx_read_uer_status(chip, &chip->uer_detected); if (freq < 0) return freq; /* * The frequency computed by the DSP is good and * is different from the previous computed. */ if (freq == 48000 || freq == 44100 || freq == 32000) chip->freq_detected = freq; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela7997.53%150.00%
takashi iwaitakashi iwai22.47%150.00%
Total81100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
jaroslav kyselajaroslav kysela97589.53%337.50%
takashi iwaitakashi iwai11310.38%450.00%
hannes ederhannes eder10.09%112.50%
Total1089100.00%8100.00%
Directory: sound/drivers/vx
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.