原因
spi驱动先设置gpio-0成了输出;
但是后面其他驱动,使用of_property_read_u32获取设备树节点的属性时,没去判断返回值;而直接使用参数返回的0,导致gpio-0又被设置成了输入
实例
正常的如下,gpio显示为输出
不正常如下,gpio显示为输入
影响代码如下:of_property_read_u32返回0是找到节点里的属性了,返回负数是没找到;不然没有这个属性的话,out_value会返回0 ;而且没对gpio_request做返回判断,如果有冲突的情况,这个地方还设置了gpio0为输入---那就异常了,该输出的gpio,被异常设置成了输入。
static int init_device(struct platform_device *pdev, int dev_num)
{....of_property_read_u32(pdev->dev.of_node,"edge_detect_gpio", &uedevice->gpio);if (uedevice->gpio >= 0) {gpio_request(uedevice->gpio, uedevice->name);gpio_direction_input(uedevice->gpio);}
}
修改如下:所以对接口的返回值做判断很重要,能避免一些奇葩的bug
static int init_device(struct platform_device *pdev, int dev_num)
{....int ret = -1;ret = of_property_read_u32(pdev->dev.of_node,"edge_detect_gpio", &uedevice->gpio);if (ret ) {dev_err(uedevice->dev, "failed to of_property_read_u32 wakeup.\n");goto out;}ret = gpio_request(uedevice->gpio, uedevice->name);if (ret < 0) {dev_err(uedevice->dev, "failed to gpio_request wakeup.\n");goto out;}gpio_direction_input(uedevice->gpio);out:return -1;
}