Skip to content

Commit 78d1783

Browse files
Yongqiang NiuChun-Kuang Hu
authored andcommitted
drm/mediatek: Separate aal sub driver
MT8173 aal has gamma function but mt8183 aal has no gamma function, so separate aal sub driver to have a private data for different SoC. Signed-off-by: Yongqiang Niu <[email protected]> Tested-by: Hsin-Yi Wang <[email protected]> Signed-off-by: Chun-Kuang Hu <[email protected]>
1 parent ef668f2 commit 78d1783

File tree

6 files changed

+186
-41
lines changed

6 files changed

+186
-41
lines changed

drivers/gpu/drm/mediatek/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# SPDX-License-Identifier: GPL-2.0
22

3-
mediatek-drm-y := mtk_disp_ccorr.o \
3+
mediatek-drm-y := mtk_disp_aal.o \
4+
mtk_disp_ccorr.o \
45
mtk_disp_color.o \
56
mtk_disp_gamma.o \
67
mtk_disp_ovl.o \
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
/*
3+
* Copyright (c) 2021 MediaTek Inc.
4+
*/
5+
6+
#include <linux/clk.h>
7+
#include <linux/component.h>
8+
#include <linux/module.h>
9+
#include <linux/of_device.h>
10+
#include <linux/of_irq.h>
11+
#include <linux/platform_device.h>
12+
#include <linux/soc/mediatek/mtk-cmdq.h>
13+
14+
#include "mtk_disp_drv.h"
15+
#include "mtk_drm_crtc.h"
16+
#include "mtk_drm_ddp_comp.h"
17+
18+
#define DISP_AAL_EN 0x0000
19+
#define AAL_EN BIT(0)
20+
#define DISP_AAL_SIZE 0x0030
21+
22+
23+
struct mtk_disp_aal_data {
24+
bool has_gamma;
25+
};
26+
27+
/**
28+
* struct mtk_disp_aal - DISP_AAL driver structure
29+
* @ddp_comp - structure containing type enum and hardware resources
30+
* @crtc - associated crtc to report irq events to
31+
*/
32+
struct mtk_disp_aal {
33+
struct clk *clk;
34+
void __iomem *regs;
35+
struct cmdq_client_reg cmdq_reg;
36+
const struct mtk_disp_aal_data *data;
37+
};
38+
39+
int mtk_aal_clk_enable(struct device *dev)
40+
{
41+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
42+
43+
return clk_prepare_enable(aal->clk);
44+
}
45+
46+
void mtk_aal_clk_disable(struct device *dev)
47+
{
48+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
49+
50+
clk_disable_unprepare(aal->clk);
51+
}
52+
53+
void mtk_aal_config(struct device *dev, unsigned int w,
54+
unsigned int h, unsigned int vrefresh,
55+
unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
56+
{
57+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
58+
59+
mtk_ddp_write(cmdq_pkt, w << 16 | h, &aal->cmdq_reg, aal->regs, DISP_AAL_SIZE);
60+
}
61+
62+
void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
63+
{
64+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
65+
66+
if (aal->data && aal->data->has_gamma)
67+
mtk_gamma_set_common(aal->regs, state);
68+
}
69+
70+
void mtk_aal_start(struct device *dev)
71+
{
72+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
73+
74+
writel(AAL_EN, aal->regs + DISP_AAL_EN);
75+
}
76+
77+
void mtk_aal_stop(struct device *dev)
78+
{
79+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
80+
81+
writel_relaxed(0x0, aal->regs + DISP_AAL_EN);
82+
}
83+
84+
static int mtk_disp_aal_bind(struct device *dev, struct device *master,
85+
void *data)
86+
{
87+
return 0;
88+
}
89+
90+
static void mtk_disp_aal_unbind(struct device *dev, struct device *master,
91+
void *data)
92+
{
93+
}
94+
95+
static const struct component_ops mtk_disp_aal_component_ops = {
96+
.bind = mtk_disp_aal_bind,
97+
.unbind = mtk_disp_aal_unbind,
98+
};
99+
100+
static int mtk_disp_aal_probe(struct platform_device *pdev)
101+
{
102+
struct device *dev = &pdev->dev;
103+
struct mtk_disp_aal *priv;
104+
struct resource *res;
105+
int ret;
106+
107+
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
108+
if (!priv)
109+
return -ENOMEM;
110+
111+
priv->clk = devm_clk_get(dev, NULL);
112+
if (IS_ERR(priv->clk)) {
113+
dev_err(dev, "failed to get aal clk\n");
114+
return PTR_ERR(priv->clk);
115+
}
116+
117+
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
118+
priv->regs = devm_ioremap_resource(dev, res);
119+
if (IS_ERR(priv->regs)) {
120+
dev_err(dev, "failed to ioremap aal\n");
121+
return PTR_ERR(priv->regs);
122+
}
123+
124+
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
125+
ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0);
126+
if (ret)
127+
dev_dbg(dev, "get mediatek,gce-client-reg fail!\n");
128+
#endif
129+
130+
priv->data = of_device_get_match_data(dev);
131+
platform_set_drvdata(pdev, priv);
132+
133+
ret = component_add(dev, &mtk_disp_aal_component_ops);
134+
if (ret)
135+
dev_err(dev, "Failed to add component: %d\n", ret);
136+
137+
return ret;
138+
}
139+
140+
static int mtk_disp_aal_remove(struct platform_device *pdev)
141+
{
142+
component_del(&pdev->dev, &mtk_disp_aal_component_ops);
143+
144+
return 0;
145+
}
146+
147+
static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
148+
.has_gamma = true,
149+
};
150+
151+
static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
152+
{ .compatible = "mediatek,mt8173-disp-aal",
153+
.data = &mt8173_aal_driver_data},
154+
{},
155+
};
156+
MODULE_DEVICE_TABLE(of, mtk_disp_aal_driver_dt_match);
157+
158+
struct platform_driver mtk_disp_aal_driver = {
159+
.probe = mtk_disp_aal_probe,
160+
.remove = mtk_disp_aal_remove,
161+
.driver = {
162+
.name = "mediatek-disp-aal",
163+
.owner = THIS_MODULE,
164+
.of_match_table = mtk_disp_aal_driver_dt_match,
165+
},
166+
};

