sound/soc/codecs/rtq9124.c

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

File Facts

System
Linux kernel
Corpus path
sound/soc/codecs/rtq9124.c
Extension
.c
Size
15768 bytes
Lines
544
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: implementation source
Status
source 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 rtq9124_priv {
	struct gpio_desc *enable;
	unsigned int dai_fmt;
	int tdm_slots;
	int tdm_slot_width;
};

static int rtq9124_enable_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
				int event)
{
	struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
	unsigned int i, chan_state;

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		/* Change state to normal */
		chan_state = 0;
		break;
	case SND_SOC_DAPM_POST_PMD:
		/* Change state to HiZ */
		chan_state = 1;
		break;
	default:
		return -EINVAL;
	}

	/* Before amp turn on, clear old events first */
	for (i = 0; !chan_state && i < 8; i++)
		snd_soc_component_write(comp, RTQ9124_REG_ERR_INT_0 + i, 0xffff);

	snd_soc_component_write_field(comp, RTQ9124_REG_STATE_CTRL, RTQ9124_MASK_CH_STATE,
				      chan_state);

	return 0;
}

static const struct snd_soc_dapm_widget rtq9124_dapm_widgets[] = {
	SND_SOC_DAPM_OUTPUT("SPK"),
	SND_SOC_DAPM_OUT_DRV_E("Amp Drv", SND_SOC_NOPM, 0, 0, NULL, 0, rtq9124_enable_event,
			       SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
};

static const struct snd_soc_dapm_route rtq9124_dapm_routes[] = {
	{ "Amp Drv", NULL, "HiFi Playback" },
	{ "SPK", NULL, "Amp Drv" },
};

static const DECLARE_TLV_DB_SCALE(dig_tlv, -10375, 25, 0);
static const DECLARE_TLV_DB_RANGE(ana_tlv,
				  0, 3, TLV_DB_SCALE_ITEM(-600, 600, 0),
				  4, 6, TLV_DB_SCALE_ITEM(1400, 200, 0));
static const char * const i2sch_text[] = { "(L+R)/2", "LCH", "RCH", "(L+R)/2" };
static const struct soc_enum rtq9124_i2sch_select_enum =
	SOC_ENUM_SINGLE(RTQ9124_REG_SDI_SEL, 0, ARRAY_SIZE(i2sch_text), i2sch_text);
static const char * const sdo_vsel_text[] = { "1.8V", "3.3V" };
static const struct soc_enum rtq9124_sdo_vselect_enum =
	SOC_ENUM_SINGLE(RTQ9124_REG_SDO_SEL, 8, ARRAY_SIZE(sdo_vsel_text), sdo_vsel_text);
static const char * const pwmfreq_text[] = { "8*fs", "10*fs", "40*fs", "44*fs", "48*fs" };
static const struct soc_enum rtq9124_pwm_freq_enum =
	SOC_ENUM_SINGLE(RTQ9124_REG_AMP_OPT, 4, ARRAY_SIZE(pwmfreq_text), pwmfreq_text);
static const char * const out_angle_text[] = { "0", "45", "90", "135", "180", "225", "270", "315" };
static const struct soc_enum rtq9124_out_angle_enum =
	SOC_ENUM_SINGLE(RTQ9124_REG_PWM_PHASE, 0, ARRAY_SIZE(out_angle_text), out_angle_text);
static const char * const sdo_select_text[] = {
	"None", "I2S DataI", "Interface", "DSP", "DF", "ISense", "ACLoad Cos", "ACLoad Sin",
	"DCR",
};
static const struct soc_enum rtq9124_sdo_select_enum =
	SOC_ENUM_DOUBLE(RTQ9124_REG_SDO_SEL, 4, 0, ARRAY_SIZE(sdo_select_text), sdo_select_text);
static const char * const ulqm_dcvt_text[] = { "Disable", "DC", "VT", "DC+VT" };
static const struct soc_enum rtq9124_ulqm_dcvt_select_enum =
	SOC_ENUM_SINGLE(RTQ9124_REG_STATE_CTRL, 10, ARRAY_SIZE(ulqm_dcvt_text), ulqm_dcvt_text);

static const struct snd_kcontrol_new rtq9124_controls[] = {
	SOC_SINGLE_TLV("Master Volume", RTQ9124_REG_VOL_OPT, 2, 511, 1, dig_tlv),
	SOC_SINGLE_TLV("Speaker Volume", RTQ9124_REG_AMP_OPT, 0, 6, 0, ana_tlv),
	SOC_ENUM("I2S CH Select", rtq9124_i2sch_select_enum),
	SOC_ENUM("SDO VDDIO Select", rtq9124_sdo_vselect_enum),
	SOC_ENUM("PWM Frequency Select", rtq9124_pwm_freq_enum),
	SOC_ENUM("PWM Output Phase Select", rtq9124_out_angle_enum),
	SOC_ENUM("SDO Select", rtq9124_sdo_select_enum),
	SOC_ENUM("ULQM DCVT Select", rtq9124_ulqm_dcvt_select_enum),
	SOC_SINGLE("Silence Detect Enable Switch", RTQ9124_REG_SIL_CTRL, 7, 1, 0),
	SOC_SINGLE("Spread Spectrum Enable Switch", RTQ9124_REG_PWM_SS_OPT, 7, 1, 0),
};

static int rtq9124_comp_probe(struct snd_soc_component *comp)
{
	/* CS Data INV */
	snd_soc_component_write_field(comp, RTQ9124_REG_SDO_SEL, RTQ9124_MASK_CS_DATA_INV, 1);

Annotation

Implementation Notes