drivers/spi/spi-qcom-qspi.c
Source file repositories/reference/linux-study-clean/drivers/spi/spi-qcom-qspi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/spi/spi-qcom-qspi.c- Extension
.c- Size
- 24969 bytes
- Lines
- 976
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/clk.hlinux/dmapool.hlinux/dma-mapping.hlinux/interconnect.hlinux/interrupt.hlinux/io.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/pinctrl/consumer.hlinux/pm_runtime.hlinux/pm_opp.hlinux/spi/spi.hlinux/spi/spi-mem.h
Detected Declarations
struct qspi_cmd_descstruct qspi_xferstruct qcom_qspienum qspi_direnum qspi_clocksfunction qspi_buswidth_to_iomodefunction qcom_qspi_pio_xfer_cfgfunction qcom_qspi_pio_xfer_ctrlfunction qcom_qspi_pio_xferfunction qcom_qspi_handle_errfunction qcom_qspi_set_speedfunction qcom_qspi_alloc_descfunction qcom_qspi_setup_dma_descfunction qcom_qspi_dma_xferfunction qcom_qspi_can_dmafunction qcom_qspi_transfer_onefunction qcom_qspi_prepare_messagefunction qcom_qspi_alloc_dmafunction pio_readfunction pio_writefunction qcom_qspi_irqfunction qcom_qspi_adjust_op_sizefunction qcom_qspi_probefunction qcom_qspi_removefunction qcom_qspi_runtime_suspendfunction qcom_qspi_runtime_resumefunction qcom_qspi_suspendfunction qcom_qspi_resume
Annotated Snippet
struct qspi_cmd_desc {
u32 data_address;
u32 next_descriptor;
u32 direction:1;
u32 multi_io_mode:3;
u32 reserved1:4;
u32 fragment:1;
u32 reserved2:7;
u32 length:16;
};
struct qspi_xfer {
union {
const void *tx_buf;
void *rx_buf;
};
unsigned int rem_bytes;
unsigned int buswidth;
enum qspi_dir dir;
bool is_last;
};
enum qspi_clocks {
QSPI_CLK_CORE,
QSPI_CLK_IFACE,
QSPI_NUM_CLKS
};
/*
* Number of entries in sgt returned from spi framework that-
* will be supported. Can be modified as required.
* In practice, given max_dma_len is 64KB, the number of
* entries is not expected to exceed 1.
*/
#define QSPI_MAX_SG 5
struct qcom_qspi {
void __iomem *base;
struct device *dev;
struct clk_bulk_data *clks;
struct qspi_xfer xfer;
struct dma_pool *dma_cmd_pool;
dma_addr_t dma_cmd_desc[QSPI_MAX_SG];
void *virt_cmd_desc[QSPI_MAX_SG];
unsigned int n_cmd_desc;
struct icc_path *icc_path_cpu_to_qspi;
struct icc_path *icc_path_mem;
unsigned long last_speed;
/* Lock to protect data accessed by IRQs */
spinlock_t lock;
};
static u32 qspi_buswidth_to_iomode(struct qcom_qspi *ctrl,
unsigned int buswidth)
{
switch (buswidth) {
case 1:
return SDR_1BIT;
case 2:
return SDR_2BIT;
case 4:
return SDR_4BIT;
default:
dev_warn_once(ctrl->dev,
"Unexpected bus width: %u\n", buswidth);
return SDR_1BIT;
}
}
static void qcom_qspi_pio_xfer_cfg(struct qcom_qspi *ctrl)
{
u32 pio_xfer_cfg;
u32 iomode;
const struct qspi_xfer *xfer;
xfer = &ctrl->xfer;
pio_xfer_cfg = readl(ctrl->base + PIO_XFER_CFG);
pio_xfer_cfg &= ~TRANSFER_DIRECTION;
pio_xfer_cfg |= xfer->dir;
if (xfer->is_last)
pio_xfer_cfg &= ~TRANSFER_FRAGMENT;
else
pio_xfer_cfg |= TRANSFER_FRAGMENT;
pio_xfer_cfg &= ~MULTI_IO_MODE_MSK;
iomode = qspi_buswidth_to_iomode(ctrl, xfer->buswidth);
pio_xfer_cfg |= iomode << MULTI_IO_MODE_SHFT;
writel(pio_xfer_cfg, ctrl->base + PIO_XFER_CFG);
}
Annotation
- Immediate include surface: `linux/clk.h`, `linux/dmapool.h`, `linux/dma-mapping.h`, `linux/interconnect.h`, `linux/interrupt.h`, `linux/io.h`, `linux/module.h`, `linux/of.h`.
- Detected declarations: `struct qspi_cmd_desc`, `struct qspi_xfer`, `struct qcom_qspi`, `enum qspi_dir`, `enum qspi_clocks`, `function qspi_buswidth_to_iomode`, `function qcom_qspi_pio_xfer_cfg`, `function qcom_qspi_pio_xfer_ctrl`, `function qcom_qspi_pio_xfer`, `function qcom_qspi_handle_err`.
- Atlas domain: Driver Families / drivers/spi.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- 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.