drivers/gpu/drm/mediatek/mtk_disp_merge.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/mediatek/mtk_disp_merge.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/mediatek/mtk_disp_merge.c
Extension
.c
Size
11155 bytes
Lines
377
Domain
Driver Families
Bucket
drivers/gpu
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 mtk_disp_merge {
	void __iomem			*regs;
	struct clk			*clk;
	struct clk			*async_clk;
	struct cmdq_client_reg		cmdq_reg;
	bool				fifo_en;
	bool				mute_support;
	struct reset_control		*reset_ctl;
};

void mtk_merge_start(struct device *dev)
{
	mtk_merge_start_cmdq(dev, NULL);
}

void mtk_merge_stop(struct device *dev)
{
	mtk_merge_stop_cmdq(dev, NULL);
}

void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
{
	struct mtk_disp_merge *priv = dev_get_drvdata(dev);

	if (priv->mute_support)
		mtk_ddp_write(cmdq_pkt, 0x0, &priv->cmdq_reg, priv->regs,
			      DISP_REG_MERGE_MUTE_0);

	mtk_ddp_write(cmdq_pkt, 1, &priv->cmdq_reg, priv->regs,
		      DISP_REG_MERGE_CTRL);
}

void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
{
	struct mtk_disp_merge *priv = dev_get_drvdata(dev);

	if (priv->mute_support)
		mtk_ddp_write(cmdq_pkt, 0x1, &priv->cmdq_reg, priv->regs,
			      DISP_REG_MERGE_MUTE_0);

	mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
		      DISP_REG_MERGE_CTRL);

	if (!cmdq_pkt && priv->async_clk)
		reset_control_reset(priv->reset_ctl);
}

static void mtk_merge_fifo_setting(struct mtk_disp_merge *priv,
				   struct cmdq_pkt *cmdq_pkt)
{
	mtk_ddp_write(cmdq_pkt, ULTRA_EN | PREULTRA_EN,
		      &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CFG_36);

	mtk_ddp_write_mask(cmdq_pkt, BUFFER_MODE,
			   &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CFG_37,
			   FLD_BUFFER_MODE);

	mtk_ddp_write_mask(cmdq_pkt, ULTRA_TH_LOW | ULTRA_TH_HIGH << 16,
			   &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CFG_40,
			   FLD_ULTRA_TH_LOW | FLD_ULTRA_TH_HIGH);

	mtk_ddp_write_mask(cmdq_pkt, PREULTRA_TH_LOW | PREULTRA_TH_HIGH << 16,
			   &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CFG_41,
			   FLD_PREULTRA_TH_LOW | FLD_PREULTRA_TH_HIGH);
}

void mtk_merge_config(struct device *dev, unsigned int w,
		      unsigned int h, unsigned int vrefresh,
		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
{
	mtk_merge_advance_config(dev, w, 0, h, vrefresh, bpc, cmdq_pkt);
}

void mtk_merge_advance_config(struct device *dev, unsigned int l_w, unsigned int r_w,
			      unsigned int h, unsigned int vrefresh, unsigned int bpc,
			      struct cmdq_pkt *cmdq_pkt)
{
	struct mtk_disp_merge *priv = dev_get_drvdata(dev);
	unsigned int mode = CFG_10_10_1PI_2PO_BUF_MODE;

	if (!h || !l_w) {
		dev_err(dev, "%s: input width(%d) or height(%d) is invalid\n", __func__, l_w, h);
		return;
	}

	if (priv->fifo_en) {
		mtk_merge_fifo_setting(priv, cmdq_pkt);
		mode = CFG_10_10_2PI_2PO_BUF_MODE;
	}

Annotation

Implementation Notes