diff options
Diffstat (limited to 'sound/soc/s3c24xx/s3c-i2s-v2.c')
-rw-r--r-- | sound/soc/s3c24xx/s3c-i2s-v2.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index ac153ca9c628..13311c8cf965 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c | |||
@@ -342,6 +342,52 @@ static int s3c_i2sv2_hw_params(struct snd_pcm_substream *substream, | |||
342 | 342 | ||
343 | writel(iismod, i2s->regs + S3C2412_IISMOD); | 343 | writel(iismod, i2s->regs + S3C2412_IISMOD); |
344 | pr_debug("%s: w: IISMOD: %x\n", __func__, iismod); | 344 | pr_debug("%s: w: IISMOD: %x\n", __func__, iismod); |
345 | |||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | static int s3c_i2sv2_set_sysclk(struct snd_soc_dai *cpu_dai, | ||
350 | int clk_id, unsigned int freq, int dir) | ||
351 | { | ||
352 | struct s3c_i2sv2_info *i2s = to_info(cpu_dai); | ||
353 | u32 iismod = readl(i2s->regs + S3C2412_IISMOD); | ||
354 | |||
355 | pr_debug("Entered %s\n", __func__); | ||
356 | pr_debug("%s r: IISMOD: %x\n", __func__, iismod); | ||
357 | |||
358 | switch (clk_id) { | ||
359 | case S3C_I2SV2_CLKSRC_PCLK: | ||
360 | iismod &= ~S3C2412_IISMOD_IMS_SYSMUX; | ||
361 | break; | ||
362 | |||
363 | case S3C_I2SV2_CLKSRC_AUDIOBUS: | ||
364 | iismod |= S3C2412_IISMOD_IMS_SYSMUX; | ||
365 | break; | ||
366 | |||
367 | case S3C_I2SV2_CLKSRC_CDCLK: | ||
368 | /* Error if controller doesn't have the CDCLKCON bit */ | ||
369 | if (!(i2s->feature & S3C_FEATURE_CDCLKCON)) | ||
370 | return -EINVAL; | ||
371 | |||
372 | switch (dir) { | ||
373 | case SND_SOC_CLOCK_IN: | ||
374 | iismod |= S3C64XX_IISMOD_CDCLKCON; | ||
375 | break; | ||
376 | case SND_SOC_CLOCK_OUT: | ||
377 | iismod &= ~S3C64XX_IISMOD_CDCLKCON; | ||
378 | break; | ||
379 | default: | ||
380 | return -EINVAL; | ||
381 | } | ||
382 | break; | ||
383 | |||
384 | default: | ||
385 | return -EINVAL; | ||
386 | } | ||
387 | |||
388 | writel(iismod, i2s->regs + S3C2412_IISMOD); | ||
389 | pr_debug("%s w: IISMOD: %x\n", __func__, iismod); | ||
390 | |||
345 | return 0; | 391 | return 0; |
346 | } | 392 | } |
347 | 393 | ||
@@ -714,6 +760,7 @@ int s3c_i2sv2_register_dai(struct snd_soc_dai *dai) | |||
714 | ops->hw_params = s3c_i2sv2_hw_params; | 760 | ops->hw_params = s3c_i2sv2_hw_params; |
715 | ops->set_fmt = s3c2412_i2s_set_fmt; | 761 | ops->set_fmt = s3c2412_i2s_set_fmt; |
716 | ops->set_clkdiv = s3c2412_i2s_set_clkdiv; | 762 | ops->set_clkdiv = s3c2412_i2s_set_clkdiv; |
763 | ops->set_sysclk = s3c_i2sv2_set_sysclk; | ||
717 | 764 | ||
718 | /* Allow overriding by (for example) IISv4 */ | 765 | /* Allow overriding by (for example) IISv4 */ |
719 | if (!ops->delay) | 766 | if (!ops->delay) |