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; }
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; }