drivers/soc/mediatek/mtk-pmic-wrap.c

Source file repositories/reference/linux-study-clean/drivers/soc/mediatek/mtk-pmic-wrap.c

File Facts

System
Linux kernel
Corpus path
drivers/soc/mediatek/mtk-pmic-wrap.c
Extension
.c
Size
70783 bytes
Lines
2618
Domain
Driver Families
Bucket
drivers/soc
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct pwrap_slv_regops {
	const struct regmap_config *regmap;
	/*
	 * pwrap operations are highly associated with the PMIC types,
	 * so the pointers added increases flexibility allowing determination
	 * which type is used by the detection through device tree.
	 */
	int (*pwrap_read)(struct pmic_wrapper *wrp, u32 adr, u32 *rdata);
	int (*pwrap_write)(struct pmic_wrapper *wrp, u32 adr, u32 wdata);
};

/**
 * struct pwrap_slv_type - PMIC device wrapper definitions
 * @dew_regs:      Device Wrapper (DeW) register offsets
 * @type:          PMIC Type (model)
 * @comp_dew_regs: Device Wrapper (DeW) register offsets for companion device
 * @comp_type:     Companion PMIC Type (model)
 * @regops:        Register R/W ops
 * @caps:          Capability flags for the target device
 */
struct pwrap_slv_type {
	const u32 *dew_regs;
	enum pmic_type type;
	const u32 *comp_dew_regs;
	enum pmic_type comp_type;
	const struct pwrap_slv_regops *regops;
	u32 caps;
};

struct pmic_wrapper {
	struct device *dev;
	void __iomem *base;
	struct regmap *regmap;
	const struct pmic_wrapper_type *master;
	const struct pwrap_slv_type *slave;
	struct reset_control *rstc;

	struct reset_control *rstc_bridge;
	void __iomem *bridge_base;
};

struct pmic_wrapper_type {
	const int *regs;
	enum pwrap_type type;
	u32 arb_en_all;
	u32 int_en_all;
	u32 int1_en_all;
	u32 spi_w;
	u32 wdt_src;
	/* Flags indicating the capability for the target pwrap */
	u32 caps;
	int (*init_reg_clock)(struct pmic_wrapper *wrp);
	int (*init_soc_specific)(struct pmic_wrapper *wrp);
};

static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg)
{
	return readl(wrp->base + wrp->master->regs[reg]);
}

static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg)
{
	writel(val, wrp->base + wrp->master->regs[reg]);
}

static u32 pwrap_get_fsm_state(struct pmic_wrapper *wrp)
{
	u32 val;

	val = pwrap_readl(wrp, PWRAP_WACS2_RDATA);
	if (HAS_CAP(wrp->master->caps, PWRAP_CAP_ARB))
		return PWRAP_GET_WACS_ARB_FSM(val);
	else
		return PWRAP_GET_WACS_FSM(val);
}

static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp)
{
	return pwrap_get_fsm_state(wrp) == PWRAP_WACS_FSM_IDLE;
}

static bool pwrap_is_fsm_vldclr(struct pmic_wrapper *wrp)
{
	return pwrap_get_fsm_state(wrp) == PWRAP_WACS_FSM_WFVLDCLR;
}

/*
 * Timeout issue sometimes caused by the last read command
 * failed because pmic wrap could not got the FSM_VLDCLR
 * in time after finishing WACS2_CMD. It made state machine

Annotation

Implementation Notes