/* pci setup */
        if (pci_enable_device(pdev) < 0) {
+               kfree(dev);
+               dev = 0;
                retval = -ENODEV;
                goto finished;
        }
 
        if (!request_mem_region(resource, len, name)) {
                dev_dbg(&pdev->dev, "pci device used already\n");
+               kfree(dev);
+               dev = 0;
                retval = -EBUSY;
                goto finished;
        }
        dev->virt_addr = ioremap_nocache(resource, len);
        if (dev->virt_addr == NULL) {
                dev_dbg(&pdev->dev, "start address cannot be mapped\n");
+               kfree(dev);
+               dev = 0;
                retval = -EFAULT;
                goto finished;
        }
 
        if (!pdev->irq) {
                dev_err(&dev->pdev->dev, "irq not set\n");
+               kfree(dev);
+               dev = 0;
                retval = -ENODEV;
                goto finished;
        }
 
        if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) {
                dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq);
+               kfree(dev);
+               dev = 0;
                retval = -EBUSY;
                goto finished;
        }