forked from Minki/linux
mtd: parsers: ofpart: support Linksys Northstar partitions
This allows extending ofpart parser with support for Linksys Northstar devices. That support uses recently added quirks mechanism. Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-2-zajec5@gmail.com
This commit is contained in:
parent
2fa7294175
commit
7134a2d026
@ -76,6 +76,16 @@ config MTD_OF_PARTS_BCM4908
|
||||
that can have multiple "firmware" partitions. It takes care of
|
||||
finding currently used one and backup ones.
|
||||
|
||||
config MTD_OF_PARTS_LINKSYS_NS
|
||||
bool "Linksys Northstar partitioning support"
|
||||
depends on MTD_OF_PARTS && (ARCH_BCM_5301X || ARCH_BCM4908 || COMPILE_TEST)
|
||||
default ARCH_BCM_5301X
|
||||
help
|
||||
This provides partitions parser for Linksys devices based on Broadcom
|
||||
Northstar architecture. Linksys commonly uses fixed flash layout with
|
||||
two "firmware" partitions. Currently used firmware has to be detected
|
||||
using CFE environment variable.
|
||||
|
||||
config MTD_PARSER_IMAGETAG
|
||||
tristate "Parser for BCM963XX Image Tag format partitions"
|
||||
depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST
|
||||
|
@ -6,6 +6,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
|
||||
obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
|
||||
ofpart-y += ofpart_core.o
|
||||
ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o
|
||||
ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o
|
||||
obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o
|
||||
obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
|
||||
obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include "ofpart_bcm4908.h"
|
||||
#include "ofpart_linksys_ns.h"
|
||||
|
||||
struct fixed_partitions_quirks {
|
||||
int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts);
|
||||
@ -26,6 +27,10 @@ static struct fixed_partitions_quirks bcm4908_partitions_quirks = {
|
||||
.post_parse = bcm4908_partitions_post_parse,
|
||||
};
|
||||
|
||||
static struct fixed_partitions_quirks linksys_ns_partitions_quirks = {
|
||||
.post_parse = linksys_ns_partitions_post_parse,
|
||||
};
|
||||
|
||||
static const struct of_device_id parse_ofpart_match_table[];
|
||||
|
||||
static bool node_has_compatible(struct device_node *pp)
|
||||
@ -167,6 +172,7 @@ static const struct of_device_id parse_ofpart_match_table[] = {
|
||||
{ .compatible = "fixed-partitions" },
|
||||
/* Customized */
|
||||
{ .compatible = "brcm,bcm4908-partitions", .data = &bcm4908_partitions_quirks, },
|
||||
{ .compatible = "linksys,ns-partitions", .data = &linksys_ns_partitions_quirks, },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
|
||||
|
50
drivers/mtd/parsers/ofpart_linksys_ns.c
Normal file
50
drivers/mtd/parsers/ofpart_linksys_ns.c
Normal file
@ -0,0 +1,50 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl>
|
||||
*/
|
||||
|
||||
#include <linux/bcm47xx_nvram.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include "ofpart_linksys_ns.h"
|
||||
|
||||
#define NVRAM_BOOT_PART "bootpartition"
|
||||
|
||||
static int ofpart_linksys_ns_bootpartition(void)
|
||||
{
|
||||
char buf[4];
|
||||
int bootpartition;
|
||||
|
||||
/* Check CFE environment variable */
|
||||
if (bcm47xx_nvram_getenv(NVRAM_BOOT_PART, buf, sizeof(buf)) > 0) {
|
||||
if (!kstrtoint(buf, 0, &bootpartition))
|
||||
return bootpartition;
|
||||
pr_warn("Failed to parse %s value \"%s\"\n", NVRAM_BOOT_PART,
|
||||
buf);
|
||||
} else {
|
||||
pr_warn("Failed to get NVRAM \"%s\"\n", NVRAM_BOOT_PART);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
|
||||
struct mtd_partition *parts,
|
||||
int nr_parts)
|
||||
{
|
||||
int bootpartition = ofpart_linksys_ns_bootpartition();
|
||||
int trx_idx = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_parts; i++) {
|
||||
if (of_device_is_compatible(parts[i].of_node, "linksys,ns-firmware")) {
|
||||
if (trx_idx++ == bootpartition)
|
||||
parts[i].name = "firmware";
|
||||
else
|
||||
parts[i].name = "backup";
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
18
drivers/mtd/parsers/ofpart_linksys_ns.h
Normal file
18
drivers/mtd/parsers/ofpart_linksys_ns.h
Normal file
@ -0,0 +1,18 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __OFPART_LINKSYS_NS_H
|
||||
#define __OFPART_LINKSYS_NS_H
|
||||
|
||||
#ifdef CONFIG_MTD_OF_PARTS_LINKSYS_NS
|
||||
int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
|
||||
struct mtd_partition *parts,
|
||||
int nr_parts);
|
||||
#else
|
||||
static inline int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
|
||||
struct mtd_partition *parts,
|
||||
int nr_parts)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user