Skip to content

Commit 035fdc3

Browse files
committed
Merge tag 'mediatek-drm-next-6.7' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next
Mediatek DRM Next for Linux 6.7 1. Add support MT8188 dsi function 2. Fix coverity issue with unintentional integer overflow 3. Add support MT8188 dp/edp function 4. Fix memory leak on ->get_edid callback audio detection and error path. 5. Add connector dynamic selection capability 6. MediaTek DDP GAMMA - 12-bit LUT support 7. mtk_dsi: Fix NO_EOT_PACKET settings/handling [airlied: add bitfield.h include] Signed-off-by: Dave Airlie <airlied@redhat.com> From: Chun-Kuang Hu <chunkuang.hu@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20231018135846.5811-1-chunkuang.hu@kernel.org
2 parents 55b7285 + 5855d42 commit 035fdc3

File tree

17 files changed

+584
-88
lines changed

17 files changed

+584
-88
lines changed

Documentation/devicetree/bindings/display/mediatek/mediatek,dp.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ description: |
2121
properties:
2222
compatible:
2323
enum:
24+
- mediatek,mt8188-dp-tx
25+
- mediatek,mt8188-edp-tx
2426
- mediatek,mt8195-dp-tx
2527
- mediatek,mt8195-edp-tx
2628

Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ properties:
3030
- mediatek,mt8173-dsi
3131
- mediatek,mt8183-dsi
3232
- mediatek,mt8186-dsi
33+
- mediatek,mt8188-dsi
3334
- items:
3435
- enum:
3536
- mediatek,mt6795-dsi

drivers/gpu/drm/mediatek/mtk_disp_aal.c

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright (c) 2021 MediaTek Inc.
44
*/
55

6+
#include <linux/bitfield.h>
67
#include <linux/clk.h>
78
#include <linux/component.h>
89
#include <linux/module.h>
@@ -17,14 +18,31 @@
1718

1819
#define DISP_AAL_EN 0x0000
1920
#define AAL_EN BIT(0)
21+
#define DISP_AAL_CFG 0x0020
22+
#define AAL_RELAY_MODE BIT(0)
23+
#define AAL_GAMMA_LUT_EN BIT(1)
2024
#define DISP_AAL_SIZE 0x0030
25+
#define DISP_AAL_SIZE_HSIZE GENMASK(28, 16)
26+
#define DISP_AAL_SIZE_VSIZE GENMASK(12, 0)
2127
#define DISP_AAL_OUTPUT_SIZE 0x04d8
22-
28+
#define DISP_AAL_GAMMA_LUT 0x0700
29+
#define DISP_AAL_GAMMA_LUT_R GENMASK(29, 20)
30+
#define DISP_AAL_GAMMA_LUT_G GENMASK(19, 10)
31+
#define DISP_AAL_GAMMA_LUT_B GENMASK(9, 0)
32+
#define DISP_AAL_LUT_BITS 10
33+
#define DISP_AAL_LUT_SIZE 512
2334

2435
struct mtk_disp_aal_data {
2536
bool has_gamma;
2637
};
2738