drivers/gpu/drm/mediatek/mtk_disp_drv.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
#include <linux/soc/mediatek/mtk-cmdq.h>
1010
#include "mtk_drm_plane.h"
1111

12+
int mtk_aal_clk_enable(struct device *dev);
13+
void mtk_aal_clk_disable(struct device *dev);
14+
void mtk_aal_config(struct device *dev, unsigned int w,
15+
unsigned int h, unsigned int vrefresh,
16+
unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
17+
void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state);
18+
void mtk_aal_start(struct device *dev);
19+
void mtk_aal_stop(struct device *dev);
20+
1221
void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state);
1322
int mtk_ccorr_clk_enable(struct device *dev);
1423
void mtk_ccorr_clk_disable(struct device *dev);

drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@
3232

3333
#define DISP_REG_UFO_START 0x0000
3434

35-
#define DISP_AAL_EN 0x0000
36-
#define DISP_AAL_SIZE 0x0030
37-
3835
#define DISP_DITHER_EN 0x0000
3936
#define DITHER_EN BIT(0)
4037
#define DISP_DITHER_CFG 0x0020
@@ -48,8 +45,6 @@
4845

4946
#define UFO_BYPASS BIT(2)
5047

51-
#define AAL_EN BIT(0)
52-
5348
#define DISP_DITHERING BIT(2)
5449
#define DITHER_LSB_ERR_SHIFT_R(x) (((x) & 0x7) << 28)
5550
#define DITHER_OVFLW_BIT_R(x) (((x) & 0x7) << 24)
@@ -190,36 +185,6 @@ static void mtk_ufoe_start(struct device *dev)
190185
writel(UFO_BYPASS, priv->regs + DISP_REG_UFO_START);
191186
}
192187

