Re: [PATCH] drm/hisilicon/hibmc: add gamma_set function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On Mon, 23 Dec 2019 at 15:50, Zhihui Chen <chenzhihui4@xxxxxxxxxx> wrote:
add gamma_set function, and we can also use it to adjust the brightness of the
display.

Signed-off-by: Zhihui Chen <chenzhihui4@xxxxxxxxxx>

Thanks for the patch.
Acked-by: Xinliang Liu <xinliang.liu@xxxxxxxxxx>
Applied to drm-misc-next.
 
---
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_de.c    | 37 +++++++++++++++++++
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h  |  5 +++
 2 files changed, 42 insertions(+)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
index 24de937c1cb1..f1ce6cb099d0 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c
@@ -456,6 +456,42 @@ static void hibmc_crtc_disable_vblank(struct drm_crtc *crtc)
               priv->mmio + HIBMC_RAW_INTERRUPT_EN);
 }

+static void hibmc_crtc_load_lut(struct drm_crtc *crtc)
+{
+       struct hibmc_drm_private *priv = crtc->dev->dev_private;
+       void __iomem   *mmio = priv->mmio;
+       u16 *r, *g, *b;
+       unsigned int reg;
+       int i;
+
+       r = crtc->gamma_store;
+       g = r + crtc->gamma_size;
+       b = g + crtc->gamma_size;
+
+       for (i = 0; i < crtc->gamma_size; i++) {
+               unsigned int offset = i << 2;
+               u8 red = *r++ >> 8;
+               u8 green = *g++ >> 8;
+               u8 blue = *b++ >> 8;
+               u32 rgb = (red << 16) | (green << 8) | blue;
+
+               writel(rgb, mmio + HIBMC_CRT_PALETTE + offset);
+       }
+
+       reg = readl(priv->mmio + HIBMC_CRT_DISP_CTL);
+       reg |= HIBMC_FIELD(HIBMC_CTL_DISP_CTL_GAMMA, 1);
+       writel(reg, priv->mmio + HIBMC_CRT_DISP_CTL);
+}
+
+static int hibmc_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
+                             u16 *blue, uint32_t size,
+                             struct drm_modeset_acquire_ctx *ctx)
+{
+       hibmc_crtc_load_lut(crtc);
+
+       return 0;
+}
+
 static const struct drm_crtc_funcs hibmc_crtc_funcs = {
        .page_flip = drm_atomic_helper_page_flip,
        .set_config = drm_atomic_helper_set_config,
@@ -465,6 +501,7 @@ static const struct drm_crtc_funcs hibmc_crtc_funcs = {
        .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
        .enable_vblank = hibmc_crtc_enable_vblank,
        .disable_vblank = hibmc_crtc_disable_vblank,
+       .gamma_set = hibmc_crtc_gamma_set,
 };

 static const struct drm_crtc_helper_funcs hibmc_crtc_helper_funcs = {
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h
index b9e20cfcfb5a..9b7e85947113 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h
@@ -91,6 +91,9 @@
 #define HIBMC_CRT_DISP_CTL_TIMING(x)           ((x) << 8)
 #define HIBMC_CRT_DISP_CTL_TIMING_MASK         0x100

+#define HIBMC_CTL_DISP_CTL_GAMMA(x)            ((x) << 3)
+#define HIBMC_CTL_DISP_CTL_GAMMA_MASK          0x08
+
 #define HIBMC_CRT_DISP_CTL_PLANE(x)            ((x) << 2)
 #define HIBMC_CRT_DISP_CTL_PLANE_MASK          4

@@ -193,5 +196,7 @@
 #define CRT_PLL2_HS_148MHZ                     0xB0CCCCCD
 #define CRT_PLL2_HS_193MHZ                     0xC0872B02

+#define HIBMC_CRT_PALETTE                       0x80C00
+
 #define HIBMC_FIELD(field, value) (field(value) & field##_MASK)
 #endif
--
2.20.1


_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux