of_match_device函数是什么?
of_match_device函数一般用于设备树驱动程序中,用来获取与设备节点相关联的设备驱动程序。
of_match_device函数是Linux内核中的一个函数,用于设备树中设备节点和设备驱动程序之间的匹配。这个函数的作用是通过指定的设备树节点和设备驱动程序的匹配信息进行匹配,如果匹配成功,就返回相应的设备驱动程序。
of_match_device函数的原型定义如下:
```
const struct of_device_id *of_match_device(const struct of_device_id *matches,
const struct device *dev);
```
其中:
matches参数是一个of_device_id类型的数组,用来存储 设备驱动程序和设备节点之间的匹配信息。
dev参数是设备树中的一个设备节点,用于匹配 设备节点和设备驱动程序之间的匹配信息。
of_match_device函数会遍历matches数组中的每一项,将其与dev参数进行匹配,如果匹配成功,就返回该设备驱动程序对应的of_device_id结构体,否则返回NULL。
在设备树驱动程序中,一般会定义一个static const struct of_device_id类型的数组,用来存储设备驱动程序和设备节点之间的匹配信息。然后通过调用of_match_device函数,将设备节点和设备驱动程序进行匹配,获取匹配成功的设备驱动程序。
比如:
static const struct mtk_soc_data mt7621_data = {
.caps = MT7621_CAPS,
.required_clks = MT7621_CLKS_BITMAP,
.required_pctl = false,
.irq_num = 1,
};
const struct of_device_id of_mtk_match[] = {
{ .compatible = "mediatek,mt2701-eth", .data = &mt2701_data},
{ .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
{ .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
{ .compatible = "mediatek,mt7629-eth", .data = &leopard_data},
{ .compatible = "mediatek,mt7621-eth", .data = &mt7621_data},
{},
};
MODULE_DEVICE_TABLE(of, of_mtk_match);
static int mtk_probe(struct platform_device *pdev)
{
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
struct device_node *mac_np;
const struct of_device_id *match;
struct mtk_eth *eth;
int err;
int i;
eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL);
if (!eth)
return -ENOMEM;
match = of_match_device(of_mtk_match, &pdev->dev);
eth->soc = (struct mtk_soc_data *)match->data;

