devm_ioremap_resource devm_ioremap 区别

文章讨论了devm_ioremap_resource和devm_request_mem_region在Linux设备驱动中的功能,前者先申请资源再映射,后者用于请求和释放内存区域。如果资源已申请,devm_request_mem_region会失败。
摘要由CSDN通过智能技术生成

从源代码看devm_ioremap_resource多了

	if (!devm_request_mem_region(dev, res->start, size, name)) {
		dev_err(dev, "can't request region for resource %pR\n", res);
		return IOMEM_ERR_PTR(-EBUSY);
	}

从driver 代码中可以看到有时间用devm_ioremap_resource, 而有时直接用devm_ioremap

 
#define devm_request_mem_region(dev,start,n,name) \
	__devm_request_region(dev, &iomem_resource, (start), (n), (name))
 
 
struct resource * __devm_request_region(struct device *dev,
				struct resource *parent, resource_size_t start,
				resource_size_t n, const char *name)
{
	struct region_devres *dr = NULL;
	struct resource *res;
 
	dr = devres_alloc(devm_region_release, sizeof(struct region_devres),
			  GFP_KERNEL);
	if (!dr)
		return NULL;
 
	dr->parent = parent;
	dr->start = start;
	dr->n = n;
 
	res = __request_region(parent, start, n, name, 0);
	if (res)
		devres_add(dev, dr);
	else
		devres_free(dr);
 
	return res;
}
EXPORT_SYMBOL(__devm_request_region);

总结来说,devm_ioremap 就是直接映射, devm_ioremap_resource 是先申请,后映射。

比如
cat /proc/iomem
40300000-5fffffff : /soc/qcom,pcie@1c08000
  40300000-405fffff : PCI Bus 0001:01
    40300000-40301fff : 0001:01:00.0
    40302000-403020ff : 0001:01:00.0
    40302100-403021ff : 0001:01:00.0
  40600000-407fffff : PCI Bus 0001:01
  40800000-40800fff : 0001:00:00.0

这些就是已经申请并映射的device resource. 在使用时直接devm_ioremap 就可以。

但要是直接devm_ioremap,应该也可以,但没有 devm_request_mem_region, 应该在/proc/iomem 查不到。这个我没做实验。

但如果一个device resource 已经申请过了,在调用devm_request_mem_region就会出现下面错误
can't request region for resource ...

因为这个device resource 已经申请过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值