Hi!

Do you have any ideas what needs to be done for voice calls support? I
can talk to the modem and start a call.

Then something like this (untested!) is certainly needed. Probably
more...

Thanks,
                                                                        Pavel

diff --git a/sound/soc/codecs/cpcap.c b/sound/soc/codecs/cpcap.c
index aedb267..7646f68 100644
--- a/sound/soc/codecs/cpcap.c
+++ b/sound/soc/codecs/cpcap.c
@@ -1280,6 +1280,60 @@ static int cpcap_voice_hw_params(struct 
snd_pcm_substream *substream,
        return 0;
 }
 
+static int cpcap_incall_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 device *dev = codec->dev;
+       struct cpcap_audio *cpcap = snd_soc_codec_get_drvdata(codec);
+       static const u16 reg_cdi = CPCAP_REG_CDI;
+       int rate = params_rate(params);
+       int channels = params_channels(params);
+       int direction = substream->stream;
+       u16 val, mask;
+       int err;
+
+       dev_dbg(dev, "Incall setup HW params: rate=%d, direction=%d, chan=%d",
+               rate, direction, channels);
+
+       /* codec, 1 in original code is CPCAP_REG_CC
+          codec, 2 is CPCAP_REG_CDI
+          codec, 5 is CPCAP_REG_TXI */
+
+       if (/* cpcap->codec_strm_cnt == */ 1) {
+               /*
+               if (pdata->voice_type != VOICE_TYPE_QC)
+                       printk("FIXME: Only MDM6600 support is implemented 
here.\n");
+               */
+
+               err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CDI, 0xffff, 
0xAE02);
+               if (err) printk("cpcap error %d\n", __LINE__);
+
+               err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CC, 0xffff, 
0x6120);
+               if (err) printk("cpcap error %d\n", __LINE__);
+
+               err = cpcap_set_samprate(cpcap, CPCAP_DAI_VOICE, rate);
+               printk("Configured stream\n");
+       }
+
+       /* (direction == SNDRV_PCM_STREAM_CAPTURE) ?? */
+       if (substream->stream) { /* up link */
+               unsigned int set =  CPCAP_BIT_AUDIHPF_1 | CPCAP_BIT_AUDIHPF_0;
+               err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CC, set, set);
+               if (err) printk("cpcap error %d\n", __LINE__);
+
+               set = CPCAP_BIT_MB_ON1L | CPCAP_BIT_MB_ON1R;
+               err = regmap_update_bits(cpcap->regmap, CPCAP_REG_TXI, set, 
set);
+       } else { /* down link */
+               unsigned int set =  CPCAP_BIT_AUDOHPF_1 | CPCAP_BIT_AUDOHPF_0;
+               err = regmap_update_bits(cpcap->regmap, CPCAP_REG_CC, set, set);
+               if (err) printk("cpcap error %d\n", __LINE__);
+       }
+
+       return err;
+}
+
 static int cpcap_voice_set_dai_sysclk(struct snd_soc_dai *codec_dai, int 
clk_id,
                                      unsigned int freq, int dir)
 {
@@ -1394,6 +1448,14 @@ static const struct snd_soc_dai_ops cpcap_dai_voice_ops 
= {
        .digital_mute   = cpcap_voice_set_mute,
 };
 
+static const struct snd_soc_dai_ops cpcap_dai_incall_ops = {
+       /* FIXME */
+       .hw_params      = cpcap_incall_hw_params,
+       .set_sysclk     = cpcap_voice_set_dai_sysclk,
+       .set_fmt        = cpcap_voice_set_dai_fmt,
+       .digital_mute   = cpcap_voice_set_mute,
+};
+
 static struct snd_soc_dai_driver cpcap_dai[] = {
 {
        .id = 0,
@@ -1426,6 +1488,26 @@ static struct snd_soc_dai_driver cpcap_dai[] = {
        },
        .ops = &cpcap_dai_voice_ops,
 },
+{
+       .id = 2,
+       .name = "cpcap in-call",
+       .playback = {
+               .stream_name = "InCall DL",
+               .channels_min = 1,
+               .channels_max = 2,
+               .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+       },
+       .capture = {
+               .stream_name = "Capture",
+               .channels_min = 1,
+               .channels_max = 2,
+               .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000,
+               .formats = SNDRV_PCM_FMTBIT_S16_LE,
+       },
+       .ops = &cpcap_dai_incall_ops,
+},
+/* FIXME: this misses bt-call, cpcap bt, BPvoice, FM */
 };
 
 static int cpcap_dai_mux(struct cpcap_audio *cpcap, bool 
swap_dai_configuration)






-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

Attachment: signature.asc
Description: Digital signature

Reply via email to