[-mm patch 3/4] AVR32 MTD: Mapping driver for the ATSTK1000 board

Haavard Skinnemoen hskinnemoen at atmel.com
Thu Sep 14 10:32:59 EDT 2006


Add mapping driver for the AT49BV6416 NOR flash chip on the ATSTK1000
development board.

Signed-off-by: Haavard Skinnemoen <hskinnemoen at atmel.com>
---
 drivers/mtd/maps/Kconfig     |   10 ++
 drivers/mtd/maps/Makefile    |    1 
 drivers/mtd/maps/atstk1000.c |  179 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 190 insertions(+)

Index: linux-2.6.18-rc5-mm1/drivers/mtd/maps/Kconfig
===================================================================
--- linux-2.6.18-rc5-mm1.orig/drivers/mtd/maps/Kconfig	2006-09-07 15:56:47.000000000 +0200
+++ linux-2.6.18-rc5-mm1/drivers/mtd/maps/Kconfig	2006-09-07 16:18:47.000000000 +0200
@@ -630,5 +630,15 @@ config MTD_PLATRAM
 
 	  This selection automatically selects the map_ram driver.
 
+config MTD_ATSTK1000
+	tristate "Map driver for NOR flash on Atmel ATSTK1000"
+	depends on MTD && AVR32 && BOARD_ATSTK1000
+	select MTD_CFI
+	select MTD_CFI_AMDSTD
+	select MTD_PARTITIONS
+	help
+	  Map driver for NOR flash on the Atmel ATSTK1000 development
+	  board.
+
 endmenu
 
Index: linux-2.6.18-rc5-mm1/drivers/mtd/maps/Makefile
===================================================================
--- linux-2.6.18-rc5-mm1.orig/drivers/mtd/maps/Makefile	2006-09-07 15:56:47.000000000 +0200
+++ linux-2.6.18-rc5-mm1/drivers/mtd/maps/Makefile	2006-09-07 16:16:03.000000000 +0200
@@ -71,3 +71,4 @@ obj-$(CONFIG_MTD_PLATRAM)	+= plat-ram.o
 obj-$(CONFIG_MTD_OMAP_NOR)	+= omap_nor.o
 obj-$(CONFIG_MTD_MTX1)		+= mtx-1_flash.o
 obj-$(CONFIG_MTD_TQM834x)	+= tqm834x.o
