drivers/spi/spi-lantiq-ssc.c
Source file repositories/reference/linux-study-clean/drivers/spi/spi-lantiq-ssc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/spi/spi-lantiq-ssc.c- Extension
.c- Size
- 27788 bytes
- Lines
- 1038
- 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/kernel.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/clk.hlinux/io.hlinux/delay.hlinux/interrupt.hlinux/sched.hlinux/completion.hlinux/spinlock.hlinux/err.hlinux/pm_runtime.hlinux/spi/spi.hlantiq_soc.h
Detected Declarations
struct lantiq_ssc_spistruct lantiq_ssc_hwcfgstruct lantiq_ssc_spifunction lantiq_ssc_readlfunction lantiq_ssc_writelfunction lantiq_ssc_masklfunction tx_fifo_levelfunction rx_fifo_levelfunction tx_fifo_freefunction rx_fifo_resetfunction tx_fifo_resetfunction rx_fifo_flushfunction tx_fifo_flushfunction hw_enter_config_modefunction hw_enter_active_modefunction hw_setup_speed_hzfunction hw_setup_bits_per_wordfunction hw_setup_clock_modefunction lantiq_ssc_hw_initfunction lantiq_ssc_setupfunction lantiq_ssc_prepare_messagefunction hw_setup_transferfunction lantiq_ssc_unprepare_messagefunction tx_fifo_writefunction rx_fifo_read_full_duplexfunction rx_fifo_read_half_duplexfunction rx_requestfunction lantiq_ssc_xmit_interruptfunction lantiq_ssc_err_interruptfunction intel_lgm_ssc_isrfunction transfer_startfunction lantiq_ssc_bussy_workfunction lantiq_ssc_handle_errfunction lantiq_ssc_set_csfunction lantiq_ssc_transfer_onefunction intel_lgm_cfg_irqfunction lantiq_cfg_irqfunction lantiq_ssc_probefunction lantiq_ssc_remove
Annotated Snippet
struct lantiq_ssc_hwcfg {
int (*cfg_irq)(struct platform_device *pdev, struct lantiq_ssc_spi *spi);
unsigned int irnen_r;
unsigned int irnen_t;
unsigned int irncr;
unsigned int irnicr;
bool irq_ack;
u32 fifo_size_mask;
};
struct lantiq_ssc_spi {
struct spi_controller *host;
struct device *dev;
void __iomem *regbase;
struct clk *spi_clk;
struct clk *fpi_clk;
const struct lantiq_ssc_hwcfg *hwcfg;
spinlock_t lock;
struct workqueue_struct *wq;
struct work_struct work;
const u8 *tx;
u8 *rx;
unsigned int tx_todo;
unsigned int rx_todo;
unsigned int bits_per_word;
unsigned int speed_hz;
unsigned int tx_fifo_size;
unsigned int rx_fifo_size;
unsigned int base_cs;
unsigned int fdx_tx_level;
};
static u32 lantiq_ssc_readl(const struct lantiq_ssc_spi *spi, u32 reg)
{
return __raw_readl(spi->regbase + reg);
}
static void lantiq_ssc_writel(const struct lantiq_ssc_spi *spi, u32 val,
u32 reg)
{
__raw_writel(val, spi->regbase + reg);
}
static void lantiq_ssc_maskl(const struct lantiq_ssc_spi *spi, u32 clr,
u32 set, u32 reg)
{
u32 val = __raw_readl(spi->regbase + reg);
val &= ~clr;
val |= set;
__raw_writel(val, spi->regbase + reg);
}
static unsigned int tx_fifo_level(const struct lantiq_ssc_spi *spi)
{
const struct lantiq_ssc_hwcfg *hwcfg = spi->hwcfg;
u32 fstat = lantiq_ssc_readl(spi, LTQ_SPI_FSTAT);
return (fstat >> LTQ_SPI_FSTAT_TXFFL_S) & hwcfg->fifo_size_mask;
}
static unsigned int rx_fifo_level(const struct lantiq_ssc_spi *spi)
{
const struct lantiq_ssc_hwcfg *hwcfg = spi->hwcfg;
u32 fstat = lantiq_ssc_readl(spi, LTQ_SPI_FSTAT);
return (fstat >> LTQ_SPI_FSTAT_RXFFL_S) & hwcfg->fifo_size_mask;
}
static unsigned int tx_fifo_free(const struct lantiq_ssc_spi *spi)
{
return spi->tx_fifo_size - tx_fifo_level(spi);
}
static void rx_fifo_reset(const struct lantiq_ssc_spi *spi)
{
u32 val = spi->rx_fifo_size << LTQ_SPI_RXFCON_RXFITL_S;
val |= LTQ_SPI_RXFCON_RXFEN | LTQ_SPI_RXFCON_RXFLU;
lantiq_ssc_writel(spi, val, LTQ_SPI_RXFCON);
}
static void tx_fifo_reset(const struct lantiq_ssc_spi *spi)
{
u32 val = 1 << LTQ_SPI_TXFCON_TXFITL_S;
val |= LTQ_SPI_TXFCON_TXFEN | LTQ_SPI_TXFCON_TXFLU;
lantiq_ssc_writel(spi, val, LTQ_SPI_TXFCON);
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/of.h`, `linux/platform_device.h`, `linux/clk.h`, `linux/io.h`, `linux/delay.h`, `linux/interrupt.h`.
- Detected declarations: `struct lantiq_ssc_spi`, `struct lantiq_ssc_hwcfg`, `struct lantiq_ssc_spi`, `function lantiq_ssc_readl`, `function lantiq_ssc_writel`, `function lantiq_ssc_maskl`, `function tx_fifo_level`, `function rx_fifo_level`, `function tx_fifo_free`, `function rx_fifo_reset`.
- 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.