Commit 1d33f13a authored by CK Hu's avatar CK Hu Committed by Chun-Kuang Hu
Browse files

drm/mediatek: DRM driver directly refer to sub driver's function



Some ddp component exist in both display path and other path, so
sub driver should not directly call DRM driver's function. Let
DRM driver directly refer to sub driver's function so that sub
driver need not register these function to DRM driver.

Signed-off-by: default avatarCK Hu <ck.hu@mediatek.com>
Signed-off-by: default avatarChun-Kuang Hu <chunkuang.hu@kernel.org>
parent 9b070498
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/platform_device.h>
#include <linux/soc/mediatek/mtk-cmdq.h>

#include "mtk_disp_drv.h"
#include "mtk_drm_crtc.h"
#include "mtk_drm_ddp_comp.h"

@@ -44,21 +45,21 @@ struct mtk_disp_color {
	const struct mtk_disp_color_data	*data;
};

static int mtk_color_clk_enable(struct device *dev)
int mtk_color_clk_enable(struct device *dev)
{
	struct mtk_disp_color *color = dev_get_drvdata(dev);

	return clk_prepare_enable(color->clk);
}

static void mtk_color_clk_disable(struct device *dev)
void mtk_color_clk_disable(struct device *dev)
{
	struct mtk_disp_color *color = dev_get_drvdata(dev);

	clk_disable_unprepare(color->clk);
}

static void mtk_color_config(struct device *dev, unsigned int w,
void mtk_color_config(struct device *dev, unsigned int w,
		      unsigned int h, unsigned int vrefresh,
		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
{
@@ -68,7 +69,7 @@ static void mtk_color_config(struct device *dev, unsigned int w,
	mtk_ddp_write(cmdq_pkt, h, &color->cmdq_reg, color->regs, DISP_COLOR_HEIGHT(color));
}

static void mtk_color_start(struct device *dev)
void mtk_color_start(struct device *dev)
{
	struct mtk_disp_color *color = dev_get_drvdata(dev);

@@ -77,13 +78,6 @@ static void mtk_color_start(struct device *dev)
	writel(0x1, color->regs + DISP_COLOR_START(color));
}

static const struct mtk_ddp_comp_funcs mtk_disp_color_funcs = {
	.clk_enable = mtk_color_clk_enable,
	.clk_disable = mtk_color_clk_disable,
	.config = mtk_color_config,
	.start = mtk_color_start,
};

static int mtk_disp_color_bind(struct device *dev, struct device *master,
			       void *data)
{
@@ -151,8 +145,7 @@ static int mtk_disp_color_probe(struct platform_device *pdev)
		return comp_id;
	}

	ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id,
				&mtk_disp_color_funcs);
	ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id);
	if (ret) {
		if (ret != -EPROBE_DEFER)
			dev_err(dev, "Failed to initialize component: %d\n",
+69 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2020 MediaTek Inc.
 */

#ifndef _MTK_DISP_DRV_H_
#define _MTK_DISP_DRV_H_

#include <linux/soc/mediatek/mtk-cmdq.h>
#include "mtk_drm_plane.h"

void mtk_color_bypass_shadow(struct device *dev);
int mtk_color_clk_enable(struct device *dev);
void mtk_color_clk_disable(struct device *dev);
void mtk_color_config(struct device *dev, unsigned int w,
		      unsigned int h, unsigned int vrefresh,
		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
void mtk_color_start(struct device *dev);

void mtk_dpi_start(struct device *dev);
void mtk_dpi_stop(struct device *dev);

void mtk_dsi_ddp_start(struct device *dev);
void mtk_dsi_ddp_stop(struct device *dev);

void mtk_ovl_bgclr_in_on(struct device *dev);
void mtk_ovl_bgclr_in_off(struct device *dev);
void mtk_ovl_bypass_shadow(struct device *dev);
int mtk_ovl_clk_enable(struct device *dev);
void mtk_ovl_clk_disable(struct device *dev);
void mtk_ovl_config(struct device *dev, unsigned int w,
		    unsigned int h, unsigned int vrefresh,
		    unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
			struct mtk_plane_state *mtk_state);
void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
			  struct mtk_plane_state *state,
			  struct cmdq_pkt *cmdq_pkt);
unsigned int mtk_ovl_layer_nr(struct device *dev);
void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
		      struct cmdq_pkt *cmdq_pkt);
void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
		       struct cmdq_pkt *cmdq_pkt);
void mtk_ovl_start(struct device *dev);
void mtk_ovl_stop(struct device *dev);
unsigned int mtk_ovl_supported_rotations(struct device *dev);
void mtk_ovl_enable_vblank(struct device *dev,
			   void (*vblank_cb)(void *),
			   void *vblank_cb_data);
void mtk_ovl_disable_vblank(struct device *dev);

void mtk_rdma_bypass_shadow(struct device *dev);
int mtk_rdma_clk_enable(struct device *dev);
void mtk_rdma_clk_disable(struct device *dev);
void mtk_rdma_config(struct device *dev, unsigned int width,
		     unsigned int height, unsigned int vrefresh,
		     unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
unsigned int mtk_rdma_layer_nr(struct device *dev);
void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
			   struct mtk_plane_state *state,
			   struct cmdq_pkt *cmdq_pkt);
void mtk_rdma_start(struct device *dev);
void mtk_rdma_stop(struct device *dev);
void mtk_rdma_enable_vblank(struct device *dev,
			    void (*vblank_cb)(void *),
			    void *vblank_cb_data);
void mtk_rdma_disable_vblank(struct device *dev);

#endif
+26 −42
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/platform_device.h>
#include <linux/soc/mediatek/mtk-cmdq.h>

#include "mtk_disp_drv.h"
#include "mtk_drm_crtc.h"
#include "mtk_drm_ddp_comp.h"

@@ -95,7 +96,7 @@ static irqreturn_t mtk_disp_ovl_irq_handler(int irq, void *dev_id)
	return IRQ_HANDLED;
}

