sound/soc/codecs/max98390.c
Source file repositories/reference/linux-study-clean/sound/soc/codecs/max98390.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/codecs/max98390.c- Extension
.c- Size
- 32972 bytes
- Lines
- 1137
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/acpi.hlinux/cdev.hlinux/dmi.hlinux/firmware.hlinux/gpio/consumer.hlinux/i2c.hlinux/module.hlinux/regmap.hlinux/slab.hlinux/time.hsound/pcm.hsound/pcm_params.hsound/soc.hsound/tlv.hmax98390.h
Detected Declarations
function max98390_dai_set_fmtfunction max98390_get_bclk_selfunction max98390_set_clockfunction max98390_dai_hw_paramsfunction max98390_dai_tdm_slotfunction max98390_dai_set_sysclkfunction max98390_dac_eventfunction max98390_ref_rdc_putfunction max98390_ref_rdc_getfunction max98390_ambient_temp_putfunction max98390_ambient_temp_getfunction max98390_adaptive_rdc_putfunction max98390_adaptive_rdc_getfunction max98390_dsm_calib_getfunction max98390_dsm_calib_putfunction max98390_readable_registerfunction max98390_volatile_regfunction max98390_dsm_initfunction max98390_init_regsfunction max98390_probefunction max98390_suspendfunction max98390_resumefunction max98390_slot_configfunction max98390_i2c_probe
Annotated Snippet
if (i == ARRAY_SIZE(rate_table)) {
dev_err(component->dev, "failed to find proper clock rate.\n");
return -EINVAL;
}
regmap_update_bits(max98390->regmap,
MAX98390_PCM_MASTER_MODE,
MAX98390_PCM_MASTER_MODE_MCLK_MASK,
i << MAX98390_PCM_MASTER_MODE_MCLK_RATE_SHIFT);
}
if (!max98390->tdm_mode) {
/* BCLK configuration */
value = max98390_get_bclk_sel(blr_clk_ratio);
if (!value) {
dev_err(component->dev, "format unsupported %d\n",
params_format(params));
return -EINVAL;
}
regmap_update_bits(max98390->regmap,
MAX98390_PCM_CLK_SETUP,
MAX98390_PCM_CLK_SETUP_BSEL_MASK,
value);
}
return 0;
}
static int max98390_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
struct snd_soc_component *component =
dai->component;
struct max98390_priv *max98390 =
snd_soc_component_get_drvdata(component);
unsigned int sampling_rate;
unsigned int chan_sz;
/* pcm mode configuration */
switch (snd_pcm_format_width(params_format(params))) {
case 16:
chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_16;
break;
case 24:
chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_24;
break;
case 32:
chan_sz = MAX98390_PCM_MODE_CFG_CHANSZ_32;
break;
default:
dev_err(component->dev, "format unsupported %d\n",
params_format(params));
goto err;
}
regmap_update_bits(max98390->regmap,
MAX98390_PCM_MODE_CFG,
MAX98390_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
dev_dbg(component->dev, "format supported %d",
params_format(params));
/* sampling rate configuration */
switch (params_rate(params)) {
case 8000:
sampling_rate = MAX98390_PCM_SR_SET1_SR_8000;
break;
case 11025:
sampling_rate = MAX98390_PCM_SR_SET1_SR_11025;
break;
case 12000:
sampling_rate = MAX98390_PCM_SR_SET1_SR_12000;
break;
case 16000:
sampling_rate = MAX98390_PCM_SR_SET1_SR_16000;
break;
case 22050:
sampling_rate = MAX98390_PCM_SR_SET1_SR_22050;
break;
case 24000:
sampling_rate = MAX98390_PCM_SR_SET1_SR_24000;
break;
case 32000:
sampling_rate = MAX98390_PCM_SR_SET1_SR_32000;
break;
case 44100:
sampling_rate = MAX98390_PCM_SR_SET1_SR_44100;
break;
Annotation
- Immediate include surface: `linux/acpi.h`, `linux/cdev.h`, `linux/dmi.h`, `linux/firmware.h`, `linux/gpio/consumer.h`, `linux/i2c.h`, `linux/module.h`, `linux/regmap.h`.
- Detected declarations: `function max98390_dai_set_fmt`, `function max98390_get_bclk_sel`, `function max98390_set_clock`, `function max98390_dai_hw_params`, `function max98390_dai_tdm_slot`, `function max98390_dai_set_sysclk`, `function max98390_dac_event`, `function max98390_ref_rdc_put`, `function max98390_ref_rdc_get`, `function max98390_ambient_temp_put`.
- Atlas domain: Driver Families / sound/soc.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.