drivers/video/msm/msm_fb.c
2014 static int msm_fb_pan_display(struct fb_var_screeninfo *var, 2015 struct fb_info *info) 2016 { 2017 struct mdp_display_commit disp_commit; 2018 memset(&disp_commit, 0, sizeof(disp_commit)); 2019 disp_commit.var = *var; 2020 disp_commit.wait_for_finish = TRUE; 2021 return msm_fb_pan_display_ex(info, &disp_commit); 2022 }
disp_commit.wait_for_finish的設定值會決定是否須等待完成
1992 if (wait_for_finish) 1993 msm_fb_pan_idle(mfd); 1994 return ret;
比較好的作法是使用FBIO_WAITFORVSYNC,而在FBIOPAN_DISPLAY時,先將控制權交還User Application
1904 DEFINE_SEMAPHORE(msm_fb_pan_sem); 1905 static int msm_fb_pan_idle(struct msm_fb_data_type *mfd) 1906 { 1907 int ret = 0; 1908 1909 mutex_lock(&mfd->sync_mutex); 1910 if (mfd->is_committing) { 1911 mutex_unlock(&mfd->sync_mutex); 1912 ret = wait_for_completion_interruptible_timeout( 1913 &mfd->commit_comp, 1914 msecs_to_jiffies(WAIT_DISP_OP_TIMEOUT)); 1915 if (ret < 0) 1916 ret = -ERESTARTSYS; 1917 else if (!ret) 1918 pr_err("%s wait for commit_comp timeout %d %d", 1919 __func__, ret, mfd->is_committing); 1920 if (ret <= 0) { 1921 mutex_lock(&mfd->sync_mutex); 1922 mfd->is_committing = 0; 1923 complete_all(&mfd->commit_comp); 1924 mutex_unlock(&mfd->sync_mutex); 1925 } 1926 } else { 1927 mutex_unlock(&mfd->sync_mutex); 1928 } 1929 return ret; 1930 }