diff --git a/sys/arch/arm/rockchip/rk_drm.c b/sys/arch/arm/rockchip/rk_drm.c index 2d57727f1b77..5e2e212f9fee 100644 --- a/sys/arch/arm/rockchip/rk_drm.c +++ b/sys/arch/arm/rockchip/rk_drm.c @@ -235,16 +235,8 @@ rk_drm_fb_create(struct drm_device *ddev, struct drm_file *file, return NULL; fb = kmem_zalloc(sizeof(*fb), KM_SLEEP); + drm_helper_mode_fill_fb_struct(ddev, &fb->base, cmd); fb->obj = to_drm_gem_cma_obj(gem_obj); - fb->base.pitches[0] = cmd->pitches[0]; - fb->base.pitches[1] = cmd->pitches[1]; - fb->base.pitches[2] = cmd->pitches[2]; - fb->base.offsets[0] = cmd->offsets[0]; - fb->base.offsets[1] = cmd->offsets[2]; - fb->base.offsets[2] = cmd->offsets[1]; - fb->base.width = cmd->width; - fb->base.height = cmd->height; - fb->base.format = drm_format_info(cmd->pixel_format); error = drm_framebuffer_init(ddev, &fb->base, &rk_drm_framebuffer_funcs); if (error != 0) @@ -296,10 +288,14 @@ rk_drm_fb_probe(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size return -ENOMEM; } + /* similar to drm_helper_mode_fill_fb_struct(), but we have no cmd */ fb->pitches[0] = pitch; fb->offsets[0] = 0; fb->width = width; fb->height = height; + fb->dev = ddev; + fb->modifier = 0; + fb->flags = 0; #ifdef __ARM_BIG_ENDIAN fb->format = drm_format_info(DRM_FORMAT_BGRX8888); #else diff --git a/sys/arch/arm/rockchip/rk_fb.c b/sys/arch/arm/rockchip/rk_fb.c index b165daf2e89f..d13fddeecf7b 100644 --- a/sys/arch/arm/rockchip/rk_fb.c +++ b/sys/arch/arm/rockchip/rk_fb.c @@ -102,7 +102,9 @@ rk_fb_attach(device_t parent, device_t self, void *aux) .da_params = &rkfb_drmfb_params, }; + mutex_unlock(&sfa->sfa_fb_helper->lock); /* XXX */ error = drmfb_attach(&sc->sc_drmfb, &da); + mutex_lock(&sfa->sfa_fb_helper->lock); /* XXX */ if (error) { aprint_error_dev(self, "failed to attach drmfb: %d\n", error); return;