Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 9c5e920e authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'asoc/topic/bcm2835', 'asoc/topic/codecs',...

Merge remote-tracking branches 'asoc/topic/bcm2835', 'asoc/topic/codecs', 'asoc/topic/compress' and 'asoc/topic/cq93vc' into asoc-next
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -7,10 +7,12 @@ Required properties:

Optional properties:
	- dmicen-gpios: GPIO specifier for dmic to control start and stop
	- num-channels: Number of microphones on this DAI

Example node:

	dmic_codec: dmic@0 {
		compatible = "dmic-codec";
		dmicen-gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>;
		num-channels = <1>;
	};
+14 −6
Original line number Diff line number Diff line
@@ -130,6 +130,7 @@ struct bcm2835_i2s_dev {
	struct regmap				*i2s_regmap;
	struct clk				*clk;
	bool					clk_prepared;
	int					clk_rate;
};

static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev)
@@ -419,10 +420,19 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream,
	}

	/* Clock should only be set up here if CPU is clock master */
	if (bit_clock_master) {
	if (bit_clock_master &&
	    (!dev->clk_prepared || dev->clk_rate != bclk_rate)) {
		if (dev->clk_prepared)
			bcm2835_i2s_stop_clock(dev);

		if (dev->clk_rate != bclk_rate) {
			ret = clk_set_rate(dev->clk, bclk_rate);
			if (ret)
				return ret;
			dev->clk_rate = bclk_rate;
		}

		bcm2835_i2s_start_clock(dev);
	}

	/* Setup the frame format */
@@ -618,8 +628,6 @@ static int bcm2835_i2s_prepare(struct snd_pcm_substream *substream,
	struct bcm2835_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
	uint32_t cs_reg;

	bcm2835_i2s_start_clock(dev);

	/*
	 * Clear both FIFOs if the one that should be started
	 * is not empty at the moment. This should only happen
+6 −4
Original line number Diff line number Diff line
@@ -121,17 +121,19 @@ static struct snd_soc_dai_driver cq93vc_dai = {
	.ops = &cq93vc_dai_ops,
};

static struct regmap *cq93vc_get_regmap(struct device *dev)
static int cq93vc_probe(struct snd_soc_component *component)
{
	struct davinci_vc *davinci_vc = dev->platform_data;
	struct davinci_vc *davinci_vc = component->dev->platform_data;

	return davinci_vc->regmap;
	snd_soc_component_init_regmap(component, davinci_vc->regmap);

	return 0;
}

static const struct snd_soc_codec_driver soc_codec_dev_cq93vc = {
	.set_bias_level = cq93vc_set_bias_level,
	.get_regmap = cq93vc_get_regmap,
	.component_driver = {
		.probe = cq93vc_probe,
		.controls = cq93vc_snd_controls,
		.num_controls = ARRAY_SIZE(cq93vc_snd_controls),
	},
+23 −1
Original line number Diff line number Diff line
@@ -107,8 +107,30 @@ static const struct snd_soc_codec_driver soc_dmic = {

static int dmic_dev_probe(struct platform_device *pdev)
{
	int err;
	u32 chans;
	struct snd_soc_dai_driver *dai_drv = &dmic_dai;

	if (pdev->dev.of_node) {
		err = of_property_read_u32(pdev->dev.of_node, "num-channels", &chans);
		if (err && (err != -ENOENT))
			return err;

		if (!err) {
			if (chans < 1 || chans > 8)
				return -EINVAL;

			dai_drv = devm_kzalloc(&pdev->dev, sizeof(*dai_drv), GFP_KERNEL);
			if (!dai_drv)
				return -ENOMEM;

			memcpy(dai_drv, &dmic_dai, sizeof(*dai_drv));
			dai_drv->capture.channels_max = chans;
		}
	}

	return snd_soc_register_codec(&pdev->dev,
			&soc_dmic, &dmic_dai, 1);
			&soc_dmic, dai_drv, 1);
}

static int dmic_dev_remove(struct platform_device *pdev)
+42 −31
Original line number Diff line number Diff line
@@ -40,7 +40,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
	if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
		ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
		if (ret < 0) {
			dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
			dev_err(cpu_dai->dev,
				"Compress ASoC: can't open interface %s: %d\n",
				cpu_dai->name, ret);
			goto out;
		}
@@ -49,8 +50,9 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
	if (platform && platform->driver->compr_ops && platform->driver->compr_ops->open) {
		ret = platform->driver->compr_ops->open(cstream);
		if (ret < 0) {
			pr_err("compress asoc: can't open platform %s\n",
				platform->component.name);
			dev_err(platform->dev,
				"Compress ASoC: can't open platform %s: %d\n",
				platform->component.name, ret);
			goto plat_err;
		}
	}
@@ -68,8 +70,9 @@ static int soc_compr_open(struct snd_compr_stream *cstream)

		__ret = component->driver->compr_ops->open(cstream);
		if (__ret < 0) {
			pr_err("compress asoc: can't open platform %s\n",
			       component->name);
			dev_err(component->dev,
				"Compress ASoC: can't open platform %s: %d\n",
				component->name, __ret);
			ret = __ret;
		}
	}
@@ -79,7 +82,9 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
	if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->startup) {
		ret = rtd->dai_link->compr_ops->startup(cstream);
		if (ret < 0) {
			pr_err("compress asoc: %s startup failed\n", rtd->dai_link->name);
			dev_err(rtd->dev,
				"Compress ASoC: %s startup failed: %d\n",
				rtd->dai_link->name, ret);
			goto machine_err;
		}
	}
@@ -139,18 +144,19 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
	if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
		ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
		if (ret < 0) {
			dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
			dev_err(cpu_dai->dev,
				"Compress ASoC: can't open interface %s: %d\n",
				cpu_dai->name, ret);
			goto out;
		}
	}


	if (platform && platform->driver->compr_ops && platform->driver->compr_ops->open) {
		ret = platform->driver->compr_ops->open(cstream);
		if (ret < 0) {
			pr_err("compress asoc: can't open platform %s\n",
				platform->component.name);
			dev_err(platform->dev,
				"Compress ASoC: can't open platform %s: %d\n",
				platform->component.name, ret);
			goto plat_err;
		}
	}
@@ -168,8 +174,9 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)

		__ret = component->driver->compr_ops->open(cstream);
		if (__ret < 0) {
			pr_err("compress asoc: can't open platform %s\n",
			       component->name);
			dev_err(component->dev,
				"Compress ASoC: can't open platform %s: %d\n",
				component->name, __ret);
			ret = __ret;
		}
	}
@@ -179,7 +186,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
	if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->startup) {
		ret = fe->dai_link->compr_ops->startup(cstream);
		if (ret < 0) {
			pr_err("compress asoc: %s startup failed\n", fe->dai_link->name);
			pr_err("Compress ASoC: %s startup failed: %d\n",
			       fe->dai_link->name, ret);
			goto machine_err;
		}
	}
@@ -190,7 +198,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
	if (ret < 0)
		goto fe_err;
	else if (ret == 0)
		dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
		dev_dbg(fe->dev, "Compress ASoC: %s no valid %s route\n",
			fe->dai_link->name, stream ? "capture" : "playback");

	/* calculate valid and active FE <-> BE dpcms */
@@ -265,7 +273,8 @@ static void close_delayed_work(struct work_struct *work)

	mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);

	dev_dbg(rtd->dev, "ASoC: pop wq checking: %s status: %s waiting: %s\n",
	dev_dbg(rtd->dev,
		"Compress ASoC: pop wq checking: %s status: %s waiting: %s\n",
		codec_dai->driver->playback.stream_name,
		codec_dai->playback_active ? "active" : "inactive",
		rtd->pop_wait ? "yes" : "no");
@@ -307,7 +316,6 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
	if (!codec_dai->active)
		codec_dai->rate = 0;


	if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->shutdown)
		rtd->dai_link->compr_ops->shutdown(cstream);

@@ -376,7 +384,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)

	ret = dpcm_be_dai_hw_free(fe, stream);
	if (ret < 0)
		dev_err(fe->dev, "compressed hw_free failed %d\n", ret);
		dev_err(fe->dev, "Compressed ASoC: hw_free failed: %d\n", ret);

	ret = dpcm_be_dai_shutdown(fe, stream);

