int es705_remote_close_slim_tx(int dai_id)
{
	struct es705_priv *es705 = &es705_priv;
	struct slim_device *sbdev = es705->gen0_client;
	int be_id;
	int ch_cnt;
	int rc = 0;

	dev_info(&sbdev->dev, "%s(): dai_id = %d\n", __func__, dai_id);

	if (dai_id != ES705_SLIM_1_CAP)
		return rc;

	if (es705->dai[DAI_INDEX(dai_id)].ch_tot != 0) {
		dev_info(&sbdev->dev, "%s(): dai_id = %d, ch_tot = %d\n",
				__func__, dai_id,
				es705->dai[DAI_INDEX(dai_id)].ch_tot);
#if defined(SAMSUNG_ES705_FEATURE)
		if (dai_id == ES705_SLIM_1_CAP)
#endif
			ch_cnt = es705->ap_tx1_ch_cnt;
		es705_close_slim_tx(es705->gen0_client,
				    es705->dai[DAI_INDEX(dai_id)].ch_num,
				    ch_cnt);
		be_id = es705_slim_be_id[DAI_INDEX(dai_id)];
		rc = es705_codec_close_slim_rx(es705, be_id);
		es705->dai[DAI_INDEX(dai_id)].ch_tot = 0;
	}

	return rc;
}
Esempio n. 2
0
int escore_remote_close_slim_tx(int dai_id)
{
	struct escore_priv *escore = &escore_priv;
	int be_id;
	int ch_cnt;
	int rc = 0;

	if (escore_priv.flag.local_slim_ch_cfg)
		return rc;

	dev_dbg(escore->dev, "%s(dai_id = %d)\n", __func__, dai_id);

	if (escore->slim_dai_data &&
		escore->slim_dai_data[DAI_INDEX(dai_id)].ch_tot != 0) {
		ch_cnt = escore->ap_tx1_ch_cnt;
		escore_close_slim_tx(escore->gen0_client,
			    escore->slim_dai_data[DAI_INDEX(dai_id)].ch_num,
			    ch_cnt);

		be_id = escore->slim_be_id[DAI_INDEX(dai_id)];
		rc = escore_codec_close_slim_rx(escore, be_id);

		escore->slim_dai_data[DAI_INDEX(dai_id)].ch_tot = 0;
	}

	return rc;
}
int es705_remote_cfg_slim_rx(int dai_id)
{
	struct es705_priv *es705 = &es705_priv;
	struct slim_device *sbdev = es705->gen0_client;
	int be_id;
	int rc = 0;

	dev_info(&sbdev->dev, "%s(): dai_id = %d\n", __func__, dai_id);

	if (dai_id != ES705_SLIM_1_PB
	    && dai_id != ES705_SLIM_2_PB)
		return rc;

	if (es705->dai[DAI_INDEX(dai_id)].ch_tot != 0) {
		/* start slim channels associated with id */
		rc = es705_cfg_slim_rx(sbdev,
				       es705->dai[DAI_INDEX(dai_id)].ch_num,
				       es705->dai[DAI_INDEX(dai_id)].ch_tot,
				       es705->dai[DAI_INDEX(dai_id)].rate);

		be_id = es705_slim_be_id[DAI_INDEX(dai_id)];
		es705->dai[DAI_INDEX(be_id)].ch_tot = es705->dai[DAI_INDEX(dai_id)].ch_tot;
		es705->dai[DAI_INDEX(be_id)].rate = es705->dai[DAI_INDEX(dai_id)].rate;
		rc = es705_codec_cfg_slim_tx(es705, be_id);
	}

	return rc;
}
Esempio n. 4
0
int escore_remote_cfg_slim_rx(int dai_id)
{
	struct escore_priv *escore = &escore_priv;
	int be_id;
	int rc = 0;

	if (escore_priv.flag.local_slim_ch_cfg)
		return rc;

	dev_dbg(escore->dev, "%s(dai_id = %d)\n", __func__, dai_id);

	if (escore->slim_dai_data &&
		escore->slim_dai_data[DAI_INDEX(dai_id)].ch_tot != 0) {
		/* start slim channels associated with id */
		rc = escore_cfg_slim_rx(escore->gen0_client,
			       escore->slim_dai_data[DAI_INDEX(dai_id)].ch_num,
			       escore->slim_dai_data[DAI_INDEX(dai_id)].ch_tot,
			       escore->slim_dai_data[DAI_INDEX(dai_id)].rate);

		be_id = escore->slim_be_id[DAI_INDEX(dai_id)];
		escore->slim_dai_data[DAI_INDEX(be_id)].ch_tot =
			escore->slim_dai_data[DAI_INDEX(dai_id)].ch_tot;
		escore->slim_dai_data[DAI_INDEX(be_id)].rate =
			escore->slim_dai_data[DAI_INDEX(dai_id)].rate;

		rc = escore_codec_cfg_slim_tx(escore, be_id);
	}

	return rc;
}
Esempio n. 5
0
int escore_slim_hw_params(struct snd_pcm_substream *substream,
			 struct snd_pcm_hw_params *params,
			 struct snd_soc_dai *dai)
{
	struct snd_soc_codec *codec = dai->codec;
	struct escore_priv *escore = &escore_priv;
	int id = dai->id;
	int channels;
	int rate;
	int rc = 0;

