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