Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
8190433295
4
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
4
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
@ -32,7 +32,9 @@ body:
|
||||
id: device
|
||||
attributes:
|
||||
label: Device
|
||||
description: The device exhibiting this bug.
|
||||
description: |
|
||||
The device exhibiting this bug (if unsure, use command below).
|
||||
```cat /tmp/sysinfo/model```
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
||||
@ -316,6 +316,15 @@ define Build/gzip
|
||||
@mv $@.new $@
|
||||
endef
|
||||
|
||||
define Build/gzip-filename
|
||||
@mkdir -p $@.tmp
|
||||
@cp $@ $@.tmp/$(word 1,$(1))
|
||||
$(if $(SOURCE_DATE_EPOCH),touch -hcd "@$(SOURCE_DATE_EPOCH)" $@.tmp/$(word 1,$(1)) $(word 2,$(1)))
|
||||
$(STAGING_DIR_HOST)/bin/gzip -f -9 -N -c $@.tmp/$(word 1,$(1)) $(word 2,$(1)) > $@.new
|
||||
@mv $@.new $@
|
||||
@rm -rf $@.tmp
|
||||
endef
|
||||
|
||||
define Build/install-dtb
|
||||
$(call locked, \
|
||||
$(foreach dts,$(DEVICE_DTS), \
|
||||
|
||||
@ -359,6 +359,7 @@ define Device/Init
|
||||
ARTIFACTS :=
|
||||
DEVICE_IMG_PREFIX := $(IMG_PREFIX)-$(1)
|
||||
DEVICE_IMG_NAME = $$(DEVICE_IMG_PREFIX)-$$(1)-$$(2)
|
||||
FACTORY_IMG_NAME :=
|
||||
IMAGE_SIZE :=
|
||||
KERNEL_PREFIX = $$(DEVICE_IMG_PREFIX)
|
||||
KERNEL_SUFFIX := -kernel.bin
|
||||
@ -418,6 +419,7 @@ DEFAULT_DEVICE_VARS := \
|
||||
DEVICE_FDT_NUM DEVICE_IMG_PREFIX SOC BOARD_NAME UIMAGE_MAGIC UIMAGE_NAME \
|
||||
SUPPORTED_DEVICES IMAGE_METADATA KERNEL_ENTRY KERNEL_LOADADDR \
|
||||
UBOOT_PATH IMAGE_SIZE \
|
||||
FACTORY_IMG_NAME \
|
||||
DEVICE_PACKAGES DEVICE_COMPAT_VERSION DEVICE_COMPAT_MESSAGE \
|
||||
DEVICE_VENDOR DEVICE_MODEL DEVICE_VARIANT \
|
||||
DEVICE_ALT0_VENDOR DEVICE_ALT0_MODEL DEVICE_ALT0_VARIANT \
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
LINUX_VERSION-5.10 = .161
|
||||
LINUX_KERNEL_HASH-5.10.161 = 7aaaf6d0bcd8a2cfa14ad75f02ca62bb2de08aad3bee3eff198de49ea5254079
|
||||
LINUX_VERSION-5.10 = .162
|
||||
LINUX_KERNEL_HASH-5.10.162 = 2ec400fc50ffdfe4c836a3c02bf6e7aebcd7963dd2ac1425e6d41545c37dd217
|
||||
|
||||
@ -141,10 +141,10 @@ mtd_get_mac_uci_config_ubi() {
|
||||
}
|
||||
|
||||
mtd_get_mac_text() {
|
||||
local mtdname=$1
|
||||
local offset=$(($2))
|
||||
local mtdname="$1"
|
||||
local offset=$((${2:-0}))
|
||||
local length="${3:-17}"
|
||||
local part
|
||||
local mac_dirty
|
||||
|
||||
part=$(find_mtd_part "$mtdname")
|
||||
if [ -z "$part" ]; then
|
||||
@ -152,15 +152,9 @@ mtd_get_mac_text() {
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -z "$offset" ]; then
|
||||
echo "mtd_get_mac_text: offset missing!" >&2
|
||||
return
|
||||
fi
|
||||
[ $((offset + length)) -le $(mtd_get_part_size "$mtdname") ] || return
|
||||
|
||||
mac_dirty=$(dd if="$part" bs=1 skip="$offset" count=17 2>/dev/null)
|
||||
|
||||
# "canonicalize" mac
|
||||
[ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
|
||||
macaddr_canonicalize $(dd bs=1 if="$part" skip="$offset" count="$length" 2>/dev/null)
|
||||
}
|
||||
|
||||
mtd_get_mac_binary() {
|
||||
|
||||
@ -8,12 +8,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=libpcap
|
||||
PKG_VERSION:=1.10.1
|
||||
PKG_RELEASE:=$(AUTORELEASE)
|
||||
PKG_VERSION:=1.10.2
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://www.tcpdump.org/release/
|
||||
PKG_HASH:=ed285f4accaf05344f90975757b3dbfe772ba41d1c401c2648b7fa45b711bdd4
|
||||
PKG_HASH:=db6d79d4ad03b8b15fb16c42447d093ad3520c0ec0ae3d331104dcfb1ce77560
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -1042,7 +1042,6 @@ endif()
|
||||
@@ -1325,7 +1325,6 @@ endif()
|
||||
#
|
||||
# OpenSSL/libressl.
|
||||
#
|
||||
|
||||
@ -9,7 +9,7 @@ Subject: [PATCH] skip manpages
|
||||
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -2732,57 +2732,6 @@ if(NOT MSVC)
|
||||
@@ -3325,57 +3325,6 @@ if(NOT MSVC)
|
||||
if(MINGW)
|
||||
find_program(LINK_EXECUTABLE ln)
|
||||
endif(MINGW)
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
--- a/pcap-common.c
|
||||
+++ b/pcap-common.c
|
||||
@@ -1662,14 +1662,23 @@ swap_pseudo_headers(int linktype, struct
|
||||
break;
|
||||
|
||||
case DLT_USB_LINUX:
|
||||
+#ifndef PCAP_SUPPORT_USB
|
||||
+ return;
|
||||
+#endif
|
||||
swap_linux_usb_header(hdr, data, 0);
|
||||
break;
|
||||
|
||||
case DLT_USB_LINUX_MMAPPED:
|
||||
+#ifndef PCAP_SUPPORT_USB
|
||||
+ return;
|
||||
+#endif
|
||||
swap_linux_usb_header(hdr, data, 1);
|
||||
break;
|
||||
|
||||
case DLT_NFLOG:
|
||||
+#ifndef PCAP_SUPPORT_NETFILTER
|
||||
+ return;
|
||||
+#endif
|
||||
swap_nflog_header(hdr, data);
|
||||
break;
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
From b86b960fbd5c215c9c0f43544935b9a25d9445c5 Mon Sep 17 00:00:00 2001
|
||||
From 3d8d268320d2381021a409ff8d03533698dd6242 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
|
||||
Date: Mon, 23 Nov 2020 00:38:22 +0100
|
||||
Subject: [PATCH] Add support for B.A.T.M.A.N. Advanced
|
||||
@ -220,16 +220,16 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
#endif
|
||||
--- a/gencode.c
|
||||
+++ b/gencode.c
|
||||
@@ -74,6 +74,8 @@
|
||||
#include "atmuni31.h"
|
||||
@@ -60,6 +60,8 @@
|
||||
#include "sunatmpos.h"
|
||||
#include "pflog.h"
|
||||
#include "ppp.h"
|
||||
+#include "batadv_packet.h"
|
||||
+#include "batadv_legacy_packet.h"
|
||||
#include "pcap/sll.h"
|
||||
#include "pcap/ipnet.h"
|
||||
#include "arcnet.h"
|
||||
@@ -9501,6 +9503,168 @@ gen_geneve(compiler_state_t *cstate, bpf
|
||||
@@ -9436,6 +9438,168 @@ gen_geneve(compiler_state_t *cstate, bpf
|
||||
return b1;
|
||||
}
|
||||
|
||||
@ -400,7 +400,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
static struct block *
|
||||
--- a/gencode.h
|
||||
+++ b/gencode.h
|
||||
@@ -346,6 +346,9 @@ struct block *gen_pppoes(compiler_state_
|
||||
@@ -358,6 +358,9 @@ struct block *gen_pppoes(compiler_state_
|
||||
|
||||
struct block *gen_geneve(compiler_state_t *, bpf_u_int32, int);
|
||||
|
||||
@ -412,7 +412,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
struct block *gen_atmtype_abbrev(compiler_state_t *, int);
|
||||
--- a/grammar.y.in
|
||||
+++ b/grammar.y.in
|
||||
@@ -347,6 +347,7 @@ DIAG_OFF_BISON_BYACC
|
||||
@@ -375,6 +375,7 @@ DIAG_OFF_BISON_BYACC
|
||||
%type <i> mtp2type
|
||||
%type <blk> mtp3field
|
||||
%type <blk> mtp3fieldvalue mtp3value mtp3listvalue
|
||||
@ -420,7 +420,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
|
||||
|
||||
%token DST SRC HOST GATEWAY
|
||||
@@ -365,7 +366,7 @@ DIAG_OFF_BISON_BYACC
|
||||
@@ -393,7 +394,7 @@ DIAG_OFF_BISON_BYACC
|
||||
%token LEN
|
||||
%token IPV6 ICMPV6 AH ESP
|
||||
%token VLAN MPLS
|
||||
@ -429,7 +429,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
%token ISO ESIS CLNP ISIS L1 L2 IIH LSP SNP CSNP PSNP
|
||||
%token STP
|
||||
%token IPX
|
||||
@@ -592,11 +593,40 @@ other: pqual TK_BROADCAST { CHECK_PTR_
|
||||
@@ -620,11 +621,40 @@ other: pqual TK_BROADCAST { CHECK_PTR_
|
||||
| PPPOES { CHECK_PTR_VAL(($$ = gen_pppoes(cstate, 0, 0))); }
|
||||
| GENEVE pnum { CHECK_PTR_VAL(($$ = gen_geneve(cstate, $2, 1))); }
|
||||
| GENEVE { CHECK_PTR_VAL(($$ = gen_geneve(cstate, 0, 0))); }
|
||||
@ -556,15 +556,15 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
}
|
||||
--- a/pcap-filter.manmisc.in
|
||||
+++ b/pcap-filter.manmisc.in
|
||||
@@ -98,6 +98,7 @@ protos are:
|
||||
@@ -98,6 +98,7 @@ protocols are:
|
||||
.BR arp ,
|
||||
.BR rarp ,
|
||||
.BR decnet ,
|
||||
+.BR batadv ,
|
||||
.BR sctp ,
|
||||
.B tcp
|
||||
and
|
||||
.BR udp .
|
||||
@@ -361,7 +362,7 @@ True if the packet is an IPv6 multicast
|
||||
@@ -400,7 +401,7 @@ True if the packet is an IPv6 multicast
|
||||
.IP "\fBether proto \fIprotocol\fR"
|
||||
True if the packet is of ether type \fIprotocol\fR.
|
||||
\fIProtocol\fP can be a number or one of the names
|
||||
@ -573,7 +573,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
\fBipx\fP, \fBiso\fP, \fBlat\fP, \fBloopback\fP, \fBmopdl\fP, \fBmoprc\fP, \fBnetbeui\fP,
|
||||
\fBrarp\fP, \fBsca\fP or \fBstp\fP.
|
||||
Note these identifiers (except \fBloopback\fP) are also keywords
|
||||
@@ -415,7 +416,7 @@ the filter checks for the IPX etype in a
|
||||
@@ -454,7 +455,7 @@ the filter checks for the IPX etype in a
|
||||
DSAP in the LLC header, the 802.3-with-no-LLC-header encapsulation of
|
||||
IPX, and the IPX etype in a SNAP frame.
|
||||
.RE
|
||||
@ -582,7 +582,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
Abbreviations for:
|
||||
.in +.5i
|
||||
.nf
|
||||
@@ -752,6 +753,36 @@ For example:
|
||||
@@ -792,6 +793,36 @@ For example:
|
||||
filters IPv4 protocol encapsulated in Geneve with VNI 0xb. This will
|
||||
match both IPv4 directly encapsulated in Geneve as well as IPv4 contained
|
||||
inside an Ethernet frame.
|
||||
@ -621,7 +621,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
\fIProtocol\fP can be a number or one of the names
|
||||
--- a/pcap/namedb.h
|
||||
+++ b/pcap/namedb.h
|
||||
@@ -69,6 +69,8 @@ PCAP_API int pcap_nametoportrange(const
|
||||
@@ -70,6 +70,8 @@ PCAP_API int pcap_nametoportrange(const
|
||||
PCAP_API int pcap_nametoproto(const char *);
|
||||
PCAP_API int pcap_nametoeproto(const char *);
|
||||
PCAP_API int pcap_nametollc(const char *);
|
||||
@ -632,7 +632,7 @@ Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||
* Also, pcap_nametoport() returns the protocol along with the port number.
|
||||
--- a/scanner.l
|
||||
+++ b/scanner.l
|
||||
@@ -344,6 +344,7 @@ mpls return MPLS;
|
||||
@@ -347,6 +347,7 @@ mpls return MPLS;
|
||||
pppoed return PPPOED;
|
||||
pppoes return PPPOES;
|
||||
geneve return GENEVE;
|
||||
|
||||
@ -6,12 +6,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=nftables
|
||||
PKG_VERSION:=1.0.5
|
||||
PKG_RELEASE:=2
|
||||
PKG_VERSION:=1.0.6
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=https://netfilter.org/projects/$(PKG_NAME)/files
|
||||
PKG_HASH:=8d1b4b18393af43698d10baa25d2b9b6397969beecac7816c35dd0714e4de50a
|
||||
PKG_HASH:=2407430ddd82987670e48dc2fda9e280baa8307abec04ab18d609df3db005e4c
|
||||
|
||||
PKG_MAINTAINER:=
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
@ -1,23 +0,0 @@
|
||||
'rule inet dscpclassify dscp_match meta l4proto { udp } th dport { 3478 } th sport { 3478-3497, 16384-16387 } goto ct_set_ef'
|
||||
works with 'nft add', but not 'nft insert', the latter yields: "BUG: unhandled op 4".
|
||||
|
||||
Fixes: 81e36530fcac ("src: replace interval segment tree overlap and automerge")
|
||||
Signed-off-by: Florian Westphal <fw@strlen.de>
|
||||
---
|
||||
src/evaluate.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/evaluate.c b/src/evaluate.c
|
||||
index d9c9ca28a53a..edebd7bcd8ab 100644
|
||||
--- a/src/evaluate.c
|
||||
+++ b/src/evaluate.c
|
||||
@@ -1520,6 +1520,7 @@ static int interval_set_eval(struct eval_ctx *ctx, struct set *set,
|
||||
switch (ctx->cmd->op) {
|
||||
case CMD_CREATE:
|
||||
case CMD_ADD:
|
||||
+ case CMD_INSERT:
|
||||
if (set->automerge) {
|
||||
ret = set_automerge(ctx->msgs, ctx->cmd, set, init,
|
||||
ctx->nft->debug_mask);
|
||||
--
|
||||
2.35.1
|
||||
@ -14,15 +14,12 @@ Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
|
||||
src/statement.c | 1 +
|
||||
7 files changed, 100 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/linux/netfilter/nf_tables.h b/include/linux/netfilter/nf_tables.h
|
||||
index 75df968..beab9d8 100644
|
||||
--- a/include/linux/netfilter/nf_tables.h
|
||||
+++ b/include/linux/netfilter/nf_tables.h
|
||||
@@ -1409,6 +1409,22 @@ enum nft_masq_attributes {
|
||||
};
|
||||
@@ -1436,6 +1436,22 @@ enum nft_masq_attributes {
|
||||
#define NFTA_MASQ_MAX (__NFTA_MASQ_MAX - 1)
|
||||
|
||||
+/**
|
||||
/**
|
||||
+ * enum nft_fullcone_attributes - nf_tables fullcone expression attributes
|
||||
+ *
|
||||
+ * @NFTA_FULLCONE_FLAGS: NAT flags (see NF_NAT_RANGE_* in linux/netfilter/nf_nat.h) (NLA_U32)
|
||||
@ -38,11 +35,10 @@ index 75df968..beab9d8 100644
|
||||
+};
|
||||
+#define NFTA_FULLCONE_MAX (__NFTA_FULLCONE_MAX - 1)
|
||||
+
|
||||
/**
|
||||
+/**
|
||||
* enum nft_redir_attributes - nf_tables redirect expression netlink attributes
|
||||
*
|
||||
diff --git a/include/statement.h b/include/statement.h
|
||||
index 2a2d300..cbd48dd 100644
|
||||
* @NFTA_REDIR_REG_PROTO_MIN: source register of proto range start (NLA_U32: nft_registers)
|
||||
--- a/include/statement.h
|
||||
+++ b/include/statement.h
|
||||
@@ -122,6 +122,7 @@ enum nft_nat_etypes {
|
||||
@ -53,11 +49,9 @@ index 2a2d300..cbd48dd 100644
|
||||
NFT_NAT_REDIR,
|
||||
};
|
||||
|
||||
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
|
||||
index 068c3bb..8513113 100644
|
||||
--- a/src/netlink_delinearize.c
|
||||
+++ b/src/netlink_delinearize.c
|
||||
@@ -1369,6 +1369,53 @@ static void netlink_parse_masq(struct netlink_parse_ctx *ctx,
|
||||
@@ -1370,6 +1370,53 @@ out_err:
|
||||
stmt_free(stmt);
|
||||
}
|
||||
|
||||
@ -111,7 +105,7 @@ index 068c3bb..8513113 100644
|
||||
static void netlink_parse_redir(struct netlink_parse_ctx *ctx,
|
||||
const struct location *loc,
|
||||
const struct nftnl_expr *nle)
|
||||
@@ -1787,6 +1834,7 @@ static const struct expr_handler netlink_parsers[] = {
|
||||
@@ -1796,6 +1843,7 @@ static const struct expr_handler netlink
|
||||
{ .name = "tproxy", .parse = netlink_parse_tproxy },
|
||||
{ .name = "notrack", .parse = netlink_parse_notrack },
|
||||
{ .name = "masq", .parse = netlink_parse_masq },
|
||||
@ -119,11 +113,9 @@ index 068c3bb..8513113 100644
|
||||
{ .name = "redir", .parse = netlink_parse_redir },
|
||||
{ .name = "dup", .parse = netlink_parse_dup },
|
||||
{ .name = "queue", .parse = netlink_parse_queue },
|
||||
diff --git a/src/netlink_linearize.c b/src/netlink_linearize.c
|
||||
index c8bbcb7..505eafa 100644
|
||||
--- a/src/netlink_linearize.c
|
||||
+++ b/src/netlink_linearize.c
|
||||
@@ -1140,6 +1140,13 @@ static void netlink_gen_nat_stmt(struct netlink_linearize_ctx *ctx,
|
||||
@@ -1140,6 +1140,13 @@ static void netlink_gen_nat_stmt(struct
|
||||
nftnl_reg_pmin = NFTNL_EXPR_MASQ_REG_PROTO_MIN;
|
||||
nftnl_reg_pmax = NFTNL_EXPR_MASQ_REG_PROTO_MAX;
|
||||
break;
|
||||
@ -137,11 +129,9 @@ index c8bbcb7..505eafa 100644
|
||||
case NFT_NAT_REDIR:
|
||||
nle = alloc_nft_expr("redir");
|
||||
|
||||
diff --git a/src/parser_bison.y b/src/parser_bison.y
|
||||
index ca5c488..ec9fc9b 100644
|
||||
--- a/src/parser_bison.y
|
||||
+++ b/src/parser_bison.y
|
||||
@@ -571,6 +571,7 @@ int nft_lex(void *, void *, void *);
|
||||
@@ -582,6 +582,7 @@ int nft_lex(void *, void *, void *);
|
||||
%token SNAT "snat"
|
||||
%token DNAT "dnat"
|
||||
%token MASQUERADE "masquerade"
|
||||
@ -149,7 +139,7 @@ index ca5c488..ec9fc9b 100644
|
||||
%token REDIRECT "redirect"
|
||||
%token RANDOM "random"
|
||||
%token FULLY_RANDOM "fully-random"
|
||||
@@ -703,8 +704,8 @@ int nft_lex(void *, void *, void *);
|
||||
@@ -716,8 +717,8 @@ int nft_lex(void *, void *, void *);
|
||||
%type <val> limit_burst_pkts limit_burst_bytes limit_mode limit_bytes time_unit quota_mode
|
||||
%type <stmt> reject_stmt reject_stmt_alloc
|
||||
%destructor { stmt_free($$); } reject_stmt reject_stmt_alloc
|
||||
@ -160,7 +150,7 @@ index ca5c488..ec9fc9b 100644
|
||||
%type <val> nf_nat_flags nf_nat_flag offset_opt
|
||||
%type <stmt> tproxy_stmt
|
||||
%destructor { stmt_free($$); } tproxy_stmt
|
||||
@@ -2853,6 +2854,7 @@ stmt : verdict_stmt
|
||||
@@ -2877,6 +2878,7 @@ stmt : verdict_stmt
|
||||
| queue_stmt
|
||||
| ct_stmt
|
||||
| masq_stmt close_scope_nat
|
||||
@ -168,21 +158,10 @@ index ca5c488..ec9fc9b 100644
|
||||
| redir_stmt close_scope_nat
|
||||
| dup_stmt close_scope_dup
|
||||
| fwd_stmt close_scope_fwd
|
||||
@@ -3753,6 +3755,28 @@ masq_stmt_args : TO COLON stmt_expr
|
||||
@@ -3773,6 +3775,28 @@ masq_stmt_args : TO COLON stmt_expr
|
||||
{
|
||||
$<stmt>0->nat.proto = $3;
|
||||
}
|
||||
;
|
||||
|
||||
+fullcone_stmt : fullcone_stmt_alloc fullcone_stmt_args
|
||||
+ | fullcone_stmt_alloc
|
||||
+ ;
|
||||
+
|
||||
+fullcone_stmt_alloc : FULLCONE { $$ = nat_stmt_alloc(&@$, NFT_NAT_FULLCONE); }
|
||||
+ ;
|
||||
+
|
||||
+fullcone_stmt_args : TO COLON stmt_expr
|
||||
+ {
|
||||
+ $<stmt>0->nat.proto = $3;
|
||||
+ }
|
||||
+ | TO COLON stmt_expr nf_nat_flags
|
||||
+ {
|
||||
+ $<stmt>0->nat.proto = $3;
|
||||
@ -194,14 +173,23 @@ index ca5c488..ec9fc9b 100644
|
||||
+ }
|
||||
+ ;
|
||||
+
|
||||
redir_stmt : redir_stmt_alloc redir_stmt_arg
|
||||
| redir_stmt_alloc
|
||||
;
|
||||
diff --git a/src/scanner.l b/src/scanner.l
|
||||
index 2154281..c389860 100644
|
||||
+fullcone_stmt : fullcone_stmt_alloc fullcone_stmt_args
|
||||
+ | fullcone_stmt_alloc
|
||||
+ ;
|
||||
+
|
||||
+fullcone_stmt_alloc : FULLCONE { $$ = nat_stmt_alloc(&@$, NFT_NAT_FULLCONE); }
|
||||
+ ;
|
||||
+
|
||||
+fullcone_stmt_args : TO COLON stmt_expr
|
||||
+ {
|
||||
+ $<stmt>0->nat.proto = $3;
|
||||
+ }
|
||||
| TO COLON stmt_expr nf_nat_flags
|
||||
{
|
||||
$<stmt>0->nat.proto = $3;
|
||||
--- a/src/scanner.l
|
||||
+++ b/src/scanner.l
|
||||
@@ -453,6 +453,7 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr})
|
||||
@@ -449,6 +449,7 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr
|
||||
"snat" { scanner_push_start_cond(yyscanner, SCANSTATE_STMT_NAT); return SNAT; }
|
||||
"dnat" { scanner_push_start_cond(yyscanner, SCANSTATE_STMT_NAT); return DNAT; }
|
||||
"masquerade" { scanner_push_start_cond(yyscanner, SCANSTATE_STMT_NAT); return MASQUERADE; }
|
||||
@ -209,11 +197,9 @@ index 2154281..c389860 100644
|
||||
"redirect" { scanner_push_start_cond(yyscanner, SCANSTATE_STMT_NAT); return REDIRECT; }
|
||||
"random" { return RANDOM; }
|
||||
<SCANSTATE_STMT_NAT>{
|
||||
diff --git a/src/statement.c b/src/statement.c
|
||||
index 30caf9c..f4866c2 100644
|
||||
--- a/src/statement.c
|
||||
+++ b/src/statement.c
|
||||
@@ -650,6 +650,7 @@ const char *nat_etype2str(enum nft_nat_etypes type)
|
||||
@@ -650,6 +650,7 @@ const char *nat_etype2str(enum nft_nat_e
|
||||
[NFT_NAT_SNAT] = "snat",
|
||||
[NFT_NAT_DNAT] = "dnat",
|
||||
[NFT_NAT_MASQ] = "masquerade",
|
||||
|
||||
@ -8,12 +8,12 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=tcpdump
|
||||
PKG_VERSION:=4.99.1
|
||||
PKG_VERSION:=4.99.2
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://www.tcpdump.org/release/
|
||||
PKG_HASH:=79b36985fb2703146618d87c4acde3e068b91c553fb93f021a337f175fd10ebe
|
||||
PKG_HASH:=f4304357d34b79d46f4e17e654f1f91f9ce4e3d5608a1badbd53295a26fb44d5
|
||||
|
||||
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -6230,97 +6230,6 @@ fi
|
||||
@@ -6568,97 +6568,6 @@ fi
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -73,6 +73,85 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
|
||||
@@ -73,6 +73,86 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
|
||||
|
||||
CSRC = fptype.c tcpdump.c
|
||||
|
||||
@ -77,6 +77,7 @@
|
||||
+ print-tftp.c \
|
||||
+ print-udp.c \
|
||||
+ print-unsupported.c \
|
||||
+ print-whois.c \
|
||||
+ signature.c \
|
||||
+ strtoaddr.c \
|
||||
+ util-print.c
|
||||
@ -86,7 +87,7 @@
|
||||
LIBNETDISSECT_SRC=\
|
||||
addrtoname.c \
|
||||
addrtostr.c \
|
||||
@@ -252,6 +331,8 @@ LIBNETDISSECT_SRC=\
|
||||
@@ -254,6 +334,8 @@ LIBNETDISSECT_SRC=\
|
||||
strtoaddr.c \
|
||||
util-print.c
|
||||
|
||||
@ -97,7 +98,7 @@
|
||||
|
||||
--- a/addrtoname.c
|
||||
+++ b/addrtoname.c
|
||||
@@ -683,8 +683,10 @@ linkaddr_string(netdissect_options *ndo,
|
||||
@@ -680,8 +680,10 @@ linkaddr_string(netdissect_options *ndo,
|
||||
if (type == LINKADDR_ETHER && len == MAC_ADDR_LEN)
|
||||
return (etheraddr_string(ndo, ep));
|
||||
|
||||
@ -108,7 +109,7 @@
|
||||
|
||||
tp = lookup_bytestring(ndo, ep, len);
|
||||
if (tp->bs_name)
|
||||
@@ -1263,6 +1265,7 @@ init_addrtoname(netdissect_options *ndo,
|
||||
@@ -1260,6 +1262,7 @@ init_addrtoname(netdissect_options *ndo,
|
||||
init_ipxsaparray(ndo);
|
||||
}
|
||||
|
||||
@ -116,7 +117,7 @@
|
||||
const char *
|
||||
dnaddr_string(netdissect_options *ndo, u_short dnaddr)
|
||||
{
|
||||
@@ -1279,6 +1282,7 @@ dnaddr_string(netdissect_options *ndo, u
|
||||
@@ -1276,6 +1279,7 @@ dnaddr_string(netdissect_options *ndo, u
|
||||
|
||||
return(tp->name);
|
||||
}
|
||||
@ -126,7 +127,7 @@
|
||||
struct hnamemem *
|
||||
--- a/print-ether.c
|
||||
+++ b/print-ether.c
|
||||
@@ -539,6 +539,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
@@ -545,6 +545,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
arp_print(ndo, p, length, caplen);
|
||||
return (1);
|
||||
|
||||
@ -134,7 +135,7 @@
|
||||
case ETHERTYPE_DN:
|
||||
decnet_print(ndo, p, length, caplen);
|
||||
return (1);
|
||||
@@ -569,6 +570,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
@@ -575,6 +576,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
ND_TCHECK_LEN(p, 1);
|
||||
isoclns_print(ndo, p + 1, length - 1);
|
||||
return(1);
|
||||
@ -142,19 +143,19 @@
|
||||
|
||||
case ETHERTYPE_PPPOED:
|
||||
case ETHERTYPE_PPPOES:
|
||||
@@ -581,9 +583,11 @@ ethertype_print(netdissect_options *ndo,
|
||||
@@ -587,9 +589,11 @@ ethertype_print(netdissect_options *ndo,
|
||||
eapol_print(ndo, p);
|
||||
return (1);
|
||||
|
||||
+#ifndef TCPDUMP_MINI
|
||||
case ETHERTYPE_RRCP:
|
||||
rrcp_print(ndo, p, length, src, dst);
|
||||
case ETHERTYPE_REALTEK:
|
||||
rtl_print(ndo, p, length, src, dst);
|
||||
return (1);
|
||||
+#endif
|
||||
|
||||
case ETHERTYPE_PPP:
|
||||
if (length) {
|
||||
@@ -592,6 +596,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
@@ -598,6 +602,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
}
|
||||
return (1);
|
||||
|
||||
@ -162,7 +163,7 @@
|
||||
case ETHERTYPE_MPCP:
|
||||
mpcp_print(ndo, p, length);
|
||||
return (1);
|
||||
@@ -604,19 +609,23 @@ ethertype_print(netdissect_options *ndo,
|
||||
@@ -610,19 +615,23 @@ ethertype_print(netdissect_options *ndo,
|
||||
case ETHERTYPE_CFM_OLD:
|
||||
cfm_print(ndo, p, length);
|
||||
return (1);
|
||||
@ -186,7 +187,7 @@
|
||||
case ETHERTYPE_MPLS:
|
||||
case ETHERTYPE_MPLS_MULTI:
|
||||
mpls_print(ndo, p, length);
|
||||
@@ -646,6 +655,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
@@ -652,6 +661,7 @@ ethertype_print(netdissect_options *ndo,
|
||||
case ETHERTYPE_PTP:
|
||||
ptp_print(ndo, p, length);
|
||||
return (1);
|
||||
@ -214,7 +215,7 @@
|
||||
break;
|
||||
--- a/print-icmp6.c
|
||||
+++ b/print-icmp6.c
|
||||
@@ -1384,7 +1384,7 @@ get_upperlayer(netdissect_options *ndo,
|
||||
@@ -1371,7 +1371,7 @@ get_upperlayer(netdissect_options *ndo,
|
||||
nh = GET_U_1(fragh->ip6f_nxt);
|
||||
hlen = sizeof(struct ip6_frag);
|
||||
break;
|
||||
@ -223,7 +224,7 @@
|
||||
case IPPROTO_AH:
|
||||
ah = (const struct ah *)bp;
|
||||
if (!ND_TTEST_1(ah->ah_len))
|
||||
@@ -1392,7 +1392,7 @@ get_upperlayer(netdissect_options *ndo,
|
||||
@@ -1379,7 +1379,7 @@ get_upperlayer(netdissect_options *ndo,
|
||||
nh = GET_U_1(ah->ah_nxt);
|
||||
hlen = (GET_U_1(ah->ah_len) + 2) << 2;
|
||||
break;
|
||||
@ -336,7 +337,7 @@
|
||||
default:
|
||||
/*
|
||||
* AH and ESP are, in the RFCs that describe them,
|
||||
@@ -357,6 +358,7 @@ ip6_print(netdissect_options *ndo, const
|
||||
@@ -375,6 +376,7 @@ ip6_print(netdissect_options *ndo, const
|
||||
nh = GET_U_1(cp);
|
||||
break;
|
||||
|
||||
@ -344,7 +345,7 @@
|
||||
case IPPROTO_FRAGMENT:
|
||||
advance = frag6_print(ndo, cp, (const u_char *)ip6);
|
||||
if (advance < 0 || ndo->ndo_snapend <= cp + advance) {
|
||||
@@ -387,7 +389,7 @@ ip6_print(netdissect_options *ndo, const
|
||||
@@ -405,7 +407,7 @@ ip6_print(netdissect_options *ndo, const
|
||||
nh = GET_U_1(cp);
|
||||
nd_pop_packet_info(ndo);
|
||||
return;
|
||||
@ -462,7 +463,7 @@
|
||||
static void
|
||||
ppp_hdlc(netdissect_options *ndo,
|
||||
const u_char *p, u_int length)
|
||||
@@ -1440,17 +1441,19 @@ trunc:
|
||||
@@ -1451,17 +1452,19 @@ trunc:
|
||||
ndo->ndo_snapend = se;
|
||||
nd_print_trunc(ndo);
|
||||
}
|
||||
@ -483,7 +484,7 @@
|
||||
|
||||
switch (proto) {
|
||||
case PPP_LCP: /* fall through */
|
||||
@@ -1483,6 +1486,7 @@ handle_ppp(netdissect_options *ndo,
|
||||
@@ -1494,6 +1497,7 @@ handle_ppp(netdissect_options *ndo,
|
||||
case PPP_IPV6:
|
||||
ip6_print(ndo, p, length);
|
||||
break;
|
||||
@ -491,7 +492,7 @@
|
||||
case ETHERTYPE_IPX: /*XXX*/
|
||||
case PPP_IPX:
|
||||
ipx_print(ndo, p, length);
|
||||
@@ -1494,6 +1498,7 @@ handle_ppp(netdissect_options *ndo,
|
||||
@@ -1505,6 +1509,7 @@ handle_ppp(netdissect_options *ndo,
|
||||
case PPP_MPLS_MCAST:
|
||||
mpls_print(ndo, p, length);
|
||||
break;
|
||||
@ -499,7 +500,7 @@
|
||||
case PPP_COMP:
|
||||
ND_PRINT("compressed PPP data");
|
||||
break;
|
||||
@@ -1634,6 +1639,7 @@ ppp_if_print(netdissect_options *ndo,
|
||||
@@ -1652,6 +1657,7 @@ ppp_if_print(netdissect_options *ndo,
|
||||
ppp_print(ndo, p, length);
|
||||
}
|
||||
|
||||
@ -507,14 +508,14 @@
|
||||
/*
|
||||
* PPP I/F printer to use if we know that RFC 1662-style PPP in HDLC-like
|
||||
* framing, or Cisco PPP with HDLC framing as per section 4.3.1 of RFC 1547,
|
||||
@@ -1877,3 +1883,4 @@ printx:
|
||||
@@ -1895,3 +1901,4 @@ printx:
|
||||
#endif /* __bsdi__ */
|
||||
ndo->ndo_ll_hdr_len += hdrlength;
|
||||
}
|
||||
+#endif
|
||||
--- a/print-sll.c
|
||||
+++ b/print-sll.c
|
||||
@@ -460,12 +460,14 @@ recurse:
|
||||
@@ -465,12 +465,14 @@ recurse:
|
||||
*/
|
||||
switch (ether_type) {
|
||||
|
||||
@ -531,7 +532,7 @@
|
||||
/*
|
||||
--- a/print-tcp.c
|
||||
+++ b/print-tcp.c
|
||||
@@ -612,6 +612,7 @@ tcp_print(netdissect_options *ndo,
|
||||
@@ -614,6 +614,7 @@ tcp_print(netdissect_options *ndo,
|
||||
ND_PRINT(" %u", utoval);
|
||||
break;
|
||||
|
||||
@ -539,7 +540,7 @@
|
||||
case TCPOPT_MPTCP:
|
||||
{
|
||||
const u_char *snapend_save;
|
||||
@@ -635,7 +636,7 @@ tcp_print(netdissect_options *ndo,
|
||||
@@ -637,7 +638,7 @@ tcp_print(netdissect_options *ndo,
|
||||
goto bad;
|
||||
break;
|
||||
}
|
||||
@ -548,7 +549,7 @@
|
||||
case TCPOPT_FASTOPEN:
|
||||
datalen = len - 2;
|
||||
LENCHECK(datalen);
|
||||
@@ -720,6 +721,7 @@ tcp_print(netdissect_options *ndo,
|
||||
@@ -722,6 +723,7 @@ tcp_print(netdissect_options *ndo,
|
||||
return;
|
||||
}
|
||||
|
||||
@ -556,7 +557,7 @@
|
||||
if (ndo->ndo_packettype) {
|
||||
switch (ndo->ndo_packettype) {
|
||||
case PT_ZMTP1:
|
||||
@@ -735,6 +737,7 @@ tcp_print(netdissect_options *ndo,
|
||||
@@ -737,6 +739,7 @@ tcp_print(netdissect_options *ndo,
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -564,10 +565,10 @@
|
||||
|
||||
if (IS_SRC_OR_DST_PORT(TELNET_PORT)) {
|
||||
telnet_print(ndo, bp, length);
|
||||
@@ -745,24 +748,31 @@ tcp_print(netdissect_options *ndo,
|
||||
@@ -746,24 +749,31 @@ tcp_print(netdissect_options *ndo,
|
||||
} else if (IS_SRC_OR_DST_PORT(WHOIS_PORT)) {
|
||||
ND_PRINT(": ");
|
||||
ndo->ndo_protocol = "whois"; /* needed by txtproto_print() */
|
||||
txtproto_print(ndo, bp, length, NULL, 0); /* RFC 3912 */
|
||||
whois_print(ndo, bp, length);
|
||||
- } else if (IS_SRC_OR_DST_PORT(BGP_PORT))
|
||||
+ }
|
||||
+#ifndef TCPDUMP_MINI
|
||||
@ -597,7 +598,7 @@
|
||||
else if (IS_SRC_OR_DST_PORT(FTP_PORT)) {
|
||||
ND_PRINT(": ");
|
||||
ftp_print(ndo, bp, length);
|
||||
@@ -775,12 +785,14 @@ tcp_print(netdissect_options *ndo,
|
||||
@@ -776,12 +786,14 @@ tcp_print(netdissect_options *ndo,
|
||||
} else if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) {
|
||||
/* over_tcp: TRUE, is_mdns: FALSE */
|
||||
domain_print(ndo, bp, length, TRUE, FALSE);
|
||||
@ -831,7 +832,7 @@
|
||||
{ null_if_print, DLT_LOOP },
|
||||
#endif
|
||||
+#ifndef TCPDUMP_MINI
|
||||
#if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H)
|
||||
#ifdef DLT_PFLOG
|
||||
{ pflog_if_print, DLT_PFLOG },
|
||||
#endif
|
||||
@@ -200,6 +211,7 @@ static const struct printer printers[] =
|
||||
|
||||
@ -1,12 +1,10 @@
|
||||
apply_bootconfig() {
|
||||
. /lib/functions.sh
|
||||
|
||||
local part
|
||||
|
||||
case $(board_name) in
|
||||
zyxel,nwa50ax|\
|
||||
zyxel,nwa55axe)
|
||||
mtd_idx=$(find_mtd_index "bootconfig")
|
||||
mtd_idx=$(find_mtd_index "bootconfig")
|
||||
zyxel-bootconfig "/dev/mtd$mtd_idx" set-image-status 0 valid
|
||||
zyxel-bootconfig "/dev/mtd$mtd_idx" set-active-image 0
|
||||
;;
|
||||
|
||||
@ -265,6 +265,7 @@ foreach my $mirror (@ARGV) {
|
||||
push @mirrors, "https://mirrors.aliyun.com/apache/$1";
|
||||
push @mirrors, "https://mirrors.tuna.tsinghua.edu.cn/apache/$1";
|
||||
push @mirrors, "https://mirrors.ustc.edu.cn/apache/$1";
|
||||
push @mirrors, "https://dlcdn.apache.org/$1";
|
||||
push @mirrors, "https://mirror.netcologne.de/apache.org/$1";
|
||||
push @mirrors, "https://mirror.aarnet.edu.au/pub/apache/$1";
|
||||
push @mirrors, "https://mirror.csclub.uwaterloo.ca/apache/$1";
|
||||
|
||||
@ -35,8 +35,11 @@ Available Commands:
|
||||
info: Show a list of available target profiles
|
||||
clean: Remove images and temporary build files
|
||||
image: Build an image (see below for more information).
|
||||
manifest: Show all package that will be installed into the image
|
||||
package_whatdepends: Show which packages have a dependency on this
|
||||
package_depends: Show installation dependency of the package
|
||||
|
||||
Building images:
|
||||
image:
|
||||
By default 'make image' will create an image with the default
|
||||
target profile and package set. You can use the following parameters
|
||||
to change that:
|
||||
@ -49,7 +52,7 @@ Building images:
|
||||
make image DISABLED_SERVICES="<svc1> [<svc2> [<svc3> ..]]" # Which services in /etc/init.d/ should be disabled
|
||||
make image ADD_LOCAL_KEY=1 # store locally generated signing key in built images
|
||||
|
||||
Print manifest:
|
||||
manifest:
|
||||
List "all" packages which get installed into the image.
|
||||
You can use the following parameters:
|
||||
|
||||
@ -57,6 +60,19 @@ Print manifest:
|
||||
make manifest PACKAGES="<pkg1> [<pkg2> [<pkg3> ...]]" # include extra packages
|
||||
make manifest STRIP_ABI=1 # remove ABI version from printed package names
|
||||
|
||||
|
||||
package_whatdepends:
|
||||
List "all" packages that have a dependency on this package
|
||||
You can use the following parameters:
|
||||
|
||||
make package_whatdepends PACKAGE="<pkg>"
|
||||
|
||||
package_depends:
|
||||
List "all" packages dependency of the package
|
||||
You can use the following parameters:
|
||||
|
||||
make package_depends PACKAGE="<pkg>"
|
||||
|
||||
endef
|
||||
$(eval $(call shexport,Helptext))
|
||||
|
||||
@ -255,7 +271,7 @@ manifest: FORCE
|
||||
$(if $(PROFILE),USER_PROFILE="$(PROFILE_FILTER)") \
|
||||
$(if $(PACKAGES),USER_PACKAGES="$(PACKAGES)"))
|
||||
|
||||
whatdepends: FORCE
|
||||
package_whatdepends: FORCE
|
||||
ifeq ($(PACKAGE),)
|
||||
@echo 'Variable `PACKAGE` is not set but required by `whatdepends`'
|
||||
@exit 1
|
||||
@ -263,4 +279,13 @@ endif
|
||||
@$(MAKE) -s package_reload
|
||||
@$(OPKG) whatdepends -A $(PACKAGE)
|
||||
|
||||
.SILENT: help info image manifest whatdepends
|
||||
package_depends: FORCE
|
||||
ifeq ($(PACKAGE),)
|
||||
@echo 'Variable `PACKAGE` is not set but required by `package_depends`'
|
||||
@exit 1
|
||||
endif
|
||||
@$(MAKE) -s package_reload
|
||||
@$(OPKG) depends -A $(PACKAGE)
|
||||
|
||||
|
||||
.SILENT: help info image manifest package_whatdepends package_depends
|
||||
|
||||
@ -197,6 +197,7 @@ CONFIG_NEED_KUSER_HELPERS=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NVMEM=y
|
||||
# CONFIG_NVMEM_MICROCHIP_OTPC is not set
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
|
||||
@ -303,6 +303,7 @@ CONFIG_NLS_UTF8=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NVMEM=y
|
||||
# CONFIG_NVMEM_MICROCHIP_OTPC is not set
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
|
||||
@ -265,6 +265,7 @@ CONFIG_NLS_UTF8=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NVMEM=y
|
||||
# CONFIG_NVMEM_MICROCHIP_OTPC is not set
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
|
||||
@ -58,10 +58,26 @@
|
||||
read-only;
|
||||
};
|
||||
|
||||
art: partition@ff0000 {
|
||||
partition@ff0000 {
|
||||
label = "art";
|
||||
reg = <0xff0000 0x010000>;
|
||||
read-only;
|
||||
|
||||
compatible = "nvmem-cells";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
macaddr_art_0: macaddr@0 {
|
||||
reg = <0x0 0x6>;
|
||||
};
|
||||
|
||||
calibration_art_1000: calibration@1000 {
|
||||
reg = <0x1000 0x440>;
|
||||
};
|
||||
|
||||
calibration_art_5000: calibration@5000 {
|
||||
reg = <0x5000 0x844>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@ -73,6 +89,13 @@
|
||||
|
||||
&pcie {
|
||||
status = "okay";
|
||||
|
||||
wifi@0,0 {
|
||||
compatible = "qcom,ath10k";
|
||||
reg = <0x0 0 0 0 0>;
|
||||
nvmem-cells = <&calibration_art_5000>;
|
||||
nvmem-cell-names = "calibration";
|
||||
};
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
@ -109,15 +132,6 @@
|
||||
&wmac {
|
||||
status = "okay";
|
||||
|
||||
mtd-cal-data = <&art 0x1000>;
|
||||
};
|
||||
|
||||
&art {
|
||||
compatible = "nvmem-cells";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
macaddr_art_0: macaddr@0 {
|
||||
reg = <0x0 0x6>;
|
||||
};
|
||||
nvmem-cells = <&calibration_art_1000>;
|
||||
nvmem-cell-names = "calibration";
|
||||
};
|
||||
|
||||
67
target/linux/ath79/dts/ar9344_fortinet_ap-dual.dtsi
Normal file
67
target/linux/ath79/dts/ar9344_fortinet_ap-dual.dtsi
Normal file
@ -0,0 +1,67 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include "ar9344.dtsi"
|
||||
#include "ar934x_fortinet_loader.dtsi"
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,9600";
|
||||
};
|
||||
|
||||
keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
reset {
|
||||
label = "reset";
|
||||
gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
|
||||
debounce-interval = <60>;
|
||||
linux,code = <KEY_RESTART>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&ref {
|
||||
clock-frequency = <25000000>;
|
||||
};
|
||||
|
||||
&mdio0 {
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
eee-broken-100tx;
|
||||
eee-broken-1000t;
|
||||
};
|
||||
};
|
||||
|
||||
ð0 {
|
||||
status = "okay";
|
||||
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
|
||||
pll-data = <0x02000000 0x00000101 0x00001313>;
|
||||
};
|
||||
|
||||
&pcie {
|
||||
status = "okay";
|
||||
|
||||
ath9k: wifi@0,0,0 {
|
||||
compatible = "pci168c,0030";
|
||||
reg = <0x0 0 0 0 0>;
|
||||
};
|
||||
};
|
||||
|
||||
&wmac {
|
||||
status = "okay";
|
||||
};
|
||||
75
target/linux/ath79/dts/ar9344_fortinet_fap-221-b.dts
Normal file
75
target/linux/ath79/dts/ar9344_fortinet_fap-221-b.dts
Normal file
@ -0,0 +1,75 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include "ar9344_fortinet_ap-dual.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "fortinet,fap-221-b", "qca,ar9344";
|
||||
model = "Fortinet FAP-221-B";
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led_power: power_green {
|
||||
label = "green:power";
|
||||
gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
|
||||
default-state = "on";
|
||||
};
|
||||
|
||||
power_amber {
|
||||
label = "amber:power";
|
||||
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
eth_green {
|
||||
label = "green:eth";
|
||||
gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
eth_amber {
|
||||
label = "amber:eth";
|
||||
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
wifi5g {
|
||||
label = "green:wifi5g";
|
||||
gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "phy0tpt";
|
||||
};
|
||||
|
||||
wifi2g {
|
||||
label = "amber:wifi2g";
|
||||
gpios = <&gpio 19 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "phy1tpt";
|
||||
};
|
||||
};
|
||||
|
||||
virtual_flash {
|
||||
devices = <&fwconcat0 &fwconcat1 &fwconcat2>;
|
||||
};
|
||||
};
|
||||
|
||||
&ath9k {
|
||||
ieee80211-freq-limit = <2402000 2482000>;
|
||||
|
||||
nvmem-cells = <&calibration_pcie>;
|
||||
nvmem-cell-names = "calibration";
|
||||
};
|
||||
|
||||
&wmac {
|
||||
ieee80211-freq-limit = <2402000 2482000 4900000 5990000>;
|
||||
|
||||
nvmem-cells = <&calibration_wmac>;
|
||||
nvmem-cell-names = "calibration";
|
||||
};
|
||||
|
||||
&art {
|
||||
compatible = "nvmem-cells";
|
||||
|
||||
calibration_wmac: calibration@1000 {
|
||||
reg = <0x1000 0x440>;
|
||||
};
|
||||
|
||||
calibration_pcie: calibration@5000 {
|
||||
reg = <0x5000 0x440>;
|
||||
};
|
||||
};
|
||||
@ -91,15 +91,10 @@
|
||||
};
|
||||
|
||||
partition@50000 {
|
||||
/* Dual-Flash layout combined */
|
||||
compatible = "denx,uimage";
|
||||
label = "firmware";
|
||||
reg = <0x050000 0x740000>;
|
||||
};
|
||||
|
||||
partition@790000 {
|
||||
label = "vendor";
|
||||
reg = <0x790000 0x740000>;
|
||||
read-only;
|
||||
reg = <0x050000 0xe80000>;
|
||||
};
|
||||
|
||||
partition@ed0000 {
|
||||
|
||||
72
target/linux/ath79/dts/ar934x_fortinet_loader.dtsi
Normal file
72
target/linux/ath79/dts/ar934x_fortinet_loader.dtsi
Normal file
@ -0,0 +1,72 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
|
||||
#include <dt-bindings/mtd/partitions/uimage.h>
|
||||
|
||||
/ {
|
||||
virtual_flash {
|
||||
compatible = "mtd-concat";
|
||||
|
||||
devices = <&fwconcat0 &fwconcat1>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
compatible = "openwrt,uimage", "denx,uimage";
|
||||
openwrt,ih-magic = <0x73714f4b>;
|
||||
label = "firmware";
|
||||
reg = <0x0 0x0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi {
|
||||
status = "okay";
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <40000000>;
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot";
|
||||
reg = <0x000000 0x040000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
fwconcat0: partition@40000 {
|
||||
label = "fwconcat0";
|
||||
reg = <0x040000 0x900000>;
|
||||
};
|
||||
|
||||
partition@940000 {
|
||||
label = "loader";
|
||||
reg = <0x940000 0x010000>;
|
||||
};
|
||||
|
||||
fwconcat1: partition@950000 {
|
||||
label = "fwconcat1";
|
||||
reg = <0x950000 0x1a0000>;
|
||||
};
|
||||
|
||||
fwconcat2: partition@af0000 {
|
||||
label = "reserved";
|
||||
reg = <0xaf0000 0x500000>;
|
||||
};
|
||||
|
||||
art: partition@ff0000 {
|
||||
label = "art";
|
||||
reg = <0xff0000 0x010000>;
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@ -84,15 +84,10 @@
|
||||
};
|
||||
|
||||
partition@50000 {
|
||||
/* Dual-Flash layout combined */
|
||||
compatible = "denx,uimage";
|
||||
label = "firmware";
|
||||
reg = <0x050000 0x740000>;
|
||||
};
|
||||
|
||||
partition@790000 {
|
||||
label = "vendor";
|
||||
reg = <0x790000 0x740000>;
|
||||
read-only;
|
||||
reg = <0x050000 0xe80000>;
|
||||
};
|
||||
|
||||
partition@ed0000 {
|
||||
|
||||
@ -55,15 +55,10 @@
|
||||
};
|
||||
|
||||
partition@50000 {
|
||||
/* Dual-Flash layout combined */
|
||||
compatible = "denx,uimage";
|
||||
label = "firmware";
|
||||
reg = <0x050000 0x740000>;
|
||||
};
|
||||
|
||||
partition@790000 {
|
||||
label = "vendor";
|
||||
reg = <0x790000 0x740000>;
|
||||
read-only;
|
||||
reg = <0x050000 0xe80000>;
|
||||
};
|
||||
|
||||
partition@ed0000 {
|
||||
|
||||
@ -69,17 +69,12 @@
|
||||
};
|
||||
|
||||
partition@70000 {
|
||||
/* Combine kernel0 & kernel1 */
|
||||
label = "firmware";
|
||||
reg = <0x070000 0x790000>;
|
||||
reg = <0x070000 0xf20000>;
|
||||
compatible = "denx,uimage";
|
||||
};
|
||||
|
||||
partition@800000 {
|
||||
label = "kernel1";
|
||||
reg = <0x800000 0x790000>;
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@f90000 {
|
||||
label = "bs";
|
||||
reg = <0xf90000 0x020000>;
|
||||
|
||||
@ -45,6 +45,7 @@ ath79_setup_interfaces()
|
||||
engenius,ecb600|\
|
||||
enterasys,ws-ap3705i|\
|
||||
extreme-networks,ws-ap3805i|\
|
||||
fortinet,fap-221-b|\
|
||||
glinet,gl-ar300m-lite|\
|
||||
glinet,gl-usb150|\
|
||||
hak5,wifi-pineapple-nano|\
|
||||
@ -674,6 +675,10 @@ ath79_setup_macs()
|
||||
enterasys,ws-ap3705i)
|
||||
label_mac=$(mtd_get_mac_ascii u-boot-env0 ethaddr)
|
||||
;;
|
||||
fortinet,fap-221-b)
|
||||
lan_mac=$(mtd_get_mac_text u-boot 0x3ff80 12)
|
||||
label_mac=$lan_mac
|
||||
;;
|
||||
hak5,lan-turtle|\
|
||||
hak5,packet-squirrel)
|
||||
label_mac=$(mtd_get_mac_binary u-boot 0x1fc00)
|
||||
|
||||
@ -35,7 +35,6 @@ case "$FIRMWARE" in
|
||||
sophos,ap55c|\
|
||||
sophos,ap100|\
|
||||
sophos,ap100c|\
|
||||
ubnt,aircube-ac|\
|
||||
ubnt,bullet-ac|\
|
||||
ubnt,unifiac-lite|\
|
||||
ubnt,unifiac-lr|\
|
||||
|
||||
@ -35,6 +35,9 @@ case "$board" in
|
||||
[ "$PHYNBR" -eq 1 ] && \
|
||||
mtd_get_mac_ascii bdcfg "wlanmac" > /sys${DEVPATH}/macaddress
|
||||
;;
|
||||
fortinet,fap-221-b)
|
||||
macaddr_add "$(mtd_get_mac_text u-boot 0x3ff80 12)" $((PHYNBR*7+1)) > /sys${DEVPATH}/macaddress
|
||||
;;
|
||||
iodata,wn-ac1600dgr)
|
||||
# There is no eeprom data for 5 GHz wlan in "art" partition
|
||||
# which would allow to patch the macaddress
|
||||
|
||||
@ -19,6 +19,9 @@ preinit_set_mac_address() {
|
||||
siemens,ws-ap3610)
|
||||
ip link set dev eth0 address $(mtd_get_mac_ascii cfg1 ethaddr)
|
||||
;;
|
||||
fortinet,fap-221-b)
|
||||
ip link set dev eth0 address $(mtd_get_mac_text u-boot 0x3ff80 12)
|
||||
;;
|
||||
tplink,deco-s4-v2)
|
||||
base_mac=$(mtd_get_mac_encrypted_deco $(find_mtd_part config))
|
||||
ip link set dev eth0 address $base_mac
|
||||
|
||||
@ -8,8 +8,6 @@
|
||||
# So the kernel check is for the loader, the rootfs check is for kernel + rootfs
|
||||
|
||||
platform_do_upgrade_failsafe_datachk() {
|
||||
local setenv_script="/tmp/fw_env_upgrade"
|
||||
|
||||
local flash_base=0x9f000000
|
||||
|
||||
local kernel_mtd=$(find_mtd_index ${KERNEL_PART:-kernel})
|
||||
@ -34,31 +32,33 @@ platform_do_upgrade_failsafe_datachk() {
|
||||
local rootfs_md5=$($IMAGE_CMD $ROOTFS_FILE | dd bs=4k count=$rootfs_blocks iflag=fullblock | md5sum | cut -d ' ' -f1)
|
||||
|
||||
# prepare new u-boot-env vars
|
||||
printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $setenv_script
|
||||
printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $setenv_script
|
||||
printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script
|
||||
printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $ENV_SCRIPT
|
||||
printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $ENV_SCRIPT
|
||||
printf "vmlinux_checksum %s\n" ${kernel_md5} >> $ENV_SCRIPT
|
||||
|
||||
printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $setenv_script
|
||||
printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $setenv_script
|
||||
printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script
|
||||
printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $ENV_SCRIPT
|
||||
printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $ENV_SCRIPT
|
||||
printf "rootfs_checksum %s\n" ${rootfs_md5} >> $ENV_SCRIPT
|
||||
|
||||
# store u-boot-env
|
||||
mkdir -p /var/lock
|
||||
fw_setenv -s $setenv_script || {
|
||||
[ -n "$SKIP_HASH" ] || fw_setenv -s $ENV_SCRIPT || {
|
||||
echo 'failed to update U-Boot environment'
|
||||
exit 1
|
||||
}
|
||||
|
||||
# sysupgrade
|
||||
sleep 2
|
||||
sync
|
||||
echo 3 > /proc/sys/vm/drop_caches
|
||||
sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches
|
||||
|
||||
$IMAGE_CMD $KERNEL_FILE | mtd $MTD_ARGS write - ${KERNEL_PART:-kernel}
|
||||
sleep 2
|
||||
sync
|
||||
|
||||
sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches
|
||||
|
||||
if [ -n "$UPGRADE_BACKUP" ]; then
|
||||
$IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS $MTD_CONFIG_ARGS -j $UPGRADE_BACKUP write - ${ROOTFS_PART:-rootfs}
|
||||
else
|
||||
$IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS write - ${ROOTFS_PART:-rootfs}
|
||||
fi
|
||||
|
||||
sync
|
||||
}
|
||||
|
||||
@ -45,6 +45,18 @@ platform_do_upgrade() {
|
||||
watchguard,ap100|\
|
||||
watchguard,ap200|\
|
||||
watchguard,ap300)
|
||||
ENV_SCRIPT="/tmp/fw_env"
|
||||
IMAGE_LIST="tar tzf $1"
|
||||
IMAGE_CMD="tar xzOf $1"
|
||||
KERNEL_PART="loader"
|
||||
ROOTFS_PART="fwconcat0"
|
||||
KERNEL_FILE="uImage-lzma.bin"
|
||||
ROOTFS_FILE="root.squashfs"
|
||||
platform_do_upgrade_failsafe_datachk "$1"
|
||||
;;
|
||||
fortinet,fap-221-b)
|
||||
SKIP_HASH="1"
|
||||
ENV_SCRIPT="/dev/null"
|
||||
IMAGE_LIST="tar tzf $1"
|
||||
IMAGE_CMD="tar xzOf $1"
|
||||
KERNEL_PART="loader"
|
||||
|
||||
@ -37,6 +37,7 @@ endef
|
||||
define Device/senao_loader_okli
|
||||
$(Device/loader-okli-uimage)
|
||||
KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x73714f4b
|
||||
KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel | uImage none
|
||||
LOADER_KERNEL_MAGIC := 0x73714f4b
|
||||
IMAGES += factory.bin
|
||||
IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | \
|
||||
|
||||
@ -229,7 +229,7 @@ TARGET_DEVICES += ubnt_unifi-ap-lr
|
||||
define Device/ubnt_unifiac
|
||||
DEVICE_VENDOR := Ubiquiti
|
||||
SOC := qca9563
|
||||
IMAGE_SIZE := 7744k
|
||||
IMAGE_SIZE := 15488k
|
||||
DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca988x-ct
|
||||
endef
|
||||
|
||||
|
||||
@ -1325,6 +1325,22 @@ define Device/extreme-networks_ws-ap3805i
|
||||
endef
|
||||
TARGET_DEVICES += extreme-networks_ws-ap3805i
|
||||
|
||||
define Device/fortinet_fap-221-b
|
||||
$(Device/senao_loader_okli)
|
||||
SOC := ar9344
|
||||
DEVICE_VENDOR := Fortinet
|
||||
DEVICE_MODEL := FAP-221-B
|
||||
FACTORY_IMG_NAME := FP221B-9.99-AP-build999-999999-patch99
|
||||
IMAGE_SIZE := 9216k
|
||||
LOADER_FLASH_OFFS := 0x040000
|
||||
IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | \
|
||||
append-rootfs | pad-rootfs | \
|
||||
check-size | pad-to $$$$(IMAGE_SIZE) | \
|
||||
append-loader-okli-uimage $(1) | pad-to 10944k | \
|
||||
gzip-filename $$$$(FACTORY_IMG_NAME)
|
||||
endef
|
||||
TARGET_DEVICES += fortinet_fap-221-b
|
||||
|
||||
define Device/glinet_6408
|
||||
$(Device/tplink-8mlzma)
|
||||
SOC := ar9331
|
||||
@ -1893,7 +1909,7 @@ define Device/ocedo_koala
|
||||
DEVICE_MODEL := Koala
|
||||
DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca988x-ct
|
||||
SUPPORTED_DEVICES += koala
|
||||
IMAGE_SIZE := 7424k
|
||||
IMAGE_SIZE := 14848k
|
||||
endef
|
||||
TARGET_DEVICES += ocedo_koala
|
||||
|
||||
@ -1901,7 +1917,7 @@ define Device/ocedo_raccoon
|
||||
SOC := ar9344
|
||||
DEVICE_VENDOR := Ocedo
|
||||
DEVICE_MODEL := Raccoon
|
||||
IMAGE_SIZE := 7424k
|
||||
IMAGE_SIZE := 14848k
|
||||
endef
|
||||
TARGET_DEVICES += ocedo_raccoon
|
||||
|
||||
@ -1910,7 +1926,7 @@ define Device/ocedo_ursus
|
||||
DEVICE_VENDOR := Ocedo
|
||||
DEVICE_MODEL := Ursus
|
||||
DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca988x-ct
|
||||
IMAGE_SIZE := 7424k
|
||||
IMAGE_SIZE := 14848k
|
||||
endef
|
||||
TARGET_DEVICES += ocedo_ursus
|
||||
|
||||
|
||||
@ -234,6 +234,7 @@ define Device/tplink_tl-wpa8630p-v2
|
||||
so the JFFS2 settings partition MUST be reformatted to avoid data corruption. \
|
||||
Backup your settings before upgrading, then during sysupgrade, \
|
||||
de-select "Keep settings" and select "Force" to continue (equivilant to "sysupgrade -n -F").
|
||||
DEFAULT := n
|
||||
endef
|
||||
|
||||
define Device/tplink_tl-wpa8630p-v2-int
|
||||
|
||||
@ -326,7 +326,7 @@ SVN-Revision: 35130
|
||||
#endif /* _LINUX_TYPES_H */
|
||||
--- a/net/ipv4/af_inet.c
|
||||
+++ b/net/ipv4/af_inet.c
|
||||
@@ -1470,8 +1470,8 @@ struct sk_buff *inet_gro_receive(struct
|
||||
@@ -1469,8 +1469,8 @@ struct sk_buff *inet_gro_receive(struct
|
||||
if (unlikely(ip_fast_csum((u8 *)iph, 5)))
|
||||
goto out_unlock;
|
||||
|
||||
|
||||
@ -8,8 +8,6 @@
|
||||
# So the kernel check is for the loader, the rootfs check is for kernel + rootfs
|
||||
|
||||
platform_do_upgrade_failsafe_datachk() {
|
||||
local setenv_script="/tmp/fw_env_upgrade"
|
||||
|
||||
local flash_base=0x9f000000
|
||||
|
||||
local kernel_mtd=$(find_mtd_index ${KERNEL_PART:-kernel})
|
||||
@ -34,31 +32,33 @@ platform_do_upgrade_failsafe_datachk() {
|
||||
local rootfs_md5=$($IMAGE_CMD $ROOTFS_FILE | dd bs=4k count=$rootfs_blocks iflag=fullblock | md5sum | cut -d ' ' -f1)
|
||||
|
||||
# prepare new u-boot-env vars
|
||||
printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $setenv_script
|
||||
printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $setenv_script
|
||||
printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script
|
||||
printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $ENV_SCRIPT
|
||||
printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $ENV_SCRIPT
|
||||
printf "vmlinux_checksum %s\n" ${kernel_md5} >> $ENV_SCRIPT
|
||||
|
||||
printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $setenv_script
|
||||
printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $setenv_script
|
||||
printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script
|
||||
printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $ENV_SCRIPT
|
||||
printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $ENV_SCRIPT
|
||||
printf "rootfs_checksum %s\n" ${rootfs_md5} >> $ENV_SCRIPT
|
||||
|
||||
# store u-boot-env
|
||||
mkdir -p /var/lock
|
||||
fw_setenv -s $setenv_script || {
|
||||
[ -n "$SKIP_HASH" ] || fw_setenv -s $ENV_SCRIPT || {
|
||||
echo 'failed to update U-Boot environment'
|
||||
exit 1
|
||||
}
|
||||
|
||||
# sysupgrade
|
||||
sleep 2
|
||||
sync
|
||||
echo 3 > /proc/sys/vm/drop_caches
|
||||
sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches
|
||||
|
||||
$IMAGE_CMD $KERNEL_FILE | mtd $MTD_ARGS write - ${KERNEL_PART:-kernel}
|
||||
sleep 2
|
||||
sync
|
||||
|
||||
sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches
|
||||
|
||||
if [ -n "$UPGRADE_BACKUP" ]; then
|
||||
$IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS $MTD_CONFIG_ARGS -j $UPGRADE_BACKUP write - ${ROOTFS_PART:-rootfs}
|
||||
else
|
||||
$IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS write - ${ROOTFS_PART:-rootfs}
|
||||
fi
|
||||
|
||||
sync
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ platform_do_upgrade() {
|
||||
engenius,eap350-v1|\
|
||||
engenius,ecb350-v1|\
|
||||
engenius,enh202-v1)
|
||||
ENV_SCRIPT="/tmp/fw_env"
|
||||
IMAGE_LIST="tar tzf $1"
|
||||
IMAGE_CMD="tar xzOf $1"
|
||||
KERNEL_PART="loader"
|
||||
|
||||
@ -13,7 +13,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/spi/spidev.c
|
||||
+++ b/drivers/spi/spidev.c
|
||||
@@ -758,7 +758,7 @@ static int spidev_probe(struct spi_devic
|
||||
@@ -761,7 +761,7 @@ static int spidev_probe(struct spi_devic
|
||||
* compatible string, it is a Linux implementation thing
|
||||
* rather than a description of the hardware.
|
||||
*/
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
From 6abef37d16d0c570ef5a149e63762fba2a30804b Mon Sep 17 00:00:00 2001
|
||||
From: "Leon M. George" <leon@georgemail.eu>
|
||||
Date: Wed, 30 Mar 2022 16:16:56 +0200
|
||||
Subject: [PATCH] mtd: spi-nor: support eon en25qh256a variant
|
||||
|
||||
The EN25QH256A variant of the EN25QH256 doesn't initialize correctly from SFDP
|
||||
alone and only accesses memory below 8m (addr_width is 4 but read_opcode takes
|
||||
only 3 bytes).
|
||||
|
||||
Set SNOR_F_4B_OPCODES if the flash chip variant was detected using hwcaps.
|
||||
|
||||
The fix submitted upstream uses the PARSE_SFDP initializer that is not
|
||||
available in the kernel used with Openwrt.
|
||||
|
||||
Signed-off-by: Leon M. George <leon@georgemail.eu>
|
||||
---
|
||||
drivers/mtd/spi-nor/eon.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/spi-nor/eon.c
|
||||
+++ b/drivers/mtd/spi-nor/eon.c
|
||||
@@ -8,6 +8,16 @@
|
||||
|
||||
#include "core.h"
|
||||
|
||||
+static void en25qh256_post_sfdp_fixups(struct spi_nor *nor)
|
||||
+{
|
||||
+ if (nor->params->hwcaps.mask & SNOR_HWCAPS_READ_1_1_4)
|
||||
+ nor->flags |= SNOR_F_4B_OPCODES;
|
||||
+}
|
||||
+
|
||||
+static const struct spi_nor_fixups en25qh256_fixups = {
|
||||
+ .post_sfdp = en25qh256_post_sfdp_fixups,
|
||||
+};
|
||||
+
|
||||
static const struct flash_info eon_parts[] = {
|
||||
/* EON -- en25xxx */
|
||||
{ "en25f32", INFO(0x1c3116, 0, 64 * 1024, 64, SECT_4K) },
|
||||
@@ -23,7 +33,9 @@ static const struct flash_info eon_parts
|
||||
{ "en25qh64", INFO(0x1c7017, 0, 64 * 1024, 128,
|
||||
SECT_4K | SPI_NOR_DUAL_READ) },
|
||||
{ "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) },
|
||||
- { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) },
|
||||
+ { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512,
|
||||
+ SPI_NOR_DUAL_READ)
|
||||
+ .fixups = &en25qh256_fixups },
|
||||
{ "en25s64", INFO(0x1c3817, 0, 64 * 1024, 128, SECT_4K) },
|
||||
};
|
||||
|
||||
@ -0,0 +1,267 @@
|
||||
From fd3bb8f54a88107570334c156efb0c724a261003 Mon Sep 17 00:00:00 2001
|
||||
From: Evan Green <evgreen@chromium.org>
|
||||
Date: Fri, 27 Nov 2020 10:28:34 +0000
|
||||
Subject: [PATCH] nvmem: core: Add support for keepout regions
|
||||
|
||||
Introduce support into the nvmem core for arrays of register ranges
|
||||
that should not result in actual device access. For these regions a
|
||||
constant byte (repeated) is returned instead on read, and writes are
|
||||
quietly ignored and returned as successful.
|
||||
|
||||
This is useful for instance if certain efuse regions are protected
|
||||
from access by Linux because they contain secret info to another part
|
||||
of the system (like an integrated modem).
|
||||
|
||||
Signed-off-by: Evan Green <evgreen@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20201127102837.19366-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 153 ++++++++++++++++++++++++++++++++-
|
||||
include/linux/nvmem-provider.h | 17 ++++
|
||||
2 files changed, 166 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -34,6 +34,8 @@ struct nvmem_device {
|
||||
struct bin_attribute eeprom;
|
||||
struct device *base_dev;
|
||||
struct list_head cells;
|
||||
+ const struct nvmem_keepout *keepout;
|
||||
+ unsigned int nkeepout;
|
||||
nvmem_reg_read_t reg_read;
|
||||
nvmem_reg_write_t reg_write;
|
||||
struct gpio_desc *wp_gpio;
|
||||
@@ -66,8 +68,8 @@ static LIST_HEAD(nvmem_lookup_list);
|
||||
|
||||
static BLOCKING_NOTIFIER_HEAD(nvmem_notifier);
|
||||
|
||||
-static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
|
||||
- void *val, size_t bytes)
|
||||
+static int __nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
|
||||
+ void *val, size_t bytes)
|
||||
{
|
||||
if (nvmem->reg_read)
|
||||
return nvmem->reg_read(nvmem->priv, offset, val, bytes);
|
||||
@@ -75,8 +77,8 @@ static int nvmem_reg_read(struct nvmem_d
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
-static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
|
||||
- void *val, size_t bytes)
|
||||
+static int __nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
|
||||
+ void *val, size_t bytes)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -90,6 +92,88 @@ static int nvmem_reg_write(struct nvmem_
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+static int nvmem_access_with_keepouts(struct nvmem_device *nvmem,
|
||||
+ unsigned int offset, void *val,
|
||||
+ size_t bytes, int write)
|
||||
+{
|
||||
+
|
||||
+ unsigned int end = offset + bytes;
|
||||
+ unsigned int kend, ksize;
|
||||
+ const struct nvmem_keepout *keepout = nvmem->keepout;
|
||||
+ const struct nvmem_keepout *keepoutend = keepout + nvmem->nkeepout;
|
||||
+ int rc;
|
||||
+
|
||||
+ /*
|
||||
+ * Skip all keepouts before the range being accessed.
|
||||
+ * Keepouts are sorted.
|
||||
+ */
|
||||
+ while ((keepout < keepoutend) && (keepout->end <= offset))
|
||||
+ keepout++;
|
||||
+
|
||||
+ while ((offset < end) && (keepout < keepoutend)) {
|
||||
+ /* Access the valid portion before the keepout. */
|
||||
+ if (offset < keepout->start) {
|
||||
+ kend = min(end, keepout->start);
|
||||
+ ksize = kend - offset;
|
||||
+ if (write)
|
||||
+ rc = __nvmem_reg_write(nvmem, offset, val, ksize);
|
||||
+ else
|
||||
+ rc = __nvmem_reg_read(nvmem, offset, val, ksize);
|
||||
+
|
||||
+ if (rc)
|
||||
+ return rc;
|
||||
+
|
||||
+ offset += ksize;
|
||||
+ val += ksize;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Now we're aligned to the start of this keepout zone. Go
|
||||
+ * through it.
|
||||
+ */
|
||||
+ kend = min(end, keepout->end);
|
||||
+ ksize = kend - offset;
|
||||
+ if (!write)
|
||||
+ memset(val, keepout->value, ksize);
|
||||
+
|
||||
+ val += ksize;
|
||||
+ offset += ksize;
|
||||
+ keepout++;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * If we ran out of keepouts but there's still stuff to do, send it
|
||||
+ * down directly
|
||||
+ */
|
||||
+ if (offset < end) {
|
||||
+ ksize = end - offset;
|
||||
+ if (write)
|
||||
+ return __nvmem_reg_write(nvmem, offset, val, ksize);
|
||||
+ else
|
||||
+ return __nvmem_reg_read(nvmem, offset, val, ksize);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
|
||||
+ void *val, size_t bytes)
|
||||
+{
|
||||
+ if (!nvmem->nkeepout)
|
||||
+ return __nvmem_reg_read(nvmem, offset, val, bytes);
|
||||
+
|
||||
+ return nvmem_access_with_keepouts(nvmem, offset, val, bytes, false);
|
||||
+}
|
||||
+
|
||||
+static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
|
||||
+ void *val, size_t bytes)
|
||||
+{
|
||||
+ if (!nvmem->nkeepout)
|
||||
+ return __nvmem_reg_write(nvmem, offset, val, bytes);
|
||||
+
|
||||
+ return nvmem_access_with_keepouts(nvmem, offset, val, bytes, true);
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_NVMEM_SYSFS
|
||||
static const char * const nvmem_type_str[] = {
|
||||
[NVMEM_TYPE_UNKNOWN] = "Unknown",
|
||||
@@ -535,6 +619,59 @@ nvmem_find_cell_by_name(struct nvmem_dev
|
||||
return cell;
|
||||
}
|
||||
|
||||
+static int nvmem_validate_keepouts(struct nvmem_device *nvmem)
|
||||
+{
|
||||
+ unsigned int cur = 0;
|
||||
+ const struct nvmem_keepout *keepout = nvmem->keepout;
|
||||
+ const struct nvmem_keepout *keepoutend = keepout + nvmem->nkeepout;
|
||||
+
|
||||
+ while (keepout < keepoutend) {
|
||||
+ /* Ensure keepouts are sorted and don't overlap. */
|
||||
+ if (keepout->start < cur) {
|
||||
+ dev_err(&nvmem->dev,
|
||||
+ "Keepout regions aren't sorted or overlap.\n");
|
||||
+
|
||||
+ return -ERANGE;
|
||||
+ }
|
||||
+
|
||||
+ if (keepout->end < keepout->start) {
|
||||
+ dev_err(&nvmem->dev,
|
||||
+ "Invalid keepout region.\n");
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Validate keepouts (and holes between) don't violate
|
||||
+ * word_size constraints.
|
||||
+ */
|
||||
+ if ((keepout->end - keepout->start < nvmem->word_size) ||
|
||||
+ ((keepout->start != cur) &&
|
||||
+ (keepout->start - cur < nvmem->word_size))) {
|
||||
+
|
||||
+ dev_err(&nvmem->dev,
|
||||
+ "Keepout regions violate word_size constraints.\n");
|
||||
+
|
||||
+ return -ERANGE;
|
||||
+ }
|
||||
+
|
||||
+ /* Validate keepouts don't violate stride (alignment). */
|
||||
+ if (!IS_ALIGNED(keepout->start, nvmem->stride) ||
|
||||
+ !IS_ALIGNED(keepout->end, nvmem->stride)) {
|
||||
+
|
||||
+ dev_err(&nvmem->dev,
|
||||
+ "Keepout regions violate stride.\n");
|
||||
+
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ cur = keepout->end;
|
||||
+ keepout++;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
|
||||
{
|
||||
struct device_node *parent, *child;
|
||||
@@ -655,6 +792,8 @@ struct nvmem_device *nvmem_register(cons
|
||||
nvmem->type = config->type;
|
||||
nvmem->reg_read = config->reg_read;
|
||||
nvmem->reg_write = config->reg_write;
|
||||
+ nvmem->keepout = config->keepout;
|
||||
+ nvmem->nkeepout = config->nkeepout;
|
||||
if (!config->no_of_node)
|
||||
nvmem->dev.of_node = config->dev->of_node;
|
||||
|
||||
@@ -679,6 +818,12 @@ struct nvmem_device *nvmem_register(cons
|
||||
nvmem->dev.groups = nvmem_dev_groups;
|
||||
#endif
|
||||
|
||||
+ if (nvmem->nkeepout) {
|
||||
+ rval = nvmem_validate_keepouts(nvmem);
|
||||
+ if (rval)
|
||||
+ goto err_put_device;
|
||||
+ }
|
||||
+
|
||||
dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
|
||||
|
||||
rval = device_register(&nvmem->dev);
|
||||
--- a/include/linux/nvmem-provider.h
|
||||
+++ b/include/linux/nvmem-provider.h
|
||||
@@ -31,6 +31,19 @@ enum nvmem_type {
|
||||
#define NVMEM_DEVID_AUTO (-2)
|
||||
|
||||
/**
|
||||
+ * struct nvmem_keepout - NVMEM register keepout range.
|
||||
+ *
|
||||
+ * @start: The first byte offset to avoid.
|
||||
+ * @end: One beyond the last byte offset to avoid.
|
||||
+ * @value: The byte to fill reads with for this region.
|
||||
+ */
|
||||
+struct nvmem_keepout {
|
||||
+ unsigned int start;
|
||||
+ unsigned int end;
|
||||
+ unsigned char value;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
* struct nvmem_config - NVMEM device configuration
|
||||
*
|
||||
* @dev: Parent device.
|
||||
@@ -39,6 +52,8 @@ enum nvmem_type {
|
||||
* @owner: Pointer to exporter module. Used for refcounting.
|
||||
* @cells: Optional array of pre-defined NVMEM cells.
|
||||
* @ncells: Number of elements in cells.
|
||||
+ * @keepout: Optional array of keepout ranges (sorted ascending by start).
|
||||
+ * @nkeepout: Number of elements in the keepout array.
|
||||
* @type: Type of the nvmem storage
|
||||
* @read_only: Device is read-only.
|
||||
* @root_only: Device is accessibly to root only.
|
||||
@@ -66,6 +81,8 @@ struct nvmem_config {
|
||||
struct gpio_desc *wp_gpio;
|
||||
const struct nvmem_cell_info *cells;
|
||||
int ncells;
|
||||
+ const struct nvmem_keepout *keepout;
|
||||
+ unsigned int nkeepout;
|
||||
enum nvmem_type type;
|
||||
bool read_only;
|
||||
bool root_only;
|
||||
@ -0,0 +1,87 @@
|
||||
From 044ee8f85267599a9b0112911f5c16d4548b4289 Mon Sep 17 00:00:00 2001
|
||||
From: Evan Green <evgreen@chromium.org>
|
||||
Date: Fri, 27 Nov 2020 10:28:36 +0000
|
||||
Subject: [PATCH] nvmem: qfprom: Don't touch certain fuses
|
||||
|
||||
Some fuse ranges are protected by the XPU such that the AP cannot
|
||||
access them. Attempting to do so causes an SError. Use the newly
|
||||
introduced per-soc compatible string, and the newly introduced
|
||||
nvmem keepout support to attach the set of regions
|
||||
we should not access.
|
||||
|
||||
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Evan Green <evgreen@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20201127102837.19366-5-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 30 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/nvmem-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/property.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
/* Blow timer clock frequency in Mhz */
|
||||
@@ -89,6 +90,28 @@ struct qfprom_touched_values {
|
||||
};
|
||||
|
||||
/**
|
||||
+ * struct qfprom_soc_compatible_data - Data matched against the SoC
|
||||
+ * compatible string.
|
||||
+ *
|
||||
+ * @keepout: Array of keepout regions for this SoC.
|
||||
+ * @nkeepout: Number of elements in the keepout array.
|
||||
+ */
|
||||
+struct qfprom_soc_compatible_data {
|
||||
+ const struct nvmem_keepout *keepout;
|
||||
+ unsigned int nkeepout;
|
||||
+};
|
||||
+
|
||||
+static const struct nvmem_keepout sc7180_qfprom_keepout[] = {
|
||||
+ {.start = 0x128, .end = 0x148},
|
||||
+ {.start = 0x220, .end = 0x228}
|
||||
+};
|
||||
+
|
||||
+static const struct qfprom_soc_compatible_data sc7180_qfprom = {
|
||||
+ .keepout = sc7180_qfprom_keepout,
|
||||
+ .nkeepout = ARRAY_SIZE(sc7180_qfprom_keepout)
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
* qfprom_disable_fuse_blowing() - Undo enabling of fuse blowing.
|
||||
* @priv: Our driver data.
|
||||
* @old: The data that was stashed from before fuse blowing.
|
||||
@@ -302,6 +325,7 @@ static int qfprom_probe(struct platform_
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
struct nvmem_device *nvmem;
|
||||
+ const struct qfprom_soc_compatible_data *soc_data;
|
||||
struct qfprom_priv *priv;
|
||||
int ret;
|
||||
|
||||
@@ -320,6 +344,11 @@ static int qfprom_probe(struct platform_
|
||||
econfig.priv = priv;
|
||||
|
||||
priv->dev = dev;
|
||||
+ soc_data = device_get_match_data(dev);
|
||||
+ if (soc_data) {
|
||||
+ econfig.keepout = soc_data->keepout;
|
||||
+ econfig.nkeepout = soc_data->nkeepout;
|
||||
+ }
|
||||
|
||||
/*
|
||||
* If more than one region is provided then the OS has the ability
|
||||
@@ -375,6 +404,7 @@ static int qfprom_probe(struct platform_
|
||||
|
||||
static const struct of_device_id qfprom_of_match[] = {
|
||||
{ .compatible = "qcom,qfprom",},
|
||||
+ { .compatible = "qcom,sc7180-qfprom", .data = &sc7180_qfprom},
|
||||
{/* sentinel */},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, qfprom_of_match);
|
||||
@ -0,0 +1,105 @@
|
||||
From 3311bf18467272388039922a5e29c4925b291f73 Mon Sep 17 00:00:00 2001
|
||||
From: Peng Fan <peng.fan@nxp.com>
|
||||
Date: Fri, 27 Nov 2020 10:28:37 +0000
|
||||
Subject: [PATCH] nvmem: imx-ocotp: add support for the unaliged word count
|
||||
|
||||
When offset is not 4 bytes aligned, directly shift righty by 2 bits
|
||||
will cause reading out wrong data. Since imx ocotp only supports
|
||||
4 bytes reading once, we need handle offset is not 4 bytes aligned
|
||||
and enlarge the bytes to 4 bytes aligned. After reading finished,
|
||||
copy the needed data from buffer to caller and free buffer.
|
||||
|
||||
Signed-off-by: Peng Fan <peng.fan@nxp.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20201127102837.19366-6-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/imx-ocotp.c | 30 ++++++++++++++++++++++++------
|
||||
1 file changed, 24 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/imx-ocotp.c
|
||||
+++ b/drivers/nvmem/imx-ocotp.c
|
||||
@@ -4,6 +4,8 @@
|
||||
*
|
||||
* Copyright (c) 2015 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de>
|
||||
*
|
||||
+ * Copyright 2019 NXP
|
||||
+ *
|
||||
* Based on the barebox ocotp driver,
|
||||
* Copyright (c) 2010 Baruch Siach <baruch@tkos.co.il>,
|
||||
* Orex Computed Radiography
|
||||
@@ -158,22 +160,30 @@ static int imx_ocotp_read(void *context,
|
||||
{
|
||||
struct ocotp_priv *priv = context;
|
||||
unsigned int count;
|
||||
- u32 *buf = val;
|
||||
+ u8 *buf, *p;
|
||||
int i, ret;
|
||||
- u32 index;
|
||||
+ u32 index, num_bytes;
|
||||
|
||||
index = offset >> 2;
|
||||
- count = bytes >> 2;
|
||||
+ num_bytes = round_up((offset % 4) + bytes, 4);
|
||||
+ count = num_bytes >> 2;
|
||||
|
||||
if (count > (priv->params->nregs - index))
|
||||
count = priv->params->nregs - index;
|
||||
|
||||
+ p = kzalloc(num_bytes, GFP_KERNEL);
|
||||
+ if (!p)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
mutex_lock(&ocotp_mutex);
|
||||
|
||||
+ buf = p;
|
||||
+
|
||||
ret = clk_prepare_enable(priv->clk);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&ocotp_mutex);
|
||||
dev_err(priv->dev, "failed to prepare/enable ocotp clk\n");
|
||||
+ kfree(p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -184,7 +194,7 @@ static int imx_ocotp_read(void *context,
|
||||
}
|
||||
|
||||
for (i = index; i < (index + count); i++) {
|
||||
- *buf++ = readl(priv->base + IMX_OCOTP_OFFSET_B0W0 +
|
||||
+ *(u32 *)buf = readl(priv->base + IMX_OCOTP_OFFSET_B0W0 +
|
||||
i * IMX_OCOTP_OFFSET_PER_WORD);
|
||||
|
||||
/* 47.3.1.2
|
||||
@@ -193,13 +203,21 @@ static int imx_ocotp_read(void *context,
|
||||
* software before any new write, read or reload access can be
|
||||
* issued
|
||||
*/
|
||||
- if (*(buf - 1) == IMX_OCOTP_READ_LOCKED_VAL)
|
||||
+ if (*((u32 *)buf) == IMX_OCOTP_READ_LOCKED_VAL)
|
||||
imx_ocotp_clr_err_if_set(priv);
|
||||
+
|
||||
+ buf += 4;
|
||||
}
|
||||
|
||||
+ index = offset % 4;
|
||||
+ memcpy(val, &p[index], bytes);
|
||||
+
|
||||
read_end:
|
||||
clk_disable_unprepare(priv->clk);
|
||||
mutex_unlock(&ocotp_mutex);
|
||||
+
|
||||
+ kfree(p);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -447,7 +465,7 @@ static struct nvmem_config imx_ocotp_nvm
|
||||
.name = "imx-ocotp",
|
||||
.read_only = false,
|
||||
.word_size = 4,
|
||||
- .stride = 4,
|
||||
+ .stride = 1,
|
||||
.reg_read = imx_ocotp_read,
|
||||
.reg_write = imx_ocotp_write,
|
||||
};
|
||||
@ -0,0 +1,41 @@
|
||||
From 579db09c6106977c0496f2cca48606b289df4bdf Mon Sep 17 00:00:00 2001
|
||||
From: Fabio Estevam <festevam@gmail.com>
|
||||
Date: Fri, 29 Jan 2021 17:14:27 +0000
|
||||
Subject: [PATCH] nvmem: imx-iim: Use of_device_get_match_data()
|
||||
|
||||
The retrieval of driver data via of_device_get_match_data() can make
|
||||
the code simpler.
|
||||
|
||||
Use of_device_get_match_data() to simplify the code.
|
||||
|
||||
Signed-off-by: Fabio Estevam <festevam@gmail.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210129171430.11328-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/imx-iim.c | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/imx-iim.c
|
||||
+++ b/drivers/nvmem/imx-iim.c
|
||||
@@ -96,7 +96,6 @@ MODULE_DEVICE_TABLE(of, imx_iim_dt_ids);
|
||||
|
||||
static int imx_iim_probe(struct platform_device *pdev)
|
||||
{
|
||||
- const struct of_device_id *of_id;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct iim_priv *iim;
|
||||
struct nvmem_device *nvmem;
|
||||
@@ -111,11 +110,7 @@ static int imx_iim_probe(struct platform
|
||||
if (IS_ERR(iim->base))
|
||||
return PTR_ERR(iim->base);
|
||||
|
||||
- of_id = of_match_device(imx_iim_dt_ids, dev);
|
||||
- if (!of_id)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- drvdata = of_id->data;
|
||||
+ drvdata = of_device_get_match_data(&pdev->dev);
|
||||
|
||||
iim->clk = devm_clk_get(dev, NULL);
|
||||
if (IS_ERR(iim->clk))
|
||||
@ -0,0 +1,160 @@
|
||||
From 5a3fa75a4d9cb6bcfc9081ef224a4cdcd4b3eafe Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Date: Fri, 29 Jan 2021 17:14:29 +0000
|
||||
Subject: [PATCH] nvmem: Add driver to expose reserved memory as nvmem
|
||||
|
||||
Firmware/co-processors might use reserved memory areas in order to pass
|
||||
data stemming from an nvmem device otherwise non accessible to Linux.
|
||||
For example an EEPROM memory only physically accessible to firmware, or
|
||||
data only accessible early at boot time.
|
||||
|
||||
In order to expose this data to other drivers and user-space, the driver
|
||||
models the reserved memory area as an nvmem device.
|
||||
|
||||
Tested-by: Tim Gover <tim.gover@raspberrypi.com>
|
||||
Reviewed-by: Rob Herring <robh@kernel.org>
|
||||
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210129171430.11328-5-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 8 ++++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/rmem.c | 97 ++++++++++++++++++++++++++++++++++++++++++
|
||||
drivers/of/platform.c | 1 +
|
||||
4 files changed, 108 insertions(+)
|
||||
create mode 100644 drivers/nvmem/rmem.c
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -270,4 +270,12 @@ config SPRD_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-sprd-efuse.
|
||||
|
||||
+config NVMEM_RMEM
|
||||
+ tristate "Reserved Memory Based Driver Support"
|
||||
+ help
|
||||
+ This drivers maps reserved memory into an nvmem device. It might be
|
||||
+ useful to expose information left by firmware in memory.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-rmem.
|
||||
endif
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -55,3 +55,5 @@ obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynq
|
||||
nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||
obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||
nvmem_sprd_efuse-y := sprd-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||
+nvmem-rmem-y := rmem.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/nvmem/rmem.c
|
||||
@@ -0,0 +1,97 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0+
|
||||
+/*
|
||||
+ * Copyright (C) 2020 Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/nvmem-provider.h>
|
||||
+#include <linux/of_reserved_mem.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+struct rmem {
|
||||
+ struct device *dev;
|
||||
+ struct nvmem_device *nvmem;
|
||||
+ struct reserved_mem *mem;
|
||||
+
|
||||
+ phys_addr_t size;
|
||||
+};
|
||||
+
|
||||
+static int rmem_read(void *context, unsigned int offset,
|
||||
+ void *val, size_t bytes)
|
||||
+{
|
||||
+ struct rmem *priv = context;
|
||||
+ size_t available = priv->mem->size;
|
||||
+ loff_t off = offset;
|
||||
+ void *addr;
|
||||
+ int count;
|
||||
+
|
||||
+ /*
|
||||
+ * Only map the reserved memory at this point to avoid potential rogue
|
||||
+ * kernel threads inadvertently modifying it. Based on the current
|
||||
+ * uses-cases for this driver, the performance hit isn't a concern.
|
||||
+ * Nor is likely to be, given the nature of the subsystem. Most nvmem
|
||||
+ * devices operate over slow buses to begin with.
|
||||
+ *
|
||||
+ * An alternative would be setting the memory as RO, set_memory_ro(),
|
||||
+ * but as of Dec 2020 this isn't possible on arm64.
|
||||
+ */
|
||||
+ addr = memremap(priv->mem->base, available, MEMREMAP_WB);
|
||||
+ if (IS_ERR(addr)) {
|
||||
+ dev_err(priv->dev, "Failed to remap memory region\n");
|
||||
+ return PTR_ERR(addr);
|
||||
+ }
|
||||
+
|
||||
+ count = memory_read_from_buffer(val, bytes, &off, addr, available);
|
||||
+
|
||||
+ memunmap(addr);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static int rmem_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct nvmem_config config = { };
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct reserved_mem *mem;
|
||||
+ struct rmem *priv;
|
||||
+
|
||||
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+ priv->dev = dev;
|
||||
+
|
||||
+ mem = of_reserved_mem_lookup(dev->of_node);
|
||||
+ if (!mem) {
|
||||
+ dev_err(dev, "Failed to lookup reserved memory\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ priv->mem = mem;
|
||||
+
|
||||
+ config.dev = dev;
|
||||
+ config.priv = priv;
|
||||
+ config.name = "rmem";
|
||||
+ config.size = mem->size;
|
||||
+ config.reg_read = rmem_read;
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &config));
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id rmem_match[] = {
|
||||
+ { .compatible = "nvmem-rmem", },
|
||||
+ { /* sentinel */ },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rmem_match);
|
||||
+
|
||||
+static struct platform_driver rmem_driver = {
|
||||
+ .probe = rmem_probe,
|
||||
+ .driver = {
|
||||
+ .name = "rmem",
|
||||
+ .of_match_table = rmem_match,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(rmem_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Nicolas Saenz Julienne <nsaenzjulienne@suse.de>");
|
||||
+MODULE_DESCRIPTION("Reserved Memory Based nvmem Driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--- a/drivers/of/platform.c
|
||||
+++ b/drivers/of/platform.c
|
||||
@@ -511,6 +511,7 @@ static const struct of_device_id reserve
|
||||
{ .compatible = "qcom,rmtfs-mem" },
|
||||
{ .compatible = "qcom,cmd-db" },
|
||||
{ .compatible = "ramoops" },
|
||||
+ { .compatible = "nvmem-rmem" },
|
||||
{}
|
||||
};
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
From b31f1eb41c140d7979f855df73064b3a3ae8055a Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Date: Fri, 5 Feb 2021 10:08:52 +0000
|
||||
Subject: [PATCH] nvmem: Kconfig: Correct typo in NVMEM_RMEM
|
||||
|
||||
s/drivers/driver/ as the configuration selects a single driver.
|
||||
|
||||
Suggested-by: Randy Dunlap <rdunlap@infradead.org>
|
||||
Acked-by: Randy Dunlap <rdunlap@infradead.org>
|
||||
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210205100853.32372-2-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -273,7 +273,7 @@ config SPRD_EFUSE
|
||||
config NVMEM_RMEM
|
||||
tristate "Reserved Memory Based Driver Support"
|
||||
help
|
||||
- This drivers maps reserved memory into an nvmem device. It might be
|
||||
+ This driver maps reserved memory into an nvmem device. It might be
|
||||
useful to expose information left by firmware in memory.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
@ -0,0 +1,39 @@
|
||||
From e050f160d4832ce5227fb6ca934969cec0fc48be Mon Sep 17 00:00:00 2001
|
||||
From: Zheng Yongjun <zhengyongjun3@huawei.com>
|
||||
Date: Tue, 30 Mar 2021 12:12:33 +0100
|
||||
Subject: [PATCH] nvmem: convert comma to semicolon
|
||||
|
||||
Replace a comma between expression statements by a semicolon.
|
||||
|
||||
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210330111241.19401-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qcom-spmi-sdam.c | 2 +-
|
||||
drivers/nvmem/snvs_lpgpr.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/qcom-spmi-sdam.c
|
||||
+++ b/drivers/nvmem/qcom-spmi-sdam.c
|
||||
@@ -141,7 +141,7 @@ static int sdam_probe(struct platform_de
|
||||
sdam->sdam_config.dev = &pdev->dev;
|
||||
sdam->sdam_config.name = "spmi_sdam";
|
||||
sdam->sdam_config.id = NVMEM_DEVID_AUTO;
|
||||
- sdam->sdam_config.owner = THIS_MODULE,
|
||||
+ sdam->sdam_config.owner = THIS_MODULE;
|
||||
sdam->sdam_config.stride = 1;
|
||||
sdam->sdam_config.word_size = 1;
|
||||
sdam->sdam_config.reg_read = sdam_read;
|
||||
--- a/drivers/nvmem/snvs_lpgpr.c
|
||||
+++ b/drivers/nvmem/snvs_lpgpr.c
|
||||
@@ -123,7 +123,7 @@ static int snvs_lpgpr_probe(struct platf
|
||||
cfg->dev = dev;
|
||||
cfg->stride = 4;
|
||||
cfg->word_size = 4;
|
||||
- cfg->size = dcfg->size,
|
||||
+ cfg->size = dcfg->size;
|
||||
cfg->owner = THIS_MODULE;
|
||||
cfg->reg_read = snvs_lpgpr_read;
|
||||
cfg->reg_write = snvs_lpgpr_write;
|
||||
@ -1,6 +1,6 @@
|
||||
From b152bbeb0282bfcf6f91d0d5befd7582c1c3fc23 Mon Sep 17 00:00:00 2001
|
||||
From 3fef9ed0627af30753a2404b8bd59d92cdb4c0ce Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 5 Mar 2021 19:32:36 +0100
|
||||
Date: Tue, 30 Mar 2021 12:12:36 +0100
|
||||
Subject: [PATCH] nvmem: brcm_nvram: new driver exposing Broadcom's NVRAM
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
@ -10,6 +10,8 @@ This driver provides access to Broadcom's NVRAM.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210330111241.19401-6-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 9 +++++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
@ -19,10 +21,10 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -283,4 +283,13 @@ config NVMEM_U_BOOT_ENV
|
||||
|
||||
If compiled as module it will be called nvmem_u-boot-env.
|
||||
@@ -278,4 +278,13 @@ config NVMEM_RMEM
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-rmem.
|
||||
+
|
||||
+config NVMEM_BRCM_NVRAM
|
||||
+ tristate "Broadcom's NVRAM support"
|
||||
@ -37,8 +39,8 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -57,3 +57,5 @@ obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_e
|
||||
nvmem_sprd_efuse-y := sprd-efuse.o
|
||||
obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||
nvmem_u-boot-env-y := u-boot-env.o
|
||||
obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||
nvmem-rmem-y := rmem.o
|
||||
+obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||
+nvmem_brcm_nvram-y := brcm_nvram.o
|
||||
--- /dev/null
|
||||
@ -0,0 +1,174 @@
|
||||
From a28e824fb8270eda43fd0f65c2a5fdf33f55c5eb Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Tue, 30 Mar 2021 12:12:37 +0100
|
||||
Subject: [PATCH] nvmem: core: Add functions to make number reading easy
|
||||
|
||||
Sometimes the clients of nvmem just want to get a number out of
|
||||
nvmem. They don't want to think about exactly how many bytes the nvmem
|
||||
cell took up. They just want the number. Let's make it easy.
|
||||
|
||||
In general this concept is useful because nvmem space is precious and
|
||||
usually the fewest bits are allocated that will hold a given value on
|
||||
a given system. However, even though small numbers might be fine on
|
||||
one system that doesn't mean that logically the number couldn't be
|
||||
bigger. Imagine nvmem containing a max frequency for a component. On
|
||||
one system perhaps that fits in 16 bits. On another system it might
|
||||
fit in 32 bits. The code reading this number doesn't care--it just
|
||||
wants the number.
|
||||
|
||||
We'll provide two functions: nvmem_cell_read_variable_le_u32() and
|
||||
nvmem_cell_read_variable_le_u64().
|
||||
|
||||
Comparing these to the existing functions like nvmem_cell_read_u32():
|
||||
* These new functions have no problems if the value was stored in
|
||||
nvmem in fewer bytes. It's OK to use these function as long as the
|
||||
value stored will fit in 32-bits (or 64-bits).
|
||||
* These functions avoid problems that the earlier APIs had with bit
|
||||
offsets. For instance, you can't use nvmem_cell_read_u32() to read a
|
||||
value has nbits=32 and bit_offset=4 because the nvmem cell must be
|
||||
at least 5 bytes big to hold this value. The new API accounts for
|
||||
this and works fine.
|
||||
* These functions make it very explicit that they assume that the
|
||||
number was stored in little endian format. The old functions made
|
||||
this assumption whenever bit_offset was non-zero (see
|
||||
nvmem_shift_read_buffer_in_place()) but didn't whenever the
|
||||
bit_offset was zero.
|
||||
|
||||
NOTE: it's assumed that we don't need an 8-bit or 16-bit version of
|
||||
this function. The 32-bit version of the function can be used to read
|
||||
8-bit or 16-bit data.
|
||||
|
||||
At the moment, I'm only adding the "unsigned" versions of these
|
||||
functions, but if it ends up being useful someone could add a "signed"
|
||||
version that did 2's complement sign extension.
|
||||
|
||||
At the moment, I'm only adding the "little endian" versions of these
|
||||
functions. Adding the "big endian" version would require adding "big
|
||||
endian" support to nvmem_shift_read_buffer_in_place().
|
||||
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210330111241.19401-7-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 95 ++++++++++++++++++++++++++++++++++
|
||||
include/linux/nvmem-consumer.h | 4 ++
|
||||
2 files changed, 99 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -1612,6 +1612,101 @@ int nvmem_cell_read_u64(struct device *d
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_cell_read_u64);
|
||||
|
||||
+static void *nvmem_cell_read_variable_common(struct device *dev,
|
||||
+ const char *cell_id,
|
||||
+ size_t max_len, size_t *len)
|
||||
+{
|
||||
+ struct nvmem_cell *cell;
|
||||
+ int nbits;
|
||||
+ void *buf;
|
||||
+
|
||||
+ cell = nvmem_cell_get(dev, cell_id);
|
||||
+ if (IS_ERR(cell))
|
||||
+ return cell;
|
||||
+
|
||||
+ nbits = cell->nbits;
|
||||
+ buf = nvmem_cell_read(cell, len);
|
||||
+ nvmem_cell_put(cell);
|
||||
+ if (IS_ERR(buf))
|
||||
+ return buf;
|
||||
+
|
||||
+ /*
|
||||
+ * If nbits is set then nvmem_cell_read() can significantly exaggerate
|
||||
+ * the length of the real data. Throw away the extra junk.
|
||||
+ */
|
||||
+ if (nbits)
|
||||
+ *len = DIV_ROUND_UP(nbits, 8);
|
||||
+
|
||||
+ if (*len > max_len) {
|
||||
+ kfree(buf);
|
||||
+ return ERR_PTR(-ERANGE);
|
||||
+ }
|
||||
+
|
||||
+ return buf;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * nvmem_cell_read_variable_le_u32() - Read up to 32-bits of data as a little endian number.
|
||||
+ *
|
||||
+ * @dev: Device that requests the nvmem cell.
|
||||
+ * @cell_id: Name of nvmem cell to read.
|
||||
+ * @val: pointer to output value.
|
||||
+ *
|
||||
+ * Return: 0 on success or negative errno.
|
||||
+ */
|
||||
+int nvmem_cell_read_variable_le_u32(struct device *dev, const char *cell_id,
|
||||
+ u32 *val)
|
||||
+{
|
||||
+ size_t len;
|
||||
+ u8 *buf;
|
||||
+ int i;
|
||||
+
|
||||
+ buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);
|
||||
+ if (IS_ERR(buf))
|
||||
+ return PTR_ERR(buf);
|
||||
+
|
||||
+ /* Copy w/ implicit endian conversion */
|
||||
+ *val = 0;
|
||||
+ for (i = 0; i < len; i++)
|
||||
+ *val |= buf[i] << (8 * i);
|
||||
+
|
||||
+ kfree(buf);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(nvmem_cell_read_variable_le_u32);
|
||||
+
|
||||
+/**
|
||||
+ * nvmem_cell_read_variable_le_u64() - Read up to 64-bits of data as a little endian number.
|
||||
+ *
|
||||
+ * @dev: Device that requests the nvmem cell.
|
||||
+ * @cell_id: Name of nvmem cell to read.
|
||||
+ * @val: pointer to output value.
|
||||
+ *
|
||||
+ * Return: 0 on success or negative errno.
|
||||
+ */
|
||||
+int nvmem_cell_read_variable_le_u64(struct device *dev, const char *cell_id,
|
||||
+ u64 *val)
|
||||
+{
|
||||
+ size_t len;
|
||||
+ u8 *buf;
|
||||
+ int i;
|
||||
+
|
||||
+ buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);
|
||||
+ if (IS_ERR(buf))
|
||||
+ return PTR_ERR(buf);
|
||||
+
|
||||
+ /* Copy w/ implicit endian conversion */
|
||||
+ *val = 0;
|
||||
+ for (i = 0; i < len; i++)
|
||||
+ *val |= buf[i] << (8 * i);
|
||||
+
|
||||
+ kfree(buf);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(nvmem_cell_read_variable_le_u64);
|
||||
+
|
||||
/**
|
||||
* nvmem_device_cell_read() - Read a given nvmem device and cell
|
||||
*
|
||||
--- a/include/linux/nvmem-consumer.h
|
||||
+++ b/include/linux/nvmem-consumer.h
|
||||
@@ -65,6 +65,10 @@ int nvmem_cell_read_u8(struct device *de
|
||||
int nvmem_cell_read_u16(struct device *dev, const char *cell_id, u16 *val);
|
||||
int nvmem_cell_read_u32(struct device *dev, const char *cell_id, u32 *val);
|
||||
int nvmem_cell_read_u64(struct device *dev, const char *cell_id, u64 *val);
|
||||
+int nvmem_cell_read_variable_le_u32(struct device *dev, const char *cell_id,
|
||||
+ u32 *val);
|
||||
+int nvmem_cell_read_variable_le_u64(struct device *dev, const char *cell_id,
|
||||
+ u64 *val);
|
||||
|
||||
/* direct nvmem device read/write interface */
|
||||
struct nvmem_device *nvmem_device_get(struct device *dev, const char *name);
|
||||
@ -0,0 +1,34 @@
|
||||
From 55022fdeace8e432f008787ce03703bdcc9c3ca9 Mon Sep 17 00:00:00 2001
|
||||
From: Colin Ian King <colin.king@canonical.com>
|
||||
Date: Tue, 30 Mar 2021 12:12:38 +0100
|
||||
Subject: [PATCH] nvmem: core: Fix unintentional sign extension issue
|
||||
|
||||
The shifting of the u8 integer buf[3] by 24 bits to the left will
|
||||
be promoted to a 32 bit signed int and then sign-extended to a
|
||||
u64. In the event that the top bit of buf[3] is set then all
|
||||
then all the upper 32 bits of the u64 end up as also being set
|
||||
because of the sign-extension. Fix this by casting buf[i] to
|
||||
a u64 before the shift.
|
||||
|
||||
Fixes: a28e824fb827 ("nvmem: core: Add functions to make number reading easy")
|
||||
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Colin Ian King <colin.king@canonical.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Addresses-Coverity: ("Unintended sign extension")
|
||||
Link: https://lore.kernel.org/r/20210330111241.19401-8-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -1699,7 +1699,7 @@ int nvmem_cell_read_variable_le_u64(stru
|
||||
/* Copy w/ implicit endian conversion */
|
||||
*val = 0;
|
||||
for (i = 0; i < len; i++)
|
||||
- *val |= buf[i] << (8 * i);
|
||||
+ *val |= (uint64_t)buf[i] << (8 * i);
|
||||
|
||||
kfree(buf);
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
From cc1bc56fdc76a55bb8fae9a145a2e60bf22fb129 Mon Sep 17 00:00:00 2001
|
||||
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Date: Tue, 30 Mar 2021 12:12:39 +0100
|
||||
Subject: [PATCH] nvmem: rmem: fix undefined reference to memremap
|
||||
|
||||
Fix below error reporte by kernel test robot
|
||||
rmem.c:(.text+0x14e): undefined reference to memremap
|
||||
s390x-linux-gnu-ld: rmem.c:(.text+0x1b6): undefined reference to memunmap
|
||||
|
||||
Fixes: 5a3fa75a4d9c ("nvmem: Add driver to expose reserved memory as nvmem")
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Reviewed-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210330111241.19401-9-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -272,6 +272,7 @@ config SPRD_EFUSE
|
||||
|
||||
config NVMEM_RMEM
|
||||
tristate "Reserved Memory Based Driver Support"
|
||||
+ depends on HAS_IOMEM
|
||||
help
|
||||
This driver maps reserved memory into an nvmem device. It might be
|
||||
useful to expose information left by firmware in memory.
|
||||
@ -0,0 +1,102 @@
|
||||
From 5a1bea2a2572ce5eb4bdcf432a6929681ee381f2 Mon Sep 17 00:00:00 2001
|
||||
From: Rajendra Nayak <rnayak@codeaurora.org>
|
||||
Date: Tue, 30 Mar 2021 12:12:41 +0100
|
||||
Subject: [PATCH] nvmem: qfprom: Add support for fuse blowing on sc7280
|
||||
|
||||
Handle the differences across LDO voltage needed for blowing fuses,
|
||||
and the blow timer value, identified using a minor version of 15
|
||||
on sc7280.
|
||||
|
||||
Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org>
|
||||
Signed-off-by: Ravi Kumar Bokka <rbokka@codeaurora.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210330111241.19401-11-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 27 +++++++++++++++++++++++++--
|
||||
1 file changed, 25 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -45,11 +45,13 @@ MODULE_PARM_DESC(read_raw_data, "Read ra
|
||||
* @qfprom_blow_timer_value: The timer value of qfprom when doing efuse blow.
|
||||
* @qfprom_blow_set_freq: The frequency required to set when we start the
|
||||
* fuse blowing.
|
||||
+ * @qfprom_blow_uV: LDO voltage to be set when doing efuse blow
|
||||
*/
|
||||
struct qfprom_soc_data {
|
||||
u32 accel_value;
|
||||
u32 qfprom_blow_timer_value;
|
||||
u32 qfprom_blow_set_freq;
|
||||
+ int qfprom_blow_uV;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -111,6 +113,15 @@ static const struct qfprom_soc_compatibl
|
||||
.nkeepout = ARRAY_SIZE(sc7180_qfprom_keepout)
|
||||
};
|
||||
|
||||
+static const struct nvmem_keepout sc7280_qfprom_keepout[] = {
|
||||
+ {.start = 0x128, .end = 0x148},
|
||||
+ {.start = 0x238, .end = 0x248}
|
||||
+};
|
||||
+
|
||||
+static const struct qfprom_soc_compatible_data sc7280_qfprom = {
|
||||
+ .keepout = sc7280_qfprom_keepout,
|
||||
+ .nkeepout = ARRAY_SIZE(sc7280_qfprom_keepout)
|
||||
+};
|
||||
/**
|
||||
* qfprom_disable_fuse_blowing() - Undo enabling of fuse blowing.
|
||||
* @priv: Our driver data.
|
||||
@@ -168,6 +179,7 @@ static int qfprom_enable_fuse_blowing(co
|
||||
struct qfprom_touched_values *old)
|
||||
{
|
||||
int ret;
|
||||
+ int qfprom_blow_uV = priv->soc_data->qfprom_blow_uV;
|
||||
|
||||
ret = clk_prepare_enable(priv->secclk);
|
||||
if (ret) {
|
||||
@@ -187,9 +199,9 @@ static int qfprom_enable_fuse_blowing(co
|
||||
* a rail shared do don't specify a max--regulator constraints
|
||||
* will handle.
|
||||
*/
|
||||
- ret = regulator_set_voltage(priv->vcc, 1800000, INT_MAX);
|
||||
+ ret = regulator_set_voltage(priv->vcc, qfprom_blow_uV, INT_MAX);
|
||||
if (ret) {
|
||||
- dev_err(priv->dev, "Failed to set 1.8 voltage\n");
|
||||
+ dev_err(priv->dev, "Failed to set %duV\n", qfprom_blow_uV);
|
||||
goto err_clk_rate_set;
|
||||
}
|
||||
|
||||
@@ -311,6 +323,14 @@ static const struct qfprom_soc_data qfpr
|
||||
.accel_value = 0xD10,
|
||||
.qfprom_blow_timer_value = 25,
|
||||
.qfprom_blow_set_freq = 4800000,
|
||||
+ .qfprom_blow_uV = 1800000,
|
||||
+};
|
||||
+
|
||||
+static const struct qfprom_soc_data qfprom_7_15_data = {
|
||||
+ .accel_value = 0xD08,
|
||||
+ .qfprom_blow_timer_value = 24,
|
||||
+ .qfprom_blow_set_freq = 4800000,
|
||||
+ .qfprom_blow_uV = 1900000,
|
||||
};
|
||||
|
||||
static int qfprom_probe(struct platform_device *pdev)
|
||||
@@ -379,6 +399,8 @@ static int qfprom_probe(struct platform_
|
||||
|
||||
if (major_version == 7 && minor_version == 8)
|
||||
priv->soc_data = &qfprom_7_8_data;
|
||||
+ if (major_version == 7 && minor_version == 15)
|
||||
+ priv->soc_data = &qfprom_7_15_data;
|
||||
|
||||
priv->vcc = devm_regulator_get(&pdev->dev, "vcc");
|
||||
if (IS_ERR(priv->vcc))
|
||||
@@ -405,6 +427,7 @@ static int qfprom_probe(struct platform_
|
||||
static const struct of_device_id qfprom_of_match[] = {
|
||||
{ .compatible = "qcom,qfprom",},
|
||||
{ .compatible = "qcom,sc7180-qfprom", .data = &sc7180_qfprom},
|
||||
+ { .compatible = "qcom,sc7280-qfprom", .data = &sc7280_qfprom},
|
||||
{/* sentinel */},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, qfprom_of_match);
|
||||
@ -0,0 +1,80 @@
|
||||
From 1333a6779501f4cc662ff5c8b36b0a22f3a7ddc6 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Walle <michael@walle.cc>
|
||||
Date: Sat, 24 Apr 2021 13:06:04 +0200
|
||||
Subject: [PATCH] nvmem: core: allow specifying of_node
|
||||
|
||||
Until now, the of_node of the parent device is used. Some devices
|
||||
provide more than just the nvmem provider. To avoid name space clashes,
|
||||
add a way to allow specifying the nvmem cells in subnodes. Consider the
|
||||
following example:
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
partition@0 {
|
||||
reg = <0x000000 0x010000>;
|
||||
};
|
||||
};
|
||||
|
||||
otp {
|
||||
compatible = "user-otp";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
serial-number@0 {
|
||||
reg = <0x0 0x8>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
There the nvmem provider might be the MTD partition or the OTP region of
|
||||
the flash.
|
||||
|
||||
Add a new config->of_node parameter, which if set, will be used instead
|
||||
of the parent's of_node.
|
||||
|
||||
Signed-off-by: Michael Walle <michael@walle.cc>
|
||||
Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
Link: https://lore.kernel.org/linux-mtd/20210424110608.15748-2-michael@walle.cc
|
||||
---
|
||||
drivers/nvmem/core.c | 4 +++-
|
||||
include/linux/nvmem-provider.h | 2 ++
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -794,7 +794,9 @@ struct nvmem_device *nvmem_register(cons
|
||||
nvmem->reg_write = config->reg_write;
|
||||
nvmem->keepout = config->keepout;
|
||||
nvmem->nkeepout = config->nkeepout;
|
||||
- if (!config->no_of_node)
|
||||
+ if (config->of_node)
|
||||
+ nvmem->dev.of_node = config->of_node;
|
||||
+ else if (!config->no_of_node)
|
||||
nvmem->dev.of_node = config->dev->of_node;
|
||||
|
||||
switch (config->id) {
|
||||
--- a/include/linux/nvmem-provider.h
|
||||
+++ b/include/linux/nvmem-provider.h
|
||||
@@ -57,6 +57,7 @@ struct nvmem_keepout {
|
||||
* @type: Type of the nvmem storage
|
||||
* @read_only: Device is read-only.
|
||||
* @root_only: Device is accessibly to root only.
|
||||
+ * @of_node: If given, this will be used instead of the parent's of_node.
|
||||
* @no_of_node: Device should not use the parent's of_node even if it's !NULL.
|
||||
* @reg_read: Callback to read data.
|
||||
* @reg_write: Callback to write data.
|
||||
@@ -86,6 +87,7 @@ struct nvmem_config {
|
||||
enum nvmem_type type;
|
||||
bool read_only;
|
||||
bool root_only;
|
||||
+ struct device_node *of_node;
|
||||
bool no_of_node;
|
||||
nvmem_reg_read_t reg_read;
|
||||
nvmem_reg_write_t reg_write;
|
||||
@ -0,0 +1,30 @@
|
||||
From 20be064ec864086bca7a4eb62c772a397b44afb7 Mon Sep 17 00:00:00 2001
|
||||
From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Date: Fri, 7 May 2021 19:02:48 +0200
|
||||
Subject: [PATCH] nvmem: sprd: Fix an error message
|
||||
|
||||
'ret' is known to be 0 here.
|
||||
The expected error status is stored in 'status', so use it instead.
|
||||
|
||||
Also change %d in %u, because status is an u32, not a int.
|
||||
|
||||
Fixes: 096030e7f449 ("nvmem: sprd: Add Spreadtrum SoCs eFuse support")
|
||||
Acked-by: Chunyan Zhang <zhang.lyra@gmail.com>
|
||||
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
||||
Link: https://lore.kernel.org/r/5bc44aace2fe7e1c91d8b35c8fe31e7134ceab2c.1620406852.git.christophe.jaillet@wanadoo.fr
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/sprd-efuse.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/sprd-efuse.c
|
||||
+++ b/drivers/nvmem/sprd-efuse.c
|
||||
@@ -234,7 +234,7 @@ static int sprd_efuse_raw_prog(struct sp
|
||||
status = readl(efuse->base + SPRD_EFUSE_ERR_FLAG);
|
||||
if (status) {
|
||||
dev_err(efuse->dev,
|
||||
- "write error status %d of block %d\n", ret, blk);
|
||||
+ "write error status %u of block %d\n", status, blk);
|
||||
|
||||
writel(SPRD_EFUSE_ERR_CLR_MASK,
|
||||
efuse->base + SPRD_EFUSE_ERR_CLR);
|
||||
@ -0,0 +1,27 @@
|
||||
From 78a005a22d5608b266eafa011b093a33284c52ce Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Fri, 11 Jun 2021 09:33:45 +0100
|
||||
Subject: [PATCH] nvmem: sunxi_sid: Set type to OTP
|
||||
|
||||
This device currently reports an "Unknown" type in sysfs.
|
||||
Since it is an eFuse hardware device, set its type to OTP.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Acked-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210611083348.20170-7-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/sunxi_sid.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/nvmem/sunxi_sid.c
|
||||
+++ b/drivers/nvmem/sunxi_sid.c
|
||||
@@ -142,6 +142,7 @@ static int sunxi_sid_probe(struct platfo
|
||||
|
||||
nvmem_cfg->dev = dev;
|
||||
nvmem_cfg->name = "sunxi-sid";
|
||||
+ nvmem_cfg->type = NVMEM_TYPE_OTP;
|
||||
nvmem_cfg->read_only = true;
|
||||
nvmem_cfg->size = cfg->size;
|
||||
nvmem_cfg->word_size = 1;
|
||||
@ -0,0 +1,46 @@
|
||||
From c813bb37bd32cb967060a2c573fae4ea518d32eb Mon Sep 17 00:00:00 2001
|
||||
From: Rajendra Nayak <rnayak@codeaurora.org>
|
||||
Date: Fri, 11 Jun 2021 09:33:46 +0100
|
||||
Subject: [PATCH] nvmem: qfprom: minor nit fixes
|
||||
|
||||
Fix a missed newline, change an 'if' to 'else if' and update
|
||||
a comment which is stale after the merge of '5a1bea2a: nvmem:
|
||||
qfprom: Add support for fuseblowing on sc7280'
|
||||
|
||||
Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org>
|
||||
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210611083348.20170-8-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -122,6 +122,7 @@ static const struct qfprom_soc_compatibl
|
||||
.keepout = sc7280_qfprom_keepout,
|
||||
.nkeepout = ARRAY_SIZE(sc7280_qfprom_keepout)
|
||||
};
|
||||
+
|
||||
/**
|
||||
* qfprom_disable_fuse_blowing() - Undo enabling of fuse blowing.
|
||||
* @priv: Our driver data.
|
||||
@@ -195,7 +196,7 @@ static int qfprom_enable_fuse_blowing(co
|
||||
}
|
||||
|
||||
/*
|
||||
- * Hardware requires 1.8V min for fuse blowing; this may be
|
||||
+ * Hardware requires a min voltage for fuse blowing; this may be
|
||||
* a rail shared do don't specify a max--regulator constraints
|
||||
* will handle.
|
||||
*/
|
||||
@@ -399,7 +400,7 @@ static int qfprom_probe(struct platform_
|
||||
|
||||
if (major_version == 7 && minor_version == 8)
|
||||
priv->soc_data = &qfprom_7_8_data;
|
||||
- if (major_version == 7 && minor_version == 15)
|
||||
+ else if (major_version == 7 && minor_version == 15)
|
||||
priv->soc_data = &qfprom_7_15_data;
|
||||
|
||||
priv->vcc = devm_regulator_get(&pdev->dev, "vcc");
|
||||
@ -0,0 +1,52 @@
|
||||
From 1f7b4d87874624f4beb25253900a25306a193b8b Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Fri, 11 Jun 2021 09:33:47 +0100
|
||||
Subject: [PATCH] nvmem: core: constify nvmem_cell_read_variable_common()
|
||||
return value
|
||||
|
||||
The caller doesn't modify the memory pointed to by the pointer so it
|
||||
can be const.
|
||||
|
||||
Suggested-by: Stephen Boyd <swboyd@chromium.org>
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210611083348.20170-9-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -1614,9 +1614,9 @@ int nvmem_cell_read_u64(struct device *d
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_cell_read_u64);
|
||||
|
||||
-static void *nvmem_cell_read_variable_common(struct device *dev,
|
||||
- const char *cell_id,
|
||||
- size_t max_len, size_t *len)
|
||||
+static const void *nvmem_cell_read_variable_common(struct device *dev,
|
||||
+ const char *cell_id,
|
||||
+ size_t max_len, size_t *len)
|
||||
{
|
||||
struct nvmem_cell *cell;
|
||||
int nbits;
|
||||
@@ -1660,7 +1660,7 @@ int nvmem_cell_read_variable_le_u32(stru
|
||||
u32 *val)
|
||||
{
|
||||
size_t len;
|
||||
- u8 *buf;
|
||||
+ const u8 *buf;
|
||||
int i;
|
||||
|
||||
buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);
|
||||
@@ -1691,7 +1691,7 @@ int nvmem_cell_read_variable_le_u64(stru
|
||||
u64 *val)
|
||||
{
|
||||
size_t len;
|
||||
- u8 *buf;
|
||||
+ const u8 *buf;
|
||||
int i;
|
||||
|
||||
buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);
|
||||
@ -0,0 +1,33 @@
|
||||
From 989f77e3fdee2e8f414dd1da9b6397d8763d414e Mon Sep 17 00:00:00 2001
|
||||
From: Douglas Anderson <dianders@chromium.org>
|
||||
Date: Fri, 11 Jun 2021 09:33:48 +0100
|
||||
Subject: [PATCH] nvmem: qfprom: Improve the comment about regulator setting
|
||||
|
||||
In review feedback Joe Perches found the existing comment
|
||||
confusing. Let's use something based on the wording proposed by Joe.
|
||||
|
||||
Suggested-by: Joe Perches <joe@perches.com>
|
||||
Signed-off-by: Douglas Anderson <dianders@chromium.org>
|
||||
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210611083348.20170-10-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -196,9 +196,9 @@ static int qfprom_enable_fuse_blowing(co
|
||||
}
|
||||
|
||||
/*
|
||||
- * Hardware requires a min voltage for fuse blowing; this may be
|
||||
- * a rail shared do don't specify a max--regulator constraints
|
||||
- * will handle.
|
||||
+ * Hardware requires a minimum voltage for fuse blowing.
|
||||
+ * This may be a shared rail so don't specify a maximum.
|
||||
+ * Regulator constraints will cap to the actual maximum.
|
||||
*/
|
||||
ret = regulator_set_voltage(priv->vcc, qfprom_blow_uV, INT_MAX);
|
||||
if (ret) {
|
||||
@ -0,0 +1,36 @@
|
||||
From: Rafał Miłecki <rafal@milecki.pl>
|
||||
Subject: [PATCH] nvmem: add NVMEM_TYPE_FRAM
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
---
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -180,6 +180,7 @@ static const char * const nvmem_type_str
|
||||
[NVMEM_TYPE_EEPROM] = "EEPROM",
|
||||
[NVMEM_TYPE_OTP] = "OTP",
|
||||
[NVMEM_TYPE_BATTERY_BACKED] = "Battery backed",
|
||||
+ [NVMEM_TYPE_FRAM] = "FRAM",
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
@@ -361,6 +362,9 @@ static int nvmem_sysfs_setup_compat(stru
|
||||
if (!config->base_dev)
|
||||
return -EINVAL;
|
||||
|
||||
+ if (config->type == NVMEM_TYPE_FRAM)
|
||||
+ bin_attr_nvmem_eeprom_compat.attr.name = "fram";
|
||||
+
|
||||
nvmem->eeprom = bin_attr_nvmem_eeprom_compat;
|
||||
nvmem->eeprom.attr.mode = nvmem_bin_attr_get_umode(nvmem);
|
||||
nvmem->eeprom.size = nvmem->size;
|
||||
--- a/include/linux/nvmem-provider.h
|
||||
+++ b/include/linux/nvmem-provider.h
|
||||
@@ -25,6 +25,7 @@ enum nvmem_type {
|
||||
NVMEM_TYPE_EEPROM,
|
||||
NVMEM_TYPE_OTP,
|
||||
NVMEM_TYPE_BATTERY_BACKED,
|
||||
+ NVMEM_TYPE_FRAM,
|
||||
};
|
||||
|
||||
#define NVMEM_DEVID_NONE (-1)
|
||||
@ -0,0 +1,89 @@
|
||||
From 7b808449f572d07bee840cd9da7e2fe6a1b8f4b5 Mon Sep 17 00:00:00 2001
|
||||
From: Rajendra Nayak <rnayak@codeaurora.org>
|
||||
Date: Fri, 6 Aug 2021 09:59:46 +0100
|
||||
Subject: [PATCH] nvmem: qfprom: sc7280: Handle the additional power-domains
|
||||
vote
|
||||
|
||||
On sc7280, to reliably blow fuses, we need an additional vote
|
||||
on max performance state of 'MX' power-domain.
|
||||
Add support for power-domain performance state voting in the
|
||||
driver.
|
||||
|
||||
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210806085947.22682-4-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -12,6 +12,8 @@
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/nvmem-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/pm_domain.h>
|
||||
+#include <linux/pm_runtime.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
@@ -142,6 +144,9 @@ static void qfprom_disable_fuse_blowing(
|
||||
writel(old->timer_val, priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET);
|
||||
writel(old->accel_val, priv->qfpconf + QFPROM_ACCEL_OFFSET);
|
||||
|
||||
+ dev_pm_genpd_set_performance_state(priv->dev, 0);
|
||||
+ pm_runtime_put(priv->dev);
|
||||
+
|
||||
/*
|
||||
* This may be a shared rail and may be able to run at a lower rate
|
||||
* when we're not blowing fuses. At the moment, the regulator framework
|
||||
@@ -212,6 +217,14 @@ static int qfprom_enable_fuse_blowing(co
|
||||
goto err_clk_rate_set;
|
||||
}
|
||||
|
||||
+ ret = pm_runtime_get_sync(priv->dev);
|
||||
+ if (ret < 0) {
|
||||
+ pm_runtime_put_noidle(priv->dev);
|
||||
+ dev_err(priv->dev, "Failed to enable power-domain\n");
|
||||
+ goto err_reg_enable;
|
||||
+ }
|
||||
+ dev_pm_genpd_set_performance_state(priv->dev, INT_MAX);
|
||||
+
|
||||
old->timer_val = readl(priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET);
|
||||
old->accel_val = readl(priv->qfpconf + QFPROM_ACCEL_OFFSET);
|
||||
writel(priv->soc_data->qfprom_blow_timer_value,
|
||||
@@ -221,6 +234,8 @@ static int qfprom_enable_fuse_blowing(co
|
||||
|
||||
return 0;
|
||||
|
||||
+err_reg_enable:
|
||||
+ regulator_disable(priv->vcc);
|
||||
err_clk_rate_set:
|
||||
clk_set_rate(priv->secclk, old->clk_rate);
|
||||
err_clk_prepared:
|
||||
@@ -320,6 +335,11 @@ static int qfprom_reg_read(void *context
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void qfprom_runtime_disable(void *data)
|
||||
+{
|
||||
+ pm_runtime_disable(data);
|
||||
+}
|
||||
+
|
||||
static const struct qfprom_soc_data qfprom_7_8_data = {
|
||||
.accel_value = 0xD10,
|
||||
.qfprom_blow_timer_value = 25,
|
||||
@@ -420,6 +440,11 @@ static int qfprom_probe(struct platform_
|
||||
econfig.reg_write = qfprom_reg_write;
|
||||
}
|
||||
|
||||
+ pm_runtime_enable(dev);
|
||||
+ ret = devm_add_action_or_reset(dev, qfprom_runtime_disable, dev);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
nvmem = devm_nvmem_register(dev, &econfig);
|
||||
|
||||
return PTR_ERR_OR_ZERO(nvmem);
|
||||
@ -0,0 +1,36 @@
|
||||
From de0534df93474f268486c486ea7e01b44a478026 Mon Sep 17 00:00:00 2001
|
||||
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Date: Fri, 6 Aug 2021 09:59:47 +0100
|
||||
Subject: [PATCH] nvmem: core: fix error handling while validating keepout
|
||||
regions
|
||||
|
||||
Current error path on failure of validating keepout regions is calling
|
||||
put_device, eventhough the device is not even registered at that point.
|
||||
|
||||
Fix this by adding proper error handling of freeing ida and nvmem.
|
||||
|
||||
Fixes: fd3bb8f54a88 ("nvmem: core: Add support for keepout regions")
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210806085947.22682-5-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -826,8 +826,11 @@ struct nvmem_device *nvmem_register(cons
|
||||
|
||||
if (nvmem->nkeepout) {
|
||||
rval = nvmem_validate_keepouts(nvmem);
|
||||
- if (rval)
|
||||
- goto err_put_device;
|
||||
+ if (rval) {
|
||||
+ ida_free(&nvmem_ida, nvmem->id);
|
||||
+ kfree(nvmem);
|
||||
+ return ERR_PTR(rval);
|
||||
+ }
|
||||
}
|
||||
|
||||
dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
|
||||
@ -0,0 +1,191 @@
|
||||
From 3683b761fe3a10ad18515acd5368dd601268cfe5 Mon Sep 17 00:00:00 2001
|
||||
From: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
||||
Date: Tue, 10 Aug 2021 16:30:36 +0100
|
||||
Subject: [PATCH] nvmem: nintendo-otp: Add new driver for the Wii and Wii U OTP
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This OTP is read-only and contains various keys used by the console to
|
||||
decrypt, encrypt or verify various pieces of storage.
|
||||
|
||||
Its size depends on the console, it is 128 bytes on the Wii and
|
||||
1024 bytes on the Wii U (split into eight 128 bytes banks).
|
||||
|
||||
It can be used directly by writing into one register and reading from
|
||||
the other one, without any additional synchronisation.
|
||||
|
||||
This driver was written based on reversed documentation, see:
|
||||
https://wiiubrew.org/wiki/Hardware/OTP
|
||||
|
||||
Tested-by: Jonathan Neuschäfer <j.ne@posteo.net> # on Wii
|
||||
Tested-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> # on Wii U
|
||||
Signed-off-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210810153036.1494-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 11 ++++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/nintendo-otp.c | 124 +++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 137 insertions(+)
|
||||
create mode 100644 drivers/nvmem/nintendo-otp.c
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -107,6 +107,17 @@ config MTK_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called efuse-mtk.
|
||||
|
||||
+config NVMEM_NINTENDO_OTP
|
||||
+ tristate "Nintendo Wii and Wii U OTP Support"
|
||||
+ help
|
||||
+ This is a driver exposing the OTP of a Nintendo Wii or Wii U console.
|
||||
+
|
||||
+ This memory contains common and per-console keys, signatures and
|
||||
+ related data required to access peripherals.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-nintendo-otp.
|
||||
+
|
||||
config QCOM_QFPROM
|
||||
tristate "QCOM QFPROM Support"
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -23,6 +23,8 @@ obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem
|
||||
nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||
obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||
nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||
+nvmem-nintendo-otp-y := nintendo-otp.o
|
||||
obj-$(CONFIG_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||
nvmem_mtk-efuse-y := mtk-efuse.o
|
||||
obj-$(CONFIG_QCOM_QFPROM) += nvmem_qfprom.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/nvmem/nintendo-otp.c
|
||||
@@ -0,0 +1,124 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Nintendo Wii and Wii U OTP driver
|
||||
+ *
|
||||
+ * This is a driver exposing the OTP of a Nintendo Wii or Wii U console.
|
||||
+ *
|
||||
+ * This memory contains common and per-console keys, signatures and
|
||||
+ * related data required to access peripherals.
|
||||
+ *
|
||||
+ * Based on reversed documentation from https://wiiubrew.org/wiki/Hardware/OTP
|
||||
+ *
|
||||
+ * Copyright (C) 2021 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/nvmem-provider.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#define HW_OTPCMD 0
|
||||
+#define HW_OTPDATA 4
|
||||
+#define OTP_READ 0x80000000
|
||||
+#define BANK_SIZE 128
|
||||
+#define WORD_SIZE 4
|
||||
+
|
||||
+struct nintendo_otp_priv {
|
||||
+ void __iomem *regs;
|
||||
+};
|
||||
+
|
||||
+struct nintendo_otp_devtype_data {
|
||||
+ const char *name;
|
||||
+ unsigned int num_banks;
|
||||
+};
|
||||
+
|
||||
+static const struct nintendo_otp_devtype_data hollywood_otp_data = {
|
||||
+ .name = "wii-otp",
|
||||
+ .num_banks = 1,
|
||||
+};
|
||||
+
|
||||
+static const struct nintendo_otp_devtype_data latte_otp_data = {
|
||||
+ .name = "wiiu-otp",
|
||||
+ .num_banks = 8,
|
||||
+};
|
||||
+
|
||||
+static int nintendo_otp_reg_read(void *context,
|
||||
+ unsigned int reg, void *_val, size_t bytes)
|
||||
+{
|
||||
+ struct nintendo_otp_priv *priv = context;
|
||||
+ u32 *val = _val;
|
||||
+ int words = bytes / WORD_SIZE;
|
||||
+ u32 bank, addr;
|
||||
+
|
||||
+ while (words--) {
|
||||
+ bank = (reg / BANK_SIZE) << 8;
|
||||
+ addr = (reg / WORD_SIZE) % (BANK_SIZE / WORD_SIZE);
|
||||
+ iowrite32be(OTP_READ | bank | addr, priv->regs + HW_OTPCMD);
|
||||
+ *val++ = ioread32be(priv->regs + HW_OTPDATA);
|
||||
+ reg += WORD_SIZE;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id nintendo_otp_of_table[] = {
|
||||
+ { .compatible = "nintendo,hollywood-otp", .data = &hollywood_otp_data },
|
||||
+ { .compatible = "nintendo,latte-otp", .data = &latte_otp_data },
|
||||
+ {/* sentinel */},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, nintendo_otp_of_table);
|
||||
+
|
||||
+static int nintendo_otp_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ const struct of_device_id *of_id =
|
||||
+ of_match_device(nintendo_otp_of_table, dev);
|
||||
+ struct resource *res;
|
||||
+ struct nvmem_device *nvmem;
|
||||
+ struct nintendo_otp_priv *priv;
|
||||
+
|
||||
+ struct nvmem_config config = {
|
||||
+ .stride = WORD_SIZE,
|
||||
+ .word_size = WORD_SIZE,
|
||||
+ .reg_read = nintendo_otp_reg_read,
|
||||
+ .read_only = true,
|
||||
+ .root_only = true,
|
||||
+ };
|
||||
+
|
||||
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ priv->regs = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(priv->regs))
|
||||
+ return PTR_ERR(priv->regs);
|
||||
+
|
||||
+ if (of_id->data) {
|
||||
+ const struct nintendo_otp_devtype_data *data = of_id->data;
|
||||
+ config.name = data->name;
|
||||
+ config.size = data->num_banks * BANK_SIZE;
|
||||
+ }
|
||||
+
|
||||
+ config.dev = dev;
|
||||
+ config.priv = priv;
|
||||
+
|
||||
+ nvmem = devm_nvmem_register(dev, &config);
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver nintendo_otp_driver = {
|
||||
+ .probe = nintendo_otp_probe,
|
||||
+ .driver = {
|
||||
+ .name = "nintendo-otp",
|
||||
+ .of_match_table = nintendo_otp_of_table,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(nintendo_otp_driver);
|
||||
+MODULE_AUTHOR("Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>");
|
||||
+MODULE_DESCRIPTION("Nintendo Wii and Wii U OTP driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
@ -0,0 +1,29 @@
|
||||
From 7af526c740bdbd5b4dcebba04ace5b3b0c07801f Mon Sep 17 00:00:00 2001
|
||||
From: Geert Uytterhoeven <geert+renesas@glider.be>
|
||||
Date: Tue, 14 Sep 2021 11:29:49 +0200
|
||||
Subject: [PATCH] nvmem: NVMEM_NINTENDO_OTP should depend on WII
|
||||
|
||||
The Nintendo Wii and Wii U OTP is only present on Nintendo Wii and Wii U
|
||||
consoles. Hence add a dependency on WII, to prevent asking the user
|
||||
about this driver when configuring a kernel without Nintendo Wii and Wii
|
||||
U console support.
|
||||
|
||||
Fixes: 3683b761fe3a10ad ("nvmem: nintendo-otp: Add new driver for the Wii and Wii U OTP")
|
||||
Reviewed-by: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
|
||||
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
|
||||
Link: https://lore.kernel.org/r/01318920709dddc4d85fe895e2083ca0eee234d8.1631611652.git.geert+renesas@glider.be
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -109,6 +109,7 @@ config MTK_EFUSE
|
||||
|
||||
config NVMEM_NINTENDO_OTP
|
||||
tristate "Nintendo Wii and Wii U OTP Support"
|
||||
+ depends on WII || COMPILE_TEST
|
||||
help
|
||||
This is a driver exposing the OTP of a Nintendo Wii or Wii U console.
|
||||
|
||||
@ -0,0 +1,456 @@
|
||||
From 7ae6478b304bc004c3139b422665b0e23b57f05c Mon Sep 17 00:00:00 2001
|
||||
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Date: Wed, 13 Oct 2021 14:19:55 +0100
|
||||
Subject: [PATCH] nvmem: core: rework nvmem cell instance creation
|
||||
|
||||
In the existing design, we do not create a instance per nvmem cell consumer
|
||||
but we directly refer cell from nvmem cell list that are added to provider.
|
||||
|
||||
However this design has some limitations when consumers want to assign name
|
||||
or connection id the nvmem cell instance, ex: via "nvmem-cell-names" or
|
||||
id in nvmem_cell_get(id).
|
||||
|
||||
Having a name associated with nvmem cell consumer instance will help
|
||||
provider drivers in performing post processing of nvmem cell data if required
|
||||
before data is seen by the consumers. This is pretty normal with some vendors
|
||||
storing nvmem cells like mac-address in a vendor specific data layouts that
|
||||
are not directly usable by the consumer drivers.
|
||||
|
||||
With this patch nvmem cell will be created dynamically during nvmem_cell_get
|
||||
and destroyed in nvmem_cell_put, allowing consumers to associate name with
|
||||
nvmem cell consumer instance.
|
||||
|
||||
With this patch a new struct nvmem_cell_entry replaces struct nvmem_cell
|
||||
for storing nvmem cell information within the core.
|
||||
This patch does not change nvmem-consumer interface based on nvmem_cell.
|
||||
|
||||
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20211013131957.30271-2-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 165 +++++++++++++++++++++++++++----------------
|
||||
1 file changed, 105 insertions(+), 60 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -45,8 +45,7 @@ struct nvmem_device {
|
||||
#define to_nvmem_device(d) container_of(d, struct nvmem_device, dev)
|
||||
|
||||
#define FLAG_COMPAT BIT(0)
|
||||
-
|
||||
-struct nvmem_cell {
|
||||
+struct nvmem_cell_entry {
|
||||
const char *name;
|
||||
int offset;
|
||||
int bytes;
|
||||
@@ -57,6 +56,11 @@ struct nvmem_cell {
|
||||
struct list_head node;
|
||||
};
|
||||
|
||||
+struct nvmem_cell {
|
||||
+ struct nvmem_cell_entry *entry;
|
||||
+ const char *id;
|
||||
+};
|
||||
+
|
||||
static DEFINE_MUTEX(nvmem_mutex);
|
||||
static DEFINE_IDA(nvmem_ida);
|
||||
|
||||
@@ -424,7 +428,7 @@ static struct bus_type nvmem_bus_type =
|
||||
.name = "nvmem",
|
||||
};
|
||||
|
||||
-static void nvmem_cell_drop(struct nvmem_cell *cell)
|
||||
+static void nvmem_cell_entry_drop(struct nvmem_cell_entry *cell)
|
||||
{
|
||||
blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
|
||||
mutex_lock(&nvmem_mutex);
|
||||
@@ -437,13 +441,13 @@ static void nvmem_cell_drop(struct nvmem
|
||||
|
||||
static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem)
|
||||
{
|
||||
- struct nvmem_cell *cell, *p;
|
||||
+ struct nvmem_cell_entry *cell, *p;
|
||||
|
||||
list_for_each_entry_safe(cell, p, &nvmem->cells, node)
|
||||
- nvmem_cell_drop(cell);
|
||||
+ nvmem_cell_entry_drop(cell);
|
||||
}
|
||||
|
||||
-static void nvmem_cell_add(struct nvmem_cell *cell)
|
||||
+static void nvmem_cell_entry_add(struct nvmem_cell_entry *cell)
|
||||
{
|
||||
mutex_lock(&nvmem_mutex);
|
||||
list_add_tail(&cell->node, &cell->nvmem->cells);
|
||||
@@ -451,9 +455,9 @@ static void nvmem_cell_add(struct nvmem_
|
||||
blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell);
|
||||
}
|
||||
|
||||
-static int nvmem_cell_info_to_nvmem_cell_nodup(struct nvmem_device *nvmem,
|
||||
- const struct nvmem_cell_info *info,
|
||||
- struct nvmem_cell *cell)
|
||||
+static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem,
|
||||
+ const struct nvmem_cell_info *info,
|
||||
+ struct nvmem_cell_entry *cell)
|
||||
{
|
||||
cell->nvmem = nvmem;
|
||||
cell->offset = info->offset;
|
||||
@@ -477,13 +481,13 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,
|
||||
- const struct nvmem_cell_info *info,
|
||||
- struct nvmem_cell *cell)
|
||||
+static int nvmem_cell_info_to_nvmem_cell_entry(struct nvmem_device *nvmem,
|
||||
+ const struct nvmem_cell_info *info,
|
||||
+ struct nvmem_cell_entry *cell)
|
||||
{
|
||||
int err;
|
||||
|
||||
- err = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, cell);
|
||||
+ err = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, cell);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -507,7 +511,7 @@ static int nvmem_add_cells(struct nvmem_
|
||||
const struct nvmem_cell_info *info,
|
||||
int ncells)
|
||||
{
|
||||
- struct nvmem_cell **cells;
|
||||
+ struct nvmem_cell_entry **cells;
|
||||
int i, rval;
|
||||
|
||||
cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL);
|
||||
@@ -521,13 +525,13 @@ static int nvmem_add_cells(struct nvmem_
|
||||
goto err;
|
||||
}
|
||||
|
||||
- rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]);
|
||||
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]);
|
||||
if (rval) {
|
||||
kfree(cells[i]);
|
||||
goto err;
|
||||
}
|
||||
|
||||
- nvmem_cell_add(cells[i]);
|
||||
+ nvmem_cell_entry_add(cells[i]);
|
||||
}
|
||||
|
||||
/* remove tmp array */
|
||||
@@ -536,7 +540,7 @@ static int nvmem_add_cells(struct nvmem_
|
||||
return 0;
|
||||
err:
|
||||
while (i--)
|
||||
- nvmem_cell_drop(cells[i]);
|
||||
+ nvmem_cell_entry_drop(cells[i]);
|
||||
|
||||
kfree(cells);
|
||||
|
||||
@@ -573,7 +577,7 @@ static int nvmem_add_cells_from_table(st
|
||||
{
|
||||
const struct nvmem_cell_info *info;
|
||||
struct nvmem_cell_table *table;
|
||||
- struct nvmem_cell *cell;
|
||||
+ struct nvmem_cell_entry *cell;
|
||||
int rval = 0, i;
|
||||
|
||||
mutex_lock(&nvmem_cell_mutex);
|
||||
@@ -588,15 +592,13 @@ static int nvmem_add_cells_from_table(st
|
||||
goto out;
|
||||
}
|
||||
|
||||
- rval = nvmem_cell_info_to_nvmem_cell(nvmem,
|
||||
- info,
|
||||
- cell);
|
||||
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, info, cell);
|
||||
if (rval) {
|
||||
kfree(cell);
|
||||
goto out;
|
||||
}
|
||||
|
||||
- nvmem_cell_add(cell);
|
||||
+ nvmem_cell_entry_add(cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -606,10 +608,10 @@ out:
|
||||
return rval;
|
||||
}
|
||||
|
||||
-static struct nvmem_cell *
|
||||
-nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id)
|
||||
+static struct nvmem_cell_entry *
|
||||
+nvmem_find_cell_entry_by_name(struct nvmem_device *nvmem, const char *cell_id)
|
||||
{
|
||||
- struct nvmem_cell *iter, *cell = NULL;
|
||||
+ struct nvmem_cell_entry *iter, *cell = NULL;
|
||||
|
||||
mutex_lock(&nvmem_mutex);
|
||||
list_for_each_entry(iter, &nvmem->cells, node) {
|
||||
@@ -680,7 +682,7 @@ static int nvmem_add_cells_from_of(struc
|
||||
{
|
||||
struct device_node *parent, *child;
|
||||
struct device *dev = &nvmem->dev;
|
||||
- struct nvmem_cell *cell;
|
||||
+ struct nvmem_cell_entry *cell;
|
||||
const __be32 *addr;
|
||||
int len;
|
||||
|
||||
@@ -729,7 +731,7 @@ static int nvmem_add_cells_from_of(struc
|
||||
}
|
||||
|
||||
cell->np = of_node_get(child);
|
||||
- nvmem_cell_add(cell);
|
||||
+ nvmem_cell_entry_add(cell);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1144,9 +1146,33 @@ struct nvmem_device *devm_nvmem_device_g
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
|
||||
|
||||
+static struct nvmem_cell *nvmem_create_cell(struct nvmem_cell_entry *entry, const char *id)
|
||||
+{
|
||||
+ struct nvmem_cell *cell;
|
||||
+ const char *name = NULL;
|
||||
+
|
||||
+ cell = kzalloc(sizeof(*cell), GFP_KERNEL);
|
||||
+ if (!cell)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ if (id) {
|
||||
+ name = kstrdup_const(id, GFP_KERNEL);
|
||||
+ if (!name) {
|
||||
+ kfree(cell);
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ cell->id = name;
|
||||
+ cell->entry = entry;
|
||||
+
|
||||
+ return cell;
|
||||
+}
|
||||
+
|
||||
static struct nvmem_cell *
|
||||
nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
|
||||
{
|
||||
+ struct nvmem_cell_entry *cell_entry;
|
||||
struct nvmem_cell *cell = ERR_PTR(-ENOENT);
|
||||
struct nvmem_cell_lookup *lookup;
|
||||
struct nvmem_device *nvmem;
|
||||
@@ -1171,11 +1197,15 @@ nvmem_cell_get_from_lookup(struct device
|
||||
break;
|
||||
}
|
||||
|
||||
- cell = nvmem_find_cell_by_name(nvmem,
|
||||
- lookup->cell_name);
|
||||
- if (!cell) {
|
||||
+ cell_entry = nvmem_find_cell_entry_by_name(nvmem,
|
||||
+ lookup->cell_name);
|
||||
+ if (!cell_entry) {
|
||||
__nvmem_device_put(nvmem);
|
||||
cell = ERR_PTR(-ENOENT);
|
||||
+ } else {
|
||||
+ cell = nvmem_create_cell(cell_entry, con_id);
|
||||
+ if (IS_ERR(cell))
|
||||
+ __nvmem_device_put(nvmem);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1186,10 +1216,10 @@ nvmem_cell_get_from_lookup(struct device
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF)
|
||||
-static struct nvmem_cell *
|
||||
-nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np)
|
||||
+static struct nvmem_cell_entry *
|
||||
+nvmem_find_cell_entry_by_node(struct nvmem_device *nvmem, struct device_node *np)
|
||||
{
|
||||
- struct nvmem_cell *iter, *cell = NULL;
|
||||
+ struct nvmem_cell_entry *iter, *cell = NULL;
|
||||
|
||||
mutex_lock(&nvmem_mutex);
|
||||
list_for_each_entry(iter, &nvmem->cells, node) {
|
||||
@@ -1219,6 +1249,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
|
||||
{
|
||||
struct device_node *cell_np, *nvmem_np;
|
||||
struct nvmem_device *nvmem;
|
||||
+ struct nvmem_cell_entry *cell_entry;
|
||||
struct nvmem_cell *cell;
|
||||
int index = 0;
|
||||
|
||||
@@ -1239,12 +1270,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
|
||||
if (IS_ERR(nvmem))
|
||||
return ERR_CAST(nvmem);
|
||||
|
||||
- cell = nvmem_find_cell_by_node(nvmem, cell_np);
|
||||
- if (!cell) {
|
||||
+ cell_entry = nvmem_find_cell_entry_by_node(nvmem, cell_np);
|
||||
+ if (!cell_entry) {
|
||||
__nvmem_device_put(nvmem);
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
+ cell = nvmem_create_cell(cell_entry, id);
|
||||
+ if (IS_ERR(cell))
|
||||
+ __nvmem_device_put(nvmem);
|
||||
+
|
||||
return cell;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_nvmem_cell_get);
|
||||
@@ -1350,13 +1385,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
|
||||
*/
|
||||
void nvmem_cell_put(struct nvmem_cell *cell)
|
||||
{
|
||||
- struct nvmem_device *nvmem = cell->nvmem;
|
||||
+ struct nvmem_device *nvmem = cell->entry->nvmem;
|
||||
+
|
||||
+ if (cell->id)
|
||||
+ kfree_const(cell->id);
|
||||
|
||||
+ kfree(cell);
|
||||
__nvmem_device_put(nvmem);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_cell_put);
|
||||
|
||||
-static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
||||
+static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void *buf)
|
||||
{
|
||||
u8 *p, *b;
|
||||
int i, extra, bit_offset = cell->bit_offset;
|
||||
@@ -1390,8 +1429,8 @@ static void nvmem_shift_read_buffer_in_p
|
||||
}
|
||||
|
||||
static int __nvmem_cell_read(struct nvmem_device *nvmem,
|
||||
- struct nvmem_cell *cell,
|
||||
- void *buf, size_t *len)
|
||||
+ struct nvmem_cell_entry *cell,
|
||||
+ void *buf, size_t *len, const char *id)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -1422,18 +1461,18 @@ static int __nvmem_cell_read(struct nvme
|
||||
*/
|
||||
void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
|
||||
{
|
||||
- struct nvmem_device *nvmem = cell->nvmem;
|
||||
+ struct nvmem_device *nvmem = cell->entry->nvmem;
|
||||
u8 *buf;
|
||||
int rc;
|
||||
|
||||
if (!nvmem)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
- buf = kzalloc(cell->bytes, GFP_KERNEL);
|
||||
+ buf = kzalloc(cell->entry->bytes, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
- rc = __nvmem_cell_read(nvmem, cell, buf, len);
|
||||
+ rc = __nvmem_cell_read(nvmem, cell->entry, buf, len, cell->id);
|
||||
if (rc) {
|
||||
kfree(buf);
|
||||
return ERR_PTR(rc);
|
||||
@@ -1443,7 +1482,7 @@ void *nvmem_cell_read(struct nvmem_cell
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_cell_read);
|
||||
|
||||
-static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,
|
||||
+static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell_entry *cell,
|
||||
u8 *_buf, int len)
|
||||
{
|
||||
struct nvmem_device *nvmem = cell->nvmem;
|
||||
@@ -1496,16 +1535,7 @@ err:
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
-/**
|
||||
- * nvmem_cell_write() - Write to a given nvmem cell
|
||||
- *
|
||||
- * @cell: nvmem cell to be written.
|
||||
- * @buf: Buffer to be written.
|
||||
- * @len: length of buffer to be written to nvmem cell.
|
||||
- *
|
||||
- * Return: length of bytes written or negative on failure.
|
||||
- */
|
||||
-int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
|
||||
+static int __nvmem_cell_entry_write(struct nvmem_cell_entry *cell, void *buf, size_t len)
|
||||
{
|
||||
struct nvmem_device *nvmem = cell->nvmem;
|
||||
int rc;
|
||||
@@ -1531,6 +1561,21 @@ int nvmem_cell_write(struct nvmem_cell *
|
||||
|
||||
return len;
|
||||
}
|
||||
+
|
||||
+/**
|
||||
+ * nvmem_cell_write() - Write to a given nvmem cell
|
||||
+ *
|
||||
+ * @cell: nvmem cell to be written.
|
||||
+ * @buf: Buffer to be written.
|
||||
+ * @len: length of buffer to be written to nvmem cell.
|
||||
+ *
|
||||
+ * Return: length of bytes written or negative on failure.
|
||||
+ */
|
||||
+int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
|
||||
+{
|
||||
+ return __nvmem_cell_entry_write(cell->entry, buf, len);
|
||||
+}
|
||||
+
|
||||
EXPORT_SYMBOL_GPL(nvmem_cell_write);
|
||||
|
||||
static int nvmem_cell_read_common(struct device *dev, const char *cell_id,
|
||||
@@ -1633,7 +1678,7 @@ static const void *nvmem_cell_read_varia
|
||||
if (IS_ERR(cell))
|
||||
return cell;
|
||||
|
||||
- nbits = cell->nbits;
|
||||
+ nbits = cell->entry->nbits;
|
||||
buf = nvmem_cell_read(cell, len);
|
||||
nvmem_cell_put(cell);
|
||||
if (IS_ERR(buf))
|
||||
@@ -1729,18 +1774,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
|
||||
ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
|
||||
struct nvmem_cell_info *info, void *buf)
|
||||
{
|
||||
- struct nvmem_cell cell;
|
||||
+ struct nvmem_cell_entry cell;
|
||||
int rc;
|
||||
ssize_t len;
|
||||
|
||||
if (!nvmem)
|
||||
return -EINVAL;
|
||||
|
||||
- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell);
|
||||
+ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
- rc = __nvmem_cell_read(nvmem, &cell, buf, &len);
|
||||
+ rc = __nvmem_cell_read(nvmem, &cell, buf, &len, NULL);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -1760,17 +1805,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
|
||||
int nvmem_device_cell_write(struct nvmem_device *nvmem,
|
||||
struct nvmem_cell_info *info, void *buf)
|
||||
{
|
||||
- struct nvmem_cell cell;
|
||||
+ struct nvmem_cell_entry cell;
|
||||
int rc;
|
||||
|
||||
if (!nvmem)
|
||||
return -EINVAL;
|
||||
|
||||
- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell);
|
||||
+ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
- return nvmem_cell_write(&cell, buf, cell.bytes);
|
||||
+ return __nvmem_cell_entry_write(&cell, buf, cell.bytes);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_device_cell_write);
|
||||
|
||||
@ -0,0 +1,82 @@
|
||||
From 5008062f1c3f5af3acf86164aa6fcc77b0c7bdce Mon Sep 17 00:00:00 2001
|
||||
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Date: Wed, 13 Oct 2021 14:19:56 +0100
|
||||
Subject: [PATCH] nvmem: core: add nvmem cell post processing callback
|
||||
|
||||
Some NVMEM providers have certain nvmem cells encoded, which requires
|
||||
post processing before actually using it.
|
||||
|
||||
For example mac-address is stored in either in ascii or delimited or reverse-order.
|
||||
|
||||
Having a post-process callback hook to provider drivers would enable them to
|
||||
do this vendor specific post processing before nvmem consumers see it.
|
||||
|
||||
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20211013131957.30271-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 9 +++++++++
|
||||
include/linux/nvmem-provider.h | 5 +++++
|
||||
2 files changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -38,6 +38,7 @@ struct nvmem_device {
|
||||
unsigned int nkeepout;
|
||||
nvmem_reg_read_t reg_read;
|
||||
nvmem_reg_write_t reg_write;
|
||||
+ nvmem_cell_post_process_t cell_post_process;
|
||||
struct gpio_desc *wp_gpio;
|
||||
void *priv;
|
||||
};
|
||||
@@ -798,6 +799,7 @@ struct nvmem_device *nvmem_register(cons
|
||||
nvmem->type = config->type;
|
||||
nvmem->reg_read = config->reg_read;
|
||||
nvmem->reg_write = config->reg_write;
|
||||
+ nvmem->cell_post_process = config->cell_post_process;
|
||||
nvmem->keepout = config->keepout;
|
||||
nvmem->nkeepout = config->nkeepout;
|
||||
if (config->of_node)
|
||||
@@ -1443,6 +1445,13 @@ static int __nvmem_cell_read(struct nvme
|
||||
if (cell->bit_offset || cell->nbits)
|
||||
nvmem_shift_read_buffer_in_place(cell, buf);
|
||||
|
||||
+ if (nvmem->cell_post_process) {
|
||||
+ rc = nvmem->cell_post_process(nvmem->priv, id,
|
||||
+ cell->offset, buf, cell->bytes);
|
||||
+ if (rc)
|
||||
+ return rc;
|
||||
+ }
|
||||
+
|
||||
if (len)
|
||||
*len = cell->bytes;
|
||||
|
||||
--- a/include/linux/nvmem-provider.h
|
||||
+++ b/include/linux/nvmem-provider.h
|
||||
@@ -19,6 +19,9 @@ typedef int (*nvmem_reg_read_t)(void *pr
|
||||
void *val, size_t bytes);
|
||||
typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
|
||||
void *val, size_t bytes);
|
||||
+/* used for vendor specific post processing of cell data */
|
||||
+typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, unsigned int offset,
|
||||
+ void *buf, size_t bytes);
|
||||
|
||||
enum nvmem_type {
|
||||
NVMEM_TYPE_UNKNOWN = 0,
|
||||
@@ -62,6 +65,7 @@ struct nvmem_keepout {
|
||||
* @no_of_node: Device should not use the parent's of_node even if it's !NULL.
|
||||
* @reg_read: Callback to read data.
|
||||
* @reg_write: Callback to write data.
|
||||
+ * @cell_post_process: Callback for vendor specific post processing of cell data
|
||||
* @size: Device size.
|
||||
* @word_size: Minimum read/write access granularity.
|
||||
* @stride: Minimum read/write access stride.
|
||||
@@ -92,6 +96,7 @@ struct nvmem_config {
|
||||
bool no_of_node;
|
||||
nvmem_reg_read_t reg_read;
|
||||
nvmem_reg_write_t reg_write;
|
||||
+ nvmem_cell_post_process_t cell_post_process;
|
||||
int size;
|
||||
int word_size;
|
||||
int stride;
|
||||
@ -0,0 +1,92 @@
|
||||
From d0221a780cbc99fec6c27a98dba2828dc5735c00 Mon Sep 17 00:00:00 2001
|
||||
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Date: Wed, 13 Oct 2021 14:19:57 +0100
|
||||
Subject: [PATCH] nvmem: imx-ocotp: add support for post processing
|
||||
|
||||
Add .cell_post_process callback for imx-ocotp to deal with MAC address,
|
||||
since MAC address need to be reversed byte for some i.MX SoCs.
|
||||
|
||||
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20211013131957.30271-4-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/imx-ocotp.c | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/imx-ocotp.c
|
||||
+++ b/drivers/nvmem/imx-ocotp.c
|
||||
@@ -97,6 +97,7 @@ struct ocotp_params {
|
||||
unsigned int bank_address_words;
|
||||
void (*set_timing)(struct ocotp_priv *priv);
|
||||
struct ocotp_ctrl_reg ctrl;
|
||||
+ bool reverse_mac_address;
|
||||
};
|
||||
|
||||
static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags)
|
||||
@@ -221,6 +222,25 @@ read_end:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset,
|
||||
+ void *data, size_t bytes)
|
||||
+{
|
||||
+ struct ocotp_priv *priv = context;
|
||||
+
|
||||
+ /* Deal with some post processing of nvmem cell data */
|
||||
+ if (id && !strcmp(id, "mac-address")) {
|
||||
+ if (priv->params->reverse_mac_address) {
|
||||
+ u8 *buf = data;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < bytes/2; i++)
|
||||
+ swap(buf[i], buf[bytes - i - 1]);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void imx_ocotp_set_imx6_timing(struct ocotp_priv *priv)
|
||||
{
|
||||
unsigned long clk_rate;
|
||||
@@ -468,6 +488,7 @@ static struct nvmem_config imx_ocotp_nvm
|
||||
.stride = 1,
|
||||
.reg_read = imx_ocotp_read,
|
||||
.reg_write = imx_ocotp_write,
|
||||
+ .cell_post_process = imx_ocotp_cell_pp,
|
||||
};
|
||||
|
||||
static const struct ocotp_params imx6q_params = {
|
||||
@@ -530,6 +551,7 @@ static const struct ocotp_params imx8mq_
|
||||
.bank_address_words = 0,
|
||||
.set_timing = imx_ocotp_set_imx6_timing,
|
||||
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||
+ .reverse_mac_address = true,
|
||||
};
|
||||
|
||||
static const struct ocotp_params imx8mm_params = {
|
||||
@@ -537,6 +559,7 @@ static const struct ocotp_params imx8mm_
|
||||
.bank_address_words = 0,
|
||||
.set_timing = imx_ocotp_set_imx6_timing,
|
||||
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||
+ .reverse_mac_address = true,
|
||||
};
|
||||
|
||||
static const struct ocotp_params imx8mn_params = {
|
||||
@@ -544,6 +567,7 @@ static const struct ocotp_params imx8mn_
|
||||
.bank_address_words = 0,
|
||||
.set_timing = imx_ocotp_set_imx6_timing,
|
||||
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||
+ .reverse_mac_address = true,
|
||||
};
|
||||
|
||||
static const struct ocotp_params imx8mp_params = {
|
||||
@@ -551,6 +575,7 @@ static const struct ocotp_params imx8mp_
|
||||
.bank_address_words = 0,
|
||||
.set_timing = imx_ocotp_set_imx6_timing,
|
||||
.ctrl = IMX_OCOTP_BM_CTRL_8MP,
|
||||
+ .reverse_mac_address = true,
|
||||
};
|
||||
|
||||
static const struct of_device_id imx_ocotp_dt_ids[] = {
|
||||
@ -0,0 +1,68 @@
|
||||
From f6c052afe6f802d87c74153b7a57c43b2e9faf07 Mon Sep 17 00:00:00 2001
|
||||
From: Christophe Kerello <christophe.kerello@foss.st.com>
|
||||
Date: Sun, 20 Feb 2022 15:14:31 +0000
|
||||
Subject: [PATCH] nvmem: core: Fix a conflict between MTD and NVMEM on wp-gpios
|
||||
property
|
||||
|
||||
Wp-gpios property can be used on NVMEM nodes and the same property can
|
||||
be also used on MTD NAND nodes. In case of the wp-gpios property is
|
||||
defined at NAND level node, the GPIO management is done at NAND driver
|
||||
level. Write protect is disabled when the driver is probed or resumed
|
||||
and is enabled when the driver is released or suspended.
|
||||
|
||||
When no partitions are defined in the NAND DT node, then the NAND DT node
|
||||
will be passed to NVMEM framework. If wp-gpios property is defined in
|
||||
this node, the GPIO resource is taken twice and the NAND controller
|
||||
driver fails to probe.
|
||||
|
||||
It would be possible to set config->wp_gpio at MTD level before calling
|
||||
nvmem_register function but NVMEM framework will toggle this GPIO on
|
||||
each write when this GPIO should only be controlled at NAND level driver
|
||||
to ensure that the Write Protect has not been enabled.
|
||||
|
||||
A way to fix this conflict is to add a new boolean flag in nvmem_config
|
||||
named ignore_wp. In case ignore_wp is set, the GPIO resource will
|
||||
be managed by the provider.
|
||||
|
||||
Fixes: 2a127da461a9 ("nvmem: add support for the write-protect pin")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Christophe Kerello <christophe.kerello@foss.st.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151432.16605-2-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 2 +-
|
||||
include/linux/nvmem-provider.h | 4 +++-
|
||||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -771,7 +771,7 @@ struct nvmem_device *nvmem_register(cons
|
||||
|
||||
if (config->wp_gpio)
|
||||
nvmem->wp_gpio = config->wp_gpio;
|
||||
- else
|
||||
+ else if (!config->ignore_wp)
|
||||
nvmem->wp_gpio = gpiod_get_optional(config->dev, "wp",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(nvmem->wp_gpio)) {
|
||||
--- a/include/linux/nvmem-provider.h
|
||||
+++ b/include/linux/nvmem-provider.h
|
||||
@@ -70,7 +70,8 @@ struct nvmem_keepout {
|
||||
* @word_size: Minimum read/write access granularity.
|
||||
* @stride: Minimum read/write access stride.
|
||||
* @priv: User context passed to read/write callbacks.
|
||||
- * @wp-gpio: Write protect pin
|
||||
+ * @wp-gpio: Write protect pin
|
||||
+ * @ignore_wp: Write Protect pin is managed by the provider.
|
||||
*
|
||||
* Note: A default "nvmem<id>" name will be assigned to the device if
|
||||
* no name is specified in its configuration. In such case "<id>" is
|
||||
@@ -92,6 +93,7 @@ struct nvmem_config {
|
||||
enum nvmem_type type;
|
||||
bool read_only;
|
||||
bool root_only;
|
||||
+ bool ignore_wp;
|
||||
struct device_node *of_node;
|
||||
bool no_of_node;
|
||||
nvmem_reg_read_t reg_read;
|
||||
@ -0,0 +1,72 @@
|
||||
From 190fae468592bc2f0efc8b928920f8f712b5831e Mon Sep 17 00:00:00 2001
|
||||
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Date: Sun, 20 Feb 2022 15:15:15 +0000
|
||||
Subject: [PATCH] nvmem: core: Remove unused devm_nvmem_unregister()
|
||||
|
||||
There are no users and seems no will come of the devm_nvmem_unregister().
|
||||
Remove the function and remove the unused devm_nvmem_match() along with it.
|
||||
|
||||
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-2-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 22 ----------------------
|
||||
include/linux/nvmem-provider.h | 8 --------
|
||||
2 files changed, 30 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -945,28 +945,6 @@ struct nvmem_device *devm_nvmem_register
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_nvmem_register);
|
||||
|
||||
-static int devm_nvmem_match(struct device *dev, void *res, void *data)
|
||||
-{
|
||||
- struct nvmem_device **r = res;
|
||||
-
|
||||
- return *r == data;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
- * devm_nvmem_unregister() - Unregister previously registered managed nvmem
|
||||
- * device.
|
||||
- *
|
||||
- * @dev: Device that uses the nvmem device.
|
||||
- * @nvmem: Pointer to previously registered nvmem device.
|
||||
- *
|
||||
- * Return: Will be negative on error or zero on success.
|
||||
- */
|
||||
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
|
||||
-{
|
||||
- return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem);
|
||||
-}
|
||||
-EXPORT_SYMBOL(devm_nvmem_unregister);
|
||||
-
|
||||
static struct nvmem_device *__nvmem_device_get(void *data,
|
||||
int (*match)(struct device *dev, const void *data))
|
||||
{
|
||||
--- a/include/linux/nvmem-provider.h
|
||||
+++ b/include/linux/nvmem-provider.h
|
||||
@@ -135,8 +135,6 @@ void nvmem_unregister(struct nvmem_devic
|
||||
struct nvmem_device *devm_nvmem_register(struct device *dev,
|
||||
const struct nvmem_config *cfg);
|
||||
|
||||
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem);
|
||||
-
|
||||
void nvmem_add_cell_table(struct nvmem_cell_table *table);
|
||||
void nvmem_del_cell_table(struct nvmem_cell_table *table);
|
||||
|
||||
@@ -155,12 +153,6 @@ devm_nvmem_register(struct device *dev,
|
||||
return nvmem_register(c);
|
||||
}
|
||||
|
||||
-static inline int
|
||||
-devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
|
||||
-{
|
||||
- return -EOPNOTSUPP;
|
||||
-}
|
||||
-
|
||||
static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
|
||||
static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
|
||||
|
||||
@ -0,0 +1,58 @@
|
||||
From 5825b2c6762611e67ccaf3ccf64485365a120f0b Mon Sep 17 00:00:00 2001
|
||||
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Date: Sun, 20 Feb 2022 15:15:16 +0000
|
||||
Subject: [PATCH] nvmem: core: Use devm_add_action_or_reset()
|
||||
|
||||
Slightly simplify the devm_nvmem_register() by using the
|
||||
devm_add_action_or_reset().
|
||||
|
||||
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 22 +++++++++-------------
|
||||
1 file changed, 9 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -907,9 +907,9 @@ void nvmem_unregister(struct nvmem_devic
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
||||
|
||||
-static void devm_nvmem_release(struct device *dev, void *res)
|
||||
+static void devm_nvmem_unregister(void *nvmem)
|
||||
{
|
||||
- nvmem_unregister(*(struct nvmem_device **)res);
|
||||
+ nvmem_unregister(nvmem);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -926,20 +926,16 @@ static void devm_nvmem_release(struct de
|
||||
struct nvmem_device *devm_nvmem_register(struct device *dev,
|
||||
const struct nvmem_config *config)
|
||||
{
|
||||
- struct nvmem_device **ptr, *nvmem;
|
||||
-
|
||||
- ptr = devres_alloc(devm_nvmem_release, sizeof(*ptr), GFP_KERNEL);
|
||||
- if (!ptr)
|
||||
- return ERR_PTR(-ENOMEM);
|
||||
+ struct nvmem_device *nvmem;
|
||||
+ int ret;
|
||||
|
||||
nvmem = nvmem_register(config);
|
||||
+ if (IS_ERR(nvmem))
|
||||
+ return nvmem;
|
||||
|
||||
- if (!IS_ERR(nvmem)) {
|
||||
- *ptr = nvmem;
|
||||
- devres_add(dev, ptr);
|
||||
- } else {
|
||||
- devres_free(ptr);
|
||||
- }
|
||||
+ ret = devm_add_action_or_reset(dev, devm_nvmem_unregister, nvmem);
|
||||
+ if (ret)
|
||||
+ return ERR_PTR(ret);
|
||||
|
||||
return nvmem;
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
From 8c751e0d9a5264376935a84429a2d468c8877d99 Mon Sep 17 00:00:00 2001
|
||||
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Date: Sun, 20 Feb 2022 15:15:17 +0000
|
||||
Subject: [PATCH] nvmem: core: Check input parameter for NULL in
|
||||
nvmem_unregister()
|
||||
|
||||
nvmem_unregister() frees resources and standard pattern is to allow
|
||||
caller to not care if it's NULL or not. This will reduce burden on
|
||||
the callers to perform this check.
|
||||
|
||||
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-4-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -903,7 +903,8 @@ static void nvmem_device_release(struct
|
||||
*/
|
||||
void nvmem_unregister(struct nvmem_device *nvmem)
|
||||
{
|
||||
- kref_put(&nvmem->refcnt, nvmem_device_release);
|
||||
+ if (nvmem)
|
||||
+ kref_put(&nvmem->refcnt, nvmem_device_release);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
From 05196facc052385960028ac634447ecf6c764ec3 Mon Sep 17 00:00:00 2001
|
||||
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Date: Sun, 20 Feb 2022 15:15:18 +0000
|
||||
Subject: [PATCH] nvmem: qfprom: fix kerneldoc warning
|
||||
|
||||
This patch fixes below kernel doc warning,
|
||||
warning: expecting prototype for qfprom_efuse_reg_write().
|
||||
Prototype was for qfprom_reg_write() instead
|
||||
|
||||
No code changes.
|
||||
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-5-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -244,7 +244,7 @@ err_clk_prepared:
|
||||
}
|
||||
|
||||
/**
|
||||
- * qfprom_efuse_reg_write() - Write to fuses.
|
||||
+ * qfprom_reg_write() - Write to fuses.
|
||||
* @context: Our driver data.
|
||||
* @reg: The offset to write at.
|
||||
* @_val: Pointer to data to write.
|
||||
@ -0,0 +1,38 @@
|
||||
From 07ae4fde9efada7878e1383d6ccc7da70315ca23 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sun, 20 Feb 2022 15:15:20 +0000
|
||||
Subject: [PATCH] nvmem: sunxi_sid: Add support for D1 variant
|
||||
|
||||
D1 has a smaller eFuse block than some other recent SoCs, and it no
|
||||
longer requires a workaround to read the eFuse data.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-7-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/sunxi_sid.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/sunxi_sid.c
|
||||
+++ b/drivers/nvmem/sunxi_sid.c
|
||||
@@ -184,6 +184,11 @@ static const struct sunxi_sid_cfg sun8i_
|
||||
.need_register_readout = true,
|
||||
};
|
||||
|
||||
+static const struct sunxi_sid_cfg sun20i_d1_cfg = {
|
||||
+ .value_offset = 0x200,
|
||||
+ .size = 0x100,
|
||||
+};
|
||||
+
|
||||
static const struct sunxi_sid_cfg sun50i_a64_cfg = {
|
||||
.value_offset = 0x200,
|
||||
.size = 0x100,
|
||||
@@ -200,6 +205,7 @@ static const struct of_device_id sunxi_s
|
||||
{ .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg },
|
||||
{ .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg },
|
||||
{ .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg },
|
||||
+ { .compatible = "allwinner,sun20i-d1-sid", .data = &sun20i_d1_cfg },
|
||||
{ .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg },
|
||||
{ .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg },
|
||||
{ .compatible = "allwinner,sun50i-h6-sid", .data = &sun50i_h6_cfg },
|
||||
@ -0,0 +1,28 @@
|
||||
From 4dc8d89faed9bb05f116fa1794fc955b14910386 Mon Sep 17 00:00:00 2001
|
||||
From: Xiaoke Wang <xkernel.wang@foxmail.com>
|
||||
Date: Sun, 20 Feb 2022 15:15:21 +0000
|
||||
Subject: [PATCH] nvmem: meson-mx-efuse: replace unnecessary devm_kstrdup()
|
||||
|
||||
Replace unnecessary devm_kstrdup() so to avoid redundant memory allocation.
|
||||
|
||||
Suggested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Signed-off-by: Xiaoke Wang <xkernel.wang@foxmail.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-8-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/meson-mx-efuse.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/meson-mx-efuse.c
|
||||
+++ b/drivers/nvmem/meson-mx-efuse.c
|
||||
@@ -209,8 +209,7 @@ static int meson_mx_efuse_probe(struct p
|
||||
if (IS_ERR(efuse->base))
|
||||
return PTR_ERR(efuse->base);
|
||||
|
||||
- efuse->config.name = devm_kstrdup(&pdev->dev, drvdata->name,
|
||||
- GFP_KERNEL);
|
||||
+ efuse->config.name = drvdata->name;
|
||||
efuse->config.owner = THIS_MODULE;
|
||||
efuse->config.dev = &pdev->dev;
|
||||
efuse->config.priv = efuse;
|
||||
@ -0,0 +1,139 @@
|
||||
From f78451012b9e159afdba31c3eb69f223a9f42adc Mon Sep 17 00:00:00 2001
|
||||
From: Michael Walle <michael@walle.cc>
|
||||
Date: Sun, 20 Feb 2022 15:15:23 +0000
|
||||
Subject: [PATCH] nvmem: add driver for Layerscape SFP (Security Fuse
|
||||
Processor)
|
||||
|
||||
Add support for the Security Fuse Processor found on Layerscape SoCs.
|
||||
This driver implements basic read access.
|
||||
|
||||
Signed-off-by: Michael Walle <michael@walle.cc>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220220151527.17216-10-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 12 +++++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/layerscape-sfp.c | 89 ++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 103 insertions(+)
|
||||
create mode 100644 drivers/nvmem/layerscape-sfp.c
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -300,4 +300,16 @@ config NVMEM_BRCM_NVRAM
|
||||
This driver provides support for Broadcom's NVRAM that can be accessed
|
||||
using I/O mapping.
|
||||
|
||||
+config NVMEM_LAYERSCAPE_SFP
|
||||
+ tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||
+ depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ This driver provides support to read the eFuses on Freescale
|
||||
+ Layerscape SoC's. For example, the vendor provides a per part
|
||||
+ unique ID there.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called layerscape-sfp.
|
||||
+
|
||||
endif
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -61,3 +61,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.
|
||||
nvmem-rmem-y := rmem.o
|
||||
obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||
nvmem_brcm_nvram-y := brcm_nvram.o
|
||||
+obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||
+nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||
@@ -0,0 +1,89 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Layerscape SFP driver
|
||||
+ *
|
||||
+ * Copyright (c) 2022 Michael Walle <michael@walle.cc>
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/nvmem-provider.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/property.h>
|
||||
+
|
||||
+#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200
|
||||
+
|
||||
+struct layerscape_sfp_priv {
|
||||
+ void __iomem *base;
|
||||
+};
|
||||
+
|
||||
+struct layerscape_sfp_data {
|
||||
+ int size;
|
||||
+};
|
||||
+
|
||||
+static int layerscape_sfp_read(void *context, unsigned int offset, void *val,
|
||||
+ size_t bytes)
|
||||
+{
|
||||
+ struct layerscape_sfp_priv *priv = context;
|
||||
+
|
||||
+ memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset,
|
||||
+ bytes);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct nvmem_config layerscape_sfp_nvmem_config = {
|
||||
+ .name = "fsl-sfp",
|
||||
+ .reg_read = layerscape_sfp_read,
|
||||
+};
|
||||
+
|
||||
+static int layerscape_sfp_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ const struct layerscape_sfp_data *data;
|
||||
+ struct layerscape_sfp_priv *priv;
|
||||
+ struct nvmem_device *nvmem;
|
||||
+
|
||||
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(priv->base))
|
||||
+ return PTR_ERR(priv->base);
|
||||
+
|
||||
+ data = device_get_match_data(&pdev->dev);
|
||||
+
|
||||
+ layerscape_sfp_nvmem_config.size = data->size;
|
||||
+ layerscape_sfp_nvmem_config.dev = &pdev->dev;
|
||||
+ layerscape_sfp_nvmem_config.priv = priv;
|
||||
+
|
||||
+ nvmem = devm_nvmem_register(&pdev->dev, &layerscape_sfp_nvmem_config);
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||
+}
|
||||
+
|
||||
+static const struct layerscape_sfp_data ls1028a_data = {
|
||||
+ .size = 0x88,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||
+ { .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, layerscape_sfp_dt_ids);
|
||||
+
|
||||
+static struct platform_driver layerscape_sfp_driver = {
|
||||
+ .probe = layerscape_sfp_probe,
|
||||
+ .driver = {
|
||||
+ .name = "layerscape_sfp",
|
||||
+ .of_match_table = layerscape_sfp_dt_ids,
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(layerscape_sfp_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
|
||||
+MODULE_DESCRIPTION("Layerscape Security Fuse Processor driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@ -0,0 +1,32 @@
|
||||
From bc5c75e0a5a9400f81a987cc720100ac475fa4d8 Mon Sep 17 00:00:00 2001
|
||||
From: Knox Chiou <knoxchiou@chromium.org>
|
||||
Date: Wed, 23 Feb 2022 22:35:00 +0000
|
||||
Subject: [PATCH] nvmem: qfprom: Increase fuse blow timeout to prevent write
|
||||
fail
|
||||
|
||||
sc7180 blow fuses got slightly chances to hit qfprom_reg_write timeout.
|
||||
Current timeout is simply too low. Since blowing fuses is a
|
||||
very rare operation, so the risk associated with overestimating this
|
||||
number is low.
|
||||
Increase fuse blow timeout from 1ms to 10ms.
|
||||
|
||||
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||
Signed-off-by: Knox Chiou <knoxchiou@chromium.org>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220223223502.29454-2-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
/* Amount of time required to hold charge to blow fuse in micro-seconds */
|
||||
#define QFPROM_FUSE_BLOW_POLL_US 100
|
||||
-#define QFPROM_FUSE_BLOW_TIMEOUT_US 1000
|
||||
+#define QFPROM_FUSE_BLOW_TIMEOUT_US 10000
|
||||
|
||||
#define QFPROM_BLOW_STATUS_OFFSET 0x048
|
||||
#define QFPROM_BLOW_STATUS_BUSY 0x1
|
||||
@ -0,0 +1,277 @@
|
||||
From 8747ec2e9762ed9ae53b3a590938f454b6a1abdf Mon Sep 17 00:00:00 2001
|
||||
From: Vincent Shih <vincent.sunplus@gmail.com>
|
||||
Date: Wed, 23 Feb 2022 22:35:01 +0000
|
||||
Subject: [PATCH] nvmem: Add driver for OCOTP in Sunplus SP7021
|
||||
|
||||
Add driver for OCOTP in Sunplus SP7021
|
||||
|
||||
Signed-off-by: Vincent Shih <vincent.sunplus@gmail.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220223223502.29454-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
MAINTAINERS | 5 +
|
||||
drivers/nvmem/Kconfig | 12 ++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/sunplus-ocotp.c | 228 ++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 247 insertions(+)
|
||||
create mode 100644 drivers/nvmem/sunplus-ocotp.c
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -312,4 +312,16 @@ config NVMEM_LAYERSCAPE_SFP
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called layerscape-sfp.
|
||||
|
||||
+config NVMEM_SUNPLUS_OCOTP
|
||||
+ tristate "Sunplus SoC OTP support"
|
||||
+ depends on SOC_SP7021 || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ This is a driver for the On-chip OTP controller (OCOTP) available
|
||||
+ on Sunplus SoCs. It provides access to 128 bytes of one-time
|
||||
+ programmable eFuse.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-sunplus-ocotp.
|
||||
+
|
||||
endif
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -63,3 +63,5 @@ obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_
|
||||
nvmem_brcm_nvram-y := brcm_nvram.o
|
||||
obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||
+obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||
+nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||
@@ -0,0 +1,228 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+
|
||||
+/*
|
||||
+ * The OCOTP driver for Sunplus SP7021
|
||||
+ *
|
||||
+ * Copyright (C) 2019 Sunplus Technology Inc., All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bitfield.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/iopoll.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/nvmem-provider.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+/*
|
||||
+ * OTP memory
|
||||
+ * Each bank contains 4 words (32 bits).
|
||||
+ * Bank 0 starts at offset 0 from the base.
|
||||
+ */
|
||||
+
|
||||
+#define OTP_WORDS_PER_BANK 4
|
||||
+#define OTP_WORD_SIZE sizeof(u32)
|
||||
+#define OTP_BIT_ADDR_OF_BANK (8 * OTP_WORD_SIZE * OTP_WORDS_PER_BANK)
|
||||
+#define QAC628_OTP_NUM_BANKS 8
|
||||
+#define QAC628_OTP_SIZE (QAC628_OTP_NUM_BANKS * OTP_WORDS_PER_BANK * OTP_WORD_SIZE)
|
||||
+#define OTP_READ_TIMEOUT_US 200000
|
||||
+
|
||||
+/* HB_GPIO */
|
||||
+#define ADDRESS_8_DATA 0x20
|
||||
+
|
||||
+/* OTP_RX */
|
||||
+#define OTP_CONTROL_2 0x48
|
||||
+#define OTP_RD_PERIOD GENMASK(15, 8)
|
||||
+#define OTP_RD_PERIOD_MASK ~GENMASK(15, 8)
|
||||
+#define CPU_CLOCK FIELD_PREP(OTP_RD_PERIOD, 30)
|
||||
+#define SEL_BAK_KEY2 BIT(5)
|
||||
+#define SEL_BAK_KEY2_MASK ~BIT(5)
|
||||
+#define SW_TRIM_EN BIT(4)
|
||||
+#define SW_TRIM_EN_MASK ~BIT(4)
|
||||
+#define SEL_BAK_KEY BIT(3)
|
||||
+#define SEL_BAK_KEY_MASK ~BIT(3)
|
||||
+#define OTP_READ BIT(2)
|
||||
+#define OTP_LOAD_SECURE_DATA BIT(1)
|
||||
+#define OTP_LOAD_SECURE_DATA_MASK ~BIT(1)
|
||||
+#define OTP_DO_CRC BIT(0)
|
||||
+#define OTP_DO_CRC_MASK ~BIT(0)
|
||||
+#define OTP_STATUS 0x4c
|
||||
+#define OTP_READ_DONE BIT(4)
|
||||
+#define OTP_READ_DONE_MASK ~BIT(4)
|
||||
+#define OTP_LOAD_SECURE_DONE_MASK ~BIT(2)
|
||||
+#define OTP_READ_ADDRESS 0x50
|
||||
+
|
||||
+enum base_type {
|
||||
+ HB_GPIO,
|
||||
+ OTPRX,
|
||||
+ BASEMAX,
|
||||
+};
|
||||
+
|
||||
+struct sp_ocotp_priv {
|
||||
+ struct device *dev;
|
||||
+ void __iomem *base[BASEMAX];
|
||||
+ struct clk *clk;
|
||||
+};
|
||||
+
|
||||
+struct sp_ocotp_data {
|
||||
+ int size;
|
||||
+};
|
||||
+
|
||||
+const struct sp_ocotp_data sp_otp_v0 = {
|
||||
+ .size = QAC628_OTP_SIZE,
|
||||
+};
|
||||
+
|
||||
+static int sp_otp_read_real(struct sp_ocotp_priv *otp, int addr, char *value)
|
||||
+{
|
||||
+ unsigned int addr_data;
|
||||
+ unsigned int byte_shift;
|
||||
+ unsigned int status;
|
||||
+ int ret;
|
||||
+
|
||||
+ addr_data = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||
+ addr_data = addr_data / OTP_WORD_SIZE;
|
||||
+
|
||||
+ byte_shift = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||
+ byte_shift = byte_shift % OTP_WORD_SIZE;
|
||||
+
|
||||
+ addr = addr / (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||
+ addr = addr * OTP_BIT_ADDR_OF_BANK;
|
||||
+
|
||||
+ writel(readl(otp->base[OTPRX] + OTP_STATUS) & OTP_READ_DONE_MASK &
|
||||
+ OTP_LOAD_SECURE_DONE_MASK, otp->base[OTPRX] + OTP_STATUS);
|
||||
+ writel(addr, otp->base[OTPRX] + OTP_READ_ADDRESS);
|
||||
+ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) | OTP_READ,
|
||||
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||
+ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) & SEL_BAK_KEY2_MASK & SW_TRIM_EN_MASK
|
||||
+ & SEL_BAK_KEY_MASK & OTP_LOAD_SECURE_DATA_MASK & OTP_DO_CRC_MASK,
|
||||
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||
+ writel((readl(otp->base[OTPRX] + OTP_CONTROL_2) & OTP_RD_PERIOD_MASK) | CPU_CLOCK,
|
||||
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||
+
|
||||
+ ret = readl_poll_timeout(otp->base[OTPRX] + OTP_STATUS, status,
|
||||
+ status & OTP_READ_DONE, 10, OTP_READ_TIMEOUT_US);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ *value = (readl(otp->base[HB_GPIO] + ADDRESS_8_DATA + addr_data * OTP_WORD_SIZE)
|
||||
+ >> (8 * byte_shift)) & 0xff;
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int sp_ocotp_read(void *priv, unsigned int offset, void *value, size_t bytes)
|
||||
+{
|
||||
+ struct sp_ocotp_priv *otp = priv;
|
||||
+ unsigned int addr;
|
||||
+ char *buf = value;
|
||||
+ char val[4];
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = clk_enable(otp->clk);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ *buf = 0;
|
||||
+ for (addr = offset; addr < (offset + bytes); addr++) {
|
||||
+ ret = sp_otp_read_real(otp, addr, val);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(otp->dev, "OTP read fail:%d at %d", ret, addr);
|
||||
+ goto disable_clk;
|
||||
+ }
|
||||
+
|
||||
+ *buf++ = *val;
|
||||
+ }
|
||||
+
|
||||
+disable_clk:
|
||||
+ clk_disable(otp->clk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static struct nvmem_config sp_ocotp_nvmem_config = {
|
||||
+ .name = "sp-ocotp",
|
||||
+ .read_only = true,
|
||||
+ .word_size = 1,
|
||||
+ .size = QAC628_OTP_SIZE,
|
||||
+ .stride = 1,
|
||||
+ .reg_read = sp_ocotp_read,
|
||||
+ .owner = THIS_MODULE,
|
||||
+};
|
||||
+
|
||||
+static int sp_ocotp_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct nvmem_device *nvmem;
|
||||
+ struct sp_ocotp_priv *otp;
|
||||
+ struct resource *res;
|
||||
+ int ret;
|
||||
+
|
||||
+ otp = devm_kzalloc(dev, sizeof(*otp), GFP_KERNEL);
|
||||
+ if (!otp)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ otp->dev = dev;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hb_gpio");
|
||||
+ otp->base[HB_GPIO] = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(otp->base[HB_GPIO]))
|
||||
+ return PTR_ERR(otp->base[HB_GPIO]);
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "otprx");
|
||||
+ otp->base[OTPRX] = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(otp->base[OTPRX]))
|
||||
+ return PTR_ERR(otp->base[OTPRX]);
|
||||
+
|
||||
+ otp->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(otp->clk))
|
||||
+ return dev_err_probe(&pdev->dev, PTR_ERR(otp->clk),
|
||||
+ "devm_clk_get fail\n");
|
||||
+
|
||||
+ ret = clk_prepare(otp->clk);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "failed to prepare clk: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ sp_ocotp_nvmem_config.priv = otp;
|
||||
+ sp_ocotp_nvmem_config.dev = dev;
|
||||
+
|
||||
+ nvmem = devm_nvmem_register(dev, &sp_ocotp_nvmem_config);
|
||||
+ if (IS_ERR(nvmem))
|
||||
+ return dev_err_probe(&pdev->dev, PTR_ERR(nvmem),
|
||||
+ "register nvmem device fail\n");
|
||||
+
|
||||
+ platform_set_drvdata(pdev, nvmem);
|
||||
+
|
||||
+ dev_dbg(dev, "banks:%d x wpb:%d x wsize:%d = %d",
|
||||
+ (int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK,
|
||||
+ (int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE);
|
||||
+
|
||||
+ dev_info(dev, "by Sunplus (C) 2020");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id sp_ocotp_dt_ids[] = {
|
||||
+ { .compatible = "sunplus,sp7021-ocotp", .data = &sp_otp_v0 },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, sp_ocotp_dt_ids);
|
||||
+
|
||||
+static struct platform_driver sp_otp_driver = {
|
||||
+ .probe = sp_ocotp_probe,
|
||||
+ .driver = {
|
||||
+ .name = "sunplus,sp7021-ocotp",
|
||||
+ .of_match_table = sp_ocotp_dt_ids,
|
||||
+ }
|
||||
+};
|
||||
+module_platform_driver(sp_otp_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Vincent Shih <vincent.sunplus@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Sunplus On-Chip OTP driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
@ -0,0 +1,32 @@
|
||||
From 6bd0ffeaa389866089e9573b2298ae58d6359b75 Mon Sep 17 00:00:00 2001
|
||||
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
Date: Mon, 21 Mar 2022 12:03:24 +0100
|
||||
Subject: [PATCH] nvmem: bcm-ocotp: mark ACPI device ID table as maybe unused
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
"bcm_otpc_acpi_ids" is used with ACPI_PTR, so a build with !CONFIG_ACPI
|
||||
has a warning:
|
||||
|
||||
drivers/nvmem/bcm-ocotp.c:247:36: error:
|
||||
‘bcm_otpc_acpi_ids’ defined but not used [-Werror=unused-const-variable=]
|
||||
|
||||
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220321110326.44652-1-krzk@kernel.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/bcm-ocotp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/bcm-ocotp.c
|
||||
+++ b/drivers/nvmem/bcm-ocotp.c
|
||||
@@ -244,7 +244,7 @@ static const struct of_device_id bcm_otp
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, bcm_otpc_dt_ids);
|
||||
|
||||
-static const struct acpi_device_id bcm_otpc_acpi_ids[] = {
|
||||
+static const struct acpi_device_id bcm_otpc_acpi_ids[] __maybe_unused = {
|
||||
{ .id = "BRCM0700", .driver_data = (kernel_ulong_t)&otp_map },
|
||||
{ .id = "BRCM0701", .driver_data = (kernel_ulong_t)&otp_map_v2 },
|
||||
{ /* sentinel */ }
|
||||
@ -0,0 +1,30 @@
|
||||
From 1066f8156351fcd997125257cea47cf805ba4f6d Mon Sep 17 00:00:00 2001
|
||||
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
Date: Mon, 21 Mar 2022 12:03:25 +0100
|
||||
Subject: [PATCH] nvmem: sunplus-ocotp: staticize sp_otp_v0
|
||||
|
||||
The "sp_otp_v0" file scope variable is not used outside, so make it
|
||||
static to fix warning:
|
||||
|
||||
drivers/nvmem/sunplus-ocotp.c:74:29: sparse:
|
||||
sparse: symbol 'sp_otp_v0' was not declared. Should it be static?
|
||||
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220321110326.44652-2-krzk@kernel.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/sunplus-ocotp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/sunplus-ocotp.c
|
||||
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||
@@ -71,7 +71,7 @@ struct sp_ocotp_data {
|
||||
int size;
|
||||
};
|
||||
|
||||
-const struct sp_ocotp_data sp_otp_v0 = {
|
||||
+static const struct sp_ocotp_data sp_otp_v0 = {
|
||||
.size = QAC628_OTP_SIZE,
|
||||
};
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
From 874dfbcf219ccc42a2cbd187d087c7db82c3024b Mon Sep 17 00:00:00 2001
|
||||
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
Date: Mon, 21 Mar 2022 12:03:26 +0100
|
||||
Subject: [PATCH] nvmem: sunplus-ocotp: drop useless probe confirmation
|
||||
|
||||
Printing probe success is discouraged, because we can use tracing for
|
||||
this purpose. Remove useless print message after Sunplus OCOTP driver
|
||||
probe.
|
||||
|
||||
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20220321110326.44652-3-krzk@kernel.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/sunplus-ocotp.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/sunplus-ocotp.c
|
||||
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||
@@ -202,8 +202,6 @@ static int sp_ocotp_probe(struct platfor
|
||||
(int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK,
|
||||
(int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE);
|
||||
|
||||
- dev_info(dev, "by Sunplus (C) 2020");
|
||||
-
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -21,7 +21,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -462,6 +462,7 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||
@@ -467,6 +467,7 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||
|
||||
cell->bit_offset = info->bit_offset;
|
||||
cell->nbits = info->nbits;
|
||||
@ -0,0 +1,130 @@
|
||||
From b6b7ef932ae838209254f016ecf8862d716a5ced Mon Sep 17 00:00:00 2001
|
||||
From: Sven Peter <sven@svenpeter.dev>
|
||||
Date: Fri, 29 Apr 2022 17:26:50 +0100
|
||||
Subject: [PATCH] nvmem: Add Apple eFuse driver
|
||||
|
||||
Apple SoCs contain eFuses used to store factory-programmed data such
|
||||
as calibration values for the PCIe or the Type-C PHY. They are organized
|
||||
as 32bit values exposed as MMIO.
|
||||
|
||||
Signed-off-by: Sven Peter <sven@svenpeter.dev>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220429162701.2222-6-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 12 ++++++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/apple-efuses.c | 80 ++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 94 insertions(+)
|
||||
create mode 100644 drivers/nvmem/apple-efuses.c
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -324,4 +324,16 @@ config NVMEM_SUNPLUS_OCOTP
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-sunplus-ocotp.
|
||||
|
||||
+config NVMEM_APPLE_EFUSES
|
||||
+ tristate "Apple eFuse support"
|
||||
+ depends on ARCH_APPLE || COMPILE_TEST
|
||||
+ default ARCH_APPLE
|
||||
+ help
|
||||
+ Say y here to enable support for reading eFuses on Apple SoCs
|
||||
+ such as the M1. These are e.g. used to store factory programmed
|
||||
+ calibration data required for the PCIe or the USB-C PHY.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module will
|
||||
+ be called nvmem-apple-efuses.
|
||||
+
|
||||
endif
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -65,3 +65,5 @@ obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nv
|
||||
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||
obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||
+nvmem-apple-efuses-y := apple-efuses.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/nvmem/apple-efuses.c
|
||||
@@ -0,0 +1,80 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Apple SoC eFuse driver
|
||||
+ *
|
||||
+ * Copyright (C) The Asahi Linux Contributors
|
||||
+ */
|
||||
+
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/nvmem-provider.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+struct apple_efuses_priv {
|
||||
+ void __iomem *fuses;
|
||||
+};
|
||||
+
|
||||
+static int apple_efuses_read(void *context, unsigned int offset, void *val,
|
||||
+ size_t bytes)
|
||||
+{
|
||||
+ struct apple_efuses_priv *priv = context;
|
||||
+ u32 *dst = val;
|
||||
+
|
||||
+ while (bytes >= sizeof(u32)) {
|
||||
+ *dst++ = readl_relaxed(priv->fuses + offset);
|
||||
+ bytes -= sizeof(u32);
|
||||
+ offset += sizeof(u32);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int apple_efuses_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct apple_efuses_priv *priv;
|
||||
+ struct resource *res;
|
||||
+ struct nvmem_config config = {
|
||||
+ .dev = &pdev->dev,
|
||||
+ .read_only = true,
|
||||
+ .reg_read = apple_efuses_read,
|
||||
+ .stride = sizeof(u32),
|
||||
+ .word_size = sizeof(u32),
|
||||
+ .name = "apple_efuses_nvmem",
|
||||
+ .id = NVMEM_DEVID_AUTO,
|
||||
+ .root_only = true,
|
||||
+ };
|
||||
+
|
||||
+ priv = devm_kzalloc(config.dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ priv->fuses = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||
+ if (IS_ERR(priv->fuses))
|
||||
+ return PTR_ERR(priv->fuses);
|
||||
+
|
||||
+ config.priv = priv;
|
||||
+ config.size = resource_size(res);
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(devm_nvmem_register(config.dev, &config));
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id apple_efuses_of_match[] = {
|
||||
+ { .compatible = "apple,efuses", },
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, apple_efuses_of_match);
|
||||
+
|
||||
+static struct platform_driver apple_efuses_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "apple_efuses",
|
||||
+ .of_match_table = apple_efuses_of_match,
|
||||
+ },
|
||||
+ .probe = apple_efuses_probe,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(apple_efuses_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Sven Peter <sven@svenpeter.dev>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@ -0,0 +1,31 @@
|
||||
From 517f6e2641a2802dce5a5aa0d18c7d37a35678d2 Mon Sep 17 00:00:00 2001
|
||||
From: Minghao Chi <chi.minghao@zte.com.cn>
|
||||
Date: Fri, 29 Apr 2022 17:26:54 +0100
|
||||
Subject: [PATCH] nvmem: qfprom: using pm_runtime_resume_and_get instead of
|
||||
pm_runtime_get_sync
|
||||
|
||||
Using pm_runtime_resume_and_get is more appropriate
|
||||
for simplifing code
|
||||
|
||||
Reported-by: Zeal Robot <zealci@zte.com.cn>
|
||||
Signed-off-by: Minghao Chi <chi.minghao@zte.com.cn>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220429162701.2222-10-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/qfprom.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/qfprom.c
|
||||
+++ b/drivers/nvmem/qfprom.c
|
||||
@@ -217,9 +217,8 @@ static int qfprom_enable_fuse_blowing(co
|
||||
goto err_clk_rate_set;
|
||||
}
|
||||
|
||||
- ret = pm_runtime_get_sync(priv->dev);
|
||||
+ ret = pm_runtime_resume_and_get(priv->dev);
|
||||
if (ret < 0) {
|
||||
- pm_runtime_put_noidle(priv->dev);
|
||||
dev_err(priv->dev, "Failed to enable power-domain\n");
|
||||
goto err_reg_enable;
|
||||
}
|
||||
@ -0,0 +1,109 @@
|
||||
From 943eadbdb11314b41eacbcc484dfb7f93e271ff4 Mon Sep 17 00:00:00 2001
|
||||
From: Sean Anderson <sean.anderson@seco.com>
|
||||
Date: Fri, 29 Apr 2022 17:27:00 +0100
|
||||
Subject: [PATCH] nvmem: sfp: Use regmap
|
||||
|
||||
This converts the SFP driver to use regmap. This will allow easily
|
||||
supporting devices with different endians. We disallow byte-level
|
||||
access, as regmap_bulk_read doesn't support it (and it's unclear what
|
||||
the correct result would be when we have an endianness difference).
|
||||
|
||||
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220429162701.2222-16-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 1 +
|
||||
drivers/nvmem/layerscape-sfp.c | 30 ++++++++++++++++++++++--------
|
||||
2 files changed, 23 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -304,6 +304,7 @@ config NVMEM_LAYERSCAPE_SFP
|
||||
tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||
depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
+ select REGMAP_MMIO
|
||||
help
|
||||
This driver provides support to read the eFuses on Freescale
|
||||
Layerscape SoC's. For example, the vendor provides a per part
|
||||
--- a/drivers/nvmem/layerscape-sfp.c
|
||||
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||
@@ -13,15 +13,17 @@
|
||||
#include <linux/nvmem-provider.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/property.h>
|
||||
+#include <linux/regmap.h>
|
||||
|
||||
#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200
|
||||
|
||||
struct layerscape_sfp_priv {
|
||||
- void __iomem *base;
|
||||
+ struct regmap *regmap;
|
||||
};
|
||||
|
||||
struct layerscape_sfp_data {
|
||||
int size;
|
||||
+ enum regmap_endian endian;
|
||||
};
|
||||
|
||||
static int layerscape_sfp_read(void *context, unsigned int offset, void *val,
|
||||
@@ -29,15 +31,16 @@ static int layerscape_sfp_read(void *con
|
||||
{
|
||||
struct layerscape_sfp_priv *priv = context;
|
||||
|
||||
- memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset,
|
||||
- bytes);
|
||||
-
|
||||
- return 0;
|
||||
+ return regmap_bulk_read(priv->regmap,
|
||||
+ LAYERSCAPE_SFP_OTP_OFFSET + offset, val,
|
||||
+ bytes / 4);
|
||||
}
|
||||
|
||||
static struct nvmem_config layerscape_sfp_nvmem_config = {
|
||||
.name = "fsl-sfp",
|
||||
.reg_read = layerscape_sfp_read,
|
||||
+ .word_size = 4,
|
||||
+ .stride = 4,
|
||||
};
|
||||
|
||||
static int layerscape_sfp_probe(struct platform_device *pdev)
|
||||
@@ -45,16 +48,26 @@ static int layerscape_sfp_probe(struct p
|
||||
const struct layerscape_sfp_data *data;
|
||||
struct layerscape_sfp_priv *priv;
|
||||
struct nvmem_device *nvmem;
|
||||
+ struct regmap_config config = { 0 };
|
||||
+ void __iomem *base;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
- priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
- if (IS_ERR(priv->base))
|
||||
- return PTR_ERR(priv->base);
|
||||
+ base = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(base))
|
||||
+ return PTR_ERR(base);
|
||||
|
||||
data = device_get_match_data(&pdev->dev);
|
||||
+ config.reg_bits = 32;
|
||||
+ config.reg_stride = 4;
|
||||
+ config.val_bits = 32;
|
||||
+ config.val_format_endian = data->endian;
|
||||
+ config.max_register = LAYERSCAPE_SFP_OTP_OFFSET + data->size - 4;
|
||||
+ priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, &config);
|
||||
+ if (IS_ERR(priv->regmap))
|
||||
+ return PTR_ERR(priv->regmap);
|
||||
|
||||
layerscape_sfp_nvmem_config.size = data->size;
|
||||
layerscape_sfp_nvmem_config.dev = &pdev->dev;
|
||||
@@ -67,6 +80,7 @@ static int layerscape_sfp_probe(struct p
|
||||
|
||||
static const struct layerscape_sfp_data ls1028a_data = {
|
||||
.size = 0x88,
|
||||
+ .endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||
@ -0,0 +1,38 @@
|
||||
From 33a1c6618677fe33f8e84cb7bedc45abbce89a50 Mon Sep 17 00:00:00 2001
|
||||
From: Sean Anderson <sean.anderson@seco.com>
|
||||
Date: Fri, 29 Apr 2022 17:27:01 +0100
|
||||
Subject: [PATCH] nvmem: sfp: Add support for TA 2.1 devices
|
||||
|
||||
This adds support for Trust Architecture (TA) 2.1 devices to the SFP driver.
|
||||
There are few differences between TA 2.1 and TA 3.0, especially for
|
||||
read-only support, so just re-use the existing data.
|
||||
|
||||
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220429162701.2222-17-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/layerscape-sfp.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/nvmem/layerscape-sfp.c
|
||||
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||
@@ -78,12 +78,18 @@ static int layerscape_sfp_probe(struct p
|
||||
return PTR_ERR_OR_ZERO(nvmem);
|
||||
}
|
||||
|
||||
+static const struct layerscape_sfp_data ls1021a_data = {
|
||||
+ .size = 0x88,
|
||||
+ .endian = REGMAP_ENDIAN_BIG,
|
||||
+};
|
||||
+
|
||||
static const struct layerscape_sfp_data ls1028a_data = {
|
||||
.size = 0x88,
|
||||
.endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||
+ { .compatible = "fsl,ls1021a-sfp", .data = &ls1021a_data },
|
||||
{ .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data },
|
||||
{},
|
||||
};
|
||||
@ -0,0 +1,389 @@
|
||||
From 98830350d3fc824c1ff5c338140fe20f041a5916 Mon Sep 17 00:00:00 2001
|
||||
From: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
Date: Wed, 6 Jul 2022 11:06:22 +0100
|
||||
Subject: [PATCH] nvmem: microchip-otpc: add support
|
||||
|
||||
Add support for Microchip OTP controller available on SAMA7G5. The OTPC
|
||||
controls the access to a non-volatile memory. The memory behind OTPC is
|
||||
organized into packets, packets are composed by a fixed length header
|
||||
(4 bytes long) and a variable length payload (payload length is available
|
||||
in the header). When software request the data at an offset in memory
|
||||
the OTPC will return (via header + data registers) the whole packet that
|
||||
has a word at that offset. For the OTP memory layout like below:
|
||||
|
||||
offset OTP Memory layout
|
||||
|
||||
. .
|
||||
. ... .
|
||||
. .
|
||||
0x0E +-----------+ <--- packet X
|
||||
| header X |
|
||||
0x12 +-----------+
|
||||
| payload X |
|
||||
0x16 | |
|
||||
| |
|
||||
0x1A | |
|
||||
+-----------+
|
||||
. .
|
||||
. ... .
|
||||
. .
|
||||
|
||||
if user requests data at address 0x16 the data started at 0x0E will be
|
||||
returned by controller. User will be able to fetch the whole packet
|
||||
starting at 0x0E (or parts of the packet) via proper registers. The same
|
||||
packet will be returned if software request the data at offset 0x0E or
|
||||
0x12 or 0x1A.
|
||||
|
||||
The OTP will be populated by Microchip with at least 2 packets first one
|
||||
being boot configuration packet and the 2nd one being temperature
|
||||
calibration packet. The packet order will be preserved b/w different chip
|
||||
revisions but the packet sizes may change.
|
||||
|
||||
For the above reasons and to keep the same software able to work on all
|
||||
chip variants the read function of the driver is working with a packet
|
||||
id instead of an offset in OTP memory.
|
||||
|
||||
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220706100627.6534-3-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
MAINTAINERS | 8 +
|
||||
drivers/nvmem/Kconfig | 7 +
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/microchip-otpc.c | 288 +++++++++++++++++++++++++++++++++
|
||||
4 files changed, 305 insertions(+)
|
||||
create mode 100644 drivers/nvmem/microchip-otpc.c
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -11565,6 +11565,14 @@ S: Supported
|
||||
F: Documentation/devicetree/bindings/mtd/atmel-nand.txt
|
||||
F: drivers/mtd/nand/raw/atmel/*
|
||||
|
||||
+MICROCHIP OTPC DRIVER
|
||||
+M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
+L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
+S: Supported
|
||||
+F: Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
|
||||
+F: drivers/nvmem/microchip-otpc.c
|
||||
+F: dt-bindings/nvmem/microchip,sama7g5-otpc.h
|
||||
+
|
||||
MICROCHIP PWM DRIVER
|
||||
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -107,6 +107,13 @@ config MTK_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called efuse-mtk.
|
||||
|
||||
+config MICROCHIP_OTPC
|
||||
+ tristate "Microchip OTPC support"
|
||||
+ depends on ARCH_AT91 || COMPILE_TEST
|
||||
+ help
|
||||
+ This driver enable the OTP controller available on Microchip SAMA7G5
|
||||
+ SoCs. It controlls the access to the OTP memory connected to it.
|
||||
+
|
||||
config NVMEM_NINTENDO_OTP
|
||||
tristate "Nintendo Wii and Wii U OTP Support"
|
||||
depends on WII || COMPILE_TEST
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -67,3 +67,5 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm
|
||||
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||
obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||
nvmem-apple-efuses-y := apple-efuses.o
|
||||
+obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||
+nvmem-microchip-otpc-y := microchip-otpc.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/nvmem/microchip-otpc.c
|
||||
@@ -0,0 +1,288 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * OTP Memory controller
|
||||
+ *
|
||||
+ * Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries
|
||||
+ *
|
||||
+ * Author: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bitfield.h>
|
||||
+#include <linux/iopoll.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/nvmem-provider.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#define MCHP_OTPC_CR (0x0)
|
||||
+#define MCHP_OTPC_CR_READ BIT(6)
|
||||
+#define MCHP_OTPC_MR (0x4)
|
||||
+#define MCHP_OTPC_MR_ADDR GENMASK(31, 16)
|
||||
+#define MCHP_OTPC_AR (0x8)
|
||||
+#define MCHP_OTPC_SR (0xc)
|
||||
+#define MCHP_OTPC_SR_READ BIT(6)
|
||||
+#define MCHP_OTPC_HR (0x20)
|
||||
+#define MCHP_OTPC_HR_SIZE GENMASK(15, 8)
|
||||
+#define MCHP_OTPC_DR (0x24)
|
||||
+
|
||||
+#define MCHP_OTPC_NAME "mchp-otpc"
|
||||
+#define MCHP_OTPC_SIZE (11 * 1024)
|
||||
+
|
||||
+/**
|
||||
+ * struct mchp_otpc - OTPC private data structure
|
||||
+ * @base: base address
|
||||
+ * @dev: struct device pointer
|
||||
+ * @packets: list of packets in OTP memory
|
||||
+ * @npackets: number of packets in OTP memory
|
||||
+ */
|
||||
+struct mchp_otpc {
|
||||
+ void __iomem *base;
|
||||
+ struct device *dev;
|
||||
+ struct list_head packets;
|
||||
+ u32 npackets;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * struct mchp_otpc_packet - OTPC packet data structure
|
||||
+ * @list: list head
|
||||
+ * @id: packet ID
|
||||
+ * @offset: packet offset (in words) in OTP memory
|
||||
+ */
|
||||
+struct mchp_otpc_packet {
|
||||
+ struct list_head list;
|
||||
+ u32 id;
|
||||
+ u32 offset;
|
||||
+};
|
||||
+
|
||||
+static struct mchp_otpc_packet *mchp_otpc_id_to_packet(struct mchp_otpc *otpc,
|
||||
+ u32 id)
|
||||
+{
|
||||
+ struct mchp_otpc_packet *packet;
|
||||
+
|
||||
+ if (id >= otpc->npackets)
|
||||
+ return NULL;
|
||||
+
|
||||
+ list_for_each_entry(packet, &otpc->packets, list) {
|
||||
+ if (packet->id == id)
|
||||
+ return packet;
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int mchp_otpc_prepare_read(struct mchp_otpc *otpc,
|
||||
+ unsigned int offset)
|
||||
+{
|
||||
+ u32 tmp;
|
||||
+
|
||||
+ /* Set address. */
|
||||
+ tmp = readl_relaxed(otpc->base + MCHP_OTPC_MR);
|
||||
+ tmp &= ~MCHP_OTPC_MR_ADDR;
|
||||
+ tmp |= FIELD_PREP(MCHP_OTPC_MR_ADDR, offset);
|
||||
+ writel_relaxed(tmp, otpc->base + MCHP_OTPC_MR);
|
||||
+
|
||||
+ /* Set read. */
|
||||
+ tmp = readl_relaxed(otpc->base + MCHP_OTPC_CR);
|
||||
+ tmp |= MCHP_OTPC_CR_READ;
|
||||
+ writel_relaxed(tmp, otpc->base + MCHP_OTPC_CR);
|
||||
+
|
||||
+ /* Wait for packet to be transferred into temporary buffers. */
|
||||
+ return read_poll_timeout(readl_relaxed, tmp, !(tmp & MCHP_OTPC_SR_READ),
|
||||
+ 10000, 2000, false, otpc->base + MCHP_OTPC_SR);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * OTPC memory is organized into packets. Each packets contains a header and
|
||||
+ * a payload. Header is 4 bytes long and contains the size of the payload.
|
||||
+ * Payload size varies. The memory footprint is something as follows:
|
||||
+ *
|
||||
+ * Memory offset Memory footprint Packet ID
|
||||
+ * ------------- ---------------- ---------
|
||||
+ *
|
||||
+ * 0x0 +------------+ <-- packet 0
|
||||
+ * | header 0 |
|
||||
+ * 0x4 +------------+
|
||||
+ * | payload 0 |
|
||||
+ * . .
|
||||
+ * . ... .
|
||||
+ * . .
|
||||
+ * offset1 +------------+ <-- packet 1
|
||||
+ * | header 1 |
|
||||
+ * offset1 + 0x4 +------------+
|
||||
+ * | payload 1 |
|
||||
+ * . .
|
||||
+ * . ... .
|
||||
+ * . .
|
||||
+ * offset2 +------------+ <-- packet 2
|
||||
+ * . .
|
||||
+ * . ... .
|
||||
+ * . .
|
||||
+ * offsetN +------------+ <-- packet N
|
||||
+ * | header N |
|
||||
+ * offsetN + 0x4 +------------+
|
||||
+ * | payload N |
|
||||
+ * . .
|
||||
+ * . ... .
|
||||
+ * . .
|
||||
+ * +------------+
|
||||
+ *
|
||||
+ * where offset1, offset2, offsetN depends on the size of payload 0, payload 1,
|
||||
+ * payload N-1.
|
||||
+ *
|
||||
+ * The access to memory is done on a per packet basis: the control registers
|
||||
+ * need to be updated with an offset address (within a packet range) and the
|
||||
+ * data registers will be update by controller with information contained by
|
||||
+ * that packet. E.g. if control registers are updated with any address within
|
||||
+ * the range [offset1, offset2) the data registers are updated by controller
|
||||
+ * with packet 1. Header data is accessible though MCHP_OTPC_HR register.
|
||||
+ * Payload data is accessible though MCHP_OTPC_DR and MCHP_OTPC_AR registers.
|
||||
+ * There is no direct mapping b/w the offset requested by software and the
|
||||
+ * offset returned by hardware.
|
||||
+ *
|
||||
+ * For this, the read function will return the first requested bytes in the
|
||||
+ * packet. The user will have to be aware of the memory footprint before doing
|
||||
+ * the read request.
|
||||
+ */
|
||||
+static int mchp_otpc_read(void *priv, unsigned int off, void *val,
|
||||
+ size_t bytes)
|
||||
+{
|
||||
+ struct mchp_otpc *otpc = priv;
|
||||
+ struct mchp_otpc_packet *packet;
|
||||
+ u32 *buf = val;
|
||||
+ u32 offset;
|
||||
+ size_t len = 0;
|
||||
+ int ret, payload_size;
|
||||
+
|
||||
+ /*
|
||||
+ * We reach this point with off being multiple of stride = 4 to
|
||||
+ * be able to cross the subsystem. Inside the driver we use continuous
|
||||
+ * unsigned integer numbers for packet id, thus devide off by 4
|
||||
+ * before passing it to mchp_otpc_id_to_packet().
|
||||
+ */
|
||||
+ packet = mchp_otpc_id_to_packet(otpc, off / 4);
|
||||
+ if (!packet)
|
||||
+ return -EINVAL;
|
||||
+ offset = packet->offset;
|
||||
+
|
||||
+ while (len < bytes) {
|
||||
+ ret = mchp_otpc_prepare_read(otpc, offset);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Read and save header content. */
|
||||
+ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_HR);
|
||||
+ len += sizeof(*buf);
|
||||
+ offset++;
|
||||
+ if (len >= bytes)
|
||||
+ break;
|
||||
+
|
||||
+ /* Read and save payload content. */
|
||||
+ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, *(buf - 1));
|
||||
+ writel_relaxed(0UL, otpc->base + MCHP_OTPC_AR);
|
||||
+ do {
|
||||
+ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR);
|
||||
+ len += sizeof(*buf);
|
||||
+ offset++;
|
||||
+ payload_size--;
|
||||
+ } while (payload_size >= 0 && len < bytes);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int mchp_otpc_init_packets_list(struct mchp_otpc *otpc, u32 *size)
|
||||
+{
|
||||
+ struct mchp_otpc_packet *packet;
|
||||
+ u32 word, word_pos = 0, id = 0, npackets = 0, payload_size;
|
||||
+ int ret;
|
||||
+
|
||||
+ INIT_LIST_HEAD(&otpc->packets);
|
||||
+ *size = 0;
|
||||
+
|
||||
+ while (*size < MCHP_OTPC_SIZE) {
|
||||
+ ret = mchp_otpc_prepare_read(otpc, word_pos);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ word = readl_relaxed(otpc->base + MCHP_OTPC_HR);
|
||||
+ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, word);
|
||||
+ if (!payload_size)
|
||||
+ break;
|
||||
+
|
||||
+ packet = devm_kzalloc(otpc->dev, sizeof(*packet), GFP_KERNEL);
|
||||
+ if (!packet)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ packet->id = id++;
|
||||
+ packet->offset = word_pos;
|
||||
+ INIT_LIST_HEAD(&packet->list);
|
||||
+ list_add_tail(&packet->list, &otpc->packets);
|
||||
+
|
||||
+ /* Count size by adding header and paload sizes. */
|
||||
+ *size += 4 * (payload_size + 1);
|
||||
+ /* Next word: this packet (header, payload) position + 1. */
|
||||
+ word_pos += payload_size + 2;
|
||||
+
|
||||
+ npackets++;
|
||||
+ }
|
||||
+
|
||||
+ otpc->npackets = npackets;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct nvmem_config mchp_nvmem_config = {
|
||||
+ .name = MCHP_OTPC_NAME,
|
||||
+ .type = NVMEM_TYPE_OTP,
|
||||
+ .read_only = true,
|
||||
+ .word_size = 4,
|
||||
+ .stride = 4,
|
||||
+ .reg_read = mchp_otpc_read,
|
||||
+};
|
||||
+
|
||||
+static int mchp_otpc_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct nvmem_device *nvmem;
|
||||
+ struct mchp_otpc *otpc;
|
||||
+ u32 size;
|
||||
+ int ret;
|
||||
+
|
||||
+ otpc = devm_kzalloc(&pdev->dev, sizeof(*otpc), GFP_KERNEL);
|
||||
+ if (!otpc)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ otpc->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(otpc->base))
|
||||
+ return PTR_ERR(otpc->base);
|
||||
+
|
||||
+ otpc->dev = &pdev->dev;
|
||||
+ ret = mchp_otpc_init_packets_list(otpc, &size);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ mchp_nvmem_config.dev = otpc->dev;
|
||||
+ mchp_nvmem_config.size = size;
|
||||
+ mchp_nvmem_config.priv = otpc;
|
||||
+ nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config);
|
||||
+
|
||||
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id __maybe_unused mchp_otpc_ids[] = {
|
||||
+ { .compatible = "microchip,sama7g5-otpc", },
|
||||
+ { },
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, mchp_otpc_ids);
|
||||
+
|
||||
+static struct platform_driver mchp_otpc_driver = {
|
||||
+ .probe = mchp_otpc_probe,
|
||||
+ .driver = {
|
||||
+ .name = MCHP_OTPC_NAME,
|
||||
+ .of_match_table = of_match_ptr(mchp_otpc_ids),
|
||||
+ },
|
||||
+};
|
||||
+module_platform_driver(mchp_otpc_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Claudiu Beznea <claudiu.beznea@microchip.com>");
|
||||
+MODULE_DESCRIPTION("Microchip SAMA7G5 OTPC driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@ -0,0 +1,32 @@
|
||||
From f5c97da8037b18d1256a58459fa96ed68e50fb41 Mon Sep 17 00:00:00 2001
|
||||
From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
Date: Wed, 6 Jul 2022 11:06:27 +0100
|
||||
Subject: [PATCH] nvmem: mtk-efuse: Simplify with
|
||||
devm_platform_get_and_ioremap_resource()
|
||||
|
||||
Convert platform_get_resource(), devm_ioremap_resource() to a single
|
||||
call to devm_platform_get_and_ioremap_resource(), as this is exactly
|
||||
what this function does.
|
||||
|
||||
No functional changes.
|
||||
|
||||
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220706100627.6534-8-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/mtk-efuse.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/mtk-efuse.c
|
||||
+++ b/drivers/nvmem/mtk-efuse.c
|
||||
@@ -41,8 +41,7 @@ static int mtk_efuse_probe(struct platfo
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
- priv->base = devm_ioremap_resource(dev, res);
|
||||
+ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||
if (IS_ERR(priv->base))
|
||||
return PTR_ERR(priv->base);
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
From bd1244561fa2a4531ded40dbf09c9599084f8b29 Mon Sep 17 00:00:00 2001
|
||||
From: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||
Date: Fri, 16 Sep 2022 13:04:02 +0100
|
||||
Subject: [PATCH] nvmem: core: Fix memleak in nvmem_register()
|
||||
|
||||
dev_set_name will alloc memory for nvmem->dev.kobj.name in
|
||||
nvmem_register, when nvmem_validate_keepouts failed, nvmem's
|
||||
memory will be freed and return, but nobody will free memory
|
||||
for nvmem->dev.kobj.name, there will be memleak, so moving
|
||||
nvmem_validate_keepouts() after device_register() and let
|
||||
the device core deal with cleaning name in error cases.
|
||||
|
||||
Fixes: de0534df9347 ("nvmem: core: fix error handling while validating keepout regions")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220916120402.38753-1-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 15 ++++++---------
|
||||
1 file changed, 6 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -829,21 +829,18 @@ struct nvmem_device *nvmem_register(cons
|
||||
nvmem->dev.groups = nvmem_dev_groups;
|
||||
#endif
|
||||
|
||||
- if (nvmem->nkeepout) {
|
||||
- rval = nvmem_validate_keepouts(nvmem);
|
||||
- if (rval) {
|
||||
- ida_free(&nvmem_ida, nvmem->id);
|
||||
- kfree(nvmem);
|
||||
- return ERR_PTR(rval);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
|
||||
|
||||
rval = device_register(&nvmem->dev);
|
||||
if (rval)
|
||||
goto err_put_device;
|
||||
|
||||
+ if (nvmem->nkeepout) {
|
||||
+ rval = nvmem_validate_keepouts(nvmem);
|
||||
+ if (rval)
|
||||
+ goto err_device_del;
|
||||
+ }
|
||||
+
|
||||
if (config->compat) {
|
||||
rval = nvmem_sysfs_setup_compat(nvmem, config);
|
||||
if (rval)
|
||||
@ -1,6 +1,6 @@
|
||||
From f955dc14450695564926711cf9fa8e1d5d854302 Mon Sep 17 00:00:00 2001
|
||||
From d5542923f200f95bddf524f36fd495f78aa28e3c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 15 Jun 2022 21:43:00 +0200
|
||||
Date: Fri, 16 Sep 2022 13:20:48 +0100
|
||||
Subject: [PATCH] nvmem: add driver handling U-Boot environment variables
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
@ -22,16 +22,24 @@ Kernel-parsed NVMEM cells can be read however by Linux drivers. This may
|
||||
be useful for Ethernet drivers for reading device MAC address which is
|
||||
often stored as U-Boot env variable.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220916122100.170016-2-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
MAINTAINERS | 1 +
|
||||
drivers/nvmem/Kconfig | 13 +++
|
||||
drivers/nvmem/Makefile | 2 +
|
||||
drivers/nvmem/u-boot-env.c | 218 +++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 234 insertions(+)
|
||||
create mode 100644 drivers/nvmem/u-boot-env.c
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -270,4 +270,17 @@ config SPRD_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-sprd-efuse.
|
||||
@@ -344,4 +344,17 @@ config NVMEM_APPLE_EFUSES
|
||||
This driver can also be built as a module. If so, the module will
|
||||
be called nvmem-apple-efuses.
|
||||
|
||||
+config NVMEM_U_BOOT_ENV
|
||||
+ tristate "U-Boot environment variables support"
|
||||
@ -49,10 +57,10 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
endif
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -55,3 +55,5 @@ obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynq
|
||||
nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||
obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||
nvmem_sprd_efuse-y := sprd-efuse.o
|
||||
@@ -69,3 +69,5 @@ obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvme
|
||||
nvmem-apple-efuses-y := apple-efuses.o
|
||||
obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||
nvmem-microchip-otpc-y := microchip-otpc.o
|
||||
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||
+nvmem_u-boot-env-y := u-boot-env.o
|
||||
--- /dev/null
|
||||
@ -0,0 +1,47 @@
|
||||
From 5544e90c81261e82e02bbf7c6015a4b9c8c825ef Mon Sep 17 00:00:00 2001
|
||||
From: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||
Date: Fri, 16 Sep 2022 13:20:50 +0100
|
||||
Subject: [PATCH] nvmem: core: add error handling for dev_set_name
|
||||
|
||||
The type of return value of dev_set_name is int, which may return
|
||||
wrong result, so we add error handling for it to reclaim memory
|
||||
of nvmem resource, and return early when an error occurs.
|
||||
|
||||
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220916122100.170016-4-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/core.c | 12 +++++++++---
|
||||
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/core.c
|
||||
+++ b/drivers/nvmem/core.c
|
||||
@@ -810,18 +810,24 @@ struct nvmem_device *nvmem_register(cons
|
||||
|
||||
switch (config->id) {
|
||||
case NVMEM_DEVID_NONE:
|
||||
- dev_set_name(&nvmem->dev, "%s", config->name);
|
||||
+ rval = dev_set_name(&nvmem->dev, "%s", config->name);
|
||||
break;
|
||||
case NVMEM_DEVID_AUTO:
|
||||
- dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
|
||||
+ rval = dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
|
||||
break;
|
||||
default:
|
||||
- dev_set_name(&nvmem->dev, "%s%d",
|
||||
+ rval = dev_set_name(&nvmem->dev, "%s%d",
|
||||
config->name ? : "nvmem",
|
||||
config->name ? config->id : nvmem->id);
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (rval) {
|
||||
+ ida_free(&nvmem_ida, nvmem->id);
|
||||
+ kfree(nvmem);
|
||||
+ return ERR_PTR(rval);
|
||||
+ }
|
||||
+
|
||||
nvmem->read_only = device_property_present(config->dev, "read-only") ||
|
||||
config->read_only || !nvmem->reg_write;
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
From d3524bb5b9a0c567b853a0024526afe87dde01ed Mon Sep 17 00:00:00 2001
|
||||
From: Kenneth Lee <klee33@uw.edu>
|
||||
Date: Fri, 16 Sep 2022 13:20:52 +0100
|
||||
Subject: [PATCH] nvmem: brcm_nvram: Use kzalloc for allocating only one
|
||||
element
|
||||
|
||||
Use kzalloc(...) rather than kcalloc(1, ...) because the number of
|
||||
elements we are specifying in this case is 1, so kzalloc would
|
||||
accomplish the same thing and we can simplify.
|
||||
|
||||
Signed-off-by: Kenneth Lee <klee33@uw.edu>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220916122100.170016-6-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/brcm_nvram.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/nvmem/brcm_nvram.c
|
||||
+++ b/drivers/nvmem/brcm_nvram.c
|
||||
@@ -96,7 +96,7 @@ static int brcm_nvram_parse(struct brcm_
|
||||
|
||||
len = le32_to_cpu(header.len);
|
||||
|
||||
- data = kcalloc(1, len, GFP_KERNEL);
|
||||
+ data = kzalloc(len, GFP_KERNEL);
|
||||
memcpy_fromio(data, priv->base, len);
|
||||
data[len - 1] = '\0';
|
||||
|
||||
@ -0,0 +1,270 @@
|
||||
From 28fc7c986f01fdcfd28af648be2597624cac0e27 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 16 Sep 2022 13:20:54 +0100
|
||||
Subject: [PATCH] nvmem: prefix all symbols with NVMEM_
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This unifies all NVMEM symbols. They follow one style now.
|
||||
|
||||
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220916122100.170016-8-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
arch/arm/configs/multi_v7_defconfig | 6 +++---
|
||||
arch/arm/configs/qcom_defconfig | 2 +-
|
||||
arch/arm64/configs/defconfig | 10 +++++-----
|
||||
arch/mips/configs/ci20_defconfig | 2 +-
|
||||
drivers/cpufreq/Kconfig.arm | 2 +-
|
||||
drivers/nvmem/Kconfig | 24 ++++++++++++------------
|
||||
drivers/nvmem/Makefile | 24 ++++++++++++------------
|
||||
drivers/soc/mediatek/Kconfig | 2 +-
|
||||
drivers/thermal/qcom/Kconfig | 2 +-
|
||||
9 files changed, 37 insertions(+), 37 deletions(-)
|
||||
|
||||
--- a/arch/arm/configs/multi_v7_defconfig
|
||||
+++ b/arch/arm/configs/multi_v7_defconfig
|
||||
@@ -1085,10 +1085,10 @@ CONFIG_OMAP_USB2=y
|
||||
CONFIG_TI_PIPE3=y
|
||||
CONFIG_TWL4030_USB=m
|
||||
CONFIG_NVMEM_IMX_OCOTP=y
|
||||
-CONFIG_ROCKCHIP_EFUSE=m
|
||||
+CONFIG_NVMEM_ROCKCHIP_EFUSE=m
|
||||
CONFIG_NVMEM_SUNXI_SID=y
|
||||
CONFIG_NVMEM_VF610_OCOTP=y
|
||||
-CONFIG_MESON_MX_EFUSE=m
|
||||
+CONFIG_NVMEM_MESON_MX_EFUSE=m
|
||||
CONFIG_FSI=m
|
||||
CONFIG_FSI_MASTER_GPIO=m
|
||||
CONFIG_FSI_MASTER_HUB=m
|
||||
--- a/arch/arm/configs/qcom_defconfig
|
||||
+++ b/arch/arm/configs/qcom_defconfig
|
||||
@@ -257,7 +257,7 @@ CONFIG_PHY_QCOM_APQ8064_SATA=y
|
||||
CONFIG_PHY_QCOM_IPQ806X_SATA=y
|
||||
CONFIG_PHY_QCOM_USB_HS=y
|
||||
CONFIG_PHY_QCOM_USB_HSIC=y
|
||||
-CONFIG_QCOM_QFPROM=y
|
||||
+CONFIG_NVMEM_QCOM_QFPROM=y
|
||||
CONFIG_INTERCONNECT=y
|
||||
CONFIG_INTERCONNECT_QCOM=y
|
||||
CONFIG_INTERCONNECT_QCOM_MSM8974=m
|
||||
--- a/arch/arm64/configs/defconfig
|
||||
+++ b/arch/arm64/configs/defconfig
|
||||
@@ -1022,11 +1022,11 @@ CONFIG_QCOM_L2_PMU=y
|
||||
CONFIG_QCOM_L3_PMU=y
|
||||
CONFIG_NVMEM_IMX_OCOTP=y
|
||||
CONFIG_NVMEM_IMX_OCOTP_SCU=y
|
||||
-CONFIG_QCOM_QFPROM=y
|
||||
-CONFIG_ROCKCHIP_EFUSE=y
|
||||
+CONFIG_NVMEM_QCOM_QFPROM=y
|
||||
+CONFIG_NVMEM_ROCKCHIP_EFUSE=y
|
||||
CONFIG_NVMEM_SUNXI_SID=y
|
||||
-CONFIG_UNIPHIER_EFUSE=y
|
||||
-CONFIG_MESON_EFUSE=m
|
||||
+CONFIG_NVMEM_UNIPHIER_EFUSE=y
|
||||
+CONFIG_NVMEM_MESON_EFUSE=m
|
||||
CONFIG_FPGA=y
|
||||
CONFIG_FPGA_MGR_STRATIX10_SOC=m
|
||||
CONFIG_FPGA_BRIDGE=m
|
||||
--- a/drivers/cpufreq/Kconfig.arm
|
||||
+++ b/drivers/cpufreq/Kconfig.arm
|
||||
@@ -131,7 +131,7 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||
config ARM_QCOM_CPUFREQ_NVMEM
|
||||
tristate "Qualcomm nvmem based CPUFreq"
|
||||
depends on ARCH_QCOM
|
||||
- depends on QCOM_QFPROM
|
||||
+ depends on NVMEM_QCOM_QFPROM
|
||||
depends on QCOM_SMEM
|
||||
select PM_OPP
|
||||
help
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -52,7 +52,7 @@ config NVMEM_IMX_OCOTP_SCU
|
||||
This is a driver for the SCU On-Chip OTP Controller (OCOTP)
|
||||
available on i.MX8 SoCs.
|
||||
|
||||
-config JZ4780_EFUSE
|
||||
+config NVMEM_JZ4780_EFUSE
|
||||
tristate "JZ4780 EFUSE Memory Support"
|
||||
depends on MACH_INGENIC || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -96,7 +96,7 @@ config NVMEM_MXS_OCOTP
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-mxs-ocotp.
|
||||
|
||||
-config MTK_EFUSE
|
||||
+config NVMEM_MTK_EFUSE
|
||||
tristate "Mediatek SoCs EFUSE support"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -107,7 +107,7 @@ config MTK_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called efuse-mtk.
|
||||
|
||||
-config MICROCHIP_OTPC
|
||||
+config NVMEM_MICROCHIP_OTPC
|
||||
tristate "Microchip OTPC support"
|
||||
depends on ARCH_AT91 || COMPILE_TEST
|
||||
help
|
||||
@@ -126,7 +126,7 @@ config NVMEM_NINTENDO_OTP
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-nintendo-otp.
|
||||
|
||||
-config QCOM_QFPROM
|
||||
+config NVMEM_QCOM_QFPROM
|
||||
tristate "QCOM QFPROM Support"
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -145,7 +145,7 @@ config NVMEM_SPMI_SDAM
|
||||
Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||
an interface to read/write to the SDAM module's shared memory.
|
||||
|
||||
-config ROCKCHIP_EFUSE
|
||||
+config NVMEM_ROCKCHIP_EFUSE
|
||||
tristate "Rockchip eFuse Support"
|
||||
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -156,7 +156,7 @@ config ROCKCHIP_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem_rockchip_efuse.
|
||||
|
||||
-config ROCKCHIP_OTP
|
||||
+config NVMEM_ROCKCHIP_OTP
|
||||
tristate "Rockchip OTP controller support"
|
||||
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -199,7 +199,7 @@ config NVMEM_SUNXI_SID
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem_sunxi_sid.
|
||||
|
||||
-config UNIPHIER_EFUSE
|
||||
+config NVMEM_UNIPHIER_EFUSE
|
||||
tristate "UniPhier SoCs eFuse support"
|
||||
depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -221,7 +221,7 @@ config NVMEM_VF610_OCOTP
|
||||
This driver can also be build as a module. If so, the module will
|
||||
be called nvmem-vf610-ocotp.
|
||||
|
||||
-config MESON_EFUSE
|
||||
+config NVMEM_MESON_EFUSE
|
||||
tristate "Amlogic Meson GX eFuse Support"
|
||||
depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||
help
|
||||
@@ -231,7 +231,7 @@ config MESON_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem_meson_efuse.
|
||||
|
||||
-config MESON_MX_EFUSE
|
||||
+config NVMEM_MESON_MX_EFUSE
|
||||
tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||
depends on ARCH_MESON || COMPILE_TEST
|
||||
help
|
||||
@@ -251,13 +251,13 @@ config NVMEM_SNVS_LPGPR
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-snvs-lpgpr.
|
||||
|
||||
-config RAVE_SP_EEPROM
|
||||
+config NVMEM_RAVE_SP_EEPROM
|
||||
tristate "Rave SP EEPROM Support"
|
||||
depends on RAVE_SP_CORE
|
||||
help
|
||||
Say y here to enable Rave SP EEPROM support.
|
||||
|
||||
-config SC27XX_EFUSE
|
||||
+config NVMEM_SC27XX_EFUSE
|
||||
tristate "Spreadtrum SC27XX eFuse Support"
|
||||
depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
@@ -278,7 +278,7 @@ config NVMEM_ZYNQMP
|
||||
|
||||
If sure, say yes. If unsure, say no.
|
||||
|
||||
-config SPRD_EFUSE
|
||||
+config NVMEM_SPRD_EFUSE
|
||||
tristate "Spreadtrum SoC eFuse Support"
|
||||
depends on ARCH_SPRD || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -15,7 +15,7 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-i
|
||||
nvmem-imx-ocotp-y := imx-ocotp.o
|
||||
obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o
|
||||
nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||
-obj-$(CONFIG_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||
+obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||
nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||
nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||
@@ -25,37 +25,37 @@ obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-m
|
||||
nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||
obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||
nvmem-nintendo-otp-y := nintendo-otp.o
|
||||
-obj-$(CONFIG_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||
nvmem_mtk-efuse-y := mtk-efuse.o
|
||||
-obj-$(CONFIG_QCOM_QFPROM) += nvmem_qfprom.o
|
||||
+obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||
nvmem_qfprom-y := qfprom.o
|
||||
obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||
nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||
-obj-$(CONFIG_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||
+obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||
nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||
-obj-$(CONFIG_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||
+obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||
nvmem-rockchip-otp-y := rockchip-otp.o
|
||||
obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||
nvmem_stm32_romem-y := stm32-romem.o
|
||||
obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||
nvmem_sunxi_sid-y := sunxi_sid.o
|
||||
-obj-$(CONFIG_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||
nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||
obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||
nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||
-obj-$(CONFIG_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||
+obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||
nvmem_meson_efuse-y := meson-efuse.o
|
||||
-obj-$(CONFIG_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||
+obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||
nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||
obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||
nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||
-obj-$(CONFIG_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||
+obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||
nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||
-obj-$(CONFIG_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||
nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||
obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||
nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||
-obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||
+obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||
nvmem_sprd_efuse-y := sprd-efuse.o
|
||||
obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||
nvmem-rmem-y := rmem.o
|
||||
@@ -67,7 +67,7 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm
|
||||
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||
obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||
nvmem-apple-efuses-y := apple-efuses.o
|
||||
-obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||
+obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||
nvmem-microchip-otpc-y := microchip-otpc.o
|
||||
obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||
nvmem_u-boot-env-y := u-boot-env.o
|
||||
--- a/drivers/thermal/qcom/Kconfig
|
||||
+++ b/drivers/thermal/qcom/Kconfig
|
||||
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config QCOM_TSENS
|
||||
tristate "Qualcomm TSENS Temperature Alarm"
|
||||
- depends on QCOM_QFPROM
|
||||
+ depends on NVMEM_QCOM_QFPROM
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
help
|
||||
This enables the thermal sysfs driver for the TSENS device. It shows
|
||||
@ -0,0 +1,535 @@
|
||||
From a06d9e5a63b7c2f622c908cd9600ce735e70f7c6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 16 Sep 2022 13:20:55 +0100
|
||||
Subject: [PATCH] nvmem: sort config symbols alphabetically
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1. Match what most subsystems do
|
||||
2. Simplify maintenance a bit
|
||||
3. Reduce amount of conflicts for new drivers patches
|
||||
|
||||
While at it unify indent level in Makefile.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20220916122100.170016-9-srinivas.kandagatla@linaro.org
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/Kconfig | 300 +++++++++++++++++++++--------------------
|
||||
drivers/nvmem/Makefile | 114 ++++++++--------
|
||||
2 files changed, 208 insertions(+), 206 deletions(-)
|
||||
|
||||
--- a/drivers/nvmem/Kconfig
|
||||
+++ b/drivers/nvmem/Kconfig
|
||||
@@ -21,6 +21,40 @@ config NVMEM_SYSFS
|
||||
This interface is mostly used by userspace applications to
|
||||
read/write directly into nvmem.
|
||||
|
||||
+# Devices
|
||||
+
|
||||
+config NVMEM_APPLE_EFUSES
|
||||
+ tristate "Apple eFuse support"
|
||||
+ depends on ARCH_APPLE || COMPILE_TEST
|
||||
+ default ARCH_APPLE
|
||||
+ help
|
||||
+ Say y here to enable support for reading eFuses on Apple SoCs
|
||||
+ such as the M1. These are e.g. used to store factory programmed
|
||||
+ calibration data required for the PCIe or the USB-C PHY.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module will
|
||||
+ be called nvmem-apple-efuses.
|
||||
+
|
||||
+config NVMEM_BCM_OCOTP
|
||||
+ tristate "Broadcom On-Chip OTP Controller support"
|
||||
+ depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ default ARCH_BCM_IPROC
|
||||
+ help
|
||||
+ Say y here to enable read/write access to the Broadcom OTP
|
||||
+ controller.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-bcm-ocotp.
|
||||
+
|
||||
+config NVMEM_BRCM_NVRAM
|
||||
+ tristate "Broadcom's NVRAM support"
|
||||
+ depends on ARCH_BCM_5301X || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ This driver provides support for Broadcom's NVRAM that can be accessed
|
||||
+ using I/O mapping.
|
||||
+
|
||||
config NVMEM_IMX_IIM
|
||||
tristate "i.MX IC Identification Module support"
|
||||
depends on ARCH_MXC || COMPILE_TEST
|
||||
@@ -64,6 +98,19 @@ config NVMEM_JZ4780_EFUSE
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called nvmem_jz4780_efuse.
|
||||
|
||||
+config NVMEM_LAYERSCAPE_SFP
|
||||
+ tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||
+ depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ select REGMAP_MMIO
|
||||
+ help
|
||||
+ This driver provides support to read the eFuses on Freescale
|
||||
+ Layerscape SoC's. For example, the vendor provides a per part
|
||||
+ unique ID there.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called layerscape-sfp.
|
||||
+
|
||||
config NVMEM_LPC18XX_EEPROM
|
||||
tristate "NXP LPC18XX EEPROM Memory Support"
|
||||
depends on ARCH_LPC18XX || COMPILE_TEST
|
||||
@@ -84,17 +131,32 @@ config NVMEM_LPC18XX_OTP
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called nvmem_lpc18xx_otp.
|
||||
|
||||
-config NVMEM_MXS_OCOTP
|
||||
- tristate "Freescale MXS On-Chip OTP Memory Support"
|
||||
- depends on ARCH_MXS || COMPILE_TEST
|
||||
- depends on HAS_IOMEM
|
||||
+config NVMEM_MESON_EFUSE
|
||||
+ tristate "Amlogic Meson GX eFuse Support"
|
||||
+ depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||
help
|
||||
- If you say Y here, you will get readonly access to the
|
||||
- One Time Programmable memory pages that are stored
|
||||
- on the Freescale i.MX23/i.MX28 processor.
|
||||
+ This is a driver to retrieve specific values from the eFuse found on
|
||||
+ the Amlogic Meson GX SoCs.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem-mxs-ocotp.
|
||||
+ will be called nvmem_meson_efuse.
|
||||
+
|
||||
+config NVMEM_MESON_MX_EFUSE
|
||||
+ tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||
+ depends on ARCH_MESON || COMPILE_TEST
|
||||
+ help
|
||||
+ This is a driver to retrieve specific values from the eFuse found on
|
||||
+ the Amlogic Meson6, Meson8 and Meson8b SoCs.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem_meson_mx_efuse.
|
||||
+
|
||||
+config NVMEM_MICROCHIP_OTPC
|
||||
+ tristate "Microchip OTPC support"
|
||||
+ depends on ARCH_AT91 || COMPILE_TEST
|
||||
+ help
|
||||
+ This driver enable the OTP controller available on Microchip SAMA7G5
|
||||
+ SoCs. It controlls the access to the OTP memory connected to it.
|
||||
|
||||
config NVMEM_MTK_EFUSE
|
||||
tristate "Mediatek SoCs EFUSE support"
|
||||
@@ -107,12 +169,17 @@ config NVMEM_MTK_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called efuse-mtk.
|
||||
|
||||
-config NVMEM_MICROCHIP_OTPC
|
||||
- tristate "Microchip OTPC support"
|
||||
- depends on ARCH_AT91 || COMPILE_TEST
|
||||
+config NVMEM_MXS_OCOTP
|
||||
+ tristate "Freescale MXS On-Chip OTP Memory Support"
|
||||
+ depends on ARCH_MXS || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
help
|
||||
- This driver enable the OTP controller available on Microchip SAMA7G5
|
||||
- SoCs. It controlls the access to the OTP memory connected to it.
|
||||
+ If you say Y here, you will get readonly access to the
|
||||
+ One Time Programmable memory pages that are stored
|
||||
+ on the Freescale i.MX23/i.MX28 processor.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-mxs-ocotp.
|
||||
|
||||
config NVMEM_NINTENDO_OTP
|
||||
tristate "Nintendo Wii and Wii U OTP Support"
|
||||
@@ -137,13 +204,21 @@ config NVMEM_QCOM_QFPROM
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem_qfprom.
|
||||
|
||||
-config NVMEM_SPMI_SDAM
|
||||
- tristate "SPMI SDAM Support"
|
||||
- depends on SPMI
|
||||
+config NVMEM_RAVE_SP_EEPROM
|
||||
+ tristate "Rave SP EEPROM Support"
|
||||
+ depends on RAVE_SP_CORE
|
||||
help
|
||||
- This driver supports the Shared Direct Access Memory Module on
|
||||
- Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||
- an interface to read/write to the SDAM module's shared memory.
|
||||
+ Say y here to enable Rave SP EEPROM support.
|
||||
+
|
||||
+config NVMEM_RMEM
|
||||
+ tristate "Reserved Memory Based Driver Support"
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ This driver maps reserved memory into an nvmem device. It might be
|
||||
+ useful to expose information left by firmware in memory.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-rmem.
|
||||
|
||||
config NVMEM_ROCKCHIP_EFUSE
|
||||
tristate "Rockchip eFuse Support"
|
||||
@@ -167,79 +242,16 @@ config NVMEM_ROCKCHIP_OTP
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem_rockchip_otp.
|
||||
|
||||
-config NVMEM_BCM_OCOTP
|
||||
- tristate "Broadcom On-Chip OTP Controller support"
|
||||
- depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||
- depends on HAS_IOMEM
|
||||
- default ARCH_BCM_IPROC
|
||||
- help
|
||||
- Say y here to enable read/write access to the Broadcom OTP
|
||||
- controller.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem-bcm-ocotp.
|
||||
-
|
||||
-config NVMEM_STM32_ROMEM
|
||||
- tristate "STMicroelectronics STM32 factory-programmed memory support"
|
||||
- depends on ARCH_STM32 || COMPILE_TEST
|
||||
- help
|
||||
- Say y here to enable read-only access for STMicroelectronics STM32
|
||||
- factory-programmed memory area.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem-stm32-romem.
|
||||
-
|
||||
-config NVMEM_SUNXI_SID
|
||||
- tristate "Allwinner SoCs SID support"
|
||||
- depends on ARCH_SUNXI
|
||||
- help
|
||||
- This is a driver for the 'security ID' available on various Allwinner
|
||||
- devices.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem_sunxi_sid.
|
||||
-
|
||||
-config NVMEM_UNIPHIER_EFUSE
|
||||
- tristate "UniPhier SoCs eFuse support"
|
||||
- depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||
- depends on HAS_IOMEM
|
||||
- help
|
||||
- This is a simple driver to dump specified values of UniPhier SoC
|
||||
- from eFuse.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem-uniphier-efuse.
|
||||
-
|
||||
-config NVMEM_VF610_OCOTP
|
||||
- tristate "VF610 SoC OCOTP support"
|
||||
- depends on SOC_VF610 || COMPILE_TEST
|
||||
+config NVMEM_SC27XX_EFUSE
|
||||
+ tristate "Spreadtrum SC27XX eFuse Support"
|
||||
+ depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||
depends on HAS_IOMEM
|
||||
help
|
||||
- This is a driver for the 'OCOTP' peripheral available on Vybrid
|
||||
- devices like VF5xx and VF6xx.
|
||||
-
|
||||
- This driver can also be build as a module. If so, the module will
|
||||
- be called nvmem-vf610-ocotp.
|
||||
-
|
||||
-config NVMEM_MESON_EFUSE
|
||||
- tristate "Amlogic Meson GX eFuse Support"
|
||||
- depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||
- help
|
||||
- This is a driver to retrieve specific values from the eFuse found on
|
||||
- the Amlogic Meson GX SoCs.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem_meson_efuse.
|
||||
-
|
||||
-config NVMEM_MESON_MX_EFUSE
|
||||
- tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||
- depends on ARCH_MESON || COMPILE_TEST
|
||||
- help
|
||||
- This is a driver to retrieve specific values from the eFuse found on
|
||||
- the Amlogic Meson6, Meson8 and Meson8b SoCs.
|
||||
+ This is a simple driver to dump specified values of Spreadtrum
|
||||
+ SC27XX PMICs from eFuse.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem_meson_mx_efuse.
|
||||
+ will be called nvmem-sc27xx-efuse.
|
||||
|
||||
config NVMEM_SNVS_LPGPR
|
||||
tristate "Support for Low Power General Purpose Register"
|
||||
@@ -251,32 +263,13 @@ config NVMEM_SNVS_LPGPR
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-snvs-lpgpr.
|
||||
|
||||
-config NVMEM_RAVE_SP_EEPROM
|
||||
- tristate "Rave SP EEPROM Support"
|
||||
- depends on RAVE_SP_CORE
|
||||
- help
|
||||
- Say y here to enable Rave SP EEPROM support.
|
||||
-
|
||||
-config NVMEM_SC27XX_EFUSE
|
||||
- tristate "Spreadtrum SC27XX eFuse Support"
|
||||
- depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||
- depends on HAS_IOMEM
|
||||
- help
|
||||
- This is a simple driver to dump specified values of Spreadtrum
|
||||
- SC27XX PMICs from eFuse.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem-sc27xx-efuse.
|
||||
-
|
||||
-config NVMEM_ZYNQMP
|
||||
- bool "Xilinx ZYNQMP SoC nvmem firmware support"
|
||||
- depends on ARCH_ZYNQMP
|
||||
+config NVMEM_SPMI_SDAM
|
||||
+ tristate "SPMI SDAM Support"
|
||||
+ depends on SPMI
|
||||
help
|
||||
- This is a driver to access hardware related data like
|
||||
- soc revision, IDCODE... etc by using the firmware
|
||||
- interface.
|
||||
-
|
||||
- If sure, say yes. If unsure, say no.
|
||||
+ This driver supports the Shared Direct Access Memory Module on
|
||||
+ Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||
+ an interface to read/write to the SDAM module's shared memory.
|
||||
|
||||
config NVMEM_SPRD_EFUSE
|
||||
tristate "Spreadtrum SoC eFuse Support"
|
||||
@@ -289,36 +282,15 @@ config NVMEM_SPRD_EFUSE
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-sprd-efuse.
|
||||
|
||||
-config NVMEM_RMEM
|
||||
- tristate "Reserved Memory Based Driver Support"
|
||||
- depends on HAS_IOMEM
|
||||
- help
|
||||
- This driver maps reserved memory into an nvmem device. It might be
|
||||
- useful to expose information left by firmware in memory.
|
||||
-
|
||||
- This driver can also be built as a module. If so, the module
|
||||
- will be called nvmem-rmem.
|
||||
-
|
||||
-config NVMEM_BRCM_NVRAM
|
||||
- tristate "Broadcom's NVRAM support"
|
||||
- depends on ARCH_BCM_5301X || COMPILE_TEST
|
||||
- depends on HAS_IOMEM
|
||||
- help
|
||||
- This driver provides support for Broadcom's NVRAM that can be accessed
|
||||
- using I/O mapping.
|
||||
-
|
||||
-config NVMEM_LAYERSCAPE_SFP
|
||||
- tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||
- depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||
- depends on HAS_IOMEM
|
||||
- select REGMAP_MMIO
|
||||
+config NVMEM_STM32_ROMEM
|
||||
+ tristate "STMicroelectronics STM32 factory-programmed memory support"
|
||||
+ depends on ARCH_STM32 || COMPILE_TEST
|
||||
help
|
||||
- This driver provides support to read the eFuses on Freescale
|
||||
- Layerscape SoC's. For example, the vendor provides a per part
|
||||
- unique ID there.
|
||||
+ Say y here to enable read-only access for STMicroelectronics STM32
|
||||
+ factory-programmed memory area.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
- will be called layerscape-sfp.
|
||||
+ will be called nvmem-stm32-romem.
|
||||
|
||||
config NVMEM_SUNPLUS_OCOTP
|
||||
tristate "Sunplus SoC OTP support"
|
||||
@@ -332,17 +304,15 @@ config NVMEM_SUNPLUS_OCOTP
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called nvmem-sunplus-ocotp.
|
||||
|
||||
-config NVMEM_APPLE_EFUSES
|
||||
- tristate "Apple eFuse support"
|
||||
- depends on ARCH_APPLE || COMPILE_TEST
|
||||
- default ARCH_APPLE
|
||||
+config NVMEM_SUNXI_SID
|
||||
+ tristate "Allwinner SoCs SID support"
|
||||
+ depends on ARCH_SUNXI
|
||||
help
|
||||
- Say y here to enable support for reading eFuses on Apple SoCs
|
||||
- such as the M1. These are e.g. used to store factory programmed
|
||||
- calibration data required for the PCIe or the USB-C PHY.
|
||||
+ This is a driver for the 'security ID' available on various Allwinner
|
||||
+ devices.
|
||||
|
||||
- This driver can also be built as a module. If so, the module will
|
||||
- be called nvmem-apple-efuses.
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem_sunxi_sid.
|
||||
|
||||
config NVMEM_U_BOOT_ENV
|
||||
tristate "U-Boot environment variables support"
|
||||
@@ -357,4 +327,36 @@ config NVMEM_U_BOOT_ENV
|
||||
|
||||
If compiled as module it will be called nvmem_u-boot-env.
|
||||
|
||||
+config NVMEM_UNIPHIER_EFUSE
|
||||
+ tristate "UniPhier SoCs eFuse support"
|
||||
+ depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ This is a simple driver to dump specified values of UniPhier SoC
|
||||
+ from eFuse.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called nvmem-uniphier-efuse.
|
||||
+
|
||||
+config NVMEM_VF610_OCOTP
|
||||
+ tristate "VF610 SoC OCOTP support"
|
||||
+ depends on SOC_VF610 || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ This is a driver for the 'OCOTP' peripheral available on Vybrid
|
||||
+ devices like VF5xx and VF6xx.
|
||||
+
|
||||
+ This driver can also be build as a module. If so, the module will
|
||||
+ be called nvmem-vf610-ocotp.
|
||||
+
|
||||
+config NVMEM_ZYNQMP
|
||||
+ bool "Xilinx ZYNQMP SoC nvmem firmware support"
|
||||
+ depends on ARCH_ZYNQMP
|
||||
+ help
|
||||
+ This is a driver to access hardware related data like
|
||||
+ soc revision, IDCODE... etc by using the firmware
|
||||
+ interface.
|
||||
+
|
||||
+ If sure, say yes. If unsure, say no.
|
||||
+
|
||||
endif
|
||||
--- a/drivers/nvmem/Makefile
|
||||
+++ b/drivers/nvmem/Makefile
|
||||
@@ -7,67 +7,67 @@ obj-$(CONFIG_NVMEM) += nvmem_core.o
|
||||
nvmem_core-y := core.o
|
||||
|
||||
# Devices
|
||||
-obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o
|
||||
-nvmem-bcm-ocotp-y := bcm-ocotp.o
|
||||
-obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o
|
||||
-nvmem-imx-iim-y := imx-iim.o
|
||||
-obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o
|
||||
-nvmem-imx-ocotp-y := imx-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||
+nvmem-apple-efuses-y := apple-efuses.o
|
||||
+obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o
|
||||
+nvmem-bcm-ocotp-y := bcm-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||
+nvmem_brcm_nvram-y := brcm_nvram.o
|
||||
+obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o
|
||||
+nvmem-imx-iim-y := imx-iim.o
|
||||
+obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o
|
||||
+nvmem-imx-ocotp-y := imx-ocotp.o
|
||||
obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o
|
||||
-nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||
-obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||
-nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||
+nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||
+obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||
+nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||
+nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||
-nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||
-obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o
|
||||
-nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||
-obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||
-nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||
-obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||
-nvmem-nintendo-otp-y := nintendo-otp.o
|
||||
+nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||
+obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o
|
||||
+nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||
+obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||
+nvmem_meson_efuse-y := meson-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||
+nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||
+nvmem-microchip-otpc-y := microchip-otpc.o
|
||||
obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||
-nvmem_mtk-efuse-y := mtk-efuse.o
|
||||
-obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||
-nvmem_qfprom-y := qfprom.o
|
||||
-obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||
-nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||
+nvmem_mtk-efuse-y := mtk-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||
+nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||
+nvmem-nintendo-otp-y := nintendo-otp.o
|
||||
+obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||
+nvmem_qfprom-y := qfprom.o
|
||||
+obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||
+nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||
+obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||
+nvmem-rmem-y := rmem.o
|
||||
obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||
-nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||
+nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||
obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||
-nvmem-rockchip-otp-y := rockchip-otp.o
|
||||
-obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||
-nvmem_stm32_romem-y := stm32-romem.o
|
||||
-obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||
-nvmem_sunxi_sid-y := sunxi_sid.o
|
||||
-obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||
-nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||
-obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||
-nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||
-obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||
-nvmem_meson_efuse-y := meson-efuse.o
|
||||
-obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||
-nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||
-obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||
-nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||
-obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||
-nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||
+nvmem-rockchip-otp-y := rockchip-otp.o
|
||||
obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||
-nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||
-obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||
-nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||
-obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||
-nvmem_sprd_efuse-y := sprd-efuse.o
|
||||
-obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||
-nvmem-rmem-y := rmem.o
|
||||
-obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||
-nvmem_brcm_nvram-y := brcm_nvram.o
|
||||
-obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||
-nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||
+nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||
+nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||
+obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||
+nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||
+obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||
+nvmem_sprd_efuse-y := sprd-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||
+nvmem_stm32_romem-y := stm32-romem.o
|
||||
obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||
-nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||
-obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||
-nvmem-apple-efuses-y := apple-efuses.o
|
||||
-obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||
-nvmem-microchip-otpc-y := microchip-otpc.o
|
||||
-obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||
-nvmem_u-boot-env-y := u-boot-env.o
|
||||
+nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||
+nvmem_sunxi_sid-y := sunxi_sid.o
|
||||
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||
+nvmem_u-boot-env-y := u-boot-env.o
|
||||
+obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||
+nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||
+obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||
+nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||
+obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||
+nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user