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