aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_fb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_fb.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_fb.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
index b2c1a29cc12b..51b1219af87f 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -17,11 +17,11 @@
17 * this program. If not, see <http://www.gnu.org/licenses/>. 17 * this program. If not, see <http://www.gnu.org/licenses/>.
18 */ 18 */
19 19
20#include "omap_drv.h" 20#include <drm/drm_crtc.h>
21#include "omap_dmm_tiler.h" 21#include <drm/drm_crtc_helper.h>
22 22
23#include "drm_crtc.h" 23#include "omap_dmm_tiler.h"
24#include "drm_crtc_helper.h" 24#include "omap_drv.h"
25 25
26/* 26/*
27 * framebuffer funcs 27 * framebuffer funcs
@@ -89,6 +89,8 @@ struct omap_framebuffer {
89 int pin_count; 89 int pin_count;
90 const struct format *format; 90 const struct format *format;
91 struct plane planes[4]; 91 struct plane planes[4];
92 /* lock for pinning (pin_count and planes.paddr) */
93 struct mutex lock;
92}; 94};
93 95
94static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, 96static int omap_framebuffer_create_handle(struct drm_framebuffer *fb,
@@ -250,8 +252,11 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb)
250 struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); 252 struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb);
251 int ret, i, n = drm_format_num_planes(fb->pixel_format); 253 int ret, i, n = drm_format_num_planes(fb->pixel_format);
252 254
255 mutex_lock(&omap_fb->lock);
256
253 if (omap_fb->pin_count > 0) { 257 if (omap_fb->pin_count > 0) {
254 omap_fb->pin_count++; 258 omap_fb->pin_count++;
259 mutex_unlock(&omap_fb->lock);
255 return 0; 260 return 0;
256 } 261 }
257 262
@@ -265,6 +270,8 @@ int omap_framebuffer_pin(struct drm_framebuffer *fb)
265 270
266 omap_fb->pin_count++; 271 omap_fb->pin_count++;
267 272
273 mutex_unlock(&omap_fb->lock);
274
268 return 0; 275 return 0;
269 276
270fail: 277fail:
@@ -274,32 +281,33 @@ fail:
274 plane->paddr = 0; 281 plane->paddr = 0;
275 } 282 }
276 283
284 mutex_unlock(&omap_fb->lock);
285
277 return ret; 286 return ret;
278} 287}
279 288
280/* unpin, no longer being scanned out: */ 289/* unpin, no longer being scanned out: */
281int omap_framebuffer_unpin(struct drm_framebuffer *fb) 290void omap_framebuffer_unpin(struct drm_framebuffer *fb)
282{ 291{
283 struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); 292 struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb);
284 int ret, i, n = drm_format_num_planes(fb->pixel_format); 293 int i, n = drm_format_num_planes(fb->pixel_format);
294
295 mutex_lock(&omap_fb->lock);
285 296
286 omap_fb->pin_count--; 297 omap_fb->pin_count--;
287 298
288 if (omap_fb->pin_count > 0) 299 if (omap_fb->pin_count > 0) {
289 return 0; 300 mutex_unlock(&omap_fb->lock);
301 return;
302 }
290 303
291 for (i = 0; i < n; i++) { 304 for (i = 0; i < n; i++) {
292 struct plane *plane = &omap_fb->planes[i]; 305 struct plane *plane = &omap_fb->planes[i];
293 ret = omap_gem_put_paddr(plane->bo); 306 omap_gem_put_paddr(plane->bo);
294 if (ret)
295 goto fail;
296 plane->paddr = 0; 307 plane->paddr = 0;
297 } 308 }
298 309
299 return 0; 310 mutex_unlock(&omap_fb->lock);
300
301fail:
302 return ret;
303} 311}
304 312
305struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p) 313struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p)
@@ -411,6 +419,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
411 419
412 fb = &omap_fb->base; 420 fb = &omap_fb->base;
413 omap_fb->format = format; 421 omap_fb->format = format;
422 mutex_init(&omap_fb->lock);
414 423
415 for (i = 0; i < n; i++) { 424 for (i = 0; i < n; i++) {
416 struct plane *plane = &omap_fb->planes[i]; 425 struct plane *plane = &omap_fb->planes[i];