aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2013-12-02 15:26:22 -0500
committerMark Brown <broonie@linaro.org>2013-12-03 10:06:17 -0500
commita010ff628c0953e6c914ecd09678363848617a88 (patch)
treee7d1984669b9cfe1b976cbaa7e93b7e77cdbd3be
parent647dc469e6356440af3cd2c3d8262c6f7899ceae (diff)
ASoC: ssm2602: Use core for applying symmetry constraints
Let the core take care of applying sample rate and sample bits constraints instead of open-coding this in the driver. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/codecs/ssm2602.c50
1 files changed, 2 insertions, 48 deletions
diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index 480074d86476..c6dd48561884 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -53,8 +53,6 @@ enum ssm2602_type {
53struct ssm2602_priv { 53struct ssm2602_priv {
54 unsigned int sysclk; 54 unsigned int sysclk;
55 struct snd_pcm_hw_constraint_list *sysclk_constraints; 55 struct snd_pcm_hw_constraint_list *sysclk_constraints;
56 struct snd_pcm_substream *master_substream;
57 struct snd_pcm_substream *slave_substream;
58 56
59 struct regmap *regmap; 57 struct regmap *regmap;
60 58
@@ -277,11 +275,6 @@ static int ssm2602_hw_params(struct snd_pcm_substream *substream,
277 int srate = ssm2602_get_coeff(ssm2602->sysclk, params_rate(params)); 275 int srate = ssm2602_get_coeff(ssm2602->sysclk, params_rate(params));
278 unsigned int iface; 276 unsigned int iface;
279 277
280 if (substream == ssm2602->slave_substream) {
281 dev_dbg(codec->dev, "Ignoring hw_params for slave substream\n");
282 return 0;
283 }
284
285 if (srate < 0) 278 if (srate < 0)
286 return srate; 279 return srate;
287 280
@@ -314,33 +307,6 @@ static int ssm2602_startup(struct snd_pcm_substream *substream,
314{ 307{
315 struct snd_soc_codec *codec = dai->codec; 308 struct snd_soc_codec *codec = dai->codec;
316 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec); 309 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
317 struct snd_pcm_runtime *master_runtime;
318
319 /* The DAI has shared clocks so if we already have a playback or
320 * capture going then constrain this substream to match it.
321 * TODO: the ssm2602 allows pairs of non-matching PB/REC rates
322 */
323 if (ssm2602->master_substream) {
324 master_runtime = ssm2602->master_substream->runtime;
325 dev_dbg(codec->dev, "Constraining to %d bits at %dHz\n",
326 master_runtime->sample_bits,
327 master_runtime->rate);
328
329 if (master_runtime->rate != 0)
330 snd_pcm_hw_constraint_minmax(substream->runtime,
331 SNDRV_PCM_HW_PARAM_RATE,
332 master_runtime->rate,
333 master_runtime->rate);
334
335 if (master_runtime->sample_bits != 0)
336 snd_pcm_hw_constraint_minmax(substream->runtime,
337 SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
338 master_runtime->sample_bits,
339 master_runtime->sample_bits);
340
341 ssm2602->slave_substream = substream;
342 } else
343 ssm2602->master_substream = substream;
344 310
345 if (ssm2602->sysclk_constraints) { 311 if (ssm2602->sysclk_constraints) {
346 snd_pcm_hw_constraint_list(substream->runtime, 0, 312 snd_pcm_hw_constraint_list(substream->runtime, 0,
@@ -351,19 +317,6 @@ static int ssm2602_startup(struct snd_pcm_substream *substream,
351 return 0; 317 return 0;
352} 318}
353 319
354static void ssm2602_shutdown(struct snd_pcm_substream *substream,
355 struct snd_soc_dai *dai)
356{
357 struct snd_soc_codec *codec = dai->codec;
358 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);
359
360 if (ssm2602->master_substream == substream)
361 ssm2602->master_substream = ssm2602->slave_substream;
362
363 ssm2602->slave_substream = NULL;
364}
365
366
367static int ssm2602_mute(struct snd_soc_dai *dai, int mute) 320static int ssm2602_mute(struct snd_soc_dai *dai, int mute)
368{ 321{
369 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(dai->codec); 322 struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(dai->codec);
@@ -530,7 +483,6 @@ static int ssm2602_set_bias_level(struct snd_soc_codec *codec,
530static const struct snd_soc_dai_ops ssm2602_dai_ops = { 483static const struct snd_soc_dai_ops ssm2602_dai_ops = {
531 .startup = ssm2602_startup, 484 .startup = ssm2602_startup,
532 .hw_params = ssm2602_hw_params, 485 .hw_params = ssm2602_hw_params,
533 .shutdown = ssm2602_shutdown,
534 .digital_mute = ssm2602_mute, 486 .digital_mute = ssm2602_mute,
535 .set_sysclk = ssm2602_set_dai_sysclk, 487 .set_sysclk = ssm2602_set_dai_sysclk,
536 .set_fmt = ssm2602_set_dai_fmt, 488 .set_fmt = ssm2602_set_dai_fmt,
@@ -551,6 +503,8 @@ static struct snd_soc_dai_driver ssm2602_dai = {
551 .rates = SSM2602_RATES, 503 .rates = SSM2602_RATES,
552 .formats = SSM2602_FORMATS,}, 504 .formats = SSM2602_FORMATS,},
553 .ops = &ssm2602_dai_ops, 505 .ops = &ssm2602_dai_ops,
506 .symmetric_rates = 1,
507 .symmetric_samplebits = 1,
554}; 508};
555 509
556static int ssm2602_suspend(struct snd_soc_codec *codec) 510static int ssm2602_suspend(struct snd_soc_codec *codec)