diff mbox series

drm/hisilicon/hibmc: add gamma_set function

Message ID 20191223074910.1030-1-chenzhihui4@huawei.com (mailing list archive)
State New, archived
Headers show
Series drm/hisilicon/hibmc: add gamma_set function | expand

Commit Message

Zhihui Chen Dec. 23, 2019, 7:49 a.m. UTC
add gamma_set function, and we can also use it to adjust the brightness of the
display.

Signed-off-by: Zhihui Chen <chenzhihui4@huawei.com>
---
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_de.c    | 37 +++++++++++++++++++
 .../gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h  |  5 +++
 2 files changed, 42 insertions(+)

Comments

Xinliang Liu Feb. 13, 2020, 10:11 a.m. UTC | #1
On Mon, 23 Dec 2019 at 15:50, Zhihui Chen <chenzhihui4@huawei.com> wrote:

> add gamma_set function, and we can also use it to adjust the brightness of
> the
> display.
>
> Signed-off-by: Zhihui Chen <chenzhihui4@huawei.com>
>

Thanks for the patch.
Acked-by: Xinliang Liu <xinliang.liu@linaro.org>
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
>
>
>
diff mbox series

Patch

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