mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR (net-6.14-rc8). Conflict: tools/testing/selftests/net/Makefile 03544faad761 ("selftest: net: add proc_net_pktgen") 3ed61b8938c6 ("selftests: net: test for lwtunnel dst ref loops") tools/testing/selftests/net/config: 85cb3711acb8 ("selftests: net: Add test cases for link and peer netns") 3ed61b8938c6 ("selftests: net: test for lwtunnel dst ref loops") Adjacent commits: tools/testing/selftests/net/Makefile c935af429ec2 ("selftests: net: add support for testing SO_RCVMARK and SO_RCVPRIORITY") 355d940f4d5a ("Revert "selftests: Add IPv6 link-local address generation tests for GRE devices."") Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
f491593394
1
.mailmap
1
.mailmap
@ -281,6 +281,7 @@ Henrik Rydberg <rydberg@bitmath.org>
|
||||
Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Huacai Chen <chenhuacai@kernel.org> <chenhc@lemote.com>
|
||||
Huacai Chen <chenhuacai@kernel.org> <chenhuacai@loongson.cn>
|
||||
Ike Panhc <ikepanhc@gmail.com> <ike.pan@canonical.com>
|
||||
J. Bruce Fields <bfields@fieldses.org> <bfields@redhat.com>
|
||||
J. Bruce Fields <bfields@fieldses.org> <bfields@citi.umich.edu>
|
||||
Jacob Shin <Jacob.Shin@amd.com>
|
||||
|
@ -19,6 +19,7 @@ properties:
|
||||
- imagis,ist3038
|
||||
- imagis,ist3038b
|
||||
- imagis,ist3038c
|
||||
- imagis,ist3038h
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
@ -170,7 +170,7 @@ allOf:
|
||||
const: renesas,r8a779h0-canfd
|
||||
then:
|
||||
patternProperties:
|
||||
"^channel[5-7]$": false
|
||||
"^channel[4-7]$": false
|
||||
else:
|
||||
if:
|
||||
not:
|
||||
|
@ -145,7 +145,7 @@ Rust standard library source
|
||||
****************************
|
||||
|
||||
The Rust standard library source is required because the build system will
|
||||
cross-compile ``core`` and ``alloc``.
|
||||
cross-compile ``core``.
|
||||
|
||||
If ``rustup`` is being used, run::
|
||||
|
||||
|
@ -97,7 +97,7 @@ operator are also supported as usual, e.g.:
|
||||
|
||||
/// ```
|
||||
/// # use kernel::{spawn_work_item, workqueue};
|
||||
/// spawn_work_item!(workqueue::system(), || pr_info!("x"))?;
|
||||
/// spawn_work_item!(workqueue::system(), || pr_info!("x\n"))?;
|
||||
/// # Ok::<(), Error>(())
|
||||
/// ```
|
||||
|
||||
|
24
MAINTAINERS
24
MAINTAINERS
@ -2213,6 +2213,7 @@ ARM/APPLE MACHINE SUPPORT
|
||||
M: Sven Peter <sven@svenpeter.dev>
|
||||
M: Janne Grunau <j@jannau.net>
|
||||
R: Alyssa Rosenzweig <alyssa@rosenzweig.io>
|
||||
R: Neal Gompa <neal@gompa.dev>
|
||||
L: asahi@lists.linux.dev
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
@ -2237,6 +2238,7 @@ F: Documentation/devicetree/bindings/pci/apple,pcie.yaml
|
||||
F: Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml
|
||||
F: Documentation/devicetree/bindings/power/apple*
|
||||
F: Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml
|
||||
F: Documentation/devicetree/bindings/spi/apple,spi.yaml
|
||||
F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml
|
||||
F: arch/arm64/boot/dts/apple/
|
||||
F: drivers/bluetooth/hci_bcm4377.c
|
||||
@ -2254,6 +2256,7 @@ F: drivers/nvmem/apple-efuses.c
|
||||
F: drivers/pinctrl/pinctrl-apple-gpio.c
|
||||
F: drivers/pwm/pwm-apple.c
|
||||
F: drivers/soc/apple/*
|
||||
F: drivers/spi/spi-apple.c
|
||||
F: drivers/watchdog/apple_wdt.c
|
||||
F: include/dt-bindings/interrupt-controller/apple-aic.h
|
||||
F: include/dt-bindings/pinctrl/apple.h
|
||||
@ -8644,7 +8647,6 @@ F: rust/kernel/net/phy/reg.rs
|
||||
|
||||
EXEC & BINFMT API, ELF
|
||||
M: Kees Cook <kees@kernel.org>
|
||||
R: Eric Biederman <ebiederm@xmission.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/execve
|
||||
@ -9829,7 +9831,6 @@ S: Maintained
|
||||
F: drivers/media/usb/go7007/
|
||||
|
||||
GOODIX TOUCHSCREEN
|
||||
M: Bastien Nocera <hadess@hadess.net>
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -11141,7 +11142,7 @@ S: Maintained
|
||||
F: drivers/i2c/busses/i2c-icy.c
|
||||
|
||||
IDEAPAD LAPTOP EXTRAS DRIVER
|
||||
M: Ike Panhc <ike.pan@canonical.com>
|
||||
M: Ike Panhc <ikepanhc@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://launchpad.net/ideapad-laptop
|
||||
@ -12826,9 +12827,7 @@ F: fs/kernfs/
|
||||
F: include/linux/kernfs.h
|
||||
|
||||
KEXEC
|
||||
M: Eric Biederman <ebiederm@xmission.com>
|
||||
L: kexec@lists.infradead.org
|
||||
S: Maintained
|
||||
W: http://kernel.org/pub/linux/utils/kernel/kexec/
|
||||
F: include/linux/kexec.h
|
||||
F: include/uapi/linux/kexec.h
|
||||
@ -13754,12 +13753,10 @@ F: drivers/hwmon/ltc4282.c
|
||||
|
||||
LTC4286 HARDWARE MONITOR DRIVER
|
||||
M: Delphine CC Chiu <Delphine_CC_Chiu@Wiwynn.com>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
L: linux-hwmon@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/hwmon/lltc,ltc4286.yaml
|
||||
F: Documentation/hwmon/ltc4286.rst
|
||||
F: drivers/hwmon/pmbus/Kconfig
|
||||
F: drivers/hwmon/pmbus/Makefile
|
||||
F: drivers/hwmon/pmbus/ltc4286.c
|
||||
|
||||
LTC4306 I2C MULTIPLEXER DRIVER
|
||||
@ -16665,6 +16662,17 @@ F: net/mptcp/
|
||||
F: tools/testing/selftests/bpf/*/*mptcp*.[ch]
|
||||
F: tools/testing/selftests/net/mptcp/
|
||||
|
||||
NETWORKING [SRv6]
|
||||
M: Andrea Mayer <andrea.mayer@uniroma2.it>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
|
||||
F: include/linux/seg6*
|
||||
F: include/net/seg6*
|
||||
F: include/uapi/linux/seg6*
|
||||
F: net/ipv6/seg6*
|
||||
F: tools/testing/selftests/net/srv6*
|
||||
|
||||
NETWORKING [TCP]
|
||||
M: Eric Dumazet <edumazet@google.com>
|
||||
M: Neal Cardwell <ncardwell@google.com>
|
||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -1,7 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "bcm2835-rpi.dtsi"
|
||||
|
||||
#include <dt-bindings/power/raspberrypi-power.h>
|
||||
#include <dt-bindings/reset/raspberrypi,firmware-reset.h>
|
||||
|
||||
/ {
|
||||
@ -101,7 +100,3 @@
|
||||
&vchiq {
|
||||
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
&xhci {
|
||||
power-domains = <&power RPI_POWER_DOMAIN_USB>;
|
||||
};
|
||||
|
@ -134,7 +134,7 @@
|
||||
clocks = <&clocks BCM2835_CLOCK_UART>,
|
||||
<&clocks BCM2835_CLOCK_VPU>;
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
arm,primecell-periphid = <0x00241011>;
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -145,7 +145,7 @@
|
||||
clocks = <&clocks BCM2835_CLOCK_UART>,
|
||||
<&clocks BCM2835_CLOCK_VPU>;
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
arm,primecell-periphid = <0x00241011>;
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -156,7 +156,7 @@
|
||||
clocks = <&clocks BCM2835_CLOCK_UART>,
|
||||
<&clocks BCM2835_CLOCK_VPU>;
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
arm,primecell-periphid = <0x00241011>;
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -167,7 +167,7 @@
|
||||
clocks = <&clocks BCM2835_CLOCK_UART>,
|
||||
<&clocks BCM2835_CLOCK_VPU>;
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
arm,primecell-periphid = <0x00241011>;
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -451,8 +451,6 @@
|
||||
IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) |
|
||||
IRQ_TYPE_LEVEL_LOW)>;
|
||||
/* This only applies to the ARMv7 stub */
|
||||
arm,cpu-registers-not-fw-configured;
|
||||
};
|
||||
|
||||
cpus: cpus {
|
||||
@ -610,6 +608,7 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&pm BCM2835_POWER_DOMAIN_USB>;
|
||||
/* DWC2 and this IP block share the same USB PHY,
|
||||
* enabling both at the same time results in lockups.
|
||||
* So keep this node disabled and let the bootloader
|
||||
@ -1177,6 +1176,7 @@
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
|
@ -124,19 +124,19 @@
|
||||
};
|
||||
|
||||
port@1 {
|
||||
label = "lan1";
|
||||
label = "lan4";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
label = "lan2";
|
||||
};
|
||||
|
||||
port@4 {
|
||||
label = "lan4";
|
||||
label = "lan1";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -126,11 +126,11 @@
|
||||
|
||||
ports {
|
||||
port@0 {
|
||||
label = "lan4";
|
||||
label = "wan";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
label = "lan3";
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
@ -138,11 +138,11 @@
|
||||
};
|
||||
|
||||
port@3 {
|
||||
label = "lan1";
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@4 {
|
||||
label = "wan";
|
||||
label = "lan4";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -108,6 +108,11 @@
|
||||
};
|
||||
};
|
||||
|
||||
poweroff {
|
||||
compatible = "regulator-poweroff";
|
||||
cpu-supply = <&vgen2_reg>;
|
||||
};
|
||||
|
||||
reg_module_3v3: regulator-module-3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-always-on;
|
||||
@ -236,10 +241,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&clks {
|
||||
fsl,pmic-stby-poweroff;
|
||||
};
|
||||
|
||||
/* Apalis SPI1 */
|
||||
&ecspi1 {
|
||||
cs-gpios = <&gpio5 25 GPIO_ACTIVE_LOW>;
|
||||
@ -527,7 +528,6 @@
|
||||
|
||||
pmic: pmic@8 {
|
||||
compatible = "fsl,pfuze100";
|
||||
fsl,pmic-stby-poweroff;
|
||||
reg = <0x08>;
|
||||
|
||||
regulators {
|
||||
|
@ -27,6 +27,7 @@ config ARCH_DAVINCI_DA830
|
||||
|
||||
config ARCH_DAVINCI_DA850
|
||||
bool "DA850/OMAP-L138/AM18x based system"
|
||||
select ARCH_DAVINCI_DA8XX
|
||||
select DAVINCI_CP_INTC
|
||||
|
||||
config ARCH_DAVINCI_DA8XX
|
||||
|
@ -8,6 +8,7 @@ menuconfig ARCH_OMAP1
|
||||
select ARCH_OMAP
|
||||
select CLKSRC_MMIO
|
||||
select FORCE_PCI if PCCARD
|
||||
select GENERIC_IRQ_CHIP
|
||||
select GPIOLIB
|
||||
help
|
||||
Support for older TI OMAP1 (omap7xx, omap15xx or omap16xx)
|
||||
|
@ -136,6 +136,7 @@ ENDPROC(shmobile_smp_sleep)
|
||||
.long shmobile_smp_arg - 1b
|
||||
|
||||
.bss
|
||||
.align 2
|
||||
.globl shmobile_smp_mpidr
|
||||
shmobile_smp_mpidr:
|
||||
.space NR_CPUS * 4
|
||||
|
@ -227,7 +227,7 @@
|
||||
interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk_uart>, <&clk_vpu>;
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
arm,primecell-periphid = <0x00241011>;
|
||||
arm,primecell-periphid = <0x00341011>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -16,10 +16,10 @@
|
||||
"Headphone Jack", "HPOUTR",
|
||||
"IN2L", "Line In Jack",
|
||||
"IN2R", "Line In Jack",
|
||||
"Headphone Jack", "MICBIAS",
|
||||
"IN1L", "Headphone Jack";
|
||||
"Microphone Jack", "MICBIAS",
|
||||
"IN1L", "Microphone Jack";
|
||||
simple-audio-card,widgets =
|
||||
"Microphone", "Headphone Jack",
|
||||
"Microphone", "Microphone Jack",
|
||||
"Headphone", "Headphone Jack",
|
||||
"Line", "Line In Jack";
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
|
||||
/*
|
||||
* Copyright 2021-2022 TQ-Systems GmbH
|
||||
* Author: Alexander Stein <alexander.stein@tq-group.com>
|
||||
* Copyright 2021-2025 TQ-Systems GmbH <linux@ew.tq-group.com>,
|
||||
* D-82229 Seefeld, Germany.
|
||||
* Author: Alexander Stein
|
||||
*/
|
||||
|
||||
#include "imx8mp.dtsi"
|
||||
@ -23,15 +24,6 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
/* e-MMC IO, needed for HS modes */
|
||||
reg_vcc1v8: regulator-vcc1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "VCC1V8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
|
||||
&A53_0 {
|
||||
@ -197,7 +189,7 @@
|
||||
no-sd;
|
||||
no-sdio;
|
||||
vmmc-supply = <®_vcc3v3>;
|
||||
vqmmc-supply = <®_vcc1v8>;
|
||||
vqmmc-supply = <&buck5_reg>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -28,10 +28,10 @@
|
||||
"Headphone Jack", "HPOUTR",
|
||||
"IN2L", "Line In Jack",
|
||||
"IN2R", "Line In Jack",
|
||||
"Headphone Jack", "MICBIAS",
|
||||
"IN1L", "Headphone Jack";
|
||||
"Microphone Jack", "MICBIAS",
|
||||
"IN1L", "Microphone Jack";
|
||||
simple-audio-card,widgets =
|
||||
"Microphone", "Headphone Jack",
|
||||
"Microphone", "Microphone Jack",
|
||||
"Headphone", "Headphone Jack",
|
||||
"Line", "Line In Jack";
|
||||
|
||||
|
@ -5163,7 +5163,6 @@
|
||||
<GIC_SPI 341 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 343 IRQ_TYPE_LEVEL_HIGH>;
|
||||
dma-coherent;
|
||||
};
|
||||
|
||||
anoc_1_tbu: tbu@150c5000 {
|
||||
|
@ -194,6 +194,13 @@
|
||||
<3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
uart {
|
||||
uart5_rts_pin: uart5-rts-pin {
|
||||
rockchip,pins =
|
||||
<0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pwm0 {
|
||||
@ -222,10 +229,15 @@
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_xfer>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&uart5 {
|
||||
/* Add pinmux for rts-gpios (uart5_rts_pin) */
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart5_xfer &uart5_rts_pin>;
|
||||
rts-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -115,7 +115,7 @@
|
||||
};
|
||||
|
||||
&u2phy1_host {
|
||||
status = "disabled";
|
||||
phy-supply = <&vdd_5v>;
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
|
@ -227,6 +227,16 @@
|
||||
vin-supply = <&vcc12v_dcin>;
|
||||
};
|
||||
|
||||
vcca_0v9: regulator-vcca-0v9 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcca_0v9";
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <900000>;
|
||||
regulator-max-microvolt = <900000>;
|
||||
vin-supply = <&vcc3v3_sys>;
|
||||
};
|
||||
|
||||
vdd_log: regulator-vdd-log {
|
||||
compatible = "pwm-regulator";
|
||||
pwms = <&pwm2 0 25000 1>;
|
||||
@ -312,6 +322,8 @@
|
||||
};
|
||||
|
||||
&hdmi {
|
||||
avdd-0v9-supply = <&vcca_0v9>;
|
||||
avdd-1v8-supply = <&vcc1v8_dvp>;
|
||||
ddc-i2c-bus = <&i2c3>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&hdmi_cec>;
|
||||
@ -661,6 +673,8 @@
|
||||
num-lanes = <4>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie_perst>;
|
||||
vpcie0v9-supply = <&vcca_0v9>;
|
||||
vpcie1v8-supply = <&vcca_1v8>;
|
||||
vpcie12v-supply = <&vcc12v_dcin>;
|
||||
vpcie3v3-supply = <&vcc3v3_pcie>;
|
||||
status = "okay";
|
||||
|
@ -512,7 +512,6 @@
|
||||
|
||||
&sdmmc0 {
|
||||
max-frequency = <150000000>;
|
||||
supports-sd;
|
||||
bus-width = <4>;
|
||||
cap-mmc-highspeed;
|
||||
cap-sd-highspeed;
|
||||
|
@ -503,7 +503,6 @@
|
||||
non-removable;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&emmc_bus8 &emmc_cmd &emmc_clk &emmc_data_strobe>;
|
||||
supports-cqe;
|
||||
vmmc-supply = <&vcc_3v3_s3>;
|
||||
vqmmc-supply = <&vcc_1v8_s3>;
|
||||
status = "okay";
|
||||
|
@ -690,10 +690,9 @@
|
||||
|
||||
&sdhci {
|
||||
bus-width = <8>;
|
||||
max-frequency = <200000000>;
|
||||
max-frequency = <150000000>;
|
||||
mmc-hs400-1_8v;
|
||||
mmc-hs400-enhanced-strobe;
|
||||
mmc-hs200-1_8v;
|
||||
no-sdio;
|
||||
no-sd;
|
||||
non-removable;
|
||||
|
@ -386,7 +386,6 @@
|
||||
non-removable;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&emmc_bus8 &emmc_cmd &emmc_clk &emmc_data_strobe>;
|
||||
supports-cqe;
|
||||
vmmc-supply = <&vcc_3v3_s3>;
|
||||
vqmmc-supply = <&vcc_1v8_s3>;
|
||||
status = "okay";
|
||||
|
@ -396,33 +396,35 @@ static inline void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch)
|
||||
#define __flush_tlb_range_op(op, start, pages, stride, \
|
||||
asid, tlb_level, tlbi_user, lpa2) \
|
||||
do { \
|
||||
typeof(start) __flush_start = start; \
|
||||
typeof(pages) __flush_pages = pages; \
|
||||
int num = 0; \
|
||||
int scale = 3; \
|
||||
int shift = lpa2 ? 16 : PAGE_SHIFT; \
|
||||
unsigned long addr; \
|
||||
\
|
||||
while (pages > 0) { \
|
||||
while (__flush_pages > 0) { \
|
||||
if (!system_supports_tlb_range() || \
|
||||
pages == 1 || \
|
||||
(lpa2 && start != ALIGN(start, SZ_64K))) { \
|
||||
addr = __TLBI_VADDR(start, asid); \
|
||||
__flush_pages == 1 || \
|
||||
(lpa2 && __flush_start != ALIGN(__flush_start, SZ_64K))) { \
|
||||
addr = __TLBI_VADDR(__flush_start, asid); \
|
||||
__tlbi_level(op, addr, tlb_level); \
|
||||
if (tlbi_user) \
|
||||
__tlbi_user_level(op, addr, tlb_level); \
|
||||
start += stride; \
|
||||
pages -= stride >> PAGE_SHIFT; \
|
||||
__flush_start += stride; \
|
||||
__flush_pages -= stride >> PAGE_SHIFT; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
num = __TLBI_RANGE_NUM(pages, scale); \
|
||||
num = __TLBI_RANGE_NUM(__flush_pages, scale); \
|
||||
if (num >= 0) { \
|
||||
addr = __TLBI_VADDR_RANGE(start >> shift, asid, \
|
||||
addr = __TLBI_VADDR_RANGE(__flush_start >> shift, asid, \
|
||||
scale, num, tlb_level); \
|
||||
__tlbi(r##op, addr); \
|
||||
if (tlbi_user) \
|
||||
__tlbi_user(r##op, addr); \
|
||||
start += __TLBI_RANGE_PAGES(num, scale) << PAGE_SHIFT; \
|
||||
pages -= __TLBI_RANGE_PAGES(num, scale); \
|
||||
__flush_start += __TLBI_RANGE_PAGES(num, scale) << PAGE_SHIFT; \
|
||||
__flush_pages -= __TLBI_RANGE_PAGES(num, scale);\
|
||||
} \
|
||||
scale--; \
|
||||
} \
|
||||
|
@ -1177,8 +1177,11 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||
struct vmem_altmap *altmap)
|
||||
{
|
||||
WARN_ON((start < VMEMMAP_START) || (end > VMEMMAP_END));
|
||||
/* [start, end] should be within one section */
|
||||
WARN_ON_ONCE(end - start > PAGES_PER_SECTION * sizeof(struct page));
|
||||
|
||||
if (!IS_ENABLED(CONFIG_ARM64_4K_PAGES))
|
||||
if (!IS_ENABLED(CONFIG_ARM64_4K_PAGES) ||
|
||||
(end - start < PAGES_PER_SECTION * sizeof(struct page)))
|
||||
return vmemmap_populate_basepages(start, end, node, altmap);
|
||||
else
|
||||
return vmemmap_populate_hugepages(start, end, node, altmap);
|
||||
|
@ -89,7 +89,7 @@
|
||||
#define GPOUT_SYS_SDIO1_DATA1 59
|
||||
#define GPOUT_SYS_SDIO1_DATA2 60
|
||||
#define GPOUT_SYS_SDIO1_DATA3 61
|
||||
#define GPOUT_SYS_SDIO1_DATA4 63
|
||||
#define GPOUT_SYS_SDIO1_DATA4 62
|
||||
#define GPOUT_SYS_SDIO1_DATA5 63
|
||||
#define GPOUT_SYS_SDIO1_DATA6 64
|
||||
#define GPOUT_SYS_SDIO1_DATA7 65
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/static_call.h>
|
||||
#include <asm/div64.h>
|
||||
@ -429,6 +430,9 @@ static void __init vmware_platform_setup(void)
|
||||
pr_warn("Failed to get TSC freq from the hypervisor\n");
|
||||
}
|
||||
|
||||
if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP) && !efi_enabled(EFI_BOOT))
|
||||
x86_init.mpparse.find_mptable = mpparse_find_mptable;
|
||||
|
||||
vmware_paravirt_ops_setup();
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
|
@ -2845,6 +2845,10 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
(id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2)
|
||||
dev->quirks |= ATA_QUIRK_NOLPM;
|
||||
|
||||
if (dev->quirks & ATA_QUIRK_NO_LPM_ON_ATI &&
|
||||
ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI))
|
||||
dev->quirks |= ATA_QUIRK_NOLPM;
|
||||
|
||||
if (ap->flags & ATA_FLAG_NO_LPM)
|
||||
dev->quirks |= ATA_QUIRK_NOLPM;
|
||||
|
||||
@ -3897,6 +3901,7 @@ static const char * const ata_quirk_names[] = {
|
||||
[__ATA_QUIRK_MAX_SEC_1024] = "maxsec1024",
|
||||
[__ATA_QUIRK_MAX_TRIM_128M] = "maxtrim128m",
|
||||
[__ATA_QUIRK_NO_NCQ_ON_ATI] = "noncqonati",
|
||||
[__ATA_QUIRK_NO_LPM_ON_ATI] = "nolpmonati",
|
||||
[__ATA_QUIRK_NO_ID_DEV_LOG] = "noiddevlog",
|
||||
[__ATA_QUIRK_NO_LOG_DIR] = "nologdir",
|
||||
[__ATA_QUIRK_NO_FUA] = "nofua",
|
||||
@ -4142,13 +4147,16 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
|
||||
ATA_QUIRK_ZERO_AFTER_TRIM },
|
||||
{ "Samsung SSD 860*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
|
||||
ATA_QUIRK_ZERO_AFTER_TRIM |
|
||||
ATA_QUIRK_NO_NCQ_ON_ATI },
|
||||
ATA_QUIRK_NO_NCQ_ON_ATI |
|
||||
ATA_QUIRK_NO_LPM_ON_ATI },
|
||||
{ "Samsung SSD 870*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
|
||||
ATA_QUIRK_ZERO_AFTER_TRIM |
|
||||
ATA_QUIRK_NO_NCQ_ON_ATI },
|
||||
ATA_QUIRK_NO_NCQ_ON_ATI |
|
||||
ATA_QUIRK_NO_LPM_ON_ATI },
|
||||
{ "SAMSUNG*MZ7LH*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
|
||||
ATA_QUIRK_ZERO_AFTER_TRIM |
|
||||
ATA_QUIRK_NO_NCQ_ON_ATI, },
|
||||
ATA_QUIRK_NO_NCQ_ON_ATI |
|
||||
ATA_QUIRK_NO_LPM_ON_ATI },
|
||||
{ "FCCT*M500*", NULL, ATA_QUIRK_NO_NCQ_TRIM |
|
||||
ATA_QUIRK_ZERO_AFTER_TRIM },
|
||||
|
||||
|
@ -1549,8 +1549,8 @@ static int null_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
|
||||
cmd = blk_mq_rq_to_pdu(req);
|
||||
cmd->error = null_process_cmd(cmd, req_op(req), blk_rq_pos(req),
|
||||
blk_rq_sectors(req));
|
||||
if (!blk_mq_add_to_batch(req, iob, (__force int) cmd->error,
|
||||
blk_mq_end_request_batch))
|
||||
if (!blk_mq_add_to_batch(req, iob, cmd->error != BLK_STS_OK,
|
||||
blk_mq_end_request_batch))
|
||||
blk_mq_end_request(req, cmd->error);
|
||||
nr++;
|
||||
}
|
||||
|
@ -1207,11 +1207,12 @@ static int virtblk_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
|
||||
|
||||
while ((vbr = virtqueue_get_buf(vq->vq, &len)) != NULL) {
|
||||
struct request *req = blk_mq_rq_from_pdu(vbr);
|
||||
u8 status = virtblk_vbr_status(vbr);
|
||||
|
||||
found++;
|
||||
if (!blk_mq_complete_request_remote(req) &&
|
||||
!blk_mq_add_to_batch(req, iob, virtblk_vbr_status(vbr),
|
||||
virtblk_complete_batch))
|
||||
!blk_mq_add_to_batch(req, iob, status != VIRTIO_BLK_S_OK,
|
||||
virtblk_complete_batch))
|
||||
virtblk_request_done(req);
|
||||
}
|
||||
|
||||
|
@ -827,7 +827,6 @@ static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = {
|
||||
&disp_cc_mdss_byte0_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ops,
|
||||
},
|
||||
};
|
||||
@ -842,7 +841,6 @@ static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = {
|
||||
&disp_cc_mdss_byte1_clk_src.clkr.hw,
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_regmap_div_ops,
|
||||
},
|
||||
};
|
||||
|
@ -382,17 +382,9 @@ static const unsigned long cmu_top_clk_regs[] __initconst = {
|
||||
EARLY_WAKEUP_DPU_DEST,
|
||||
EARLY_WAKEUP_CSIS_DEST,
|
||||
EARLY_WAKEUP_SW_TRIG_APM,
|
||||
EARLY_WAKEUP_SW_TRIG_APM_SET,
|
||||
EARLY_WAKEUP_SW_TRIG_APM_CLEAR,
|
||||
EARLY_WAKEUP_SW_TRIG_CLUSTER0,
|
||||
EARLY_WAKEUP_SW_TRIG_CLUSTER0_SET,
|
||||
EARLY_WAKEUP_SW_TRIG_CLUSTER0_CLEAR,
|
||||
EARLY_WAKEUP_SW_TRIG_DPU,
|
||||
EARLY_WAKEUP_SW_TRIG_DPU_SET,
|
||||
EARLY_WAKEUP_SW_TRIG_DPU_CLEAR,
|
||||
EARLY_WAKEUP_SW_TRIG_CSIS,
|
||||
EARLY_WAKEUP_SW_TRIG_CSIS_SET,
|
||||
EARLY_WAKEUP_SW_TRIG_CSIS_CLEAR,
|
||||
CLK_CON_MUX_MUX_CLKCMU_BO_BUS,
|
||||
CLK_CON_MUX_MUX_CLKCMU_BUS0_BUS,
|
||||
CLK_CON_MUX_MUX_CLKCMU_BUS1_BUS,
|
||||
|
@ -206,6 +206,7 @@ static const struct clk_ops samsung_pll3000_clk_ops = {
|
||||
*/
|
||||
/* Maximum lock time can be 270 * PDIV cycles */
|
||||
#define PLL35XX_LOCK_FACTOR (270)
|
||||
#define PLL142XX_LOCK_FACTOR (150)
|
||||
|
||||
#define PLL35XX_MDIV_MASK (0x3FF)
|
||||
#define PLL35XX_PDIV_MASK (0x3F)
|
||||
@ -272,7 +273,11 @@ static int samsung_pll35xx_set_rate(struct clk_hw *hw, unsigned long drate,
|
||||
}
|
||||
|
||||
/* Set PLL lock time. */
|
||||
writel_relaxed(rate->pdiv * PLL35XX_LOCK_FACTOR,
|
||||
if (pll->type == pll_142xx)
|
||||
writel_relaxed(rate->pdiv * PLL142XX_LOCK_FACTOR,
|
||||
pll->lock_reg);
|
||||
else
|
||||
writel_relaxed(rate->pdiv * PLL35XX_LOCK_FACTOR,
|
||||
pll->lock_reg);
|
||||
|
||||
/* Change PLL PMS values */
|
||||
|
@ -508,7 +508,7 @@ dpll_pin_alloc(u64 clock_id, u32 pin_idx, struct module *module,
|
||||
xa_init_flags(&pin->parent_refs, XA_FLAGS_ALLOC);
|
||||
ret = xa_alloc_cyclic(&dpll_pin_xa, &pin->id, pin, xa_limit_32b,
|
||||
&dpll_pin_xa_id, GFP_KERNEL);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
goto err_xa_alloc;
|
||||
return pin;
|
||||
err_xa_alloc:
|
||||
|
@ -75,6 +75,10 @@ efi_status_t efi_random_alloc(unsigned long size,
|
||||
if (align < EFI_ALLOC_ALIGN)
|
||||
align = EFI_ALLOC_ALIGN;
|
||||
|
||||
/* Avoid address 0x0, as it can be mistaken for NULL */
|
||||
if (alloc_min == 0)
|
||||
alloc_min = align;
|
||||
|
||||
size = round_up(size, EFI_ALLOC_ALIGN);
|
||||
|
||||
/* count the suitable slots in each memory map entry */
|
||||
|
@ -280,6 +280,7 @@ static int imx_scu_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
|
||||
sc_ipc->fast_ipc = of_device_is_compatible(args.np, "fsl,imx8-mu-scu");
|
||||
of_node_put(args.np);
|
||||
|
||||
num_channel = sc_ipc->fast_ipc ? 2 : SCU_MU_CHAN_NUM;
|
||||
for (i = 0; i < num_channel; i++) {
|
||||
|
@ -814,15 +814,6 @@ static int qcom_uefisecapp_probe(struct auxiliary_device *aux_dev,
|
||||
|
||||
qcuefi->client = container_of(aux_dev, struct qseecom_client, aux_dev);
|
||||
|
||||
auxiliary_set_drvdata(aux_dev, qcuefi);
|
||||
status = qcuefi_set_reference(qcuefi);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
status = efivars_register(&qcuefi->efivars, &qcom_efivar_ops);
|
||||
if (status)
|
||||
qcuefi_set_reference(NULL);
|
||||
|
||||
memset(&pool_config, 0, sizeof(pool_config));
|
||||
pool_config.initial_size = SZ_4K;
|
||||
pool_config.policy = QCOM_TZMEM_POLICY_MULTIPLIER;
|
||||
@ -833,6 +824,15 @@ static int qcom_uefisecapp_probe(struct auxiliary_device *aux_dev,
|
||||
if (IS_ERR(qcuefi->mempool))
|
||||
return PTR_ERR(qcuefi->mempool);
|
||||
|
||||
auxiliary_set_drvdata(aux_dev, qcuefi);
|
||||
status = qcuefi_set_reference(qcuefi);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
status = efivars_register(&qcuefi->efivars, &qcom_efivar_ops);
|
||||
if (status)
|
||||
qcuefi_set_reference(NULL);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -2301,8 +2301,8 @@ static int qcom_scm_probe(struct platform_device *pdev)
|
||||
|
||||
__scm->mempool = devm_qcom_tzmem_pool_new(__scm->dev, &pool_config);
|
||||
if (IS_ERR(__scm->mempool)) {
|
||||
dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool),
|
||||
"Failed to create the SCM memory pool\n");
|
||||
ret = dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool),
|
||||
"Failed to create the SCM memory pool\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@ -2729,8 +2729,9 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)
|
||||
cdev->gdev = gpio_device_get(gdev);
|
||||
|
||||
cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify;
|
||||
ret = atomic_notifier_chain_register(&gdev->line_state_notifier,
|
||||
&cdev->lineinfo_changed_nb);
|
||||
scoped_guard(write_lock_irqsave, &gdev->line_state_lock)
|
||||
ret = raw_notifier_chain_register(&gdev->line_state_notifier,
|
||||
&cdev->lineinfo_changed_nb);
|
||||
if (ret)
|
||||
goto out_free_bitmap;
|
||||
|
||||
@ -2754,8 +2755,9 @@ out_unregister_device_notifier:
|
||||
blocking_notifier_chain_unregister(&gdev->device_notifier,
|
||||
&cdev->device_unregistered_nb);
|
||||
out_unregister_line_notifier:
|
||||
atomic_notifier_chain_unregister(&gdev->line_state_notifier,
|
||||
&cdev->lineinfo_changed_nb);
|
||||
scoped_guard(write_lock_irqsave, &gdev->line_state_lock)
|
||||
raw_notifier_chain_unregister(&gdev->line_state_notifier,
|
||||
&cdev->lineinfo_changed_nb);
|
||||
out_free_bitmap:
|
||||
gpio_device_put(gdev);
|
||||
bitmap_free(cdev->watched_lines);
|
||||
@ -2779,8 +2781,9 @@ static int gpio_chrdev_release(struct inode *inode, struct file *file)
|
||||
|
||||
blocking_notifier_chain_unregister(&gdev->device_notifier,
|
||||
&cdev->device_unregistered_nb);
|
||||
atomic_notifier_chain_unregister(&gdev->line_state_notifier,
|
||||
&cdev->lineinfo_changed_nb);
|
||||
scoped_guard(write_lock_irqsave, &gdev->line_state_lock)
|
||||
raw_notifier_chain_unregister(&gdev->line_state_notifier,
|
||||
&cdev->lineinfo_changed_nb);
|
||||
bitmap_free(cdev->watched_lines);
|
||||
gpio_device_put(gdev);
|
||||
kfree(cdev);
|
||||
|
@ -1025,7 +1025,8 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
|
||||
}
|
||||
}
|
||||
|
||||
ATOMIC_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier);
|
||||
rwlock_init(&gdev->line_state_lock);
|
||||
RAW_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier);
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(&gdev->device_notifier);
|
||||
|
||||
ret = init_srcu_struct(&gdev->srcu);
|
||||
@ -1056,24 +1057,19 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
|
||||
|
||||
desc->gdev = gdev;
|
||||
|
||||
if (gc->get_direction && gpiochip_line_is_valid(gc, desc_index)) {
|
||||
ret = gc->get_direction(gc, desc_index);
|
||||
if (ret < 0)
|
||||
/*
|
||||
* FIXME: Bail-out here once all GPIO drivers
|
||||
* are updated to not return errors in
|
||||
* situations that can be considered normal
|
||||
* operation.
|
||||
*/
|
||||
dev_warn(&gdev->dev,
|
||||
"%s: get_direction failed: %d\n",
|
||||
__func__, ret);
|
||||
|
||||
assign_bit(FLAG_IS_OUT, &desc->flags, !ret);
|
||||
} else {
|
||||
/*
|
||||
* We would typically want to check the return value of
|
||||
* get_direction() here but we must not check the return value
|
||||
* and bail-out as pin controllers can have pins configured to
|
||||
* alternate functions and return -EINVAL. Also: there's no
|
||||
* need to take the SRCU lock here.
|
||||
*/
|
||||
if (gc->get_direction && gpiochip_line_is_valid(gc, desc_index))
|
||||
assign_bit(FLAG_IS_OUT, &desc->flags,
|
||||
!gc->get_direction(gc, desc_index));
|
||||
else
|
||||
assign_bit(FLAG_IS_OUT,
|
||||
&desc->flags, !gc->direction_input);
|
||||
}
|
||||
}
|
||||
|
||||
ret = of_gpiochip_add(gc);
|
||||
@ -4193,8 +4189,9 @@ EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep);
|
||||
|
||||
void gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action)
|
||||
{
|
||||
atomic_notifier_call_chain(&desc->gdev->line_state_notifier,
|
||||
action, desc);
|
||||
guard(read_lock_irqsave)(&desc->gdev->line_state_lock);
|
||||
|
||||
raw_notifier_call_chain(&desc->gdev->line_state_notifier, action, desc);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/srcu.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
@ -45,6 +46,7 @@
|
||||
* @list: links gpio_device:s together for traversal
|
||||
* @line_state_notifier: used to notify subscribers about lines being
|
||||
* requested, released or reconfigured
|
||||
* @line_state_lock: RW-spinlock protecting the line state notifier
|
||||
* @line_state_wq: used to emit line state events from a separate thread in
|
||||
* process context
|
||||
* @device_notifier: used to notify character device wait queues about the GPIO
|
||||
@ -72,7 +74,8 @@ struct gpio_device {
|
||||
const char *label;
|
||||
void *data;
|
||||
struct list_head list;
|
||||
struct atomic_notifier_head line_state_notifier;
|
||||
struct raw_notifier_head line_state_notifier;
|
||||
rwlock_t line_state_lock;
|
||||
struct workqueue_struct *line_state_wq;
|
||||
struct blocking_notifier_head device_notifier;
|
||||
struct srcu_struct srcu;
|
||||
|
@ -2555,7 +2555,6 @@ static int amdgpu_pmops_freeze(struct device *dev)
|
||||
int r;
|
||||
|
||||
r = amdgpu_device_suspend(drm_dev, true);
|
||||
adev->in_s4 = false;
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -2567,8 +2566,13 @@ static int amdgpu_pmops_freeze(struct device *dev)
|
||||
static int amdgpu_pmops_thaw(struct device *dev)
|
||||
{
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
int r;
|
||||
|
||||
return amdgpu_device_resume(drm_dev, true);
|
||||
r = amdgpu_device_resume(drm_dev, true);
|
||||
adev->in_s4 = false;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static int amdgpu_pmops_poweroff(struct device *dev)
|
||||
@ -2581,6 +2585,9 @@ static int amdgpu_pmops_poweroff(struct device *dev)
|
||||
static int amdgpu_pmops_restore(struct device *dev)
|
||||
{
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
|
||||
adev->in_s4 = false;
|
||||
|
||||
return amdgpu_device_resume(drm_dev, true);
|
||||
}
|
||||
|
@ -528,8 +528,9 @@ static void gmc_v12_0_get_vm_pte(struct amdgpu_device *adev,
|
||||
|
||||
bo_adev = amdgpu_ttm_adev(bo->tbo.bdev);
|
||||
coherent = bo->flags & AMDGPU_GEM_CREATE_COHERENT;
|
||||
is_system = (bo->tbo.resource->mem_type == TTM_PL_TT) ||
|
||||
(bo->tbo.resource->mem_type == AMDGPU_PL_PREEMPT);
|
||||
is_system = bo->tbo.resource &&
|
||||
(bo->tbo.resource->mem_type == TTM_PL_TT ||
|
||||
bo->tbo.resource->mem_type == AMDGPU_PL_PREEMPT);
|
||||
|
||||
if (bo && bo->flags & AMDGPU_GEM_CREATE_GFX12_DCC)
|
||||
*flags |= AMDGPU_PTE_DCC;
|
||||
|
@ -284,7 +284,7 @@ static int vce_v2_0_stop(struct amdgpu_device *adev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCN);
|
||||
ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE);
|
||||
if (!ip_block)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -1230,11 +1230,13 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm,
|
||||
decrement_queue_count(dqm, qpd, q);
|
||||
|
||||
if (dqm->dev->kfd->shared_resources.enable_mes) {
|
||||
retval = remove_queue_mes(dqm, q, qpd);
|
||||
if (retval) {
|
||||
int err;
|
||||
|
||||
err = remove_queue_mes(dqm, q, qpd);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to evict queue %d\n",
|
||||
q->properties.queue_id);
|
||||
goto out;
|
||||
retval = err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -245,6 +245,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
|
||||
static void handle_hpd_irq_helper(struct amdgpu_dm_connector *aconnector);
|
||||
static void handle_hpd_rx_irq(void *param);
|
||||
|
||||
static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
|
||||
int bl_idx,
|
||||
u32 user_brightness);
|
||||
|
||||
static bool
|
||||
is_timing_unchanged_for_freesync(struct drm_crtc_state *old_crtc_state,
|
||||
struct drm_crtc_state *new_crtc_state);
|
||||
@ -3371,8 +3375,19 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)
|
||||
|
||||
mutex_unlock(&dm->dc_lock);
|
||||
|
||||
/* set the backlight after a reset */
|
||||
for (i = 0; i < dm->num_of_edps; i++) {
|
||||
if (dm->backlight_dev[i])
|
||||
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* leave display off for S4 sequence */
|
||||
if (adev->in_s4)
|
||||
return 0;
|
||||
|
||||
/* Recreate dc_state - DC invalidates it when setting power state to S3. */
|
||||
dc_state_release(dm_state->context);
|
||||
dm_state->context = dc_state_create(dm->dc, NULL);
|
||||
@ -4906,6 +4921,7 @@ amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector)
|
||||
dm->backlight_dev[aconnector->bl_idx] =
|
||||
backlight_device_register(bl_name, aconnector->base.kdev, dm,
|
||||
&amdgpu_dm_backlight_ops, &props);
|
||||
dm->brightness[aconnector->bl_idx] = props.brightness;
|
||||
|
||||
if (IS_ERR(dm->backlight_dev[aconnector->bl_idx])) {
|
||||
DRM_ERROR("DM: Backlight registration failed!\n");
|
||||
@ -4973,7 +4989,6 @@ static void setup_backlight_device(struct amdgpu_display_manager *dm,
|
||||
aconnector->bl_idx = bl_idx;
|
||||
|
||||
amdgpu_dm_update_backlight_caps(dm, bl_idx);
|
||||
dm->brightness[bl_idx] = AMDGPU_MAX_BL_LEVEL;
|
||||
dm->backlight_link[bl_idx] = link;
|
||||
dm->num_of_edps++;
|
||||
|
||||
|
@ -455,6 +455,7 @@ void hdcp_destroy(struct kobject *kobj, struct hdcp_workqueue *hdcp_work)
|
||||
for (i = 0; i < hdcp_work->max_link; i++) {
|
||||
cancel_delayed_work_sync(&hdcp_work[i].callback_dwork);
|
||||
cancel_delayed_work_sync(&hdcp_work[i].watchdog_timer_dwork);
|
||||
cancel_delayed_work_sync(&hdcp_work[i].property_validate_dwork);
|
||||
}
|
||||
|
||||
sysfs_remove_bin_file(kobj, &hdcp_work[0].attr);
|
||||
|
@ -894,8 +894,16 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
|
||||
struct drm_device *dev = adev_to_drm(adev);
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter iter;
|
||||
int irq_type;
|
||||
int i;
|
||||
|
||||
/* First, clear all hpd and hpdrx interrupts */
|
||||
for (i = DC_IRQ_SOURCE_HPD1; i <= DC_IRQ_SOURCE_HPD6RX; i++) {
|
||||
if (!dc_interrupt_set(adev->dm.dc, i, false))
|
||||
drm_err(dev, "Failed to clear hpd(rx) source=%d on init\n",
|
||||
i);
|
||||
}
|
||||
|
||||
drm_connector_list_iter_begin(dev, &iter);
|
||||
drm_for_each_connector_iter(connector, &iter) {
|
||||
struct amdgpu_dm_connector *amdgpu_dm_connector;
|
||||
@ -908,10 +916,31 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
|
||||
|
||||
dc_link = amdgpu_dm_connector->dc_link;
|
||||
|
||||
/*
|
||||
* Get a base driver irq reference for hpd ints for the lifetime
|
||||
* of dm. Note that only hpd interrupt types are registered with
|
||||
* base driver; hpd_rx types aren't. IOW, amdgpu_irq_get/put on
|
||||
* hpd_rx isn't available. DM currently controls hpd_rx
|
||||
* explicitly with dc_interrupt_set()
|
||||
*/
|
||||
if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) {
|
||||
dc_interrupt_set(adev->dm.dc,
|
||||
dc_link->irq_source_hpd,
|
||||
true);
|
||||
irq_type = dc_link->irq_source_hpd - DC_IRQ_SOURCE_HPD1;
|
||||
/*
|
||||
* TODO: There's a mismatch between mode_info.num_hpd
|
||||
* and what bios reports as the # of connectors with hpd
|
||||
* sources. Since the # of hpd source types registered
|
||||
* with base driver == mode_info.num_hpd, we have to
|
||||
* fallback to dc_interrupt_set for the remaining types.
|
||||
*/
|
||||
if (irq_type < adev->mode_info.num_hpd) {
|
||||
if (amdgpu_irq_get(adev, &adev->hpd_irq, irq_type))
|
||||
drm_err(dev, "DM_IRQ: Failed get HPD for source=%d)!\n",
|
||||
dc_link->irq_source_hpd);
|
||||
} else {
|
||||
dc_interrupt_set(adev->dm.dc,
|
||||
dc_link->irq_source_hpd,
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
if (dc_link->irq_source_hpd_rx != DC_IRQ_SOURCE_INVALID) {
|
||||
@ -921,12 +950,6 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&iter);
|
||||
|
||||
/* Update reference counts for HPDs */
|
||||
for (i = DC_IRQ_SOURCE_HPD1; i <= adev->mode_info.num_hpd; i++) {
|
||||
if (amdgpu_irq_get(adev, &adev->hpd_irq, i - DC_IRQ_SOURCE_HPD1))
|
||||
drm_err(dev, "DM_IRQ: Failed get HPD for source=%d)!\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -942,7 +965,7 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
|
||||
struct drm_device *dev = adev_to_drm(adev);
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter iter;
|
||||
int i;
|
||||
int irq_type;
|
||||
|
||||
drm_connector_list_iter_begin(dev, &iter);
|
||||
drm_for_each_connector_iter(connector, &iter) {
|
||||
@ -956,9 +979,18 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
|
||||
dc_link = amdgpu_dm_connector->dc_link;
|
||||
|
||||
if (dc_link->irq_source_hpd != DC_IRQ_SOURCE_INVALID) {
|
||||
dc_interrupt_set(adev->dm.dc,
|
||||
dc_link->irq_source_hpd,
|
||||
false);
|
||||
irq_type = dc_link->irq_source_hpd - DC_IRQ_SOURCE_HPD1;
|
||||
|
||||
/* TODO: See same TODO in amdgpu_dm_hpd_init() */
|
||||
if (irq_type < adev->mode_info.num_hpd) {
|
||||
if (amdgpu_irq_put(adev, &adev->hpd_irq, irq_type))
|
||||
drm_err(dev, "DM_IRQ: Failed put HPD for source=%d!\n",
|
||||
dc_link->irq_source_hpd);
|
||||
} else {
|
||||
dc_interrupt_set(adev->dm.dc,
|
||||
dc_link->irq_source_hpd,
|
||||
false);
|
||||
}
|
||||
}
|
||||
|
||||
if (dc_link->irq_source_hpd_rx != DC_IRQ_SOURCE_INVALID) {
|
||||
@ -968,10 +1000,4 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&iter);
|
||||
|
||||
/* Update reference counts for HPDs */
|
||||
for (i = DC_IRQ_SOURCE_HPD1; i <= adev->mode_info.num_hpd; i++) {
|
||||
if (amdgpu_irq_put(adev, &adev->hpd_irq, i - DC_IRQ_SOURCE_HPD1))
|
||||
drm_err(dev, "DM_IRQ: Failed put HPD for source=%d!\n", i);
|
||||
}
|
||||
}
|
||||
|
@ -277,8 +277,11 @@ static int amdgpu_dm_plane_validate_dcc(struct amdgpu_device *adev,
|
||||
if (!dcc->enable)
|
||||
return 0;
|
||||
|
||||
if (format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN ||
|
||||
!dc->cap_funcs.get_dcc_compression_cap)
|
||||
if (adev->family < AMDGPU_FAMILY_GC_12_0_0 &&
|
||||
format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN)
|
||||
return -EINVAL;
|
||||
|
||||
if (!dc->cap_funcs.get_dcc_compression_cap)
|
||||
return -EINVAL;
|
||||
|
||||
input.format = format;
|
||||
|
@ -3389,10 +3389,13 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
|
||||
break;
|
||||
case COLOR_DEPTH_121212:
|
||||
normalized_pix_clk = (pix_clk * 36) / 24;
|
||||
break;
|
||||
break;
|
||||
case COLOR_DEPTH_141414:
|
||||
normalized_pix_clk = (pix_clk * 42) / 24;
|
||||
break;
|
||||
case COLOR_DEPTH_161616:
|
||||
normalized_pix_clk = (pix_clk * 48) / 24;
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
break;
|
||||
|
@ -239,6 +239,7 @@ static const struct timing_generator_funcs dce60_tg_funcs = {
|
||||
dce60_timing_generator_enable_advanced_request,
|
||||
.configure_crc = dce60_configure_crc,
|
||||
.get_crc = dce110_get_crc,
|
||||
.is_two_pixels_per_container = dce110_is_two_pixels_per_container,
|
||||
};
|
||||
|
||||
void dce60_timing_generator_construct(
|
||||
|
@ -4025,6 +4025,22 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool primary_mstb_probing_is_done(struct drm_dp_mst_topology_mgr *mgr)
|
||||
{
|
||||
bool probing_done = false;
|
||||
|
||||
mutex_lock(&mgr->lock);
|
||||
|
||||
if (mgr->mst_primary && drm_dp_mst_topology_try_get_mstb(mgr->mst_primary)) {
|
||||
probing_done = mgr->mst_primary->link_address_sent;
|
||||
drm_dp_mst_topology_put_mstb(mgr->mst_primary);
|
||||
}
|
||||
|
||||
mutex_unlock(&mgr->lock);
|
||||
|
||||
return probing_done;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_dp_pending_up_req *up_req)
|
||||
@ -4055,8 +4071,12 @@ drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr,
|
||||
|
||||
/* TODO: Add missing handler for DP_RESOURCE_STATUS_NOTIFY events */
|
||||
if (msg->req_type == DP_CONNECTION_STATUS_NOTIFY) {
|
||||
dowork = drm_dp_mst_handle_conn_stat(mstb, &msg->u.conn_stat);
|
||||
hotplug = true;
|
||||
if (!primary_mstb_probing_is_done(mgr)) {
|
||||
drm_dbg_kms(mgr->dev, "Got CSN before finish topology probing. Skip it.\n");
|
||||
} else {
|
||||
dowork = drm_dp_mst_handle_conn_stat(mstb, &msg->u.conn_stat);
|
||||
hotplug = true;
|
||||
}
|
||||
}
|
||||
|
||||
drm_dp_mst_topology_put_mstb(mstb);
|
||||
@ -4138,10 +4158,11 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
|
||||
drm_dp_send_up_ack_reply(mgr, mst_primary, up_req->msg.req_type,
|
||||
false);
|
||||
|
||||
drm_dp_mst_topology_put_mstb(mst_primary);
|
||||
|
||||
if (up_req->msg.req_type == DP_CONNECTION_STATUS_NOTIFY) {
|
||||
const struct drm_dp_connection_status_notify *conn_stat =
|
||||
&up_req->msg.u.conn_stat;
|
||||
bool handle_csn;
|
||||
|
||||
drm_dbg_kms(mgr->dev, "Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n",
|
||||
conn_stat->port_number,
|
||||
@ -4150,16 +4171,6 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
|
||||
conn_stat->message_capability_status,
|
||||
conn_stat->input_port,
|
||||
conn_stat->peer_device_type);
|
||||
|
||||
mutex_lock(&mgr->probe_lock);
|
||||
handle_csn = mst_primary->link_address_sent;
|
||||
mutex_unlock(&mgr->probe_lock);
|
||||
|
||||
if (!handle_csn) {
|
||||
drm_dbg_kms(mgr->dev, "Got CSN before finish topology probing. Skip it.");
|
||||
kfree(up_req);
|
||||
goto out_put_primary;
|
||||
}
|
||||
} else if (up_req->msg.req_type == DP_RESOURCE_STATUS_NOTIFY) {
|
||||
const struct drm_dp_resource_status_notify *res_stat =
|
||||
&up_req->msg.u.resource_stat;
|
||||
@ -4174,9 +4185,6 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
|
||||
list_add_tail(&up_req->next, &mgr->up_req_list);
|
||||
mutex_unlock(&mgr->up_req_lock);
|
||||
queue_work(system_long_wq, &mgr->up_req_work);
|
||||
|
||||
out_put_primary:
|
||||
drm_dp_mst_topology_put_mstb(mst_primary);
|
||||
out_clear_reply:
|
||||
reset_msg_rx_state(&mgr->up_req_recv);
|
||||
return ret;
|
||||
|
@ -956,6 +956,10 @@ int drm_atomic_connector_commit_dpms(struct drm_atomic_state *state,
|
||||
|
||||
if (mode != DRM_MODE_DPMS_ON)
|
||||
mode = DRM_MODE_DPMS_OFF;
|
||||
|
||||
if (connector->dpms == mode)
|
||||
goto out;
|
||||
|
||||
connector->dpms = mode;
|
||||
|
||||
crtc = connector->state->crtc;
|
||||
|
@ -1427,6 +1427,10 @@ EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
|
||||
* callback. For atomic drivers the remapping to the "ACTIVE" property is
|
||||
* implemented in the DRM core.
|
||||
*
|
||||
* On atomic drivers any DPMS setproperty ioctl where the value does not
|
||||
* change is completely skipped, otherwise a full atomic commit will occur.
|
||||
* On legacy drivers the exact behavior is driver specific.
|
||||
*
|
||||
* Note that this property cannot be set through the MODE_ATOMIC ioctl,
|
||||
* userspace must use "ACTIVE" on the CRTC instead.
|
||||
*
|
||||
|
@ -545,7 +545,7 @@ impl EncodedMsg<'_> {
|
||||
}
|
||||
self.push(&mut offset, (MODE_STOP, 4));
|
||||
|
||||
let pad_offset = (offset + 7) / 8;
|
||||
let pad_offset = offset.div_ceil(8);
|
||||
for i in pad_offset..self.version.max_data() {
|
||||
self.data[i] = PADDING[(i & 1) ^ (pad_offset & 1)];
|
||||
}
|
||||
@ -659,7 +659,7 @@ struct QrImage<'a> {
|
||||
impl QrImage<'_> {
|
||||
fn new<'a, 'b>(em: &'b EncodedMsg<'b>, qrdata: &'a mut [u8]) -> QrImage<'a> {
|
||||
let width = em.version.width();
|
||||
let stride = (width + 7) / 8;
|
||||
let stride = width.div_ceil(8);
|
||||
let data = qrdata;
|
||||
|
||||
let mut qr_image = QrImage {
|
||||
@ -911,16 +911,16 @@ impl QrImage<'_> {
|
||||
///
|
||||
/// * `url`: The base URL of the QR code. It will be encoded as Binary segment.
|
||||
/// * `data`: A pointer to the binary data, to be encoded. if URL is NULL, it
|
||||
/// will be encoded as binary segment, otherwise it will be encoded
|
||||
/// efficiently as a numeric segment, and appended to the URL.
|
||||
/// will be encoded as binary segment, otherwise it will be encoded
|
||||
/// efficiently as a numeric segment, and appended to the URL.
|
||||
/// * `data_len`: Length of the data, that needs to be encoded, must be less
|
||||
/// than data_size.
|
||||
/// than data_size.
|
||||
/// * `data_size`: Size of data buffer, it should be at least 4071 bytes to hold
|
||||
/// a V40 QR code. It will then be overwritten with the QR code image.
|
||||
/// a V40 QR code. It will then be overwritten with the QR code image.
|
||||
/// * `tmp`: A temporary buffer that the QR code encoder will use, to write the
|
||||
/// segments and ECC.
|
||||
/// segments and ECC.
|
||||
/// * `tmp_size`: Size of the temporary buffer, it must be at least 3706 bytes
|
||||
/// long for V40.
|
||||
/// long for V40.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
|
@ -279,6 +279,11 @@ static void mid_get_vbt_data(struct drm_psb_private *dev_priv)
|
||||
0, PCI_DEVFN(2, 0));
|
||||
int ret = -1;
|
||||
|
||||
if (pci_gfx_root == NULL) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the address of the platform config vbt */
|
||||
pci_read_config_dword(pci_gfx_root, 0xFC, &addr);
|
||||
pci_dev_put(pci_gfx_root);
|
||||
|
@ -7830,9 +7830,6 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
|
||||
|
||||
intel_program_dpkgc_latency(state);
|
||||
|
||||
if (state->modeset)
|
||||
intel_set_cdclk_post_plane_update(state);
|
||||
|
||||
intel_wait_for_vblank_workers(state);
|
||||
|
||||
/* FIXME: We should call drm_atomic_helper_commit_hw_done() here
|
||||
@ -7906,6 +7903,8 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
|
||||
intel_verify_planes(state);
|
||||
|
||||
intel_sagv_post_plane_update(state);
|
||||
if (state->modeset)
|
||||
intel_set_cdclk_post_plane_update(state);
|
||||
intel_pmdemand_post_plane_update(state);
|
||||
|
||||
drm_atomic_helper_commit_hw_done(&state->base);
|
||||
|
@ -164,6 +164,9 @@ static unsigned int tile_row_pages(const struct drm_i915_gem_object *obj)
|
||||
* 4 - Support multiple fault handlers per object depending on object's
|
||||
* backing storage (a.k.a. MMAP_OFFSET).
|
||||
*
|
||||
* 5 - Support multiple partial mmaps(mmap part of BO + unmap a offset, multiple
|
||||
* times with different size and offset).
|
||||
*
|
||||
* Restrictions:
|
||||
*
|
||||
* * snoopable objects cannot be accessed via the GTT. It can cause machine
|
||||
@ -191,7 +194,7 @@ static unsigned int tile_row_pages(const struct drm_i915_gem_object *obj)
|
||||
*/
|
||||
int i915_gem_mmap_gtt_version(void)
|
||||
{
|
||||
return 4;
|
||||
return 5;
|
||||
}
|
||||
|
||||
static inline struct i915_gtt_view
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "xe_guc_pc.h"
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
#include <drm/drm_managed.h>
|
||||
#include <generated/xe_wa_oob.h>
|
||||
@ -19,6 +20,7 @@
|
||||
#include "xe_gt.h"
|
||||
#include "xe_gt_idle.h"
|
||||
#include "xe_gt_printk.h"
|
||||
#include "xe_gt_throttle.h"
|
||||
#include "xe_gt_types.h"
|
||||
#include "xe_guc.h"
|
||||
#include "xe_guc_ct.h"
|
||||
@ -49,6 +51,9 @@
|
||||
#define LNL_MERT_FREQ_CAP 800
|
||||
#define BMG_MERT_FREQ_CAP 2133
|
||||
|
||||
#define SLPC_RESET_TIMEOUT_MS 5 /* roughly 5ms, but no need for precision */
|
||||
#define SLPC_RESET_EXTENDED_TIMEOUT_MS 1000 /* To be used only at pc_start */
|
||||
|
||||
/**
|
||||
* DOC: GuC Power Conservation (PC)
|
||||
*
|
||||
@ -113,9 +118,10 @@ static struct iosys_map *pc_to_maps(struct xe_guc_pc *pc)
|
||||
FIELD_PREP(HOST2GUC_PC_SLPC_REQUEST_MSG_1_EVENT_ARGC, count))
|
||||
|
||||
static int wait_for_pc_state(struct xe_guc_pc *pc,
|
||||
enum slpc_global_state state)
|
||||
enum slpc_global_state state,
|
||||
int timeout_ms)
|
||||
{
|
||||
int timeout_us = 5000; /* rought 5ms, but no need for precision */
|
||||
int timeout_us = 1000 * timeout_ms;
|
||||
int slept, wait = 10;
|
||||
|
||||
xe_device_assert_mem_access(pc_to_xe(pc));
|
||||
@ -164,7 +170,8 @@ static int pc_action_query_task_state(struct xe_guc_pc *pc)
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING))
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
|
||||
SLPC_RESET_TIMEOUT_MS))
|
||||
return -EAGAIN;
|
||||
|
||||
/* Blocking here to ensure the results are ready before reading them */
|
||||
@ -187,7 +194,8 @@ static int pc_action_set_param(struct xe_guc_pc *pc, u8 id, u32 value)
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING))
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
|
||||
SLPC_RESET_TIMEOUT_MS))
|
||||
return -EAGAIN;
|
||||
|
||||
ret = xe_guc_ct_send(ct, action, ARRAY_SIZE(action), 0, 0);
|
||||
@ -208,7 +216,8 @@ static int pc_action_unset_param(struct xe_guc_pc *pc, u8 id)
|
||||
struct xe_guc_ct *ct = &pc_to_guc(pc)->ct;
|
||||
int ret;
|
||||
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING))
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
|
||||
SLPC_RESET_TIMEOUT_MS))
|
||||
return -EAGAIN;
|
||||
|
||||
ret = xe_guc_ct_send(ct, action, ARRAY_SIZE(action), 0, 0);
|
||||
@ -440,6 +449,15 @@ u32 xe_guc_pc_get_act_freq(struct xe_guc_pc *pc)
|
||||
return freq;
|
||||
}
|
||||
|
||||
static u32 get_cur_freq(struct xe_gt *gt)
|
||||
{
|
||||
u32 freq;
|
||||
|
||||
freq = xe_mmio_read32(>->mmio, RPNSWREQ);
|
||||
freq = REG_FIELD_GET(REQ_RATIO_MASK, freq);
|
||||
return decode_freq(freq);
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_guc_pc_get_cur_freq - Get Current requested frequency
|
||||
* @pc: The GuC PC
|
||||
@ -463,10 +481,7 @@ int xe_guc_pc_get_cur_freq(struct xe_guc_pc *pc, u32 *freq)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
*freq = xe_mmio_read32(>->mmio, RPNSWREQ);
|
||||
|
||||
*freq = REG_FIELD_GET(REQ_RATIO_MASK, *freq);
|
||||
*freq = decode_freq(*freq);
|
||||
*freq = get_cur_freq(gt);
|
||||
|
||||
xe_force_wake_put(gt_to_fw(gt), fw_ref);
|
||||
return 0;
|
||||
@ -1002,6 +1017,7 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
|
||||
struct xe_gt *gt = pc_to_gt(pc);
|
||||
u32 size = PAGE_ALIGN(sizeof(struct slpc_shared_data));
|
||||
unsigned int fw_ref;
|
||||
ktime_t earlier;
|
||||
int ret;
|
||||
|
||||
xe_gt_assert(gt, xe_device_uc_enabled(xe));
|
||||
@ -1026,14 +1042,25 @@ int xe_guc_pc_start(struct xe_guc_pc *pc)
|
||||
memset(pc->bo->vmap.vaddr, 0, size);
|
||||
slpc_shared_data_write(pc, header.size, size);
|
||||
|
||||
earlier = ktime_get();
|
||||
ret = pc_action_reset(pc);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING)) {
|
||||
xe_gt_err(gt, "GuC PC Start failed\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
|
||||
SLPC_RESET_TIMEOUT_MS)) {
|
||||
xe_gt_warn(gt, "GuC PC start taking longer than normal [freq = %dMHz (req = %dMHz), perf_limit_reasons = 0x%08X]\n",
|
||||
xe_guc_pc_get_act_freq(pc), get_cur_freq(gt),
|
||||
xe_gt_throttle_get_limit_reasons(gt));
|
||||
|
||||
if (wait_for_pc_state(pc, SLPC_GLOBAL_STATE_RUNNING,
|
||||
SLPC_RESET_EXTENDED_TIMEOUT_MS)) {
|
||||
xe_gt_err(gt, "GuC PC Start failed: Dynamic GT frequency control and GT sleep states are now disabled.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
xe_gt_warn(gt, "GuC PC excessive start time: %lldms",
|
||||
ktime_ms_delta(ktime_get(), earlier));
|
||||
}
|
||||
|
||||
ret = pc_init_freqs(pc);
|
||||
|
@ -1246,11 +1246,11 @@ static void __guc_exec_queue_fini_async(struct work_struct *w)
|
||||
xe_pm_runtime_get(guc_to_xe(guc));
|
||||
trace_xe_exec_queue_destroy(q);
|
||||
|
||||
release_guc_id(guc, q);
|
||||
if (xe_exec_queue_is_lr(q))
|
||||
cancel_work_sync(&ge->lr_tdr);
|
||||
/* Confirm no work left behind accessing device structures */
|
||||
cancel_delayed_work_sync(&ge->sched.base.work_tdr);
|
||||
release_guc_id(guc, q);
|
||||
xe_sched_entity_fini(&ge->entity);
|
||||
xe_sched_fini(&ge->sched);
|
||||
|
||||
|
@ -138,13 +138,17 @@ static int xe_build_sg(struct xe_device *xe, struct hmm_range *range,
|
||||
i += size;
|
||||
|
||||
if (unlikely(j == st->nents - 1)) {
|
||||
xe_assert(xe, i >= npages);
|
||||
if (i > npages)
|
||||
size -= (i - npages);
|
||||
|
||||
sg_mark_end(sgl);
|
||||
} else {
|
||||
xe_assert(xe, i < npages);
|
||||
}
|
||||
|
||||
sg_set_page(sgl, page, size << PAGE_SHIFT, 0);
|
||||
}
|
||||
xe_assert(xe, i == npages);
|
||||
|
||||
return dma_map_sgtable(dev, st, write ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE,
|
||||
DMA_ATTR_SKIP_CPU_SYNC | DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
|
@ -267,6 +267,15 @@ int xe_pm_init_early(struct xe_device *xe)
|
||||
}
|
||||
ALLOW_ERROR_INJECTION(xe_pm_init_early, ERRNO); /* See xe_pci_probe() */
|
||||
|
||||
static u32 vram_threshold_value(struct xe_device *xe)
|
||||
{
|
||||
/* FIXME: D3Cold temporarily disabled by default on BMG */
|
||||
if (xe->info.platform == XE_BATTLEMAGE)
|
||||
return 0;
|
||||
|
||||
return DEFAULT_VRAM_THRESHOLD;
|
||||
}
|
||||
|
||||
/**
|
||||
* xe_pm_init - Initialize Xe Power Management
|
||||
* @xe: xe device instance
|
||||
@ -277,6 +286,7 @@ ALLOW_ERROR_INJECTION(xe_pm_init_early, ERRNO); /* See xe_pci_probe() */
|
||||
*/
|
||||
int xe_pm_init(struct xe_device *xe)
|
||||
{
|
||||
u32 vram_threshold;
|
||||
int err;
|
||||
|
||||
/* For now suspend/resume is only allowed with GuC */
|
||||
@ -290,7 +300,8 @@ int xe_pm_init(struct xe_device *xe)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = xe_pm_set_vram_threshold(xe, DEFAULT_VRAM_THRESHOLD);
|
||||
vram_threshold = vram_threshold_value(xe);
|
||||
err = xe_pm_set_vram_threshold(xe, vram_threshold);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
@ -1809,9 +1809,6 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
|
||||
args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE))
|
||||
return -EINVAL;
|
||||
|
||||
if (XE_IOCTL_DBG(xe, args->extensions))
|
||||
return -EINVAL;
|
||||
|
||||
if (args->flags & DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE)
|
||||
flags |= XE_VM_FLAG_SCRATCH_PAGE;
|
||||
if (args->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE)
|
||||
|
@ -273,8 +273,8 @@ static const s8 NCT6776_BEEP_BITS[NUM_BEEP_BITS] = {
|
||||
static const u16 NCT6776_REG_TOLERANCE_H[] = {
|
||||
0x10c, 0x20c, 0x30c, 0x80c, 0x90c, 0xa0c, 0xb0c };
|
||||
|
||||
static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 };
|
||||
static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
|
||||
static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0, 0 };
|
||||
static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
static const u16 NCT6776_REG_FAN_MIN[] = {
|
||||
0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
|
||||
|
@ -485,6 +485,8 @@ MODULE_DEVICE_TABLE(pci, ali1535_ids);
|
||||
|
||||
static int ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (ali1535_setup(dev)) {
|
||||
dev_warn(&dev->dev,
|
||||
"ALI1535 not detected, module not inserted.\n");
|
||||
@ -496,7 +498,15 @@ static int ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
|
||||
snprintf(ali1535_adapter.name, sizeof(ali1535_adapter.name),
|
||||
"SMBus ALI1535 adapter at %04x", ali1535_offset);
|
||||
return i2c_add_adapter(&ali1535_adapter);
|
||||
ret = i2c_add_adapter(&ali1535_adapter);
|
||||
if (ret)
|
||||
goto release_region;
|
||||
|
||||
return 0;
|
||||
|
||||
release_region:
|
||||
release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ali1535_remove(struct pci_dev *dev)
|
||||
|
@ -472,6 +472,8 @@ MODULE_DEVICE_TABLE (pci, ali15x3_ids);
|
||||
|
||||
static int ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (ali15x3_setup(dev)) {
|
||||
dev_err(&dev->dev,
|
||||
"ALI15X3 not detected, module not inserted.\n");
|
||||
@ -483,7 +485,15 @@ static int ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
|
||||
snprintf(ali15x3_adapter.name, sizeof(ali15x3_adapter.name),
|
||||
"SMBus ALI15X3 adapter at %04x", ali15x3_smba);
|
||||
return i2c_add_adapter(&ali15x3_adapter);
|
||||
ret = i2c_add_adapter(&ali15x3_adapter);
|
||||
if (ret)
|
||||
goto release_region;
|
||||
|
||||
return 0;
|
||||
|
||||
release_region:
|
||||
release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ali15x3_remove(struct pci_dev *dev)
|
||||
|
@ -1048,23 +1048,6 @@ static int omap_i2c_transmit_data(struct omap_i2c_dev *omap, u8 num_bytes,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
omap_i2c_isr(int irq, void *dev_id)
|
||||
{
|
||||
struct omap_i2c_dev *omap = dev_id;
|
||||
irqreturn_t ret = IRQ_HANDLED;
|
||||
u16 mask;
|
||||
u16 stat;
|
||||
|
||||
stat = omap_i2c_read_reg(omap, OMAP_I2C_STAT_REG);
|
||||
mask = omap_i2c_read_reg(omap, OMAP_I2C_IE_REG) & ~OMAP_I2C_STAT_NACK;
|
||||
|
||||
if (stat & mask)
|
||||
ret = IRQ_WAKE_THREAD;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int omap_i2c_xfer_data(struct omap_i2c_dev *omap)
|
||||
{
|
||||
u16 bits;
|
||||
@ -1095,8 +1078,13 @@ static int omap_i2c_xfer_data(struct omap_i2c_dev *omap)
|
||||
}
|
||||
|
||||
if (stat & OMAP_I2C_STAT_NACK) {
|
||||
err |= OMAP_I2C_STAT_NACK;
|
||||
omap->cmd_err |= OMAP_I2C_STAT_NACK;
|
||||
omap_i2c_ack_stat(omap, OMAP_I2C_STAT_NACK);
|
||||
|
||||
if (!(stat & ~OMAP_I2C_STAT_NACK)) {
|
||||
err = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (stat & OMAP_I2C_STAT_AL) {
|
||||
@ -1472,7 +1460,7 @@ omap_i2c_probe(struct platform_device *pdev)
|
||||
IRQF_NO_SUSPEND, pdev->name, omap);
|
||||
else
|
||||
r = devm_request_threaded_irq(&pdev->dev, omap->irq,
|
||||
omap_i2c_isr, omap_i2c_isr_thread,
|
||||
NULL, omap_i2c_isr_thread,
|
||||
IRQF_NO_SUSPEND | IRQF_ONESHOT,
|
||||
pdev->name, omap);
|
||||
|
||||
|
@ -509,6 +509,8 @@ MODULE_DEVICE_TABLE(pci, sis630_ids);
|
||||
|
||||
static int sis630_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (sis630_setup(dev)) {
|
||||
dev_err(&dev->dev,
|
||||
"SIS630 compatible bus not detected, "
|
||||
@ -522,7 +524,15 @@ static int sis630_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
snprintf(sis630_adapter.name, sizeof(sis630_adapter.name),
|
||||
"SMBus SIS630 adapter at %04x", smbus_base + SMB_STS);
|
||||
|
||||
return i2c_add_adapter(&sis630_adapter);
|
||||
ret = i2c_add_adapter(&sis630_adapter);
|
||||
if (ret)
|
||||
goto release_region;
|
||||
|
||||
return 0;
|
||||
|
||||
release_region:
|
||||
release_region(smbus_base + SMB_STS, SIS630_SMB_IOREGION);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sis630_remove(struct pci_dev *dev)
|
||||
|
@ -53,12 +53,6 @@
|
||||
#define BNXT_RE_MAX_MR_SIZE_HIGH BIT_ULL(39)
|
||||
#define BNXT_RE_MAX_MR_SIZE BNXT_RE_MAX_MR_SIZE_HIGH
|
||||
|
||||
#define BNXT_RE_MAX_QPC_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_SRQC_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_CQ_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT_64K (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT_256K (256 * 1024)
|
||||
|
||||
/* Number of MRs to reserve for PF, leaving remainder for VFs */
|
||||
#define BNXT_RE_RESVD_MR_FOR_PF (32 * 1024)
|
||||
|
@ -2130,8 +2130,7 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
|
||||
* memory for the function and all child VFs
|
||||
*/
|
||||
rc = bnxt_qplib_alloc_rcfw_channel(&rdev->qplib_res, &rdev->rcfw,
|
||||
&rdev->qplib_ctx,
|
||||
BNXT_RE_MAX_QPC_COUNT);
|
||||
&rdev->qplib_ctx);
|
||||
if (rc) {
|
||||
ibdev_err(&rdev->ibdev,
|
||||
"Failed to allocate RCFW Channel: %#x\n", rc);
|
||||
|
@ -1217,8 +1217,6 @@ static void __modify_flags_from_init_state(struct bnxt_qplib_qp *qp)
|
||||
qp->path_mtu =
|
||||
CMDQ_MODIFY_QP_PATH_MTU_MTU_2048;
|
||||
}
|
||||
qp->modify_flags &=
|
||||
~CMDQ_MODIFY_QP_MODIFY_MASK_VLAN_ID;
|
||||
/* Bono FW require the max_dest_rd_atomic to be >= 1 */
|
||||
if (qp->max_dest_rd_atomic < 1)
|
||||
qp->max_dest_rd_atomic = 1;
|
||||
|
@ -915,7 +915,6 @@ skip_ctx_setup:
|
||||
|
||||
void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw)
|
||||
{
|
||||
kfree(rcfw->qp_tbl);
|
||||
kfree(rcfw->crsqe_tbl);
|
||||
bnxt_qplib_free_hwq(rcfw->res, &rcfw->cmdq.hwq);
|
||||
bnxt_qplib_free_hwq(rcfw->res, &rcfw->creq.hwq);
|
||||
@ -924,8 +923,7 @@ void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw)
|
||||
|
||||
int bnxt_qplib_alloc_rcfw_channel(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_rcfw *rcfw,
|
||||
struct bnxt_qplib_ctx *ctx,
|
||||
int qp_tbl_sz)
|
||||
struct bnxt_qplib_ctx *ctx)
|
||||
{
|
||||
struct bnxt_qplib_hwq_attr hwq_attr = {};
|
||||
struct bnxt_qplib_sg_info sginfo = {};
|
||||
@ -969,12 +967,6 @@ int bnxt_qplib_alloc_rcfw_channel(struct bnxt_qplib_res *res,
|
||||
if (!rcfw->crsqe_tbl)
|
||||
goto fail;
|
||||
|
||||
/* Allocate one extra to hold the QP1 entries */
|
||||
rcfw->qp_tbl_size = qp_tbl_sz + 1;
|
||||
rcfw->qp_tbl = kcalloc(rcfw->qp_tbl_size, sizeof(struct bnxt_qplib_qp_node),
|
||||
GFP_KERNEL);
|
||||
if (!rcfw->qp_tbl)
|
||||
goto fail;
|
||||
spin_lock_init(&rcfw->tbl_lock);
|
||||
|
||||
rcfw->max_timeout = res->cctx->hwrm_cmd_max_timeout;
|
||||
|
@ -262,8 +262,7 @@ static inline void bnxt_qplib_fill_cmdqmsg(struct bnxt_qplib_cmdqmsg *msg,
|
||||
void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
||||
int bnxt_qplib_alloc_rcfw_channel(struct bnxt_qplib_res *res,
|
||||
struct bnxt_qplib_rcfw *rcfw,
|
||||
struct bnxt_qplib_ctx *ctx,
|
||||
int qp_tbl_sz);
|
||||
struct bnxt_qplib_ctx *ctx);
|
||||
void bnxt_qplib_rcfw_stop_irq(struct bnxt_qplib_rcfw *rcfw, bool kill);
|
||||
void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
||||
int bnxt_qplib_rcfw_start_irq(struct bnxt_qplib_rcfw *rcfw, int msix_vector,
|
||||
@ -285,9 +284,10 @@ int bnxt_qplib_deinit_rcfw(struct bnxt_qplib_rcfw *rcfw);
|
||||
int bnxt_qplib_init_rcfw(struct bnxt_qplib_rcfw *rcfw,
|
||||
struct bnxt_qplib_ctx *ctx, int is_virtfn);
|
||||
void bnxt_qplib_mark_qp_error(void *qp_handle);
|
||||
|
||||
static inline u32 map_qp_id_to_tbl_indx(u32 qid, struct bnxt_qplib_rcfw *rcfw)
|
||||
{
|
||||
/* Last index of the qp_tbl is for QP1 ie. qp_tbl_size - 1*/
|
||||
return (qid == 1) ? rcfw->qp_tbl_size - 1 : qid % rcfw->qp_tbl_size - 2;
|
||||
return (qid == 1) ? rcfw->qp_tbl_size - 1 : (qid % (rcfw->qp_tbl_size - 2));
|
||||
}
|
||||
#endif /* __BNXT_QPLIB_RCFW_H__ */
|
||||
|
@ -871,6 +871,7 @@ int bnxt_qplib_init_res(struct bnxt_qplib_res *res)
|
||||
|
||||
void bnxt_qplib_free_res(struct bnxt_qplib_res *res)
|
||||
{
|
||||
kfree(res->rcfw->qp_tbl);
|
||||
bnxt_qplib_free_sgid_tbl(res, &res->sgid_tbl);
|
||||
bnxt_qplib_free_pd_tbl(&res->pd_tbl);
|
||||
bnxt_qplib_free_dpi_tbl(res, &res->dpi_tbl);
|
||||
@ -878,12 +879,20 @@ void bnxt_qplib_free_res(struct bnxt_qplib_res *res)
|
||||
|
||||
int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct net_device *netdev)
|
||||
{
|
||||
struct bnxt_qplib_rcfw *rcfw = res->rcfw;
|
||||
struct bnxt_qplib_dev_attr *dev_attr;
|
||||
int rc;
|
||||
|
||||
res->netdev = netdev;
|
||||
dev_attr = res->dattr;
|
||||
|
||||
/* Allocate one extra to hold the QP1 entries */
|
||||
rcfw->qp_tbl_size = max_t(u32, BNXT_RE_MAX_QPC_COUNT + 1, dev_attr->max_qp);
|
||||
rcfw->qp_tbl = kcalloc(rcfw->qp_tbl_size, sizeof(struct bnxt_qplib_qp_node),
|
||||
GFP_KERNEL);
|
||||
if (!rcfw->qp_tbl)
|
||||
return -ENOMEM;
|
||||
|
||||
rc = bnxt_qplib_alloc_sgid_tbl(res, &res->sgid_tbl, dev_attr->max_sgid);
|
||||
if (rc)
|
||||
goto fail;
|
||||
|
@ -49,6 +49,13 @@ extern const struct bnxt_qplib_gid bnxt_qplib_gid_zero;
|
||||
#define CHIP_NUM_58818 0xd818
|
||||
#define CHIP_NUM_57608 0x1760
|
||||
|
||||
#define BNXT_RE_MAX_QPC_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_SRQC_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_CQ_COUNT (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT_64K (64 * 1024)
|
||||
#define BNXT_RE_MAX_MRW_COUNT_256K (256 * 1024)
|
||||
|
||||
#define BNXT_QPLIB_DBR_VALID (0x1UL << 26)
|
||||
#define BNXT_QPLIB_DBR_EPOCH_SHIFT 24
|
||||
#define BNXT_QPLIB_DBR_TOGGLE_SHIFT 25
|
||||
@ -600,4 +607,9 @@ static inline bool _is_cq_coalescing_supported(u16 dev_cap_ext_flags2)
|
||||
return dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_CQ_COALESCING_SUPPORTED;
|
||||
}
|
||||
|
||||
static inline bool _is_max_srq_ext_supported(u16 dev_cap_ext_flags_2)
|
||||
{
|
||||
return !!(dev_cap_ext_flags_2 & CREQ_QUERY_FUNC_RESP_SB_MAX_SRQ_EXTENDED);
|
||||
}
|
||||
|
||||
#endif /* __BNXT_QPLIB_RES_H__ */
|
||||
|
@ -176,6 +176,9 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw)
|
||||
attr->dev_cap_flags = le16_to_cpu(sb->dev_cap_flags);
|
||||
attr->dev_cap_flags2 = le16_to_cpu(sb->dev_cap_ext_flags_2);
|
||||
|
||||
if (_is_max_srq_ext_supported(attr->dev_cap_flags2))
|
||||
attr->max_srq += le16_to_cpu(sb->max_srq_ext);
|
||||
|
||||
bnxt_qplib_query_version(rcfw, attr->fw_ver);
|
||||
|
||||
for (i = 0; i < MAX_TQM_ALLOC_REQ / 4; i++) {
|
||||
|
@ -2215,11 +2215,12 @@ struct creq_query_func_resp_sb {
|
||||
#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE (0x2UL << 4)
|
||||
#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_LAST \
|
||||
CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE
|
||||
#define CREQ_QUERY_FUNC_RESP_SB_MAX_SRQ_EXTENDED 0x40UL
|
||||
#define CREQ_QUERY_FUNC_RESP_SB_MIN_RNR_RTR_RTS_OPT_SUPPORTED 0x1000UL
|
||||
__le16 max_xp_qp_size;
|
||||
__le16 create_qp_batch_size;
|
||||
__le16 destroy_qp_batch_size;
|
||||
__le16 reserved16;
|
||||
__le16 max_srq_ext;
|
||||
__le64 reserved64;
|
||||
};
|
||||
|
||||
|
@ -175,8 +175,10 @@ void hns_roce_cleanup_bitmap(struct hns_roce_dev *hr_dev)
|
||||
if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_XRC)
|
||||
ida_destroy(&hr_dev->xrcd_ida.ida);
|
||||
|
||||
if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ)
|
||||
if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ) {
|
||||
ida_destroy(&hr_dev->srq_table.srq_ida.ida);
|
||||
xa_destroy(&hr_dev->srq_table.xa);
|
||||
}
|
||||
hns_roce_cleanup_qp_table(hr_dev);
|
||||
hns_roce_cleanup_cq_table(hr_dev);
|
||||
ida_destroy(&hr_dev->mr_table.mtpt_ida.ida);
|
||||
|
@ -537,5 +537,6 @@ void hns_roce_cleanup_cq_table(struct hns_roce_dev *hr_dev)
|
||||
|
||||
for (i = 0; i < HNS_ROCE_CQ_BANK_NUM; i++)
|
||||
ida_destroy(&hr_dev->cq_table.bank[i].ida);
|
||||
xa_destroy(&hr_dev->cq_table.array);
|
||||
mutex_destroy(&hr_dev->cq_table.bank_mutex);
|
||||
}
|
||||
|
@ -1361,6 +1361,11 @@ static int hem_list_alloc_root_bt(struct hns_roce_dev *hr_dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* This is the bottom bt pages number of a 100G MR on 4K OS, assuming
|
||||
* the bt page size is not expanded by cal_best_bt_pg_sz()
|
||||
*/
|
||||
#define RESCHED_LOOP_CNT_THRESHOLD_ON_4K 12800
|
||||
|
||||
/* construct the base address table and link them by address hop config */
|
||||
int hns_roce_hem_list_request(struct hns_roce_dev *hr_dev,
|
||||
struct hns_roce_hem_list *hem_list,
|
||||
@ -1369,6 +1374,7 @@ int hns_roce_hem_list_request(struct hns_roce_dev *hr_dev,
|
||||
{
|
||||
const struct hns_roce_buf_region *r;
|
||||
int ofs, end;
|
||||
int loop;
|
||||
int unit;
|
||||
int ret;
|
||||
int i;
|
||||
@ -1386,7 +1392,10 @@ int hns_roce_hem_list_request(struct hns_roce_dev *hr_dev,
|
||||
continue;
|
||||
|
||||
end = r->offset + r->count;
|
||||
for (ofs = r->offset; ofs < end; ofs += unit) {
|
||||
for (ofs = r->offset, loop = 1; ofs < end; ofs += unit, loop++) {
|
||||
if (!(loop % RESCHED_LOOP_CNT_THRESHOLD_ON_4K))
|
||||
cond_resched();
|
||||
|
||||
ret = hem_list_alloc_mid_bt(hr_dev, r, unit, ofs,
|
||||
hem_list->mid_bt[i],
|
||||
&hem_list->btm_bt);
|
||||
@ -1443,9 +1452,14 @@ void *hns_roce_hem_list_find_mtt(struct hns_roce_dev *hr_dev,
|
||||
struct list_head *head = &hem_list->btm_bt;
|
||||
struct hns_roce_hem_item *hem, *temp_hem;
|
||||
void *cpu_base = NULL;
|
||||
int loop = 1;
|
||||
int nr = 0;
|
||||
|
||||
list_for_each_entry_safe(hem, temp_hem, head, sibling) {
|
||||
if (!(loop % RESCHED_LOOP_CNT_THRESHOLD_ON_4K))
|
||||
cond_resched();
|
||||
loop++;
|
||||
|
||||
if (hem_list_page_is_in_range(hem, offset)) {
|
||||
nr = offset - hem->start;
|
||||
cpu_base = hem->addr + nr * BA_BYTE_LEN;
|
||||
|
@ -183,7 +183,7 @@ static int hns_roce_query_device(struct ib_device *ib_dev,
|
||||
IB_DEVICE_RC_RNR_NAK_GEN;
|
||||
props->max_send_sge = hr_dev->caps.max_sq_sg;
|
||||
props->max_recv_sge = hr_dev->caps.max_rq_sg;
|
||||
props->max_sge_rd = 1;
|
||||
props->max_sge_rd = hr_dev->caps.max_sq_sg;
|
||||
props->max_cq = hr_dev->caps.num_cqs;
|
||||
props->max_cqe = hr_dev->caps.max_cqes;
|
||||
props->max_mr = hr_dev->caps.num_mtpts;
|
||||
|
@ -868,12 +868,14 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
|
||||
struct hns_roce_ib_create_qp *ucmd,
|
||||
struct hns_roce_ib_create_qp_resp *resp)
|
||||
{
|
||||
bool has_sdb = user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd);
|
||||
struct hns_roce_ucontext *uctx = rdma_udata_to_drv_context(udata,
|
||||
struct hns_roce_ucontext, ibucontext);
|
||||
bool has_rdb = user_qp_has_rdb(hr_dev, init_attr, udata, resp);
|
||||
struct ib_device *ibdev = &hr_dev->ib_dev;
|
||||
int ret;
|
||||
|
||||
if (user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd)) {
|
||||
if (has_sdb) {
|
||||
ret = hns_roce_db_map_user(uctx, ucmd->sdb_addr, &hr_qp->sdb);
|
||||
if (ret) {
|
||||
ibdev_err(ibdev,
|
||||
@ -884,7 +886,7 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
|
||||
hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
|
||||
}
|
||||
|
||||
if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) {
|
||||
if (has_rdb) {
|
||||
ret = hns_roce_db_map_user(uctx, ucmd->db_addr, &hr_qp->rdb);
|
||||
if (ret) {
|
||||
ibdev_err(ibdev,
|
||||
@ -898,7 +900,7 @@ static int alloc_user_qp_db(struct hns_roce_dev *hr_dev,
|
||||
return 0;
|
||||
|
||||
err_sdb:
|
||||
if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
|
||||
if (has_sdb)
|
||||
hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
|
||||
err_out:
|
||||
return ret;
|
||||
@ -1119,24 +1121,23 @@ static int set_qp_param(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
|
||||
ibucontext);
|
||||
hr_qp->config = uctx->config;
|
||||
ret = set_user_sq_size(hr_dev, &init_attr->cap, hr_qp, ucmd);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
ibdev_err(ibdev,
|
||||
"failed to set user SQ size, ret = %d.\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = set_congest_param(hr_dev, hr_qp, ucmd);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
|
||||
hr_qp->config = HNS_ROCE_EXSGE_FLAGS;
|
||||
default_congest_type(hr_dev, hr_qp);
|
||||
ret = set_kernel_sq_size(hr_dev, &init_attr->cap, hr_qp);
|
||||
if (ret)
|
||||
ibdev_err(ibdev,
|
||||
"failed to set kernel SQ size, ret = %d.\n",
|
||||
ret);
|
||||
|
||||
default_congest_type(hr_dev, hr_qp);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -1219,7 +1220,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
|
||||
min(udata->outlen, sizeof(resp)));
|
||||
if (ret) {
|
||||
ibdev_err(ibdev, "copy qp resp failed!\n");
|
||||
goto err_store;
|
||||
goto err_flow_ctrl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1602,6 +1603,7 @@ void hns_roce_cleanup_qp_table(struct hns_roce_dev *hr_dev)
|
||||
for (i = 0; i < HNS_ROCE_QP_BANK_NUM; i++)
|
||||
ida_destroy(&hr_dev->qp_table.bank[i].ida);
|
||||
xa_destroy(&hr_dev->qp_table.dip_xa);
|
||||
xa_destroy(&hr_dev->qp_table_xa);
|
||||
mutex_destroy(&hr_dev->qp_table.bank_mutex);
|
||||
mutex_destroy(&hr_dev->qp_table.scc_mutex);
|
||||
}
|
||||
|
@ -50,11 +50,12 @@ static __be16 mlx5_ah_get_udp_sport(const struct mlx5_ib_dev *dev,
|
||||
return sport;
|
||||
}
|
||||
|
||||
static void create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,
|
||||
static int create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,
|
||||
struct rdma_ah_init_attr *init_attr)
|
||||
{
|
||||
struct rdma_ah_attr *ah_attr = init_attr->ah_attr;
|
||||
enum ib_gid_type gid_type;
|
||||
int rate_val;
|
||||
|
||||
if (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) {
|
||||
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
|
||||
@ -67,8 +68,10 @@ static void create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,
|
||||
ah->av.tclass = grh->traffic_class;
|
||||
}
|
||||
|
||||
ah->av.stat_rate_sl =
|
||||
(mlx5r_ib_rate(dev, rdma_ah_get_static_rate(ah_attr)) << 4);
|
||||
rate_val = mlx5r_ib_rate(dev, rdma_ah_get_static_rate(ah_attr));
|
||||
if (rate_val < 0)
|
||||
return rate_val;
|
||||
ah->av.stat_rate_sl = rate_val << 4;
|
||||
|
||||
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
|
||||
if (init_attr->xmit_slave)
|
||||
@ -89,6 +92,8 @@ static void create_ib_ah(struct mlx5_ib_dev *dev, struct mlx5_ib_ah *ah,
|
||||
ah->av.fl_mlid = rdma_ah_get_path_bits(ah_attr) & 0x7f;
|
||||
ah->av.stat_rate_sl |= (rdma_ah_get_sl(ah_attr) & 0xf);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlx5_ib_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
|
||||
@ -121,8 +126,7 @@ int mlx5_ib_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
|
||||
return err;
|
||||
}
|
||||
|
||||
create_ib_ah(dev, ah, init_attr);
|
||||
return 0;
|
||||
return create_ib_ah(dev, ah, init_attr);
|
||||
}
|
||||
|
||||
int mlx5_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr)
|
||||
|
@ -38,10 +38,8 @@ void rxe_dealloc(struct ib_device *ib_dev)
|
||||
}
|
||||
|
||||
/* initialize rxe device parameters */
|
||||
static void rxe_init_device_param(struct rxe_dev *rxe)
|
||||
static void rxe_init_device_param(struct rxe_dev *rxe, struct net_device *ndev)
|
||||
{
|
||||
struct net_device *ndev;
|
||||
|
||||
rxe->max_inline_data = RXE_MAX_INLINE_DATA;
|
||||
|
||||
rxe->attr.vendor_id = RXE_VENDOR_ID;
|
||||
@ -74,15 +72,9 @@ static void rxe_init_device_param(struct rxe_dev *rxe)
|
||||
rxe->attr.max_pkeys = RXE_MAX_PKEYS;
|
||||
rxe->attr.local_ca_ack_delay = RXE_LOCAL_CA_ACK_DELAY;
|
||||
|
||||
ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
|
||||
if (!ndev)
|
||||
return;
|
||||
|
||||
addrconf_addr_eui48((unsigned char *)&rxe->attr.sys_image_guid,
|
||||
ndev->dev_addr);
|
||||
|
||||
dev_put(ndev);
|
||||
|
||||
rxe->max_ucontext = RXE_MAX_UCONTEXT;
|
||||
}
|
||||
|
||||
@ -115,18 +107,13 @@ static void rxe_init_port_param(struct rxe_port *port)
|
||||
/* initialize port state, note IB convention that HCA ports are always
|
||||
* numbered from 1
|
||||
*/
|
||||
static void rxe_init_ports(struct rxe_dev *rxe)
|
||||
static void rxe_init_ports(struct rxe_dev *rxe, struct net_device *ndev)
|
||||
{
|
||||
struct rxe_port *port = &rxe->port;
|
||||
struct net_device *ndev;
|
||||
|
||||
rxe_init_port_param(port);
|
||||
ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
|
||||
if (!ndev)
|
||||
return;
|
||||
addrconf_addr_eui48((unsigned char *)&port->port_guid,
|
||||
ndev->dev_addr);
|
||||
dev_put(ndev);
|
||||
spin_lock_init(&port->port_lock);
|
||||
}
|
||||
|
||||
@ -144,12 +131,12 @@ static void rxe_init_pools(struct rxe_dev *rxe)
|
||||
}
|
||||
|
||||
/* initialize rxe device state */
|
||||
static void rxe_init(struct rxe_dev *rxe)
|
||||
static void rxe_init(struct rxe_dev *rxe, struct net_device *ndev)
|
||||
{
|
||||
/* init default device parameters */
|
||||
rxe_init_device_param(rxe);
|
||||
rxe_init_device_param(rxe, ndev);
|
||||
|
||||
rxe_init_ports(rxe);
|
||||
rxe_init_ports(rxe, ndev);
|
||||
rxe_init_pools(rxe);
|
||||
|
||||
/* init pending mmap list */
|
||||
@ -184,7 +171,7 @@ void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)
|
||||
int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name,
|
||||
struct net_device *ndev)
|
||||
{
|
||||
rxe_init(rxe);
|
||||
rxe_init(rxe, ndev);
|
||||
rxe_set_mtu(rxe, mtu);
|
||||
|
||||
return rxe_register_device(rxe, ibdev_name, ndev);
|
||||
|
@ -140,6 +140,7 @@ static const struct xpad_device {
|
||||
{ 0x044f, 0x0f00, "Thrustmaster Wheel", 0, XTYPE_XBOX },
|
||||
{ 0x044f, 0x0f03, "Thrustmaster Wheel", 0, XTYPE_XBOX },
|
||||
{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
|
||||
{ 0x044f, 0xd01e, "ThrustMaster, Inc. ESWAP X 2 ELDEN RING EDITION", 0, XTYPE_XBOXONE },
|
||||
{ 0x044f, 0x0f10, "Thrustmaster Modena GT Wheel", 0, XTYPE_XBOX },
|
||||
{ 0x044f, 0xb326, "Thrustmaster Gamepad GP XID", 0, XTYPE_XBOX360 },
|
||||
{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
|
||||
@ -177,6 +178,7 @@ static const struct xpad_device {
|
||||
{ 0x06a3, 0x0200, "Saitek Racing Wheel", 0, XTYPE_XBOX },
|
||||
{ 0x06a3, 0x0201, "Saitek Adrenalin", 0, XTYPE_XBOX },
|
||||
{ 0x06a3, 0xf51a, "Saitek P3600", 0, XTYPE_XBOX360 },
|
||||
{ 0x0738, 0x4503, "Mad Catz Racing Wheel", 0, XTYPE_XBOXONE },
|
||||
{ 0x0738, 0x4506, "Mad Catz 4506 Wireless Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX },
|
||||
{ 0x0738, 0x4520, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
|
||||
@ -238,6 +240,7 @@ static const struct xpad_device {
|
||||
{ 0x0e6f, 0x0146, "Rock Candy Wired Controller for Xbox One", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x0147, "PDP Marvel Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x015c, "PDP Xbox One Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x015d, "PDP Mirror's Edge Official Wired Controller for Xbox One", XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x0161, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x0162, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x0e6f, 0x0163, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
|
||||
@ -276,12 +279,15 @@ static const struct xpad_device {
|
||||
{ 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
|
||||
{ 0x0f0d, 0x00c5, "Hori Fighting Commander ONE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
|
||||
{ 0x0f0d, 0x00dc, "HORIPAD FPS for Nintendo Switch", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f0d, 0x0151, "Hori Racing Wheel Overdrive for Xbox Series X", 0, XTYPE_XBOXONE },
|
||||
{ 0x0f0d, 0x0152, "Hori Racing Wheel Overdrive for Xbox Series X", 0, XTYPE_XBOXONE },
|
||||
{ 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX },
|
||||
{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
|
||||
{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
|
||||
{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
|
||||
{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
|
||||
{ 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
|
||||
{ 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 },
|
||||
{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
|
||||
@ -306,7 +312,7 @@ static const struct xpad_device {
|
||||
{ 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
|
||||
{ 0x17ef, 0x6182, "Lenovo Legion Controller for Windows", 0, XTYPE_XBOX360 },
|
||||
{ 0x1949, 0x041a, "Amazon Game Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1a86, 0xe310, "QH Electronics Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1a86, 0xe310, "Legion Go S", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0130, "Ion Drum Rocker", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
@ -343,6 +349,7 @@ static const struct xpad_device {
|
||||
{ 0x1bad, 0xfa01, "MadCatz GamePad", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
|
||||
{ 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 },
|
||||
{ 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
|
||||
{ 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
|
||||
@ -366,6 +373,7 @@ static const struct xpad_device {
|
||||
{ 0x24c6, 0x5510, "Hori Fighting Commander ONE (Xbox 360/PC Mode)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x551a, "PowerA FUSION Pro Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x24c6, 0x561a, "PowerA FUSION Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x24c6, 0x581a, "ThrustMaster XB1 Classic Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x24c6, 0x5b00, "ThrustMaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
|
||||
@ -374,10 +382,15 @@ static const struct xpad_device {
|
||||
{ 0x2563, 0x058d, "OneXPlayer Gamepad", 0, XTYPE_XBOX360 },
|
||||
{ 0x294b, 0x3303, "Snakebyte GAMEPAD BASE X", 0, XTYPE_XBOXONE },
|
||||
{ 0x294b, 0x3404, "Snakebyte GAMEPAD RGB X", 0, XTYPE_XBOXONE },
|
||||
{ 0x2993, 0x2001, "TECNO Pocket Go", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x2000, "8BitDo Pro 2 Wired Controller fox Xbox", 0, XTYPE_XBOXONE },
|
||||
{ 0x2dc8, 0x3106, "8BitDo Ultimate Wireless / Pro 2 Wired Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x3109, "8BitDo Ultimate Wireless Bluetooth", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x310a, "8BitDo Ultimate 2C Wireless Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x6001, "8BitDo SN30 Pro", 0, XTYPE_XBOX360 },
|
||||
{ 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
|
||||
{ 0x2e24, 0x1688, "Hyperkin X91 X-Box One pad", 0, XTYPE_XBOXONE },
|
||||
{ 0x2e95, 0x0504, "SCUF Gaming Controller", MAP_SELECT_BUTTON, XTYPE_XBOXONE },
|
||||
{ 0x31e3, 0x1100, "Wooting One", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1200, "Wooting Two", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1210, "Wooting Lekker", 0, XTYPE_XBOX360 },
|
||||
@ -385,11 +398,16 @@ static const struct xpad_device {
|
||||
{ 0x31e3, 0x1230, "Wooting Two HE (ARM)", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1300, "Wooting 60HE (AVR)", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1310, "Wooting 60HE (ARM)", 0, XTYPE_XBOX360 },
|
||||
{ 0x3285, 0x0603, "Nacon Pro Compact controller for Xbox", 0, XTYPE_XBOXONE },
|
||||
{ 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 },
|
||||
{ 0x3285, 0x0614, "Nacon Pro Compact", 0, XTYPE_XBOXONE },
|
||||
{ 0x3285, 0x0646, "Nacon Pro Compact", 0, XTYPE_XBOXONE },
|
||||
{ 0x3285, 0x0662, "Nacon Revolution5 Pro", 0, XTYPE_XBOX360 },
|
||||
{ 0x3285, 0x0663, "Nacon Evol-X", 0, XTYPE_XBOXONE },
|
||||
{ 0x3537, 0x1004, "GameSir T4 Kaleid", 0, XTYPE_XBOX360 },
|
||||
{ 0x3537, 0x1010, "GameSir G7 SE", 0, XTYPE_XBOXONE },
|
||||
{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
|
||||
{ 0x413d, 0x2104, "Black Shark Green Ghost Gamepad", 0, XTYPE_XBOX360 },
|
||||
{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
|
||||
};
|
||||
@ -488,6 +506,7 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOX360_VENDOR(0x03f0), /* HP HyperX Xbox 360 controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x03f0), /* HP HyperX Xbox One controllers */
|
||||
XPAD_XBOX360_VENDOR(0x044f), /* Thrustmaster Xbox 360 controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x044f), /* Thrustmaster Xbox One controllers */
|
||||
XPAD_XBOX360_VENDOR(0x045e), /* Microsoft Xbox 360 controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x045e), /* Microsoft Xbox One controllers */
|
||||
XPAD_XBOX360_VENDOR(0x046d), /* Logitech Xbox 360-style controllers */
|
||||
@ -519,8 +538,9 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
|
||||
XPAD_XBOX360_VENDOR(0x17ef), /* Lenovo */
|
||||
XPAD_XBOX360_VENDOR(0x1949), /* Amazon controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1a86), /* QH Electronics */
|
||||
XPAD_XBOX360_VENDOR(0x1a86), /* Nanjing Qinheng Microelectronics (WCH) */
|
||||
XPAD_XBOX360_VENDOR(0x1bad), /* Harmonix Rock Band guitar and drums */
|
||||
XPAD_XBOX360_VENDOR(0x1ee9), /* ZOTAC Technology Limited */
|
||||
XPAD_XBOX360_VENDOR(0x20d6), /* PowerA controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x20d6), /* PowerA controllers */
|
||||
XPAD_XBOX360_VENDOR(0x2345), /* Machenike Controllers */
|
||||
@ -528,17 +548,20 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOXONE_VENDOR(0x24c6), /* PowerA controllers */
|
||||
XPAD_XBOX360_VENDOR(0x2563), /* OneXPlayer Gamepad */
|
||||
XPAD_XBOX360_VENDOR(0x260d), /* Dareu H101 */
|
||||
XPAD_XBOXONE_VENDOR(0x294b), /* Snakebyte */
|
||||
XPAD_XBOXONE_VENDOR(0x294b), /* Snakebyte */
|
||||
XPAD_XBOX360_VENDOR(0x2993), /* TECNO Mobile */
|
||||
XPAD_XBOX360_VENDOR(0x2c22), /* Qanba Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x2dc8), /* 8BitDo Pro 2 Wired Controller */
|
||||
XPAD_XBOXONE_VENDOR(0x2dc8), /* 8BitDo Pro 2 Wired Controller for Xbox */
|
||||
XPAD_XBOXONE_VENDOR(0x2e24), /* Hyperkin Duke Xbox One pad */
|
||||
XPAD_XBOX360_VENDOR(0x2f24), /* GameSir controllers */
|
||||
XPAD_XBOX360_VENDOR(0x2dc8), /* 8BitDo Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x2dc8), /* 8BitDo Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x2e24), /* Hyperkin Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x2e95), /* SCUF Gaming Controller */
|
||||
XPAD_XBOX360_VENDOR(0x31e3), /* Wooting Keyboards */
|
||||
XPAD_XBOX360_VENDOR(0x3285), /* Nacon GC-100 */
|
||||
XPAD_XBOXONE_VENDOR(0x3285), /* Nacon Evol-X */
|
||||
XPAD_XBOX360_VENDOR(0x3537), /* GameSir Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x3537), /* GameSir Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x413d), /* Black Shark Green Ghost Controller */
|
||||
{ }
|
||||
};
|
||||
|
||||
@ -691,7 +714,9 @@ static const struct xboxone_init_packet xboxone_init_packets[] = {
|
||||
XBOXONE_INIT_PKT(0x045e, 0x0b00, xboxone_s_init),
|
||||
XBOXONE_INIT_PKT(0x045e, 0x0b00, extra_input_packet_init),
|
||||
XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_led_on),
|
||||
XBOXONE_INIT_PKT(0x20d6, 0xa01a, xboxone_pdp_led_on),
|
||||
XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_auth),
|
||||
XBOXONE_INIT_PKT(0x20d6, 0xa01a, xboxone_pdp_auth),
|
||||
XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
|
||||
XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
|
||||
XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
|
||||
|
@ -100,11 +100,11 @@ enum iqs7222_reg_key_id {
|
||||
|
||||
enum iqs7222_reg_grp_id {
|
||||
IQS7222_REG_GRP_STAT,
|
||||
IQS7222_REG_GRP_FILT,
|
||||
IQS7222_REG_GRP_CYCLE,
|
||||
IQS7222_REG_GRP_GLBL,
|
||||
IQS7222_REG_GRP_BTN,
|
||||
IQS7222_REG_GRP_CHAN,
|
||||
IQS7222_REG_GRP_FILT,
|
||||
IQS7222_REG_GRP_SLDR,
|
||||
IQS7222_REG_GRP_TPAD,
|
||||
IQS7222_REG_GRP_GPIO,
|
||||
@ -286,6 +286,7 @@ static const struct iqs7222_event_desc iqs7222_tp_events[] = {
|
||||
|
||||
struct iqs7222_reg_grp_desc {
|
||||
u16 base;
|
||||
u16 val_len;
|
||||
int num_row;
|
||||
int num_col;
|
||||
};
|
||||
@ -342,6 +343,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAC00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -400,6 +402,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAC00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -454,6 +457,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xC400,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -496,6 +500,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xC400,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -543,6 +548,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAA00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -600,6 +606,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAA00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -656,6 +663,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAE00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -712,6 +720,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAE00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -768,6 +777,7 @@ static const struct iqs7222_dev_desc iqs7222_devs[] = {
|
||||
},
|
||||
[IQS7222_REG_GRP_FILT] = {
|
||||
.base = 0xAE00,
|
||||
.val_len = 3,
|
||||
.num_row = 1,
|
||||
.num_col = 2,
|
||||
},
|
||||
@ -1604,7 +1614,7 @@ static int iqs7222_force_comms(struct iqs7222_private *iqs7222)
|
||||
}
|
||||
|
||||
static int iqs7222_read_burst(struct iqs7222_private *iqs7222,
|
||||
u16 reg, void *val, u16 num_val)
|
||||
u16 reg, void *val, u16 val_len)
|
||||
{
|
||||
u8 reg_buf[sizeof(__be16)];
|
||||
int ret, i;
|
||||
@ -1619,7 +1629,7 @@ static int iqs7222_read_burst(struct iqs7222_private *iqs7222,
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_RD,
|
||||
.len = num_val * sizeof(__le16),
|
||||
.len = val_len,
|
||||
.buf = (u8 *)val,
|
||||
},
|
||||
};
|
||||
@ -1675,7 +1685,7 @@ static int iqs7222_read_word(struct iqs7222_private *iqs7222, u16 reg, u16 *val)
|
||||
__le16 val_buf;
|
||||
int error;
|
||||
|
||||
error = iqs7222_read_burst(iqs7222, reg, &val_buf, 1);
|
||||
error = iqs7222_read_burst(iqs7222, reg, &val_buf, sizeof(val_buf));
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@ -1685,10 +1695,9 @@ static int iqs7222_read_word(struct iqs7222_private *iqs7222, u16 reg, u16 *val)
|
||||
}
|
||||
|
||||
static int iqs7222_write_burst(struct iqs7222_private *iqs7222,
|
||||
u16 reg, const void *val, u16 num_val)
|
||||
u16 reg, const void *val, u16 val_len)
|
||||
{
|
||||
int reg_len = reg > U8_MAX ? sizeof(reg) : sizeof(u8);
|
||||
int val_len = num_val * sizeof(__le16);
|
||||
int msg_len = reg_len + val_len;
|
||||
int ret, i;
|
||||
struct i2c_client *client = iqs7222->client;
|
||||
@ -1747,7 +1756,7 @@ static int iqs7222_write_word(struct iqs7222_private *iqs7222, u16 reg, u16 val)
|
||||
{
|
||||
__le16 val_buf = cpu_to_le16(val);
|
||||
|
||||
return iqs7222_write_burst(iqs7222, reg, &val_buf, 1);
|
||||
return iqs7222_write_burst(iqs7222, reg, &val_buf, sizeof(val_buf));
|
||||
}
|
||||
|
||||
static int iqs7222_ati_trigger(struct iqs7222_private *iqs7222)
|
||||
@ -1831,30 +1840,14 @@ static int iqs7222_dev_init(struct iqs7222_private *iqs7222, int dir)
|
||||
|
||||
/*
|
||||
* Acknowledge reset before writing any registers in case the device
|
||||
* suffers a spurious reset during initialization. Because this step
|
||||
* may change the reserved fields of the second filter beta register,
|
||||
* its cache must be updated.
|
||||
*
|
||||
* Writing the second filter beta register, in turn, may clobber the
|
||||
* system status register. As such, the filter beta register pair is
|
||||
* written first to protect against this hazard.
|
||||
* suffers a spurious reset during initialization.
|
||||
*/
|
||||
if (dir == WRITE) {
|
||||
u16 reg = dev_desc->reg_grps[IQS7222_REG_GRP_FILT].base + 1;
|
||||
u16 filt_setup;
|
||||
|
||||
error = iqs7222_write_word(iqs7222, IQS7222_SYS_SETUP,
|
||||
iqs7222->sys_setup[0] |
|
||||
IQS7222_SYS_SETUP_ACK_RESET);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = iqs7222_read_word(iqs7222, reg, &filt_setup);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
iqs7222->filt_setup[1] &= GENMASK(7, 0);
|
||||
iqs7222->filt_setup[1] |= (filt_setup & ~GENMASK(7, 0));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1883,6 +1876,7 @@ static int iqs7222_dev_init(struct iqs7222_private *iqs7222, int dir)
|
||||
int num_col = dev_desc->reg_grps[i].num_col;
|
||||
u16 reg = dev_desc->reg_grps[i].base;
|
||||
__le16 *val_buf;
|
||||
u16 val_len = dev_desc->reg_grps[i].val_len ? : num_col * sizeof(*val_buf);
|
||||
u16 *val;
|
||||
|
||||
if (!num_col)
|
||||
@ -1900,7 +1894,7 @@ static int iqs7222_dev_init(struct iqs7222_private *iqs7222, int dir)
|
||||
switch (dir) {
|
||||
case READ:
|
||||
error = iqs7222_read_burst(iqs7222, reg,
|
||||
val_buf, num_col);
|
||||
val_buf, val_len);
|
||||
for (k = 0; k < num_col; k++)
|
||||
val[k] = le16_to_cpu(val_buf[k]);
|
||||
break;
|
||||
@ -1909,7 +1903,7 @@ static int iqs7222_dev_init(struct iqs7222_private *iqs7222, int dir)
|
||||
for (k = 0; k < num_col; k++)
|
||||
val_buf[k] = cpu_to_le16(val[k]);
|
||||
error = iqs7222_write_burst(iqs7222, reg,
|
||||
val_buf, num_col);
|
||||
val_buf, val_len);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1962,7 +1956,7 @@ static int iqs7222_dev_info(struct iqs7222_private *iqs7222)
|
||||
int error, i;
|
||||
|
||||
error = iqs7222_read_burst(iqs7222, IQS7222_PROD_NUM, dev_id,
|
||||
ARRAY_SIZE(dev_id));
|
||||
sizeof(dev_id));
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@ -2915,7 +2909,7 @@ static int iqs7222_report(struct iqs7222_private *iqs7222)
|
||||
__le16 status[IQS7222_MAX_COLS_STAT];
|
||||
|
||||
error = iqs7222_read_burst(iqs7222, IQS7222_SYS_STATUS, status,
|
||||
num_stat);
|
||||
num_stat * sizeof(*status));
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
@ -1080,16 +1080,14 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "AURA1501"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "TUXEDO"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "EDUBOOK1502"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/* Mivvy M310 */
|
||||
@ -1159,9 +1157,7 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
},
|
||||
/*
|
||||
* A lot of modern Clevo barebones have touchpad and/or keyboard issues
|
||||
* after suspend fixable with nomux + reset + noloop + nopnp. Luckily,
|
||||
* none of them have an external PS/2 port so this can safely be set for
|
||||
* all of them.
|
||||
* after suspend fixable with the forcenorestore quirk.
|
||||
* Clevo barebones come with board_vendor and/or system_vendor set to
|
||||
* either the very generic string "Notebook" and/or a different value
|
||||
* for each individual reseller. The only somewhat universal way to
|
||||
@ -1171,29 +1167,25 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "LAPQC71A"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "LAPQC71B"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N140CU"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N141CU"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
@ -1205,29 +1197,19 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NH5xAx"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Setting SERIO_QUIRK_NOMUX or SERIO_QUIRK_RESET_ALWAYS makes
|
||||
* the keyboard very laggy for ~5 seconds after boot and
|
||||
* sometimes also after resume.
|
||||
* However both are required for the keyboard to not fail
|
||||
* completely sometimes after boot or resume.
|
||||
*/
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NHxxRZQ"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NL5xRU"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
/*
|
||||
* At least one modern Clevo barebone has the touchpad connected both
|
||||
@ -1243,17 +1225,15 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NS50MU"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
|
||||
SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
|
||||
SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOAUX |
|
||||
SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NS50_70MU"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOAUX | SERIO_QUIRK_NOMUX |
|
||||
SERIO_QUIRK_RESET_ALWAYS | SERIO_QUIRK_NOLOOP |
|
||||
SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOAUX |
|
||||
SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
@ -1265,8 +1245,13 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "NJ50_70CU"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "P640RE"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
@ -1277,16 +1262,14 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65xH"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
@ -1297,8 +1280,7 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65_P67H"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
@ -1309,8 +1291,7 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RP"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
@ -1321,8 +1302,7 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65_67RS"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
@ -1333,22 +1313,43 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P67xRP"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PB50_70DFx,DDx"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PB51RF"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PB71RD"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PC70DR"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PCX0DX"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PCX0DX_GN20"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
/* See comment on TUXEDO InfinityBook S17 Gen6 / Clevo NS70MU above */
|
||||
{
|
||||
@ -1361,15 +1362,13 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "X170SM"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
|
||||
SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
|
||||
.driver_data = (void *)(SERIO_QUIRK_FORCENORESTORE)
|
||||
},
|
||||
{
|
||||
/*
|
||||
|
@ -1021,7 +1021,7 @@ static int ads7846_setup_pendown(struct spi_device *spi,
|
||||
if (pdata->get_pendown_state) {
|
||||
ts->get_pendown_state = pdata->get_pendown_state;
|
||||
} else {
|
||||
ts->gpio_pendown = gpiod_get(&spi->dev, "pendown", GPIOD_IN);
|
||||
ts->gpio_pendown = devm_gpiod_get(&spi->dev, "pendown", GPIOD_IN);
|
||||
if (IS_ERR(ts->gpio_pendown)) {
|
||||
dev_err(&spi->dev, "failed to request pendown GPIO\n");
|
||||
return PTR_ERR(ts->gpio_pendown);
|
||||
|
@ -165,7 +165,7 @@ struct goodix_berlin_core {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
struct regulator *avdd;
|
||||
struct regulator *iovdd;
|
||||
struct regulator *vddio;
|
||||
struct gpio_desc *reset_gpio;
|
||||
struct touchscreen_properties props;
|
||||
struct goodix_berlin_fw_version fw_version;
|
||||
@ -248,22 +248,22 @@ static int goodix_berlin_power_on(struct goodix_berlin_core *cd)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = regulator_enable(cd->iovdd);
|
||||
error = regulator_enable(cd->vddio);
|
||||
if (error) {
|
||||
dev_err(cd->dev, "Failed to enable iovdd: %d\n", error);
|
||||
dev_err(cd->dev, "Failed to enable vddio: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Vendor waits 3ms for IOVDD to settle */
|
||||
/* Vendor waits 3ms for VDDIO to settle */
|
||||
usleep_range(3000, 3100);
|
||||
|
||||
error = regulator_enable(cd->avdd);
|
||||
if (error) {
|
||||
dev_err(cd->dev, "Failed to enable avdd: %d\n", error);
|
||||
goto err_iovdd_disable;
|
||||
goto err_vddio_disable;
|
||||
}
|
||||
|
||||
/* Vendor waits 15ms for IOVDD to settle */
|
||||
/* Vendor waits 15ms for AVDD to settle */
|
||||
usleep_range(15000, 15100);
|
||||
|
||||
gpiod_set_value_cansleep(cd->reset_gpio, 0);
|
||||
@ -283,8 +283,8 @@ static int goodix_berlin_power_on(struct goodix_berlin_core *cd)
|
||||
err_dev_reset:
|
||||
gpiod_set_value_cansleep(cd->reset_gpio, 1);
|
||||
regulator_disable(cd->avdd);
|
||||
err_iovdd_disable:
|
||||
regulator_disable(cd->iovdd);
|
||||
err_vddio_disable:
|
||||
regulator_disable(cd->vddio);
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -292,7 +292,7 @@ static void goodix_berlin_power_off(struct goodix_berlin_core *cd)
|
||||
{
|
||||
gpiod_set_value_cansleep(cd->reset_gpio, 1);
|
||||
regulator_disable(cd->avdd);
|
||||
regulator_disable(cd->iovdd);
|
||||
regulator_disable(cd->vddio);
|
||||
}
|
||||
|
||||
static int goodix_berlin_read_version(struct goodix_berlin_core *cd)
|
||||
@ -744,10 +744,10 @@ int goodix_berlin_probe(struct device *dev, int irq, const struct input_id *id,
|
||||
return dev_err_probe(dev, PTR_ERR(cd->avdd),
|
||||
"Failed to request avdd regulator\n");
|
||||
|
||||
cd->iovdd = devm_regulator_get(dev, "iovdd");
|
||||
if (IS_ERR(cd->iovdd))
|
||||
return dev_err_probe(dev, PTR_ERR(cd->iovdd),
|
||||
"Failed to request iovdd regulator\n");
|
||||
cd->vddio = devm_regulator_get(dev, "vddio");
|
||||
if (IS_ERR(cd->vddio))
|
||||
return dev_err_probe(dev, PTR_ERR(cd->vddio),
|
||||
"Failed to request vddio regulator\n");
|
||||
|
||||
error = goodix_berlin_power_on(cd);
|
||||
if (error) {
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#define IST3032C_WHOAMI 0x32c
|
||||
#define IST3038C_WHOAMI 0x38c
|
||||
#define IST3038H_WHOAMI 0x38d
|
||||
|
||||
#define IST3038B_REG_CHIPID 0x30
|
||||
#define IST3038B_WHOAMI 0x30380b
|
||||
@ -428,11 +429,19 @@ static const struct imagis_properties imagis_3038c_data = {
|
||||
.protocol_b = true,
|
||||
};
|
||||
|
||||
static const struct imagis_properties imagis_3038h_data = {
|
||||
.interrupt_msg_cmd = IST3038C_REG_INTR_MESSAGE,
|
||||
.touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
|
||||
.whoami_cmd = IST3038C_REG_CHIPID,
|
||||
.whoami_val = IST3038H_WHOAMI,
|
||||
};
|
||||
|
||||
static const struct of_device_id imagis_of_match[] = {
|
||||
{ .compatible = "imagis,ist3032c", .data = &imagis_3032c_data },
|
||||
{ .compatible = "imagis,ist3038", .data = &imagis_3038_data },
|
||||
{ .compatible = "imagis,ist3038b", .data = &imagis_3038b_data },
|
||||
{ .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
|
||||
{ .compatible = "imagis,ist3038h", .data = &imagis_3038h_data },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, imagis_of_match);
|
||||
|
@ -1153,11 +1153,13 @@ static const struct i2c_device_id wdt87xx_dev_id[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wdt87xx_dev_id);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id wdt87xx_acpi_id[] = {
|
||||
{ "WDHT0001", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, wdt87xx_acpi_id);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver wdt87xx_driver = {
|
||||
.probe = wdt87xx_ts_probe,
|
||||
|
@ -261,8 +261,6 @@ static int st1202_dt_init(struct st1202_chip *chip)
|
||||
int err, reg;
|
||||
|
||||
for_each_available_child_of_node_scoped(dev_of_node(dev), child) {
|
||||
struct led_init_data init_data = {};
|
||||
|
||||
err = of_property_read_u32(child, "reg", ®);
|
||||
if (err)
|
||||
return dev_err_probe(dev, err, "Invalid register\n");
|
||||
@ -276,15 +274,6 @@ static int st1202_dt_init(struct st1202_chip *chip)
|
||||
led->led_cdev.pattern_set = st1202_led_pattern_set;
|
||||
led->led_cdev.pattern_clear = st1202_led_pattern_clear;
|
||||
led->led_cdev.default_trigger = "pattern";
|
||||
|
||||
init_data.fwnode = led->fwnode;
|
||||
init_data.devicename = "st1202";
|
||||
init_data.default_label = ":";
|
||||
|
||||
err = devm_led_classdev_register_ext(dev, &led->led_cdev, &init_data);
|
||||
if (err < 0)
|
||||
return dev_err_probe(dev, err, "Failed to register LED class device\n");
|
||||
|
||||
led->led_cdev.brightness_set = st1202_brightness_set;
|
||||
led->led_cdev.brightness_get = st1202_brightness_get;
|
||||
}
|
||||
@ -368,6 +357,7 @@ static int st1202_probe(struct i2c_client *client)
|
||||
return ret;
|
||||
|
||||
for (int i = 0; i < ST1202_MAX_LEDS; i++) {
|
||||
struct led_init_data init_data = {};
|
||||
led = &chip->leds[i];
|
||||
led->chip = chip;
|
||||
led->led_num = i;
|
||||
@ -384,6 +374,15 @@ static int st1202_probe(struct i2c_client *client)
|
||||
if (ret < 0)
|
||||
return dev_err_probe(&client->dev, ret,
|
||||
"Failed to clear LED pattern\n");
|
||||
|
||||
init_data.fwnode = led->fwnode;
|
||||
init_data.devicename = "st1202";
|
||||
init_data.default_label = ":";
|
||||
|
||||
ret = devm_led_classdev_register_ext(&client->dev, &led->led_cdev, &init_data);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(&client->dev, ret,
|
||||
"Failed to register LED class device\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -426,7 +426,7 @@ static struct bio *clone_bio(struct dm_target *ti, struct flakey_c *fc, struct b
|
||||
if (!clone)
|
||||
return NULL;
|
||||
|
||||
bio_init(clone, fc->dev->bdev, bio->bi_inline_vecs, nr_iovecs, bio->bi_opf);
|
||||
bio_init(clone, fc->dev->bdev, clone->bi_inline_vecs, nr_iovecs, bio->bi_opf);
|
||||
|
||||
clone->bi_iter.bi_sector = flakey_map_sector(ti, bio->bi_iter.bi_sector);
|
||||
clone->bi_private = bio;
|
||||
|
@ -1363,6 +1363,7 @@ static int rtl2832_sdr_probe(struct platform_device *pdev)
|
||||
dev->vb_queue.ops = &rtl2832_sdr_vb2_ops;
|
||||
dev->vb_queue.mem_ops = &vb2_vmalloc_memops;
|
||||
dev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
||||
dev->vb_queue.lock = &dev->vb_queue_lock;
|
||||
ret = vb2_queue_init(&dev->vb_queue);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Could not initialize vb2 queue\n");
|
||||
@ -1421,7 +1422,6 @@ static int rtl2832_sdr_probe(struct platform_device *pdev)
|
||||
/* Init video_device structure */
|
||||
dev->vdev = rtl2832_sdr_template;
|
||||
dev->vdev.queue = &dev->vb_queue;
|
||||
dev->vdev.queue->lock = &dev->vb_queue_lock;
|
||||
video_set_drvdata(&dev->vdev, dev);
|
||||
|
||||
/* Register the v4l2_device structure */
|
||||
|
@ -2226,26 +2226,6 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (of_node_name_eq(child, "nand")) {
|
||||
/* Warn about older DT blobs with no compatible property */
|
||||
if (!of_property_read_bool(child, "compatible")) {
|
||||
dev_warn(&pdev->dev,
|
||||
"Incompatible NAND node: missing compatible");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (of_node_name_eq(child, "onenand")) {
|
||||
/* Warn about older DT blobs with no compatible property */
|
||||
if (!of_property_read_bool(child, "compatible")) {
|
||||
dev_warn(&pdev->dev,
|
||||
"Incompatible OneNAND node: missing compatible");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (of_match_node(omap_nand_ids, child)) {
|
||||
/* NAND specific setup */
|
||||
val = 8;
|
||||
|
@ -2499,8 +2499,10 @@ static int atmci_probe(struct platform_device *pdev)
|
||||
/* Get MCI capabilities and set operations according to it */
|
||||
atmci_get_cap(host);
|
||||
ret = atmci_configure_dma(host);
|
||||
if (ret == -EPROBE_DEFER)
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
clk_disable_unprepare(host->mck);
|
||||
goto err_dma_probe_defer;
|
||||
}
|
||||
if (ret == 0) {
|
||||
host->prepare_data = &atmci_prepare_data_dma;
|
||||
host->submit_data = &atmci_submit_data_dma;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user