Contributions are solicited in particular to remedy the following issues:

cpcihp:

* Returned code from pci_hp_add_bridge() is not checked.

cpqphp:

* The driver spawns a kthread cpqhp_event_thread() which is woken by the
  hardirq handler cpqhp_ctrl_intr().  Convert this to threaded IRQ handling.
  The kthread is also woken from the timer pushbutton_helper_thread(),
  convert it to call irq_wake_thread().  Use pciehp as a template.

* A large portion of cpqphp_ctrl.c and cpqphp_pci.c concerns resource
  management.  Doesn't this duplicate functionality in the core?

* Returned code from pci_hp_add_bridge() is not checked.

ibmphp:

* Implementations of hotplug_slot_ops callbacks such as get_adapter_present()
  in ibmphp_core.c create a copy of the struct slot on the stack, then perform
  the actual operation on that copy.  Determine if this overhead is necessary,
  delete it if not.  The functions also perform a NULL pointer check on the
  struct hotplug_slot, this seems superfluous.

* Several functions access the pci_slot member in struct hotplug_slot even
  though pci_hotplug.h declares it private.  See get_max_bus_speed() for an
  example.  Either the pci_slot member should no longer be declared private
  or ibmphp should store a pointer to its bus in struct slot.  Probably the
  former.

* ibmphp_init_devno() takes a struct slot **, it could instead take a
  struct slot *.

* The return value of pci_hp_register() is not checked.

* The various slot data structures are difficult to follow and need to be
  simplified.  A lot of functions are too large and too complex, they need
  to be broken up into smaller, manageable pieces.  Negative examples are
  ebda_rsrc_controller() and configure_bridge().

* A large portion of ibmphp_res.c and ibmphp_pci.c concerns resource
  management.  Doesn't this duplicate functionality in the core?

* Returned code from pci_hp_add_bridge() is not checked.

shpchp:

* The hardirq handler shpc_isr() queues events on a workqueue.  It can be
  simplified by converting it to threaded IRQ handling.  Use pciehp as a
  template.
