.enable_vblank = atmel_hlcdc_crtc_enable_vblank,
        .disable_vblank = atmel_hlcdc_crtc_disable_vblank,
        .set_property = drm_atomic_helper_crtc_set_property,
+       .gamma_set = drm_atomic_helper_legacy_gamma_set,
 };
 
 int atmel_hlcdc_crtc_create(struct drm_device *dev)
        drm_crtc_helper_add(&crtc->base, &lcdc_crtc_helper_funcs);
        drm_crtc_vblank_reset(&crtc->base);
 
+       drm_mode_crtc_set_gamma_size(&crtc->base, ATMEL_HLCDC_CLUT_SIZE);
+       drm_crtc_enable_color_mgmt(&crtc->base, 0, false,
+                                  ATMEL_HLCDC_CLUT_SIZE);
+
        dc->crtc = &crtc->base;
 
        return 0;
 
                        .default_color = 3,
                        .general_config = 4,
                },
+               .clut_offset = 0x400,
        },
 };
 
                        .disc_pos = 5,
                        .disc_size = 6,
                },
+               .clut_offset = 0x400,
        },
        {
                .name = "overlay1",
                        .chroma_key_mask = 8,
                        .general_config = 9,
                },
+               .clut_offset = 0x800,
        },
        {
                .name = "high-end-overlay",
                        .scaler_config = 13,
                        .csc = 14,
                },
+               .clut_offset = 0x1000,
        },
        {
                .name = "cursor",
                        .chroma_key_mask = 8,
                        .general_config = 9,
                },
+               .clut_offset = 0x1400,
        },
 };
 
                        .disc_pos = 5,
                        .disc_size = 6,
                },
+               .clut_offset = 0x600,
        },
        {
                .name = "overlay1",
                        .chroma_key_mask = 8,
                        .general_config = 9,
                },
+               .clut_offset = 0xa00,
        },
        {
                .name = "overlay2",
                        .chroma_key_mask = 8,
                        .general_config = 9,
                },
+               .clut_offset = 0xe00,
        },
        {
                .name = "high-end-overlay",
                        },
                        .csc = 14,
                },
+               .clut_offset = 0x1200,
        },
        {
                .name = "cursor",
                        .general_config = 9,
                        .scaler_config = 13,
                },
+               .clut_offset = 0x1600,
        },
 };
 
                        .disc_pos = 5,
                        .disc_size = 6,
                },
+               .clut_offset = 0x600,
        },
        {
                .name = "overlay1",
                        .chroma_key_mask = 8,
                        .general_config = 9,
                },
+               .clut_offset = 0xa00,
        },
        {
                .name = "overlay2",
                        .chroma_key_mask = 8,
                        .general_config = 9,
                },
+               .clut_offset = 0xe00,
        },
        {
                .name = "high-end-overlay",
                        },
                        .csc = 14,
                },
+               .clut_offset = 0x1200,
        },
 };
 
 
 #define ATMEL_HLCDC_YUV422SWP                  BIT(17)
 #define ATMEL_HLCDC_DSCALEOPT                  BIT(20)
 
+#define ATMEL_HLCDC_C1_MODE                    ATMEL_HLCDC_CLUT_MODE(0)
+#define ATMEL_HLCDC_C2_MODE                    ATMEL_HLCDC_CLUT_MODE(1)
+#define ATMEL_HLCDC_C4_MODE                    ATMEL_HLCDC_CLUT_MODE(2)
+#define ATMEL_HLCDC_C8_MODE                    ATMEL_HLCDC_CLUT_MODE(3)
+
 #define ATMEL_HLCDC_XRGB4444_MODE              ATMEL_HLCDC_RGB_MODE(0)
 #define ATMEL_HLCDC_ARGB4444_MODE              ATMEL_HLCDC_RGB_MODE(1)
 #define ATMEL_HLCDC_RGBA4444_MODE              ATMEL_HLCDC_RGB_MODE(2)
 #define ATMEL_HLCDC_DMA_CHANNEL_DSCR_DONE      BIT(2)
 #define ATMEL_HLCDC_DMA_CHANNEL_DSCR_OVERRUN   BIT(3)
 
+#define ATMEL_HLCDC_CLUT_SIZE                  256
+
 #define ATMEL_HLCDC_MAX_LAYERS                 6
 
 /**
        int id;
        int regs_offset;
        int cfgs_offset;
+       int clut_offset;
        struct atmel_hlcdc_formats *formats;
        struct atmel_hlcdc_layer_cfg_layout layout;
        int max_width;
                                          (cfgid * sizeof(u32)));
 }
 
+static inline void atmel_hlcdc_layer_write_clut(struct atmel_hlcdc_layer *layer,
+                                               unsigned int c, u32 val)
+{
+       regmap_write(layer->regmap,
+                    layer->desc->clut_offset + c * sizeof(u32),
+                    val);
+}
+
 static inline void atmel_hlcdc_layer_init(struct atmel_hlcdc_layer *layer,
                                const struct atmel_hlcdc_layer_desc *desc,
                                struct regmap *regmap)
 
 #define SUBPIXEL_MASK                  0xffff
 
 static uint32_t rgb_formats[] = {
+       DRM_FORMAT_C8,
        DRM_FORMAT_XRGB4444,
        DRM_FORMAT_ARGB4444,
        DRM_FORMAT_RGBA4444,
 };
 
 static uint32_t rgb_and_yuv_formats[] = {
+       DRM_FORMAT_C8,
        DRM_FORMAT_XRGB4444,
        DRM_FORMAT_ARGB4444,
        DRM_FORMAT_RGBA4444,
 static int atmel_hlcdc_format_to_plane_mode(u32 format, u32 *mode)
 {
        switch (format) {
+       case DRM_FORMAT_C8:
+               *mode = ATMEL_HLCDC_C8_MODE;
+               break;
        case DRM_FORMAT_XRGB4444:
                *mode = ATMEL_HLCDC_XRGB4444_MODE;
                break;
                                    ATMEL_HLCDC_LAYER_FORMAT_CFG, cfg);
 }
 
+static void atmel_hlcdc_plane_update_clut(struct atmel_hlcdc_plane *plane)
+{
+       struct drm_crtc *crtc = plane->base.crtc;
+       struct drm_color_lut *lut;
+       int idx;
+
+       if (!crtc || !crtc->state)
+               return;
+
+       if (!crtc->state->color_mgmt_changed || !crtc->state->gamma_lut)
+               return;
+
+       lut = (struct drm_color_lut *)crtc->state->gamma_lut->data;
+
+       for (idx = 0; idx < ATMEL_HLCDC_CLUT_SIZE; idx++, lut++) {
+               u32 val = ((lut->red << 8) & 0xff0000) |
+                       (lut->green & 0xff00) |
+                       (lut->blue >> 8);
+
+               atmel_hlcdc_layer_write_clut(&plane->layer, idx, val);
+       }
+}
+
 static void atmel_hlcdc_plane_update_buffers(struct atmel_hlcdc_plane *plane,
                                        struct atmel_hlcdc_plane_state *state)
 {
        atmel_hlcdc_plane_update_pos_and_size(plane, state);
        atmel_hlcdc_plane_update_general_settings(plane, state);
        atmel_hlcdc_plane_update_format(plane, state);
+       atmel_hlcdc_plane_update_clut(plane);
        atmel_hlcdc_plane_update_buffers(plane, state);
        atmel_hlcdc_plane_update_disc_area(plane, state);