drm/fb-helper: add new drm_setup_crtcs_fb() function
This adds a new drm_setup_crtcs_fb() function to handle the parts of drm_setup_crtcs() that touch fb_helper->fb and fb_helper->fbdev. When drm_setup_crtcs() is called during initialization, these fields are NULL because they have not been allocated yet. There is currently a hack at the end of drm_fb_helper_single_fb_probe() that sets fb_helper->fb, so it is moved to the new drm_setup_crtcs_fb() function. This is also done in preparation for addition setup that requires access to fb_helper->fbdev. Signed-off-by: David Lechner <david@lechnology.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/1501777149-8310-2-git-send-email-david@lechnology.com
This commit is contained in:
parent
f3a73544da
commit
f461bd2b49
|
@ -1821,17 +1821,6 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Set the fb pointer - usually drm_setup_crtcs does this for hotplug
|
||||
* events, but at init time drm_setup_crtcs needs to be called before
|
||||
* the fb is allocated (since we need to figure out the desired size of
|
||||
* the fb before we can allocate it ...). Hence we need to fix things up
|
||||
* here again.
|
||||
*/
|
||||
for (i = 0; i < fb_helper->crtc_count; i++)
|
||||
if (fb_helper->crtc_info[i].mode_set.num_connectors)
|
||||
fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2426,7 +2415,6 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
|
|||
fb_crtc->desired_mode);
|
||||
drm_connector_get(connector);
|
||||
modeset->connectors[modeset->num_connectors++] = connector;
|
||||
modeset->fb = fb_helper->fb;
|
||||
modeset->x = offset->x;
|
||||
modeset->y = offset->y;
|
||||
}
|
||||
|
@ -2438,6 +2426,22 @@ out:
|
|||
kfree(enabled);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a continuation of drm_setup_crtcs() that sets up anything related
|
||||
* to the framebuffer. During initialization, drm_setup_crtcs() is called before
|
||||
* the framebuffer has been allocated (fb_helper->fb and fb_helper->fbdev).
|
||||
* So, any setup that touches those fields needs to be done here instead of in
|
||||
* drm_setup_crtcs().
|
||||
*/
|
||||
static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < fb_helper->crtc_count; i++)
|
||||
if (fb_helper->crtc_info[i].mode_set.num_connectors)
|
||||
fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
|
||||
}
|
||||
|
||||
/* Note: Drops fb_helper->lock before returning. */
|
||||
static int
|
||||
__drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper,
|
||||
|
@ -2463,6 +2467,7 @@ __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper,
|
|||
|
||||
return ret;
|
||||
}
|
||||
drm_setup_crtcs_fb(fb_helper);
|
||||
|
||||
fb_helper->deferred_setup = false;
|
||||
|
||||
|
@ -2591,6 +2596,7 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
|
|||
DRM_DEBUG_KMS("\n");
|
||||
|
||||
drm_setup_crtcs(fb_helper, fb_helper->fb->width, fb_helper->fb->height);
|
||||
drm_setup_crtcs_fb(fb_helper);
|
||||
mutex_unlock(&fb_helper->lock);
|
||||
|
||||
drm_fb_helper_set_par(fb_helper->fbdev);
|
||||
|
|
Loading…
Reference in New Issue