193-
static void mtk_aal_config(struct device *dev, unsigned int w,
194-
unsigned int h, unsigned int vrefresh,
195-
unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
196-
{
197-
struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev);
198-
199-
mtk_ddp_write(cmdq_pkt, w << 16 | h, &priv->cmdq_reg, priv->regs, DISP_AAL_SIZE);
200-
}
201-
202-
static void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
203-
{
204-
struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev);
205-
206-
mtk_gamma_set_common(priv->regs, state);
207-
}
208-
209-
static void mtk_aal_start(struct device *dev)
210-
{
211-
struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev);
212-
213-
writel(AAL_EN, priv->regs + DISP_AAL_EN);
214-
}
215-
216-
static void mtk_aal_stop(struct device *dev)
217-
{
218-
struct mtk_ddp_comp_dev *priv = dev_get_drvdata(dev);
219-
220-
writel_relaxed(0x0, priv->regs + DISP_AAL_EN);
221-
}
222-
223188
static void mtk_dither_config(struct device *dev, unsigned int w,
224189
unsigned int h, unsigned int vrefresh,
225190
unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
@@ -247,8 +212,8 @@ static void mtk_dither_stop(struct device *dev)
247212
}
248213

249214
static const struct mtk_ddp_comp_funcs ddp_aal = {
250-
.clk_enable = mtk_ddp_clk_enable,
251-
.clk_disable = mtk_ddp_clk_disable,
215+
.clk_enable = mtk_aal_clk_enable,
216+
.clk_disable = mtk_aal_clk_disable,
252217
.gamma_set = mtk_aal_gamma_set,
253218
.config = mtk_aal_config,
254219
.start = mtk_aal_start,
@@ -505,7 +470,8 @@ int mtk_ddp_comp_init(struct device_node *node, struct mtk_ddp_comp *comp,
505470
return ret;
506471
}
507472

508-
if (type == MTK_DISP_BLS ||
473+
if (type == MTK_DISP_AAL ||
474+
type == MTK_DISP_BLS ||
509475
type == MTK_DISP_CCORR ||
510476
type == MTK_DISP_COLOR ||
511477
type == MTK_DISP_GAMMA ||

drivers/gpu/drm/mediatek/mtk_drm_drv.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,11 +532,12 @@ static int mtk_drm_probe(struct platform_device *pdev)
532532
private->comp_node[comp_id] = of_node_get(node);
533533

534534
/*
535-
* Currently only the CCORR, COLOR, GAMMA, OVL, RDMA, DSI, and DPI
535+
* Currently only the AAL, CCORR, COLOR, GAMMA, OVL, RDMA, DSI, and DPI
536536
* blocks have separate component platform drivers and initialize their own
537537
* DDP component structure. The others are initialized here.
538538
*/
539-
if (comp_type == MTK_DISP_CCORR ||
539+
if (comp_type == MTK_DISP_AAL ||
540+
comp_type == MTK_DISP_CCORR ||
540541
comp_type == MTK_DISP_COLOR ||
541542
comp_type == MTK_DISP_GAMMA ||
542543
comp_type == MTK_DISP_OVL ||
@@ -636,6 +637,7 @@ static struct platform_driver mtk_drm_platform_driver = {
636637
};
637638

638639
static struct platform_driver * const mtk_drm_drivers[] = {
640+
&mtk_disp_aal_driver,
639641
&mtk_disp_ccorr_driver,
640642
&mtk_disp_color_driver,
641643
&mtk_disp_gamma_driver,

drivers/gpu/drm/mediatek/mtk_drm_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct mtk_drm_private {
4646
struct drm_atomic_state *suspend_state;
4747
};
4848

49+
extern struct platform_driver mtk_disp_aal_driver;
4950
extern struct platform_driver mtk_disp_ccorr_driver;
5051
extern struct platform_driver mtk_disp_color_driver;
5152
extern struct platform_driver mtk_disp_gamma_driver;

0 commit comments

Comments
 (0)