Merge 6.2-rc5 into char-misc-next
We need the char/misc driver fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
commit
99ba2ad1db
1
.mailmap
1
.mailmap
@ -371,6 +371,7 @@ Rémi Denis-Courmont <rdenis@simphalempin.com>
|
||||
Ricardo Ribalda <ribalda@kernel.org> <ricardo@ribalda.com>
|
||||
Ricardo Ribalda <ribalda@kernel.org> Ricardo Ribalda Delgado <ribalda@kernel.org>
|
||||
Ricardo Ribalda <ribalda@kernel.org> <ricardo.ribalda@gmail.com>
|
||||
Robert Foss <rfoss@kernel.org> <robert.foss@linaro.org>
|
||||
Roman Gushchin <roman.gushchin@linux.dev> <guro@fb.com>
|
||||
Roman Gushchin <roman.gushchin@linux.dev> <guroan@gmail.com>
|
||||
Roman Gushchin <roman.gushchin@linux.dev> <klamm@yandex-team.ru>
|
||||
|
@ -70,9 +70,7 @@ e.g. ``zswap.zpool=zbud``. It can also be changed at runtime using the sysfs
|
||||
The zbud type zpool allocates exactly 1 page to store 2 compressed pages, which
|
||||
means the compression ratio will always be 2:1 or worse (because of half-full
|
||||
zbud pages). The zsmalloc type zpool has a more complex compressed page
|
||||
storage method, and it can achieve greater storage densities. However,
|
||||
zsmalloc does not implement compressed page eviction, so once zswap fills it
|
||||
cannot evict the oldest page, it can only reject new pages.
|
||||
storage method, and it can achieve greater storage densities.
|
||||
|
||||
When a swap page is passed from frontswap to zswap, zswap maintains a mapping
|
||||
of the swap entry, a combination of the swap type and swap offset, to the zpool
|
||||
|
@ -84,7 +84,6 @@ allOf:
|
||||
- qcom,msm8939-pcnoc
|
||||
- qcom,msm8939-snoc
|
||||
- qcom,msm8996-a1noc
|
||||
- qcom,msm8996-a2noc
|
||||
- qcom,msm8996-bimc
|
||||
- qcom,msm8996-cnoc
|
||||
- qcom,msm8996-pnoc
|
||||
@ -186,6 +185,29 @@ allOf:
|
||||
required:
|
||||
- power-domains
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8996-a2noc
|
||||
|
||||
then:
|
||||
properties:
|
||||
clock-names:
|
||||
items:
|
||||
- const: bus
|
||||
- const: bus_a
|
||||
- const: aggre2_ufs_axi
|
||||
- const: ufs_axi
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Bus Clock
|
||||
- description: Bus A Clock
|
||||
- description: Aggregate2 NoC UFS AXI Clock
|
||||
- description: UFS AXI Clock
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
@ -2,7 +2,7 @@
|
||||
# Copyright 2019 BayLibre, SAS
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/phy/amlogic,meson-g12a-usb2-phy.yaml#"
|
||||
$id: "http://devicetree.org/schemas/phy/amlogic,g12a-usb2-phy.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Amlogic G12A USB2 PHY
|
||||
@ -13,8 +13,8 @@ maintainers:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- amlogic,meson-g12a-usb2-phy
|
||||
- amlogic,meson-a1-usb2-phy
|
||||
- amlogic,g12a-usb2-phy
|
||||
- amlogic,a1-usb2-phy
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@ -68,7 +68,7 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
phy@36000 {
|
||||
compatible = "amlogic,meson-g12a-usb2-phy";
|
||||
compatible = "amlogic,g12a-usb2-phy";
|
||||
reg = <0x36000 0x2000>;
|
||||
clocks = <&xtal>;
|
||||
clock-names = "xtal";
|
@ -2,7 +2,7 @@
|
||||
# Copyright 2019 BayLibre, SAS
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/phy/amlogic,meson-g12a-usb3-pcie-phy.yaml#"
|
||||
$id: "http://devicetree.org/schemas/phy/amlogic,g12a-usb3-pcie-phy.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Amlogic G12A USB3 + PCIE Combo PHY
|
||||
@ -13,7 +13,7 @@ maintainers:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- amlogic,meson-g12a-usb3-pcie-phy
|
||||
- amlogic,g12a-usb3-pcie-phy
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@ -49,7 +49,7 @@ additionalProperties: false
|
||||
examples:
|
||||
- |
|
||||
phy@46000 {
|
||||
compatible = "amlogic,meson-g12a-usb3-pcie-phy";
|
||||
compatible = "amlogic,g12a-usb3-pcie-phy";
|
||||
reg = <0x46000 0x2000>;
|
||||
clocks = <&ref_clk>;
|
||||
clock-names = "ref_clk";
|
@ -16,7 +16,6 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,usb-hs-28nm-femtophy
|
||||
- qcom,usb-hs-28nm-mdm9607
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -39,8 +39,8 @@ properties:
|
||||
qcom,protection-domain:
|
||||
$ref: /schemas/types.yaml#/definitions/string-array
|
||||
description: |
|
||||
Protection domain service name and path for APR service
|
||||
possible values are::
|
||||
Protection domain service name and path for APR service (if supported).
|
||||
Possible values are::
|
||||
"avs/audio", "msm/adsp/audio_pd".
|
||||
"kernel/elf_loader", "msm/modem/wlan_pd".
|
||||
"tms/servreg", "msm/adsp/audio_pd".
|
||||
@ -49,6 +49,5 @@ properties:
|
||||
|
||||
required:
|
||||
- reg
|
||||
- qcom,protection-domain
|
||||
|
||||
additionalProperties: true
|
||||
|
@ -120,6 +120,8 @@ dax={always,never} Use direct access (no page cache). See
|
||||
dax A legacy option which is an alias for ``dax=always``.
|
||||
device=%s Specify a path to an extra device to be used together.
|
||||
fsid=%s Specify a filesystem image ID for Fscache back-end.
|
||||
domain_id=%s Specify a domain ID in fscache mode so that different images
|
||||
with the same blobs under a given domain ID can share storage.
|
||||
=================== =========================================================
|
||||
|
||||
Sysfs Entries
|
||||
|
@ -1042,7 +1042,7 @@ $(clean-files).
|
||||
|
||||
When executing "make clean", the file "crc32table.h" will be deleted.
|
||||
Kbuild will assume files to be in the same relative directory as the
|
||||
Makefile, except if prefixed with $(objtree).
|
||||
Makefile.
|
||||
|
||||
To exclude certain files or directories from make clean, use the
|
||||
$(no-clean-files) variable.
|
||||
|
31
MAINTAINERS
31
MAINTAINERS
@ -383,7 +383,7 @@ ACPI COMPONENT ARCHITECTURE (ACPICA)
|
||||
M: Robert Moore <robert.moore@intel.com>
|
||||
M: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: devel@acpica.org
|
||||
L: acpica-devel@lists.linuxfoundation.org
|
||||
S: Supported
|
||||
W: https://acpica.org/
|
||||
W: https://github.com/acpica/acpica/
|
||||
@ -1104,7 +1104,6 @@ S: Supported
|
||||
F: arch/arm64/boot/dts/amd/
|
||||
|
||||
AMD XGBE DRIVER
|
||||
M: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
M: "Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
@ -6948,7 +6947,7 @@ F: drivers/gpu/drm/atmel-hlcdc/
|
||||
DRM DRIVERS FOR BRIDGE CHIPS
|
||||
M: Andrzej Hajda <andrzej.hajda@intel.com>
|
||||
M: Neil Armstrong <neil.armstrong@linaro.org>
|
||||
M: Robert Foss <robert.foss@linaro.org>
|
||||
M: Robert Foss <rfoss@kernel.org>
|
||||
R: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
|
||||
R: Jonas Karlman <jonas@kwiboo.se>
|
||||
R: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
@ -9299,7 +9298,7 @@ F: net/dsa/tag_hellcreek.c
|
||||
|
||||
HISILICON DMA DRIVER
|
||||
M: Zhou Wang <wangzhou1@hisilicon.com>
|
||||
M: Jie Hai <haijie1@hisilicon.com>
|
||||
M: Jie Hai <haijie1@huawei.com>
|
||||
L: dmaengine@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/dma/hisi_dma.c
|
||||
@ -15763,6 +15762,12 @@ S: Maintained
|
||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/p54
|
||||
F: drivers/net/wireless/intersil/p54/
|
||||
|
||||
PACKET SOCKETS
|
||||
M: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
|
||||
S: Maintained
|
||||
F: include/uapi/linux/if_packet.h
|
||||
F: net/packet/af_packet.c
|
||||
|
||||
PACKING
|
||||
M: Vladimir Oltean <olteanv@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
@ -17251,7 +17256,7 @@ F: Documentation/devicetree/bindings/net/qcom,bam-dmux.yaml
|
||||
F: drivers/net/wwan/qcom_bam_dmux.c
|
||||
|
||||
QUALCOMM CAMERA SUBSYSTEM DRIVER
|
||||
M: Robert Foss <robert.foss@linaro.org>
|
||||
M: Robert Foss <rfoss@kernel.org>
|
||||
M: Todor Tomov <todor.too@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -17331,7 +17336,7 @@ F: drivers/dma/qcom/hidma*
|
||||
|
||||
QUALCOMM I2C CCI DRIVER
|
||||
M: Loic Poulain <loic.poulain@linaro.org>
|
||||
M: Robert Foss <robert.foss@linaro.org>
|
||||
M: Robert Foss <rfoss@kernel.org>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -19339,6 +19344,13 @@ L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Orphan
|
||||
F: sound/soc/uniphier/
|
||||
|
||||
SOCKET TIMESTAMPING
|
||||
M: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
|
||||
S: Maintained
|
||||
F: Documentation/networking/timestamping.rst
|
||||
F: include/uapi/linux/net_tstamp.h
|
||||
F: tools/testing/selftests/net/so_txtime.c
|
||||
|
||||
SOEKRIS NET48XX LED SUPPORT
|
||||
M: Chris Boot <bootc@bootc.net>
|
||||
S: Maintained
|
||||
@ -21759,6 +21771,13 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/admin-guide/media/zr364xx*
|
||||
F: drivers/staging/media/deprecated/zr364xx/
|
||||
|
||||
USER DATAGRAM PROTOCOL (UDP)
|
||||
M: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
|
||||
S: Maintained
|
||||
F: include/linux/udp.h
|
||||
F: net/ipv4/udp.c
|
||||
F: net/ipv6/udp.c
|
||||
|
||||
USER-MODE LINUX (UML)
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
M: Anton Ivanov <anton.ivanov@cambridgegreys.com>
|
||||
|
17
Makefile
17
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -549,7 +549,7 @@ LDFLAGS_MODULE =
|
||||
CFLAGS_KERNEL =
|
||||
RUSTFLAGS_KERNEL =
|
||||
AFLAGS_KERNEL =
|
||||
export LDFLAGS_vmlinux =
|
||||
LDFLAGS_vmlinux =
|
||||
|
||||
# Use USERINCLUDE when you must reference the UAPI directories only.
|
||||
USERINCLUDE := \
|
||||
@ -1248,6 +1248,18 @@ vmlinux.o modules.builtin.modinfo modules.builtin: vmlinux_o
|
||||
@:
|
||||
|
||||
PHONY += vmlinux
|
||||
# LDFLAGS_vmlinux in the top Makefile defines linker flags for the top vmlinux,
|
||||
# not for decompressors. LDFLAGS_vmlinux in arch/*/boot/compressed/Makefile is
|
||||
# unrelated; the decompressors just happen to have the same base name,
|
||||
# arch/*/boot/compressed/vmlinux.
|
||||
# Export LDFLAGS_vmlinux only to scripts/Makefile.vmlinux.
|
||||
#
|
||||
# _LDFLAGS_vmlinux is a workaround for the 'private export' bug:
|
||||
# https://savannah.gnu.org/bugs/?61463
|
||||
# For Make > 4.4, the following simple code will work:
|
||||
# vmlinux: private export LDFLAGS_vmlinux := $(LDFLAGS_vmlinux)
|
||||
vmlinux: private _LDFLAGS_vmlinux := $(LDFLAGS_vmlinux)
|
||||
vmlinux: export LDFLAGS_vmlinux = $(_LDFLAGS_vmlinux)
|
||||
vmlinux: vmlinux.o $(KBUILD_LDS) modpost
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux
|
||||
|
||||
@ -1533,6 +1545,7 @@ endif
|
||||
# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES
|
||||
# is an exception.
|
||||
ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
||||
KBUILD_BUILTIN := 1
|
||||
modules: vmlinux
|
||||
endif
|
||||
|
||||
|
@ -304,7 +304,7 @@
|
||||
};
|
||||
|
||||
gpio0: gpio@18100 {
|
||||
compatible = "marvell,armadaxp-gpio",
|
||||
compatible = "marvell,armada-370-gpio",
|
||||
"marvell,orion-gpio";
|
||||
reg = <0x18100 0x40>, <0x181c0 0x08>;
|
||||
reg-names = "gpio", "pwm";
|
||||
@ -323,7 +323,7 @@
|
||||
};
|
||||
|
||||
gpio1: gpio@18140 {
|
||||
compatible = "marvell,armadaxp-gpio",
|
||||
compatible = "marvell,armada-370-gpio",
|
||||
"marvell,orion-gpio";
|
||||
reg = <0x18140 0x40>, <0x181c8 0x08>;
|
||||
reg-names = "gpio", "pwm";
|
||||
|
@ -213,7 +213,7 @@
|
||||
};
|
||||
|
||||
gpio0: gpio@18100 {
|
||||
compatible = "marvell,armadaxp-gpio", "marvell,orion-gpio";
|
||||
compatible = "marvell,orion-gpio";
|
||||
reg = <0x18100 0x40>;
|
||||
ngpios = <32>;
|
||||
gpio-controller;
|
||||
@ -227,7 +227,7 @@
|
||||
};
|
||||
|
||||
gpio1: gpio@18140 {
|
||||
compatible = "marvell,armadaxp-gpio", "marvell,orion-gpio";
|
||||
compatible = "marvell,orion-gpio";
|
||||
reg = <0x18140 0x40>;
|
||||
ngpios = <28>;
|
||||
gpio-controller;
|
||||
|
@ -488,7 +488,7 @@
|
||||
scl-gpios = <&gpio3 21 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
|
||||
i2c-switch@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9547";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -632,7 +632,6 @@
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1>;
|
||||
uart-has-rtscts;
|
||||
rts-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -32,7 +32,7 @@
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock_frequency = <100000>;
|
||||
clock-frequency = <100000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2>;
|
||||
status = "okay";
|
||||
|
@ -32,7 +32,7 @@
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
clock_frequency = <100000>;
|
||||
clock-frequency = <100000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
status = "okay";
|
||||
@ -52,7 +52,7 @@
|
||||
};
|
||||
|
||||
&i2c4 {
|
||||
clock_frequency = <100000>;
|
||||
clock-frequency = <100000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
status = "okay";
|
||||
|
@ -43,7 +43,7 @@
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
clock_frequency = <100000>;
|
||||
clock-frequency = <100000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
status = "okay";
|
||||
@ -64,7 +64,7 @@
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock_frequency = <100000>;
|
||||
clock-frequency = <100000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2>;
|
||||
status = "okay";
|
||||
|
@ -19,16 +19,16 @@
|
||||
serial@f995e000 {
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
sdhci@f9824900 {
|
||||
&sdhc_1 {
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
sdhci@f98a4900 {
|
||||
&sdhc_2 {
|
||||
cd-gpios = <&tlmm 122 GPIO_ACTIVE_LOW>;
|
||||
bus-width = <4>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -421,7 +421,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mmc@f9824900 {
|
||||
sdhc_1: mmc@f9824900 {
|
||||
compatible = "qcom,apq8084-sdhci", "qcom,sdhci-msm-v4";
|
||||
reg = <0xf9824900 0x11c>, <0xf9824000 0x800>;
|
||||
reg-names = "hc", "core";
|
||||
@ -434,7 +434,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mmc@f98a4900 {
|
||||
sdhc_2: mmc@f98a4900 {
|
||||
compatible = "qcom,apq8084-sdhci", "qcom,sdhci-msm-v4";
|
||||
reg = <0xf98a4900 0x11c>, <0xf98a4000 0x800>;
|
||||
reg-names = "hc", "core";
|
||||
|
@ -564,7 +564,7 @@
|
||||
mpddrc: mpddrc@ffffe800 {
|
||||
compatible = "microchip,sam9x60-ddramc", "atmel,sama5d3-ddramc";
|
||||
reg = <0xffffe800 0x200>;
|
||||
clocks = <&pmc PMC_TYPE_SYSTEM 2>, <&pmc PMC_TYPE_CORE PMC_MCK>;
|
||||
clocks = <&pmc PMC_TYPE_SYSTEM 2>, <&pmc PMC_TYPE_PERIPHERAL 49>;
|
||||
clock-names = "ddrck", "mpddr";
|
||||
};
|
||||
|
||||
|
@ -101,8 +101,12 @@
|
||||
|
||||
&qspi {
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&qspi_clk_pins_a &qspi_bk1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a &qspi_bk1_sleep_pins_a>;
|
||||
pinctrl-0 = <&qspi_clk_pins_a
|
||||
&qspi_bk1_pins_a
|
||||
&qspi_cs1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a
|
||||
&qspi_bk1_sleep_pins_a
|
||||
&qspi_cs1_sleep_pins_a>;
|
||||
reg = <0x58003000 0x1000>, <0x70000000 0x4000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -391,8 +391,12 @@
|
||||
|
||||
&qspi {
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&qspi_clk_pins_a &qspi_bk1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a &qspi_bk1_sleep_pins_a>;
|
||||
pinctrl-0 = <&qspi_clk_pins_a
|
||||
&qspi_bk1_pins_a
|
||||
&qspi_cs1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a
|
||||
&qspi_bk1_sleep_pins_a
|
||||
&qspi_cs1_sleep_pins_a>;
|
||||
reg = <0x58003000 0x1000>, <0x70000000 0x4000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -428,8 +428,12 @@
|
||||
|
||||
&qspi {
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&qspi_clk_pins_a &qspi_bk1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a &qspi_bk1_sleep_pins_a>;
|
||||
pinctrl-0 = <&qspi_clk_pins_a
|
||||
&qspi_bk1_pins_a
|
||||
&qspi_cs1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a
|
||||
&qspi_bk1_sleep_pins_a
|
||||
&qspi_cs1_sleep_pins_a>;
|
||||
reg = <0x58003000 0x1000>, <0x70000000 0x4000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -247,8 +247,12 @@
|
||||
|
||||
&qspi {
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&qspi_clk_pins_a &qspi_bk1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a &qspi_bk1_sleep_pins_a>;
|
||||
pinctrl-0 = <&qspi_clk_pins_a
|
||||
&qspi_bk1_pins_a
|
||||
&qspi_cs1_pins_a>;
|
||||
pinctrl-1 = <&qspi_clk_sleep_pins_a
|
||||
&qspi_bk1_sleep_pins_a
|
||||
&qspi_cs1_sleep_pins_a>;
|
||||
reg = <0x58003000 0x1000>, <0x70000000 0x200000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -345,7 +345,7 @@
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
tca9548@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9548";
|
||||
pinctrl-0 = <&pinctrl_i2c_mux_reset>;
|
||||
pinctrl-names = "default";
|
||||
|
@ -340,7 +340,7 @@
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
tca9548@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9548";
|
||||
pinctrl-0 = <&pinctrl_i2c_mux_reset>;
|
||||
pinctrl-names = "default";
|
||||
|
@ -20,7 +20,6 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include "common.h"
|
||||
|
@ -23,6 +23,7 @@ static int mx25_read_cpu_rev(void)
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,imx25-iim");
|
||||
iim_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
BUG_ON(!iim_base);
|
||||
rev = readl(iim_base + MXC_IIMSREV);
|
||||
iounmap(iim_base);
|
||||
|
@ -28,6 +28,7 @@ static int mx27_read_cpu_rev(void)
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,imx27-ccm");
|
||||
ccm_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
BUG_ON(!ccm_base);
|
||||
/*
|
||||
* now we have access to the IO registers. As we need
|
||||
|
@ -39,6 +39,7 @@ static int mx31_read_cpu_rev(void)
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,imx31-iim");
|
||||
iim_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
BUG_ON(!iim_base);
|
||||
|
||||
/* read SREV register from IIM module */
|
||||
|
@ -21,6 +21,7 @@ static int mx35_read_cpu_rev(void)
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,imx35-iim");
|
||||
iim_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
BUG_ON(!iim_base);
|
||||
|
||||
rev = imx_readl(iim_base + MXC_IIMSREV);
|
||||
|
@ -28,6 +28,7 @@ static u32 imx5_read_srev_reg(const char *compat)
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, compat);
|
||||
iim_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
WARN_ON(!iim_base);
|
||||
|
||||
srev = readl(iim_base + IIM_SREV) & 0xff;
|
||||
|
@ -4,6 +4,7 @@ menuconfig ARCH_OMAP1
|
||||
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5
|
||||
depends on CPU_LITTLE_ENDIAN
|
||||
depends on ATAGS
|
||||
select ARCH_OMAP
|
||||
select ARCH_HAS_HOLES_MEMORYMODEL
|
||||
select ARCH_OMAP
|
||||
select CLKSRC_MMIO
|
||||
@ -45,10 +46,6 @@ config ARCH_OMAP16XX
|
||||
select CPU_ARM926T
|
||||
select OMAP_DM_TIMER
|
||||
|
||||
config ARCH_OMAP1_ANY
|
||||
select ARCH_OMAP
|
||||
def_bool ARCH_OMAP730 || ARCH_OMAP850 || ARCH_OMAP15XX || ARCH_OMAP16XX
|
||||
|
||||
config ARCH_OMAP
|
||||
bool
|
||||
|
||||
|
@ -3,8 +3,6 @@
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
ifdef CONFIG_ARCH_OMAP1_ANY
|
||||
|
||||
# Common support
|
||||
obj-y := io.o id.o sram-init.o sram.o time.o irq.o mux.o flash.o \
|
||||
serial.o devices.o dma.o omap-dma.o fb.o
|
||||
@ -59,5 +57,3 @@ obj-$(CONFIG_ARCH_OMAP730) += gpio7xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP850) += gpio7xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP15XX) += gpio15xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP16XX) += gpio16xx.o
|
||||
|
||||
endif
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_data/gpio-omap.h>
|
||||
#include <linux/soc/ti/omap1-soc.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include "irqs.h"
|
||||
|
||||
|
@ -22,17 +22,14 @@
|
||||
* The machine specific code may provide the extra mapping besides the
|
||||
* default mapping provided here.
|
||||
*/
|
||||
static struct map_desc omap_io_desc[] __initdata = {
|
||||
#if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
|
||||
static struct map_desc omap7xx_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = OMAP1_IO_VIRT,
|
||||
.pfn = __phys_to_pfn(OMAP1_IO_PHYS),
|
||||
.length = OMAP1_IO_SIZE,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
};
|
||||
|
||||
#if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
|
||||
static struct map_desc omap7xx_io_desc[] __initdata = {
|
||||
},
|
||||
{
|
||||
.virtual = OMAP7XX_DSP_BASE,
|
||||
.pfn = __phys_to_pfn(OMAP7XX_DSP_START),
|
||||
@ -49,6 +46,12 @@ static struct map_desc omap7xx_io_desc[] __initdata = {
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
static struct map_desc omap1510_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = OMAP1_IO_VIRT,
|
||||
.pfn = __phys_to_pfn(OMAP1_IO_PHYS),
|
||||
.length = OMAP1_IO_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = OMAP1510_DSP_BASE,
|
||||
.pfn = __phys_to_pfn(OMAP1510_DSP_START),
|
||||
@ -65,6 +68,12 @@ static struct map_desc omap1510_io_desc[] __initdata = {
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
static struct map_desc omap16xx_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = OMAP1_IO_VIRT,
|
||||
.pfn = __phys_to_pfn(OMAP1_IO_PHYS),
|
||||
.length = OMAP1_IO_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = OMAP16XX_DSP_BASE,
|
||||
.pfn = __phys_to_pfn(OMAP16XX_DSP_START),
|
||||
@ -79,18 +88,9 @@ static struct map_desc omap16xx_io_desc[] __initdata = {
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Maps common IO regions for omap1
|
||||
*/
|
||||
static void __init omap1_map_common_io(void)
|
||||
{
|
||||
iotable_init(omap_io_desc, ARRAY_SIZE(omap_io_desc));
|
||||
}
|
||||
|
||||
#if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
|
||||
void __init omap7xx_map_io(void)
|
||||
{
|
||||
omap1_map_common_io();
|
||||
iotable_init(omap7xx_io_desc, ARRAY_SIZE(omap7xx_io_desc));
|
||||
}
|
||||
#endif
|
||||
@ -98,7 +98,6 @@ void __init omap7xx_map_io(void)
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
void __init omap15xx_map_io(void)
|
||||
{
|
||||
omap1_map_common_io();
|
||||
iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc));
|
||||
}
|
||||
#endif
|
||||
@ -106,7 +105,6 @@ void __init omap15xx_map_io(void)
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
void __init omap16xx_map_io(void)
|
||||
{
|
||||
omap1_map_common_io();
|
||||
iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc));
|
||||
}
|
||||
#endif
|
||||
|
@ -89,7 +89,6 @@ static struct omap_mcbsp_ops omap1_mcbsp_ops = {
|
||||
#define OMAP1610_MCBSP2_BASE 0xfffb1000
|
||||
#define OMAP1610_MCBSP3_BASE 0xe1017000
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
|
||||
struct resource omap7xx_mcbsp_res[][6] = {
|
||||
{
|
||||
{
|
||||
@ -159,14 +158,7 @@ static struct omap_mcbsp_platform_data omap7xx_mcbsp_pdata[] = {
|
||||
};
|
||||
#define OMAP7XX_MCBSP_RES_SZ ARRAY_SIZE(omap7xx_mcbsp_res[1])
|
||||
#define OMAP7XX_MCBSP_COUNT ARRAY_SIZE(omap7xx_mcbsp_res)
|
||||
#else
|
||||
#define omap7xx_mcbsp_res_0 NULL
|
||||
#define omap7xx_mcbsp_pdata NULL
|
||||
#define OMAP7XX_MCBSP_RES_SZ 0
|
||||
#define OMAP7XX_MCBSP_COUNT 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
struct resource omap15xx_mcbsp_res[][6] = {
|
||||
{
|
||||
{
|
||||
@ -266,14 +258,7 @@ static struct omap_mcbsp_platform_data omap15xx_mcbsp_pdata[] = {
|
||||
};
|
||||
#define OMAP15XX_MCBSP_RES_SZ ARRAY_SIZE(omap15xx_mcbsp_res[1])
|
||||
#define OMAP15XX_MCBSP_COUNT ARRAY_SIZE(omap15xx_mcbsp_res)
|
||||
#else
|
||||
#define omap15xx_mcbsp_res_0 NULL
|
||||
#define omap15xx_mcbsp_pdata NULL
|
||||
#define OMAP15XX_MCBSP_RES_SZ 0
|
||||
#define OMAP15XX_MCBSP_COUNT 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP16XX
|
||||
struct resource omap16xx_mcbsp_res[][6] = {
|
||||
{
|
||||
{
|
||||
@ -373,12 +358,6 @@ static struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
|
||||
};
|
||||
#define OMAP16XX_MCBSP_RES_SZ ARRAY_SIZE(omap16xx_mcbsp_res[1])
|
||||
#define OMAP16XX_MCBSP_COUNT ARRAY_SIZE(omap16xx_mcbsp_res)
|
||||
#else
|
||||
#define omap16xx_mcbsp_res_0 NULL
|
||||
#define omap16xx_mcbsp_pdata NULL
|
||||
#define OMAP16XX_MCBSP_RES_SZ 0
|
||||
#define OMAP16XX_MCBSP_COUNT 0
|
||||
#endif
|
||||
|
||||
static void omap_mcbsp_register_board_cfg(struct resource *res, int res_count,
|
||||
struct omap_mcbsp_platform_data *config, int size)
|
||||
|
@ -106,13 +106,6 @@
|
||||
#define OMAP7XX_IDLECT3 0xfffece24
|
||||
#define OMAP7XX_IDLE_LOOP_REQUEST 0x0C00
|
||||
|
||||
#if !defined(CONFIG_ARCH_OMAP730) && \
|
||||
!defined(CONFIG_ARCH_OMAP850) && \
|
||||
!defined(CONFIG_ARCH_OMAP15XX) && \
|
||||
!defined(CONFIG_ARCH_OMAP16XX)
|
||||
#warning "Power management for this processor not implemented yet"
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
@ -45,6 +45,8 @@ config MACH_PXA27X_DT
|
||||
config MACH_PXA3XX_DT
|
||||
bool "Support PXA3xx platforms from device tree"
|
||||
select CPU_PXA300
|
||||
select CPU_PXA310
|
||||
select CPU_PXA320
|
||||
select PINCTRL
|
||||
select POWER_SUPPLY
|
||||
select PXA3xx
|
||||
|
@ -131,10 +131,6 @@
|
||||
};
|
||||
|
||||
&usb {
|
||||
phys = <&usb2_phy1>;
|
||||
phy-names = "usb2-phy1";
|
||||
};
|
||||
|
||||
&usb2_phy0 {
|
||||
status = "disabled";
|
||||
phys = <&usb2_phy0>, <&usb2_phy1>;
|
||||
phy-names = "usb2-phy0", "usb2-phy1";
|
||||
};
|
||||
|
@ -110,7 +110,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
pca9547@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
|
@ -89,7 +89,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
pca9547@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
|
@ -88,7 +88,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
pca9547@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
|
@ -53,7 +53,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
i2c-switch@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
|
@ -136,7 +136,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
i2c-switch@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
|
@ -245,7 +245,7 @@
|
||||
&i2c3 {
|
||||
status = "okay";
|
||||
|
||||
i2c-switch@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9540";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -103,7 +103,7 @@
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
pca9547@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x77>;
|
||||
#address-cells = <1>;
|
||||
|
@ -44,7 +44,7 @@
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
pca9547@75 {
|
||||
i2c-mux@75 {
|
||||
compatible = "nxp,pca9547";
|
||||
reg = <0x75>;
|
||||
#address-cells = <1>;
|
||||
|
@ -54,7 +54,7 @@
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
i2c-switch@77 {
|
||||
i2c-mux@77 {
|
||||
compatible = "nxp,pca9547";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -120,7 +120,7 @@
|
||||
&ecspi2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_espi2>;
|
||||
cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
|
||||
cs-gpios = <&gpio5 13 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
|
||||
eeprom@0 {
|
||||
@ -316,7 +316,7 @@
|
||||
MX8MM_IOMUXC_ECSPI2_SCLK_ECSPI2_SCLK 0x82
|
||||
MX8MM_IOMUXC_ECSPI2_MOSI_ECSPI2_MOSI 0x82
|
||||
MX8MM_IOMUXC_ECSPI2_MISO_ECSPI2_MISO 0x82
|
||||
MX8MM_IOMUXC_ECSPI1_SS0_GPIO5_IO9 0x41
|
||||
MX8MM_IOMUXC_ECSPI2_SS0_GPIO5_IO13 0x41
|
||||
>;
|
||||
};
|
||||
|
||||
|
@ -275,7 +275,7 @@
|
||||
compatible = "rohm,bd71847";
|
||||
reg = <0x4b>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&clk_xtal32k 0>;
|
||||
clocks = <&clk_xtal32k>;
|
||||
clock-output-names = "clk-32k-out";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_pmic>;
|
||||
|
@ -214,7 +214,7 @@
|
||||
pinctrl-0 = <&pinctrl_i2c3>;
|
||||
status = "okay";
|
||||
|
||||
i2cmux@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9540";
|
||||
reg = <0x70>;
|
||||
#address-cells = <1>;
|
||||
|
@ -771,6 +771,7 @@
|
||||
&usbotg2 {
|
||||
dr_mode = "host";
|
||||
vbus-supply = <®_usb2_vbus>;
|
||||
over-current-active-low;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
simple-audio-card,bitclock-master = <&dailink_master>;
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,frame-master = <&dailink_master>;
|
||||
simple-audio-card,mclk-fs = <256>;
|
||||
simple-audio-card,name = "imx8mm-wm8904";
|
||||
simple-audio-card,routing =
|
||||
"Headphone Jack", "HPOUTL",
|
||||
|
@ -11,6 +11,7 @@
|
||||
simple-audio-card,bitclock-master = <&dailink_master>;
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,frame-master = <&dailink_master>;
|
||||
simple-audio-card,mclk-fs = <256>;
|
||||
simple-audio-card,name = "imx8mm-nau8822";
|
||||
simple-audio-card,routing =
|
||||
"Headphones", "LHP",
|
||||
|
@ -99,7 +99,6 @@
|
||||
|
||||
regulators {
|
||||
buck1: BUCK1 {
|
||||
regulator-compatible = "BUCK1";
|
||||
regulator-min-microvolt = <600000>;
|
||||
regulator-max-microvolt = <2187500>;
|
||||
regulator-boot-on;
|
||||
@ -108,7 +107,6 @@
|
||||
};
|
||||
|
||||
buck2: BUCK2 {
|
||||
regulator-compatible = "BUCK2";
|
||||
regulator-min-microvolt = <600000>;
|
||||
regulator-max-microvolt = <2187500>;
|
||||
regulator-boot-on;
|
||||
@ -119,7 +117,6 @@
|
||||
};
|
||||
|
||||
buck4: BUCK4 {
|
||||
regulator-compatible = "BUCK4";
|
||||
regulator-min-microvolt = <600000>;
|
||||
regulator-max-microvolt = <3400000>;
|
||||
regulator-boot-on;
|
||||
@ -127,7 +124,6 @@
|
||||
};
|
||||
|
||||
buck5: BUCK5 {
|
||||
regulator-compatible = "BUCK5";
|
||||
regulator-min-microvolt = <600000>;
|
||||
regulator-max-microvolt = <3400000>;
|
||||
regulator-boot-on;
|
||||
@ -135,7 +131,6 @@
|
||||
};
|
||||
|
||||
buck6: BUCK6 {
|
||||
regulator-compatible = "BUCK6";
|
||||
regulator-min-microvolt = <600000>;
|
||||
regulator-max-microvolt = <3400000>;
|
||||
regulator-boot-on;
|
||||
@ -143,7 +138,6 @@
|
||||
};
|
||||
|
||||
ldo1: LDO1 {
|
||||
regulator-compatible = "LDO1";
|
||||
regulator-min-microvolt = <1600000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
@ -151,7 +145,6 @@
|
||||
};
|
||||
|
||||
ldo2: LDO2 {
|
||||
regulator-compatible = "LDO2";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1150000>;
|
||||
regulator-boot-on;
|
||||
@ -159,7 +152,6 @@
|
||||
};
|
||||
|
||||
ldo3: LDO3 {
|
||||
regulator-compatible = "LDO3";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
@ -167,13 +159,11 @@
|
||||
};
|
||||
|
||||
ldo4: LDO4 {
|
||||
regulator-compatible = "LDO4";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
ldo5: LDO5 {
|
||||
regulator-compatible = "LDO5";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
|
@ -524,6 +524,7 @@
|
||||
compatible = "fsl,imx8mp-gpc";
|
||||
reg = <0x303a0000 0x1000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
|
||||
@ -590,7 +591,7 @@
|
||||
reg = <IMX8MP_POWER_DOMAIN_MIPI_PHY2>;
|
||||
};
|
||||
|
||||
pgc_hsiomix: power-domains@17 {
|
||||
pgc_hsiomix: power-domain@17 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MP_POWER_DOMAIN_HSIOMIX>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_AXI>,
|
||||
@ -1297,7 +1298,7 @@
|
||||
reg = <0x32f10100 0x8>,
|
||||
<0x381f0000 0x20>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
<&clk IMX8MP_CLK_USB_SUSP>;
|
||||
clock-names = "hsio", "suspend";
|
||||
interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&hsio_blk_ctrl IMX8MP_HSIOBLK_PD_USB>;
|
||||
@ -1310,9 +1311,9 @@
|
||||
usb_dwc3_0: usb@38100000 {
|
||||
compatible = "snps,dwc3";
|
||||
reg = <0x38100000 0x10000>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_AXI>,
|
||||
clocks = <&clk IMX8MP_CLK_USB_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_CORE_REF>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
<&clk IMX8MP_CLK_USB_SUSP>;
|
||||
clock-names = "bus_early", "ref", "suspend";
|
||||
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&usb3_phy0>, <&usb3_phy0>;
|
||||
@ -1339,7 +1340,7 @@
|
||||
reg = <0x32f10108 0x8>,
|
||||
<0x382f0000 0x20>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
<&clk IMX8MP_CLK_USB_SUSP>;
|
||||
clock-names = "hsio", "suspend";
|
||||
interrupts = <GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&hsio_blk_ctrl IMX8MP_HSIOBLK_PD_USB>;
|
||||
@ -1352,9 +1353,9 @@
|
||||
usb_dwc3_1: usb@38200000 {
|
||||
compatible = "snps,dwc3";
|
||||
reg = <0x38200000 0x10000>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_AXI>,
|
||||
clocks = <&clk IMX8MP_CLK_USB_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_CORE_REF>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
<&clk IMX8MP_CLK_USB_SUSP>;
|
||||
clock-names = "bus_early", "ref", "suspend";
|
||||
interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&usb3_phy1>, <&usb3_phy1>;
|
||||
|
@ -133,7 +133,7 @@
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
status = "okay";
|
||||
|
||||
i2cmux@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9546";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1_pca9546>;
|
||||
@ -216,7 +216,7 @@
|
||||
pinctrl-0 = <&pinctrl_i2c4>;
|
||||
status = "okay";
|
||||
|
||||
pca9546: i2cmux@70 {
|
||||
pca9546: i2c-mux@70 {
|
||||
compatible = "nxp,pca9546";
|
||||
reg = <0x70>;
|
||||
#address-cells = <1>;
|
||||
|
@ -339,7 +339,7 @@
|
||||
bus-width = <4>;
|
||||
non-removable;
|
||||
no-sd;
|
||||
no-emmc;
|
||||
no-mmc;
|
||||
status = "okay";
|
||||
|
||||
brcmf: wifi@1 {
|
||||
@ -359,7 +359,7 @@
|
||||
cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
|
||||
bus-width = <4>;
|
||||
no-sdio;
|
||||
no-emmc;
|
||||
no-mmc;
|
||||
disable-wp;
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -61,7 +61,7 @@
|
||||
pinctrl-0 = <&pinctrl_lpi2c1 &pinctrl_ioexp_rst>;
|
||||
status = "okay";
|
||||
|
||||
i2c-switch@71 {
|
||||
i2c-mux@71 {
|
||||
compatible = "nxp,pca9646", "nxp,pca9546";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -74,7 +74,7 @@
|
||||
|
||||
pinctrl_usdhc1: usdhc1grp {
|
||||
fsl,pins = <
|
||||
MX93_PAD_SD1_CLK__USDHC1_CLK 0x17fe
|
||||
MX93_PAD_SD1_CLK__USDHC1_CLK 0x15fe
|
||||
MX93_PAD_SD1_CMD__USDHC1_CMD 0x13fe
|
||||
MX93_PAD_SD1_DATA0__USDHC1_DATA0 0x13fe
|
||||
MX93_PAD_SD1_DATA1__USDHC1_DATA1 0x13fe
|
||||
@ -84,7 +84,7 @@
|
||||
MX93_PAD_SD1_DATA5__USDHC1_DATA5 0x13fe
|
||||
MX93_PAD_SD1_DATA6__USDHC1_DATA6 0x13fe
|
||||
MX93_PAD_SD1_DATA7__USDHC1_DATA7 0x13fe
|
||||
MX93_PAD_SD1_STROBE__USDHC1_STROBE 0x17fe
|
||||
MX93_PAD_SD1_STROBE__USDHC1_STROBE 0x15fe
|
||||
>;
|
||||
};
|
||||
|
||||
@ -102,7 +102,7 @@
|
||||
|
||||
pinctrl_usdhc2: usdhc2grp {
|
||||
fsl,pins = <
|
||||
MX93_PAD_SD2_CLK__USDHC2_CLK 0x17fe
|
||||
MX93_PAD_SD2_CLK__USDHC2_CLK 0x15fe
|
||||
MX93_PAD_SD2_CMD__USDHC2_CMD 0x13fe
|
||||
MX93_PAD_SD2_DATA0__USDHC2_DATA0 0x13fe
|
||||
MX93_PAD_SD2_DATA1__USDHC2_DATA1 0x13fe
|
||||
|
@ -98,7 +98,7 @@
|
||||
|
||||
uart1: serial@12100 {
|
||||
compatible = "snps,dw-apb-uart";
|
||||
reg = <0x11000 0x100>;
|
||||
reg = <0x12100 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg-io-width = <1>;
|
||||
|
@ -3,6 +3,7 @@
|
||||
* Copyright (c) 2015, LGE Inc. All rights reserved.
|
||||
* Copyright (c) 2016, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021, Petr Vorel <petr.vorel@gmail.com>
|
||||
* Copyright (c) 2022, Dominik Kobinski <dominikkobinski314@gmail.com>
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@ -51,6 +52,11 @@
|
||||
reg = <0 0x03400000 0 0x1200000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
removed_region: reserved@5000000 {
|
||||
reg = <0 0x05000000 0 0x2200000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -11,6 +11,12 @@
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/gpio-keys.h>
|
||||
|
||||
/delete-node/ &adsp_mem;
|
||||
/delete-node/ &audio_mem;
|
||||
/delete-node/ &mpss_mem;
|
||||
/delete-node/ &peripheral_region;
|
||||
/delete-node/ &rmtfs_mem;
|
||||
|
||||
/ {
|
||||
model = "Xiaomi Mi 4C";
|
||||
compatible = "xiaomi,libra", "qcom,msm8992";
|
||||
@ -70,25 +76,67 @@
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* This is for getting crash logs using Android downstream kernels */
|
||||
memory_hole: hole@6400000 {
|
||||
reg = <0 0x06400000 0 0x600000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
memory_hole2: hole2@6c00000 {
|
||||
reg = <0 0x06c00000 0 0x2400000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
mpss_mem: mpss@9000000 {
|
||||
reg = <0 0x09000000 0 0x5a00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
tzapp: tzapp@ea00000 {
|
||||
reg = <0 0x0ea00000 0 0x1900000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
mdm_rfsa_mem: mdm-rfsa@ca0b0000 {
|
||||
reg = <0 0xca0b0000 0 0x10000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
rmtfs_mem: rmtfs@ca100000 {
|
||||
compatible = "qcom,rmtfs-mem";
|
||||
reg = <0 0xca100000 0 0x180000>;
|
||||
no-map;
|
||||
|
||||
qcom,client-id = <1>;
|
||||
};
|
||||
|
||||
audio_mem: audio@cb400000 {
|
||||
reg = <0 0xcb000000 0 0x400000>;
|
||||
no-mem;
|
||||
};
|
||||
|
||||
qseecom_mem: qseecom@cb400000 {
|
||||
reg = <0 0xcb400000 0 0x1c00000>;
|
||||
no-mem;
|
||||
};
|
||||
|
||||
adsp_rfsa_mem: adsp-rfsa@cd000000 {
|
||||
reg = <0 0xcd000000 0 0x10000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
sensor_rfsa_mem: sensor-rfsa@cd010000 {
|
||||
reg = <0 0xcd010000 0 0x10000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
ramoops@dfc00000 {
|
||||
compatible = "ramoops";
|
||||
reg = <0x0 0xdfc00000 0x0 0x40000>;
|
||||
reg = <0 0xdfc00000 0 0x40000>;
|
||||
console-size = <0x10000>;
|
||||
record-size = <0x10000>;
|
||||
ftrace-size = <0x10000>;
|
||||
pmsg-size = <0x20000>;
|
||||
};
|
||||
|
||||
modem_region: modem_region@9000000 {
|
||||
reg = <0x0 0x9000000 0x0 0x5a00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
tzapp: modem_region@ea00000 {
|
||||
reg = <0x0 0xea00000 0x0 0x1900000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@ -130,11 +178,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&peripheral_region {
|
||||
reg = <0x0 0x7400000 0x0 0x1c00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
&pm8994_spmi_regulators {
|
||||
VDD_APC0: s8 {
|
||||
regulator-min-microvolt = <680000>;
|
||||
|
@ -37,10 +37,6 @@
|
||||
compatible = "qcom,rpmcc-msm8992", "qcom,rpmcc";
|
||||
};
|
||||
|
||||
&tcsr_mutex {
|
||||
compatible = "qcom,sfpb-mutex";
|
||||
};
|
||||
|
||||
&timer {
|
||||
interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
|
@ -9,9 +9,6 @@
|
||||
|
||||
#include "msm8994.dtsi"
|
||||
|
||||
/* Angler's firmware does not report where the memory is allocated */
|
||||
/delete-node/ &cont_splash_mem;
|
||||
|
||||
/ {
|
||||
model = "Huawei Nexus 6P";
|
||||
compatible = "huawei,angler", "qcom,msm8994";
|
||||
@ -28,6 +25,22 @@
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
tzapp_mem: tzapp@4800000 {
|
||||
reg = <0 0x04800000 0 0x1900000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
removed_region: reserved@6300000 {
|
||||
reg = <0 0x06300000 0 0xD00000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&blsp1_uart2 {
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <dt-bindings/interconnect/qcom,sc8280xp.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/mailbox/qcom-ipcc.h>
|
||||
#include <dt-bindings/phy/phy-qcom-qmp.h>
|
||||
#include <dt-bindings/power/qcom-rpmpd.h>
|
||||
#include <dt-bindings/soc/qcom,rpmh-rsc.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
@ -762,7 +763,7 @@
|
||||
<0>,
|
||||
<0>,
|
||||
<0>,
|
||||
<&usb_0_ssphy>,
|
||||
<&usb_0_qmpphy QMP_USB43DP_USB3_PIPE_CLK>,
|
||||
<0>,
|
||||
<0>,
|
||||
<0>,
|
||||
@ -770,7 +771,7 @@
|
||||
<0>,
|
||||
<0>,
|
||||
<0>,
|
||||
<&usb_1_ssphy>,
|
||||
<&usb_1_qmpphy QMP_USB43DP_USB3_PIPE_CLK>,
|
||||
<0>,
|
||||
<0>,
|
||||
<0>,
|
||||
@ -1673,42 +1674,26 @@
|
||||
};
|
||||
};
|
||||
|
||||
usb_0_qmpphy: phy-wrapper@88ec000 {
|
||||
usb_0_qmpphy: phy@88eb000 {
|
||||
compatible = "qcom,sc8280xp-qmp-usb43dp-phy";
|
||||
reg = <0 0x088ec000 0 0x1e4>,
|
||||
<0 0x088eb000 0 0x40>,
|
||||
<0 0x088ed000 0 0x1c8>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
reg = <0 0x088eb000 0 0x4000>;
|
||||
|
||||
clocks = <&gcc GCC_USB3_PRIM_PHY_AUX_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_USB4_EUD_CLKREF_CLK>,
|
||||
<&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>;
|
||||
clock-names = "aux", "ref_clk_src", "ref", "com_aux";
|
||||
|
||||
resets = <&gcc GCC_USB3_PHY_PRIM_BCR>,
|
||||
<&gcc GCC_USB3_DP_PHY_PRIM_BCR>;
|
||||
reset-names = "phy", "common";
|
||||
<&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>,
|
||||
<&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>;
|
||||
clock-names = "aux", "ref", "com_aux", "usb3_pipe";
|
||||
|
||||
power-domains = <&gcc USB30_PRIM_GDSC>;
|
||||
|
||||
status = "disabled";
|
||||
resets = <&gcc GCC_USB3_PHY_PRIM_BCR>,
|
||||
<&gcc GCC_USB4_DP_PHY_PRIM_BCR>;
|
||||
reset-names = "phy", "common";
|
||||
|
||||
usb_0_ssphy: usb3-phy@88eb400 {
|
||||
reg = <0 0x088eb400 0 0x100>,
|
||||
<0 0x088eb600 0 0x3ec>,
|
||||
<0 0x088ec400 0 0x364>,
|
||||
<0 0x088eba00 0 0x100>,
|
||||
<0 0x088ebc00 0 0x3ec>,
|
||||
<0 0x088ec200 0 0x18>;
|
||||
#phy-cells = <0>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>;
|
||||
clock-names = "pipe0";
|
||||
clock-output-names = "usb0_phy_pipe_clk_src";
|
||||
};
|
||||
#clock-cells = <1>;
|
||||
#phy-cells = <1>;
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb_1_hsphy: phy@8902000 {
|
||||
@ -1725,42 +1710,26 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb_1_qmpphy: phy-wrapper@8904000 {
|
||||
usb_1_qmpphy: phy@8903000 {
|
||||
compatible = "qcom,sc8280xp-qmp-usb43dp-phy";
|
||||
reg = <0 0x08904000 0 0x1e4>,
|
||||
<0 0x08903000 0 0x40>,
|
||||
<0 0x08905000 0 0x1c8>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
reg = <0 0x08903000 0 0x4000>;
|
||||
|
||||
clocks = <&gcc GCC_USB3_SEC_PHY_AUX_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_USB4_CLKREF_CLK>,
|
||||
<&gcc GCC_USB3_SEC_PHY_COM_AUX_CLK>;
|
||||
clock-names = "aux", "ref_clk_src", "ref", "com_aux";
|
||||
<&gcc GCC_USB3_SEC_PHY_COM_AUX_CLK>,
|
||||
<&gcc GCC_USB3_SEC_PHY_PIPE_CLK>;
|
||||
clock-names = "aux", "ref", "com_aux", "usb3_pipe";
|
||||
|
||||
power-domains = <&gcc USB30_SEC_GDSC>;
|
||||
|
||||
resets = <&gcc GCC_USB3_PHY_SEC_BCR>,
|
||||
<&gcc GCC_USB4_1_DP_PHY_PRIM_BCR>;
|
||||
reset-names = "phy", "common";
|
||||
|
||||
power-domains = <&gcc USB30_SEC_GDSC>;
|
||||
#clock-cells = <1>;
|
||||
#phy-cells = <1>;
|
||||
|
||||
status = "disabled";
|
||||
|
||||
usb_1_ssphy: usb3-phy@8903400 {
|
||||
reg = <0 0x08903400 0 0x100>,
|
||||
<0 0x08903600 0 0x3ec>,
|
||||
<0 0x08904400 0 0x364>,
|
||||
<0 0x08903a00 0 0x100>,
|
||||
<0 0x08903c00 0 0x3ec>,
|
||||
<0 0x08904200 0 0x18>;
|
||||
#phy-cells = <0>;
|
||||
#clock-cells = <0>;
|
||||
clocks = <&gcc GCC_USB3_SEC_PHY_PIPE_CLK>;
|
||||
clock-names = "pipe0";
|
||||
clock-output-names = "usb1_phy_pipe_clk_src";
|
||||
};
|
||||
};
|
||||
|
||||
pmu@9091000 {
|
||||
@ -1910,7 +1879,7 @@
|
||||
reg = <0 0x0a600000 0 0xcd00>;
|
||||
interrupts = <GIC_SPI 803 IRQ_TYPE_LEVEL_HIGH>;
|
||||
iommus = <&apps_smmu 0x820 0x0>;
|
||||
phys = <&usb_0_hsphy>, <&usb_0_ssphy>;
|
||||
phys = <&usb_0_hsphy>, <&usb_0_qmpphy QMP_USB43DP_USB3_PHY>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
};
|
||||
};
|
||||
@ -1964,7 +1933,7 @@
|
||||
reg = <0 0x0a800000 0 0xcd00>;
|
||||
interrupts = <GIC_SPI 810 IRQ_TYPE_LEVEL_HIGH>;
|
||||
iommus = <&apps_smmu 0x860 0x0>;
|
||||
phys = <&usb_1_hsphy>, <&usb_1_ssphy>;
|
||||
phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
};
|
||||
};
|
||||
|
@ -334,7 +334,6 @@
|
||||
exit-latency-us = <6562>;
|
||||
min-residency-us = <9987>;
|
||||
local-timer-stop;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -2382,8 +2382,8 @@
|
||||
<&rpmhcc RPMH_CXO_CLK>;
|
||||
clock-names = "iface", "core", "xo";
|
||||
resets = <&gcc GCC_SDCC2_BCR>;
|
||||
interconnects = <&aggre2_noc MASTER_SDCC_2 0 &mc_virt SLAVE_EBI1 0>,
|
||||
<&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_SDCC_2 0>;
|
||||
interconnects = <&aggre2_noc MASTER_SDCC_2 &mc_virt SLAVE_EBI1>,
|
||||
<&gem_noc MASTER_APPSS_PROC &config_noc SLAVE_SDCC_2>;
|
||||
interconnect-names = "sdhc-ddr","cpu-sdhc";
|
||||
iommus = <&apps_smmu 0x4a0 0x0>;
|
||||
power-domains = <&rpmhpd SM8350_CX>;
|
||||
|
@ -10,8 +10,6 @@
|
||||
#define FTRACE_REGS_PLT_IDX 1
|
||||
#define NR_FTRACE_PLTS 2
|
||||
|
||||
#define GRAPH_FAKE_OFFSET (sizeof(struct pt_regs) - offsetof(struct pt_regs, regs[1]))
|
||||
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
|
||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||
|
@ -377,14 +377,6 @@ static inline bool unsigned_imm_check(unsigned long val, unsigned int bit)
|
||||
return val < (1UL << bit);
|
||||
}
|
||||
|
||||
static inline unsigned long sign_extend(unsigned long val, unsigned int idx)
|
||||
{
|
||||
if (!is_imm_negative(val, idx + 1))
|
||||
return ((1UL << idx) - 1) & val;
|
||||
else
|
||||
return ~((1UL << idx) - 1) | val;
|
||||
}
|
||||
|
||||
#define DEF_EMIT_REG0I26_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
int offset) \
|
||||
@ -401,6 +393,7 @@ static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
}
|
||||
|
||||
DEF_EMIT_REG0I26_FORMAT(b, b_op)
|
||||
DEF_EMIT_REG0I26_FORMAT(bl, bl_op)
|
||||
|
||||
#define DEF_EMIT_REG1I20_FORMAT(NAME, OP) \
|
||||
static inline void emit_##NAME(union loongarch_instruction *insn, \
|
||||
|
@ -8,7 +8,9 @@
|
||||
#define _ASM_UNWIND_H
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ftrace.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
enum unwinder_type {
|
||||
@ -20,11 +22,13 @@ struct unwind_state {
|
||||
char type; /* UNWINDER_XXX */
|
||||
struct stack_info stack_info;
|
||||
struct task_struct *task;
|
||||
bool first, error, is_ftrace;
|
||||
bool first, error, reset;
|
||||
int graph_idx;
|
||||
unsigned long sp, pc, ra;
|
||||
};
|
||||
|
||||
bool default_next_frame(struct unwind_state *state);
|
||||
|
||||
void unwind_start(struct unwind_state *state,
|
||||
struct task_struct *task, struct pt_regs *regs);
|
||||
bool unwind_next_frame(struct unwind_state *state);
|
||||
@ -40,4 +44,39 @@ static inline bool unwind_error(struct unwind_state *state)
|
||||
return state->error;
|
||||
}
|
||||
|
||||
#define GRAPH_FAKE_OFFSET (sizeof(struct pt_regs) - offsetof(struct pt_regs, regs[1]))
|
||||
|
||||
static inline unsigned long unwind_graph_addr(struct unwind_state *state,
|
||||
unsigned long pc, unsigned long cfa)
|
||||
{
|
||||
return ftrace_graph_ret_addr(state->task, &state->graph_idx,
|
||||
pc, (unsigned long *)(cfa - GRAPH_FAKE_OFFSET));
|
||||
}
|
||||
|
||||
static __always_inline void __unwind_start(struct unwind_state *state,
|
||||
struct task_struct *task, struct pt_regs *regs)
|
||||
{
|
||||
memset(state, 0, sizeof(*state));
|
||||
if (regs) {
|
||||
state->sp = regs->regs[3];
|
||||
state->pc = regs->csr_era;
|
||||
state->ra = regs->regs[1];
|
||||
} else if (task && task != current) {
|
||||
state->sp = thread_saved_fp(task);
|
||||
state->pc = thread_saved_ra(task);
|
||||
state->ra = 0;
|
||||
} else {
|
||||
state->sp = (unsigned long)__builtin_frame_address(0);
|
||||
state->pc = (unsigned long)__builtin_return_address(0);
|
||||
state->ra = 0;
|
||||
}
|
||||
state->task = task;
|
||||
get_stack_info(state->sp, state->task, &state->stack_info);
|
||||
state->pc = unwind_graph_addr(state, state->pc, state->sp);
|
||||
}
|
||||
|
||||
static __always_inline unsigned long __unwind_get_return_address(struct unwind_state *state)
|
||||
{
|
||||
return unwind_done(state) ? 0 : state->pc;
|
||||
}
|
||||
#endif /* _ASM_UNWIND_H */
|
||||
|
@ -8,7 +8,7 @@ extra-y := vmlinux.lds
|
||||
obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \
|
||||
traps.o irq.o idle.o process.o dma.o mem.o io.o reset.o switch.o \
|
||||
elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o \
|
||||
alternative.o unaligned.o
|
||||
alternative.o unaligned.o unwind.o
|
||||
|
||||
obj-$(CONFIG_ACPI) += acpi.o
|
||||
obj-$(CONFIG_EFI) += efi.o
|
||||
|
@ -74,7 +74,7 @@ static void __init_or_module recompute_jump(union loongarch_instruction *buf,
|
||||
switch (src->reg0i26_format.opcode) {
|
||||
case b_op:
|
||||
case bl_op:
|
||||
jump_addr = cur_pc + sign_extend((si_h << 16 | si_l) << 2, 27);
|
||||
jump_addr = cur_pc + sign_extend64((si_h << 16 | si_l) << 2, 27);
|
||||
if (in_alt_jump(jump_addr, start, end))
|
||||
return;
|
||||
offset = jump_addr - pc;
|
||||
@ -93,7 +93,7 @@ static void __init_or_module recompute_jump(union loongarch_instruction *buf,
|
||||
fallthrough;
|
||||
case beqz_op:
|
||||
case bnez_op:
|
||||
jump_addr = cur_pc + sign_extend((si_h << 16 | si_l) << 2, 22);
|
||||
jump_addr = cur_pc + sign_extend64((si_h << 16 | si_l) << 2, 22);
|
||||
if (in_alt_jump(jump_addr, start, end))
|
||||
return;
|
||||
offset = jump_addr - pc;
|
||||
@ -112,7 +112,7 @@ static void __init_or_module recompute_jump(union loongarch_instruction *buf,
|
||||
case bge_op:
|
||||
case bltu_op:
|
||||
case bgeu_op:
|
||||
jump_addr = cur_pc + sign_extend(si << 2, 17);
|
||||
jump_addr = cur_pc + sign_extend64(si << 2, 17);
|
||||
if (in_alt_jump(jump_addr, start, end))
|
||||
return;
|
||||
offset = jump_addr - pc;
|
||||
|
@ -94,7 +94,7 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c)
|
||||
c->options = LOONGARCH_CPU_CPUCFG | LOONGARCH_CPU_CSR |
|
||||
LOONGARCH_CPU_TLB | LOONGARCH_CPU_VINT | LOONGARCH_CPU_WATCH;
|
||||
|
||||
elf_hwcap |= HWCAP_LOONGARCH_CRC32;
|
||||
elf_hwcap = HWCAP_LOONGARCH_CPUCFG | HWCAP_LOONGARCH_CRC32;
|
||||
|
||||
config = read_cpucfg(LOONGARCH_CPUCFG1);
|
||||
if (config & CPUCFG1_UAL) {
|
||||
|
@ -67,14 +67,17 @@ SYM_FUNC_END(except_vec_cex)
|
||||
.macro BUILD_HANDLER exception handler prep
|
||||
.align 5
|
||||
SYM_FUNC_START(handle_\exception)
|
||||
666:
|
||||
BACKUP_T0T1
|
||||
SAVE_ALL
|
||||
build_prep_\prep
|
||||
move a0, sp
|
||||
la.abs t0, do_\handler
|
||||
jirl ra, t0, 0
|
||||
668:
|
||||
RESTORE_ALL_AND_RET
|
||||
SYM_FUNC_END(handle_\exception)
|
||||
SYM_DATA(unwind_hint_\exception, .word 668b - 666b)
|
||||
.endm
|
||||
|
||||
BUILD_HANDLER ade ade badv
|
||||
|
@ -58,7 +58,6 @@ u32 larch_insn_gen_nop(void)
|
||||
u32 larch_insn_gen_b(unsigned long pc, unsigned long dest)
|
||||
{
|
||||
long offset = dest - pc;
|
||||
unsigned int immediate_l, immediate_h;
|
||||
union loongarch_instruction insn;
|
||||
|
||||
if ((offset & 3) || offset < -SZ_128M || offset >= SZ_128M) {
|
||||
@ -66,15 +65,7 @@ u32 larch_insn_gen_b(unsigned long pc, unsigned long dest)
|
||||
return INSN_BREAK;
|
||||
}
|
||||
|
||||
offset >>= 2;
|
||||
|
||||
immediate_l = offset & 0xffff;
|
||||
offset >>= 16;
|
||||
immediate_h = offset & 0x3ff;
|
||||
|
||||
insn.reg0i26_format.opcode = b_op;
|
||||
insn.reg0i26_format.immediate_l = immediate_l;
|
||||
insn.reg0i26_format.immediate_h = immediate_h;
|
||||
emit_b(&insn, offset >> 2);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
@ -82,7 +73,6 @@ u32 larch_insn_gen_b(unsigned long pc, unsigned long dest)
|
||||
u32 larch_insn_gen_bl(unsigned long pc, unsigned long dest)
|
||||
{
|
||||
long offset = dest - pc;
|
||||
unsigned int immediate_l, immediate_h;
|
||||
union loongarch_instruction insn;
|
||||
|
||||
if ((offset & 3) || offset < -SZ_128M || offset >= SZ_128M) {
|
||||
@ -90,15 +80,7 @@ u32 larch_insn_gen_bl(unsigned long pc, unsigned long dest)
|
||||
return INSN_BREAK;
|
||||
}
|
||||
|
||||
offset >>= 2;
|
||||
|
||||
immediate_l = offset & 0xffff;
|
||||
offset >>= 16;
|
||||
immediate_h = offset & 0x3ff;
|
||||
|
||||
insn.reg0i26_format.opcode = bl_op;
|
||||
insn.reg0i26_format.immediate_l = immediate_l;
|
||||
insn.reg0i26_format.immediate_h = immediate_h;
|
||||
emit_bl(&insn, offset >> 2);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
@ -107,10 +89,7 @@ u32 larch_insn_gen_or(enum loongarch_gpr rd, enum loongarch_gpr rj, enum loongar
|
||||
{
|
||||
union loongarch_instruction insn;
|
||||
|
||||
insn.reg3_format.opcode = or_op;
|
||||
insn.reg3_format.rd = rd;
|
||||
insn.reg3_format.rj = rj;
|
||||
insn.reg3_format.rk = rk;
|
||||
emit_or(&insn, rd, rj, rk);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
@ -124,9 +103,7 @@ u32 larch_insn_gen_lu12iw(enum loongarch_gpr rd, int imm)
|
||||
{
|
||||
union loongarch_instruction insn;
|
||||
|
||||
insn.reg1i20_format.opcode = lu12iw_op;
|
||||
insn.reg1i20_format.rd = rd;
|
||||
insn.reg1i20_format.immediate = imm;
|
||||
emit_lu12iw(&insn, rd, imm);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
@ -135,9 +112,7 @@ u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm)
|
||||
{
|
||||
union loongarch_instruction insn;
|
||||
|
||||
insn.reg1i20_format.opcode = lu32id_op;
|
||||
insn.reg1i20_format.rd = rd;
|
||||
insn.reg1i20_format.immediate = imm;
|
||||
emit_lu32id(&insn, rd, imm);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
@ -146,10 +121,7 @@ u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm)
|
||||
{
|
||||
union loongarch_instruction insn;
|
||||
|
||||
insn.reg2i12_format.opcode = lu52id_op;
|
||||
insn.reg2i12_format.rd = rd;
|
||||
insn.reg2i12_format.rj = rj;
|
||||
insn.reg2i12_format.immediate = imm;
|
||||
emit_lu52id(&insn, rd, rj, imm);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
@ -158,10 +130,7 @@ u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned l
|
||||
{
|
||||
union loongarch_instruction insn;
|
||||
|
||||
insn.reg2i16_format.opcode = jirl_op;
|
||||
insn.reg2i16_format.rd = rd;
|
||||
insn.reg2i16_format.rj = rj;
|
||||
insn.reg2i16_format.immediate = (dest - pc) >> 2;
|
||||
emit_jirl(&insn, rj, rd, (dest - pc) >> 2);
|
||||
|
||||
return insn.word;
|
||||
}
|
||||
|
@ -191,20 +191,14 @@ out:
|
||||
|
||||
unsigned long __get_wchan(struct task_struct *task)
|
||||
{
|
||||
unsigned long pc;
|
||||
unsigned long pc = 0;
|
||||
struct unwind_state state;
|
||||
|
||||
if (!try_get_task_stack(task))
|
||||
return 0;
|
||||
|
||||
unwind_start(&state, task, NULL);
|
||||
state.sp = thread_saved_fp(task);
|
||||
get_stack_info(state.sp, state.task, &state.stack_info);
|
||||
state.pc = thread_saved_ra(task);
|
||||
#ifdef CONFIG_UNWINDER_PROLOGUE
|
||||
state.type = UNWINDER_PROLOGUE;
|
||||
#endif
|
||||
for (; !unwind_done(&state); unwind_next_frame(&state)) {
|
||||
for (unwind_start(&state, task, NULL);
|
||||
!unwind_done(&state); unwind_next_frame(&state)) {
|
||||
pc = unwind_get_return_address(&state);
|
||||
if (!pc)
|
||||
break;
|
||||
|
@ -72,9 +72,6 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs,
|
||||
if (!task)
|
||||
task = current;
|
||||
|
||||
if (user_mode(regs))
|
||||
state.type = UNWINDER_GUESS;
|
||||
|
||||
printk("%sCall Trace:", loglvl);
|
||||
for (unwind_start(&state, task, pregs);
|
||||
!unwind_done(&state); unwind_next_frame(&state)) {
|
||||
|
32
arch/loongarch/kernel/unwind.c
Normal file
32
arch/loongarch/kernel/unwind.c
Normal file
@ -0,0 +1,32 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2022-2023 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ftrace.h>
|
||||
|
||||
#include <asm/unwind.h>
|
||||
|
||||
bool default_next_frame(struct unwind_state *state)
|
||||
{
|
||||
struct stack_info *info = &state->stack_info;
|
||||
unsigned long addr;
|
||||
|
||||
if (unwind_done(state))
|
||||
return false;
|
||||
|
||||
do {
|
||||
for (state->sp += sizeof(unsigned long);
|
||||
state->sp < info->end; state->sp += sizeof(unsigned long)) {
|
||||
addr = *(unsigned long *)(state->sp);
|
||||
state->pc = unwind_graph_addr(state, addr, state->sp + 8);
|
||||
if (__kernel_text_address(state->pc))
|
||||
return true;
|
||||
}
|
||||
|
||||
state->sp = info->next_sp;
|
||||
|
||||
} while (!get_stack_info(state->sp, state->task, info));
|
||||
|
||||
return false;
|
||||
}
|
@ -2,37 +2,18 @@
|
||||
/*
|
||||
* Copyright (C) 2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ftrace.h>
|
||||
|
||||
#include <asm/unwind.h>
|
||||
|
||||
unsigned long unwind_get_return_address(struct unwind_state *state)
|
||||
{
|
||||
if (unwind_done(state))
|
||||
return 0;
|
||||
else if (state->first)
|
||||
return state->pc;
|
||||
|
||||
return *(unsigned long *)(state->sp);
|
||||
return __unwind_get_return_address(state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_get_return_address);
|
||||
|
||||
void unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
memset(state, 0, sizeof(*state));
|
||||
|
||||
if (regs) {
|
||||
state->sp = regs->regs[3];
|
||||
state->pc = regs->csr_era;
|
||||
}
|
||||
|
||||
state->task = task;
|
||||
state->first = true;
|
||||
|
||||
get_stack_info(state->sp, state->task, &state->stack_info);
|
||||
|
||||
__unwind_start(state, task, regs);
|
||||
if (!unwind_done(state) && !__kernel_text_address(state->pc))
|
||||
unwind_next_frame(state);
|
||||
}
|
||||
@ -40,30 +21,6 @@ EXPORT_SYMBOL_GPL(unwind_start);
|
||||
|
||||
bool unwind_next_frame(struct unwind_state *state)
|
||||
{
|
||||
struct stack_info *info = &state->stack_info;
|
||||
unsigned long addr;
|
||||
|
||||
if (unwind_done(state))
|
||||
return false;
|
||||
|
||||
if (state->first)
|
||||
state->first = false;
|
||||
|
||||
do {
|
||||
for (state->sp += sizeof(unsigned long);
|
||||
state->sp < info->end;
|
||||
state->sp += sizeof(unsigned long)) {
|
||||
addr = *(unsigned long *)(state->sp);
|
||||
state->pc = ftrace_graph_ret_addr(state->task, &state->graph_idx,
|
||||
addr, (unsigned long *)(state->sp - GRAPH_FAKE_OFFSET));
|
||||
if (__kernel_text_address(addr))
|
||||
return true;
|
||||
}
|
||||
|
||||
state->sp = info->next_sp;
|
||||
|
||||
} while (!get_stack_info(state->sp, state->task, info));
|
||||
|
||||
return false;
|
||||
return default_next_frame(state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_next_frame);
|
||||
|
@ -2,61 +2,116 @@
|
||||
/*
|
||||
* Copyright (C) 2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
#include <asm/inst.h>
|
||||
#include <asm/loongson.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/unwind.h>
|
||||
|
||||
static inline void unwind_state_fixup(struct unwind_state *state)
|
||||
extern const int unwind_hint_ade;
|
||||
extern const int unwind_hint_ale;
|
||||
extern const int unwind_hint_bp;
|
||||
extern const int unwind_hint_fpe;
|
||||
extern const int unwind_hint_fpu;
|
||||
extern const int unwind_hint_lsx;
|
||||
extern const int unwind_hint_lasx;
|
||||
extern const int unwind_hint_lbt;
|
||||
extern const int unwind_hint_ri;
|
||||
extern const int unwind_hint_watch;
|
||||
extern unsigned long eentry;
|
||||
#ifdef CONFIG_NUMA
|
||||
extern unsigned long pcpu_handlers[NR_CPUS];
|
||||
#endif
|
||||
|
||||
static inline bool scan_handlers(unsigned long entry_offset)
|
||||
{
|
||||
int idx, offset;
|
||||
|
||||
if (entry_offset >= EXCCODE_INT_START * VECSIZE)
|
||||
return false;
|
||||
|
||||
idx = entry_offset / VECSIZE;
|
||||
offset = entry_offset % VECSIZE;
|
||||
switch (idx) {
|
||||
case EXCCODE_ADE:
|
||||
return offset == unwind_hint_ade;
|
||||
case EXCCODE_ALE:
|
||||
return offset == unwind_hint_ale;
|
||||
case EXCCODE_BP:
|
||||
return offset == unwind_hint_bp;
|
||||
case EXCCODE_FPE:
|
||||
return offset == unwind_hint_fpe;
|
||||
case EXCCODE_FPDIS:
|
||||
return offset == unwind_hint_fpu;
|
||||
case EXCCODE_LSXDIS:
|
||||
return offset == unwind_hint_lsx;
|
||||
case EXCCODE_LASXDIS:
|
||||
return offset == unwind_hint_lasx;
|
||||
case EXCCODE_BTDIS:
|
||||
return offset == unwind_hint_lbt;
|
||||
case EXCCODE_INE:
|
||||
return offset == unwind_hint_ri;
|
||||
case EXCCODE_WATCH:
|
||||
return offset == unwind_hint_watch;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool fix_exception(unsigned long pc)
|
||||
{
|
||||
#ifdef CONFIG_NUMA
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
if (!pcpu_handlers[cpu])
|
||||
continue;
|
||||
if (scan_handlers(pc - pcpu_handlers[cpu]))
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
return scan_handlers(pc - eentry);
|
||||
}
|
||||
|
||||
/*
|
||||
* As we meet ftrace_regs_entry, reset first flag like first doing
|
||||
* tracing. Prologue analysis will stop soon because PC is at entry.
|
||||
*/
|
||||
static inline bool fix_ftrace(unsigned long pc)
|
||||
{
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
static unsigned long ftrace = (unsigned long)ftrace_call + 4;
|
||||
|
||||
if (state->pc == ftrace)
|
||||
state->is_ftrace = true;
|
||||
return pc == (unsigned long)ftrace_call + LOONGARCH_INSN_SIZE;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned long unwind_get_return_address(struct unwind_state *state)
|
||||
static inline bool unwind_state_fixup(struct unwind_state *state)
|
||||
{
|
||||
if (!fix_exception(state->pc) && !fix_ftrace(state->pc))
|
||||
return false;
|
||||
|
||||
if (unwind_done(state))
|
||||
return 0;
|
||||
else if (state->type)
|
||||
return state->pc;
|
||||
else if (state->first)
|
||||
return state->pc;
|
||||
|
||||
return *(unsigned long *)(state->sp);
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_get_return_address);
|
||||
|
||||
static bool unwind_by_guess(struct unwind_state *state)
|
||||
{
|
||||
struct stack_info *info = &state->stack_info;
|
||||
unsigned long addr;
|
||||
|
||||
for (state->sp += sizeof(unsigned long);
|
||||
state->sp < info->end;
|
||||
state->sp += sizeof(unsigned long)) {
|
||||
addr = *(unsigned long *)(state->sp);
|
||||
state->pc = ftrace_graph_ret_addr(state->task, &state->graph_idx,
|
||||
addr, (unsigned long *)(state->sp - GRAPH_FAKE_OFFSET));
|
||||
if (__kernel_text_address(addr))
|
||||
state->reset = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* LoongArch function prologue is like follows,
|
||||
* [instructions not use stack var]
|
||||
* addi.d sp, sp, -imm
|
||||
* st.d xx, sp, offset <- save callee saved regs and
|
||||
* st.d yy, sp, offset save ra if function is nest.
|
||||
* [others instructions]
|
||||
*/
|
||||
static bool unwind_by_prologue(struct unwind_state *state)
|
||||
{
|
||||
long frame_ra = -1;
|
||||
unsigned long frame_size = 0;
|
||||
unsigned long size, offset, pc = state->pc;
|
||||
unsigned long size, offset, pc;
|
||||
struct pt_regs *regs;
|
||||
struct stack_info *info = &state->stack_info;
|
||||
union loongarch_instruction *ip, *ip_end;
|
||||
@ -64,20 +119,21 @@ static bool unwind_by_prologue(struct unwind_state *state)
|
||||
if (state->sp >= info->end || state->sp < info->begin)
|
||||
return false;
|
||||
|
||||
if (state->is_ftrace) {
|
||||
/*
|
||||
* As we meet ftrace_regs_entry, reset first flag like first doing
|
||||
* tracing. Prologue analysis will stop soon because PC is at entry.
|
||||
*/
|
||||
if (state->reset) {
|
||||
regs = (struct pt_regs *)state->sp;
|
||||
state->first = true;
|
||||
state->is_ftrace = false;
|
||||
state->reset = false;
|
||||
state->pc = regs->csr_era;
|
||||
state->ra = regs->regs[1];
|
||||
state->sp = regs->regs[3];
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* When first is not set, the PC is a return address in the previous frame.
|
||||
* We need to adjust its value in case overflow to the next symbol.
|
||||
*/
|
||||
pc = state->pc - (state->first ? 0 : LOONGARCH_INSN_SIZE);
|
||||
if (!kallsyms_lookup_size_offset(pc, &size, &offset))
|
||||
return false;
|
||||
|
||||
@ -93,6 +149,10 @@ static bool unwind_by_prologue(struct unwind_state *state)
|
||||
ip++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Can't find stack alloc action, PC may be in a leaf function. Only the
|
||||
* first being true is reasonable, otherwise indicate analysis is broken.
|
||||
*/
|
||||
if (!frame_size) {
|
||||
if (state->first)
|
||||
goto first;
|
||||
@ -110,6 +170,7 @@ static bool unwind_by_prologue(struct unwind_state *state)
|
||||
ip++;
|
||||
}
|
||||
|
||||
/* Can't find save $ra action, PC may be in a leaf function, too. */
|
||||
if (frame_ra < 0) {
|
||||
if (state->first) {
|
||||
state->sp = state->sp + frame_size;
|
||||
@ -118,73 +179,34 @@ static bool unwind_by_prologue(struct unwind_state *state)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (state->first)
|
||||
state->first = false;
|
||||
|
||||
state->pc = *(unsigned long *)(state->sp + frame_ra);
|
||||
state->sp = state->sp + frame_size;
|
||||
goto out;
|
||||
|
||||
first:
|
||||
state->first = false;
|
||||
if (state->pc == state->ra)
|
||||
return false;
|
||||
|
||||
state->pc = state->ra;
|
||||
|
||||
out:
|
||||
unwind_state_fixup(state);
|
||||
return !!__kernel_text_address(state->pc);
|
||||
state->first = false;
|
||||
return unwind_state_fixup(state) || __kernel_text_address(state->pc);
|
||||
}
|
||||
|
||||
void unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
static bool next_frame(struct unwind_state *state)
|
||||
{
|
||||
memset(state, 0, sizeof(*state));
|
||||
|
||||
if (regs && __kernel_text_address(regs->csr_era)) {
|
||||
state->pc = regs->csr_era;
|
||||
state->sp = regs->regs[3];
|
||||
state->ra = regs->regs[1];
|
||||
state->type = UNWINDER_PROLOGUE;
|
||||
}
|
||||
|
||||
state->task = task;
|
||||
state->first = true;
|
||||
|
||||
get_stack_info(state->sp, state->task, &state->stack_info);
|
||||
|
||||
if (!unwind_done(state) && !__kernel_text_address(state->pc))
|
||||
unwind_next_frame(state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_start);
|
||||
|
||||
bool unwind_next_frame(struct unwind_state *state)
|
||||
{
|
||||
struct stack_info *info = &state->stack_info;
|
||||
struct pt_regs *regs;
|
||||
unsigned long pc;
|
||||
struct pt_regs *regs;
|
||||
struct stack_info *info = &state->stack_info;
|
||||
|
||||
if (unwind_done(state))
|
||||
return false;
|
||||
|
||||
do {
|
||||
switch (state->type) {
|
||||
case UNWINDER_GUESS:
|
||||
state->first = false;
|
||||
if (unwind_by_guess(state))
|
||||
return true;
|
||||
break;
|
||||
|
||||
case UNWINDER_PROLOGUE:
|
||||
if (unwind_by_prologue(state)) {
|
||||
state->pc = ftrace_graph_ret_addr(state->task, &state->graph_idx,
|
||||
state->pc, (unsigned long *)(state->sp - GRAPH_FAKE_OFFSET));
|
||||
state->pc = unwind_graph_addr(state, state->pc, state->sp);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (info->type == STACK_TYPE_IRQ &&
|
||||
info->end == state->sp) {
|
||||
if (info->type == STACK_TYPE_IRQ && info->end == state->sp) {
|
||||
regs = (struct pt_regs *)info->next_sp;
|
||||
pc = regs->csr_era;
|
||||
|
||||
@ -192,15 +214,13 @@ bool unwind_next_frame(struct unwind_state *state)
|
||||
return false;
|
||||
|
||||
state->first = true;
|
||||
state->pc = pc;
|
||||
state->ra = regs->regs[1];
|
||||
state->sp = regs->regs[3];
|
||||
state->pc = ftrace_graph_ret_addr(state->task, &state->graph_idx,
|
||||
pc, (unsigned long *)(state->sp - GRAPH_FAKE_OFFSET));
|
||||
get_stack_info(state->sp, state->task, info);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
state->sp = info->next_sp;
|
||||
|
||||
@ -208,4 +228,36 @@ bool unwind_next_frame(struct unwind_state *state)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned long unwind_get_return_address(struct unwind_state *state)
|
||||
{
|
||||
return __unwind_get_return_address(state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_get_return_address);
|
||||
|
||||
void unwind_start(struct unwind_state *state, struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
__unwind_start(state, task, regs);
|
||||
state->type = UNWINDER_PROLOGUE;
|
||||
state->first = true;
|
||||
|
||||
/*
|
||||
* The current PC is not kernel text address, we cannot find its
|
||||
* relative symbol. Thus, prologue analysis will be broken. Luckily,
|
||||
* we can use the default_next_frame().
|
||||
*/
|
||||
if (!__kernel_text_address(state->pc)) {
|
||||
state->type = UNWINDER_GUESS;
|
||||
if (!unwind_done(state))
|
||||
unwind_next_frame(state);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_start);
|
||||
|
||||
bool unwind_next_frame(struct unwind_state *state)
|
||||
{
|
||||
return state->type == UNWINDER_PROLOGUE ?
|
||||
next_frame(state) : default_next_frame(state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unwind_next_frame);
|
||||
|
@ -251,7 +251,7 @@ static void output_pgtable_bits_defines(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
static unsigned long pcpu_handlers[NR_CPUS];
|
||||
unsigned long pcpu_handlers[NR_CPUS];
|
||||
#endif
|
||||
extern long exception_handlers[VECSIZE * 128 / sizeof(long)];
|
||||
|
||||
|
@ -328,7 +328,7 @@
|
||||
bus-range = <0x0 0xff>;
|
||||
ranges = <0x81000000 0x0 0x60080000 0x0 0x60080000 0x0 0x10000>, /* I/O */
|
||||
<0x82000000 0x0 0x60090000 0x0 0x60090000 0x0 0xff70000>, /* mem */
|
||||
<0x82000000 0x0 0x70000000 0x0 0x70000000 0x0 0x1000000>, /* mem */
|
||||
<0x82000000 0x0 0x70000000 0x0 0x70000000 0x0 0x10000000>, /* mem */
|
||||
<0xc3000000 0x20 0x00000000 0x20 0x00000000 0x20 0x00000000>; /* mem prefetchable */
|
||||
num-lanes = <0x8>;
|
||||
interrupts = <56>, <57>, <58>, <59>, <60>, <61>, <62>, <63>, <64>;
|
||||
|
@ -508,6 +508,7 @@ static void __init setup_lowcore_dat_on(void)
|
||||
{
|
||||
struct lowcore *abs_lc;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
__ctl_clear_bit(0, 28);
|
||||
S390_lowcore.external_new_psw.mask |= PSW_MASK_DAT;
|
||||
@ -523,8 +524,8 @@ static void __init setup_lowcore_dat_on(void)
|
||||
abs_lc = get_abs_lowcore(&flags);
|
||||
abs_lc->restart_flags = RESTART_FLAG_CTLREGS;
|
||||
abs_lc->program_new_psw = S390_lowcore.program_new_psw;
|
||||
memcpy(abs_lc->cregs_save_area, S390_lowcore.cregs_save_area,
|
||||
sizeof(abs_lc->cregs_save_area));
|
||||
for (i = 0; i < 16; i++)
|
||||
abs_lc->cregs_save_area[i] = S390_lowcore.cregs_save_area[i];
|
||||
put_abs_lowcore(abs_lc, flags);
|
||||
}
|
||||
|
||||
|
@ -316,14 +316,12 @@ struct bfq_group *bfqq_group(struct bfq_queue *bfqq)
|
||||
|
||||
static void bfqg_get(struct bfq_group *bfqg)
|
||||
{
|
||||
bfqg->ref++;
|
||||
refcount_inc(&bfqg->ref);
|
||||
}
|
||||
|
||||
static void bfqg_put(struct bfq_group *bfqg)
|
||||
{
|
||||
bfqg->ref--;
|
||||
|
||||
if (bfqg->ref == 0)
|
||||
if (refcount_dec_and_test(&bfqg->ref))
|
||||
kfree(bfqg);
|
||||
}
|
||||
|
||||
@ -530,7 +528,7 @@ static struct blkg_policy_data *bfq_pd_alloc(gfp_t gfp, struct request_queue *q,
|
||||
}
|
||||
|
||||
/* see comments in bfq_bic_update_cgroup for why refcounting */
|
||||
bfqg_get(bfqg);
|
||||
refcount_set(&bfqg->ref, 1);
|
||||
return &bfqg->pd;
|
||||
}
|
||||
|
||||
|
@ -928,7 +928,7 @@ struct bfq_group {
|
||||
char blkg_path[128];
|
||||
|
||||
/* reference counter (see comments in bfq_bic_update_cgroup) */
|
||||
int ref;
|
||||
refcount_t ref;
|
||||
/* Is bfq_group still online? */
|
||||
bool online;
|
||||
|
||||
|
@ -1455,6 +1455,10 @@ retry:
|
||||
list_for_each_entry_reverse(blkg, &q->blkg_list, q_node)
|
||||
pol->pd_init_fn(blkg->pd[pol->plid]);
|
||||
|
||||
if (pol->pd_online_fn)
|
||||
list_for_each_entry_reverse(blkg, &q->blkg_list, q_node)
|
||||
pol->pd_online_fn(blkg->pd[pol->plid]);
|
||||
|
||||
__set_bit(pol->plid, q->blkcg_pols);
|
||||
ret = 0;
|
||||
|
||||
|
@ -2890,6 +2890,7 @@ static inline struct request *blk_mq_get_cached_request(struct request_queue *q,
|
||||
struct blk_plug *plug, struct bio **bio, unsigned int nsegs)
|
||||
{
|
||||
struct request *rq;
|
||||
enum hctx_type type, hctx_type;
|
||||
|
||||
if (!plug)
|
||||
return NULL;
|
||||
@ -2902,7 +2903,10 @@ static inline struct request *blk_mq_get_cached_request(struct request_queue *q,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (blk_mq_get_hctx_type((*bio)->bi_opf) != rq->mq_hctx->type)
|
||||
type = blk_mq_get_hctx_type((*bio)->bi_opf);
|
||||
hctx_type = rq->mq_hctx->type;
|
||||
if (type != hctx_type &&
|
||||
!(type == HCTX_TYPE_READ && hctx_type == HCTX_TYPE_DEFAULT))
|
||||
return NULL;
|
||||
if (op_is_flush(rq->cmd_flags) != op_is_flush((*bio)->bi_opf))
|
||||
return NULL;
|
||||
|
@ -354,6 +354,9 @@ void spk_ttyio_release(struct spk_synth *in_synth)
|
||||
{
|
||||
struct tty_struct *tty = in_synth->dev;
|
||||
|
||||
if (tty == NULL)
|
||||
return;
|
||||
|
||||
tty_lock(tty);
|
||||
|
||||
if (tty->ops->close)
|
||||
|
@ -236,6 +236,11 @@ static acpi_status acpi_platformrt_space_handler(u32 function,
|
||||
efi_status_t status;
|
||||
struct prm_context_buffer context;
|
||||
|
||||
if (!efi_enabled(EFI_RUNTIME_SERVICES)) {
|
||||
pr_err_ratelimited("PRM: EFI runtime services no longer available\n");
|
||||
return AE_NO_HANDLER;
|
||||
}
|
||||
|
||||
/*
|
||||
* The returned acpi_status will always be AE_OK. Error values will be
|
||||
* saved in the first byte of the PRM message buffer to be used by ASL.
|
||||
@ -325,6 +330,11 @@ void __init init_prmt(void)
|
||||
|
||||
pr_info("PRM: found %u modules\n", mc);
|
||||
|
||||
if (!efi_enabled(EFI_RUNTIME_SERVICES)) {
|
||||
pr_err("PRM: EFI runtime services unavailable\n");
|
||||
return;
|
||||
}
|
||||
|
||||
status = acpi_install_address_space_handler(ACPI_ROOT_OBJECT,
|
||||
ACPI_ADR_SPACE_PLATFORM_RT,
|
||||
&acpi_platformrt_space_handler,
|
||||
|
@ -515,6 +515,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
/* Acer Aspire 4810T */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 4810T"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
/* Acer Aspire 5738z */
|
||||
|
@ -997,26 +997,32 @@ struct fwnode_handle *
|
||||
fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
|
||||
struct fwnode_handle *prev)
|
||||
{
|
||||
struct fwnode_handle *ep, *port_parent = NULL;
|
||||
const struct fwnode_handle *parent;
|
||||
struct fwnode_handle *ep;
|
||||
|
||||
/*
|
||||
* If this function is in a loop and the previous iteration returned
|
||||
* an endpoint from fwnode->secondary, then we need to use the secondary
|
||||
* as parent rather than @fwnode.
|
||||
*/
|
||||
if (prev)
|
||||
parent = fwnode_graph_get_port_parent(prev);
|
||||
else
|
||||
if (prev) {
|
||||
port_parent = fwnode_graph_get_port_parent(prev);
|
||||
parent = port_parent;
|
||||
} else {
|
||||
parent = fwnode;
|
||||
}
|
||||
if (IS_ERR_OR_NULL(parent))
|
||||
return NULL;
|
||||
|
||||
ep = fwnode_call_ptr_op(parent, graph_get_next_endpoint, prev);
|
||||
if (ep)
|
||||
return ep;
|
||||
goto out_put_port_parent;
|
||||
|
||||
return fwnode_graph_get_next_endpoint(parent->secondary, NULL);
|
||||
ep = fwnode_graph_get_next_endpoint(parent->secondary, NULL);
|
||||
|
||||
out_put_port_parent:
|
||||
fwnode_handle_put(port_parent);
|
||||
return ep;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
|
||||
|
||||
|
@ -145,7 +145,7 @@ static int __init test_async_probe_init(void)
|
||||
calltime = ktime_get();
|
||||
for_each_online_cpu(cpu) {
|
||||
nid = cpu_to_node(cpu);
|
||||
pdev = &sync_dev[sync_id];
|
||||
pdev = &async_dev[async_id];
|
||||
|
||||
*pdev = test_platform_device_register_node("test_async_driver",
|
||||
async_id,
|
||||
|
@ -2400,6 +2400,8 @@ static void pkt_submit_bio(struct bio *bio)
|
||||
struct bio *split;
|
||||
|
||||
bio = bio_split_to_limits(bio);
|
||||
if (!bio)
|
||||
return;
|
||||
|
||||
pkt_dbg(2, pd, "start = %6llx stop = %6llx\n",
|
||||
(unsigned long long)bio->bi_iter.bi_sector,
|
||||
|
@ -1440,7 +1440,7 @@ static struct rnbd_clt_dev *init_dev(struct rnbd_clt_session *sess,
|
||||
goto out_alloc;
|
||||
}
|
||||
|
||||
ret = ida_alloc_max(&index_ida, 1 << (MINORBITS - RNBD_PART_BITS),
|
||||
ret = ida_alloc_max(&index_ida, (1 << (MINORBITS - RNBD_PART_BITS)) - 1,
|
||||
GFP_KERNEL);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to initialize device '%s' from session %s, allocating idr failed, err: %d\n",
|
||||
|
@ -2164,10 +2164,17 @@ static void qca_serdev_shutdown(struct device *dev)
|
||||
int timeout = msecs_to_jiffies(CMD_TRANS_TIMEOUT_MS);
|
||||
struct serdev_device *serdev = to_serdev_device(dev);
|
||||
struct qca_serdev *qcadev = serdev_device_get_drvdata(serdev);
|
||||
struct hci_uart *hu = &qcadev->serdev_hu;
|
||||
struct hci_dev *hdev = hu->hdev;
|
||||
struct qca_data *qca = hu->priv;
|
||||
const u8 ibs_wake_cmd[] = { 0xFD };
|
||||
const u8 edl_reset_soc_cmd[] = { 0x01, 0x00, 0xFC, 0x01, 0x05 };
|
||||
|
||||
if (qcadev->btsoc_type == QCA_QCA6390) {
|
||||
if (test_bit(QCA_BT_OFF, &qca->flags) ||
|
||||
!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return;
|
||||
|
||||
serdev_device_write_flush(serdev);
|
||||
ret = serdev_device_write_buf(serdev, ibs_wake_cmd,
|
||||
sizeof(ibs_wake_cmd));
|
||||
|
@ -58,7 +58,7 @@
|
||||
#define PCI1760_CMD_CLR_IMB2 0x00 /* Clears IMB2 */
|
||||
#define PCI1760_CMD_SET_DO 0x01 /* Set output state */
|
||||
#define PCI1760_CMD_GET_DO 0x02 /* Read output status */
|
||||
#define PCI1760_CMD_GET_STATUS 0x03 /* Read current status */
|
||||
#define PCI1760_CMD_GET_STATUS 0x07 /* Read current status */
|
||||
#define PCI1760_CMD_GET_FW_VER 0x0e /* Read firmware version */
|
||||
#define PCI1760_CMD_GET_HW_VER 0x0f /* Read hardware version */
|
||||
#define PCI1760_CMD_SET_PWM_HI(x) (0x10 + (x) * 2) /* Set "hi" period */
|
||||
|
@ -451,7 +451,8 @@ static int dma_chan_get(struct dma_chan *chan)
|
||||
/* The channel is already in use, update client count */
|
||||
if (chan->client_count) {
|
||||
__module_get(owner);
|
||||
goto out;
|
||||
chan->client_count++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!try_module_get(owner))
|
||||
@ -470,11 +471,11 @@ static int dma_chan_get(struct dma_chan *chan)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
chan->client_count++;
|
||||
|
||||
if (!dma_has_cap(DMA_PRIVATE, chan->device->cap_mask))
|
||||
balance_ref_count(chan);
|
||||
|
||||
out:
|
||||
chan->client_count++;
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user