Какой самый чистый способ получить указатель на структурное устройство в Linux?

#linux-kernel #linux-device-driver #device #device-tree

#linux-ядро #linux-device-driver #устройство #устройство-дерево

Вопрос:

мне нужно было бы получить указатель на конкретное устройство, зарегистрированное в Linux. Вкратце, это устройство представляет mii_bus объект. Проблема в том, что это устройство, похоже, не принадлежит шине (оно dev->bus есть NULL ), поэтому я не могу использовать, например, функцию bus_for_each_dev . Однако устройство зарегистрировано на уровне Open Firmware, и я могу видеть относительный of_device (который является родительским для интересующего меня устройства) /sys/bus/of_platform . Мое устройство также зарегистрировано в a class , поэтому я могу его найти /sys/class/mdio_bus . Теперь вопросы:

  1. Можно получить указатель, используя указатель на of_device то, что является родительским устройством, которое мы хотим?

  2. Как я могу получить указатель на уже созданный класс, используя только имя?Если бы это было возможно, я мог бы перебрать устройства этого класса.

Любой другой совет был бы очень полезен! Спасибо вам всем.

Ответ №1:

Я нашел способ. Я кратко объясняю это, может быть, это может быть полезно. Метод, который мы могли бы использовать, это device_find_child . Метод принимает в качестве третьего параметра указатель на функцию, которая реализует логику сравнения. Если функция возвращает не ноль при вызове с определенным устройством в качестве первого параметра, device_find_child вернет этот указатель.

 #include <linux/device.h>
#include <linux/of_platform.h>

static int custom_match_dev(struct device *dev, void *data)
{
  /* this function implements the comaparison logic. Return not zero if device
     pointed by dev is the device you are searching for.
   */
}

static struct device *find_dev()
{
  struct device *ofdev = bus_find_device_by_name(amp;of_platform_bus_type,
                                                 NULL, "OF_device_name");
  if (ofdev)
  {
    /* of device is the parent of device we are interested in */

    struct device *real_dev = device_find_child(ofdev,
                                                NULL, /* passed in the second param to custom_match_dev */
                                                custom_match_dev);
    if (real_dev)
      return real_dev;
  }
  return NULL;
}
  

Комментарии:

1. Помните, что device_find_child() увеличивает счетчик ссылок найденного дочернего устройства. Итак, когда вы закончили использовать дочернее устройство, вы должны выполнить put_device();