	dev_dbg(codec->dev, "%s() dai->name = %s, dai->id = %d\n", __func__,
			dai->name, dai->id);

	channels = params_channels(params);
	switch (channels) {
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
	case 6:
		escore->slim_dai_data[DAI_INDEX(id)].ch_tot = channels;
		break;
	default:
		dev_err(codec->dev,
			"%s(): unsupported number of channels, %d\n",
			__func__, channels);
		return -EINVAL;
	}
	rate = params_rate(params);
	switch (rate) {
	case 8000:
	case 16000:
	case 24000:
	case 32000:
	case 48000:
		escore->slim_dai_data[DAI_INDEX(id)].rate = rate;
		break;
	default:
		dev_err(codec->dev,
			"%s(): unsupported rate, %d\n",
			__func__, rate);
		return -EINVAL;
	}

	if (escore_priv.slim_dai_ops.hw_params)
		rc = escore_priv.slim_dai_ops.hw_params(substream, params,
				dai);

	return rc;
}
/* es705 <- codec - alsa capture function */
static int es705_codec_close_slim_rx(struct es705_priv *es705, int dai_id)
{
	struct slim_device *sbdev = es705->gen0_client;
	int rc;

	dev_dbg(&sbdev->dev, "%s(): dai_id = %d\n", __func__, dai_id);
	/* close slim channels associated with id */
	rc = es705_close_slim_rx(es705->gen0_client,
				 es705->dai[DAI_INDEX(dai_id)].ch_num,
				 es705->dai[DAI_INDEX(dai_id)].ch_tot);

	return rc;
}
Esempio n. 7
0
/* esxxx <- codec - alsa capture function */
static int escore_codec_cfg_slim_rx(struct escore_priv *escore, int dai_id)
{
	struct slim_device *sbdev = escore->gen0_client;
	int rc;

	dev_dbg(&sbdev->dev, "%s(dai_id = %d)\n", __func__, dai_id);
	/* start slim channels associated with id */
	rc = escore_cfg_slim_rx(escore->gen0_client,
			       escore->slim_dai_data[DAI_INDEX(dai_id)].ch_num,
			       escore->slim_dai_data[DAI_INDEX(dai_id)].ch_tot,
			       escore->slim_dai_data[DAI_INDEX(dai_id)].rate);

	return rc;
}
int es705_slim_hw_params(struct snd_pcm_substream *substream,
			 struct snd_pcm_hw_params *params,
			 struct snd_soc_dai *dai)
{
	struct snd_soc_codec *codec = dai->codec;
	/* local codec access */
	/* struct es705_priv *es705 = snd_soc_codec_get_drvdata(codec); */
	/* remote codec access */
	struct es705_priv *es705 = &es705_priv;
	int id = dai->id;
	int channels;
	int rate;
	int rc = 0;

	dev_dbg(codec->dev, "%s(): dai->name = %s, dai->id = %d\n",
		__func__, dai->name, dai->id);

