* struct slot - slot information for each *physical* slot
  */
 struct slot {
-       struct hotplug_slot     *hotplug_slot;
+       struct hotplug_slot     hotplug_slot;
        struct acpiphp_slot     *acpi_slot;
        unsigned int sun;       /* ACPI _SUN (Slot User Number) value */
 };
 
 static inline const char *slot_name(struct slot *slot)
 {
-       return hotplug_slot_name(slot->hotplug_slot);
+       return hotplug_slot_name(&slot->hotplug_slot);
+}
+
+static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
 }
 
 /*
 
  */
 static int enable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        pr_debug("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
  */
 static int disable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        pr_debug("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
  */
 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        pr_debug("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
  */
 static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        pr_debug("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
  */
 static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        pr_debug("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
        if (!slot)
                goto error;
 
-       slot->hotplug_slot = kzalloc(sizeof(*slot->hotplug_slot), GFP_KERNEL);
-       if (!slot->hotplug_slot)
-               goto error_slot;
-
-       slot->hotplug_slot->private = slot;
-       slot->hotplug_slot->ops = &acpi_hotplug_slot_ops;
+       slot->hotplug_slot.ops = &acpi_hotplug_slot_ops;
 
        slot->acpi_slot = acpiphp_slot;
 
        slot->sun = sun;
        snprintf(name, SLOT_NAME_SIZE, "%u", sun);
 
-       retval = pci_hp_register(slot->hotplug_slot, acpiphp_slot->bus,
+       retval = pci_hp_register(&slot->hotplug_slot, acpiphp_slot->bus,
                                 acpiphp_slot->device, name);
        if (retval == -EBUSY)
-               goto error_hpslot;
+               goto error_slot;
        if (retval) {
                pr_err("pci_hp_register failed with error %d\n", retval);
-               goto error_hpslot;
+               goto error_slot;
        }
 
        pr_info("Slot [%s] registered\n", slot_name(slot));
 
        return 0;
-error_hpslot:
-       kfree(slot->hotplug_slot);
 error_slot:
        kfree(slot);
 error:
 
        pr_info("Slot [%s] unregistered\n", slot_name(slot));
 
-       pci_hp_deregister(slot->hotplug_slot);
-       kfree(slot->hotplug_slot);
+       pci_hp_deregister(&slot->hotplug_slot);
        kfree(slot);
 }
 
 
 #define IBM_HARDWARE_ID1 "IBM37D0"
 #define IBM_HARDWARE_ID2 "IBM37D4"
 
-#define hpslot_to_sun(A) (((struct slot *)((A)->private))->sun)
+#define hpslot_to_sun(A) (to_slot(A)->sun)
 
 /* union apci_descriptor - allows access to the
  * various device descriptors that are embedded in the
 
        unsigned int latch_status:1;
        unsigned int adapter_status:1;
        unsigned int extracting;
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct list_head slot_list;
 };
 
 
 static inline const char *slot_name(struct slot *slot)
 {
-       return hotplug_slot_name(slot->hotplug_slot);
+       return hotplug_slot_name(&slot->hotplug_slot);
+}
+
+static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
 }
 
 int cpci_hp_register_controller(struct cpci_hp_controller *controller);
 
 static int
 enable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        int retval = 0;
 
        dbg("%s - physical_slot = %s", __func__, slot_name(slot));
 static int
 disable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        int retval = 0;
 
        dbg("%s - physical_slot = %s", __func__, slot_name(slot));
 static int
 get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        *value = cpci_get_power_status(slot);
        return 0;
 static int
 get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        *value = cpci_get_attention_status(slot);
        return 0;
 static int
 set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
 {
-       return cpci_set_attention_status(hotplug_slot->private, status);
+       return cpci_set_attention_status(to_slot(hotplug_slot), status);
 }
 
 static int
 get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        *value = slot->adapter_status;
        return 0;
 static int
 get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        *value = slot->latch_status;
        return 0;
 
 static void release_slot(struct slot *slot)
 {
-       kfree(slot->hotplug_slot);
        pci_dev_put(slot->dev);
        kfree(slot);
 }
 cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
 {
        struct slot *slot;
-       struct hotplug_slot *hotplug_slot;
        char name[SLOT_NAME_SIZE];
        int status;
        int i;
                        goto error;
                }
 
-               hotplug_slot =
-                       kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
-               if (!hotplug_slot) {
-                       status = -ENOMEM;
-                       goto error_slot;
-               }
-               slot->hotplug_slot = hotplug_slot;
-
                slot->bus = bus;
                slot->number = i;
                slot->devfn = PCI_DEVFN(i, 0);
 
                snprintf(name, SLOT_NAME_SIZE, "%02x:%02x", bus->number, i);
 
-               hotplug_slot->private = slot;
-               hotplug_slot->ops = &cpci_hotplug_slot_ops;
+               slot->hotplug_slot.ops = &cpci_hotplug_slot_ops;
 
                dbg("registering slot %s", name);
-               status = pci_hp_register(slot->hotplug_slot, bus, i, name);
+               status = pci_hp_register(&slot->hotplug_slot, bus, i, name);
                if (status) {
                        err("pci_hp_register failed with error %d", status);
-                       goto error_hpslot;
+                       goto error_slot;
                }
                dbg("slot registered with name: %s", slot_name(slot));
 
                up_write(&list_rwsem);
        }
        return 0;
-error_hpslot:
-       kfree(hotplug_slot);
 error_slot:
        kfree(slot);
 error:
                        slots--;
 
                        dbg("deregistering slot %s", slot_name(slot));
-                       pci_hp_deregister(slot->hotplug_slot);
+                       pci_hp_deregister(&slot->hotplug_slot);
                        release_slot(slot);
                }
        }
                goto cleanup_null;
        list_for_each_entry_safe(slot, tmp, &slot_list, slot_list) {
                list_del(&slot->slot_list);
-               pci_hp_deregister(slot->hotplug_slot);
+               pci_hp_deregister(&slot->hotplug_slot);
                release_slot(slot);
        }
 cleanup_null:
 
                                              slot->devfn,
                                              hs_cap + 2,
                                              hs_csr)) {
-                       err("Could not set LOO for slot %s",
-                           hotplug_slot_name(slot->hotplug_slot));
+                       err("Could not set LOO for slot %s", slot_name(slot));
                        return -ENODEV;
                }
        }
                                              slot->devfn,
                                              hs_cap + 2,
                                              hs_csr)) {
-                       err("Could not clear LOO for slot %s",
-                           hotplug_slot_name(slot->hotplug_slot));
+                       err("Could not clear LOO for slot %s", slot_name(slot));
                        return -ENODEV;
                }
        }
 
        u8 hp_slot;
        struct controller *ctrl;
        void __iomem *p_sm_slot;
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
 };
 
 struct pci_resource {
 
 static inline const char *slot_name(struct slot *slot)
 {
-       return hotplug_slot_name(slot->hotplug_slot);
+       return hotplug_slot_name(&slot->hotplug_slot);
+}
+
+static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
 }
 
 /*
 
 
        while (old_slot) {
                next_slot = old_slot->next;
-               pci_hp_deregister(old_slot->hotplug_slot);
-               kfree(old_slot->hotplug_slot);
+               pci_hp_deregister(&old_slot->hotplug_slot);
                kfree(old_slot);
                old_slot = next_slot;
        }
 static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
 {
        struct pci_func *slot_func;
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
        u8 bus;
        u8 devfn;
 static int process_SI(struct hotplug_slot *hotplug_slot)
 {
        struct pci_func *slot_func;
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
        u8 bus;
        u8 devfn;
 static int process_SS(struct hotplug_slot *hotplug_slot)
 {
        struct pci_func *slot_func;
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
        u8 bus;
        u8 devfn;
 
 static int hardware_test(struct hotplug_slot *hotplug_slot, u32 value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
 
        dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
 
        dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
 static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
 
        dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
 static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
 
        dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
 
 static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct controller *ctrl = slot->ctrl;
 
        dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
                        void __iomem *smbios_table)
 {
        struct slot *slot;
-       struct hotplug_slot *hotplug_slot;
        struct pci_bus *bus = ctrl->pci_bus;
        u8 number_of_slots;
        u8 slot_device;
                        goto error;
                }
 
-               slot->hotplug_slot = kzalloc(sizeof(*(slot->hotplug_slot)),
-                                               GFP_KERNEL);
-               if (!slot->hotplug_slot) {
-                       result = -ENOMEM;
-                       goto error_slot;
-               }
-               hotplug_slot = slot->hotplug_slot;
-
                slot->ctrl = ctrl;
                slot->bus = ctrl->bus;
                slot->device = slot_device;
                        ((read_slot_enable(ctrl) << 2) >> ctrl_slot) & 0x04;
 
                /* register this slot with the hotplug pci core */
-               hotplug_slot->private = slot;
                snprintf(name, SLOT_NAME_SIZE, "%u", slot->number);
-               hotplug_slot->ops = &cpqphp_hotplug_slot_ops;
+               slot->hotplug_slot.ops = &cpqphp_hotplug_slot_ops;
 
                dbg("registering bus %d, dev %d, number %d, ctrl->slot_device_offset %d, slot %d\n",
                                slot->bus, slot->device,
                                slot->number, ctrl->slot_device_offset,
                                slot_number);
-               result = pci_hp_register(hotplug_slot,
+               result = pci_hp_register(&slot->hotplug_slot,
                                         ctrl->pci_dev->bus,
                                         slot->device,
                                         name);
                if (result) {
                        err("pci_hp_register failed with error %d\n", result);
-                       goto error_hpslot;
+                       goto error_slot;
                }
 
                slot->next = ctrl->slot;
        }
 
        return 0;
-error_hpslot:
-       kfree(hotplug_slot);
 error_slot:
        kfree(slot);
 error:
 
        for (slot = ctrl->slot; slot; slot = slot->next) {
                if (slot->device == (hp_slot + ctrl->slot_device_offset))
                        continue;
-               if (!slot->hotplug_slot)
-                       continue;
                if (get_presence_status(ctrl, slot) == 0)
                        continue;
                /* If another adapter is running on the same segment but at a
 
        u8 supported_bus_mode;
        u8 flag;                /* this is for disable slot and polling */
        u8 ctlr_index;
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct controller *ctrl;
        struct pci_func *func;
        u8 irq[4];
 int ibmphp_unconfigure_card(struct slot **, int);
 extern const struct hotplug_slot_ops ibmphp_hotplug_slot_ops;
 
+static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
+}
+
 #endif                         //__IBMPHP_H
 
 
                        break;
                }
                if (rc == 0) {
-                       pslot = hotplug_slot->private;
-                       if (pslot)
-                               rc = ibmphp_hpc_writeslot(pslot, cmd);
-                       else
-                               rc = -ENODEV;
+                       pslot = to_slot(hotplug_slot);
+                       rc = ibmphp_hpc_writeslot(pslot, cmd);
                }
        } else
                rc = -ENODEV;
 
        ibmphp_lock_operations();
        if (hotplug_slot) {
-               pslot = hotplug_slot->private;
-               if (pslot) {
-                       memcpy(&myslot, pslot, sizeof(struct slot));
-                       rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
-                                               &(myslot.status));
-                       if (!rc)
-                               rc = ibmphp_hpc_readslot(pslot,
-                                               READ_EXTSLOTSTATUS,
-                                               &(myslot.ext_status));
-                       if (!rc)
-                               *value = SLOT_ATTN(myslot.status,
-                                               myslot.ext_status);
-               }
+               pslot = to_slot(hotplug_slot);
+               memcpy(&myslot, pslot, sizeof(struct slot));
+               rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
+                                        &myslot.status);
+               if (!rc)
+                       rc = ibmphp_hpc_readslot(pslot, READ_EXTSLOTSTATUS,
+                                                &myslot.ext_status);
+               if (!rc)
+                       *value = SLOT_ATTN(myslot.status, myslot.ext_status);
        }
 
        ibmphp_unlock_operations();
                                        (ulong) hotplug_slot, (ulong) value);
        ibmphp_lock_operations();
        if (hotplug_slot) {
-               pslot = hotplug_slot->private;
-               if (pslot) {
-                       memcpy(&myslot, pslot, sizeof(struct slot));
-                       rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
-                                               &(myslot.status));
-                       if (!rc)
-                               *value = SLOT_LATCH(myslot.status);
-               }
+               pslot = to_slot(hotplug_slot);
+               memcpy(&myslot, pslot, sizeof(struct slot));
+               rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
+                                        &myslot.status);
+               if (!rc)
+                       *value = SLOT_LATCH(myslot.status);
        }
 
        ibmphp_unlock_operations();
                                        (ulong) hotplug_slot, (ulong) value);
        ibmphp_lock_operations();
        if (hotplug_slot) {
-               pslot = hotplug_slot->private;
-               if (pslot) {
-                       memcpy(&myslot, pslot, sizeof(struct slot));
-                       rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
-                                               &(myslot.status));
-                       if (!rc)
-                               *value = SLOT_PWRGD(myslot.status);
-               }
+               pslot = to_slot(hotplug_slot);
+               memcpy(&myslot, pslot, sizeof(struct slot));
+               rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
+                                        &myslot.status);
+               if (!rc)
+                       *value = SLOT_PWRGD(myslot.status);
        }
 
        ibmphp_unlock_operations();
                                        (ulong) hotplug_slot, (ulong) value);
        ibmphp_lock_operations();
        if (hotplug_slot) {
-               pslot = hotplug_slot->private;
-               if (pslot) {
-                       memcpy(&myslot, pslot, sizeof(struct slot));
-                       rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
-                                               &(myslot.status));
-                       if (!rc) {
-                               present = SLOT_PRESENT(myslot.status);
-                               if (present == HPC_SLOT_EMPTY)
-                                       *value = 0;
-                               else
-                                       *value = 1;
-                       }
+               pslot = to_slot(hotplug_slot);
+               memcpy(&myslot, pslot, sizeof(struct slot));
+               rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
+                                        &myslot.status);
+               if (!rc) {
+                       present = SLOT_PRESENT(myslot.status);
+                       if (present == HPC_SLOT_EMPTY)
+                               *value = 0;
+                       else
+                               *value = 1;
                }
        }
 
        int rc = 0;
        u8 mode = 0;
        enum pci_bus_speed speed;
