static int i2s_configure(struct tegra_i2s_info *info ) { struct platform_device *pdev = info->pdev; struct tegra_audio_platform_data *pdata = pdev->dev.platform_data; unsigned int i2s_id = pdev->id; unsigned int rate; i2s_enable_fifos(i2s_id, 0); i2s_fifo_clear(i2s_id, I2S_FIFO_TX); i2s_fifo_clear(i2s_id, I2S_FIFO_RX); i2s_set_left_right_control_polarity(i2s_id, 0); /* default */ rate = clk_get_rate(info->i2s_clk); if (info->bit_format == TEGRA_AUDIO_BIT_FORMAT_DSP) rate *= 2; i2s_set_master(i2s_id, pdata->i2s_master); info->i2s_master = pdata->i2s_master; if (pdata->i2s_master && pdata->i2s_master_clk) i2s_set_channel_bit_count(i2s_id, pdata->i2s_master_clk, rate); i2s_set_fifo_mode(i2s_id, I2S_FIFO_TX, 1); i2s_set_fifo_mode(i2s_id, I2S_FIFO_RX, 0); i2s_set_bit_format(i2s_id, pdata->mode); i2s_set_bit_size(i2s_id, pdata->bit_size); i2s_set_fifo_format(i2s_id, pdata->fifo_fmt); if (i2s_id == 0) en_dmic = pdata->en_dmic; return 0; }
static int tegra_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct tegra_i2s_info *info = dai->private_data; int ret = 0; int val; unsigned int i2s_id = dai->id; unsigned int rate; switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: val = I2S_BIT_SIZE_16; break; case SNDRV_PCM_FORMAT_S24_LE: val = I2S_BIT_SIZE_24; break; case SNDRV_PCM_FORMAT_S32_LE: val = I2S_BIT_SIZE_32; break; default: ret =-EINVAL; goto err; } i2s_set_bit_size(i2s_id, val); switch (params_rate(params)) { case 8000: case 32000: case 44100: case 48000: case 88200: case 96000: val = params_rate(params); break; default: ret = -EINVAL; goto err; } //rate = clk_get_rate(info->i2s_clk); rate = 2822400; /* BCLK = MCLK/4 */ if (info->bit_format == TEGRA_AUDIO_BIT_FORMAT_DSP) rate *= 2; i2s_set_channel_bit_count(i2s_id, val, rate); return 0; err: return ret; }
static int i2s_configure(struct tegra_i2s_info *info ) { struct platform_device *pdev = info->pdev; struct tegra_audio_platform_data *pdata = pdev->dev.platform_data; struct clk *i2s_clk; unsigned int i2s_id = pdev->id; unsigned int rate; i2s_enable_fifos(i2s_id, 0); i2s_fifo_clear(i2s_id, I2S_FIFO_TX); i2s_fifo_clear(i2s_id, I2S_FIFO_RX); i2s_set_left_right_control_polarity(i2s_id, 0); /* default */ i2s_clk = clk_get(&pdev->dev, NULL); if (!i2s_clk) { dev_err(&pdev->dev, "%s: could not get i2s clock\n", __func__); return -EIO; } rate = clk_get_rate(i2s_clk); if (info->bit_format == TEGRA_AUDIO_BIT_FORMAT_DSP) rate *= 2; if (pdata->i2s_master && pdata->i2s_master_clk) i2s_set_channel_bit_count(i2s_id, pdata->i2s_master_clk, rate); i2s_set_master(i2s_id, pdata->i2s_master); i2s_set_fifo_mode(i2s_id, I2S_FIFO_TX, 1); i2s_set_fifo_mode(i2s_id, I2S_FIFO_RX, 0); i2s_set_bit_format(i2s_id, pdata->mode); i2s_set_bit_size(i2s_id, pdata->bit_size); i2s_set_fifo_format(i2s_id, pdata->fifo_fmt); return 0; }
int am_set_stream_format(aud_dev_info* devinfo, am_stream_format_info *format) { int dev_id = devinfo->dev_id; struct am_ch_info *ch = NULL; AM_DEBUG_PRINT("%s++\n", __func__); if (devinfo->dev_type == AUDIO_I2S_DEVICE) { ch = &aud_manager->i2s_ch[dev_id]; i2s_set_bit_size(dev_id, format->bitsize); i2s_set_samplerate(dev_id, format->samplerate); i2s_set_channels(dev_id, format->channels); i2s_set_fifo_attention(dev_id, devinfo->fifo_mode, format->buffersize); } else if (devinfo->dev_type == AUDIO_SPDIF_DEVICE) { ch = &aud_manager->spdif_ch; spdif_set_bit_mode(dev_id, format->bitsize); spdif_set_sample_rate(dev_id, devinfo->fifo_mode, format->samplerate); spdif_set_fifo_attention(dev_id, devinfo->fifo_mode, format->buffersize); } memcpy(&ch->sfmt, format, sizeof(am_stream_format_info)); if (devinfo->dev_type == AUDIO_SPDIF_DEVICE) { ch->sfmt.bitsize = get_spdif_bit_size(format->bitsize); } set_channel_acif(ch, devinfo); AM_DEBUG_PRINT("%s--\n", __func__); return 0; }
int am_set_stream_format(aud_dev_info* devinfo, am_stream_format_info *format) { int dev_id = devinfo->dev_id; if (devinfo->dev_type == AUDIO_I2S_DEVICE) { i2s_set_bit_size(dev_id, format->bitsize); i2s_set_samplerate(dev_id, format->samplerate); i2s_set_channels(dev_id, format->channels); i2s_set_fifo_attention(dev_id, devinfo->fifo_mode, format->buffersize); } else if (devinfo->dev_type == AUDIO_SPDIF_DEVICE) { spdif_set_bit_mode(dev_id, format->bitsize); /* fixme - move to appropriate locn later */ spdif_set_fifo_packed(dev_id, 1); spdif_set_sample_rate(dev_id, devinfo->fifo_mode, format->samplerate); spdif_set_fifo_attention(dev_id, devinfo->fifo_mode, format->buffersize); } return 0; }
static int tegra_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct tegra_i2s_info *info = dai->private_data; unsigned int i2s_id = dai->id; int val; unsigned int rate, sample_size; switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: val = I2S_BIT_SIZE_16; sample_size = 16; break; case SNDRV_PCM_FORMAT_S24_LE: val = I2S_BIT_SIZE_24; sample_size = 24; break; case SNDRV_PCM_FORMAT_S32_LE: val = I2S_BIT_SIZE_32; sample_size = 32; break; default: return -EINVAL; } i2s_set_bit_size(i2s_id, val); switch (params_rate(params)) { case 8000: case 32000: case 44100: case 48000: case 88200: case 96000: val = params_rate(params); break; default: return -EINVAL; } if (info->i2s_master) { /* Min BCLK = samplerate * channel * bits per sample * 2 */ rate = val * params_channels(params) * sample_size * 2; /* For DSP mode we need double BCLK */ if (info->bit_format == TEGRA_AUDIO_BIT_FORMAT_DSP) rate *= 2; /* Ensure I2s clk rate is atleast greater than min BCLK */ clk_set_rate(info->i2s_clk, rate); if (clk_get_rate(info->i2s_clk) < rate) clk_set_rate(info->i2s_clk, rate << 1); rate = clk_get_rate(info->i2s_clk); if (info->bit_format == TEGRA_AUDIO_BIT_FORMAT_DSP) rate *= 2; i2s_set_channel_bit_count(i2s_id, val, rate); } return 0; }