sound/soc/renesas/rcar/ssi.c
Source file repositories/reference/linux-study-clean/sound/soc/renesas/rcar/ssi.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/renesas/rcar/ssi.c- Extension
.c- Size
- 28822 bytes
- Lines
- 1280
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
sound/simple_card_utils.hlinux/of.hlinux/of_irq.hlinux/delay.hrsnd.h
Detected Declarations
struct rsnd_ssifunction rsnd_ssi_use_busiffunction rsnd_ssi_status_clearfunction rsnd_ssi_status_getfunction rsnd_ssi_status_checkfunction rsnd_ssi_multi_secondariesfunction rsnd_ssi_run_modsfunction rsnd_ssi_multi_secondaries_runtimefunction rsnd_rdai_width_to_swlfunction rsnd_ssi_clk_queryfunction rsnd_ssi_master_clk_startfunction rsnd_ssi_master_clk_stopfunction rsnd_ssi_config_initfunction rsnd_ssiu_init_gen2function rsnd_ssi_register_setupfunction rsnd_ssi_initfunction rsnd_ssi_quitfunction rsnd_ssi_hw_paramsfunction rsnd_ssi_startfunction rsnd_ssi_stopfunction rsnd_ssi_irqfunction __rsnd_ssi_interruptfunction scoped_guardfunction rsnd_ssi_interruptfunction rsnd_ssi_parent_attachfunction rsnd_ssi_pcm_newfunction rsnd_ssi_common_probefunction rsnd_ssi_pcm_newfunction rsnd_ssi_common_removefunction rsnd_ssi_pio_interruptfunction rsnd_ssi_pio_initfunction rsnd_ssi_pio_pointerfunction rsnd_ssi_dma_probefunction rsnd_ssi_fallbackfunction rsnd_ssi_debug_infofunction rsnd_ssi_is_dma_modefunction rsnd_ssi_connectfunction rsnd_parse_connect_ssifunction __rsnd_ssi_is_pin_sharingfunction rsnd_ssi_probefunction rsnd_ssi_removefunction for_each_rsnd_ssifunction rsnd_ssi_suspendfunction rsnd_ssi_resume
Annotated Snippet
struct rsnd_ssi {
struct rsnd_mod mod;
u32 flags;
u32 cr_own;
u32 cr_clk;
u32 cr_mode;
u32 cr_en;
u32 wsr;
int chan;
int rate;
int irq;
unsigned int usrcnt;
/* for PIO */
int byte_pos;
int byte_per_period;
int next_period_byte;
};
/* flags */
#define RSND_SSI_CLK_PIN_SHARE (1 << 0)
#define RSND_SSI_NO_BUSIF (1 << 1) /* SSI+DMA without BUSIF */
#define RSND_SSI_PROBED (1 << 2)
#define for_each_rsnd_ssi(pos, priv, i) \
for (i = 0; \
(i < rsnd_ssi_nr(priv)) && \
((pos) = ((struct rsnd_ssi *)(priv)->ssi + i)); \
i++)
#define rsnd_ssi_get(priv, id) ((struct rsnd_ssi *)(priv->ssi) + id)
#define rsnd_ssi_nr(priv) ((priv)->ssi_nr)
#define rsnd_mod_to_ssi(_mod) container_of((_mod), struct rsnd_ssi, mod)
#define rsnd_ssi_is_parent(ssi, io) ((ssi) == rsnd_io_to_mod_ssip(io))
#define rsnd_ssi_is_multi_secondary(mod, io) \
(rsnd_ssi_multi_secondaries(io) & (1 << rsnd_mod_id(mod)))
#define rsnd_ssi_is_run_mods(mod, io) \
(rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
#define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod))
int rsnd_ssi_use_busif(struct rsnd_dai_stream *io)
{
struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
int use_busif = 0;
if (!rsnd_ssi_is_dma_mode(mod))
return 0;
if (!(rsnd_flags_has(ssi, RSND_SSI_NO_BUSIF)))
use_busif = 1;
if (rsnd_io_to_mod_src(io))
use_busif = 1;
return use_busif;
}
static void rsnd_ssi_status_clear(struct rsnd_mod *mod)
{
rsnd_mod_write(mod, SSISR, 0);
}
static u32 rsnd_ssi_status_get(struct rsnd_mod *mod)
{
return rsnd_mod_read(mod, SSISR);
}
static void rsnd_ssi_status_check(struct rsnd_mod *mod,
u32 bit)
{
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
struct device *dev = rsnd_priv_to_dev(priv);
u32 status;
int i;
for (i = 0; i < 1024; i++) {
status = rsnd_ssi_status_get(mod);
if (status & bit)
return;
udelay(5);
}
dev_warn(dev, "%s status check failed\n", rsnd_mod_name(mod));
}
static u32 rsnd_ssi_multi_secondaries(struct rsnd_dai_stream *io)
{
static const enum rsnd_mod_type types[] = {
Annotation
- Immediate include surface: `sound/simple_card_utils.h`, `linux/of.h`, `linux/of_irq.h`, `linux/delay.h`, `rsnd.h`.
- Detected declarations: `struct rsnd_ssi`, `function rsnd_ssi_use_busif`, `function rsnd_ssi_status_clear`, `function rsnd_ssi_status_get`, `function rsnd_ssi_status_check`, `function rsnd_ssi_multi_secondaries`, `function rsnd_ssi_run_mods`, `function rsnd_ssi_multi_secondaries_runtime`, `function rsnd_rdai_width_to_swl`, `function rsnd_ssi_clk_query`.
- Atlas domain: Driver Families / sound/soc.
- Implementation status: source implementation candidate.
- 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.