On 18/09/13 14:08, Archit Taneja wrote:
> Some omapdss panels are connected to outputs/encoders(HDMI/DSI/DPI) that 
> require
> regulators. The output's connect op tries to get a regulator which may not 
> exist
> yet because it might get registered later in the kernel boot.
> 
> omapdrm currently ignores those panels which return a non zero value when
> connected. A better approach would be for omapdrm to request for probe
> deferral if a panel's connect op returns -EPROBE_DEFER.
> 
> The connecting of panels is moved very early in the the drm device's probe
> before anything else is initialized. When we enter omap_modeset_init(), we 
> have
> a set of panels that have been connected. We now proceed with registering only
> those panels which are already connected.
> 
> Checking whether the panel has a driver or whether it has get_timing/read_edid
> ops in omap_modeset_init() are redundant with the new display model. These can
> be removed since a dssdev device will always have a driver associated with it,
> and all dssdev drivers have a get_timings op.
> 
> This fixes boot with omapdrm on an omap4 panda ES board. The regulators used 
> by
> HDMI aren't initialized because I2c isn't initialized, I2C isn't initialized
> as it's pins are not configured because pinctrl is yet to probe.
> 
> Signed-off-by: Archit Taneja <[email protected]>
> ---
>  drivers/gpu/drm/omapdrm/omap_crtc.c |  5 ++++
>  drivers/gpu/drm/omapdrm/omap_drv.c  | 51 
> +++++++++++++++++++++----------------
>  drivers/gpu/drm/omapdrm/omap_drv.h  |  1 +
>  3 files changed, 35 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c 
> b/drivers/gpu/drm/omapdrm/omap_crtc.c
> index 0fd2eb1..9c01311 100644
> --- a/drivers/gpu/drm/omapdrm/omap_crtc.c
> +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
> @@ -623,6 +623,11 @@ void omap_crtc_pre_init(void)
>       dss_install_mgr_ops(&mgr_ops);
>  }
>  
> +void omap_crtc_pre_uninit(void)
> +{
> +     dss_uninstall_mgr_ops();
> +}
> +
>  /* initialize crtc */
>  struct drm_crtc *omap_crtc_init(struct drm_device *dev,
>               struct drm_plane *plane, enum omap_channel channel, int id)
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c 
> b/drivers/gpu/drm/omapdrm/omap_drv.c
> index 2603d90..cbe5d8e 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.c
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.c
> @@ -87,6 +87,24 @@ static bool channel_used(struct drm_device *dev, enum 
> omap_channel channel)
>       return false;
>  }
>  
> +static int omap_connect_dssdevs(void)
> +{
> +     int r;
> +     struct omap_dss_device *dssdev = NULL;
> +
> +     for_each_dss_dev(dssdev) {
> +             r = dssdev->driver->connect(dssdev);
> +             if (r == -EPROBE_DEFER) {
> +                     return r;
> +             } else if (r) {
> +                     dev_warn(dssdev->dev, "could not connect display: %s\n",
> +                             dssdev->name);
> +             }
> +     }
> +
> +     return 0;
> +}

Beagle-xm with DT boot doesn't work with this. There are no displays at
omapdrm probe time, so omapdrm doesn't find any displays. I added the
changes below, which made it work.

 Tomi

diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c 
b/drivers/gpu/drm/omapdrm/omap_drv.c
index cbe5d8e..e315413 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -91,6 +91,7 @@ static int omap_connect_dssdevs(void)
 {
        int r;
        struct omap_dss_device *dssdev = NULL;
+       bool no_displays = true;
 
        for_each_dss_dev(dssdev) {
                r = dssdev->driver->connect(dssdev);
@@ -99,9 +100,14 @@ static int omap_connect_dssdevs(void)
                } else if (r) {
                        dev_warn(dssdev->dev, "could not connect display: %s\n",
                                dssdev->name);
+               } else {
+                       no_displays = false;
                }
        }
 
+       if (no_displays)
+               return -EPROBE_DEFER;
+
        return 0;
 }


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to