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 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 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