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 17static int pcie_port_bus_match(struct device *dev, struct device_driver *drv); 18static int pcie_port_bus_suspend(struct device *dev, pm_message_t state); 19static int pcie_port_bus_resume(struct device *dev); 20 21struct bus_type pcie_port_bus_type = { 22 .name = "pci_express", 23 .match = pcie_port_bus_match, 24 .suspend = pcie_port_bus_suspend, 25 .resume = pcie_port_bus_resume, 26}; 27EXPORT_SYMBOL_GPL(pcie_port_bus_type); 28 29static int pcie_port_bus_match(struct device *dev, struct device_driver *drv) 30{ 31 struct pcie_device *pciedev; 32 struct pcie_port_service_driver *driver; 33 34 if (drv->bus != &pcie_port_bus_type || dev->bus != &pcie_port_bus_type) 35 return 0; 36 37 pciedev = to_pcie_device(dev); 38 driver = to_service_driver(drv); 39 if ( (driver->id_table->vendor != PCI_ANY_ID && 40 driver->id_table->vendor != pciedev->id.vendor) || 41 (driver->id_table->device != PCI_ANY_ID && 42 driver->id_table->device != pciedev->id.device) || 43 (driver->id_table->port_type != PCIE_ANY_PORT && 44 driver->id_table->port_type != pciedev->id.port_type) || 45 driver->id_table->service_type != pciedev->id.service_type ) 46 return 0; 47 48 return 1; 49} 50 51static int pcie_port_bus_suspend(struct device *dev, pm_message_t state) 52{ 53 struct pcie_device *pciedev; 54 struct pcie_port_service_driver *driver; 55 56 if (!dev || !dev->driver) 57 return 0; 58 59 pciedev = to_pcie_device(dev); 60 driver = to_service_driver(dev->driver); 61 if (driver && driver->suspend) 62 driver->suspend(pciedev, state); 63 return 0; 64} 65 66static int pcie_port_bus_resume(struct device *dev) 67{ 68 struct pcie_device *pciedev; 69 struct pcie_port_service_driver *driver; 70 71 if (!dev || !dev->driver) 72 return 0; 73 74 pciedev = to_pcie_device(dev); 75 driver = to_service_driver(dev->driver); 76 if (driver && driver->resume) 77 driver->resume(pciedev); 78 return 0; 79} 80