Unverified Commit 1dfdbe73 authored by Codrin Ciubotariu's avatar Codrin Ciubotariu Committed by Mark Brown
Browse files

ASoC: atmel-classd: remove codec component



The CPU and the codec both are represented now as components, so for
CLASS-D we are registering two componenets with the same name. Since
there is no actual codec, we will merge the codec component into the
CPU one and use a dummy codec instead, for the DAI link.
As a bonus, debugfs will no longer report an error when will try to
create entries for both componenets with the same name.

Signed-off-by: default avatarCodrin Ciubotariu <codrin.ciubotariu@microchip.com>
Link: https://lore.kernel.org/r/20200708101249.2626560-1-codrin.ciubotariu@microchip.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6940701c
Loading
Loading
Loading
Loading
+47 −85
Original line number Diff line number Diff line
@@ -120,38 +120,20 @@ static int atmel_classd_cpu_dai_startup(struct snd_pcm_substream *substream,
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
	int err;

	regmap_write(dd->regmap, CLASSD_THR, 0x0);

	return clk_prepare_enable(dd->pclk);
}

static void atmel_classd_cpu_dai_shutdown(struct snd_pcm_substream *substream,
					struct snd_soc_dai *cpu_dai)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);

	err = clk_prepare_enable(dd->pclk);
	if (err)
		return err;
	err = clk_prepare_enable(dd->gclk);
	if (err) {
		clk_disable_unprepare(dd->pclk);
		return err;
	}
	return 0;
}

static const struct snd_soc_dai_ops atmel_classd_cpu_dai_ops = {
	.startup	= atmel_classd_cpu_dai_startup,
	.shutdown	= atmel_classd_cpu_dai_shutdown,
};

static struct snd_soc_dai_driver atmel_classd_cpu_dai = {
	.playback = {
		.channels_min	= 1,
		.channels_max	= 2,
		.rates		= ATMEL_CLASSD_RATES,
		.formats	= SNDRV_PCM_FMTBIT_S16_LE,},
	.ops = &atmel_classd_cpu_dai_ops,
};

static const struct snd_soc_component_driver atmel_classd_cpu_dai_component = {
	.name = "atmel-classd",
};

/* platform */
static int
@@ -306,31 +288,10 @@ static int atmel_classd_component_resume(struct snd_soc_component *component)
	return regcache_sync(dd->regmap);
}

static struct snd_soc_component_driver soc_component_dev_classd = {
	.probe			= atmel_classd_component_probe,
	.resume			= atmel_classd_component_resume,
	.controls		= atmel_classd_snd_controls,
	.num_controls		= ARRAY_SIZE(atmel_classd_snd_controls),
	.idle_bias_on		= 1,
	.use_pmdown_time	= 1,
	.endianness		= 1,
	.non_legacy_dai_naming	= 1,
};

/* codec dai component */
static int atmel_classd_codec_dai_startup(struct snd_pcm_substream *substream,
				struct snd_soc_dai *codec_dai)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);

	return clk_prepare_enable(dd->gclk);
}

static int atmel_classd_codec_dai_digital_mute(struct snd_soc_dai *codec_dai,
static int atmel_classd_cpu_dai_digital_mute(struct snd_soc_dai *cpu_dai,
					     int mute)
{
	struct snd_soc_component *component = codec_dai->component;
	struct snd_soc_component *component = cpu_dai->component;
	u32 mask, val;

	mask = CLASSD_MR_LMUTE_MASK | CLASSD_MR_RMUTE_MASK;
@@ -373,13 +334,13 @@ static struct {
};

static int
atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream,
atmel_classd_cpu_dai_hw_params(struct snd_pcm_substream *substream,
			       struct snd_pcm_hw_params *params,
			    struct snd_soc_dai *codec_dai)
			       struct snd_soc_dai *cpu_dai)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
	struct snd_soc_component *component = codec_dai->component;
	struct snd_soc_component *component = cpu_dai->component;
	int fs;
	int i, best, best_val, cur_val, ret;
	u32 mask, val;
@@ -417,8 +378,8 @@ atmel_classd_codec_dai_hw_params(struct snd_pcm_substream *substream,
}

static void
atmel_classd_codec_dai_shutdown(struct snd_pcm_substream *substream,
			    struct snd_soc_dai *codec_dai)
atmel_classd_cpu_dai_shutdown(struct snd_pcm_substream *substream,
			      struct snd_soc_dai *cpu_dai)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_classd *dd = snd_soc_card_get_drvdata(rtd->card);
@@ -426,10 +387,10 @@ atmel_classd_codec_dai_shutdown(struct snd_pcm_substream *substream,
	clk_disable_unprepare(dd->gclk);
}

static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream,
					struct snd_soc_dai *codec_dai)