-       struct pci_bus *bus = slot->hotplug_slot->pci_slot->bus;
+       struct pci_bus *bus = slot->hotplug_slot.pci_slot->bus;
 
        debug("%s - Entry slot[%p]\n", __func__, slot);
 
  ****************************************************************************/
 int ibmphp_update_slot_info(struct slot *slot_cur)
 {
-       struct pci_bus *bus = slot_cur->hotplug_slot->pci_slot->bus;
+       struct pci_bus *bus = slot_cur->hotplug_slot.pci_slot->bus;
        u8 bus_speed;
        u8 mode;
 
 
        list_for_each_entry_safe(slot_cur, next, &ibmphp_slot_head,
                                 ibm_slot_list) {
-               pci_hp_del(slot_cur->hotplug_slot);
+               pci_hp_del(&slot_cur->hotplug_slot);
                slot_cur->ctrl = NULL;
                slot_cur->bus_on = NULL;
 
                 */
                ibmphp_unconfigure_card(&slot_cur, -1);
 
-               pci_hp_destroy(slot_cur->hotplug_slot);
-               kfree(slot_cur->hotplug_slot);
+               pci_hp_destroy(&slot_cur->hotplug_slot);
                kfree(slot_cur);
        }
        debug("%s -- exit\n", __func__);
        ibmphp_lock_operations();
 
        debug("ENABLING SLOT........\n");
-       slot_cur = hs->private;
+       slot_cur = to_slot(hs);
 
        rc = validate(slot_cur, ENABLE);
        if (rc) {
 **************************************************************/
 static int ibmphp_disable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        int rc;
 
        ibmphp_lock_operations();
 
        struct slot *slot;
        int rc = 0;
 
-       if (!hotplug_slot || !hotplug_slot->private)
-               return -EINVAL;
-
-       slot = hotplug_slot->private;
+       slot = to_slot(hotplug_slot);
        rc = ibmphp_hpc_readslot(slot, READ_ALLSTAT, NULL);
        return rc;
 }
        u8 ctlr_id, temp, bus_index;
        u16 ctlr, slot, bus;
        u16 slot_num, bus_num, index;
-       struct hotplug_slot *hp_slot_ptr;
        struct controller *hpc_ptr;
        struct ebda_hpc_bus *bus_ptr;
        struct ebda_hpc_slot *slot_ptr;
                                bus_info_ptr1 = kzalloc(sizeof(struct bus_info), GFP_KERNEL);
                                if (!bus_info_ptr1) {
                                        rc = -ENOMEM;
-                                       goto error_no_hp_slot;
+                                       goto error_no_slot;
                                }
                                bus_info_ptr1->slot_min = slot_ptr->slot_num;
                                bus_info_ptr1->slot_max = slot_ptr->slot_num;
                                                     (hpc_ptr->u.isa_ctlr.io_end - hpc_ptr->u.isa_ctlr.io_start + 1),
                                                     "ibmphp")) {
                                        rc = -ENODEV;
-                                       goto error_no_hp_slot;
+                                       goto error_no_slot;
                                }
                                hpc_ptr->irq = readb(io_mem + addr + 4);
                                addr += 5;
                                break;
                        default:
                                rc = -ENODEV;