39+
/**
40+
* struct mtk_disp_aal - Display Adaptive Ambient Light driver structure
41+
* @clk: clock for DISP_AAL controller
42+
* @regs: MMIO registers base
43+
* @cmdq_reg: CMDQ Client register
44+
* @data: platform specific data for DISP_AAL
45+
*/
2846
struct mtk_disp_aal {
2947
struct clk *clk;
3048
void __iomem *regs;
@@ -51,17 +69,69 @@ void mtk_aal_config(struct device *dev, unsigned int w,
5169
unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
5270
{
5371
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
72+
u32 sz;
73+
74+
sz = FIELD_PREP(DISP_AAL_SIZE_HSIZE, w);
75+
sz |= FIELD_PREP(DISP_AAL_SIZE_VSIZE, h);
5476

55-
mtk_ddp_write(cmdq_pkt, w << 16 | h, &aal->cmdq_reg, aal->regs, DISP_AAL_SIZE);
56-
mtk_ddp_write(cmdq_pkt, w << 16 | h, &aal->cmdq_reg, aal->regs, DISP_AAL_OUTPUT_SIZE);
77+
mtk_ddp_write(cmdq_pkt, sz, &aal->cmdq_reg, aal->regs, DISP_AAL_SIZE);
78+
mtk_ddp_write(cmdq_pkt, sz, &aal->cmdq_reg, aal->regs, DISP_AAL_OUTPUT_SIZE);
5779
}
5880

59-
void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
81+
/**
82+
* mtk_aal_gamma_get_lut_size() - Get gamma LUT size for AAL
83+
* @dev: Pointer to struct device
84+
*
85+
* Return: 0 if gamma control not supported in AAL or gamma LUT size
86+
*/
87+
unsigned int mtk_aal_gamma_get_lut_size(struct device *dev)
6088
{
6189
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
6290

6391
if (aal->data && aal->data->has_gamma)
64-
mtk_gamma_set_common(aal->regs, state, false);
92+
return DISP_AAL_LUT_SIZE;
93+
return 0;
94+
}
95+
96+
void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
97+
{
98+
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
99+
struct drm_color_lut *lut;
100+
unsigned int i;
101+
u32 cfg_val;
102+
103+
/* If gamma is not supported in AAL, go out immediately */
104+
if (!(aal->data && aal->data->has_gamma))
105+
return;
106+
107+
/* Also, if there's no gamma lut there's nothing to do here. */
108+
if (!state->gamma_lut)
109+
return;
110+
111+
lut = (struct drm_color_lut *)state->gamma_lut->data;
112+
for (i = 0; i < DISP_AAL_LUT_SIZE; i++) {
113+
struct drm_color_lut hwlut = {
114+
.red = drm_color_lut_extract(lut[i].red, DISP_AAL_LUT_BITS),
115+
.green = drm_color_lut_extract(lut[i].green, DISP_AAL_LUT_BITS),
116+
.blue = drm_color_lut_extract(lut[i].blue, DISP_AAL_LUT_BITS)
117+
};
118+
u32 word;
119+
120+
word = FIELD_PREP(DISP_AAL_GAMMA_LUT_R, hwlut.red);
121+
word |= FIELD_PREP(DISP_AAL_GAMMA_LUT_G, hwlut.green);
122+
word |= FIELD_PREP(DISP_AAL_GAMMA_LUT_B, hwlut.blue);
123+
writel(word, aal->regs + DISP_AAL_GAMMA_LUT + i * 4);
124+
}
125+
126+
cfg_val = readl(aal->regs + DISP_AAL_CFG);
127+
128+
/* Enable the gamma table */
129+
cfg_val |= FIELD_PREP(AAL_GAMMA_LUT_EN, 1);
130+
131+
/* Disable RELAY mode to pass the processed image */
132+
cfg_val &= ~AAL_RELAY_MODE;
133+
134+
writel(cfg_val, aal->regs + DISP_AAL_CFG);
65135
}
66136

67137
void mtk_aal_start(struct device *dev)
@@ -144,10 +214,9 @@ static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
144214
};
145215

146216
static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
147-
{ .compatible = "mediatek,mt8173-disp-aal",
148-
.data = &mt8173_aal_driver_data},
149-
{ .compatible = "mediatek,mt8183-disp-aal"},
150-
{},
217+
{ .compatible = "mediatek,mt8173-disp-aal", .data = &mt8173_aal_driver_data },
218+
{ .compatible = "mediatek,mt8183-disp-aal" },
219+
{ /* sentinel */ }
151220
};
152221
MODULE_DEVICE_TABLE(of, mtk_disp_aal_driver_dt_match);
153222

drivers/gpu/drm/mediatek/mtk_disp_drv.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ void mtk_aal_clk_disable(struct device *dev);
1717
void mtk_aal_config(struct device *dev, unsigned int w,
1818
unsigned int h, unsigned int vrefresh,
1919
unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
20+
unsigned int mtk_aal_gamma_get_lut_size(struct device *dev);
2021
void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state);
2122
void mtk_aal_start(struct device *dev);
2223
void mtk_aal_stop(struct device *dev);
@@ -44,17 +45,19 @@ void mtk_dither_set_common(void __iomem *regs, struct cmdq_client_reg *cmdq_reg,
4445

4546
void mtk_dpi_start(struct device *dev);
4647
void mtk_dpi_stop(struct device *dev);
48+
unsigned int mtk_dpi_encoder_index(struct device *dev);
4749

4850
void mtk_dsi_ddp_start(struct device *dev);
4951
void mtk_dsi_ddp_stop(struct device *dev);
52+
unsigned int mtk_dsi_encoder_index(struct device *dev);
5053

5154
int mtk_gamma_clk_enable(struct device *dev);
5255
void mtk_gamma_clk_disable(struct device *dev);
5356
void mtk_gamma_config(struct device *dev, unsigned int w,
5457
unsigned int h, unsigned int vrefresh,
5558
unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
59+
unsigned int mtk_gamma_get_lut_size(struct device *dev);
5660
void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state);
57-
void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff);
5861
void mtk_gamma_start(struct device *dev);
5962
void mtk_gamma_stop(struct device *dev);
6063

0 commit comments

Comments
 (0)