| From 4cb0442ba74afacf62b066530853aa10c5715db7 Mon Sep 17 00:00:00 2001 |
| From: Yongqiang Niu <yongqiang.niu@mediatek.com> |
| Date: Fri, 16 Jul 2021 14:32:21 +0800 |
| Subject: [PATCH] FROMLIST: drm/mediatek: Separate aal module |
| |
| mt8183 aal has no gamma function |
| |
| Signed-off-by: Yongqiang Niu <yongqiang.niu@mediatek.com> |
| Tested-by: Hsin-Yi Wang <hsinyi@chromium.org> |
| |
| (am from https://patchwork.kernel.org/project/linux-mediatek/patch/1626417143-8015-2-git-send-email-yongqiang.niu@mediatek.com/) |
| |
| BUG=b:126008314 |
| TEST=boot krane |
| |
| Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> |
| Change-Id: I9cf29fa6b07ba1363beab3770e778323fed1ec56 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3033982 |
| Commit-Queue: Suleiman Souhlal <suleiman@chromium.org> |
| Reviewed-by: Sean Paul <seanpaul@chromium.org> |
| Reviewed-by: Suleiman Souhlal <suleiman@chromium.org> |
| --- |
| drivers/gpu/drm/mediatek/Makefile | 3 +- |
| drivers/gpu/drm/mediatek/mtk_disp_aal.c | 166 ++++++++++++++++++++ |
| drivers/gpu/drm/mediatek/mtk_disp_drv.h | 9 ++ |
| drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 44 +----- |
| drivers/gpu/drm/mediatek/mtk_drm_drv.c | 6 +- |
| drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + |
| 6 files changed, 186 insertions(+), 43 deletions(-) |
| create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_aal.c |
| |
| diff --git a/drivers/gpu/drm/mediatek/Makefile b/drivers/gpu/drm/mediatek/Makefile |
| --- a/drivers/gpu/drm/mediatek/Makefile |
| +++ b/drivers/gpu/drm/mediatek/Makefile |
| @@ -1,6 +1,7 @@ |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| -mediatek-drm-y := mtk_disp_ccorr.o \ |
| +mediatek-drm-y := mtk_disp_aal.o \ |
| + mtk_disp_ccorr.o \ |
| mtk_disp_color.o \ |
| mtk_disp_gamma.o \ |
| mtk_disp_ovl.o \ |
| diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c b/drivers/gpu/drm/mediatek/mtk_disp_aal.c |
| new file mode 100644 |
| --- /dev/null |
| +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c |
| @@ -0,0 +1,166 @@ |
| +// SPDX-License-Identifier: GPL-2.0-only |
| +/* |
| + * Copyright (c) 2021 MediaTek Inc. |
| + */ |
| + |
| +#include <linux/clk.h> |
| +#include <linux/component.h> |
| +#include <linux/module.h> |
| +#include <linux/of_device.h> |
| +#include <linux/of_irq.h> |
| +#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" |
| + |
| +#define DISP_AAL_EN 0x0000 |
| +#define AAL_EN BIT(0) |
| +#define DISP_AAL_SIZE 0x0030 |
| + |
| + |
| +struct mtk_disp_aal_data { |
| + bool has_gamma; |
| +}; |
| + |
| +/** |
| + * struct mtk_disp_aal - DISP_AAL driver structure |
| + * @ddp_comp - structure containing type enum and hardware resources |
| + * @crtc - associated crtc to report irq events to |
| + */ |
| +struct mtk_disp_aal { |
| + struct clk *clk; |
| + void __iomem *regs; |
| + struct cmdq_client_reg cmdq_reg; |
| + const struct mtk_disp_aal_data *data; |
| +}; |
| + |
| +int mtk_aal_clk_enable(struct device *dev) |
| +{ |
| + struct mtk_disp_aal *aal = dev_get_drvdata(dev); |
| + |
| + return clk_prepare_enable(aal->clk); |
| +} |
| + |
| +void mtk_aal_clk_disable(struct device *dev) |
| +{ |
| + struct mtk_disp_aal *aal = dev_get_drvdata(dev); |
| + |
| + clk_disable_unprepare(aal->clk); |
| +} |
| + |
| +void mtk_aal_config(struct device *dev, unsigned int w, |
| + unsigned int h, unsigned int vrefresh, |
| + unsigned int bpc, struct cmdq_pkt *cmdq_pkt) |
| +{ |
| + struct mtk_disp_aal *aal = dev_get_drvdata(dev); |
| + |
| + mtk_ddp_write(cmdq_pkt, w << 16 | h, &aal->cmdq_reg, aal->regs, DISP_AAL_SIZE); |
| +} |
| + |
| +void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state) |
| +{ |
| + struct mtk_disp_aal *aal = dev_get_drvdata(dev); |
| + |
| + if (aal->data && aal->data->has_gamma) |
| + mtk_gamma_set_common(aal->regs, state); |
| +} |
| + |
| +void mtk_aal_start(struct device *dev) |
| +{ |
| + struct mtk_disp_aal *aal = dev_get_drvdata(dev); |
| + |
| + writel(AAL_EN, aal->regs + DISP_AAL_EN); |
| +} |
| + |
| +void mtk_aal_stop(struct device *dev) |
| +{ |
| + struct mtk_disp_aal *aal = dev_get_drvdata(dev); |
| + |
| + writel_relaxed(0x0, aal->regs + DISP_AAL_EN); |
| +} |
| + |
| +static int mtk_disp_aal_bind(struct device *dev, struct device *master, |
| + void *data) |
| +{ |
| + return 0; |
| +} |
| + |
| +static void mtk_disp_aal_unbind(struct device *dev, struct device *master, |
| + void *data) |
| +{ |
| +} |
| + |
| +static const struct component_ops mtk_disp_aal_component_ops = { |
| + .bind = mtk_disp_aal_bind, |
| + .unbind = mtk_disp_aal_unbind, |
| +}; |
| + |
| +static int mtk_disp_aal_probe(struct platform_device *pdev) |
| +{ |
| + struct device *dev = &pdev->dev; |
| + struct mtk_disp_aal *priv; |
| + struct resource *res; |
| + int ret; |
| + |
| + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); |
| + if (!priv) |
| + return -ENOMEM; |
| + |
| + priv->clk = devm_clk_get(dev, NULL); |
| + if (IS_ERR(priv->clk)) { |
| + dev_err(dev, "failed to get aal clk\n"); |
| + return PTR_ERR(priv->clk); |
| + } |
| + |
| + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| + priv->regs = devm_ioremap_resource(dev, res); |
| + if (IS_ERR(priv->regs)) { |
| + dev_err(dev, "failed to ioremap aal\n"); |
| + return PTR_ERR(priv->regs); |
| + } |
| + |
| +#if IS_REACHABLE(CONFIG_MTK_CMDQ) |
| + ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0); |
| + if (ret) |
| + dev_dbg(dev, "get mediatek,gce-client-reg fail!\n"); |
| +#endif |
| + |
| + priv->data = of_device_get_match_data(dev); |
| + platform_set_drvdata(pdev, priv); |
| + |
| + ret = component_add(dev, &mtk_disp_aal_component_ops); |
| + if (ret) |
| + dev_err(dev, "Failed to add component: %d\n", ret); |
| + |
| + return ret; |
| +} |
| + |
| +static int mtk_disp_aal_remove(struct platform_device *pdev) |
| +{ |
| + component_del(&pdev->dev, &mtk_disp_aal_component_ops); |
| + |
| + return 0; |
| +} |
| + |
| +static const struct mtk_disp_aal_data mt8173_aal_driver_data = { |
| + .has_gamma = true, |
| +}; |
| + |
| +static const struct of_device_id mtk_disp_aal_driver_dt_match[] = { |
| + { .compatible = "mediatek,mt8173-disp-aal", |
| + .data = &mt8173_aal_driver_data}, |
| + {}, |
| +}; |
| +MODULE_DEVICE_TABLE(of, mtk_disp_aal_driver_dt_match); |
| + |
| +struct platform_driver mtk_disp_aal_driver = { |
| + .probe = mtk_disp_aal_probe, |
| + .remove = mtk_disp_aal_remove, |
| + .driver = { |
| + .name = "mediatek-disp-aal", |
| + .owner = THIS_MODULE, |
| + .of_match_table = mtk_disp_aal_driver_dt_match, |
| + }, |
| +}; |
| diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h |
| --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h |
| +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h |
| @@ -9,6 +9,15 @@ |
| #include <linux/soc/mediatek/mtk-cmdq.h> |
| #include "mtk_drm_plane.h" |
| |
| +int mtk_aal_clk_enable(struct device *dev); |
| +void mtk_aal_clk_disable(struct device *dev); |
| +void mtk_aal_config(struct device *dev, unsigned int w, |
| + unsigned int h, unsigned int vrefresh, |
| + unsigned int bpc, struct cmdq_pkt *cmdq_pkt); |
| +void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state); |
| +void mtk_aal_start(struct device *dev); |
| +void mtk_aal_stop(struct device *dev); |
| + |
| void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state); |
| int mtk_ccorr_clk_enable(struct device *dev); |
| void mtk_ccorr_clk_disable(struct device *dev); |
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c |
| @@ -32,10 +32,6 @@ |
| |
| #define DISP_REG_UFO_START 0x0000 |
| |
| -#define DISP_AAL_EN 0x0000 |
| -#define DISP_AAL_SIZE 0x0030 |
| -#define DISP_AAL_OUTPUT_SIZE 0x04d8 |
| - |
| #define DISP_DITHER_EN 0x0000 |
| #define DITHER_EN BIT(0) |
| #define DISP_DITHER_CFG 0x0020 |
| @@ -49,8 +45,6 @@ |
| |
| #define UFO_BYPASS BIT(2) |
| |
| -#define AAL_EN BIT(0) |
| - |
| #define DISP_DITHERING BIT(2) |
| #define DITHER_LSB_ERR_SHIFT_R(x) (((x) & 0x7) << 28) |
| #define DITHER_OVFLW_BIT_R(x) (((x) & 0x7) << 24) |
| @@ -191,37 +185,6 @@ static void mtk_ufoe_start(struct device *dev) |
| writel(UFO_BYPASS, priv->regs + DISP_REG_UFO_START); |
| } |
| |
| -static void mtk_aal_config(struct device *dev, unsigned int w, |
| - unsigned int h, unsigned int vrefresh, |
| - unsigned int bpc, struct cmdq_pkt *cmdq_pkt) |
| -{ |
| - struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev); |
| - |
| - mtk_ddp_write(cmdq_pkt, w << 16 | h, &priv->cmdq_reg, priv->regs, DISP_AAL_SIZE); |
| - mtk_ddp_write(cmdq_pkt, w << 16 | h, &priv->cmdq_reg, priv->regs, DISP_AAL_OUTPUT_SIZE); |
| -} |
| - |
| -static void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state) |
| -{ |
| - struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev); |
| - |
| - mtk_gamma_set_common(priv->regs, state); |
| -} |
| - |
| -static void mtk_aal_start(struct device *dev) |
| -{ |
| - struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev); |
| - |
| - writel(AAL_EN, priv->regs + DISP_AAL_EN); |
| -} |
| - |
| -static void mtk_aal_stop(struct device *dev) |
| -{ |
| - struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev); |
| - |
| - writel_relaxed(0x0, priv->regs + DISP_AAL_EN); |
| -} |
| - |
| static void mtk_dither_config(struct device *dev, unsigned int w, |
| unsigned int h, unsigned int vrefresh, |
| unsigned int bpc, struct cmdq_pkt *cmdq_pkt) |
| @@ -249,8 +212,8 @@ static void mtk_dither_stop(struct device *dev) |
| } |
| |
| static const struct mtk_ddp_comp_funcs ddp_aal = { |
| - .clk_enable = mtk_ddp_clk_enable, |
| - .clk_disable = mtk_ddp_clk_disable, |
| + .clk_enable = mtk_aal_clk_enable, |
| + .clk_disable = mtk_aal_clk_disable, |
| .gamma_set = mtk_aal_gamma_set, |
| .config = mtk_aal_config, |
| .start = mtk_aal_start, |
| @@ -472,7 +435,8 @@ int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp, |
| } |
| comp->dev = &comp_pdev->dev; |
| |
| - if (type == MTK_DISP_BLS || |
| + if (type == MTK_DISP_AAL || |
| + type == MTK_DISP_BLS || |
| type == MTK_DISP_CCORR || |
| type == MTK_DISP_COLOR || |
| type == MTK_DISP_GAMMA || |
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c |
| @@ -547,11 +547,12 @@ static int mtk_drm_probe(struct platform_device *pdev) |
| private->comp_node[comp_id] = of_node_get(node); |
| |
| /* |
| - * Currently only the CCORR, COLOR, GAMMA, OVL, RDMA, DSI, and DPI |
| + * Currently only the AAL, CCORR, COLOR, GAMMA, OVL, RDMA, DSI, and DPI |
| * blocks have separate component platform drivers and initialize their own |
| * DDP component structure. The others are initialized here. |
| */ |
| - if (comp_type == MTK_DISP_CCORR || |
| + if (comp_type == MTK_DISP_AAL || |
| + comp_type == MTK_DISP_CCORR || |
| comp_type == MTK_DISP_COLOR || |
| comp_type == MTK_DISP_GAMMA || |
| comp_type == MTK_DISP_OVL || |
| @@ -648,6 +649,7 @@ static struct platform_driver mtk_drm_platform_driver = { |
| }; |
| |
| static struct platform_driver * const mtk_drm_drivers[] = { |
| + &mtk_disp_aal_driver, |
| &mtk_disp_ccorr_driver, |
| &mtk_disp_color_driver, |
| &mtk_disp_gamma_driver, |
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h |
| --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h |
| +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h |
| @@ -46,6 +46,7 @@ struct mtk_drm_private { |
| struct drm_atomic_state *suspend_state; |
| }; |
| |
| +extern struct platform_driver mtk_disp_aal_driver; |
| extern struct platform_driver mtk_disp_ccorr_driver; |
| extern struct platform_driver mtk_disp_color_driver; |
| extern struct platform_driver mtk_disp_gamma_driver; |
| -- |
| 2.33.0.rc2.250.ged5fa647cd-goog |
| |