Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -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);
+3 −3
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
		}
	}

+1 −1
Original line number Diff line number Diff line
@@ -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 */
+1 −1
Original line number Diff line number Diff line
@@ -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);
		}
	}

Loading