lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20180326155828.ttnduivadob4iqmd@earth.universe>
Date:   Mon, 26 Mar 2018 17:58:28 +0200
From:   Sebastian Reichel <sebastian.reichel@...labora.co.uk>
To:     Pavel Machek <pavel@....cz>
Cc:     Liam Girdwood <lgirdwood@...il.com>,
        Mark Brown <broonie@...nel.org>,
        Rob Herring <robh+dt@...nel.org>,
        Tony Lindgren <tony@...mide.com>,
        Lee Jones <lee.jones@...aro.org>,
        Jaroslav Kysela <perex@...ex.cz>,
        Takashi Iwai <tiwai@...e.com>, alsa-devel@...a-project.org,
        linux-omap@...r.kernel.org, devicetree@...r.kernel.org,
        linux-kernel@...r.kernel.org, kernel@...labora.com
Subject: Re: omap4-droid4: voice call support was Re: [PATCHv5,5/5] ARM: dts:
 omap4-droid4: add soundcard

Hi,

On Mon, Mar 26, 2018 at 04:16:38PM +0200, Pavel Machek wrote:
> Do you have any ideas what needs to be done for voice calls
> support?

Sure.

> I can talk to the modem and start a call.

Doing an AT query is the easy part :)

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

I intentionally left this part out. The CPCAP codec has two DAIs
and not 3+. The code you just added is a hack from Motorola. Their
driver is full of hacks and it's obvious its author(s) did not
fully understand the ASoC APIs.

My understanding is, that we only need to replace the audio-graph-card
driver to something more complex. The VOICE DAI needs to be configured
differently based on the use case:

call:
	* mode=i2s
	* freq=26000000
	* samprate=16000 or samprate=8000

bt voice:
	* mode="4 timeslots network"
	* freq=26000000
	* samprate=8000
	* CPCAP_BIT_MIC2_TIMESLOT1

bt call:
	* mode="4 timeslots network"
	* freq=19200000
	* samprate=8000
	* CPCAP_BIT_MIC2_TIMESLOT1

"audio-graph-card" is not capable of doing this. I was planning to
try "audio-graph-scu-card" in combination with adding codecs for the
modem and BT to DT. If that does not work we need a Droid 4 specific
soundcard driver.

Either way "audio-graph-card" is not the correct driver for D4. I
added it nevertheless, since it gets audio working for now and there
is no risk of DT breakage. Old *.dtb will continue to work with the
"audio-graph-card" even after we switch to something else.

-- Sebastian

> 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



Download attachment "signature.asc" of type "application/pgp-signature" (834 bytes)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