drivers/spi/spi-fsl-dspi.c

Source file repositories/reference/linux-study-clean/drivers/spi/spi-fsl-dspi.c

File Facts

System
Linux kernel
Corpus path
drivers/spi/spi-fsl-dspi.c
Extension
.c
Size
44499 bytes
Lines
1740
Domain
Driver Families
Bucket
drivers/spi
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 chip_data {
	u32			ctar_val;
};

enum dspi_trans_mode {
	DSPI_XSPI_MODE,
	DSPI_DMA_MODE,
};

struct fsl_dspi_devtype_data {
	enum dspi_trans_mode	trans_mode;
	u8			max_clock_factor;
	int			fifo_size;
	const struct regmap_config *regmap;
};

enum {
	LS1021A,
	LS1012A,
	LS1028A,
	LS1043A,
	LS1046A,
	LS2080A,
	LS2085A,
	LX2160A,
	MCF5441X,
	VF610,
	S32G,
	S32G_TARGET,
};

static const struct regmap_range dspi_yes_ranges[] = {
	regmap_reg_range(SPI_MCR, SPI_MCR),
	regmap_reg_range(SPI_TCR, SPI_CTAR(3)),
	regmap_reg_range(SPI_SR, SPI_TXFR3),
	regmap_reg_range(SPI_RXFR0, SPI_RXFR3),
	regmap_reg_range(SPI_CTARE(0), SPI_CTARE(3)),
	regmap_reg_range(SPI_SREX, SPI_SREX),
};

static const struct regmap_range s32g_dspi_yes_ranges[] = {
	regmap_reg_range(SPI_MCR, SPI_MCR),
	regmap_reg_range(SPI_TCR, SPI_CTAR(5)),
	regmap_reg_range(SPI_SR, SPI_TXFR4),
	regmap_reg_range(SPI_RXFR0, SPI_RXFR4),
	regmap_reg_range(SPI_CTARE(0), SPI_CTARE(5)),
	regmap_reg_range(SPI_SREX, SPI_SREX),
};

static const struct regmap_access_table dspi_access_table = {
	.yes_ranges	= dspi_yes_ranges,
	.n_yes_ranges	= ARRAY_SIZE(dspi_yes_ranges),
};

static const struct regmap_access_table s32g_dspi_access_table = {
	.yes_ranges	= s32g_dspi_yes_ranges,
	.n_yes_ranges	= ARRAY_SIZE(s32g_dspi_yes_ranges),
};

static const struct regmap_range dspi_volatile_ranges[] = {
	regmap_reg_range(SPI_MCR, SPI_TCR),
	regmap_reg_range(SPI_SR, SPI_SR),
	regmap_reg_range(SPI_PUSHR, SPI_RXFR4),
	regmap_reg_range(SPI_SREX, SPI_SREX),
};

static const struct regmap_access_table dspi_volatile_table = {
	.yes_ranges	= dspi_volatile_ranges,
	.n_yes_ranges	= ARRAY_SIZE(dspi_volatile_ranges),
};

enum {
	DSPI_REGMAP,
	S32G_DSPI_REGMAP,
	DSPI_XSPI_REGMAP,
	S32G_DSPI_XSPI_REGMAP,
	DSPI_PUSHR,
};

static const struct regmap_config dspi_regmap_config[] = {
	[DSPI_REGMAP] = {
		.reg_bits	= 32,
		.val_bits	= 32,
		.reg_stride	= 4,
		.max_register	= SPI_RXFR3,
		.volatile_table	= &dspi_volatile_table,
		.rd_table	= &dspi_access_table,
		.wr_table	= &dspi_access_table,
	},
	[S32G_DSPI_REGMAP] = {

Annotation

Implementation Notes