[MTK] 如何调整模块earlySuspend/lateResume的顺序
文摘 MediaTek 2020-05-21 阅读:6186[DESCRIPTION]
有些情况下,因为一些模块在earlySuspend时的特殊操作,而导致另外一些模块在earlySuspend/lateResume后无法工作,
比如常见的CTP跟MEMs Sensor如果公用一个I2C port,经常会有一些冲突;
调整earlySuspend/lateResume的顺序可以解决类似的问题
[SOLUTION]
earlySuspend跟lateResume的顺序是关联的,简单地说先执行earlySuspend的模块,必然后执行lateResume;
类似于堆栈,先进后出;这个顺序是在模块驱动代码中注册earlySuspend函数时传入的:
obj->early_drv.level = EARLY_SUSPEND_LEVEL_DISABLE_FB-1,
obj->early_drv.suspend = xxx_early_suspend,
obj->early_drv.resume =xxx_late_resume,
register_early_suspend(&obj->early_drv),
这里的level值就决定了该模块在earlySuspend/lateResume执行中的顺序
earlySuspend的执行顺序是 low level ---> high level
lateResume 的执行顺序是 high level ---> low level
EarlySuspend.h中定义了几个宏作为基准,主要依据是屏幕的状态;
其他的模块可以参照这些基准值自行决定,一般来说,跟屏幕显示有关的,都要放到EARLY_SUSPEND_LEVEL_DISABLE_FB之前
enum {
EARLY_SUSPEND_LEVEL_BLACK_SCREEN = 50,
EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,
EARLY_SUSPEND_LEVEL_DISABLE_FB =150,
};