HDMI: add mutex lock to edid modelist operation.
authorZheng Yang <zhengyang@rock-chips.com>
Fri, 29 May 2015 02:08:34 +0000 (10:08 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Fri, 29 May 2015 02:08:34 +0000 (10:08 +0800)
Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
drivers/video/rockchip/display-sys.c
drivers/video/rockchip/hdmi/rockchip-hdmi-core.c
drivers/video/rockchip/hdmi/rockchip-hdmi-sysfs.c

index 1380362cbbbdac9b3d95d4db80986f1b4709ab4b..534f00d01248f48c32263506389d39d10059bcc2 100755 (executable)
@@ -114,10 +114,14 @@ static ssize_t display_show_modes(struct device *dev,
        const struct fb_videomode *mode;
        int i;
 
+       mutex_lock(&dsp->lock);
        if (dsp->ops && dsp->ops->getmodelist) {
-               if (dsp->ops->getmodelist(dsp, &modelist))
+               if (dsp->ops->getmodelist(dsp, &modelist)) {
+                       mutex_unlock(&dsp->lock);
                        return -EINVAL;
+               }
        } else {
+               mutex_unlock(&dsp->lock);
                return 0;
        }
        i = 0;
@@ -131,6 +135,7 @@ static ssize_t display_show_modes(struct device *dev,
                mode = &display_modelist->mode;
                i += mode_string(buf, i, mode);
        }
+       mutex_unlock(&dsp->lock);
        return i;
 }
 
index 3d1abfe424e4d7b499bf5958a51f6c4946c452ad..56d7b8d65e9d5e7df3c18c61ad2de26094c45483 100644 (file)
@@ -253,10 +253,12 @@ static void hdmi_wq_remove(struct hdmi *hdmi)
        #ifdef CONFIG_SWITCH
        switch_set_state(&(hdmi->switchdev), 0);
        #endif
+       mutex_lock(&hdmi->ddev->lock);
        list_for_each_safe(pos, n, &hdmi->edid.modelist) {
                list_del(pos);
                kfree(pos);
        }
+       mutex_unlock(&hdmi->ddev->lock);
        for (i = 0; i < HDMI_MAX_EDID_BLOCK; i++)
                kfree(hdmi->edid.raw[i]);
        kfree(hdmi->edid.audio);
index 3d9d5c0cc2c362f8760b3ed68c7f8c92cf02481e..f994d96c80f50049d397753f3f0c176af52e662d 100644 (file)
@@ -39,9 +39,7 @@ static int hdmi_get_modelist(struct rk_display_device *device,
 {
        struct hdmi *hdmi = device->priv_data;
 
-       mutex_lock(&hdmi->lock);
        *modelist = &hdmi->edid.modelist;
-       mutex_unlock(&hdmi->lock);
        return 0;
 }