sound/soc/fsl/fsl_ssi.c
Source file repositories/reference/linux-study-clean/sound/soc/fsl/fsl_ssi.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/fsl/fsl_ssi.c- Extension
.c- Size
- 49217 bytes
- Lines
- 1746
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/init.hlinux/io.hlinux/module.hlinux/interrupt.hlinux/clk.hlinux/ctype.hlinux/device.hlinux/delay.hlinux/mutex.hlinux/slab.hlinux/spinlock.hlinux/of.hlinux/of_address.hlinux/of_irq.hlinux/of_platform.hlinux/dma/imx-dma.hsound/core.hsound/pcm.hsound/pcm_params.hsound/initval.hsound/soc.hsound/dmaengine_pcm.hfsl_ssi.himx-pcm.h
Detected Declarations
struct fsl_ssi_regvalsstruct fsl_ssi_soc_datastruct fsl_ssienum fsl_ssi_typefunction fsl_ssi_readable_regfunction fsl_ssi_volatile_regfunction fsl_ssi_precious_regfunction fsl_ssi_writeable_regfunction fsl_ssi_is_ac97function fsl_ssi_is_i2s_clock_providerfunction fsl_ssi_is_i2s_bc_fpfunction fsl_ssi_isrfunction fsl_ssi_config_enablefunction fsl_ssi_config_disablefunction fsl_ssi_tx_ac97_saccst_setupfunction fsl_ssi_setup_regvalsfunction fsl_ssi_setup_ac97function fsl_ssi_startupfunction fsl_ssi_shutdownfunction fsl_ssi_set_bclkfunction modefunction fsl_ssi_hw_freefunction _fsl_ssi_set_dai_fmtfunction fsl_ssi_set_dai_fmtfunction fsl_ssi_set_dai_tdm_slotfunction fsl_ssi_triggerfunction fsl_ssi_dai_probefunction fsl_ssi_ac97_writefunction fsl_ssi_ac97_readfunction fsl_ssi_hw_initfunction fsl_ssi_hw_cleanfunction make_lowercasefunction fsl_ssi_imx_probefunction fsl_ssi_imx_cleanfunction fsl_ssi_probe_from_dtfunction fsl_ssi_probefunction fsl_ssi_removefunction fsl_ssi_suspendfunction fsl_ssi_resume
Annotated Snippet
struct fsl_ssi_regvals {
u32 sier;
u32 srcr;
u32 stcr;
u32 scr;
};
static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case REG_SSI_SACCEN:
case REG_SSI_SACCDIS:
return false;
default:
return true;
}
}
static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case REG_SSI_STX0:
case REG_SSI_STX1:
case REG_SSI_SRX0:
case REG_SSI_SRX1:
case REG_SSI_SISR:
case REG_SSI_SFCSR:
case REG_SSI_SACNT:
case REG_SSI_SACADD:
case REG_SSI_SACDAT:
case REG_SSI_SATAG:
case REG_SSI_SACCST:
case REG_SSI_SOR:
return true;
default:
return false;
}
}
static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case REG_SSI_SRX0:
case REG_SSI_SRX1:
case REG_SSI_SISR:
case REG_SSI_SACADD:
case REG_SSI_SACDAT:
case REG_SSI_SATAG:
return true;
default:
return false;
}
}
static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case REG_SSI_SRX0:
case REG_SSI_SRX1:
case REG_SSI_SACCST:
return false;
default:
return true;
}
}
static const struct regmap_config fsl_ssi_regconfig = {
.max_register = REG_SSI_SACCDIS,
.reg_bits = 32,
.val_bits = 32,
.reg_stride = 4,
.val_format_endian = REGMAP_ENDIAN_NATIVE,
.num_reg_defaults_raw = REG_SSI_SACCDIS / sizeof(uint32_t) + 1,
.readable_reg = fsl_ssi_readable_reg,
.volatile_reg = fsl_ssi_volatile_reg,
.precious_reg = fsl_ssi_precious_reg,
.writeable_reg = fsl_ssi_writeable_reg,
.cache_type = REGCACHE_FLAT,
};
struct fsl_ssi_soc_data {
bool imx;
bool imx21regs; /* imx21-class SSI - no SACC{ST,EN,DIS} regs */
bool offline_config;
u32 sisr_write_mask;
};
/**
* struct fsl_ssi - per-SSI private data
* @regs: Pointer to the regmap registers
Annotation
- Immediate include surface: `linux/init.h`, `linux/io.h`, `linux/module.h`, `linux/interrupt.h`, `linux/clk.h`, `linux/ctype.h`, `linux/device.h`, `linux/delay.h`.
- Detected declarations: `struct fsl_ssi_regvals`, `struct fsl_ssi_soc_data`, `struct fsl_ssi`, `enum fsl_ssi_type`, `function fsl_ssi_readable_reg`, `function fsl_ssi_volatile_reg`, `function fsl_ssi_precious_reg`, `function fsl_ssi_writeable_reg`, `function fsl_ssi_is_ac97`, `function fsl_ssi_is_i2s_clock_provider`.
- 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.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.