Изучал https://github.com/Xilinx/linux-xlnx/blob/xlnx_rebase_v4.19/sound/soc/xilinx/xlnx_pl_snd_card.c
Конкретно функцию xlnx_snd_probe() и не мог понять… Как в pdev->dev.platform_data оказываются нужные ноды, в нужной последовательности (сначала PLAYBACK, потом CAPTURE), причём, если PLAYBACK нет, то там будет NULL.
Так как у драйвера нет of_match_table, то он:
- сам не загрузится (это так на практике) и
- что бы
xlnx_snd_probe()что-то нашла, через него нужно пропустить ВСЕplatform_device… но не всех же платформенных устройств вplatform_dataвообще именно этот тип данных будет!
Второе оказывается не так. Это “виртуальный” драйвер, а другой,
реальный для этого устройства, вызовом функции
platform_device_register_resndata() собственно создаёт platform_device, и в качестве второго аргумента оно принимает имя, по которому будет отфильтровываться, какому драйверу оно может быть передано. В данном случае “xlnx_snd_card”. И этот же вызов регистрирует pdev->dev.platform_data, в нужном для целевого драйвера виде.
А уже матчинг подходящего платформенного драйвера для вновь созданного платформенного устройства будет происходить здесь:
platform_match(). В данном случае - по имени устройства и по имени драйвера.
Тяжело идёт.
PS разные верии ядра роли не играют.