11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * File: portdrv_bus.c 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Purpose: PCI Express Port Bus Driver's Bus Overloading Functions 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2004 Intel 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com) 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pm.h> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pcieport_if.h> 165d9526d07a8dc87460c13c277b3edcc26b0e662fAlex Chiang#include "portdrv.h" 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int pcie_port_bus_match(struct device *dev, struct device_driver *drv); 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct bus_type pcie_port_bus_type = { 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "pci_express", 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .match = pcie_port_bus_match, 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2448408157ebf5b2c6dc1e04ba5d258012f6a7f356Zhang, YanminEXPORT_SYMBOL_GPL(pcie_port_bus_type); 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int pcie_port_bus_match(struct device *dev, struct device_driver *drv) 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pcie_device *pciedev; 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pcie_port_service_driver *driver; 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type) 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3322106368c999246c414610dcaacd485e741605b1Rafael J. Wysocki 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pciedev = to_pcie_device(dev); 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds driver = to_service_driver(drv); 3622106368c999246c414610dcaacd485e741605b1Rafael J. Wysocki 3722106368c999246c414610dcaacd485e741605b1Rafael J. Wysocki if (driver->service != pciedev->service) 3822106368c999246c414610dcaacd485e741605b1Rafael J. Wysocki return 0; 3922106368c999246c414610dcaacd485e741605b1Rafael J. Wysocki 40694f88ef7ada0d99e304f687ba92e268a594358bKenji Kaneshige if ((driver->port_type != PCIE_ANY_PORT) && 41694f88ef7ada0d99e304f687ba92e268a594358bKenji Kaneshige (driver->port_type != pciedev->port->pcie_type)) 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 1; 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 46fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki 47fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysockiint pcie_port_bus_register(void) 48fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki{ 49fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki return bus_register(&pcie_port_bus_type); 50fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki} 51fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki 52fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysockivoid pcie_port_bus_unregister(void) 53fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki{ 54fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki bus_unregister(&pcie_port_bus_type); 55fa6c993736cb8cc18af86b8d17b608efa7882ab5Rafael J. Wysocki} 56