drivers/bus/mhi/ep/mmio.c
Source file repositories/reference/linux-study-clean/drivers/bus/mhi/ep/mmio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/bus/mhi/ep/mmio.c- Extension
.c- Size
- 7109 bytes
- Lines
- 274
- Domain
- Driver Families
- Bucket
- drivers/bus
- 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/io.hlinux/mhi_ep.hinternal.h
Detected Declarations
function Copyrightfunction mhi_ep_mmio_writefunction mhi_ep_mmio_masked_writefunction mhi_ep_mmio_masked_readfunction mhi_ep_mmio_get_mhi_statefunction mhi_ep_mmio_set_chdbfunction mhi_ep_mmio_enable_chdbfunction mhi_ep_mmio_disable_chdbfunction mhi_ep_mmio_set_chdb_interruptsfunction mhi_ep_mmio_enable_chdb_interruptsfunction mhi_ep_mmio_mask_chdb_interruptsfunction mhi_ep_mmio_read_chdb_status_interruptsfunction mhi_ep_mmio_set_erdb_interruptsfunction mhi_ep_mmio_mask_erdb_interruptsfunction mhi_ep_mmio_enable_ctrl_interruptfunction mhi_ep_mmio_disable_ctrl_interruptfunction mhi_ep_mmio_enable_cmdb_interruptfunction mhi_ep_mmio_disable_cmdb_interruptfunction mhi_ep_mmio_mask_interruptsfunction mhi_ep_mmio_clear_interruptsfunction mhi_ep_mmio_get_chc_basefunction mhi_ep_mmio_get_erc_basefunction mhi_ep_mmio_get_crc_basefunction mhi_ep_mmio_get_dbfunction mhi_ep_mmio_set_envfunction mhi_ep_mmio_clear_resetfunction mhi_ep_mmio_resetfunction mhi_ep_mmio_initfunction mhi_ep_mmio_update_ner
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2022 Linaro Ltd.
* Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
*/
#include <linux/bitfield.h>
#include <linux/io.h>
#include <linux/mhi_ep.h>
#include "internal.h"
u32 mhi_ep_mmio_read(struct mhi_ep_cntrl *mhi_cntrl, u32 offset)
{
return readl(mhi_cntrl->mmio + offset);
}
void mhi_ep_mmio_write(struct mhi_ep_cntrl *mhi_cntrl, u32 offset, u32 val)
{
writel(val, mhi_cntrl->mmio + offset);
}
void mhi_ep_mmio_masked_write(struct mhi_ep_cntrl *mhi_cntrl, u32 offset, u32 mask, u32 val)
{
u32 regval;
regval = mhi_ep_mmio_read(mhi_cntrl, offset);
regval &= ~mask;
regval |= (val << __ffs(mask)) & mask;
mhi_ep_mmio_write(mhi_cntrl, offset, regval);
}
u32 mhi_ep_mmio_masked_read(struct mhi_ep_cntrl *dev, u32 offset, u32 mask)
{
u32 regval;
regval = mhi_ep_mmio_read(dev, offset);
regval &= mask;
regval >>= __ffs(mask);
return regval;
}
void mhi_ep_mmio_get_mhi_state(struct mhi_ep_cntrl *mhi_cntrl, enum mhi_state *state,
bool *mhi_reset)
{
u32 regval;
regval = mhi_ep_mmio_read(mhi_cntrl, EP_MHICTRL);
*state = FIELD_GET(MHICTRL_MHISTATE_MASK, regval);
*mhi_reset = !!FIELD_GET(MHICTRL_RESET_MASK, regval);
}
static void mhi_ep_mmio_set_chdb(struct mhi_ep_cntrl *mhi_cntrl, u32 ch_id, bool enable)
{
u32 chid_mask, chid_shift, chdb_idx, val;
chid_shift = ch_id % 32;
chid_mask = BIT(chid_shift);
chdb_idx = ch_id / 32;
val = enable ? 1 : 0;
mhi_ep_mmio_masked_write(mhi_cntrl, MHI_CHDB_INT_MASK_n(chdb_idx), chid_mask, val);
/* Update the local copy of the channel mask */
mhi_cntrl->chdb[chdb_idx].mask &= ~chid_mask;
mhi_cntrl->chdb[chdb_idx].mask |= val << chid_shift;
}
void mhi_ep_mmio_enable_chdb(struct mhi_ep_cntrl *mhi_cntrl, u32 ch_id)
{
mhi_ep_mmio_set_chdb(mhi_cntrl, ch_id, true);
}
void mhi_ep_mmio_disable_chdb(struct mhi_ep_cntrl *mhi_cntrl, u32 ch_id)
{
mhi_ep_mmio_set_chdb(mhi_cntrl, ch_id, false);
}
static void mhi_ep_mmio_set_chdb_interrupts(struct mhi_ep_cntrl *mhi_cntrl, bool enable)
{
u32 val, i;
val = enable ? MHI_CHDB_INT_MASK_n_EN_ALL : 0;
for (i = 0; i < MHI_MASK_ROWS_CH_DB; i++) {
mhi_ep_mmio_write(mhi_cntrl, MHI_CHDB_INT_MASK_n(i), val);
mhi_cntrl->chdb[i].mask = val;
}
Annotation
- Immediate include surface: `linux/bitfield.h`, `linux/io.h`, `linux/mhi_ep.h`, `internal.h`.
- Detected declarations: `function Copyright`, `function mhi_ep_mmio_write`, `function mhi_ep_mmio_masked_write`, `function mhi_ep_mmio_masked_read`, `function mhi_ep_mmio_get_mhi_state`, `function mhi_ep_mmio_set_chdb`, `function mhi_ep_mmio_enable_chdb`, `function mhi_ep_mmio_disable_chdb`, `function mhi_ep_mmio_set_chdb_interrupts`, `function mhi_ep_mmio_enable_chdb_interrupts`.
- Atlas domain: Driver Families / drivers/bus.
- 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.