File Index
Files and directories
Sign in
FILE

mtk_disp_color.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/mediatek/mtk_disp_color.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (c) 2017 MediaTek Inc.
  4 */
  5
  6#include <linux/clk.h>
  7#include <linux/component.h>
  8#include <linux/module.h>
  9#include <linux/of.h>
 10#include <linux/platform_device.h>
 11#include <linux/soc/mediatek/mtk-cmdq.h>
 12
 13#include "mtk_crtc.h"
 14#include "mtk_ddp_comp.h"
 15#include "mtk_disp_drv.h"
 16#include "mtk_drm_drv.h"
 17
 18#define DISP_COLOR_CFG_MAIN			0x0400
 19#define DISP_COLOR_START_MT2701			0x0f00
 20#define DISP_COLOR_START_MT8167			0x0400
 21#define DISP_COLOR_START_MT8173			0x0c00
 22#define DISP_COLOR_START(comp)			((comp)->data->color_offset)
 23#define DISP_COLOR_WIDTH(comp)			(DISP_COLOR_START(comp) + 0x50)
 24#define DISP_COLOR_HEIGHT(comp)			(DISP_COLOR_START(comp) + 0x54)
 25
 26#define COLOR_BYPASS_ALL			BIT(7)
 27#define COLOR_SEQ_SEL				BIT(13)
 28
 29struct mtk_disp_color_data {
 30	unsigned int color_offset;
 31};
 32
 33/*
 34 * struct mtk_disp_color - DISP_COLOR driver structure
 35 * @crtc: associated crtc to report irq events to
 36 * @data: platform colour driver data
 37 */
 38struct mtk_disp_color {
 39	struct drm_crtc				*crtc;
 40	struct clk				*clk;
 41	void __iomem				*regs;
 42	struct cmdq_client_reg			cmdq_reg;
 43	const struct mtk_disp_color_data	*data;
 44};
 45
 46int mtk_color_clk_enable(struct device *dev)
 47{
 48	struct mtk_disp_color *color = dev_get_drvdata(dev);
 49
 50	return clk_prepare_enable(color->clk);
 51}
 52
 53void mtk_color_clk_disable(struct device *dev)
 54{
 55	struct mtk_disp_color *color = dev_get_drvdata(dev);
 56
 57	clk_disable_unprepare(color->clk);
 58}
 59
 60void mtk_color_config(struct device *dev, unsigned int w,
 61		      unsigned int h, unsigned int vrefresh,
 62		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
 63{
 64	struct mtk_disp_color *color = dev_get_drvdata(dev);
 65
 66	mtk_ddp_write(cmdq_pkt, w, &color->cmdq_reg, color->regs, DISP_COLOR_WIDTH(color));
 67	mtk_ddp_write(cmdq_pkt, h, &color->cmdq_reg, color->regs, DISP_COLOR_HEIGHT(color));
 68}
 69
 70void mtk_color_start(struct device *dev)
 71{
 72	struct mtk_disp_color *color = dev_get_drvdata(dev);
 73
 74	writel(COLOR_BYPASS_ALL | COLOR_SEQ_SEL,
 75	       color->regs + DISP_COLOR_CFG_MAIN);
 76	writel(0x1, color->regs + DISP_COLOR_START(color));
 77}
 78
 79static int mtk_disp_color_bind(struct device *dev, struct device *master,
 80			       void *data)
 81{
 82	return 0;
 83}
 84
 85static void mtk_disp_color_unbind(struct device *dev, struct device *master,
 86				  void *data)
 87{
 88}
 89
 90static const struct component_ops mtk_disp_color_component_ops = {
 91	.bind	= mtk_disp_color_bind,
 92	.unbind = mtk_disp_color_unbind,
 93};
 94
 95static int mtk_disp_color_probe(struct platform_device *pdev)
 96{
 97	struct device *dev = &pdev->dev;
 98	struct mtk_disp_color *priv;
 99	int ret;
100
101	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
102	if (!priv)
103		return -ENOMEM;
104
105	priv->clk = devm_clk_get(dev, NULL);
106	if (IS_ERR(priv->clk))
107		return dev_err_probe(dev, PTR_ERR(priv->clk),
108				     "failed to get color clk\n");
109
110	priv->regs = devm_platform_ioremap_resource(pdev, 0);
111	if (IS_ERR(priv->regs))
112		return dev_err_probe(dev, PTR_ERR(priv->regs),
113				     "failed to ioremap color\n");
114#if IS_REACHABLE(CONFIG_MTK_CMDQ)
115	ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0);
116	if (ret)
117		dev_dbg(dev, "get mediatek,gce-client-reg fail!\n");
118#endif
119
120	priv->data = of_device_get_match_data(dev);
121	platform_set_drvdata(pdev, priv);
122
123	ret = component_add(dev, &mtk_disp_color_component_ops);
124	if (ret)
125		return dev_err_probe(dev, ret, "Failed to add component\n");
126
127	return 0;
128}
129
130static void mtk_disp_color_remove(struct platform_device *pdev)
131{
132	component_del(&pdev->dev, &mtk_disp_color_component_ops);
133}
134
135static const struct mtk_disp_color_data mt2701_color_driver_data = {
136	.color_offset = DISP_COLOR_START_MT2701,
137};
138
139static const struct mtk_disp_color_data mt8167_color_driver_data = {
140	.color_offset = DISP_COLOR_START_MT8167,
141};
142
143static const struct mtk_disp_color_data mt8173_color_driver_data = {
144	.color_offset = DISP_COLOR_START_MT8173,
145};
146
147static const struct of_device_id mtk_disp_color_driver_dt_match[] = {
148	{ .compatible = "mediatek,mt2701-disp-color",
149	  .data = &mt2701_color_driver_data},
150	{ .compatible = "mediatek,mt8167-disp-color",
151	  .data = &mt8167_color_driver_data},
152	{ .compatible = "mediatek,mt8173-disp-color",
153	  .data = &mt8173_color_driver_data},
154	{},
155};
156MODULE_DEVICE_TABLE(of, mtk_disp_color_driver_dt_match);
157
158struct platform_driver mtk_disp_color_driver = {
159	.probe		= mtk_disp_color_probe,
160	.remove		= mtk_disp_color_remove,
161	.driver		= {
162		.name	= "mediatek-disp-color",
163		.of_match_table = mtk_disp_color_driver_dt_match,
164	},
165};
~/ Read-only file preview.