Поиск детей от devicetree в драйвере Linux
У меня проблема с нахождением ребенка в моем девичнике. Я пишу драйвер Linux, и я использую функции of_match_device и of_find_matching_node. Когда я проверяю, каких детей я нашел, я вижу, что это мой родитель. Что я делаю не так? Совместимость родительских и дочерних элементов должна быть определена в одной структуре of_device_id? Мои ярлыки детей верны?
Это мое заявление в devicetree:
soc: h2f_lw_bridge@0xff200000 {
compatible = "altr,socfpga-mysoftip";
reg = <0xff200000 0x00200000>;
//interrupts = <GIC_SPI 40 IRQ_TYPE_EDGE_RISING>;
#address-cells = < 2 >;
#size-cells = < 1 >;
ranges = <0 0x100 0xff200100 0x4
0 0x200 0xff200200 0x100>;
hw_tester_gpio: tester_gpio@0x000000100 {
compatible = "altr,socfpga-gpio";
reg = <0 0x100 0x4>;
//reg = <0xff200100 0x4>;
interrupt = <GIC_SPI 40 IRQ_TYPE_EDGE_RISING>;
};
reconig_data_clk: reconfig_pll@0x000000200 {
compatible = "altr,socfpga-pll";
reg = <0 0x200 0x100>;
//reg = <0xFF200200 0x100>;
};
};
Как я получаю получить узлы (фрагменты моего драйвера Linux):
struct h2f_lw_bridge *h2f_lw;
struct h2f_lw_bridge {
struct device *dev;
void __iomem *base;
void __iomem *base_of;
void __iomem *base_node;
const struct of_device_id *match;
struct device_node *node;
};
...
static const struct of_device_id _driver_id[] = {
{.compatible = "altr,socfpga-mysoftip"}, //parent
{.compatible = "altr,socfpga-gpio"}, //child
{.compatible = "altr,socfpga-pll"}, //child
{}
};
...
h2f_lw->match = of_match_device(_driver_id, &pdev->dev);
h2f_lw->node = of_find_matching_node(NULL,h2f_lw->match);
if (!h2f_lw->match)
return -EINVAL;
printk("h2f_lw->node: '%s' - pdev->dev.of_node: '%s' - h2f_lw->node: '%s'\n",h2f_lw->node->name,pdev->dev.of_node->name,h2f_lw->node->name);