一、在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__);
else
printk("[%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__);
else
printk("[%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博客