Hatred's Log Place

DON'T PANIC!

Apr 10, 2020 - 1 minute read - linux programming

platform_device subdevice

Изучал 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, то он:

  1. сам не загрузится (это так на практике) и
  2. что бы xlnx_snd_probe() что-то нашла, через него нужно пропустить ВСЕ platform_device… но не всех же платформенных устройств в platform_data вообще именно этот тип данных будет!

Второе оказывается не так. Это “виртуальный” драйвер, а другой, реальный для этого устройства, вызовом функции platform_device_register_resndata() собственно создаёт platform_device, и в качестве второго аргумента оно принимает имя, по которому будет отфильтровываться, какому драйверу оно может быть передано. В данном случае “xlnx_snd_card”. И этот же вызов регистрирует pdev->dev.platform_data, в нужном для целевого драйвера виде.

А уже матчинг подходящего платформенного драйвера для вновь созданного платформенного устройства будет происходить здесь: platform_match(). В данном случае - по имени устройства и по имени драйвера.

Тяжело идёт.

PS разные верии ядра роли не играют.