]> Git Repo - J-linux.git/commitdiff
Merge tag 'mediatek-drm-next-6.7' of https://git.kernel.org/pub/scm/linux/kernel...
authorDave Airlie <[email protected]>
Fri, 20 Oct 2023 06:20:04 +0000 (16:20 +1000)
committerDave Airlie <[email protected]>
Fri, 20 Oct 2023 06:34:38 +0000 (16:34 +1000)
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 <[email protected]>
From: Chun-Kuang Hu <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1  2 
drivers/gpu/drm/mediatek/mtk_disp_aal.c

index 4da9ac93b29e3c313c738b6422c80bbe4ba81850,ca50160a0c732aecb7193e5c22d9397b9034a4de..2209159d885572f7d7165addc22a1552859b2386
@@@ -3,6 -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>
  
  #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;
@@@ -51,17 -68,69 +69,69 @@@ void mtk_aal_config(struct device *dev
                           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)
@@@ -144,10 -213,9 +214,9 @@@ static const struct mtk_disp_aal_data m
  };
  
  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);
  
This page took 0.056018 seconds and 4 git commands to generate.