static int atmel_classd_cpu_dai_prepare(struct snd_pcm_substream *substream,
					struct snd_soc_dai *cpu_dai)
{
	struct snd_soc_component *component = codec_dai->component;
	struct snd_soc_component *component = cpu_dai->component;

	snd_soc_component_update_bits(component, CLASSD_MR,
				CLASSD_MR_LEN_MASK | CLASSD_MR_REN_MASK,
@@ -439,10 +400,10 @@ static int atmel_classd_codec_dai_prepare(struct snd_pcm_substream *substream,
	return 0;
}

static int atmel_classd_codec_dai_trigger(struct snd_pcm_substream *substream,
					int cmd, struct snd_soc_dai *codec_dai)
static int atmel_classd_cpu_dai_trigger(struct snd_pcm_substream *substream,
					int cmd, struct snd_soc_dai *cpu_dai)
{
	struct snd_soc_component *component = codec_dai->component;
	struct snd_soc_component *component = cpu_dai->component;
	u32 mask, val;

	mask = CLASSD_MR_LEN_MASK | CLASSD_MR_REN_MASK;
@@ -468,19 +429,16 @@ static int atmel_classd_codec_dai_trigger(struct snd_pcm_substream *substream,
	return 0;
}

static const struct snd_soc_dai_ops atmel_classd_codec_dai_ops = {
	.digital_mute	= atmel_classd_codec_dai_digital_mute,
	.startup	= atmel_classd_codec_dai_startup,
	.shutdown	= atmel_classd_codec_dai_shutdown,
	.hw_params	= atmel_classd_codec_dai_hw_params,
	.prepare	= atmel_classd_codec_dai_prepare,
	.trigger	= atmel_classd_codec_dai_trigger,
static const struct snd_soc_dai_ops atmel_classd_cpu_dai_ops = {
	.startup        = atmel_classd_cpu_dai_startup,
	.shutdown       = atmel_classd_cpu_dai_shutdown,
	.digital_mute	= atmel_classd_cpu_dai_digital_mute,
	.hw_params	= atmel_classd_cpu_dai_hw_params,
	.prepare	= atmel_classd_cpu_dai_prepare,
	.trigger	= atmel_classd_cpu_dai_trigger,
};

#define ATMEL_CLASSD_CODEC_DAI_NAME  "atmel-classd-hifi"

static struct snd_soc_dai_driver atmel_classd_codec_dai = {
	.name = ATMEL_CLASSD_CODEC_DAI_NAME,
static struct snd_soc_dai_driver atmel_classd_cpu_dai = {
	.playback = {
		.stream_name	= "Playback",
		.channels_min	= 1,
@@ -488,7 +446,18 @@ static struct snd_soc_dai_driver atmel_classd_codec_dai = {
		.rates		= ATMEL_CLASSD_RATES,
		.formats	= SNDRV_PCM_FMTBIT_S16_LE,
	},
	.ops = &atmel_classd_codec_dai_ops,
	.ops = &atmel_classd_cpu_dai_ops,
};

static const struct snd_soc_component_driver atmel_classd_cpu_dai_component = {
	.name			= "atmel-classd",
	.probe			= atmel_classd_component_probe,
	.resume			= atmel_classd_component_resume,
	.controls		= atmel_classd_snd_controls,
	.num_controls		= ARRAY_SIZE(atmel_classd_snd_controls),
	.idle_bias_on		= 1,
	.use_pmdown_time	= 1,
	.endianness		= 1,
};

/* ASoC sound card */
@@ -517,9 +486,9 @@ static int atmel_classd_asoc_card_init(struct device *dev,

	dai_link->name			= "CLASSD";
	dai_link->stream_name		= "CLASSD PCM";
	dai_link->codecs->dai_name	= ATMEL_CLASSD_CODEC_DAI_NAME;
	dai_link->codecs->dai_name	= "snd-soc-dummy-dai";
	dai_link->cpus->dai_name	= dev_name(dev);
	dai_link->codecs->name		= dev_name(dev);
	dai_link->codecs->name		= "snd-soc-dummy";
	dai_link->platforms->name	= dev_name(dev);

	card->dai_link	= dai_link;
@@ -620,13 +589,6 @@ static int atmel_classd_probe(struct platform_device *pdev)
		return ret;
	}

	ret = devm_snd_soc_register_component(dev, &soc_component_dev_classd,
					&atmel_classd_codec_dai, 1);
	if (ret) {
		dev_err(dev, "could not register component: %d\n", ret);
		return ret;
	}

	/* register sound card */
	card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
	if (!card) {