summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/fsl_dsd.h
blob: 814e78f406b8664056adae29473b90a13036b0be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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 */