diff options
author | Viorel Suman <viorel.suman@nxp.com> | 2018-03-08 14:37:30 +0200 |
---|---|---|
committer | Dong Aisheng <aisheng.dong@nxp.com> | 2019-11-25 15:53:57 +0800 |
commit | 6e286195f62917d6e8655bf1520d6a0b01d1a4d4 (patch) | |
tree | c4bc412fed60b5bc43b9da71435933c299e362f0 /sound/soc/fsl/fsl_dsd.h | |
parent | 8f88f5a166a360b0bb809beacdfa8792aee21761 (diff) |
MLK-17580: ASoC: fsl: dsd: Add DSD utilities helper
Add DSD utilities helper.
Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
Reviewed-by: Shengjiu Wang <shengjiu.wang@nxp.com
Diffstat (limited to 'sound/soc/fsl/fsl_dsd.h')
-rw-r--r-- | sound/soc/fsl/fsl_dsd.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/sound/soc/fsl/fsl_dsd.h b/sound/soc/fsl/fsl_dsd.h new file mode 100644 index 000000000000..814e78f406b8 --- /dev/null +++ b/sound/soc/fsl/fsl_dsd.h @@ -0,0 +1,59 @@ +/* + * Copyright 2018 NXP + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __FSL_DSD_H +#define __FSL_DSD_H + +#include <linux/pinctrl/consumer.h> +#include <sound/pcm_params.h> +#include <sound/soc.h> + +static bool fsl_is_dsd(struct snd_pcm_hw_params *params) +{ + snd_pcm_format_t format = params_format(params); + + switch (format) { + case SNDRV_PCM_FORMAT_DSD_U8: + case SNDRV_PCM_FORMAT_DSD_U16_LE: + case SNDRV_PCM_FORMAT_DSD_U16_BE: + case SNDRV_PCM_FORMAT_DSD_U32_LE: + case SNDRV_PCM_FORMAT_DSD_U32_BE: + return true; + default: + return false; + } +} + +static struct pinctrl_state *fsl_get_pins_state(struct pinctrl *pinctrl, + struct snd_pcm_hw_params *params) +{ + int dsd_bclk; + struct pinctrl_state *state = 0; + + if (fsl_is_dsd(params)) { + dsd_bclk = params_rate(params) * params_physical_width(params); + + switch (dsd_bclk) { + case 22579200: /* DSD512 */ + state = pinctrl_lookup_state(pinctrl, "dsd512"); + break; + } + + /* Get default DSD state */ + if (IS_ERR_OR_NULL(state)) + state = pinctrl_lookup_state(pinctrl, "dsd"); + } + + /* Get default state */ + if (IS_ERR_OR_NULL(state)) + state = pinctrl_lookup_state(pinctrl, "default"); + + return state; +} + +#endif /* __FSL_DSD_H */ |