	channels = params_channels(params);
	switch (channels) {
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
	case 6:
		es705->dai[DAI_INDEX(id)].ch_tot = channels;
		break;
	default:
		dev_err(codec->dev, "%s(): unsupported number of channels, %d\n",
			__func__, channels);
		return -EINVAL;
	}
	rate = params_rate(params);
	switch (rate) {
	case 8000:
	case 16000:
	case 32000:
	case 48000:
		es705->dai[DAI_INDEX(id)].rate = rate;
		break;
	default:
		dev_err(codec->dev, "%s(): unsupported rate, %d\n",
			__func__, rate);
		return -EINVAL;
	}

	return rc;
}
int es705_slim_set_channel_map(struct snd_soc_dai *dai,
			       unsigned int tx_num, unsigned int *tx_slot,
			       unsigned int rx_num, unsigned int *rx_slot)
{
	struct snd_soc_codec *codec = dai->codec;
	/* local codec access */
	/* struct es705_priv *es705 = snd_soc_codec_get_drvdata(codec); */
	/* remote codec access */
	struct es705_priv *es705 = &es705_priv;
	int id = dai->id;
	int i;
	int rc = 0;

	dev_dbg(codec->dev, "%s(): dai->name = %s, dai->id = %d\n",
		__func__, dai->name, dai->id);

	if (id == ES705_SLIM_1_PB ||
	    id == ES705_SLIM_2_PB ||
	    id == ES705_SLIM_3_PB) {
		es705->dai[DAI_INDEX(id)].ch_tot = rx_num;
		es705->dai[DAI_INDEX(id)].ch_act = 0;
		for (i = 0; i < rx_num; i++)
			es705->dai[DAI_INDEX(id)].ch_num[i] = rx_slot[i];
	} else if (id == ES705_SLIM_1_CAP ||
		 id == ES705_SLIM_2_CAP ||
		 id == ES705_SLIM_3_CAP) {
		es705->dai[DAI_INDEX(id)].ch_tot = tx_num;
		es705->dai[DAI_INDEX(id)].ch_act = 0;
		for (i = 0; i < tx_num; i++) {
			es705->dai[DAI_INDEX(id)].ch_num[i] = tx_slot[i];
		}
	}

	return rc;
}
int es705_remote_close_slim_rx(int dai_id)
{
	struct es705_priv *es705 = &es705_priv;
	struct slim_device *sbdev = es705->gen0_client;
	int be_id;
	int rc = 0;

	dev_info(&sbdev->dev, "%s(): dai_id = %d\n", __func__, dai_id);

	if (dai_id != ES705_SLIM_1_PB
	    && dai_id != ES705_SLIM_2_PB)
		return rc;

	if (es705->dai[DAI_INDEX(dai_id)].ch_tot != 0) {
		dev_info(&sbdev->dev, "%s(): dai_id = %d, ch_tot =%d\n",
				__func__, dai_id,
				es705->dai[DAI_INDEX(dai_id)].ch_tot);

		es705_close_slim_rx(es705->gen0_client,
				    es705->dai[DAI_INDEX(dai_id)].ch_num,
				    es705->dai[DAI_INDEX(dai_id)].ch_tot);

		be_id = es705_slim_be_id[DAI_INDEX(dai_id)];
		rc = es705_codec_close_slim_tx(es705, be_id);

		es705->dai[DAI_INDEX(dai_id)].ch_tot = 0;
	}

	return rc;
}
int es705_slim_get_channel_map(struct snd_soc_dai *dai,
			       unsigned int *tx_num, unsigned int *tx_slot,
			       unsigned int *rx_num, unsigned int *rx_slot)
{
	struct snd_soc_codec *codec = dai->codec;
	/* local codec access */
	/* struct es705_priv *es705 = snd_soc_codec_get_drvdata(codec); */
	/* remote codec access */
	struct es705_priv *es705 = &es705_priv;
	struct es705_slim_ch *rx = es705->slim_rx;
	struct es705_slim_ch *tx = es705->slim_tx;
	int id = dai->id;
	int i;
	int rc = 0;

	dev_dbg(codec->dev, "%s(): dai->name = %s, dai->id = %d\n", __func__,
		dai->name, dai->id);

	if (id == ES705_SLIM_1_PB) {
		*rx_num = es705_dai[DAI_INDEX(id)].playback.channels_max;
		for (i = 0; i < *rx_num; i++) {
			rx_slot[i] = rx[ES705_SLIM_1_PB_OFFSET + i].ch_num;
		}
	} else if (id == ES705_SLIM_2_PB) {
		*rx_num = es705_dai[DAI_INDEX(id)].playback.channels_max;
		for (i = 0; i < *rx_num; i++) {
			rx_slot[i] = rx[ES705_SLIM_2_PB_OFFSET + i].ch_num;
		}
	} else if (id == ES705_SLIM_3_PB) {
		*rx_num = es705_dai[DAI_INDEX(id)].playback.channels_max;
		for (i = 0; i < *rx_num; i++) {
			rx_slot[i] = rx[ES705_SLIM_3_PB_OFFSET + i].ch_num;
		}
	} else if (id == ES705_SLIM_1_CAP) {
		*tx_num = es705_dai[DAI_INDEX(id)].capture.channels_max;
		for (i = 0; i < *tx_num; i++) {
			tx_slot[i] = tx[ES705_SLIM_1_CAP_OFFSET + i].ch_num;
		}
	} else if (id == ES705_SLIM_2_CAP) {
		*tx_num = es705_dai[DAI_INDEX(id)].capture.channels_max;
		for (i = 0; i < *tx_num; i++) {
			tx_slot[i] = tx[ES705_SLIM_2_CAP_OFFSET + i].ch_num;
		}
	} else if (id == ES705_SLIM_3_CAP) {
		*tx_num = es705_dai[DAI_INDEX(id)].capture.channels_max;
		for (i = 0; i < *tx_num; i++) {
			tx_slot[i] = tx[ES705_SLIM_3_CAP_OFFSET + i].ch_num;
		}
	}

	return rc;
}
void es705_slim_map_channels(struct es705_priv *es705)
{
	/* front end for RX1 */
	es705->dai[DAI_INDEX(ES705_SLIM_1_PB)].ch_num[0] = 152;
	es705->dai[DAI_INDEX(ES705_SLIM_1_PB)].ch_num[1] = 153;
	/* back end for RX1 */

#if defined(SLIMBUS_VER_2)
	es705->dai[DAI_INDEX(ES705_SLIM_2_CAP)].ch_num[0] = 144;
	es705->dai[DAI_INDEX(ES705_SLIM_2_CAP)].ch_num[1] = 145;
#else
	es705->dai[DAI_INDEX(ES705_SLIM_2_CAP)].ch_num[0] = 138;
	es705->dai[DAI_INDEX(ES705_SLIM_2_CAP)].ch_num[1] = 139;
#endif
	/* front end for TX1 */
	es705->dai[DAI_INDEX(ES705_SLIM_1_CAP)].ch_num[0] = 156;
	es705->dai[DAI_INDEX(ES705_SLIM_1_CAP)].ch_num[1] = 157;
	/* back end for TX1 */
	es705->dai[DAI_INDEX(ES705_SLIM_3_PB)].ch_num[0] = 134;
	es705->dai[DAI_INDEX(ES705_SLIM_3_PB)].ch_num[1] = 135;
	es705->dai[DAI_INDEX(ES705_SLIM_3_PB)].ch_num[2] = 136;
	es705->dai[DAI_INDEX(ES705_SLIM_3_PB)].ch_num[3] = 137;

	/* front end for RX2 */
	es705->dai[DAI_INDEX(ES705_SLIM_2_PB)].ch_num[0] = 154;
	es705->dai[DAI_INDEX(ES705_SLIM_2_PB)].ch_num[1] = 155;
	/* back end for RX2 */

#if defined(SLIMBUS_VER_2)
	es705->dai[DAI_INDEX(ES705_SLIM_3_CAP)].ch_num[0] = 144;
	es705->dai[DAI_INDEX(ES705_SLIM_3_CAP)].ch_num[1] = 145;
#else
	es705->dai[DAI_INDEX(ES705_SLIM_3_CAP)].ch_num[0] = 143;
	es705->dai[DAI_INDEX(ES705_SLIM_3_CAP)].ch_num[1] = 144;
#endif
}