static void mtk_ovl_enable_vblank(struct device *dev,
void mtk_ovl_enable_vblank(struct device *dev,
			   void (*vblank_cb)(void *),
			   void *vblank_cb_data)
{
@@ -107,7 +108,7 @@ static void mtk_ovl_enable_vblank(struct device *dev,
	writel_relaxed(OVL_FME_CPL_INT, ovl->regs + DISP_REG_OVL_INTEN);
}

static void mtk_ovl_disable_vblank(struct device *dev)
void mtk_ovl_disable_vblank(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);

@@ -116,35 +117,35 @@ static void mtk_ovl_disable_vblank(struct device *dev)
	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
}

static int mtk_ovl_clk_enable(struct device *dev)
int mtk_ovl_clk_enable(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);

	return clk_prepare_enable(ovl->clk);
}

static void mtk_ovl_clk_disable(struct device *dev)
void mtk_ovl_clk_disable(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);

	clk_disable_unprepare(ovl->clk);
}

static void mtk_ovl_start(struct device *dev)
void mtk_ovl_start(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);

	writel_relaxed(0x1, ovl->regs + DISP_REG_OVL_EN);
}

static void mtk_ovl_stop(struct device *dev)
void mtk_ovl_stop(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);

	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_EN);
}

static void mtk_ovl_config(struct device *dev, unsigned int w,
void mtk_ovl_config(struct device *dev, unsigned int w,
		    unsigned int h, unsigned int vrefresh,
		    unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
{
@@ -159,20 +160,20 @@ static void mtk_ovl_config(struct device *dev, unsigned int w,
	mtk_ddp_write(cmdq_pkt, 0x0, &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_RST);
}

static unsigned int mtk_ovl_layer_nr(struct device *dev)
unsigned int mtk_ovl_layer_nr(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);

	return ovl->data->layer_nr;
}

static unsigned int mtk_ovl_supported_rotations(struct device *dev)
unsigned int mtk_ovl_supported_rotations(struct device *dev)
{
	return DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
	       DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y;
}

static int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
			struct mtk_plane_state *mtk_state)
{
	struct drm_plane_state *state = &mtk_state->base;
@@ -200,7 +201,7 @@ static int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
	return 0;
}

static void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
		      struct cmdq_pkt *cmdq_pkt)
{
	unsigned int gmc_thrshd_l;
@@ -225,7 +226,7 @@ static void mtk_ovl_layer_on(struct device *dev, unsigned int idx,
			   DISP_REG_OVL_SRC_CON, BIT(idx));
}

