devm简介

说明

Devres - Managed Device Resource
这里的m代表的是设备资源管理,其实m也可以部分理解为memory,因为这系列函数都包含了内存分配。devm提供了一种统一、通用机制,将所有的相关资源挂载到device->devres_head的链表上,那么释放资源就很简单了,直接遍历这个链表释放所有的资源即可。

devm原由

因为驱动在原来处理资源的时候,需要我们自己去维护、释放,非常的麻烦。并且会导致非常的条件跳转和goto语句,代码也显得十分的臃肿。引入devres后,程序员只管申请,不需要去手动释放,系统在卸载设备时会自动释放,这样就减少了程序员的工作,相应的代码也减少了,也更简洁、优雅。

相关函数

CLOCK
  devm_clk_get()
  devm_clk_put()
  devm_clk_hw_register()

DMA
  dmam_alloc_coherent()
  dmam_alloc_attrs()
  dmam_declare_coherent_memory()
  dmam_free_coherent()
  dmam_pool_create()
  dmam_pool_destroy()

GPIO
  devm_gpiod_get()
  devm_gpiod_get_index()
  devm_gpiod_get_index_optional()
  devm_gpiod_get_optional()
  devm_gpiod_put()
  devm_gpiochip_add_data()
  devm_gpiochip_remove()
  devm_gpio_request()
  devm_gpio_request_one()
  devm_gpio_free()

IIO
  devm_iio_device_alloc()
  devm_iio_device_free()
  devm_iio_device_register()
  devm_iio_device_unregister()
  devm_iio_kfifo_allocate()
  devm_iio_kfifo_free()
  devm_iio_triggered_buffer_setup()
  devm_iio_triggered_buffer_cleanup()
  devm_iio_trigger_alloc()
  devm_iio_trigger_free()
  devm_iio_trigger_register()
  devm_iio_trigger_unregister()
  devm_iio_channel_get()
  devm_iio_channel_release()
  devm_iio_channel_get_all()
  devm_iio_channel_release_all()

INPUT
  devm_input_allocate_device()

IO region
  devm_release_mem_region()
  devm_release_region()
  devm_release_resource()
  devm_request_mem_region()
  devm_request_region()
  devm_request_resource()

IOMAP
  devm_ioport_map()
  devm_ioport_unmap()
  devm_ioremap()
  devm_ioremap_nocache()
  devm_ioremap_wc()
  devm_ioremap_resource() : checks resource, requests memory region, ioremaps
  devm_iounmap()
  pcim_iomap()
  pcim_iomap_regions()	: do request_region() and iomap() on multiple BARs
  pcim_iomap_table()	: array of mapped addresses indexed by BAR
  pcim_iounmap()

IRQ
  devm_free_irq()
  devm_request_any_context_irq()
  devm_request_irq()
  devm_request_threaded_irq()
  devm_irq_alloc_descs()
  devm_irq_alloc_desc()
  devm_irq_alloc_desc_at()
  devm_irq_alloc_desc_from()
  devm_irq_alloc_descs_from()
  devm_irq_alloc_generic_chip()
  devm_irq_setup_generic_chip()
  devm_irq_sim_init()

LED
  devm_led_classdev_register()
  devm_led_classdev_unregister()

MDIO
  devm_mdiobus_alloc()
  devm_mdiobus_alloc_size()
  devm_mdiobus_free()

MEM
  devm_free_pages()
  devm_get_free_pages()
  devm_kasprintf()
  devm_kcalloc()
  devm_kfree()
  devm_kmalloc()
  devm_kmalloc_array()
  devm_kmemdup()
  devm_kstrdup()
  devm_kvasprintf()
  devm_kzalloc()

MFD
  devm_mfd_add_devices()

MUX
  devm_mux_chip_alloc()
  devm_mux_chip_register()
  devm_mux_control_get()

PER-CPU MEM
  devm_alloc_percpu()
  devm_free_percpu()

PCI
  devm_pci_alloc_host_bridge()  : managed PCI host bridge allocation
  devm_pci_remap_cfgspace()	: ioremap PCI configuration space
  devm_pci_remap_cfg_resource()	: ioremap PCI configuration space resource
  pcim_enable_device()		: after success, all PCI ops become managed
  pcim_pin_device()		: keep PCI device enabled after release

PHY
  devm_usb_get_phy()
  devm_usb_put_phy()

PINCTRL
  devm_pinctrl_get()
  devm_pinctrl_put()
  devm_pinctrl_register()
  devm_pinctrl_unregister()

POWER
  devm_reboot_mode_register()
  devm_reboot_mode_unregister()

PWM
  devm_pwm_get()
  devm_pwm_put()

REGULATOR
  devm_regulator_bulk_get()
  devm_regulator_get()
  devm_regulator_put()
  devm_regulator_register()

RESET
  devm_reset_control_get()
  devm_reset_controller_register()

SLAVE DMA ENGINE
  devm_acpi_dma_controller_register()

SPI
  devm_spi_register_master()

WATCHDOG
  devm_watchdog_register_device()

从上面的函数也可以看出来,和devm相关的有很多资源。

部分函数调用图

部分函数调用图

参考

kernel/Documentation/driver-model/devres.txt

相关阅读

下一篇文章将详细介绍devm的机制,包括怎么向设备添加各种资源,以及在设备卸载时,驱动是怎么自动释放相关资源的?
devm设备资源管理分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值