xref: /linux/sound/soc/soc-utils.c (revision 7aae816dae150caad8880357e42303935c0179a8)
1*7aae816dSMark Brown /*
2*7aae816dSMark Brown  * soc-util.c  --  ALSA SoC Audio Layer utility functions
3*7aae816dSMark Brown  *
4*7aae816dSMark Brown  * Copyright 2009 Wolfson Microelectronics PLC.
5*7aae816dSMark Brown  *
6*7aae816dSMark Brown  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7*7aae816dSMark Brown  *         Liam Girdwood <lrg@slimlogic.co.uk>
8*7aae816dSMark Brown  *
9*7aae816dSMark Brown  *
10*7aae816dSMark Brown  *  This program is free software; you can redistribute  it and/or modify it
11*7aae816dSMark Brown  *  under  the terms of  the GNU General  Public License as published by the
12*7aae816dSMark Brown  *  Free Software Foundation;  either version 2 of the  License, or (at your
13*7aae816dSMark Brown  *  option) any later version.
14*7aae816dSMark Brown  */
15*7aae816dSMark Brown 
16*7aae816dSMark Brown #include <sound/core.h>
17*7aae816dSMark Brown #include <sound/pcm.h>
18*7aae816dSMark Brown #include <sound/pcm_params.h>
19*7aae816dSMark Brown #include <sound/soc.h>
20*7aae816dSMark Brown 
21*7aae816dSMark Brown int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots)
22*7aae816dSMark Brown {
23*7aae816dSMark Brown 	return sample_size * channels * tdm_slots;
24*7aae816dSMark Brown }
25*7aae816dSMark Brown EXPORT_SYMBOL_GPL(snd_soc_calc_frame_size);
26*7aae816dSMark Brown 
27*7aae816dSMark Brown int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params)
28*7aae816dSMark Brown {
29*7aae816dSMark Brown 	int sample_size;
30*7aae816dSMark Brown 
31*7aae816dSMark Brown 	switch (params_format(params)) {
32*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S16_LE:
33*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S16_BE:
34*7aae816dSMark Brown 		sample_size = 16;
35*7aae816dSMark Brown 		break;
36*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S20_3LE:
37*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S20_3BE:
38*7aae816dSMark Brown 		sample_size = 20;
39*7aae816dSMark Brown 		break;
40*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S24_LE:
41*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S24_BE:
42*7aae816dSMark Brown 		sample_size = 24;
43*7aae816dSMark Brown 		break;
44*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S32_LE:
45*7aae816dSMark Brown 	case SNDRV_PCM_FORMAT_S32_BE:
46*7aae816dSMark Brown 		sample_size = 32;
47*7aae816dSMark Brown 		break;
48*7aae816dSMark Brown 	default:
49*7aae816dSMark Brown 		return -ENOTSUPP;
50*7aae816dSMark Brown 	}
51*7aae816dSMark Brown 
52*7aae816dSMark Brown 	return snd_soc_calc_frame_size(sample_size, params_channels(params),
53*7aae816dSMark Brown 				       1);
54*7aae816dSMark Brown }
55*7aae816dSMark Brown EXPORT_SYMBOL_GPL(snd_soc_params_to_frame_size);
56*7aae816dSMark Brown 
57*7aae816dSMark Brown int snd_soc_params_to_bclk(struct snd_pcm_hw_params *params)
58*7aae816dSMark Brown {
59*7aae816dSMark Brown 	int ret;
60*7aae816dSMark Brown 
61*7aae816dSMark Brown 	ret = snd_soc_params_to_frame_size(params);
62*7aae816dSMark Brown 
63*7aae816dSMark Brown 	if (ret > 0)
64*7aae816dSMark Brown 		return ret * params_rate(params);
65*7aae816dSMark Brown 	else
66*7aae816dSMark Brown 		return ret;
67*7aae816dSMark Brown }
68*7aae816dSMark Brown EXPORT_SYMBOL_GPL(snd_soc_params_to_bclk);
69