static void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
		       struct cmdq_pkt *cmdq_pkt)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
@@ -272,7 +273,7 @@ static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt)
	}
}

static void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
			  struct mtk_plane_state *state,
			  struct cmdq_pkt *cmdq_pkt)
{
@@ -318,7 +319,7 @@ static void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
	mtk_ovl_layer_on(dev, idx, cmdq_pkt);
}

static void mtk_ovl_bgclr_in_on(struct device *dev)
void mtk_ovl_bgclr_in_on(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
	unsigned int reg;
@@ -328,7 +329,7 @@ static void mtk_ovl_bgclr_in_on(struct device *dev)
	writel(reg, ovl->regs + DISP_REG_OVL_DATAPATH_CON);
}

static void mtk_ovl_bgclr_in_off(struct device *dev)
void mtk_ovl_bgclr_in_off(struct device *dev)
{
	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
	unsigned int reg;
@@ -338,22 +339,6 @@ static void mtk_ovl_bgclr_in_off(struct device *dev)
	writel(reg, ovl->regs + DISP_REG_OVL_DATAPATH_CON);
}

static const struct mtk_ddp_comp_funcs mtk_disp_ovl_funcs = {
	.clk_enable = mtk_ovl_clk_enable,
	.clk_disable = mtk_ovl_clk_disable,
	.config = mtk_ovl_config,
	.start = mtk_ovl_start,
	.stop = mtk_ovl_stop,
	.enable_vblank = mtk_ovl_enable_vblank,
	.disable_vblank = mtk_ovl_disable_vblank,
	.supported_rotations = mtk_ovl_supported_rotations,
	.layer_nr = mtk_ovl_layer_nr,
	.layer_check = mtk_ovl_layer_check,
	.layer_config = mtk_ovl_layer_config,
	.bgclr_in_on = mtk_ovl_bgclr_in_on,
	.bgclr_in_off = mtk_ovl_bgclr_in_off,
};

