#include <linux/gfp.h>
 
 static DEFINE_IDA(cb710_ida);
-static DEFINE_SPINLOCK(cb710_ida_lock);
 
 void cb710_pci_update_config_reg(struct pci_dev *pdev,
        int reg, uint32_t mask, uint32_t xor)
        const struct pci_device_id *ent)
 {
        struct cb710_chip *chip;
-       unsigned long flags;
        u32 val;
        int err;
        int n = 0;
        if (err)
                return err;
 
-       do {
-               if (!ida_pre_get(&cb710_ida, GFP_KERNEL))
-                       return -ENOMEM;
-
-               spin_lock_irqsave(&cb710_ida_lock, flags);
-               err = ida_get_new(&cb710_ida, &chip->platform_id);
-               spin_unlock_irqrestore(&cb710_ida_lock, flags);
-
-               if (err && err != -EAGAIN)
-                       return err;
-       } while (err);
-
+       err = ida_alloc(&cb710_ida, GFP_KERNEL);
+       if (err < 0)
+               return err;
+       chip->platform_id = err;
 
        dev_info(&pdev->dev, "id %d, IO 0x%p, IRQ %d\n",
                chip->platform_id, chip->iobase, pdev->irq);
 static void cb710_remove_one(struct pci_dev *pdev)
 {
        struct cb710_chip *chip = pci_get_drvdata(pdev);
-       unsigned long flags;
 
        cb710_unregister_slot(chip, CB710_SLOT_SM);
        cb710_unregister_slot(chip, CB710_SLOT_MS);
        BUG_ON(atomic_read(&chip->slot_refs_count) != 0);
 #endif
 
-       spin_lock_irqsave(&cb710_ida_lock, flags);
-       ida_remove(&cb710_ida, chip->platform_id);
-       spin_unlock_irqrestore(&cb710_ida_lock, flags);
+       ida_free(&cb710_ida, chip->platform_id);
 }
 
 static const struct pci_device_id cb710_pci_tbl[] = {