1、问题:
展锐平台,usb otg高概率不能正确检测识别到
2、思路:
usb使用musb控制器,展锐的平台处理代码是musb_sprd.c,在这个文件中对usb mode做检测和切换,log级别跳到最高,在probe中的关键函数前后添加log,确定出现问题的上下文,最终确定是在vbus和id检测的回调函数上下文有问题,musb_sprd_vbus_notifier回调函数 和 musb_sprd_id_notifier检测回调函数之间的顺序概率性的错误。
正常的顺序是,先做vbus的检测,检测到cable vbus之后,再做id的检测,确定extcon设备mode。
现在出现错误时,分析是: vbus检测work未完成,id检测work就开始了
3、解决:
在musb_sprd_vbus_notifier函数和musb_sprd_id_notifier函数中,展锐的代码是使用spin_lock锁来对函数中变量和queue_work做互斥保护,但是还是会发生长时间的等待状态的情况,所以有概率性的出现问题
修改: 使用原子量来对两个函数中的资源和queue_work做临界保护,
定义原子锁,做初始化:
替换两个函数中的spin lok 锁:
在sprd_musb_work函数中也使用原子量,保证usb的时序不会出现错误,不然可能有问题:otg将usb resume之后,usb又进入了idle,suspend状态,导致otg和hdc都不能正确识别了
最后需要在sprd_musb_work函数和probe中,对原子量做还原和初始重置:
这样修改的前提是,type-c能正确检测到usb信号,只是usb的状态切换有问题的情况下,可以到平台的文件中调试
当遇到插入usb完全没有反应的情况,就需要排查usb的type-c部分和phy信号的情况