drm/kms: protect against fb helper not being created.
authorDave Airlie <airlied@linux.ie>
Fri, 25 Sep 2009 20:39:00 +0000 (06:39 +1000)
committerDave Airlie <airlied@linux.ie>
Fri, 25 Sep 2009 20:39:00 +0000 (06:39 +1000)
If drivers don't init the fb helper on the connector, the cmdline
code won't work, but it shouldn't crash either.

Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_crtc_helper.c
drivers/gpu/drm/drm_fb_helper.c

index 82fd6e82450f665d4bfcca644b13a95d2161bd00..1fe4e1d344fdb1e6f21910d87b4795cd5986f933 100644 (file)
@@ -279,16 +279,25 @@ static struct drm_display_mode *drm_has_preferred_mode(struct drm_connector *con
 static bool drm_has_cmdline_mode(struct drm_connector *connector)
 {
        struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
-       struct drm_fb_helper_cmdline_mode *cmdline_mode = &fb_help_conn->cmdline_mode;
+       struct drm_fb_helper_cmdline_mode *cmdline_mode;
+
+       if (!fb_help_conn)
+               return false;
+
+       cmdline_mode = &fb_help_conn->cmdline_mode;
        return cmdline_mode->specified;
 }
 
 static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_connector *connector, int width, int height)
 {
        struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
-       struct drm_fb_helper_cmdline_mode *cmdline_mode = &fb_help_conn->cmdline_mode;
+       struct drm_fb_helper_cmdline_mode *cmdline_mode;
        struct drm_display_mode *mode = NULL;
 
+       if (!fb_help_conn)
+               return mode;
+
+       cmdline_mode = &fb_help_conn->cmdline_mode;
        if (cmdline_mode->specified == false)
                return mode;
 
index 2537d2e81849e8eb67b1a071a341ce1f55de702d..10d810ef8faafedb5ef7a9827a08844864b862f3 100644 (file)
@@ -90,8 +90,12 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con
        int i;
        enum drm_connector_force force = DRM_FORCE_UNSPECIFIED;
        struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
-       struct drm_fb_helper_cmdline_mode *cmdline_mode = &fb_help_conn->cmdline_mode;
+       struct drm_fb_helper_cmdline_mode *cmdline_mode;
 
+       if (!fb_help_conn)
+               return false;
+
+       cmdline_mode = &fb_help_conn->cmdline_mode;
        if (!mode_option)
                mode_option = fb_mode_option;
 
@@ -694,7 +698,13 @@ int drm_fb_helper_single_fb_probe(struct drm_device *dev,
        /* first up get a count of crtcs now in use and new min/maxes width/heights */
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
-               struct drm_fb_helper_cmdline_mode *cmdline_mode = &fb_help_conn->cmdline_mode;
+
+               struct drm_fb_helper_cmdline_mode *cmdline_mode;
+
+               if (!fb_help_conn)
+                       continue;
+               
+               cmdline_mode = &fb_help_conn->cmdline_mode;
 
                if (cmdline_mode->bpp_specified) {
                        switch (cmdline_mode->bpp) {