static int wcd9xxx_alloc_slim_sh_ch_rx(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la) { int ret = 0; u8 ch_idx ; u16 slave_port_id = 0; struct wcd9xxx_slim_sch_rx *rx = sh_ch.rx; /* * DSP requires channel number to be between 128 and 255. */ pr_debug("%s: pgd_la[%d]\n", __func__, wcd9xxx_pgd_la); for (ch_idx = 0; ch_idx < SLIM_MAX_RX_PORTS; ch_idx++) { slave_port_id = (ch_idx + 1 + SB_PGD_OFFSET_OF_RX_SLAVE_DEV_PORTS); rx[ch_idx].ch_num = slave_port_id + BASE_CH_NUM; ret = slim_get_slaveport(wcd9xxx_pgd_la, slave_port_id, &rx[ch_idx].sph, SLIM_SINK); if (ret < 0) { pr_err("%s: slave port failure id[%d] ret[%d]\n", __func__, slave_port_id, ret); goto err; } ret = slim_query_ch(wcd9xxx->slim, rx[ch_idx].ch_num, &rx[ch_idx].ch_h); if (ret < 0) { pr_err("%s: slim_query_ch failed ch-num[%d] ret[%d]\n", __func__, rx[ch_idx].ch_num, ret); goto err; } } err: return ret; }
static int wcd9xxx_alloc_slim_sh_ch_tx(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la) { int ret = 0; u8 ch_idx ; struct wcd9xxx_slim_sch_tx *tx = sh_ch.tx; u16 slave_port_id = 0; pr_debug("%s: pgd_la[%d]\n", __func__, wcd9xxx_pgd_la); /* DSP requires channel number to be between 128 and 255. For RX port * use channel numbers from 138 to 144, for TX port * use channel numbers from 128 to 137 */ for (ch_idx = 0; ch_idx < SLIM_MAX_TX_PORTS; ch_idx++) { slave_port_id = ch_idx; tx[ch_idx].ch_num = slave_port_id + BASE_CH_NUM; ret = slim_get_slaveport(wcd9xxx_pgd_la, slave_port_id, &tx[ch_idx].sph, SLIM_SRC); if (ret < 0) { pr_err("%s: slave port failure id[%d] ret[%d]\n", __func__, slave_port_id, ret); goto err; } ret = slim_query_ch(wcd9xxx->slim, tx[ch_idx].ch_num, &tx[ch_idx].ch_h); if (ret < 0) { pr_err("%s: slim_query_ch failed ch-num[%d] ret[%d]\n", __func__, tx[ch_idx].ch_num, ret); goto err; } } err: return ret; }
static void es705_alloc_slim_tx_chan(struct slim_device *sbdev) { struct es705_priv *es705_priv = slim_get_devicedata(sbdev); struct es705_slim_ch *tx = es705_priv->slim_tx; int i; int port_id; for (i = 0; i < ES705_SLIM_TX_PORTS; i++) { port_id = i + 10; /* ES705_SLIM_RX_PORTS; */ tx[i].ch_num = es705_slim_tx_port_to_ch[i]; slim_get_slaveport(sbdev->laddr, port_id, &tx[i].sph, SLIM_SRC); slim_query_ch(sbdev, tx[i].ch_num, &tx[i].ch_h); } }
static void escore_alloc_slim_tx_chan(struct escore_priv *escore_priv) { struct slim_device *sbdev = escore_priv->gen0_client; struct escore_slim_ch *tx = escore_priv->slim_tx; int i; int port_id; dev_dbg(&sbdev->dev, "%s()\n", __func__); for (i = 0; i < escore_priv->slim_tx_ports; i++) { port_id = i + 10; tx[i].ch_num = escore_priv->slim_tx_port_to_ch_map[i]; slim_get_slaveport(sbdev->laddr, port_id, &tx[i].sph, SLIM_SRC); slim_query_ch(sbdev, tx[i].ch_num, &tx[i].ch_h); } }
static int wcd9xxx_alloc_slim_sh_ch(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, u32 cnt, struct wcd9xxx_ch *channels, u32 path) { int ret = 0; u32 ch_idx ; /* The slimbus channel allocation seem take longer time * so do the allocation up front to avoid delay in start of * playback */ pr_debug("%s: pgd_la[%d]\n", __func__, wcd9xxx_pgd_la); for (ch_idx = 0; ch_idx < cnt; ch_idx++) { ret = slim_get_slaveport(wcd9xxx_pgd_la, channels[ch_idx].port, &channels[ch_idx].sph, path); pr_debug("%s: pgd_la[%d] channels[%d].port[%d]\n" "channels[%d].sph[%d] path[%d]\n", __func__, wcd9xxx_pgd_la, ch_idx, channels[ch_idx].port, ch_idx, channels[ch_idx].sph, path); if (ret < 0) { pr_err("%s: slave port failure id[%d] ret[%d]\n", __func__, channels[ch_idx].ch_num, ret); goto err; } ret = slim_query_ch(wcd9xxx->slim, channels[ch_idx].ch_num, &channels[ch_idx].ch_h); if (ret < 0) { pr_err("%s: slim_query_ch failed ch-num[%d] ret[%d]\n", __func__, channels[ch_idx].ch_num, ret); goto err; } } err: return ret; }
static int wcd9xxx_alloc_slim_sh_ch_rx(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la) { int ret = 0; u8 ch_idx ; u16 slave_port_id = 0; struct wcd9xxx_slim_sch_rx *rx = sh_ch.rx; /* * DSP requires channel number to be between 128 and 255. */ pr_debug("%s: pgd_la[%d]\n", __func__, wcd9xxx_pgd_la); for (ch_idx = 0; ch_idx < sh_ch.number_of_rx_slave_dev_ports; ch_idx++) { slave_port_id = (ch_idx + sh_ch.rx_port_start_offset); rx[ch_idx].ch_num = slave_port_id + BASE_CH_NUM; ret = slim_get_slaveport(wcd9xxx_pgd_la, slave_port_id, &rx[ch_idx].sph, SLIM_SINK); if (ret < 0) { pr_err("%s: slave port failure id[%d] ret[%d]\n", __func__, slave_port_id, ret); goto err; } ret = slim_query_ch(wcd9xxx->slim, rx[ch_idx].ch_num, &rx[ch_idx].ch_h); if (ret < 0) { pr_err("%s: slim_query_ch failed ch-num[%d] ret[%d]\n", __func__, rx[ch_idx].ch_num, ret); goto err; } pr_debug("%s:ch_num=%d ch_h=%d sph=%d la=%d slave_port_id %d\n", __func__, rx[ch_idx].ch_num, rx[ch_idx].ch_h, rx[ch_idx].sph, wcd9xxx_pgd_la, slave_port_id); } err: return ret; }
static int msm_dai_slim_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct msm_dai_slim_drv_data *drv_data = dev_get_drvdata(dai->dev); struct msm_slim_dma_data *dma_data; struct msm_slim_dai_data *dai_data = NULL; struct slim_ch prop; int rc; u8 i, j; dai_data = msm_slim_get_dai_data(drv_data, dai); if (!dai_data) { dev_err(dai->dev, "%s: Invalid dai_data for dai %d\n", __func__, dai->id); return -EINVAL; } if (!(dai_data->status & DAI_STATE_INITIALIZED)) { dev_err(dai->dev, "%s: dai id (%d) has invalid state 0x%x\n", __func__, dai->id, dai_data->status); return -EINVAL; } dma_data = &dai_data->dma_data; snd_soc_dai_set_dma_data(dai, substream, dma_data); for (i = 0; i < dai_data->ch_cnt; i++) { rc = slim_query_ch(drv_data->sdev, dai_data->sh_ch[i], &dai_data->chan_h[i]); if (rc) { dev_err(dai->dev, "%s:query chan handle failed rc %d\n", __func__ , rc); goto error_chan_query; } } prop.prot = SLIM_AUTO_ISO; prop.baser = SLIM_RATE_4000HZ; prop.dataf = SLIM_CH_DATAF_NOT_DEFINED; prop.auxf = SLIM_CH_AUXF_NOT_APPLICABLE; prop.ratem = (dai_data->rate/4000); prop.sampleszbits = dai_data->bits; rc = slim_define_ch(drv_data->sdev, &prop, dai_data->chan_h, dai_data->ch_cnt, true, &dai_data->grph); if (rc) { dev_err(dai->dev, "%s:define chan failed rc %d\n", __func__ , rc); goto error_define_chan; } /* Mark stream status as prepared */ SET_DAI_STATE(dai_data->status, DAI_STATE_PREPARED); return rc; error_define_chan: error_chan_query: for (j = 0; j < i; j++) slim_dealloc_ch(drv_data->sdev, dai_data->chan_h[j]); return rc; }