OMAP: DSS2: OMAPFB: Convert the memory region locking to rwsem
authorVille Syrjälä <ville.syrjala@nokia.com>
Wed, 17 Mar 2010 18:58:03 +0000 (20:58 +0200)
committerTomi Valkeinen <tomi.valkeinen@nokia.com>
Tue, 3 Aug 2010 12:18:46 +0000 (15:18 +0300)
R/W semaphore is a good fit for the memory region locking pattern.
So use it.

Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
drivers/video/omap2/omapfb/omapfb-ioctl.c
drivers/video/omap2/omapfb/omapfb-main.c
drivers/video/omap2/omapfb/omapfb-sysfs.c
drivers/video/omap2/omapfb/omapfb.h

index 69bcbfca47f6237abd3fd05579de4f94ff507996..3a10146dc1208c5e4f754e47d143279269a72a9c 100644 (file)
@@ -198,13 +198,7 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
 
        rg = ofbi->region;
 
-       /* FIXME probably should be a rwsem ... */
-       mutex_lock(&rg->mtx);
-       while (rg->ref) {
-               mutex_unlock(&rg->mtx);
-               schedule();
-               mutex_lock(&rg->mtx);
-       }
+       down_write(&rg->lock);
 
        if (atomic_read(&rg->map_count)) {
                r = -EBUSY;
@@ -235,7 +229,7 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
        }
 
  out:
-       mutex_unlock(&rg->mtx);
+       up_write(&rg->lock);
 
        return r;
 }
index eb4338bbaa2b3da6f87409c21fa41176e904d4ae..a3f72ba79958cb82b4b2f7d759a69ea35a0e0911 100644 (file)
@@ -1930,7 +1930,7 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
 
                ofbi->region = &fbdev->regions[i];
                ofbi->region->id = i;
-               mutex_init(&ofbi->region->mtx);
+               init_rwsem(&ofbi->region->lock);
 
                /* assign these early, so that fb alloc can use them */
                ofbi->rotation_type = def_vrfb ? OMAP_DSS_ROT_VRFB :
index 74c11b2431000106b2dc7be8e31fa979008af6c5..724b760404f2ddffe8e3b2f084ff0116b3e47e02 100644 (file)
@@ -452,13 +452,7 @@ static ssize_t store_size(struct device *dev, struct device_attribute *attr,
 
        rg = ofbi->region;
 
-       /* FIXME probably should be a rwsem ... */
-       mutex_lock(&rg->mtx);
-       while (rg->ref) {
-               mutex_unlock(&rg->mtx);
-               schedule();
-               mutex_lock(&rg->mtx);
-       }
+       down_write(&rg->lock);
 
        if (atomic_read(&rg->map_count)) {
                r = -EBUSY;
@@ -490,7 +484,7 @@ static ssize_t store_size(struct device *dev, struct device_attribute *attr,
 
        r = count;
 out:
-       mutex_unlock(&rg->mtx);
+       up_write(&rg->lock);
 
        unlock_fb_info(fbi);
 
index db3aef5172c55173cd0cd5cd73598d45c7e97e9d..195a760eef542b4adcd30a2678c5fc9fe7273a69 100644 (file)
@@ -27,6 +27,8 @@
 #define DEBUG
 #endif
 
+#include <linux/rwsem.h>
+
 #include <plat/display.h>
 
 #ifdef DEBUG
@@ -52,9 +54,8 @@ struct omapfb2_mem_region {
        u8              type;           /* OMAPFB_PLANE_MEM_* */
        bool            alloc;          /* allocated by the driver */
        bool            map;            /* kernel mapped by the driver */
-       struct mutex    mtx;
-       unsigned int    ref;
        atomic_t        map_count;
+       struct rw_semaphore lock;
 };
 
 /* appended to fb_info */
@@ -164,17 +165,13 @@ static inline int omapfb_overlay_enable(struct omap_overlay *ovl,
 static inline struct omapfb2_mem_region *
 omapfb_get_mem_region(struct omapfb2_mem_region *rg)
 {
-       mutex_lock(&rg->mtx);
-       rg->ref++;
-       mutex_unlock(&rg->mtx);
+       down_read(&rg->lock);
        return rg;
 }
 
 static inline void omapfb_put_mem_region(struct omapfb2_mem_region *rg)
 {
-       mutex_lock(&rg->mtx);
-       rg->ref--;
-       mutex_unlock(&rg->mtx);
+       up_read(&rg->lock);
 }
 
 #endif