+obj-$(CONFIG_MTD_ATSTK1000)	+= atstk1000.o
Index: linux-2.6.18-rc5-mm1/drivers/mtd/maps/atstk1000.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.18-rc5-mm1/drivers/mtd/maps/atstk1000.c	2006-09-07 16:16:03.000000000 +0200
@@ -0,0 +1,179 @@
+/*
+ * Flash memory support for the ATSTK1000 development board
+ *
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+#include <asm/io.h>
+#include <asm/arch/board.h>
+#include <asm/arch/smc.h>
+
+static struct smc_config flash_config = {
+	.ncs_read_setup		= 0,
+	.nrd_setup		= 40,
+	.ncs_write_setup	= 0,
+	.nwe_setup		= 10,
+
+	.ncs_read_pulse		= 80,
+	.nrd_pulse		= 40,
+	.ncs_write_pulse	= 65,
+	.nwe_pulse		= 55,
+
+	.read_cycle		= 120,
+	.write_cycle		= 120,
+
+	.bus_width		= 2,
+	.nrd_controlled		= 1,
+	.nwe_controlled		= 1,
+	.byte_write		= 1,
+};
+
+struct atstk1000_flash {
+	struct mtd_info		*mtd;
+	struct map_info		map;
+	unsigned int		nr_parts;
+	struct mtd_partition	*parts;
+};
+
+static const char *part_probes[] = { "cmdlinepart", NULL };
+
+static int __devinit atstk1000_flash_probe(struct platform_device *pdev)
+{
+	struct flash_platform_data *plat = pdev->dev.platform_data;
+	struct atstk1000_flash *flash;
+	struct resource *mem;
+	struct mtd_partition *parts;
+	unsigned long size;
+	int nr_parts;
+	int ret;
+
+	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!mem)
+		return -ENXIO;
+
+	flash = kzalloc(sizeof(struct atstk1000_flash), GFP_KERNEL);
+	if (!flash)
+		return -ENOMEM;
+
+	size = mem->end - mem->start + 1;
+
+	ret = smc_set_configuration(0, &flash_config);
+	if (ret < 0)
+		goto out_free_flash;
+
+	ret = -ENOMEM;
+	flash->map.virt = ioremap(mem->start, size);
+	if (!flash->map.virt)
+		goto out_free_flash;
+	flash->map.name = pdev->dev.bus_id;
+	flash->map.phys = mem->start;
+	flash->map.size = size;
+	flash->map.bankwidth = 2;
+
+	simple_map_init(&flash->map);
+
+	ret = -ENXIO;
+	flash->mtd = do_map_probe("cfi_probe", &flash->map);
+	if (!flash->mtd)
+		goto out_unmap_mem;
+	flash->mtd->owner = THIS_MODULE;
+
+	if (flash->mtd->unlock) {
+		printk("ATSTK1000 flash: unlocking area 0x%08lx-0x%08lx\n",
+		       (unsigned long)mem->start, (unsigned long)mem->end);
+		ret = flash->mtd->unlock(flash->mtd, mem->start, size);
+		if (ret < 0)
+			goto out_destroy_map;
+	}
+
+	nr_parts = parse_mtd_partitions(flash->mtd, part_probes, &parts, 0);
+	if (nr_parts > 0) {
+		flash->parts = parts;
+	} else if (plat) {
+		parts = plat->parts;
+		nr_parts = plat->nr_parts;
+	}
+	if (nr_parts <= 0) {
+		printk(KERN_NOTICE "ATSTK1000 flash: no partition info "
+		       "available, registering whole flash\n");
+		add_mtd_device(flash->mtd);
+	} else {
+		ret = add_mtd_partitions(flash->mtd, parts, nr_parts);
+		if (ret < 0)
+			goto out_free_parts;
+	}
+
+	flash->nr_parts = nr_parts;
+
+	platform_set_drvdata(pdev, flash);
+	return 0;
+
+out_free_parts:
+	kfree(flash->parts);
+out_destroy_map:
+	map_destroy(flash->mtd);
+out_unmap_mem:
+	iounmap(flash->map.virt);
+out_free_flash:
+	kfree(flash);
+	return ret;
+}
+
+static int __devexit atstk1000_flash_remove(struct platform_device *pdev)
+{
+	struct atstk1000_flash *flash = platform_get_drvdata(pdev);
+
+	if (flash->mtd) {
+		if (flash->nr_parts > 0)
+			del_mtd_partitions(flash->mtd);
+		else
+			del_mtd_device(flash->mtd);
+
+		kfree(flash->parts);
+
+		map_destroy(flash->mtd);
+		iounmap(flash->map.virt);
+		kfree(flash);
+	}
+
+	platform_set_drvdata(pdev, NULL);
+	return 0;
+}
+
+static struct platform_driver atstk1000_flash_driver = {
+	.probe	= atstk1000_flash_probe,
+	.remove	= __devexit_p(atstk1000_flash_remove),
+	.driver	= {
+		.name	= "atstk1000-flash",
+	},
+};
+
+static int __init atstk1000_flash_init(void)
+{
+	return platform_driver_register(&atstk1000_flash_driver);
+}
+
+static void __exit atstk1000_flash_exit(void)
+{
+	platform_driver_unregister(&atstk1000_flash_driver);
+}
+
+module_init(atstk1000_flash_init);
+module_exit(atstk1000_flash_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("MTD NOR map driver for the ATSTK1000 board");
+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen at atmel.com>");




More information about the linux-mtd mailing list