Какой более чистый способ получить указатель на устройство struct в Linux? - PullRequest
4 голосов
/ 03 октября 2011

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

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

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

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

1 Ответ

5 голосов
/ 04 октября 2011

Я нашел способ.Я объясняю это кратко, может быть, это может быть полезно.Метод, который мы могли бы использовать - 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(&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;
}
...