sound/soc/samsung/i2s.c

Source file repositories/reference/linux-study-clean/sound/soc/samsung/i2s.c

File Facts

System
Linux kernel
Corpus path
sound/soc/samsung/i2s.c
Extension
.c
Size
42140 bytes
Lines
1737
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct samsung_i2s_variant_regs {
	unsigned int	bfs_off;
	unsigned int	rfs_off;
	unsigned int	sdf_off;
	unsigned int	txr_off;
	unsigned int	rclksrc_off;
	unsigned int	mss_off;
	unsigned int	cdclkcon_off;
	unsigned int	lrp_off;
	unsigned int	bfs_mask;
	unsigned int	rfs_mask;
	unsigned int	ftx0cnt_off;
};

struct samsung_i2s_dai_data {
	u32 quirks;
	unsigned int pcm_rates;
	const struct samsung_i2s_variant_regs *i2s_variant_regs;
	void (*fixup_early)(struct snd_pcm_substream *substream,
					struct snd_soc_dai *dai);
	void (*fixup_late)(struct snd_pcm_substream *substream,
					struct snd_soc_dai *dai);
};

struct i2s_dai {
	/* Platform device for this DAI */
	struct platform_device *pdev;

	/* Frame clock */
	unsigned frmclk;
	/*
	 * Specifically requested RCLK, BCLK by machine driver.
	 * 0 indicates CPU driver is free to choose any value.
	 */
	unsigned rfs, bfs;
	/* Pointer to the Primary_Fifo if this is Sec_Fifo, NULL otherwise */
	struct i2s_dai *pri_dai;
	/* Pointer to the Secondary_Fifo if it has one, NULL otherwise */
	struct i2s_dai *sec_dai;

#define DAI_OPENED	(1 << 0) /* DAI is opened */
#define DAI_MANAGER	(1 << 1) /* DAI is the manager */
	unsigned mode;

	/* Driver for this DAI */
	struct snd_soc_dai_driver *drv;

	/* DMA parameters */
	struct snd_dmaengine_dai_dma_data dma_playback;
	struct snd_dmaengine_dai_dma_data dma_capture;
	struct snd_dmaengine_dai_dma_data idma_playback;
	dma_filter_fn filter;

	struct samsung_i2s_priv *priv;
};

struct samsung_i2s_priv {
	struct platform_device *pdev;
	struct platform_device *pdev_sec;

	/* Lock for cross interface checks */
	spinlock_t pcm_lock;

	/* CPU DAIs and their corresponding drivers */
	struct i2s_dai *dai;
	struct snd_soc_dai_driver *dai_drv;
	int num_dais;

	/* The I2S controller's core clock */
	struct clk *clk;

	/* Clock for generating I2S signals */
	struct clk *op_clk;

	/* Rate of RCLK source clock */
	unsigned long rclk_srcrate;

	/* Cache of selected I2S registers for system suspend */
	u32 suspend_i2smod;
	u32 suspend_i2scon;
	u32 suspend_i2spsr;

	const struct samsung_i2s_variant_regs *variant_regs;
	void (*fixup_early)(struct snd_pcm_substream *substream,
						struct snd_soc_dai *dai);
	void (*fixup_late)(struct snd_pcm_substream *substream,
						struct snd_soc_dai *dai);
	u32 quirks;

	/* The clock provider's data */

Annotation

Implementation Notes