sound/soc/sophgo/cv1800b-tdm.c
Source file repositories/reference/linux-study-clean/sound/soc/sophgo/cv1800b-tdm.c
File Facts
- System
- Linux kernel
- Corpus path
sound/soc/sophgo/cv1800b-tdm.c- Extension
.c- Size
- 20088 bytes
- Lines
- 717
- 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/clk.hlinux/delay.hlinux/io.hlinux/module.hlinux/of.hlinux/platform_device.hsound/dmaengine_pcm.hsound/pcm_params.hsound/soc.hlinux/string.hlinux/dev_printk.hlinux/bitfield.hlinux/bits.hlinux/limits.hlinux/overflow.h
Detected Declarations
struct cv1800b_i2senum cv1800b_tdm_word_lengthfunction cv1800b_setup_dma_structfunction cv1800b_reset_fifofunction cv1800b_reset_i2sfunction cv1800b_set_mclk_divfunction cv1800b_set_tx_modefunction cv1800b_set_bclk_divfunction cv1800b_set_word_lengthfunction cv1800b_enable_clocksfunction cv1800b_set_slot_settingsfunction cv1800b_calc_mclk_divfunction cv1800b_i2s_set_rate_for_mclkfunction cv1800b_i2s_hw_paramsfunction cv1800b_i2s_triggerfunction cv1800b_i2s_startupfunction cv1800b_i2s_dai_probefunction cv1800b_i2s_dai_set_fmtfunction cv1800b_i2s_dai_set_bclk_ratiofunction cv1800b_i2s_dai_set_sysclkfunction cv1800b_i2s_hw_disablefunction cv1800b_i2s_setup_tdmfunction cv1800b_i2s_probefunction cv1800b_i2s_remove
Annotated Snippet
struct cv1800b_i2s {
void __iomem *base;
struct clk *clk;
struct clk *sysclk;
struct device *dev;
struct snd_dmaengine_dai_dma_data playback_dma;
struct snd_dmaengine_dai_dma_data capture_dma;
u32 mclk_rate;
bool bclk_ratio_fixed;
u32 bclk_ratio;
};
static void cv1800b_setup_dma_struct(struct cv1800b_i2s *i2s,
phys_addr_t phys_base)
{
i2s->playback_dma.addr = phys_base + CV1800B_TX_WR_PORT;
i2s->playback_dma.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
i2s->playback_dma.fifo_size = TX_FIFO_SIZE;
i2s->playback_dma.maxburst = TX_MAX_BURST;
i2s->capture_dma.addr = phys_base + CV1800B_RX_RD_PORT;
i2s->capture_dma.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
i2s->capture_dma.fifo_size = RX_FIFO_SIZE;
i2s->capture_dma.maxburst = RX_MAX_BURST;
}
static const struct snd_dmaengine_pcm_config cv1800b_i2s_pcm_config = {
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
};
static void cv1800b_reset_fifo(struct cv1800b_i2s *i2s)
{
u32 val;
val = readl(i2s->base + CV1800B_FIFO_RESET);
val = u32_replace_bits(val, 1, FIFO_RX_RESET_MASK);
val = u32_replace_bits(val, 1, FIFO_TX_RESET_MASK);
writel(val, i2s->base + CV1800B_FIFO_RESET);
usleep_range(10, 20);
val = readl(i2s->base + CV1800B_FIFO_RESET);
val = u32_replace_bits(val, 0, FIFO_RX_RESET_MASK);
val = u32_replace_bits(val, 0, FIFO_TX_RESET_MASK);
writel(val, i2s->base + CV1800B_FIFO_RESET);
}
static void cv1800b_reset_i2s(struct cv1800b_i2s *i2s)
{
u32 val;
val = readl(i2s->base + CV1800B_I2S_RESET);
val = u32_replace_bits(val, 1, RST_I2S_RESET_RX_MASK);
val = u32_replace_bits(val, 1, RST_I2S_RESET_TX_MASK);
writel(val, i2s->base + CV1800B_I2S_RESET);
usleep_range(10, 20);
val = readl(i2s->base + CV1800B_I2S_RESET);
val = u32_replace_bits(val, 0, RST_I2S_RESET_RX_MASK);
val = u32_replace_bits(val, 0, RST_I2S_RESET_TX_MASK);
writel(val, i2s->base + CV1800B_I2S_RESET);
}
static void cv1800b_set_mclk_div(struct cv1800b_i2s *i2s, u32 mclk_div)
{
u32 val;
val = readl(i2s->base + CV1800B_CLK_CTRL1);
val = u32_replace_bits(val, mclk_div, CLK_MCLK_DIV_MASK);
writel(val, i2s->base + CV1800B_CLK_CTRL1);
dev_dbg(i2s->dev, "mclk_div is set to %u\n", mclk_div);
}
static void cv1800b_set_tx_mode(struct cv1800b_i2s *i2s, bool is_tx)
{
u32 val;
val = readl(i2s->base + CV1800B_BLK_MODE_SETTING);
val = u32_replace_bits(val, is_tx, BLK_TX_MODE_MASK);
writel(val, i2s->base + CV1800B_BLK_MODE_SETTING);
dev_dbg(i2s->dev, "tx_mode is set to %u\n", is_tx);
}
static int cv1800b_set_bclk_div(struct cv1800b_i2s *i2s, u32 bclk_div)
{
u32 val;
if (bclk_div == 0 || bclk_div > 0xFFFF)
Annotation
- Immediate include surface: `linux/clk.h`, `linux/delay.h`, `linux/io.h`, `linux/module.h`, `linux/of.h`, `linux/platform_device.h`, `sound/dmaengine_pcm.h`, `sound/pcm_params.h`.
- Detected declarations: `struct cv1800b_i2s`, `enum cv1800b_tdm_word_length`, `function cv1800b_setup_dma_struct`, `function cv1800b_reset_fifo`, `function cv1800b_reset_i2s`, `function cv1800b_set_mclk_div`, `function cv1800b_set_tx_mode`, `function cv1800b_set_bclk_div`, `function cv1800b_set_word_length`, `function cv1800b_enable_clocks`.
- 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.