build_embed_linux_system

驱动扩展接口

在前一节中,主要说明常用的devm驱动接口,这一节在基础上扩展提高,提供更复杂的devm接口。

conclusion

dma

dmaenginem_async_device_register

dmam_alloc_coherent

dmam_alloc_attrs

dmam_free_coherent

dmam_pool_create

dmam_pool_destroy

dma_request_channel

dma_request_chan

dma_release_channel

dmaengine_slave_config

dmaengine_prep_slave_sg

dmaengine_prep_dma_cyclic

dmaengine_terminate_sync

dmaengine_terminate_async

dmaengine_pause

dmaengine_submit

dmaengine_resume

dma_async_issue_pending

drm

devm_drm_dev_alloc

iio

devm_iio_device_alloc

//函数原型
struct iio_dev *devm_iio_device_alloc(struct device *parent, int sizeof_priv);

//参数
parent: 管理iio设备的父类设备结构
sizeof_priv: 私有数据长度,存储私有数据
返回: 申请的iio设备管理结构

//例程
struct hx711_data *chip;
struct iio_dev *indio_dev;

indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct hx711_data));
if (!indio_dev){
    return -ENOMEM;
}

devm_iio_device_register

//函数原型
#define devm_iio_device_register(dev, indio_dev) \
    __devm_iio_device_register((dev), (indio_dev), THIS_MODULE)

//参数
dev:管理iio设备的父类设备结构
indio_dev: 配置iio设备属性的结构体
返回: 0表示注册成功,其它则失败

//例程
indio_dev->dev.parent = &pdev->dev;
indio_dev->info = &hx711_info;
indio_dev->name = DEVICE_NAME;    
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = hx711_channels;
indio_dev->num_channels = ARRAY_SIZE(hx711_channels);
ret = devm_iio_device_register(&pdev->dev, indio_dev);
if (ret < 0) {
    dev_err(&pdev->dev, "iio_device_register failed\n");
    return -EIO;
}

devm_iio_dmaengine_buffer_setup

devm_iio_kfifo_buffer_setup

devm_iio_map_array_register

devm_iio_triggered_buffer_setup

devm_iio_trigger_alloc

devm_iio_trigger_register

devm_iio_channel_get

devm_iio_channel_get_all

iio_priv

//函数原型
static inline void *iio_priv(const struct iio_dev *indio_dev)
{
    return indio_dev->priv;
}

//参数:
indio_dev: iio设备管理结构体
返回: iio设备的私有数据

//例程
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct hx711_data));
if (!indio_dev) {
    return -ENOMEM;
}
chip = iio_priv(indio_dev);

iio_read_channel_raw

iio_channel_start_all_cb

iio_channel_stop_all_cb

iio_channel_release_all_cb

iio_channel_get_all_cb

input

devm_input_allocate_device

//函数原型
struct input_dev *devm_input_allocate_device(struct device *dev)

//参数
dev:管理input设备的父类设备结构
返回: 申请的input设备结构体

//例程
chip->input_dev = devm_input_allocate_device(&pdev->dev);

iomap

devm_ioport_map

devm_ioport_unmap

devm_ioremap

devm_ioremap_uc

devm_ioremap_wc

devm_ioremap_resource

devm_ioremap_resource_wc

devm_platform_ioremap_resource

//函数原型
void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev,
              unsigned int index)

//参数
dev:reg属性对应的设备节点
index:资源的编号, 如果对于一个资源包含多个,按照编号访问

//例程
info->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(info->regs))
    return PTR_ERR(info->regs);
hc_cfg = readl(info->regs + VF610_REG_ADC_HC0);

devm_platform_ioremap_resource_byname

//函数原型
void __iomem *devm_platform_ioremap_resource_byname(struct platform_device *pdev,
              const char *name)

//参数
dev:reg属性属于的设备节点
name:reg属性对应的名称

//例程
priv->reg_dram = devm_platform_ioremap_resource_byname(pdev, "dram");
if (IS_ERR(priv->reg_dram))
    return PTR_ERR(priv->reg_dram);
pwrctl = readl_relaxed(priv->reg_dram + DRAM_PWRCTL) &
    ~DRAM_PWRCTL_SELFREF_EN;

devm_platform_get_and_ioremap_resource

devm_iounmap

pcim_iomap

pcim_iomap_regions

pcim_iomap_table

pcim_iounmap

mdio

devm_mdiobus_alloc

devm_mdiobus_alloc_size

devm_mdiobus_register

devm_of_mdiobus_register

mfd

devm_mfd_add_devices

mux

devm_mux_chip_alloc

devm_mux_chip_register

devm_mux_control_get

devm_mux_state_get

net

devm_alloc_etherdev

devm_alloc_etherdev_mqs

devm_register_netdev

per-cpu-mem

devm_alloc_percpu

devm_free_percpu

pci

devm_pci_alloc_host_bridge

devm_pci_remap_cfgspace

devm_pci_remap_cfg_resource

pcim_enable_device

pcim_pin_device

phy

devm_usb_get_phy

devm_usb_put_phy

power

devm_reboot_mode_register

devm_reboot_mode_unregister

pwm

devm_pwmchip_add

//函数原型
int devm_pwmchip_add(struct device *dev, struct pwm_chip *chip)

//参数
dev: 需要注册的pwm的设备节点
chip: pwm节点设备信息
返回: 0表示成功,其它表示失败

