温馨提示×

linux regmap是否支持动态分配

小樊
81
2025-01-02 11:40:21
栏目: 智能运维

是的,Linux的regmap接口支持动态分配

要使用动态regmap,您需要使用regmap_alloc()函数来分配regmap,然后使用regmap_register_child()或regmap_add_child()函数将子设备注册到regmap中。这样,您可以在运行时动态地添加或删除子设备,而无需重新分配整个regmap。

这是一个简单的示例,说明如何使用动态regmap:

#include <linux/regmap.h>
#include <linux/device.h>
#include <linux/kernel.h>

static struct regmap *regmap;

static int my_regmap_init(struct device *dev) {
    struct resource *res;
    int ret;

    // 分配regmap资源
    res = platform_get_resource(dev, IORESOURCE_MEM, 0);
    if (!res) {
        dev_err(dev, "Failed to get register map resource\n");
        return -ENOMEM;
    }

    regmap = regmap_alloc(res->start, res->end - res->start + 1, dev);
    if (!regmap) {
        dev_err(dev, "Failed to allocate register map\n");
        return -ENOMEM;
    }

    // 注册子设备到regmap
    ret = regmap_register_child(regmap, "my_child_device", &child_dev);
    if (ret) {
        dev_err(dev, "Failed to register child device\n");
        regmap_free(regmap);
        return ret;
    }

    return 0;
}

static int my_regmap_exit(struct device *dev) {
    // 释放regmap资源
    regmap_unregister_child(regmap, "my_child_device");
    regmap_free(regmap);
    return 0;
}

static const struct of_device_id my_regmap_match[] = {
    { .compatible = "my-regmap-device" },
    {}
};

static struct platform_driver my_regmap_driver = {
    .driver = {
        .name = "my-regmap-device",
        .of_match_table = my_regmap_match,
        .init = my_regmap_init,
        .exit = my_regmap_exit,
    },
};

module_platform_driver(my_regmap_driver);

MODULE_LICENSE("GPL");

在这个示例中,我们首先使用platform_get_resource()函数获取regmap资源,然后使用regmap_alloc()函数分配regmap。接下来,我们使用regmap_register_child()函数将子设备注册到regmap中。最后,在设备驱动程序的exit()函数中,我们使用regmap_unregister_child()和regmap_free()函数释放regmap资源。

0