These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / msm / mdp / mdp4 / mdp4_kms.c
index d847b94..077f752 100644 (file)
@@ -119,6 +119,8 @@ static int mdp4_hw_init(struct msm_kms *kms)
        if (mdp4_kms->rev > 1)
                mdp4_write(mdp4_kms, REG_MDP4_RESET_STATUS, 1);
 
+       dev->mode_config.allow_fb_modifiers = true;
+
 out:
        pm_runtime_put_sync(dev->dev);
 
@@ -157,6 +159,12 @@ static void mdp4_complete_commit(struct msm_kms *kms, struct drm_atomic_state *s
        mdp4_disable(mdp4_kms);
 }
 
+static void mdp4_wait_for_crtc_commit_done(struct msm_kms *kms,
+                                               struct drm_crtc *crtc)
+{
+       mdp4_crtc_wait_for_commit_done(crtc);
+}
+
 static long mdp4_round_pixclk(struct msm_kms *kms, unsigned long rate,
                struct drm_encoder *encoder)
 {
@@ -195,6 +203,7 @@ static const struct mdp_kms_funcs kms_funcs = {
                .disable_vblank  = mdp4_disable_vblank,
                .prepare_commit  = mdp4_prepare_commit,
                .complete_commit = mdp4_complete_commit,
+               .wait_for_crtc_commit_done = mdp4_wait_for_crtc_commit_done,
                .get_format      = mdp_get_format,
                .round_pixclk    = mdp4_round_pixclk,
                .preclose        = mdp4_preclose,
@@ -232,22 +241,37 @@ int mdp4_enable(struct mdp4_kms *mdp4_kms)
 }
 
 #ifdef CONFIG_OF
-static struct drm_panel *detect_panel(struct drm_device *dev, const char *name)
+static struct drm_panel *detect_panel(struct drm_device *dev)
 {
-       struct device_node *n;
+       struct device_node *endpoint, *panel_node;
+       struct device_node *np = dev->dev->of_node;
        struct drm_panel *panel = NULL;
 
-       n = of_parse_phandle(dev->dev->of_node, name, 0);
-       if (n) {
-               panel = of_drm_find_panel(n);
-               if (!panel)
-                       panel = ERR_PTR(-EPROBE_DEFER);
+       endpoint = of_graph_get_next_endpoint(np, NULL);
+       if (!endpoint) {
+               dev_err(dev->dev, "no valid endpoint\n");
+               return ERR_PTR(-ENODEV);
+       }
+
+       panel_node = of_graph_get_remote_port_parent(endpoint);
+       if (!panel_node) {
+               dev_err(dev->dev, "no valid panel node\n");
+               of_node_put(endpoint);
+               return ERR_PTR(-ENODEV);
+       }
+
+       of_node_put(endpoint);
+
+       panel = of_drm_find_panel(panel_node);
+       if (!panel) {
+               of_node_put(panel_node);
+               return ERR_PTR(-EPROBE_DEFER);
        }
 
        return panel;
 }
 #else
-static struct drm_panel *detect_panel(struct drm_device *dev, const char *name)
+static struct drm_panel *detect_panel(struct drm_device *dev)
 {
        // ??? maybe use a module param to specify which panel is attached?
 }
@@ -285,7 +309,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
         * Setup the LCDC/LVDS path: RGB2 -> DMA_P -> LCDC -> LVDS:
         */
 
-       panel = detect_panel(dev, "qcom,lvds-panel");
+       panel = detect_panel(dev);
        if (IS_ERR(panel)) {
                ret = PTR_ERR(panel);
                dev_err(dev->dev, "failed to detect LVDS panel: %d\n", ret);
@@ -518,6 +542,11 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
                goto fail;
        }
 
+       dev->mode_config.min_width = 0;
+       dev->mode_config.min_height = 0;
+       dev->mode_config.max_width = 2048;
+       dev->mode_config.max_height = 2048;
+
        return kms;
 
 fail: