summaryrefslogtreecommitdiffstats
path: root/drivers/of/partition.c
blob: 6a57a6036e221fc3577a16468fde1673722ed318 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 * partition.c - devicetree partition parsing
 *
 * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
 *
 * based on Linux devicetree support
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */
#include <common.h>
#include <of.h>
#include <malloc.h>
#include <linux/mtd/mtd.h>

int of_parse_partitions(const char *cdevname,
				   struct device_node *node)
{
	struct device_node *n;
	const char *partname;
	char *filename;

	device_node_for_nach_child(node, n) {
		const __be32 *reg;
		unsigned long offset, size;
		const char *name;
		int len;
		unsigned long flags = 0;

		reg = of_get_property(n, "reg", &len);
		if (!reg)
			continue;

		offset = be32_to_cpu(reg[0]);
		size = be32_to_cpu(reg[1]);

		partname = of_get_property(n, "label", &len);
		if (!partname)
			partname = of_get_property(n, "name", &len);
		name = (char *)partname;

		debug("add partition: %s.%s 0x%08lx 0x%08lx\n", cdevname, partname, offset, size);

		if (of_get_property(n, "read-only", &len))
			flags = DEVFS_PARTITION_READONLY;

		filename = asprintf("%s.%s", cdevname, partname);

		devfs_add_partition(cdevname, offset, size, flags, filename);

		free(filename);
	}

	return 0;
}