]> Pileus Git - ~andy/linux/blobdiff - drivers/pcmcia/pxa2xx_base.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux...
[~andy/linux] / drivers / pcmcia / pxa2xx_base.c
index 3c01774eb3937d3b6df0ef9714de45347766b7d9..3755e7c8c715f5f9bebf60c5d9a7ff4a5e250f65 100644 (file)
@@ -285,8 +285,16 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
        struct clk *clk;
 
        ops = (struct pcmcia_low_level *)dev->dev.platform_data;
-       if (!ops)
-               return -ENODEV;
+       if (!ops) {
+               ret = -ENODEV;
+               goto err0;
+       }
+
+       if (cpu_is_pxa320() && ops->nr > 1) {
+               dev_err(&dev->dev, "pxa320 supports only one pcmcia slot");
+               ret = -EINVAL;
+               goto err0;
+       }
 
        clk = clk_get(&dev->dev, NULL);
        if (!clk)
@@ -316,7 +324,7 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
 
                ret = pxa2xx_drv_pcmcia_add_one(skt);
                if (ret)
-                       break;
+                       goto err1;
        }
 
        if (ret) {
@@ -329,6 +337,13 @@ static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
                dev_set_drvdata(&dev->dev, sinfo);
        }
 
+       return 0;
+
+err1:
+       while (--i >= 0)
+               soc_pcmcia_remove_one(&sinfo->skt[i]);
+       kfree(sinfo);
+err0:
        return ret;
 }