A:
针对多数字PA共用reset-gpio引脚场景,常用方案是DTS设备树中仅保留第一个PA节点的reset-gpio配置项,删除其他PA节点reset-gpio配置项。
如果系统每次都先加载第一个PA节点对应的驱动,方案无问题。但部分系统可能存在概率先加载非第一个PA节点场景,此时该节点PA驱动加载时没有reset-gpio引脚配置,导致PA无法使能,IIC通信失败,最终驱动加载失败。
针对上述问题场景,可参考如下修改方案解决:
1、DTS中每个PA节点均添加reset-gpio配置项,且gpio引脚号一样;
2、PA驱动代码中增加reset_status变量及相关判断逻辑,参考修改如下:
1. #define RESET_GPIO_SHARED
2. #ifdef RESET_GPIO_SHARED
3. bool reset_status = 0;
4. static int aw883xx_gpio_request(struct aw883xx *aw883xx)
5. {
6. int ret = -1;
7.
8. if (gpio_is_valid(aw883xx->reset_gpio)) {
9. if (reset_status == 0) {
10. ret = devm_gpio_request_one(aw883xx->dev, aw883xx->reset_gpio,
11. GPIOF_OUT_INIT_LOW, "aw883xx_rst");
12. if (ret) {
13. aw_dev_err(aw883xx->dev, "rst request failed");
14. return ret;
15. }
16. reset_status = 1;
17. } else {
18. aw883xx->reset_gpio =-1;
19. aw_dev_info(aw883xx->dev,"rst gpio already requested.");
20. }
21. }
22.
23. if (gpio_is_valid(aw883xx->irq_gpio)) {
24. ret = devm_gpio_request_one(aw883xx->dev, aw883xx->irq_gpio,
25. GPIOF_DIR_IN, "aw883xx_int");
26. if (ret) {
27. aw_dev_err(aw883xx->dev, "int request failed");
28. return ret;
29. }
30. }
31.
32. return 0;
33. }
34. #endif