Изучал 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 разные верии ядра роли не играют.