-                               goto error_no_hp_slot;
+                               goto error_no_slot;
                }
 
                //reorganize chassis' linked list
 
                // register slots with hpc core as well as create linked list of ibm slot
                for (index = 0; index < hpc_ptr->slot_count; index++) {
-
-                       hp_slot_ptr = kzalloc(sizeof(*hp_slot_ptr), GFP_KERNEL);
-                       if (!hp_slot_ptr) {
-                               rc = -ENOMEM;
-                               goto error_no_hp_slot;
-                       }
-
                        tmp_slot = kzalloc(sizeof(*tmp_slot), GFP_KERNEL);
                        if (!tmp_slot) {
                                rc = -ENOMEM;
 
                        bus_info_ptr1 = ibmphp_find_same_bus_num(hpc_ptr->slots[index].slot_bus_num);
                        if (!bus_info_ptr1) {
-                               kfree(tmp_slot);
                                rc = -ENODEV;
                                goto error;
                        }
 
                        tmp_slot->ctlr_index = hpc_ptr->slots[index].ctl_index;
                        tmp_slot->number = hpc_ptr->slots[index].slot_num;
-                       tmp_slot->hotplug_slot = hp_slot_ptr;
-
-                       hp_slot_ptr->private = tmp_slot;
 
-                       rc = fillslotinfo(hp_slot_ptr);
+                       rc = fillslotinfo(&tmp_slot->hotplug_slot);
                        if (rc)
                                goto error;
 
-                       rc = ibmphp_init_devno((struct slot **) &hp_slot_ptr->private);
+                       rc = ibmphp_init_devno(&tmp_slot);
                        if (rc)
                                goto error;
-                       hp_slot_ptr->ops = &ibmphp_hotplug_slot_ops;
+                       tmp_slot->hotplug_slot.ops = &ibmphp_hotplug_slot_ops;
 
                        // end of registering ibm slot with hotplug core
 
-                       list_add(&((struct slot *)(hp_slot_ptr->private))->ibm_slot_list, &ibmphp_slot_head);
+                       list_add(&tmp_slot->ibm_slot_list, &ibmphp_slot_head);
                }
 
                print_bus_info();
 
        list_for_each_entry(tmp_slot, &ibmphp_slot_head, ibm_slot_list) {
                snprintf(name, SLOT_NAME_SIZE, "%s", create_file_name(tmp_slot));
-               pci_hp_register(tmp_slot->hotplug_slot,
+               pci_hp_register(&tmp_slot->hotplug_slot,
                        pci_find_bus(0, tmp_slot->bus), tmp_slot->device, name);
        }
 
        return 0;
 
 error:
-       kfree(hp_slot_ptr->private);
+       kfree(tmp_slot);
 error_no_slot:
-       kfree(hp_slot_ptr);
-error_no_hp_slot:
        free_ebda_hpc(hpc_ptr);
 error_no_hpc:
        iounmap(io_mem);
 
  *     protects scheduling, execution and cancellation of @button_work
  * @button_work: work item to turn the slot on or off after 5 seconds
  *     in response to an Attention Button press
- * @hotplug_slot: pointer to the structure registered with the PCI hotplug core
+ * @hotplug_slot: structure registered with the PCI hotplug core
  * @reset_lock: prevents access to the Data Link Layer Link Active bit in the
  *     Link Status register and to the Presence Detect State bit in the Slot
  *     Status register during a slot reset which may cause them to flap
        struct mutex state_lock;
        struct delayed_work button_work;
 
-       struct hotplug_slot *hotplug_slot;      /* hotplug core interface */
+       struct hotplug_slot hotplug_slot;       /* hotplug core interface */
        struct rw_semaphore reset_lock;
        int request_result;
        wait_queue_head_t requester;
 
 static inline const char *slot_name(struct controller *ctrl)
 {
-       return hotplug_slot_name(ctrl->hotplug_slot);
+       return hotplug_slot_name(&ctrl->hotplug_slot);
+}
+
+static inline struct controller *to_ctrl(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct controller, hotplug_slot);
 }
 
 #endif                         /* _PCIEHP_H */
 
 
 static int init_slot(struct controller *ctrl)
 {
-       struct hotplug_slot *hotplug = NULL;
-       struct hotplug_slot_ops *ops = NULL;
+       struct hotplug_slot_ops *ops;
        char name[SLOT_NAME_SIZE];
-       int retval = -ENOMEM;
-
-       hotplug = kzalloc(sizeof(*hotplug), GFP_KERNEL);
-       if (!hotplug)
-               goto out;
+       int retval;
 
        /* Setup hotplug slot ops */
        ops = kzalloc(sizeof(*ops), GFP_KERNEL);
        if (!ops)
-               goto out;
+               return -ENOMEM;
 
        ops->enable_slot = pciehp_sysfs_enable_slot;
        ops->disable_slot = pciehp_sysfs_disable_slot;
        }
 
        /* register this slot with the hotplug pci core */
-       hotplug->private = ctrl;
-       hotplug->ops = ops;
-       ctrl->hotplug_slot = hotplug;
+       ctrl->hotplug_slot.ops = ops;
        snprintf(name, SLOT_NAME_SIZE, "%u", PSN(ctrl));
 
-       retval = pci_hp_initialize(hotplug,
+       retval = pci_hp_initialize(&ctrl->hotplug_slot,
                                   ctrl->pcie->port->subordinate, 0, name);
-       if (retval)
-               ctrl_err(ctrl, "pci_hp_initialize failed: error %d\n", retval);
-out:
        if (retval) {
+               ctrl_err(ctrl, "pci_hp_initialize failed: error %d\n", retval);
                kfree(ops);
-               kfree(hotplug);
        }
        return retval;
 }
 
 static void cleanup_slot(struct controller *ctrl)
 {
-       struct hotplug_slot *hotplug_slot = ctrl->hotplug_slot;
+       struct hotplug_slot *hotplug_slot = &ctrl->hotplug_slot;
 
        pci_hp_destroy(hotplug_slot);
        kfree(hotplug_slot->ops);
-       kfree(hotplug_slot);
 }
 
 /*
  */
 static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl->pcie->port;
 
        pci_config_pm_runtime_get(pdev);
 
 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl->pcie->port;
 
        pci_config_pm_runtime_get(pdev);
 
 static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl->pcie->port;
 
        pci_config_pm_runtime_get(pdev);
 
 static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl->pcie->port;
 
        pci_config_pm_runtime_get(pdev);
        }
 
        /* Publish to user space */
