drivers/spi/spi-amd.c
Source file repositories/reference/linux-study-clean/drivers/spi/spi-amd.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/spi/spi-amd.c- Extension
.c- Size
- 25985 bytes
- Lines
- 899
- Domain
- Driver Families
- Bucket
- drivers/spi
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/acpi.hlinux/delay.hlinux/dma-mapping.hlinux/init.hlinux/io-64-nonatomic-lo-hi.hlinux/iopoll.hlinux/module.hlinux/platform_device.hlinux/spi/spi.hlinux/spi/spi-mem.hspi-amd.h
Detected Declarations
struct amd_spi_freqenum amd_spi_speedfunction amd_spi_readreg8function amd_spi_writereg8function amd_spi_setclear_reg8function amd_spi_readreg16function amd_spi_writereg16function amd_spi_readreg32function amd_spi_writereg32function amd_spi_readreg64function amd_spi_writereg64function amd_spi_setclear_reg32function amd_spi_select_chipfunction amd_spi_clear_chipfunction amd_spi_clear_fifo_ptrfunction amd_spi_set_opcodefunction amd_spi_set_rx_countfunction amd_spi_set_tx_countfunction amd_spi_busy_waitfunction amd_spi_execute_opcodefunction amd_spi_host_setupfunction amd_set_spi_freqfunction amd_spi_fifo_xferfunction list_for_each_entryfunction list_for_each_entryfunction amd_is_spi_read_cmd_4bfunction amd_is_spi_read_cmdfunction amd_is_spi_write_cmdfunction amd_spi_supports_opfunction amd_spi_adjust_op_sizefunction amd_spi_set_addrfunction amd_spi_hiddma_writefunction amd_spi_mem_data_outfunction amd_spi_hiddma_readfunction amd_spi_mem_data_infunction amd_set_spi_addr_modefunction amd_spi_exec_mem_opfunction amd_spi_host_transferfunction amd_spi_max_transfer_sizefunction amd_spi_setup_hiddmafunction amd_spi_probe_commonfunction amd_spi_probeexport amd_spi_probe_common
Annotated Snippet
struct amd_spi_freq {
u32 speed_hz;
u32 enable_val;
u32 spd7_val;
};
static inline u8 amd_spi_readreg8(struct amd_spi *amd_spi, int idx)
{
return readb((u8 __iomem *)amd_spi->io_remap_addr + idx);
}
static inline void amd_spi_writereg8(struct amd_spi *amd_spi, int idx, u8 val)
{
writeb(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
}
static void amd_spi_setclear_reg8(struct amd_spi *amd_spi, int idx, u8 set, u8 clear)
{
u8 tmp = amd_spi_readreg8(amd_spi, idx);
tmp = (tmp & ~clear) | set;
amd_spi_writereg8(amd_spi, idx, tmp);
}
static inline u16 amd_spi_readreg16(struct amd_spi *amd_spi, int idx)
{
return readw((u8 __iomem *)amd_spi->io_remap_addr + idx);
}
static inline void amd_spi_writereg16(struct amd_spi *amd_spi, int idx, u16 val)
{
writew(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
}
static inline u32 amd_spi_readreg32(struct amd_spi *amd_spi, int idx)
{
return readl((u8 __iomem *)amd_spi->io_remap_addr + idx);
}
static inline void amd_spi_writereg32(struct amd_spi *amd_spi, int idx, u32 val)
{
writel(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
}
static inline u64 amd_spi_readreg64(struct amd_spi *amd_spi, int idx)
{
return readq((u8 __iomem *)amd_spi->io_remap_addr + idx);
}
static inline void amd_spi_writereg64(struct amd_spi *amd_spi, int idx, u64 val)
{
writeq(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
}
static inline void amd_spi_setclear_reg32(struct amd_spi *amd_spi, int idx, u32 set, u32 clear)
{
u32 tmp = amd_spi_readreg32(amd_spi, idx);
tmp = (tmp & ~clear) | set;
amd_spi_writereg32(amd_spi, idx, tmp);
}
static void amd_spi_select_chip(struct amd_spi *amd_spi, u8 cs)
{
amd_spi_setclear_reg8(amd_spi, AMD_SPI_ALT_CS_REG, cs, AMD_SPI_ALT_CS_MASK);
}
static inline void amd_spi_clear_chip(struct amd_spi *amd_spi, u8 chip_select)
{
amd_spi_writereg8(amd_spi, AMD_SPI_ALT_CS_REG, chip_select & ~AMD_SPI_ALT_CS_MASK);
}
static void amd_spi_clear_fifo_ptr(struct amd_spi *amd_spi)
{
amd_spi_setclear_reg32(amd_spi, AMD_SPI_CTRL0_REG, AMD_SPI_FIFO_CLEAR, AMD_SPI_FIFO_CLEAR);
}
static int amd_spi_set_opcode(struct amd_spi *amd_spi, u8 cmd_opcode)
{
switch (amd_spi->version) {
case AMD_SPI_V1:
amd_spi_setclear_reg32(amd_spi, AMD_SPI_CTRL0_REG, cmd_opcode,
AMD_SPI_OPCODE_MASK);
return 0;
case AMD_SPI_V2:
case AMD_HID2_SPI:
amd_spi_writereg8(amd_spi, AMD_SPI_OPCODE_REG, cmd_opcode);
return 0;
default:
return -ENODEV;
Annotation
- Immediate include surface: `linux/acpi.h`, `linux/delay.h`, `linux/dma-mapping.h`, `linux/init.h`, `linux/io-64-nonatomic-lo-hi.h`, `linux/iopoll.h`, `linux/module.h`, `linux/platform_device.h`.
- Detected declarations: `struct amd_spi_freq`, `enum amd_spi_speed`, `function amd_spi_readreg8`, `function amd_spi_writereg8`, `function amd_spi_setclear_reg8`, `function amd_spi_readreg16`, `function amd_spi_writereg16`, `function amd_spi_readreg32`, `function amd_spi_writereg32`, `function amd_spi_readreg64`.
- Atlas domain: Driver Families / drivers/spi.
- Implementation status: integration 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.