unsigned long mode_rate;
        struct videomode vm;
        unsigned long prate;
-       unsigned int cfg;
+       unsigned int mask = ATMEL_HLCDC_CLKDIV_MASK | ATMEL_HLCDC_CLKPOL;
+       unsigned int cfg = 0;
        int div;
 
        vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay;
                     (adj->crtc_hdisplay - 1) |
                     ((adj->crtc_vdisplay - 1) << 16));
 
-       cfg = ATMEL_HLCDC_CLKSEL;
+       if (!crtc->dc->desc->fixed_clksrc) {
+               cfg |= ATMEL_HLCDC_CLKSEL;
+               mask |= ATMEL_HLCDC_CLKSEL;
+       }
 
        prate = 2 * clk_get_rate(crtc->dc->hlcdc->sys_clk);
        mode_rate = adj->crtc_clock * 1000;
 
        cfg |= ATMEL_HLCDC_CLKDIV(div);
 
-       regmap_update_bits(regmap, ATMEL_HLCDC_CFG(0),
-                          ATMEL_HLCDC_CLKSEL | ATMEL_HLCDC_CLKDIV_MASK |
-                          ATMEL_HLCDC_CLKPOL, cfg);
+       regmap_update_bits(regmap, ATMEL_HLCDC_CFG(0), mask, cfg);
 
        cfg = 0;
 
 
  * @max_hpw: maximum horizontal back/front porch width
  * @conflicting_output_formats: true if RGBXXX output formats conflict with
  *                             each other.
+ * @fixed_clksrc: true if clock source is fixed
  * @layers: a layer description table describing available layers
  * @nlayers: layer description table size
  */
        int max_vpw;
        int max_hpw;
        bool conflicting_output_formats;
+       bool fixed_clksrc;
        const struct atmel_hlcdc_layer_desc *layers;
        int nlayers;
 };