static int config(struct pcm *pcm)
{

	int ret = 0, i;
	struct audio_buffer *buf;

	pr_debug("%s\n", __func__);

	ret = q6asm_audio_client_buf_alloc_contiguous(OUT,
			pcm->ac,
			pcm->buffer_size,
			pcm->buffer_count);
	if (ret < 0) {
		pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret);
		return -ENOMEM;
	}
	buf = pcm->ac->port[OUT].buf;

	if (buf == NULL || buf[0].data == NULL)
		return -ENOMEM;

	memset(buf[0].data, 0, pcm->buffer_size * pcm->buffer_count);
	pcm->dma_addr = (u32) buf[0].phys;
	pcm->dma_virt = (u32) buf[0].data;

	for (i = 0; i < pcm->buffer_count; i++) {
		pcm->dma_buf[i].addr = (u32) (buf[i].phys);
		pcm->dma_buf[i].v_addr = (u32) (buf[i].data);
		pcm->dma_buf[i].used = 0;
	}

	ret = afe_register_get_events(RT_PROXY_DAI_001_TX,
			pcm_afe_callback, pcm);
	if (ret < 0) {
		pr_err("afe-pcm:register for events failed\n");
		return ret;
	}
	ret = afe_cmd_memory_map(pcm->dma_addr,
			pcm->buffer_size * pcm->buffer_count);
	if (ret < 0) {
		pr_err("fail to map memory to DSP\n");
		return ret;
	}

	pr_debug("%s:success\n", __func__);
	return ret;
}
static int msm_afe_capture_prepare(struct snd_pcm_substream *substream)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct pcm_afe_info *prtd = runtime->private_data;
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_dai *dai = rtd->cpu_dai;
	int ret = 0;

	pr_debug("%s\n", __func__);

	pr_debug("%s: dai->id =%x\n", __func__, dai->id);
	ret = afe_register_get_events(dai->id,
			pcm_afe_process_rx_pkt, prtd);
	if (ret < 0) {
		pr_err("afe-pcm:register for events failed\n");
		return ret;
	}
	pr_debug("%s:success\n", __func__);
	prtd->prepared++;
	return 0;
}