-       rc = pci_hp_add(ctrl->hotplug_slot);
+       rc = pci_hp_add(&ctrl->hotplug_slot);
        if (rc) {
                ctrl_err(ctrl, "Publication to user space failed (%d)\n", rc);
                goto err_out_shutdown_notification;
 {
        struct controller *ctrl = get_service_data(dev);
 
-       pci_hp_del(ctrl->hotplug_slot);
+       pci_hp_del(&ctrl->hotplug_slot);
        pcie_shutdown_notification(ctrl);
        cleanup_slot(ctrl);
        pciehp_release_ctrl(ctrl);
 
 
 int pciehp_sysfs_enable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
 
        mutex_lock(&ctrl->state_lock);
        switch (ctrl->state) {
 
 int pciehp_sysfs_disable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
 
        mutex_lock(&ctrl->state_lock);
        switch (ctrl->state) {
 
 int pciehp_get_raw_indicator_status(struct hotplug_slot *hotplug_slot,
                                    u8 *status)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl_dev(ctrl);
        u16 slot_ctrl;
 
 
 int pciehp_get_attention_status(struct hotplug_slot *hotplug_slot, u8 *status)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl_dev(ctrl);
        u16 slot_ctrl;
 
 int pciehp_set_raw_indicator_status(struct hotplug_slot *hotplug_slot,
                                    u8 status)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl_dev(ctrl);
 
        pci_config_pm_runtime_get(pdev);
  */
 int pciehp_reset_slot(struct hotplug_slot *hotplug_slot, int probe)
 {
-       struct controller *ctrl = hotplug_slot->private;
+       struct controller *ctrl = to_ctrl(hotplug_slot);
        struct pci_dev *pdev = ctrl_dev(ctrl);
        u16 stat_mask = 0, ctrl_mask = 0;
        int rc;
 
 int pnv_php_set_slot_power_state(struct hotplug_slot *slot,
                                 uint8_t state)
 {
-       struct pnv_php_slot *php_slot = slot->private;
+       struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
        struct opal_msg msg;
        int ret;
 
 
 static int pnv_php_get_power_state(struct hotplug_slot *slot, u8 *state)
 {
-       struct pnv_php_slot *php_slot = slot->private;
+       struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
        uint8_t power_state = OPAL_PCI_SLOT_POWER_ON;
        int ret;
 
 
 static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)
 {
-       struct pnv_php_slot *php_slot = slot->private;
+       struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
        uint8_t presence = OPAL_PCI_SLOT_EMPTY;
        int ret;
 
 
 static int pnv_php_disable_slot(struct hotplug_slot *slot)
 {
-       struct pnv_php_slot *php_slot = slot->private;
+       struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
        int ret;
 
        if (php_slot->state != PNV_PHP_STATE_POPULATED)
        php_slot->id                    = id;
        php_slot->power_state_check     = false;
        php_slot->slot.ops              = &php_slot_ops;
-       php_slot->slot.private          = php_slot;
 
        INIT_LIST_HEAD(&php_slot->children);
        INIT_LIST_HEAD(&php_slot->link);
 
        struct device_node *dn;
        struct pci_bus *bus;
        struct list_head *pci_devs;
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
 };
 
 extern const struct hotplug_slot_ops rpaphp_hotplug_slot_ops;
 extern struct list_head rpaphp_slot_head;
 
+static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
+}
+
 /* function prototypes */
 
 /* rpaphp_pci.c */
 
 static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 value)
 {
        int rc;
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        switch (value) {
        case 0:
 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
        int retval, level;
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        retval = rtas_get_power_level(slot->power_domain, &level);
        if (!retval)
  */
 static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        *value = slot->attention_status;
        return 0;
 }
 
 static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        int rc, state;
 
        rc = rpaphp_get_sensor_state(slot, &state);
        list_for_each_entry_safe(slot, next, &rpaphp_slot_head,
                                 rpaphp_slot_list) {
                list_del(&slot->rpaphp_slot_list);
-               pci_hp_deregister(slot->hotplug_slot);
+               pci_hp_deregister(&slot->hotplug_slot);
                dealloc_slot_struct(slot);
        }
        return;
 
 static int enable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        int state;
        int retval;
 
 
 static int disable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = (struct slot *)hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        if (slot->state == NOT_CONFIGURED)
                return -EINVAL;
 
 
 void dealloc_slot_struct(struct slot *slot)
 {
        kfree(slot->name);
-       kfree(slot->hotplug_slot);
        kfree(slot);
 }
 
        slot = kzalloc(sizeof(struct slot), GFP_KERNEL);
        if (!slot)
                goto error_nomem;
-       slot->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
-       if (!slot->hotplug_slot)
-               goto error_slot;
        slot->name = kstrdup(drc_name, GFP_KERNEL);
        if (!slot->name)
-               goto error_hpslot;
+               goto error_slot;
        slot->dn = dn;
        slot->index = drc_index;
        slot->power_domain = power_domain;
-       slot->hotplug_slot->private = slot;
-       slot->hotplug_slot->ops = &rpaphp_hotplug_slot_ops;
+       slot->hotplug_slot.ops = &rpaphp_hotplug_slot_ops;
 
        return (slot);
 
-error_hpslot:
-       kfree(slot->hotplug_slot);
 error_slot:
        kfree(slot);
 error_nomem:
 int rpaphp_deregister_slot(struct slot *slot)
 {
        int retval = 0;
-       struct hotplug_slot *php_slot = slot->hotplug_slot;
+       struct hotplug_slot *php_slot = &slot->hotplug_slot;
 
         dbg("%s - Entry: deregistering slot=%s\n",
                __func__, slot->name);
 
 int rpaphp_register_slot(struct slot *slot)
 {
-       struct hotplug_slot *php_slot = slot->hotplug_slot;
+       struct hotplug_slot *php_slot = &slot->hotplug_slot;
        struct device_node *child;
        u32 my_index;
        int retval;
 
  */
 struct slot {
        struct list_head slot_list;
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct zpci_dev *zdev;
 };
 
+static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
+{
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
+}
+
 static inline int slot_configure(struct slot *slot)
 {
        int ret = sclp_pci_configure(slot->zdev->fid);
 
 static int enable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        int rc;
 
        if (slot->zdev->state != ZPCI_FN_STATE_STANDBY)
 
 static int disable_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
        struct pci_dev *pdev;
        int rc;
 
 
 static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
 {
-       struct slot *slot = hotplug_slot->private;
+       struct slot *slot = to_slot(hotplug_slot);
 
        switch (slot->zdev->state) {
        case ZPCI_FN_STATE_STANDBY:
 
 int zpci_init_slot(struct zpci_dev *zdev)
 {
-       struct hotplug_slot *hotplug_slot;
        char name[SLOT_NAME_SIZE];
        struct slot *slot;
        int rc;
        if (!slot)
                goto error;
 
-       hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL);
-       if (!hotplug_slot)
-               goto error_hp;
-       hotplug_slot->private = slot;
-
-       slot->hotplug_slot = hotplug_slot;
        slot->zdev = zdev;
-
-       hotplug_slot->ops = &s390_hotplug_slot_ops;
+       slot->hotplug_slot.ops = &s390_hotplug_slot_ops;
 
        snprintf(name, SLOT_NAME_SIZE, "%08x", zdev->fid);
-       rc = pci_hp_register(slot->hotplug_slot, zdev->bus,
+       rc = pci_hp_register(&slot->hotplug_slot, zdev->bus,
                             ZPCI_DEVFN, name);
        if (rc)
                goto error_reg;
        return 0;
 
 error_reg:
-       kfree(hotplug_slot);
-error_hp:
        kfree(slot);
 error:
        return -ENOMEM;
                if (slot->zdev != zdev)
                        continue;
                list_del(&slot->slot_list);
-               pci_hp_deregister(slot->hotplug_slot);
-               kfree(slot->hotplug_slot);
+               pci_hp_deregister(&slot->hotplug_slot);
                kfree(slot);
        }
 }
 
        int device_num;
        struct pci_bus *pci_bus;
        /* this struct for glue internal only */
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct list_head hp_list;
        char physical_path[SN_SLOT_NAME_SIZE];
 };
 
 static DEFINE_MUTEX(sn_hotplug_mutex);
 
+static struct slot *to_slot(struct hotplug_slot *bss_hotplug_slot)
+{
+       return container_of(bss_hotplug_slot, struct slot, hotplug_slot);
+}
+
 static ssize_t path_show(struct pci_slot *pci_slot, char *buf)
 {
        int retval = -ENOENT;
-       struct slot *slot = pci_slot->hotplug->private;
+       struct slot *slot = to_slot(pci_slot->hotplug);
 
        if (!slot)
                return retval;
        return -EIO;
 }
 
-static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot,
+static int sn_hp_slot_private_alloc(struct hotplug_slot **bss_hotplug_slot,
                                    struct pci_bus *pci_bus, int device,
                                    char *name)
 {
        slot = kzalloc(sizeof(*slot), GFP_KERNEL);
        if (!slot)
                return -ENOMEM;
-       bss_hotplug_slot->private = slot;
 
        slot->device_num = device;
        slot->pci_bus = pci_bus;
 
        sn_generate_path(pci_bus, slot->physical_path);
 
-       slot->hotplug_slot = bss_hotplug_slot;
        list_add(&slot->hp_list, &sn_hp_list);
+       *bss_hotplug_slot = &slot->hotplug_slot;
 
        return 0;
 }
        struct hotplug_slot *bss_hotplug_slot = NULL;
 
        list_for_each_entry(slot, &sn_hp_list, hp_list) {
-               bss_hotplug_slot = slot->hotplug_slot;
+               bss_hotplug_slot = &slot->hotplug_slot;
                pci_slot = bss_hotplug_slot->pci_slot;
-               list_del(&((struct slot *)bss_hotplug_slot->private)->
-                        hp_list);
+               list_del(&slot->hp_list);
                sysfs_remove_file(&pci_slot->kobj,
                                  &sn_slot_path_attr.attr);
                break;
 static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot,
                          int device_num, char **ssdt)
 {
-       struct slot *slot = bss_hotplug_slot->private;
+       struct slot *slot = to_slot(bss_hotplug_slot);
        struct pcibus_info *pcibus_info;
        struct pcibr_slot_enable_resp resp;
        int rc;
 static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot,
                           int device_num, int action)
 {
-       struct slot *slot = bss_hotplug_slot->private;
+       struct slot *slot = to_slot(bss_hotplug_slot);
        struct pcibus_info *pcibus_info;
        struct pcibr_slot_disable_resp resp;
        int rc;
  */
 static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
 {
-       struct slot *slot = bss_hotplug_slot->private;
+       struct slot *slot = to_slot(bss_hotplug_slot);
        struct pci_bus *new_bus = NULL;
        struct pci_dev *dev;
        int num_funcs;
 
 static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
 {
-       struct slot *slot = bss_hotplug_slot->private;
+       struct slot *slot = to_slot(bss_hotplug_slot);
        struct pci_dev *dev, *temp;
        int rc;
        acpi_handle ssdt_hdl = NULL;
 static inline int get_power_status(struct hotplug_slot *bss_hotplug_slot,
                                   u8 *value)
 {
-       struct slot *slot = bss_hotplug_slot->private;
+       struct slot *slot = to_slot(bss_hotplug_slot);
        struct pcibus_info *pcibus_info;
        u32 power;
 
 
 static void sn_release_slot(struct hotplug_slot *bss_hotplug_slot)
 {
-       kfree(bss_hotplug_slot->private);
-       kfree(bss_hotplug_slot);
+       kfree(to_slot(bss_hotplug_slot));
 }
 
 static int sn_hotplug_slot_register(struct pci_bus *pci_bus)
                if (sn_pci_slot_valid(pci_bus, device) != 1)
                        continue;
 
-               bss_hotplug_slot = kzalloc(sizeof(*bss_hotplug_slot),
-                                          GFP_KERNEL);
-               if (!bss_hotplug_slot) {
-                       rc = -ENOMEM;
-                       goto alloc_err;
-               }
-
-               if (sn_hp_slot_private_alloc(bss_hotplug_slot,
+               if (sn_hp_slot_private_alloc(&bss_hotplug_slot,
                                             pci_bus, device, name)) {
                        rc = -ENOMEM;
                        goto alloc_err;
                rc = sysfs_create_file(&pci_slot->kobj,
                                       &sn_slot_path_attr.attr);
                if (rc)
-                       goto register_err;
+                       goto alloc_err;
        }
        pci_dbg(pci_bus->self, "Registered bus with hotplug\n");
        return rc;
        pci_dbg(pci_bus->self, "bus failed to register with err = %d\n",
                rc);
 
-alloc_err:
-       if (rc == -ENOMEM)
-               pci_dbg(pci_bus->self, "Memory allocation error\n");
-
        /* destroy THIS element */
-       if (bss_hotplug_slot)
-               sn_release_slot(bss_hotplug_slot);
+       sn_hp_destroy();
+       sn_release_slot(bss_hotplug_slot);
 
+alloc_err:
        /* destroy anything else on the list */
        while ((bss_hotplug_slot = sn_hp_destroy())) {
                pci_hp_deregister(bss_hotplug_slot);
 
        u8 pwr_save;
        struct controller *ctrl;
        const struct hpc_ops *hpc_ops;
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct list_head        slot_list;
        struct delayed_work work;       /* work for button event */
        struct mutex lock;
 
 static inline const char *slot_name(struct slot *slot)
 {
-       return hotplug_slot_name(slot->hotplug_slot);
+       return hotplug_slot_name(&slot->hotplug_slot);
 }
 
 struct ctrl_reg {
 
 static inline struct slot *get_slot(struct hotplug_slot *hotplug_slot)
 {
-       return hotplug_slot->private;
+       return container_of(hotplug_slot, struct slot, hotplug_slot);
 }
 
 static inline struct slot *shpchp_find_slot(struct controller *ctrl, u8 device)
 
                        goto error;
                }
 
-               hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL);
-               if (!hotplug_slot) {
-                       retval = -ENOMEM;
-                       goto error_slot;
-               }
-               slot->hotplug_slot = hotplug_slot;
+               hotplug_slot = &slot->hotplug_slot;
 
                slot->hp_slot = i;
                slot->ctrl = ctrl;
                slot->wq = alloc_workqueue("shpchp-%d", 0, 0, slot->number);
                if (!slot->wq) {
                        retval = -ENOMEM;
-                       goto error_hpslot;
+                       goto error_slot;
                }
 
                mutex_init(&slot->lock);
                INIT_DELAYED_WORK(&slot->work, shpchp_queue_pushbutton_work);
 
                /* register this slot with the hotplug pci core */
-               hotplug_slot->private = slot;
                snprintf(name, SLOT_NAME_SIZE, "%d", slot->number);
                hotplug_slot->ops = &shpchp_hotplug_slot_ops;
 
                         pci_domain_nr(ctrl->pci_dev->subordinate),
                         slot->bus, slot->device, slot->hp_slot, slot->number,
                         ctrl->slot_device_offset);
-               retval = pci_hp_register(slot->hotplug_slot,
+               retval = pci_hp_register(hotplug_slot,
                                ctrl->pci_dev->subordinate, slot->device, name);
                if (retval) {
                        ctrl_err(ctrl, "pci_hp_register failed with error %d\n",
        return 0;
 error_slotwq:
        destroy_workqueue(slot->wq);
-error_hpslot:
-       kfree(hotplug_slot);
 error_slot:
        kfree(slot);
 error:
                list_del(&slot->slot_list);
                cancel_delayed_work(&slot->work);
                destroy_workqueue(slot->wq);
-               pci_hp_deregister(slot->hotplug_slot);
-               kfree(slot->hotplug_slot);
+               pci_hp_deregister(&slot->hotplug_slot);
                kfree(slot);
        }
 }
 
        int asus_hwmon_num_fans;
        int asus_hwmon_pwm;
 
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct mutex hotplug_lock;
        struct mutex wmi_lock;
        struct workqueue_struct *hotplug_workqueue;
        if (asus->wlan.rfkill)
                rfkill_set_sw_state(asus->wlan.rfkill, blocked);
 
-       if (asus->hotplug_slot) {
+       if (asus->hotplug_slot.ops) {
                bus = pci_find_bus(0, 1);
                if (!bus) {
                        pr_warn("Unable to find PCI bus 1?\n");
 static int asus_get_adapter_status(struct hotplug_slot *hotplug_slot,
                                   u8 *value)
 {
-       struct asus_wmi *asus = hotplug_slot->private;
+       struct asus_wmi *asus = container_of(hotplug_slot,
+                                            struct asus_wmi, hotplug_slot);
        int result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WLAN);
 
        if (result < 0)
 
        INIT_WORK(&asus->hotplug_work, asus_hotplug_work);
 
-       asus->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
-       if (!asus->hotplug_slot)
-               goto error_slot;
+       asus->hotplug_slot.ops = &asus_hotplug_slot_ops;
 
-       asus->hotplug_slot->private = asus;
-       asus->hotplug_slot->ops = &asus_hotplug_slot_ops;
-
-       ret = pci_hp_register(asus->hotplug_slot, bus, 0, "asus-wifi");
+       ret = pci_hp_register(&asus->hotplug_slot, bus, 0, "asus-wifi");
        if (ret) {
                pr_err("Unable to register hotplug slot - %d\n", ret);
                goto error_register;
        return 0;
 
 error_register:
-       kfree(asus->hotplug_slot);
-       asus->hotplug_slot = NULL;
-error_slot:
+       asus->hotplug_slot.ops = NULL;
        destroy_workqueue(asus->hotplug_workqueue);
 error_workqueue:
        return ret;
         * asus_unregister_rfkill_notifier()
         */
        asus_rfkill_hotplug(asus);
-       if (asus->hotplug_slot) {
-               pci_hp_deregister(asus->hotplug_slot);
-               kfree(asus->hotplug_slot);
-       }
+       if (asus->hotplug_slot.ops)
+               pci_hp_deregister(&asus->hotplug_slot);
        if (asus->hotplug_workqueue)
                destroy_workqueue(asus->hotplug_workqueue);
 
 
        struct rfkill *wwan3g_rfkill;
        struct rfkill *wimax_rfkill;
 
-       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot hotplug_slot;
        struct mutex hotplug_lock;
 
        struct led_classdev tpd_led;
        mutex_lock(&eeepc->hotplug_lock);
        pci_lock_rescan_remove();
 
-       if (!eeepc->hotplug_slot)
+       if (!eeepc->hotplug_slot.ops)
                goto out_unlock;
 
        port = acpi_get_pci_dev(handle);
 static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
                                    u8 *value)
 {
-       struct eeepc_laptop *eeepc = hotplug_slot->private;
-       int val = get_acpi(eeepc, CM_ASL_WLAN);
+       struct eeepc_laptop *eeepc;
+       int val;
+
+       eeepc = container_of(hotplug_slot, struct eeepc_laptop, hotplug_slot);
+       val = get_acpi(eeepc, CM_ASL_WLAN);
 
        if (val == 1 || val == 0)
                *value = val;
                return -ENODEV;
        }
 
-       eeepc->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
-       if (!eeepc->hotplug_slot)
-               goto error_slot;
+       eeepc->hotplug_slot.ops = &eeepc_hotplug_slot_ops;
 
-       eeepc->hotplug_slot->private = eeepc;
-       eeepc->hotplug_slot->ops = &eeepc_hotplug_slot_ops;
-
-       ret = pci_hp_register(eeepc->hotplug_slot, bus, 0, "eeepc-wifi");
+       ret = pci_hp_register(&eeepc->hotplug_slot, bus, 0, "eeepc-wifi");
        if (ret) {
                pr_err("Unable to register hotplug slot - %d\n", ret);
                goto error_register;
        return 0;
 
 error_register:
-       kfree(eeepc->hotplug_slot);
-       eeepc->hotplug_slot = NULL;
-error_slot:
+       eeepc->hotplug_slot.ops = NULL;
        return ret;
 }
 
                eeepc->wlan_rfkill = NULL;
        }
 
-       if (eeepc->hotplug_slot) {
-               pci_hp_deregister(eeepc->hotplug_slot);
-               kfree(eeepc->hotplug_slot);
-       }
+       if (eeepc->hotplug_slot.ops)
+               pci_hp_deregister(&eeepc->hotplug_slot);
 
        if (eeepc->bluetooth_rfkill) {
                rfkill_unregister(eeepc->bluetooth_rfkill);
 
 /**
  * struct hotplug_slot - used to register a physical slot with the hotplug pci core
  * @ops: pointer to the &struct hotplug_slot_ops to be used for this slot
- * @private: used by the hotplug pci controller driver to store whatever it
- * needs.
  * @owner: The module owner of this structure
  * @mod_name: The module name (KBUILD_MODNAME) of this structure
  */
 struct hotplug_slot {
        const struct hotplug_slot_ops   *ops;
-       void                            *private;
 
        /* Variables below this are for use only by the hotplug pci core. */
        struct list_head                slot_list;