Commit 2d13b679 authored by Daniel Vetter's avatar Daniel Vetter

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: default avatarRob Clark <rob@ti.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent af26ef3b
...@@ -381,7 +381,7 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb) ...@@ -381,7 +381,7 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
memset(&set, 0, sizeof(struct drm_mode_set)); memset(&set, 0, sizeof(struct drm_mode_set));
set.crtc = crtc; set.crtc = crtc;
set.fb = NULL; set.fb = NULL;
ret = crtc->funcs->set_config(&set); ret = drm_mode_set_config_internal(&set);
if (ret) if (ret)
DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc); DRM_ERROR("failed to reset crtc %p when fb was deleted\n", crtc);
} }
...@@ -1800,6 +1800,21 @@ int drm_mode_setplane(struct drm_device *dev, void *data, ...@@ -1800,6 +1800,21 @@ int drm_mode_setplane(struct drm_device *dev, void *data,
return ret; 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 * drm_mode_setcrtc - set CRTC configuration
* @dev: drm device for the ioctl * @dev: drm device for the ioctl
...@@ -1963,7 +1978,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -1963,7 +1978,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
set.connectors = connector_set; set.connectors = connector_set;
set.num_connectors = crtc_req->count_connectors; set.num_connectors = crtc_req->count_connectors;
set.fb = fb; set.fb = fb;
ret = crtc->funcs->set_config(&set); ret = drm_mode_set_config_internal(&set);
out: out:
kfree(connector_set); kfree(connector_set);
......
...@@ -245,7 +245,7 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) ...@@ -245,7 +245,7 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
int i, ret; int i, ret;
for (i = 0; i < fb_helper->crtc_count; i++) { for (i = 0; i < fb_helper->crtc_count; i++) {
struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; 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) if (ret)
error = true; error = true;
} }
...@@ -675,7 +675,7 @@ int drm_fb_helper_set_par(struct fb_info *info) ...@@ -675,7 +675,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
mutex_lock(&dev->mode_config.mutex); mutex_lock(&dev->mode_config.mutex);
for (i = 0; i < fb_helper->crtc_count; i++) { for (i = 0; i < fb_helper->crtc_count; i++) {
crtc = fb_helper->crtc_info[i].mode_set.crtc; 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) { if (ret) {
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
return ret; return ret;
...@@ -711,7 +711,7 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, ...@@ -711,7 +711,7 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
modeset->y = var->yoffset; modeset->y = var->yoffset;
if (modeset->num_connectors) { if (modeset->num_connectors) {
ret = crtc->funcs->set_config(modeset); ret = drm_mode_set_config_internal(modeset);
if (!ret) { if (!ret) {
info->var.xoffset = var->xoffset; info->var.xoffset = var->xoffset;
info->var.yoffset = var->yoffset; info->var.yoffset = var->yoffset;
......
...@@ -364,7 +364,7 @@ static int ch7006_encoder_set_property(struct drm_encoder *encoder, ...@@ -364,7 +364,7 @@ static int ch7006_encoder_set_property(struct drm_encoder *encoder,
.crtc = crtc, .crtc = crtc,
}; };
crtc->funcs->set_config(&modeset); drm_mode_set_config_internal(&modeset);
} }
} }
......
...@@ -140,7 +140,7 @@ nv04_display_destroy(struct drm_device *dev) ...@@ -140,7 +140,7 @@ nv04_display_destroy(struct drm_device *dev)
.crtc = crtc, .crtc = crtc,
}; };
crtc->funcs->set_config(&modeset); drm_mode_set_config_internal(&modeset);
} }
/* Restore state */ /* Restore state */
......
...@@ -768,7 +768,7 @@ static int nv17_tv_set_property(struct drm_encoder *encoder, ...@@ -768,7 +768,7 @@ static int nv17_tv_set_property(struct drm_encoder *encoder,
.crtc = crtc, .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) ...@@ -829,7 +829,7 @@ static void vmw_lastclose(struct drm_device *dev)
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
set.crtc = crtc; set.crtc = crtc;
ret = crtc->funcs->set_config(&set); ret = drm_mode_set_config_internal(&set);
WARN_ON(ret != 0); WARN_ON(ret != 0);
} }
......
...@@ -985,6 +985,7 @@ extern int drm_mode_getcrtc(struct drm_device *dev, ...@@ -985,6 +985,7 @@ extern int drm_mode_getcrtc(struct drm_device *dev,
void *data, struct drm_file *file_priv); void *data, struct drm_file *file_priv);
extern int drm_mode_getconnector(struct drm_device *dev, extern int drm_mode_getconnector(struct drm_device *dev,
void *data, struct drm_file *file_priv); 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, extern int drm_mode_setcrtc(struct drm_device *dev,
void *data, struct drm_file *file_priv); void *data, struct drm_file *file_priv);
extern int drm_mode_getplane(struct drm_device *dev, extern int drm_mode_getplane(struct drm_device *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment