drm: encapsulate crtc->set_config calls
With refcounting we need to adjust framebuffer refcounts at each callsite - much easier to do if they all call the same little helper function. Reviewed-by: Rob Clark <rob@ti.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
af26ef3b39
commit
2d13b6796e
|
@ -381,7 +381,7 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
|
|||
memset(&set, 0, sizeof(struct drm_mode_set));
|
||||
set.crtc = crtc;
|
||||
set.fb = NULL;
|
||||
ret = crtc->funcs->set_config(&set);
|
||||
ret = drm_mode_set_config_internal(&set);
|
||||
if (ret)
|
||||
DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc);
|
||||
}
|
||||
|
@ -1800,6 +1800,21 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_mode_set_config_internal - helper to call ->set_config
|
||||
* @set: modeset config to set
|
||||
*
|
||||
* This is a little helper to wrap internal calls to the ->set_config driver
|
||||
* interface. The only thing it adds is correct refcounting dance.
|
||||
*/
|
||||
int drm_mode_set_config_internal(struct drm_mode_set *set)
|
||||
{
|
||||
struct drm_crtc *crtc = set->crtc;
|
||||
|
||||
return crtc->funcs->set_config(set);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_mode_set_config_internal);
|
||||
|
||||
/**
|
||||
* drm_mode_setcrtc - set CRTC configuration
|
||||
* @dev: drm device for the ioctl
|
||||
|
@ -1963,7 +1978,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
|
|||
set.connectors = connector_set;
|
||||
set.num_connectors = crtc_req->count_connectors;
|
||||
set.fb = fb;
|
||||
ret = crtc->funcs->set_config(&set);
|
||||
ret = drm_mode_set_config_internal(&set);
|
||||
|
||||
out:
|
||||
kfree(connector_set);
|
||||
|
|
|
@ -245,7 +245,7 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
|
|||
int i, ret;
|
||||
for (i = 0; i < fb_helper->crtc_count; i++) {
|
||||
struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
|
||||
ret = mode_set->crtc->funcs->set_config(mode_set);
|
||||
ret = drm_mode_set_config_internal(mode_set);
|
||||
if (ret)
|
||||
error = true;
|
||||
}
|
||||
|
@ -675,7 +675,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
|
|||
mutex_lock(&dev->mode_config.mutex);
|
||||
for (i = 0; i < fb_helper->crtc_count; i++) {
|
||||
crtc = fb_helper->crtc_info[i].mode_set.crtc;
|
||||
ret = crtc->funcs->set_config(&fb_helper->crtc_info[i].mode_set);
|
||||
ret = drm_mode_set_config_internal(&fb_helper->crtc_info[i].mode_set);
|
||||
if (ret) {
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
return ret;
|
||||
|
@ -711,7 +711,7 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
|
|||
modeset->y = var->yoffset;
|
||||
|
||||
if (modeset->num_connectors) {
|
||||
ret = crtc->funcs->set_config(modeset);
|
||||
ret = drm_mode_set_config_internal(modeset);
|
||||
if (!ret) {
|
||||
info->var.xoffset = var->xoffset;
|
||||
info->var.yoffset = var->yoffset;
|
||||
|
|
|
@ -364,7 +364,7 @@ static int ch7006_encoder_set_property(struct drm_encoder *encoder,
|
|||
.crtc = crtc,
|
||||
};
|
||||
|
||||
crtc->funcs->set_config(&modeset);
|
||||
drm_mode_set_config_internal(&modeset);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -140,7 +140,7 @@ nv04_display_destroy(struct drm_device *dev)
|
|||
.crtc = crtc,
|
||||
};
|
||||
|
||||
crtc->funcs->set_config(&modeset);
|
||||
drm_mode_set_config_internal(&modeset);
|
||||
}
|
||||
|
||||
/* Restore state */
|
||||
|
|
|
@ -768,7 +768,7 @@ static int nv17_tv_set_property(struct drm_encoder *encoder,
|
|||
.crtc = crtc,
|
||||
};
|
||||
|
||||
crtc->funcs->set_config(&modeset);
|
||||
drm_mode_set_config_internal(&modeset);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -829,7 +829,7 @@ static void vmw_lastclose(struct drm_device *dev)
|
|||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
set.crtc = crtc;
|
||||
ret = crtc->funcs->set_config(&set);
|
||||
ret = drm_mode_set_config_internal(&set);
|
||||
WARN_ON(ret != 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -985,6 +985,7 @@ extern int drm_mode_getcrtc(struct drm_device *dev,
|
|||
void *data, struct drm_file *file_priv);
|
||||
extern int drm_mode_getconnector(struct drm_device *dev,
|
||||
void *data, struct drm_file *file_priv);
|
||||
extern int drm_mode_set_config_internal(struct drm_mode_set *set);
|
||||
extern int drm_mode_setcrtc(struct drm_device *dev,
|
||||
void *data, struct drm_file *file_priv);
|
||||
extern int drm_mode_getplane(struct drm_device *dev,
|
||||
|
|
Loading…
Reference in New Issue