sound/soc/codecs/src4xxx.c

Source file repositories/reference/linux-study-clean/sound/soc/codecs/src4xxx.c

File Facts

System
Linux kernel
Corpus path
sound/soc/codecs/src4xxx.c
Extension
.c
Size
15066 bytes
Lines
519
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct src4xxx {
	struct regmap *regmap;
	bool master[2];
	int mclk_hz;
	struct device *dev;
};

enum {SRC4XXX_PORTA, SRC4XXX_PORTB};

/* SRC attenuation */
static const DECLARE_TLV_DB_SCALE(src_tlv, -12750, 50, 0);

static const struct snd_kcontrol_new src4xxx_controls[] = {
	SOC_DOUBLE_R_TLV("SRC Volume",
		SRC4XXX_SCR_CTL_30, SRC4XXX_SCR_CTL_31, 0, 255, 1, src_tlv),
};

/* I2S port control */
static const char * const port_out_src_text[] = {
	"loopback", "other_port", "DIR", "SRC"
};
static SOC_ENUM_SINGLE_DECL(porta_out_src_enum, SRC4XXX_PORTA_CTL_03, 4,
	port_out_src_text);
static SOC_ENUM_SINGLE_DECL(portb_out_src_enum, SRC4XXX_PORTB_CTL_05, 4,
	port_out_src_text);
static const struct snd_kcontrol_new porta_out_control =
	SOC_DAPM_ENUM("Port A source select", porta_out_src_enum);
static const struct snd_kcontrol_new portb_out_control =
	SOC_DAPM_ENUM("Port B source select", portb_out_src_enum);

/* Digital audio transmitter control */
static const char * const dit_mux_text[] = {"Port A", "Port B", "DIR", "SRC"};
static SOC_ENUM_SINGLE_DECL(dit_mux_enum, SRC4XXX_TX_CTL_07, 3, dit_mux_text);
static const struct snd_kcontrol_new dit_mux_control =
	SOC_DAPM_ENUM("DIT source", dit_mux_enum);

/* SRC control */
static const char * const src_in_text[] = {"Port A", "Port B", "DIR"};
static SOC_ENUM_SINGLE_DECL(src_in_enum, SRC4XXX_SCR_CTL_2D, 0, src_in_text);
static const struct snd_kcontrol_new src_in_control =
	SOC_DAPM_ENUM("SRC source select", src_in_enum);

/* DIR control */
static const char * const dir_in_text[] = {"Ch 1", "Ch 2", "Ch 3", "Ch 4"};
static SOC_ENUM_SINGLE_DECL(dir_in_enum, SRC4XXX_RCV_CTL_0D, 0, dir_in_text);
static const struct snd_kcontrol_new dir_in_control =
	SOC_DAPM_ENUM("Digital Input", dir_in_enum);

static const struct snd_soc_dapm_widget src4xxx_dapm_widgets[] = {
	SND_SOC_DAPM_INPUT("loopback_A"),
	SND_SOC_DAPM_INPUT("other_port_A"),
	SND_SOC_DAPM_INPUT("DIR_A"),
	SND_SOC_DAPM_INPUT("SRC_A"),
	SND_SOC_DAPM_MUX("Port A source",
		SND_SOC_NOPM, 0, 0, &porta_out_control),

	SND_SOC_DAPM_INPUT("loopback_B"),
	SND_SOC_DAPM_INPUT("other_port_B"),
	SND_SOC_DAPM_INPUT("DIR_B"),
	SND_SOC_DAPM_INPUT("SRC_B"),
	SND_SOC_DAPM_MUX("Port B source",
		SND_SOC_NOPM, 0, 0, &portb_out_control),

	SND_SOC_DAPM_INPUT("Port_A"),
	SND_SOC_DAPM_INPUT("Port_B"),
	SND_SOC_DAPM_INPUT("DIR_"),

	/* Digital audio receivers and transmitters */
	SND_SOC_DAPM_OUTPUT("DIR_OUT"),
	SND_SOC_DAPM_OUTPUT("SRC_OUT"),
	SND_SOC_DAPM_MUX("DIT Out Src", SRC4XXX_PWR_RST_01,
		SRC4XXX_ENABLE_DIT_SHIFT, 1, &dit_mux_control),

	/* Audio Interface */
	SND_SOC_DAPM_AIF_IN("AIF_A_RX", "Playback A", 0,
		SRC4XXX_PWR_RST_01, SRC4XXX_ENABLE_PORT_A_SHIFT, 1),
	SND_SOC_DAPM_AIF_OUT("AIF_A_TX", "Capture A", 0,
		SRC4XXX_PWR_RST_01, SRC4XXX_ENABLE_PORT_A_SHIFT, 1),
	SND_SOC_DAPM_AIF_IN("AIF_B_RX", "Playback B", 0,
		SRC4XXX_PWR_RST_01, SRC4XXX_ENABLE_PORT_B_SHIFT, 1),
	SND_SOC_DAPM_AIF_OUT("AIF_B_TX", "Capture B", 0,
		SRC4XXX_PWR_RST_01, SRC4XXX_ENABLE_PORT_B_SHIFT, 1),

	SND_SOC_DAPM_MUX("SRC source", SND_SOC_NOPM, 0, 0, &src_in_control),

	SND_SOC_DAPM_INPUT("MCLK"),
	SND_SOC_DAPM_INPUT("RXMCLKI"),
	SND_SOC_DAPM_INPUT("RXMCLKO"),

	SND_SOC_DAPM_INPUT("RX1"),

Annotation

Implementation Notes