linux/drivers/pci/pcie/portdrv_bus.c
<<
>>
Prefs
   1/*
   2 * File:        portdrv_bus.c
   3 * Purpose:     PCI Express Port Bus Driver's Bus Overloading Functions
   4 *
   5 * Copyright (C) 2004 Intel
   6 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/pci.h>
  11#include <linux/kernel.h>
  12#include <linux/errno.h>
  13#include <linux/pm.h>
  14
  15#include <linux/pcieport_if.h>
  16#include "portdrv.h"
  17
  18static int pcie_port_bus_match(struct device *dev, struct device_driver *drv);
  19
  20struct bus_type pcie_port_bus_type = {
  21        .name           = "pci_express",
  22        .match          = pcie_port_bus_match,
  23};
  24EXPORT_SYMBOL_GPL(pcie_port_bus_type);
  25
  26static int pcie_port_bus_match(struct device *dev, struct device_driver *drv)
  27{
  28        struct pcie_device *pciedev;
  29        struct pcie_port_data *port_data;
  30        struct pcie_port_service_driver *driver;
  31
  32        if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type)
  33                return 0;
  34
  35        pciedev = to_pcie_device(dev);
  36        driver = to_service_driver(drv);
  37
  38        if (driver->service != pciedev->service)
  39                return 0;
  40
  41        port_data = pci_get_drvdata(pciedev->port);
  42
  43        if (driver->port_type != PCIE_ANY_PORT
  44             && driver->port_type != port_data->port_type)
  45                return 0;
  46
  47        return 1;
  48}
  49
  50int pcie_port_bus_register(void)
  51{
  52        return bus_register(&pcie_port_bus_type);
  53}
  54
  55void pcie_port_bus_unregister(void)
  56{
  57        bus_unregister(&pcie_port_bus_type);
  58}
  59