drivers/spi/spi-nxp-fspi.c
Source file repositories/reference/linux-study-clean/drivers/spi/spi-nxp-fspi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/spi/spi-nxp-fspi.c- Extension
.c- Size
- 41273 bytes
- Lines
- 1480
- 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.
- 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
linux/acpi.hlinux/bitops.hlinux/bitfield.hlinux/clk.hlinux/completion.hlinux/delay.hlinux/err.hlinux/errno.hlinux/interrupt.hlinux/io.hlinux/iopoll.hlinux/jiffies.hlinux/kernel.hlinux/module.hlinux/mutex.hlinux/of.hlinux/platform_device.hlinux/pinctrl/consumer.hlinux/pm_runtime.hlinux/pm_qos.hlinux/regmap.hlinux/sizes.hlinux/sys_soc.hlinux/mfd/syscon.hlinux/spi/spi.hlinux/spi/spi-mem.h
Detected Declarations
struct nxp_fspi_devtype_datastruct nxp_fspifunction needs_ip_onlyfunction fspi_writelfunction fspi_readlfunction nxp_fspi_irq_handlerfunction nxp_fspi_check_buswidthfunction nxp_fspi_supports_opfunction fspi_readl_poll_toutfunction nxp_fspi_invalidfunction nxp_fspi_prepare_lutfunction nxp_fspi_clk_prep_enablefunction nxp_fspi_clk_disable_unprepfunction nxp_fspi_select_rx_sample_clk_sourcefunction nxp_fspi_dll_calibrationfunction nxp_fspi_dll_overridefunction nxp_fspi_select_memfunction nxp_fspi_read_ahbfunction nxp_fspi_fill_txfifofunction nxp_fspi_read_rxfifofunction nxp_fspi_do_opfunction nxp_fspi_exec_opfunction nxp_fspi_adjust_op_sizefunction erratum_err050568function nxp_fspi_default_setupfunction nxp_fspi_cleanupfunction nxp_fspi_probefunction nxp_fspi_runtime_suspendfunction nxp_fspi_runtime_resumefunction nxp_fspi_suspend
Annotated Snippet
struct nxp_fspi_devtype_data {
unsigned int rxfifo;
unsigned int txfifo;
unsigned int ahb_buf_size;
unsigned int quirks;
unsigned int lut_num;
bool little_endian;
};
static struct nxp_fspi_devtype_data lx2160a_data = {
.rxfifo = SZ_512, /* (64 * 64 bits) */
.txfifo = SZ_1K, /* (128 * 64 bits) */
.ahb_buf_size = SZ_2K, /* (256 * 64 bits) */
.quirks = FSPI_QUIRK_DISABLE_DTR,
.lut_num = 32,
.little_endian = true, /* little-endian */
};
static struct nxp_fspi_devtype_data imx8mm_data = {
.rxfifo = SZ_512, /* (64 * 64 bits) */
.txfifo = SZ_1K, /* (128 * 64 bits) */
.ahb_buf_size = SZ_2K, /* (256 * 64 bits) */
.quirks = 0,
.lut_num = 32,
.little_endian = true, /* little-endian */
};
static struct nxp_fspi_devtype_data imx8qxp_data = {
.rxfifo = SZ_512, /* (64 * 64 bits) */
.txfifo = SZ_1K, /* (128 * 64 bits) */
.ahb_buf_size = SZ_2K, /* (256 * 64 bits) */
.quirks = 0,
.lut_num = 32,
.little_endian = true, /* little-endian */
};
static struct nxp_fspi_devtype_data imx8dxl_data = {
.rxfifo = SZ_512, /* (64 * 64 bits) */
.txfifo = SZ_1K, /* (128 * 64 bits) */
.ahb_buf_size = SZ_2K, /* (256 * 64 bits) */
.quirks = FSPI_QUIRK_USE_IP_ONLY,
.lut_num = 32,
.little_endian = true, /* little-endian */
};
static struct nxp_fspi_devtype_data imx8ulp_data = {
.rxfifo = SZ_512, /* (64 * 64 bits) */
.txfifo = SZ_1K, /* (128 * 64 bits) */
.ahb_buf_size = SZ_2K, /* (256 * 64 bits) */
.quirks = 0,
.lut_num = 16,
.little_endian = true, /* little-endian */
};
struct nxp_fspi {
void __iomem *iobase;
void __iomem *ahb_addr;
u32 memmap_phy;
u32 memmap_phy_size;
u32 memmap_start;
u32 memmap_len;
struct clk *clk, *clk_en;
struct device *dev;
struct completion c;
struct nxp_fspi_devtype_data *devtype_data;
struct mutex lock;
struct pm_qos_request pm_qos_req;
int selected;
#define FSPI_NEED_INIT BIT(0)
#define FSPI_DTR_MODE BIT(1)
int flags;
/* save the previous operation clock rate */
unsigned long pre_op_rate;
/* the max clock rate fspi output to device */
unsigned long max_rate;
};
static inline int needs_ip_only(struct nxp_fspi *f)
{
return f->devtype_data->quirks & FSPI_QUIRK_USE_IP_ONLY;
}
/*
* R/W functions for big- or little-endian registers:
* The FSPI controller's endianness is independent of
* the CPU core's endianness. So far, although the CPU
* core is little-endian the FSPI controller can use
* big-endian or little-endian.
*/
static void fspi_writel(struct nxp_fspi *f, u32 val, void __iomem *addr)
Annotation
- Immediate include surface: `linux/acpi.h`, `linux/bitops.h`, `linux/bitfield.h`, `linux/clk.h`, `linux/completion.h`, `linux/delay.h`, `linux/err.h`, `linux/errno.h`.
- Detected declarations: `struct nxp_fspi_devtype_data`, `struct nxp_fspi`, `function needs_ip_only`, `function fspi_writel`, `function fspi_readl`, `function nxp_fspi_irq_handler`, `function nxp_fspi_check_buswidth`, `function nxp_fspi_supports_op`, `function fspi_readl_poll_tout`, `function nxp_fspi_invalid`.
- Atlas domain: Driver Families / drivers/spi.
- 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.