Merge branch 'openwrt:master' into master
This commit is contained in:
commit
3d1301750c
248 changed files with 13275 additions and 729 deletions
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() {
|
||||
|
|
|
@ -171,7 +171,7 @@ endef
|
|||
define KernelPackage/mt7615-firmware
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7615e firmware
|
||||
DEFAULT:=PACKAGE_kmod-mt7615e
|
||||
DEPENDS+=+kmod-mt7615e
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7615e
|
||||
|
@ -182,6 +182,12 @@ define KernelPackage/mt7615e
|
|||
AUTOLOAD:=$(call AutoProbe,mt7615e)
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7622-firmware
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7622 firmware
|
||||
DEPENDS+=+kmod-mt7615e
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7663-firmware-ap
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7663e firmware (optimized for AP)
|
||||
|
@ -218,10 +224,16 @@ define KernelPackage/mt7663u
|
|||
AUTOLOAD:=$(call AutoProbe,mt7663u)
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7915-firmware
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7915 firmware
|
||||
DEPENDS+=+kmod-mt7915e
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7915e
|
||||
$(KernelPackage/mt76-default)
|
||||
TITLE:=MediaTek MT7915e wireless driver
|
||||
DEPENDS+=@PCI_SUPPORT +kmod-mt7615-common +kmod-hwmon-core +kmod-thermal +@DRIVER_11AX_SUPPORT +@KERNEL_RELAY
|
||||
DEPENDS+=@PCI_SUPPORT +kmod-mt76-connac +kmod-hwmon-core +kmod-thermal +@DRIVER_11AX_SUPPORT +@KERNEL_RELAY
|
||||
FILES:= $(PKG_BUILD_DIR)/mt7915/mt7915e.ko
|
||||
AUTOLOAD:=$(call AutoProbe,mt7915e)
|
||||
endef
|
||||
|
@ -439,9 +451,14 @@ define KernelPackage/mt7615-firmware/install
|
|||
$(PKG_BUILD_DIR)/firmware/mt7615_cr4.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7615_n9.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7615_rom_patch.bin \
|
||||
$(if $(CONFIG_TARGET_mediatek_mt7622), \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7622_n9.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7622_rom_patch.bin) \
|
||||
$(1)/lib/firmware/mediatek
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7622-firmware/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
|
||||
cp \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7622_n9.bin \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7622_rom_patch.bin \
|
||||
$(1)/lib/firmware/mediatek
|
||||
endef
|
||||
|
||||
|
@ -461,7 +478,7 @@ define KernelPackage/mt7663-firmware-sta/install
|
|||
$(1)/lib/firmware/mediatek
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7915e/install
|
||||
define KernelPackage/mt7915-firmware/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
|
||||
cp \
|
||||
$(PKG_BUILD_DIR)/firmware/mt7915_wa.bin \
|
||||
|
@ -520,12 +537,14 @@ $(eval $(call KernelPackage,mt76-connac))
|
|||
$(eval $(call KernelPackage,mt76-sdio))
|
||||
$(eval $(call KernelPackage,mt7615-common))
|
||||
$(eval $(call KernelPackage,mt7615-firmware))
|
||||
$(eval $(call KernelPackage,mt7622-firmware))
|
||||
$(eval $(call KernelPackage,mt7615e))
|
||||
$(eval $(call KernelPackage,mt7663-firmware-ap))
|
||||
$(eval $(call KernelPackage,mt7663-firmware-sta))
|
||||
$(eval $(call KernelPackage,mt7663-usb-sdio))
|
||||
$(eval $(call KernelPackage,mt7663u))
|
||||
$(eval $(call KernelPackage,mt7663s))
|
||||
$(eval $(call KernelPackage,mt7915-firmware))
|
||||
$(eval $(call KernelPackage,mt7915e))
|
||||
$(eval $(call KernelPackage,mt7916-firmware))
|
||||
$(eval $(call KernelPackage,mt7986-firmware))
|
||||
|
|
|
@ -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
|
|
@ -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,12 +565,12 @@
|
|||
|
||||
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
|
||||
+ else if (IS_SRC_OR_DST_PORT(BGP_PORT))
|
||||
bgp_print(ndo, bp, length);
|
||||
|
@ -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[] =
|
||||
|
|
|
@ -208,6 +208,15 @@ config BUSYBOX_DEFAULT_PASSWORD_MINLEN
|
|||
config BUSYBOX_DEFAULT_MD5_SMALL
|
||||
int
|
||||
default 1
|
||||
config BUSYBOX_DEFAULT_SHA1_SMALL
|
||||
int
|
||||
default 3
|
||||
config BUSYBOX_DEFAULT_SHA1_HWACCEL
|
||||
bool
|
||||
default y
|
||||
config BUSYBOX_DEFAULT_SHA256_HWACCEL
|
||||
bool
|
||||
default y
|
||||
config BUSYBOX_DEFAULT_SHA3_SMALL
|
||||
int
|
||||
default 1
|
||||
|
@ -298,6 +307,15 @@ config BUSYBOX_DEFAULT_UNICODE_NEUTRAL_TABLE
|
|||
config BUSYBOX_DEFAULT_UNICODE_PRESERVE_BROKEN
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_LOOP_CONFIGURE
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_NO_LOOP_CONFIGURE
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_TRY_LOOP_CONFIGURE
|
||||
bool
|
||||
default y
|
||||
config BUSYBOX_DEFAULT_FEATURE_SEAMLESS_XZ
|
||||
bool
|
||||
default n
|
||||
|
@ -860,6 +878,9 @@ config BUSYBOX_DEFAULT_TRUNCATE
|
|||
bool
|
||||
default y if TARGET_bcm53xx
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_TSORT
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_TTY
|
||||
bool
|
||||
default n
|
||||
|
@ -2162,6 +2183,9 @@ config BUSYBOX_DEFAULT_RUNLEVEL
|
|||
config BUSYBOX_DEFAULT_RX
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_SEEDRNG
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_SETFATTR
|
||||
bool
|
||||
default n
|
||||
|
@ -2174,6 +2198,9 @@ config BUSYBOX_DEFAULT_STRINGS
|
|||
config BUSYBOX_DEFAULT_TIME
|
||||
bool
|
||||
default y
|
||||
config BUSYBOX_DEFAULT_TREE
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_TS
|
||||
bool
|
||||
default n
|
||||
|
@ -2682,6 +2709,9 @@ config BUSYBOX_DEFAULT_FEATURE_UDHCPC_SANITIZEOPT
|
|||
config BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT
|
||||
string
|
||||
default "/usr/share/udhcpc/default.script"
|
||||
config BUSYBOX_DEFAULT_UDHCPC6_DEFAULT_SCRIPT
|
||||
string
|
||||
default ""
|
||||
config BUSYBOX_DEFAULT_UDHCPC6
|
||||
bool
|
||||
default n
|
||||
|
@ -3012,6 +3042,9 @@ config BUSYBOX_DEFAULT_ASH_PRINTF
|
|||
config BUSYBOX_DEFAULT_ASH_TEST
|
||||
bool
|
||||
default y
|
||||
config BUSYBOX_DEFAULT_ASH_SLEEP
|
||||
bool
|
||||
default n
|
||||
config BUSYBOX_DEFAULT_ASH_HELP
|
||||
bool
|
||||
default n
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=busybox
|
||||
PKG_VERSION:=1.35.0
|
||||
PKG_RELEASE:=$(AUTORELEASE)
|
||||
PKG_VERSION:=1.36.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_FLAGS:=essential
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=https://www.busybox.net/downloads \
|
||||
http://sources.buildroot.net
|
||||
PKG_HASH:=faeeb244c35a348a334f4a59e44626ee870fb07b6884d68c10ae8bc19f83a694
|
||||
PKG_HASH:=542750c8af7cb2630e201780b4f99f3dcceeb06f505b479ec68241c1e6af61a5
|
||||
|
||||
PKG_BUILD_DEPENDS:=BUSYBOX_CONFIG_PAM:libpam
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
|
|
@ -653,7 +653,7 @@ config BUSYBOX_CONFIG_SORT
|
|||
sort is used to sort lines of text in specified files.
|
||||
|
||||
config BUSYBOX_CONFIG_FEATURE_SORT_BIG
|
||||
bool "Full SuSv3 compliant sort (support -ktcbdfiogM)"
|
||||
bool "Full SuSv3 compliant sort (support -ktcbdfioghM)"
|
||||
default BUSYBOX_DEFAULT_FEATURE_SORT_BIG
|
||||
depends on BUSYBOX_CONFIG_SORT
|
||||
help
|
||||
|
@ -851,6 +851,11 @@ config BUSYBOX_CONFIG_TRUNCATE
|
|||
help
|
||||
truncate truncates files to a given size. If a file does
|
||||
not exist, it is created unless told otherwise.
|
||||
config BUSYBOX_CONFIG_TSORT
|
||||
bool "tsort (0.7 kb)"
|
||||
default BUSYBOX_DEFAULT_TSORT
|
||||
help
|
||||
tsort performs a topological sort.
|
||||
config BUSYBOX_CONFIG_TTY
|
||||
bool "tty (3.6 kb)"
|
||||
default BUSYBOX_DEFAULT_TTY
|
||||
|
|
|
@ -98,21 +98,47 @@ config BUSYBOX_CONFIG_MD5_SMALL
|
|||
default BUSYBOX_DEFAULT_MD5_SMALL # all "fast or small" options default to small
|
||||
range 0 3
|
||||
help
|
||||
Trade binary size versus speed for the md5sum algorithm.
|
||||
Trade binary size versus speed for the md5 algorithm.
|
||||
Approximate values running uClibc and hashing
|
||||
linux-2.4.4.tar.bz2 were:
|
||||
value user times (sec) text size (386)
|
||||
0 (fastest) 1.1 6144
|
||||
1 1.4 5392
|
||||
2 3.0 5088
|
||||
3 (smallest) 5.1 4912
|
||||
value user times (sec) text size (386)
|
||||
0 (fastest) 1.1 6144
|
||||
1 1.4 5392
|
||||
2 3.0 5088
|
||||
3 (smallest) 5.1 4912
|
||||
|
||||
config BUSYBOX_CONFIG_SHA1_SMALL
|
||||
int "SHA1: Trade bytes for speed (0:fast, 3:slow)"
|
||||
default BUSYBOX_DEFAULT_SHA1_SMALL # all "fast or small" options default to small
|
||||
range 0 3
|
||||
help
|
||||
Trade binary size versus speed for the sha1 algorithm.
|
||||
With FEATURE_COPYBUF_KB=64:
|
||||
throughput MB/s size of sha1_process_block64
|
||||
value 486 x86-64 486 x86-64
|
||||
0 440 485 3481 3502
|
||||
1 265 265 641 696
|
||||
2,3 220 210 342 364
|
||||
|
||||
config BUSYBOX_CONFIG_SHA1_HWACCEL
|
||||
bool "SHA1: Use hardware accelerated instructions if possible"
|
||||
default BUSYBOX_DEFAULT_SHA1_HWACCEL
|
||||
help
|
||||
On x86, this adds ~590 bytes of code. Throughput
|
||||
is about twice as fast as fully-unrolled generic code.
|
||||
|
||||
config BUSYBOX_CONFIG_SHA256_HWACCEL
|
||||
bool "SHA256: Use hardware accelerated instructions if possible"
|
||||
default BUSYBOX_DEFAULT_SHA256_HWACCEL
|
||||
help
|
||||
On x86, this adds ~1k bytes of code.
|
||||
|
||||
config BUSYBOX_CONFIG_SHA3_SMALL
|
||||
int "SHA3: Trade bytes for speed (0:fast, 1:slow)"
|
||||
default BUSYBOX_DEFAULT_SHA3_SMALL # all "fast or small" options default to small
|
||||
range 0 1
|
||||
help
|
||||
Trade binary size versus speed for the sha3sum algorithm.
|
||||
Trade binary size versus speed for the sha3 algorithm.
|
||||
SHA3_SMALL=0 compared to SHA3_SMALL=1 (approximate):
|
||||
64-bit x86: +270 bytes of code, 45% faster
|
||||
32-bit x86: +450 bytes of code, 75% faster
|
||||
|
@ -399,3 +425,25 @@ config BUSYBOX_CONFIG_UNICODE_PRESERVE_BROKEN
|
|||
For example, this means that entering 'l', 's', ' ', 0xff, [Enter]
|
||||
at shell prompt will list file named 0xff (single char name
|
||||
with char value 255), not file named '?'.
|
||||
|
||||
choice
|
||||
prompt "Use LOOP_CONFIGURE for losetup and loop mounts"
|
||||
default BUSYBOX_CONFIG_TRY_LOOP_CONFIGURE
|
||||
help
|
||||
LOOP_CONFIGURE is added to Linux 5.8
|
||||
https://lwn.net/Articles/820408/
|
||||
This allows userspace to completely setup a loop device with a single
|
||||
ioctl, removing the in-between state where the device can be partially
|
||||
configured - eg the loop device has a backing file associated with it,
|
||||
but is reading from the wrong offset.
|
||||
|
||||
config BUSYBOX_CONFIG_LOOP_CONFIGURE
|
||||
bool "use LOOP_CONFIGURE, needs kernel >= 5.8"
|
||||
|
||||
config BUSYBOX_CONFIG_NO_LOOP_CONFIGURE
|
||||
bool "use LOOP_SET_FD + LOOP_SET_STATUS"
|
||||
|
||||
config BUSYBOX_CONFIG_TRY_LOOP_CONFIGURE
|
||||
bool "try LOOP_CONFIGURE, fall back to LOOP_SET_FD + LOOP_SET_STATUS"
|
||||
|
||||
endchoice
|
||||
|
|
|
@ -704,6 +704,13 @@ config BUSYBOX_CONFIG_RX
|
|||
default BUSYBOX_DEFAULT_RX
|
||||
help
|
||||
Receive files using the Xmodem protocol.
|
||||
config BUSYBOX_CONFIG_SEEDRNG
|
||||
bool "seedrng (1.3 kb)"
|
||||
default BUSYBOX_DEFAULT_SEEDRNG
|
||||
help
|
||||
Seed the kernel RNG from seed files, meant to be called
|
||||
once during startup, once during shutdown, and optionally
|
||||
at some periodic interval in between.
|
||||
config BUSYBOX_CONFIG_SETFATTR
|
||||
bool "setfattr (3.7 kb)"
|
||||
default BUSYBOX_DEFAULT_SETFATTR
|
||||
|
@ -727,6 +734,11 @@ config BUSYBOX_CONFIG_TIME
|
|||
The time command runs the specified program with the given arguments.
|
||||
When the command finishes, time writes a message to standard output
|
||||
giving timing statistics about this program run.
|
||||
config BUSYBOX_CONFIG_TREE
|
||||
bool "tree (0.6 kb)"
|
||||
default BUSYBOX_DEFAULT_TREE
|
||||
help
|
||||
List files and directories in a tree structure.
|
||||
config BUSYBOX_CONFIG_TS
|
||||
bool "ts (450 bytes)"
|
||||
default BUSYBOX_DEFAULT_TS
|
||||
|
|
|
@ -93,12 +93,17 @@ config BUSYBOX_CONFIG_FEATURE_UDHCPC_SANITIZEOPT
|
|||
config BUSYBOX_CONFIG_UDHCPC_DEFAULT_SCRIPT
|
||||
string "Absolute path to config script"
|
||||
default BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT
|
||||
depends on BUSYBOX_CONFIG_UDHCPC || BUSYBOX_CONFIG_UDHCPC6
|
||||
depends on BUSYBOX_CONFIG_UDHCPC
|
||||
help
|
||||
This script is called after udhcpc receives an answer. See
|
||||
examples/udhcp for a working example. Normally it is safe
|
||||
to leave this untouched.
|
||||
|
||||
config BUSYBOX_CONFIG_UDHCPC6_DEFAULT_SCRIPT
|
||||
string "Absolute path to config script for IPv6"
|
||||
default BUSYBOX_DEFAULT_UDHCPC6_DEFAULT_SCRIPT
|
||||
depends on BUSYBOX_CONFIG_UDHCPC6
|
||||
|
||||
# udhcpc6 config is inserted here:
|
||||
config BUSYBOX_CONFIG_UDHCPC6
|
||||
bool "udhcpc6 (21 kb)"
|
||||
|
|
|
@ -201,6 +201,11 @@ config BUSYBOX_CONFIG_ASH_TEST
|
|||
default BUSYBOX_DEFAULT_ASH_TEST
|
||||
depends on BUSYBOX_CONFIG_SHELL_ASH
|
||||
|
||||
config BUSYBOX_CONFIG_ASH_SLEEP
|
||||
bool "sleep builtin"
|
||||
default BUSYBOX_DEFAULT_ASH_SLEEP
|
||||
depends on BUSYBOX_CONFIG_SHELL_ASH
|
||||
|
||||
config BUSYBOX_CONFIG_ASH_HELP
|
||||
bool "help builtin"
|
||||
default BUSYBOX_DEFAULT_ASH_HELP
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
From e63d7cdfdac78c6fd27e9e63150335767592b85e Mon Sep 17 00:00:00 2001
|
||||
From: Natanael Copa <ncopa@alpinelinux.org>
|
||||
Date: Fri, 17 Jun 2022 17:45:34 +0200
|
||||
Subject: awk: fix use after free (CVE-2022-30065)
|
||||
|
||||
fixes https://bugs.busybox.net/show_bug.cgi?id=14781
|
||||
|
||||
function old new delta
|
||||
evaluate 3343 3357 +14
|
||||
|
||||
Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
|
||||
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
|
||||
---
|
||||
editors/awk.c | 3 +++
|
||||
testsuite/awk.tests | 6 ++++++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
--- a/editors/awk.c
|
||||
+++ b/editors/awk.c
|
||||
@@ -3114,6 +3114,9 @@ static var *evaluate(node *op, var *res)
|
||||
|
||||
case XC( OC_MOVE ):
|
||||
debug_printf_eval("MOVE\n");
|
||||
+ /* make sure that we never return a temp var */
|
||||
+ if (L.v == TMPVAR0)
|
||||
+ L.v = res;
|
||||
/* if source is a temporary string, jusk relink it to dest */
|
||||
if (R.v == TMPVAR1
|
||||
&& !(R.v->type & VF_NUMBER)
|
||||
--- a/testsuite/awk.tests
|
||||
+++ b/testsuite/awk.tests
|
||||
@@ -469,4 +469,10 @@ testing 'awk printf %% prints one %' \
|
||||
"%\n" \
|
||||
'' ''
|
||||
|
||||
+testing 'awk assign while test' \
|
||||
+ "awk '\$1==\$1=\"foo\" {print \$1}'" \
|
||||
+ "foo\n" \
|
||||
+ "" \
|
||||
+ "foo"
|
||||
+
|
||||
exit $FAILCOUNT
|
|
@ -8,12 +8,12 @@
|
|||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=util-linux
|
||||
PKG_VERSION:=2.38
|
||||
PKG_RELEASE:=$(AUTORELEASE)
|
||||
PKG_VERSION:=2.38.1
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
|
||||
PKG_SOURCE_URL:=@KERNEL/linux/utils/$(PKG_NAME)/v2.38
|
||||
PKG_HASH:=6d111cbe4d55b336db2f1fbeffbc65b89908704c01136371d32aa9bec373eb64
|
||||
PKG_HASH:=60492a19b44e6cf9a3ddff68325b333b8b52b6c59ce3ebd6a0ecaa4c5117e84f
|
||||
PKG_CPE_ID:=cpe:/a:kernel:util-linux
|
||||
|
||||
PKG_LICENSE:=GPL-2.0-only
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
From c387d4fe7a1435a762a5b7d8b75feb13ad613315 Mon Sep 17 00:00:00 2001
|
||||
From: Anatoly Pugachev <matorola@gmail.com>
|
||||
Date: Fri, 8 Apr 2022 15:34:16 +0300
|
||||
Subject: [PATCH] libfdisk: meson.build fix typo
|
||||
|
||||
---
|
||||
libfdisk/meson.build | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/libfdisk/meson.build
|
||||
+++ b/libfdisk/meson.build
|
||||
@@ -11,7 +11,7 @@ libfdisk_h = configure_file(
|
||||
output : 'libfdisk.h',
|
||||
configuration : defs,
|
||||
install : build_libfdisk,
|
||||
- install_dir : join_paths(get_option('includedir'), 'libfisk'),
|
||||
+ install_dir : join_paths(get_option('includedir'), 'libfdisk'),
|
||||
)
|
||||
|
||||
lib_fdisk_sources = '''
|
|
@ -1,22 +0,0 @@
|
|||
From 38b15ca2dc4ca32bbe4a2449e1c7b645e4577840 Mon Sep 17 00:00:00 2001
|
||||
From: Rosen Penev <rosenp@gmail.com>
|
||||
Date: Fri, 29 Apr 2022 16:53:43 -0700
|
||||
Subject: [PATCH 1/7] meson: fix compilation without systemd
|
||||
|
||||
systemdsystemunitdir is used elsewhere.
|
||||
|
||||
Signed-off-by: Rosen Penev <rosenp@gmail.com>
|
||||
---
|
||||
meson.build | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -720,6 +720,7 @@ if fs_search_path_extra != ''
|
||||
endif
|
||||
conf.set_quoted('FS_SEARCH_PATH', fs_search_path)
|
||||
|
||||
+systemdsystemunitdir = ''
|
||||
if systemd.found()
|
||||
systemdsystemunitdir = systemd.get_pkgconfig_variable('systemdsystemunitdir')
|
||||
endif
|
|
@ -1,21 +0,0 @@
|
|||
From e51565b653cf09985df57cb7254b16d5af5df223 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Caramelli <caramelli.devel@gmail.com>
|
||||
Date: Fri, 29 Apr 2022 18:16:36 +0200
|
||||
Subject: [PATCH] meson: fix when HAVE_CLOCK_GETTIME is set
|
||||
|
||||
Signed-off-by: Nicolas Caramelli <caramelli.devel@gmail.com>
|
||||
---
|
||||
meson.build | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -602,7 +602,7 @@ if not have
|
||||
have = cc.has_function('clock_gettime',
|
||||
dependencies : realtime_libs)
|
||||
endif
|
||||
-conf.set('HAVE_CLOCK_GETTIME', have_dirfd ? 1 : false)
|
||||
+conf.set('HAVE_CLOCK_GETTIME', have ? 1 : false)
|
||||
|
||||
thread_libs = dependency('threads')
|
||||
|
|
@ -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
|
||||
;;
|
||||
|
|
|
@ -255,6 +255,7 @@ foreach my $mirror (@ARGV) {
|
|||
push @mirrors, "https://mirrors.tuna.tsinghua.edu.cn/debian/$1";
|
||||
push @mirrors, "https://mirrors.ustc.edu.cn/debian/$1"
|
||||
} elsif ($mirror =~ /^\@APACHE\/(.+)$/) {
|
||||
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
|
||||
|
||||
|
|
|
@ -1324,6 +1324,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
|
||||
|
@ -1891,7 +1907,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
|
||||
|
||||
|
@ -1899,7 +1915,7 @@ define Device/ocedo_raccoon
|
|||
SOC := ar9344
|
||||
DEVICE_VENDOR := Ocedo
|
||||
DEVICE_MODEL := Raccoon
|
||||
IMAGE_SIZE := 7424k
|
||||
IMAGE_SIZE := 14848k
|
||||
endef
|
||||
TARGET_DEVICES += ocedo_raccoon
|
||||
|
||||
|
@ -1908,7 +1924,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.
|
||||
*/
|
||||
|
|
|
@ -25,7 +25,7 @@ Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
|
|||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -17521,6 +17521,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
@@ -17529,6 +17529,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/sony,imx412.yaml
|
||||
F: drivers/media/i2c/imx412.c
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
|
|||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -17535,6 +17535,7 @@ M: Raspberry Pi Kernel Maintenance <kern
|
||||
@@ -17543,6 +17543,7 @@ M: Raspberry Pi Kernel Maintenance <kern
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
|
|
@ -132,7 +132,7 @@ Signed-off-by: Lee Jackson <info@arducam.com>
|
|||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -17539,6 +17539,14 @@ F: Documentation/devicetree/bindings/med
|
||||
@@ -17547,6 +17547,14 @@ F: Documentation/devicetree/bindings/med
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx477.yaml
|
||||
F: drivers/media/i2c/imx477.c
|
||||
|
||||
|
|
|
@ -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,95 @@
|
|||
From 3637d49e11219512920aca8b8ccd0994be33fa8b Mon Sep 17 00:00:00 2001
|
||||
From: Lee Jones <lee.jones@linaro.org>
|
||||
Date: Thu, 18 Mar 2021 10:40:30 +0000
|
||||
Subject: [PATCH] of: base: Fix some formatting issues and provide missing
|
||||
descriptions
|
||||
|
||||
Fixes the following W=1 kernel build warning(s):
|
||||
|
||||
drivers/of/base.c:315: warning: Function parameter or member 'cpun' not described in '__of_find_n_match_cpu_property'
|
||||
drivers/of/base.c:315: warning: Function parameter or member 'prop_name' not described in '__of_find_n_match_cpu_property'
|
||||
drivers/of/base.c:315: warning: Function parameter or member 'cpu' not described in '__of_find_n_match_cpu_property'
|
||||
drivers/of/base.c:315: warning: Function parameter or member 'thread' not described in '__of_find_n_match_cpu_property'
|
||||
drivers/of/base.c:315: warning: expecting prototype for property holds the physical id of the(). Prototype was for __of_find_n_match_cpu_property() instead
|
||||
drivers/of/base.c:1139: warning: Function parameter or member 'match' not described in 'of_find_matching_node_and_match'
|
||||
drivers/of/base.c:1779: warning: Function parameter or member 'np' not described in '__of_add_property'
|
||||
drivers/of/base.c:1779: warning: Function parameter or member 'prop' not described in '__of_add_property'
|
||||
drivers/of/base.c:1800: warning: Function parameter or member 'np' not described in 'of_add_property'
|
||||
drivers/of/base.c:1800: warning: Function parameter or member 'prop' not described in 'of_add_property'
|
||||
drivers/of/base.c:1849: warning: Function parameter or member 'np' not described in 'of_remove_property'
|
||||
drivers/of/base.c:1849: warning: Function parameter or member 'prop' not described in 'of_remove_property'
|
||||
drivers/of/base.c:2137: warning: Function parameter or member 'dn' not described in 'of_console_check'
|
||||
drivers/of/base.c:2137: warning: Function parameter or member 'name' not described in 'of_console_check'
|
||||
drivers/of/base.c:2137: warning: Function parameter or member 'index' not described in 'of_console_check'
|
||||
|
||||
Cc: Rob Herring <robh+dt@kernel.org>
|
||||
Cc: Frank Rowand <frowand.list@gmail.com>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Signed-off-by: Lee Jones <lee.jones@linaro.org>
|
||||
Signed-off-by: Rob Herring <robh@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20210318104036.3175910-5-lee.jones@linaro.org
|
||||
---
|
||||
drivers/of/base.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/of/base.c
|
||||
+++ b/drivers/of/base.c
|
||||
@@ -305,7 +305,7 @@ bool __weak arch_match_cpu_phys_id(int c
|
||||
return (u32)phys_id == cpu;
|
||||
}
|
||||
|
||||
-/**
|
||||
+/*
|
||||
* Checks if the given "prop_name" property holds the physical id of the
|
||||
* core/thread corresponding to the logical cpu 'cpu'. If 'thread' is not
|
||||
* NULL, local thread number within the core is returned in it.
|
||||
@@ -1128,7 +1128,7 @@ EXPORT_SYMBOL(of_match_node);
|
||||
* will; typically, you pass what the previous call
|
||||
* returned. of_node_put() will be called on it
|
||||
* @matches: array of of device match structures to search in
|
||||
- * @match Updated to point at the matches entry which matched
|
||||
+ * @match: Updated to point at the matches entry which matched
|
||||
*
|
||||
* Returns a node pointer with refcount incremented, use
|
||||
* of_node_put() on it when done.
|
||||
@@ -1779,6 +1779,8 @@ EXPORT_SYMBOL(of_count_phandle_with_args
|
||||
|
||||
/**
|
||||
* __of_add_property - Add a property to a node without lock operations
|
||||
+ * @np: Caller's Device Node
|
||||
+ * @prob: Property to add
|
||||
*/
|
||||
int __of_add_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
@@ -1800,6 +1802,8 @@ int __of_add_property(struct device_node
|
||||
|
||||
/**
|
||||
* of_add_property - Add a property to a node
|
||||
+ * @np: Caller's Device Node
|
||||
+ * @prob: Property to add
|
||||
*/
|
||||
int of_add_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
@@ -1844,6 +1848,8 @@ int __of_remove_property(struct device_n
|
||||
|
||||
/**
|
||||
* of_remove_property - Remove a property from a node.
|
||||
+ * @np: Caller's Device Node
|
||||
+ * @prob: Property to remove
|
||||
*
|
||||
* Note that we don't actually remove it, since we have given out
|
||||
* who-knows-how-many pointers to the data using get-property.
|
||||
@@ -2130,9 +2136,9 @@ EXPORT_SYMBOL_GPL(of_alias_get_highest_i
|
||||
|
||||
/**
|
||||
* of_console_check() - Test and setup console for DT setup
|
||||
- * @dn - Pointer to device node
|
||||
- * @name - Name to use for preferred console without index. ex. "ttyS"
|
||||
- * @index - Index to use for preferred console.
|
||||
+ * @dn: Pointer to device node
|
||||
+ * @name: Name to use for preferred console without index. ex. "ttyS"
|
||||
+ * @index: Index to use for preferred console.
|
||||
*
|
||||
* Check if the given device node matches the stdout-path property in the
|
||||
* /chosen node. If it does then register it as the preferred console and return
|
|
@ -0,0 +1,489 @@
|
|||
From 62f026f082e4d762a47b43ea693b38f025122332 Mon Sep 17 00:00:00 2001
|
||||
From: Rob Herring <robh@kernel.org>
|
||||
Date: Fri, 26 Mar 2021 13:26:06 -0600
|
||||
Subject: [PATCH] of: Fix kerneldoc output formatting
|
||||
|
||||
The indentation of the kerneldoc comments affects the output formatting.
|
||||
Leading tabs in particular don't work, sections need to be indented
|
||||
under the section header, and several code blocks are reformatted.
|
||||
|
||||
Cc: Frank Rowand <frowand.list@gmail.com>
|
||||
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
Signed-off-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20210326192606.3702739-1-robh@kernel.org
|
||||
---
|
||||
drivers/of/base.c | 275 +++++++++++++++++++++++-----------------------
|
||||
drivers/of/fdt.c | 9 +-
|
||||
2 files changed, 141 insertions(+), 143 deletions(-)
|
||||
|
||||
--- a/drivers/of/base.c
|
||||
+++ b/drivers/of/base.c
|
||||
@@ -651,11 +651,11 @@ bool of_device_is_big_endian(const struc
|
||||
EXPORT_SYMBOL(of_device_is_big_endian);
|
||||
|
||||
/**
|
||||
- * of_get_parent - Get a node's parent if any
|
||||
- * @node: Node to get parent
|
||||
+ * of_get_parent - Get a node's parent if any
|
||||
+ * @node: Node to get parent
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_get_parent(const struct device_node *node)
|
||||
{
|
||||
@@ -673,15 +673,15 @@ struct device_node *of_get_parent(const
|
||||
EXPORT_SYMBOL(of_get_parent);
|
||||
|
||||
/**
|
||||
- * of_get_next_parent - Iterate to a node's parent
|
||||
- * @node: Node to get parent of
|
||||
+ * of_get_next_parent - Iterate to a node's parent
|
||||
+ * @node: Node to get parent of
|
||||
*
|
||||
- * This is like of_get_parent() except that it drops the
|
||||
- * refcount on the passed node, making it suitable for iterating
|
||||
- * through a node's parents.
|
||||
+ * This is like of_get_parent() except that it drops the
|
||||
+ * refcount on the passed node, making it suitable for iterating
|
||||
+ * through a node's parents.
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_get_next_parent(struct device_node *node)
|
||||
{
|
||||
@@ -719,13 +719,13 @@ static struct device_node *__of_get_next
|
||||
child = __of_get_next_child(parent, child))
|
||||
|
||||
/**
|
||||
- * of_get_next_child - Iterate a node childs
|
||||
- * @node: parent node
|
||||
- * @prev: previous child of the parent node, or NULL to get first
|
||||
- *
|
||||
- * Returns a node pointer with refcount incremented, use of_node_put() on
|
||||
- * it when done. Returns NULL when prev is the last child. Decrements the
|
||||
- * refcount of prev.
|
||||
+ * of_get_next_child - Iterate a node childs
|
||||
+ * @node: parent node
|
||||
+ * @prev: previous child of the parent node, or NULL to get first
|
||||
+ *
|
||||
+ * Return: A node pointer with refcount incremented, use of_node_put() on
|
||||
+ * it when done. Returns NULL when prev is the last child. Decrements the
|
||||
+ * refcount of prev.
|
||||
*/
|
||||
struct device_node *of_get_next_child(const struct device_node *node,
|
||||
struct device_node *prev)
|
||||
@@ -741,12 +741,12 @@ struct device_node *of_get_next_child(co
|
||||
EXPORT_SYMBOL(of_get_next_child);
|
||||
|
||||
/**
|
||||
- * of_get_next_available_child - Find the next available child node
|
||||
- * @node: parent node
|
||||
- * @prev: previous child of the parent node, or NULL to get first
|
||||
+ * of_get_next_available_child - Find the next available child node
|
||||
+ * @node: parent node
|
||||
+ * @prev: previous child of the parent node, or NULL to get first
|
||||
*
|
||||
- * This function is like of_get_next_child(), except that it
|
||||
- * automatically skips any disabled nodes (i.e. status = "disabled").
|
||||
+ * This function is like of_get_next_child(), except that it
|
||||
+ * automatically skips any disabled nodes (i.e. status = "disabled").
|
||||
*/
|
||||
struct device_node *of_get_next_available_child(const struct device_node *node,
|
||||
struct device_node *prev)
|
||||
@@ -772,12 +772,12 @@ struct device_node *of_get_next_availabl
|
||||
EXPORT_SYMBOL(of_get_next_available_child);
|
||||
|
||||
/**
|
||||
- * of_get_next_cpu_node - Iterate on cpu nodes
|
||||
- * @prev: previous child of the /cpus node, or NULL to get first
|
||||
+ * of_get_next_cpu_node - Iterate on cpu nodes
|
||||
+ * @prev: previous child of the /cpus node, or NULL to get first
|
||||
*
|
||||
- * Returns a cpu node pointer with refcount incremented, use of_node_put()
|
||||
- * on it when done. Returns NULL when prev is the last child. Decrements
|
||||
- * the refcount of prev.
|
||||
+ * Return: A cpu node pointer with refcount incremented, use of_node_put()
|
||||
+ * on it when done. Returns NULL when prev is the last child. Decrements
|
||||
+ * the refcount of prev.
|
||||
*/
|
||||
struct device_node *of_get_next_cpu_node(struct device_node *prev)
|
||||
{
|
||||
@@ -834,15 +834,15 @@ struct device_node *of_get_compatible_ch
|
||||
EXPORT_SYMBOL(of_get_compatible_child);
|
||||
|
||||
/**
|
||||
- * of_get_child_by_name - Find the child node by name for a given parent
|
||||
- * @node: parent node
|
||||
- * @name: child name to look for.
|
||||
- *
|
||||
- * This function looks for child node for given matching name
|
||||
- *
|
||||
- * Returns a node pointer if found, with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
- * Returns NULL if node is not found.
|
||||
+ * of_get_child_by_name - Find the child node by name for a given parent
|
||||
+ * @node: parent node
|
||||
+ * @name: child name to look for.
|
||||
+ *
|
||||
+ * This function looks for child node for given matching name
|
||||
+ *
|
||||
+ * Return: A node pointer if found, with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
+ * Returns NULL if node is not found.
|
||||
*/
|
||||
struct device_node *of_get_child_by_name(const struct device_node *node,
|
||||
const char *name)
|
||||
@@ -893,22 +893,22 @@ struct device_node *__of_find_node_by_fu
|
||||
}
|
||||
|
||||
/**
|
||||
- * of_find_node_opts_by_path - Find a node matching a full OF path
|
||||
- * @path: Either the full path to match, or if the path does not
|
||||
- * start with '/', the name of a property of the /aliases
|
||||
- * node (an alias). In the case of an alias, the node
|
||||
- * matching the alias' value will be returned.
|
||||
- * @opts: Address of a pointer into which to store the start of
|
||||
- * an options string appended to the end of the path with
|
||||
- * a ':' separator.
|
||||
- *
|
||||
- * Valid paths:
|
||||
- * /foo/bar Full path
|
||||
- * foo Valid alias
|
||||
- * foo/bar Valid alias + relative path
|
||||
+ * of_find_node_opts_by_path - Find a node matching a full OF path
|
||||
+ * @path: Either the full path to match, or if the path does not
|
||||
+ * start with '/', the name of a property of the /aliases
|
||||
+ * node (an alias). In the case of an alias, the node
|
||||
+ * matching the alias' value will be returned.
|
||||
+ * @opts: Address of a pointer into which to store the start of
|
||||
+ * an options string appended to the end of the path with
|
||||
+ * a ':' separator.
|
||||
+ *
|
||||
+ * Valid paths:
|
||||
+ * * /foo/bar Full path
|
||||
+ * * foo Valid alias
|
||||
+ * * foo/bar Valid alias + relative path
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_node_opts_by_path(const char *path, const char **opts)
|
||||
{
|
||||
@@ -958,15 +958,15 @@ struct device_node *of_find_node_opts_by
|
||||
EXPORT_SYMBOL(of_find_node_opts_by_path);
|
||||
|
||||
/**
|
||||
- * of_find_node_by_name - Find a node by its "name" property
|
||||
- * @from: The node to start searching from or NULL; the node
|
||||
+ * of_find_node_by_name - Find a node by its "name" property
|
||||
+ * @from: The node to start searching from or NULL; the node
|
||||
* you pass will not be searched, only the next one
|
||||
* will. Typically, you pass what the previous call
|
||||
* returned. of_node_put() will be called on @from.
|
||||
- * @name: The name string to match against
|
||||
+ * @name: The name string to match against
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_node_by_name(struct device_node *from,
|
||||
const char *name)
|
||||
@@ -985,16 +985,16 @@ struct device_node *of_find_node_by_name
|
||||
EXPORT_SYMBOL(of_find_node_by_name);
|
||||
|
||||
/**
|
||||
- * of_find_node_by_type - Find a node by its "device_type" property
|
||||
- * @from: The node to start searching from, or NULL to start searching
|
||||
+ * of_find_node_by_type - Find a node by its "device_type" property
|
||||
+ * @from: The node to start searching from, or NULL to start searching
|
||||
* the entire device tree. The node you pass will not be
|
||||
* searched, only the next one will; typically, you pass
|
||||
* what the previous call returned. of_node_put() will be
|
||||
* called on from for you.
|
||||
- * @type: The type string to match against
|
||||
+ * @type: The type string to match against
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_node_by_type(struct device_node *from,
|
||||
const char *type)
|
||||
@@ -1013,18 +1013,18 @@ struct device_node *of_find_node_by_type
|
||||
EXPORT_SYMBOL(of_find_node_by_type);
|
||||
|
||||
/**
|
||||
- * of_find_compatible_node - Find a node based on type and one of the
|
||||
+ * of_find_compatible_node - Find a node based on type and one of the
|
||||
* tokens in its "compatible" property
|
||||
- * @from: The node to start searching from or NULL, the node
|
||||
- * you pass will not be searched, only the next one
|
||||
- * will; typically, you pass what the previous call
|
||||
- * returned. of_node_put() will be called on it
|
||||
- * @type: The type string to match "device_type" or NULL to ignore
|
||||
- * @compatible: The string to match to one of the tokens in the device
|
||||
- * "compatible" list.
|
||||
+ * @from: The node to start searching from or NULL, the node
|
||||
+ * you pass will not be searched, only the next one
|
||||
+ * will; typically, you pass what the previous call
|
||||
+ * returned. of_node_put() will be called on it
|
||||
+ * @type: The type string to match "device_type" or NULL to ignore
|
||||
+ * @compatible: The string to match to one of the tokens in the device
|
||||
+ * "compatible" list.
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_compatible_node(struct device_node *from,
|
||||
const char *type, const char *compatible)
|
||||
@@ -1044,16 +1044,16 @@ struct device_node *of_find_compatible_n
|
||||
EXPORT_SYMBOL(of_find_compatible_node);
|
||||
|
||||
/**
|
||||
- * of_find_node_with_property - Find a node which has a property with
|
||||
- * the given name.
|
||||
- * @from: The node to start searching from or NULL, the node
|
||||
- * you pass will not be searched, only the next one
|
||||
- * will; typically, you pass what the previous call
|
||||
- * returned. of_node_put() will be called on it
|
||||
- * @prop_name: The name of the property to look for.
|
||||
+ * of_find_node_with_property - Find a node which has a property with
|
||||
+ * the given name.
|
||||
+ * @from: The node to start searching from or NULL, the node
|
||||
+ * you pass will not be searched, only the next one
|
||||
+ * will; typically, you pass what the previous call
|
||||
+ * returned. of_node_put() will be called on it
|
||||
+ * @prop_name: The name of the property to look for.
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_node_with_property(struct device_node *from,
|
||||
const char *prop_name)
|
||||
@@ -1102,10 +1102,10 @@ const struct of_device_id *__of_match_no
|
||||
|
||||
/**
|
||||
* of_match_node - Tell if a device_node has a matching of_match structure
|
||||
- * @matches: array of of device match structures to search in
|
||||
- * @node: the of device structure to match against
|
||||
+ * @matches: array of of device match structures to search in
|
||||
+ * @node: the of device structure to match against
|
||||
*
|
||||
- * Low level utility function used by device matching.
|
||||
+ * Low level utility function used by device matching.
|
||||
*/
|
||||
const struct of_device_id *of_match_node(const struct of_device_id *matches,
|
||||
const struct device_node *node)
|
||||
@@ -1121,17 +1121,17 @@ const struct of_device_id *of_match_node
|
||||
EXPORT_SYMBOL(of_match_node);
|
||||
|
||||
/**
|
||||
- * of_find_matching_node_and_match - Find a node based on an of_device_id
|
||||
- * match table.
|
||||
- * @from: The node to start searching from or NULL, the node
|
||||
- * you pass will not be searched, only the next one
|
||||
- * will; typically, you pass what the previous call
|
||||
- * returned. of_node_put() will be called on it
|
||||
- * @matches: array of of device match structures to search in
|
||||
- * @match: Updated to point at the matches entry which matched
|
||||
+ * of_find_matching_node_and_match - Find a node based on an of_device_id
|
||||
+ * match table.
|
||||
+ * @from: The node to start searching from or NULL, the node
|
||||
+ * you pass will not be searched, only the next one
|
||||
+ * will; typically, you pass what the previous call
|
||||
+ * returned. of_node_put() will be called on it
|
||||
+ * @matches: array of of device match structures to search in
|
||||
+ * @match: Updated to point at the matches entry which matched
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_matching_node_and_match(struct device_node *from,
|
||||
const struct of_device_id *matches,
|
||||
@@ -1465,21 +1465,21 @@ EXPORT_SYMBOL(of_parse_phandle);
|
||||
* Caller is responsible to call of_node_put() on the returned out_args->np
|
||||
* pointer.
|
||||
*
|
||||
- * Example:
|
||||
+ * Example::
|
||||
*
|
||||
- * phandle1: node1 {
|
||||
+ * phandle1: node1 {
|
||||
* #list-cells = <2>;
|
||||
- * }
|
||||
+ * };
|
||||
*
|
||||
- * phandle2: node2 {
|
||||
+ * phandle2: node2 {
|
||||
* #list-cells = <1>;
|
||||
- * }
|
||||
+ * };
|
||||
*
|
||||
- * node3 {
|
||||
+ * node3 {
|
||||
* list = <&phandle1 1 2 &phandle2 3>;
|
||||
- * }
|
||||
+ * };
|
||||
*
|
||||
- * To get a device_node of the `node2' node you may call this:
|
||||
+ * To get a device_node of the ``node2`` node you may call this:
|
||||
* of_parse_phandle_with_args(node3, "list", "#list-cells", 1, &args);
|
||||
*/
|
||||
int of_parse_phandle_with_args(const struct device_node *np, const char *list_name,
|
||||
@@ -1517,29 +1517,29 @@ EXPORT_SYMBOL(of_parse_phandle_with_args
|
||||
* Caller is responsible to call of_node_put() on the returned out_args->np
|
||||
* pointer.
|
||||
*
|
||||
- * Example:
|
||||
- *
|
||||
- * phandle1: node1 {
|
||||
- * #list-cells = <2>;
|
||||
- * }
|
||||
- *
|
||||
- * phandle2: node2 {
|
||||
- * #list-cells = <1>;
|
||||
- * }
|
||||
+ * Example::
|
||||
*
|
||||
- * phandle3: node3 {
|
||||
- * #list-cells = <1>;
|
||||
- * list-map = <0 &phandle2 3>,
|
||||
- * <1 &phandle2 2>,
|
||||
- * <2 &phandle1 5 1>;
|
||||
- * list-map-mask = <0x3>;
|
||||
- * };
|
||||
- *
|
||||
- * node4 {
|
||||
- * list = <&phandle1 1 2 &phandle3 0>;
|
||||
- * }
|
||||
+ * phandle1: node1 {
|
||||
+ * #list-cells = <2>;
|
||||
+ * };
|
||||
+ *
|
||||
+ * phandle2: node2 {
|
||||
+ * #list-cells = <1>;
|
||||
+ * };
|
||||
+ *
|
||||
+ * phandle3: node3 {
|
||||
+ * #list-cells = <1>;
|
||||
+ * list-map = <0 &phandle2 3>,
|
||||
+ * <1 &phandle2 2>,
|
||||
+ * <2 &phandle1 5 1>;
|
||||
+ * list-map-mask = <0x3>;
|
||||
+ * };
|
||||
+ *
|
||||
+ * node4 {
|
||||
+ * list = <&phandle1 1 2 &phandle3 0>;
|
||||
+ * };
|
||||
*
|
||||
- * To get a device_node of the `node2' node you may call this:
|
||||
+ * To get a device_node of the ``node2`` node you may call this:
|
||||
* of_parse_phandle_with_args(node4, "list", "list", 1, &args);
|
||||
*/
|
||||
int of_parse_phandle_with_args_map(const struct device_node *np,
|
||||
@@ -1699,19 +1699,19 @@ EXPORT_SYMBOL(of_parse_phandle_with_args
|
||||
* Caller is responsible to call of_node_put() on the returned out_args->np
|
||||
* pointer.
|
||||
*
|
||||
- * Example:
|
||||
+ * Example::
|
||||
*
|
||||
- * phandle1: node1 {
|
||||
- * }
|
||||
+ * phandle1: node1 {
|
||||
+ * };
|
||||
*
|
||||
- * phandle2: node2 {
|
||||
- * }
|
||||
+ * phandle2: node2 {
|
||||
+ * };
|
||||
*
|
||||
- * node3 {
|
||||
- * list = <&phandle1 0 2 &phandle2 2 3>;
|
||||
- * }
|
||||
+ * node3 {
|
||||
+ * list = <&phandle1 0 2 &phandle2 2 3>;
|
||||
+ * };
|
||||
*
|
||||
- * To get a device_node of the `node2' node you may call this:
|
||||
+ * To get a device_node of the ``node2`` node you may call this:
|
||||
* of_parse_phandle_with_fixed_args(node3, "list", 2, 1, &args);
|
||||
*/
|
||||
int of_parse_phandle_with_fixed_args(const struct device_node *np,
|
||||
@@ -1957,13 +1957,12 @@ static void of_alias_add(struct alias_pr
|
||||
|
||||
/**
|
||||
* of_alias_scan - Scan all properties of the 'aliases' node
|
||||
+ * @dt_alloc: An allocator that provides a virtual address to memory
|
||||
+ * for storing the resulting tree
|
||||
*
|
||||
* The function scans all the properties of the 'aliases' node and populates
|
||||
* the global lookup table with the properties. It returns the
|
||||
* number of alias properties found, or an error code in case of failure.
|
||||
- *
|
||||
- * @dt_alloc: An allocator that provides a virtual address to memory
|
||||
- * for storing the resulting tree
|
||||
*/
|
||||
void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
|
||||
{
|
||||
@@ -2158,12 +2157,12 @@ bool of_console_check(struct device_node
|
||||
EXPORT_SYMBOL_GPL(of_console_check);
|
||||
|
||||
/**
|
||||
- * of_find_next_cache_node - Find a node's subsidiary cache
|
||||
- * @np: node of type "cpu" or "cache"
|
||||
+ * of_find_next_cache_node - Find a node's subsidiary cache
|
||||
+ * @np: node of type "cpu" or "cache"
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
- * of_node_put() on it when done. Caller should hold a reference
|
||||
- * to np.
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
+ * of_node_put() on it when done. Caller should hold a reference
|
||||
+ * to np.
|
||||
*/
|
||||
struct device_node *of_find_next_cache_node(const struct device_node *np)
|
||||
{
|
||||
--- a/drivers/of/fdt.c
|
||||
+++ b/drivers/of/fdt.c
|
||||
@@ -349,11 +349,6 @@ static int unflatten_dt_nodes(const void
|
||||
|
||||
/**
|
||||
* __unflatten_device_tree - create tree of device_nodes from flat blob
|
||||
- *
|
||||
- * unflattens a device-tree, creating the
|
||||
- * tree of struct device_node. It also fills the "name" and "type"
|
||||
- * pointers of the nodes so the normal device-tree walking functions
|
||||
- * can be used.
|
||||
* @blob: The blob to expand
|
||||
* @dad: Parent device node
|
||||
* @mynodes: The device_node tree created by the call
|
||||
@@ -361,6 +356,10 @@ static int unflatten_dt_nodes(const void
|
||||
* for the resulting tree
|
||||
* @detached: if true set OF_DETACHED on @mynodes
|
||||
*
|
||||
+ * unflattens a device-tree, creating the tree of struct device_node. It also
|
||||
+ * fills the "name" and "type" pointers of the nodes so the normal device-tree
|
||||
+ * walking functions can be used.
|
||||
+ *
|
||||
* Returns NULL on failure or the memory chunk containing the unflattened
|
||||
* device tree on success.
|
||||
*/
|
|
@ -0,0 +1,787 @@
|
|||
From 8c8239c2c1fb82f171cb22a707f3bb88a2f22109 Mon Sep 17 00:00:00 2001
|
||||
From: Rob Herring <robh@kernel.org>
|
||||
Date: Thu, 25 Mar 2021 10:47:12 -0600
|
||||
Subject: [PATCH] of: Add missing 'Return' section in kerneldoc comments
|
||||
|
||||
Many of the DT kerneldoc comments are lacking a 'Return' section. Let's
|
||||
add the section in cases we have a description of return values. There's
|
||||
still some cases where the return values are not documented.
|
||||
|
||||
Cc: Frank Rowand <frowand.list@gmail.com>
|
||||
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
Signed-off-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20210325164713.1296407-8-robh@kernel.org
|
||||
---
|
||||
drivers/of/base.c | 39 +++++++++++++------------
|
||||
drivers/of/dynamic.c | 19 ++++++++-----
|
||||
drivers/of/fdt.c | 8 +++---
|
||||
drivers/of/irq.c | 14 ++++-----
|
||||
drivers/of/overlay.c | 16 +++++------
|
||||
drivers/of/platform.c | 10 +++----
|
||||
drivers/of/property.c | 66 +++++++++++++++++++++++++++----------------
|
||||
include/linux/of.h | 63 ++++++++++++++++++++++++++---------------
|
||||
8 files changed, 140 insertions(+), 95 deletions(-)
|
||||
|
||||
--- a/drivers/of/base.c
|
||||
+++ b/drivers/of/base.c
|
||||
@@ -244,7 +244,7 @@ struct device_node *__of_find_all_nodes(
|
||||
* @prev: Previous node or NULL to start iteration
|
||||
* of_node_put() will be called on it
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
* of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_all_nodes(struct device_node *prev)
|
||||
@@ -374,7 +374,7 @@ bool __weak arch_find_n_match_cpu_physic
|
||||
* before booting secondary cores. This function uses arch_match_cpu_phys_id
|
||||
* which can be overridden by architecture specific implementation.
|
||||
*
|
||||
- * Returns a node pointer for the logical cpu with refcount incremented, use
|
||||
+ * Return: A node pointer for the logical cpu with refcount incremented, use
|
||||
* of_node_put() on it when done. Returns NULL if not found.
|
||||
*/
|
||||
struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
|
||||
@@ -394,8 +394,8 @@ EXPORT_SYMBOL(of_get_cpu_node);
|
||||
*
|
||||
* @cpu_node: Pointer to the device_node for CPU.
|
||||
*
|
||||
- * Returns the logical CPU number of the given CPU device_node.
|
||||
- * Returns -ENODEV if the CPU is not found.
|
||||
+ * Return: The logical CPU number of the given CPU device_node or -ENODEV if the
|
||||
+ * CPU is not found.
|
||||
*/
|
||||
int of_cpu_node_to_id(struct device_node *cpu_node)
|
||||
{
|
||||
@@ -427,7 +427,7 @@ EXPORT_SYMBOL(of_cpu_node_to_id);
|
||||
* bindings. This function check for both and returns the idle state node for
|
||||
* the requested index.
|
||||
*
|
||||
- * In case an idle state node is found at @index, the refcount is incremented
|
||||
+ * Return: An idle state node if found at @index. The refcount is incremented
|
||||
* for it, so call of_node_put() on it when done. Returns NULL if not found.
|
||||
*/
|
||||
struct device_node *of_get_cpu_state_node(struct device_node *cpu_node,
|
||||
@@ -561,7 +561,7 @@ int of_device_compatible_match(struct de
|
||||
* of_machine_is_compatible - Test root of device tree for a given compatible value
|
||||
* @compat: compatible string to look for in root node's compatible property.
|
||||
*
|
||||
- * Returns a positive integer if the root node has the given value in its
|
||||
+ * Return: A positive integer if the root node has the given value in its
|
||||
* compatible property.
|
||||
*/
|
||||
int of_machine_is_compatible(const char *compat)
|
||||
@@ -583,7 +583,7 @@ EXPORT_SYMBOL(of_machine_is_compatible);
|
||||
*
|
||||
* @device: Node to check for availability, with locks already held
|
||||
*
|
||||
- * Returns true if the status property is absent or set to "okay" or "ok",
|
||||
+ * Return: True if the status property is absent or set to "okay" or "ok",
|
||||
* false otherwise
|
||||
*/
|
||||
static bool __of_device_is_available(const struct device_node *device)
|
||||
@@ -611,7 +611,7 @@ static bool __of_device_is_available(con
|
||||
*
|
||||
* @device: Node to check for availability
|
||||
*
|
||||
- * Returns true if the status property is absent or set to "okay" or "ok",
|
||||
+ * Return: True if the status property is absent or set to "okay" or "ok",
|
||||
* false otherwise
|
||||
*/
|
||||
bool of_device_is_available(const struct device_node *device)
|
||||
@@ -632,7 +632,7 @@ EXPORT_SYMBOL(of_device_is_available);
|
||||
*
|
||||
* @device: Node to check for endianness
|
||||
*
|
||||
- * Returns true if the device has a "big-endian" property, or if the kernel
|
||||
+ * Return: True if the device has a "big-endian" property, or if the kernel
|
||||
* was compiled for BE *and* the device has a "native-endian" property.
|
||||
* Returns false otherwise.
|
||||
*
|
||||
@@ -816,7 +816,7 @@ EXPORT_SYMBOL(of_get_next_cpu_node);
|
||||
* Lookup child node whose compatible property contains the given compatible
|
||||
* string.
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use of_node_put() on it
|
||||
+ * Return: a node pointer with refcount incremented, use of_node_put() on it
|
||||
* when done; or NULL if not found.
|
||||
*/
|
||||
struct device_node *of_get_compatible_child(const struct device_node *parent,
|
||||
@@ -1170,7 +1170,7 @@ EXPORT_SYMBOL(of_find_matching_node_and_
|
||||
* It does this by stripping the manufacturer prefix (as delimited by a ',')
|
||||
* from the first entry in the compatible list property.
|
||||
*
|
||||
- * This routine returns 0 on success, <0 on failure.
|
||||
+ * Return: This routine returns 0 on success, <0 on failure.
|
||||
*/
|
||||
int of_modalias_node(struct device_node *node, char *modalias, int len)
|
||||
{
|
||||
@@ -1190,7 +1190,7 @@ EXPORT_SYMBOL_GPL(of_modalias_node);
|
||||
* of_find_node_by_phandle - Find a node given a phandle
|
||||
* @handle: phandle of the node to find
|
||||
*
|
||||
- * Returns a node pointer with refcount incremented, use
|
||||
+ * Return: A node pointer with refcount incremented, use
|
||||
* of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_find_node_by_phandle(phandle handle)
|
||||
@@ -1431,7 +1431,7 @@ static int __of_parse_phandle_with_args(
|
||||
* @index: For properties holding a table of phandles, this is the index into
|
||||
* the table
|
||||
*
|
||||
- * Returns the device_node pointer with refcount incremented. Use
|
||||
+ * Return: The device_node pointer with refcount incremented. Use
|
||||
* of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_parse_phandle(const struct device_node *np,
|
||||
@@ -1731,7 +1731,7 @@ EXPORT_SYMBOL(of_parse_phandle_with_fixe
|
||||
* @list_name: property name that contains a list
|
||||
* @cells_name: property name that specifies phandles' arguments count
|
||||
*
|
||||
- * Returns the number of phandle + argument tuples within a property. It
|
||||
+ * Return: The number of phandle + argument tuples within a property. It
|
||||
* is a typical pattern to encode a list of phandle and variable
|
||||
* arguments into a single property. The number of arguments is encoded
|
||||
* by a property in the phandle-target node. For example, a gpios
|
||||
@@ -2031,7 +2031,9 @@ void of_alias_scan(void * (*dt_alloc)(u6
|
||||
* @stem: Alias stem of the given device_node
|
||||
*
|
||||
* The function travels the lookup table to get the alias id for the given
|
||||
- * device_node and alias stem. It returns the alias id if found.
|
||||
+ * device_node and alias stem.
|
||||
+ *
|
||||
+ * Return: The alias id if found.
|
||||
*/
|
||||
int of_alias_get_id(struct device_node *np, const char *stem)
|
||||
{
|
||||
@@ -2140,8 +2142,9 @@ EXPORT_SYMBOL_GPL(of_alias_get_highest_i
|
||||
* @index: Index to use for preferred console.
|
||||
*
|
||||
* Check if the given device node matches the stdout-path property in the
|
||||
- * /chosen node. If it does then register it as the preferred console and return
|
||||
- * TRUE. Otherwise return FALSE.
|
||||
+ * /chosen node. If it does then register it as the preferred console.
|
||||
+ *
|
||||
+ * Return: TRUE if console successfully setup. Otherwise return FALSE.
|
||||
*/
|
||||
bool of_console_check(struct device_node *dn, char *name, int index)
|
||||
{
|
||||
@@ -2192,7 +2195,7 @@ struct device_node *of_find_next_cache_n
|
||||
*
|
||||
* @cpu: cpu number(logical index) for which the last cache level is needed
|
||||
*
|
||||
- * Returns the the level at which the last cache is present. It is exactly
|
||||
+ * Return: The the level at which the last cache is present. It is exactly
|
||||
* same as the total number of cache levels for the given logical cpu.
|
||||
*/
|
||||
int of_find_last_cache_level(unsigned int cpu)
|
||||
--- a/drivers/of/dynamic.c
|
||||
+++ b/drivers/of/dynamic.c
|
||||
@@ -27,7 +27,7 @@ static struct device_node *kobj_to_devic
|
||||
* @node: Node to inc refcount, NULL is supported to simplify writing of
|
||||
* callers
|
||||
*
|
||||
- * Returns node.
|
||||
+ * Return: The node with refcount incremented.
|
||||
*/
|
||||
struct device_node *of_node_get(struct device_node *node)
|
||||
{
|
||||
@@ -104,7 +104,8 @@ int of_reconfig_notify(unsigned long act
|
||||
* @arg - argument of the of notifier
|
||||
*
|
||||
* Returns the new state of a device based on the notifier used.
|
||||
- * Returns 0 on device going from enabled to disabled, 1 on device
|
||||
+ *
|
||||
+ * Return: 0 on device going from enabled to disabled, 1 on device
|
||||
* going from disabled to enabled and -1 on no change.
|
||||
*/
|
||||
int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr)
|
||||
@@ -371,7 +372,8 @@ void of_node_release(struct kobject *kob
|
||||
* property structure and the property name & contents. The property's
|
||||
* flags have the OF_DYNAMIC bit set so that we can differentiate between
|
||||
* dynamically allocated properties and not.
|
||||
- * Returns the newly allocated property or NULL on out of memory error.
|
||||
+ *
|
||||
+ * Return: The newly allocated property or NULL on out of memory error.
|
||||
*/
|
||||
struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
|
||||
{
|
||||
@@ -414,7 +416,7 @@ struct property *__of_prop_dup(const str
|
||||
* another node. The node data are dynamically allocated and all the node
|
||||
* flags have the OF_DYNAMIC & OF_DETACHED bits set.
|
||||
*
|
||||
- * Returns the newly allocated node or NULL on out of memory error.
|
||||
+ * Return: The newly allocated node or NULL on out of memory error.
|
||||
*/
|
||||
struct device_node *__of_node_dup(const struct device_node *np,
|
||||
const char *full_name)
|
||||
@@ -780,7 +782,8 @@ static int __of_changeset_apply(struct o
|
||||
* Any side-effects of live tree state changes are applied here on
|
||||
* success, like creation/destruction of devices and side-effects
|
||||
* like creation of sysfs properties and directories.
|
||||
- * Returns 0 on success, a negative error value in case of an error.
|
||||
+ *
|
||||
+ * Return: 0 on success, a negative error value in case of an error.
|
||||
* On error the partially applied effects are reverted.
|
||||
*/
|
||||
int of_changeset_apply(struct of_changeset *ocs)
|
||||
@@ -874,7 +877,8 @@ static int __of_changeset_revert(struct
|
||||
* was before the application.
|
||||
* Any side-effects like creation/destruction of devices and
|
||||
* removal of sysfs properties and directories are applied.
|
||||
- * Returns 0 on success, a negative error value in case of an error.
|
||||
+ *
|
||||
+ * Return: 0 on success, a negative error value in case of an error.
|
||||
*/
|
||||
int of_changeset_revert(struct of_changeset *ocs)
|
||||
{
|
||||
@@ -902,7 +906,8 @@ EXPORT_SYMBOL_GPL(of_changeset_revert);
|
||||
* + OF_RECONFIG_ADD_PROPERTY
|
||||
* + OF_RECONFIG_REMOVE_PROPERTY,
|
||||
* + OF_RECONFIG_UPDATE_PROPERTY
|
||||
- * Returns 0 on success, a negative error value in case of an error.
|
||||
+ *
|
||||
+ * Return: 0 on success, a negative error value in case of an error.
|
||||
*/
|
||||
int of_changeset_action(struct of_changeset *ocs, unsigned long action,
|
||||
struct device_node *np, struct property *prop)
|
||||
--- a/drivers/of/fdt.c
|
||||
+++ b/drivers/of/fdt.c
|
||||
@@ -282,7 +282,7 @@ static void reverse_nodes(struct device_
|
||||
* @dad: Parent struct device_node
|
||||
* @nodepp: The device_node tree created by the call
|
||||
*
|
||||
- * It returns the size of unflattened device tree or error code
|
||||
+ * Return: The size of unflattened device tree or error code
|
||||
*/
|
||||
static int unflatten_dt_nodes(const void *blob,
|
||||
void *mem,
|
||||
@@ -360,7 +360,7 @@ static int unflatten_dt_nodes(const void
|
||||
* fills the "name" and "type" pointers of the nodes so the normal device-tree
|
||||
* walking functions can be used.
|
||||
*
|
||||
- * Returns NULL on failure or the memory chunk containing the unflattened
|
||||
+ * Return: NULL on failure or the memory chunk containing the unflattened
|
||||
* device tree on success.
|
||||
*/
|
||||
void *__unflatten_device_tree(const void *blob,
|
||||
@@ -441,7 +441,7 @@ static DEFINE_MUTEX(of_fdt_unflatten_mut
|
||||
* pointers of the nodes so the normal device-tree walking functions
|
||||
* can be used.
|
||||
*
|
||||
- * Returns NULL on failure or the memory chunk containing the unflattened
|
||||
+ * Return: NULL on failure or the memory chunk containing the unflattened
|
||||
* device tree on success.
|
||||
*/
|
||||
void *of_fdt_unflatten_tree(const unsigned long *blob,
|
||||
@@ -715,7 +715,7 @@ const void *__init of_get_flat_dt_prop(u
|
||||
* @node: node to test
|
||||
* @compat: compatible string to compare with compatible list.
|
||||
*
|
||||
- * On match, returns a non-zero value with smaller values returned for more
|
||||
+ * Return: a non-zero value on match with smaller values returned for more
|
||||
* specific compatible values.
|
||||
*/
|
||||
static int of_fdt_is_compatible(const void *blob,
|
||||
--- a/drivers/of/irq.c
|
||||
+++ b/drivers/of/irq.c
|
||||
@@ -48,7 +48,7 @@ EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
|
||||
* of_irq_find_parent - Given a device node, find its interrupt parent node
|
||||
* @child: pointer to device node
|
||||
*
|
||||
- * Returns a pointer to the interrupt parent node, or NULL if the interrupt
|
||||
+ * Return: A pointer to the interrupt parent node, or NULL if the interrupt
|
||||
* parent could not be determined.
|
||||
*/
|
||||
struct device_node *of_irq_find_parent(struct device_node *child)
|
||||
@@ -81,14 +81,14 @@ EXPORT_SYMBOL_GPL(of_irq_find_parent);
|
||||
* @addr: address specifier (start of "reg" property of the device) in be32 format
|
||||
* @out_irq: structure of_phandle_args updated by this function
|
||||
*
|
||||
- * Returns 0 on success and a negative number on error
|
||||
- *
|
||||
* This function is a low-level interrupt tree walking function. It
|
||||
* can be used to do a partial walk with synthetized reg and interrupts
|
||||
* properties, for example when resolving PCI interrupts when no device
|
||||
* node exist for the parent. It takes an interrupt specifier structure as
|
||||
* input, walks the tree looking for any interrupt-map properties, translates
|
||||
* the specifier for each map, and then returns the translated map.
|
||||
+ *
|
||||
+ * Return: 0 on success and a negative number on error
|
||||
*/
|
||||
int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
||||
{
|
||||
@@ -380,7 +380,7 @@ EXPORT_SYMBOL_GPL(of_irq_to_resource);
|
||||
* @dev: pointer to device tree node
|
||||
* @index: zero-based index of the IRQ
|
||||
*
|
||||
- * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
|
||||
+ * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
|
||||
* -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
|
||||
* of any other failure.
|
||||
*/
|
||||
@@ -407,7 +407,7 @@ EXPORT_SYMBOL_GPL(of_irq_get);
|
||||
* @dev: pointer to device tree node
|
||||
* @name: IRQ name
|
||||
*
|
||||
- * Returns Linux IRQ number on success, or 0 on the IRQ mapping failure, or
|
||||
+ * Return: Linux IRQ number on success, or 0 on the IRQ mapping failure, or
|
||||
* -EPROBE_DEFER if the IRQ domain is not yet created, or error code in case
|
||||
* of any other failure.
|
||||
*/
|
||||
@@ -447,7 +447,7 @@ int of_irq_count(struct device_node *dev
|
||||
* @res: array of resources to fill in
|
||||
* @nr_irqs: the number of IRQs (and upper bound for num of @res elements)
|
||||
*
|
||||
- * Returns the size of the filled in table (up to @nr_irqs).
|
||||
+ * Return: The size of the filled in table (up to @nr_irqs).
|
||||
*/
|
||||
int of_irq_to_resource_table(struct device_node *dev, struct resource *res,
|
||||
int nr_irqs)
|
||||
@@ -602,7 +602,7 @@ static u32 __of_msi_map_id(struct device
|
||||
* Walk up the device hierarchy looking for devices with a "msi-map"
|
||||
* property. If found, apply the mapping to @id_in.
|
||||
*
|
||||
- * Returns the mapped MSI ID.
|
||||
+ * Return: The mapped MSI ID.
|
||||
*/
|
||||
u32 of_msi_map_id(struct device *dev, struct device_node *msi_np, u32 id_in)
|
||||
{
|
||||
--- a/drivers/of/overlay.c
|
||||
+++ b/drivers/of/overlay.c
|
||||
@@ -296,7 +296,7 @@ err_free_target_path:
|
||||
*
|
||||
* Update of property in symbols node is not allowed.
|
||||
*
|
||||
- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
+ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
* invalid @overlay.
|
||||
*/
|
||||
static int add_changeset_property(struct overlay_changeset *ovcs,
|
||||
@@ -401,7 +401,7 @@ static int add_changeset_property(struct
|
||||
*
|
||||
* NOTE_2: Multiple mods of created nodes not supported.
|
||||
*
|
||||
- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
+ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
* invalid @overlay.
|
||||
*/
|
||||
static int add_changeset_node(struct overlay_changeset *ovcs,
|
||||
@@ -473,7 +473,7 @@ static int add_changeset_node(struct ove
|
||||
*
|
||||
* Do not allow symbols node to have any children.
|
||||
*
|
||||
- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
+ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
* invalid @overlay_node.
|
||||
*/
|
||||
static int build_changeset_next_level(struct overlay_changeset *ovcs,
|
||||
@@ -604,7 +604,7 @@ static int find_dup_cset_prop(struct ove
|
||||
* the same node or duplicate {add, delete, or update} properties entries
|
||||
* for the same property.
|
||||
*
|
||||
- * Returns 0 on success, or -EINVAL if duplicate changeset entry found.
|
||||
+ * Return: 0 on success, or -EINVAL if duplicate changeset entry found.
|
||||
*/
|
||||
static int changeset_dup_entry_check(struct overlay_changeset *ovcs)
|
||||
{
|
||||
@@ -628,7 +628,7 @@ static int changeset_dup_entry_check(str
|
||||
* any portions of the changeset that were successfully created will remain
|
||||
* in @ovcs->cset.
|
||||
*
|
||||
- * Returns 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
+ * Return: 0 on success, -ENOMEM if memory allocation failure, or -EINVAL if
|
||||
* invalid overlay in @ovcs->fragments[].
|
||||
*/
|
||||
static int build_changeset(struct overlay_changeset *ovcs)
|
||||
@@ -724,7 +724,7 @@ static struct device_node *find_target(s
|
||||
* the top level of @tree. The relevant top level nodes are the fragment
|
||||
* nodes and the __symbols__ node. Any other top level node will be ignored.
|
||||
*
|
||||
- * Returns 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
|
||||
+ * Return: 0 on success, -ENOMEM if memory allocation failure, -EINVAL if error
|
||||
* detected in @tree, or -ENOSPC if idr_alloc() error.
|
||||
*/
|
||||
static int init_overlay_changeset(struct overlay_changeset *ovcs,
|
||||
@@ -1179,7 +1179,7 @@ static int overlay_removal_is_ok(struct
|
||||
* If an error is returned by an overlay changeset post-remove notifier
|
||||
* then no further overlay changeset post-remove notifier will be called.
|
||||
*
|
||||
- * Returns 0 on success, or a negative error number. *ovcs_id is set to
|
||||
+ * Return: 0 on success, or a negative error number. *ovcs_id is set to
|
||||
* zero after reverting the changeset, even if a subsequent error occurs.
|
||||
*/
|
||||
int of_overlay_remove(int *ovcs_id)
|
||||
@@ -1257,7 +1257,7 @@ EXPORT_SYMBOL_GPL(of_overlay_remove);
|
||||
*
|
||||
* Removes all overlays from the system in the correct order.
|
||||
*
|
||||
- * Returns 0 on success, or a negative error number
|
||||
+ * Return: 0 on success, or a negative error number
|
||||
*/
|
||||
int of_overlay_remove_all(void)
|
||||
{
|
||||
--- a/drivers/of/platform.c
|
||||
+++ b/drivers/of/platform.c
|
||||
@@ -44,7 +44,7 @@ static const struct of_device_id of_skip
|
||||
* Takes a reference to the embedded struct device which needs to be dropped
|
||||
* after use.
|
||||
*
|
||||
- * Returns platform_device pointer, or NULL if not found
|
||||
+ * Return: platform_device pointer, or NULL if not found
|
||||
*/
|
||||
struct platform_device *of_find_device_by_node(struct device_node *np)
|
||||
{
|
||||
@@ -160,7 +160,7 @@ EXPORT_SYMBOL(of_device_alloc);
|
||||
* @platform_data: pointer to populate platform_data pointer with
|
||||
* @parent: Linux device model parent device.
|
||||
*
|
||||
- * Returns pointer to created platform device, or NULL if a device was not
|
||||
+ * Return: Pointer to created platform device, or NULL if a device was not
|
||||
* registered. Unavailable devices will not get registered.
|
||||
*/
|
||||
static struct platform_device *of_platform_device_create_pdata(
|
||||
@@ -204,7 +204,7 @@ err_clear_flag:
|
||||
* @bus_id: name to assign device
|
||||
* @parent: Linux device model parent device.
|
||||
*
|
||||
- * Returns pointer to created platform device, or NULL if a device was not
|
||||
+ * Return: Pointer to created platform device, or NULL if a device was not
|
||||
* registered. Unavailable devices will not get registered.
|
||||
*/
|
||||
struct platform_device *of_platform_device_create(struct device_node *np,
|
||||
@@ -463,7 +463,7 @@ EXPORT_SYMBOL(of_platform_bus_probe);
|
||||
* New board support should be using this function instead of
|
||||
* of_platform_bus_probe().
|
||||
*
|
||||
- * Returns 0 on success, < 0 on failure.
|
||||
+ * Return: 0 on success, < 0 on failure.
|
||||
*/
|
||||
int of_platform_populate(struct device_node *root,
|
||||
const struct of_device_id *matches,
|
||||
@@ -608,7 +608,7 @@ static void devm_of_platform_populate_re
|
||||
* Similar to of_platform_populate(), but will automatically call
|
||||
* of_platform_depopulate() when the device is unbound from the bus.
|
||||
*
|
||||
- * Returns 0 on success, < 0 on failure.
|
||||
+ * Return: 0 on success, < 0 on failure.
|
||||
*/
|
||||
int devm_of_platform_populate(struct device *dev)
|
||||
{
|
||||
--- a/drivers/of/property.c
|
||||
+++ b/drivers/of/property.c
|
||||
@@ -60,9 +60,11 @@ EXPORT_SYMBOL(of_graph_is_present);
|
||||
* @elem_size: size of the individual element
|
||||
*
|
||||
* Search for a property in a device node and count the number of elements of
|
||||
- * size elem_size in it. Returns number of elements on sucess, -EINVAL if the
|
||||
- * property does not exist or its length does not match a multiple of elem_size
|
||||
- * and -ENODATA if the property does not have a value.
|
||||
+ * size elem_size in it.
|
||||
+ *
|
||||
+ * Return: The number of elements on sucess, -EINVAL if the property does not
|
||||
+ * exist or its length does not match a multiple of elem_size and -ENODATA if
|
||||
+ * the property does not have a value.
|
||||
*/
|
||||
int of_property_count_elems_of_size(const struct device_node *np,
|
||||
const char *propname, int elem_size)
|
||||
@@ -94,8 +96,9 @@ EXPORT_SYMBOL_GPL(of_property_count_elem
|
||||
* @len: if !=NULL, actual length is written to here
|
||||
*
|
||||
* Search for a property in a device node and valid the requested size.
|
||||
- * Returns the property value on success, -EINVAL if the property does not
|
||||
- * exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
+ *
|
||||
+ * Return: The property value on success, -EINVAL if the property does not
|
||||
+ * exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data is too small or too large.
|
||||
*
|
||||
*/
|
||||
@@ -128,7 +131,9 @@ static void *of_find_property_value_of_s
|
||||
* @out_value: pointer to return value, modified only if no error.
|
||||
*
|
||||
* Search for a property in a device node and read nth 32-bit value from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
@@ -160,7 +165,9 @@ EXPORT_SYMBOL_GPL(of_property_read_u32_i
|
||||
* @out_value: pointer to return value, modified only if no error.
|
||||
*
|
||||
* Search for a property in a device node and read nth 64-bit value from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
@@ -195,12 +202,14 @@ EXPORT_SYMBOL_GPL(of_property_read_u64_i
|
||||
* sz_min will be read.
|
||||
*
|
||||
* Search for a property in a device node and read 8-bit value(s) from
|
||||
- * it. Returns number of elements read on success, -EINVAL if the property
|
||||
- * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
|
||||
- * if the property data is smaller than sz_min or longer than sz_max.
|
||||
+ * it.
|
||||
*
|
||||
* dts entry of array should be like:
|
||||
- * property = /bits/ 8 <0x50 0x60 0x70>;
|
||||
+ * ``property = /bits/ 8 <0x50 0x60 0x70>;``
|
||||
+ *
|
||||
+ * Return: The number of elements read on success, -EINVAL if the property
|
||||
+ * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
|
||||
+ * if the property data is smaller than sz_min or longer than sz_max.
|
||||
*
|
||||
* The out_values is modified only if a valid u8 value can be decoded.
|
||||
*/
|
||||
@@ -243,12 +252,14 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
|
||||
* sz_min will be read.
|
||||
*
|
||||
* Search for a property in a device node and read 16-bit value(s) from
|
||||
- * it. Returns number of elements read on success, -EINVAL if the property
|
||||
- * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
|
||||
- * if the property data is smaller than sz_min or longer than sz_max.
|
||||
+ * it.
|
||||
*
|
||||
* dts entry of array should be like:
|
||||
- * property = /bits/ 16 <0x5000 0x6000 0x7000>;
|
||||
+ * ``property = /bits/ 16 <0x5000 0x6000 0x7000>;``
|
||||
+ *
|
||||
+ * Return: The number of elements read on success, -EINVAL if the property
|
||||
+ * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
|
||||
+ * if the property data is smaller than sz_min or longer than sz_max.
|
||||
*
|
||||
* The out_values is modified only if a valid u16 value can be decoded.
|
||||
*/
|
||||
@@ -291,7 +302,9 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
|
||||
* sz_min will be read.
|
||||
*
|
||||
* Search for a property in a device node and read 32-bit value(s) from
|
||||
- * it. Returns number of elements read on success, -EINVAL if the property
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: The number of elements read on success, -EINVAL if the property
|
||||
* does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
|
||||
* if the property data is smaller than sz_min or longer than sz_max.
|
||||
*
|
||||
@@ -330,7 +343,9 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
|
||||
* @out_value: pointer to return value, modified only if return value is 0.
|
||||
*
|
||||
* Search for a property in a device node and read a 64-bit value from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
@@ -365,7 +380,9 @@ EXPORT_SYMBOL_GPL(of_property_read_u64);
|
||||
* sz_min will be read.
|
||||
*
|
||||
* Search for a property in a device node and read 64-bit value(s) from
|
||||
- * it. Returns number of elements read on success, -EINVAL if the property
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: The number of elements read on success, -EINVAL if the property
|
||||
* does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
|
||||
* if the property data is smaller than sz_min or longer than sz_max.
|
||||
*
|
||||
@@ -407,10 +424,11 @@ EXPORT_SYMBOL_GPL(of_property_read_varia
|
||||
* return value is 0.
|
||||
*
|
||||
* Search for a property in a device tree node and retrieve a null
|
||||
- * terminated string value (pointer to data, not a copy). Returns 0 on
|
||||
- * success, -EINVAL if the property does not exist, -ENODATA if property
|
||||
- * does not have a value, and -EILSEQ if the string is not null-terminated
|
||||
- * within the length of the property data.
|
||||
+ * terminated string value (pointer to data, not a copy).
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if
|
||||
+ * property does not have a value, and -EILSEQ if the string is not
|
||||
+ * null-terminated within the length of the property data.
|
||||
*
|
||||
* The out_string pointer is modified only if a valid string can be decoded.
|
||||
*/
|
||||
@@ -774,7 +792,7 @@ EXPORT_SYMBOL(of_graph_get_remote_port_p
|
||||
* @node: pointer to a local endpoint device_node
|
||||
*
|
||||
* Return: Remote port node associated with remote endpoint node linked
|
||||
- * to @node. Use of_node_put() on it when done.
|
||||
+ * to @node. Use of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_graph_get_remote_port(const struct device_node *node)
|
||||
{
|
||||
@@ -807,7 +825,7 @@ EXPORT_SYMBOL(of_graph_get_endpoint_coun
|
||||
* @endpoint: identifier (value of reg property) of the endpoint node
|
||||
*
|
||||
* Return: Remote device node associated with remote endpoint node linked
|
||||
- * to @node. Use of_node_put() on it when done.
|
||||
+ * to @node. Use of_node_put() on it when done.
|
||||
*/
|
||||
struct device_node *of_graph_get_remote_node(const struct device_node *node,
|
||||
u32 port, u32 endpoint)
|
||||
--- a/include/linux/of.h
|
||||
+++ b/include/linux/of.h
|
||||
@@ -424,12 +424,14 @@ extern int of_detach_node(struct device_
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 8-bit value(s) from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
- * -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
- * property data isn't large enough.
|
||||
+ * it.
|
||||
*
|
||||
* dts entry of array should be like:
|
||||
- * property = /bits/ 8 <0x50 0x60 0x70>;
|
||||
+ * ``property = /bits/ 8 <0x50 0x60 0x70>;``
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
+ * -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
+ * property data isn't large enough.
|
||||
*
|
||||
* The out_values is modified only if a valid u8 value can be decoded.
|
||||
*/
|
||||
@@ -454,12 +456,14 @@ static inline int of_property_read_u8_ar
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 16-bit value(s) from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
- * -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
- * property data isn't large enough.
|
||||
+ * it.
|
||||
*
|
||||
* dts entry of array should be like:
|
||||
- * property = /bits/ 16 <0x5000 0x6000 0x7000>;
|
||||
+ * ``property = /bits/ 16 <0x5000 0x6000 0x7000>;``
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
+ * -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
+ * property data isn't large enough.
|
||||
*
|
||||
* The out_values is modified only if a valid u16 value can be decoded.
|
||||
*/
|
||||
@@ -485,7 +489,9 @@ static inline int of_property_read_u16_a
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 32-bit value(s) from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
@@ -513,7 +519,9 @@ static inline int of_property_read_u32_a
|
||||
* @sz: number of array elements to read
|
||||
*
|
||||
* Search for a property in a device node and read 64-bit value(s) from
|
||||
- * it. Returns 0 on success, -EINVAL if the property does not exist,
|
||||
+ * it.
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist,
|
||||
* -ENODATA if property does not have a value, and -EOVERFLOW if the
|
||||
* property data isn't large enough.
|
||||
*
|
||||
@@ -1063,7 +1071,9 @@ static inline bool of_node_is_type(const
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device node and count the number of u8 elements
|
||||
- * in it. Returns number of elements on sucess, -EINVAL if the property does
|
||||
+ * in it.
|
||||
+ *
|
||||
+ * Return: The number of elements on sucess, -EINVAL if the property does
|
||||
* not exist or its length does not match a multiple of u8 and -ENODATA if the
|
||||
* property does not have a value.
|
||||
*/
|
||||
@@ -1080,7 +1090,9 @@ static inline int of_property_count_u8_e
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device node and count the number of u16 elements
|
||||
- * in it. Returns number of elements on sucess, -EINVAL if the property does
|
||||
+ * in it.
|
||||
+ *
|
||||
+ * Return: The number of elements on sucess, -EINVAL if the property does
|
||||
* not exist or its length does not match a multiple of u16 and -ENODATA if the
|
||||
* property does not have a value.
|
||||
*/
|
||||
@@ -1097,7 +1109,9 @@ static inline int of_property_count_u16_
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device node and count the number of u32 elements
|
||||
- * in it. Returns number of elements on sucess, -EINVAL if the property does
|
||||
+ * in it.
|
||||
+ *
|
||||
+ * Return: The number of elements on sucess, -EINVAL if the property does
|
||||
* not exist or its length does not match a multiple of u32 and -ENODATA if the
|
||||
* property does not have a value.
|
||||
*/
|
||||
@@ -1114,7 +1128,9 @@ static inline int of_property_count_u32_
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device node and count the number of u64 elements
|
||||
- * in it. Returns number of elements on sucess, -EINVAL if the property does
|
||||
+ * in it.
|
||||
+ *
|
||||
+ * Return: The number of elements on sucess, -EINVAL if the property does
|
||||
* not exist or its length does not match a multiple of u64 and -ENODATA if the
|
||||
* property does not have a value.
|
||||
*/
|
||||
@@ -1135,7 +1151,7 @@ static inline int of_property_count_u64_
|
||||
* Search for a property in a device tree node and retrieve a list of
|
||||
* terminated string values (pointer to data, not a copy) in that property.
|
||||
*
|
||||
- * If @out_strs is NULL, the number of strings in the property is returned.
|
||||
+ * Return: If @out_strs is NULL, the number of strings in the property is returned.
|
||||
*/
|
||||
static inline int of_property_read_string_array(const struct device_node *np,
|
||||
const char *propname, const char **out_strs,
|
||||
@@ -1151,10 +1167,11 @@ static inline int of_property_read_strin
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device tree node and retrieve the number of null
|
||||
- * terminated string contain in it. Returns the number of strings on
|
||||
- * success, -EINVAL if the property does not exist, -ENODATA if property
|
||||
- * does not have a value, and -EILSEQ if the string is not null-terminated
|
||||
- * within the length of the property data.
|
||||
+ * terminated string contain in it.
|
||||
+ *
|
||||
+ * Return: The number of strings on success, -EINVAL if the property does not
|
||||
+ * exist, -ENODATA if property does not have a value, and -EILSEQ if the string
|
||||
+ * is not null-terminated within the length of the property data.
|
||||
*/
|
||||
static inline int of_property_count_strings(const struct device_node *np,
|
||||
const char *propname)
|
||||
@@ -1174,7 +1191,8 @@ static inline int of_property_count_stri
|
||||
* Search for a property in a device tree node and retrieve a null
|
||||
* terminated string value (pointer to data, not a copy) in the list of strings
|
||||
* contained in that property.
|
||||
- * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if
|
||||
+ *
|
||||
+ * Return: 0 on success, -EINVAL if the property does not exist, -ENODATA if
|
||||
* property does not have a value, and -EILSEQ if the string is not
|
||||
* null-terminated within the length of the property data.
|
||||
*
|
||||
@@ -1194,7 +1212,8 @@ static inline int of_property_read_strin
|
||||
* @propname: name of the property to be searched.
|
||||
*
|
||||
* Search for a property in a device node.
|
||||
- * Returns true if the property exists false otherwise.
|
||||
+ *
|
||||
+ * Return: true if the property exists false otherwise.
|
||||
*/
|
||||
static inline bool of_property_read_bool(const struct device_node *np,
|
||||
const char *propname)
|
||||
@@ -1440,7 +1459,7 @@ static inline int of_reconfig_get_state_
|
||||
* of_device_is_system_power_controller - Tells if system-power-controller is found for device_node
|
||||
* @np: Pointer to the given device_node
|
||||
*
|
||||
- * return true if present false otherwise
|
||||
+ * Return: true if present false otherwise
|
||||
*/
|
||||
static inline bool of_device_is_system_power_controller(const struct device_node *np)
|
||||
{
|
|
@ -0,0 +1,54 @@
|
|||
From 31e46db02ac1351c84e56a18606d17fc1b8390dd Mon Sep 17 00:00:00 2001
|
||||
From: Lee Jones <lee.jones@linaro.org>
|
||||
Date: Mon, 29 Mar 2021 16:24:35 +0100
|
||||
Subject: [PATCH] of: base: Fix spelling issue with function param 'prop'
|
||||
|
||||
Fixes the following W=1 kernel build warning(s):
|
||||
|
||||
drivers/of/base.c:1781: warning: Function parameter or member 'prop' not described in '__of_add_property'
|
||||
drivers/of/base.c:1781: warning: Excess function parameter 'prob' description in '__of_add_property'
|
||||
drivers/of/base.c:1804: warning: Function parameter or member 'prop' not described in 'of_add_property'
|
||||
drivers/of/base.c:1804: warning: Excess function parameter 'prob' description in 'of_add_property'
|
||||
drivers/of/base.c:1855: warning: Function parameter or member 'prop' not described in 'of_remove_property'
|
||||
drivers/of/base.c:1855: warning: Excess function parameter 'prob' description in 'of_remove_property'
|
||||
|
||||
Cc: Rob Herring <robh+dt@kernel.org>
|
||||
Cc: Frank Rowand <frowand.list@gmail.com>
|
||||
Cc: "David S. Miller" <davem@davemloft.net>
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Signed-off-by: Lee Jones <lee.jones@linaro.org>
|
||||
Link: https://lore.kernel.org/r/20210329152435.900225-1-lee.jones@linaro.org
|
||||
Signed-off-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
drivers/of/base.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/of/base.c
|
||||
+++ b/drivers/of/base.c
|
||||
@@ -1780,7 +1780,7 @@ EXPORT_SYMBOL(of_count_phandle_with_args
|
||||
/**
|
||||
* __of_add_property - Add a property to a node without lock operations
|
||||
* @np: Caller's Device Node
|
||||
- * @prob: Property to add
|
||||
+ * @prop: Property to add
|
||||
*/
|
||||
int __of_add_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
@@ -1803,7 +1803,7 @@ int __of_add_property(struct device_node
|
||||
/**
|
||||
* of_add_property - Add a property to a node
|
||||
* @np: Caller's Device Node
|
||||
- * @prob: Property to add
|
||||
+ * @prop: Property to add
|
||||
*/
|
||||
int of_add_property(struct device_node *np, struct property *prop)
|
||||
{
|
||||
@@ -1849,7 +1849,7 @@ int __of_remove_property(struct device_n
|
||||
/**
|
||||
* of_remove_property - Remove a property from a node.
|
||||
* @np: Caller's Device Node
|
||||
- * @prob: Property to remove
|
||||
+ * @prop: Property to remove
|
||||
*
|
||||
* Note that we don't actually remove it, since we have given out
|
||||
* who-knows-how-many pointers to the data using get-property.
|
|
@ -1,7 +1,7 @@
|
|||
From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001
|
||||
From: Michael Walle <michael@walle.cc>
|
||||
Date: Mon, 12 Apr 2021 19:47:17 +0200
|
||||
Subject: of: net: pass the dst buffer to of_get_mac_address()
|
||||
Subject: [PATCH] of: net: pass the dst buffer to of_get_mac_address()
|
||||
|
||||
of_get_mac_address() returns a "const void*" pointer to a MAC address.
|
||||
Lately, support to fetch the MAC address by an NVMEM provider was added.
|
|
@ -1,7 +1,7 @@
|
|||
From f10843e04a075202dbb39dfcee047e3a2fdf5a8d Mon Sep 17 00:00:00 2001
|
||||
From: Michael Walle <michael@walle.cc>
|
||||
Date: Mon, 12 Apr 2021 19:47:18 +0200
|
||||
Subject: of: net: fix of_get_mac_addr_nvmem() for non-platform devices
|
||||
Subject: [PATCH] of: net: fix of_get_mac_addr_nvmem() for non-platform devices
|
||||
|
||||
of_get_mac_address() already supports fetching the MAC address by an
|
||||
nvmem provider. But until now, it was just working for platform devices.
|
|
@ -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;
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue