Example #1
0
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;
}
Example #2
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;
}
Example #3
0
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;
}
Example #6
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;
}