drm/fb_cma_helper: Remove implicit call to disable_unused_functions
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Thu, 14 Jan 2016 15:24:56 +0000 (16:24 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 15 Jan 2016 10:16:15 +0000 (11:16 +0100)
The drm_fbdev_cma_init function always calls the
drm_helper_disable_unused_functions. Since it's part of the usual probe
process, all the drivers using that helper will end up having their encoder
and CRTC disable functions called at probe if their device has not been
reported as enabled.

This could be fixed by reading out from the registers the current state of
the device if it is enabled, but even that will not handle the case where
the device is actually disabled.

Moreover, the drivers using the atomic modesetting expect that their enable
and disable callback to be called when the device is already enabled or
disabled (respectively).

We can however fix this issue by moving the call to
drm_helper_disable_unused_functions out of drm_fbdev_cma_init and make the
drivers needing it (all the drivers calling drm_fbdev_cma_init and not
using the atomic modesetting) explicitly call it.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1452785109-6172-14-git-send-email-maxime.ripard@free-electrons.com
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/drm_fb_cma_helper.c
drivers/gpu/drm/imx/imx-drm-core.c
drivers/gpu/drm/sti/sti_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c

index 5543fa806aec1888deb2d96e3ea351bfdf17a1e8..c895b6fddbd818052335dff264cfe9685fc3af67 100644 (file)
@@ -348,9 +348,6 @@ struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
 
        }
 
-       /* disable all the possible outputs/crtcs before entering KMS mode */
-       drm_helper_disable_unused_functions(dev);
-
        ret = drm_fb_helper_initial_config(helper, preferred_bpp);
        if (ret < 0) {
                dev_err(dev->dev, "Failed to set initial hw configuration.\n");
index 7be7ac80830430318a62b2c4739431c75d4fda37..2f57d79674175c85c8a5ac1870ac57de3a1b0763 100644 (file)
@@ -305,6 +305,7 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
                dev_warn(drm->dev, "Invalid legacyfb_depth.  Defaulting to 16bpp\n");
                legacyfb_depth = 16;
        }
+       drm_helper_disable_unused_functions(drm);
        imxdrm->fbhelper = drm_fbdev_cma_init(drm, legacyfb_depth,
                                drm->mode_config.num_crtc, MAX_CRTC);
        if (IS_ERR(imxdrm->fbhelper)) {
index 1469987949d88f8b43cfdd97990e925156a149ec..506b5626f3ed2ed3a188ff9bc1e51144e40b8932 100644 (file)
@@ -160,6 +160,7 @@ static int sti_load(struct drm_device *dev, unsigned long flags)
 
        drm_mode_config_reset(dev);
 
+       drm_helper_disable_unused_functions(dev);
        drm_fbdev_cma_init(dev, 32,
                           dev->mode_config.num_crtc,
                           dev->mode_config.num_connector);
index 4ddb21e7f52fe207bf2b034627b8bd09357b803c..d7f5b897c6c57a18c70536b39a2265b1af6268c2 100644 (file)
@@ -294,6 +294,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
                        break;
        }
 
+       drm_helper_disable_unused_functions(dev);
        priv->fbdev = drm_fbdev_cma_init(dev, bpp,
                        dev->mode_config.num_crtc,
                        dev->mode_config.num_connector);