/*
* exynos specific framebuffer structure.
*
+ * @release_work: for the worker destroying the fb after it's done being used
* @fb: drm framebuffer obejct.
* @exynos_gem_obj: array of exynos specific gem object containing a gem object.
*/
struct exynos_drm_fb {
struct kref refcount;
+ struct work_struct release_work;
struct drm_framebuffer fb;
struct exynos_drm_gem_obj *exynos_gem_obj[MAX_FB_BUFFER];
#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
#endif
void exynos_drm_fb_release(struct kref *kref)
+{
+ struct exynos_drm_fb *exynos_fb;
+
+ exynos_fb = container_of(kref, struct exynos_drm_fb, refcount);
+ schedule_work(&exynos_fb->release_work);
+}
+
+static void exynos_drm_fb_release_work_fn(struct work_struct *work)
{
struct drm_framebuffer *fb;
struct exynos_drm_fb *exynos_fb;
DRM_DEBUG_KMS("%s\n", __FILE__);
- exynos_fb = container_of(kref, struct exynos_drm_fb, refcount);
+ exynos_fb = container_of(work, struct exynos_drm_fb, release_work);
fb = &exynos_fb->fb;
dev_priv = fb->dev->dev_private;
}
kref_init(&exynos_fb->refcount);
+ INIT_WORK(&exynos_fb->release_work, exynos_drm_fb_release_work_fn);
ret = drm_framebuffer_init(dev, &exynos_fb->fb, &exynos_drm_fb_funcs);
if (ret) {