unsigned long phys_base;
        int gpio_irq;
        struct mtd_info mtd;
-       struct mtd_partition *parts;
        struct onenand_chip onenand;
        struct completion irq_done;
        struct completion dma_done;
        if ((r = onenand_scan(&c->mtd, 1)) < 0)
                goto err_release_regulator;
 
-       r = parse_mtd_partitions(&c->mtd, NULL, &c->parts, 0);
-       if (r > 0)
-               r = mtd_device_register(&c->mtd, c->parts, r);
-       else if (pdata->parts != NULL)
-               r = mtd_device_register(&c->mtd, pdata->parts, pdata->nr_parts);
-       else
-               r = mtd_device_register(&c->mtd, NULL, 0);
+       r = mtd_device_parse_register(&c->mtd, NULL, 0,
+                       pdata ? pdata->parts : NULL,
+                       pdata ? pdata->nr_parts : 0);
        if (r)
                goto err_release_onenand;
 
 err_free_cs:
        gpmc_cs_free(c->gpmc_cs);
 err_kfree:
-       kfree(c->parts);
        kfree(c);
 
        return r;
        iounmap(c->onenand.base);
        release_mem_region(c->phys_base, ONENAND_IO_SIZE);
        gpmc_cs_free(c->gpmc_cs);
-       kfree(c->parts);
        kfree(c);
 
        return 0;