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