Skip to content

Commit

Permalink
Merge tag 'mediatek-drm-next-6.7' of https://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/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
  • Loading branch information
Dave Airlie committed Oct 20, 2023
2 parents 55b7285 + 5855d42 commit 035fdc3
Show file tree
Hide file tree
Showing 17 changed files with 584 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ description: |
properties:
compatible:
enum:
- mediatek,mt8188-dp-tx
- mediatek,mt8188-edp-tx
- mediatek,mt8195-dp-tx
- mediatek,mt8195-edp-tx

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ properties:
- mediatek,mt8173-dsi
- mediatek,mt8183-dsi
- mediatek,mt8186-dsi
- mediatek,mt8188-dsi
- items:
- enum:
- mediatek,mt6795-dsi
Expand Down
87 changes: 78 additions & 9 deletions drivers/gpu/drm/mediatek/mtk_disp_aal.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (c) 2021 MediaTek Inc.
*/

#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/component.h>
#include <linux/module.h>
Expand All @@ -17,14 +18,31 @@

#define DISP_AAL_EN 0x0000
#define AAL_EN BIT(0)
#define DISP_AAL_CFG 0x0020
#define AAL_RELAY_MODE BIT(0)
#define AAL_GAMMA_LUT_EN BIT(1)
#define DISP_AAL_SIZE 0x0030
#define DISP_AAL_SIZE_HSIZE GENMASK(28, 16)
#define DISP_AAL_SIZE_VSIZE GENMASK(12, 0)
#define DISP_AAL_OUTPUT_SIZE 0x04d8

#define DISP_AAL_GAMMA_LUT 0x0700
#define DISP_AAL_GAMMA_LUT_R GENMASK(29, 20)
#define DISP_AAL_GAMMA_LUT_G GENMASK(19, 10)
#define DISP_AAL_GAMMA_LUT_B GENMASK(9, 0)
#define DISP_AAL_LUT_BITS 10
#define DISP_AAL_LUT_SIZE 512

struct mtk_disp_aal_data {
bool has_gamma;
};

/**
* struct mtk_disp_aal - Display Adaptive Ambient Light driver structure
* @clk: clock for DISP_AAL controller
* @regs: MMIO registers base
* @cmdq_reg: CMDQ Client register
* @data: platform specific data for DISP_AAL
*/
struct mtk_disp_aal {
struct clk *clk;
void __iomem *regs;
Expand All @@ -51,17 +69,69 @@ void mtk_aal_config(struct device *dev, unsigned int w,
unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
{
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
u32 sz;

sz = FIELD_PREP(DISP_AAL_SIZE_HSIZE, w);
sz |= FIELD_PREP(DISP_AAL_SIZE_VSIZE, h);

mtk_ddp_write(cmdq_pkt, w << 16 | h, &aal->cmdq_reg, aal->regs, DISP_AAL_SIZE);
mtk_ddp_write(cmdq_pkt, w << 16 | h, &aal->cmdq_reg, aal->regs, DISP_AAL_OUTPUT_SIZE);
mtk_ddp_write(cmdq_pkt, sz, &aal->cmdq_reg, aal->regs, DISP_AAL_SIZE);
mtk_ddp_write(cmdq_pkt, sz, &aal->cmdq_reg, aal->regs, DISP_AAL_OUTPUT_SIZE);
}

void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
/**
* mtk_aal_gamma_get_lut_size() - Get gamma LUT size for AAL
* @dev: Pointer to struct device
*
* Return: 0 if gamma control not supported in AAL or gamma LUT size
*/
unsigned int mtk_aal_gamma_get_lut_size(struct device *dev)
{
struct mtk_disp_aal *aal = dev_get_drvdata(dev);

if (aal->data && aal->data->has_gamma)
mtk_gamma_set_common(aal->regs, state, false);
return DISP_AAL_LUT_SIZE;
return 0;
}

void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
{
struct mtk_disp_aal *aal = dev_get_drvdata(dev);
struct drm_color_lut *lut;
unsigned int i;
u32 cfg_val;

/* If gamma is not supported in AAL, go out immediately */
if (!(aal->data && aal->data->has_gamma))
return;

/* Also, if there's no gamma lut there's nothing to do here. */
if (!state->gamma_lut)
return;

lut = (struct drm_color_lut *)state->gamma_lut->data;
for (i = 0; i < DISP_AAL_LUT_SIZE; i++) {
struct drm_color_lut hwlut = {
.red = drm_color_lut_extract(lut[i].red, DISP_AAL_LUT_BITS),
.green = drm_color_lut_extract(lut[i].green, DISP_AAL_LUT_BITS),
.blue = drm_color_lut_extract(lut[i].blue, DISP_AAL_LUT_BITS)
};
u32 word;

word = FIELD_PREP(DISP_AAL_GAMMA_LUT_R, hwlut.red);
word |= FIELD_PREP(DISP_AAL_GAMMA_LUT_G, hwlut.green);
word |= FIELD_PREP(DISP_AAL_GAMMA_LUT_B, hwlut.blue);
writel(word, aal->regs + DISP_AAL_GAMMA_LUT + i * 4);
}

cfg_val = readl(aal->regs + DISP_AAL_CFG);

/* Enable the gamma table */
cfg_val |= FIELD_PREP(AAL_GAMMA_LUT_EN, 1);

/* Disable RELAY mode to pass the processed image */
cfg_val &= ~AAL_RELAY_MODE;

writel(cfg_val, aal->regs + DISP_AAL_CFG);
}

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

static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
{ .compatible = "mediatek,mt8173-disp-aal",
.data = &mt8173_aal_driver_data},
{ .compatible = "mediatek,mt8183-disp-aal"},
{},
{ .compatible = "mediatek,mt8173-disp-aal", .data = &mt8173_aal_driver_data },
{ .compatible = "mediatek,mt8183-disp-aal" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mtk_disp_aal_driver_dt_match);

Expand Down
5 changes: 4 additions & 1 deletion drivers/gpu/drm/mediatek/mtk_disp_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ 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);
unsigned int mtk_aal_gamma_get_lut_size(struct device *dev);
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);
Expand Down Expand Up @@ -44,17 +45,19 @@ void mtk_dither_set_common(void __iomem *regs, struct cmdq_client_reg *cmdq_reg,

void mtk_dpi_start(struct device *dev);
void mtk_dpi_stop(struct device *dev);
unsigned int mtk_dpi_encoder_index(struct device *dev);

void mtk_dsi_ddp_start(struct device *dev);
void mtk_dsi_ddp_stop(struct device *dev);
unsigned int mtk_dsi_encoder_index(struct device *dev);

int mtk_gamma_clk_enable(struct device *dev);
void mtk_gamma_clk_disable(struct device *dev);
void mtk_gamma_config(struct device *dev, unsigned int w,
unsigned int h, unsigned int vrefresh,
unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
unsigned int mtk_gamma_get_lut_size(struct device *dev);
void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state);
void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff);
void mtk_gamma_start(struct device *dev);
void mtk_gamma_stop(struct device *dev);

Expand Down
Loading

0 comments on commit 035fdc3

Please sign in to comment.