static int mtk_disp_ovl_bind(struct device *dev, struct device *master,
			     void *data)
{
@@ -431,8 +416,7 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
		return comp_id;
	}

	ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id,
				&mtk_disp_ovl_funcs);
	ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id);
	if (ret) {
		if (ret != -EPROBE_DEFER)
			dev_err(dev, "Failed to initialize component: %d\n",
+17 −29
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/platform_device.h>
#include <linux/soc/mediatek/mtk-cmdq.h>

#include "mtk_disp_drv.h"
#include "mtk_drm_crtc.h"
#include "mtk_drm_ddp_comp.h"

@@ -95,7 +96,7 @@ static void rdma_update_bits(struct device *dev, unsigned int reg,
	writel(tmp, rdma->regs + reg);
}

static void mtk_rdma_enable_vblank(struct device *dev,
void mtk_rdma_enable_vblank(struct device *dev,
			    void (*vblank_cb)(void *),
			    void *vblank_cb_data)
{
@@ -107,7 +108,7 @@ static void mtk_rdma_enable_vblank(struct device *dev,
			 RDMA_FRAME_END_INT);
}

static void mtk_rdma_disable_vblank(struct device *dev)
void mtk_rdma_disable_vblank(struct device *dev)
{
	struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);

@@ -116,32 +117,32 @@ static void mtk_rdma_disable_vblank(struct device *dev)
	rdma_update_bits(dev, DISP_REG_RDMA_INT_ENABLE, RDMA_FRAME_END_INT, 0);
}

static int mtk_rdma_clk_enable(struct device *dev)
int mtk_rdma_clk_enable(struct device *dev)
{
	struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);

	return clk_prepare_enable(rdma->clk);
}

static void mtk_rdma_clk_disable(struct device *dev)
void mtk_rdma_clk_disable(struct device *dev)
{
	struct mtk_disp_rdma *rdma = dev_get_drvdata(dev);

	clk_disable_unprepare(rdma->clk);
}

static void mtk_rdma_start(struct device *dev)
void mtk_rdma_start(struct device *dev)
{
	rdma_update_bits(dev, DISP_REG_RDMA_GLOBAL_CON, RDMA_ENGINE_EN,
			 RDMA_ENGINE_EN);
}

static void mtk_rdma_stop(struct device *dev)
void mtk_rdma_stop(struct device *dev)
{
	rdma_update_bits(dev, DISP_REG_RDMA_GLOBAL_CON, RDMA_ENGINE_EN, 0);
}

static void mtk_rdma_config(struct device *dev, unsigned int width,
void mtk_rdma_config(struct device *dev, unsigned int width,
		     unsigned int height, unsigned int vrefresh,
		     unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
{
@@ -204,12 +205,12 @@ static unsigned int rdma_fmt_convert(struct mtk_disp_rdma *rdma,
	}
}

static unsigned int mtk_rdma_layer_nr(struct device *dev)
unsigned int mtk_rdma_layer_nr(struct device *dev)
{
	return 1;
}

static void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
void mtk_rdma_layer_config(struct device *dev, unsigned int idx,
			   struct mtk_plane_state *state,
			   struct cmdq_pkt *cmdq_pkt)
{
@@ -246,18 +247,6 @@ static void mtk_rdma_layer_config(struct device *dev, unsigned int idx,

}

static const struct mtk_ddp_comp_funcs mtk_disp_rdma_funcs = {
	.clk_enable = mtk_rdma_clk_enable,
	.clk_disable = mtk_rdma_clk_disable,
	.config = mtk_rdma_config,
	.start = mtk_rdma_start,
	.stop = mtk_rdma_stop,
	.enable_vblank = mtk_rdma_enable_vblank,
	.disable_vblank = mtk_rdma_disable_vblank,
	.layer_nr = mtk_rdma_layer_nr,
	.layer_config = mtk_rdma_layer_config,
};

static int mtk_disp_rdma_bind(struct device *dev, struct device *master,
			      void *data)
{
@@ -331,8 +320,7 @@ static int mtk_disp_rdma_probe(struct platform_device *pdev)
		return comp_id;
	}

	ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id,
				&mtk_disp_rdma_funcs);
	ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id);
	if (ret) {
		if (ret != -EPROBE_DEFER)
			dev_err(dev, "Failed to initialize component: %d\n",
+4 −9
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <drm/drm_of.h>
#include <drm/drm_simple_kms_helper.h>

#include "mtk_disp_drv.h"
#include "mtk_dpi_regs.h"
#include "mtk_drm_ddp_comp.h"

@@ -562,25 +563,20 @@ static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
	.enable = mtk_dpi_bridge_enable,
};

static void mtk_dpi_start(struct device *dev)
void mtk_dpi_start(struct device *dev)
{
	struct mtk_dpi *dpi = dev_get_drvdata(dev);

	mtk_dpi_power_on(dpi);
}

static void mtk_dpi_stop(struct device *dev)
void mtk_dpi_stop(struct device *dev)
{
	struct mtk_dpi *dpi = dev_get_drvdata(dev);

	mtk_dpi_power_off(dpi);
}

static const struct mtk_ddp_comp_funcs mtk_dpi_funcs = {
	.start = mtk_dpi_start,
	.stop = mtk_dpi_stop,
};

static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
{
	struct mtk_dpi *dpi = dev_get_drvdata(dev);
@@ -775,8 +771,7 @@ static int mtk_dpi_probe(struct platform_device *pdev)
		return comp_id;
	}

	ret = mtk_ddp_comp_init(dev->of_node, &dpi->ddp_comp, comp_id,
				&mtk_dpi_funcs);
	ret = mtk_ddp_comp_init(dev->of_node, &dpi->ddp_comp, comp_id);
	if (ret) {
		dev_err(dev, "Failed to initialize component: %d\n", ret);
		return ret;
Loading