xref: /linux/drivers/mtd/parsers/ofpart_linksys_ns.c (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl>
4  */
5 
6 #include <linux/bcm47xx_nvram.h>
7 #include <linux/mtd/mtd.h>
8 #include <linux/mtd/partitions.h>
9 
10 #include "ofpart_linksys_ns.h"
11 
12 #define NVRAM_BOOT_PART		"bootpartition"
13 
ofpart_linksys_ns_bootpartition(void)14 static int ofpart_linksys_ns_bootpartition(void)
15 {
16 	char buf[4];
17 	int bootpartition;
18 
19 	/* Check CFE environment variable */
20 	if (bcm47xx_nvram_getenv(NVRAM_BOOT_PART, buf, sizeof(buf)) > 0) {
21 		if (!kstrtoint(buf, 0, &bootpartition))
22 			return bootpartition;
23 		pr_warn("Failed to parse %s value \"%s\"\n", NVRAM_BOOT_PART,
24 			buf);
25 	} else {
26 		pr_warn("Failed to get NVRAM \"%s\"\n", NVRAM_BOOT_PART);
27 	}
28 
29 	return 0;
30 }
31 
linksys_ns_partitions_post_parse(struct mtd_info * mtd,struct mtd_partition * parts,int nr_parts)32 int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
33 				     struct mtd_partition *parts,
34 				     int nr_parts)
35 {
36 	int bootpartition = ofpart_linksys_ns_bootpartition();
37 	int trx_idx = 0;
38 	int i;
39 
40 	for (i = 0; i < nr_parts; i++) {
41 		if (of_device_is_compatible(parts[i].of_node, "linksys,ns-firmware")) {
42 			if (trx_idx++ == bootpartition)
43 				parts[i].name = "firmware";
44 			else
45 				parts[i].name = "backup";
46 		}
47 	}
48 
49 	return 0;
50 }
51