drivers/spi/spi-wpcm-fiu.c
Source file repositories/reference/linux-study-clean/drivers/spi/spi-wpcm-fiu.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/spi/spi-wpcm-fiu.c- Extension
.c- Size
- 14245 bytes
- Lines
- 504
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/clk.hlinux/mfd/syscon.hlinux/mod_devicetable.hlinux/module.hlinux/platform_device.hlinux/regmap.hlinux/spi/spi-mem.h
Detected Declarations
struct wpcm_fiu_spistruct wpcm_fiu_op_shapefunction wpcm_fiu_set_opcodefunction wpcm_fiu_set_addrfunction wpcm_fiu_set_datafunction wpcm_fiu_get_datafunction UMAfunction wpcm_fiu_ects_assertfunction wpcm_fiu_ects_deassertfunction wpcm_fiu_normal_matchfunction wpcm_fiu_normal_execfunction wpcm_fiu_fast_read_matchfunction wpcm_fiu_fast_read_execfunction wpcm_fiu_4ba_matchfunction wpcm_fiu_4ba_execfunction RDIDfunction wpcm_fiu_rdid_execfunction wpcm_fiu_dummy_matchfunction wpcm_fiu_dummy_execfunction wpcm_fiu_supports_opfunction disablefunction wpcm_fiu_exec_opfunction wpcm_fiu_adjust_op_sizefunction wpcm_fiu_dirmap_createfunction wpcm_fiu_direct_readfunction wpcm_fiu_hw_initfunction wpcm_fiu_probe
Annotated Snippet
struct wpcm_fiu_spi {
struct device *dev;
struct clk *clk;
void __iomem *regs;
void __iomem *memory;
size_t memory_size;
struct regmap *shm_regmap;
};
static void wpcm_fiu_set_opcode(struct wpcm_fiu_spi *fiu, u8 opcode)
{
writeb(opcode, fiu->regs + FIU_UMA_CODE);
}
static void wpcm_fiu_set_addr(struct wpcm_fiu_spi *fiu, u32 addr)
{
writeb((addr >> 0) & 0xff, fiu->regs + FIU_UMA_AB0);
writeb((addr >> 8) & 0xff, fiu->regs + FIU_UMA_AB1);
writeb((addr >> 16) & 0xff, fiu->regs + FIU_UMA_AB2);
}
static void wpcm_fiu_set_data(struct wpcm_fiu_spi *fiu, const u8 *data, unsigned int nbytes)
{
int i;
for (i = 0; i < nbytes; i++)
writeb(data[i], fiu->regs + FIU_UMA_DB0 + i);
}
static void wpcm_fiu_get_data(struct wpcm_fiu_spi *fiu, u8 *data, unsigned int nbytes)
{
int i;
for (i = 0; i < nbytes; i++)
data[i] = readb(fiu->regs + FIU_UMA_DB0 + i);
}
/*
* Perform a UMA (User Mode Access) operation, i.e. a software-controlled SPI transfer.
*/
static int wpcm_fiu_do_uma(struct wpcm_fiu_spi *fiu, unsigned int cs,
bool use_addr, bool write, int data_bytes)
{
int i = 0;
u8 cts = FIU_UMA_CTS_EXEC_DONE | FIU_UMA_CTS_CS(cs);
if (use_addr)
cts |= FIU_UMA_CTS_A_SIZE;
if (write)
cts |= FIU_UMA_CTS_WR;
cts |= FIU_UMA_CTS_D_SIZE(data_bytes);
writeb(cts, fiu->regs + FIU_UMA_CTS);
for (i = 0; i < UMA_WAIT_ITERATIONS; i++)
if (!(readb(fiu->regs + FIU_UMA_CTS) & FIU_UMA_CTS_EXEC_DONE))
return 0;
dev_info(fiu->dev, "UMA transfer has not finished in %d iterations\n", UMA_WAIT_ITERATIONS);
return -EIO;
}
static void wpcm_fiu_ects_assert(struct wpcm_fiu_spi *fiu, unsigned int cs)
{
u8 ects = readb(fiu->regs + FIU_UMA_ECTS);
ects &= ~BIT(cs);
writeb(ects, fiu->regs + FIU_UMA_ECTS);
}
static void wpcm_fiu_ects_deassert(struct wpcm_fiu_spi *fiu, unsigned int cs)
{
u8 ects = readb(fiu->regs + FIU_UMA_ECTS);
ects |= BIT(cs);
writeb(ects, fiu->regs + FIU_UMA_ECTS);
}
struct wpcm_fiu_op_shape {
bool (*match)(const struct spi_mem_op *op);
int (*exec)(struct spi_mem *mem, const struct spi_mem_op *op);
};
static bool wpcm_fiu_normal_match(const struct spi_mem_op *op)
{
// Opcode 0x0b (FAST READ) is treated differently in hardware
if (op->cmd.opcode == 0x0b)
return false;
return (op->addr.nbytes == 0 || op->addr.nbytes == 3) &&
Annotation
- Immediate include surface: `linux/clk.h`, `linux/mfd/syscon.h`, `linux/mod_devicetable.h`, `linux/module.h`, `linux/platform_device.h`, `linux/regmap.h`, `linux/spi/spi-mem.h`.
- Detected declarations: `struct wpcm_fiu_spi`, `struct wpcm_fiu_op_shape`, `function wpcm_fiu_set_opcode`, `function wpcm_fiu_set_addr`, `function wpcm_fiu_set_data`, `function wpcm_fiu_get_data`, `function UMA`, `function wpcm_fiu_ects_assert`, `function wpcm_fiu_ects_deassert`, `function wpcm_fiu_normal_match`.
- Atlas domain: Driver Families / drivers/spi.
- 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.