diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_fb.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c index e505140a8782..0b967e76df1a 100644 --- a/drivers/gpu/drm/omapdrm/omap_fb.c +++ b/drivers/gpu/drm/omapdrm/omap_fb.c | |||
| @@ -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 | ||
| 94 | static int omap_framebuffer_create_handle(struct drm_framebuffer *fb, | 96 | static 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 | ||
| 270 | fail: | 277 | fail: |
| @@ -274,6 +281,8 @@ 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 | ||
| @@ -283,10 +292,14 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) | |||
| 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 ret, i, n = drm_format_num_planes(fb->pixel_format); |
| 285 | 294 | ||
| 295 | mutex_lock(&omap_fb->lock); | ||
| 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) { |
| 300 | mutex_unlock(&omap_fb->lock); | ||
| 289 | return 0; | 301 | return 0; |
| 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]; |
| @@ -296,9 +309,12 @@ int omap_framebuffer_unpin(struct drm_framebuffer *fb) | |||
| 296 | plane->paddr = 0; | 309 | plane->paddr = 0; |
| 297 | } | 310 | } |
| 298 | 311 | ||
| 312 | mutex_unlock(&omap_fb->lock); | ||
| 313 | |||
| 299 | return 0; | 314 | return 0; |
| 300 | 315 | ||
| 301 | fail: | 316 | fail: |
| 317 | mutex_unlock(&omap_fb->lock); | ||
| 302 | return ret; | 318 | return ret; |
| 303 | } | 319 | } |
| 304 | 320 | ||
| @@ -411,6 +427,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, | |||
| 411 | 427 | ||
| 412 | fb = &omap_fb->base; | 428 | fb = &omap_fb->base; |
| 413 | omap_fb->format = format; | 429 | omap_fb->format = format; |
| 430 | mutex_init(&omap_fb->lock); | ||
| 414 | 431 | ||
| 415 | for (i = 0; i < n; i++) { | 432 | for (i = 0; i < n; i++) { |
| 416 | struct plane *plane = &omap_fb->planes[i]; | 433 | struct plane *plane = &omap_fb->planes[i]; |