@@ -460,7 +468,6 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
	if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger)
		cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);


	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
		snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction);
@@ -1096,7 +1103,6 @@ static struct snd_compr_ops soc_compr_dyn_ops = {
 */
int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
{
	struct snd_soc_codec *codec = rtd->codec;
	struct snd_soc_platform *platform = rtd->platform;
	struct snd_soc_component *component;
	struct snd_soc_rtdcom_list *rtdcom;
@@ -1109,7 +1115,8 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
	int playback = 0, capture = 0;

	if (rtd->num_codecs > 1) {
		dev_err(rtd->card->dev, "Multicodec not supported for compressed stream\n");
		dev_err(rtd->card->dev,
			"Compress ASoC: Multicodec not supported\n");
		return -EINVAL;
	}

@@ -1127,7 +1134,8 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
	 * should be set, check for that (xor)
	 */
	if (playback + capture != 1) {
		dev_err(rtd->card->dev, "Invalid direction for compress P %d, C %d\n",
		dev_err(rtd->card->dev,
			"Compress ASoC: Invalid direction for P %d, C %d\n",
			playback, capture);
		return -EINVAL;
	}
@@ -1156,8 +1164,9 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
				rtd->dai_link->dpcm_playback,
				rtd->dai_link->dpcm_capture, &be_pcm);
		if (ret < 0) {
			dev_err(rtd->card->dev, "ASoC: can't create compressed for %s\n",
				rtd->dai_link->name);
			dev_err(rtd->card->dev,
				"Compress ASoC: can't create compressed for %s: %d\n",
				rtd->dai_link->name, ret);
			goto compr_err;
		}

@@ -1199,8 +1208,10 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
	ret = snd_compress_new(rtd->card->snd_card, num, direction,
				new_name, compr);
	if (ret < 0) {
		pr_err("compress asoc: can't create compress for codec %s\n",
			codec->component.name);
		component = rtd->codec_dai->component;
		dev_err(component->dev,
			"Compress ASoC: can't create compress for codec %s: %d\n",
			component->name, ret);
		goto compr_err;
	}

@@ -1210,8 +1221,8 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
	rtd->compr = compr;
	compr->private_data = rtd;

	printk(KERN_INFO "compress asoc: %s <-> %s mapping ok\n", codec_dai->name,
		cpu_dai->name);
	dev_info(rtd->card->dev, "Compress ASoC: %s <-> %s mapping ok\n",
		 codec_dai->name, cpu_dai->name);
	return ret;

compr_err: