Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
b9baebd7e2
@ -35,7 +35,7 @@ define autoreconf
|
||||
$(patsubst %,rm -f %;,$(2)) \
|
||||
$(foreach p,$(3), \
|
||||
if [ -f $(p)/configure.ac ] || [ -f $(p)/configure.in ]; then \
|
||||
[ -d $(p)/autom4te.cache ] && rm -rf autom4te.cache; \
|
||||
[ -d $(p)/autom4te.cache ] && rm -rf $(p)/autom4te.cache; \
|
||||
[ -e $(p)/config.rpath ] || \
|
||||
ln -s $(SCRIPT_DIR)/config.rpath $(p)/config.rpath; \
|
||||
touch NEWS AUTHORS COPYING ABOUT-NLS ChangeLog; \
|
||||
|
||||
@ -184,6 +184,7 @@ endef
|
||||
# $(4) extra DTC flags
|
||||
define Image/BuildDTB
|
||||
$(TARGET_CROSS)cpp -nostdinc -x assembler-with-cpp \
|
||||
$(DTS_CPPFLAGS) \
|
||||
-I$(DTS_DIR) \
|
||||
-I$(DTS_DIR)/include \
|
||||
-I$(LINUX_DIR)/include/ \
|
||||
|
||||
@ -402,7 +402,13 @@ define KernelPackage/fs-nfs-common
|
||||
KCONFIG:= \
|
||||
CONFIG_LOCKD \
|
||||
CONFIG_SUNRPC \
|
||||
CONFIG_GRACE_PERIOD
|
||||
CONFIG_GRACE_PERIOD \
|
||||
CONFIG_NFS_V4=y \
|
||||
CONFIG_NFS_V4_1=y \
|
||||
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" \
|
||||
CONFIG_NFS_V4_1_MIGRATION=n \
|
||||
CONFIG_NFS_V4_2=y \
|
||||
CONFIG_NFS_V4_2_READ_PLUS=n
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/fs/lockd/lockd.ko \
|
||||
$(LINUX_DIR)/net/sunrpc/sunrpc.ko \
|
||||
@ -488,7 +494,8 @@ define KernelPackage/fs-nfsd
|
||||
CONFIG_NFSD_BLOCKLAYOUT=n \
|
||||
CONFIG_NFSD_SCSILAYOUT=n \
|
||||
CONFIG_NFSD_FLEXFILELAYOUT=n \
|
||||
CONFIG_NFSD_FAULT_INJECTION=n
|
||||
CONFIG_NFSD_FAULT_INJECTION=n \
|
||||
CONFIG_NFSD_V4_2_INTER_SSC=n
|
||||
FILES:=$(LINUX_DIR)/fs/nfsd/nfsd.ko
|
||||
AUTOLOAD:=$(call AutoLoad,40,nfsd)
|
||||
endef
|
||||
|
||||
@ -24,6 +24,8 @@ PKG_INSTALL:=1
|
||||
PKG_USE_MIPS16:=1
|
||||
PKG_BUILD_DEPENDS:=!USE_GLIBC:argp-standalone
|
||||
|
||||
HOST_BUILD_DEPENDS:=argp-standalone/host musl-fts/host
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/nls.mk
|
||||
include $(INCLUDE_DIR)/host-build.mk
|
||||
@ -62,6 +64,8 @@ CONFIGURE_ARGS += --disable-nls
|
||||
endif
|
||||
|
||||
HOST_CONFIGURE_ARGS += \
|
||||
--disable-shared \
|
||||
--disable-nls \
|
||||
--disable-debuginfod \
|
||||
--disable-libdebuginfod \
|
||||
--without-lzma \
|
||||
|
||||
@ -44,6 +44,7 @@ define Package/musl-fts/description
|
||||
The musl-fts package implements the fts(3) functions fts_open, fts_read, fts_children, fts_set and fts_close, which are missing in musl libc.
|
||||
endef
|
||||
|
||||
HOST_CONFIGURE_ARGS += --disable-shared --with-pic
|
||||
|
||||
define Build/InstallDev
|
||||
$(INSTALL_DIR) $(1)/usr/include
|
||||
|
||||
@ -62,6 +62,7 @@ define Package/libpcrecpp
|
||||
endef
|
||||
|
||||
HOST_CONFIGURE_ARGS += \
|
||||
--disable-shared \
|
||||
--enable-utf8 \
|
||||
--enable-unicode-properties \
|
||||
--enable-pcre16 \
|
||||
|
||||
@ -8,7 +8,7 @@ PKG_RELEASE:=1
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/chunkeey/nu801.git
|
||||
PKG_SOURCE_VERSION:=d9942c0ceb949080b93366a9431028de3608e535
|
||||
|
||||
PKG_MIRROR_HASH:=859be7dec96d2a0d6ee8b80c6f1a703384940d19caeeb74a4ac0a961b2a985db
|
||||
PKG_MAINTAINER:=Christian Lamparter <chunkeey@gmail.com>
|
||||
PKG_LICENSE:=GPL-3.0-or-later
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
@ -20,7 +20,7 @@ define Package/nu801
|
||||
SECTION:=utils
|
||||
CATEGORY:=Utilities
|
||||
SUBMENU:=Userspace GPIO Drivers
|
||||
DEPENDS:=@TARGET_x86 +kmod-leds-uleds
|
||||
DEPENDS:=@TARGET_x86
|
||||
KCONFIG:=CONFIG_GPIO_CDEV=y
|
||||
TITLE:=NU801 LED Driver
|
||||
endef
|
||||
|
||||
@ -0,0 +1,236 @@
|
||||
From 675992be6f7b603b8cfda4678f173e1021fc1ab6 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Date: Thu, 7 Oct 2021 19:47:10 +0300
|
||||
Subject: [PATCH] net: dsa: mv88e6xxx: keep the pvid at 0 when VLAN-unaware
|
||||
|
||||
The VLAN support in mv88e6xxx has a loaded history. Commit 2ea7a679ca2a
|
||||
("net: dsa: Don't add vlans when vlan filtering is disabled") noticed
|
||||
some issues with VLAN and decided the best way to deal with them was to
|
||||
make the DSA core ignore VLANs added by the bridge while VLAN awareness
|
||||
is turned off. Those issues were never explained, just presented as
|
||||
"at least one corner case".
|
||||
|
||||
That approach had problems of its own, presented by
|
||||
commit 54a0ed0df496 ("net: dsa: provide an option for drivers to always
|
||||
receive bridge VLANs") for the DSA core, followed by
|
||||
commit 1fb74191988f ("net: dsa: mv88e6xxx: fix vlan setup") which
|
||||
applied ds->configure_vlan_while_not_filtering = true for mv88e6xxx in
|
||||
particular.
|
||||
|
||||
We still don't know what corner case Andrew saw when he wrote
|
||||
commit 2ea7a679ca2a ("net: dsa: Don't add vlans when vlan filtering is
|
||||
disabled"), but Tobias now reports that when we use TX forwarding
|
||||
offload, pinging an external station from the bridge device is broken if
|
||||
the front-facing DSA user port has flooding turned off. The full
|
||||
description is in the link below, but for short, when a mv88e6xxx port
|
||||
is under a VLAN-unaware bridge, it inherits that bridge's pvid.
|
||||
So packets ingressing a user port will be classified to e.g. VID 1
|
||||
(assuming that value for the bridge_default_pvid), whereas when
|
||||
tag_dsa.c xmits towards a user port, it always sends packets using a VID
|
||||
of 0 if that port is standalone or under a VLAN-unaware bridge - or at
|
||||
least it did so prior to commit d82f8ab0d874 ("net: dsa: tag_dsa:
|
||||
offload the bridge forwarding process").
|
||||
|
||||
In any case, when there is a conversation between the CPU and a station
|
||||
connected to a user port, the station's MAC address is learned in VID 1
|
||||
but the CPU tries to transmit through VID 0. The packets reach the
|
||||
intended station, but via flooding and not by virtue of matching the
|
||||
existing ATU entry.
|
||||
|
||||
DSA has established (and enforced in other drivers: sja1105, felix,
|
||||
mt7530) that a VLAN-unaware port should use a private pvid, and not
|
||||
inherit the one from the bridge. The bridge's pvid should only be
|
||||
inherited when that bridge is VLAN-aware, so all state transitions need
|
||||
to be handled. On the other hand, all bridge VLANs should sit in the VTU
|
||||
starting with the moment when the bridge offloads them via switchdev,
|
||||
they are just not used.
|
||||
|
||||
This solves the problem that Tobias sees because packets ingressing on
|
||||
VLAN-unaware user ports now get classified to VID 0, which is also the
|
||||
VID used by tag_dsa.c on xmit.
|
||||
|
||||
Fixes: d82f8ab0d874 ("net: dsa: tag_dsa: offload the bridge forwarding process")
|
||||
Link: https://patchwork.kernel.org/project/netdevbpf/patch/20211003222312.284175-2-vladimir.oltean@nxp.com/#24491503
|
||||
Reported-by: Tobias Waldekranz <tobias@waldekranz.com>
|
||||
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
|
||||
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
---
|
||||
drivers/net/dsa/mv88e6xxx/chip.c | 56 +++++++++++++++++++++++++++++---
|
||||
drivers/net/dsa/mv88e6xxx/chip.h | 6 ++++
|
||||
drivers/net/dsa/mv88e6xxx/port.c | 21 ++++++++++++
|
||||
drivers/net/dsa/mv88e6xxx/port.h | 2 ++
|
||||
4 files changed, 81 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
index 1992be77522a..a77c86e0321d 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
@@ -1586,6 +1586,26 @@ static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int mv88e6xxx_port_commit_pvid(struct mv88e6xxx_chip *chip, int port)
|
||||
+{
|
||||
+ struct dsa_port *dp = dsa_to_port(chip->ds, port);
|
||||
+ struct mv88e6xxx_port *p = &chip->ports[port];
|
||||
+ bool drop_untagged = false;
|
||||
+ u16 pvid = 0;
|
||||
+ int err;
|
||||
+
|
||||
+ if (dp->bridge_dev && br_vlan_enabled(dp->bridge_dev)) {
|
||||
+ pvid = p->bridge_pvid.vid;
|
||||
+ drop_untagged = !p->bridge_pvid.valid;
|
||||
+ }
|
||||
+
|
||||
+ err = mv88e6xxx_port_set_pvid(chip, port, pvid);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ return mv88e6xxx_port_drop_untagged(chip, port, drop_untagged);
|
||||
+}
|
||||
+
|
||||
static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
|
||||
bool vlan_filtering,
|
||||
struct switchdev_trans *trans)
|
||||
@@ -1599,7 +1619,16 @@ static int mv88e6xxx_port_vlan_filtering(struct dsa_switch *ds, int port,
|
||||
return chip->info->max_vid ? 0 : -EOPNOTSUPP;
|
||||
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
+
|
||||
err = mv88e6xxx_port_set_8021q_mode(chip, port, mode);
|
||||
+ if (err)
|
||||
+ goto unlock;
|
||||
+
|
||||
+ err = mv88e6xxx_port_commit_pvid(chip, port);
|
||||
+ if (err)
|
||||
+ goto unlock;
|
||||
+
|
||||
+unlock:
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
|
||||
return err;
|
||||
@@ -1982,8 +2011,10 @@ static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
|
||||
bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
|
||||
+ struct mv88e6xxx_port *p = &chip->ports[port];
|
||||
bool warn;
|
||||
u8 member;
|
||||
+ int err;
|
||||
u16 vid;
|
||||
|
||||
if (!chip->info->max_vid)
|
||||
@@ -2008,9 +2039,23 @@ static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
|
||||
dev_err(ds->dev, "p%d: failed to add VLAN %d%c\n", port,
|
||||
vid, untagged ? 'u' : 't');
|
||||
|
||||
- if (pvid && mv88e6xxx_port_set_pvid(chip, port, vlan->vid_end))
|
||||
- dev_err(ds->dev, "p%d: failed to set PVID %d\n", port,
|
||||
- vlan->vid_end);
|
||||
+ if (pvid) {
|
||||
+ p->bridge_pvid.vid = vlan->vid_end;
|
||||
+ p->bridge_pvid.valid = true;
|
||||
+
|
||||
+ err = mv88e6xxx_port_commit_pvid(chip, port);
|
||||
+ if (err)
|
||||
+ dev_err(ds->dev, "p%d: failed to set PVID %d", port,
|
||||
+ vlan->vid_end);
|
||||
+ } else if (vlan->vid_end && p->bridge_pvid.vid == vlan->vid_end) {
|
||||
+ /* The old pvid was reinstalled as a non-pvid VLAN */
|
||||
+ p->bridge_pvid.valid = false;
|
||||
+
|
||||
+ err = mv88e6xxx_port_commit_pvid(chip, port);
|
||||
+ if (err)
|
||||
+ dev_err(ds->dev, "p%d: failed to unset PVID %d", port,
|
||||
+ vlan->vid_end);
|
||||
+ }
|
||||
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
}
|
||||
@@ -2061,6 +2106,7 @@ static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
|
||||
const struct switchdev_obj_port_vlan *vlan)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
+ struct mv88e6xxx_port *p = &chip->ports[port];
|
||||
u16 pvid, vid;
|
||||
int err = 0;
|
||||
|
||||
@@ -2079,7 +2125,9 @@ static int mv88e6xxx_port_vlan_del(struct dsa_switch *ds, int port,
|
||||
goto unlock;
|
||||
|
||||
if (vid == pvid) {
|
||||
- err = mv88e6xxx_port_set_pvid(chip, port, 0);
|
||||
+ p->bridge_pvid.valid = false;
|
||||
+
|
||||
+ err = mv88e6xxx_port_commit_pvid(chip, port);
|
||||
if (err)
|
||||
goto unlock;
|
||||
}
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
|
||||
index 51a7ff44478e..843803c3adf2 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.h
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
|
||||
@@ -224,9 +224,15 @@ struct mv88e6xxx_policy {
|
||||
u16 vid;
|
||||
};
|
||||
|
||||
+struct mv88e6xxx_vlan {
|
||||
+ u16 vid;
|
||||
+ bool valid;
|
||||
+};
|
||||
+
|
||||
struct mv88e6xxx_port {
|
||||
struct mv88e6xxx_chip *chip;
|
||||
int port;
|
||||
+ struct mv88e6xxx_vlan bridge_pvid;
|
||||
u64 serdes_stats[2];
|
||||
u64 atu_member_violation;
|
||||
u64 atu_miss_violation;
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c
|
||||
index dfd9e8292e9a..a7177aa254a8 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/port.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/port.c
|
||||
@@ -1062,6 +1062,27 @@ int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int mv88e6xxx_port_drop_untagged(struct mv88e6xxx_chip *chip, int port,
|
||||
+ bool drop_untagged)
|
||||
+{
|
||||
+ u16 old, new;
|
||||
+ int err;
|
||||
+
|
||||
+ err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &old);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ if (drop_untagged)
|
||||
+ new = old | MV88E6XXX_PORT_CTL2_DISCARD_UNTAGGED;
|
||||
+ else
|
||||
+ new = old & ~MV88E6XXX_PORT_CTL2_DISCARD_UNTAGGED;
|
||||
+
|
||||
+ if (new == old)
|
||||
+ return 0;
|
||||
+
|
||||
+ return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, new);
|
||||
+}
|
||||
+
|
||||
int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
|
||||
{
|
||||
u16 reg;
|
||||
diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h
|
||||
index 44d76ac973f6..3390517df42e 100644
|
||||
--- a/drivers/net/dsa/mv88e6xxx/port.h
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/port.h
|
||||
@@ -364,6 +364,8 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
|
||||
phy_interface_t mode);
|
||||
int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode);
|
||||
int mv88e6352_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode);
|
||||
+int mv88e6xxx_port_drop_untagged(struct mv88e6xxx_chip *chip, int port,
|
||||
+ bool drop_untagged);
|
||||
int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port);
|
||||
int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
|
||||
int upstream_port);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -2169,6 +2169,7 @@ CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HARDENED_USERCOPY=y
|
||||
# CONFIG_HARDENED_USERCOPY_FALLBACK is not set
|
||||
# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set
|
||||
CONFIG_HARDEN_BRANCH_HISTORY=y
|
||||
CONFIG_HARDEN_EL2_VECTORS=y
|
||||
# CONFIG_HARDLOCKUP_DETECTOR is not set
|
||||
# CONFIG_HAVE_ARM_ARCH_TIMER is not set
|
||||
@ -3408,8 +3409,6 @@ CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
|
||||
# CONFIG_MICROCHIP_T1_PHY is not set
|
||||
# CONFIG_MICROSEMI_PHY is not set
|
||||
# CONFIG_MIGRATION is not set
|
||||
CONFIG_HARDEN_BRANCH_HISTORY=y
|
||||
CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_MIKROTIK is not set
|
||||
# CONFIG_MIKROTIK_RB532 is not set
|
||||
@ -3440,6 +3439,7 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_MISDN_NETJET is not set
|
||||
# CONFIG_MISDN_SPEEDFAX is not set
|
||||
# CONFIG_MISDN_W6692 is not set
|
||||
CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
|
||||
# CONFIG_MKISS is not set
|
||||
# CONFIG_MLX4_CORE is not set
|
||||
# CONFIG_MLX4_EN is not set
|
||||
|
||||
@ -50,9 +50,9 @@ CONFIG_64BIT_TIME=y
|
||||
# CONFIG_AD5758 is not set
|
||||
# CONFIG_AD5761 is not set
|
||||
# CONFIG_AD5764 is not set
|
||||
# CONFIG_AD5766 is not set
|
||||
# CONFIG_AD5770R is not set
|
||||
# CONFIG_AD5791 is not set
|
||||
# CONFIG_AD5766 is not set
|
||||
# CONFIG_AD5933 is not set
|
||||
# CONFIG_AD7091R5 is not set
|
||||
# CONFIG_AD7124 is not set
|
||||
@ -817,6 +817,7 @@ CONFIG_CACHE_L2X0_PMU=y
|
||||
# CONFIG_CAN_BCM is not set
|
||||
# CONFIG_CAN_DEBUG_DEVICES is not set
|
||||
# CONFIG_CAN_DEV is not set
|
||||
# CONFIG_CAN_ETAS_ES58X is not set
|
||||
# CONFIG_CAN_GS_USB is not set
|
||||
# CONFIG_CAN_GW is not set
|
||||
# CONFIG_CAN_HI311X is not set
|
||||
@ -908,17 +909,18 @@ CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
|
||||
CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
# CONFIG_CIFS_DEBUG2 is not set
|
||||
# CONFIG_CIFS_SWN_UPCALL is not set
|
||||
# CONFIG_CIFS_FSCACHE is not set
|
||||
# CONFIG_CIFS_NFSD_EXPORT is not set
|
||||
CONFIG_CIFS_POSIX=y
|
||||
# CONFIG_CIFS_SMB2 is not set
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_SWN_UPCALL is not set
|
||||
# CONFIG_CIFS_WEAK_PW_HASH is not set
|
||||
CONFIG_CIFS_XATTR=y
|
||||
# CONFIG_CIO_DAC is not set
|
||||
# CONFIG_CLEANCACHE is not set
|
||||
# CONFIG_CLKSRC_PISTACHIO is not set
|
||||
# CONFIG_CLKSRC_VERSATILE is not set
|
||||
# CONFIG_CLK_GFM_LPASS_SM8250 is not set
|
||||
# CONFIG_CLK_HSDK is not set
|
||||
@ -960,6 +962,7 @@ CONFIG_CMDLINE=""
|
||||
# CONFIG_COMMON_CLK_MT8192 is not set
|
||||
# CONFIG_COMMON_CLK_NXP is not set
|
||||
# CONFIG_COMMON_CLK_PIC32 is not set
|
||||
# CONFIG_COMMON_CLK_PISTACHIO is not set
|
||||
# CONFIG_COMMON_CLK_PWM is not set
|
||||
# CONFIG_COMMON_CLK_PXA is not set
|
||||
# CONFIG_COMMON_CLK_QCOM is not set
|
||||
@ -1069,7 +1072,9 @@ CONFIG_CRYPTO_ALGAPI2=y
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
# CONFIG_CRYPTO_BLAKE2B is not set
|
||||
# CONFIG_CRYPTO_BLAKE2B_NEON is not set
|
||||
# CONFIG_CRYPTO_BLAKE2S is not set
|
||||
# CONFIG_CRYPTO_BLAKE2S_ARM is not set
|
||||
# CONFIG_CRYPTO_BLAKE2S_X86 is not set
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
@ -1226,8 +1231,6 @@ CONFIG_CRYPTO_PCRYPT=y
|
||||
# CONFIG_CRYPTO_SHA512_ARM is not set
|
||||
# CONFIG_CRYPTO_SHA512_ARM64 is not set
|
||||
# CONFIG_CRYPTO_SHA512_ARM64_CE is not set
|
||||
# CONFIG_CRYPTO_BLAKE2S_ARM is not set
|
||||
# CONFIG_CRYPTO_BLAKE2B_NEON is not set
|
||||
# CONFIG_CRYPTO_SIMD is not set
|
||||
CONFIG_CRYPTO_SKCIPHER=y
|
||||
CONFIG_CRYPTO_SKCIPHER2=y
|
||||
@ -1613,8 +1616,8 @@ CONFIG_DQL=y
|
||||
# CONFIG_DRM_SII902X is not set
|
||||
# CONFIG_DRM_SII9234 is not set
|
||||
# CONFIG_DRM_SIL_SII8620 is not set
|
||||
# CONFIG_DRM_SIMPLE_BRIDGE is not set
|
||||
# CONFIG_DRM_SIMPLEDRM is not set
|
||||
# CONFIG_DRM_SIMPLE_BRIDGE is not set
|
||||
# CONFIG_DRM_STI is not set
|
||||
# CONFIG_DRM_STM is not set
|
||||
# CONFIG_DRM_SUN4I is not set
|
||||
@ -1715,6 +1718,7 @@ CONFIG_DVB_MAX_ADAPTERS=16
|
||||
# CONFIG_DVB_MT312 is not set
|
||||
# CONFIG_DVB_MT352 is not set
|
||||
# CONFIG_DVB_MXL5XX is not set
|
||||
# CONFIG_DVB_MXL692 is not set
|
||||
# CONFIG_DVB_NET is not set
|
||||
# CONFIG_DVB_NXT200X is not set
|
||||
# CONFIG_DVB_NXT6000 is not set
|
||||
@ -1884,11 +1888,11 @@ CONFIG_EXTRA_TARGETS=""
|
||||
# CONFIG_F2FS_FAULT_INJECTION is not set
|
||||
# CONFIG_F2FS_FS is not set
|
||||
# CONFIG_F2FS_FS_COMPRESSION is not set
|
||||
# CONFIG_F2FS_IOSTAT is not set
|
||||
# CONFIG_F2FS_FS_ENCRYPTION is not set
|
||||
# CONFIG_F2FS_FS_POSIX_ACL is not set
|
||||
# CONFIG_F2FS_FS_SECURITY is not set
|
||||
CONFIG_F2FS_FS_XATTR=y
|
||||
# CONFIG_F2FS_IOSTAT is not set
|
||||
# CONFIG_F2FS_IO_TRACE is not set
|
||||
CONFIG_F2FS_STAT_FS=y
|
||||
# CONFIG_FAILOVER is not set
|
||||
@ -2198,6 +2202,7 @@ CONFIG_GPIO_SYSFS=y
|
||||
# CONFIG_GPIO_TPIC2810 is not set
|
||||
# CONFIG_GPIO_TS4900 is not set
|
||||
# CONFIG_GPIO_TS5500 is not set
|
||||
# CONFIG_GPIO_VIRTIO is not set
|
||||
# CONFIG_GPIO_VX855 is not set
|
||||
# CONFIG_GPIO_WATCHDOG is not set
|
||||
# CONFIG_GPIO_WINBOND is not set
|
||||
@ -2221,6 +2226,7 @@ CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_HARDENED_USERCOPY=y
|
||||
# CONFIG_HARDENED_USERCOPY_FALLBACK is not set
|
||||
# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set
|
||||
CONFIG_HARDEN_BRANCH_HISTORY=y
|
||||
CONFIG_HARDEN_EL2_VECTORS=y
|
||||
# CONFIG_HARDLOCKUP_DETECTOR is not set
|
||||
# CONFIG_HAVE_ARM_ARCH_TIMER is not set
|
||||
@ -2275,6 +2281,7 @@ CONFIG_HARDEN_EL2_VECTORS=y
|
||||
# CONFIG_HID_ELO is not set
|
||||
# CONFIG_HID_EMS_FF is not set
|
||||
# CONFIG_HID_EZKEY is not set
|
||||
# CONFIG_HID_FT260 is not set
|
||||
# CONFIG_HID_GEMBIRD is not set
|
||||
# CONFIG_HID_GENERIC is not set
|
||||
# CONFIG_HID_GFRM is not set
|
||||
@ -2625,6 +2632,7 @@ CONFIG_INET=y
|
||||
# CONFIG_INGENIC_ADC is not set
|
||||
# CONFIG_INGENIC_CGU_JZ4725B is not set
|
||||
# CONFIG_INGENIC_CGU_JZ4740 is not set
|
||||
# CONFIG_INGENIC_CGU_JZ4760 is not set
|
||||
# CONFIG_INGENIC_CGU_JZ4770 is not set
|
||||
# CONFIG_INGENIC_CGU_JZ4780 is not set
|
||||
# CONFIG_INGENIC_CGU_X1000 is not set
|
||||
@ -2840,6 +2848,7 @@ CONFIG_IP_ROUTE_VERBOSE=y
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IP_VS_MH is not set
|
||||
CONFIG_IP_VS_MH_TAB_INDEX=10
|
||||
# CONFIG_IP_VS_TWOS is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_IRQ_ALL_CPUS is not set
|
||||
@ -3195,8 +3204,10 @@ CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
|
||||
# CONFIG_MACH_LOONGSON2EF is not set
|
||||
# CONFIG_MACH_LOONGSON32 is not set
|
||||
# CONFIG_MACH_LOONGSON64 is not set
|
||||
# CONFIG_MACH_NINTENDO64 is not set
|
||||
# CONFIG_MACH_PIC32 is not set
|
||||
# CONFIG_MACH_PISTACHIO is not set
|
||||
# CONFIG_MACH_REALTEK_RTL is not set
|
||||
# CONFIG_MACH_TX39XX is not set
|
||||
# CONFIG_MACH_TX49XX is not set
|
||||
# CONFIG_MACH_VR41XX is not set
|
||||
@ -3471,8 +3482,6 @@ CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
|
||||
# CONFIG_MICROCHIP_T1_PHY is not set
|
||||
# CONFIG_MICROSEMI_PHY is not set
|
||||
# CONFIG_MIGRATION is not set
|
||||
CONFIG_HARDEN_BRANCH_HISTORY=y
|
||||
CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_MIKROTIK is not set
|
||||
# CONFIG_MIKROTIK_RB532 is not set
|
||||
@ -3503,10 +3512,12 @@ CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_MISDN_NETJET is not set
|
||||
# CONFIG_MISDN_SPEEDFAX is not set
|
||||
# CONFIG_MISDN_W6692 is not set
|
||||
CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
|
||||
# CONFIG_MKISS is not set
|
||||
# CONFIG_MLX4_CORE is not set
|
||||
# CONFIG_MLX4_EN is not set
|
||||
# CONFIG_MLX5_CORE is not set
|
||||
# CONFIG_MLX5_SF is not set
|
||||
# CONFIG_MLX90614 is not set
|
||||
# CONFIG_MLX90632 is not set
|
||||
# CONFIG_MLXFW is not set
|
||||
@ -3687,6 +3698,7 @@ CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018
|
||||
# CONFIG_MTD_NAND_ECC_BCH is not set
|
||||
# CONFIG_MTD_NAND_ECC_SMC is not set
|
||||
# CONFIG_MTD_NAND_ECC_SW_BCH is not set
|
||||
# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set
|
||||
# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set
|
||||
# CONFIG_MTD_NAND_FSL_ELBC is not set
|
||||
# CONFIG_MTD_NAND_FSL_IFC is not set
|
||||
@ -3789,8 +3801,6 @@ CONFIG_MTD_SPLIT_SUPPORT=y
|
||||
# CONFIG_MTD_UBI_GLUEBI is not set
|
||||
# CONFIG_MTD_UIMAGE_SPLIT is not set
|
||||
# CONFIG_MTD_VIRT_CONCAT is not set
|
||||
# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set
|
||||
# CONFIG_MTD_NAND_MTK_BMT is not set
|
||||
# CONFIG_MTK_DEVAPC is not set
|
||||
# CONFIG_MTK_MMC is not set
|
||||
# CONFIG_MTK_MMSYS is not set
|
||||
@ -3829,9 +3839,9 @@ CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
# CONFIG_NETFILTER_INGRESS is not set
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
# CONFIG_NETFILTER_NETLINK_HOOK is not set
|
||||
# CONFIG_NETFILTER_NETLINK_ACCT is not set
|
||||
# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set
|
||||
# CONFIG_NETFILTER_NETLINK_HOOK is not set
|
||||
# CONFIG_NETFILTER_NETLINK_LOG is not set
|
||||
# CONFIG_NETFILTER_NETLINK_OSF is not set
|
||||
# CONFIG_NETFILTER_NETLINK_QUEUE is not set
|
||||
@ -4182,10 +4192,10 @@ CONFIG_NFS_V3=y
|
||||
# CONFIG_NFT_FIB_IPV4 is not set
|
||||
# CONFIG_NFT_FIB_IPV6 is not set
|
||||
# CONFIG_NFT_FIB_NETDEV is not set
|
||||
# CONFIG_NFT_REJECT_NETDEV is not set
|
||||
# CONFIG_NFT_FLOW_OFFLOAD is not set
|
||||
# CONFIG_NFT_OBJREF is not set
|
||||
# CONFIG_NFT_OSF is not set
|
||||
# CONFIG_NFT_REJECT_NETDEV is not set
|
||||
# CONFIG_NFT_RT is not set
|
||||
# CONFIG_NFT_SET_BITMAP is not set
|
||||
# CONFIG_NFT_SOCKET is not set
|
||||
@ -4332,10 +4342,10 @@ CONFIG_NMI_LOG_BUF_SHIFT=13
|
||||
# CONFIG_NO_HZ_IDLE is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_NTB is not set
|
||||
# CONFIG_NTFS3_FS is not set
|
||||
# CONFIG_NTFS3_64BIT_CLUSTER is not set
|
||||
# CONFIG_NTFS3_LZX_XPRESS is not set
|
||||
# CONFIG_NTFS3_FS is not set
|
||||
# CONFIG_NTFS3_FS_POSIX_ACL is not set
|
||||
# CONFIG_NTFS3_LZX_XPRESS is not set
|
||||
# CONFIG_NTFS_DEBUG is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
# CONFIG_NTFS_RW is not set
|
||||
@ -4582,12 +4592,14 @@ CONFIG_PCI_SYSCALL=y
|
||||
# CONFIG_PHY_EXYNOS_DP_VIDEO is not set
|
||||
# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set
|
||||
# CONFIG_PHY_FSL_IMX8MQ_USB is not set
|
||||
# CONFIG_PHY_INGENIC_USB is not set
|
||||
# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set
|
||||
# CONFIG_PHY_MAPPHONE_MDM6600 is not set
|
||||
# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
|
||||
# CONFIG_PHY_MTK_HDMI is not set
|
||||
# CONFIG_PHY_MTK_MIPI_DSI is not set
|
||||
# CONFIG_PHY_OCELOT_SERDES is not set
|
||||
# CONFIG_PHY_PISTACHIO_USB is not set
|
||||
# CONFIG_PHY_PXA_28NM_HSIC is not set
|
||||
# CONFIG_PHY_PXA_28NM_USB2 is not set
|
||||
# CONFIG_PHY_QCOM_DWC3 is not set
|
||||
@ -4666,8 +4678,8 @@ CONFIG_POSIX_TIMERS=y
|
||||
# CONFIG_POWER_RESET_LINKSTATION is not set
|
||||
# CONFIG_POWER_RESET_LTC2952 is not set
|
||||
# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set
|
||||
# CONFIG_POWER_RESET_REGULATOR is not set
|
||||
# CONFIG_POWER_RESET_QNAP is not set
|
||||
# CONFIG_POWER_RESET_REGULATOR is not set
|
||||
# CONFIG_POWER_RESET_RESTART is not set
|
||||
# CONFIG_POWER_RESET_SYSCON is not set
|
||||
# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
|
||||
@ -4740,8 +4752,8 @@ CONFIG_PROC_SYSCTL=y
|
||||
# CONFIG_PSI is not set
|
||||
# CONFIG_PSTORE is not set
|
||||
# CONFIG_PSTORE_842_COMPRESS is not set
|
||||
# CONFIG_PSTORE_BLK is not set
|
||||
# CONFIG_PSTORE_COMPRESS is not set
|
||||
# CONFIG_PSTORE_COMPRESS_DEFAULT="deflate"
|
||||
# CONFIG_PSTORE_CONSOLE is not set
|
||||
CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240
|
||||
# CONFIG_PSTORE_DEFLATE_COMPRESS is not set
|
||||
@ -5323,11 +5335,13 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_BEL_PFE is not set
|
||||
# CONFIG_SENSORS_BH1770 is not set
|
||||
# CONFIG_SENSORS_BH1780 is not set
|
||||
# CONFIG_SENSORS_BPA_RS600 is not set
|
||||
# CONFIG_SENSORS_CORETEMP is not set
|
||||
# CONFIG_SENSORS_CORSAIR_CPRO is not set
|
||||
# CONFIG_SENSORS_CORSAIR_PSU is not set
|
||||
# CONFIG_SENSORS_DELL_SMM is not set
|
||||
# CONFIG_SENSORS_DME1737 is not set
|
||||
# CONFIG_SENSORS_DPS920AB is not set
|
||||
# CONFIG_SENSORS_DRIVETEMP is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_DS620 is not set
|
||||
@ -5339,6 +5353,7 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_F75375S is not set
|
||||
# CONFIG_SENSORS_FAM15H_POWER is not set
|
||||
# CONFIG_SENSORS_FSCHMD is not set
|
||||
# CONFIG_SENSORS_FSP_3Y is not set
|
||||
# CONFIG_SENSORS_FTSTEUTATES is not set
|
||||
# CONFIG_SENSORS_G760A is not set
|
||||
# CONFIG_SENSORS_G762 is not set
|
||||
@ -5361,6 +5376,7 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_INA3221 is not set
|
||||
# CONFIG_SENSORS_INSPUR_IPSPS is not set
|
||||
# CONFIG_SENSORS_IR35221 is not set
|
||||
# CONFIG_SENSORS_IR36021 is not set
|
||||
# CONFIG_SENSORS_IR38064 is not set
|
||||
# CONFIG_SENSORS_IRPS5401 is not set
|
||||
# CONFIG_SENSORS_ISL29018 is not set
|
||||
@ -5407,6 +5423,7 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_LTQ_CPUTEMP is not set
|
||||
# CONFIG_SENSORS_MAX1111 is not set
|
||||
# CONFIG_SENSORS_MAX127 is not set
|
||||
# CONFIG_SENSORS_MAX15301 is not set
|
||||
# CONFIG_SENSORS_MAX16064 is not set
|
||||
# CONFIG_SENSORS_MAX16065 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
@ -5427,6 +5444,7 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_MAX6697 is not set
|
||||
# CONFIG_SENSORS_MAX8688 is not set
|
||||
# CONFIG_SENSORS_MCP3021 is not set
|
||||
# CONFIG_SENSORS_MP2888 is not set
|
||||
# CONFIG_SENSORS_MP2975 is not set
|
||||
# CONFIG_SENSORS_MR75203 is not set
|
||||
# CONFIG_SENSORS_NCT6683 is not set
|
||||
@ -5441,10 +5459,13 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_PC87427 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_PIM4328 is not set
|
||||
# CONFIG_SENSORS_PM6764TR is not set
|
||||
# CONFIG_SENSORS_PMBUS is not set
|
||||
# CONFIG_SENSORS_POWR1220 is not set
|
||||
# CONFIG_SENSORS_PWM_FAN is not set
|
||||
# CONFIG_SENSORS_PXE1610 is not set
|
||||
# CONFIG_SENSORS_Q54SJ108A2 is not set
|
||||
# CONFIG_SENSORS_RM3100_I2C is not set
|
||||
# CONFIG_SENSORS_RM3100_SPI is not set
|
||||
# CONFIG_SENSORS_SBRMI is not set
|
||||
@ -5462,6 +5483,7 @@ CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
# CONFIG_SENSORS_STPDDC60 is not set
|
||||
# CONFIG_SENSORS_STTS751 is not set
|
||||
# CONFIG_SENSORS_TC654 is not set
|
||||
# CONFIG_SENSORS_TC74 is not set
|
||||
@ -5797,6 +5819,8 @@ CONFIG_SND_PROC_FS=y
|
||||
# CONFIG_SND_SIS7019 is not set
|
||||
# CONFIG_SND_SOC is not set
|
||||
# CONFIG_SND_SOC_AC97_CODEC is not set
|
||||
# CONFIG_SND_SOC_ADAU1372_I2C is not set
|
||||
# CONFIG_SND_SOC_ADAU1372_SPI is not set
|
||||
# CONFIG_SND_SOC_ADAU1701 is not set
|
||||
# CONFIG_SND_SOC_ADAU1761_I2C is not set
|
||||
# CONFIG_SND_SOC_ADAU1761_SPI is not set
|
||||
@ -5859,6 +5883,7 @@ CONFIG_SND_PROC_FS=y
|
||||
# CONFIG_SND_SOC_FSL_SAI is not set
|
||||
# CONFIG_SND_SOC_FSL_SPDIF is not set
|
||||
# CONFIG_SND_SOC_FSL_SSI is not set
|
||||
# CONFIG_SND_SOC_FSL_XCVR is not set
|
||||
# CONFIG_SND_SOC_GTM601 is not set
|
||||
# CONFIG_SND_SOC_ICS43432 is not set
|
||||
# CONFIG_SND_SOC_IMG is not set
|
||||
@ -5906,6 +5931,10 @@ CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
|
||||
# CONFIG_SND_SOC_JZ4725B_CODEC is not set
|
||||
# CONFIG_SND_SOC_JZ4740_CODEC is not set
|
||||
# CONFIG_SND_SOC_JZ4770_CODEC is not set
|
||||
# CONFIG_SND_SOC_LPASS_RX_MACRO is not set
|
||||
# CONFIG_SND_SOC_LPASS_TX_MACRO is not set
|
||||
# CONFIG_SND_SOC_LPASS_VA_MACRO is not set
|
||||
# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set
|
||||
# CONFIG_SND_SOC_MA120X0P is not set
|
||||
# CONFIG_SND_SOC_MAX9759 is not set
|
||||
# CONFIG_SND_SOC_MAX98088 is not set
|
||||
@ -5925,11 +5954,16 @@ CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
|
||||
# CONFIG_SND_SOC_MT2701 is not set
|
||||
# CONFIG_SND_SOC_MT6351 is not set
|
||||
# CONFIG_SND_SOC_MT6358 is not set
|
||||
# CONFIG_SND_SOC_MT6359 is not set
|
||||
# CONFIG_SND_SOC_MT6359_ACCDET is not set
|
||||
# CONFIG_SND_SOC_MT6660 is not set
|
||||
# CONFIG_SND_SOC_MT6797 is not set
|
||||
# CONFIG_SND_SOC_MT8173 is not set
|
||||
# CONFIG_SND_SOC_MT8183 is not set
|
||||
# CONFIG_SND_SOC_MT8192 is not set
|
||||
# CONFIG_SND_SOC_MT8195 is not set
|
||||
# CONFIG_SND_SOC_MTK_BTCVSD is not set
|
||||
# CONFIG_SND_SOC_NAU8315 is not set
|
||||
# CONFIG_SND_SOC_NAU8540 is not set
|
||||
# CONFIG_SND_SOC_NAU8810 is not set
|
||||
# CONFIG_SND_SOC_NAU8822 is not set
|
||||
@ -5951,13 +5985,17 @@ CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
|
||||
# CONFIG_SND_SOC_RK3328 is not set
|
||||
# CONFIG_SND_SOC_RT5616 is not set
|
||||
# CONFIG_SND_SOC_RT5631 is not set
|
||||
# CONFIG_SND_SOC_RT5640 is not set
|
||||
# CONFIG_SND_SOC_RT5659 is not set
|
||||
# CONFIG_SND_SOC_RT5677_SPI is not set
|
||||
# CONFIG_SND_SOC_SGTL5000 is not set
|
||||
# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set
|
||||
# CONFIG_SND_SOC_SIMPLE_MUX is not set
|
||||
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
|
||||
# CONFIG_SND_SOC_SOF_TOPLEVEL is not set
|
||||
# CONFIG_SND_SOC_SPDIF is not set
|
||||
# CONFIG_SND_SOC_SSM2305 is not set
|
||||
# CONFIG_SND_SOC_SSM2518 is not set
|
||||
# CONFIG_SND_SOC_SSM2602_I2C is not set
|
||||
# CONFIG_SND_SOC_SSM2602_SPI is not set
|
||||
# CONFIG_SND_SOC_SSM4567 is not set
|
||||
@ -5974,6 +6012,7 @@ CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
|
||||
# CONFIG_SND_SOC_TAS6424 is not set
|
||||
# CONFIG_SND_SOC_TDA7419 is not set
|
||||
# CONFIG_SND_SOC_TFA9879 is not set
|
||||
# CONFIG_SND_SOC_TFA989X is not set
|
||||
# CONFIG_SND_SOC_TLV320ADCX140 is not set
|
||||
# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
|
||||
# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
|
||||
@ -5981,6 +6020,8 @@ CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
|
||||
# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set
|
||||
# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set
|
||||
# CONFIG_SND_SOC_TLV320AIC3X is not set
|
||||
# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set
|
||||
# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set
|
||||
# CONFIG_SND_SOC_TPA6130A2 is not set
|
||||
# CONFIG_SND_SOC_TS3A227E is not set
|
||||
# CONFIG_SND_SOC_TSCS42XX is not set
|
||||
@ -6131,6 +6172,8 @@ CONFIG_SND_X86=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
# CONFIG_SPMI is not set
|
||||
# CONFIG_SPS30 is not set
|
||||
# CONFIG_SPS30_I2C is not set
|
||||
# CONFIG_SPS30_SERIAL is not set
|
||||
CONFIG_SQUASHFS=y
|
||||
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
|
||||
# CONFIG_SQUASHFS_DECOMP_MULTI is not set
|
||||
@ -6157,8 +6200,6 @@ CONFIG_SQUASHFS_XZ=y
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB_SDIOHOST is not set
|
||||
# CONFIG_SSB_SILENT is not set
|
||||
# CONFIG_SPS30_I2C is not set
|
||||
# CONFIG_SPS30_SERIAL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_STACKPROTECTOR is not set
|
||||
# CONFIG_STACKPROTECTOR_STRONG is not set
|
||||
@ -6258,10 +6299,10 @@ CONFIG_SYSVIPC_SYSCTL=y
|
||||
# CONFIG_TCG_ST33_I2C is not set
|
||||
# CONFIG_TCG_TIS is not set
|
||||
# CONFIG_TCG_TIS_I2C_ATMEL is not set
|
||||
# CONFIG_TCG_TIS_I2C_CR50 is not set
|
||||
# CONFIG_TCG_TIS_I2C_INFINEON is not set
|
||||
# CONFIG_TCG_TIS_I2C_NUVOTON is not set
|
||||
# CONFIG_TCG_TIS_SPI is not set
|
||||
# CONFIG_TCG_TIS_I2C_CR50 is not set
|
||||
# CONFIG_TCG_TIS_ST33ZP24_I2C is not set
|
||||
# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
@ -6474,10 +6515,10 @@ CONFIG_TMPFS_XATTR=y
|
||||
# CONFIG_TOUCHSCREEN_MC13783 is not set
|
||||
# CONFIG_TOUCHSCREEN_MCS5000 is not set
|
||||
# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
|
||||
# CONFIG_TOUCHSCREEN_MSG2638 is not set
|
||||
# CONFIG_TOUCHSCREEN_MIGOR is not set
|
||||
# CONFIG_TOUCHSCREEN_MK712 is not set
|
||||
# CONFIG_TOUCHSCREEN_MMS114 is not set
|
||||
# CONFIG_TOUCHSCREEN_MSG2638 is not set
|
||||
# CONFIG_TOUCHSCREEN_MTOUCH is not set
|
||||
# CONFIG_TOUCHSCREEN_MX25 is not set
|
||||
# CONFIG_TOUCHSCREEN_MXS_LRADC is not set
|
||||
@ -6824,7 +6865,6 @@ CONFIG_USB_GADGET_VBUS_DRAW=2
|
||||
# CONFIG_USB_NET2272 is not set
|
||||
# CONFIG_USB_NET2280 is not set
|
||||
# CONFIG_USB_NET_AQC111 is not set
|
||||
# CONFIG_USB_RTL8153_ECM is not set
|
||||
# CONFIG_USB_NET_AX88179_178A is not set
|
||||
# CONFIG_USB_NET_AX8817X is not set
|
||||
# CONFIG_USB_NET_CDCETHER is not set
|
||||
@ -6881,6 +6921,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_USB_ROLE_SWITCH is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_RTL8152 is not set
|
||||
# CONFIG_USB_RTL8153_ECM is not set
|
||||
# CONFIG_USB_S2255 is not set
|
||||
# CONFIG_USB_SERIAL is not set
|
||||
# CONFIG_USB_SERIAL_AIRCABLE is not set
|
||||
@ -6948,6 +6989,7 @@ CONFIG_USB_SERIAL_SAFE_PADDED=y
|
||||
# CONFIG_USB_SERIAL_WHITEHEAT is not set
|
||||
# CONFIG_USB_SERIAL_WISHBONE is not set
|
||||
# CONFIG_USB_SERIAL_XIRCOM is not set
|
||||
# CONFIG_USB_SERIAL_XR is not set
|
||||
# CONFIG_USB_SERIAL_XSENS_MT is not set
|
||||
# CONFIG_USB_SEVSEG is not set
|
||||
# CONFIG_USB_SIERRA_NET is not set
|
||||
@ -7060,6 +7102,7 @@ CONFIG_VHOST_MENU=y
|
||||
# CONFIG_VIDEO_BT866 is not set
|
||||
# CONFIG_VIDEO_CADENCE is not set
|
||||
# CONFIG_VIDEO_CAFE_CCIC is not set
|
||||
# CONFIG_VIDEO_CCS is not set
|
||||
# CONFIG_VIDEO_CS3308 is not set
|
||||
# CONFIG_VIDEO_CS5345 is not set
|
||||
# CONFIG_VIDEO_CS53L32A is not set
|
||||
@ -7089,7 +7132,10 @@ CONFIG_VHOST_MENU=y
|
||||
# CONFIG_VIDEO_IMX274 is not set
|
||||
# CONFIG_VIDEO_IMX290 is not set
|
||||
# CONFIG_VIDEO_IMX319 is not set
|
||||
# CONFIG_VIDEO_IMX334 is not set
|
||||
# CONFIG_VIDEO_IMX335 is not set
|
||||
# CONFIG_VIDEO_IMX355 is not set
|
||||
# CONFIG_VIDEO_IMX412 is not set
|
||||
# CONFIG_VIDEO_IMX477 is not set
|
||||
# CONFIG_VIDEO_IRS1125 is not set
|
||||
# CONFIG_VIDEO_IR_I2C is not set
|
||||
@ -7115,6 +7161,7 @@ CONFIG_VHOST_MENU=y
|
||||
# CONFIG_VIDEO_MXB is not set
|
||||
# CONFIG_VIDEO_NOON010PC30 is not set
|
||||
# CONFIG_VIDEO_OMAP2_VOUT is not set
|
||||
# CONFIG_VIDEO_OV02A10 is not set
|
||||
# CONFIG_VIDEO_OV13858 is not set
|
||||
# CONFIG_VIDEO_OV2640 is not set
|
||||
# CONFIG_VIDEO_OV2659 is not set
|
||||
@ -7124,6 +7171,7 @@ CONFIG_VHOST_MENU=y
|
||||
# CONFIG_VIDEO_OV5640 is not set
|
||||
# CONFIG_VIDEO_OV5645 is not set
|
||||
# CONFIG_VIDEO_OV5647 is not set
|
||||
# CONFIG_VIDEO_OV5648 is not set
|
||||
# CONFIG_VIDEO_OV5670 is not set
|
||||
# CONFIG_VIDEO_OV5675 is not set
|
||||
# CONFIG_VIDEO_OV5695 is not set
|
||||
@ -7134,11 +7182,14 @@ CONFIG_VHOST_MENU=y
|
||||
# CONFIG_VIDEO_OV772X is not set
|
||||
# CONFIG_VIDEO_OV7740 is not set
|
||||
# CONFIG_VIDEO_OV8856 is not set
|
||||
# CONFIG_VIDEO_OV8865 is not set
|
||||
# CONFIG_VIDEO_OV9281 is not set
|
||||
# CONFIG_VIDEO_OV9282 is not set
|
||||
# CONFIG_VIDEO_OV9640 is not set
|
||||
# CONFIG_VIDEO_OV9650 is not set
|
||||
# CONFIG_VIDEO_PVRUSB2 is not set
|
||||
# CONFIG_VIDEO_RDACM20 is not set
|
||||
# CONFIG_VIDEO_RDACM21 is not set
|
||||
# CONFIG_VIDEO_RJ54N1 is not set
|
||||
# CONFIG_VIDEO_S5C73M3 is not set
|
||||
# CONFIG_VIDEO_S5K4ECGX is not set
|
||||
@ -7384,10 +7435,10 @@ CONFIG_ZONE_DMA=y
|
||||
# CONFIG_ZPA2326 is not set
|
||||
# CONFIG_ZPOOL is not set
|
||||
# CONFIG_ZRAM is not set
|
||||
# CONFIG_ZRAM_MEMORY_TRACKING is not set
|
||||
# CONFIG_ZRAM_DEF_COMP_LZORLE is not set
|
||||
# CONFIG_ZRAM_DEF_COMP_ZSTD is not set
|
||||
# CONFIG_ZRAM_DEF_COMP_LZ4 is not set
|
||||
# CONFIG_ZRAM_DEF_COMP_LZO is not set
|
||||
# CONFIG_ZRAM_DEF_COMP_LZORLE is not set
|
||||
# CONFIG_ZRAM_DEF_COMP_ZSTD is not set
|
||||
# CONFIG_ZRAM_MEMORY_TRACKING is not set
|
||||
# CONFIG_ZSMALLOC is not set
|
||||
# CONFIG_ZX_TDM is not set
|
||||
|
||||
@ -1,18 +0,0 @@
|
||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||
@@ -2097,6 +2097,7 @@ static int mv88e6xxx_port_fdb_add(struct
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
int err;
|
||||
|
||||
+ vid = vid ? : 1;
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid,
|
||||
MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC);
|
||||
@@ -2111,6 +2112,7 @@ static int mv88e6xxx_port_fdb_del(struct
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
int err;
|
||||
|
||||
+ vid = vid ? : 1;
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid, 0);
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
@ -1,2 +1,2 @@
|
||||
BOARDNAME:=Google Chromium
|
||||
FEATURES += emmc boot-part rootfs-part
|
||||
FEATURES += emmc boot-part rootfs-part source-only
|
||||
|
||||
@ -11,6 +11,7 @@ CPU_SUBTYPE:=neon-vfpv4
|
||||
SUBTARGETS:=generic
|
||||
|
||||
KERNEL_PATCHVER:=5.10
|
||||
KERNEL_TESTING_PATCHVER:=5.15
|
||||
|
||||
KERNELNAME:=zImage Image dtbs
|
||||
|
||||
|
||||
507
target/linux/ipq806x/config-5.15
Normal file
507
target/linux/ipq806x/config-5.15
Normal file
@ -0,0 +1,507 @@
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
# CONFIG_APQ_GCC_8084 is not set
|
||||
# CONFIG_APQ_MMCC_8084 is not set
|
||||
CONFIG_AR8216_PHY=y
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
# CONFIG_ARCH_IPQ40XX is not set
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
# CONFIG_ARCH_MDM9615 is not set
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MSM8960=y
|
||||
CONFIG_ARCH_MSM8974=y
|
||||
CONFIG_ARCH_MSM8X60=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
|
||||
CONFIG_ARCH_QCOM=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ARCH_TIMER=y
|
||||
CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER is not set
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE=y
|
||||
CONFIG_ARM_CPUIDLE=y
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
# CONFIG_ARM_CPU_TOPOLOGY is not set
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
CONFIG_ARM_MODULE_PLTS=y
|
||||
CONFIG_ARM_PATCH_IDIV=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_QCOM_CPUFREQ_HW is not set
|
||||
CONFIG_ARM_QCOM_CPUFREQ_KRAIT=y
|
||||
CONFIG_ARM_QCOM_CPUFREQ_NVMEM=y
|
||||
CONFIG_ARM_QCOM_SPM_CPUIDLE=y
|
||||
# CONFIG_ARM_SMMU is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_AT803X_PHY=y
|
||||
CONFIG_BINARY_PRINTF=y
|
||||
CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BOUNCE=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
CONFIG_CLKSRC_QCOM=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE_OVERRIDE=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_QCOM=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_CPUFREQ_DT_PLATDEV=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
|
||||
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_SPECTRE=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_CPU_THUMB_CAPABLE=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
# CONFIG_CRC32_SARWATE is not set
|
||||
CONFIG_CRC32_SLICEBY8=y
|
||||
CONFIG_CRC8=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_DEV_QCOM_RNG=y
|
||||
CONFIG_CRYPTO_DRBG=y
|
||||
CONFIG_CRYPTO_DRBG_HMAC=y
|
||||
CONFIG_CRYPTO_DRBG_MENU=y
|
||||
CONFIG_CRYPTO_GF128MUL=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_HW=y
|
||||
CONFIG_CRYPTO_JITTERENTROPY=y
|
||||
CONFIG_CRYPTO_LIB_SHA256=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_NULL2=y
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_SHA256=y
|
||||
CONFIG_CRYPTO_SHA512=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_GPIO=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
|
||||
# CONFIG_DEVFREQ_GOV_PASSIVE is not set
|
||||
# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
|
||||
# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
|
||||
# CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND is not set
|
||||
# CONFIG_DEVFREQ_GOV_USERSPACE is not set
|
||||
# CONFIG_DEVFREQ_THERMAL is not set
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_OPS=y
|
||||
CONFIG_DMA_REMAP=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DT_IDLE_STATES=y
|
||||
# CONFIG_DWMAC_GENERIC is not set
|
||||
CONFIG_DWMAC_IPQ806X=y
|
||||
# CONFIG_DWMAC_QCOM_ETHQOS is not set
|
||||
CONFIG_DYNAMIC_DEBUG=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GENERIC_VDSO_32=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GRO_CELLS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HIGHMEM=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
CONFIG_HWMON=y
|
||||
CONFIG_HWSPINLOCK=y
|
||||
CONFIG_HWSPINLOCK_QCOM=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_HELPER_AUTO=y
|
||||
# CONFIG_I2C_QCOM_CCI is not set
|
||||
CONFIG_I2C_QUP=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_IOMMU_DEBUGFS is not set
|
||||
# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
|
||||
# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set
|
||||
CONFIG_IOMMU_SUPPORT=y
|
||||
# CONFIG_IPQ_APSS_PLL is not set
|
||||
# CONFIG_IPQ_GCC_4019 is not set
|
||||
# CONFIG_IPQ_GCC_6018 is not set
|
||||
CONFIG_IPQ_GCC_806X=y
|
||||
# CONFIG_IPQ_GCC_8074 is not set
|
||||
# CONFIG_IPQ_LCC_806X is not set
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_KMAP_LOCAL=y
|
||||
CONFIG_KPSS_XCC=y
|
||||
CONFIG_KRAITCC=y
|
||||
CONFIG_KRAIT_CLOCKS=y
|
||||
CONFIG_KRAIT_L2_ACCESSORS=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LLD_VERSION=0
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LTO_NONE=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
CONFIG_MDIO_GPIO=y
|
||||
CONFIG_MDIO_IPQ8064=y
|
||||
# CONFIG_MDM_GCC_9615 is not set
|
||||
# CONFIG_MDM_LCC_9615 is not set
|
||||
CONFIG_MEMFD_CREATE=y
|
||||
# CONFIG_MFD_HI6421_SPMI is not set
|
||||
CONFIG_MFD_QCOM_RPM=y
|
||||
# CONFIG_MFD_SPMI_PMIC is not set
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_ARMMMCI=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_MINORS=16
|
||||
CONFIG_MMC_CQHCI=y
|
||||
CONFIG_MMC_QCOM_DML=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
|
||||
CONFIG_MMC_SDHCI_MSM=y
|
||||
# CONFIG_MMC_SDHCI_PCI is not set
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MSM_GCC_8660=y
|
||||
# CONFIG_MSM_GCC_8916 is not set
|
||||
# CONFIG_MSM_GCC_8939 is not set
|
||||
# CONFIG_MSM_GCC_8960 is not set
|
||||
# CONFIG_MSM_GCC_8974 is not set
|
||||
# CONFIG_MSM_GCC_8994 is not set
|
||||
# CONFIG_MSM_GCC_8996 is not set
|
||||
# CONFIG_MSM_GCC_8998 is not set
|
||||
# CONFIG_MSM_GPUCC_8998 is not set
|
||||
# CONFIG_MSM_IOMMU is not set
|
||||
# CONFIG_MSM_LCC_8960 is not set
|
||||
# CONFIG_MSM_MMCC_8960 is not set
|
||||
# CONFIG_MSM_MMCC_8974 is not set
|
||||
# CONFIG_MSM_MMCC_8996 is not set
|
||||
# CONFIG_MSM_MMCC_8998 is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_NAND_CORE=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||
CONFIG_MTD_NAND_QCOM=y
|
||||
CONFIG_MTD_QCOMSMEM_PARTS=y
|
||||
CONFIG_MTD_RAW_NAND=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||
CONFIG_MTD_SPLIT_FIT_FW=y
|
||||
CONFIG_MTD_SPLIT_UIMAGE_FW=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DSA=y
|
||||
CONFIG_NET_DSA_QCA8K=y
|
||||
CONFIG_NET_DSA_TAG_QCA=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_PTP_CLASSIFY=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_SOCK_MSG=y
|
||||
CONFIG_NET_SWITCHDEV=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_NVMEM=y
|
||||
# CONFIG_NVMEM_SPMI_SDAM is not set
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PAGE_POOL=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIEAER=y
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
CONFIG_PCIE_DW=y
|
||||
CONFIG_PCIE_DW_HOST=y
|
||||
CONFIG_PCIE_QCOM=y
|
||||
CONFIG_PCI_DEBUG=y
|
||||
CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_PCS_XPCS=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLINK=y
|
||||
# CONFIG_PHY_QCOM_APQ8064_SATA is not set
|
||||
# CONFIG_PHY_QCOM_IPQ4019_USB is not set
|
||||
CONFIG_PHY_QCOM_IPQ806X_SATA=y
|
||||
# CONFIG_PHY_QCOM_IPQ806X_USB is not set
|
||||
# CONFIG_PHY_QCOM_PCIE2 is not set
|
||||
# CONFIG_PHY_QCOM_QMP is not set
|
||||
# CONFIG_PHY_QCOM_QUSB2 is not set
|
||||
# CONFIG_PHY_QCOM_USB_HS_28NM is not set
|
||||
# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set
|
||||
# CONFIG_PHY_QCOM_USB_SS is not set
|
||||
CONFIG_PINCTRL=y
|
||||
# CONFIG_PINCTRL_APQ8064 is not set
|
||||
# CONFIG_PINCTRL_APQ8084 is not set
|
||||
# CONFIG_PINCTRL_IPQ4019 is not set
|
||||
# CONFIG_PINCTRL_IPQ6018 is not set
|
||||
CONFIG_PINCTRL_IPQ8064=y
|
||||
# CONFIG_PINCTRL_IPQ8074 is not set
|
||||
# CONFIG_PINCTRL_MDM9615 is not set
|
||||
CONFIG_PINCTRL_MSM=y
|
||||
# CONFIG_PINCTRL_MSM8226 is not set
|
||||
# CONFIG_PINCTRL_MSM8660 is not set
|
||||
# CONFIG_PINCTRL_MSM8916 is not set
|
||||
# CONFIG_PINCTRL_MSM8960 is not set
|
||||
# CONFIG_PINCTRL_MSM8976 is not set
|
||||
# CONFIG_PINCTRL_MSM8994 is not set
|
||||
# CONFIG_PINCTRL_MSM8996 is not set
|
||||
# CONFIG_PINCTRL_MSM8998 is not set
|
||||
# CONFIG_PINCTRL_QCOM_SPMI_PMIC is not set
|
||||
# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set
|
||||
# CONFIG_PINCTRL_QCS404 is not set
|
||||
# CONFIG_PINCTRL_SC7180 is not set
|
||||
# CONFIG_PINCTRL_SDM660 is not set
|
||||
# CONFIG_PINCTRL_SDM845 is not set
|
||||
# CONFIG_PINCTRL_SM8150 is not set
|
||||
# CONFIG_PINCTRL_SM8250 is not set
|
||||
CONFIG_PM_DEVFREQ=y
|
||||
# CONFIG_PM_DEVFREQ_EVENT is not set
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_RESET_MSM=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PPS=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PTP_1588_CLOCK=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
# CONFIG_QCOM_A53PLL is not set
|
||||
CONFIG_QCOM_ADM=y
|
||||
CONFIG_QCOM_BAM_DMA=y
|
||||
CONFIG_QCOM_CLK_RPM=y
|
||||
# CONFIG_QCOM_COMMAND_DB is not set
|
||||
# CONFIG_QCOM_CPR is not set
|
||||
# CONFIG_QCOM_EBI2 is not set
|
||||
# CONFIG_QCOM_GENI_SE is not set
|
||||
CONFIG_QCOM_GSBI=y
|
||||
CONFIG_QCOM_HFPLL=y
|
||||
# CONFIG_QCOM_IOMMU is not set
|
||||
# CONFIG_QCOM_LLCC is not set
|
||||
# CONFIG_QCOM_OCMEM is not set
|
||||
# CONFIG_QCOM_PDC is not set
|
||||
CONFIG_QCOM_QFPROM=y
|
||||
# CONFIG_QCOM_RMTFS_MEM is not set
|
||||
CONFIG_QCOM_RPMCC=y
|
||||
# CONFIG_QCOM_RPMH is not set
|
||||
CONFIG_QCOM_SCM=y
|
||||
# CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT is not set
|
||||
CONFIG_QCOM_SMEM=y
|
||||
# CONFIG_QCOM_SMSM is not set
|
||||
# CONFIG_QCOM_SOCINFO is not set
|
||||
CONFIG_QCOM_TCSR=y
|
||||
CONFIG_QCOM_TSENS=y
|
||||
CONFIG_QCOM_WDT=y
|
||||
# CONFIG_QCS_GCC_404 is not set
|
||||
# CONFIG_QCS_Q6SSTOP_404 is not set
|
||||
# CONFIG_QCS_TURING_404 is not set
|
||||
CONFIG_RAS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=21
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
# CONFIG_REGULATOR_QCOM_LABIBB is not set
|
||||
CONFIG_REGULATOR_QCOM_RPM=y
|
||||
# CONFIG_REGULATOR_QCOM_SPMI is not set
|
||||
# CONFIG_REGULATOR_QCOM_USB_VBUS is not set
|
||||
# CONFIG_REGULATOR_VQMMC_IPQ4019 is not set
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
# CONFIG_RESET_QCOM_AOSS is not set
|
||||
# CONFIG_RESET_QCOM_PDC is not set
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_I2C_AND_SPI=y
|
||||
CONFIG_RTC_MC146818_LIB=y
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
# CONFIG_SC_DISPCC_7180 is not set
|
||||
# CONFIG_SC_GCC_7180 is not set
|
||||
# CONFIG_SC_GPUCC_7180 is not set
|
||||
# CONFIG_SC_LPASS_CORECC_7180 is not set
|
||||
# CONFIG_SC_MSS_7180 is not set
|
||||
# CONFIG_SC_VIDEOCC_7180 is not set
|
||||
# CONFIG_SDM_CAMCC_845 is not set
|
||||
# CONFIG_SDM_DISPCC_845 is not set
|
||||
# CONFIG_SDM_GCC_660 is not set
|
||||
# CONFIG_SDM_GCC_845 is not set
|
||||
# CONFIG_SDM_GPUCC_845 is not set
|
||||
# CONFIG_SDM_LPASSCC_845 is not set
|
||||
# CONFIG_SDM_VIDEOCC_845 is not set
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_MSM=y
|
||||
CONFIG_SERIAL_MSM_CONSOLE=y
|
||||
CONFIG_SGL_ALLOC=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
# CONFIG_SM_GCC_8150 is not set
|
||||
# CONFIG_SM_GCC_8250 is not set
|
||||
# CONFIG_SM_GPUCC_8150 is not set
|
||||
# CONFIG_SM_GPUCC_8250 is not set
|
||||
# CONFIG_SM_VIDEOCC_8150 is not set
|
||||
# CONFIG_SM_VIDEOCC_8250 is not set
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SPI_QUP=y
|
||||
CONFIG_SPMI=y
|
||||
# CONFIG_SPMI_HISI3670 is not set
|
||||
CONFIG_SPMI_MSM_PMIC_ARB=y
|
||||
# CONFIG_SPMI_PMIC_CLKDIV is not set
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_STMMAC_ETH=y
|
||||
CONFIG_STMMAC_PLATFORM=y
|
||||
# CONFIG_STMMAC_SELFTESTS is not set
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWCONFIG_LEDS=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_HWMON=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_UBIFS_FS_ADVANCED_COMPR=y
|
||||
# CONFIG_UCLAMP_TASK is not set
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_UNWINDER_ARM=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
||||
@ -51,7 +51,7 @@
|
||||
max-link-speed = <1>;
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -63,7 +63,7 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -231,7 +231,7 @@
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -34,7 +34,7 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -172,7 +172,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -166,7 +166,7 @@
|
||||
max-link-speed = <1>;
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -228,7 +228,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -218,7 +218,7 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -103,7 +103,7 @@
|
||||
pinctrl-names = "default";
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -156,7 +156,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -220,7 +220,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -98,7 +98,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -137,7 +137,7 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -259,7 +259,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
&nand_controller {
|
||||
&nand {
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&nand_pins>;
|
||||
|
||||
@ -790,7 +790,7 @@
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ nand_controller: nand-controller@1ac00000 {
|
||||
+ nand: nand-controller@1ac00000 {
|
||||
+ compatible = "qcom,ipq806x-nand";
|
||||
+ reg = <0x1ac00000 0x800>;
|
||||
+
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
From 28d0ed88f536dd639adf1b0c7c08e04be3c8f294 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Pedersen <twp@codeaurora.org>
|
||||
Date: Mon, 16 May 2016 17:58:50 -0700
|
||||
Subject: [PATCH 01/69] dtbindings: qcom_adm: Fix channel specifiers
|
||||
|
||||
Original patch from Andy Gross.
|
||||
|
||||
This patch removes the crci information from the dma
|
||||
channel property. At least one client device requires
|
||||
using more than one CRCI value for a channel. This does
|
||||
not match the current binding and the crci information
|
||||
needs to be removed.
|
||||
|
||||
Instead, the client device will provide this information
|
||||
via other means.
|
||||
|
||||
Signed-off-by: Andy Gross <agross@codeaurora.org>
|
||||
Signed-off-by: Thomas Pedersen <twp@codeaurora.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/dma/qcom_adm.txt | 16 ++++++----------
|
||||
1 file changed, 6 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/dma/qcom_adm.txt
|
||||
+++ b/Documentation/devicetree/bindings/dma/qcom_adm.txt
|
||||
@@ -4,8 +4,7 @@ Required properties:
|
||||
- compatible: must contain "qcom,adm" for IPQ/APQ8064 and MSM8960
|
||||
- reg: Address range for DMA registers
|
||||
- interrupts: Should contain one interrupt shared by all channels
|
||||
-- #dma-cells: must be <2>. First cell denotes the channel number. Second cell
|
||||
- denotes CRCI (client rate control interface) flow control assignment.
|
||||
+- #dma-cells: must be <1>. First cell denotes the channel number.
|
||||
- clocks: Should contain the core clock and interface clock.
|
||||
- clock-names: Must contain "core" for the core clock and "iface" for the
|
||||
interface clock.
|
||||
@@ -22,7 +21,7 @@ Example:
|
||||
compatible = "qcom,adm";
|
||||
reg = <0x18300000 0x100000>;
|
||||
interrupts = <0 170 0>;
|
||||
- #dma-cells = <2>;
|
||||
+ #dma-cells = <1>;
|
||||
|
||||
clocks = <&gcc ADM0_CLK>, <&gcc ADM0_PBUS_CLK>;
|
||||
clock-names = "core", "iface";
|
||||
@@ -35,15 +34,12 @@ Example:
|
||||
qcom,ee = <0>;
|
||||
};
|
||||
|
||||
-DMA clients must use the format descripted in the dma.txt file, using a three
|
||||
+DMA clients must use the format descripted in the dma.txt file, using a two
|
||||
cell specifier for each channel.
|
||||
|
||||
-Each dmas request consists of 3 cells:
|
||||
+Each dmas request consists of two cells:
|
||||
1. phandle pointing to the DMA controller
|
||||
2. channel number
|
||||
- 3. CRCI assignment, if applicable. If no CRCI flow control is required, use 0.
|
||||
- The CRCI is used for flow control. It identifies the peripheral device that
|
||||
- is the source/destination for the transferred data.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -55,7 +51,7 @@ Example:
|
||||
|
||||
cs-gpios = <&qcom_pinmux 20 0>;
|
||||
|
||||
- dmas = <&adm_dma 6 9>,
|
||||
- <&adm_dma 5 10>;
|
||||
+ dmas = <&adm_dma 6>,
|
||||
+ <&adm_dma 5>;
|
||||
dma-names = "rx", "tx";
|
||||
};
|
||||
@ -0,0 +1,29 @@
|
||||
From 48051ece78136e4235a2415a52797db56f8a4478 Mon Sep 17 00:00:00 2001
|
||||
From: Mathieu Olivari <mathieu@codeaurora.org>
|
||||
Date: Tue, 21 Apr 2015 19:09:07 -0700
|
||||
Subject: [PATCH 33/69] ARM: qcom: automatically select PCI_DOMAINS if PCI is
|
||||
enabled
|
||||
|
||||
If multiple PCIe devices are present in the system, the kernel will
|
||||
panic at boot time when trying to scan the PCI buses. This happens on
|
||||
IPQ806x based platforms, which has 3 PCIe ports.
|
||||
|
||||
Enabling this option allows the kernel to assign the pci-domains
|
||||
according to the device-tree content. This allows multiple PCIe
|
||||
controllers to coexist in the system.
|
||||
|
||||
Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org>
|
||||
---
|
||||
arch/arm/mach-qcom/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/mach-qcom/Kconfig
|
||||
+++ b/arch/arm/mach-qcom/Kconfig
|
||||
@@ -7,6 +7,7 @@ menuconfig ARCH_QCOM
|
||||
select ARM_AMBA
|
||||
select PINCTRL
|
||||
select QCOM_SCM if SMP
|
||||
+ select PCI_DOMAINS if PCI
|
||||
help
|
||||
Support for Qualcomm's devicetree based systems.
|
||||
|
||||
@ -0,0 +1,62 @@
|
||||
From fa71139b55e114aa8c3c4823ff8ee7d49ee810d4 Mon Sep 17 00:00:00 2001
|
||||
From: Mathieu Olivari <mathieu@codeaurora.org>
|
||||
Date: Wed, 29 Apr 2015 15:21:46 -0700
|
||||
Subject: [PATCH 60/69] HACK: arch: arm: force ZRELADDR on arch-qcom
|
||||
|
||||
ARCH_QCOM is using the ARCH_MULTIPLATFORM option, as now recommended
|
||||
on most ARM architectures. This automatically calculate ZRELADDR by
|
||||
masking PHYS_OFFSET with 0xf8000000.
|
||||
|
||||
However, on IPQ806x, the first ~20MB of RAM is reserved for the hardware
|
||||
network accelerators, and the bootloader removes this section from the
|
||||
layout passed from the ATAGS (when used).
|
||||
|
||||
For newer bootloader, when DT is used, this is not a problem, we just
|
||||
reserve this memory in the device tree. But if the bootloader doesn't
|
||||
have DT support, then ATAGS have to be used. In this case, the ARM
|
||||
decompressor will position the kernel in this low mem, which will not be
|
||||
in the RAM section mapped by the bootloader, which means the kernel will
|
||||
freeze in the middle of the boot process trying to map the memory.
|
||||
|
||||
As a work around, this patch allows disabling AUTO_ZRELADDR when
|
||||
ARCH_QCOM is selected. It makes the zImage usage possible on bootloaders
|
||||
which don't support device-tree, which is the case on certain early
|
||||
IPQ806x based designs.
|
||||
|
||||
Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org>
|
||||
---
|
||||
arch/arm/Kconfig | 2 +-
|
||||
arch/arm/Makefile | 2 ++
|
||||
arch/arm/mach-qcom/Makefile.boot | 1 +
|
||||
3 files changed, 4 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/mach-qcom/Makefile.boot
|
||||
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -321,7 +321,7 @@ config ARCH_MULTIPLATFORM
|
||||
select ARCH_SELECT_MEMORY_MODEL
|
||||
select ARM_HAS_SG_CHAIN
|
||||
select ARM_PATCH_PHYS_VIRT
|
||||
- select AUTO_ZRELADDR
|
||||
+ select AUTO_ZRELADDR if !ARCH_QCOM
|
||||
select TIMER_OF
|
||||
select COMMON_CLK
|
||||
select GENERIC_CLOCKEVENTS
|
||||
--- a/arch/arm/Makefile
|
||||
+++ b/arch/arm/Makefile
|
||||
@@ -251,9 +251,11 @@ MACHINE := arch/arm/mach-$(word 1,$(mac
|
||||
else
|
||||
MACHINE :=
|
||||
endif
|
||||
+ifeq ($(CONFIG_ARCH_QCOM),)
|
||||
ifeq ($(CONFIG_ARCH_MULTIPLATFORM),y)
|
||||
MACHINE :=
|
||||
endif
|
||||
+endif
|
||||
|
||||
machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
|
||||
platdirs := $(patsubst %,arch/arm/plat-%/,$(sort $(plat-y)))
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/mach-qcom/Makefile.boot
|
||||
@@ -0,0 +1 @@
|
||||
+zreladdr-y+= 0x42208000
|
||||
@ -0,0 +1,21 @@
|
||||
From 4d8e29642661397a339ac3485f212c6360445421 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Thu, 9 Mar 2017 09:33:32 +0100
|
||||
Subject: [PATCH 65/69] arm: override compiler flags
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/arm/Makefile | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/Makefile
|
||||
+++ b/arch/arm/Makefile
|
||||
@@ -61,7 +61,7 @@ KBUILD_CFLAGS += $(call cc-option,-fno-i
|
||||
# macro, but instead defines a whole series of macros which makes
|
||||
# testing for a specific architecture or later rather impossible.
|
||||
arch-$(CONFIG_CPU_32v7M) =-D__LINUX_ARM_ARCH__=7 -march=armv7-m
|
||||
-arch-$(CONFIG_CPU_32v7) =-D__LINUX_ARM_ARCH__=7 -march=armv7-a
|
||||
+arch-$(CONFIG_CPU_32v7) =-D__LINUX_ARM_ARCH__=7 -mcpu=cortex-a15
|
||||
arch-$(CONFIG_CPU_32v6) =-D__LINUX_ARM_ARCH__=6 -march=armv6
|
||||
# Only override the compiler option if ARMv6. The ARMv6K extensions are
|
||||
# always available in ARMv7
|
||||
@ -0,0 +1,210 @@
|
||||
From 71270226b14733a4b1f2cde58ea9265caa50b38d Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Panella <ianchi74@outlook.com>
|
||||
Date: Thu, 9 Mar 2017 09:37:17 +0100
|
||||
Subject: [PATCH 67/69] generic: Mangle bootloader's kernel arguments
|
||||
|
||||
The command-line arguments provided by the boot loader will be
|
||||
appended to a new device tree property: bootloader-args.
|
||||
If there is a property "append-rootblock" in DT under /chosen
|
||||
and a root= option in bootloaders command line it will be parsed
|
||||
and added to DT bootargs with the form: <append-rootblock>XX.
|
||||
Only command line ATAG will be processed, the rest of the ATAGs
|
||||
sent by bootloader will be ignored.
|
||||
This is usefull in dual boot systems, to get the current root partition
|
||||
without afecting the rest of the system.
|
||||
|
||||
Signed-off-by: Adrian Panella <ianchi74@outlook.com>
|
||||
---
|
||||
arch/arm/Kconfig | 11 +++++
|
||||
arch/arm/boot/compressed/atags_to_fdt.c | 72 ++++++++++++++++++++++++++++++++-
|
||||
init/main.c | 16 ++++++++
|
||||
3 files changed, 98 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -1780,6 +1780,17 @@ config ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEN
|
||||
The command-line arguments provided by the boot loader will be
|
||||
appended to the the device tree bootargs property.
|
||||
|
||||
+config ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
+ bool "Append rootblock parsing bootloader's kernel arguments"
|
||||
+ help
|
||||
+ The command-line arguments provided by the boot loader will be
|
||||
+ appended to a new device tree property: bootloader-args.
|
||||
+ If there is a property "append-rootblock" in DT under /chosen
|
||||
+ and a root= option in bootloaders command line it will be parsed
|
||||
+ and added to DT bootargs with the form: <append-rootblock>XX.
|
||||
+ Only command line ATAG will be processed, the rest of the ATAGs
|
||||
+ sent by bootloader will be ignored.
|
||||
+
|
||||
endchoice
|
||||
|
||||
config CMDLINE
|
||||
--- a/arch/arm/boot/compressed/atags_to_fdt.c
|
||||
+++ b/arch/arm/boot/compressed/atags_to_fdt.c
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND)
|
||||
#define do_extend_cmdline 1
|
||||
+#elif defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+#define do_extend_cmdline 1
|
||||
#else
|
||||
#define do_extend_cmdline 0
|
||||
#endif
|
||||
@@ -69,6 +71,80 @@ static uint32_t get_cell_size(const void
|
||||
return cell_size;
|
||||
}
|
||||
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+/**
|
||||
+ * taken from arch/x86/boot/string.c
|
||||
+ * local_strstr - Find the first substring in a %NUL terminated string
|
||||
+ * @s1: The string to be searched
|
||||
+ * @s2: The string to search for
|
||||
+ */
|
||||
+static char *local_strstr(const char *s1, const char *s2)
|
||||
+{
|
||||
+ size_t l1, l2;
|
||||
+
|
||||
+ l2 = strlen(s2);
|
||||
+ if (!l2)
|
||||
+ return (char *)s1;
|
||||
+ l1 = strlen(s1);
|
||||
+ while (l1 >= l2) {
|
||||
+ l1--;
|
||||
+ if (!memcmp(s1, s2, l2))
|
||||
+ return (char *)s1;
|
||||
+ s1++;
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static char *append_rootblock(char *dest, const char *str, int len, void *fdt)
|
||||
+{
|
||||
+ char *ptr, *end, *tmp;
|
||||
+ char *root="root=";
|
||||
+ char *find_rootblock;
|
||||
+ int i, l;
|
||||
+ const char *rootblock;
|
||||
+
|
||||
+ find_rootblock = getprop(fdt, "/chosen", "find-rootblock", &l);
|
||||
+ if(!find_rootblock)
|
||||
+ find_rootblock = root;
|
||||
+
|
||||
+ //ARM doesn't have __HAVE_ARCH_STRSTR, so it was copied from x86
|
||||
+ ptr = local_strstr(str, find_rootblock);
|
||||
+
|
||||
+ if(!ptr)
|
||||
+ return dest;
|
||||
+
|
||||
+ end = strchr(ptr, ' ');
|
||||
+ end = end ? (end - 1) : (strchr(ptr, 0) - 1);
|
||||
+
|
||||
+ // Some boards ubi.mtd=XX,ZZZZ, so let's check for '," too.
|
||||
+ tmp = strchr(ptr, ',');
|
||||
+
|
||||
+ if(tmp)
|
||||
+ end = end < tmp ? end : tmp - 1;
|
||||
+
|
||||
+ //find partition number (assumes format root=/dev/mtdXX | /dev/mtdblockXX | yy:XX | ubi.mtd=XX,ZZZZ )
|
||||
+ for( i = 0; end >= ptr && *end >= '0' && *end <= '9'; end--, i++);
|
||||
+ ptr = end + 1;
|
||||
+
|
||||
+ /* if append-rootblock property is set use it to append to command line */
|
||||
+ rootblock = getprop(fdt, "/chosen", "append-rootblock", &l);
|
||||
+ if(rootblock != NULL) {
|
||||
+ if(*dest != ' ') {
|
||||
+ *dest = ' ';
|
||||
+ dest++;
|
||||
+ len++;
|
||||
+ }
|
||||
+ if (len + l + i <= COMMAND_LINE_SIZE) {
|
||||
+ memcpy(dest, rootblock, l);
|
||||
+ dest += l - 1;
|
||||
+ memcpy(dest, ptr, i);
|
||||
+ dest += i;
|
||||
+ }
|
||||
+ }
|
||||
+ return dest;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static void merge_fdt_bootargs(void *fdt, const char *fdt_cmdline)
|
||||
{
|
||||
char cmdline[COMMAND_LINE_SIZE];
|
||||
@@ -88,12 +164,21 @@ static void merge_fdt_bootargs(void *fdt
|
||||
|
||||
/* and append the ATAG_CMDLINE */
|
||||
if (fdt_cmdline) {
|
||||
+
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+ //save original bootloader args
|
||||
+ //and append ubi.mtd with root partition number to current cmdline
|
||||
+ setprop_string(fdt, "/chosen", "bootloader-args", fdt_cmdline);
|
||||
+ ptr = append_rootblock(ptr, fdt_cmdline, len, fdt);
|
||||
+
|
||||
+#else
|
||||
len = strlen(fdt_cmdline);
|
||||
if (ptr - cmdline + len + 2 < COMMAND_LINE_SIZE) {
|
||||
*ptr++ = ' ';
|
||||
memcpy(ptr, fdt_cmdline, len);
|
||||
ptr += len;
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
*ptr = '\0';
|
||||
|
||||
@@ -168,7 +253,9 @@ int atags_to_fdt(void *atag_list, void *
|
||||
else
|
||||
setprop_string(fdt, "/chosen", "bootargs",
|
||||
atag->u.cmdline.cmdline);
|
||||
- } else if (atag->hdr.tag == ATAG_MEM) {
|
||||
+ }
|
||||
+#ifndef CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE
|
||||
+ else if (atag->hdr.tag == ATAG_MEM) {
|
||||
if (memcount >= sizeof(mem_reg_property)/4)
|
||||
continue;
|
||||
if (!atag->u.mem.size)
|
||||
@@ -212,6 +299,10 @@ int atags_to_fdt(void *atag_list, void *
|
||||
setprop(fdt, "/memory", "reg", mem_reg_property,
|
||||
4 * memcount * memsize);
|
||||
}
|
||||
+#else
|
||||
+
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
return fdt_pack(fdt);
|
||||
}
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -110,6 +110,10 @@
|
||||
|
||||
#include <kunit/test.h>
|
||||
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+#include <linux/of.h>
|
||||
+#endif
|
||||
+
|
||||
static int kernel_init(void *);
|
||||
|
||||
extern void init_IRQ(void);
|
||||
@@ -906,6 +910,18 @@ asmlinkage __visible void __init __no_sa
|
||||
pr_notice("Kernel command line: %s\n", saved_command_line);
|
||||
/* parameters may set static keys */
|
||||
jump_label_init();
|
||||
+
|
||||
+#if defined(CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_MANGLE)
|
||||
+ //Show bootloader's original command line for reference
|
||||
+ if(of_chosen) {
|
||||
+ const char *prop = of_get_property(of_chosen, "bootloader-args", NULL);
|
||||
+ if(prop)
|
||||
+ pr_notice("Bootloader command line (ignored): %s\n", prop);
|
||||
+ else
|
||||
+ pr_notice("Bootloader command line not present\n");
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
parse_early_param();
|
||||
after_dashes = parse_args("Booting kernel",
|
||||
static_command_line, __start___param,
|
||||
@ -0,0 +1,42 @@
|
||||
From 8f68331e14dff9a101f2d0e1d6bec84a031f27ee Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Thu, 9 Mar 2017 11:03:18 +0100
|
||||
Subject: [PATCH 69/69] arm: boot: add dts files
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -955,8 +955,29 @@ dtb-$(CONFIG_ARCH_QCOM) += \
|
||||
qcom-ipq4019-ap.dk04.1-c3.dtb \
|
||||
qcom-ipq4019-ap.dk07.1-c1.dtb \
|
||||
qcom-ipq4019-ap.dk07.1-c2.dtb \
|
||||
+ qcom-ipq8062-wg2600hp3.dtb \
|
||||
qcom-ipq8064-ap148.dtb \
|
||||
qcom-ipq8064-rb3011.dtb \
|
||||
+ qcom-ipq8064-c2600.dtb \
|
||||
+ qcom-ipq8064-d7800.dtb \
|
||||
+ qcom-ipq8064-db149.dtb \
|
||||
+ qcom-ipq8064-ap161.dtb \
|
||||
+ qcom-ipq8064-ea7500-v1.dtb \
|
||||
+ qcom-ipq8064-ea8500.dtb \
|
||||
+ qcom-ipq8064-g10.dtb \
|
||||
+ qcom-ipq8064-r7500.dtb \
|
||||
+ qcom-ipq8064-r7500v2.dtb \
|
||||
+ qcom-ipq8064-unifi-ac-hd.dtb \
|
||||
+ qcom-ipq8064-wg2600hp.dtb \
|
||||
+ qcom-ipq8064-wpq864.dtb \
|
||||
+ qcom-ipq8064-wxr-2533dhp.dtb \
|
||||
+ qcom-ipq8065-nbg6817.dtb \
|
||||
+ qcom-ipq8065-r7800.dtb \
|
||||
+ qcom-ipq8065-xr500.dtb \
|
||||
+ qcom-ipq8065-rt4230w-rev6.dtb \
|
||||
+ qcom-ipq8068-ecw5410.dtb \
|
||||
+ qcom-ipq8068-mr42.dtb \
|
||||
+ qcom-ipq8068-mr52.dtb \
|
||||
qcom-msm8226-samsung-s3ve3g.dtb \
|
||||
qcom-msm8660-surf.dtb \
|
||||
qcom-msm8960-cdp.dtb \
|
||||
@ -0,0 +1,10 @@
|
||||
--- a/drivers/firmware/qcom_scm.c
|
||||
+++ b/drivers/firmware/qcom_scm.c
|
||||
@@ -1339,6 +1339,7 @@ static const struct of_device_id qcom_sc
|
||||
SCM_HAS_BUS_CLK)
|
||||
},
|
||||
{ .compatible = "qcom,scm-ipq4019" },
|
||||
+ { .compatible = "qcom,scm-ipq806x" },
|
||||
{ .compatible = "qcom,scm-mdm9607", .data = (void *)(SCM_HAS_CORE_CLK |
|
||||
SCM_HAS_IFACE_CLK |
|
||||
SCM_HAS_BUS_CLK) },
|
||||
240
target/linux/ipq806x/patches-5.15/082-ipq8064-dtsi-tweaks.patch
Normal file
240
target/linux/ipq806x/patches-5.15/082-ipq8064-dtsi-tweaks.patch
Normal file
@ -0,0 +1,240 @@
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
@@ -352,6 +352,7 @@
|
||||
gpio-ranges = <&qcom_pinmux 0 0 69>;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
+ #address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
@@ -379,6 +380,7 @@
|
||||
function = "pcie3_rst";
|
||||
drive-strength = <12>;
|
||||
bias-disable;
|
||||
+ output-low;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -411,12 +413,9 @@
|
||||
};
|
||||
|
||||
nand_pins: nand_pins {
|
||||
- mux {
|
||||
+ disable {
|
||||
pins = "gpio34", "gpio35", "gpio36",
|
||||
- "gpio37", "gpio38", "gpio39",
|
||||
- "gpio40", "gpio41", "gpio42",
|
||||
- "gpio43", "gpio44", "gpio45",
|
||||
- "gpio46", "gpio47";
|
||||
+ "gpio37", "gpio38";
|
||||
function = "nand";
|
||||
drive-strength = <10>;
|
||||
bias-disable;
|
||||
@@ -424,6 +423,8 @@
|
||||
|
||||
pullups {
|
||||
pins = "gpio39";
|
||||
+ function = "nand";
|
||||
+ drive-strength = <10>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
@@ -431,6 +432,8 @@
|
||||
pins = "gpio40", "gpio41", "gpio42",
|
||||
"gpio43", "gpio44", "gpio45",
|
||||
"gpio46", "gpio47";
|
||||
+ function = "nand";
|
||||
+ drive-strength = <10>;
|
||||
bias-bus-hold;
|
||||
};
|
||||
};
|
||||
@@ -439,6 +442,7 @@
|
||||
intc: interrupt-controller@2000000 {
|
||||
compatible = "qcom,msm-qgic2";
|
||||
interrupt-controller;
|
||||
+ #address-cells = <0>;
|
||||
#interrupt-cells = <3>;
|
||||
reg = <0x02000000 0x1000>,
|
||||
<0x02002000 0x1000>;
|
||||
@@ -468,11 +472,13 @@
|
||||
acc0: clock-controller@2088000 {
|
||||
compatible = "qcom,kpss-acc-v1";
|
||||
reg = <0x02088000 0x1000>, <0x02008000 0x1000>;
|
||||
+ clock-output-names = "acpu0_aux";
|
||||
};
|
||||
|
||||
acc1: clock-controller@2098000 {
|
||||
compatible = "qcom,kpss-acc-v1";
|
||||
reg = <0x02098000 0x1000>, <0x02008000 0x1000>;
|
||||
+ clock-output-names = "acpu1_aux";
|
||||
};
|
||||
|
||||
adm_dma: dma-controller@18300000 {
|
||||
@@ -496,13 +502,13 @@
|
||||
};
|
||||
|
||||
saw0: regulator@2089000 {
|
||||
- compatible = "qcom,saw2";
|
||||
+ compatible = "qcom,saw2", "qcom,apq8064-saw2-v1.1-cpu", "syscon";
|
||||
reg = <0x02089000 0x1000>, <0x02009000 0x1000>;
|
||||
regulator;
|
||||
};
|
||||
|
||||
saw1: regulator@2099000 {
|
||||
- compatible = "qcom,saw2";
|
||||
+ compatible = "qcom,saw2", "qcom,apq8064-saw2-v1.1-cpu", "syscon";
|
||||
reg = <0x02099000 0x1000>, <0x02009000 0x1000>;
|
||||
regulator;
|
||||
};
|
||||
@@ -533,7 +533,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
- i2c@124a0000 {
|
||||
+ gsbi2_i2c: i2c@124a0000 {
|
||||
compatible = "qcom,i2c-qup-v1.1.1";
|
||||
reg = <0x124a0000 0x1000>;
|
||||
interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@@ -676,9 +682,6 @@
|
||||
compatible = "qcom,ipq806x-nand";
|
||||
reg = <0x1ac00000 0x800>;
|
||||
|
||||
- pinctrl-0 = <&nand_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-
|
||||
clocks = <&gcc EBI2_CLK>,
|
||||
<&gcc EBI2_AON_CLK>;
|
||||
clock-names = "core", "aon";
|
||||
@@ -733,10 +736,13 @@
|
||||
tsens_calib_backup: calib_backup@410 {
|
||||
reg = <0x410 0xb>;
|
||||
};
|
||||
+ speedbin_efuse: speedbin@0c0 {
|
||||
+ reg = <0x0c0 0x4>;
|
||||
+ };
|
||||
};
|
||||
|
||||
gcc: clock-controller@900000 {
|
||||
- compatible = "qcom,gcc-ipq8064";
|
||||
+ compatible = "qcom,gcc-ipq8064", "syscon";
|
||||
reg = <0x00900000 0x4000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
@@ -768,10 +774,45 @@
|
||||
clocks = <&gcc RPM_MSG_RAM_H_CLK>;
|
||||
clock-names = "ram";
|
||||
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
rpmcc: clock-controller {
|
||||
compatible = "qcom,rpmcc-ipq806x", "qcom,rpmcc";
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
+
|
||||
+ regulators {
|
||||
+ compatible = "qcom,rpm-smb208-regulators";
|
||||
+
|
||||
+ smb208_s1a: s1a {
|
||||
+ regulator-min-microvolt = <1050000>;
|
||||
+ regulator-max-microvolt = <1150000>;
|
||||
+
|
||||
+ qcom,switch-mode-frequency = <1200000>;
|
||||
+ };
|
||||
+
|
||||
+ smb208_s1b: s1b {
|
||||
+ regulator-min-microvolt = <1050000>;
|
||||
+ regulator-max-microvolt = <1150000>;
|
||||
+
|
||||
+ qcom,switch-mode-frequency = <1200000>;
|
||||
+ };
|
||||
+
|
||||
+ smb208_s2a: s2a {
|
||||
+ regulator-min-microvolt = < 800000>;
|
||||
+ regulator-max-microvolt = <1250000>;
|
||||
+
|
||||
+ qcom,switch-mode-frequency = <1200000>;
|
||||
+ };
|
||||
+
|
||||
+ smb208_s2b: s2b {
|
||||
+ regulator-min-microvolt = < 800000>;
|
||||
+ regulator-max-microvolt = <1250000>;
|
||||
+
|
||||
+ qcom,switch-mode-frequency = <1200000>;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
tcsr: syscon@1a400000 {
|
||||
@@ -965,7 +1006,7 @@
|
||||
|
||||
gmac0: ethernet@37000000 {
|
||||
device_type = "network";
|
||||
- compatible = "qcom,ipq806x-gmac";
|
||||
+ compatible = "qcom,ipq806x-gmac", "snps,dwmac";
|
||||
reg = <0x37000000 0x200000>;
|
||||
interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq";
|
||||
@@ -989,7 +1030,7 @@
|
||||
|
||||
gmac1: ethernet@37200000 {
|
||||
device_type = "network";
|
||||
- compatible = "qcom,ipq806x-gmac";
|
||||
+ compatible = "qcom,ipq806x-gmac", "snps,dwmac";
|
||||
reg = <0x37200000 0x200000>;
|
||||
interrupts = <GIC_SPI 223 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq";
|
||||
@@ -1013,7 +1054,7 @@
|
||||
|
||||
gmac2: ethernet@37400000 {
|
||||
device_type = "network";
|
||||
- compatible = "qcom,ipq806x-gmac";
|
||||
+ compatible = "qcom,ipq806x-gmac", "snps,dwmac";
|
||||
reg = <0x37400000 0x200000>;
|
||||
interrupts = <GIC_SPI 226 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq";
|
||||
@@ -1037,7 +1078,7 @@
|
||||
|
||||
gmac3: ethernet@37600000 {
|
||||
device_type = "network";
|
||||
- compatible = "qcom,ipq806x-gmac";
|
||||
+ compatible = "qcom,ipq806x-gmac", "snps,dwmac";
|
||||
reg = <0x37600000 0x200000>;
|
||||
interrupts = <GIC_SPI 229 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq";
|
||||
@@ -1050,8 +1050,6 @@
|
||||
clocks = <&gcc USB30_0_UTMI_CLK>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <0>;
|
||||
-
|
||||
- status = "disabled";
|
||||
};
|
||||
|
||||
ss_phy_0: usb3phy@100f8830 {
|
||||
@@ -1055,8 +1055,6 @@
|
||||
clocks = <&gcc USB30_0_MASTER_CLK>;
|
||||
clock-names = "ref";
|
||||
#phy-cells = <0>;
|
||||
-
|
||||
- status = "disabled";
|
||||
};
|
||||
|
||||
usb3_0: usb3@100f8800 {
|
||||
@@ -1176,7 +1217,7 @@
|
||||
};
|
||||
|
||||
amba: amba {
|
||||
- compatible = "simple-bus";
|
||||
+ compatible = "arm,amba-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
@@ -1195,7 +1236,6 @@
|
||||
non-removable;
|
||||
cap-sd-highspeed;
|
||||
cap-mmc-highspeed;
|
||||
- mmc-ddr-1_8v;
|
||||
vmmc-supply = <&vsdcc_fixed>;
|
||||
dmas = <&sdcc1bam 2>, <&sdcc1bam 1>;
|
||||
dma-names = "tx", "rx";
|
||||
@ -0,0 +1,371 @@
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <dt-bindings/reset/qcom,gcc-ipq806x.h>
|
||||
#include <dt-bindings/soc/qcom,gsbi.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
+#include <dt-bindings/mfd/qcom-rpm.h>
|
||||
+#include <dt-bindings/clock/qcom,rpmcc.h>
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
@@ -30,6 +32,16 @@
|
||||
next-level-cache = <&L2>;
|
||||
qcom,acc = <&acc0>;
|
||||
qcom,saw = <&saw0>;
|
||||
+ clocks = <&kraitcc 0>, <&kraitcc 4>;
|
||||
+ clock-names = "cpu", "l2";
|
||||
+ clock-latency = <100000>;
|
||||
+ cpu-supply = <&smb208_s2a>;
|
||||
+ operating-points-v2 = <&opp_table0>;
|
||||
+ voltage-tolerance = <5>;
|
||||
+ cooling-min-state = <0>;
|
||||
+ cooling-max-state = <10>;
|
||||
+ #cooling-cells = <2>;
|
||||
+ cpu-idle-states = <&CPU_SPC>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
@@ -40,11 +52,125 @@
|
||||
next-level-cache = <&L2>;
|
||||
qcom,acc = <&acc1>;
|
||||
qcom,saw = <&saw1>;
|
||||
+ clocks = <&kraitcc 1>, <&kraitcc 4>;
|
||||
+ clock-names = "cpu", "l2";
|
||||
+ clock-latency = <100000>;
|
||||
+ cpu-supply = <&smb208_s2b>;
|
||||
+ operating-points-v2 = <&opp_table0>;
|
||||
+ voltage-tolerance = <5>;
|
||||
+ cooling-min-state = <0>;
|
||||
+ cooling-max-state = <10>;
|
||||
+ #cooling-cells = <2>;
|
||||
+ cpu-idle-states = <&CPU_SPC>;
|
||||
+ };
|
||||
+
|
||||
+ idle-states {
|
||||
+ CPU_SPC: spc {
|
||||
+ compatible = "qcom,idle-state-spc";
|
||||
+ status = "disabled";
|
||||
+ entry-latency-us = <400>;
|
||||
+ exit-latency-us = <900>;
|
||||
+ min-residency-us = <3000>;
|
||||
+ };
|
||||
};
|
||||
+ };
|
||||
|
||||
- L2: l2-cache {
|
||||
- compatible = "cache";
|
||||
- cache-level = <2>;
|
||||
+ opp_table_l2: opp_table_l2 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+
|
||||
+ opp-384000000 {
|
||||
+ opp-hz = /bits/ 64 <384000000>;
|
||||
+ opp-microvolt = <1100000>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <0>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <1100000>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <1150000>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ opp_table0: opp_table0 {
|
||||
+ compatible = "operating-points-v2-kryo-cpu";
|
||||
+ nvmem-cells = <&speedbin_efuse>;
|
||||
+
|
||||
+ /*
|
||||
+ * Voltage thresholds are <target min max>
|
||||
+ */
|
||||
+ opp-384000000 {
|
||||
+ opp-hz = /bits/ 64 <384000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1000000 950000 1050000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <925000 878750 971250>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <875000 831250 918750>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <800000 760000 840000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <0>;
|
||||
+ };
|
||||
+
|
||||
+ opp-600000000 {
|
||||
+ opp-hz = /bits/ 64 <600000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1050000 997500 1102500>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <975000 926250 1023750>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <925000 878750 971250>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <850000 807500 892500>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-800000000 {
|
||||
+ opp-hz = /bits/ 64 <800000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1100000 1045000 1155000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1025000 973750 1076250>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <995000 945250 1044750>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <900000 855000 945000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1150000 1092500 1207500>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1075000 1021250 1128750>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <1025000 973750 1076250>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <950000 902500 997500>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1200000 1140000 1260000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1125000 1068750 1181250>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <1075000 1021250 1128750>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <1000000 950000 1050000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <2>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1400000000 {
|
||||
+ opp-hz = /bits/ 64 <1400000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1250000 1187500 1312500>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1175000 1116250 1233750>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <1125000 1068750 1181250>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <1050000 997500 1102500>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <2>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -317,6 +443,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ fab-scaling {
|
||||
+ compatible = "qcom,fab-scaling";
|
||||
+ clocks = <&rpmcc RPM_APPS_FABRIC_A_CLK>, <&rpmcc RPM_EBI1_A_CLK>;
|
||||
+ clock-names = "apps-fab-clk", "ddr-fab-clk";
|
||||
+ fab_freq_high = <533000000>;
|
||||
+ fab_freq_nominal = <400000000>;
|
||||
+ cpu_freq_threshold = <1000000000>;
|
||||
+ };
|
||||
+
|
||||
firmware {
|
||||
scm {
|
||||
compatible = "qcom,scm-ipq806x", "qcom,scm";
|
||||
@@ -384,6 +519,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ i2c4_pins: i2c4_pinmux {
|
||||
+ mux {
|
||||
+ pins = "gpio12", "gpio13";
|
||||
+ function = "gsbi4";
|
||||
+ drive-strength = <12>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
spi_pins: spi_pins {
|
||||
mux {
|
||||
pins = "gpio18", "gpio19", "gpio21";
|
||||
@@ -437,6 +581,27 @@
|
||||
bias-bus-hold;
|
||||
};
|
||||
};
|
||||
+
|
||||
+ mdio0_pins: mdio0_pins {
|
||||
+ mux {
|
||||
+ pins = "gpio0", "gpio1";
|
||||
+ function = "mdio";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ rgmii2_pins: rgmii2_pins {
|
||||
+ mux {
|
||||
+ pins = "gpio27", "gpio28", "gpio29",
|
||||
+ "gpio30", "gpio31", "gpio32",
|
||||
+ "gpio51", "gpio52", "gpio59",
|
||||
+ "gpio60", "gpio61", "gpio62";
|
||||
+ function = "rgmii2";
|
||||
+ drive-strength = <8>;
|
||||
+ bias-disable;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
intc: interrupt-controller@2000000 {
|
||||
@@ -513,6 +678,17 @@
|
||||
regulator;
|
||||
};
|
||||
|
||||
+ saw_l2: regulator@02012000 {
|
||||
+ compatible = "qcom,saw2", "syscon";
|
||||
+ reg = <0x02012000 0x1000>;
|
||||
+ regulator;
|
||||
+ };
|
||||
+
|
||||
+ sic_non_secure: sic-non-secure@12100000 {
|
||||
+ compatible = "syscon";
|
||||
+ reg = <0x12100000 0x10000>;
|
||||
+ };
|
||||
+
|
||||
gsbi2: gsbi@12480000 {
|
||||
compatible = "qcom,gsbi-v1.0.0";
|
||||
cell-index = <2>;
|
||||
@@ -568,6 +910,33 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ gsbi6: gsbi@16500000 {
|
||||
+ status = "disabled";
|
||||
+ compatible = "qcom,gsbi-v1.0.0";
|
||||
+ cell-index = <6>;
|
||||
+ reg = <0x16500000 0x100>;
|
||||
+ clocks = <&gcc GSBI6_H_CLK>;
|
||||
+ clock-names = "iface";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges;
|
||||
+
|
||||
+ syscon-tcsr = <&tcsr>;
|
||||
+
|
||||
+ gsbi6_i2c: i2c@16580000 {
|
||||
+ compatible = "qcom,i2c-qup-v1.1.1";
|
||||
+ reg = <0x16580000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ clocks = <&gcc GSBI6_QUP_CLK>, <&gcc GSBI6_H_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
gsbi7: gsbi@16600000 {
|
||||
status = "disabled";
|
||||
compatible = "qcom,gsbi-v1.0.0";
|
||||
@@ -589,6 +958,19 @@
|
||||
clock-names = "core", "iface";
|
||||
status = "disabled";
|
||||
};
|
||||
+
|
||||
+ gsbi7_i2c: i2c@16680000 {
|
||||
+ compatible = "qcom,i2c-qup-v1.1.1";
|
||||
+ reg = <0x16680000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+
|
||||
+ clocks = <&gcc GSBI7_QUP_CLK>, <&gcc GSBI7_H_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
sata_phy: sata-phy@1b400000 {
|
||||
@@ -761,6 +937,17 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ L2: l2-cache {
|
||||
+ compatible = "qcom,krait-cache", "cache";
|
||||
+ cache-level = <2>;
|
||||
+ qcom,saw = <&saw_l2>;
|
||||
+
|
||||
+ clocks = <&kraitcc 4>;
|
||||
+ clock-names = "l2";
|
||||
+ l2-supply = <&smb208_s1a>;
|
||||
+ operating-points-v2 = <&opp_table_l2>;
|
||||
+ };
|
||||
+
|
||||
rpm: rpm@108000 {
|
||||
compatible = "qcom,rpm-ipq8064";
|
||||
reg = <0x108000 0x1000>;
|
||||
@@ -828,6 +1015,11 @@
|
||||
clock-output-names = "acpu_l2_aux";
|
||||
};
|
||||
|
||||
+ kraitcc: clock-controller {
|
||||
+ compatible = "qcom,krait-cc-v1";
|
||||
+ #clock-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
lcc: clock-controller@28000000 {
|
||||
compatible = "qcom,lcc-ipq8064";
|
||||
reg = <0x28000000 0x1000>;
|
||||
@@ -835,6 +1027,11 @@
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
+ sfpb_mutex_block: syscon@1200600 {
|
||||
+ compatible = "syscon";
|
||||
+ reg = <0x01200600 0x100>;
|
||||
+ };
|
||||
+
|
||||
pcie0: pci@1b500000 {
|
||||
compatible = "qcom,pcie-ipq8064";
|
||||
reg = <0x1b500000 0x1000
|
||||
@@ -1188,6 +1385,21 @@
|
||||
};
|
||||
};
|
||||
|
||||
+
|
||||
+ mdio0: mdio@37000000 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ compatible = "qcom,ipq8064-mdio", "syscon";
|
||||
+ reg = <0x37000000 0x200000>;
|
||||
+ resets = <&gcc GMAC_CORE1_RESET>;
|
||||
+ reset-names = "stmmaceth";
|
||||
+ clocks = <&gcc GMAC_CORE1_CLK>;
|
||||
+ clock-names = "stmmaceth";
|
||||
+
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
vsdcc_fixed: vsdcc-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "SDCC Power";
|
||||
@@ -1262,4 +1474,17 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+ sfpb_mutex: sfpb-mutex {
|
||||
+ compatible = "qcom,sfpb-mutex";
|
||||
+ syscon = <&sfpb_mutex_block 4 4>;
|
||||
+
|
||||
+ #hwlock-cells = <1>;
|
||||
+ };
|
||||
+
|
||||
+ smem {
|
||||
+ compatible = "qcom,smem";
|
||||
+ memory-region = <&smem>;
|
||||
+ hwlocks = <&sfpb_mutex 3>;
|
||||
+ };
|
||||
};
|
||||
@ -0,0 +1,89 @@
|
||||
This uses upstream qcom-ipq8064-v1.0.dtsi and modifies it by patches
|
||||
instead of keeping a local version.
|
||||
We drop partitions, LEDs and keys from the file as we will implement
|
||||
them differently anyway.
|
||||
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064-v1.0.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064-v1.0.dtsi
|
||||
@@ -42,16 +42,6 @@
|
||||
#size-cells = <1>;
|
||||
spi-max-frequency = <50000000>;
|
||||
reg = <0>;
|
||||
-
|
||||
- partition@0 {
|
||||
- label = "rootfs";
|
||||
- reg = <0x0 0x1000000>;
|
||||
- };
|
||||
-
|
||||
- partition@1 {
|
||||
- label = "scratch";
|
||||
- reg = <0x1000000 0x1000000>;
|
||||
- };
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -64,64 +54,5 @@
|
||||
ports-implemented = <0x1>;
|
||||
status = "okay";
|
||||
};
|
||||
-
|
||||
- gpio_keys {
|
||||
- compatible = "gpio-keys";
|
||||
- pinctrl-0 = <&buttons_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-
|
||||
- button@1 {
|
||||
- label = "reset";
|
||||
- linux,code = <KEY_RESTART>;
|
||||
- gpios = <&qcom_pinmux 54 GPIO_ACTIVE_LOW>;
|
||||
- linux,input-type = <1>;
|
||||
- debounce-interval = <60>;
|
||||
- };
|
||||
- button@2 {
|
||||
- label = "wps";
|
||||
- linux,code = <KEY_WPS_BUTTON>;
|
||||
- gpios = <&qcom_pinmux 65 GPIO_ACTIVE_LOW>;
|
||||
- linux,input-type = <1>;
|
||||
- debounce-interval = <60>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- leds {
|
||||
- compatible = "gpio-leds";
|
||||
- pinctrl-0 = <&leds_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-
|
||||
- led@7 {
|
||||
- label = "led_usb1";
|
||||
- gpios = <&qcom_pinmux 7 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "usbdev";
|
||||
- default-state = "off";
|
||||
- };
|
||||
-
|
||||
- led@8 {
|
||||
- label = "led_usb3";
|
||||
- gpios = <&qcom_pinmux 8 GPIO_ACTIVE_HIGH>;
|
||||
- linux,default-trigger = "usbdev";
|
||||
- default-state = "off";
|
||||
- };
|
||||
-
|
||||
- led@9 {
|
||||
- label = "status_led_fail";
|
||||
- gpios = <&qcom_pinmux 9 GPIO_ACTIVE_HIGH>;
|
||||
- default-state = "off";
|
||||
- };
|
||||
-
|
||||
- led@26 {
|
||||
- label = "sata_led";
|
||||
- gpios = <&qcom_pinmux 26 GPIO_ACTIVE_HIGH>;
|
||||
- default-state = "off";
|
||||
- };
|
||||
-
|
||||
- led@53 {
|
||||
- label = "status_led_pass";
|
||||
- gpios = <&qcom_pinmux 53 GPIO_ACTIVE_HIGH>;
|
||||
- default-state = "off";
|
||||
- };
|
||||
- };
|
||||
};
|
||||
};
|
||||
@ -0,0 +1,14 @@
|
||||
This uses upstream qcom-ipq8064-v1.0.dtsi and modifies it by patches
|
||||
instead of keeping a local version. This patch adds our local adjustments
|
||||
for the (local) additional contents of qcom-ipq8064.dtsi
|
||||
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064-v1.0.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064-v1.0.dtsi
|
||||
@@ -56,3 +56,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+&CPU_SPC {
|
||||
+ status = "okay";
|
||||
+};
|
||||
@ -0,0 +1,145 @@
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064-rb3011.dts
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064-rb3011.dts
|
||||
@@ -24,73 +24,6 @@
|
||||
device_type = "memory";
|
||||
};
|
||||
|
||||
- mdio0: mdio-0 {
|
||||
- status = "okay";
|
||||
- compatible = "virtual,mdio-gpio";
|
||||
- gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH>,
|
||||
- <&qcom_pinmux 0 GPIO_ACTIVE_HIGH>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- pinctrl-0 = <&mdio0_pins>;
|
||||
- pinctrl-names = "default";
|
||||
-
|
||||
- switch0: switch@10 {
|
||||
- compatible = "qca,qca8337";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- dsa,member = <0 0>;
|
||||
-
|
||||
- pinctrl-0 = <&sw0_reset_pin>;
|
||||
- pinctrl-names = "default";
|
||||
-
|
||||
- reset-gpios = <&qcom_pinmux 16 GPIO_ACTIVE_LOW>;
|
||||
- reg = <0x10>;
|
||||
-
|
||||
- ports {
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- switch0cpu: port@0 {
|
||||
- reg = <0>;
|
||||
- label = "cpu";
|
||||
- ethernet = <&gmac0>;
|
||||
- phy-mode = "rgmii-id";
|
||||
- fixed-link {
|
||||
- speed = <1000>;
|
||||
- full-duplex;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
- port@1 {
|
||||
- reg = <1>;
|
||||
- label = "sw1";
|
||||
- };
|
||||
-
|
||||
- port@2 {
|
||||
- reg = <2>;
|
||||
- label = "sw2";
|
||||
- };
|
||||
-
|
||||
- port@3 {
|
||||
- reg = <3>;
|
||||
- label = "sw3";
|
||||
- };
|
||||
-
|
||||
- port@4 {
|
||||
- reg = <4>;
|
||||
- label = "sw4";
|
||||
- };
|
||||
-
|
||||
- port@5 {
|
||||
- reg = <5>;
|
||||
- label = "sw5";
|
||||
- };
|
||||
- };
|
||||
- };
|
||||
- };
|
||||
-
|
||||
mdio1: mdio-1 {
|
||||
status = "okay";
|
||||
compatible = "virtual,mdio-gpio";
|
||||
@@ -220,6 +153,68 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&mdio0 {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pinctrl-0 = <&mdio0_pins>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ switch0: switch@10 {
|
||||
+ compatible = "qca,qca8337";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ dsa,member = <0 0>;
|
||||
+
|
||||
+ pinctrl-0 = <&sw0_reset_pin>;
|
||||
+ pinctrl-names = "default";
|
||||
+
|
||||
+ reset-gpios = <&qcom_pinmux 16 GPIO_ACTIVE_LOW>;
|
||||
+ reg = <0x10>;
|
||||
+
|
||||
+ ports {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ switch0cpu: port@0 {
|
||||
+ reg = <0>;
|
||||
+ label = "cpu";
|
||||
+ ethernet = <&gmac0>;
|
||||
+ phy-mode = "rgmii-id";
|
||||
+ fixed-link {
|
||||
+ speed = <1000>;
|
||||
+ full-duplex;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ port@1 {
|
||||
+ reg = <1>;
|
||||
+ label = "sw1";
|
||||
+ };
|
||||
+
|
||||
+ port@2 {
|
||||
+ reg = <2>;
|
||||
+ label = "sw2";
|
||||
+ };
|
||||
+
|
||||
+ port@3 {
|
||||
+ reg = <3>;
|
||||
+ label = "sw3";
|
||||
+ };
|
||||
+
|
||||
+ port@4 {
|
||||
+ reg = <4>;
|
||||
+ label = "sw4";
|
||||
+ };
|
||||
+
|
||||
+ port@5 {
|
||||
+ reg = <5>;
|
||||
+ label = "sw5";
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&gmac0 {
|
||||
status = "okay";
|
||||
|
||||
@ -0,0 +1,51 @@
|
||||
From a206d4061f1cc2c5cd17ee45c53a0ba711e48e6d Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sun, 7 Feb 2021 16:42:52 +0100
|
||||
Subject: [PATCH 3/3] drivers: cpufreq: qcom-cpufreq-nvmem: support specific
|
||||
cpufreq driver
|
||||
|
||||
Add support for specific cpufreq driver for qcom-cpufreq-nvmem driver.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/cpufreq/qcom-cpufreq-nvmem.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -52,6 +52,7 @@ struct qcom_cpufreq_match_data {
|
||||
char **pvs_name,
|
||||
struct qcom_cpufreq_drv *drv);
|
||||
const char **genpd_names;
|
||||
+ const char *cpufreq_driver;
|
||||
};
|
||||
|
||||
struct qcom_cpufreq_drv {
|
||||
@@ -250,6 +251,7 @@ static const struct qcom_cpufreq_match_d
|
||||
|
||||
static const struct qcom_cpufreq_match_data match_data_krait = {
|
||||
.get_version = qcom_cpufreq_krait_name_version,
|
||||
+ .cpufreq_driver = "krait-cpufreq",
|
||||
};
|
||||
|
||||
static const char *qcs404_genpd_names[] = { "cpr", NULL };
|
||||
@@ -385,6 +387,19 @@ static int qcom_cpufreq_probe(struct pla
|
||||
}
|
||||
}
|
||||
|
||||
+ if (drv->data->cpufreq_driver) {
|
||||
+ cpufreq_dt_pdev = platform_device_register_simple(
|
||||
+ drv->data->cpufreq_driver, -1, NULL, 0);
|
||||
+ if (!IS_ERR(cpufreq_dt_pdev)) {
|
||||
+ platform_set_drvdata(pdev, drv);
|
||||
+ return 0;
|
||||
+ } else {
|
||||
+ dev_err(cpu_dev,
|
||||
+ "Failed to register dedicated %s cpufreq\n",
|
||||
+ drv->data->cpufreq_driver);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1,
|
||||
NULL, 0);
|
||||
if (!IS_ERR(cpufreq_dt_pdev)) {
|
||||
@ -0,0 +1,99 @@
|
||||
From 0af44917941cbfecdc86bb9bf05ff01d22a88973 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sun, 7 Feb 2021 16:52:56 +0100
|
||||
Subject: [PATCH 1/4] ipq806x: gcc: add missing clk flag
|
||||
|
||||
Some flag are missing from the original code.
|
||||
These clk can't be set using the protected-clock proprities as they
|
||||
cause the malfunction of the serial interface.
|
||||
These clks are needed for the rpm interface to work proprely or the
|
||||
cpu regulators starts to fail as soon as they are disabled by the
|
||||
kernel.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/clk/qcom/gcc-ipq806x.c | 19 +++++++++++++------
|
||||
1 file changed, 13 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/clk/qcom/gcc-ipq806x.c
|
||||
+++ b/drivers/clk/qcom/gcc-ipq806x.c
|
||||
@@ -65,6 +65,7 @@ static struct clk_pll pll3 = {
|
||||
.parent_names = (const char *[]){ "pxo" },
|
||||
.num_parents = 1,
|
||||
.ops = &clk_pll_ops,
|
||||
+ .flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -782,7 +783,7 @@ static struct clk_rcg gsbi4_qup_src = {
|
||||
.parent_names = gcc_pxo_pll8,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg_ops,
|
||||
- .flags = CLK_SET_PARENT_GATE,
|
||||
+ .flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -798,7 +799,7 @@ static struct clk_branch gsbi4_qup_clk =
|
||||
.parent_names = (const char *[]){ "gsbi4_qup_src" },
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch_ops,
|
||||
- .flags = CLK_SET_RATE_PARENT,
|
||||
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -880,7 +881,7 @@ static struct clk_rcg gsbi6_qup_src = {
|
||||
.parent_names = gcc_pxo_pll8,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg_ops,
|
||||
- .flags = CLK_SET_PARENT_GATE,
|
||||
+ .flags = CLK_SET_PARENT_GATE | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -945,7 +946,7 @@ static struct clk_branch gsbi7_qup_clk =
|
||||
.parent_names = (const char *[]){ "gsbi7_qup_src" },
|
||||
.num_parents = 1,
|
||||
.ops = &clk_branch_ops,
|
||||
- .flags = CLK_SET_RATE_PARENT,
|
||||
+ .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -991,6 +992,7 @@ static struct clk_branch gsbi4_h_clk = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "gsbi4_h_clk",
|
||||
.ops = &clk_branch_ops,
|
||||
+ .flags = CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -1424,6 +1426,7 @@ static struct clk_rcg tsif_ref_src = {
|
||||
.parent_names = gcc_pxo_pll8,
|
||||
.num_parents = 2,
|
||||
.ops = &clk_rcg_ops,
|
||||
+ .flags = CLK_SET_RATE_GATE,
|
||||
},
|
||||
}
|
||||
};
|
||||
@@ -2694,7 +2697,8 @@ static struct clk_dyn_rcg ubi32_core1_sr
|
||||
.parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_dyn_rcg_ops,
|
||||
- .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
|
||||
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE |
|
||||
+ CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -2747,7 +2751,8 @@ static struct clk_dyn_rcg ubi32_core2_sr
|
||||
.parent_names = gcc_pxo_pll8_pll14_pll18_pll0,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_dyn_rcg_ops,
|
||||
- .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
|
||||
+ .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE |
|
||||
+ CLK_IGNORE_UNUSED,
|
||||
},
|
||||
},
|
||||
};
|
||||
@ -0,0 +1,59 @@
|
||||
From 3a5f1793c0bf4a6b536751886b0a44589fe05f35 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sun, 7 Feb 2021 17:00:07 +0100
|
||||
Subject: [PATCH 2/4] ipq806x: lcc: add missing reset
|
||||
|
||||
Add missing reset for ipq806x lcc clk
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/clk/qcom/lcc-ipq806x.c | 8 ++++++++
|
||||
include/dt-bindings/clock/qcom,lcc-ipq806x.h | 1 +
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/clk/qcom/lcc-ipq806x.c
|
||||
+++ b/drivers/clk/qcom/lcc-ipq806x.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/regmap.h>
|
||||
+#include <linux/reset-controller.h>
|
||||
|
||||
#include <dt-bindings/clock/qcom,lcc-ipq806x.h>
|
||||
|
||||
@@ -22,6 +23,7 @@
|
||||
#include "clk-branch.h"
|
||||
#include "clk-regmap-divider.h"
|
||||
#include "clk-regmap-mux.h"
|
||||
+#include "reset.h"
|
||||
|
||||
static struct clk_pll pll4 = {
|
||||
.l_reg = 0x4,
|
||||
@@ -39,6 +41,10 @@ static struct clk_pll pll4 = {
|
||||
},
|
||||
};
|
||||
|
||||
+static const struct qcom_reset_map lcc_ipq806x_resets[] = {
|
||||
+ [LCC_PCM_RESET] = { 0x54, 13 },
|
||||
+};
|
||||
+
|
||||
static const struct pll_config pll4_config = {
|
||||
.l = 0xf,
|
||||
.m = 0x91,
|
||||
@@ -417,6 +423,8 @@ static const struct qcom_cc_desc lcc_ipq
|
||||
.config = &lcc_ipq806x_regmap_config,
|
||||
.clks = lcc_ipq806x_clks,
|
||||
.num_clks = ARRAY_SIZE(lcc_ipq806x_clks),
|
||||
+ .resets = lcc_ipq806x_resets,
|
||||
+ .num_resets = ARRAY_SIZE(lcc_ipq806x_resets),
|
||||
};
|
||||
|
||||
static const struct of_device_id lcc_ipq806x_match_table[] = {
|
||||
--- a/include/dt-bindings/clock/qcom,lcc-ipq806x.h
|
||||
+++ b/include/dt-bindings/clock/qcom,lcc-ipq806x.h
|
||||
@@ -19,4 +19,5 @@
|
||||
#define SPDIF_CLK 10
|
||||
#define AHBIX_CLK 11
|
||||
|
||||
+#define LCC_PCM_RESET 0
|
||||
#endif
|
||||
@ -0,0 +1,57 @@
|
||||
From f8fdbecdaca97f0f2eebd77256e2eca4a8da6c39 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sun, 7 Feb 2021 17:08:16 +0100
|
||||
Subject: [PATCH 3/4] clk: qcom: krait: add missing enable disable
|
||||
|
||||
Add missing enable disable mux function. Add extra check to
|
||||
div2_round_rate.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/clk/qcom/clk-krait.c | 27 +++++++++++++++++++++++++--
|
||||
1 file changed, 25 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/clk/qcom/clk-krait.c
|
||||
+++ b/drivers/clk/qcom/clk-krait.c
|
||||
@@ -68,7 +68,25 @@ static u8 krait_mux_get_parent(struct cl
|
||||
return clk_mux_val_to_index(hw, mux->parent_map, 0, sel);
|
||||
}
|
||||
|
||||
+static int krait_mux_enable(struct clk_hw *hw)
|
||||
+{
|
||||
+ struct krait_mux_clk *mux = to_krait_mux_clk(hw);
|
||||
+
|
||||
+ __krait_mux_set_sel(mux, mux->en_mask);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void krait_mux_disable(struct clk_hw *hw)
|
||||
+{
|
||||
+ struct krait_mux_clk *mux = to_krait_mux_clk(hw);
|
||||
+
|
||||
+ __krait_mux_set_sel(mux, mux->safe_sel);
|
||||
+}
|
||||
+
|
||||
const struct clk_ops krait_mux_clk_ops = {
|
||||
+ .enable = krait_mux_enable,
|
||||
+ .disable = krait_mux_disable,
|
||||
.set_parent = krait_mux_set_parent,
|
||||
.get_parent = krait_mux_get_parent,
|
||||
.determine_rate = __clk_mux_determine_rate_closest,
|
||||
@@ -79,8 +97,13 @@ EXPORT_SYMBOL_GPL(krait_mux_clk_ops);
|
||||
static long krait_div2_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
{
|
||||
- *parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), rate * 2);
|
||||
- return DIV_ROUND_UP(*parent_rate, 2);
|
||||
+ struct clk_hw *hw_parent = clk_hw_get_parent(hw);
|
||||
+
|
||||
+ if (hw_parent) {
|
||||
+ *parent_rate = clk_hw_round_rate(hw_parent, rate * 2);
|
||||
+ return DIV_ROUND_UP(*parent_rate, 2);
|
||||
+ } else
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
static int krait_div2_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
@ -0,0 +1,372 @@
|
||||
From 22a0f55b0e505fbbbb680e451a62878bc97f7ff1 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sun, 7 Feb 2021 17:23:38 +0100
|
||||
Subject: [PATCH 4/4] ipq806x: gcc: add missing clk and reset for crypto engine
|
||||
|
||||
Add missing clk and reset needed for nss additional core and crypto
|
||||
engine.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/clk/qcom/gcc-ipq806x.c | 250 +++++++++++++++++++
|
||||
include/dt-bindings/clock/qcom,gcc-ipq806x.h | 5 +-
|
||||
include/dt-bindings/reset/qcom,gcc-ipq806x.h | 5 +
|
||||
3 files changed, 259 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/clk/qcom/gcc-ipq806x.c
|
||||
+++ b/drivers/clk/qcom/gcc-ipq806x.c
|
||||
@@ -223,7 +223,9 @@ static struct clk_regmap pll14_vote = {
|
||||
|
||||
static struct pll_freq_tbl pll18_freq_tbl[] = {
|
||||
NSS_PLL_RATE(550000000, 44, 0, 1, 0x01495625),
|
||||
+ NSS_PLL_RATE(600000000, 48, 0, 1, 0x01495625),
|
||||
NSS_PLL_RATE(733000000, 58, 16, 25, 0x014b5625),
|
||||
+ NSS_PLL_RATE(800000000, 64, 0, 1, 0x01495625),
|
||||
};
|
||||
|
||||
static struct clk_pll pll18 = {
|
||||
@@ -245,6 +247,22 @@ static struct clk_pll pll18 = {
|
||||
},
|
||||
};
|
||||
|
||||
+static struct clk_pll pll11 = {
|
||||
+ .l_reg = 0x3184,
|
||||
+ .m_reg = 0x3188,
|
||||
+ .n_reg = 0x318c,
|
||||
+ .config_reg = 0x3194,
|
||||
+ .mode_reg = 0x3180,
|
||||
+ .status_reg = 0x3198,
|
||||
+ .status_bit = 16,
|
||||
+ .clkr.hw.init = &(struct clk_init_data){
|
||||
+ .name = "pll11",
|
||||
+ .parent_names = (const char *[]){ "pxo" },
|
||||
+ .num_parents = 1,
|
||||
+ .ops = &clk_pll_ops,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
enum {
|
||||
P_PXO,
|
||||
P_PLL8,
|
||||
@@ -253,6 +271,7 @@ enum {
|
||||
P_CXO,
|
||||
P_PLL14,
|
||||
P_PLL18,
|
||||
+ P_PLL11,
|
||||
};
|
||||
|
||||
static const struct parent_map gcc_pxo_pll8_map[] = {
|
||||
@@ -320,6 +339,42 @@ static const char * const gcc_pxo_pll8_p
|
||||
"pll18",
|
||||
};
|
||||
|
||||
+static const struct parent_map gcc_pxo_pll8_pll0_pll14_pll18_pll11_map[] = {
|
||||
+ { P_PXO, 0 },
|
||||
+ { P_PLL8, 4 },
|
||||
+ { P_PLL0, 2 },
|
||||
+ { P_PLL14, 5 },
|
||||
+ { P_PLL18, 1 },
|
||||
+ { P_PLL11, 3 },
|
||||
+};
|
||||
+
|
||||
+static const char *gcc_pxo_pll8_pll0_pll14_pll18_pll11[] = {
|
||||
+ "pxo",
|
||||
+ "pll8_vote",
|
||||
+ "pll0_vote",
|
||||
+ "pll14",
|
||||
+ "pll18",
|
||||
+ "pll11"
|
||||
+};
|
||||
+
|
||||
+static const struct parent_map gcc_pxo_pll3_pll0_pll14_pll18_pll11_map[] = {
|
||||
+ { P_PXO, 0 },
|
||||
+ { P_PLL3, 6 },
|
||||
+ { P_PLL0, 2 },
|
||||
+ { P_PLL14, 5 },
|
||||
+ { P_PLL18, 1 },
|
||||
+ { P_PLL11, 3 },
|
||||
+};
|
||||
+
|
||||
+static const char *gcc_pxo_pll3_pll0_pll14_pll18_pll11[] = {
|
||||
+ "pxo",
|
||||
+ "pll3",
|
||||
+ "pll0_vote",
|
||||
+ "pll14",
|
||||
+ "pll18",
|
||||
+ "pll11"
|
||||
+};
|
||||
+
|
||||
static struct freq_tbl clk_tbl_gsbi_uart[] = {
|
||||
{ 1843200, P_PLL8, 2, 6, 625 },
|
||||
{ 3686400, P_PLL8, 2, 12, 625 },
|
||||
@@ -1261,6 +1316,7 @@ static const struct freq_tbl clk_tbl_sdc
|
||||
{ 20210000, P_PLL8, 1, 1, 19 },
|
||||
{ 24000000, P_PLL8, 4, 1, 4 },
|
||||
{ 48000000, P_PLL8, 4, 1, 2 },
|
||||
+ { 52000000, P_PLL8, 1, 2, 15 }, /* 51.2 Mhz */
|
||||
{ 64000000, P_PLL8, 3, 1, 2 },
|
||||
{ 96000000, P_PLL8, 4, 0, 0 },
|
||||
{ 192000000, P_PLL8, 2, 0, 0 },
|
||||
@@ -2645,7 +2701,9 @@ static const struct freq_tbl clk_tbl_nss
|
||||
{ 110000000, P_PLL18, 1, 1, 5 },
|
||||
{ 275000000, P_PLL18, 2, 0, 0 },
|
||||
{ 550000000, P_PLL18, 1, 0, 0 },
|
||||
+ { 600000000, P_PLL18, 1, 0, 0 },
|
||||
{ 733000000, P_PLL18, 1, 0, 0 },
|
||||
+ { 800000000, P_PLL18, 1, 0, 0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -2757,6 +2815,186 @@ static struct clk_dyn_rcg ubi32_core2_sr
|
||||
},
|
||||
};
|
||||
|
||||
+static const struct freq_tbl clk_tbl_ce5_core[] = {
|
||||
+ { 150000000, P_PLL3, 8, 1, 1 },
|
||||
+ { 213200000, P_PLL11, 5, 1, 1 },
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+static struct clk_dyn_rcg ce5_core_src = {
|
||||
+ .ns_reg[0] = 0x36C4,
|
||||
+ .ns_reg[1] = 0x36C8,
|
||||
+ .bank_reg = 0x36C0,
|
||||
+ .s[0] = {
|
||||
+ .src_sel_shift = 0,
|
||||
+ .parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map,
|
||||
+ },
|
||||
+ .s[1] = {
|
||||
+ .src_sel_shift = 0,
|
||||
+ .parent_map = gcc_pxo_pll3_pll0_pll14_pll18_pll11_map,
|
||||
+ },
|
||||
+ .p[0] = {
|
||||
+ .pre_div_shift = 3,
|
||||
+ .pre_div_width = 4,
|
||||
+ },
|
||||
+ .p[1] = {
|
||||
+ .pre_div_shift = 3,
|
||||
+ .pre_div_width = 4,
|
||||
+ },
|
||||
+ .mux_sel_bit = 0,
|
||||
+ .freq_tbl = clk_tbl_ce5_core,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x36C0,
|
||||
+ .enable_mask = BIT(1),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "ce5_core_src",
|
||||
+ .parent_names = gcc_pxo_pll3_pll0_pll14_pll18_pll11,
|
||||
+ .num_parents = 6,
|
||||
+ .ops = &clk_dyn_rcg_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct clk_branch ce5_core_clk = {
|
||||
+ .halt_reg = 0x2FDC,
|
||||
+ .halt_bit = 5,
|
||||
+ .hwcg_reg = 0x36CC,
|
||||
+ .hwcg_bit = 6,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x36CC,
|
||||
+ .enable_mask = BIT(4),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "ce5_core_clk",
|
||||
+ .parent_names = (const char *[]){
|
||||
+ "ce5_core_src",
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .ops = &clk_branch_ops,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct freq_tbl clk_tbl_ce5_a_clk[] = {
|
||||
+ { 160000000, P_PLL0, 5, 1, 1 },
|
||||
+ { 213200000, P_PLL11, 5, 1, 1 },
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+static struct clk_dyn_rcg ce5_a_clk_src = {
|
||||
+ .ns_reg[0] = 0x3d84,
|
||||
+ .ns_reg[1] = 0x3d88,
|
||||
+ .bank_reg = 0x3d80,
|
||||
+ .s[0] = {
|
||||
+ .src_sel_shift = 0,
|
||||
+ .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
|
||||
+ },
|
||||
+ .s[1] = {
|
||||
+ .src_sel_shift = 0,
|
||||
+ .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
|
||||
+ },
|
||||
+ .p[0] = {
|
||||
+ .pre_div_shift = 3,
|
||||
+ .pre_div_width = 4,
|
||||
+ },
|
||||
+ .p[1] = {
|
||||
+ .pre_div_shift = 3,
|
||||
+ .pre_div_width = 4,
|
||||
+ },
|
||||
+ .mux_sel_bit = 0,
|
||||
+ .freq_tbl = clk_tbl_ce5_a_clk,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x3d80,
|
||||
+ .enable_mask = BIT(1),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "ce5_a_clk_src",
|
||||
+ .parent_names = gcc_pxo_pll8_pll0_pll14_pll18_pll11,
|
||||
+ .num_parents = 6,
|
||||
+ .ops = &clk_dyn_rcg_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct clk_branch ce5_a_clk = {
|
||||
+ .halt_reg = 0x3c20,
|
||||
+ .halt_bit = 12,
|
||||
+ .hwcg_reg = 0x3d8c,
|
||||
+ .hwcg_bit = 6,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x3d8c,
|
||||
+ .enable_mask = BIT(4),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "ce5_a_clk",
|
||||
+ .parent_names = (const char *[]){
|
||||
+ "ce5_a_clk_src",
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .ops = &clk_branch_ops,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct freq_tbl clk_tbl_ce5_h_clk[] = {
|
||||
+ { 160000000, P_PLL0, 5, 1, 1 },
|
||||
+ { 213200000, P_PLL11, 5, 1, 1 },
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+static struct clk_dyn_rcg ce5_h_clk_src = {
|
||||
+ .ns_reg[0] = 0x3c64,
|
||||
+ .ns_reg[1] = 0x3c68,
|
||||
+ .bank_reg = 0x3c60,
|
||||
+ .s[0] = {
|
||||
+ .src_sel_shift = 0,
|
||||
+ .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
|
||||
+ },
|
||||
+ .s[1] = {
|
||||
+ .src_sel_shift = 0,
|
||||
+ .parent_map = gcc_pxo_pll8_pll0_pll14_pll18_pll11_map,
|
||||
+ },
|
||||
+ .p[0] = {
|
||||
+ .pre_div_shift = 3,
|
||||
+ .pre_div_width = 4,
|
||||
+ },
|
||||
+ .p[1] = {
|
||||
+ .pre_div_shift = 3,
|
||||
+ .pre_div_width = 4,
|
||||
+ },
|
||||
+ .mux_sel_bit = 0,
|
||||
+ .freq_tbl = clk_tbl_ce5_h_clk,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x3c60,
|
||||
+ .enable_mask = BIT(1),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "ce5_h_clk_src",
|
||||
+ .parent_names = gcc_pxo_pll8_pll0_pll14_pll18_pll11,
|
||||
+ .num_parents = 6,
|
||||
+ .ops = &clk_dyn_rcg_ops,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct clk_branch ce5_h_clk = {
|
||||
+ .halt_reg = 0x3c20,
|
||||
+ .halt_bit = 11,
|
||||
+ .hwcg_reg = 0x3c6c,
|
||||
+ .hwcg_bit = 6,
|
||||
+ .clkr = {
|
||||
+ .enable_reg = 0x3c6c,
|
||||
+ .enable_mask = BIT(4),
|
||||
+ .hw.init = &(struct clk_init_data){
|
||||
+ .name = "ce5_h_clk",
|
||||
+ .parent_names = (const char *[]){
|
||||
+ "ce5_h_clk_src",
|
||||
+ },
|
||||
+ .num_parents = 1,
|
||||
+ .ops = &clk_branch_ops,
|
||||
+ .flags = CLK_SET_RATE_PARENT,
|
||||
+ },
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static struct clk_regmap *gcc_ipq806x_clks[] = {
|
||||
[PLL0] = &pll0.clkr,
|
||||
[PLL0_VOTE] = &pll0_vote,
|
||||
@@ -2764,6 +3002,7 @@ static struct clk_regmap *gcc_ipq806x_cl
|
||||
[PLL4_VOTE] = &pll4_vote,
|
||||
[PLL8] = &pll8.clkr,
|
||||
[PLL8_VOTE] = &pll8_vote,
|
||||
+ [PLL11] = &pll11.clkr,
|
||||
[PLL14] = &pll14.clkr,
|
||||
[PLL14_VOTE] = &pll14_vote,
|
||||
[PLL18] = &pll18.clkr,
|
||||
@@ -2878,6 +3117,12 @@ static struct clk_regmap *gcc_ipq806x_cl
|
||||
[PLL9] = &hfpll0.clkr,
|
||||
[PLL10] = &hfpll1.clkr,
|
||||
[PLL12] = &hfpll_l2.clkr,
|
||||
+ [CE5_A_CLK_SRC] = &ce5_a_clk_src.clkr,
|
||||
+ [CE5_A_CLK] = &ce5_a_clk.clkr,
|
||||
+ [CE5_H_CLK_SRC] = &ce5_h_clk_src.clkr,
|
||||
+ [CE5_H_CLK] = &ce5_h_clk.clkr,
|
||||
+ [CE5_CORE_CLK_SRC] = &ce5_core_src.clkr,
|
||||
+ [CE5_CORE_CLK] = &ce5_core_clk.clkr,
|
||||
};
|
||||
|
||||
static const struct qcom_reset_map gcc_ipq806x_resets[] = {
|
||||
@@ -3009,6 +3254,11 @@ static const struct qcom_reset_map gcc_i
|
||||
[GMAC_CORE3_RESET] = { 0x3cfc, 0 },
|
||||
[GMAC_CORE4_RESET] = { 0x3d1c, 0 },
|
||||
[GMAC_AHB_RESET] = { 0x3e24, 0 },
|
||||
+ [CRYPTO_ENG1_RESET] = { 0x3e00, 0},
|
||||
+ [CRYPTO_ENG2_RESET] = { 0x3e04, 0},
|
||||
+ [CRYPTO_ENG3_RESET] = { 0x3e08, 0},
|
||||
+ [CRYPTO_ENG4_RESET] = { 0x3e0c, 0},
|
||||
+ [CRYPTO_AHB_RESET] = { 0x3e10, 0},
|
||||
[NSS_CH0_RST_RX_CLK_N_RESET] = { 0x3b60, 0 },
|
||||
[NSS_CH0_RST_TX_CLK_N_RESET] = { 0x3b60, 1 },
|
||||
[NSS_CH0_RST_RX_125M_N_RESET] = { 0x3b60, 2 },
|
||||
--- a/include/dt-bindings/clock/qcom,gcc-ipq806x.h
|
||||
+++ b/include/dt-bindings/clock/qcom,gcc-ipq806x.h
|
||||
@@ -240,7 +240,7 @@
|
||||
#define PLL14 232
|
||||
#define PLL14_VOTE 233
|
||||
#define PLL18 234
|
||||
-#define CE5_SRC 235
|
||||
+#define CE5_A_CLK 235
|
||||
#define CE5_H_CLK 236
|
||||
#define CE5_CORE_CLK 237
|
||||
#define CE3_SLEEP_CLK 238
|
||||
@@ -283,5 +283,8 @@
|
||||
#define EBI2_AON_CLK 281
|
||||
#define NSSTCM_CLK_SRC 282
|
||||
#define NSSTCM_CLK 283
|
||||
+#define CE5_A_CLK_SRC 285
|
||||
+#define CE5_H_CLK_SRC 286
|
||||
+#define CE5_CORE_CLK_SRC 287
|
||||
|
||||
#endif
|
||||
--- a/include/dt-bindings/reset/qcom,gcc-ipq806x.h
|
||||
+++ b/include/dt-bindings/reset/qcom,gcc-ipq806x.h
|
||||
@@ -163,5 +163,10 @@
|
||||
#define NSS_CAL_PRBS_RST_N_RESET 154
|
||||
#define NSS_LCKDT_RST_N_RESET 155
|
||||
#define NSS_SRDS_N_RESET 156
|
||||
+#define CRYPTO_ENG1_RESET 157
|
||||
+#define CRYPTO_ENG2_RESET 158
|
||||
+#define CRYPTO_ENG3_RESET 159
|
||||
+#define CRYPTO_ENG4_RESET 160
|
||||
+#define CRYPTO_AHB_RESET 161
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,707 @@
|
||||
From cc41a266280cad0b55319e614167c88dff344248 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sat, 22 Feb 2020 16:33:10 +0100
|
||||
Subject: [PATCH 1/8] cpufreq: add Krait dedicated scaling driver
|
||||
|
||||
This new driver is based on generic cpufreq-dt driver.
|
||||
Krait SoCs have 2-4 cpu and one shared L2 cache that can
|
||||
operate at different frequency based on the maximum cpu clk
|
||||
across all core.
|
||||
L2 frequency and voltage are scaled on every frequency change
|
||||
if needed. On Krait SoCs is present a bug that can cause
|
||||
transition problem between frequency bin, to workaround this
|
||||
on more than one transition, the L2 frequency is first set to the
|
||||
base rate and then to the target rate.
|
||||
The L2 frequency use the OPP framework and use the opp-level
|
||||
bindings to link the l2 freq to different cpu freq. This is needed
|
||||
as the Krait l2 clk are note mapped 1:1 to the core clks and some
|
||||
of the l2 clk is set based on a range of the cpu clks. If the driver
|
||||
find a broken config (for example no opp-level set) the l2 scaling is
|
||||
skipped.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/cpufreq/Kconfig.arm | 14 +-
|
||||
drivers/cpufreq/Makefile | 2 +
|
||||
drivers/cpufreq/qcom-cpufreq-krait.c | 589 +++++++++++++++++++++++++++
|
||||
3 files changed, 604 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/cpufreq/qcom-cpufreq-krait.c
|
||||
|
||||
--- a/drivers/cpufreq/Kconfig.arm
|
||||
+++ b/drivers/cpufreq/Kconfig.arm
|
||||
@@ -150,6 +150,18 @@ config ARM_QCOM_CPUFREQ_HW
|
||||
The driver implements the cpufreq interface for this HW engine.
|
||||
Say Y if you want to support CPUFreq HW.
|
||||
|
||||
+config ARM_QCOM_CPUFREQ_KRAIT
|
||||
+ tristate "CPU Frequency scaling support for Krait SoCs"
|
||||
+ depends on ARCH_QCOM || COMPILE_TEST
|
||||
+ select PM_OPP
|
||||
+ select ARM_QCOM_CPUFREQ_NVMEM
|
||||
+ help
|
||||
+ This adds the CPUFreq driver for Qualcomm Krait SoC based boards.
|
||||
+ This scale the cache clk and regulator based on the different cpu
|
||||
+ clks when scaling the different cores clk.
|
||||
+
|
||||
+ If in doubt, say N.
|
||||
+
|
||||
config ARM_RASPBERRYPI_CPUFREQ
|
||||
tristate "Raspberry Pi cpufreq support"
|
||||
depends on CLK_RASPBERRYPI || COMPILE_TEST
|
||||
@@ -339,4 +351,4 @@ config ARM_PXA2xx_CPUFREQ
|
||||
help
|
||||
This add the CPUFreq driver support for Intel PXA2xx SOCs.
|
||||
|
||||
- If in doubt, say N.
|
||||
+ If in doubt, say N.
|
||||
\ No newline at end of file
|
||||
--- a/drivers/cpufreq/Makefile
|
||||
+++ b/drivers/cpufreq/Makefile
|
||||
@@ -63,6 +63,7 @@ obj-$(CONFIG_ARM_PXA2xx_CPUFREQ) += pxa2
|
||||
obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o
|
||||
obj-$(CONFIG_ARM_QCOM_CPUFREQ_HW) += qcom-cpufreq-hw.o
|
||||
obj-$(CONFIG_ARM_QCOM_CPUFREQ_NVMEM) += qcom-cpufreq-nvmem.o
|
||||
+obj-$(CONFIG_ARM_QCOM_CPUFREQ_KRAIT) += qcom-cpufreq-krait.o
|
||||
obj-$(CONFIG_ARM_RASPBERRYPI_CPUFREQ) += raspberrypi-cpufreq.o
|
||||
obj-$(CONFIG_ARM_S3C2410_CPUFREQ) += s3c2410-cpufreq.o
|
||||
obj-$(CONFIG_ARM_S3C2412_CPUFREQ) += s3c2412-cpufreq.o
|
||||
@@ -86,6 +87,7 @@ obj-$(CONFIG_ARM_TEGRA186_CPUFREQ) += te
|
||||
obj-$(CONFIG_ARM_TEGRA194_CPUFREQ) += tegra194-cpufreq.o
|
||||
obj-$(CONFIG_ARM_TI_CPUFREQ) += ti-cpufreq.o
|
||||
obj-$(CONFIG_ARM_VEXPRESS_SPC_CPUFREQ) += vexpress-spc-cpufreq.o
|
||||
+obj-$(CONFIG_ARM_KRAIT_CPUFREQ) += krait-cpufreq.o
|
||||
|
||||
|
||||
##################################################################################
|
||||
--- /dev/null
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-krait.c
|
||||
@@ -0,0 +1,629 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/cpu.h>
|
||||
+#include <linux/cpufreq.h>
|
||||
+#include <linux/cpumask.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/pm_opp.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/regulator/consumer.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/thermal.h>
|
||||
+
|
||||
+#include "cpufreq-dt.h"
|
||||
+
|
||||
+static struct device *l2_dev;
|
||||
+static struct mutex lock;
|
||||
+
|
||||
+struct private_data {
|
||||
+ struct opp_table *opp_table;
|
||||
+ struct device *cpu_dev;
|
||||
+ struct device *l2_dev;
|
||||
+ const char *reg_name;
|
||||
+ bool have_static_opps;
|
||||
+};
|
||||
+
|
||||
+static int set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
+{
|
||||
+ struct private_data *priv = policy->driver_data;
|
||||
+ unsigned long freq = policy->freq_table[index].frequency;
|
||||
+ unsigned long target_freq = freq * 1000;
|
||||
+ struct dev_pm_opp *opp;
|
||||
+ unsigned int level;
|
||||
+ int cpu, ret;
|
||||
+
|
||||
+ if (l2_dev) {
|
||||
+ int policy_cpu = policy->cpu;
|
||||
+
|
||||
+ mutex_lock(&lock);
|
||||
+
|
||||
+ /* find the max freq across all core */
|
||||
+ for_each_present_cpu(cpu)
|
||||
+ if (cpu != policy_cpu)
|
||||
+ target_freq = max(
|
||||
+ target_freq,
|
||||
+ (unsigned long)cpufreq_quick_get(cpu));
|
||||
+
|
||||
+ opp = dev_pm_opp_find_freq_exact(priv->cpu_dev, target_freq,
|
||||
+ true);
|
||||
+ if (IS_ERR(opp)) {
|
||||
+ dev_err(l2_dev, "failed to find OPP for %ld\n",
|
||||
+ target_freq);
|
||||
+ ret = PTR_ERR(opp);
|
||||
+ goto l2_scale_fail;
|
||||
+ }
|
||||
+ level = dev_pm_opp_get_level(opp);
|
||||
+ dev_pm_opp_put(opp);
|
||||
+
|
||||
+ /*
|
||||
+ * Hardware constraint:
|
||||
+ * Krait CPU cannot operate at 384MHz with L2 at 1Ghz.
|
||||
+ * Assume index 0 with the idle freq and level > 0 as
|
||||
+ * any L2 freq > 384MHz.
|
||||
+ * Skip CPU freq change in this corner case.
|
||||
+ */
|
||||
+ if (unlikely(index == 0 && level != 0)) {
|
||||
+ dev_err(priv->cpu_dev, "Krait CPU can't operate at idle freq with L2 at 1GHz");
|
||||
+ ret = -EINVAL;
|
||||
+ goto l2_scale_fail;
|
||||
+ }
|
||||
+
|
||||
+ opp = dev_pm_opp_find_level_exact(l2_dev, level);
|
||||
+ if (IS_ERR(opp)) {
|
||||
+ dev_err(l2_dev,
|
||||
+ "failed to find level OPP for %d\n", level);
|
||||
+ ret = PTR_ERR(opp);
|
||||
+ goto l2_scale_fail;
|
||||
+ }
|
||||
+ target_freq = dev_pm_opp_get_freq(opp);
|
||||
+ dev_pm_opp_put(opp);
|
||||
+
|
||||
+ ret = dev_pm_opp_set_rate(l2_dev, target_freq);
|
||||
+ if (ret)
|
||||
+ goto l2_scale_fail;
|
||||
+
|
||||
+ mutex_unlock(&lock);
|
||||
+ }
|
||||
+
|
||||
+ ret = dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ arch_set_freq_scale(policy->related_cpus, freq,
|
||||
+ policy->cpuinfo.max_freq);
|
||||
+
|
||||
+ return 0;
|
||||
+l2_scale_fail:
|
||||
+ mutex_unlock(&lock);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * An earlier version of opp-v1 bindings used to name the regulator
|
||||
+ * "cpu0-supply", we still need to handle that for backwards compatibility.
|
||||
+ */
|
||||
+static const char *find_supply_name(struct device *dev)
|
||||
+{
|
||||
+ struct device_node *np;
|
||||
+ struct property *pp;
|
||||
+ int cpu = dev->id;
|
||||
+ const char *name = NULL;
|
||||
+
|
||||
+ np = of_node_get(dev->of_node);
|
||||
+
|
||||
+ /* This must be valid for sure */
|
||||
+ if (WARN_ON(!np))
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* Try "cpu0" for older DTs */
|
||||
+ if (!cpu) {
|
||||
+ pp = of_find_property(np, "cpu0-supply", NULL);
|
||||
+ if (pp) {
|
||||
+ name = "cpu0";
|
||||
+ goto node_put;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ pp = of_find_property(np, "cpu-supply", NULL);
|
||||
+ if (pp) {
|
||||
+ name = "cpu";
|
||||
+ goto node_put;
|
||||
+ }
|
||||
+
|
||||
+ dev_dbg(dev, "no regulator for cpu%d\n", cpu);
|
||||
+node_put:
|
||||
+ of_node_put(np);
|
||||
+ return name;
|
||||
+}
|
||||
+
|
||||
+static int resources_available(void)
|
||||
+{
|
||||
+ struct device *cpu_dev;
|
||||
+ struct regulator *cpu_reg;
|
||||
+ struct clk *cpu_clk;
|
||||
+ int ret = 0;
|
||||
+ const char *name;
|
||||
+
|
||||
+ cpu_dev = get_cpu_device(0);
|
||||
+ if (!cpu_dev) {
|
||||
+ pr_err("failed to get cpu0 device\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ cpu_clk = clk_get(cpu_dev, NULL);
|
||||
+ ret = PTR_ERR_OR_ZERO(cpu_clk);
|
||||
+ if (ret) {
|
||||
+ /*
|
||||
+ * If cpu's clk node is present, but clock is not yet
|
||||
+ * registered, we should try defering probe.
|
||||
+ */
|
||||
+ if (ret == -EPROBE_DEFER)
|
||||
+ dev_dbg(cpu_dev, "clock not ready, retry\n");
|
||||
+ else
|
||||
+ dev_err(cpu_dev, "failed to get clock: %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ clk_put(cpu_clk);
|
||||
+
|
||||
+ name = find_supply_name(cpu_dev);
|
||||
+ /* Platform doesn't require regulator */
|
||||
+ if (!name)
|
||||
+ return 0;
|
||||
+
|
||||
+ cpu_reg = regulator_get_optional(cpu_dev, name);
|
||||
+ ret = PTR_ERR_OR_ZERO(cpu_reg);
|
||||
+ if (ret) {
|
||||
+ /*
|
||||
+ * If cpu's regulator supply node is present, but regulator is
|
||||
+ * not yet registered, we should try defering probe.
|
||||
+ */
|
||||
+ if (ret == -EPROBE_DEFER)
|
||||
+ dev_dbg(cpu_dev, "cpu0 regulator not ready, retry\n");
|
||||
+ else
|
||||
+ dev_dbg(cpu_dev, "no regulator for cpu0: %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ regulator_put(cpu_reg);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int cpufreq_init(struct cpufreq_policy *policy)
|
||||
+{
|
||||
+ struct cpufreq_frequency_table *freq_table;
|
||||
+ struct opp_table *opp_table = NULL;
|
||||
+ unsigned int transition_latency;
|
||||
+ struct private_data *priv;
|
||||
+ struct device *cpu_dev;
|
||||
+ bool fallback = false;
|
||||
+ struct clk *cpu_clk;
|
||||
+ const char *name;
|
||||
+ int ret;
|
||||
+
|
||||
+ cpu_dev = get_cpu_device(policy->cpu);
|
||||
+ if (!cpu_dev) {
|
||||
+ pr_err("failed to get cpu%d device\n", policy->cpu);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ cpu_clk = clk_get(cpu_dev, NULL);
|
||||
+ if (IS_ERR(cpu_clk)) {
|
||||
+ ret = PTR_ERR(cpu_clk);
|
||||
+ dev_err(cpu_dev, "%s: failed to get clk: %d\n", __func__, ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Get OPP-sharing information from "operating-points-v2" bindings */
|
||||
+ ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, policy->cpus);
|
||||
+ if (ret) {
|
||||
+ if (ret != -ENOENT)
|
||||
+ goto out_put_clk;
|
||||
+
|
||||
+ /*
|
||||
+ * operating-points-v2 not supported, fallback to old method of
|
||||
+ * finding shared-OPPs for backward compatibility if the
|
||||
+ * platform hasn't set sharing CPUs.
|
||||
+ */
|
||||
+ if (dev_pm_opp_get_sharing_cpus(cpu_dev, policy->cpus))
|
||||
+ fallback = true;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * OPP layer will be taking care of regulators now, but it needs to know
|
||||
+ * the name of the regulator first.
|
||||
+ */
|
||||
+ name = find_supply_name(cpu_dev);
|
||||
+ if (name) {
|
||||
+ opp_table = dev_pm_opp_set_regulators(cpu_dev, &name, 1);
|
||||
+ if (IS_ERR(opp_table)) {
|
||||
+ ret = PTR_ERR(opp_table);
|
||||
+ dev_err(cpu_dev,
|
||||
+ "Failed to set regulator for cpu%d: %d\n",
|
||||
+ policy->cpu, ret);
|
||||
+ goto out_put_clk;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto out_put_regulator;
|
||||
+ }
|
||||
+
|
||||
+ priv->reg_name = name;
|
||||
+ priv->opp_table = opp_table;
|
||||
+
|
||||
+ /*
|
||||
+ * Initialize OPP tables for all policy->cpus. They will be shared by
|
||||
+ * all CPUs which have marked their CPUs shared with OPP bindings.
|
||||
+ *
|
||||
+ * For platforms not using operating-points-v2 bindings, we do this
|
||||
+ * before updating policy->cpus. Otherwise, we will end up creating
|
||||
+ * duplicate OPPs for policy->cpus.
|
||||
+ *
|
||||
+ * OPPs might be populated at runtime, don't check for error here
|
||||
+ */
|
||||
+ if (!dev_pm_opp_of_cpumask_add_table(policy->cpus))
|
||||
+ priv->have_static_opps = true;
|
||||
+
|
||||
+ /*
|
||||
+ * But we need OPP table to function so if it is not there let's
|
||||
+ * give platform code chance to provide it for us.
|
||||
+ */
|
||||
+ ret = dev_pm_opp_get_opp_count(cpu_dev);
|
||||
+ if (ret < 0) {
|
||||
+ dev_dbg(cpu_dev, "OPP table is not ready, deferring probe\n");
|
||||
+ ret = -EPROBE_DEFER;
|
||||
+ goto out_free_opp;
|
||||
+ }
|
||||
+
|
||||
+ if (fallback) {
|
||||
+ cpumask_setall(policy->cpus);
|
||||
+
|
||||
+ /*
|
||||
+ * OPP tables are initialized only for policy->cpu, do it for
|
||||
+ * others as well.
|
||||
+ */
|
||||
+ ret = dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus);
|
||||
+ if (ret)
|
||||
+ dev_err(cpu_dev,
|
||||
+ "%s: failed to mark OPPs as shared: %d\n",
|
||||
+ __func__, ret);
|
||||
+ }
|
||||
+
|
||||
+ ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table);
|
||||
+ if (ret) {
|
||||
+ dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret);
|
||||
+ goto out_free_opp;
|
||||
+ }
|
||||
+
|
||||
+ priv->cpu_dev = cpu_dev;
|
||||
+
|
||||
+ policy->driver_data = priv;
|
||||
+ policy->clk = cpu_clk;
|
||||
+ policy->freq_table = freq_table;
|
||||
+
|
||||
+ policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000;
|
||||
+
|
||||
+ transition_latency = dev_pm_opp_get_max_transition_latency(cpu_dev);
|
||||
+ if (!transition_latency)
|
||||
+ transition_latency = CPUFREQ_ETERNAL;
|
||||
+
|
||||
+ policy->cpuinfo.transition_latency = transition_latency;
|
||||
+ policy->dvfs_possible_from_any_cpu = true;
|
||||
+
|
||||
+ dev_pm_opp_of_register_em(cpu_dev, policy->cpus);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+out_free_opp:
|
||||
+ if (priv->have_static_opps)
|
||||
+ dev_pm_opp_of_cpumask_remove_table(policy->cpus);
|
||||
+ kfree(priv);
|
||||
+out_put_regulator:
|
||||
+ if (name)
|
||||
+ dev_pm_opp_put_regulators(opp_table);
|
||||
+out_put_clk:
|
||||
+ clk_put(cpu_clk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int cpufreq_online(struct cpufreq_policy *policy)
|
||||
+{
|
||||
+ /* We did light-weight tear down earlier, nothing to do here */
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int cpufreq_offline(struct cpufreq_policy *policy)
|
||||
+{
|
||||
+ /*
|
||||
+ * Preserve policy->driver_data and don't free resources on light-weight
|
||||
+ * tear down.
|
||||
+ */
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int cpufreq_exit(struct cpufreq_policy *policy)
|
||||
+{
|
||||
+ struct private_data *priv = policy->driver_data;
|
||||
+
|
||||
+ dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table);
|
||||
+ if (priv->have_static_opps)
|
||||
+ dev_pm_opp_of_cpumask_remove_table(policy->related_cpus);
|
||||
+ if (priv->reg_name)
|
||||
+ dev_pm_opp_put_regulators(priv->opp_table);
|
||||
+
|
||||
+ clk_put(policy->clk);
|
||||
+ kfree(priv);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct cpufreq_driver krait_cpufreq_driver = {
|
||||
+ .flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK |
|
||||
+ CPUFREQ_IS_COOLING_DEV,
|
||||
+ .verify = cpufreq_generic_frequency_table_verify,
|
||||
+ .target_index = set_target,
|
||||
+ .get = cpufreq_generic_get,
|
||||
+ .init = cpufreq_init,
|
||||
+ .exit = cpufreq_exit,
|
||||
+ .online = cpufreq_online,
|
||||
+ .offline = cpufreq_offline,
|
||||
+ .name = "krait-cpufreq",
|
||||
+ .suspend = cpufreq_generic_suspend,
|
||||
+};
|
||||
+
|
||||
+struct krait_data {
|
||||
+ unsigned long idle_freq;
|
||||
+ bool regulator_enabled;
|
||||
+};
|
||||
+
|
||||
+static int krait_cache_set_opp(struct dev_pm_set_opp_data *data)
|
||||
+{
|
||||
+ unsigned long old_freq = data->old_opp.rate, freq = data->new_opp.rate;
|
||||
+ struct dev_pm_opp_supply *supply = &data->new_opp.supplies[0];
|
||||
+ struct regulator *reg = data->regulators[0];
|
||||
+ struct clk *clk = data->clk;
|
||||
+ struct krait_data *kdata;
|
||||
+ unsigned long idle_freq;
|
||||
+ int ret;
|
||||
+
|
||||
+ kdata = (struct krait_data *)dev_get_drvdata(data->dev);
|
||||
+ idle_freq = kdata->idle_freq;
|
||||
+
|
||||
+ /* Scaling up? Scale voltage before frequency */
|
||||
+ if (freq >= old_freq) {
|
||||
+ ret = regulator_set_voltage_triplet(reg, supply->u_volt_min,
|
||||
+ supply->u_volt,
|
||||
+ supply->u_volt_max);
|
||||
+ if (ret)
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Set to idle bin if switching from normal to high bin
|
||||
+ * or vice versa. It has been notice that a bug is triggered
|
||||
+ * in cache scaling when more than one bin is scaled, to fix
|
||||
+ * this we first need to transition to the base rate and then
|
||||
+ * to target rate
|
||||
+ */
|
||||
+ if (likely(freq != idle_freq && old_freq != idle_freq)) {
|
||||
+ ret = clk_set_rate(clk, idle_freq);
|
||||
+ if (ret)
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_set_rate(clk, freq);
|
||||
+ if (ret)
|
||||
+ goto exit;
|
||||
+
|
||||
+ /* Scaling down? Scale voltage after frequency */
|
||||
+ if (freq < old_freq) {
|
||||
+ ret = regulator_set_voltage_triplet(reg, supply->u_volt_min,
|
||||
+ supply->u_volt,
|
||||
+ supply->u_volt_max);
|
||||
+ }
|
||||
+
|
||||
+ if (unlikely(!kdata->regulator_enabled)) {
|
||||
+ ret = regulator_enable(reg);
|
||||
+ if (ret < 0)
|
||||
+ dev_warn(data->dev, "Failed to enable regulator: %d", ret);
|
||||
+ else
|
||||
+ kdata->regulator_enabled = true;
|
||||
+ }
|
||||
+
|
||||
+exit:
|
||||
+ return ret;
|
||||
+};
|
||||
+
|
||||
+static int krait_cache_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct krait_data *data;
|
||||
+ struct opp_table *table;
|
||||
+ struct dev_pm_opp *opp;
|
||||
+ struct device *cpu_dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
|
||||
+ if (!data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ table = dev_pm_opp_set_regulators(dev, (const char *[]){ "l2" }, 1);
|
||||
+ if (IS_ERR(table)) {
|
||||
+ ret = PTR_ERR(table);
|
||||
+ if (ret != -EPROBE_DEFER)
|
||||
+ dev_err(dev, "failed to set regulators %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = PTR_ERR_OR_ZERO(
|
||||
+ dev_pm_opp_register_set_opp_helper(dev, krait_cache_set_opp));
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = dev_pm_opp_of_add_table(dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to parse L2 freq thresholds\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ opp = dev_pm_opp_find_freq_ceil(dev, &data->idle_freq);
|
||||
+ dev_pm_opp_put(opp);
|
||||
+
|
||||
+ /*
|
||||
+ * Check if we have at least opp-level 1, 0 should always be set to
|
||||
+ * the idle freq
|
||||
+ */
|
||||
+ opp = dev_pm_opp_find_level_exact(dev, 1);
|
||||
+ if (IS_ERR(opp)) {
|
||||
+ ret = PTR_ERR(opp);
|
||||
+ dev_err(dev,
|
||||
+ "Invalid configuration found of l2 opp. Can't find opp-level 1");
|
||||
+ goto invalid_conf;
|
||||
+ }
|
||||
+ dev_pm_opp_put(opp);
|
||||
+
|
||||
+ /*
|
||||
+ * Check opp-level configuration
|
||||
+ * At least 2 level must be set or the cache will always be scaled
|
||||
+ * the idle freq causing some performance problem
|
||||
+ *
|
||||
+ * In case of invalid configuration, the l2 scaling is skipped
|
||||
+ */
|
||||
+ cpu_dev = get_cpu_device(0);
|
||||
+ if (!cpu_dev) {
|
||||
+ pr_err("failed to get cpu0 device\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ /* With opp error assume cpufreq still has to be registred. Defer probe. */
|
||||
+ ret = dev_pm_opp_get_opp_count(cpu_dev);
|
||||
+ if (ret < 0) {
|
||||
+ ret = -EPROBE_DEFER;
|
||||
+ goto invalid_conf;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Check if we have at least opp-level 1 in the cpu opp, 0 should always
|
||||
+ * be set to the idle freq
|
||||
+ */
|
||||
+ opp = dev_pm_opp_find_level_exact(cpu_dev, 1);
|
||||
+ if (IS_ERR(opp)) {
|
||||
+ ret = PTR_ERR(opp);
|
||||
+ if (ret != -EPROBE_DEFER)
|
||||
+ dev_err(dev,
|
||||
+ "Invalid configuration found of cpu opp. Can't find opp-level 1");
|
||||
+ goto invalid_conf;
|
||||
+ }
|
||||
+ dev_pm_opp_put(opp);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, data);
|
||||
+
|
||||
+ mutex_init(&lock);
|
||||
+
|
||||
+ /* The l2 scaling is enabled by linking the cpufreq driver */
|
||||
+ l2_dev = dev;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+invalid_conf:
|
||||
+ dev_pm_opp_remove_table(dev);
|
||||
+ dev_pm_opp_put_regulators(table);
|
||||
+ dev_pm_opp_unregister_set_opp_helper(table);
|
||||
+
|
||||
+ return ret;
|
||||
+};
|
||||
+
|
||||
+static int krait_cache_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct opp_table *table = dev_pm_opp_get_opp_table(dev);
|
||||
+
|
||||
+ dev_pm_opp_remove_table(dev);
|
||||
+ dev_pm_opp_put_regulators(table);
|
||||
+ dev_pm_opp_unregister_set_opp_helper(table);
|
||||
+
|
||||
+ return 0;
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id krait_cache_match_table[] = {
|
||||
+ { .compatible = "qcom,krait-cache" },
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver krait_cache_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "krait-cache",
|
||||
+ .of_match_table = krait_cache_match_table,
|
||||
+ },
|
||||
+ .probe = krait_cache_probe,
|
||||
+ .remove = krait_cache_remove,
|
||||
+};
|
||||
+module_platform_driver(krait_cache_driver);
|
||||
+
|
||||
+static int krait_cpufreq_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct cpufreq_dt_platform_data *data = dev_get_platdata(&pdev->dev);
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * All per-cluster (CPUs sharing clock/voltages) initialization is done
|
||||
+ * from ->init(). In probe(), we just need to make sure that clk and
|
||||
+ * regulators are available. Else defer probe and retry.
|
||||
+ *
|
||||
+ * FIXME: Is checking this only for CPU0 sufficient ?
|
||||
+ */
|
||||
+ ret = resources_available();
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (data) {
|
||||
+ if (data->have_governor_per_policy)
|
||||
+ krait_cpufreq_driver.flags |=
|
||||
+ CPUFREQ_HAVE_GOVERNOR_PER_POLICY;
|
||||
+
|
||||
+ krait_cpufreq_driver.resume = data->resume;
|
||||
+ if (data->suspend)
|
||||
+ krait_cpufreq_driver.suspend = data->suspend;
|
||||
+ }
|
||||
+
|
||||
+ ret = cpufreq_register_driver(&krait_cpufreq_driver);
|
||||
+ if (ret)
|
||||
+ dev_err(&pdev->dev, "failed register driver: %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int krait_cpufreq_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ cpufreq_unregister_driver(&krait_cpufreq_driver);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver krait_cpufreq_platdrv = {
|
||||
+ .driver = {
|
||||
+ .name = "krait-cpufreq",
|
||||
+ },
|
||||
+ .probe = krait_cpufreq_probe,
|
||||
+ .remove = krait_cpufreq_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(krait_cpufreq_platdrv);
|
||||
+
|
||||
+MODULE_ALIAS("platform:krait-cpufreq");
|
||||
+MODULE_AUTHOR("Ansuel Smith <ansuelsmth@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Dedicated Krait SoC cpufreq driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@ -0,0 +1,237 @@
|
||||
From c9ecd920324a647bf1f2b47f771c8f599cc7b551 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Sat, 22 Feb 2020 18:02:17 +0100
|
||||
Subject: [PATCH 2/8] Documentation: cpufreq: add qcom,krait-cache bindings
|
||||
|
||||
Document dedicated cpufreq for Krait CPUs.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
.../bindings/cpufreq/qcom-cpufreq-krait.yaml | 221 ++++++++++++++++++
|
||||
1 file changed, 221 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/cpufreq/qcom-cpufreq-krait.yaml
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/cpufreq/qcom-cpufreq-krait.yaml
|
||||
@@ -0,0 +1,221 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/cpufreq/qcom-cpufreq-krait.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: CPU Frequency scaling driver for Krait SoCs
|
||||
+
|
||||
+maintainers:
|
||||
+ - Ansuel Smith <ansuelsmth@gmail.com>
|
||||
+
|
||||
+description: |
|
||||
+ The krait cpufreq driver is a dedicated frequency scaling driver
|
||||
+ based on cpufreq-dt generic driver that scale L2 cache and the
|
||||
+ cores. TEST
|
||||
+
|
||||
+ The L2 cache is scaled based on the max clk across all cores and
|
||||
+ the clock is decided based on the opp-level set in the device tree.
|
||||
+
|
||||
+ Different core freq can be linked to a specific l2 freq and the driver
|
||||
+ on frequency change will scale the core and the l2 clk based of the
|
||||
+ linked freq.
|
||||
+
|
||||
+ On Krait SoC is present a bug and on every L2 clk change the driver
|
||||
+ needs to set the clk to the idle freq before changing it to the new value.
|
||||
+
|
||||
+ This requires the qcom cpufreq nvmem driver to parse the different opp
|
||||
+ core clk and an additional opp table for the l2 scaling.
|
||||
+
|
||||
+ If the driver detect broken config (for example missing opp-level) the
|
||||
+ cpufreq driver skips the l2 scaling
|
||||
+
|
||||
+ Referring to this example opp-level can be used to link a range of cpu freq
|
||||
+ to a specific l2 freq:
|
||||
+ cpu opp freq 384000000 has opp-level 0
|
||||
+ l2 opp freq 384000000 has opp-level 0
|
||||
+ The driver will scale l2 to 384000000
|
||||
+
|
||||
+ cpu opp freq 600000000-1000000000 has opp-level 1
|
||||
+ l2 opp freq 1000000000 has opp-level 1
|
||||
+ The driver will scale l2 to 1000000000
|
||||
+
|
||||
+allOf:
|
||||
+ - $ref: /schemas/cache-controller.yaml#
|
||||
+
|
||||
+select:
|
||||
+ properties:
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - enum:
|
||||
+ - qcom,krait-cache
|
||||
+
|
||||
+ required:
|
||||
+ - compatible
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ items:
|
||||
+ - const: qcom,krait-cache
|
||||
+ - const: cache
|
||||
+
|
||||
+ cache-level:
|
||||
+ const: 2
|
||||
+
|
||||
+ clocks:
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ clock-names:
|
||||
+ const: l2
|
||||
+
|
||||
+ l2-supply: true
|
||||
+
|
||||
+ operating-points-v2: true
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - cache-level
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+ - l2-supply
|
||||
+ - operating-points-v2
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ cpus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ cpu0: cpu@0 {
|
||||
+ compatible = "qcom,krait";
|
||||
+ enable-method = "qcom,kpss-acc-v1";
|
||||
+ device_type = "cpu";
|
||||
+ reg = <0>;
|
||||
+ next-level-cache = <&L2>;
|
||||
+ qcom,acc = <&acc0>;
|
||||
+ qcom,saw = <&saw0>;
|
||||
+ clocks = <&kraitcc 0>, <&kraitcc 4>;
|
||||
+ clock-names = "cpu", "l2";
|
||||
+ clock-latency = <100000>;
|
||||
+ cpu-supply = <&smb208_s2a>;
|
||||
+ operating-points-v2 = <&opp_table0>;
|
||||
+ voltage-tolerance = <5>;
|
||||
+ cooling-min-state = <0>;
|
||||
+ cooling-max-state = <10>;
|
||||
+ #cooling-cells = <2>;
|
||||
+ cpu-idle-states = <&CPU_SPC>;
|
||||
+ };
|
||||
+
|
||||
+ /* ... */
|
||||
+
|
||||
+ };
|
||||
+
|
||||
+ opp_table0: opp_table0 {
|
||||
+ compatible = "operating-points-v2-kryo-cpu";
|
||||
+ nvmem-cells = <&speedbin_efuse>;
|
||||
+
|
||||
+ opp-384000000 {
|
||||
+ opp-hz = /bits/ 64 <384000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1000000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <925000>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <875000>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <800000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <0>;
|
||||
+ };
|
||||
+
|
||||
+ opp-600000000 {
|
||||
+ opp-hz = /bits/ 64 <600000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1050000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <975000>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <925000>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <850000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-800000000 {
|
||||
+ opp-hz = /bits/ 64 <800000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1100000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1025000>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <995000>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <900000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1150000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1075000>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <1025000>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <950000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1200000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1125000>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <1075000>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <1000000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <2>;
|
||||
+ };
|
||||
+
|
||||
+ opp-1400000000 {
|
||||
+ opp-hz = /bits/ 64 <1400000000>;
|
||||
+ opp-microvolt-speed0-pvs0-v0 = <1250000>;
|
||||
+ opp-microvolt-speed0-pvs1-v0 = <1175000>;
|
||||
+ opp-microvolt-speed0-pvs2-v0 = <1125000>;
|
||||
+ opp-microvolt-speed0-pvs3-v0 = <1050000>;
|
||||
+ opp-supported-hw = <0x1>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ opp_table_l2: opp_table_l2 {
|
||||
+ compatible = "operating-points-v2";
|
||||
+
|
||||
+ opp-384000000 {
|
||||
+ opp-hz = /bits/ 64 <384000000>;
|
||||
+ opp-microvolt = <1100000>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <0>;
|
||||
+ };
|
||||
+ opp-1000000000 {
|
||||
+ opp-hz = /bits/ 64 <1000000000>;
|
||||
+ opp-microvolt = <1100000>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <1>;
|
||||
+ };
|
||||
+ opp-1200000000 {
|
||||
+ opp-hz = /bits/ 64 <1200000000>;
|
||||
+ opp-microvolt = <1150000>;
|
||||
+ clock-latency-ns = <100000>;
|
||||
+ opp-level = <2>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ soc {
|
||||
+ L2: l2-cache {
|
||||
+ compatible = "qcom,krait-cache", "cache";
|
||||
+ cache-level = <2>;
|
||||
+
|
||||
+ clocks = <&kraitcc 4>;
|
||||
+ clock-names = "l2";
|
||||
+ l2-supply = <&smb208_s1a>;
|
||||
+ operating-points-v2 = <&opp_table_l2>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+...
|
||||
@ -0,0 +1,243 @@
|
||||
--- a/drivers/clk/qcom/Makefile
|
||||
+++ b/drivers/clk/qcom/Makefile
|
||||
@@ -15,6 +15,7 @@ clk-qcom-$(CONFIG_KRAIT_CLOCKS) += clk-k
|
||||
clk-qcom-y += clk-hfpll.o
|
||||
clk-qcom-y += reset.o
|
||||
clk-qcom-$(CONFIG_QCOM_GDSC) += gdsc.o
|
||||
+clk-qcom-y += fab_scaling.o
|
||||
|
||||
# Keep alphabetically sorted by config
|
||||
obj-$(CONFIG_APQ_GCC_8084) += gcc-apq8084.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/clk/qcom/fab_scaling.c
|
||||
@@ -0,0 +1,172 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/clk-provider.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/fab_scaling.h>
|
||||
+
|
||||
+struct qcom_fab_scaling_data {
|
||||
+ u32 fab_freq_high;
|
||||
+ u32 fab_freq_nominal;
|
||||
+ u32 cpu_freq_threshold;
|
||||
+ struct clk *apps_fab_clk;
|
||||
+ struct clk *ddr_fab_clk;
|
||||
+};
|
||||
+
|
||||
+static struct qcom_fab_scaling_data *drv_data;
|
||||
+
|
||||
+int scale_fabrics(unsigned long max_cpu_freq)
|
||||
+{
|
||||
+ struct clk *apps_fab_clk = drv_data->apps_fab_clk,
|
||||
+ *ddr_fab_clk = drv_data->ddr_fab_clk;
|
||||
+ unsigned long target_freq, cur_freq;
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Skip fab scaling if the driver is not ready */
|
||||
+ if (!apps_fab_clk || !ddr_fab_clk)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (max_cpu_freq > drv_data->cpu_freq_threshold)
|
||||
+ target_freq = drv_data->fab_freq_high;
|
||||
+ else
|
||||
+ target_freq = drv_data->fab_freq_nominal;
|
||||
+
|
||||
+ cur_freq = clk_get_rate(ddr_fab_clk);
|
||||
+
|
||||
+ if (target_freq != cur_freq) {
|
||||
+ ret = clk_set_rate(apps_fab_clk, target_freq);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ ret = clk_set_rate(ddr_fab_clk, target_freq);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(scale_fabrics);
|
||||
+
|
||||
+static int ipq806x_fab_scaling_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *np = pdev->dev.of_node;
|
||||
+ struct clk *apps_fab_clk, *ddr_fab_clk;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!np)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL);
|
||||
+ if (!drv_data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ if (of_property_read_u32(np, "fab_freq_high", &drv_data->fab_freq_high)) {
|
||||
+ pr_err("FABRICS turbo freq not found. Using defaults...\n");
|
||||
+ drv_data->fab_freq_high = 533000000;
|
||||
+ }
|
||||
+
|
||||
+ if (of_property_read_u32(np, "fab_freq_nominal", &drv_data->fab_freq_nominal)) {
|
||||
+ pr_err("FABRICS nominal freq not found. Using defaults...\n");
|
||||
+ drv_data->fab_freq_nominal = 400000000;
|
||||
+ }
|
||||
+
|
||||
+ if (of_property_read_u32(np, "cpu_freq_threshold", &drv_data->cpu_freq_threshold)) {
|
||||
+ pr_err("FABRICS cpu freq threshold not found. Using defaults...\n");
|
||||
+ drv_data->cpu_freq_threshold = 1000000000;
|
||||
+ }
|
||||
+
|
||||
+ apps_fab_clk = devm_clk_get(&pdev->dev, "apps-fab-clk");
|
||||
+ ret = PTR_ERR_OR_ZERO(apps_fab_clk);
|
||||
+ if (ret) {
|
||||
+ /*
|
||||
+ * If apps fab clk node is present, but clock is not yet
|
||||
+ * registered, we should try defering probe.
|
||||
+ */
|
||||
+ if (ret != -EPROBE_DEFER) {
|
||||
+ pr_err("Failed to get APPS FABRIC clock: %d\n", ret);
|
||||
+ ret = -ENODEV;
|
||||
+ }
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ clk_prepare_enable(apps_fab_clk);
|
||||
+ clk_set_rate(apps_fab_clk, drv_data->fab_freq_high);
|
||||
+ drv_data->apps_fab_clk = apps_fab_clk;
|
||||
+
|
||||
+ ddr_fab_clk = devm_clk_get(&pdev->dev, "ddr-fab-clk");
|
||||
+ ret = PTR_ERR_OR_ZERO(ddr_fab_clk);
|
||||
+ if (ret) {
|
||||
+ /*
|
||||
+ * If ddr fab clk node is present, but clock is not yet
|
||||
+ * registered, we should try defering probe.
|
||||
+ */
|
||||
+ if (ret != -EPROBE_DEFER) {
|
||||
+ pr_err("Failed to get DDR FABRIC clock: %d\n", ret);
|
||||
+ ddr_fab_clk = NULL;
|
||||
+ ret = -ENODEV;
|
||||
+ }
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ clk_prepare_enable(ddr_fab_clk);
|
||||
+ clk_set_rate(ddr_fab_clk, drv_data->fab_freq_high);
|
||||
+ drv_data->ddr_fab_clk = ddr_fab_clk;
|
||||
+
|
||||
+ return 0;
|
||||
+err:
|
||||
+ kfree(drv_data);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int ipq806x_fab_scaling_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ kfree(drv_data);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id fab_scaling_ipq806x_match_table[] = {
|
||||
+ { .compatible = "qcom,fab-scaling" },
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver fab_scaling_ipq806x_driver = {
|
||||
+ .probe = ipq806x_fab_scaling_probe,
|
||||
+ .remove = ipq806x_fab_scaling_remove,
|
||||
+ .driver = {
|
||||
+ .name = "fab-scaling",
|
||||
+ .of_match_table = fab_scaling_ipq806x_match_table,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init fab_scaling_ipq806x_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&fab_scaling_ipq806x_driver);
|
||||
+}
|
||||
+late_initcall(fab_scaling_ipq806x_init);
|
||||
+
|
||||
+static void __exit fab_scaling_ipq806x_exit(void)
|
||||
+{
|
||||
+ platform_driver_unregister(&fab_scaling_ipq806x_driver);
|
||||
+}
|
||||
+module_exit(fab_scaling_ipq806x_exit);
|
||||
--- /dev/null
|
||||
+++ b/include/linux/fab_scaling.h
|
||||
@@ -0,0 +1,31 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+
|
||||
+#ifndef __FAB_SCALING_H
|
||||
+#define __FAB_SCALING_H
|
||||
+
|
||||
+/**
|
||||
+ * scale_fabrics - Scale DDR and APPS FABRICS
|
||||
+ *
|
||||
+ * This function monitors all the registered clocks and does APPS
|
||||
+ * and DDR FABRIC scaling based on the idle frequencies with which
|
||||
+ * it was registered.
|
||||
+ *
|
||||
+ */
|
||||
+int scale_fabrics(unsigned long max_cpu_freq);
|
||||
+
|
||||
+#endif
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-krait.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-krait.c
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/thermal.h>
|
||||
+#include <linux/fab_scaling.h>
|
||||
|
||||
#include "cpufreq-dt.h"
|
||||
|
||||
@@ -68,6 +69,13 @@ static int set_target(struct cpufreq_pol
|
||||
goto l2_scale_fail;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Scale fabrics with max freq across all cores
|
||||
+ */
|
||||
+ ret = scale_fabrics(target_freq);
|
||||
+ if (ret)
|
||||
+ goto l2_scale_fail;
|
||||
+
|
||||
opp = dev_pm_opp_find_level_exact(l2_dev, level);
|
||||
if (IS_ERR(opp)) {
|
||||
dev_err(l2_dev,
|
||||
@ -0,0 +1,240 @@
|
||||
From 6949d651e3be3ebbfedb6bbd5b541cfda6ee58a9 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Wed, 10 Feb 2021 10:40:17 +0100
|
||||
Subject: [PATCH 1/2] mtd: nand: raw: qcom_nandc: add boot_layout_mode support
|
||||
|
||||
ipq806x nand have a special ecc configuration for the boot pages. The
|
||||
use of the non-boot pages configuration on boot pages cause I/O error
|
||||
and can cause broken data written to the nand. Add support for this
|
||||
special configuration if the page to be read/write is in the size of the
|
||||
boot pages set by the dts.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/qcom_nandc.c | 82 +++++++++++++++++++++++++++++--
|
||||
1 file changed, 77 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
+++ b/drivers/mtd/nand/raw/qcom_nandc.c
|
||||
@@ -159,6 +159,11 @@
|
||||
/* NAND_CTRL bits */
|
||||
#define BAM_MODE_EN BIT(0)
|
||||
|
||||
+
|
||||
+#define UD_SIZE_BYTES_MASK (0x3ff << UD_SIZE_BYTES)
|
||||
+#define SPARE_SIZE_BYTES_MASK (0xf << SPARE_SIZE_BYTES)
|
||||
+#define ECC_NUM_DATA_BYTES_MASK (0x3ff << ECC_NUM_DATA_BYTES)
|
||||
+
|
||||
/*
|
||||
* the NAND controller performs reads/writes with ECC in 516 byte chunks.
|
||||
* the driver calls the chunks 'step' or 'codeword' interchangeably
|
||||
@@ -430,6 +435,13 @@ struct qcom_nand_controller {
|
||||
* @cfg0, cfg1, cfg0_raw..: NANDc register configurations needed for
|
||||
* ecc/non-ecc mode for the current nand flash
|
||||
* device
|
||||
+ *
|
||||
+ * @boot_pages_conf: keep track of the current ecc configuration used by
|
||||
+ * the driver for read/write operation. (boot pages
|
||||
+ * have different configuration than normal page)
|
||||
+ * @boot_pages: number of pages starting from 0 used as boot pages
|
||||
+ * where the driver will use the boot pages ecc
|
||||
+ * configuration for read/write operation
|
||||
*/
|
||||
struct qcom_nand_host {
|
||||
struct nand_chip chip;
|
||||
@@ -452,6 +464,9 @@ struct qcom_nand_host {
|
||||
u32 ecc_bch_cfg;
|
||||
u32 clrflashstatus;
|
||||
u32 clrreadstatus;
|
||||
+
|
||||
+ bool boot_pages_conf;
|
||||
+ u32 boot_pages;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -475,13 +490,15 @@ struct qcom_nand_host {
|
||||
* @is_bam - whether NAND controller is using BAM
|
||||
* @is_qpic - whether NAND CTRL is part of qpic IP
|
||||
* @qpic_v2 - flag to indicate QPIC IP version 2
|
||||
+ * @has_boot_pages - whether NAND has different ecc settings for boot pages
|
||||
* @dev_cmd_reg_start - NAND_DEV_CMD_* registers starting offset
|
||||
*/
|
||||
struct qcom_nandc_props {
|
||||
u32 ecc_modes;
|
||||
bool is_bam;
|
||||
bool is_qpic;
|
||||
bool qpic_v2;
|
||||
+ bool has_boot_pages;
|
||||
u32 dev_cmd_reg_start;
|
||||
};
|
||||
|
||||
@@ -1604,7 +1621,7 @@ qcom_nandc_read_cw_raw(struct mtd_info *
|
||||
data_size1 = mtd->writesize - host->cw_size * (ecc->steps - 1);
|
||||
oob_size1 = host->bbm_size;
|
||||
|
||||
- if (qcom_nandc_is_last_cw(ecc, cw)) {
|
||||
+ if (qcom_nandc_is_last_cw(ecc, cw) && !host->boot_pages_conf) {
|
||||
data_size2 = ecc->size - data_size1 -
|
||||
((ecc->steps - 1) * 4);
|
||||
oob_size2 = (ecc->steps * 4) + host->ecc_bytes_hw +
|
||||
@@ -1685,7 +1702,7 @@ check_for_erased_page(struct qcom_nand_h
|
||||
}
|
||||
|
||||
for_each_set_bit(cw, &uncorrectable_cws, ecc->steps) {
|
||||
- if (qcom_nandc_is_last_cw(ecc, cw)) {
|
||||
+ if (qcom_nandc_is_last_cw(ecc, cw) && !host->boot_pages_conf) {
|
||||
data_size = ecc->size - ((ecc->steps - 1) * 4);
|
||||
oob_size = (ecc->steps * 4) + host->ecc_bytes_hw;
|
||||
} else {
|
||||
@@ -1844,7 +1861,7 @@ static int read_page_ecc(struct qcom_nan
|
||||
for (i = 0; i < ecc->steps; i++) {
|
||||
int data_size, oob_size;
|
||||
|
||||
- if (qcom_nandc_is_last_cw(ecc, i)) {
|
||||
+ if (qcom_nandc_is_last_cw(ecc, i) && !host->boot_pages_conf) {
|
||||
data_size = ecc->size - ((ecc->steps - 1) << 2);
|
||||
oob_size = (ecc->steps << 2) + host->ecc_bytes_hw +
|
||||
host->spare_bytes;
|
||||
@@ -1941,6 +1958,30 @@ static int copy_last_cw(struct qcom_nand
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static void
|
||||
+check_boot_pages_conf(struct qcom_nand_host *host, int page)
|
||||
+{
|
||||
+ bool boot_pages_conf = page < host->boot_pages;
|
||||
+
|
||||
+ /* Skip conf write if we are already in the correct mode */
|
||||
+ if (boot_pages_conf != host->boot_pages_conf) {
|
||||
+ host->boot_pages_conf = boot_pages_conf;
|
||||
+
|
||||
+ host->cw_data = boot_pages_conf ? 512 : 516;
|
||||
+ host->spare_bytes = host->cw_size - host->ecc_bytes_hw -
|
||||
+ host->bbm_size - host->cw_data;
|
||||
+
|
||||
+ host->cfg0 &= ~(SPARE_SIZE_BYTES_MASK | UD_SIZE_BYTES_MASK);
|
||||
+ host->cfg0 |= host->spare_bytes << SPARE_SIZE_BYTES |
|
||||
+ host->cw_data << UD_SIZE_BYTES;
|
||||
+
|
||||
+ host->ecc_bch_cfg &= ~ECC_NUM_DATA_BYTES_MASK;
|
||||
+ host->ecc_bch_cfg |= host->cw_data << ECC_NUM_DATA_BYTES;
|
||||
+ host->ecc_buf_cfg = (boot_pages_conf ? 0x1ff : 0x203) <<
|
||||
+ NUM_STEPS;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* implements ecc->read_page() */
|
||||
static int qcom_nandc_read_page(struct nand_chip *chip, uint8_t *buf,
|
||||
int oob_required, int page)
|
||||
@@ -1949,6 +1990,9 @@ static int qcom_nandc_read_page(struct n
|
||||
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||
u8 *data_buf, *oob_buf = NULL;
|
||||
|
||||
+ if (host->boot_pages)
|
||||
+ check_boot_pages_conf(host, page);
|
||||
+
|
||||
nand_read_page_op(chip, page, 0, NULL, 0);
|
||||
data_buf = buf;
|
||||
oob_buf = oob_required ? chip->oob_poi : NULL;
|
||||
@@ -1968,6 +2012,9 @@ static int qcom_nandc_read_page_raw(stru
|
||||
int cw, ret;
|
||||
u8 *data_buf = buf, *oob_buf = chip->oob_poi;
|
||||
|
||||
+ if (host->boot_pages)
|
||||
+ check_boot_pages_conf(host, page);
|
||||
+
|
||||
for (cw = 0; cw < ecc->steps; cw++) {
|
||||
ret = qcom_nandc_read_cw_raw(mtd, chip, data_buf, oob_buf,
|
||||
page, cw);
|
||||
@@ -1988,6 +2035,9 @@ static int qcom_nandc_read_oob(struct na
|
||||
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
||||
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
||||
|
||||
+ if (host->boot_pages)
|
||||
+ check_boot_pages_conf(host, page);
|
||||
+
|
||||
clear_read_regs(nandc);
|
||||
clear_bam_transaction(nandc);
|
||||
|
||||
@@ -2008,6 +2058,9 @@ static int qcom_nandc_write_page(struct
|
||||
u8 *data_buf, *oob_buf;
|
||||
int i, ret;
|
||||
|
||||
+ if (host->boot_pages)
|
||||
+ check_boot_pages_conf(host, page);
|
||||
+
|
||||
nand_prog_page_begin_op(chip, page, 0, NULL, 0);
|
||||
|
||||
clear_read_regs(nandc);
|
||||
@@ -2023,7 +2076,7 @@ static int qcom_nandc_write_page(struct
|
||||
for (i = 0; i < ecc->steps; i++) {
|
||||
int data_size, oob_size;
|
||||
|
||||
- if (qcom_nandc_is_last_cw(ecc, i)) {
|
||||
+ if (qcom_nandc_is_last_cw(ecc, i) && !host->boot_pages_conf) {
|
||||
data_size = ecc->size - ((ecc->steps - 1) << 2);
|
||||
oob_size = (ecc->steps << 2) + host->ecc_bytes_hw +
|
||||
host->spare_bytes;
|
||||
@@ -2080,6 +2133,9 @@ static int qcom_nandc_write_page_raw(str
|
||||
u8 *data_buf, *oob_buf;
|
||||
int i, ret;
|
||||
|
||||
+ if (host->boot_pages)
|
||||
+ check_boot_pages_conf(host, page);
|
||||
+
|
||||
nand_prog_page_begin_op(chip, page, 0, NULL, 0);
|
||||
clear_read_regs(nandc);
|
||||
clear_bam_transaction(nandc);
|
||||
@@ -2098,7 +2154,7 @@ static int qcom_nandc_write_page_raw(str
|
||||
data_size1 = mtd->writesize - host->cw_size * (ecc->steps - 1);
|
||||
oob_size1 = host->bbm_size;
|
||||
|
||||
- if (qcom_nandc_is_last_cw(ecc, i)) {
|
||||
+ if (qcom_nandc_is_last_cw(ecc, i) && !host->boot_pages_conf) {
|
||||
data_size2 = ecc->size - data_size1 -
|
||||
((ecc->steps - 1) << 2);
|
||||
oob_size2 = (ecc->steps << 2) + host->ecc_bytes_hw +
|
||||
@@ -2158,6 +2214,9 @@ static int qcom_nandc_write_oob(struct n
|
||||
int data_size, oob_size;
|
||||
int ret;
|
||||
|
||||
+ if (host->boot_pages)
|
||||
+ check_boot_pages_conf(host, page);
|
||||
+
|
||||
host->use_ecc = true;
|
||||
clear_bam_transaction(nandc);
|
||||
|
||||
@@ -2806,6 +2865,7 @@ static int qcom_nand_host_init_and_regis
|
||||
struct nand_chip *chip = &host->chip;
|
||||
struct mtd_info *mtd = nand_to_mtd(chip);
|
||||
struct device *dev = nandc->dev;
|
||||
+ u32 boot_pages_size;
|
||||
int ret;
|
||||
|
||||
ret = of_property_read_u32(dn, "reg", &host->cs);
|
||||
@@ -2866,6 +2926,17 @@ static int qcom_nand_host_init_and_regis
|
||||
if (ret)
|
||||
nand_cleanup(chip);
|
||||
|
||||
+ if (nandc->props->has_boot_pages &&
|
||||
+ of_property_read_bool(dn, "nand-is-boot-medium")) {
|
||||
+ ret = of_property_read_u32(dn, "qcom,boot_pages_size",
|
||||
+ &boot_pages_size);
|
||||
+ if (ret)
|
||||
+ dev_warn(dev, "can't get boot pages size");
|
||||
+ else
|
||||
+ /* Convert size to nand pages */
|
||||
+ host->boot_pages = boot_pages_size / mtd->writesize;
|
||||
+ }
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3032,6 +3103,7 @@ static int qcom_nandc_remove(struct plat
|
||||
static const struct qcom_nandc_props ipq806x_nandc_props = {
|
||||
.ecc_modes = (ECC_RS_4BIT | ECC_BCH_8BIT),
|
||||
.is_bam = false,
|
||||
+ .has_boot_pages = true,
|
||||
.dev_cmd_reg_start = 0x0,
|
||||
};
|
||||
|
||||
@ -0,0 +1,40 @@
|
||||
From 6fb003a7a117f97a35b078ba726c84adeae29c4c Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Wed, 10 Feb 2021 10:54:19 +0100
|
||||
Subject: [PATCH 2/2] Documentation: devicetree: mtd: qcom_nandc: document
|
||||
qcom,boot_layout_size binding
|
||||
|
||||
Document new qcom,boot_layout_size binding used to apply special
|
||||
read/write confituation to boots partitions.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/mtd/qcom,nandc.yaml | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/mtd/qcom,nandc.yaml
|
||||
+++ b/Documentation/devicetree/bindings/mtd/qcom,nandc.yaml
|
||||
@@ -77,6 +77,14 @@ Optional properties:
|
||||
description:
|
||||
Must contain the ADM data type CRCI block instance number
|
||||
specified for the NAND controller on the given platform
|
||||
+
|
||||
+ qcom,boot_pages_size:
|
||||
+ description:
|
||||
+ Should contain the size of the total boot partitions
|
||||
+ where the boot layout read/write specific configuration
|
||||
+ should be used. The boot layout is considered from the
|
||||
+ start of the nand to the value set in this binding.
|
||||
+ Only used in combination with 'nand-is-boot-medium'.
|
||||
|
||||
- if:
|
||||
properties:
|
||||
@@ -135,6 +135,9 @@ nand-controller@1ac00000 {
|
||||
nand-ecc-strength = <4>;
|
||||
nand-bus-width = <8>;
|
||||
|
||||
+ nand-is-boot-medium;
|
||||
+ qcom,boot_pages_size: <0x58a0000>;
|
||||
+
|
||||
partitions {
|
||||
compatible = "fixed-partitions";
|
||||
@ -0,0 +1,83 @@
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
|
||||
@@ -64,6 +64,17 @@
|
||||
#define NSS_COMMON_CLK_DIV_SGMII_100 4
|
||||
#define NSS_COMMON_CLK_DIV_SGMII_10 49
|
||||
|
||||
+#define QSGMII_PCS_ALL_CH_CTL 0x80
|
||||
+#define QSGMII_PCS_CH_SPEED_FORCE 0x2
|
||||
+#define QSGMII_PCS_CH_SPEED_10 0x0
|
||||
+#define QSGMII_PCS_CH_SPEED_100 0x4
|
||||
+#define QSGMII_PCS_CH_SPEED_1000 0x8
|
||||
+#define QSGMII_PCS_CH_SPEED_MASK (QSGMII_PCS_CH_SPEED_FORCE | \
|
||||
+ QSGMII_PCS_CH_SPEED_10 | \
|
||||
+ QSGMII_PCS_CH_SPEED_100 | \
|
||||
+ QSGMII_PCS_CH_SPEED_1000)
|
||||
+#define QSGMII_PCS_CH_SPEED_SHIFT(x) (x * 4)
|
||||
+
|
||||
#define QSGMII_PCS_CAL_LCKDT_CTL 0x120
|
||||
#define QSGMII_PCS_CAL_LCKDT_CTL_RST BIT(19)
|
||||
|
||||
@@ -242,6 +253,36 @@ static void ipq806x_gmac_fix_mac_speed(v
|
||||
ipq806x_gmac_set_speed(gmac, speed);
|
||||
}
|
||||
|
||||
+static int
|
||||
+ipq806x_gmac_get_qsgmii_pcs_speed_val(struct platform_device *pdev) {
|
||||
+ struct device_node *fixed_link_node;
|
||||
+ int rv;
|
||||
+ int fixed_link_speed;
|
||||
+
|
||||
+ if (!of_phy_is_fixed_link(pdev->dev.of_node))
|
||||
+ return 0;
|
||||
+
|
||||
+ fixed_link_node = of_get_child_by_name(pdev->dev.of_node, "fixed-link");
|
||||
+ if (!fixed_link_node)
|
||||
+ return -1;
|
||||
+
|
||||
+ rv = of_property_read_u32(fixed_link_node, "speed", &fixed_link_speed);
|
||||
+ of_node_put(fixed_link_node);
|
||||
+ if (rv)
|
||||
+ return -1;
|
||||
+
|
||||
+ switch (fixed_link_speed) {
|
||||
+ case SPEED_1000:
|
||||
+ return QSGMII_PCS_CH_SPEED_FORCE | QSGMII_PCS_CH_SPEED_1000;
|
||||
+ case SPEED_100:
|
||||
+ return QSGMII_PCS_CH_SPEED_FORCE | QSGMII_PCS_CH_SPEED_100;
|
||||
+ case SPEED_10:
|
||||
+ return QSGMII_PCS_CH_SPEED_FORCE | QSGMII_PCS_CH_SPEED_10;
|
||||
+ }
|
||||
+
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
static int ipq806x_gmac_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct plat_stmmacenet_data *plat_dat;
|
||||
@@ -250,6 +291,7 @@ static int ipq806x_gmac_probe(struct pla
|
||||
struct ipq806x_gmac *gmac;
|
||||
int val;
|
||||
int err;
|
||||
+ int qsgmii_pcs_speed;
|
||||
|
||||
val = stmmac_get_platform_resources(pdev, &stmmac_res);
|
||||
if (val)
|
||||
@@ -339,6 +381,17 @@ static int ipq806x_gmac_probe(struct pla
|
||||
0x1ul << QSGMII_PHY_RX_INPUT_EQU_OFFSET |
|
||||
0x2ul << QSGMII_PHY_CDR_PI_SLEW_OFFSET |
|
||||
0xCul << QSGMII_PHY_TX_DRV_AMP_OFFSET);
|
||||
+
|
||||
+ qsgmii_pcs_speed = ipq806x_gmac_get_qsgmii_pcs_speed_val(pdev);
|
||||
+ if (qsgmii_pcs_speed != -1) {
|
||||
+ regmap_update_bits(
|
||||
+ gmac->qsgmii_csr,
|
||||
+ QSGMII_PCS_ALL_CH_CTL,
|
||||
+ QSGMII_PCS_CH_SPEED_MASK <<
|
||||
+ QSGMII_PCS_CH_SPEED_SHIFT(gmac->id),
|
||||
+ qsgmii_pcs_speed <<
|
||||
+ QSGMII_PCS_CH_SPEED_SHIFT(gmac->id));
|
||||
+ }
|
||||
}
|
||||
|
||||
plat_dat->has_gmac = true;
|
||||
@ -0,0 +1,25 @@
|
||||
From 5001f2e1a325b68dbf225bd17f69a4d3d975cca5 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <john@phrozen.org>
|
||||
Date: Thu, 9 Mar 2017 09:31:44 +0100
|
||||
Subject: [PATCH 61/69] mtd: "rootfs" conflicts with OpenWrt auto mounting
|
||||
|
||||
Signed-off-by: John Crispin <john@phrozen.org>
|
||||
---
|
||||
drivers/mtd/mtdpart.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -139,7 +139,11 @@
|
||||
|
||||
/* allocate the partition structure */
|
||||
child = kzalloc(sizeof(*child), GFP_KERNEL);
|
||||
+ /* "rootfs" conflicts with OpenWrt auto mounting */
|
||||
+ if (mtd_type_is_nand(parent) && !strcmp(part->name, "rootfs"))
|
||||
+ name = "ubi";
|
||||
+ else
|
||||
+ name = kstrdup(part->name, GFP_KERNEL);
|
||||
- name = kstrdup(part->name, GFP_KERNEL);
|
||||
if (!name || !child) {
|
||||
printk(KERN_ERR"memory allocation error while creating partitions for \"%s\"\n",
|
||||
parent->name);
|
||||
@ -0,0 +1,46 @@
|
||||
From 84909e85881d67244240c9f40974ce12a51e3886 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Tue, 11 May 2021 23:09:45 +0200
|
||||
Subject: [PATCH] ARM: dts: qcom: reduce pci IO size to 64K
|
||||
|
||||
The current value is probably a typo and is actually uncommon to find
|
||||
1MB IO space even on a x86 arch. Also with recent changes to the pci
|
||||
driver, pci1 and pci2 now fails to function as any connected device
|
||||
fails any reg read/write. Reduce this to 64K as it should be more than
|
||||
enough and 3 * 64K of total IO space doesn't exceed the IO_SPACE_LIMIT
|
||||
hardcoded for the ARM arch.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/qcom-ipq8064.dtsi | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
@@ -1163,7 +1163,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
- ranges = <0x81000000 0 0x0fe00000 0x0fe00000 0 0x00100000 /* downstream I/O */
|
||||
+ ranges = <0x81000000 0 0x0fe00000 0x0fe00000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x08000000 0x08000000 0 0x07e00000>; /* non-prefetchable memory */
|
||||
|
||||
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@@ -1214,7 +1214,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
- ranges = <0x81000000 0 0x31e00000 0x31e00000 0 0x00100000 /* downstream I/O */
|
||||
+ ranges = <0x81000000 0 0x31e00000 0x31e00000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x2e000000 0x2e000000 0 0x03e00000>; /* non-prefetchable memory */
|
||||
|
||||
interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@@ -1265,7 +1265,7 @@
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
- ranges = <0x81000000 0 0x35e00000 0x35e00000 0 0x00100000 /* downstream I/O */
|
||||
+ ranges = <0x81000000 0 0x35e00000 0x35e00000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x32000000 0x32000000 0 0x03e00000>; /* non-prefetchable memory */
|
||||
|
||||
interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@ -0,0 +1,41 @@
|
||||
From 8f32d48a309246a80bdca505968085a484d54408 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Mon, 19 Apr 2021 03:01:53 +0200
|
||||
Subject: [thermal-next PATCH v2 1/2] thermal: qcom: tsens: init debugfs only with
|
||||
successful probe
|
||||
|
||||
calibrate and tsens_register can fail or PROBE_DEFER. This will cause a
|
||||
double or a wrong init of the debugfs information. Init debugfs only
|
||||
with successful probe fixing warning about directory already present.
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Acked-by: Thara Gopinath <thara.gopinath@linaro.org>
|
||||
---
|
||||
drivers/thermal/qcom/tsens.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/thermal/qcom/tsens.c
|
||||
+++ b/drivers/thermal/qcom/tsens.c
|
||||
@@ -918,8 +918,6 @@ int __init init_common(struct tsens_priv
|
||||
if (tsens_version(priv) >= VER_0_1)
|
||||
tsens_enable_irq(priv);
|
||||
|
||||
- tsens_debug_init(op);
|
||||
-
|
||||
err_put_device:
|
||||
put_device(&op->dev);
|
||||
return ret;
|
||||
@@ -1155,7 +1153,12 @@ static int tsens_probe(struct platform_d
|
||||
}
|
||||
}
|
||||
|
||||
- return tsens_register(priv);
|
||||
+ ret = tsens_register(priv);
|
||||
+
|
||||
+ if (!ret)
|
||||
+ tsens_debug_init(pdev);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int tsens_remove(struct platform_device *pdev)
|
||||
@ -0,0 +1,54 @@
|
||||
From 4204f22060f7a5d42c6ccb4d4c25a6a875571099 Mon Sep 17 00:00:00 2001
|
||||
From: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Date: Mon, 19 Apr 2021 03:08:37 +0200
|
||||
Subject: [thermal-next PATCH v2 2/2] thermal: qcom: tsens: simplify debugfs init
|
||||
function
|
||||
|
||||
Simplify debugfs init function.
|
||||
- Add check for existing dev directory.
|
||||
- Fix wrong version in dbg_version_show (with version 0.0.0, 0.1.0 was
|
||||
incorrectly reported)
|
||||
|
||||
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
Reviewed-by: Thara Gopinath <thara.gopinath@linaro.org>
|
||||
---
|
||||
drivers/thermal/qcom/tsens.c | 16 +++++++---------
|
||||
1 file changed, 7 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/thermal/qcom/tsens.c
|
||||
+++ b/drivers/thermal/qcom/tsens.c
|
||||
@@ -692,7 +692,7 @@ static int dbg_version_show(struct seq_f
|
||||
return ret;
|
||||
seq_printf(s, "%d.%d.%d\n", maj_ver, min_ver, step_ver);
|
||||
} else {
|
||||
- seq_puts(s, "0.1.0\n");
|
||||
+ seq_printf(s, "0.%d.0\n", priv->feat->ver_major);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -704,21 +704,17 @@ DEFINE_SHOW_ATTRIBUTE(dbg_sensors);
|
||||
static void tsens_debug_init(struct platform_device *pdev)
|
||||
{
|
||||
struct tsens_priv *priv = platform_get_drvdata(pdev);
|
||||
- struct dentry *root, *file;
|
||||
|
||||
- root = debugfs_lookup("tsens", NULL);
|
||||
- if (!root)
|
||||
+ priv->debug_root = debugfs_lookup("tsens", NULL);
|
||||
+ if (!priv->debug_root)
|
||||
priv->debug_root = debugfs_create_dir("tsens", NULL);
|
||||
- else
|
||||
- priv->debug_root = root;
|
||||
|
||||
- file = debugfs_lookup("version", priv->debug_root);
|
||||
- if (!file)
|
||||
+ if (!debugfs_lookup("version", priv->debug_root))
|
||||
debugfs_create_file("version", 0444, priv->debug_root,
|
||||
pdev, &dbg_version_fops);
|
||||
|
||||
/* A directory for each instance of the TSENS IP */
|
||||
- priv->debug = debugfs_create_dir(dev_name(&pdev->dev), priv->debug_root);
|
||||
+ priv->debug = debugfs_lookup(dev_name(&pdev->dev), priv->debug_root);
|
||||
debugfs_create_file("sensors", 0444, priv->debug, pdev, &dbg_sensors_fops);
|
||||
}
|
||||
#else
|
||||
@ -0,0 +1,121 @@
|
||||
From: Christian Lamparter <chunkeey@googlemail.com>
|
||||
Subject: SoC: add qualcomm syscon
|
||||
--- a/drivers/soc/qcom/Makefile
|
||||
+++ b/drivers/soc/qcom/Makefile
|
||||
@@ -21,6 +21,7 @@ obj-$(CONFIG_QCOM_SMP2P) += smp2p.o
|
||||
obj-$(CONFIG_QCOM_SMSM) += smsm.o
|
||||
obj-$(CONFIG_QCOM_SOCINFO) += socinfo.o
|
||||
obj-$(CONFIG_QCOM_WCNSS_CTRL) += wcnss_ctrl.o
|
||||
+obj-$(CONFIG_QCOM_TCSR) += qcom_tcsr.o
|
||||
obj-$(CONFIG_QCOM_APR) += apr.o
|
||||
obj-$(CONFIG_QCOM_LLCC) += llcc-qcom.o
|
||||
obj-$(CONFIG_QCOM_RPMHPD) += rpmhpd.o
|
||||
--- a/drivers/soc/qcom/Kconfig
|
||||
+++ b/drivers/soc/qcom/Kconfig
|
||||
@@ -189,6 +189,13 @@ config QCOM_SOCINFO
|
||||
Say yes here to support the Qualcomm socinfo driver, providing
|
||||
information about the SoC to user space.
|
||||
|
||||
+config QCOM_TCSR
|
||||
+ tristate "QCOM Top Control and Status Registers"
|
||||
+ depends on ARCH_QCOM
|
||||
+ help
|
||||
+ Say y here to enable TCSR support. The TCSR provides control
|
||||
+ functions for various peripherals.
|
||||
+
|
||||
config QCOM_WCNSS_CTRL
|
||||
tristate "Qualcomm WCNSS control driver"
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/qcom/qcom_tcsr.c
|
||||
@@ -0,0 +1,64 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2014, The Linux foundation. All rights reserved.
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License rev 2 and
|
||||
+ * only rev 2 as published by the free Software foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or fITNESS fOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#define TCSR_USB_PORT_SEL 0xb0
|
||||
+
|
||||
+static int tcsr_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct resource *res;
|
||||
+ const struct device_node *node = pdev->dev.of_node;
|
||||
+ void __iomem *base;
|
||||
+ u32 val;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ base = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(base))
|
||||
+ return PTR_ERR(base);
|
||||
+
|
||||
+ if (!of_property_read_u32(node, "qcom,usb-ctrl-select", &val)) {
|
||||
+ dev_err(&pdev->dev, "setting usb port select = %d\n", val);
|
||||
+ writel(val, base + TCSR_USB_PORT_SEL);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id tcsr_dt_match[] = {
|
||||
+ { .compatible = "qcom,tcsr", },
|
||||
+ { },
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, tcsr_dt_match);
|
||||
+
|
||||
+static struct platform_driver tcsr_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "tcsr",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = tcsr_dt_match,
|
||||
+ },
|
||||
+ .probe = tcsr_probe,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(tcsr_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>");
|
||||
+MODULE_DESCRIPTION("QCOM TCSR driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/soc/qcom,tcsr.h
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 and
|
||||
+ * only version 2 as published by the Free Software Foundation.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+#ifndef __DT_BINDINGS_QCOM_TCSR_H
|
||||
+#define __DT_BINDINGS_QCOM_TCSR_H
|
||||
+
|
||||
+#define TCSR_USB_SELECT_USB3_P0 0x1
|
||||
+#define TCSR_USB_SELECT_USB3_P1 0x2
|
||||
+#define TCSR_USB_SELECT_USB3_DUAL 0x3
|
||||
+
|
||||
+/* TCSR A/B REG */
|
||||
+#define IPQ806X_TCSR_REG_A_ADM_CRCI_MUX_SEL 0
|
||||
+#define IPQ806X_TCSR_REG_B_ADM_CRCI_MUX_SEL 1
|
||||
+
|
||||
+#endif
|
||||
44
target/linux/ipq806x/patches-5.15/851-add-gsbi1-dts.patch
Normal file
44
target/linux/ipq806x/patches-5.15/851-add-gsbi1-dts.patch
Normal file
@ -0,0 +1,44 @@
|
||||
--- a/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq8064.dtsi
|
||||
@@ -689,6 +689,41 @@
|
||||
reg = <0x12100000 0x10000>;
|
||||
};
|
||||
|
||||
+ gsbi1: gsbi@12440000 {
|
||||
+ compatible = "qcom,gsbi-v1.0.0";
|
||||
+ cell-index = <1>;
|
||||
+ reg = <0x12440000 0x100>;
|
||||
+ clocks = <&gcc GSBI1_H_CLK>;
|
||||
+ clock-names = "iface";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges;
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ syscon-tcsr = <&tcsr>;
|
||||
+
|
||||
+ gsbi1_serial: serial@12450000 {
|
||||
+ compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm";
|
||||
+ reg = <0x12450000 0x100>,
|
||||
+ <0x12400000 0x03>;
|
||||
+ interrupts = <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GSBI1_UART_CLK>, <&gcc GSBI1_H_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ gsbi1_i2c: i2c@12460000 {
|
||||
+ compatible = "qcom,i2c-qup-v1.1.1";
|
||||
+ reg = <0x12460000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&gcc GSBI1_QUP_CLK>, <&gcc GSBI1_H_CLK>;
|
||||
+ clock-names = "core", "iface";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
gsbi2: gsbi@12480000 {
|
||||
compatible = "qcom,gsbi-v1.0.0";
|
||||
cell-index = <2>;
|
||||
@ -11,6 +11,7 @@ INITRAMFS_EXTRA_FILES:=
|
||||
FEATURES:=cpiogz ext4 ramdisk squashfs targz
|
||||
|
||||
KERNEL_PATCHVER:=5.10
|
||||
KERNEL_TESTING_PATCHVER:=5.15
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
|
||||
628
target/linux/mediatek/mt7623/config-5.15
Normal file
628
target/linux/mediatek/mt7623/config-5.15
Normal file
@ -0,0 +1,628 @@
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
# CONFIG_AIO is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MEDIATEK=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
# CONFIG_ARM_ATAG_DTB_COMPAT is not set
|
||||
CONFIG_ARM_CPU_SUSPEND=y
|
||||
# CONFIG_ARM_CPU_TOPOLOGY is not set
|
||||
CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
|
||||
CONFIG_ARM_DMA_USE_IOMMU=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
CONFIG_ARM_MEDIATEK_CPUFREQ=y
|
||||
CONFIG_ARM_PATCH_IDIV=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
# CONFIG_ARM_SMMU is not set
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_THUMBEE=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||
CONFIG_BACKLIGHT_GPIO=y
|
||||
CONFIG_BACKLIGHT_LED=y
|
||||
CONFIG_BACKLIGHT_PWM=y
|
||||
CONFIG_BINARY_PRINTF=y
|
||||
CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BLK_PM=y
|
||||
CONFIG_BOUNCE=y
|
||||
# CONFIG_CACHE_L2X0 is not set
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="earlyprintk console=ttyS0,115200 rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_FROM_BOOTLOADER=y
|
||||
CONFIG_CMDLINE_PARTITION=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_MEDIATEK=y
|
||||
CONFIG_COMMON_CLK_MT2701=y
|
||||
CONFIG_COMMON_CLK_MT2701_AUDSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_BDPSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_ETHSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_G3DSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_HIFSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_IMGSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_MMSYS=y
|
||||
CONFIG_COMMON_CLK_MT2701_VDECSYS=y
|
||||
# CONFIG_COMMON_CLK_MT7622 is not set
|
||||
# CONFIG_COMMON_CLK_MT7629 is not set
|
||||
# CONFIG_COMMON_CLK_MT8135 is not set
|
||||
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||
CONFIG_COMMON_CLK_MT8516=y
|
||||
# CONFIG_COMMON_CLK_MT8516_AUDSYS is not set
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
CONFIG_COREDUMP=y
|
||||
# CONFIG_CPUFREQ_DT is not set
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_ATTR_SET=y
|
||||
CONFIG_CPU_FREQ_GOV_COMMON=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_SPECTRE=y
|
||||
CONFIG_CPU_THUMB_CAPABLE=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
# CONFIG_CRC32_SARWATE is not set
|
||||
CONFIG_CRC32_SLICEBY8=y
|
||||
CONFIG_CROSS_MEMORY_ATTACH=y
|
||||
CONFIG_CRYPTO_CRC32=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_DRBG=y
|
||||
CONFIG_CRYPTO_DRBG_HMAC=y
|
||||
CONFIG_CRYPTO_DRBG_MENU=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_HW=y
|
||||
CONFIG_CRYPTO_JITTERENTROPY=y
|
||||
CONFIG_CRYPTO_LIB_SHA256=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_RNG=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_RNG_DEFAULT=y
|
||||
CONFIG_CRYPTO_SEQIV=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_SHA256=y
|
||||
CONFIG_CRYPTO_SHA512=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_ALIGN_RODATA=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_GPIO=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="debug/8250.S"
|
||||
CONFIG_DEBUG_MISC=y
|
||||
CONFIG_DEBUG_MT6589_UART0=y
|
||||
# CONFIG_DEBUG_MT8127_UART0 is not set
|
||||
# CONFIG_DEBUG_MT8135_UART3 is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_UART_8250=y
|
||||
CONFIG_DEBUG_UART_8250_SHIFT=2
|
||||
CONFIG_DEBUG_UART_PHYS=0x11004000
|
||||
CONFIG_DEBUG_UART_VIRT=0xf1004000
|
||||
CONFIG_DEBUG_UNCOMPRESS=y
|
||||
# CONFIG_DEVFREQ_GOV_PASSIVE is not set
|
||||
# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set
|
||||
# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
|
||||
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
|
||||
# CONFIG_DEVFREQ_GOV_USERSPACE is not set
|
||||
# CONFIG_DEVFREQ_THERMAL is not set
|
||||
CONFIG_DIMLIB=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_OF=y
|
||||
CONFIG_DMA_OPS=y
|
||||
CONFIG_DMA_REMAP=y
|
||||
CONFIG_DMA_SHARED_BUFFER=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_BRIDGE=y
|
||||
CONFIG_DRM_DISPLAY_CONNECTOR=y
|
||||
CONFIG_DRM_FBDEV_EMULATION=y
|
||||
CONFIG_DRM_FBDEV_OVERALLOC=100
|
||||
CONFIG_DRM_GEM_CMA_HELPER=y
|
||||
CONFIG_DRM_GEM_SHMEM_HELPER=y
|
||||
CONFIG_DRM_KMS_HELPER=y
|
||||
CONFIG_DRM_LIMA=y
|
||||
CONFIG_DRM_LVDS_CODEC=y
|
||||
CONFIG_DRM_MEDIATEK=y
|
||||
CONFIG_DRM_MEDIATEK_HDMI=y
|
||||
CONFIG_DRM_MIPI_DSI=y
|
||||
CONFIG_DRM_PANEL=y
|
||||
CONFIG_DRM_PANEL_BRIDGE=y
|
||||
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
|
||||
CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y
|
||||
CONFIG_DRM_SCHED=y
|
||||
CONFIG_DRM_SIMPLE_BRIDGE=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_EINT_MTK=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXTCON=y
|
||||
CONFIG_F2FS_FS=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_CMDLINE=y
|
||||
CONFIG_FB_DEFERRED_IO=y
|
||||
CONFIG_FB_SYS_COPYAREA=y
|
||||
CONFIG_FB_SYS_FILLRECT=y
|
||||
CONFIG_FB_SYS_FOPS=y
|
||||
CONFIG_FB_SYS_IMAGEBLIT=y
|
||||
CONFIG_FIT_PARTITION=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_SUPPORT=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||
CONFIG_FREEZER=y
|
||||
CONFIG_FS_IOMAP=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_CACHE=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_CPU_VULNERABILITIES=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_MIGRATION=y
|
||||
CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GENERIC_VDSO_32=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GRO_CELLS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HDMI=y
|
||||
CONFIG_HID=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_HIGHPTE=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_HWMON=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_MTK=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_ALGOBIT=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_MT65XX=y
|
||||
CONFIG_ICPLUS_PHY=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_INPUT=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_INPUT_JOYSTICK=y
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
CONFIG_INPUT_TABLET=y
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_IOMMU_API=y
|
||||
# CONFIG_IOMMU_DEBUGFS is not set
|
||||
# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set
|
||||
CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
|
||||
# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
|
||||
CONFIG_IOMMU_IO_PGTABLE=y
|
||||
CONFIG_IOMMU_IO_PGTABLE_ARMV7S=y
|
||||
# CONFIG_IOMMU_IO_PGTABLE_ARMV7S_SELFTEST is not set
|
||||
# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set
|
||||
CONFIG_IOMMU_SUPPORT=y
|
||||
CONFIG_IO_URING=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_JBD2=y
|
||||
# CONFIG_JOYSTICK_A3D is not set
|
||||
# CONFIG_JOYSTICK_ADC is not set
|
||||
# CONFIG_JOYSTICK_ADI is not set
|
||||
# CONFIG_JOYSTICK_ANALOG is not set
|
||||
# CONFIG_JOYSTICK_AS5011 is not set
|
||||
# CONFIG_JOYSTICK_COBRA is not set
|
||||
# CONFIG_JOYSTICK_DB9 is not set
|
||||
# CONFIG_JOYSTICK_FSIA6B is not set
|
||||
# CONFIG_JOYSTICK_GAMECON is not set
|
||||
# CONFIG_JOYSTICK_GF2K is not set
|
||||
# CONFIG_JOYSTICK_GRIP is not set
|
||||
# CONFIG_JOYSTICK_GRIP_MP is not set
|
||||
# CONFIG_JOYSTICK_GUILLEMOT is not set
|
||||
# CONFIG_JOYSTICK_IFORCE is not set
|
||||
# CONFIG_JOYSTICK_INTERACT is not set
|
||||
# CONFIG_JOYSTICK_JOYDUMP is not set
|
||||
# CONFIG_JOYSTICK_MAGELLAN is not set
|
||||
# CONFIG_JOYSTICK_PSXPAD_SPI is not set
|
||||
# CONFIG_JOYSTICK_PXRC is not set
|
||||
# CONFIG_JOYSTICK_QWIIC is not set
|
||||
# CONFIG_JOYSTICK_SIDEWINDER is not set
|
||||
# CONFIG_JOYSTICK_SPACEBALL is not set
|
||||
# CONFIG_JOYSTICK_SPACEORB is not set
|
||||
# CONFIG_JOYSTICK_STINGER is not set
|
||||
# CONFIG_JOYSTICK_TMDC is not set
|
||||
# CONFIG_JOYSTICK_TURBOGRAFX is not set
|
||||
# CONFIG_JOYSTICK_TWIDJOY is not set
|
||||
# CONFIG_JOYSTICK_WALKERA0701 is not set
|
||||
# CONFIG_JOYSTICK_WARRIOR is not set
|
||||
# CONFIG_JOYSTICK_XPAD is not set
|
||||
# CONFIG_JOYSTICK_ZHENHUA is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KCMP=y
|
||||
CONFIG_KEYBOARD_MTK_PMIC=y
|
||||
CONFIG_KMAP_LOCAL=y
|
||||
CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y
|
||||
CONFIG_LCD_CLASS_DEVICE=y
|
||||
CONFIG_LCD_PLATFORM=y
|
||||
CONFIG_LEDS_MT6323=y
|
||||
# CONFIG_LEDS_UBNT_LEDBAR is not set
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_LTO_NONE=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
# CONFIG_MACH_MT2701 is not set
|
||||
# CONFIG_MACH_MT6589 is not set
|
||||
# CONFIG_MACH_MT6592 is not set
|
||||
CONFIG_MACH_MT7623=y
|
||||
# CONFIG_MACH_MT7629 is not set
|
||||
# CONFIG_MACH_MT8127 is not set
|
||||
# CONFIG_MACH_MT8135 is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_MAILBOX=y
|
||||
# CONFIG_MAILBOX_TEST is not set
|
||||
CONFIG_MDIO_BITBANG=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
CONFIG_MDIO_GPIO=y
|
||||
CONFIG_MEDIATEK_GE_PHY=y
|
||||
CONFIG_MEDIATEK_MT6577_AUXADC=y
|
||||
CONFIG_MEDIATEK_WATCHDOG=y
|
||||
CONFIG_MEMFD_CREATE=y
|
||||
CONFIG_MEMORY=y
|
||||
CONFIG_MFD_CORE=y
|
||||
# CONFIG_MFD_HI6421_SPMI is not set
|
||||
CONFIG_MFD_MT6397=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_CQHCI=y
|
||||
CONFIG_MMC_MTK=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
# CONFIG_MMC_SDHCI_PCI is not set
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
# CONFIG_MOUSE_BCM5974 is not set
|
||||
# CONFIG_MOUSE_CYAPA is not set
|
||||
# CONFIG_MOUSE_PS2 is not set
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||
CONFIG_MTD_SPLIT_UIMAGE_FW=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MTK_CMDQ=y
|
||||
CONFIG_MTK_CMDQ_MBOX=y
|
||||
CONFIG_MTK_CQDMA=y
|
||||
CONFIG_MTK_EFUSE=y
|
||||
# CONFIG_MTK_HSDMA is not set
|
||||
CONFIG_MTK_INFRACFG=y
|
||||
CONFIG_MTK_IOMMU=y
|
||||
CONFIG_MTK_IOMMU_V1=y
|
||||
CONFIG_MTK_MMSYS=y
|
||||
CONFIG_MTK_PMIC_WRAP=y
|
||||
CONFIG_MTK_SCPSYS=y
|
||||
CONFIG_MTK_SCPSYS_PM_DOMAINS=y
|
||||
CONFIG_MTK_SMI=y
|
||||
# CONFIG_MTK_SPI_NAND is not set
|
||||
CONFIG_MTK_THERMAL=y
|
||||
CONFIG_MTK_TIMER=y
|
||||
# CONFIG_MTK_UART_APDMA is not set
|
||||
# CONFIG_MUSB_PIO_ONLY is not set
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_SG_DMA_LENGTH=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DSA=y
|
||||
CONFIG_NET_DSA_MT7530=y
|
||||
CONFIG_NET_DSA_TAG_MTK=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_MEDIATEK_SOC=y
|
||||
CONFIG_NET_MEDIATEK_SOC_WED=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_SOCK_MSG=y
|
||||
CONFIG_NET_SWITCHDEV=y
|
||||
CONFIG_NET_VENDOR_MEDIATEK=y
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NOP_USB_XCEIV=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_NVMEM=y
|
||||
# CONFIG_NVMEM_SPMI_SDAM is not set
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_DYNAMIC=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IOMMU=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_OVERLAY=y
|
||||
CONFIG_OF_RESOLVE=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PAHOLE_HAS_SPLIT_BTF=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIEAER=y
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
CONFIG_PCIE_MEDIATEK=y
|
||||
CONFIG_PCIE_PME=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLINK=y
|
||||
CONFIG_PHY_MTK_HDMI=y
|
||||
CONFIG_PHY_MTK_MIPI_DSI=y
|
||||
CONFIG_PHY_MTK_TPHY=y
|
||||
# CONFIG_PHY_MTK_UFS is not set
|
||||
# CONFIG_PHY_MTK_XSPHY is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_MT2701=y
|
||||
CONFIG_PINCTRL_MT6397=y
|
||||
CONFIG_PINCTRL_MT7623=y
|
||||
CONFIG_PINCTRL_MTK=y
|
||||
CONFIG_PINCTRL_MTK_MOORE=y
|
||||
CONFIG_PINCTRL_MTK_V2=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_DEVFREQ=y
|
||||
# CONFIG_PM_DEVFREQ_EVENT is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_OPP=y
|
||||
CONFIG_PM_SLEEP=y
|
||||
CONFIG_PM_SLEEP_SMP=y
|
||||
CONFIG_POWER_RESET=y
|
||||
# CONFIG_POWER_RESET_MT6323 is not set
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_POWER_SUPPLY_HWMON=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_PREEMPTION=y
|
||||
CONFIG_PREEMPT_COUNT=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_RCU=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_MEDIATEK=y
|
||||
# CONFIG_PWM_MTK_DISP is not set
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RAS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_REGULATOR_MT6323=y
|
||||
# CONFIG_REGULATOR_MT6358 is not set
|
||||
# CONFIG_REGULATOR_MT6380 is not set
|
||||
# CONFIG_REGULATOR_MT6397 is not set
|
||||
# CONFIG_REGULATOR_QCOM_LABIBB is not set
|
||||
# CONFIG_REGULATOR_QCOM_SPMI is not set
|
||||
# CONFIG_REGULATOR_QCOM_USB_VBUS is not set
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
# CONFIG_RTC_DRV_MT6397 is not set
|
||||
# CONFIG_RTC_DRV_MT7622 is not set
|
||||
CONFIG_RTC_I2C_AND_SPI=y
|
||||
CONFIG_RTC_MC146818_LIB=y
|
||||
# CONFIG_RTL8367S_GSW is not set
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_8250_MT6577=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SGL_ALLOC=y
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_SMP_ON_UP is not set
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BITBANG=y
|
||||
CONFIG_SPI_DYNAMIC=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SPI_MT65XX=y
|
||||
# CONFIG_SPI_MTK_NOR is not set
|
||||
CONFIG_SPMI=y
|
||||
# CONFIG_SPMI_HISI3670 is not set
|
||||
CONFIG_SRCU=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYNC_FILE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_TABLET_SERIAL_WACOM4 is not set
|
||||
# CONFIG_TABLET_USB_ACECAD is not set
|
||||
# CONFIG_TABLET_USB_AIPTEK is not set
|
||||
# CONFIG_TABLET_USB_HANWANG is not set
|
||||
# CONFIG_TABLET_USB_KBTAB is not set
|
||||
# CONFIG_TABLET_USB_PEGASUS is not set
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
|
||||
CONFIG_THERMAL_GOV_STEP_WISE=y
|
||||
CONFIG_THERMAL_OF=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TOUCHSCREEN_EDT_FT5X06=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
# CONFIG_UACCE is not set
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_UEVENT_HELPER_PATH=""
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_UNINLINE_SPIN_UNLOCK=y
|
||||
CONFIG_UNWINDER_ARM=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_F_ACM=y
|
||||
CONFIG_USB_F_ECM=y
|
||||
CONFIG_USB_F_MASS_STORAGE=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GPIO_VBUS=y
|
||||
CONFIG_USB_G_MULTI=y
|
||||
CONFIG_USB_G_MULTI_CDC=y
|
||||
# CONFIG_USB_G_MULTI_RNDIS is not set
|
||||
CONFIG_USB_HID=y
|
||||
CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB_INVENTRA_DMA=y
|
||||
CONFIG_USB_LIBCOMPOSITE=y
|
||||
CONFIG_USB_MUSB_DUAL_ROLE=y
|
||||
# CONFIG_USB_MUSB_GADGET is not set
|
||||
CONFIG_USB_MUSB_HDRC=y
|
||||
# CONFIG_USB_MUSB_HOST is not set
|
||||
CONFIG_USB_MUSB_MEDIATEK=y
|
||||
CONFIG_USB_OTG=y
|
||||
CONFIG_USB_PHY=y
|
||||
CONFIG_USB_ROLE_SWITCH=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_U_ETHER=y
|
||||
CONFIG_USB_U_SERIAL=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_MTK=y
|
||||
CONFIG_USB_XHCI_PLATFORM=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_VFPv3=y
|
||||
CONFIG_VIDEOMODE_HELPERS=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_VT_CONSOLE_SLEEP=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
||||
306
target/linux/mediatek/mt7629/config-5.15
Normal file
306
target/linux/mediatek/mt7629/config-5.15
Normal file
@ -0,0 +1,306 @@
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MEDIATEK=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MULTIPLATFORM=y
|
||||
CONFIG_ARCH_MULTI_V6_V7=y
|
||||
CONFIG_ARCH_MULTI_V7=y
|
||||
CONFIG_ARCH_NR_GPIO=0
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y
|
||||
CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ARM_HAS_SG_CHAIN=y
|
||||
CONFIG_ARM_HEAVY_MB=y
|
||||
CONFIG_ARM_L1_CACHE_SHIFT=6
|
||||
CONFIG_ARM_L1_CACHE_SHIFT_6=y
|
||||
CONFIG_ARM_PATCH_IDIV=y
|
||||
CONFIG_ARM_PATCH_PHYS_VIRT=y
|
||||
CONFIG_ARM_THUMB=y
|
||||
CONFIG_ARM_UNWIND=y
|
||||
CONFIG_ARM_VIRT_EXT=y
|
||||
CONFIG_ATAGS=y
|
||||
CONFIG_AUTO_ZRELADDR=y
|
||||
CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BLK_PM=y
|
||||
CONFIG_BLK_SCSI_REQUEST=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
CONFIG_BSD_PROCESS_ACCT_V3=y
|
||||
CONFIG_CACHE_L2X0=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_CHR_DEV_SCH=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLKSRC_MMIO=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_FROM_BOOTLOADER=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_MEDIATEK=y
|
||||
# CONFIG_COMMON_CLK_MT2701 is not set
|
||||
# CONFIG_COMMON_CLK_MT7622 is not set
|
||||
CONFIG_COMMON_CLK_MT7629=y
|
||||
CONFIG_COMMON_CLK_MT7629_ETHSYS=y
|
||||
CONFIG_COMMON_CLK_MT7629_HIFSYS=y
|
||||
# CONFIG_COMMON_CLK_MT8135 is not set
|
||||
# CONFIG_COMMON_CLK_MT8173 is not set
|
||||
CONFIG_COMMON_CLK_MT8516=y
|
||||
# CONFIG_COMMON_CLK_MT8516_AUDSYS is not set
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CPU_32v6K=y
|
||||
CONFIG_CPU_32v7=y
|
||||
CONFIG_CPU_ABRT_EV7=y
|
||||
CONFIG_CPU_CACHE_V7=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||
CONFIG_CPU_PABRT_V7=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_SPECTRE=y
|
||||
CONFIG_CPU_THUMB_CAPABLE=y
|
||||
CONFIG_CPU_TLB_V7=y
|
||||
CONFIG_CPU_V7=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_DCACHE_WORD_ACCESS=y
|
||||
CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
|
||||
CONFIG_DEBUG_MISC=y
|
||||
CONFIG_DEFAULT_HOSTNAME="(mt7629)"
|
||||
CONFIG_DIMLIB=y
|
||||
CONFIG_DMA_OPS=y
|
||||
CONFIG_DMA_REMAP=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EDAC_ATOMIC_SCRUB=y
|
||||
CONFIG_EDAC_SUPPORT=y
|
||||
CONFIG_EINT_MTK=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_ARCH_TOPOLOGY=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_EARLY_IOREMAP=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_MIGRATION=y
|
||||
CONFIG_GENERIC_IRQ_MULTI_HANDLER=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
|
||||
CONFIG_GENERIC_MSI_IRQ=y
|
||||
CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_STRNCPY_FROM_USER=y
|
||||
CONFIG_GENERIC_STRNLEN_USER=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GENERIC_VDSO_32=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
# CONFIG_HARDENED_USERCOPY is not set
|
||||
CONFIG_HARDEN_BRANCH_PREDICTOR=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HAVE_SMP=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_MTK=y
|
||||
CONFIG_HZ_FIXED=0
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IO_URING=y
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set
|
||||
# CONFIG_LEDS_UBNT_LEDBAR is not set
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LOCK_SPIN_ON_OWNER=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
# CONFIG_MACH_MT2701 is not set
|
||||
# CONFIG_MACH_MT6589 is not set
|
||||
# CONFIG_MACH_MT6592 is not set
|
||||
# CONFIG_MACH_MT7623 is not set
|
||||
CONFIG_MACH_MT7629=y
|
||||
# CONFIG_MACH_MT8127 is not set
|
||||
# CONFIG_MACH_MT8135 is not set
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
# CONFIG_MEDIATEK_MT6577_AUXADC is not set
|
||||
CONFIG_MEDIATEK_WATCHDOG=y
|
||||
CONFIG_MEMFD_CREATE=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_CACHE_L2X0=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_NAND_CORE=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||
CONFIG_MTD_NAND_MTK=y
|
||||
CONFIG_MTD_NAND_MTK_BMT=y
|
||||
# CONFIG_MTD_PARSER_TRX is not set
|
||||
CONFIG_MTD_RAW_NAND=y
|
||||
CONFIG_MTD_SPI_NAND=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPLIT_FIRMWARE=y
|
||||
CONFIG_MTD_SPLIT_FIT_FW=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
# CONFIG_MTK_CMDQ is not set
|
||||
# CONFIG_MTK_EFUSE is not set
|
||||
CONFIG_MTK_INFRACFG=y
|
||||
# CONFIG_MTK_PMIC_WRAP is not set
|
||||
CONFIG_MTK_SCPSYS=y
|
||||
CONFIG_MTK_SCPSYS_PM_DOMAINS=y
|
||||
CONFIG_MTK_SPI_NAND=y
|
||||
# CONFIG_MTK_THERMAL is not set
|
||||
CONFIG_MTK_TIMER=y
|
||||
CONFIG_MUTEX_SPIN_ON_OWNER=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_MEDIATEK_SOC=y
|
||||
CONFIG_NET_VENDOR_MEDIATEK=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OLD_SIGACTION=y
|
||||
CONFIG_OLD_SIGSUSPEND3=y
|
||||
CONFIG_OUTER_CACHE=y
|
||||
CONFIG_OUTER_CACHE_SYNC=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIEAER=y
|
||||
CONFIG_PCIEPORTBUS=y
|
||||
CONFIG_PCIE_MEDIATEK=y
|
||||
CONFIG_PCIE_PME=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_PCI_MSI_IRQ_DOMAIN=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLINK=y
|
||||
CONFIG_PHY_MTK_TPHY=y
|
||||
# CONFIG_PHY_MTK_UFS is not set
|
||||
# CONFIG_PHY_MTK_XSPHY is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_MT7629=y
|
||||
CONFIG_PINCTRL_MTK_MOORE=y
|
||||
CONFIG_PINCTRL_MTK_V2=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_MEDIATEK=y
|
||||
# CONFIG_PWM_MTK_DISP is not set
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RAS=y
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
# CONFIG_RTL8367S_GSW is not set
|
||||
CONFIG_RWSEM_SPIN_ON_OWNER=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SERIAL_8250_FSL=y
|
||||
CONFIG_SERIAL_8250_MT6577=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=3
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SGL_ALLOC=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SPI_MT65XX=y
|
||||
CONFIG_SPI_MTK_NOR=y
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_STACKTRACE=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SWP_EMULATE=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
|
||||
CONFIG_UNWINDER_ARM=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_COMMON=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_MTK=y
|
||||
# CONFIG_USB_XHCI_PLATFORM is not set
|
||||
CONFIG_USE_OF=y
|
||||
# CONFIG_VFP is not set
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_XZ_DEC_ARM=y
|
||||
CONFIG_XZ_DEC_BCJ=y
|
||||
CONFIG_ZBOOT_ROM_BSS=0
|
||||
CONFIG_ZBOOT_ROM_TEXT=0
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
||||
@ -11,6 +11,7 @@ SUBTARGETS:=mt7620 mt7621 mt76x8 rt288x rt305x rt3883
|
||||
FEATURES:=squashfs gpio
|
||||
|
||||
KERNEL_PATCHVER:=5.10
|
||||
KERNEL_TESTING_PATCHVER:=5.15
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for Ralink RT288x/RT3xxx based boards.
|
||||
|
||||
@ -41,12 +41,14 @@
|
||||
bootargs = "console=ttyS0,57600";
|
||||
};
|
||||
|
||||
#ifdef DTS_LEGACY
|
||||
pll: pll {
|
||||
compatible = "mediatek,mt7621-pll", "syscon";
|
||||
|
||||
#clock-cells = <1>;
|
||||
clock-output-names = "cpu", "bus";
|
||||
};
|
||||
#endif
|
||||
|
||||
sysclock: sysclock {
|
||||
#clock-cells = <0>;
|
||||
@ -65,7 +67,16 @@
|
||||
#size-cells = <1>;
|
||||
|
||||
sysc: syscon@0 {
|
||||
#ifdef DTS_LEGACY
|
||||
compatible = "mtk,mt7621-sysc", "syscon";
|
||||
#else
|
||||
compatible = "mediatek,mt7621-sysc", "syscon";
|
||||
#clock-cells = <1>;
|
||||
ralink,memctl = <&memc>;
|
||||
clock-output-names = "xtal", "cpu", "bus",
|
||||
"50m", "125m", "150m",
|
||||
"250m", "270m";
|
||||
#endif
|
||||
reg = <0x0 0x100>;
|
||||
};
|
||||
|
||||
@ -79,6 +90,7 @@
|
||||
#interrupt-cells = <2>;
|
||||
compatible = "mediatek,mt7621-gpio";
|
||||
gpio-controller;
|
||||
gpio-ranges = <&pinctrl 0 0 95>;
|
||||
interrupt-controller;
|
||||
reg = <0x600 0x100>;
|
||||
interrupt-parent = <&gic>;
|
||||
@ -137,7 +149,11 @@
|
||||
};
|
||||
|
||||
memc: syscon@5000 {
|
||||
#ifdef DTS_LEGACY
|
||||
compatible = "mtk,mt7621-memc", "syscon";
|
||||
#else
|
||||
compatible = "mediatek,mt7621-memc", "syscon";
|
||||
#endif
|
||||
reg = <0x5000 0x1000>;
|
||||
};
|
||||
|
||||
@ -197,7 +213,11 @@
|
||||
compatible = "ralink,mt7621-spi";
|
||||
reg = <0xb00 0x100>;
|
||||
|
||||
#ifdef DTS_LEGACY
|
||||
clocks = <&pll MT7621_CLK_BUS>;
|
||||
#else
|
||||
clocks = <&sysc MT7621_CLK_BUS>;
|
||||
#endif
|
||||
|
||||
resets = <&rstctrl 18>;
|
||||
reset-names = "spi";
|
||||
@ -405,7 +425,11 @@
|
||||
timer {
|
||||
compatible = "mti,gic-timer";
|
||||
interrupts = <GIC_LOCAL 1 IRQ_TYPE_NONE>;
|
||||
#ifdef DTS_LEGACY
|
||||
clocks = <&pll MT7621_CLK_CPU>;
|
||||
#else
|
||||
clocks = <&sysc MT7621_CLK_CPU>;
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
@ -450,13 +474,19 @@
|
||||
compatible = "mediatek,mt7621-eth";
|
||||
reg = <0x1e100000 0x10000>;
|
||||
|
||||
#ifdef DTS_LEGACY
|
||||
clocks = <&sysclock>;
|
||||
clock-names = "ethif";
|
||||
#else
|
||||
clocks = <&sysc MT7621_CLK_FE>,
|
||||
<&sysc MT7621_CLK_ETH>;
|
||||
clock-names = "fe", "ethif";
|
||||
#endif
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
resets = <&rstctrl 6 &rstctrl 23>;
|
||||
resets = <&rstctrl 6>, <&rstctrl 23>;
|
||||
reset-names = "fe", "eth";
|
||||
|
||||
interrupt-parent = <&gic>;
|
||||
@ -464,8 +494,10 @@
|
||||
|
||||
mediatek,ethsys = <&sysc>;
|
||||
|
||||
#ifdef DTS_LEGACY
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mdio_pins>, <&rgmii1_pins>, <&rgmii2_pins>;
|
||||
#endif
|
||||
|
||||
gmac0: mac@0 {
|
||||
compatible = "mediatek,eth-mac";
|
||||
@ -565,15 +597,22 @@
|
||||
|
||||
device_type = "pci";
|
||||
|
||||
#ifdef DTS_LEGACY
|
||||
ranges = <0x02000000 0 0x00000000 0x60000000 0 0x10000000>, /* pci memory */
|
||||
<0x01000000 0 0x00000000 0x1e160000 0 0x00010000>; /* io space */
|
||||
#else
|
||||
ranges = <0x02000000 0 0x60000000 0x60000000 0 0x10000000>, /* pci memory */
|
||||
<0x01000000 0 0x00000000 0x1e160000 0 0x00010000>; /* io space */
|
||||
#endif
|
||||
|
||||
status = "disabled";
|
||||
|
||||
#ifdef DTS_LEGACY
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH
|
||||
GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH
|
||||
GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
status = "disabled";
|
||||
|
||||
resets = <&rstctrl 24>, <&rstctrl 25>, <&rstctrl 26>;
|
||||
reset-names = "pcie0", "pcie1", "pcie2";
|
||||
@ -581,6 +620,13 @@
|
||||
clock-names = "pcie0", "pcie1", "pcie2";
|
||||
phys = <&pcie0_phy 1>, <&pcie2_phy 0>;
|
||||
phy-names = "pcie-phy0", "pcie-phy2";
|
||||
#else
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0xF800 0 0 0>;
|
||||
interrupt-map = <0x0000 0 0 0 &gic GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0x0800 0 0 0 &gic GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0x1000 0 0 0 &gic GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#endif
|
||||
|
||||
reset-gpios = <&gpio 19 GPIO_ACTIVE_LOW>;
|
||||
|
||||
@ -590,6 +636,15 @@
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges;
|
||||
#ifndef DTS_LEGACY
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SHARED 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
resets = <&rstctrl 24>;
|
||||
clocks = <&sysc MT7621_CLK_PCIE0>;
|
||||
phys = <&pcie0_phy 1>;
|
||||
phy-names = "pcie-phy0";
|
||||
#endif
|
||||
};
|
||||
|
||||
pcie1: pcie@1,0 {
|
||||
@ -598,6 +653,15 @@
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges;
|
||||
#ifndef DTS_LEGACY
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SHARED 24 IRQ_TYPE_LEVEL_HIGH>;
|
||||
resets = <&rstctrl 25>;
|
||||
clocks = <&sysc MT7621_CLK_PCIE1>;
|
||||
phys = <&pcie0_phy 1>;
|
||||
phy-names = "pcie-phy1";
|
||||
#endif
|
||||
};
|
||||
|
||||
pcie2: pcie@2,0 {
|
||||
@ -606,18 +670,33 @@
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges;
|
||||
#ifndef DTS_LEGACY
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SHARED 25 IRQ_TYPE_LEVEL_HIGH>;
|
||||
resets = <&rstctrl 26>;
|
||||
clocks = <&sysc MT7621_CLK_PCIE2>;
|
||||
phys = <&pcie2_phy 0>;
|
||||
phy-names = "pcie-phy2";
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_phy: pcie-phy@1e149000 {
|
||||
compatible = "mediatek,mt7621-pci-phy";
|
||||
reg = <0x1e149000 0x0700>;
|
||||
#ifndef DTS_LEGACY
|
||||
clocks = <&sysc MT7621_CLK_XTAL>;
|
||||
#endif
|
||||
#phy-cells = <1>;
|
||||
};
|
||||
|
||||
pcie2_phy: pcie-phy@1e14a000 {
|
||||
compatible = "mediatek,mt7621-pci-phy";
|
||||
reg = <0x1e14a000 0x0700>;
|
||||
#ifndef DTS_LEGACY
|
||||
clocks = <&sysc MT7621_CLK_XTAL>;
|
||||
#endif
|
||||
#phy-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
@ -9,6 +9,10 @@ DEFAULT_SOC := mt7621
|
||||
KERNEL_DTB += -d21
|
||||
DEVICE_VARS += ELECOM_HWNAME LINKSYS_HWNAME
|
||||
|
||||
ifdef CONFIG_LINUX_5_10
|
||||
DTS_CPPFLAGS += -DDTS_LEGACY
|
||||
endif
|
||||
|
||||
define Build/beeline-trx
|
||||
echo -ne "hsqs" > $@.hsqs
|
||||
$(STAGING_DIR_HOST)/bin/otrx create $@.trx -M 0x746f435d -f $@ \
|
||||
|
||||
315
target/linux/ramips/mt7621/config-5.15
Normal file
315
target/linux/ramips/mt7621/config-5.15
Normal file
@ -0,0 +1,315 @@
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
CONFIG_ARCH_32BIT_OFF_T=y
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15
|
||||
CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_AT803X_PHY=y
|
||||
CONFIG_BINARY_PRINTF=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_BOARD_SCACHE=y
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CLKSRC_MIPS_GIC=y
|
||||
# CONFIG_CLKSRC_PISTACHIO is not set
|
||||
CONFIG_CLK_MT7621=y
|
||||
CONFIG_CLOCKSOURCE_WATCHDOG=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
# CONFIG_CMDLINE_OVERRIDE is not set
|
||||
CONFIG_COMMON_CLK=y
|
||||
# CONFIG_COMMON_CLK_BOSTON is not set
|
||||
# CONFIG_COMMON_CLK_PISTACHIO is not set
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CPU_GENERIC_DUMP_TLB=y
|
||||
CONFIG_CPU_HAS_DIEI=y
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_RIXI=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_TEO=y
|
||||
CONFIG_CPU_MIPS32=y
|
||||
# CONFIG_CPU_MIPS32_R1 is not set
|
||||
CONFIG_CPU_MIPS32_R2=y
|
||||
CONFIG_CPU_MIPSR2=y
|
||||
CONFIG_CPU_MIPSR2_IRQ_EI=y
|
||||
CONFIG_CPU_MIPSR2_IRQ_VI=y
|
||||
CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y
|
||||
CONFIG_CPU_PM=y
|
||||
CONFIG_CPU_R4K_CACHE_TLB=y
|
||||
CONFIG_CPU_RMAP=y
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_CPU_SUPPORTS_MSA=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_HASH_INFO=y
|
||||
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2
|
||||
CONFIG_CRYPTO_LZO=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_ZSTD=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_DEBUG_PINCTRL=y
|
||||
CONFIG_DIMLIB=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
# CONFIG_DTB_GNUBEE1 is not set
|
||||
# CONFIG_DTB_GNUBEE2 is not set
|
||||
CONFIG_DTB_RT_NONE=y
|
||||
CONFIG_DTC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FWNODE_MDIO=y
|
||||
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_FIND_FIRST_BIT=y
|
||||
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_LIB_ASHLDI3=y
|
||||
CONFIG_GENERIC_LIB_ASHRDI3=y
|
||||
CONFIG_GENERIC_LIB_CMPDI2=y
|
||||
CONFIG_GENERIC_LIB_LSHRDI3=y
|
||||
CONFIG_GENERIC_LIB_UCMPDI2=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_PHY=y
|
||||
CONFIG_GENERIC_PINCONF=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GLOB=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIOLIB_IRQCHIP=y
|
||||
CONFIG_GPIO_CDEV=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
CONFIG_GPIO_MT7621=y
|
||||
# CONFIG_GPIO_RALINK is not set
|
||||
CONFIG_GPIO_WATCHDOG=y
|
||||
# CONFIG_GPIO_WATCHDOG_ARCH_INITCALL is not set
|
||||
CONFIG_GRO_CELLS=y
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_ALGOBIT=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_GPIO=y
|
||||
CONFIG_I2C_MT7621=y
|
||||
# CONFIG_INGENIC_CGU_JZ4760 is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MIPS_CPU=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_KMAP_LOCAL=y
|
||||
CONFIG_LED_TRIGGER_PHY=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||
CONFIG_LTO_NONE=y
|
||||
CONFIG_LZO_COMPRESS=y
|
||||
CONFIG_LZO_DECOMPRESS=y
|
||||
# CONFIG_MACH_NINTENDO64 is not set
|
||||
# CONFIG_MACH_REALTEK_RTL is not set
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MDIO_DEVRES=y
|
||||
CONFIG_MEDIATEK_GE_PHY=y
|
||||
CONFIG_MEMFD_CREATE=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_MIKROTIK=y
|
||||
CONFIG_MIKROTIK_RB_SYSFS=y
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_ASID_BITS=8
|
||||
CONFIG_MIPS_ASID_SHIFT=0
|
||||
CONFIG_MIPS_CLOCK_VSYSCALL=y
|
||||
CONFIG_MIPS_CM=y
|
||||
# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set
|
||||
# CONFIG_MIPS_CMDLINE_DTB_EXTEND is not set
|
||||
# CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set
|
||||
CONFIG_MIPS_CMDLINE_FROM_DTB=y
|
||||
CONFIG_MIPS_CPC=y
|
||||
CONFIG_MIPS_CPS=y
|
||||
CONFIG_MIPS_CPS_CPUIDLE=y
|
||||
# CONFIG_MIPS_CPS_NS16550_BOOL is not set
|
||||
CONFIG_MIPS_CPS_PM=y
|
||||
CONFIG_MIPS_CPU_SCACHE=y
|
||||
CONFIG_MIPS_EBPF_JIT=y
|
||||
# CONFIG_MIPS_ELF_APPENDED_DTB is not set
|
||||
CONFIG_MIPS_GIC=y
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
CONFIG_MIPS_LD_CAN_LINK_VDSO=y
|
||||
CONFIG_MIPS_MT=y
|
||||
CONFIG_MIPS_MT_FPAFF=y
|
||||
CONFIG_MIPS_MT_SMP=y
|
||||
# CONFIG_MIPS_NO_APPENDED_DTB is not set
|
||||
CONFIG_MIPS_NR_CPU_NR_MAP=4
|
||||
CONFIG_MIPS_PERF_SHARED_TC_COUNTERS=y
|
||||
CONFIG_MIPS_RAW_APPENDED_DTB=y
|
||||
CONFIG_MIPS_SPRAM=y
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MT7621_WDT=y
|
||||
# CONFIG_MTD_CFI_INTELEXT is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_NAND_CORE=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
|
||||
CONFIG_MTD_NAND_MT7621=y
|
||||
CONFIG_MTD_NAND_MTK_BMT=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_RAW_NAND=y
|
||||
CONFIG_MTD_ROUTERBOOT_PARTS=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
|
||||
CONFIG_MTD_SPLIT_FIT_FW=y
|
||||
CONFIG_MTD_SPLIT_MINOR_FW=y
|
||||
CONFIG_MTD_SPLIT_SEAMA_FW=y
|
||||
CONFIG_MTD_SPLIT_TPLINK_FW=y
|
||||
CONFIG_MTD_SPLIT_TRX_FW=y
|
||||
CONFIG_MTD_SPLIT_UIMAGE_FW=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||
CONFIG_MTD_UBI_BLOCK=y
|
||||
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||
CONFIG_MTD_VIRT_CONCAT=y
|
||||
# CONFIG_MTK_HSDMA is not set
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NET_DEVLINK=y
|
||||
CONFIG_NET_DSA=y
|
||||
CONFIG_NET_DSA_MT7530=y
|
||||
CONFIG_NET_DSA_TAG_MTK=y
|
||||
CONFIG_NET_FLOW_LIMIT=y
|
||||
CONFIG_NET_MEDIATEK_SOC=y
|
||||
CONFIG_NET_SELFTESTS=y
|
||||
CONFIG_NET_SOCK_MSG=y
|
||||
CONFIG_NET_SWITCHDEV=y
|
||||
CONFIG_NET_VENDOR_MEDIATEK=y
|
||||
# CONFIG_NET_VENDOR_RALINK is not set
|
||||
CONFIG_NO_HZ_COMMON=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_KOBJ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_PADATA=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCIE_MT7621=y
|
||||
CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DOMAINS_GENERIC=y
|
||||
CONFIG_PCI_DRIVERS_GENERIC=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PHYLINK=y
|
||||
# CONFIG_PHY_INGENIC_USB is not set
|
||||
CONFIG_PHY_MT7621_PCI=y
|
||||
# CONFIG_PHY_PISTACHIO_USB is not set
|
||||
# CONFIG_PHY_RALINK_USB is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_PINCTRL_AW9523=y
|
||||
CONFIG_PINCTRL_MT7621=y
|
||||
# CONFIG_PINCTRL_PISTACHIO is not set
|
||||
CONFIG_PINCTRL_RALINK=y
|
||||
CONFIG_PINCTRL_RT2880=y
|
||||
# CONFIG_PINCTRL_SINGLE is not set
|
||||
CONFIG_PINCTRL_SX150X=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_RESET_GPIO=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
CONFIG_RALINK=y
|
||||
# CONFIG_RALINK_WDT is not set
|
||||
CONFIG_RATIONAL=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_I2C=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_BQ32K=y
|
||||
CONFIG_RTC_DRV_PCF8563=y
|
||||
CONFIG_RTC_I2C_AND_SPI=y
|
||||
CONFIG_RTC_MC146818_LIB=y
|
||||
# CONFIG_SCHED_CORE is not set
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=3
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SGL_ALLOC=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_UP=y
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
CONFIG_SOC_BUS=y
|
||||
# CONFIG_SOC_MT7620 is not set
|
||||
CONFIG_SOC_MT7621=y
|
||||
# CONFIG_SOC_RT288X is not set
|
||||
# CONFIG_SOC_RT305X is not set
|
||||
# CONFIG_SOC_RT3883 is not set
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_MASTER=y
|
||||
CONFIG_SPI_MEM=y
|
||||
CONFIG_SPI_MT7621=y
|
||||
# CONFIG_SPI_RT2880 is not set
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SYNC_R4K=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
|
||||
CONFIG_SYS_HAS_CPU_MIPS32_R2=y
|
||||
CONFIG_SYS_HAS_EARLY_PRINTK=y
|
||||
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||
CONFIG_SYS_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_SYS_SUPPORTS_HOTPLUG_CPU=y
|
||||
CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
|
||||
CONFIG_SYS_SUPPORTS_MIPS16=y
|
||||
CONFIG_SYS_SUPPORTS_MIPS_CPS=y
|
||||
CONFIG_SYS_SUPPORTS_MULTITHREADING=y
|
||||
CONFIG_SYS_SUPPORTS_SCHED_SMT=y
|
||||
CONFIG_SYS_SUPPORTS_SMP=y
|
||||
CONFIG_SYS_SUPPORTS_ZBOOT=y
|
||||
CONFIG_TARGET_ISA_REV=2
|
||||
# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TREE_RCU=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USE_OF=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_WEAK_ORDERING=y
|
||||
CONFIG_XPS=y
|
||||
CONFIG_XXHASH=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZSTD_COMPRESS=y
|
||||
CONFIG_ZSTD_DECOMPRESS=y
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,134 @@
|
||||
From: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Date: Wed, 22 Dec 2021 19:10:48 -0600
|
||||
Subject: [PATCH] PCI: mt7621: Rename mt7621_pci_ to mt7621_pcie_
|
||||
|
||||
Rename mt7621_pci_* structs and functions to mt7621_pcie_* for consistency
|
||||
with the rest of the file.
|
||||
|
||||
Link: https://lore.kernel.org/r/20211223011054.1227810-18-helgaas@kernel.org
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Reviewed-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Cc: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
---
|
||||
|
||||
--- a/drivers/pci/controller/pcie-mt7621.c
|
||||
+++ b/drivers/pci/controller/pcie-mt7621.c
|
||||
@@ -93,8 +93,8 @@ struct mt7621_pcie_port {
|
||||
* reset lines are inverted.
|
||||
*/
|
||||
struct mt7621_pcie {
|
||||
- void __iomem *base;
|
||||
struct device *dev;
|
||||
+ void __iomem *base;
|
||||
struct list_head ports;
|
||||
bool resets_inverted;
|
||||
};
|
||||
@@ -129,7 +129,7 @@ static inline void pcie_port_write(struc
|
||||
writel_relaxed(val, port->base + reg);
|
||||
}
|
||||
|
||||
-static inline u32 mt7621_pci_get_cfgaddr(unsigned int bus, unsigned int slot,
|
||||
+static inline u32 mt7621_pcie_get_cfgaddr(unsigned int bus, unsigned int slot,
|
||||
unsigned int func, unsigned int where)
|
||||
{
|
||||
return (((where & 0xf00) >> 8) << 24) | (bus << 16) | (slot << 11) |
|
||||
@@ -140,7 +140,7 @@ static void __iomem *mt7621_pcie_map_bus
|
||||
unsigned int devfn, int where)
|
||||
{
|
||||
struct mt7621_pcie *pcie = bus->sysdata;
|
||||
- u32 address = mt7621_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
|
||||
+ u32 address = mt7621_pcie_get_cfgaddr(bus->number, PCI_SLOT(devfn),
|
||||
PCI_FUNC(devfn), where);
|
||||
|
||||
writel_relaxed(address, pcie->base + RALINK_PCI_CONFIG_ADDR);
|
||||
@@ -148,7 +148,7 @@ static void __iomem *mt7621_pcie_map_bus
|
||||
return pcie->base + RALINK_PCI_CONFIG_DATA + (where & 3);
|
||||
}
|
||||
|
||||
-struct pci_ops mt7621_pci_ops = {
|
||||
+struct pci_ops mt7621_pcie_ops = {
|
||||
.map_bus = mt7621_pcie_map_bus,
|
||||
.read = pci_generic_config_read,
|
||||
.write = pci_generic_config_write,
|
||||
@@ -156,7 +156,7 @@ struct pci_ops mt7621_pci_ops = {
|
||||
|
||||
static u32 read_config(struct mt7621_pcie *pcie, unsigned int dev, u32 reg)
|
||||
{
|
||||
- u32 address = mt7621_pci_get_cfgaddr(0, dev, 0, reg);
|
||||
+ u32 address = mt7621_pcie_get_cfgaddr(0, dev, 0, reg);
|
||||
|
||||
pcie_write(pcie, address, RALINK_PCI_CONFIG_ADDR);
|
||||
return pcie_read(pcie, RALINK_PCI_CONFIG_DATA);
|
||||
@@ -165,7 +165,7 @@ static u32 read_config(struct mt7621_pci
|
||||
static void write_config(struct mt7621_pcie *pcie, unsigned int dev,
|
||||
u32 reg, u32 val)
|
||||
{
|
||||
- u32 address = mt7621_pci_get_cfgaddr(0, dev, 0, reg);
|
||||
+ u32 address = mt7621_pcie_get_cfgaddr(0, dev, 0, reg);
|
||||
|
||||
pcie_write(pcie, address, RALINK_PCI_CONFIG_ADDR);
|
||||
pcie_write(pcie, val, RALINK_PCI_CONFIG_DATA);
|
||||
@@ -505,16 +505,16 @@ static int mt7621_pcie_register_host(str
|
||||
{
|
||||
struct mt7621_pcie *pcie = pci_host_bridge_priv(host);
|
||||
|
||||
- host->ops = &mt7621_pci_ops;
|
||||
+ host->ops = &mt7621_pcie_ops;
|
||||
host->sysdata = pcie;
|
||||
return pci_host_probe(host);
|
||||
}
|
||||
|
||||
-static const struct soc_device_attribute mt7621_pci_quirks_match[] = {
|
||||
+static const struct soc_device_attribute mt7621_pcie_quirks_match[] = {
|
||||
{ .soc_id = "mt7621", .revision = "E2" }
|
||||
};
|
||||
|
||||
-static int mt7621_pci_probe(struct platform_device *pdev)
|
||||
+static int mt7621_pcie_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct soc_device_attribute *attr;
|
||||
@@ -535,7 +535,7 @@ static int mt7621_pci_probe(struct platf
|
||||
platform_set_drvdata(pdev, pcie);
|
||||
INIT_LIST_HEAD(&pcie->ports);
|
||||
|
||||
- attr = soc_device_match(mt7621_pci_quirks_match);
|
||||
+ attr = soc_device_match(mt7621_pcie_quirks_match);
|
||||
if (attr)
|
||||
pcie->resets_inverted = true;
|
||||
|
||||
@@ -572,7 +572,7 @@ remove_resets:
|
||||
return err;
|
||||
}
|
||||
|
||||
-static int mt7621_pci_remove(struct platform_device *pdev)
|
||||
+static int mt7621_pcie_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mt7621_pcie *pcie = platform_get_drvdata(pdev);
|
||||
struct mt7621_pcie_port *port;
|
||||
@@ -583,18 +583,18 @@ static int mt7621_pci_remove(struct plat
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static const struct of_device_id mt7621_pci_ids[] = {
|
||||
+static const struct of_device_id mt7621_pcie_ids[] = {
|
||||
{ .compatible = "mediatek,mt7621-pci" },
|
||||
{},
|
||||
};
|
||||
-MODULE_DEVICE_TABLE(of, mt7621_pci_ids);
|
||||
+MODULE_DEVICE_TABLE(of, mt7621_pcie_ids);
|
||||
|
||||
-static struct platform_driver mt7621_pci_driver = {
|
||||
- .probe = mt7621_pci_probe,
|
||||
- .remove = mt7621_pci_remove,
|
||||
+static struct platform_driver mt7621_pcie_driver = {
|
||||
+ .probe = mt7621_pcie_probe,
|
||||
+ .remove = mt7621_pcie_remove,
|
||||
.driver = {
|
||||
.name = "mt7621-pci",
|
||||
- .of_match_table = of_match_ptr(mt7621_pci_ids),
|
||||
+ .of_match_table = of_match_ptr(mt7621_pcie_ids),
|
||||
},
|
||||
};
|
||||
-builtin_platform_driver(mt7621_pci_driver);
|
||||
+builtin_platform_driver(mt7621_pcie_driver);
|
||||
@ -0,0 +1,30 @@
|
||||
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Date: Wed, 17 Nov 2021 16:29:52 +0100
|
||||
Subject: [PATCH] PCI: mt7621: Declare mt7621_pci_ops static
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Sparse complains about mt7621_pci_ops symbol is not declared and asks if
|
||||
it should be declared as static instead. Sparse is right. Hence declare
|
||||
symbol as static.
|
||||
|
||||
Link: https://lore.kernel.org/r/20211117152952.12271-1-sergio.paracuellos@gmail.com
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Reviewed-by: Krzysztof Wilczyński <kw@linux.com>
|
||||
---
|
||||
|
||||
--- a/drivers/pci/controller/pcie-mt7621.c
|
||||
+++ b/drivers/pci/controller/pcie-mt7621.c
|
||||
@@ -148,7 +148,7 @@ static void __iomem *mt7621_pcie_map_bus
|
||||
return pcie->base + RALINK_PCI_CONFIG_DATA + (where & 3);
|
||||
}
|
||||
|
||||
-struct pci_ops mt7621_pcie_ops = {
|
||||
+static struct pci_ops mt7621_pcie_ops = {
|
||||
.map_bus = mt7621_pcie_map_bus,
|
||||
.read = pci_generic_config_read,
|
||||
.write = pci_generic_config_write,
|
||||
@ -0,0 +1,119 @@
|
||||
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Date: Tue, 7 Dec 2021 11:49:21 +0100
|
||||
Subject: [PATCH] PCI: mt7621: Move MIPS setup to pcibios_root_bridge_prepare()
|
||||
|
||||
On the MIPS ralink mt7621 platform, we need to set up I/O coherency units
|
||||
based on the host bridge apertures.
|
||||
|
||||
To remove this arch dependency from the driver itself, move the coherency
|
||||
setup from the driver to pcibios_root_bridge_prepare().
|
||||
|
||||
[bhelgaas: squash add/remove into one patch, commit log]
|
||||
Link: https://lore.kernel.org/r/20211207104924.21327-3-sergio.paracuellos@gmail.com
|
||||
Link: https://lore.kernel.org/r/20211207104924.21327-4-sergio.paracuellos@gmail.com
|
||||
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Reviewed-by: Guenter Roeck <linux@roeck-us.net> # arch/mips
|
||||
Acked-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> # arch/mips
|
||||
---
|
||||
|
||||
--- a/arch/mips/ralink/mt7621.c
|
||||
+++ b/arch/mips/ralink/mt7621.c
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sys_soc.h>
|
||||
#include <linux/memblock.h>
|
||||
+#include <linux/pci.h>
|
||||
+#include <linux/bug.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/mipsregs.h>
|
||||
@@ -24,6 +26,35 @@
|
||||
|
||||
static u32 detect_magic __initdata;
|
||||
|
||||
+int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
||||
+{
|
||||
+ struct resource_entry *entry;
|
||||
+ resource_size_t mask;
|
||||
+
|
||||
+ entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
|
||||
+ if (!entry) {
|
||||
+ pr_err("Cannot get memory resource\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (mips_cps_numiocu(0)) {
|
||||
+ /*
|
||||
+ * Hardware doesn't accept mask values with 1s after
|
||||
+ * 0s (e.g. 0xffef), so warn if that's happen
|
||||
+ */
|
||||
+ mask = ~(entry->res->end - entry->res->start) & CM_GCR_REGn_MASK_ADDRMASK;
|
||||
+ WARN_ON(mask && BIT(ffz(~mask)) - 1 != ~mask);
|
||||
+
|
||||
+ write_gcr_reg1_base(entry->res->start);
|
||||
+ write_gcr_reg1_mask(mask | CM_GCR_REGn_MASK_CMTGT_IOCU0);
|
||||
+ pr_info("PCI coherence region base: 0x%08llx, mask/settings: 0x%08llx\n",
|
||||
+ (unsigned long long)read_gcr_reg1_base(),
|
||||
+ (unsigned long long)read_gcr_reg1_mask());
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
phys_addr_t mips_cpc_default_phys_base(void)
|
||||
{
|
||||
panic("Cannot detect cpc address");
|
||||
--- a/drivers/pci/controller/pcie-mt7621.c
|
||||
+++ b/drivers/pci/controller/pcie-mt7621.c
|
||||
@@ -208,37 +208,6 @@ static inline void mt7621_control_deasse
|
||||
reset_control_assert(port->pcie_rst);
|
||||
}
|
||||
|
||||
-static int setup_cm_memory_region(struct pci_host_bridge *host)
|
||||
-{
|
||||
- struct mt7621_pcie *pcie = pci_host_bridge_priv(host);
|
||||
- struct device *dev = pcie->dev;
|
||||
- struct resource_entry *entry;
|
||||
- resource_size_t mask;
|
||||
-
|
||||
- entry = resource_list_first_type(&host->windows, IORESOURCE_MEM);
|
||||
- if (!entry) {
|
||||
- dev_err(dev, "cannot get memory resource\n");
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- if (mips_cps_numiocu(0)) {
|
||||
- /*
|
||||
- * FIXME: hardware doesn't accept mask values with 1s after
|
||||
- * 0s (e.g. 0xffef), so it would be great to warn if that's
|
||||
- * about to happen
|
||||
- */
|
||||
- mask = ~(entry->res->end - entry->res->start);
|
||||
-
|
||||
- write_gcr_reg1_base(entry->res->start);
|
||||
- write_gcr_reg1_mask(mask | CM_GCR_REGn_MASK_CMTGT_IOCU0);
|
||||
- dev_info(dev, "PCI coherence region base: 0x%08llx, mask/settings: 0x%08llx\n",
|
||||
- (unsigned long long)read_gcr_reg1_base(),
|
||||
- (unsigned long long)read_gcr_reg1_mask());
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static int mt7621_pcie_parse_port(struct mt7621_pcie *pcie,
|
||||
struct device_node *node,
|
||||
int slot)
|
||||
@@ -557,12 +526,6 @@ static int mt7621_pcie_probe(struct plat
|
||||
goto remove_resets;
|
||||
}
|
||||
|
||||
- err = setup_cm_memory_region(bridge);
|
||||
- if (err) {
|
||||
- dev_err(dev, "error setting up iocu mem regions\n");
|
||||
- goto remove_resets;
|
||||
- }
|
||||
-
|
||||
return mt7621_pcie_register_host(bridge);
|
||||
|
||||
remove_resets:
|
||||
@ -0,0 +1,35 @@
|
||||
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Date: Mon, 24 Jan 2022 12:30:02 +0100
|
||||
Subject: [PATCH] PCI: mt7621: Drop of_match_ptr() to avoid unused variable
|
||||
|
||||
We have stubs for most OF interfaces even when CONFIG_OF is not set, so we
|
||||
allow building of pcie-mt7621.c in that case for compile testing.
|
||||
|
||||
When CONFIG_OF is not set, "of_match_ptr(mt7621_pcie_ids)" compiles to
|
||||
NULL, which leaves mt7621_pcie_ids unused:
|
||||
|
||||
$ make W=1
|
||||
drivers/pci/controller/pcie-mt7621.c:549:34: warning: unused variable 'mt7621_pcie_ids' [-Wunused-const-variable]
|
||||
|
||||
Drop of_match_ptr() to avoid the unused variable warning.
|
||||
|
||||
[bhelgaas: commit log]
|
||||
Fixes: 2bdd5238e756 ("PCI: mt7621: Add MediaTek MT7621 PCIe host controller driver")
|
||||
Link: https://lore.kernel.org/r/20220124113003.406224-2-sergio.paracuellos@gmail.com
|
||||
Link: https://lore.kernel.org/r/202201241754.igtHzgHv-lkp@intel.com
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
|
||||
--- a/drivers/pci/controller/pcie-mt7621.c
|
||||
+++ b/drivers/pci/controller/pcie-mt7621.c
|
||||
@@ -557,7 +557,7 @@ static struct platform_driver mt7621_pci
|
||||
.remove = mt7621_pcie_remove,
|
||||
.driver = {
|
||||
.name = "mt7621-pci",
|
||||
- .of_match_table = of_match_ptr(mt7621_pcie_ids),
|
||||
+ .of_match_table = mt7621_pcie_ids,
|
||||
},
|
||||
};
|
||||
builtin_platform_driver(mt7621_pcie_driver);
|
||||
@ -0,0 +1,35 @@
|
||||
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Date: Mon, 24 Jan 2022 12:30:03 +0100
|
||||
Subject: [PATCH] PCI: mt7621: Remove unused function pcie_rmw()
|
||||
|
||||
Function pcie_rmw() is not being used at all and can be deleted. Hence get
|
||||
rid of it, which fixes this warning:
|
||||
|
||||
drivers/pci/controller/pcie-mt7621.c:112:20: warning: unused function 'pcie_rmw' [-Wunused-function]
|
||||
|
||||
Fixes: 2bdd5238e756 ("PCI: mt7621: Add MediaTek MT7621 PCIe host controller driver")
|
||||
Link: https://lore.kernel.org/r/20220124113003.406224-3-sergio.paracuellos@gmail.com
|
||||
Link: https://lore.kernel.org/all/202201241754.igtHzgHv-lkp@intel.com/
|
||||
Reported-by: kernel test robot <lkp@intel.com>
|
||||
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
---
|
||||
|
||||
--- a/drivers/pci/controller/pcie-mt7621.c
|
||||
+++ b/drivers/pci/controller/pcie-mt7621.c
|
||||
@@ -109,15 +109,6 @@ static inline void pcie_write(struct mt7
|
||||
writel_relaxed(val, pcie->base + reg);
|
||||
}
|
||||
|
||||
-static inline void pcie_rmw(struct mt7621_pcie *pcie, u32 reg, u32 clr, u32 set)
|
||||
-{
|
||||
- u32 val = readl_relaxed(pcie->base + reg);
|
||||
-
|
||||
- val &= ~clr;
|
||||
- val |= set;
|
||||
- writel_relaxed(val, pcie->base + reg);
|
||||
-}
|
||||
-
|
||||
static inline u32 pcie_port_read(struct mt7621_pcie_port *port, u32 reg)
|
||||
{
|
||||
return readl_relaxed(port->base + reg);
|
||||
@ -0,0 +1,38 @@
|
||||
From: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Date: Tue, 7 Dec 2021 11:49:20 +0100
|
||||
Subject: [PATCH] PCI: Let pcibios_root_bridge_prepare() access bridge->windows
|
||||
|
||||
When pci_register_host_bridge() is called, bridge->windows are already
|
||||
available. However these windows are being moved temporarily from there.
|
||||
|
||||
To let pcibios_root_bridge_prepare() have access to these windows, move the
|
||||
windows movement after calling this function. This is useful for the MIPS
|
||||
ralink mt7621 platform so it can set up I/O coherence units and avoid
|
||||
custom MIPS code in the mt7621 PCIe controller driver.
|
||||
|
||||
Link: https://lore.kernel.org/r/20211207104924.21327-2-sergio.paracuellos@gmail.com
|
||||
Signed-off-by: Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||
---
|
||||
|
||||
--- a/drivers/pci/probe.c
|
||||
+++ b/drivers/pci/probe.c
|
||||
@@ -898,8 +898,6 @@ static int pci_register_host_bridge(stru
|
||||
|
||||
bridge->bus = bus;
|
||||
|
||||
- /* Temporarily move resources off the list */
|
||||
- list_splice_init(&bridge->windows, &resources);
|
||||
bus->sysdata = bridge->sysdata;
|
||||
bus->ops = bridge->ops;
|
||||
bus->number = bus->busn_res.start = bridge->busnr;
|
||||
@@ -925,6 +923,8 @@ static int pci_register_host_bridge(stru
|
||||
if (err)
|
||||
goto free;
|
||||
|
||||
+ /* Temporarily move resources off the list */
|
||||
+ list_splice_init(&bridge->windows, &resources);
|
||||
err = device_add(&bridge->dev);
|
||||
if (err) {
|
||||
put_device(&bridge->dev);
|
||||
@ -0,0 +1,61 @@
|
||||
--- a/arch/mips/ralink/reset.c
|
||||
+++ b/arch/mips/ralink/reset.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reset-controller.h>
|
||||
+#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/reboot.h>
|
||||
|
||||
@@ -65,21 +66,39 @@ static const struct reset_control_ops re
|
||||
.deassert = ralink_deassert_device,
|
||||
};
|
||||
|
||||
-static struct reset_controller_dev reset_dev = {
|
||||
- .ops = &reset_ops,
|
||||
- .owner = THIS_MODULE,
|
||||
- .nr_resets = 32,
|
||||
- .of_reset_n_cells = 1,
|
||||
+static int ralink_reset_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct reset_controller_dev *rcdev;
|
||||
+
|
||||
+ rcdev = devm_kzalloc(&pdev->dev, sizeof(*rcdev), GFP_KERNEL);
|
||||
+ if (!rcdev)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ rcdev->ops = &reset_ops;
|
||||
+ rcdev->owner = THIS_MODULE;
|
||||
+ rcdev->nr_resets = 32;
|
||||
+ rcdev->of_reset_n_cells = 1;
|
||||
+ rcdev->of_node = pdev->dev.of_node;
|
||||
+
|
||||
+ return devm_reset_controller_register(&pdev->dev, rcdev);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ralink_reset_dt_ids[] = {
|
||||
+ { .compatible = "ralink,rt2880-reset" },
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+static struct platform_driver ralink_reset_driver = {
|
||||
+ .probe = ralink_reset_probe,
|
||||
+ .driver = {
|
||||
+ .name = "ralink-reset",
|
||||
+ .of_match_table = ralink_reset_dt_ids,
|
||||
+ }
|
||||
};
|
||||
|
||||
void ralink_rst_init(void)
|
||||
{
|
||||
- reset_dev.of_node = of_find_compatible_node(NULL, NULL,
|
||||
- "ralink,rt2880-reset");
|
||||
- if (!reset_dev.of_node)
|
||||
- pr_err("Failed to find reset controller node");
|
||||
- else
|
||||
- reset_controller_register(&reset_dev);
|
||||
+ platform_driver_register(&ralink_reset_driver);
|
||||
}
|
||||
|
||||
static void ralink_restart(char *command)
|
||||
20
target/linux/ramips/patches-5.15/200-add-ralink-eth.patch
Normal file
20
target/linux/ramips/patches-5.15/200-add-ralink-eth.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- a/drivers/net/ethernet/Kconfig
|
||||
+++ b/drivers/net/ethernet/Kconfig
|
||||
@@ -162,6 +162,7 @@ source "drivers/net/ethernet/pasemi/Kcon
|
||||
source "drivers/net/ethernet/pensando/Kconfig"
|
||||
source "drivers/net/ethernet/qlogic/Kconfig"
|
||||
source "drivers/net/ethernet/qualcomm/Kconfig"
|
||||
+source "drivers/net/ethernet/ralink/Kconfig"
|
||||
source "drivers/net/ethernet/rdc/Kconfig"
|
||||
source "drivers/net/ethernet/realtek/Kconfig"
|
||||
source "drivers/net/ethernet/renesas/Kconfig"
|
||||
--- a/drivers/net/ethernet/Makefile
|
||||
+++ b/drivers/net/ethernet/Makefile
|
||||
@@ -73,6 +73,7 @@ obj-$(CONFIG_NET_VENDOR_PACKET_ENGINES)
|
||||
obj-$(CONFIG_NET_VENDOR_PASEMI) += pasemi/
|
||||
obj-$(CONFIG_NET_VENDOR_QLOGIC) += qlogic/
|
||||
obj-$(CONFIG_NET_VENDOR_QUALCOMM) += qualcomm/
|
||||
+obj-$(CONFIG_NET_VENDOR_RALINK) += ralink/
|
||||
obj-$(CONFIG_NET_VENDOR_REALTEK) += realtek/
|
||||
obj-$(CONFIG_NET_VENDOR_RENESAS) += renesas/
|
||||
obj-$(CONFIG_NET_VENDOR_RDC) += rdc/
|
||||
@ -0,0 +1,19 @@
|
||||
--- a/arch/mips/include/asm/mach-ralink/mt7620.h
|
||||
+++ b/arch/mips/include/asm/mach-ralink/mt7620.h
|
||||
@@ -96,4 +96,16 @@ static inline int mt7620_get_eco(void)
|
||||
return rt_sysc_r32(SYSC_REG_CHIP_REV) & CHIP_REV_ECO_MASK;
|
||||
}
|
||||
|
||||
+static inline int mt7620_get_chipver(void)
|
||||
+{
|
||||
+ return (rt_sysc_r32(SYSC_REG_CHIP_REV) >> CHIP_REV_VER_SHIFT) &
|
||||
+ CHIP_REV_VER_MASK;
|
||||
+}
|
||||
+
|
||||
+static inline int mt7620_get_pkg(void)
|
||||
+{
|
||||
+ return (rt_sysc_r32(SYSC_REG_CHIP_REV) >> CHIP_REV_PKG_SHIFT) &
|
||||
+ CHIP_REV_PKG_MASK;
|
||||
+}
|
||||
+
|
||||
#endif
|
||||
@ -0,0 +1,100 @@
|
||||
From ce3d4a4111a5f7e6b4e74bceae5faa6ce388e8ec Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 14 Jul 2013 23:08:11 +0200
|
||||
Subject: [PATCH 05/53] MIPS: use set_mode() to enable/disable the cevt-r4k
|
||||
irq
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
arch/mips/ralink/Kconfig | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/arch/mips/ralink/Kconfig
|
||||
+++ b/arch/mips/ralink/Kconfig
|
||||
@@ -1,12 +1,17 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
if RALINK
|
||||
|
||||
+config CEVT_SYSTICK_QUIRK
|
||||
+ bool
|
||||
+ default n
|
||||
+
|
||||
config CLKEVT_RT3352
|
||||
bool
|
||||
depends on SOC_RT305X || SOC_MT7620
|
||||
default y
|
||||
select TIMER_OF
|
||||
select CLKSRC_MMIO
|
||||
+ select CEVT_SYSTICK_QUIRK
|
||||
|
||||
config RALINK_ILL_ACC
|
||||
bool
|
||||
--- a/arch/mips/kernel/cevt-r4k.c
|
||||
+++ b/arch/mips/kernel/cevt-r4k.c
|
||||
@@ -16,6 +16,31 @@
|
||||
#include <asm/time.h>
|
||||
#include <asm/cevt-r4k.h>
|
||||
|
||||
+#ifdef CONFIG_CEVT_SYSTICK_QUIRK
|
||||
+static int mips_state_oneshot(struct clock_event_device *evt)
|
||||
+{
|
||||
+ unsigned long flags = IRQF_PERCPU | IRQF_TIMER | IRQF_SHARED;
|
||||
+ if (!cp0_timer_irq_installed) {
|
||||
+ cp0_timer_irq_installed = 1;
|
||||
+ if (request_irq(evt->irq, c0_compare_interrupt, flags, "timer",
|
||||
+ c0_compare_interrupt))
|
||||
+ pr_err("Failed to request irq %d (timer)\n", evt->irq);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int mips_state_shutdown(struct clock_event_device *evt)
|
||||
+{
|
||||
+ if (cp0_timer_irq_installed) {
|
||||
+ cp0_timer_irq_installed = 0;
|
||||
+ free_irq(evt->irq, NULL);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static int mips_next_event(unsigned long delta,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
@@ -292,7 +317,9 @@ core_initcall(r4k_register_cpufreq_notif
|
||||
|
||||
int r4k_clockevent_init(void)
|
||||
{
|
||||
+#ifndef CONFIG_CEVT_SYSTICK_QUIRK
|
||||
unsigned long flags = IRQF_PERCPU | IRQF_TIMER | IRQF_SHARED;
|
||||
+#endif
|
||||
unsigned int cpu = smp_processor_id();
|
||||
struct clock_event_device *cd;
|
||||
unsigned int irq, min_delta;
|
||||
@@ -322,11 +349,16 @@ int r4k_clockevent_init(void)
|
||||
cd->rating = 300;
|
||||
cd->irq = irq;
|
||||
cd->cpumask = cpumask_of(cpu);
|
||||
+#ifdef CONFIG_CEVT_SYSTICK_QUIRK
|
||||
+ cd->set_state_shutdown = mips_state_shutdown;
|
||||
+ cd->set_state_oneshot = mips_state_oneshot;
|
||||
+#endif
|
||||
cd->set_next_event = mips_next_event;
|
||||
cd->event_handler = mips_event_handler;
|
||||
|
||||
clockevents_config_and_register(cd, mips_hpt_frequency, min_delta, 0x7fffffff);
|
||||
|
||||
+#ifndef CONFIG_CEVT_SYSTICK_QUIRK
|
||||
if (cp0_timer_irq_installed)
|
||||
return 0;
|
||||
|
||||
@@ -335,6 +367,7 @@ int r4k_clockevent_init(void)
|
||||
if (request_irq(irq, c0_compare_interrupt, flags, "timer",
|
||||
c0_compare_interrupt))
|
||||
pr_err("Failed to request irq %d (timer)\n", irq);
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,195 @@
|
||||
From bd30f19a006fb52bac80c6463c49dd2f4159f4ac Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 28 Jul 2013 16:26:41 +0200
|
||||
Subject: [PATCH 06/53] MIPS: ralink: add cpu frequency scaling
|
||||
|
||||
This feature will break udelay() and cause the delay loop to have longer delays
|
||||
when the frequency is scaled causing a performance hit.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
arch/mips/ralink/cevt-rt3352.c | 38 ++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 38 insertions(+)
|
||||
|
||||
--- a/arch/mips/ralink/cevt-rt3352.c
|
||||
+++ b/arch/mips/ralink/cevt-rt3352.c
|
||||
@@ -29,6 +29,10 @@
|
||||
/* enable the counter */
|
||||
#define CFG_CNT_EN 0x1
|
||||
|
||||
+/* mt7620 frequency scaling defines */
|
||||
+#define CLK_LUT_CFG 0x40
|
||||
+#define SLEEP_EN BIT(31)
|
||||
+
|
||||
struct systick_device {
|
||||
void __iomem *membase;
|
||||
struct clock_event_device dev;
|
||||
@@ -36,21 +40,53 @@ struct systick_device {
|
||||
int freq_scale;
|
||||
};
|
||||
|
||||
+static void (*systick_freq_scaling)(struct systick_device *sdev, int status);
|
||||
+
|
||||
static int systick_set_oneshot(struct clock_event_device *evt);
|
||||
static int systick_shutdown(struct clock_event_device *evt);
|
||||
|
||||
+static inline void mt7620_freq_scaling(struct systick_device *sdev, int status)
|
||||
+{
|
||||
+ if (sdev->freq_scale == status)
|
||||
+ return;
|
||||
+
|
||||
+ sdev->freq_scale = status;
|
||||
+
|
||||
+ pr_info("%s: %s autosleep mode\n", sdev->dev.name,
|
||||
+ (status) ? ("enable") : ("disable"));
|
||||
+ if (status)
|
||||
+ rt_sysc_w32(rt_sysc_r32(CLK_LUT_CFG) | SLEEP_EN, CLK_LUT_CFG);
|
||||
+ else
|
||||
+ rt_sysc_w32(rt_sysc_r32(CLK_LUT_CFG) & ~SLEEP_EN, CLK_LUT_CFG);
|
||||
+}
|
||||
+
|
||||
+static inline unsigned int read_count(struct systick_device *sdev)
|
||||
+{
|
||||
+ return ioread32(sdev->membase + SYSTICK_COUNT);
|
||||
+}
|
||||
+
|
||||
+static inline unsigned int read_compare(struct systick_device *sdev)
|
||||
+{
|
||||
+ return ioread32(sdev->membase + SYSTICK_COMPARE);
|
||||
+}
|
||||
+
|
||||
+static inline void write_compare(struct systick_device *sdev, unsigned int val)
|
||||
+{
|
||||
+ iowrite32(val, sdev->membase + SYSTICK_COMPARE);
|
||||
+}
|
||||
+
|
||||
static int systick_next_event(unsigned long delta,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
struct systick_device *sdev;
|
||||
- u32 count;
|
||||
+ int res;
|
||||
|
||||
sdev = container_of(evt, struct systick_device, dev);
|
||||
- count = ioread32(sdev->membase + SYSTICK_COUNT);
|
||||
- count = (count + delta) % SYSTICK_FREQ;
|
||||
- iowrite32(count, sdev->membase + SYSTICK_COMPARE);
|
||||
+ delta += read_count(sdev);
|
||||
+ write_compare(sdev, delta);
|
||||
+ res = ((int)(read_count(sdev) - delta) >= 0) ? -ETIME : 0;
|
||||
|
||||
- return 0;
|
||||
+ return res;
|
||||
}
|
||||
|
||||
static void systick_event_handler(struct clock_event_device *dev)
|
||||
@@ -60,20 +96,25 @@ static void systick_event_handler(struct
|
||||
|
||||
static irqreturn_t systick_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
- struct clock_event_device *dev = (struct clock_event_device *) dev_id;
|
||||
+ int ret = 0;
|
||||
+ struct clock_event_device *cdev;
|
||||
+ struct systick_device *sdev;
|
||||
|
||||
- dev->event_handler(dev);
|
||||
+ if (read_c0_cause() & STATUSF_IP7) {
|
||||
+ cdev = (struct clock_event_device *) dev_id;
|
||||
+ sdev = container_of(cdev, struct systick_device, dev);
|
||||
+
|
||||
+ /* Clear Count/Compare Interrupt */
|
||||
+ write_compare(sdev, read_compare(sdev));
|
||||
+ cdev->event_handler(cdev);
|
||||
+ ret = 1;
|
||||
+ }
|
||||
|
||||
- return IRQ_HANDLED;
|
||||
+ return IRQ_RETVAL(ret);
|
||||
}
|
||||
|
||||
static struct systick_device systick = {
|
||||
.dev = {
|
||||
- /*
|
||||
- * cevt-r4k uses 300, make sure systick
|
||||
- * gets used if available
|
||||
- */
|
||||
- .rating = 310,
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.set_next_event = systick_next_event,
|
||||
.set_state_shutdown = systick_shutdown,
|
||||
@@ -91,7 +132,13 @@ static int systick_shutdown(struct clock
|
||||
if (sdev->irq_requested)
|
||||
free_irq(systick.dev.irq, &systick.dev);
|
||||
sdev->irq_requested = 0;
|
||||
- iowrite32(0, systick.membase + SYSTICK_CONFIG);
|
||||
+ iowrite32(CFG_CNT_EN, systick.membase + SYSTICK_CONFIG);
|
||||
+
|
||||
+ if (systick_freq_scaling)
|
||||
+ systick_freq_scaling(sdev, 0);
|
||||
+
|
||||
+ if (systick_freq_scaling)
|
||||
+ systick_freq_scaling(sdev, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -116,33 +163,46 @@ static int systick_set_oneshot(struct cl
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static const struct of_device_id systick_match[] = {
|
||||
+ { .compatible = "ralink,mt7620a-systick", .data = mt7620_freq_scaling},
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
static int __init ralink_systick_init(struct device_node *np)
|
||||
{
|
||||
- int ret;
|
||||
+ const struct of_device_id *match;
|
||||
+ int rating = 200;
|
||||
|
||||
systick.membase = of_iomap(np, 0);
|
||||
if (!systick.membase)
|
||||
return -ENXIO;
|
||||
|
||||
- systick.dev.name = np->name;
|
||||
- clockevents_calc_mult_shift(&systick.dev, SYSTICK_FREQ, 60);
|
||||
- systick.dev.max_delta_ns = clockevent_delta2ns(0x7fff, &systick.dev);
|
||||
- systick.dev.max_delta_ticks = 0x7fff;
|
||||
- systick.dev.min_delta_ns = clockevent_delta2ns(0x3, &systick.dev);
|
||||
- systick.dev.min_delta_ticks = 0x3;
|
||||
+ match = of_match_node(systick_match, np);
|
||||
+ if (match) {
|
||||
+ systick_freq_scaling = match->data;
|
||||
+ /*
|
||||
+ * cevt-r4k uses 300, make sure systick
|
||||
+ * gets used if available
|
||||
+ */
|
||||
+ rating = 310;
|
||||
+ }
|
||||
+
|
||||
+ /* enable counter than register clock source */
|
||||
+ iowrite32(CFG_CNT_EN, systick.membase + SYSTICK_CONFIG);
|
||||
+ clocksource_mmio_init(systick.membase + SYSTICK_COUNT, np->name,
|
||||
+ SYSTICK_FREQ, rating, 16, clocksource_mmio_readl_up);
|
||||
+
|
||||
+ /* register clock event */
|
||||
systick.dev.irq = irq_of_parse_and_map(np, 0);
|
||||
if (!systick.dev.irq) {
|
||||
pr_err("%pOFn: request_irq failed", np);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- ret = clocksource_mmio_init(systick.membase + SYSTICK_COUNT, np->name,
|
||||
- SYSTICK_FREQ, 301, 16,
|
||||
- clocksource_mmio_readl_up);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- clockevents_register_device(&systick.dev);
|
||||
+ systick.dev.name = np->name;
|
||||
+ systick.dev.rating = rating;
|
||||
+ systick.dev.cpumask = cpumask_of(0);
|
||||
+ clockevents_config_and_register(&systick.dev, SYSTICK_FREQ, 0x3, 0x7fff);
|
||||
|
||||
pr_info("%pOFn: running - mult: %d, shift: %d\n",
|
||||
np, systick.dev.mult, systick.dev.shift);
|
||||
@ -0,0 +1,63 @@
|
||||
From f15d27f9c90ede4b16eb37f9ae573ef81c2b6996 Mon Sep 17 00:00:00 2001
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Thu, 31 Dec 2020 18:49:12 +0100
|
||||
Subject: [PATCH] MIPS: add bootargs-override property
|
||||
|
||||
Add support for the bootargs-override property to the chosen node
|
||||
similar to the one used on ipq806x or mpc85xx.
|
||||
|
||||
This is necessary, as the U-Boot used on some boards, notably the
|
||||
Ubiquiti UniFi 6 Lite, overwrite the bootargs property of the chosen
|
||||
node leading to a kernel panic when loading OpenWrt.
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
---
|
||||
arch/mips/kernel/setup.c | 30 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
--- a/arch/mips/kernel/setup.c
|
||||
+++ b/arch/mips/kernel/setup.c
|
||||
@@ -544,8 +544,28 @@ static int __init bootcmdline_scan_chose
|
||||
|
||||
#endif /* CONFIG_OF_EARLY_FLATTREE */
|
||||
|
||||
+static int __init bootcmdline_scan_chosen_override(unsigned long node, const char *uname,
|
||||
+ int depth, void *data)
|
||||
+{
|
||||
+ bool *dt_bootargs = data;
|
||||
+ const char *p;
|
||||
+ int l;
|
||||
+
|
||||
+ if (depth != 1 || !data || strcmp(uname, "chosen") != 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ p = of_get_flat_dt_prop(node, "bootargs-override", &l);
|
||||
+ if (p != NULL && l > 0) {
|
||||
+ strlcpy(boot_command_line, p, COMMAND_LINE_SIZE);
|
||||
+ *dt_bootargs = true;
|
||||
+ }
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
static void __init bootcmdline_init(void)
|
||||
{
|
||||
+ bool dt_bootargs_override = false;
|
||||
bool dt_bootargs = false;
|
||||
|
||||
/*
|
||||
@@ -559,6 +579,14 @@ static void __init bootcmdline_init(void
|
||||
}
|
||||
|
||||
/*
|
||||
+ * If bootargs-override in the chosen node is set, use this as the
|
||||
+ * command line
|
||||
+ */
|
||||
+ of_scan_flat_dt(bootcmdline_scan_chosen_override, &dt_bootargs_override);
|
||||
+ if (dt_bootargs_override)
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
* If the user specified a built-in command line &
|
||||
* MIPS_CMDLINE_BUILTIN_EXTEND, then the built-in command line is
|
||||
* prepended to arguments from the bootloader or DT so we'll copy them
|
||||
@ -0,0 +1,28 @@
|
||||
From 5ede027f6c4a57ed25da872420508b7f1168b36b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Mon, 7 Dec 2015 17:15:32 +0100
|
||||
Subject: [PATCH 13/53] owrt: hack: fix mt7688 cache issue
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
arch/mips/kernel/setup.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/mips/kernel/setup.c
|
||||
+++ b/arch/mips/kernel/setup.c
|
||||
@@ -686,7 +686,6 @@ static void __init arch_mem_init(char **
|
||||
mips_reserve_vmcore();
|
||||
|
||||
mips_parse_crashkernel();
|
||||
- device_tree_init();
|
||||
|
||||
/*
|
||||
* In order to reduce the possibility of kernel panic when failed to
|
||||
@@ -803,6 +802,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
cpu_cache_init();
|
||||
paging_init();
|
||||
+ device_tree_init();
|
||||
|
||||
memblock_dump_all();
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
From 9e6ce539092a1dd605a20bf73c655a9de58d8641 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Mon, 7 Dec 2015 17:18:05 +0100
|
||||
Subject: [PATCH 15/53] arch: mips: do not select illegal access driver by
|
||||
default
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
arch/mips/ralink/Kconfig | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/arch/mips/ralink/Kconfig
|
||||
+++ b/arch/mips/ralink/Kconfig
|
||||
@@ -14,9 +14,9 @@ config CLKEVT_RT3352
|
||||
select CEVT_SYSTICK_QUIRK
|
||||
|
||||
config RALINK_ILL_ACC
|
||||
- bool
|
||||
+ bool "illegal access irq"
|
||||
depends on SOC_RT305X
|
||||
- default y
|
||||
+ default n
|
||||
|
||||
config IRQ_INTC
|
||||
bool
|
||||
@ -0,0 +1,74 @@
|
||||
From 6decd1aad15f56b169217789630a0098b496de0e Mon Sep 17 00:00:00 2001
|
||||
From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
|
||||
Date: Wed, 7 Apr 2021 13:07:38 -0700
|
||||
Subject: [PATCH] MIPS: add support for buggy MT7621S core detection
|
||||
|
||||
Most MT7621 SoCs have 2 cores, which is detected and supported properly
|
||||
by CPS.
|
||||
|
||||
Unfortunately, MT7621 SoC has a less common S variant with only one core.
|
||||
On MT7621S, GCR_CONFIG still reports 2 cores, which leads to hangs when
|
||||
starting SMP. CPULAUNCH registers can be used in that case to detect the
|
||||
absence of the second core and override the GCR_CONFIG PCORES field.
|
||||
|
||||
Rework a long-standing OpenWrt patch to override the value of
|
||||
mips_cps_numcores on single-core MT7621 systems.
|
||||
|
||||
Tested on a dual-core MT7621 device (Ubiquiti ER-X) and a single-core
|
||||
MT7621 device (Netgear R6220).
|
||||
|
||||
Original 4.14 OpenWrt patch:
|
||||
Link: https://git.openwrt.org/?p=openwrt/openwrt.git;a=commitdiff;h=4cdbc90a376dd0555201c1434a2081e055e9ceb7
|
||||
Current 5.10 OpenWrt patch:
|
||||
Link: https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob;f=target/linux/ramips/patches-5.10/320-mt7621-core-detect-hack.patch;h=c63f0f4c1ec742e24d8480e80553863744b58f6a;hb=10267e17299806f9885d086147878f6c492cb904
|
||||
|
||||
Suggested-by: Felix Fietkau <nbd@nbd.name>
|
||||
Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
|
||||
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||
---
|
||||
arch/mips/include/asm/mips-cps.h | 23 ++++++++++++++++++++++-
|
||||
1 file changed, 22 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/mips/include/asm/mips-cps.h
|
||||
+++ b/arch/mips/include/asm/mips-cps.h
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
+#include <asm/mips-boards/launch.h>
|
||||
+
|
||||
extern unsigned long __cps_access_bad_size(void)
|
||||
__compiletime_error("Bad size for CPS accessor");
|
||||
|
||||
@@ -165,11 +167,30 @@ static inline uint64_t mips_cps_cluster_
|
||||
*/
|
||||
static inline unsigned int mips_cps_numcores(unsigned int cluster)
|
||||
{
|
||||
+ unsigned int ncores;
|
||||
+
|
||||
if (!mips_cm_present())
|
||||
return 0;
|
||||
|
||||
/* Add one before masking to handle 0xff indicating no cores */
|
||||
- return (mips_cps_cluster_config(cluster) + 1) & CM_GCR_CONFIG_PCORES;
|
||||
+ ncores = (mips_cps_cluster_config(cluster) + 1) & CM_GCR_CONFIG_PCORES;
|
||||
+
|
||||
+ if (IS_ENABLED(CONFIG_SOC_MT7621)) {
|
||||
+ struct cpulaunch *launch;
|
||||
+
|
||||
+ /*
|
||||
+ * Ralink MT7621S SoC is single core, but the GCR_CONFIG method
|
||||
+ * always reports 2 cores. Check the second core's LAUNCH_FREADY
|
||||
+ * flag to detect if the second core is missing. This method
|
||||
+ * only works before the core has been started.
|
||||
+ */
|
||||
+ launch = (struct cpulaunch *)CKSEG0ADDR(CPULAUNCH);
|
||||
+ launch += 2; /* MT7621 has 2 VPEs per core */
|
||||
+ if (!(launch->flags & LAUNCH_FREADY))
|
||||
+ ncores = 1;
|
||||
+ }
|
||||
+
|
||||
+ return ncores;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -0,0 +1,15 @@
|
||||
--- a/arch/mips/ralink/irq-gic.c
|
||||
+++ b/arch/mips/ralink/irq-gic.c
|
||||
@@ -13,6 +13,12 @@
|
||||
|
||||
int get_c0_perfcount_int(void)
|
||||
{
|
||||
+ /*
|
||||
+ * Performance counter events are routed through GIC.
|
||||
+ * Prevent them from firing on CPU IRQ7 as well
|
||||
+ */
|
||||
+ clear_c0_status(IE_SW0 << 7);
|
||||
+
|
||||
return gic_get_c0_perfcount_int();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
|
||||
@ -0,0 +1,20 @@
|
||||
From ee9081b2726a5ca8cde5497afdc5425e21ff8f8b Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Mon, 15 Jul 2013 00:39:21 +0200
|
||||
Subject: [PATCH 37/53] mtd: cfi cmdset 0002 force word write
|
||||
|
||||
---
|
||||
drivers/mtd/chips/cfi_cmdset_0002.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
|
||||
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
|
||||
@@ -40,7 +40,7 @@
|
||||
#include <linux/mtd/xip.h>
|
||||
|
||||
#define AMD_BOOTLOC_BUG
|
||||
-#define FORCE_WORD_WRITE 0
|
||||
+#define FORCE_WORD_WRITE 1
|
||||
|
||||
#define MAX_RETRIES 3
|
||||
|
||||
@ -0,0 +1,75 @@
|
||||
From 52d14545d2fc276b1bf9ccf48d4612fab6edfb6a Mon Sep 17 00:00:00 2001
|
||||
From: David Bauer <mail@david-bauer.net>
|
||||
Date: Thu, 6 May 2021 17:49:55 +0200
|
||||
Subject: [PATCH] mtd: spi-nor: Add support for BoHong bh25q128as
|
||||
|
||||
Add MTD support for the BoHong bh25q128as SPI NOR chip.
|
||||
The chip has 16MB of total capacity, divided into a total of 256
|
||||
sectors, each 64KB sized. The chip also supports 4KB sectors.
|
||||
Additionally, it supports dual and quad read modes.
|
||||
|
||||
Functionality was verified on an Tenbay WR1800K / MTK MT7621 board.
|
||||
|
||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
---
|
||||
drivers/mtd/spi-nor/Makefile | 1 +
|
||||
drivers/mtd/spi-nor/bohong.c | 21 +++++++++++++++++++++
|
||||
drivers/mtd/spi-nor/core.c | 1 +
|
||||
drivers/mtd/spi-nor/core.h | 1 +
|
||||
4 files changed, 24 insertions(+)
|
||||
create mode 100644 drivers/mtd/spi-nor/bohong.c
|
||||
|
||||
--- a/drivers/mtd/spi-nor/Makefile
|
||||
+++ b/drivers/mtd/spi-nor/Makefile
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
spi-nor-objs := core.o sfdp.o swp.o otp.o sysfs.o
|
||||
spi-nor-objs += atmel.o
|
||||
+spi-nor-objs += bohong.o
|
||||
spi-nor-objs += catalyst.o
|
||||
spi-nor-objs += eon.o
|
||||
spi-nor-objs += esmt.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/mtd/spi-nor/bohong.c
|
||||
@@ -0,0 +1,21 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Copyright (C) 2005, Intec Automation Inc.
|
||||
+ * Copyright (C) 2014, Freescale Semiconductor, Inc.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/mtd/spi-nor.h>
|
||||
+
|
||||
+#include "core.h"
|
||||
+
|
||||
+static const struct flash_info bohong_parts[] = {
|
||||
+ /* BoHong Microelectronics */
|
||||
+ { "bh25q128as", INFO(0x684018, 0, 64 * 1024, 256,
|
||||
+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
+};
|
||||
+
|
||||
+const struct spi_nor_manufacturer spi_nor_bohong = {
|
||||
+ .name = "bohong",
|
||||
+ .parts = bohong_parts,
|
||||
+ .nparts = ARRAY_SIZE(bohong_parts),
|
||||
+};
|
||||
--- a/drivers/mtd/spi-nor/core.c
|
||||
+++ b/drivers/mtd/spi-nor/core.c
|
||||
@@ -1832,6 +1832,7 @@ int spi_nor_sr2_bit7_quad_enable(struct
|
||||
|
||||
static const struct spi_nor_manufacturer *manufacturers[] = {
|
||||
&spi_nor_atmel,
|
||||
+ &spi_nor_bohong,
|
||||
&spi_nor_catalyst,
|
||||
&spi_nor_eon,
|
||||
&spi_nor_esmt,
|
||||
--- a/drivers/mtd/spi-nor/core.h
|
||||
+++ b/drivers/mtd/spi-nor/core.h
|
||||
@@ -473,6 +473,7 @@ struct sfdp {
|
||||
|
||||
/* Manufacturer drivers. */
|
||||
extern const struct spi_nor_manufacturer spi_nor_atmel;
|
||||
+extern const struct spi_nor_manufacturer spi_nor_bohong;
|
||||
extern const struct spi_nor_manufacturer spi_nor_catalyst;
|
||||
extern const struct spi_nor_manufacturer spi_nor_eon;
|
||||
extern const struct spi_nor_manufacturer spi_nor_esmt;
|
||||
@ -0,0 +1,47 @@
|
||||
From e84e2430ee0e483842b4ff013ae8a6e7e2fa2734 Mon Sep 17 00:00:00 2001
|
||||
From: Weijie Gao <weijie.gao@mediatek.com>
|
||||
Date: Wed, 1 Apr 2020 02:07:58 +0800
|
||||
Subject: [PATCH 1/2] mtd: rawnand: add driver support for MT7621 nand
|
||||
flash controller
|
||||
|
||||
This patch adds NAND flash controller driver for MediaTek MT7621 SoC.
|
||||
|
||||
The NAND flash controller is similar with controllers described in
|
||||
mtk_nand.c, except that the controller from MT7621 doesn't support DMA
|
||||
transmission, and some registers' offset and fields are different.
|
||||
|
||||
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/Kconfig | 8 +
|
||||
drivers/mtd/nand/raw/Makefile | 1 +
|
||||
drivers/mtd/nand/raw/mt7621_nand.c | 1348 ++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 1357 insertions(+)
|
||||
create mode 100644 drivers/mtd/nand/raw/mt7621_nand.c
|
||||
|
||||
--- a/drivers/mtd/nand/raw/Kconfig
|
||||
+++ b/drivers/mtd/nand/raw/Kconfig
|
||||
@@ -358,6 +358,14 @@ config MTD_NAND_QCOM
|
||||
Enables support for NAND flash chips on SoCs containing the EBI2 NAND
|
||||
controller. This controller is found on IPQ806x SoC.
|
||||
|
||||
+config MTD_NAND_MT7621
|
||||
+ tristate "MT7621 NAND controller"
|
||||
+ depends on SOC_MT7621 || COMPILE_TEST
|
||||
+ depends on HAS_IOMEM
|
||||
+ help
|
||||
+ Enables support for NAND controller on MT7621 SoC.
|
||||
+ This driver uses PIO mode for data transmission instead of DMA mode.
|
||||
+
|
||||
config MTD_NAND_MTK
|
||||
tristate "MTK NAND controller"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
--- a/drivers/mtd/nand/raw/Makefile
|
||||
+++ b/drivers/mtd/nand/raw/Makefile
|
||||
@@ -48,6 +48,7 @@ obj-$(CONFIG_MTD_NAND_SUNXI) += sunxi_n
|
||||
obj-$(CONFIG_MTD_NAND_HISI504) += hisi504_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_BRCMNAND) += brcmnand/
|
||||
obj-$(CONFIG_MTD_NAND_QCOM) += qcom_nandc.o
|
||||
+obj-$(CONFIG_MTD_NAND_MT7621) += mt7621_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_MTK) += mtk_ecc.o mtk_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_MXIC) += mxic_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_TEGRA) += tegra_nand.o
|
||||
@ -0,0 +1,85 @@
|
||||
From 3d5f4da8296b23eb3abf8b13122b0d06a215e79c Mon Sep 17 00:00:00 2001
|
||||
From: Weijie Gao <weijie.gao@mediatek.com>
|
||||
Date: Wed, 1 Apr 2020 02:07:59 +0800
|
||||
Subject: [PATCH 2/2] dt-bindings: add documentation for mt7621-nand driver
|
||||
|
||||
This patch adds documentation for MediaTek MT7621 NAND flash controller
|
||||
driver.
|
||||
|
||||
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
|
||||
---
|
||||
.../bindings/mtd/mediatek,mt7621-nfc.yaml | 68 ++++++++++++++++++++++
|
||||
1 file changed, 68 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/mtd/mediatek,mt7621-nfc.yaml
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/mtd/mediatek,mt7621-nfc.yaml
|
||||
@@ -0,0 +1,68 @@
|
||||
+# SPDX-License-Identifier: GPL-2.0
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/mtd/mediatek,mt7621-nfc.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: MediaTek MT7621 SoC NAND Flash Controller (NFC) DT binding
|
||||
+
|
||||
+maintainers:
|
||||
+ - Weijie Gao <weijie.gao@mediatek.com>
|
||||
+
|
||||
+description: |
|
||||
+ This driver uses a single node to describe both NAND Flash controller
|
||||
+ interface (NFI) and ECC engine for MT7621 SoC.
|
||||
+ MT7621 supports only one chip select.
|
||||
+
|
||||
+properties:
|
||||
+ "#address-cells": false
|
||||
+ "#size-cells": false
|
||||
+
|
||||
+ compatible:
|
||||
+ enum:
|
||||
+ - mediatek,mt7621-nfc
|
||||
+
|
||||
+ reg:
|
||||
+ items:
|
||||
+ - description: Register base of NFI core
|
||||
+ - description: Register base of ECC engine
|
||||
+
|
||||
+ reg-names:
|
||||
+ items:
|
||||
+ - const: nfi
|
||||
+ - const: ecc
|
||||
+
|
||||
+ clocks:
|
||||
+ items:
|
||||
+ - description: Source clock for NFI core, fixed 125MHz
|
||||
+
|
||||
+ clock-names:
|
||||
+ items:
|
||||
+ - const: nfi_clk
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - reg-names
|
||||
+ - clocks
|
||||
+ - clock-names
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ nficlock: nficlock {
|
||||
+ #clock-cells = <0>;
|
||||
+ compatible = "fixed-clock";
|
||||
+
|
||||
+ clock-frequency = <125000000>;
|
||||
+ };
|
||||
+
|
||||
+ nand@1e003000 {
|
||||
+ compatible = "mediatek,mt7621-nfc";
|
||||
+
|
||||
+ reg = <0x1e003000 0x800
|
||||
+ 0x1e003800 0x800>;
|
||||
+ reg-names = "nfi", "ecc";
|
||||
+
|
||||
+ clocks = <&nficlock>;
|
||||
+ clock-names = "nfi_clk";
|
||||
+ };
|
||||
@ -0,0 +1,34 @@
|
||||
From bd0f89de5476ca25e73fae829ba3e1dafae1d90d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= <opensource@vdorst.com>
|
||||
Date: Fri, 21 Jun 2019 10:04:05 +0200
|
||||
Subject: [PATCH] net: ethernet: mediatek: support net-labels
|
||||
|
||||
With this patch, device name can be set within dts file in the same way as dsa
|
||||
port can.
|
||||
Add: label = "wan"; to GMAC node.
|
||||
|
||||
Signed-off-by: René van Dorst <opensource@vdorst.com>
|
||||
---
|
||||
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -2968,6 +2968,7 @@ static const struct net_device_ops mtk_n
|
||||
|
||||
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
|
||||
{
|
||||
+ const char *name = of_get_property(np, "label", NULL);
|
||||
const __be32 *_id = of_get_property(np, "reg", NULL);
|
||||
phy_interface_t phy_mode;
|
||||
struct phylink *phylink;
|
||||
@@ -3063,6 +3064,9 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||
else
|
||||
eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN;
|
||||
|
||||
+ if (name)
|
||||
+ strlcpy(eth->netdev[id]->name, name, IFNAMSIZ);
|
||||
+
|
||||
return 0;
|
||||
|
||||
free_netdev:
|
||||
184
target/linux/ramips/patches-5.15/710-at803x.patch
Normal file
184
target/linux/ramips/patches-5.15/710-at803x.patch
Normal file
@ -0,0 +1,184 @@
|
||||
From 924453aa9d2324e5611f8e2b71df746d8f0c79f1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= <opensource@vdorst.com>
|
||||
Date: Fri, 13 Nov 2020 16:11:32 +0100
|
||||
Subject: [PATCH] net: phy: at803x: add support for SFP module in
|
||||
RGMII-to-x-base mode
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: René van Dorst <opensource@vdorst.com>
|
||||
---
|
||||
drivers/net/phy/at803x.c | 91 ++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 91 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/at803x.c
|
||||
+++ b/drivers/net/phy/at803x.c
|
||||
@@ -20,6 +20,8 @@
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <dt-bindings/net/qca-ar803x.h>
|
||||
+#include <linux/sfp.h>
|
||||
+#include <linux/phylink.h>
|
||||
|
||||
#define AT803X_SPECIFIC_FUNCTION_CONTROL 0x10
|
||||
#define AT803X_SFC_ASSERT_CRS BIT(11)
|
||||
@@ -82,9 +84,18 @@
|
||||
|
||||
#define AT803X_MODE_CFG_MASK 0x0F
|
||||
#define AT803X_MODE_CFG_SGMII 0x01
|
||||
+#define AT803X_MODE_CFG_BX1000_RGMII_50 0x02
|
||||
+#define AT803X_MODE_CFG_BX1000_RGMII_75 0x03
|
||||
+#define AT803X_MODE_FIBER 0x01
|
||||
+#define AT803X_MODE_COPPER 0x00
|
||||
|
||||
#define AT803X_PSSR 0x11 /*PHY-Specific Status Register*/
|
||||
#define AT803X_PSSR_MR_AN_COMPLETE 0x0200
|
||||
+#define PSSR_LINK BIT(10)
|
||||
+#define PSSR_SYNC_STATUS BIT(8)
|
||||
+#define PSSR_DUPLEX BIT(13)
|
||||
+#define PSSR_SPEED_1000 BIT(15)
|
||||
+#define PSSR_SPEED_100 BIT(14)
|
||||
|
||||
#define AT803X_DEBUG_ANALOG_TEST_CTRL 0x00
|
||||
#define QCA8327_DEBUG_MANU_CTRL_EN BIT(2)
|
||||
@@ -652,12 +663,75 @@ static int at803x_parse_dt(struct phy_de
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int at803x_mode(struct phy_device *phydev)
|
||||
+{
|
||||
+ int mode;
|
||||
+
|
||||
+ mode = phy_read(phydev, AT803X_REG_CHIP_CONFIG) & AT803X_MODE_CFG_MASK;
|
||||
+
|
||||
+ if (mode == AT803X_MODE_CFG_BX1000_RGMII_50 ||
|
||||
+ mode == AT803X_MODE_CFG_BX1000_RGMII_75)
|
||||
+ return AT803X_MODE_FIBER;
|
||||
+ return AT803X_MODE_COPPER;
|
||||
+}
|
||||
+
|
||||
+static int at803x_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
|
||||
+{
|
||||
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(at803x_support) = { 0, };
|
||||
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
|
||||
+ struct phy_device *phydev = upstream;
|
||||
+ phy_interface_t iface;
|
||||
+
|
||||
+ phylink_set(at803x_support, 1000baseX_Full);
|
||||
+ /* AT803x only support 1000baseX but SGMII works fine when module runs
|
||||
+ * at 1Gbit.
|
||||
+ */
|
||||
+ phylink_set(at803x_support, 1000baseT_Full);
|
||||
+
|
||||
+ sfp_parse_support(phydev->sfp_bus, id, support);
|
||||
+
|
||||
+ // Limit to interfaces that both sides support
|
||||
+ linkmode_and(support, support, at803x_support);
|
||||
+
|
||||
+ if (linkmode_empty(support))
|
||||
+ goto unsupported_mode;
|
||||
+
|
||||
+ iface = sfp_select_interface(phydev->sfp_bus, support);
|
||||
+
|
||||
+ if (iface != PHY_INTERFACE_MODE_SGMII &&
|
||||
+ iface != PHY_INTERFACE_MODE_1000BASEX)
|
||||
+ goto unsupported_mode;
|
||||
+
|
||||
+ dev_info(&phydev->mdio.dev, "SFP interface %s", phy_modes(iface));
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+unsupported_mode:
|
||||
+ dev_info(&phydev->mdio.dev, "incompatible SFP module inserted;"
|
||||
+ "Only SGMII at 1Gbit/1000BASEX are supported!\n");
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static const struct sfp_upstream_ops at803x_sfp_ops = {
|
||||
+ .attach = phy_sfp_attach,
|
||||
+ .detach = phy_sfp_detach,
|
||||
+ .module_insert = at803x_sfp_insert,
|
||||
+};
|
||||
+
|
||||
+
|
||||
static int at803x_probe(struct phy_device *phydev)
|
||||
{
|
||||
struct device *dev = &phydev->mdio.dev;
|
||||
struct at803x_priv *priv;
|
||||
int ret;
|
||||
|
||||
+
|
||||
+ if (at803x_mode(phydev) == AT803X_MODE_FIBER) {
|
||||
+ ret = phy_sfp_probe(phydev, &at803x_sfp_ops);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
@@ -674,6 +748,7 @@ static int at803x_probe(struct phy_devic
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if 0
|
||||
/* Some bootloaders leave the fiber page selected.
|
||||
* Switch to the copper page, as otherwise we read
|
||||
* the PHY capabilities from the fiber side.
|
||||
@@ -685,6 +760,7 @@ static int at803x_probe(struct phy_devic
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -711,6 +787,7 @@ static int at803x_get_features(struct ph
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
+#if 0
|
||||
if (phydev->drv->phy_id != ATH8031_PHY_ID)
|
||||
return 0;
|
||||
|
||||
@@ -728,6 +805,7 @@ static int at803x_get_features(struct ph
|
||||
*/
|
||||
linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
|
||||
phydev->supported);
|
||||
+#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -933,6 +1011,10 @@ static int at803x_read_status(struct phy
|
||||
{
|
||||
int ss, err, old_link = phydev->link;
|
||||
|
||||
+ /* Handle (Fiber) SGMII to RGMII mode */
|
||||
+ if (at803x_mode(phydev) == AT803X_MODE_FIBER)
|
||||
+ return genphy_c37_read_status(phydev);
|
||||
+
|
||||
/* Update the link, but return if there was an error */
|
||||
err = genphy_update_link(phydev);
|
||||
if (err)
|
||||
@@ -1033,6 +1115,12 @@ static int at803x_config_aneg(struct phy
|
||||
{
|
||||
int ret;
|
||||
|
||||
+ /* Handle (Fiber) SerDes to RGMII mode */
|
||||
+ if (at803x_mode(phydev) == AT803X_MODE_FIBER) {
|
||||
+ pr_warn("%s: fiber\n", __func__);
|
||||
+ return genphy_c37_config_aneg(phydev);
|
||||
+ }
|
||||
+
|
||||
ret = at803x_config_mdix(phydev, phydev->mdix_ctrl);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -1445,6 +1533,7 @@ static struct phy_driver at803x_driver[]
|
||||
/* Qualcomm Atheros AR8031/AR8033 */
|
||||
PHY_ID_MATCH_EXACT(ATH8031_PHY_ID),
|
||||
.name = "Qualcomm Atheros AR8031/AR8033",
|
||||
+ .config_aneg = at803x_config_aneg,
|
||||
.flags = PHY_POLL_CABLE_TEST,
|
||||
.probe = at803x_probe,
|
||||
.remove = at803x_remove,
|
||||
@ -0,0 +1,118 @@
|
||||
From ffbb1b37a3e1ce1a5c574a6bd4f5aede8bc468ac Mon Sep 17 00:00:00 2001
|
||||
From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
|
||||
Date: Sat, 27 Feb 2021 20:20:07 -0800
|
||||
Subject: [PATCH] Revert "net: phy: simplify phy_link_change arguments"
|
||||
|
||||
This reverts commit a307593a644443db12888f45eed0dafb5869e2cc.
|
||||
|
||||
This brings back the do_carrier flags used by the (hacky) next patch,
|
||||
still required by target/linux/ramips/files/drivers/net/ethernet/ralink/mdio.c
|
||||
---
|
||||
drivers/net/phy/phy.c | 12 ++++++------
|
||||
drivers/net/phy/phy_device.c | 12 +++++++-----
|
||||
drivers/net/phy/phylink.c | 3 ++-
|
||||
include/linux/phy.h | 2 +-
|
||||
4 files changed, 16 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phy.c
|
||||
+++ b/drivers/net/phy/phy.c
|
||||
@@ -58,13 +58,13 @@ static const char *phy_state_to_str(enum
|
||||
|
||||
static void phy_link_up(struct phy_device *phydev)
|
||||
{
|
||||
- phydev->phy_link_change(phydev, true);
|
||||
+ phydev->phy_link_change(phydev, true, true);
|
||||
phy_led_trigger_change_speed(phydev);
|
||||
}
|
||||
|
||||
-static void phy_link_down(struct phy_device *phydev)
|
||||
+static void phy_link_down(struct phy_device *phydev, bool do_carrier)
|
||||
{
|
||||
- phydev->phy_link_change(phydev, false);
|
||||
+ phydev->phy_link_change(phydev, false, do_carrier);
|
||||
phy_led_trigger_change_speed(phydev);
|
||||
}
|
||||
|
||||
@@ -550,7 +550,7 @@ int phy_start_cable_test(struct phy_devi
|
||||
goto out;
|
||||
|
||||
/* Mark the carrier down until the test is complete */
|
||||
- phy_link_down(phydev);
|
||||
+ phy_link_down(phydev, true);
|
||||
|
||||
netif_testing_on(dev);
|
||||
err = phydev->drv->cable_test_start(phydev);
|
||||
@@ -621,7 +621,7 @@ int phy_start_cable_test_tdr(struct phy_
|
||||
goto out;
|
||||
|
||||
/* Mark the carrier down until the test is complete */
|
||||
- phy_link_down(phydev);
|
||||
+ phy_link_down(phydev, true);
|
||||
|
||||
netif_testing_on(dev);
|
||||
err = phydev->drv->cable_test_tdr_start(phydev, config);
|
||||
@@ -693,7 +693,7 @@ static int phy_check_link_status(struct
|
||||
phy_link_up(phydev);
|
||||
} else if (!phydev->link && phydev->state != PHY_NOLINK) {
|
||||
phydev->state = PHY_NOLINK;
|
||||
- phy_link_down(phydev);
|
||||
+ phy_link_down(phydev, true);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1149,7 +1149,7 @@ void phy_state_machine(struct work_struc
|
||||
case PHY_HALTED:
|
||||
if (phydev->link) {
|
||||
phydev->link = 0;
|
||||
- phy_link_down(phydev);
|
||||
+ phy_link_down(phydev, true);
|
||||
}
|
||||
do_suspend = true;
|
||||
break;
|
||||
--- a/drivers/net/phy/phy_device.c
|
||||
+++ b/drivers/net/phy/phy_device.c
|
||||
@@ -1000,14 +1000,16 @@ struct phy_device *phy_find_first(struct
|
||||
}
|
||||
EXPORT_SYMBOL(phy_find_first);
|
||||
|
||||
-static void phy_link_change(struct phy_device *phydev, bool up)
|
||||
+static void phy_link_change(struct phy_device *phydev, bool up, bool do_carrier)
|
||||
{
|
||||
struct net_device *netdev = phydev->attached_dev;
|
||||
|
||||
- if (up)
|
||||
- netif_carrier_on(netdev);
|
||||
- else
|
||||
- netif_carrier_off(netdev);
|
||||
+ if (do_carrier) {
|
||||
+ if (up)
|
||||
+ netif_carrier_on(netdev);
|
||||
+ else
|
||||
+ netif_carrier_off(netdev);
|
||||
+ }
|
||||
phydev->adjust_link(netdev);
|
||||
if (phydev->mii_ts && phydev->mii_ts->link_state)
|
||||
phydev->mii_ts->link_state(phydev->mii_ts, phydev);
|
||||
--- a/drivers/net/phy/phylink.c
|
||||
+++ b/drivers/net/phy/phylink.c
|
||||
@@ -946,7 +946,8 @@ void phylink_destroy(struct phylink *pl)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_destroy);
|
||||
|
||||
-static void phylink_phy_change(struct phy_device *phydev, bool up)
|
||||
+static void phylink_phy_change(struct phy_device *phydev, bool up,
|
||||
+ bool do_carrier)
|
||||
{
|
||||
struct phylink *pl = phydev->phylink;
|
||||
bool tx_pause, rx_pause;
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -663,7 +663,7 @@ struct phy_device {
|
||||
u8 mdix;
|
||||
u8 mdix_ctrl;
|
||||
|
||||
- void (*phy_link_change)(struct phy_device *phydev, bool up);
|
||||
+ void (*phy_link_change)(struct phy_device *, bool up, bool do_carrier);
|
||||
void (*adjust_link)(struct net_device *dev);
|
||||
|
||||
#if IS_ENABLED(CONFIG_MACSEC)
|
||||
@ -0,0 +1,47 @@
|
||||
From 0b6eb1e68290243d439ee330ea8d0b239a5aec69 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 27 Jul 2014 09:38:50 +0100
|
||||
Subject: [PATCH 34/53] NET: multi phy support
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/net/phy/phy.c | 9 ++++++---
|
||||
include/linux/phy.h | 1 +
|
||||
2 files changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/phy/phy.c
|
||||
+++ b/drivers/net/phy/phy.c
|
||||
@@ -693,7 +693,10 @@ static int phy_check_link_status(struct
|
||||
phy_link_up(phydev);
|
||||
} else if (!phydev->link && phydev->state != PHY_NOLINK) {
|
||||
phydev->state = PHY_NOLINK;
|
||||
- phy_link_down(phydev, true);
|
||||
+ if (!phydev->no_auto_carrier_off)
|
||||
+ phy_link_down(phydev, true);
|
||||
+ else
|
||||
+ phy_link_down(phydev, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1149,7 +1152,10 @@ void phy_state_machine(struct work_struc
|
||||
case PHY_HALTED:
|
||||
if (phydev->link) {
|
||||
phydev->link = 0;
|
||||
- phy_link_down(phydev, true);
|
||||
+ if (!phydev->no_auto_carrier_off)
|
||||
+ phy_link_down(phydev, true);
|
||||
+ else
|
||||
+ phy_link_down(phydev, false);
|
||||
}
|
||||
do_suspend = true;
|
||||
break;
|
||||
--- a/include/linux/phy.h
|
||||
+++ b/include/linux/phy.h
|
||||
@@ -582,6 +582,7 @@ struct phy_device {
|
||||
unsigned downshifted_rate:1;
|
||||
unsigned is_on_sfp_module:1;
|
||||
unsigned mac_managed_pm:1;
|
||||
+ unsigned no_auto_carrier_off:1;
|
||||
|
||||
unsigned autoneg:1;
|
||||
/* The most recently read link state */
|
||||
@ -0,0 +1,59 @@
|
||||
From d410e5478c622c01fcf31427533df5f433df9146 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 28 Jul 2013 19:45:30 +0200
|
||||
Subject: [PATCH 26/53] DT: Add documentation for gpio-ralink
|
||||
|
||||
Describe gpio-ralink binding.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: devicetree@vger.kernel.org
|
||||
Cc: linux-gpio@vger.kernel.org
|
||||
---
|
||||
.../devicetree/bindings/gpio/gpio-ralink.txt | 40 ++++++++++++++++++++
|
||||
1 file changed, 40 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/gpio/gpio-ralink.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/gpio/gpio-ralink.txt
|
||||
@@ -0,0 +1,40 @@
|
||||
+Ralink SoC GPIO controller bindings
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible:
|
||||
+ - "ralink,rt2880-gpio" for Ralink controllers
|
||||
+- #gpio-cells : Should be two.
|
||||
+ - first cell is the pin number
|
||||
+ - second cell is used to specify optional parameters (unused)
|
||||
+- gpio-controller : Marks the device node as a GPIO controller
|
||||
+- reg : Physical base address and length of the controller's registers
|
||||
+- interrupt-parent: phandle to the INTC device node
|
||||
+- interrupts : Specify the INTC interrupt number
|
||||
+- ngpios : Specify the number of GPIOs
|
||||
+- ralink,register-map : The register layout depends on the GPIO bank and actual
|
||||
+ SoC type. Register offsets need to be in this order.
|
||||
+ [ INT, EDGE, RENA, FENA, DATA, DIR, POL, SET, RESET, TOGGLE ]
|
||||
+
|
||||
+Optional properties:
|
||||
+- ralink,gpio-base : Specify the GPIO chips base number
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ gpio0: gpio@600 {
|
||||
+ compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
|
||||
+
|
||||
+ #gpio-cells = <2>;
|
||||
+ gpio-controller;
|
||||
+
|
||||
+ reg = <0x600 0x34>;
|
||||
+
|
||||
+ interrupt-parent = <&intc>;
|
||||
+ interrupts = <6>;
|
||||
+
|
||||
+ ngpios = <24>;
|
||||
+ ralink,gpio-base = <0>;
|
||||
+ ralink,register-map = [ 00 04 08 0c
|
||||
+ 20 24 28 2c
|
||||
+ 30 34 ];
|
||||
+
|
||||
+ };
|
||||
@ -0,0 +1,416 @@
|
||||
From 69fdd2c4f937796b934e89c33acde9d082e27bfd Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Mon, 4 Aug 2014 20:36:29 +0200
|
||||
Subject: [PATCH 27/53] GPIO: MIPS: ralink: add gpio driver for ralink SoC
|
||||
|
||||
Add gpio driver for Ralink SoC. This driver makes the gpio core on
|
||||
RT2880, RT305x, rt3352, rt3662, rt3883, rt5350 and mt7620 work.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
Cc: linux-mips@linux-mips.org
|
||||
Cc: linux-gpio@vger.kernel.org
|
||||
---
|
||||
arch/mips/include/asm/mach-ralink/gpio.h | 24 ++
|
||||
drivers/gpio/Kconfig | 6 +
|
||||
drivers/gpio/Makefile | 1 +
|
||||
drivers/gpio/gpio-ralink.c | 355 ++++++++++++++++++++++++++++++
|
||||
4 files changed, 386 insertions(+)
|
||||
create mode 100644 arch/mips/include/asm/mach-ralink/gpio.h
|
||||
create mode 100644 drivers/gpio/gpio-ralink.c
|
||||
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/include/asm/mach-ralink/gpio.h
|
||||
@@ -0,0 +1,24 @@
|
||||
+/*
|
||||
+ * Ralink SoC GPIO API support
|
||||
+ *
|
||||
+ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License version 2 as published
|
||||
+ * by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef __ASM_MACH_RALINK_GPIO_H
|
||||
+#define __ASM_MACH_RALINK_GPIO_H
|
||||
+
|
||||
+#define ARCH_NR_GPIOS 128
|
||||
+#include <asm-generic/gpio.h>
|
||||
+
|
||||
+#define gpio_get_value __gpio_get_value
|
||||
+#define gpio_set_value __gpio_set_value
|
||||
+#define gpio_cansleep __gpio_cansleep
|
||||
+#define gpio_to_irq __gpio_to_irq
|
||||
+
|
||||
+#endif /* __ASM_MACH_RALINK_GPIO_H */
|
||||
--- a/drivers/gpio/Kconfig
|
||||
+++ b/drivers/gpio/Kconfig
|
||||
@@ -569,6 +569,12 @@ config GPIO_SNPS_CREG
|
||||
where only several fields in register belong to GPIO lines and
|
||||
each GPIO line owns a field with different length and on/off value.
|
||||
|
||||
+config GPIO_RALINK
|
||||
+ bool "Ralink GPIO Support"
|
||||
+ depends on RALINK
|
||||
+ help
|
||||
+ Say yes here to support the Ralink SoC GPIO device
|
||||
+
|
||||
config GPIO_SPEAR_SPICS
|
||||
bool "ST SPEAr13xx SPI Chip Select as GPIO support"
|
||||
depends on PLAT_SPEAR
|
||||
--- a/drivers/gpio/Makefile
|
||||
+++ b/drivers/gpio/Makefile
|
||||
@@ -121,6 +121,7 @@ obj-$(CONFIG_GPIO_PISOSR) += gpio-pisos
|
||||
obj-$(CONFIG_GPIO_PL061) += gpio-pl061.o
|
||||
obj-$(CONFIG_GPIO_PMIC_EIC_SPRD) += gpio-pmic-eic-sprd.o
|
||||
obj-$(CONFIG_GPIO_PXA) += gpio-pxa.o
|
||||
+obj-$(CONFIG_GPIO_RALINK) += gpio-ralink.o
|
||||
obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o
|
||||
obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t583.o
|
||||
obj-$(CONFIG_GPIO_RCAR) += gpio-rcar.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpio/gpio-ralink.c
|
||||
@@ -0,0 +1,341 @@
|
||||
+/*
|
||||
+ * This program is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License version 2 as published
|
||||
+ * by the Free Software Foundation.
|
||||
+ *
|
||||
+ * Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+
|
||||
+enum ralink_gpio_reg {
|
||||
+ GPIO_REG_INT = 0,
|
||||
+ GPIO_REG_EDGE,
|
||||
+ GPIO_REG_RENA,
|
||||
+ GPIO_REG_FENA,
|
||||
+ GPIO_REG_DATA,
|
||||
+ GPIO_REG_DIR,
|
||||
+ GPIO_REG_POL,
|
||||
+ GPIO_REG_SET,
|
||||
+ GPIO_REG_RESET,
|
||||
+ GPIO_REG_TOGGLE,
|
||||
+ GPIO_REG_MAX
|
||||
+};
|
||||
+
|
||||
+struct ralink_gpio_chip {
|
||||
+ struct gpio_chip chip;
|
||||
+ u8 regs[GPIO_REG_MAX];
|
||||
+
|
||||
+ spinlock_t lock;
|
||||
+ void __iomem *membase;
|
||||
+ struct irq_domain *domain;
|
||||
+ int irq;
|
||||
+
|
||||
+ u32 rising;
|
||||
+ u32 falling;
|
||||
+};
|
||||
+
|
||||
+#define MAP_MAX 4
|
||||
+static struct irq_domain *irq_map[MAP_MAX];
|
||||
+static int irq_map_count;
|
||||
+static atomic_t irq_refcount = ATOMIC_INIT(0);
|
||||
+
|
||||
+static inline struct ralink_gpio_chip *to_ralink_gpio(struct gpio_chip *chip)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg;
|
||||
+
|
||||
+ rg = container_of(chip, struct ralink_gpio_chip, chip);
|
||||
+
|
||||
+ return rg;
|
||||
+}
|
||||
+
|
||||
+static inline void rt_gpio_w32(struct ralink_gpio_chip *rg, u8 reg, u32 val)
|
||||
+{
|
||||
+ iowrite32(val, rg->membase + rg->regs[reg]);
|
||||
+}
|
||||
+
|
||||
+static inline u32 rt_gpio_r32(struct ralink_gpio_chip *rg, u8 reg)
|
||||
+{
|
||||
+ return ioread32(rg->membase + rg->regs[reg]);
|
||||
+}
|
||||
+
|
||||
+static void ralink_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
|
||||
+
|
||||
+ rt_gpio_w32(rg, (value) ? GPIO_REG_SET : GPIO_REG_RESET, BIT(offset));
|
||||
+}
|
||||
+
|
||||
+static int ralink_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
|
||||
+
|
||||
+ return !!(rt_gpio_r32(rg, GPIO_REG_DATA) & BIT(offset));
|
||||
+}
|
||||
+
|
||||
+static int ralink_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
|
||||
+ unsigned long flags;
|
||||
+ u32 t;
|
||||
+
|
||||
+ spin_lock_irqsave(&rg->lock, flags);
|
||||
+ t = rt_gpio_r32(rg, GPIO_REG_DIR);
|
||||
+ t &= ~BIT(offset);
|
||||
+ rt_gpio_w32(rg, GPIO_REG_DIR, t);
|
||||
+ spin_unlock_irqrestore(&rg->lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ralink_gpio_direction_output(struct gpio_chip *chip,
|
||||
+ unsigned offset, int value)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
|
||||
+ unsigned long flags;
|
||||
+ u32 t;
|
||||
+
|
||||
+ spin_lock_irqsave(&rg->lock, flags);
|
||||
+ ralink_gpio_set(chip, offset, value);
|
||||
+ t = rt_gpio_r32(rg, GPIO_REG_DIR);
|
||||
+ t |= BIT(offset);
|
||||
+ rt_gpio_w32(rg, GPIO_REG_DIR, t);
|
||||
+ spin_unlock_irqrestore(&rg->lock, flags);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ralink_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
|
||||
+
|
||||
+ if (rg->irq < 1)
|
||||
+ return -1;
|
||||
+
|
||||
+ return irq_create_mapping(rg->domain, pin);
|
||||
+}
|
||||
+
|
||||
+static void ralink_gpio_irq_handler(struct irq_desc *desc)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < irq_map_count; i++) {
|
||||
+ struct irq_domain *domain = irq_map[i];
|
||||
+ struct ralink_gpio_chip *rg;
|
||||
+ unsigned long pending;
|
||||
+ int bit;
|
||||
+
|
||||
+ rg = (struct ralink_gpio_chip *) domain->host_data;
|
||||
+ pending = rt_gpio_r32(rg, GPIO_REG_INT);
|
||||
+
|
||||
+ for_each_set_bit(bit, &pending, rg->chip.ngpio) {
|
||||
+ u32 map = irq_find_mapping(domain, bit);
|
||||
+ generic_handle_irq(map);
|
||||
+ rt_gpio_w32(rg, GPIO_REG_INT, BIT(bit));
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void ralink_gpio_irq_unmask(struct irq_data *d)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg;
|
||||
+ unsigned long flags;
|
||||
+ u32 rise, fall;
|
||||
+
|
||||
+ rg = (struct ralink_gpio_chip *) d->domain->host_data;
|
||||
+ rise = rt_gpio_r32(rg, GPIO_REG_RENA);
|
||||
+ fall = rt_gpio_r32(rg, GPIO_REG_FENA);
|
||||
+
|
||||
+ spin_lock_irqsave(&rg->lock, flags);
|
||||
+ rt_gpio_w32(rg, GPIO_REG_RENA, rise | (BIT(d->hwirq) & rg->rising));
|
||||
+ rt_gpio_w32(rg, GPIO_REG_FENA, fall | (BIT(d->hwirq) & rg->falling));
|
||||
+ spin_unlock_irqrestore(&rg->lock, flags);
|
||||
+}
|
||||
+
|
||||
+static void ralink_gpio_irq_mask(struct irq_data *d)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg;
|
||||
+ unsigned long flags;
|
||||
+ u32 rise, fall;
|
||||
+
|
||||
+ rg = (struct ralink_gpio_chip *) d->domain->host_data;
|
||||
+ rise = rt_gpio_r32(rg, GPIO_REG_RENA);
|
||||
+ fall = rt_gpio_r32(rg, GPIO_REG_FENA);
|
||||
+
|
||||
+ spin_lock_irqsave(&rg->lock, flags);
|
||||
+ rt_gpio_w32(rg, GPIO_REG_FENA, fall & ~BIT(d->hwirq));
|
||||
+ rt_gpio_w32(rg, GPIO_REG_RENA, rise & ~BIT(d->hwirq));
|
||||
+ spin_unlock_irqrestore(&rg->lock, flags);
|
||||
+}
|
||||
+
|
||||
+static int ralink_gpio_irq_type(struct irq_data *d, unsigned int type)
|
||||
+{
|
||||
+ struct ralink_gpio_chip *rg;
|
||||
+ u32 mask = BIT(d->hwirq);
|
||||
+
|
||||
+ rg = (struct ralink_gpio_chip *) d->domain->host_data;
|
||||
+
|
||||
+ if (type == IRQ_TYPE_PROBE) {
|
||||
+ if ((rg->rising | rg->falling) & mask)
|
||||
+ return 0;
|
||||
+
|
||||
+ type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
|
||||
+ }
|
||||
+
|
||||
+ if (type & IRQ_TYPE_EDGE_RISING)
|
||||
+ rg->rising |= mask;
|
||||
+ else
|
||||
+ rg->rising &= ~mask;
|
||||
+
|
||||
+ if (type & IRQ_TYPE_EDGE_FALLING)
|
||||
+ rg->falling |= mask;
|
||||
+ else
|
||||
+ rg->falling &= ~mask;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip ralink_gpio_irq_chip = {
|
||||
+ .name = "GPIO",
|
||||
+ .irq_unmask = ralink_gpio_irq_unmask,
|
||||
+ .irq_mask = ralink_gpio_irq_mask,
|
||||
+ .irq_mask_ack = ralink_gpio_irq_mask,
|
||||
+ .irq_set_type = ralink_gpio_irq_type,
|
||||
+};
|
||||
+
|
||||
+static int gpio_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
|
||||
+{
|
||||
+ irq_set_chip_and_handler(irq, &ralink_gpio_irq_chip, handle_level_irq);
|
||||
+ irq_set_handler_data(irq, d);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_domain_ops irq_domain_ops = {
|
||||
+ .xlate = irq_domain_xlate_onecell,
|
||||
+ .map = gpio_map,
|
||||
+};
|
||||
+
|
||||
+static void ralink_gpio_irq_init(struct device_node *np,
|
||||
+ struct ralink_gpio_chip *rg)
|
||||
+{
|
||||
+ if (irq_map_count >= MAP_MAX)
|
||||
+ return;
|
||||
+
|
||||
+ rg->irq = irq_of_parse_and_map(np, 0);
|
||||
+ if (!rg->irq)
|
||||
+ return;
|
||||
+
|
||||
+ rg->domain = irq_domain_add_linear(np, rg->chip.ngpio,
|
||||
+ &irq_domain_ops, rg);
|
||||
+ if (!rg->domain) {
|
||||
+ dev_err(rg->chip.parent, "irq_domain_add_linear failed\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ irq_map[irq_map_count++] = rg->domain;
|
||||
+
|
||||
+ rt_gpio_w32(rg, GPIO_REG_RENA, 0x0);
|
||||
+ rt_gpio_w32(rg, GPIO_REG_FENA, 0x0);
|
||||
+
|
||||
+ if (!atomic_read(&irq_refcount))
|
||||
+ irq_set_chained_handler(rg->irq, ralink_gpio_irq_handler);
|
||||
+ atomic_inc(&irq_refcount);
|
||||
+
|
||||
+ dev_info(rg->chip.parent, "registering %d irq handlers\n", rg->chip.ngpio);
|
||||
+}
|
||||
+
|
||||
+static int ralink_gpio_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *np = pdev->dev.of_node;
|
||||
+ struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ struct ralink_gpio_chip *rg;
|
||||
+ const __be32 *ngpio, *gpiobase;
|
||||
+
|
||||
+ if (!res) {
|
||||
+ dev_err(&pdev->dev, "failed to find resource\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ rg = devm_kzalloc(&pdev->dev,
|
||||
+ sizeof(struct ralink_gpio_chip), GFP_KERNEL);
|
||||
+ if (!rg)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ rg->membase = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (!rg->membase) {
|
||||
+ dev_err(&pdev->dev, "cannot remap I/O memory region\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ if (of_property_read_u8_array(np, "ralink,register-map",
|
||||
+ rg->regs, GPIO_REG_MAX)) {
|
||||
+ dev_err(&pdev->dev, "failed to read register definition\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ ngpio = of_get_property(np, "ngpios", NULL);
|
||||
+ if (!ngpio) {
|
||||
+ dev_err(&pdev->dev, "failed to read number of pins\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ gpiobase = of_get_property(np, "ralink,gpio-base", NULL);
|
||||
+ if (gpiobase)
|
||||
+ rg->chip.base = be32_to_cpu(*gpiobase);
|
||||
+ else
|
||||
+ rg->chip.base = -1;
|
||||
+
|
||||
+ spin_lock_init(&rg->lock);
|
||||
+
|
||||
+ rg->chip.parent = &pdev->dev;
|
||||
+ rg->chip.label = dev_name(&pdev->dev);
|
||||
+ rg->chip.of_node = np;
|
||||
+ rg->chip.ngpio = be32_to_cpu(*ngpio);
|
||||
+ rg->chip.direction_input = ralink_gpio_direction_input;
|
||||
+ rg->chip.direction_output = ralink_gpio_direction_output;
|
||||
+ rg->chip.get = ralink_gpio_get;
|
||||
+ rg->chip.set = ralink_gpio_set;
|
||||
+ rg->chip.request = gpiochip_generic_request;
|
||||
+ rg->chip.to_irq = ralink_gpio_to_irq;
|
||||
+ rg->chip.free = gpiochip_generic_free;
|
||||
+
|
||||
+ /* set polarity to low for all lines */
|
||||
+ rt_gpio_w32(rg, GPIO_REG_POL, 0);
|
||||
+
|
||||
+ dev_info(&pdev->dev, "registering %d gpios\n", rg->chip.ngpio);
|
||||
+
|
||||
+ ralink_gpio_irq_init(np, rg);
|
||||
+
|
||||
+ return gpiochip_add(&rg->chip);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id ralink_gpio_match[] = {
|
||||
+ { .compatible = "ralink,rt2880-gpio" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, ralink_gpio_match);
|
||||
+
|
||||
+static struct platform_driver ralink_gpio_driver = {
|
||||
+ .probe = ralink_gpio_probe,
|
||||
+ .driver = {
|
||||
+ .name = "rt2880_gpio",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = ralink_gpio_match,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init ralink_gpio_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&ralink_gpio_driver);
|
||||
+}
|
||||
+
|
||||
+subsys_initcall(ralink_gpio_init);
|
||||
@ -0,0 +1,44 @@
|
||||
From 57fa7f2f4ef6f78ce1d30509c0d111aa3791b524 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Santos <daniel.santos@pobox.com>
|
||||
Date: Sun, 4 Nov 2018 20:24:32 -0600
|
||||
Subject: gpio-ralink: Add support for GPIO as interrupt-controller
|
||||
|
||||
Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/gpio/gpio-ralink.txt | 6 ++++++
|
||||
drivers/gpio/gpio-ralink.c | 2 +-
|
||||
2 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/gpio/gpio-ralink.txt
|
||||
+++ b/Documentation/devicetree/bindings/gpio/gpio-ralink.txt
|
||||
@@ -17,6 +17,9 @@ Required properties:
|
||||
|
||||
Optional properties:
|
||||
- ralink,gpio-base : Specify the GPIO chips base number
|
||||
+- interrupt-controller : marks this as an interrupt controller
|
||||
+- #interrupt-cells : a standard two-cell interrupt flag, see
|
||||
+ interrupt-controller/interrupts.txt
|
||||
|
||||
Example:
|
||||
|
||||
@@ -28,6 +31,9 @@ Example:
|
||||
|
||||
reg = <0x600 0x34>;
|
||||
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <6>;
|
||||
|
||||
--- a/drivers/gpio/gpio-ralink.c
|
||||
+++ b/drivers/gpio/gpio-ralink.c
|
||||
@@ -220,7 +220,7 @@ static int gpio_map(struct irq_domain *d
|
||||
}
|
||||
|
||||
static const struct irq_domain_ops irq_domain_ops = {
|
||||
- .xlate = irq_domain_xlate_onecell,
|
||||
+ .xlate = irq_domain_xlate_twocell,
|
||||
.map = gpio_map,
|
||||
};
|
||||
|
||||
72
target/linux/ramips/patches-5.15/805-pinctrl-AW9523.patch
Normal file
72
target/linux/ramips/patches-5.15/805-pinctrl-AW9523.patch
Normal file
@ -0,0 +1,72 @@
|
||||
From: AngeloGioacchino Del Regno
|
||||
<angelogioacchino.delregno@somainline.org>
|
||||
To: linus.walleij@linaro.org
|
||||
Cc: linux-kernel@vger.kernel.org, konrad.dybcio@somainline.org,
|
||||
marijn.suijten@somainline.org, martin.botka@somainline.org,
|
||||
phone-devel@vger.kernel.org, linux-gpio@vger.kernel.org,
|
||||
devicetree@vger.kernel.org, robh+dt@kernel.org,
|
||||
AngeloGioacchino Del Regno
|
||||
<angelogioacchino.delregno@somainline.org>
|
||||
Subject: [PATCH v5 1/2] pinctrl: Add driver for Awinic AW9523/B I2C GPIO
|
||||
Expander
|
||||
Date: Mon, 25 Jan 2021 19:22:18 +0100
|
||||
|
||||
The Awinic AW9523(B) is a multi-function I2C gpio expander in a
|
||||
TQFN-24L package, featuring PWM (max 37mA per pin, or total max
|
||||
power 3.2Watts) for LED driving capability.
|
||||
|
||||
It has two ports with 8 pins per port (for a total of 16 pins),
|
||||
configurable as either PWM with 1/256 stepping or GPIO input/output,
|
||||
1.8V logic input; each GPIO can be configured as input or output
|
||||
independently from each other.
|
||||
|
||||
This IC also has an internal interrupt controller, which is capable
|
||||
of generating an interrupt for each GPIO, depending on the
|
||||
configuration, and will raise an interrupt on the INTN pin to
|
||||
advertise this to an external interrupt controller.
|
||||
|
||||
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org>
|
||||
---
|
||||
drivers/pinctrl/Kconfig | 17 +
|
||||
drivers/pinctrl/Makefile | 1 +
|
||||
drivers/pinctrl/pinctrl-aw9523.c | 1122 ++++++++++++++++++++++++++++++
|
||||
3 files changed, 1140 insertions(+)
|
||||
create mode 100644 drivers/pinctrl/pinctrl-aw9523.c
|
||||
|
||||
--- a/drivers/pinctrl/Kconfig
|
||||
+++ b/drivers/pinctrl/Kconfig
|
||||
@@ -111,6 +111,24 @@ config PINCTRL_AMD
|
||||
Requires ACPI/FDT device enumeration code to set up a platform
|
||||
device.
|
||||
|
||||
+config PINCTRL_AW9523
|
||||
+ bool "Awinic AW9523/AW9523B I2C GPIO expander pinctrl driver"
|
||||
+ depends on OF && I2C
|
||||
+ select PINMUX
|
||||
+ select PINCONF
|
||||
+ select GENERIC_PINCONF
|
||||
+ select GPIOLIB
|
||||
+ select GPIOLIB_IRQCHIP
|
||||
+ select REGMAP
|
||||
+ select REGMAP_I2C
|
||||
+ help
|
||||
+ The Awinic AW9523/AW9523B is a multi-function I2C GPIO
|
||||
+ expander with PWM functionality. This driver bundles a
|
||||
+ pinctrl driver to select the function muxing and a GPIO
|
||||
+ driver to handle GPIO, when the GPIO function is selected.
|
||||
+
|
||||
+ Say yes to enable pinctrl and GPIO support for the AW9523(B).
|
||||
+
|
||||
config PINCTRL_BM1880
|
||||
bool "Bitmain BM1880 Pinctrl driver"
|
||||
depends on OF && (ARCH_BITMAIN || COMPILE_TEST)
|
||||
--- a/drivers/pinctrl/Makefile
|
||||
+++ b/drivers/pinctrl/Makefile
|
||||
@@ -14,6 +14,7 @@ obj-$(CONFIG_PINCTRL_AXP209) += pinctrl-
|
||||
obj-$(CONFIG_PINCTRL_AT91) += pinctrl-at91.o
|
||||
obj-$(CONFIG_PINCTRL_AT91PIO4) += pinctrl-at91-pio4.o
|
||||
obj-$(CONFIG_PINCTRL_AMD) += pinctrl-amd.o
|
||||
+obj-$(CONFIG_PINCTRL_AW9523) += pinctrl-aw9523.o
|
||||
obj-$(CONFIG_PINCTRL_BM1880) += pinctrl-bm1880.o
|
||||
obj-$(CONFIG_PINCTRL_DA850_PUPD) += pinctrl-da850-pupd.o
|
||||
obj-$(CONFIG_PINCTRL_DA9062) += pinctrl-da9062.o
|
||||
@ -0,0 +1,246 @@
|
||||
From 975e76214cd2516eb6cfff4c3eec581872645e88 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 19 Sep 2013 01:50:59 +0200
|
||||
Subject: [PATCH 31/53] uvc: add iPassion iP2970 support
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/media/usb/uvc/uvc_driver.c | 12 +++
|
||||
drivers/media/usb/uvc/uvc_status.c | 2 +
|
||||
drivers/media/usb/uvc/uvc_video.c | 147 ++++++++++++++++++++++++++++++++++++
|
||||
drivers/media/usb/uvc/uvcvideo.h | 5 +-
|
||||
4 files changed, 165 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/media/usb/uvc/uvc_driver.c
|
||||
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
||||
@@ -3164,6 +3164,18 @@ static const struct usb_device_id uvc_id
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) },
|
||||
+ /* iPassion iP2970 */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x1B3B,
|
||||
+ .idProduct = 0x2970,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 0,
|
||||
+ .driver_info = UVC_QUIRK_PROBE_MINMAX
|
||||
+ | UVC_QUIRK_STREAM_NO_FID
|
||||
+ | UVC_QUIRK_MOTION
|
||||
+ | UVC_QUIRK_SINGLE_ISO },
|
||||
/* Generic USB Video Class */
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) },
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) },
|
||||
--- a/drivers/media/usb/uvc/uvc_status.c
|
||||
+++ b/drivers/media/usb/uvc/uvc_status.c
|
||||
@@ -223,6 +223,7 @@ static void uvc_status_complete(struct u
|
||||
if (uvc_event_control(urb, status, len))
|
||||
/* The URB will be resubmitted in work context. */
|
||||
return;
|
||||
+ dev->motion = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -271,6 +272,7 @@ int uvc_status_init(struct uvc_device *d
|
||||
}
|
||||
|
||||
pipe = usb_rcvintpipe(dev->udev, ep->desc.bEndpointAddress);
|
||||
+ dev->motion = 0;
|
||||
|
||||
/* For high-speed interrupt endpoints, the bInterval value is used as
|
||||
* an exponent of two. Some developers forgot about it.
|
||||
--- a/drivers/media/usb/uvc/uvc_video.c
|
||||
+++ b/drivers/media/usb/uvc/uvc_video.c
|
||||
@@ -19,6 +19,11 @@
|
||||
#include <linux/wait.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/unaligned.h>
|
||||
+#include <linux/skbuff.h>
|
||||
+#include <linux/kobject.h>
|
||||
+#include <linux/netlink.h>
|
||||
+#include <linux/kobject.h>
|
||||
+#include <linux/workqueue.h>
|
||||
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
@@ -1214,9 +1219,149 @@ static void uvc_video_decode_data(struct
|
||||
uvc_urb->async_operations++;
|
||||
}
|
||||
|
||||
+struct bh_priv {
|
||||
+ unsigned long seen;
|
||||
+};
|
||||
+
|
||||
+struct bh_event {
|
||||
+ const char *name;
|
||||
+ struct sk_buff *skb;
|
||||
+ struct work_struct work;
|
||||
+};
|
||||
+
|
||||
+#define BH_ERR(fmt, args...) printk(KERN_ERR "%s: " fmt, "webcam", ##args )
|
||||
+#define BH_DBG(fmt, args...) do {} while (0)
|
||||
+#define BH_SKB_SIZE 2048
|
||||
+
|
||||
+extern u64 uevent_next_seqnum(void);
|
||||
+static int seen = 0;
|
||||
+
|
||||
+static int bh_event_add_var(struct bh_event *event, int argv,
|
||||
+ const char *format, ...)
|
||||
+{
|
||||
+ static char buf[128];
|
||||
+ char *s;
|
||||
+ va_list args;
|
||||
+ int len;
|
||||
+
|
||||
+ if (argv)
|
||||
+ return 0;
|
||||
+
|
||||
+ va_start(args, format);
|
||||
+ len = vsnprintf(buf, sizeof(buf), format, args);
|
||||
+ va_end(args);
|
||||
+
|
||||
+ if (len >= sizeof(buf)) {
|
||||
+ BH_ERR("buffer size too small\n");
|
||||
+ WARN_ON(1);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ s = skb_put(event->skb, len + 1);
|
||||
+ strcpy(s, buf);
|
||||
+
|
||||
+ BH_DBG("added variable '%s'\n", s);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int motion_hotplug_fill_event(struct bh_event *event)
|
||||
+{
|
||||
+ int s = jiffies;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!seen)
|
||||
+ seen = jiffies;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "HOME=%s", "/");
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "PATH=%s",
|
||||
+ "/sbin:/bin:/usr/sbin:/usr/bin");
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "SUBSYSTEM=usb");
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "ACTION=motion");
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "SEEN=%d", s - seen);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ seen = s;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "SEQNUM=%llu", uevent_next_seqnum());
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void motion_hotplug_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct bh_event *event = container_of(work, struct bh_event, work);
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ event->skb = alloc_skb(BH_SKB_SIZE, GFP_KERNEL);
|
||||
+ if (!event->skb)
|
||||
+ goto out_free_event;
|
||||
+
|
||||
+ ret = bh_event_add_var(event, 0, "%s@", "add");
|
||||
+ if (ret)
|
||||
+ goto out_free_skb;
|
||||
+
|
||||
+ ret = motion_hotplug_fill_event(event);
|
||||
+ if (ret)
|
||||
+ goto out_free_skb;
|
||||
+
|
||||
+ NETLINK_CB(event->skb).dst_group = 1;
|
||||
+ broadcast_uevent(event->skb, 0, 1, GFP_KERNEL);
|
||||
+
|
||||
+out_free_skb:
|
||||
+ if (ret) {
|
||||
+ BH_ERR("work error %d\n", ret);
|
||||
+ kfree_skb(event->skb);
|
||||
+ }
|
||||
+out_free_event:
|
||||
+ kfree(event);
|
||||
+}
|
||||
+
|
||||
+static int motion_hotplug_create_event(void)
|
||||
+{
|
||||
+ struct bh_event *event;
|
||||
+
|
||||
+ event = kzalloc(sizeof(*event), GFP_KERNEL);
|
||||
+ if (!event)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ event->name = "motion";
|
||||
+
|
||||
+ INIT_WORK(&event->work, (void *)(void *)motion_hotplug_work);
|
||||
+ schedule_work(&event->work);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define MOTION_FLAG_OFFSET 4
|
||||
static void uvc_video_decode_end(struct uvc_streaming *stream,
|
||||
struct uvc_buffer *buf, const u8 *data, int len)
|
||||
{
|
||||
+ if ((stream->dev->quirks & UVC_QUIRK_MOTION) &&
|
||||
+ (data[len - 2] == 0xff) && (data[len - 1] == 0xd9)) {
|
||||
+ u8 *mem;
|
||||
+ buf->state = UVC_BUF_STATE_READY;
|
||||
+ mem = (u8 *) (buf->mem + MOTION_FLAG_OFFSET);
|
||||
+ if ( stream->dev->motion ) {
|
||||
+ stream->dev->motion = 0;
|
||||
+ motion_hotplug_create_event();
|
||||
+ } else {
|
||||
+ *mem &= 0x7f;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Mark the buffer as done if the EOF marker is set. */
|
||||
if (data[1] & UVC_STREAM_EOF && buf->bytesused != 0) {
|
||||
uvc_dbg(stream->dev, FRAME, "Frame complete (EOF found)\n");
|
||||
@@ -1799,6 +1944,8 @@ static int uvc_init_video_isoc(struct uv
|
||||
if (npackets == 0)
|
||||
return -ENOMEM;
|
||||
|
||||
+ if (stream->dev->quirks & UVC_QUIRK_SINGLE_ISO)
|
||||
+ npackets = 1;
|
||||
size = npackets * psize;
|
||||
|
||||
for_each_uvc_urb(uvc_urb, stream) {
|
||||
--- a/drivers/media/usb/uvc/uvcvideo.h
|
||||
+++ b/drivers/media/usb/uvc/uvcvideo.h
|
||||
@@ -209,7 +209,9 @@
|
||||
#define UVC_QUIRK_RESTORE_CTRLS_ON_INIT 0x00000400
|
||||
#define UVC_QUIRK_FORCE_Y8 0x00000800
|
||||
#define UVC_QUIRK_FORCE_BPP 0x00001000
|
||||
-
|
||||
+#define UVC_QUIRK_MOTION 0x00001000
|
||||
+#define UVC_QUIRK_SINGLE_ISO 0x00002000
|
||||
+
|
||||
/* Format flags */
|
||||
#define UVC_FMT_FLAG_COMPRESSED 0x00000001
|
||||
#define UVC_FMT_FLAG_STREAM 0x00000002
|
||||
@@ -700,6 +702,7 @@ struct uvc_device {
|
||||
u8 *status;
|
||||
struct input_dev *input;
|
||||
char input_phys[64];
|
||||
+ int motion;
|
||||
|
||||
struct uvc_ctrl_work {
|
||||
struct work_struct work;
|
||||
@ -0,0 +1,44 @@
|
||||
From da6015e7f19d749f135f7ac55c4ec47b06faa868 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Fri, 9 Aug 2013 20:12:59 +0200
|
||||
Subject: [PATCH 41/53] DT: Add documentation for spi-rt2880
|
||||
|
||||
Describe the SPI master found on the MIPS based Ralink RT2880 SoC.
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
.../devicetree/bindings/spi/spi-rt2880.txt | 28 ++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/spi/spi-rt2880.txt
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/spi/spi-rt2880.txt
|
||||
@@ -0,0 +1,28 @@
|
||||
+Ralink SoC RT2880 SPI master controller.
|
||||
+
|
||||
+This SPI controller is found on most wireless SoCs made by ralink.
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible : "ralink,rt2880-spi"
|
||||
+- reg : The register base for the controller.
|
||||
+- #address-cells : <1>, as required by generic SPI binding.
|
||||
+- #size-cells : <0>, also as required by generic SPI binding.
|
||||
+
|
||||
+Child nodes as per the generic SPI binding.
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ spi@b00 {
|
||||
+ compatible = "ralink,rt2880-spi";
|
||||
+ reg = <0xb00 0x100>;
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ m25p80@0 {
|
||||
+ compatible = "m25p80";
|
||||
+ reg = <0>;
|
||||
+ spi-max-frequency = <10000000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
@ -0,0 +1,574 @@
|
||||
From 683af4ebb91a1600df1946ac4769d916b8a1be65 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 27 Jul 2014 11:15:12 +0100
|
||||
Subject: [PATCH 42/53] SPI: ralink: add Ralink SoC spi driver
|
||||
|
||||
Add the driver needed to make SPI work on Ralink SoC.
|
||||
|
||||
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
Acked-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/spi/Kconfig | 6 +
|
||||
drivers/spi/Makefile | 1 +
|
||||
drivers/spi/spi-rt2880.c | 530 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 537 insertions(+)
|
||||
create mode 100644 drivers/spi/spi-rt2880.c
|
||||
|
||||
--- a/drivers/spi/Kconfig
|
||||
+++ b/drivers/spi/Kconfig
|
||||
@@ -719,6 +719,12 @@ config SPI_QCOM_GENI
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called spi-geni-qcom.
|
||||
|
||||
+config SPI_RT2880
|
||||
+ tristate "Ralink RT288x SPI Controller"
|
||||
+ depends on RALINK
|
||||
+ help
|
||||
+ This selects a driver for the Ralink RT288x/RT305x SPI Controller.
|
||||
+
|
||||
config SPI_S3C24XX
|
||||
tristate "Samsung S3C24XX series SPI"
|
||||
depends on ARCH_S3C24XX
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -100,6 +100,7 @@ obj-$(CONFIG_SPI_RB4XX) += spi-rb4xx.o
|
||||
obj-$(CONFIG_MACH_REALTEK_RTL) += spi-realtek-rtl.o
|
||||
obj-$(CONFIG_SPI_RPCIF) += spi-rpc-if.o
|
||||
obj-$(CONFIG_SPI_RSPI) += spi-rspi.o
|
||||
+obj-$(CONFIG_SPI_RT2880) += spi-rt2880.o
|
||||
obj-$(CONFIG_SPI_S3C24XX) += spi-s3c24xx-hw.o
|
||||
spi-s3c24xx-hw-y := spi-s3c24xx.o
|
||||
obj-$(CONFIG_SPI_S3C64XX) += spi-s3c64xx.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/spi/spi-rt2880.c
|
||||
@@ -0,0 +1,530 @@
|
||||
+/*
|
||||
+ * spi-rt2880.c -- Ralink RT288x/RT305x SPI controller driver
|
||||
+ *
|
||||
+ * Copyright (C) 2011 Sergiy <piratfm@gmail.com>
|
||||
+ * Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
|
||||
+ *
|
||||
+ * Some parts are based on spi-orion.c:
|
||||
+ * Author: Shadi Ammouri <shadi@marvell.com>
|
||||
+ * Copyright (C) 2007-2008 Marvell Ltd.
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/reset.h>
|
||||
+#include <linux/spi/spi.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/gpio.h>
|
||||
+
|
||||
+#define DRIVER_NAME "spi-rt2880"
|
||||
+
|
||||
+#define RAMIPS_SPI_STAT 0x00
|
||||
+#define RAMIPS_SPI_CFG 0x10
|
||||
+#define RAMIPS_SPI_CTL 0x14
|
||||
+#define RAMIPS_SPI_DATA 0x20
|
||||
+#define RAMIPS_SPI_ADDR 0x24
|
||||
+#define RAMIPS_SPI_BS 0x28
|
||||
+#define RAMIPS_SPI_USER 0x2C
|
||||
+#define RAMIPS_SPI_TXFIFO 0x30
|
||||
+#define RAMIPS_SPI_RXFIFO 0x34
|
||||
+#define RAMIPS_SPI_FIFO_STAT 0x38
|
||||
+#define RAMIPS_SPI_MODE 0x3C
|
||||
+#define RAMIPS_SPI_DEV_OFFSET 0x40
|
||||
+#define RAMIPS_SPI_DMA 0x80
|
||||
+#define RAMIPS_SPI_DMASTAT 0x84
|
||||
+#define RAMIPS_SPI_ARBITER 0xF0
|
||||
+
|
||||
+/* SPISTAT register bit field */
|
||||
+#define SPISTAT_BUSY BIT(0)
|
||||
+
|
||||
+/* SPICFG register bit field */
|
||||
+#define SPICFG_ADDRMODE BIT(12)
|
||||
+#define SPICFG_RXENVDIS BIT(11)
|
||||
+#define SPICFG_RXCAP BIT(10)
|
||||
+#define SPICFG_SPIENMODE BIT(9)
|
||||
+#define SPICFG_MSBFIRST BIT(8)
|
||||
+#define SPICFG_SPICLKPOL BIT(6)
|
||||
+#define SPICFG_RXCLKEDGE_FALLING BIT(5)
|
||||
+#define SPICFG_TXCLKEDGE_FALLING BIT(4)
|
||||
+#define SPICFG_HIZSPI BIT(3)
|
||||
+#define SPICFG_SPICLK_PRESCALE_MASK 0x7
|
||||
+#define SPICFG_SPICLK_DIV2 0
|
||||
+#define SPICFG_SPICLK_DIV4 1
|
||||
+#define SPICFG_SPICLK_DIV8 2
|
||||
+#define SPICFG_SPICLK_DIV16 3
|
||||
+#define SPICFG_SPICLK_DIV32 4
|
||||
+#define SPICFG_SPICLK_DIV64 5
|
||||
+#define SPICFG_SPICLK_DIV128 6
|
||||
+#define SPICFG_SPICLK_DISABLE 7
|
||||
+
|
||||
+/* SPICTL register bit field */
|
||||
+#define SPICTL_START BIT(4)
|
||||
+#define SPICTL_HIZSDO BIT(3)
|
||||
+#define SPICTL_STARTWR BIT(2)
|
||||
+#define SPICTL_STARTRD BIT(1)
|
||||
+#define SPICTL_SPIENA BIT(0)
|
||||
+
|
||||
+/* SPIUSER register bit field */
|
||||
+#define SPIUSER_USERMODE BIT(21)
|
||||
+#define SPIUSER_INSTR_PHASE BIT(20)
|
||||
+#define SPIUSER_ADDR_PHASE_MASK 0x7
|
||||
+#define SPIUSER_ADDR_PHASE_OFFSET 17
|
||||
+#define SPIUSER_MODE_PHASE BIT(16)
|
||||
+#define SPIUSER_DUMMY_PHASE_MASK 0x3
|
||||
+#define SPIUSER_DUMMY_PHASE_OFFSET 14
|
||||
+#define SPIUSER_DATA_PHASE_MASK 0x3
|
||||
+#define SPIUSER_DATA_PHASE_OFFSET 12
|
||||
+#define SPIUSER_DATA_READ (BIT(0) << SPIUSER_DATA_PHASE_OFFSET)
|
||||
+#define SPIUSER_DATA_WRITE (BIT(1) << SPIUSER_DATA_PHASE_OFFSET)
|
||||
+#define SPIUSER_ADDR_TYPE_OFFSET 9
|
||||
+#define SPIUSER_MODE_TYPE_OFFSET 6
|
||||
+#define SPIUSER_DUMMY_TYPE_OFFSET 3
|
||||
+#define SPIUSER_DATA_TYPE_OFFSET 0
|
||||
+#define SPIUSER_TRANSFER_MASK 0x7
|
||||
+#define SPIUSER_TRANSFER_SINGLE BIT(0)
|
||||
+#define SPIUSER_TRANSFER_DUAL BIT(1)
|
||||
+#define SPIUSER_TRANSFER_QUAD BIT(2)
|
||||
+
|
||||
+#define SPIUSER_TRANSFER_TYPE(type) ( \
|
||||
+ (type << SPIUSER_ADDR_TYPE_OFFSET) | \
|
||||
+ (type << SPIUSER_MODE_TYPE_OFFSET) | \
|
||||
+ (type << SPIUSER_DUMMY_TYPE_OFFSET) | \
|
||||
+ (type << SPIUSER_DATA_TYPE_OFFSET) \
|
||||
+)
|
||||
+
|
||||
+/* SPIFIFOSTAT register bit field */
|
||||
+#define SPIFIFOSTAT_TXEMPTY BIT(19)
|
||||
+#define SPIFIFOSTAT_RXEMPTY BIT(18)
|
||||
+#define SPIFIFOSTAT_TXFULL BIT(17)
|
||||
+#define SPIFIFOSTAT_RXFULL BIT(16)
|
||||
+#define SPIFIFOSTAT_FIFO_MASK 0xff
|
||||
+#define SPIFIFOSTAT_TX_OFFSET 8
|
||||
+#define SPIFIFOSTAT_RX_OFFSET 0
|
||||
+
|
||||
+#define SPI_FIFO_DEPTH 16
|
||||
+
|
||||
+/* SPIMODE register bit field */
|
||||
+#define SPIMODE_MODE_OFFSET 24
|
||||
+#define SPIMODE_DUMMY_OFFSET 0
|
||||
+
|
||||
+/* SPIARB register bit field */
|
||||
+#define SPICTL_ARB_EN BIT(31)
|
||||
+#define SPICTL_CSCTL1 BIT(16)
|
||||
+#define SPI1_POR BIT(1)
|
||||
+#define SPI0_POR BIT(0)
|
||||
+
|
||||
+#define RT2880_SPI_MODE_BITS (SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST | \
|
||||
+ SPI_CS_HIGH)
|
||||
+
|
||||
+static atomic_t hw_reset_count = ATOMIC_INIT(0);
|
||||
+
|
||||
+struct rt2880_spi {
|
||||
+ struct spi_master *master;
|
||||
+ void __iomem *base;
|
||||
+ u32 speed;
|
||||
+ u16 wait_loops;
|
||||
+ u16 mode;
|
||||
+ struct clk *clk;
|
||||
+};
|
||||
+
|
||||
+static inline struct rt2880_spi *spidev_to_rt2880_spi(struct spi_device *spi)
|
||||
+{
|
||||
+ return spi_master_get_devdata(spi->master);
|
||||
+}
|
||||
+
|
||||
+static inline u32 rt2880_spi_read(struct rt2880_spi *rs, u32 reg)
|
||||
+{
|
||||
+ return ioread32(rs->base + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void rt2880_spi_write(struct rt2880_spi *rs, u32 reg,
|
||||
+ const u32 val)
|
||||
+{
|
||||
+ iowrite32(val, rs->base + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void rt2880_spi_setbits(struct rt2880_spi *rs, u32 reg, u32 mask)
|
||||
+{
|
||||
+ void __iomem *addr = rs->base + reg;
|
||||
+
|
||||
+ iowrite32((ioread32(addr) | mask), addr);
|
||||
+}
|
||||
+
|
||||
+static inline void rt2880_spi_clrbits(struct rt2880_spi *rs, u32 reg, u32 mask)
|
||||
+{
|
||||
+ void __iomem *addr = rs->base + reg;
|
||||
+
|
||||
+ iowrite32((ioread32(addr) & ~mask), addr);
|
||||
+}
|
||||
+
|
||||
+static u32 rt2880_spi_baudrate_get(struct spi_device *spi, unsigned int speed)
|
||||
+{
|
||||
+ struct rt2880_spi *rs = spidev_to_rt2880_spi(spi);
|
||||
+ u32 rate;
|
||||
+ u32 prescale;
|
||||
+
|
||||
+ /*
|
||||
+ * the supported rates are: 2, 4, 8, ... 128
|
||||
+ * round up as we look for equal or less speed
|
||||
+ */
|
||||
+ rate = DIV_ROUND_UP(clk_get_rate(rs->clk), speed);
|
||||
+ rate = roundup_pow_of_two(rate);
|
||||
+
|
||||
+ /* Convert the rate to SPI clock divisor value. */
|
||||
+ prescale = ilog2(rate / 2);
|
||||
+
|
||||
+ /* some tolerance. double and add 100 */
|
||||
+ rs->wait_loops = (8 * HZ * loops_per_jiffy) /
|
||||
+ (clk_get_rate(rs->clk) / rate);
|
||||
+ rs->wait_loops = (rs->wait_loops << 1) + 100;
|
||||
+ rs->speed = speed;
|
||||
+
|
||||
+ dev_dbg(&spi->dev, "speed: %lu/%u, rate: %u, prescal: %u, loops: %hu\n",
|
||||
+ clk_get_rate(rs->clk) / rate, speed, rate, prescale,
|
||||
+ rs->wait_loops);
|
||||
+
|
||||
+ return prescale;
|
||||
+}
|
||||
+
|
||||
+static u32 get_arbiter_offset(struct spi_master *master)
|
||||
+{
|
||||
+ u32 offset;
|
||||
+
|
||||
+ offset = RAMIPS_SPI_ARBITER;
|
||||
+ if (master->bus_num == 1)
|
||||
+ offset -= RAMIPS_SPI_DEV_OFFSET;
|
||||
+
|
||||
+ return offset;
|
||||
+}
|
||||
+
|
||||
+static void rt2880_spi_set_cs(struct spi_device *spi, bool enable)
|
||||
+{
|
||||
+ struct rt2880_spi *rs = spidev_to_rt2880_spi(spi);
|
||||
+
|
||||
+ if (enable)
|
||||
+ rt2880_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_SPIENA);
|
||||
+ else
|
||||
+ rt2880_spi_clrbits(rs, RAMIPS_SPI_CTL, SPICTL_SPIENA);
|
||||
+}
|
||||
+
|
||||
+static int rt2880_spi_wait_ready(struct rt2880_spi *rs, int len)
|
||||
+{
|
||||
+ int loop = rs->wait_loops * len;
|
||||
+
|
||||
+ while ((rt2880_spi_read(rs, RAMIPS_SPI_STAT) & SPISTAT_BUSY) && --loop)
|
||||
+ cpu_relax();
|
||||
+
|
||||
+ if (loop)
|
||||
+ return 0;
|
||||
+
|
||||
+ return -ETIMEDOUT;
|
||||
+}
|
||||
+
|
||||
+static void rt2880_dump_reg(struct spi_master *master)
|
||||
+{
|
||||
+ struct rt2880_spi *rs = spi_master_get_devdata(master);
|
||||
+
|
||||
+ dev_dbg(&master->dev, "stat: %08x, cfg: %08x, ctl: %08x, " \
|
||||
+ "data: %08x, arb: %08x\n",
|
||||
+ rt2880_spi_read(rs, RAMIPS_SPI_STAT),
|
||||
+ rt2880_spi_read(rs, RAMIPS_SPI_CFG),
|
||||
+ rt2880_spi_read(rs, RAMIPS_SPI_CTL),
|
||||
+ rt2880_spi_read(rs, RAMIPS_SPI_DATA),
|
||||
+ rt2880_spi_read(rs, get_arbiter_offset(master)));
|
||||
+}
|
||||
+
|
||||
+static int rt2880_spi_transfer_one(struct spi_master *master,
|
||||
+ struct spi_device *spi, struct spi_transfer *xfer)
|
||||
+{
|
||||
+ struct rt2880_spi *rs = spi_master_get_devdata(master);
|
||||
+ unsigned len;
|
||||
+ const u8 *tx = xfer->tx_buf;
|
||||
+ u8 *rx = xfer->rx_buf;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ /* change clock speed */
|
||||
+ if (unlikely(rs->speed != xfer->speed_hz)) {
|
||||
+ u32 reg;
|
||||
+ reg = rt2880_spi_read(rs, RAMIPS_SPI_CFG);
|
||||
+ reg &= ~SPICFG_SPICLK_PRESCALE_MASK;
|
||||
+ reg |= rt2880_spi_baudrate_get(spi, xfer->speed_hz);
|
||||
+ rt2880_spi_write(rs, RAMIPS_SPI_CFG, reg);
|
||||
+ }
|
||||
+
|
||||
+ if (tx) {
|
||||
+ len = xfer->len;
|
||||
+ while (len-- > 0) {
|
||||
+ rt2880_spi_write(rs, RAMIPS_SPI_DATA, *tx++);
|
||||
+ rt2880_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_STARTWR);
|
||||
+ err = rt2880_spi_wait_ready(rs, 1);
|
||||
+ if (err) {
|
||||
+ dev_err(&spi->dev, "TX failed, err=%d\n", err);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (rx) {
|
||||
+ len = xfer->len;
|
||||
+ while (len-- > 0) {
|
||||
+ rt2880_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_STARTRD);
|
||||
+ err = rt2880_spi_wait_ready(rs, 1);
|
||||
+ if (err) {
|
||||
+ dev_err(&spi->dev, "RX failed, err=%d\n", err);
|
||||
+ goto out;
|
||||
+ }
|
||||
+ *rx++ = (u8) rt2880_spi_read(rs, RAMIPS_SPI_DATA);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+/* copy from spi.c */
|
||||
+static void spi_set_cs(struct spi_device *spi, bool enable)
|
||||
+{
|
||||
+ if (spi->mode & SPI_CS_HIGH)
|
||||
+ enable = !enable;
|
||||
+
|
||||
+ if (spi->cs_gpio >= 0)
|
||||
+ gpio_set_value(spi->cs_gpio, !enable);
|
||||
+ else if (spi->master->set_cs)
|
||||
+ spi->master->set_cs(spi, !enable);
|
||||
+}
|
||||
+
|
||||
+static int rt2880_spi_setup(struct spi_device *spi)
|
||||
+{
|
||||
+ struct spi_master *master = spi->master;
|
||||
+ struct rt2880_spi *rs = spi_master_get_devdata(master);
|
||||
+ u32 reg, old_reg, arbit_off;
|
||||
+
|
||||
+ if ((spi->max_speed_hz > master->max_speed_hz) ||
|
||||
+ (spi->max_speed_hz < master->min_speed_hz)) {
|
||||
+ dev_err(&spi->dev, "invalide requested speed %d Hz\n",
|
||||
+ spi->max_speed_hz);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ if (!(master->bits_per_word_mask &
|
||||
+ BIT(spi->bits_per_word - 1))) {
|
||||
+ dev_err(&spi->dev, "invalide bits_per_word %d\n",
|
||||
+ spi->bits_per_word);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* the hardware seems can't work on mode0 force it to mode3 */
|
||||
+ if ((spi->mode & (SPI_CPOL | SPI_CPHA)) == SPI_MODE_0) {
|
||||
+ dev_warn(&spi->dev, "force spi mode3\n");
|
||||
+ spi->mode |= SPI_MODE_3;
|
||||
+ }
|
||||
+
|
||||
+ /* chip polarity */
|
||||
+ arbit_off = get_arbiter_offset(master);
|
||||
+ reg = old_reg = rt2880_spi_read(rs, arbit_off);
|
||||
+ if (spi->mode & SPI_CS_HIGH) {
|
||||
+ switch (master->bus_num) {
|
||||
+ case 1:
|
||||
+ reg |= SPI1_POR;
|
||||
+ break;
|
||||
+ default:
|
||||
+ reg |= SPI0_POR;
|
||||
+ break;
|
||||
+ }
|
||||
+ } else {
|
||||
+ switch (master->bus_num) {
|
||||
+ case 1:
|
||||
+ reg &= ~SPI1_POR;
|
||||
+ break;
|
||||
+ default:
|
||||
+ reg &= ~SPI0_POR;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* enable spi1 */
|
||||
+ if (master->bus_num == 1)
|
||||
+ reg |= SPICTL_ARB_EN;
|
||||
+
|
||||
+ if (reg != old_reg)
|
||||
+ rt2880_spi_write(rs, arbit_off, reg);
|
||||
+
|
||||
+ /* deselected the spi device */
|
||||
+ spi_set_cs(spi, false);
|
||||
+
|
||||
+ rt2880_dump_reg(master);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rt2880_spi_prepare_message(struct spi_master *master,
|
||||
+ struct spi_message *msg)
|
||||
+{
|
||||
+ struct rt2880_spi *rs = spi_master_get_devdata(master);
|
||||
+ struct spi_device *spi = msg->spi;
|
||||
+ u32 reg;
|
||||
+
|
||||
+ if ((rs->mode == spi->mode) && (rs->speed == spi->max_speed_hz))
|
||||
+ return 0;
|
||||
+
|
||||
+#if 0
|
||||
+ /* set spido to tri-state */
|
||||
+ rt2880_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_HIZSDO);
|
||||
+#endif
|
||||
+
|
||||
+ reg = rt2880_spi_read(rs, RAMIPS_SPI_CFG);
|
||||
+
|
||||
+ reg &= ~(SPICFG_MSBFIRST | SPICFG_SPICLKPOL |
|
||||
+ SPICFG_RXCLKEDGE_FALLING |
|
||||
+ SPICFG_TXCLKEDGE_FALLING |
|
||||
+ SPICFG_SPICLK_PRESCALE_MASK);
|
||||
+
|
||||
+ /* MSB */
|
||||
+ if (!(spi->mode & SPI_LSB_FIRST))
|
||||
+ reg |= SPICFG_MSBFIRST;
|
||||
+
|
||||
+ /* spi mode */
|
||||
+ switch (spi->mode & (SPI_CPOL | SPI_CPHA)) {
|
||||
+ case SPI_MODE_0:
|
||||
+ reg |= SPICFG_TXCLKEDGE_FALLING;
|
||||
+ break;
|
||||
+ case SPI_MODE_1:
|
||||
+ reg |= SPICFG_RXCLKEDGE_FALLING;
|
||||
+ break;
|
||||
+ case SPI_MODE_2:
|
||||
+ reg |= SPICFG_SPICLKPOL | SPICFG_RXCLKEDGE_FALLING;
|
||||
+ break;
|
||||
+ case SPI_MODE_3:
|
||||
+ reg |= SPICFG_SPICLKPOL | SPICFG_TXCLKEDGE_FALLING;
|
||||
+ break;
|
||||
+ }
|
||||
+ rs->mode = spi->mode;
|
||||
+
|
||||
+#if 0
|
||||
+ /* set spiclk and spiena to tri-state */
|
||||
+ reg |= SPICFG_HIZSPI;
|
||||
+#endif
|
||||
+
|
||||
+ /* clock divide */
|
||||
+ reg |= rt2880_spi_baudrate_get(spi, spi->max_speed_hz);
|
||||
+
|
||||
+ rt2880_spi_write(rs, RAMIPS_SPI_CFG, reg);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rt2880_spi_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct spi_master *master;
|
||||
+ struct rt2880_spi *rs;
|
||||
+ void __iomem *base;
|
||||
+ struct resource *r;
|
||||
+ struct clk *clk;
|
||||
+ int ret;
|
||||
+
|
||||
+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ base = devm_ioremap_resource(&pdev->dev, r);
|
||||
+ if (IS_ERR(base))
|
||||
+ return PTR_ERR(base);
|
||||
+
|
||||
+ clk = devm_clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(clk)) {
|
||||
+ dev_err(&pdev->dev, "unable to get SYS clock\n");
|
||||
+ return PTR_ERR(clk);
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(clk);
|
||||
+ if (ret)
|
||||
+ goto err_clk;
|
||||
+
|
||||
+ master = spi_alloc_master(&pdev->dev, sizeof(*rs));
|
||||
+ if (master == NULL) {
|
||||
+ dev_dbg(&pdev->dev, "master allocation failed\n");
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err_clk;
|
||||
+ }
|
||||
+
|
||||
+ master->dev.of_node = pdev->dev.of_node;
|
||||
+ master->mode_bits = RT2880_SPI_MODE_BITS;
|
||||
+ master->bits_per_word_mask = SPI_BPW_MASK(8);
|
||||
+ master->min_speed_hz = clk_get_rate(clk) / 128;
|
||||
+ master->max_speed_hz = clk_get_rate(clk) / 2;
|
||||
+ master->flags = SPI_MASTER_HALF_DUPLEX;
|
||||
+ master->setup = rt2880_spi_setup;
|
||||
+ master->prepare_message = rt2880_spi_prepare_message;
|
||||
+ master->set_cs = rt2880_spi_set_cs;
|
||||
+ master->transfer_one = rt2880_spi_transfer_one,
|
||||
+
|
||||
+ dev_set_drvdata(&pdev->dev, master);
|
||||
+
|
||||
+ rs = spi_master_get_devdata(master);
|
||||
+ rs->master = master;
|
||||
+ rs->base = base;
|
||||
+ rs->clk = clk;
|
||||
+
|
||||
+ if (atomic_inc_return(&hw_reset_count) == 1)
|
||||
+ device_reset(&pdev->dev);
|
||||
+
|
||||
+ ret = devm_spi_register_master(&pdev->dev, master);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "devm_spi_register_master error.\n");
|
||||
+ goto err_master;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+
|
||||
+err_master:
|
||||
+ spi_master_put(master);
|
||||
+ kfree(master);
|
||||
+err_clk:
|
||||
+ clk_disable_unprepare(clk);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int rt2880_spi_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct spi_master *master;
|
||||
+ struct rt2880_spi *rs;
|
||||
+
|
||||
+ master = dev_get_drvdata(&pdev->dev);
|
||||
+ rs = spi_master_get_devdata(master);
|
||||
+
|
||||
+ clk_disable_unprepare(rs->clk);
|
||||
+ atomic_dec(&hw_reset_count);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
+
|
||||
+static const struct of_device_id rt2880_spi_match[] = {
|
||||
+ { .compatible = "ralink,rt2880-spi" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rt2880_spi_match);
|
||||
+
|
||||
+static struct platform_driver rt2880_spi_driver = {
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = rt2880_spi_match,
|
||||
+ },
|
||||
+ .probe = rt2880_spi_probe,
|
||||
+ .remove = rt2880_spi_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(rt2880_spi_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Ralink SPI driver");
|
||||
+MODULE_AUTHOR("Sergiy <piratfm@gmail.com>");
|
||||
+MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@ -0,0 +1,507 @@
|
||||
From 723b8beaabf3c3c4b1ce69480141f1e926f3f3b2 Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Sun, 27 Jul 2014 09:52:56 +0100
|
||||
Subject: [PATCH 44/53] i2c: MIPS: adds ralink I2C driver
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
.../devicetree/bindings/i2c/i2c-ralink.txt | 27 ++
|
||||
drivers/i2c/busses/Kconfig | 4 +
|
||||
drivers/i2c/busses/Makefile | 1 +
|
||||
drivers/i2c/busses/i2c-ralink.c | 327 ++++++++++++++++++++
|
||||
4 files changed, 359 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/i2c/i2c-ralink.txt
|
||||
create mode 100644 drivers/i2c/busses/i2c-ralink.c
|
||||
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/i2c/i2c-ralink.txt
|
||||
@@ -0,0 +1,27 @@
|
||||
+I2C for Ralink platforms
|
||||
+
|
||||
+Required properties :
|
||||
+- compatible : Must be "link,rt3052-i2c"
|
||||
+- reg: physical base address of the controller and length of memory mapped
|
||||
+ region.
|
||||
+- #address-cells = <1>;
|
||||
+- #size-cells = <0>;
|
||||
+
|
||||
+Optional properties:
|
||||
+- Child nodes conforming to i2c bus binding
|
||||
+
|
||||
+Example :
|
||||
+
|
||||
+palmbus@10000000 {
|
||||
+ i2c@900 {
|
||||
+ compatible = "link,rt3052-i2c";
|
||||
+ reg = <0x900 0x100>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ hwmon@4b {
|
||||
+ compatible = "national,lm92";
|
||||
+ reg = <0x4b>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--- a/drivers/i2c/busses/Kconfig
|
||||
+++ b/drivers/i2c/busses/Kconfig
|
||||
@@ -949,6 +949,11 @@ config I2C_RK3X
|
||||
This driver can also be built as a module. If so, the module will
|
||||
be called i2c-rk3x.
|
||||
|
||||
+config I2C_RALINK
|
||||
+ tristate "Ralink I2C Controller"
|
||||
+ depends on RALINK && !SOC_MT7621
|
||||
+ select OF_I2C
|
||||
+
|
||||
config HAVE_S3C2410_I2C
|
||||
bool
|
||||
help
|
||||
--- a/drivers/i2c/busses/Makefile
|
||||
+++ b/drivers/i2c/busses/Makefile
|
||||
@@ -89,6 +89,7 @@ obj-$(CONFIG_I2C_PCA_PLATFORM) += i2c-pc
|
||||
obj-$(CONFIG_I2C_PNX) += i2c-pnx.o
|
||||
obj-$(CONFIG_I2C_PXA) += i2c-pxa.o
|
||||
obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o
|
||||
+obj-$(CONFIG_I2C_RALINK) += i2c-ralink.o
|
||||
obj-$(CONFIG_I2C_QCOM_CCI) += i2c-qcom-cci.o
|
||||
obj-$(CONFIG_I2C_QCOM_GENI) += i2c-qcom-geni.o
|
||||
obj-$(CONFIG_I2C_QUP) += i2c-qup.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/i2c/busses/i2c-ralink.c
|
||||
@@ -0,0 +1,435 @@
|
||||
+/*
|
||||
+ * drivers/i2c/busses/i2c-ralink.c
|
||||
+ *
|
||||
+ * Copyright (C) 2013 Steven Liu <steven_liu@mediatek.com>
|
||||
+ * Copyright (C) 2016 Michael Lee <igvtee@gmail.com>
|
||||
+ *
|
||||
+ * Improve driver for i2cdetect from i2c-tools to detect i2c devices on the bus.
|
||||
+ * (C) 2014 Sittisak <sittisaks@hotmail.com>
|
||||
+ *
|
||||
+ * This software is licensed under the terms of the GNU General Public
|
||||
+ * License version 2, as published by the Free Software Foundation, and
|
||||
+ * may be copied, distributed, and modified under those terms.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/reset.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/clk.h>
|
||||
+
|
||||
+#define REG_CONFIG_REG 0x00
|
||||
+#define REG_CLKDIV_REG 0x04
|
||||
+#define REG_DEVADDR_REG 0x08
|
||||
+#define REG_ADDR_REG 0x0C
|
||||
+#define REG_DATAOUT_REG 0x10
|
||||
+#define REG_DATAIN_REG 0x14
|
||||
+#define REG_STATUS_REG 0x18
|
||||
+#define REG_STARTXFR_REG 0x1C
|
||||
+#define REG_BYTECNT_REG 0x20
|
||||
+
|
||||
+/* REG_CONFIG_REG */
|
||||
+#define I2C_ADDRLEN_OFFSET 5
|
||||
+#define I2C_DEVADLEN_OFFSET 2
|
||||
+#define I2C_ADDRLEN_MASK 0x3
|
||||
+#define I2C_ADDR_DIS BIT(1)
|
||||
+#define I2C_DEVADDR_DIS BIT(0)
|
||||
+#define I2C_ADDRLEN_8 (7 << I2C_ADDRLEN_OFFSET)
|
||||
+#define I2C_DEVADLEN_7 (6 << I2C_DEVADLEN_OFFSET)
|
||||
+#define I2C_CONF_DEFAULT (I2C_ADDRLEN_8 | I2C_DEVADLEN_7)
|
||||
+
|
||||
+/* REG_CLKDIV_REG */
|
||||
+#define I2C_CLKDIV_MASK 0xffff
|
||||
+
|
||||
+/* REG_DEVADDR_REG */
|
||||
+#define I2C_DEVADDR_MASK 0x7f
|
||||
+
|
||||
+/* REG_ADDR_REG */
|
||||
+#define I2C_ADDR_MASK 0xff
|
||||
+
|
||||
+/* REG_STATUS_REG */
|
||||
+#define I2C_STARTERR BIT(4)
|
||||
+#define I2C_ACKERR BIT(3)
|
||||
+#define I2C_DATARDY BIT(2)
|
||||
+#define I2C_SDOEMPTY BIT(1)
|
||||
+#define I2C_BUSY BIT(0)
|
||||
+
|
||||
+/* REG_STARTXFR_REG */
|
||||
+#define NOSTOP_CMD BIT(2)
|
||||
+#define NODATA_CMD BIT(1)
|
||||
+#define READ_CMD BIT(0)
|
||||
+
|
||||
+/* REG_BYTECNT_REG */
|
||||
+#define BYTECNT_MAX 64
|
||||
+#define SET_BYTECNT(x) (x - 1)
|
||||
+
|
||||
+/* timeout waiting for I2C devices to respond (clock streching) */
|
||||
+#define TIMEOUT_MS 1000
|
||||
+#define DELAY_INTERVAL_US 100
|
||||
+
|
||||
+struct rt_i2c {
|
||||
+ void __iomem *base;
|
||||
+ struct clk *clk;
|
||||
+ struct device *dev;
|
||||
+ struct i2c_adapter adap;
|
||||
+ u32 cur_clk;
|
||||
+ u32 clk_div;
|
||||
+ u32 flags;
|
||||
+};
|
||||
+
|
||||
+static void rt_i2c_w32(struct rt_i2c *i2c, u32 val, unsigned reg)
|
||||
+{
|
||||
+ iowrite32(val, i2c->base + reg);
|
||||
+}
|
||||
+
|
||||
+static u32 rt_i2c_r32(struct rt_i2c *i2c, unsigned reg)
|
||||
+{
|
||||
+ return ioread32(i2c->base + reg);
|
||||
+}
|
||||
+
|
||||
+static int poll_down_timeout(void __iomem *addr, u32 mask)
|
||||
+{
|
||||
+ unsigned long timeout = jiffies + msecs_to_jiffies(TIMEOUT_MS);
|
||||
+
|
||||
+ do {
|
||||
+ if (!(readl_relaxed(addr) & mask))
|
||||
+ return 0;
|
||||
+
|
||||
+ usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50);
|
||||
+ } while (time_before(jiffies, timeout));
|
||||
+
|
||||
+ return (readl_relaxed(addr) & mask) ? -EAGAIN : 0;
|
||||
+}
|
||||
+
|
||||
+static int rt_i2c_wait_idle(struct rt_i2c *i2c)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = poll_down_timeout(i2c->base + REG_STATUS_REG, I2C_BUSY);
|
||||
+ if (ret < 0)
|
||||
+ dev_dbg(i2c->dev, "idle err(%d)\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int poll_up_timeout(void __iomem *addr, u32 mask)
|
||||
+{
|
||||
+ unsigned long timeout = jiffies + msecs_to_jiffies(TIMEOUT_MS);
|
||||
+ u32 status;
|
||||
+
|
||||
+ do {
|
||||
+ status = readl_relaxed(addr);
|
||||
+
|
||||
+ /* check error status */
|
||||
+ if (status & I2C_STARTERR)
|
||||
+ return -EAGAIN;
|
||||
+ else if (status & I2C_ACKERR)
|
||||
+ return -ENXIO;
|
||||
+ else if (status & mask)
|
||||
+ return 0;
|
||||
+
|
||||
+ usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50);
|
||||
+ } while (time_before(jiffies, timeout));
|
||||
+
|
||||
+ return -ETIMEDOUT;
|
||||
+}
|
||||
+
|
||||
+static int rt_i2c_wait_rx_done(struct rt_i2c *i2c)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = poll_up_timeout(i2c->base + REG_STATUS_REG, I2C_DATARDY);
|
||||
+ if (ret < 0)
|
||||
+ dev_dbg(i2c->dev, "rx err(%d)\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int rt_i2c_wait_tx_done(struct rt_i2c *i2c)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = poll_up_timeout(i2c->base + REG_STATUS_REG, I2C_SDOEMPTY);
|
||||
+ if (ret < 0)
|
||||
+ dev_dbg(i2c->dev, "tx err(%d)\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void rt_i2c_reset(struct rt_i2c *i2c)
|
||||
+{
|
||||
+ device_reset(i2c->adap.dev.parent);
|
||||
+ barrier();
|
||||
+ rt_i2c_w32(i2c, i2c->clk_div, REG_CLKDIV_REG);
|
||||
+}
|
||||
+
|
||||
+static void rt_i2c_dump_reg(struct rt_i2c *i2c)
|
||||
+{
|
||||
+ dev_dbg(i2c->dev, "conf %08x, clkdiv %08x, devaddr %08x, " \
|
||||
+ "addr %08x, dataout %08x, datain %08x, " \
|
||||
+ "status %08x, startxfr %08x, bytecnt %08x\n",
|
||||
+ rt_i2c_r32(i2c, REG_CONFIG_REG),
|
||||
+ rt_i2c_r32(i2c, REG_CLKDIV_REG),
|
||||
+ rt_i2c_r32(i2c, REG_DEVADDR_REG),
|
||||
+ rt_i2c_r32(i2c, REG_ADDR_REG),
|
||||
+ rt_i2c_r32(i2c, REG_DATAOUT_REG),
|
||||
+ rt_i2c_r32(i2c, REG_DATAIN_REG),
|
||||
+ rt_i2c_r32(i2c, REG_STATUS_REG),
|
||||
+ rt_i2c_r32(i2c, REG_STARTXFR_REG),
|
||||
+ rt_i2c_r32(i2c, REG_BYTECNT_REG));
|
||||
+}
|
||||
+
|
||||
+static int rt_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
|
||||
+ int num)
|
||||
+{
|
||||
+ struct rt_i2c *i2c;
|
||||
+ struct i2c_msg *pmsg;
|
||||
+ unsigned char addr;
|
||||
+ int i, j, ret;
|
||||
+ u32 cmd;
|
||||
+
|
||||
+ i2c = i2c_get_adapdata(adap);
|
||||
+
|
||||
+ for (i = 0; i < num; i++) {
|
||||
+ pmsg = &msgs[i];
|
||||
+ if (i == (num - 1))
|
||||
+ cmd = 0;
|
||||
+ else
|
||||
+ cmd = NOSTOP_CMD;
|
||||
+
|
||||
+ dev_dbg(i2c->dev, "addr: 0x%x, len: %d, flags: 0x%x, stop: %d\n",
|
||||
+ pmsg->addr, pmsg->len, pmsg->flags,
|
||||
+ (cmd == 0)? 1 : 0);
|
||||
+
|
||||
+ /* wait hardware idle */
|
||||
+ if ((ret = rt_i2c_wait_idle(i2c)))
|
||||
+ goto err_timeout;
|
||||
+
|
||||
+ if (pmsg->flags & I2C_M_TEN) {
|
||||
+ rt_i2c_w32(i2c, I2C_CONF_DEFAULT, REG_CONFIG_REG);
|
||||
+ /* 10 bits address */
|
||||
+ addr = 0x78 | ((pmsg->addr >> 8) & 0x03);
|
||||
+ rt_i2c_w32(i2c, addr & I2C_DEVADDR_MASK,
|
||||
+ REG_DEVADDR_REG);
|
||||
+ rt_i2c_w32(i2c, pmsg->addr & I2C_ADDR_MASK,
|
||||
+ REG_ADDR_REG);
|
||||
+ } else {
|
||||
+ rt_i2c_w32(i2c, I2C_CONF_DEFAULT | I2C_ADDR_DIS,
|
||||
+ REG_CONFIG_REG);
|
||||
+ /* 7 bits address */
|
||||
+ rt_i2c_w32(i2c, pmsg->addr & I2C_DEVADDR_MASK,
|
||||
+ REG_DEVADDR_REG);
|
||||
+ }
|
||||
+
|
||||
+ /* buffer length */
|
||||
+ if (pmsg->len == 0)
|
||||
+ cmd |= NODATA_CMD;
|
||||
+ else
|
||||
+ rt_i2c_w32(i2c, SET_BYTECNT(pmsg->len),
|
||||
+ REG_BYTECNT_REG);
|
||||
+
|
||||
+ j = 0;
|
||||
+ if (pmsg->flags & I2C_M_RD) {
|
||||
+ cmd |= READ_CMD;
|
||||
+ /* start transfer */
|
||||
+ barrier();
|
||||
+ rt_i2c_w32(i2c, cmd, REG_STARTXFR_REG);
|
||||
+ do {
|
||||
+ /* wait */
|
||||
+ if ((ret = rt_i2c_wait_rx_done(i2c)))
|
||||
+ goto err_timeout;
|
||||
+ /* read data */
|
||||
+ if (pmsg->len)
|
||||
+ pmsg->buf[j] = rt_i2c_r32(i2c,
|
||||
+ REG_DATAIN_REG);
|
||||
+ j++;
|
||||
+ } while (j < pmsg->len);
|
||||
+ } else {
|
||||
+ do {
|
||||
+ /* write data */
|
||||
+ if (pmsg->len)
|
||||
+ rt_i2c_w32(i2c, pmsg->buf[j],
|
||||
+ REG_DATAOUT_REG);
|
||||
+ /* start transfer */
|
||||
+ if (j == 0) {
|
||||
+ barrier();
|
||||
+ rt_i2c_w32(i2c, cmd, REG_STARTXFR_REG);
|
||||
+ }
|
||||
+ /* wait */
|
||||
+ if ((ret = rt_i2c_wait_tx_done(i2c)))
|
||||
+ goto err_timeout;
|
||||
+ j++;
|
||||
+ } while (j < pmsg->len);
|
||||
+ }
|
||||
+ }
|
||||
+ /* the return value is number of executed messages */
|
||||
+ ret = i;
|
||||
+
|
||||
+ return ret;
|
||||
+
|
||||
+err_timeout:
|
||||
+ rt_i2c_dump_reg(i2c);
|
||||
+ rt_i2c_reset(i2c);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static u32 rt_i2c_func(struct i2c_adapter *a)
|
||||
+{
|
||||
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_algorithm rt_i2c_algo = {
|
||||
+ .master_xfer = rt_i2c_master_xfer,
|
||||
+ .functionality = rt_i2c_func,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id i2c_rt_dt_ids[] = {
|
||||
+ { .compatible = "ralink,rt2880-i2c" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(of, i2c_rt_dt_ids);
|
||||
+
|
||||
+static struct i2c_adapter_quirks rt_i2c_quirks = {
|
||||
+ .max_write_len = BYTECNT_MAX,
|
||||
+ .max_read_len = BYTECNT_MAX,
|
||||
+};
|
||||
+
|
||||
+static int rt_i2c_init(struct rt_i2c *i2c)
|
||||
+{
|
||||
+ u32 reg;
|
||||
+
|
||||
+ /* i2c_sclk = periph_clk / ((2 * clk_div) + 5) */
|
||||
+ i2c->clk_div = (clk_get_rate(i2c->clk) - (5 * i2c->cur_clk)) /
|
||||
+ (2 * i2c->cur_clk);
|
||||
+ if (i2c->clk_div < 8)
|
||||
+ i2c->clk_div = 8;
|
||||
+ if (i2c->clk_div > I2C_CLKDIV_MASK)
|
||||
+ i2c->clk_div = I2C_CLKDIV_MASK;
|
||||
+
|
||||
+ /* check support combinde/repeated start message */
|
||||
+ rt_i2c_w32(i2c, NOSTOP_CMD, REG_STARTXFR_REG);
|
||||
+ reg = rt_i2c_r32(i2c, REG_STARTXFR_REG) & NOSTOP_CMD;
|
||||
+
|
||||
+ rt_i2c_reset(i2c);
|
||||
+
|
||||
+ return reg;
|
||||
+}
|
||||
+
|
||||
+static int rt_i2c_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct resource *res;
|
||||
+ struct rt_i2c *i2c;
|
||||
+ struct i2c_adapter *adap;
|
||||
+ const struct of_device_id *match;
|
||||
+ int ret, restart;
|
||||
+
|
||||
+ match = of_match_device(i2c_rt_dt_ids, &pdev->dev);
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ if (!res) {
|
||||
+ dev_err(&pdev->dev, "no memory resource found\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ i2c = devm_kzalloc(&pdev->dev, sizeof(struct rt_i2c), GFP_KERNEL);
|
||||
+ if (!i2c) {
|
||||
+ dev_err(&pdev->dev, "failed to allocate i2c_adapter\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ i2c->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(i2c->base))
|
||||
+ return PTR_ERR(i2c->base);
|
||||
+
|
||||
+ i2c->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
+ if (IS_ERR(i2c->clk)) {
|
||||
+ dev_err(&pdev->dev, "no clock defined\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+ clk_prepare_enable(i2c->clk);
|
||||
+ i2c->dev = &pdev->dev;
|
||||
+
|
||||
+ if (of_property_read_u32(pdev->dev.of_node,
|
||||
+ "clock-frequency", &i2c->cur_clk))
|
||||
+ i2c->cur_clk = 100000;
|
||||
+
|
||||
+ adap = &i2c->adap;
|
||||
+ adap->owner = THIS_MODULE;
|
||||
+ adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
|
||||
+ adap->algo = &rt_i2c_algo;
|
||||
+ adap->retries = 3;
|
||||
+ adap->dev.parent = &pdev->dev;
|
||||
+ i2c_set_adapdata(adap, i2c);
|
||||
+ adap->dev.of_node = pdev->dev.of_node;
|
||||
+ strlcpy(adap->name, dev_name(&pdev->dev), sizeof(adap->name));
|
||||
+ adap->quirks = &rt_i2c_quirks;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, i2c);
|
||||
+
|
||||
+ restart = rt_i2c_init(i2c);
|
||||
+
|
||||
+ ret = i2c_add_adapter(adap);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(&pdev->dev, "failed to add adapter\n");
|
||||
+ clk_disable_unprepare(i2c->clk);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ dev_info(&pdev->dev, "clock %uKHz, re-start %ssupport\n",
|
||||
+ i2c->cur_clk/1000, restart ? "" : "not ");
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int rt_i2c_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct rt_i2c *i2c = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ i2c_del_adapter(&i2c->adap);
|
||||
+ clk_disable_unprepare(i2c->clk);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver rt_i2c_driver = {
|
||||
+ .probe = rt_i2c_probe,
|
||||
+ .remove = rt_i2c_remove,
|
||||
+ .driver = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .name = "i2c-ralink",
|
||||
+ .of_match_table = i2c_rt_dt_ids,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init i2c_rt_init (void)
|
||||
+{
|
||||
+ return platform_driver_register(&rt_i2c_driver);
|
||||
+}
|
||||
+subsys_initcall(i2c_rt_init);
|
||||
+
|
||||
+static void __exit i2c_rt_exit (void)
|
||||
+{
|
||||
+ platform_driver_unregister(&rt_i2c_driver);
|
||||
+}
|
||||
+module_exit(i2c_rt_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Steven Liu <steven_liu@mediatek.com>");
|
||||
+MODULE_DESCRIPTION("Ralink I2c host driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_ALIAS("platform:Ralink-I2C");
|
||||
@ -0,0 +1,43 @@
|
||||
From 23147af14531cbdada194b94120ef8774f46292d Mon Sep 17 00:00:00 2001
|
||||
From: John Crispin <blogic@openwrt.org>
|
||||
Date: Thu, 13 Nov 2014 19:08:40 +0100
|
||||
Subject: [PATCH 46/53] mmc: MIPS: ralink: add sdhci for mt7620a SoC
|
||||
|
||||
Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
---
|
||||
drivers/mmc/host/Kconfig | 2 +
|
||||
drivers/mmc/host/Makefile | 1 +
|
||||
drivers/mmc/host/mtk-mmc/Kconfig | 16 +
|
||||
drivers/mmc/host/mtk-mmc/Makefile | 42 +
|
||||
drivers/mmc/host/mtk-mmc/board.h | 137 ++
|
||||
drivers/mmc/host/mtk-mmc/dbg.c | 347 ++++
|
||||
drivers/mmc/host/mtk-mmc/dbg.h | 156 ++
|
||||
drivers/mmc/host/mtk-mmc/mt6575_sd.h | 1001 +++++++++++
|
||||
drivers/mmc/host/mtk-mmc/sd.c | 3060 ++++++++++++++++++++++++++++++++++
|
||||
9 files changed, 4762 insertions(+)
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/Kconfig
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/Makefile
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/board.h
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/dbg.c
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/dbg.h
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/mt6575_sd.h
|
||||
create mode 100644 drivers/mmc/host/mtk-mmc/sd.c
|
||||
|
||||
--- a/drivers/mmc/host/Kconfig
|
||||
+++ b/drivers/mmc/host/Kconfig
|
||||
@@ -1091,3 +1091,5 @@ config MMC_OWL
|
||||
|
||||
config MMC_SDHCI_EXTERNAL_DMA
|
||||
bool
|
||||
+
|
||||
+source "drivers/mmc/host/mtk-mmc/Kconfig"
|
||||
--- a/drivers/mmc/host/Makefile
|
||||
+++ b/drivers/mmc/host/Makefile
|
||||
@@ -3,6 +3,7 @@
|
||||
# Makefile for MMC/SD host controller drivers
|
||||
#
|
||||
|
||||
+obj-$(CONFIG_MTK_MMC) += mtk-mmc/
|
||||
obj-$(CONFIG_MMC_ARMMMCI) += armmmci.o
|
||||
armmmci-y := mmci.o
|
||||
armmmci-$(CONFIG_MMC_QCOM_DML) += mmci_qcom_dml.o
|
||||
1029
target/linux/ramips/patches-5.15/835-asoc-add-mt7620-support.patch
Normal file
1029
target/linux/ramips/patches-5.15/835-asoc-add-mt7620-support.patch
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user