diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h
index c0be7a1c3ff7af98ba9529cb41864d6cf28b1611..f6d606dde6916c8d3f3478759208d23e80cc7765 100644
--- a/drivers/pci/hotplug/shpchp.h
+++ b/drivers/pci/hotplug/shpchp.h
@@ -78,7 +78,7 @@ struct event_info {
 };
 
 struct controller {
-	struct controller *next;
+	struct list_head ctrl_list;
 	struct mutex crit_sect;		/* critical section mutex */
 	struct php_ctlr_state_s *hpc_ctlr_handle; /* HPC controller handle */
 	int num_slots;			/* Number of slots on ctlr */
@@ -204,7 +204,7 @@ extern void	shpchp_remove_ctrl_files(struct controller *ctrl);
 
 
 /* Global variables */
-extern struct controller *shpchp_ctrl_list;
+extern struct list_head shpchp_ctrl_list;
 
 struct ctrl_reg {
 	volatile u32 base_offset;
diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c
index 547bf5d6fccabf025f56321daa34643d83880ab0..0dd0642e691b1185e28d0764f7cb24f643616f8a 100644
--- a/drivers/pci/hotplug/shpchp_core.c
+++ b/drivers/pci/hotplug/shpchp_core.c
@@ -38,7 +38,7 @@
 int shpchp_debug;
 int shpchp_poll_mode;
 int shpchp_poll_time;
-struct controller *shpchp_ctrl_list;	/* = NULL */
+LIST_HEAD(shpchp_ctrl_list);
 
 #define DRIVER_VERSION	"0.4"
 #define DRIVER_AUTHOR	"Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>"
@@ -452,13 +452,7 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	/* Finish setting up the hot plug ctrl device */
 	ctrl->next_event = 0;
 
-	if (!shpchp_ctrl_list) {
-		shpchp_ctrl_list = ctrl;
-		ctrl->next = NULL;
-	} else {
-		ctrl->next = shpchp_ctrl_list;
-		shpchp_ctrl_list = ctrl;
-	}
+	list_add(&ctrl->ctrl_list, &shpchp_ctrl_list);
 
 	shpchp_create_ctrl_files(ctrl);
 
@@ -493,22 +487,17 @@ static int shpc_start_thread(void)
 
 static void __exit unload_shpchpd(void)
 {
+	struct list_head *tmp;
+	struct list_head *next;
 	struct controller *ctrl;
-	struct controller *tctrl;
-
-	ctrl = shpchp_ctrl_list;
 
-	while (ctrl) {
+	list_for_each_safe(tmp, next, &shpchp_ctrl_list) {
+		ctrl = list_entry(tmp, struct controller, ctrl_list);
 		shpchp_remove_ctrl_files(ctrl);
 		cleanup_slots(ctrl);
-
 		kfree (ctrl->pci_bus);
 		ctrl->hpc_ops->release_ctlr(ctrl);
-
-		tctrl = ctrl;
-		ctrl = ctrl->next;
-
-		kfree(tctrl);
+		kfree(ctrl);
 	}
 
 	/* Stop the notification mechanism */
diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c
index 65e69252e2f9560f8be8ddb9018cf3861f0f0039..3a8e733aead5b0f42e3df35bfbc49cf5490f82b0 100644
--- a/drivers/pci/hotplug/shpchp_ctrl.c
+++ b/drivers/pci/hotplug/shpchp_ctrl.c
@@ -688,7 +688,7 @@ static int event_thread(void* data)
 		if (pushbutton_pending)
 			shpchp_pushbutton_thread(pushbutton_pending);
 		else
-			for (ctrl = shpchp_ctrl_list; ctrl; ctrl=ctrl->next)
+			list_for_each_entry(ctrl, &shpchp_ctrl_list, ctrl_list)
 				interrupt_event_handler(ctrl);
 	}
 	dbg("event_thread signals exit\n");