| unsik Kim | 3fbed4c | 2009-04-02 12:50:58 -0700 | [diff] [blame] | 1 | This document describes m[g]flash support in linux. | 
 | 2 |  | 
 | 3 | Contents | 
 | 4 |   1. Overview | 
 | 5 |   2. Reserved area configuration | 
 | 6 |   3. Example of mflash platform driver registration | 
 | 7 |  | 
 | 8 | 1. Overview | 
 | 9 |  | 
 | 10 | Mflash and gflash are embedded flash drive. The only difference is mflash is | 
 | 11 | MCP(Multi Chip Package) device. These two device operate exactly same way. | 
 | 12 | So the rest mflash repersents mflash and gflash altogether. | 
 | 13 |  | 
 | 14 | Internally, mflash has nand flash and other hardware logics and supports | 
 | 15 | 2 different operation (ATA, IO) modes. ATA mode doesn't need any new | 
 | 16 | driver and currently works well under standard IDE subsystem. Actually it's | 
 | 17 | one chip SSD. IO mode is ATA-like custom mode for the host that doesn't have | 
 | 18 | IDE interface. | 
 | 19 |  | 
 | 20 | Followings are brief descriptions about IO mode. | 
 | 21 | A. IO mode based on ATA protocol and uses some custom command. (read confirm, | 
 | 22 | write confirm) | 
 | 23 | B. IO mode uses SRAM bus interface. | 
 | 24 | C. IO mode supports 4kB boot area, so host can boot from mflash. | 
 | 25 |  | 
 | 26 | 2. Reserved area configuration | 
 | 27 | If host boot from mflash, usually needs raw area for boot loader image. All of | 
 | 28 | the mflash's block device operation will be taken this value as start offset. | 
 | 29 | Note that boot loader's size of reserved area and kernel configuration value | 
 | 30 | must be same. | 
 | 31 |  | 
 | 32 | 3. Example of mflash platform driver registration | 
 | 33 | Working mflash is very straight forward. Adding platform device stuff to board | 
 | 34 | configuration file is all. Here is some pseudo example. | 
 | 35 |  | 
 | 36 | static struct mg_drv_data mflash_drv_data = { | 
 | 37 | 	/* If you want to polling driver set to 1 */ | 
 | 38 | 	.use_polling = 0, | 
 | 39 | 	/* device attribution */ | 
 | 40 | 	.dev_attr = MG_BOOT_DEV | 
 | 41 | }; | 
 | 42 |  | 
 | 43 | static struct resource mg_mflash_rsc[] = { | 
 | 44 | 	/* Base address of mflash */ | 
 | 45 | 	[0] = { | 
 | 46 | 		.start = 0x08000000, | 
 | 47 | 		.end = 0x08000000 + SZ_64K - 1, | 
 | 48 | 		.flags = IORESOURCE_MEM | 
 | 49 | 	}, | 
 | 50 | 	/* mflash interrupt pin */ | 
 | 51 | 	[1] = { | 
 | 52 | 		.start = IRQ_GPIO(84), | 
 | 53 | 		.end = IRQ_GPIO(84), | 
 | 54 | 		.flags = IORESOURCE_IRQ | 
 | 55 | 	}, | 
 | 56 | 	/* mflash reset pin */ | 
 | 57 | 	[2] = { | 
 | 58 | 		.start = 43, | 
 | 59 | 		.end = 43, | 
 | 60 | 		.name = MG_RST_PIN, | 
 | 61 | 		.flags = IORESOURCE_IO | 
 | 62 | 	}, | 
 | 63 | 	/* mflash reset-out pin | 
 | 64 | 	 * If you use mflash as storage device (i.e. other than MG_BOOT_DEV), | 
 | 65 | 	 * should assign this */ | 
 | 66 | 	[3] = { | 
 | 67 | 		.start = 51, | 
 | 68 | 		.end = 51, | 
 | 69 | 		.name = MG_RSTOUT_PIN, | 
 | 70 | 		.flags = IORESOURCE_IO | 
 | 71 | 	} | 
 | 72 | }; | 
 | 73 |  | 
 | 74 | static struct platform_device mflash_dev = { | 
 | 75 | 	.name = MG_DEV_NAME, | 
 | 76 | 	.id = -1, | 
 | 77 | 	.dev = { | 
 | 78 | 		.platform_data = &mflash_drv_data, | 
 | 79 | 	}, | 
 | 80 | 	.num_resources = ARRAY_SIZE(mg_mflash_rsc), | 
 | 81 | 	.resource = mg_mflash_rsc | 
 | 82 | }; | 
 | 83 |  | 
 | 84 | platform_device_register(&mflash_dev); |