drivers/mmc/host/sdhci-of-k1.c
Source file repositories/reference/linux-study-clean/drivers/mmc/host/sdhci-of-k1.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/mmc/host/sdhci-of-k1.c- Extension
.c- Size
- 17578 bytes
- Lines
- 601
- Domain
- Driver Families
- Bucket
- drivers/mmc
- 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/bitfield.hlinux/clk.hlinux/delay.hlinux/iopoll.hlinux/init.hlinux/mmc/card.hlinux/mmc/host.hlinux/mmc/mmc.hlinux/module.hlinux/of.hlinux/of_device.hlinux/reset.hlinux/pinctrl/consumer.hlinux/platform_device.hsdhci.hsdhci-pltfm.h
Detected Declarations
struct spacemit_sdhci_hostfunction spacemit_sdhci_setbitsfunction spacemit_sdhci_clrbitsfunction spacemit_sdhci_clrsetbitsfunction spacemit_sdhci_set_rx_delayfunction spacemit_sdhci_set_tx_delayfunction spacemit_sdhci_set_tx_dline_regfunction spacemit_sdhci_tx_tuning_preparefunction spacemit_sdhci_prepare_tuningfunction spacemit_sdhci_resetfunction spacemit_sdhci_set_uhs_signalingfunction spacemit_sdhci_set_clockfunction spacemit_sdhci_phy_dll_initfunction spacemit_sdhci_hs400_enhanced_strobefunction spacemit_sdhci_clk_get_max_clockfunction spacemit_sdhci_execute_tuningfunction spacemit_sdhci_pre_select_hs400function spacemit_sdhci_post_select_hs400function spacemit_sdhci_pre_hs400_to_hs200function spacemit_sdhci_start_signal_voltage_switchfunction spacemit_sdhci_get_clocksfunction spacemit_sdhci_get_resetsfunction spacemit_sdhci_get_pinsfunction spacemit_sdhci_probe
Annotated Snippet
struct spacemit_sdhci_host {
struct clk *clk_core;
struct clk *clk_io;
struct pinctrl *pinctrl;
struct pinctrl_state *pinctrl_default;
struct pinctrl_state *pinctrl_uhs;
};
/* All helper functions will update clr/set while preserve rest bits */
static inline void spacemit_sdhci_setbits(struct sdhci_host *host, u32 val, int reg)
{
sdhci_writel(host, sdhci_readl(host, reg) | val, reg);
}
static inline void spacemit_sdhci_clrbits(struct sdhci_host *host, u32 val, int reg)
{
sdhci_writel(host, sdhci_readl(host, reg) & ~val, reg);
}
static inline void spacemit_sdhci_clrsetbits(struct sdhci_host *host, u32 clr, u32 set, int reg)
{
u32 val = sdhci_readl(host, reg);
val = (val & ~clr) | set;
sdhci_writel(host, val, reg);
}
static void spacemit_sdhci_set_rx_delay(struct sdhci_host *host, u8 delay)
{
spacemit_sdhci_clrsetbits(host, SDHC_RX_DLINE_CODE_MASK,
FIELD_PREP(SDHC_RX_DLINE_CODE_MASK, delay),
SPACEMIT_SDHC_DLINE_CTRL_REG);
}
static void spacemit_sdhci_set_tx_delay(struct sdhci_host *host, u8 delay)
{
spacemit_sdhci_clrsetbits(host, SDHC_TX_DLINE_CODE_MASK,
FIELD_PREP(SDHC_TX_DLINE_CODE_MASK, delay),
SPACEMIT_SDHC_DLINE_CTRL_REG);
}
static void spacemit_sdhci_set_tx_dline_reg(struct sdhci_host *host, u8 dline_reg)
{
spacemit_sdhci_clrsetbits(host, SDHC_TX_DLINE_REG_MASK,
FIELD_PREP(SDHC_TX_DLINE_REG_MASK, dline_reg),
SPACEMIT_SDHC_DLINE_CFG_REG);
}
static void spacemit_sdhci_tx_tuning_prepare(struct sdhci_host *host)
{
spacemit_sdhci_setbits(host, SDHC_TX_MUX_SEL, SPACEMIT_SDHC_TX_CFG_REG);
spacemit_sdhci_setbits(host, SDHC_DLINE_PU, SPACEMIT_SDHC_DLINE_CTRL_REG);
udelay(5);
}
static void spacemit_sdhci_prepare_tuning(struct sdhci_host *host)
{
spacemit_sdhci_clrsetbits(host, SDHC_RX_DLINE_REG_MASK,
FIELD_PREP(SDHC_RX_DLINE_REG_MASK, SPACEMIT_RX_DLINE_REG),
SPACEMIT_SDHC_DLINE_CFG_REG);
spacemit_sdhci_setbits(host, SDHC_DLINE_PU, SPACEMIT_SDHC_DLINE_CTRL_REG);
udelay(5);
spacemit_sdhci_clrsetbits(host, SDHC_RX_SDCLK_SEL1_MASK, SDHC_RX_SDCLK_SEL1,
SPACEMIT_SDHC_RX_CFG_REG);
if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200)
spacemit_sdhci_setbits(host, SDHC_HS200_USE_RFIFO, SPACEMIT_SDHC_PHY_FUNC_REG);
}
static void spacemit_sdhci_reset(struct sdhci_host *host, u8 mask)
{
sdhci_reset(host, mask);
if (mask != SDHCI_RESET_ALL)
return;
spacemit_sdhci_setbits(host, SDHC_PHY_FUNC_EN | SDHC_PHY_PLL_LOCK,
SPACEMIT_SDHC_PHY_CTRL_REG);
spacemit_sdhci_clrsetbits(host, SDHC_PHY_DRIVE_SEL,
SDHC_RX_BIAS_CTRL | FIELD_PREP(SDHC_PHY_DRIVE_SEL, 4),
SPACEMIT_SDHC_PHY_PADCFG_REG);
if (!(host->mmc->caps2 & MMC_CAP2_NO_MMC))
spacemit_sdhci_setbits(host, SDHC_MMC_CARD_MODE, SPACEMIT_SDHC_MMC_CTRL_REG);
spacemit_sdhci_setbits(host, SDHC_GEN_PAD_CLK_ON, SPACEMIT_SDHC_LEGACY_CTRL_REG);
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/clk.h`, `linux/delay.h`, `linux/iopoll.h`, `linux/init.h`, `linux/mmc/card.h`, `linux/mmc/host.h`, `linux/mmc/mmc.h`.
- Detected declarations: `struct spacemit_sdhci_host`, `function spacemit_sdhci_setbits`, `function spacemit_sdhci_clrbits`, `function spacemit_sdhci_clrsetbits`, `function spacemit_sdhci_set_rx_delay`, `function spacemit_sdhci_set_tx_delay`, `function spacemit_sdhci_set_tx_dline_reg`, `function spacemit_sdhci_tx_tuning_prepare`, `function spacemit_sdhci_prepare_tuning`, `function spacemit_sdhci_reset`.
- Atlas domain: Driver Families / drivers/mmc.
- 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.