sound/soc/codecs/ak4375.c
Source file repositories/reference/linux-study-clean/sound/soc/codecs/ak4375.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/codecs/ak4375.c- Extension
.c- Size
- 18308 bytes
- Lines
- 607
- 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.
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/delay.hlinux/gpio/consumer.hlinux/i2c.hlinux/module.hlinux/of.hlinux/pm_runtime.hlinux/regulator/consumer.hsound/soc.hsound/tlv.h
Detected Declarations
struct ak4375_drvdatastruct ak4375_privfunction ak4375_dac_eventfunction ak4375_hw_paramsfunction ak4375_dai_set_pllfunction ak4375_mutefunction ak4375_power_offfunction ak4375_power_onfunction ak4375_runtime_suspendfunction ak4375_runtime_resumefunction ak4375_i2c_probefunction ak4375_i2c_remove
Annotated Snippet
struct ak4375_drvdata {
struct snd_soc_dai_driver *dai_drv;
const struct snd_soc_component_driver *comp_drv;
};
struct ak4375_priv {
struct device *dev;
struct regmap *regmap;
struct gpio_desc *pdn_gpiod;
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
unsigned int rate;
unsigned int pld;
u8 mute_save;
};
static const struct reg_default ak4375_reg_defaults[] = {
{ 0x00, 0x00 }, { 0x01, 0x00 }, { 0x02, 0x00 },
{ 0x03, 0x00 }, { 0x04, 0x00 }, { 0x05, 0x00 },
{ 0x06, 0x00 }, { 0x07, 0x00 }, { 0x08, 0x00 },
{ 0x09, 0x00 }, { 0x0a, 0x00 }, { 0x0b, 0x19 },
{ 0x0c, 0x19 }, { 0x0d, 0x75 }, { 0x0e, 0x01 },
{ 0x0f, 0x00 }, { 0x10, 0x00 }, { 0x11, 0x00 },
{ 0x12, 0x00 }, { 0x13, 0x00 }, { 0x14, 0x00 },
{ 0x15, 0x00 }, { 0x24, 0x00 },
};
/*
* Output Digital volume control:
* from -12.5 to 3 dB in 0.5 dB steps (mute instead of -12.5 dB)
*/
static DECLARE_TLV_DB_SCALE(dac_tlv, -1250, 50, 0);
/*
* HP-Amp Analog volume control:
* from -4.2 to 6 dB in 2 dB steps (mute instead of -4.2 dB)
*/
static DECLARE_TLV_DB_SCALE(hpg_tlv, -4200, 20, 0);
static const char * const ak4375_ovolcn_select_texts[] = { "Dependent", "Independent" };
static const char * const ak4375_mdac_select_texts[] = { "x1", "x1/2" };
static const char * const ak4375_cpmode_select_texts[] = {
"Automatic Switching",
"+-VDD Operation",
"+-1/2VDD Operation"
};
/*
* DASD, DASL bits Digital Filter Setting
* 0, 0 : Sharp Roll-Off Filter
* 0, 1 : Slow Roll-Off Filter
* 1, 0 : Short delay Sharp Roll-Off Filter
* 1, 1 : Short delay Slow Roll-Off Filter
*/
static const char * const ak4375_digfil_select_texts[] = {
"Sharp Roll-Off Filter",
"Slow Roll-Off Filter",
"Short delay Sharp Roll-Off Filter",
"Short delay Slow Roll-Off Filter",
};
static const struct soc_enum ak4375_ovolcn_enum =
SOC_ENUM_SINGLE(AK4375_0B_LCH_OUTPUT_VOLUME, 7,
ARRAY_SIZE(ak4375_ovolcn_select_texts), ak4375_ovolcn_select_texts);
static const struct soc_enum ak4375_mdacl_enum =
SOC_ENUM_SINGLE(AK4375_07_DAC_MONO_MIXING, 2,
ARRAY_SIZE(ak4375_mdac_select_texts), ak4375_mdac_select_texts);
static const struct soc_enum ak4375_mdacr_enum =
SOC_ENUM_SINGLE(AK4375_07_DAC_MONO_MIXING, 6,
ARRAY_SIZE(ak4375_mdac_select_texts), ak4375_mdac_select_texts);
static const struct soc_enum ak4375_cpmode_enum =
SOC_ENUM_SINGLE(AK4375_03_POWER_MANAGEMENT4, 2,
ARRAY_SIZE(ak4375_cpmode_select_texts), ak4375_cpmode_select_texts);
static const struct soc_enum ak4375_digfil_enum =
SOC_ENUM_SINGLE(AK4375_06_DIGITAL_FILTER_SELECT, 6,
ARRAY_SIZE(ak4375_digfil_select_texts), ak4375_digfil_select_texts);
static const struct snd_kcontrol_new ak4375_snd_controls[] = {
SOC_DOUBLE_R_TLV("Digital Output Volume", AK4375_0B_LCH_OUTPUT_VOLUME,
AK4375_0C_RCH_OUTPUT_VOLUME, 0, 0x1f, 0, dac_tlv),
SOC_SINGLE_TLV("HP-Amp Analog Volume",
AK4375_0D_HP_VOLUME_CONTROL, 0, 0x1f, 0, hpg_tlv),
SOC_DOUBLE("DAC Signal Invert Switch", AK4375_07_DAC_MONO_MIXING, 3, 7, 1, 0),
SOC_ENUM("Digital Volume Control", ak4375_ovolcn_enum),
SOC_ENUM("DACL Signal Level", ak4375_mdacl_enum),
SOC_ENUM("DACR Signal Level", ak4375_mdacr_enum),
SOC_ENUM("Charge Pump Mode", ak4375_cpmode_enum),
SOC_ENUM("DAC Digital Filter Mode", ak4375_digfil_enum),
};
Annotation
- Immediate include surface: `linux/delay.h`, `linux/gpio/consumer.h`, `linux/i2c.h`, `linux/module.h`, `linux/of.h`, `linux/pm_runtime.h`, `linux/regulator/consumer.h`, `sound/soc.h`.
- Detected declarations: `struct ak4375_drvdata`, `struct ak4375_priv`, `function ak4375_dac_event`, `function ak4375_hw_params`, `function ak4375_dai_set_pll`, `function ak4375_mute`, `function ak4375_power_off`, `function ak4375_power_on`, `function ak4375_runtime_suspend`, `function ak4375_runtime_resume`.
- Atlas domain: Driver Families / sound/soc.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.