static int sdp4430_modem_mcbsp_configure(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, int flag) { int ret = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_substream *modem_substream[2]; struct snd_soc_pcm_runtime *modem_rtd; int channels; if (flag) { modem_substream[substream->stream] = snd_soc_get_dai_substream(rtd->card, OMAP_ABE_BE_MM_EXT1, substream->stream); if (unlikely(modem_substream[substream->stream] == NULL)) return -ENODEV; modem_rtd = modem_substream[substream->stream]->private_data; if (!mcbsp_cfg) { /* Set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(modem_rtd->cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); if (unlikely(ret < 0)) { printk(KERN_ERR "can't set Modem cpu DAI configuration\n"); goto exit; } else { mcbsp_cfg = 1; } } if (params != NULL) { /* Configure McBSP internal buffer usage */ /* this need to be done for playback and/or record */ channels = params_channels(params); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) omap_mcbsp_set_rx_threshold( modem_rtd->cpu_dai->id, channels); else omap_mcbsp_set_tx_threshold( modem_rtd->cpu_dai->id, channels); } } else { mcbsp_cfg = 0; } exit: return ret; }
static int sdp4430_mcpdm_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_pcm_runtime *modem_rtd; struct snd_pcm_substream *modem_substream[2]; int clk_id, freq; int ret = 0, fe_id; fe_id = rtd->current_fe; if (twl6040_power_mode) { clk_id = TWL6040_SYSCLK_SEL_HPPLL; freq = 38400000; } else { clk_id = TWL6040_SYSCLK_SEL_LPPLL; freq = 32768; } /* set the codec mclk */ ret = snd_soc_dai_set_sysclk(codec_dai, clk_id, freq, SND_SOC_CLOCK_IN); if (ret) { printk(KERN_ERR "can't set codec system clock\n"); return ret; } if (fe_id == ABE_FRONTEND_DAI_MODEM) { if (!mcbsp_cfg) { modem_substream[substream->stream] = snd_soc_get_dai_substream(rtd->card, OMAP_ABE_BE_MM_EXT1, substream->stream); if (modem_substream[substream->stream] == NULL) return -ENODEV; modem_rtd = modem_substream[substream->stream]->private_data; /* Set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(modem_rtd->cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); mcbsp_cfg = 1; } if (ret < 0) { printk(KERN_ERR "can't set Modem cpu DAI configuration\n"); return ret; } } return ret; }
static int omap_abe_modem_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_card *card = rtd->card; struct omap_abe_data *card_data = snd_soc_card_get_drvdata(card); struct snd_pcm_substream *modem_substream[2]; struct snd_soc_pcm_runtime *modem_rtd; int channels, ret = 0, stream = substream->stream; modem_substream[stream] = snd_soc_get_dai_substream(card, OMAP_ABE_BE_MM_EXT1, stream); if (modem_substream[stream] == NULL) return -ENODEV; modem_rtd = modem_substream[stream]->private_data; if (!card_data->mcbsp_cfg) { /* Set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(modem_rtd->cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); if (ret < 0) { dev_err(card->dev, "can't set Modem cpu DAI configuration\n"); return ret; } else card_data->mcbsp_cfg = 1; } if (params != NULL) { struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata( modem_rtd->cpu_dai); /* Configure McBSP internal buffer usage */ /* this need to be done for playback and/or record */ channels = params_channels(params); if (stream == SNDRV_PCM_STREAM_PLAYBACK) omap_mcbsp_set_rx_threshold(mcbsp, channels); else omap_mcbsp_set_tx_threshold(mcbsp, channels); } return ret; }
static int sdp4430_modem_mcbsp_configure(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, int flag) { int ret = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_pcm_substream *modem_substream[2]; struct snd_soc_pcm_runtime *modem_rtd; int channels; if (flag) { modem_substream[substream->stream] = snd_soc_get_dai_substream(rtd->card, OMAP_ABE_BE_MM_EXT1, substream->stream); if (unlikely(modem_substream[substream->stream] == NULL)) return -ENODEV; modem_rtd = modem_substream[substream->stream]->private_data; if (!mcbsp_cfg) { if (omap4_tuna_get_type() == TUNA_TYPE_TORO) { /* Set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(modem_rtd->cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); if (unlikely(ret < 0)) { printk(KERN_ERR "can't set Modem cpu DAI format\n"); goto exit; } /* McBSP2 fclk reparented to ABE_24M_FCLK */ ret = snd_soc_dai_set_sysclk(modem_rtd->cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_FCLK, 32 * 96 * params_rate(params), SND_SOC_CLOCK_IN); if (unlikely(ret < 0)) { printk(KERN_ERR "can't set Modem cpu DAI sysclk\n"); goto exit; } /* assuming McBSP2 is S16_LE stereo */ ret = snd_soc_dai_set_clkdiv(modem_rtd->cpu_dai, 0, 96); if (unlikely(ret < 0)) { printk(KERN_ERR "can't set Modem cpu DAI clkdiv\n"); goto exit; } } else { /* Set cpu DAI configuration */ ret = snd_soc_dai_set_fmt(modem_rtd->cpu_dai, SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM); if (unlikely(ret < 0)) { printk(KERN_ERR "can't set Modem cpu DAI configuration\n"); goto exit; } } mcbsp_cfg = 1; } if (params != NULL) { /* Configure McBSP internal buffer usage */ /* this need to be done for playback and/or record */ channels = params_channels(params); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) omap_mcbsp_set_rx_threshold( modem_rtd->cpu_dai->id, channels); else omap_mcbsp_set_tx_threshold( modem_rtd->cpu_dai->id, channels); } } else { mcbsp_cfg = 0; } exit: return ret; }