- if (nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1)
- && nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1)) {
- printk("RBxxx nand device not found\n");
- iounmap((void *) p_nand);
- return -ENXIO;
- }
+ platform_set_drvdata(pdev, data);
+
+ /* Why do we need to scan 4 times ? */
+ if (nand_scan(&data->mtd, 1) && nand_scan(&data->mtd, 1) && nand_scan(&data->mtd, 1) && nand_scan(&data->mtd, 1)) {
+ printk(KERN_INFO "RB500 nand device not found\n");
+ res = -ENXIO;
+ goto out;
+ }
+
+ printk(KERN_INFO "RB500 NAND\n");
+ add_mtd_partitions(&data->mtd, partition_info, 2);
+ data->init_ok = 1;
+
+ res = add_mtd_device(&data->mtd);
+ if (!res)
+ return res;
+
+ nand_release(&data->mtd);
+out:
+ platform_set_drvdata(pdev, NULL);
+ iounmap(data->io_base);
+ kfree(data);
+ return res;
+}
+
+static int __devexit rbmips_remove(struct platform_device *pdev)
+{
+ struct rb500_nand_info *data = platform_get_drvdata(pdev);
+
+ nand_release(&data->mtd);
+ iounmap(data->io_base);
+ kfree(data);