1/* Handle mapping of the flash on the ASB2303 board
2 *
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */
11#include <linux/init.h>
12#include <linux/platform_device.h>
13#include <linux/mtd/partitions.h>
14#include <linux/mtd/physmap.h>
15
16#define ASB2303_PROM_ADDR	0xA0000000	/* Boot PROM */
17#define ASB2303_PROM_SIZE	(2 * 1024 * 1024)
18#define ASB2303_FLASH_ADDR	0xA4000000	/* System Flash */
19#define ASB2303_FLASH_SIZE	(32 * 1024 * 1024)
20#define ASB2303_CONFIG_ADDR	0xA6000000	/* System Config EEPROM */
21#define ASB2303_CONFIG_SIZE	(8 * 1024)
22
23/*
24 * default MTD partition table for both main flash devices, expected to be
25 * overridden by RedBoot
26 */
27static struct mtd_partition asb2303_partitions[] = {
28	{
29		.name		= "Bootloader",
30		.size		= 0x00040000,
31		.offset		= 0,
32		.mask_flags	= MTD_CAP_ROM /* force read-only */
33	}, {
34		.name		= "Kernel",
35		.size		= 0x00400000,
36		.offset		= 0x00040000,
37	}, {
38		.name		= "Filesystem",
39		.size		= MTDPART_SIZ_FULL,
40		.offset		= 0x00440000
41	}
42};
43
44/*
45 * the ASB2303 Boot PROM definition
46 */
47static struct physmap_flash_data asb2303_bootprom_data = {
48	.width		= 2,
49	.nr_parts	= 1,
50	.parts		= asb2303_partitions,
51};
52
53static struct resource asb2303_bootprom_resource = {
54	.start		= ASB2303_PROM_ADDR,
55	.end		= ASB2303_PROM_ADDR + ASB2303_PROM_SIZE,
56	.flags		= IORESOURCE_MEM,
57};
58
59static struct platform_device asb2303_bootprom = {
60	.name		= "physmap-flash",
61	.id		= 0,
62	.dev.platform_data = &asb2303_bootprom_data,
63	.num_resources	= 1,
64	.resource	= &asb2303_bootprom_resource,
65};
66
67/*
68 * the ASB2303 System Flash definition
69 */
70static struct physmap_flash_data asb2303_sysflash_data = {
71	.width		= 4,
72	.nr_parts	= 1,
73	.parts		= asb2303_partitions,
74};
75
76static struct resource asb2303_sysflash_resource = {
77	.start		= ASB2303_FLASH_ADDR,
78	.end		= ASB2303_FLASH_ADDR + ASB2303_FLASH_SIZE,
79	.flags		= IORESOURCE_MEM,
80};
81
82static struct platform_device asb2303_sysflash = {
83	.name		= "physmap-flash",
84	.id		= 1,
85	.dev.platform_data = &asb2303_sysflash_data,
86	.num_resources	= 1,
87	.resource	= &asb2303_sysflash_resource,
88};
89
90/*
91 * register the ASB2303 flashes
92 */
93static int __init asb2303_mtd_init(void)
94{
95	platform_device_register(&asb2303_bootprom);
96	platform_device_register(&asb2303_sysflash);
97	return 0;
98}
99
100module_init(asb2303_mtd_init);
101