一、在linux 驱动里面申请一个gpip,,gpip2b4 变换是 76 ,dts 如下:
m117b@45 {compatible = "xxx,m117b";reg = <0x45>;pinctrl-names = "default";pinctrl-0 = <&m117b_gpio>;pwdn-gpios = <&gpio2 RK_PB4 IRQ_TYPE_LEVEL_LOW>;};
二、probe 函数返回0情况下,可以看到gpio-76 被占用。
2.1、驱动里面的probe函数代码
int m117b_probe(struct i2c_client *i2c_client, const struct i2c_device_id *id)
{int ret;struct device *dev = &i2c_client->dev; m117b_client = i2c_client;ret = device_create_file(&i2c_client->dev, &dev_attr_m117b_read_temp);if (ret)printk("[%s]device_create_file is error \n",__func__);elseprintk("[%s]ret is %#x\n", __func__,ret);printk("[%s]m117b_probe test %#x\n", __func__,ret);pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);return 0;
}
2.2、可以看到这个gpio申请成功,被占用。
三、probe 返回负数的情况,自动释放已经申请的gpip。
3.1、驱动probe 函数代码
int m117b_probe(struct i2c_client *i2c_client, const struct i2c_device_id *id)
{int ret;struct device *dev = &i2c_client->dev; m117b_client = i2c_client;ret = device_create_file(&i2c_client->dev, &dev_attr_m117b_read_temp);if (ret)printk("[%s]device_create_file is error \n",__func__);elseprintk("[%s]ret is %#x\n", __func__,ret);printk("[%s]m117b_probe test %#x\n", __func__,ret);pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);return -EINVAL;
}
3.2、gpio-76 没有被占用。
3.3、串口log 会提示error
四、总结
当一个probe函数返回负数,驱动向系统申请的有关资源都会被释放,如中断号、GPIO、申请的内存等。
五、参考文章
linux驱动中probe函数的返回值_a254373829的博客-CSDN博客