在目前的Qualcom平台B系列芯片组上,我们使用pinctrl框架来控制内核的gpio。
无法控制gpio的问题。 需要按照下面的步骤来解释原因。
1.首先添加下面的调试代码,看是否有一些未知的模块是控制gpio的,这里以gpio38作为exmaple
+++ b/drivers/pinctrl/pinctrl-msm-tlmm.c @@ -400,11 +400,17 @@ static int msm_tlmm_gp_cfg(uint pin_no, unsigned long *config,
u32 mask = 0, shft = 0;
void __iomem *inout_reg = NULL;
void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, pin_no);
- + if (pin_no==38)
+ {
+ WARN_ON(1);
+
+ }
+
id = pinconf_to_config_param(*config);
val = readl_relaxed(cfg_reg);
/* Get mask and shft values for this config type */
switch (id) {
+
case PIN_CONFIG_BIAS_DISABLE:
mask = TLMM_GP_PULL_MASK;
shft = TLMM_GP_PULL_SHFT;
@@ -623,6 +629,11 @@ static void msm_tlmm_gp_fn(uint pin_no, u32 func, bool enable,
{
unsigned int val;
void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, pin_no);
+ if(pin_no==38)
+ {
+ WARN_ON(1);
+ }
+
val = readl_relaxed(cfg_reg);
val &= ~(TLMM_GP_FUNC_MASK << TLMM_GP_FUNC_SHFT);
if (enable)
@@ -652,6 +663,10 @@ static int msm_tlmm_gp_dir_in(struct gpio_chip *gc, unsigned offset)
unsigned int val;
struct msm_pintype_info *pinfo = gc_to_pintype(gc);
void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, offset);
+ if(offset==38) + { + WARN_ON(1); + }
val = readl_relaxed(cfg_reg);
val &= ~BIT(GPIO_OE_BIT);
@@ -663,6 +678,10 @@ static int msm_tlmm_gp_dir_out(struct gpio_chip *gc, unsigned offset, int val)
{
struct msm_pintype_info *pinfo = gc_to_pintype(gc);
void __iomem *cfg_reg = TLMM_GP_CFG(pinfo, offset);
+ if(offset==38) + { + WARN_ON(1); + }
msm_tlmm_gp_set(gc, offset, val);
val = readl_relaxed(cfg_reg);
如果有调试信息有控制gpio的调用堆栈,那么你需要检查不应该控制gpio的代码并删除它
2.如果没有明显的控制gpio输出的调试信息,那么我认为你需要删除/ firmware / images下的所有image再次测试。 如果你可以控制gpio,那么意味着一些子系统正在控制这个gpio,然后你逐个添加删除image来找出哪个子系统正在控制它。
3.如果你仍然无法控制这个GPIO,那么我认为首先你需要检查你是否添加了不使用pinctrl来控制GPIO的代码, 如果你确认没有添加任何旁路pinctrl的代码,请移动到下一个。
4.由于所有软件控制路径都已经过验证,所以现在需要删除此GPIO上的所有连接以再次测试GPIO。 如果你可以控制的GPIO。那么你需要联系你的硬件团队来检查你的硬件,并让你的硬件团队知道你的gpio配置(方向/拉式/驱动程序的强度)。 如果你仍然无法控制gpio,那么你需要读取芯片组的gpio寄存器软件界面(通常TLMM部分)来加倍你的gio配置。
5.一个特别的,请确认你的gpio是否只能在电源崩溃后才能控制,如果是的话,请先禁用free_io进行测试, 这只是测试,如果工作的话需要和你的硬件小组核对是否需要外部拉动