Lines Matching +full:mtk +full:- +full:gce
1 // SPDX-License-Identifier: GPL-2.0-only
14 #include <linux/soc/mediatek/mtk-cmdq.h>
15 #include <linux/soc/mediatek/mtk-mmsys.h>
106 priv->vblank_cb = vblank_cb; in mtk_ethdr_register_vblank_cb()
107 priv->vblank_cb_data = vblank_cb_data; in mtk_ethdr_register_vblank_cb()
114 priv->vblank_cb = NULL; in mtk_ethdr_unregister_vblank_cb()
115 priv->vblank_cb_data = NULL; in mtk_ethdr_unregister_vblank_cb()
122 writel(MIX_FME_CPL_INTEN, priv->ethdr_comp[ETHDR_MIXER].regs + MIX_INTEN); in mtk_ethdr_enable_vblank()
129 writel(0x0, priv->ethdr_comp[ETHDR_MIXER].regs + MIX_INTEN); in mtk_ethdr_disable_vblank()
136 writel(0x0, priv->ethdr_comp[ETHDR_MIXER].regs + MIX_INTSTA); in mtk_ethdr_irq_handler()
138 if (!priv->vblank_cb) in mtk_ethdr_irq_handler()
141 priv->vblank_cb(priv->vblank_cb_data); in mtk_ethdr_irq_handler()
151 struct mtk_ethdr_comp *mixer = &priv->ethdr_comp[ETHDR_MIXER]; in mtk_ethdr_layer_config()
152 struct mtk_plane_pending_state *pending = &state->pending; in mtk_ethdr_layer_config()
153 unsigned int offset = (pending->x & 1) << 31 | pending->y << 16 | pending->x; in mtk_ethdr_layer_config()
154 unsigned int align_width = ALIGN_DOWN(pending->width, 2); in mtk_ethdr_layer_config()
163 if (!pending->enable || !pending->width || !pending->height) { in mtk_ethdr_layer_config()
169 mtk_ddp_write(cmdq_pkt, 0, &mixer->cmdq_base, mixer->regs, MIX_L_SRC_SIZE(idx)); in mtk_ethdr_layer_config()
173 if (state->base.fb && state->base.fb->format->has_alpha) in mtk_ethdr_layer_config()
176 if (state->base.fb && !state->base.fb->format->has_alpha) { in mtk_ethdr_layer_config()
184 mtk_mmsys_mixer_in_config(priv->mmsys_dev, idx + 1, replace_src_a, in mtk_ethdr_layer_config()
186 pending->x & 1 ? MIXER_INX_MODE_EVEN_EXTEND : in mtk_ethdr_layer_config()
187 MIXER_INX_MODE_BYPASS, align_width / 2 - 1, cmdq_pkt); in mtk_ethdr_layer_config()
189 mtk_ddp_write(cmdq_pkt, pending->height << 16 | align_width, &mixer->cmdq_base, in mtk_ethdr_layer_config()
190 mixer->regs, MIX_L_SRC_SIZE(idx)); in mtk_ethdr_layer_config()
191 mtk_ddp_write(cmdq_pkt, offset, &mixer->cmdq_base, mixer->regs, MIX_L_SRC_OFFSET(idx)); in mtk_ethdr_layer_config()
192 mtk_ddp_write_mask(cmdq_pkt, alpha_con, &mixer->cmdq_base, mixer->regs, MIX_L_SRC_CON(idx), in mtk_ethdr_layer_config()
194 mtk_ddp_write_mask(cmdq_pkt, BIT(idx), &mixer->cmdq_base, mixer->regs, MIX_SRC_CON, in mtk_ethdr_layer_config()
203 struct mtk_ethdr_comp *vdo_fe0 = &priv->ethdr_comp[ETHDR_VDO_FE0]; in mtk_ethdr_config()
204 struct mtk_ethdr_comp *vdo_fe1 = &priv->ethdr_comp[ETHDR_VDO_FE1]; in mtk_ethdr_config()
205 struct mtk_ethdr_comp *gfx_fe0 = &priv->ethdr_comp[ETHDR_GFX_FE0]; in mtk_ethdr_config()
206 struct mtk_ethdr_comp *gfx_fe1 = &priv->ethdr_comp[ETHDR_GFX_FE1]; in mtk_ethdr_config()
207 struct mtk_ethdr_comp *vdo_be = &priv->ethdr_comp[ETHDR_VDO_BE]; in mtk_ethdr_config()
208 struct mtk_ethdr_comp *mixer = &priv->ethdr_comp[ETHDR_MIXER]; in mtk_ethdr_config()
210 dev_dbg(dev, "%s-w:%d, h:%d\n", __func__, w, h); in mtk_ethdr_config()
212 mtk_ddp_write(cmdq_pkt, HDR_VDO_FE_0804_BYPASS_ALL, &vdo_fe0->cmdq_base, in mtk_ethdr_config()
213 vdo_fe0->regs, HDR_VDO_FE_0804_HDR_DM_FE); in mtk_ethdr_config()
215 mtk_ddp_write(cmdq_pkt, HDR_VDO_FE_0804_BYPASS_ALL, &vdo_fe1->cmdq_base, in mtk_ethdr_config()
216 vdo_fe1->regs, HDR_VDO_FE_0804_HDR_DM_FE); in mtk_ethdr_config()
218 mtk_ddp_write(cmdq_pkt, HDR_GFX_FE_0204_BYPASS_ALL, &gfx_fe0->cmdq_base, in mtk_ethdr_config()
219 gfx_fe0->regs, HDR_GFX_FE_0204_GFX_HDR_FE); in mtk_ethdr_config()
221 mtk_ddp_write(cmdq_pkt, HDR_GFX_FE_0204_BYPASS_ALL, &gfx_fe1->cmdq_base, in mtk_ethdr_config()
222 gfx_fe1->regs, HDR_GFX_FE_0204_GFX_HDR_FE); in mtk_ethdr_config()
224 mtk_ddp_write(cmdq_pkt, HDR_VDO_BE_0204_BYPASS_ALL, &vdo_be->cmdq_base, in mtk_ethdr_config()
225 vdo_be->regs, HDR_VDO_BE_0204_VDO_DM_BE); in mtk_ethdr_config()
227 mtk_ddp_write(cmdq_pkt, MIX_FUNC_DCM_ENABLE, &mixer->cmdq_base, mixer->regs, MIX_FUNC_DCM0); in mtk_ethdr_config()
228 mtk_ddp_write(cmdq_pkt, MIX_FUNC_DCM_ENABLE, &mixer->cmdq_base, mixer->regs, MIX_FUNC_DCM1); in mtk_ethdr_config()
229 mtk_ddp_write(cmdq_pkt, h << 16 | w, &mixer->cmdq_base, mixer->regs, MIX_ROI_SIZE); in mtk_ethdr_config()
230 mtk_ddp_write(cmdq_pkt, BGCLR_BLACK, &mixer->cmdq_base, mixer->regs, MIX_ROI_BGCLR); in mtk_ethdr_config()
231 mtk_ddp_write(cmdq_pkt, NON_PREMULTI_SOURCE, &mixer->cmdq_base, mixer->regs, in mtk_ethdr_config()
233 mtk_ddp_write(cmdq_pkt, NON_PREMULTI_SOURCE, &mixer->cmdq_base, mixer->regs, in mtk_ethdr_config()
235 mtk_ddp_write(cmdq_pkt, NON_PREMULTI_SOURCE, &mixer->cmdq_base, mixer->regs, in mtk_ethdr_config()
237 mtk_ddp_write(cmdq_pkt, NON_PREMULTI_SOURCE, &mixer->cmdq_base, mixer->regs, in mtk_ethdr_config()
239 mtk_ddp_write(cmdq_pkt, 0x0, &mixer->cmdq_base, mixer->regs, MIX_L_SRC_SIZE(0)); in mtk_ethdr_config()
241 &mixer->cmdq_base, mixer->regs, MIX_DATAPATH_CON); in mtk_ethdr_config()
242 mtk_ddp_write_mask(cmdq_pkt, MIX_SRC_L0_EN, &mixer->cmdq_base, mixer->regs, in mtk_ethdr_config()
245 mtk_mmsys_hdr_config(priv->mmsys_dev, w / 2, h, cmdq_pkt); in mtk_ethdr_config()
246 mtk_mmsys_mixer_in_channel_swap(priv->mmsys_dev, 4, 0, cmdq_pkt); in mtk_ethdr_config()
252 struct mtk_ethdr_comp *mixer = &priv->ethdr_comp[ETHDR_MIXER]; in mtk_ethdr_start()
254 writel(1, mixer->regs + MIX_EN); in mtk_ethdr_start()
260 struct mtk_ethdr_comp *mixer = &priv->ethdr_comp[ETHDR_MIXER]; in mtk_ethdr_stop()
262 writel(0, mixer->regs + MIX_EN); in mtk_ethdr_stop()
263 writel(1, mixer->regs + MIX_RST); in mtk_ethdr_stop()
264 reset_control_reset(priv->reset_ctl); in mtk_ethdr_stop()
265 writel(0, mixer->regs + MIX_RST); in mtk_ethdr_stop()
273 ret = clk_bulk_prepare_enable(ETHDR_CLK_NUM, priv->ethdr_clk); in mtk_ethdr_clk_enable()
284 clk_bulk_disable_unprepare(ETHDR_CLK_NUM, priv->ethdr_clk); in mtk_ethdr_clk_disable()
292 priv->mmsys_dev = data; in mtk_ethdr_bind()
307 struct device *dev = &pdev->dev; in mtk_ethdr_probe()
314 return -ENOMEM; in mtk_ethdr_probe()
317 priv->ethdr_comp[i].dev = dev; in mtk_ethdr_probe()
318 priv->ethdr_comp[i].regs = of_iomap(dev->of_node, i); in mtk_ethdr_probe()
321 &priv->ethdr_comp[i].cmdq_base, i); in mtk_ethdr_probe()
323 dev_dbg(dev, "get mediatek,gce-client-reg fail!\n"); in mtk_ethdr_probe()
325 dev_dbg(dev, "[DRM]regs:0x%p, node:%d\n", priv->ethdr_comp[i].regs, i); in mtk_ethdr_probe()
329 priv->ethdr_clk[i].id = ethdr_clk_str[i]; in mtk_ethdr_probe()
330 ret = devm_clk_bulk_get_optional(dev, ETHDR_CLK_NUM, priv->ethdr_clk); in mtk_ethdr_probe()
334 priv->irq = platform_get_irq(pdev, 0); in mtk_ethdr_probe()
335 if (priv->irq < 0) in mtk_ethdr_probe()
336 priv->irq = 0; in mtk_ethdr_probe()
338 if (priv->irq) { in mtk_ethdr_probe()
339 ret = devm_request_irq(dev, priv->irq, mtk_ethdr_irq_handler, in mtk_ethdr_probe()
342 dev_err(dev, "Failed to request irq %d: %d\n", priv->irq, ret); in mtk_ethdr_probe()
347 priv->reset_ctl = devm_reset_control_array_get_optional_exclusive(dev); in mtk_ethdr_probe()
348 if (IS_ERR(priv->reset_ctl)) { in mtk_ethdr_probe()
349 dev_err_probe(dev, PTR_ERR(priv->reset_ctl), "cannot get ethdr reset control\n"); in mtk_ethdr_probe()
350 return PTR_ERR(priv->reset_ctl); in mtk_ethdr_probe()
364 component_del(&pdev->dev, &mtk_ethdr_component_ops); in mtk_ethdr_remove()
369 { .compatible = "mediatek,mt8195-disp-ethdr"},
379 .name = "mediatek-disp-ethdr",