struct completion       comp;
        int                     dc_irq;
        int                     dp_irq;
+       int                     use_count;
 };
 
 static void dc_link_event(struct ipu_dc *dc, int event, int addr, int priority)
 
 void ipu_dc_enable(struct ipu_soc *ipu)
 {
-       ipu_module_enable(ipu, IPU_CONF_DC_EN);
+       struct ipu_dc_priv *priv = ipu->dc_priv;
+
+       mutex_lock(&priv->mutex);
+
+       if (!priv->use_count)
+               ipu_module_enable(priv->ipu, IPU_CONF_DC_EN);
+
+       priv->use_count++;
+
+       mutex_unlock(&priv->mutex);
 }
 EXPORT_SYMBOL_GPL(ipu_dc_enable);
 
 
 void ipu_dc_disable(struct ipu_soc *ipu)
 {
-       ipu_module_disable(ipu, IPU_CONF_DC_EN);
+       struct ipu_dc_priv *priv = ipu->dc_priv;
+
+       mutex_lock(&priv->mutex);
+
+       priv->use_count--;
+       if (!priv->use_count)
+               ipu_module_disable(priv->ipu, IPU_CONF_DC_EN);
+
+       if (priv->use_count < 0)
+               priv->use_count = 0;
+
+       mutex_unlock(&priv->mutex);
 }
 EXPORT_SYMBOL_GPL(ipu_dc_disable);