//例程
devm_pwmchip_add(&pdev->dev, &info->chip)

devm_pwm_get

devm_fwnode_pwm_get

regulator

devm_regulator_get

devm_regulator_get_enable

devm_regulator_get_enable_optional

regulator_enable

//函数原型
int regulator_enable(struct regulator *regulator)

//参数
regulator:已经获取的稳压器管理结构
返回:0表示请求使能成功,1表示失败

//例程
int err;
err = regulator_enable(regulator);

regulator_disable

//函数原型
int regulator_disable(struct regulator *regulator)

//参数
regulator:已经获取的稳压器管理结构
返回:0表示请求关闭成功,1表示失败

//例程
int err;
err = regulator_disable(regulator);

regulator_get_voltage

//函数原型
int regulator_get_voltage(struct regulator *regulator)

//参数
regulator:已经获取的稳压器管理结构
返回:函数返回一个整数,表示获取到的电压值(单位为微伏,即uV)。如果函数执行失败,返回负值。

//例程
int voltage;
voltage = regulator_get_voltage(regulator);
dev_info(&pdev->dev, "regulator voltage: %d mV\n", voltage/1000);

devm_regulator_bulk_register_supply_alias

devm_regulator_bulk_get

devm_regulator_bulk_get_enable

devm_regulator_bulk_put

devm_regulator_get_exclusive

devm_regulator_get_optional

//函数原型
struct regulator *devm_regulator_get_optional(struct device *dev,
            const char *id)

//参数
dev: 设备结构体指针,表示要获取电压的设备。
id: 稳压器的ID字符串,表示要获取的稳压器的名称。
返回:函数返回一个指向regulator结构体的指针,表示获取到的稳压器。如果函数执行失败,返回NULL

//例程
struct regulator *reg_xceiver;
reg_xceiver = devm_regulator_get_optional(&pdev->dev, "xceiver");

devm_regulator_irq_helper

devm_regulator_put

devm_regulator_register

devm_regulator_register_notifier

devm_regulator_register_supply_alias

devm_regulator_unregister_notifier

reset

devm_reset_control_get

devm_reset_controller_register

serdev

devm_serdev_device_open

slave_dma_engine

devm_acpi_dma_controller_register

thermal

cpufreq_cooling_register

cpufreq_cooling_unregister

devfreq_cooling_register

devfreq_cooling_unregister

devm_thermal_of_cooling_device_register

hwmon

关于hwmon可以看Linux内核文档说明:Documentation/hwmon/hwmon-kernel-api.rst

rngc

devm_hwrng_register

watchdog

devm_watchdog_register_device

//函数原型
int devm_watchdog_register_device(struct device *dev,
      struct watchdog_device *wdd)

//参数
dev: 指向看门狗对应的设备树节点的device资源结构体
wdd: 指向看门狗配置的watchdog_device结构体
返回:0表示注册成功,其它则注册失败,返回对应错误码

//例程
wdog = &wdev->wdog;
wdog->info = &imx2_wdt_info;
wdog->ops = &imx2_wdt_ops;
wdog->min_timeout  = 1;
wdog->timeout = IMX2_WDT_DEFAULT_TIME;
wdog->max_hw_heartbeat_ms = IMX2_WDT_MAX_TIME * 1000;
wdog->parent = dev;

return devm_watchdog_register_device(dev, wdog);

watchdog_set_drvdata

//函数原型
static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)

//参数
wdd: 指向看门狗配置的watchdog_device结构体
data: 设置的看门狗私有数据的指针

//例程
watchdog_set_drvdata(wdog, wdev);

watchdog_get_drvdata

//函数原型
static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)
{
  return wdd->driver_data;
}

//参数
wdd: 指向看门狗配置的watchdog_device结构体
返回: 看门狗私有数据的指针

//例程
struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog);

watchdog_set_nowayout

//函数原型
static inline void watchdog_set_nowayout(struct watchdog_device *wdd, int nowayout)

//参数
wdd: 指向看门狗配置的watchdog_device结构体
nowayout: 设置看门狗的nowayout属性,0表示不设置,1表示设置

//例程
watchdog_set_nowayout(wdog, 1);

watchdog_set_restart_priority

//函数原型
static inline void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority)

//参数
wdd: 指向看门狗配置的watchdog_device结构体
priority: 一个整数,表示要设置的重启优先级。优先级的值通常是一个非负整数,数值越大表示优先级越高。

//例程
watchdog_set_restart_priority(wdog, 1);

watchdog_init_timeout

//函数原型
int watchdog_init_timeout(struct watchdog_device *wdd, unsigned int timeout,
                          struct device *dev);

//参数
wdd: 指向看门狗配置的watchdog_device结构体
timeout: 一个整数,表示要设置的超时时间。单位为秒。
dev: 指向 device 结构体的指针,表示与看门狗设备相关联的设备

//例程
int ret = watchdog_init_timeout(my_watchdog, 30, NULL);

watchdog_stop_ping_on_suspend

//函数原型
static inline void watchdog_stop_ping_on_suspend(struct watchdog_device *wdd)

//参数
wdd: 指向看门狗配置的watchdog_device结构体

//例程
watchdog_stop_ping_on_suspend(wdog);

next_chapter

返回目录

直接开始下一节说明: 驱动并发接口