Linux v5.9.7 rebase
Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>
This commit is contained in:
parent
4139fe1eb1
commit
73c86ebaee
|
@ -48,7 +48,7 @@ Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/acpi/apei/hest.c b/drivers/acpi/apei/hest.c
|
||||
index 953a2fae8b15..7ea07f7da582 100644
|
||||
index 6e980fe16772..37bc003e7a83 100644
|
||||
--- a/drivers/acpi/apei/hest.c
|
||||
+++ b/drivers/acpi/apei/hest.c
|
||||
@@ -88,6 +88,14 @@ int apei_hest_parse(apei_hest_func_t func, void *data)
|
||||
|
@ -67,5 +67,5 @@ index 953a2fae8b15..7ea07f7da582 100644
|
|||
for (i = 0; i < hest_tab->error_source_count; i++) {
|
||||
len = hest_esrc_len(hest_hdr);
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -71,5 +71,5 @@ index e209081d644b..7484bcf59a1b 100644
|
|||
return ctx.rc;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -51,10 +51,10 @@ Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
|
|||
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
|
||||
index 98c6b91be4a8..60055827dddc 100644
|
||||
index b5fdd30252f8..d43ceaa78269 100644
|
||||
--- a/arch/arm/include/asm/uaccess.h
|
||||
+++ b/arch/arm/include/asm/uaccess.h
|
||||
@@ -191,11 +191,12 @@ extern int __get_user_64t_4(void *);
|
||||
@@ -195,11 +195,12 @@ extern int __get_user_64t_4(void *);
|
||||
#define __get_user_check(x, p) \
|
||||
({ \
|
||||
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
||||
|
@ -68,7 +68,7 @@ index 98c6b91be4a8..60055827dddc 100644
|
|||
switch (sizeof(*(__p))) { \
|
||||
case 1: \
|
||||
if (sizeof((x)) >= 8) \
|
||||
@@ -223,9 +224,10 @@ extern int __get_user_64t_4(void *);
|
||||
@@ -227,9 +228,10 @@ extern int __get_user_64t_4(void *);
|
||||
break; \
|
||||
default: __e = __get_user_bad(); break; \
|
||||
} \
|
||||
|
@ -82,5 +82,5 @@ index 98c6b91be4a8..60055827dddc 100644
|
|||
|
||||
#define get_user(x, p) \
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ Patch for disconnect issues with storage attached to a
|
|||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||
index b1e14beaac5f..b28779779058 100644
|
||||
index 052d5accfe9b..fac58cf619da 100644
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -5517,6 +5517,13 @@ static void hub_event(struct work_struct *work)
|
||||
|
@ -28,5 +28,5 @@ index b1e14beaac5f..b28779779058 100644
|
|||
* disconnected while waiting for the lock to succeed. */
|
||||
usb_lock_device(hdev);
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -160,7 +160,7 @@ index fdd1db025dbf..8ef7d1df09dd 100644
|
|||
|
||||
static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index 05c47f857383..2e2f9f608f68 100644
|
||||
index 73db1ae04cef..92aa4697f558 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -43,6 +43,8 @@
|
||||
|
@ -172,7 +172,7 @@ index 05c47f857383..2e2f9f608f68 100644
|
|||
typedef unsigned long efi_status_t;
|
||||
typedef u8 efi_bool_t;
|
||||
typedef u16 efi_char16_t; /* UNICODE character */
|
||||
@@ -828,6 +830,7 @@ static inline bool efi_rt_services_supported(unsigned int mask)
|
||||
@@ -832,6 +834,7 @@ static inline bool efi_rt_services_supported(unsigned int mask)
|
||||
#endif
|
||||
|
||||
extern int efi_status_to_err(efi_status_t status);
|
||||
|
@ -181,5 +181,5 @@ index 05c47f857383..2e2f9f608f68 100644
|
|||
/*
|
||||
* Variable Attributes
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ Signed-off-by: Jeremy Cline <jcline@redhat.com>
|
|||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
|
||||
index 2e0700a451e5..77e7e749d7e5 100644
|
||||
index 74c5325108c0..5aa22996be8c 100644
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -1133,6 +1133,7 @@ config XEN
|
||||
|
@ -28,5 +28,5 @@ index 2e0700a451e5..77e7e749d7e5 100644
|
|||
default "11"
|
||||
help
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -8,10 +8,10 @@ Subject: [PATCH] Drop that for now
|
|||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 37cfb39d77af..c65a263990ae 100644
|
||||
index b70997f7ddf9..680d906eee35 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -496,7 +496,7 @@ KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE
|
||||
@@ -498,7 +498,7 @@ KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE
|
||||
KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
|
||||
-fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
|
||||
-Werror=implicit-function-declaration -Werror=implicit-int \
|
||||
|
@ -21,5 +21,5 @@ index 37cfb39d77af..c65a263990ae 100644
|
|||
KBUILD_CPPFLAGS := -D__KERNEL__
|
||||
KBUILD_AFLAGS_KERNEL :=
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -314,7 +314,7 @@ index 258d5fe3d395..f7298e3dc8f3 100644
|
|||
if (data->f01_container->dev.driver) {
|
||||
/* Driver already bound, so enable ATTN now. */
|
||||
diff --git a/include/linux/rmi.h b/include/linux/rmi.h
|
||||
index 7b22366d0065..307a651b2755 100644
|
||||
index 8ed37f93f3c8..d7ad35a15acb 100644
|
||||
--- a/include/linux/rmi.h
|
||||
+++ b/include/linux/rmi.h
|
||||
@@ -363,6 +363,7 @@ struct rmi_driver_data {
|
||||
|
@ -326,5 +326,5 @@ index 7b22366d0065..307a651b2755 100644
|
|||
|
||||
int rmi_register_transport_device(struct rmi_transport_dev *xport);
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -40,5 +40,5 @@ index 9d9fc678c91d..84ad75a53c83 100644
|
|||
+ return ret;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -36,5 +36,5 @@ index 253fb9a7fc98..8c95b68d86d4 100644
|
|||
}
|
||||
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
From 9134295c0515492b1ab7733c0290b2afde336d6b Mon Sep 17 00:00:00 2001
|
||||
From: Vidya Sagar <vidyas@nvidia.com>
|
||||
Date: Sat, 11 Jan 2020 00:45:00 +0530
|
||||
From dc7294c776b82b0f0feec1536b2f4676806b4b8a Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Tue, 3 Nov 2020 14:04:29 +0000
|
||||
Subject: [PATCH] PCI: Add MCFG quirks for Tegra194 host controllers
|
||||
|
||||
The PCIe controller in Tegra194 SoC is not completely ECAM-compliant.
|
||||
|
@ -19,6 +19,7 @@ Acked-by: Thierry Reding <treding@nvidia.com>
|
|||
[ Updated by jonathanh@nvidia.com only permit building the Tegra194
|
||||
PCIe driver into the kernel and not as a module ]
|
||||
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
|
||||
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
||||
---
|
||||
drivers/acpi/pci_mcfg.c | 7 ++
|
||||
drivers/pci/controller/dwc/Kconfig | 10 +-
|
||||
|
@ -28,7 +29,7 @@ Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
|
|||
5 files changed, 117 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/acpi/pci_mcfg.c b/drivers/acpi/pci_mcfg.c
|
||||
index 54b36b7ad47d9..6573d495d9c1f 100644
|
||||
index 54b36b7ad47d..6573d495d9c1 100644
|
||||
--- a/drivers/acpi/pci_mcfg.c
|
||||
+++ b/drivers/acpi/pci_mcfg.c
|
||||
@@ -116,6 +116,13 @@ static struct mcfg_fixup mcfg_quirks[] = {
|
||||
|
@ -46,7 +47,7 @@ index 54b36b7ad47d9..6573d495d9c1f 100644
|
|||
{"APM ", "XGENE ", rev, seg, MCFG_BUS_ANY, \
|
||||
&xgene_v1_pcie_ecam_ops }
|
||||
diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig
|
||||
index 044a3761c44f2..e4ee4bf9ac64a 100644
|
||||
index 044a3761c44f..e4ee4bf9ac64 100644
|
||||
--- a/drivers/pci/controller/dwc/Kconfig
|
||||
+++ b/drivers/pci/controller/dwc/Kconfig
|
||||
@@ -247,25 +247,27 @@ config PCI_MESON
|
||||
|
@ -82,7 +83,7 @@ index 044a3761c44f2..e4ee4bf9ac64a 100644
|
|||
depends on PCI_ENDPOINT
|
||||
select PCIE_DW_EP
|
||||
diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile
|
||||
index a751553fa0dbd..dbb9818765566 100644
|
||||
index a751553fa0db..dbb981876556 100644
|
||||
--- a/drivers/pci/controller/dwc/Makefile
|
||||
+++ b/drivers/pci/controller/dwc/Makefile
|
||||
@@ -17,7 +17,6 @@ obj-$(CONFIG_PCIE_INTEL_GW) += pcie-intel-gw.o
|
||||
|
@ -100,7 +101,7 @@ index a751553fa0dbd..dbb9818765566 100644
|
|||
+obj-$(CONFIG_ARM64) += pcie-tegra194.o
|
||||
endif
|
||||
diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c
|
||||
index 92b77f7d83546..7b3d581795197 100644
|
||||
index 70498689d0c0..3db514e1ea7e 100644
|
||||
--- a/drivers/pci/controller/dwc/pcie-tegra194.c
|
||||
+++ b/drivers/pci/controller/dwc/pcie-tegra194.c
|
||||
@@ -22,6 +22,8 @@
|
||||
|
@ -216,7 +217,7 @@ index 92b77f7d83546..7b3d581795197 100644
|
|||
static inline struct tegra_pcie_dw *to_tegra_pcie(struct dw_pcie *pci)
|
||||
{
|
||||
return container_of(pci, struct tegra_pcie_dw, pci);
|
||||
@@ -2405,3 +2504,6 @@ MODULE_DEVICE_TABLE(of, tegra_pcie_dw_of_match);
|
||||
@@ -2403,3 +2502,6 @@ MODULE_DEVICE_TABLE(of, tegra_pcie_dw_of_match);
|
||||
MODULE_AUTHOR("Vidya Sagar <vidyas@nvidia.com>");
|
||||
MODULE_DESCRIPTION("NVIDIA PCIe host controller driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -224,7 +225,7 @@ index 92b77f7d83546..7b3d581795197 100644
|
|||
+#endif /* CONFIG_PCIE_TEGRA194 */
|
||||
+
|
||||
diff --git a/include/linux/pci-ecam.h b/include/linux/pci-ecam.h
|
||||
index 1af5cb02ef7f9..3fb16ada505a0 100644
|
||||
index 1af5cb02ef7f..3fb16ada505a 100644
|
||||
--- a/include/linux/pci-ecam.h
|
||||
+++ b/include/linux/pci-ecam.h
|
||||
@@ -57,6 +57,7 @@ extern const struct pci_ecam_ops pci_thunder_ecam_ops; /* Cavium ThunderX 1.x */
|
||||
|
@ -236,5 +237,5 @@ index 1af5cb02ef7f9..3fb16ada505a0 100644
|
|||
|
||||
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Sun, 12 Jul 2020 13:42:14 +0100
|
||||
Subject: [PATCH] Revert "arm64: allwinner: dts: a64: add LCD-related device
|
||||
nodes for PinePhone"
|
||||
|
||||
This reverts commit 6b9deda8c30064a254bc66e3f6763281c96db7db.
|
||||
---
|
||||
.../dts/allwinner/sun50i-a64-pinephone.dtsi | 37 -------------------
|
||||
1 file changed, 37 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
index 96d9150423e0..cefda145c3c9 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
@@ -16,15 +16,6 @@ aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
- backlight: backlight {
|
||||
- compatible = "pwm-backlight";
|
||||
- pwms = <&r_pwm 0 50000 PWM_POLARITY_INVERTED>;
|
||||
- brightness-levels = <0 16 18 20 22 24 26 29 32 35 38 42 46 51 56 62 68 75 83 91 100>;
|
||||
- default-brightness-level = <15>;
|
||||
- enable-gpios = <&pio 7 10 GPIO_ACTIVE_HIGH>; /* PH10 */
|
||||
- power-supply = <®_ldo_io0>;
|
||||
- };
|
||||
-
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
@@ -93,30 +84,6 @@ &dai {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
-&de {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&dphy {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
-&dsi {
|
||||
- vcc-dsi-supply = <®_dldo1>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
- status = "okay";
|
||||
-
|
||||
- panel@0 {
|
||||
- compatible = "xingbangda,xbd599";
|
||||
- reg = <0>;
|
||||
- reset-gpios = <&pio 3 23 GPIO_ACTIVE_LOW>; /* PD23 */
|
||||
- iovcc-supply = <®_dldo2>;
|
||||
- vcc-supply = <®_ldo_io0>;
|
||||
- backlight = <&backlight>;
|
||||
- };
|
||||
-};
|
||||
-
|
||||
&ehci0 {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -221,10 +188,6 @@ &r_pio {
|
||||
*/
|
||||
};
|
||||
|
||||
-&r_pwm {
|
||||
- status = "okay";
|
||||
-};
|
||||
-
|
||||
&r_rsb {
|
||||
status = "okay";
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,418 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Sun, 12 Jul 2020 13:41:56 +0100
|
||||
Subject: [PATCH] Revert "drm: panel: add Xingbangda XBD599 panel"
|
||||
|
||||
This reverts commit 5d53795bb19e39f048ac8028ec36ff04765e1237.
|
||||
---
|
||||
drivers/gpu/drm/panel/Kconfig | 9 -
|
||||
drivers/gpu/drm/panel/Makefile | 1 -
|
||||
.../gpu/drm/panel/panel-xingbangda-xbd599.c | 366 ------------------
|
||||
3 files changed, 376 deletions(-)
|
||||
delete mode 100644 drivers/gpu/drm/panel/panel-xingbangda-xbd599.c
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
|
||||
index 1f55a87bb657..39055c1f0e2f 100644
|
||||
--- a/drivers/gpu/drm/panel/Kconfig
|
||||
+++ b/drivers/gpu/drm/panel/Kconfig
|
||||
@@ -462,15 +462,6 @@ config DRM_PANEL_VISIONOX_RM69299
|
||||
Say Y here if you want to enable support for Visionox
|
||||
RM69299 DSI Video Mode panel.
|
||||
|
||||
-config DRM_PANEL_XINGBANGDA_XBD599
|
||||
- tristate "Xingbangda XBD599 panel"
|
||||
- depends on OF
|
||||
- depends on DRM_MIPI_DSI
|
||||
- depends on BACKLIGHT_CLASS_DEVICE
|
||||
- help
|
||||
- Say Y here if you want to enable support for the Xingbangda XBD599
|
||||
- MIPI DSI Video Mode panel.
|
||||
-
|
||||
config DRM_PANEL_XINPENG_XPP055C272
|
||||
tristate "Xinpeng XPP055C272 panel driver"
|
||||
depends on OF
|
||||
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
|
||||
index 7b6b0c0397d6..de74f282c433 100644
|
||||
--- a/drivers/gpu/drm/panel/Makefile
|
||||
+++ b/drivers/gpu/drm/panel/Makefile
|
||||
@@ -49,5 +49,4 @@ obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o
|
||||
obj-$(CONFIG_DRM_PANEL_TPO_TPG110) += panel-tpo-tpg110.o
|
||||
obj-$(CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA) += panel-truly-nt35597.o
|
||||
obj-$(CONFIG_DRM_PANEL_VISIONOX_RM69299) += panel-visionox-rm69299.o
|
||||
-obj-$(CONFIG_DRM_PANEL_XINGBANGDA_XBD599) += panel-xingbangda-xbd599.o
|
||||
obj-$(CONFIG_DRM_PANEL_XINPENG_XPP055C272) += panel-xinpeng-xpp055c272.o
|
||||
diff --git a/drivers/gpu/drm/panel/panel-xingbangda-xbd599.c b/drivers/gpu/drm/panel/panel-xingbangda-xbd599.c
|
||||
deleted file mode 100644
|
||||
index b483f96ee1db..000000000000
|
||||
--- a/drivers/gpu/drm/panel/panel-xingbangda-xbd599.c
|
||||
+++ /dev/null
|
||||
@@ -1,366 +0,0 @@
|
||||
-// SPDX-License-Identifier: GPL-2.0
|
||||
-/*
|
||||
- * Xingbangda XBD599 MIPI-DSI panel driver
|
||||
- *
|
||||
- * Copyright (C) 2019-2020 Icenowy Zheng <icenowy@aosc.io>
|
||||
- *
|
||||
- * Based on panel-rocktech-jh057n00900.c, which is:
|
||||
- * Copyright (C) Purism SPC 2019
|
||||
- */
|
||||
-
|
||||
-#include <linux/delay.h>
|
||||
-#include <linux/gpio/consumer.h>
|
||||
-#include <linux/mod_devicetable.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/of_device.h>
|
||||
-#include <linux/regulator/consumer.h>
|
||||
-
|
||||
-#include <drm/drm_mipi_dsi.h>
|
||||
-#include <drm/drm_modes.h>
|
||||
-#include <drm/drm_panel.h>
|
||||
-#include <drm/drm_print.h>
|
||||
-
|
||||
-/* Manufacturer specific Commands send via DSI */
|
||||
-#define ST7703_CMD_ALL_PIXEL_OFF 0x22
|
||||
-#define ST7703_CMD_ALL_PIXEL_ON 0x23
|
||||
-#define ST7703_CMD_SETDISP 0xB2
|
||||
-#define ST7703_CMD_SETRGBIF 0xB3
|
||||
-#define ST7703_CMD_SETCYC 0xB4
|
||||
-#define ST7703_CMD_SETBGP 0xB5
|
||||
-#define ST7703_CMD_SETVCOM 0xB6
|
||||
-#define ST7703_CMD_SETOTP 0xB7
|
||||
-#define ST7703_CMD_SETPOWER_EXT 0xB8
|
||||
-#define ST7703_CMD_SETEXTC 0xB9
|
||||
-#define ST7703_CMD_SETMIPI 0xBA
|
||||
-#define ST7703_CMD_SETVDC 0xBC
|
||||
-#define ST7703_CMD_SETSCR 0xC0
|
||||
-#define ST7703_CMD_SETPOWER 0xC1
|
||||
-#define ST7703_CMD_UNK_C6 0xC6
|
||||
-#define ST7703_CMD_SETPANEL 0xCC
|
||||
-#define ST7703_CMD_SETGAMMA 0xE0
|
||||
-#define ST7703_CMD_SETEQ 0xE3
|
||||
-#define ST7703_CMD_SETGIP1 0xE9
|
||||
-#define ST7703_CMD_SETGIP2 0xEA
|
||||
-
|
||||
-static const char * const regulator_names[] = {
|
||||
- "iovcc",
|
||||
- "vcc",
|
||||
-};
|
||||
-
|
||||
-struct xbd599 {
|
||||
- struct device *dev;
|
||||
- struct drm_panel panel;
|
||||
- struct gpio_desc *reset_gpio;
|
||||
- struct regulator_bulk_data supplies[ARRAY_SIZE(regulator_names)];
|
||||
- bool prepared;
|
||||
-};
|
||||
-
|
||||
-static inline struct xbd599 *panel_to_xbd599(struct drm_panel *panel)
|
||||
-{
|
||||
- return container_of(panel, struct xbd599, panel);
|
||||
-}
|
||||
-
|
||||
-#define dsi_dcs_write_seq(dsi, cmd, seq...) do { \
|
||||
- static const u8 d[] = { seq }; \
|
||||
- int ret; \
|
||||
- ret = mipi_dsi_dcs_write(dsi, cmd, d, ARRAY_SIZE(d)); \
|
||||
- if (ret < 0) \
|
||||
- return ret; \
|
||||
- } while (0)
|
||||
-
|
||||
-static int xbd599_init_sequence(struct xbd599 *ctx)
|
||||
-{
|
||||
- struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
- struct device *dev = ctx->dev;
|
||||
- int ret;
|
||||
-
|
||||
- /*
|
||||
- * Init sequence was supplied by the panel vendor.
|
||||
- */
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETEXTC,
|
||||
- 0xF1, 0x12, 0x83);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETMIPI,
|
||||
- 0x33, 0x81, 0x05, 0xF9, 0x0E, 0x0E, 0x20, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25,
|
||||
- 0x00, 0x91, 0x0a, 0x00, 0x00, 0x02, 0x4F, 0x11,
|
||||
- 0x00, 0x00, 0x37);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER_EXT,
|
||||
- 0x25, 0x22, 0x20, 0x03);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETRGBIF,
|
||||
- 0x10, 0x10, 0x05, 0x05, 0x03, 0xFF, 0x00, 0x00,
|
||||
- 0x00, 0x00);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETSCR,
|
||||
- 0x73, 0x73, 0x50, 0x50, 0x00, 0xC0, 0x08, 0x70,
|
||||
- 0x00);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETVDC, 0x4E);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0B);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETDISP, 0xF0, 0x12, 0xF0);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETEQ,
|
||||
- 0x00, 0x00, 0x0B, 0x0B, 0x10, 0x10, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0xFF, 0x00, 0xC0, 0x10);
|
||||
- dsi_dcs_write_seq(dsi, 0xC6, 0x01, 0x00, 0xFF, 0xFF, 0x00);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER,
|
||||
- 0x74, 0x00, 0x32, 0x32, 0x77, 0xF1, 0xFF, 0xFF,
|
||||
- 0xCC, 0xCC, 0x77, 0x77);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETBGP, 0x07, 0x07);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETVCOM, 0x2C, 0x2C);
|
||||
- dsi_dcs_write_seq(dsi, 0xBF, 0x02, 0x11, 0x00);
|
||||
-
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP1,
|
||||
- 0x82, 0x10, 0x06, 0x05, 0xA2, 0x0A, 0xA5, 0x12,
|
||||
- 0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
|
||||
- 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
|
||||
- 0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
|
||||
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
|
||||
- 0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
- 0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP2,
|
||||
- 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
|
||||
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
|
||||
- 0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
- 0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0A,
|
||||
- 0xA5, 0x00, 0x00, 0x00, 0x00);
|
||||
- dsi_dcs_write_seq(dsi, ST7703_CMD_SETGAMMA,
|
||||
- 0x00, 0x09, 0x0D, 0x23, 0x27, 0x3C, 0x41, 0x35,
|
||||
- 0x07, 0x0D, 0x0E, 0x12, 0x13, 0x10, 0x12, 0x12,
|
||||
- 0x18, 0x00, 0x09, 0x0D, 0x23, 0x27, 0x3C, 0x41,
|
||||
- 0x35, 0x07, 0x0D, 0x0E, 0x12, 0x13, 0x10, 0x12,
|
||||
- 0x12, 0x18);
|
||||
- msleep(20);
|
||||
-
|
||||
- ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(dev, "Failed to exit sleep mode\n");
|
||||
- return ret;
|
||||
- }
|
||||
- msleep(250);
|
||||
-
|
||||
- ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- msleep(50);
|
||||
-
|
||||
- DRM_DEV_DEBUG_DRIVER(dev, "Panel init sequence done\n");
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int xbd599_prepare(struct drm_panel *panel)
|
||||
-{
|
||||
- struct xbd599 *ctx = panel_to_xbd599(panel);
|
||||
- int ret;
|
||||
-
|
||||
- if (ctx->prepared)
|
||||
- return 0;
|
||||
-
|
||||
- ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- DRM_DEV_DEBUG_DRIVER(ctx->dev, "Resetting the panel\n");
|
||||
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
||||
- usleep_range(20, 40);
|
||||
- gpiod_set_value_cansleep(ctx->reset_gpio, 0);
|
||||
- msleep(20);
|
||||
-
|
||||
- ctx->prepared = true;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int xbd599_enable(struct drm_panel *panel)
|
||||
-{
|
||||
- struct xbd599 *ctx = panel_to_xbd599(panel);
|
||||
- int ret;
|
||||
-
|
||||
- ret = xbd599_init_sequence(ctx);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(ctx->dev, "Panel init sequence failed: %d\n",
|
||||
- ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int xbd599_disable(struct drm_panel *panel)
|
||||
-{
|
||||
- struct xbd599 *ctx = panel_to_xbd599(panel);
|
||||
- struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
-
|
||||
- return mipi_dsi_dcs_set_display_off(dsi);
|
||||
-}
|
||||
-
|
||||
-static int xbd599_unprepare(struct drm_panel *panel)
|
||||
-{
|
||||
- struct xbd599 *ctx = panel_to_xbd599(panel);
|
||||
-
|
||||
- if (!ctx->prepared)
|
||||
- return 0;
|
||||
-
|
||||
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
||||
- regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies);
|
||||
- ctx->prepared = false;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static const struct drm_display_mode xbd599_default_mode = {
|
||||
- .hdisplay = 720,
|
||||
- .hsync_start = 720 + 40,
|
||||
- .hsync_end = 720 + 40 + 40,
|
||||
- .htotal = 720 + 40 + 40 + 40,
|
||||
- .vdisplay = 1440,
|
||||
- .vsync_start = 1440 + 18,
|
||||
- .vsync_end = 1440 + 18 + 10,
|
||||
- .vtotal = 1440 + 18 + 10 + 17,
|
||||
- .vrefresh = 60,
|
||||
- .clock = 69000,
|
||||
- .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||
-
|
||||
- .width_mm = 68,
|
||||
- .height_mm = 136,
|
||||
- .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
|
||||
-};
|
||||
-
|
||||
-static int xbd599_get_modes(struct drm_panel *panel,
|
||||
- struct drm_connector *connector)
|
||||
-{
|
||||
- struct xbd599 *ctx = panel_to_xbd599(panel);
|
||||
- struct drm_display_mode *mode;
|
||||
-
|
||||
- mode = drm_mode_duplicate(connector->dev, &xbd599_default_mode);
|
||||
- if (!mode) {
|
||||
- DRM_DEV_ERROR(ctx->dev, "Failed to add mode\n");
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
- drm_mode_set_name(mode);
|
||||
-
|
||||
- mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
|
||||
- connector->display_info.width_mm = mode->width_mm;
|
||||
- connector->display_info.height_mm = mode->height_mm;
|
||||
- drm_mode_probed_add(connector, mode);
|
||||
-
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
-static const struct drm_panel_funcs xbd599_drm_funcs = {
|
||||
- .prepare = xbd599_prepare,
|
||||
- .enable = xbd599_enable,
|
||||
- .disable = xbd599_disable,
|
||||
- .unprepare = xbd599_unprepare,
|
||||
- .get_modes = xbd599_get_modes,
|
||||
-};
|
||||
-
|
||||
-static int xbd599_probe(struct mipi_dsi_device *dsi)
|
||||
-{
|
||||
- struct device *dev = &dsi->dev;
|
||||
- struct xbd599 *ctx;
|
||||
- int i, ret;
|
||||
-
|
||||
- ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
|
||||
- if (!ctx)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- for (i = 0; i < ARRAY_SIZE(ctx->supplies); i++)
|
||||
- ctx->supplies[i].supply = regulator_names[i];
|
||||
-
|
||||
- ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies),
|
||||
- ctx->supplies);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(&dsi->dev, "cannot get regulators\n");
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
|
||||
- if (IS_ERR(ctx->reset_gpio)) {
|
||||
- DRM_DEV_ERROR(dev, "cannot get reset gpio\n");
|
||||
- return PTR_ERR(ctx->reset_gpio);
|
||||
- }
|
||||
-
|
||||
- mipi_dsi_set_drvdata(dsi, ctx);
|
||||
-
|
||||
- ctx->dev = dev;
|
||||
-
|
||||
- dsi->lanes = 4;
|
||||
- dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
- dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
|
||||
-
|
||||
- drm_panel_init(&ctx->panel, &dsi->dev, &xbd599_drm_funcs,
|
||||
- DRM_MODE_CONNECTOR_DSI);
|
||||
-
|
||||
- ret = drm_panel_of_backlight(&ctx->panel);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- drm_panel_add(&ctx->panel);
|
||||
-
|
||||
- ret = mipi_dsi_attach(dsi);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(dev, "mipi_dsi_attach failed. Is host ready?\n");
|
||||
- drm_panel_remove(&ctx->panel);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- DRM_DEV_INFO(dev, "%ux%u@%u %ubpp dsi %udl - ready\n",
|
||||
- xbd599_default_mode.hdisplay,
|
||||
- xbd599_default_mode.vdisplay,
|
||||
- xbd599_default_mode.vrefresh,
|
||||
- mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static void xbd599_shutdown(struct mipi_dsi_device *dsi)
|
||||
-{
|
||||
- struct xbd599 *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
- int ret;
|
||||
-
|
||||
- ret = drm_panel_unprepare(&ctx->panel);
|
||||
- if (ret < 0)
|
||||
- DRM_DEV_ERROR(&dsi->dev, "Failed to unprepare panel: %d\n",
|
||||
- ret);
|
||||
-}
|
||||
-
|
||||
-static int xbd599_remove(struct mipi_dsi_device *dsi)
|
||||
-{
|
||||
- struct xbd599 *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
- int ret;
|
||||
-
|
||||
- xbd599_shutdown(dsi);
|
||||
-
|
||||
- ret = mipi_dsi_detach(dsi);
|
||||
- if (ret < 0)
|
||||
- DRM_DEV_ERROR(&dsi->dev, "Failed to detach from DSI host: %d\n",
|
||||
- ret);
|
||||
-
|
||||
- drm_panel_remove(&ctx->panel);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static const struct of_device_id xbd599_of_match[] = {
|
||||
- { .compatible = "xingbangda,xbd599", },
|
||||
- { /* sentinel */ }
|
||||
-};
|
||||
-MODULE_DEVICE_TABLE(of, xbd599_of_match);
|
||||
-
|
||||
-static struct mipi_dsi_driver xbd599_driver = {
|
||||
- .probe = xbd599_probe,
|
||||
- .remove = xbd599_remove,
|
||||
- .shutdown = xbd599_shutdown,
|
||||
- .driver = {
|
||||
- .name = "panel-xingbangda-xbd599",
|
||||
- .of_match_table = xbd599_of_match,
|
||||
- },
|
||||
-};
|
||||
-module_mipi_dsi_driver(xbd599_driver);
|
||||
-
|
||||
-MODULE_AUTHOR("Icenowy Zheng <icenowy@aosc.io>");
|
||||
-MODULE_DESCRIPTION("DRM driver for Xingbangda XBD599 MIPI DSI panel");
|
||||
-MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Sun, 12 Jul 2020 13:42:04 +0100
|
||||
Subject: [PATCH] Revert "drm/sun4i: sun6i_mipi_dsi: fix horizontal timing
|
||||
calculation"
|
||||
|
||||
This reverts commit d20a2ac9c6ecf514e115f06b6744b584bbc7c1b8.
|
||||
---
|
||||
drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
|
||||
index 52e009dc632b..aa67cb037e9d 100644
|
||||
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
|
||||
@@ -556,7 +556,7 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi,
|
||||
*/
|
||||
#define HSA_PACKET_OVERHEAD 10
|
||||
hsa = max((unsigned int)HSA_PACKET_OVERHEAD,
|
||||
- (mode->hsync_end - mode->hsync_start) * Bpp) - HSA_PACKET_OVERHEAD;
|
||||
+ (mode->hsync_end - mode->hsync_start) * Bpp - HSA_PACKET_OVERHEAD);
|
||||
|
||||
/*
|
||||
* The backporch is set using a blanking packet (4
|
||||
@@ -565,7 +565,7 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi,
|
||||
*/
|
||||
#define HBP_PACKET_OVERHEAD 6
|
||||
hbp = max((unsigned int)HBP_PACKET_OVERHEAD,
|
||||
- (mode->htotal - mode->hsync_end) * Bpp) - HBP_PACKET_OVERHEAD;
|
||||
+ (mode->htotal - mode->hsync_end) * Bpp - HBP_PACKET_OVERHEAD);
|
||||
|
||||
/*
|
||||
* The frontporch is set using a sync event (4 bytes)
|
||||
@@ -575,7 +575,7 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi,
|
||||
*/
|
||||
#define HFP_PACKET_OVERHEAD 16
|
||||
hfp = max((unsigned int)HFP_PACKET_OVERHEAD,
|
||||
- (mode->hsync_start - mode->hdisplay) * Bpp) - HFP_PACKET_OVERHEAD;
|
||||
+ (mode->hsync_start - mode->hdisplay) * Bpp - HFP_PACKET_OVERHEAD);
|
||||
|
||||
/*
|
||||
* The blanking is set using a sync event (4 bytes)
|
||||
@@ -584,8 +584,8 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi,
|
||||
*/
|
||||
#define HBLK_PACKET_OVERHEAD 10
|
||||
hblk = max((unsigned int)HBLK_PACKET_OVERHEAD,
|
||||
- (mode->htotal - (mode->hsync_end - mode->hsync_start)) * Bpp) -
|
||||
- HBLK_PACKET_OVERHEAD;
|
||||
+ (mode->htotal - (mode->hsync_end - mode->hsync_start)) * Bpp -
|
||||
+ HBLK_PACKET_OVERHEAD);
|
||||
|
||||
/*
|
||||
* And I'm not entirely sure what vblk is about. The driver in
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Sun, 12 Jul 2020 13:41:49 +0100
|
||||
Subject: [PATCH] Revert "dt-bindings: panel: add binding for Xingbangda XBD599
|
||||
panel"
|
||||
|
||||
This reverts commit 8a717270db2000ff734d89e9448b32fbc038c49a.
|
||||
---
|
||||
.../display/panel/xingbangda,xbd599.yaml | 50 -------------------
|
||||
1 file changed, 50 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml b/Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml
|
||||
deleted file mode 100644
|
||||
index b27bcf11198f..000000000000
|
||||
--- a/Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml
|
||||
+++ /dev/null
|
||||
@@ -1,50 +0,0 @@
|
||||
-# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
-%YAML 1.2
|
||||
----
|
||||
-$id: http://devicetree.org/schemas/display/panel/xingbangda,xbd599.yaml#
|
||||
-$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
-
|
||||
-title: Xingbangda XBD599 5.99in MIPI-DSI LCD panel
|
||||
-
|
||||
-maintainers:
|
||||
- - Icenowy Zheng <icenowy@aosc.io>
|
||||
-
|
||||
-allOf:
|
||||
- - $ref: panel-common.yaml#
|
||||
-
|
||||
-properties:
|
||||
- compatible:
|
||||
- const: xingbangda,xbd599
|
||||
- reg: true
|
||||
- backlight: true
|
||||
- reset-gpios: true
|
||||
- vcc-supply:
|
||||
- description: regulator that supplies the VCC voltage
|
||||
- iovcc-supply:
|
||||
- description: regulator that supplies the IOVCC voltage
|
||||
-
|
||||
-required:
|
||||
- - compatible
|
||||
- - reg
|
||||
- - backlight
|
||||
- - vcc-supply
|
||||
- - iovcc-supply
|
||||
-
|
||||
-additionalProperties: false
|
||||
-
|
||||
-examples:
|
||||
- - |
|
||||
- dsi {
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- panel@0 {
|
||||
- compatible = "xingbangda,xbd599";
|
||||
- reg = <0>;
|
||||
- backlight = <&backlight>;
|
||||
- iovcc-supply = <®_dldo2>;
|
||||
- vcc-supply = <®_ldo_io0>;
|
||||
- };
|
||||
- };
|
||||
-
|
||||
-...
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -36,7 +36,7 @@ Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|||
1 file changed, 24 insertions(+)
|
||||
|
||||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
||||
index 2ea61abd5830..abb314891f5b 100644
|
||||
index bdf9b52567e0..1e98e20b7cc2 100644
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -4196,6 +4196,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9000,
|
||||
|
@ -71,5 +71,5 @@ index 2ea61abd5830..abb314891f5b 100644
|
|||
* Intersil/Techwell TW686[4589]-based video capture cards have an empty (zero)
|
||||
* class code. Fix it.
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
From 90750a5b1205a7dcc002224738585b861779cdae Mon Sep 17 00:00:00 2001
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Justin M. Forbes" <jforbes@fedoraproject.org>
|
||||
Date: Thu, 30 Jul 2020 10:26:11 -0500
|
||||
Subject: [PATCH] Work around for gcc bug
|
||||
|
@ -25,5 +25,5 @@ index 2a660ac1bc3a..fa87ff6a2a71 100644
|
|||
int i;
|
||||
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -28,10 +28,10 @@ Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
|
||||
index 8777faced51a..2e60d792005f 100644
|
||||
index 2142f1554761..f5fdf6f3650c 100644
|
||||
--- a/drivers/acpi/scan.c
|
||||
+++ b/drivers/acpi/scan.c
|
||||
@@ -1572,6 +1572,15 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
|
||||
@@ -1574,6 +1574,15 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
|
||||
if (!acpi_match_device_ids(device, i2c_multi_instantiate_ids))
|
||||
return false;
|
||||
|
||||
|
@ -48,5 +48,5 @@ index 8777faced51a..2e60d792005f 100644
|
|||
acpi_dev_get_resources(device, &resource_list,
|
||||
acpi_check_serial_bus_slave,
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -85,5 +85,5 @@ index ea5bf5f4cbed..71c55cae27ac 100644
|
|||
tmp = ata_wait_register(ap, port_mmio + PORT_CMD,
|
||||
PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500);
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ Signed-off-by: Jeremy Cline <jcline@redhat.com>
|
|||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
|
||||
index 66dc41fd49f2..2e0700a451e5 100644
|
||||
index e11b4ea06127..74c5325108c0 100644
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -861,7 +861,7 @@ endchoice
|
||||
|
@ -34,5 +34,5 @@ index 66dc41fd49f2..2e0700a451e5 100644
|
|||
For systems with 52-bit userspace VAs enabled, the kernel will attempt
|
||||
to maintain compatibility with older software by providing 48-bit VAs
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -11,10 +11,10 @@ Signed-off-by: Jon Masters <jcm@redhat.com>
|
|||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
|
||||
index 2ac74904a3ce..f0094424f76a 100644
|
||||
index e00d94b16658..4db48405b23a 100644
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -1549,9 +1549,9 @@ config HIGHMEM
|
||||
@@ -1514,9 +1514,9 @@ config HIGHMEM
|
||||
If unsure, say n.
|
||||
|
||||
config HIGHPTE
|
||||
|
@ -27,5 +27,5 @@ index 2ac74904a3ce..f0094424f76a 100644
|
|||
The VM uses one page of physical memory for each page table.
|
||||
For systems with a lot of processes, this can use a lot of
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,81 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Icenowy Zheng <icenowy@aosc.io>
|
||||
Date: Mon, 16 Mar 2020 21:35:03 +0800
|
||||
Subject: [PATCH] arm64: allwinner: dts: a64: add LCD-related device nodes for
|
||||
PinePhone
|
||||
|
||||
PinePhone uses PWM backlight and a XBD599 LCD panel over DSI for
|
||||
display.
|
||||
|
||||
Add its device nodes.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
---
|
||||
.../dts/allwinner/sun50i-a64-pinephone.dtsi | 37 +++++++++++++++++++
|
||||
1 file changed, 37 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
index cefda145c3c9..96d9150423e0 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
@@ -16,6 +16,15 @@ aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
+ backlight: backlight {
|
||||
+ compatible = "pwm-backlight";
|
||||
+ pwms = <&r_pwm 0 50000 PWM_POLARITY_INVERTED>;
|
||||
+ brightness-levels = <0 16 18 20 22 24 26 29 32 35 38 42 46 51 56 62 68 75 83 91 100>;
|
||||
+ default-brightness-level = <15>;
|
||||
+ enable-gpios = <&pio 7 10 GPIO_ACTIVE_HIGH>; /* PH10 */
|
||||
+ power-supply = <®_ldo_io0>;
|
||||
+ };
|
||||
+
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
@@ -84,6 +93,30 @@ &dai {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&de {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&dphy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&dsi {
|
||||
+ vcc-dsi-supply = <®_dldo1>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ panel@0 {
|
||||
+ compatible = "xingbangda,xbd599";
|
||||
+ reg = <0>;
|
||||
+ reset-gpios = <&pio 3 23 GPIO_ACTIVE_LOW>; /* PD23 */
|
||||
+ iovcc-supply = <®_dldo2>;
|
||||
+ vcc-supply = <®_ldo_io0>;
|
||||
+ backlight = <&backlight>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&ehci0 {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -188,6 +221,10 @@ &r_pio {
|
||||
*/
|
||||
};
|
||||
|
||||
+&r_pwm {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&r_rsb {
|
||||
status = "okay";
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:56:01 +0200
|
||||
Subject: [PATCH] arm64: dts: sun50i-a64-pinephone: Add touchscreen support
|
||||
|
||||
Pinephone has a Goodix GT917S capacitive touchscreen controller on
|
||||
I2C0 bus. Add support for it.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
.../dts/allwinner/sun50i-a64-pinephone.dtsi | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
index 85a7aa5efd32..2d5694446d17 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
@@ -123,6 +123,25 @@ &ehci1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&i2c0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c0_pins>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ touchscreen@5d {
|
||||
+ compatible = "goodix,gt917s", "goodix,gt911";
|
||||
+ reg = <0x5d>;
|
||||
+ interrupt-parent = <&pio>;
|
||||
+ interrupts = <7 4 IRQ_TYPE_LEVEL_HIGH>; /* PH4 */
|
||||
+ irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
|
||||
+ reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
|
||||
+ AVDD28-supply = <®_ldo_io0>;
|
||||
+ VDDIO-supply = <®_ldo_io0>;
|
||||
+ touchscreen-size-x = <720>;
|
||||
+ touchscreen-size-y = <1440>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&i2c1 {
|
||||
status = "okay";
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Icenowy Zheng <icenowy@aosc.io>
|
||||
Date: Fri, 26 Jun 2020 02:56:00 +0200
|
||||
Subject: [PATCH] arm64: dts: sun50i-a64-pinephone: Enable LCD support on
|
||||
PinePhone
|
||||
|
||||
PinePhone uses PWM backlight and a XBD599 LCD panel over DSI for
|
||||
display.
|
||||
|
||||
Backlight levels curve was optimized by Martijn Braam using a
|
||||
lux meter.
|
||||
|
||||
Add its device nodes.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
Signed-off-by: Martijn Braam <martijn@brixit.nl>
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
.../allwinner/sun50i-a64-pinephone-1.1.dts | 19 ++++++++++
|
||||
.../dts/allwinner/sun50i-a64-pinephone.dtsi | 35 +++++++++++++++++++
|
||||
2 files changed, 54 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.1.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.1.dts
|
||||
index 06a775c41664..3e99a87e9ce5 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.1.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone-1.1.dts
|
||||
@@ -9,3 +9,22 @@ / {
|
||||
model = "Pine64 PinePhone Braveheart (1.1)";
|
||||
compatible = "pine64,pinephone-1.1", "allwinner,sun50i-a64";
|
||||
};
|
||||
+
|
||||
+&backlight {
|
||||
+ power-supply = <®_ldo_io0>;
|
||||
+ /*
|
||||
+ * PWM backlight circuit on this PinePhone revision was changed since
|
||||
+ * 1.0, and the lowest PWM duty cycle that doesn't lead to backlight
|
||||
+ * being off is around 20%. Duty cycle for the lowest brightness level
|
||||
+ * also varries quite a bit between individual boards, so the lowest
|
||||
+ * value here was chosen as a safe default.
|
||||
+ */
|
||||
+ brightness-levels = <
|
||||
+ 774 793 814 842
|
||||
+ 882 935 1003 1088
|
||||
+ 1192 1316 1462 1633
|
||||
+ 1830 2054 2309 2596
|
||||
+ 2916 3271 3664 4096>;
|
||||
+ num-interpolated-steps = <50>;
|
||||
+ default-brightness-level = <400>;
|
||||
+};
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
index cefda145c3c9..85a7aa5efd32 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi
|
||||
@@ -16,6 +16,13 @@ aliases {
|
||||
serial0 = &uart0;
|
||||
};
|
||||
|
||||
+ backlight: backlight {
|
||||
+ compatible = "pwm-backlight";
|
||||
+ pwms = <&r_pwm 0 50000 PWM_POLARITY_INVERTED>;
|
||||
+ enable-gpios = <&pio 7 10 GPIO_ACTIVE_HIGH>; /* PH10 */
|
||||
+ /* Backlight configuration differs per PinePhone revision. */
|
||||
+ };
|
||||
+
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
@@ -84,6 +91,30 @@ &dai {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&de {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&dphy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&dsi {
|
||||
+ vcc-dsi-supply = <®_dldo1>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ panel@0 {
|
||||
+ compatible = "xingbangda,xbd599";
|
||||
+ reg = <0>;
|
||||
+ reset-gpios = <&pio 3 23 GPIO_ACTIVE_LOW>; /* PD23 */
|
||||
+ iovcc-supply = <®_dldo2>;
|
||||
+ vcc-supply = <®_ldo_io0>;
|
||||
+ backlight = <&backlight>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&ehci0 {
|
||||
status = "okay";
|
||||
};
|
||||
@@ -188,6 +219,10 @@ &r_pio {
|
||||
*/
|
||||
};
|
||||
|
||||
+&r_pwm {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&r_rsb {
|
||||
status = "okay";
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -17,7 +17,7 @@ Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
|||
create mode 100644 drivers/gpu/drm/panel/panel-xingbangda-xbd599.c
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
|
||||
index 39055c1f0e2f..1f55a87bb657 100644
|
||||
index de2f2a452be5..3ce658de416b 100644
|
||||
--- a/drivers/gpu/drm/panel/Kconfig
|
||||
+++ b/drivers/gpu/drm/panel/Kconfig
|
||||
@@ -462,6 +462,15 @@ config DRM_PANEL_VISIONOX_RM69299
|
||||
|
@ -37,7 +37,7 @@ index 39055c1f0e2f..1f55a87bb657 100644
|
|||
tristate "Xinpeng XPP055C272 panel driver"
|
||||
depends on OF
|
||||
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
|
||||
index de74f282c433..7b6b0c0397d6 100644
|
||||
index e45ceac6286f..bd10617430ec 100644
|
||||
--- a/drivers/gpu/drm/panel/Makefile
|
||||
+++ b/drivers/gpu/drm/panel/Makefile
|
||||
@@ -49,4 +49,5 @@ obj-$(CONFIG_DRM_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o
|
||||
|
@ -419,5 +419,5 @@ index 000000000000..b483f96ee1db
|
|||
+MODULE_DESCRIPTION("DRM driver for Xingbangda XBD599 MIPI DSI panel");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,948 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:52 +0200
|
||||
Subject: [PATCH] drm/panel: rocktech-jh057n00900: Rename the driver to st7703
|
||||
|
||||
This rename is done so that the driver matches the name of the
|
||||
display controller and in preparation for adding support for more
|
||||
panels to the driver.
|
||||
|
||||
This is just a basic file rename, with no code changes.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/Kconfig | 26 +-
|
||||
drivers/gpu/drm/panel/Makefile | 2 +-
|
||||
.../drm/panel/panel-rocktech-jh057n00900.c | 424 ------------------
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 424 ++++++++++++++++++
|
||||
4 files changed, 438 insertions(+), 438 deletions(-)
|
||||
delete mode 100644 drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
|
||||
create mode 100644 drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig
|
||||
index 39055c1f0e2f..de2f2a452be5 100644
|
||||
--- a/drivers/gpu/drm/panel/Kconfig
|
||||
+++ b/drivers/gpu/drm/panel/Kconfig
|
||||
@@ -283,19 +283,6 @@ config DRM_PANEL_RAYDIUM_RM68200
|
||||
Say Y here if you want to enable support for Raydium RM68200
|
||||
720x1280 DSI video mode panel.
|
||||
|
||||
-config DRM_PANEL_ROCKTECH_JH057N00900
|
||||
- tristate "Rocktech JH057N00900 MIPI touchscreen panel"
|
||||
- depends on OF
|
||||
- depends on DRM_MIPI_DSI
|
||||
- depends on BACKLIGHT_CLASS_DEVICE
|
||||
- help
|
||||
- Say Y here if you want to enable support for Rocktech JH057N00900
|
||||
- MIPI DSI panel as e.g. used in the Librem 5 devkit. It has a
|
||||
- resolution of 720x1440 pixels, a built in backlight and touch
|
||||
- controller.
|
||||
- Touch input support is provided by the goodix driver and needs to be
|
||||
- selected separately.
|
||||
-
|
||||
config DRM_PANEL_RONBO_RB070D30
|
||||
tristate "Ronbo Electronics RB070D30 panel"
|
||||
depends on OF
|
||||
@@ -395,6 +382,19 @@ config DRM_PANEL_SITRONIX_ST7701
|
||||
ST7701 controller for 480X864 LCD panels with MIPI/RGB/SPI
|
||||
system interfaces.
|
||||
|
||||
+config DRM_PANEL_SITRONIX_ST7703
|
||||
+ tristate "Sitronix ST7703 based MIPI touchscreen panels"
|
||||
+ depends on OF
|
||||
+ depends on DRM_MIPI_DSI
|
||||
+ depends on BACKLIGHT_CLASS_DEVICE
|
||||
+ help
|
||||
+ Say Y here if you want to enable support for Sitronix ST7703 based
|
||||
+ panels, souch as Rocktech JH057N00900 MIPI DSI panel as e.g. used in
|
||||
+ the Librem 5 devkit. It has a resolution of 720x1440 pixels, a built
|
||||
+ in backlight and touch controller.
|
||||
+ Touch input support is provided by the goodix driver and needs to be
|
||||
+ selected separately.
|
||||
+
|
||||
config DRM_PANEL_SITRONIX_ST7789V
|
||||
tristate "Sitronix ST7789V panel"
|
||||
depends on OF && SPI
|
||||
diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile
|
||||
index de74f282c433..e45ceac6286f 100644
|
||||
--- a/drivers/gpu/drm/panel/Makefile
|
||||
+++ b/drivers/gpu/drm/panel/Makefile
|
||||
@@ -27,7 +27,6 @@ obj-$(CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00) += panel-panasonic-vvx10f034n00.o
|
||||
obj-$(CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN) += panel-raspberrypi-touchscreen.o
|
||||
obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM67191) += panel-raydium-rm67191.o
|
||||
obj-$(CONFIG_DRM_PANEL_RAYDIUM_RM68200) += panel-raydium-rm68200.o
|
||||
-obj-$(CONFIG_DRM_PANEL_ROCKTECH_JH057N00900) += panel-rocktech-jh057n00900.o
|
||||
obj-$(CONFIG_DRM_PANEL_RONBO_RB070D30) += panel-ronbo-rb070d30.o
|
||||
obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o
|
||||
obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6D16D0) += panel-samsung-s6d16d0.o
|
||||
@@ -41,6 +40,7 @@ obj-$(CONFIG_DRM_PANEL_SHARP_LQ101R1SX01) += panel-sharp-lq101r1sx01.o
|
||||
obj-$(CONFIG_DRM_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o
|
||||
obj-$(CONFIG_DRM_PANEL_SHARP_LS043T1LE01) += panel-sharp-ls043t1le01.o
|
||||
obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7701) += panel-sitronix-st7701.o
|
||||
+obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7703) += panel-sitronix-st7703.o
|
||||
obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7789V) += panel-sitronix-st7789v.o
|
||||
obj-$(CONFIG_DRM_PANEL_SONY_ACX424AKP) += panel-sony-acx424akp.o
|
||||
obj-$(CONFIG_DRM_PANEL_SONY_ACX565AKM) += panel-sony-acx565akm.o
|
||||
diff --git a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c b/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
|
||||
deleted file mode 100644
|
||||
index 38ff742bc120..000000000000
|
||||
--- a/drivers/gpu/drm/panel/panel-rocktech-jh057n00900.c
|
||||
+++ /dev/null
|
||||
@@ -1,424 +0,0 @@
|
||||
-// SPDX-License-Identifier: GPL-2.0
|
||||
-/*
|
||||
- * Rockteck jh057n00900 5.5" MIPI-DSI panel driver
|
||||
- *
|
||||
- * Copyright (C) Purism SPC 2019
|
||||
- */
|
||||
-
|
||||
-#include <linux/debugfs.h>
|
||||
-#include <linux/delay.h>
|
||||
-#include <linux/gpio/consumer.h>
|
||||
-#include <linux/media-bus-format.h>
|
||||
-#include <linux/mod_devicetable.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/regulator/consumer.h>
|
||||
-
|
||||
-#include <video/display_timing.h>
|
||||
-#include <video/mipi_display.h>
|
||||
-
|
||||
-#include <drm/drm_mipi_dsi.h>
|
||||
-#include <drm/drm_modes.h>
|
||||
-#include <drm/drm_panel.h>
|
||||
-#include <drm/drm_print.h>
|
||||
-
|
||||
-#define DRV_NAME "panel-rocktech-jh057n00900"
|
||||
-
|
||||
-/* Manufacturer specific Commands send via DSI */
|
||||
-#define ST7703_CMD_ALL_PIXEL_OFF 0x22
|
||||
-#define ST7703_CMD_ALL_PIXEL_ON 0x23
|
||||
-#define ST7703_CMD_SETDISP 0xB2
|
||||
-#define ST7703_CMD_SETRGBIF 0xB3
|
||||
-#define ST7703_CMD_SETCYC 0xB4
|
||||
-#define ST7703_CMD_SETBGP 0xB5
|
||||
-#define ST7703_CMD_SETVCOM 0xB6
|
||||
-#define ST7703_CMD_SETOTP 0xB7
|
||||
-#define ST7703_CMD_SETPOWER_EXT 0xB8
|
||||
-#define ST7703_CMD_SETEXTC 0xB9
|
||||
-#define ST7703_CMD_SETMIPI 0xBA
|
||||
-#define ST7703_CMD_SETVDC 0xBC
|
||||
-#define ST7703_CMD_UNKNOWN0 0xBF
|
||||
-#define ST7703_CMD_SETSCR 0xC0
|
||||
-#define ST7703_CMD_SETPOWER 0xC1
|
||||
-#define ST7703_CMD_SETPANEL 0xCC
|
||||
-#define ST7703_CMD_SETGAMMA 0xE0
|
||||
-#define ST7703_CMD_SETEQ 0xE3
|
||||
-#define ST7703_CMD_SETGIP1 0xE9
|
||||
-#define ST7703_CMD_SETGIP2 0xEA
|
||||
-
|
||||
-struct jh057n {
|
||||
- struct device *dev;
|
||||
- struct drm_panel panel;
|
||||
- struct gpio_desc *reset_gpio;
|
||||
- struct regulator *vcc;
|
||||
- struct regulator *iovcc;
|
||||
- bool prepared;
|
||||
-
|
||||
- struct dentry *debugfs;
|
||||
-};
|
||||
-
|
||||
-static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
|
||||
-{
|
||||
- return container_of(panel, struct jh057n, panel);
|
||||
-}
|
||||
-
|
||||
-#define dsi_generic_write_seq(dsi, seq...) do { \
|
||||
- static const u8 d[] = { seq }; \
|
||||
- int ret; \
|
||||
- ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \
|
||||
- if (ret < 0) \
|
||||
- return ret; \
|
||||
- } while (0)
|
||||
-
|
||||
-static int jh057n_init_sequence(struct jh057n *ctx)
|
||||
-{
|
||||
- struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
- struct device *dev = ctx->dev;
|
||||
- int ret;
|
||||
-
|
||||
- /*
|
||||
- * Init sequence was supplied by the panel vendor. Most of the commands
|
||||
- * resemble the ST7703 but the number of parameters often don't match
|
||||
- * so it's likely a clone.
|
||||
- */
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETEXTC,
|
||||
- 0xF1, 0x12, 0x83);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETRGBIF,
|
||||
- 0x10, 0x10, 0x05, 0x05, 0x03, 0xFF, 0x00, 0x00,
|
||||
- 0x00, 0x00);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETSCR,
|
||||
- 0x73, 0x73, 0x50, 0x50, 0x00, 0x00, 0x08, 0x70,
|
||||
- 0x00);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETVDC, 0x4E);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0B);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETDISP, 0xF0, 0x12, 0x30);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETEQ,
|
||||
- 0x07, 0x07, 0x0B, 0x0B, 0x03, 0x0B, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0xFF, 0x00, 0xC0, 0x10);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETBGP, 0x08, 0x08);
|
||||
- msleep(20);
|
||||
-
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETVCOM, 0x3F, 0x3F);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN0, 0x02, 0x11, 0x00);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP1,
|
||||
- 0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
|
||||
- 0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
|
||||
- 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
|
||||
- 0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
|
||||
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
|
||||
- 0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
- 0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP2,
|
||||
- 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
|
||||
- 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
|
||||
- 0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
- 0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0A,
|
||||
- 0xA5, 0x00, 0x00, 0x00, 0x00);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_SETGAMMA,
|
||||
- 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41, 0x37,
|
||||
- 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10, 0x11,
|
||||
- 0x18, 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41,
|
||||
- 0x37, 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10,
|
||||
- 0x11, 0x18);
|
||||
- msleep(20);
|
||||
-
|
||||
- ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(dev, "Failed to exit sleep mode: %d\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
- /* Panel is operational 120 msec after reset */
|
||||
- msleep(60);
|
||||
- ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- DRM_DEV_DEBUG_DRIVER(dev, "Panel init sequence done\n");
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int jh057n_enable(struct drm_panel *panel)
|
||||
-{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
- int ret;
|
||||
-
|
||||
- ret = jh057n_init_sequence(ctx);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(ctx->dev, "Panel init sequence failed: %d\n",
|
||||
- ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int jh057n_disable(struct drm_panel *panel)
|
||||
-{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
- struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
-
|
||||
- return mipi_dsi_dcs_set_display_off(dsi);
|
||||
-}
|
||||
-
|
||||
-static int jh057n_unprepare(struct drm_panel *panel)
|
||||
-{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
-
|
||||
- if (!ctx->prepared)
|
||||
- return 0;
|
||||
-
|
||||
- regulator_disable(ctx->iovcc);
|
||||
- regulator_disable(ctx->vcc);
|
||||
- ctx->prepared = false;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static int jh057n_prepare(struct drm_panel *panel)
|
||||
-{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
- int ret;
|
||||
-
|
||||
- if (ctx->prepared)
|
||||
- return 0;
|
||||
-
|
||||
- DRM_DEV_DEBUG_DRIVER(ctx->dev, "Resetting the panel\n");
|
||||
- ret = regulator_enable(ctx->vcc);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(ctx->dev,
|
||||
- "Failed to enable vcc supply: %d\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
- ret = regulator_enable(ctx->iovcc);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(ctx->dev,
|
||||
- "Failed to enable iovcc supply: %d\n", ret);
|
||||
- goto disable_vcc;
|
||||
- }
|
||||
-
|
||||
- gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
||||
- usleep_range(20, 40);
|
||||
- gpiod_set_value_cansleep(ctx->reset_gpio, 0);
|
||||
- msleep(20);
|
||||
-
|
||||
- ctx->prepared = true;
|
||||
-
|
||||
- return 0;
|
||||
-
|
||||
-disable_vcc:
|
||||
- regulator_disable(ctx->vcc);
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-static const struct drm_display_mode default_mode = {
|
||||
- .hdisplay = 720,
|
||||
- .hsync_start = 720 + 90,
|
||||
- .hsync_end = 720 + 90 + 20,
|
||||
- .htotal = 720 + 90 + 20 + 20,
|
||||
- .vdisplay = 1440,
|
||||
- .vsync_start = 1440 + 20,
|
||||
- .vsync_end = 1440 + 20 + 4,
|
||||
- .vtotal = 1440 + 20 + 4 + 12,
|
||||
- .vrefresh = 60,
|
||||
- .clock = 75276,
|
||||
- .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||
- .width_mm = 65,
|
||||
- .height_mm = 130,
|
||||
-};
|
||||
-
|
||||
-static int jh057n_get_modes(struct drm_panel *panel,
|
||||
- struct drm_connector *connector)
|
||||
-{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
- struct drm_display_mode *mode;
|
||||
-
|
||||
- mode = drm_mode_duplicate(connector->dev, &default_mode);
|
||||
- if (!mode) {
|
||||
- DRM_DEV_ERROR(ctx->dev, "Failed to add mode %ux%u@%u\n",
|
||||
- default_mode.hdisplay, default_mode.vdisplay,
|
||||
- default_mode.vrefresh);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
- drm_mode_set_name(mode);
|
||||
-
|
||||
- mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
|
||||
- connector->display_info.width_mm = mode->width_mm;
|
||||
- connector->display_info.height_mm = mode->height_mm;
|
||||
- drm_mode_probed_add(connector, mode);
|
||||
-
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
-static const struct drm_panel_funcs jh057n_drm_funcs = {
|
||||
- .disable = jh057n_disable,
|
||||
- .unprepare = jh057n_unprepare,
|
||||
- .prepare = jh057n_prepare,
|
||||
- .enable = jh057n_enable,
|
||||
- .get_modes = jh057n_get_modes,
|
||||
-};
|
||||
-
|
||||
-static int allpixelson_set(void *data, u64 val)
|
||||
-{
|
||||
- struct jh057n *ctx = data;
|
||||
- struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
-
|
||||
- DRM_DEV_DEBUG_DRIVER(ctx->dev, "Setting all pixels on\n");
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_ALL_PIXEL_ON);
|
||||
- msleep(val * 1000);
|
||||
- /* Reset the panel to get video back */
|
||||
- drm_panel_disable(&ctx->panel);
|
||||
- drm_panel_unprepare(&ctx->panel);
|
||||
- drm_panel_prepare(&ctx->panel);
|
||||
- drm_panel_enable(&ctx->panel);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-DEFINE_SIMPLE_ATTRIBUTE(allpixelson_fops, NULL,
|
||||
- allpixelson_set, "%llu\n");
|
||||
-
|
||||
-static void jh057n_debugfs_init(struct jh057n *ctx)
|
||||
-{
|
||||
- ctx->debugfs = debugfs_create_dir(DRV_NAME, NULL);
|
||||
-
|
||||
- debugfs_create_file("allpixelson", 0600, ctx->debugfs, ctx,
|
||||
- &allpixelson_fops);
|
||||
-}
|
||||
-
|
||||
-static void jh057n_debugfs_remove(struct jh057n *ctx)
|
||||
-{
|
||||
- debugfs_remove_recursive(ctx->debugfs);
|
||||
- ctx->debugfs = NULL;
|
||||
-}
|
||||
-
|
||||
-static int jh057n_probe(struct mipi_dsi_device *dsi)
|
||||
-{
|
||||
- struct device *dev = &dsi->dev;
|
||||
- struct jh057n *ctx;
|
||||
- int ret;
|
||||
-
|
||||
- ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
|
||||
- if (!ctx)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
|
||||
- if (IS_ERR(ctx->reset_gpio)) {
|
||||
- DRM_DEV_ERROR(dev, "cannot get reset gpio\n");
|
||||
- return PTR_ERR(ctx->reset_gpio);
|
||||
- }
|
||||
-
|
||||
- mipi_dsi_set_drvdata(dsi, ctx);
|
||||
-
|
||||
- ctx->dev = dev;
|
||||
-
|
||||
- dsi->lanes = 4;
|
||||
- dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
- dsi->mode_flags = MIPI_DSI_MODE_VIDEO |
|
||||
- MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
|
||||
-
|
||||
- ctx->vcc = devm_regulator_get(dev, "vcc");
|
||||
- if (IS_ERR(ctx->vcc)) {
|
||||
- ret = PTR_ERR(ctx->vcc);
|
||||
- if (ret != -EPROBE_DEFER)
|
||||
- DRM_DEV_ERROR(dev,
|
||||
- "Failed to request vcc regulator: %d\n",
|
||||
- ret);
|
||||
- return ret;
|
||||
- }
|
||||
- ctx->iovcc = devm_regulator_get(dev, "iovcc");
|
||||
- if (IS_ERR(ctx->iovcc)) {
|
||||
- ret = PTR_ERR(ctx->iovcc);
|
||||
- if (ret != -EPROBE_DEFER)
|
||||
- DRM_DEV_ERROR(dev,
|
||||
- "Failed to request iovcc regulator: %d\n",
|
||||
- ret);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
|
||||
- DRM_MODE_CONNECTOR_DSI);
|
||||
-
|
||||
- ret = drm_panel_of_backlight(&ctx->panel);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- drm_panel_add(&ctx->panel);
|
||||
-
|
||||
- ret = mipi_dsi_attach(dsi);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(dev,
|
||||
- "mipi_dsi_attach failed (%d). Is host ready?\n",
|
||||
- ret);
|
||||
- drm_panel_remove(&ctx->panel);
|
||||
- return ret;
|
||||
- }
|
||||
-
|
||||
- DRM_DEV_INFO(dev, "%ux%u@%u %ubpp dsi %udl - ready\n",
|
||||
- default_mode.hdisplay, default_mode.vdisplay,
|
||||
- default_mode.vrefresh,
|
||||
- mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
|
||||
-
|
||||
- jh057n_debugfs_init(ctx);
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static void jh057n_shutdown(struct mipi_dsi_device *dsi)
|
||||
-{
|
||||
- struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
- int ret;
|
||||
-
|
||||
- ret = drm_panel_unprepare(&ctx->panel);
|
||||
- if (ret < 0)
|
||||
- DRM_DEV_ERROR(&dsi->dev, "Failed to unprepare panel: %d\n",
|
||||
- ret);
|
||||
-
|
||||
- ret = drm_panel_disable(&ctx->panel);
|
||||
- if (ret < 0)
|
||||
- DRM_DEV_ERROR(&dsi->dev, "Failed to disable panel: %d\n",
|
||||
- ret);
|
||||
-}
|
||||
-
|
||||
-static int jh057n_remove(struct mipi_dsi_device *dsi)
|
||||
-{
|
||||
- struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
- int ret;
|
||||
-
|
||||
- jh057n_shutdown(dsi);
|
||||
-
|
||||
- ret = mipi_dsi_detach(dsi);
|
||||
- if (ret < 0)
|
||||
- DRM_DEV_ERROR(&dsi->dev, "Failed to detach from DSI host: %d\n",
|
||||
- ret);
|
||||
-
|
||||
- drm_panel_remove(&ctx->panel);
|
||||
-
|
||||
- jh057n_debugfs_remove(ctx);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static const struct of_device_id jh057n_of_match[] = {
|
||||
- { .compatible = "rocktech,jh057n00900" },
|
||||
- { /* sentinel */ }
|
||||
-};
|
||||
-MODULE_DEVICE_TABLE(of, jh057n_of_match);
|
||||
-
|
||||
-static struct mipi_dsi_driver jh057n_driver = {
|
||||
- .probe = jh057n_probe,
|
||||
- .remove = jh057n_remove,
|
||||
- .shutdown = jh057n_shutdown,
|
||||
- .driver = {
|
||||
- .name = DRV_NAME,
|
||||
- .of_match_table = jh057n_of_match,
|
||||
- },
|
||||
-};
|
||||
-module_mipi_dsi_driver(jh057n_driver);
|
||||
-
|
||||
-MODULE_AUTHOR("Guido Günther <agx@sigxcpu.org>");
|
||||
-MODULE_DESCRIPTION("DRM driver for Rocktech JH057N00900 MIPI DSI panel");
|
||||
-MODULE_LICENSE("GPL v2");
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
new file mode 100644
|
||||
index 000000000000..38ff742bc120
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -0,0 +1,424 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Rockteck jh057n00900 5.5" MIPI-DSI panel driver
|
||||
+ *
|
||||
+ * Copyright (C) Purism SPC 2019
|
||||
+ */
|
||||
+
|
||||
+#include <linux/debugfs.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
+#include <linux/media-bus-format.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/regulator/consumer.h>
|
||||
+
|
||||
+#include <video/display_timing.h>
|
||||
+#include <video/mipi_display.h>
|
||||
+
|
||||
+#include <drm/drm_mipi_dsi.h>
|
||||
+#include <drm/drm_modes.h>
|
||||
+#include <drm/drm_panel.h>
|
||||
+#include <drm/drm_print.h>
|
||||
+
|
||||
+#define DRV_NAME "panel-rocktech-jh057n00900"
|
||||
+
|
||||
+/* Manufacturer specific Commands send via DSI */
|
||||
+#define ST7703_CMD_ALL_PIXEL_OFF 0x22
|
||||
+#define ST7703_CMD_ALL_PIXEL_ON 0x23
|
||||
+#define ST7703_CMD_SETDISP 0xB2
|
||||
+#define ST7703_CMD_SETRGBIF 0xB3
|
||||
+#define ST7703_CMD_SETCYC 0xB4
|
||||
+#define ST7703_CMD_SETBGP 0xB5
|
||||
+#define ST7703_CMD_SETVCOM 0xB6
|
||||
+#define ST7703_CMD_SETOTP 0xB7
|
||||
+#define ST7703_CMD_SETPOWER_EXT 0xB8
|
||||
+#define ST7703_CMD_SETEXTC 0xB9
|
||||
+#define ST7703_CMD_SETMIPI 0xBA
|
||||
+#define ST7703_CMD_SETVDC 0xBC
|
||||
+#define ST7703_CMD_UNKNOWN0 0xBF
|
||||
+#define ST7703_CMD_SETSCR 0xC0
|
||||
+#define ST7703_CMD_SETPOWER 0xC1
|
||||
+#define ST7703_CMD_SETPANEL 0xCC
|
||||
+#define ST7703_CMD_SETGAMMA 0xE0
|
||||
+#define ST7703_CMD_SETEQ 0xE3
|
||||
+#define ST7703_CMD_SETGIP1 0xE9
|
||||
+#define ST7703_CMD_SETGIP2 0xEA
|
||||
+
|
||||
+struct jh057n {
|
||||
+ struct device *dev;
|
||||
+ struct drm_panel panel;
|
||||
+ struct gpio_desc *reset_gpio;
|
||||
+ struct regulator *vcc;
|
||||
+ struct regulator *iovcc;
|
||||
+ bool prepared;
|
||||
+
|
||||
+ struct dentry *debugfs;
|
||||
+};
|
||||
+
|
||||
+static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
|
||||
+{
|
||||
+ return container_of(panel, struct jh057n, panel);
|
||||
+}
|
||||
+
|
||||
+#define dsi_generic_write_seq(dsi, seq...) do { \
|
||||
+ static const u8 d[] = { seq }; \
|
||||
+ int ret; \
|
||||
+ ret = mipi_dsi_generic_write(dsi, d, ARRAY_SIZE(d)); \
|
||||
+ if (ret < 0) \
|
||||
+ return ret; \
|
||||
+ } while (0)
|
||||
+
|
||||
+static int jh057n_init_sequence(struct jh057n *ctx)
|
||||
+{
|
||||
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
+ struct device *dev = ctx->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Init sequence was supplied by the panel vendor. Most of the commands
|
||||
+ * resemble the ST7703 but the number of parameters often don't match
|
||||
+ * so it's likely a clone.
|
||||
+ */
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETEXTC,
|
||||
+ 0xF1, 0x12, 0x83);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETRGBIF,
|
||||
+ 0x10, 0x10, 0x05, 0x05, 0x03, 0xFF, 0x00, 0x00,
|
||||
+ 0x00, 0x00);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETSCR,
|
||||
+ 0x73, 0x73, 0x50, 0x50, 0x00, 0x00, 0x08, 0x70,
|
||||
+ 0x00);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETVDC, 0x4E);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0B);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETDISP, 0xF0, 0x12, 0x30);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETEQ,
|
||||
+ 0x07, 0x07, 0x0B, 0x0B, 0x03, 0x0B, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0xFF, 0x00, 0xC0, 0x10);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETBGP, 0x08, 0x08);
|
||||
+ msleep(20);
|
||||
+
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETVCOM, 0x3F, 0x3F);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN0, 0x02, 0x11, 0x00);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP1,
|
||||
+ 0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
|
||||
+ 0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
|
||||
+ 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
|
||||
+ 0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
|
||||
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
|
||||
+ 0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
+ 0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP2,
|
||||
+ 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
|
||||
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
|
||||
+ 0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
+ 0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0A,
|
||||
+ 0xA5, 0x00, 0x00, 0x00, 0x00);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_SETGAMMA,
|
||||
+ 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41, 0x37,
|
||||
+ 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10, 0x11,
|
||||
+ 0x18, 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41,
|
||||
+ 0x37, 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10,
|
||||
+ 0x11, 0x18);
|
||||
+ msleep(20);
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
+ if (ret < 0) {
|
||||
+ DRM_DEV_ERROR(dev, "Failed to exit sleep mode: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ /* Panel is operational 120 msec after reset */
|
||||
+ msleep(60);
|
||||
+ ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ DRM_DEV_DEBUG_DRIVER(dev, "Panel init sequence done\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int jh057n_enable(struct drm_panel *panel)
|
||||
+{
|
||||
+ struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = jh057n_init_sequence(ctx);
|
||||
+ if (ret < 0) {
|
||||
+ DRM_DEV_ERROR(ctx->dev, "Panel init sequence failed: %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int jh057n_disable(struct drm_panel *panel)
|
||||
+{
|
||||
+ struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
+
|
||||
+ return mipi_dsi_dcs_set_display_off(dsi);
|
||||
+}
|
||||
+
|
||||
+static int jh057n_unprepare(struct drm_panel *panel)
|
||||
+{
|
||||
+ struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+
|
||||
+ if (!ctx->prepared)
|
||||
+ return 0;
|
||||
+
|
||||
+ regulator_disable(ctx->iovcc);
|
||||
+ regulator_disable(ctx->vcc);
|
||||
+ ctx->prepared = false;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int jh057n_prepare(struct drm_panel *panel)
|
||||
+{
|
||||
+ struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ int ret;
|
||||
+
|
||||
+ if (ctx->prepared)
|
||||
+ return 0;
|
||||
+
|
||||
+ DRM_DEV_DEBUG_DRIVER(ctx->dev, "Resetting the panel\n");
|
||||
+ ret = regulator_enable(ctx->vcc);
|
||||
+ if (ret < 0) {
|
||||
+ DRM_DEV_ERROR(ctx->dev,
|
||||
+ "Failed to enable vcc supply: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ ret = regulator_enable(ctx->iovcc);
|
||||
+ if (ret < 0) {
|
||||
+ DRM_DEV_ERROR(ctx->dev,
|
||||
+ "Failed to enable iovcc supply: %d\n", ret);
|
||||
+ goto disable_vcc;
|
||||
+ }
|
||||
+
|
||||
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
||||
+ usleep_range(20, 40);
|
||||
+ gpiod_set_value_cansleep(ctx->reset_gpio, 0);
|
||||
+ msleep(20);
|
||||
+
|
||||
+ ctx->prepared = true;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+disable_vcc:
|
||||
+ regulator_disable(ctx->vcc);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct drm_display_mode default_mode = {
|
||||
+ .hdisplay = 720,
|
||||
+ .hsync_start = 720 + 90,
|
||||
+ .hsync_end = 720 + 90 + 20,
|
||||
+ .htotal = 720 + 90 + 20 + 20,
|
||||
+ .vdisplay = 1440,
|
||||
+ .vsync_start = 1440 + 20,
|
||||
+ .vsync_end = 1440 + 20 + 4,
|
||||
+ .vtotal = 1440 + 20 + 4 + 12,
|
||||
+ .vrefresh = 60,
|
||||
+ .clock = 75276,
|
||||
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||
+ .width_mm = 65,
|
||||
+ .height_mm = 130,
|
||||
+};
|
||||
+
|
||||
+static int jh057n_get_modes(struct drm_panel *panel,
|
||||
+ struct drm_connector *connector)
|
||||
+{
|
||||
+ struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct drm_display_mode *mode;
|
||||
+
|
||||
+ mode = drm_mode_duplicate(connector->dev, &default_mode);
|
||||
+ if (!mode) {
|
||||
+ DRM_DEV_ERROR(ctx->dev, "Failed to add mode %ux%u@%u\n",
|
||||
+ default_mode.hdisplay, default_mode.vdisplay,
|
||||
+ default_mode.vrefresh);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ drm_mode_set_name(mode);
|
||||
+
|
||||
+ mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
|
||||
+ connector->display_info.width_mm = mode->width_mm;
|
||||
+ connector->display_info.height_mm = mode->height_mm;
|
||||
+ drm_mode_probed_add(connector, mode);
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static const struct drm_panel_funcs jh057n_drm_funcs = {
|
||||
+ .disable = jh057n_disable,
|
||||
+ .unprepare = jh057n_unprepare,
|
||||
+ .prepare = jh057n_prepare,
|
||||
+ .enable = jh057n_enable,
|
||||
+ .get_modes = jh057n_get_modes,
|
||||
+};
|
||||
+
|
||||
+static int allpixelson_set(void *data, u64 val)
|
||||
+{
|
||||
+ struct jh057n *ctx = data;
|
||||
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
+
|
||||
+ DRM_DEV_DEBUG_DRIVER(ctx->dev, "Setting all pixels on\n");
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_ALL_PIXEL_ON);
|
||||
+ msleep(val * 1000);
|
||||
+ /* Reset the panel to get video back */
|
||||
+ drm_panel_disable(&ctx->panel);
|
||||
+ drm_panel_unprepare(&ctx->panel);
|
||||
+ drm_panel_prepare(&ctx->panel);
|
||||
+ drm_panel_enable(&ctx->panel);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+DEFINE_SIMPLE_ATTRIBUTE(allpixelson_fops, NULL,
|
||||
+ allpixelson_set, "%llu\n");
|
||||
+
|
||||
+static void jh057n_debugfs_init(struct jh057n *ctx)
|
||||
+{
|
||||
+ ctx->debugfs = debugfs_create_dir(DRV_NAME, NULL);
|
||||
+
|
||||
+ debugfs_create_file("allpixelson", 0600, ctx->debugfs, ctx,
|
||||
+ &allpixelson_fops);
|
||||
+}
|
||||
+
|
||||
+static void jh057n_debugfs_remove(struct jh057n *ctx)
|
||||
+{
|
||||
+ debugfs_remove_recursive(ctx->debugfs);
|
||||
+ ctx->debugfs = NULL;
|
||||
+}
|
||||
+
|
||||
+static int jh057n_probe(struct mipi_dsi_device *dsi)
|
||||
+{
|
||||
+ struct device *dev = &dsi->dev;
|
||||
+ struct jh057n *ctx;
|
||||
+ int ret;
|
||||
+
|
||||
+ ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
|
||||
+ if (!ctx)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
|
||||
+ if (IS_ERR(ctx->reset_gpio)) {
|
||||
+ DRM_DEV_ERROR(dev, "cannot get reset gpio\n");
|
||||
+ return PTR_ERR(ctx->reset_gpio);
|
||||
+ }
|
||||
+
|
||||
+ mipi_dsi_set_drvdata(dsi, ctx);
|
||||
+
|
||||
+ ctx->dev = dev;
|
||||
+
|
||||
+ dsi->lanes = 4;
|
||||
+ dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
+ dsi->mode_flags = MIPI_DSI_MODE_VIDEO |
|
||||
+ MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
|
||||
+
|
||||
+ ctx->vcc = devm_regulator_get(dev, "vcc");
|
||||
+ if (IS_ERR(ctx->vcc)) {
|
||||
+ ret = PTR_ERR(ctx->vcc);
|
||||
+ if (ret != -EPROBE_DEFER)
|
||||
+ DRM_DEV_ERROR(dev,
|
||||
+ "Failed to request vcc regulator: %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ ctx->iovcc = devm_regulator_get(dev, "iovcc");
|
||||
+ if (IS_ERR(ctx->iovcc)) {
|
||||
+ ret = PTR_ERR(ctx->iovcc);
|
||||
+ if (ret != -EPROBE_DEFER)
|
||||
+ DRM_DEV_ERROR(dev,
|
||||
+ "Failed to request iovcc regulator: %d\n",
|
||||
+ ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
|
||||
+ DRM_MODE_CONNECTOR_DSI);
|
||||
+
|
||||
+ ret = drm_panel_of_backlight(&ctx->panel);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ drm_panel_add(&ctx->panel);
|
||||
+
|
||||
+ ret = mipi_dsi_attach(dsi);
|
||||
+ if (ret < 0) {
|
||||
+ DRM_DEV_ERROR(dev,
|
||||
+ "mipi_dsi_attach failed (%d). Is host ready?\n",
|
||||
+ ret);
|
||||
+ drm_panel_remove(&ctx->panel);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ DRM_DEV_INFO(dev, "%ux%u@%u %ubpp dsi %udl - ready\n",
|
||||
+ default_mode.hdisplay, default_mode.vdisplay,
|
||||
+ default_mode.vrefresh,
|
||||
+ mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
|
||||
+
|
||||
+ jh057n_debugfs_init(ctx);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void jh057n_shutdown(struct mipi_dsi_device *dsi)
|
||||
+{
|
||||
+ struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = drm_panel_unprepare(&ctx->panel);
|
||||
+ if (ret < 0)
|
||||
+ DRM_DEV_ERROR(&dsi->dev, "Failed to unprepare panel: %d\n",
|
||||
+ ret);
|
||||
+
|
||||
+ ret = drm_panel_disable(&ctx->panel);
|
||||
+ if (ret < 0)
|
||||
+ DRM_DEV_ERROR(&dsi->dev, "Failed to disable panel: %d\n",
|
||||
+ ret);
|
||||
+}
|
||||
+
|
||||
+static int jh057n_remove(struct mipi_dsi_device *dsi)
|
||||
+{
|
||||
+ struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
+ int ret;
|
||||
+
|
||||
+ jh057n_shutdown(dsi);
|
||||
+
|
||||
+ ret = mipi_dsi_detach(dsi);
|
||||
+ if (ret < 0)
|
||||
+ DRM_DEV_ERROR(&dsi->dev, "Failed to detach from DSI host: %d\n",
|
||||
+ ret);
|
||||
+
|
||||
+ drm_panel_remove(&ctx->panel);
|
||||
+
|
||||
+ jh057n_debugfs_remove(ctx);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id jh057n_of_match[] = {
|
||||
+ { .compatible = "rocktech,jh057n00900" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, jh057n_of_match);
|
||||
+
|
||||
+static struct mipi_dsi_driver jh057n_driver = {
|
||||
+ .probe = jh057n_probe,
|
||||
+ .remove = jh057n_remove,
|
||||
+ .shutdown = jh057n_shutdown,
|
||||
+ .driver = {
|
||||
+ .name = DRV_NAME,
|
||||
+ .of_match_table = jh057n_of_match,
|
||||
+ },
|
||||
+};
|
||||
+module_mipi_dsi_driver(jh057n_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Guido Günther <agx@sigxcpu.org>");
|
||||
+MODULE_DESCRIPTION("DRM driver for Rocktech JH057N00900 MIPI DSI panel");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,251 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:57 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Add support for Xingbangda XBD599
|
||||
|
||||
Xingbangda XBD599 is a 5.99" 720x1440 MIPI-DSI LCD panel used in
|
||||
PinePhone. Add support for it.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 199 +++++++++++++++++-
|
||||
1 file changed, 197 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index cdbf7dfb4dd4..33611419059a 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -39,10 +39,11 @@
|
||||
#define ST7703_CMD_SETEXTC 0xB9
|
||||
#define ST7703_CMD_SETMIPI 0xBA
|
||||
#define ST7703_CMD_SETVDC 0xBC
|
||||
-#define ST7703_CMD_UNKNOWN0 0xBF
|
||||
+#define ST7703_CMD_UNKNOWN_BF 0xBF
|
||||
#define ST7703_CMD_SETSCR 0xC0
|
||||
#define ST7703_CMD_SETPOWER 0xC1
|
||||
#define ST7703_CMD_SETPANEL 0xCC
|
||||
+#define ST7703_CMD_UNKNOWN_C6 0xC6
|
||||
#define ST7703_CMD_SETGAMMA 0xE0
|
||||
#define ST7703_CMD_SETEQ 0xE3
|
||||
#define ST7703_CMD_SETGIP1 0xE9
|
||||
@@ -109,7 +110,7 @@ static int jh057n_init_sequence(struct st7703 *ctx)
|
||||
msleep(20);
|
||||
|
||||
dsi_generic_write_seq(dsi, ST7703_CMD_SETVCOM, 0x3F, 0x3F);
|
||||
- dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN0, 0x02, 0x11, 0x00);
|
||||
+ dsi_generic_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00);
|
||||
dsi_generic_write_seq(dsi, ST7703_CMD_SETGIP1,
|
||||
0x82, 0x10, 0x06, 0x05, 0x9E, 0x0A, 0xA5, 0x12,
|
||||
0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
|
||||
@@ -163,6 +164,199 @@ struct st7703_panel_desc jh057n00900_panel_desc = {
|
||||
.init_sequence = jh057n_init_sequence,
|
||||
};
|
||||
|
||||
+#define dsi_dcs_write_seq(dsi, cmd, seq...) do { \
|
||||
+ static const u8 d[] = { seq }; \
|
||||
+ int ret; \
|
||||
+ ret = mipi_dsi_dcs_write(dsi, cmd, d, ARRAY_SIZE(d)); \
|
||||
+ if (ret < 0) \
|
||||
+ return ret; \
|
||||
+ } while (0)
|
||||
+
|
||||
+
|
||||
+static int xbd599_init_sequence(struct st7703 *ctx)
|
||||
+{
|
||||
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
+
|
||||
+ /*
|
||||
+ * Init sequence was supplied by the panel vendor.
|
||||
+ */
|
||||
+
|
||||
+ /* Magic sequence to unlock user commands below. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETEXTC, 0xF1, 0x12, 0x83);
|
||||
+
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETMIPI,
|
||||
+ 0x33, /* VC_main = 0, Lane_Number = 3 (4 lanes) */
|
||||
+ 0x81, /* DSI_LDO_SEL = 1.7V, RTERM = 90 Ohm */
|
||||
+ 0x05, /* IHSRX = x6 (Low High Speed driving ability) */
|
||||
+ 0xF9, /* TX_CLK_SEL = fDSICLK/16 */
|
||||
+ 0x0E, /* HFP_OSC (min. HFP number in DSI mode) */
|
||||
+ 0x0E, /* HBP_OSC (min. HBP number in DSI mode) */
|
||||
+ /* The rest is undocumented in ST7703 datasheet */
|
||||
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x44, 0x25, 0x00, 0x91, 0x0a, 0x00, 0x00, 0x02,
|
||||
+ 0x4F, 0x11, 0x00, 0x00, 0x37);
|
||||
+
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER_EXT,
|
||||
+ 0x25, /* PCCS = 2, ECP_DC_DIV = 1/4 HSYNC */
|
||||
+ 0x22, /* DT = 15ms XDK_ECP = x2 */
|
||||
+ 0x20, /* PFM_DC_DIV = /1 */
|
||||
+ 0x03 /* ECP_SYNC_EN = 1, VGX_SYNC_EN = 1 */);
|
||||
+
|
||||
+ /* RGB I/F porch timing */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETRGBIF,
|
||||
+ 0x10, /* VBP_RGB_GEN */
|
||||
+ 0x10, /* VFP_RGB_GEN */
|
||||
+ 0x05, /* DE_BP_RGB_GEN */
|
||||
+ 0x05, /* DE_FP_RGB_GEN */
|
||||
+ /* The rest is undocumented in ST7703 datasheet */
|
||||
+ 0x03, 0xFF,
|
||||
+ 0x00, 0x00,
|
||||
+ 0x00, 0x00);
|
||||
+
|
||||
+ /* Source driving settings. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETSCR,
|
||||
+ 0x73, /* N_POPON */
|
||||
+ 0x73, /* N_NOPON */
|
||||
+ 0x50, /* I_POPON */
|
||||
+ 0x50, /* I_NOPON */
|
||||
+ 0x00, /* SCR[31,24] */
|
||||
+ 0xC0, /* SCR[23,16] */
|
||||
+ 0x08, /* SCR[15,8] */
|
||||
+ 0x70, /* SCR[7,0] */
|
||||
+ 0x00 /* Undocumented */);
|
||||
+
|
||||
+ /* NVDDD_SEL = -1.8V, VDDD_SEL = out of range (possibly 1.9V?) */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETVDC, 0x4E);
|
||||
+
|
||||
+ /*
|
||||
+ * SS_PANEL = 1 (reverse scan), GS_PANEL = 0 (normal scan)
|
||||
+ * REV_PANEL = 1 (normally black panel), BGR_PANEL = 1 (BGR)
|
||||
+ */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0B);
|
||||
+
|
||||
+ /* Zig-Zag Type C column inversion. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
|
||||
+
|
||||
+ /* Set display resolution. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETDISP,
|
||||
+ 0xF0, /* NL = 240 */
|
||||
+ 0x12, /* RES_V_LSB = 0, BLK_CON = VSSD,
|
||||
+ * RESO_SEL = 720RGB
|
||||
+ */
|
||||
+ 0xF0 /* WHITE_GND_EN = 1 (GND),
|
||||
+ * WHITE_FRAME_SEL = 7 frames,
|
||||
+ * ISC = 0 frames
|
||||
+ */);
|
||||
+
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETEQ,
|
||||
+ 0x00, /* PNOEQ */
|
||||
+ 0x00, /* NNOEQ */
|
||||
+ 0x0B, /* PEQGND */
|
||||
+ 0x0B, /* NEQGND */
|
||||
+ 0x10, /* PEQVCI */
|
||||
+ 0x10, /* NEQVCI */
|
||||
+ 0x00, /* PEQVCI1 */
|
||||
+ 0x00, /* NEQVCI1 */
|
||||
+ 0x00, /* reserved */
|
||||
+ 0x00, /* reserved */
|
||||
+ 0xFF, /* reserved */
|
||||
+ 0x00, /* reserved */
|
||||
+ 0xC0, /* ESD_DET_DATA_WHITE = 1, ESD_WHITE_EN = 1 */
|
||||
+ 0x10 /* SLPIN_OPTION = 1 (no need vsync after sleep-in)
|
||||
+ * VEDIO_NO_CHECK_EN = 0
|
||||
+ * ESD_WHITE_GND_EN = 0
|
||||
+ * ESD_DET_TIME_SEL = 0 frames
|
||||
+ */);
|
||||
+
|
||||
+ /* Undocumented command. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_C6, 0x01, 0x00, 0xFF, 0xFF, 0x00);
|
||||
+
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER,
|
||||
+ 0x74, /* VBTHS, VBTLS: VGH = 17V, VBL = -11V */
|
||||
+ 0x00, /* FBOFF_VGH = 0, FBOFF_VGL = 0 */
|
||||
+ 0x32, /* VRP */
|
||||
+ 0x32, /* VRN */
|
||||
+ 0x77, /* reserved */
|
||||
+ 0xF1, /* APS = 1 (small),
|
||||
+ * VGL_DET_EN = 1, VGH_DET_EN = 1,
|
||||
+ * VGL_TURBO = 1, VGH_TURBO = 1
|
||||
+ */
|
||||
+ 0xFF, /* VGH1_L_DIV, VGL1_L_DIV (1.5MHz) */
|
||||
+ 0xFF, /* VGH1_R_DIV, VGL1_R_DIV (1.5MHz) */
|
||||
+ 0xCC, /* VGH2_L_DIV, VGL2_L_DIV (2.6MHz) */
|
||||
+ 0xCC, /* VGH2_R_DIV, VGL2_R_DIV (2.6MHz) */
|
||||
+ 0x77, /* VGH3_L_DIV, VGL3_L_DIV (4.5MHz) */
|
||||
+ 0x77 /* VGH3_R_DIV, VGL3_R_DIV (4.5MHz) */);
|
||||
+
|
||||
+ /* Reference voltage. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETBGP,
|
||||
+ 0x07, /* VREF_SEL = 4.2V */
|
||||
+ 0x07 /* NVREF_SEL = 4.2V */);
|
||||
+
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETVCOM,
|
||||
+ 0x2C, /* VCOMDC_F = -0.67V */
|
||||
+ 0x2C /* VCOMDC_B = -0.67V */);
|
||||
+
|
||||
+ /* Undocumented command. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00);
|
||||
+
|
||||
+ /* This command is to set forward GIP timing. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP1,
|
||||
+ 0x82, 0x10, 0x06, 0x05, 0xA2, 0x0A, 0xA5, 0x12,
|
||||
+ 0x31, 0x23, 0x37, 0x83, 0x04, 0xBC, 0x27, 0x38,
|
||||
+ 0x0C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00,
|
||||
+ 0x03, 0x00, 0x00, 0x00, 0x75, 0x75, 0x31, 0x88,
|
||||
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x13, 0x88, 0x64,
|
||||
+ 0x64, 0x20, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
+ 0x02, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
+
|
||||
+ /* This command is to set backward GIP timing. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP2,
|
||||
+ 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x46, 0x02, 0x88,
|
||||
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x88, 0x13,
|
||||
+ 0x57, 0x13, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
|
||||
+ 0x75, 0x88, 0x23, 0x14, 0x00, 0x00, 0x02, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0A,
|
||||
+ 0xA5, 0x00, 0x00, 0x00, 0x00);
|
||||
+
|
||||
+ /* Adjust the gamma characteristics of the panel. */
|
||||
+ dsi_dcs_write_seq(dsi, ST7703_CMD_SETGAMMA,
|
||||
+ 0x00, 0x09, 0x0D, 0x23, 0x27, 0x3C, 0x41, 0x35,
|
||||
+ 0x07, 0x0D, 0x0E, 0x12, 0x13, 0x10, 0x12, 0x12,
|
||||
+ 0x18, 0x00, 0x09, 0x0D, 0x23, 0x27, 0x3C, 0x41,
|
||||
+ 0x35, 0x07, 0x0D, 0x0E, 0x12, 0x13, 0x10, 0x12,
|
||||
+ 0x12, 0x18);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct drm_display_mode xbd599_mode = {
|
||||
+ .hdisplay = 720,
|
||||
+ .hsync_start = 720 + 40,
|
||||
+ .hsync_end = 720 + 40 + 40,
|
||||
+ .htotal = 720 + 40 + 40 + 40,
|
||||
+ .vdisplay = 1440,
|
||||
+ .vsync_start = 1440 + 18,
|
||||
+ .vsync_end = 1440 + 18 + 10,
|
||||
+ .vtotal = 1440 + 18 + 10 + 17,
|
||||
+ .vrefresh = 60,
|
||||
+ .clock = 69000,
|
||||
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||
+ .width_mm = 68,
|
||||
+ .height_mm = 136,
|
||||
+};
|
||||
+
|
||||
+static const struct st7703_panel_desc xbd599_desc = {
|
||||
+ .mode = &xbd599_mode,
|
||||
+ .lanes = 4,
|
||||
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
|
||||
+ .format = MIPI_DSI_FMT_RGB888,
|
||||
+ .init_sequence = xbd599_init_sequence,
|
||||
+};
|
||||
+
|
||||
static int st7703_enable(struct drm_panel *panel)
|
||||
{
|
||||
struct st7703 *ctx = panel_to_st7703(panel);
|
||||
@@ -428,6 +622,7 @@ static int st7703_remove(struct mipi_dsi_device *dsi)
|
||||
|
||||
static const struct of_device_id st7703_of_match[] = {
|
||||
{ .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc },
|
||||
+ { .compatible = "xingbangda,xbd599", .data = &xbd599_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, st7703_of_match);
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:59 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Assert reset prior to powering down the
|
||||
regulators
|
||||
|
||||
The reset pin is inverted, so if we don't assert reset, the actual gpio
|
||||
will be high and may keep driving the IO port of the panel.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index e771281eb547..92930e127559 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -416,6 +416,7 @@ static int st7703_unprepare(struct drm_panel *panel)
|
||||
if (!ctx->prepared)
|
||||
return 0;
|
||||
|
||||
+ gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
||||
regulator_disable(ctx->iovcc);
|
||||
regulator_disable(ctx->vcc);
|
||||
ctx->prepared = false;
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:58 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Enter sleep after display off
|
||||
|
||||
The datasheet suggests to issue sleep in after display off
|
||||
as a part of the panel's shutdown sequence.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index 33611419059a..e771281eb547 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -394,8 +394,19 @@ static int st7703_disable(struct drm_panel *panel)
|
||||
{
|
||||
struct st7703 *ctx = panel_to_st7703(panel);
|
||||
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_set_display_off(dsi);
|
||||
+ if (ret < 0)
|
||||
+ DRM_DEV_ERROR(ctx->dev,
|
||||
+ "Failed to turn off the display: %d\n", ret);
|
||||
|
||||
- return mipi_dsi_dcs_set_display_off(dsi);
|
||||
+ ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
|
||||
+ if (ret < 0)
|
||||
+ DRM_DEV_ERROR(ctx->dev,
|
||||
+ "Failed to enter sleep mode: %d\n", ret);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int st7703_unprepare(struct drm_panel *panel)
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:55 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Move code specific to jh057n closer
|
||||
together
|
||||
|
||||
It's better than having it spread around the driver.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 50 +++++++++----------
|
||||
1 file changed, 25 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index 08cbc316266c..d03aab10cfef 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -153,6 +153,31 @@ static int jh057n_init_sequence(struct st7703 *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static const struct drm_display_mode jh057n00900_mode = {
|
||||
+ .hdisplay = 720,
|
||||
+ .hsync_start = 720 + 90,
|
||||
+ .hsync_end = 720 + 90 + 20,
|
||||
+ .htotal = 720 + 90 + 20 + 20,
|
||||
+ .vdisplay = 1440,
|
||||
+ .vsync_start = 1440 + 20,
|
||||
+ .vsync_end = 1440 + 20 + 4,
|
||||
+ .vtotal = 1440 + 20 + 4 + 12,
|
||||
+ .vrefresh = 60,
|
||||
+ .clock = 75276,
|
||||
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||
+ .width_mm = 65,
|
||||
+ .height_mm = 130,
|
||||
+};
|
||||
+
|
||||
+struct st7703_panel_desc jh057n00900_panel_desc = {
|
||||
+ .mode = &jh057n00900_mode,
|
||||
+ .lanes = 4,
|
||||
+ .mode_flags = MIPI_DSI_MODE_VIDEO |
|
||||
+ MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
|
||||
+ .format = MIPI_DSI_FMT_RGB888,
|
||||
+ .init_sequence = jh057n_init_sequence,
|
||||
+};
|
||||
+
|
||||
static int st7703_enable(struct drm_panel *panel)
|
||||
{
|
||||
struct st7703 *ctx = panel_to_st7703(panel);
|
||||
@@ -226,31 +251,6 @@ static int st7703_prepare(struct drm_panel *panel)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static const struct drm_display_mode jh057n00900_mode = {
|
||||
- .hdisplay = 720,
|
||||
- .hsync_start = 720 + 90,
|
||||
- .hsync_end = 720 + 90 + 20,
|
||||
- .htotal = 720 + 90 + 20 + 20,
|
||||
- .vdisplay = 1440,
|
||||
- .vsync_start = 1440 + 20,
|
||||
- .vsync_end = 1440 + 20 + 4,
|
||||
- .vtotal = 1440 + 20 + 4 + 12,
|
||||
- .vrefresh = 60,
|
||||
- .clock = 75276,
|
||||
- .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||
- .width_mm = 65,
|
||||
- .height_mm = 130,
|
||||
-};
|
||||
-
|
||||
-struct st7703_panel_desc jh057n00900_panel_desc = {
|
||||
- .mode = &jh057n00900_mode,
|
||||
- .lanes = 4,
|
||||
- .mode_flags = MIPI_DSI_MODE_VIDEO |
|
||||
- MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
|
||||
- .format = MIPI_DSI_FMT_RGB888,
|
||||
- .init_sequence = jh057n_init_sequence,
|
||||
-};
|
||||
-
|
||||
static int st7703_get_modes(struct drm_panel *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,84 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:56 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Move generic part of init sequence to
|
||||
enable callback
|
||||
|
||||
Calling sleep out and display on is a controller specific part
|
||||
of the initialization process. Move it out of the panel specific
|
||||
initialization function to the enable callback.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 33 ++++++++++---------
|
||||
1 file changed, 18 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index d03aab10cfef..cdbf7dfb4dd4 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -84,8 +84,6 @@ static inline struct st7703 *panel_to_st7703(struct drm_panel *panel)
|
||||
static int jh057n_init_sequence(struct st7703 *ctx)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
- struct device *dev = ctx->dev;
|
||||
- int ret;
|
||||
|
||||
/*
|
||||
* Init sequence was supplied by the panel vendor. Most of the commands
|
||||
@@ -136,20 +134,7 @@ static int jh057n_init_sequence(struct st7703 *ctx)
|
||||
0x18, 0x00, 0x09, 0x0E, 0x29, 0x2D, 0x3C, 0x41,
|
||||
0x37, 0x07, 0x0B, 0x0D, 0x10, 0x11, 0x0F, 0x10,
|
||||
0x11, 0x18);
|
||||
- msleep(20);
|
||||
-
|
||||
- ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
- if (ret < 0) {
|
||||
- DRM_DEV_ERROR(dev, "Failed to exit sleep mode: %d\n", ret);
|
||||
- return ret;
|
||||
- }
|
||||
- /* Panel is operational 120 msec after reset */
|
||||
- msleep(60);
|
||||
- ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
|
||||
- DRM_DEV_DEBUG_DRIVER(dev, "Panel init sequence done\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -181,6 +166,7 @@ struct st7703_panel_desc jh057n00900_panel_desc = {
|
||||
static int st7703_enable(struct drm_panel *panel)
|
||||
{
|
||||
struct st7703 *ctx = panel_to_st7703(panel);
|
||||
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
int ret;
|
||||
|
||||
ret = ctx->desc->init_sequence(ctx);
|
||||
@@ -190,6 +176,23 @@ static int st7703_enable(struct drm_panel *panel)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ msleep(20);
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_exit_sleep_mode(dsi);
|
||||
+ if (ret < 0) {
|
||||
+ DRM_DEV_ERROR(ctx->dev, "Failed to exit sleep mode: %d\n", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Panel is operational 120 msec after reset */
|
||||
+ msleep(60);
|
||||
+
|
||||
+ ret = mipi_dsi_dcs_set_display_on(dsi);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ DRM_DEV_DEBUG_DRIVER(ctx->dev, "Panel init sequence done\n");
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,128 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:54 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Prepare for supporting multiple panels
|
||||
|
||||
Parametrize the driver so that it can support more panels based
|
||||
on st7703 controller.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 43 +++++++++++++------
|
||||
1 file changed, 31 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index 511af659f273..08cbc316266c 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/media-bus-format.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/of_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include <video/display_timing.h>
|
||||
@@ -56,6 +57,15 @@ struct st7703 {
|
||||
bool prepared;
|
||||
|
||||
struct dentry *debugfs;
|
||||
+ const struct st7703_panel_desc *desc;
|
||||
+};
|
||||
+
|
||||
+struct st7703_panel_desc {
|
||||
+ const struct drm_display_mode *mode;
|
||||
+ unsigned int lanes;
|
||||
+ unsigned long mode_flags;
|
||||
+ enum mipi_dsi_pixel_format format;
|
||||
+ int (*init_sequence)(struct st7703 *ctx);
|
||||
};
|
||||
|
||||
static inline struct st7703 *panel_to_st7703(struct drm_panel *panel)
|
||||
@@ -148,7 +158,7 @@ static int st7703_enable(struct drm_panel *panel)
|
||||
struct st7703 *ctx = panel_to_st7703(panel);
|
||||
int ret;
|
||||
|
||||
- ret = jh057n_init_sequence(ctx);
|
||||
+ ret = ctx->desc->init_sequence(ctx);
|
||||
if (ret < 0) {
|
||||
DRM_DEV_ERROR(ctx->dev, "Panel init sequence failed: %d\n",
|
||||
ret);
|
||||
@@ -216,7 +226,7 @@ static int st7703_prepare(struct drm_panel *panel)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static const struct drm_display_mode default_mode = {
|
||||
+static const struct drm_display_mode jh057n00900_mode = {
|
||||
.hdisplay = 720,
|
||||
.hsync_start = 720 + 90,
|
||||
.hsync_end = 720 + 90 + 20,
|
||||
@@ -232,17 +242,26 @@ static const struct drm_display_mode default_mode = {
|
||||
.height_mm = 130,
|
||||
};
|
||||
|
||||
+struct st7703_panel_desc jh057n00900_panel_desc = {
|
||||
+ .mode = &jh057n00900_mode,
|
||||
+ .lanes = 4,
|
||||
+ .mode_flags = MIPI_DSI_MODE_VIDEO |
|
||||
+ MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE,
|
||||
+ .format = MIPI_DSI_FMT_RGB888,
|
||||
+ .init_sequence = jh057n_init_sequence,
|
||||
+};
|
||||
+
|
||||
static int st7703_get_modes(struct drm_panel *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct st7703 *ctx = panel_to_st7703(panel);
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
- mode = drm_mode_duplicate(connector->dev, &default_mode);
|
||||
+ mode = drm_mode_duplicate(connector->dev, ctx->desc->mode);
|
||||
if (!mode) {
|
||||
DRM_DEV_ERROR(ctx->dev, "Failed to add mode %ux%u@%u\n",
|
||||
- default_mode.hdisplay, default_mode.vdisplay,
|
||||
- default_mode.vrefresh);
|
||||
+ ctx->desc->mode->hdisplay, ctx->desc->mode->vdisplay,
|
||||
+ ctx->desc->mode->vrefresh);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -317,11 +336,11 @@ static int st7703_probe(struct mipi_dsi_device *dsi)
|
||||
mipi_dsi_set_drvdata(dsi, ctx);
|
||||
|
||||
ctx->dev = dev;
|
||||
+ ctx->desc = of_device_get_match_data(dev);
|
||||
|
||||
- dsi->lanes = 4;
|
||||
- dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
- dsi->mode_flags = MIPI_DSI_MODE_VIDEO |
|
||||
- MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
|
||||
+ dsi->mode_flags = ctx->desc->mode_flags;
|
||||
+ dsi->format = ctx->desc->format;
|
||||
+ dsi->lanes = ctx->desc->lanes;
|
||||
|
||||
ctx->vcc = devm_regulator_get(dev, "vcc");
|
||||
if (IS_ERR(ctx->vcc)) {
|
||||
@@ -361,8 +380,8 @@ static int st7703_probe(struct mipi_dsi_device *dsi)
|
||||
}
|
||||
|
||||
DRM_DEV_INFO(dev, "%ux%u@%u %ubpp dsi %udl - ready\n",
|
||||
- default_mode.hdisplay, default_mode.vdisplay,
|
||||
- default_mode.vrefresh,
|
||||
+ ctx->desc->mode->hdisplay, ctx->desc->mode->vdisplay,
|
||||
+ ctx->desc->mode->vrefresh,
|
||||
mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
|
||||
|
||||
st7703_debugfs_init(ctx);
|
||||
@@ -405,7 +424,7 @@ static int st7703_remove(struct mipi_dsi_device *dsi)
|
||||
}
|
||||
|
||||
static const struct of_device_id st7703_of_match[] = {
|
||||
- { .compatible = "rocktech,jh057n00900" },
|
||||
+ { .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, st7703_of_match);
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,265 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:53 +0200
|
||||
Subject: [PATCH] drm/panel: st7703: Rename functions from jh057n prefix to
|
||||
st7703
|
||||
|
||||
This is done so that code that's not specific to a particular
|
||||
jh057n panel is named after the controller. Functions specific
|
||||
to the panel are kept named after the panel.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
drivers/gpu/drm/panel/panel-sitronix-st7703.c | 90 ++++++++++---------
|
||||
1 file changed, 46 insertions(+), 44 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
index 38ff742bc120..511af659f273 100644
|
||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||
@@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
- * Rockteck jh057n00900 5.5" MIPI-DSI panel driver
|
||||
+ * Driver for panels based on Sitronix ST7703 controller, souch as:
|
||||
+ *
|
||||
+ * - Rocktech jh057n00900 5.5" MIPI-DSI panel
|
||||
*
|
||||
* Copyright (C) Purism SPC 2019
|
||||
*/
|
||||
@@ -21,7 +23,7 @@
|
||||
#include <drm/drm_panel.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
-#define DRV_NAME "panel-rocktech-jh057n00900"
|
||||
+#define DRV_NAME "panel-sitronix-st7703"
|
||||
|
||||
/* Manufacturer specific Commands send via DSI */
|
||||
#define ST7703_CMD_ALL_PIXEL_OFF 0x22
|
||||
@@ -45,7 +47,7 @@
|
||||
#define ST7703_CMD_SETGIP1 0xE9
|
||||
#define ST7703_CMD_SETGIP2 0xEA
|
||||
|
||||
-struct jh057n {
|
||||
+struct st7703 {
|
||||
struct device *dev;
|
||||
struct drm_panel panel;
|
||||
struct gpio_desc *reset_gpio;
|
||||
@@ -56,9 +58,9 @@ struct jh057n {
|
||||
struct dentry *debugfs;
|
||||
};
|
||||
|
||||
-static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
|
||||
+static inline struct st7703 *panel_to_st7703(struct drm_panel *panel)
|
||||
{
|
||||
- return container_of(panel, struct jh057n, panel);
|
||||
+ return container_of(panel, struct st7703, panel);
|
||||
}
|
||||
|
||||
#define dsi_generic_write_seq(dsi, seq...) do { \
|
||||
@@ -69,7 +71,7 @@ static inline struct jh057n *panel_to_jh057n(struct drm_panel *panel)
|
||||
return ret; \
|
||||
} while (0)
|
||||
|
||||
-static int jh057n_init_sequence(struct jh057n *ctx)
|
||||
+static int jh057n_init_sequence(struct st7703 *ctx)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
struct device *dev = ctx->dev;
|
||||
@@ -141,9 +143,9 @@ static int jh057n_init_sequence(struct jh057n *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int jh057n_enable(struct drm_panel *panel)
|
||||
+static int st7703_enable(struct drm_panel *panel)
|
||||
{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct st7703 *ctx = panel_to_st7703(panel);
|
||||
int ret;
|
||||
|
||||
ret = jh057n_init_sequence(ctx);
|
||||
@@ -156,17 +158,17 @@ static int jh057n_enable(struct drm_panel *panel)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int jh057n_disable(struct drm_panel *panel)
|
||||
+static int st7703_disable(struct drm_panel *panel)
|
||||
{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct st7703 *ctx = panel_to_st7703(panel);
|
||||
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
|
||||
return mipi_dsi_dcs_set_display_off(dsi);
|
||||
}
|
||||
|
||||
-static int jh057n_unprepare(struct drm_panel *panel)
|
||||
+static int st7703_unprepare(struct drm_panel *panel)
|
||||
{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct st7703 *ctx = panel_to_st7703(panel);
|
||||
|
||||
if (!ctx->prepared)
|
||||
return 0;
|
||||
@@ -178,9 +180,9 @@ static int jh057n_unprepare(struct drm_panel *panel)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int jh057n_prepare(struct drm_panel *panel)
|
||||
+static int st7703_prepare(struct drm_panel *panel)
|
||||
{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct st7703 *ctx = panel_to_st7703(panel);
|
||||
int ret;
|
||||
|
||||
if (ctx->prepared)
|
||||
@@ -230,10 +232,10 @@ static const struct drm_display_mode default_mode = {
|
||||
.height_mm = 130,
|
||||
};
|
||||
|
||||
-static int jh057n_get_modes(struct drm_panel *panel,
|
||||
+static int st7703_get_modes(struct drm_panel *panel,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
- struct jh057n *ctx = panel_to_jh057n(panel);
|
||||
+ struct st7703 *ctx = panel_to_st7703(panel);
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_mode_duplicate(connector->dev, &default_mode);
|
||||
@@ -254,17 +256,17 @@ static int jh057n_get_modes(struct drm_panel *panel,
|
||||
return 1;
|
||||
}
|
||||
|
||||
-static const struct drm_panel_funcs jh057n_drm_funcs = {
|
||||
- .disable = jh057n_disable,
|
||||
- .unprepare = jh057n_unprepare,
|
||||
- .prepare = jh057n_prepare,
|
||||
- .enable = jh057n_enable,
|
||||
- .get_modes = jh057n_get_modes,
|
||||
+static const struct drm_panel_funcs st7703_drm_funcs = {
|
||||
+ .disable = st7703_disable,
|
||||
+ .unprepare = st7703_unprepare,
|
||||
+ .prepare = st7703_prepare,
|
||||
+ .enable = st7703_enable,
|
||||
+ .get_modes = st7703_get_modes,
|
||||
};
|
||||
|
||||
static int allpixelson_set(void *data, u64 val)
|
||||
{
|
||||
- struct jh057n *ctx = data;
|
||||
+ struct st7703 *ctx = data;
|
||||
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||
|
||||
DRM_DEV_DEBUG_DRIVER(ctx->dev, "Setting all pixels on\n");
|
||||
@@ -282,7 +284,7 @@ static int allpixelson_set(void *data, u64 val)
|
||||
DEFINE_SIMPLE_ATTRIBUTE(allpixelson_fops, NULL,
|
||||
allpixelson_set, "%llu\n");
|
||||
|
||||
-static void jh057n_debugfs_init(struct jh057n *ctx)
|
||||
+static void st7703_debugfs_init(struct st7703 *ctx)
|
||||
{
|
||||
ctx->debugfs = debugfs_create_dir(DRV_NAME, NULL);
|
||||
|
||||
@@ -290,16 +292,16 @@ static void jh057n_debugfs_init(struct jh057n *ctx)
|
||||
&allpixelson_fops);
|
||||
}
|
||||
|
||||
-static void jh057n_debugfs_remove(struct jh057n *ctx)
|
||||
+static void st7703_debugfs_remove(struct st7703 *ctx)
|
||||
{
|
||||
debugfs_remove_recursive(ctx->debugfs);
|
||||
ctx->debugfs = NULL;
|
||||
}
|
||||
|
||||
-static int jh057n_probe(struct mipi_dsi_device *dsi)
|
||||
+static int st7703_probe(struct mipi_dsi_device *dsi)
|
||||
{
|
||||
struct device *dev = &dsi->dev;
|
||||
- struct jh057n *ctx;
|
||||
+ struct st7703 *ctx;
|
||||
int ret;
|
||||
|
||||
ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
|
||||
@@ -340,7 +342,7 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- drm_panel_init(&ctx->panel, dev, &jh057n_drm_funcs,
|
||||
+ drm_panel_init(&ctx->panel, dev, &st7703_drm_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
ret = drm_panel_of_backlight(&ctx->panel);
|
||||
@@ -363,13 +365,13 @@ static int jh057n_probe(struct mipi_dsi_device *dsi)
|
||||
default_mode.vrefresh,
|
||||
mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes);
|
||||
|
||||
- jh057n_debugfs_init(ctx);
|
||||
+ st7703_debugfs_init(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void jh057n_shutdown(struct mipi_dsi_device *dsi)
|
||||
+static void st7703_shutdown(struct mipi_dsi_device *dsi)
|
||||
{
|
||||
- struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
+ struct st7703 *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
int ret;
|
||||
|
||||
ret = drm_panel_unprepare(&ctx->panel);
|
||||
@@ -383,12 +385,12 @@ static void jh057n_shutdown(struct mipi_dsi_device *dsi)
|
||||
ret);
|
||||
}
|
||||
|
||||
-static int jh057n_remove(struct mipi_dsi_device *dsi)
|
||||
+static int st7703_remove(struct mipi_dsi_device *dsi)
|
||||
{
|
||||
- struct jh057n *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
+ struct st7703 *ctx = mipi_dsi_get_drvdata(dsi);
|
||||
int ret;
|
||||
|
||||
- jh057n_shutdown(dsi);
|
||||
+ st7703_shutdown(dsi);
|
||||
|
||||
ret = mipi_dsi_detach(dsi);
|
||||
if (ret < 0)
|
||||
@@ -397,28 +399,28 @@ static int jh057n_remove(struct mipi_dsi_device *dsi)
|
||||
|
||||
drm_panel_remove(&ctx->panel);
|
||||
|
||||
- jh057n_debugfs_remove(ctx);
|
||||
+ st7703_debugfs_remove(ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static const struct of_device_id jh057n_of_match[] = {
|
||||
+static const struct of_device_id st7703_of_match[] = {
|
||||
{ .compatible = "rocktech,jh057n00900" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
-MODULE_DEVICE_TABLE(of, jh057n_of_match);
|
||||
+MODULE_DEVICE_TABLE(of, st7703_of_match);
|
||||
|
||||
-static struct mipi_dsi_driver jh057n_driver = {
|
||||
- .probe = jh057n_probe,
|
||||
- .remove = jh057n_remove,
|
||||
- .shutdown = jh057n_shutdown,
|
||||
+static struct mipi_dsi_driver st7703_driver = {
|
||||
+ .probe = st7703_probe,
|
||||
+ .remove = st7703_remove,
|
||||
+ .shutdown = st7703_shutdown,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
- .of_match_table = jh057n_of_match,
|
||||
+ .of_match_table = st7703_of_match,
|
||||
},
|
||||
};
|
||||
-module_mipi_dsi_driver(jh057n_driver);
|
||||
+module_mipi_dsi_driver(st7703_driver);
|
||||
|
||||
MODULE_AUTHOR("Guido Günther <agx@sigxcpu.org>");
|
||||
-MODULE_DESCRIPTION("DRM driver for Rocktech JH057N00900 MIPI DSI panel");
|
||||
+MODULE_DESCRIPTION("DRM driver for Sitronix ST7703 based MIPI DSI panels");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -55,5 +55,5 @@ index aa67cb037e9d..52e009dc632b 100644
|
|||
/*
|
||||
* And I'm not entirely sure what vblk is about. The driver in
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:51 +0200
|
||||
Subject: [PATCH] dt-bindings: panel: Add compatible for Xingbangda XBD599
|
||||
panel
|
||||
|
||||
Xingbangda XBD599 is a 5.99" 720x1440 MIPI-DSI LCD panel. It is based on
|
||||
Sitronix ST7703 LCD controller just like rocktech,jh057n00900. It is
|
||||
used in PinePhone.
|
||||
|
||||
Add a compatible for it.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
.../bindings/display/panel/rocktech,jh057n00900.yaml | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||
index f97c48550741..4d43a1b36d7c 100644
|
||||
--- a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||
+++ b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||
@@ -18,7 +18,11 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
- const: rocktech,jh057n00900
|
||||
+ enum:
|
||||
+ # Rocktech JH057N00900 5.5" 720x1440 TFT LCD panel
|
||||
+ - rocktech,jh057n00900
|
||||
+ # Xingbangda XBD599 5.99" 720x1440 TFT LCD panel
|
||||
+ - xingbangda,xbd599
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ondrej Jirman <megous@megous.com>
|
||||
Date: Fri, 26 Jun 2020 02:55:50 +0200
|
||||
Subject: [PATCH] dt-bindings: panel: Convert rocktech, jh057n00900 to yaml
|
||||
|
||||
Convert Rocktech MIPI DSI panel driver from txt to yaml bindings.
|
||||
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
---
|
||||
.../display/panel/rocktech,jh057n00900.txt | 23 -------
|
||||
.../display/panel/rocktech,jh057n00900.yaml | 66 +++++++++++++++++++
|
||||
2 files changed, 66 insertions(+), 23 deletions(-)
|
||||
delete mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
|
||||
create mode 100644 Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
|
||||
deleted file mode 100644
|
||||
index a372c5d84695..000000000000
|
||||
--- a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.txt
|
||||
+++ /dev/null
|
||||
@@ -1,23 +0,0 @@
|
||||
-Rocktech jh057n00900 5.5" 720x1440 TFT LCD panel
|
||||
-
|
||||
-Required properties:
|
||||
-- compatible: should be "rocktech,jh057n00900"
|
||||
-- reg: DSI virtual channel of the peripheral
|
||||
-- reset-gpios: panel reset gpio
|
||||
-- backlight: phandle of the backlight device attached to the panel
|
||||
-- vcc-supply: phandle of the regulator that provides the vcc supply voltage.
|
||||
-- iovcc-supply: phandle of the regulator that provides the iovcc supply
|
||||
- voltage.
|
||||
-
|
||||
-Example:
|
||||
-
|
||||
- &mipi_dsi {
|
||||
- panel@0 {
|
||||
- compatible = "rocktech,jh057n00900";
|
||||
- reg = <0>;
|
||||
- backlight = <&backlight>;
|
||||
- reset-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
|
||||
- vcc-supply = <®_2v8_p>;
|
||||
- iovcc-supply = <®_1v8_p>;
|
||||
- };
|
||||
- };
|
||||
diff --git a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||
new file mode 100644
|
||||
index 000000000000..f97c48550741
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||
@@ -0,0 +1,66 @@
|
||||
+# SPDX-License-Identifier: (GPL-2.0-only or BSD-2-Clause)
|
||||
+%YAML 1.2
|
||||
+---
|
||||
+$id: http://devicetree.org/schemas/display/panel/rocktech,jh057n00900.yaml#
|
||||
+$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
+
|
||||
+title: Rocktech JH057N00900 5.5" 720x1440 TFT LCD panel
|
||||
+
|
||||
+maintainers:
|
||||
+ - Ondrej Jirman <megi@xff.cz>
|
||||
+
|
||||
+description: |
|
||||
+ Rocktech JH057N00900 is a 720x1440 TFT LCD panel
|
||||
+ connected using a MIPI-DSI video interface.
|
||||
+
|
||||
+allOf:
|
||||
+ - $ref: panel-common.yaml#
|
||||
+
|
||||
+properties:
|
||||
+ compatible:
|
||||
+ const: rocktech,jh057n00900
|
||||
+
|
||||
+ reg:
|
||||
+ maxItems: 1
|
||||
+ description: DSI virtual channel
|
||||
+
|
||||
+ vcc-supply:
|
||||
+ description: Panel power supply
|
||||
+
|
||||
+ vccio-supply:
|
||||
+ description: I/O voltage supply
|
||||
+
|
||||
+ reset-gpios:
|
||||
+ description: GPIO used for the reset pin
|
||||
+ maxItems: 1
|
||||
+
|
||||
+ backlight:
|
||||
+ description: Backlight used by the panel
|
||||
+ $ref: "/schemas/types.yaml#/definitions/phandle"
|
||||
+
|
||||
+required:
|
||||
+ - compatible
|
||||
+ - reg
|
||||
+ - vcc-supply
|
||||
+ - vccio-supply
|
||||
+ - reset-gpios
|
||||
+
|
||||
+additionalProperties: false
|
||||
+
|
||||
+examples:
|
||||
+ - |
|
||||
+ #include <dt-bindings/gpio/gpio.h>
|
||||
+
|
||||
+ dsi {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ panel@0 {
|
||||
+ compatible = "rocktech,jh057n00900";
|
||||
+ reg = <0>;
|
||||
+ vcc-supply = <®_2v8_p>;
|
||||
+ iovcc-supply = <®_1v8_p>;
|
||||
+ reset-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
|
||||
+ backlight = <&backlight>;
|
||||
+ };
|
||||
+ };
|
||||
+...
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -70,5 +70,5 @@ index 000000000000..b27bcf11198f
|
|||
+
|
||||
+...
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Icenowy Zheng <icenowy@aosc.io>
|
||||
Date: Fri, 26 Jun 2020 02:55:49 +0200
|
||||
Subject: [PATCH] dt-bindings: vendor-prefixes: Add Xingbangda
|
||||
|
||||
Shenzhen Xingbangda Display Technology Co., Ltd is a company which
|
||||
produces LCD modules. It supplies the LCD panels for the PinePhone.
|
||||
|
||||
Add the vendor prefix of it.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
index 9aeab66be85f..740b116b179f 100644
|
||||
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
|
||||
@@ -1157,6 +1157,8 @@ patternProperties:
|
||||
description: Xiaomi Technology Co., Ltd.
|
||||
"^xillybus,.*":
|
||||
description: Xillybus Ltd.
|
||||
+ "^xingbangda,.*":
|
||||
+ description: Shenzhen Xingbangda Display Technology Co., Ltd
|
||||
"^xinpeng,.*":
|
||||
description: Shenzhen Xinpeng Technology Co., Ltd
|
||||
"^xlnx,.*":
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -15,7 +15,7 @@ Signed-off-by: Aaron Ma <aaron.ma@canonical.com>
|
|||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c
|
||||
index 489bb5b59475..26bb39b62956 100644
|
||||
index b2f2fcfdf732..a9e4c059d402 100644
|
||||
--- a/drivers/net/ethernet/intel/e1000e/ich8lan.c
|
||||
+++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c
|
||||
@@ -1245,9 +1245,9 @@ static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force)
|
||||
|
@ -31,5 +31,5 @@ index 489bb5b59475..26bb39b62956 100644
|
|||
goto out;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -26,10 +26,10 @@ Signed-off-by: Jeremy Cline <jcline@redhat.com>
|
|||
create mode 100644 drivers/firmware/efi/secureboot.c
|
||||
|
||||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
|
||||
index a1b8cb9a2579..28d43754aeb6 100644
|
||||
index 112efbef3414..c9de4b36ca51 100644
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -1256,19 +1256,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
@@ -1255,19 +1255,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Allocate bigger log buffer */
|
||||
setup_log_buf(1);
|
||||
|
||||
|
@ -107,10 +107,10 @@ index 000000000000..de0a3714a5d4
|
|||
+ }
|
||||
+}
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index 2e2f9f608f68..6f5b3b019d3e 100644
|
||||
index 92aa4697f558..1cdc5d8b6ac3 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -781,6 +781,14 @@ extern int __init efi_setup_pcdp_console(char *);
|
||||
@@ -785,6 +785,14 @@ extern int __init efi_setup_pcdp_console(char *);
|
||||
#define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
|
||||
#define EFI_MEM_NO_SOFT_RESERVE 11 /* Is the kernel configured to ignore soft reservations? */
|
||||
#define EFI_PRESERVE_BS_REGIONS 12 /* Are EFI boot-services memory segments available? */
|
||||
|
@ -125,7 +125,7 @@ index 2e2f9f608f68..6f5b3b019d3e 100644
|
|||
|
||||
#ifdef CONFIG_EFI
|
||||
/*
|
||||
@@ -792,6 +800,8 @@ static inline bool efi_enabled(int feature)
|
||||
@@ -796,6 +804,8 @@ static inline bool efi_enabled(int feature)
|
||||
}
|
||||
extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused);
|
||||
|
||||
|
@ -134,7 +134,7 @@ index 2e2f9f608f68..6f5b3b019d3e 100644
|
|||
bool __pure __efi_soft_reserve_enabled(void);
|
||||
|
||||
static inline bool __pure efi_soft_reserve_enabled(void)
|
||||
@@ -818,6 +828,8 @@ efi_capsule_pending(int *reset_type)
|
||||
@@ -822,6 +832,8 @@ efi_capsule_pending(int *reset_type)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ index 2e2f9f608f68..6f5b3b019d3e 100644
|
|||
static inline bool efi_soft_reserve_enabled(void)
|
||||
{
|
||||
return false;
|
||||
@@ -1090,12 +1102,6 @@ static inline bool efi_runtime_disabled(void) { return true; }
|
||||
@@ -1094,12 +1106,6 @@ static inline bool efi_runtime_disabled(void) { return true; }
|
||||
extern void efi_call_virt_check_flags(unsigned long flags, const char *call);
|
||||
extern unsigned long efi_call_virt_save_flags(void);
|
||||
|
||||
|
@ -157,5 +157,5 @@ index 2e2f9f608f68..6f5b3b019d3e 100644
|
|||
|
||||
#ifdef CONFIG_RESET_ATTACK_MITIGATION
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ Signed-off-by: Jeremy Cline <jcline@redhat.com>
|
|||
2 files changed, 21 insertions(+)
|
||||
|
||||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
|
||||
index 28d43754aeb6..19d57bfc12f9 100644
|
||||
index c9de4b36ca51..a1a012702915 100644
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -18,6 +18,7 @@
|
||||
|
@ -29,7 +29,7 @@ index 28d43754aeb6..19d57bfc12f9 100644
|
|||
#include <linux/usb/xhci-dbgp.h>
|
||||
|
||||
#include <uapi/linux/mount.h>
|
||||
@@ -1105,6 +1106,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
@@ -1104,6 +1105,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
if (efi_enabled(EFI_BOOT))
|
||||
efi_init();
|
||||
|
||||
|
@ -68,5 +68,5 @@ index e84ddf484010..d0501353a4b9 100644
|
|||
prompt "Kernel default lockdown mode"
|
||||
default LOCK_DOWN_KERNEL_FORCE_NONE
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ Signed-off-by: Laura Abbott <labbott@redhat.com>
|
|||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
|
||||
index b6858adc4f17..4c2da9f17514 100644
|
||||
index 609bd25bf154..c701912b13ab 100644
|
||||
--- a/drivers/iommu/iommu.c
|
||||
+++ b/drivers/iommu/iommu.c
|
||||
@@ -7,6 +7,7 @@
|
||||
|
@ -68,7 +68,7 @@ index b6858adc4f17..4c2da9f17514 100644
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/types.h>
|
||||
@@ -2838,3 +2839,24 @@ int iommu_sva_get_pasid(struct iommu_sva *handle)
|
||||
@@ -2849,3 +2850,24 @@ int iommu_sva_get_pasid(struct iommu_sva *handle)
|
||||
return ops->sva_get_pasid(handle);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iommu_sva_get_pasid);
|
||||
|
@ -94,5 +94,5 @@ index b6858adc4f17..4c2da9f17514 100644
|
|||
+arch_initcall(iommu_quirks);
|
||||
+#endif
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ index bbf7029e224b..cf7faa970dd6 100644
|
|||
dmi_decode_ipmi((const struct dmi_header *) dev->device_data);
|
||||
|
||||
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
|
||||
index e1b22fe0916c..894eda427214 100644
|
||||
index 737c0b6b24ea..7901e780323b 100644
|
||||
--- a/drivers/char/ipmi/ipmi_msghandler.c
|
||||
+++ b/drivers/char/ipmi/ipmi_msghandler.c
|
||||
@@ -34,6 +34,7 @@
|
||||
|
@ -95,7 +95,7 @@ index e1b22fe0916c..894eda427214 100644
|
|||
|
||||
#define IPMI_DRIVER_VERSION "39.2"
|
||||
|
||||
@@ -5155,8 +5156,21 @@ static int __init ipmi_init_msghandler_mod(void)
|
||||
@@ -5153,8 +5154,21 @@ static int __init ipmi_init_msghandler_mod(void)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -119,5 +119,5 @@ index e1b22fe0916c..894eda427214 100644
|
|||
rv = ipmi_register_driver();
|
||||
mutex_unlock(&ipmi_interfaces_mutex);
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -160,7 +160,7 @@ index 2da65fef2a1c..d53a524f80f0 100644
|
|||
|
||||
Boot into System Kernel
|
||||
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
|
||||
index d631d22089ba..c252221b2f4b 100644
|
||||
index e4dfe2a05a31..8c6f59932247 100644
|
||||
--- a/kernel/crash_core.c
|
||||
+++ b/kernel/crash_core.c
|
||||
@@ -258,6 +258,20 @@ static int __init __parse_crashkernel(char *cmdline,
|
||||
|
@ -185,5 +185,5 @@ index d631d22089ba..c252221b2f4b 100644
|
|||
* if the commandline contains a ':', then that's the extended
|
||||
* syntax -- if not, it must be the classic syntax
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
|
||||
index c252221b2f4b..df551fc9034c 100644
|
||||
index 8c6f59932247..598d8324f51a 100644
|
||||
--- a/kernel/crash_core.c
|
||||
+++ b/kernel/crash_core.c
|
||||
@@ -269,7 +269,7 @@ static int __init __parse_crashkernel(char *cmdline,
|
||||
|
@ -39,5 +39,5 @@ index c252221b2f4b..df551fc9034c 100644
|
|||
|
||||
/*
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/crash_core.c b/kernel/crash_core.c
|
||||
index 9f1557b98468..d631d22089ba 100644
|
||||
index 18175687133a..e4dfe2a05a31 100644
|
||||
--- a/kernel/crash_core.c
|
||||
+++ b/kernel/crash_core.c
|
||||
@@ -7,6 +7,7 @@
|
||||
|
@ -89,5 +89,5 @@ index 9f1557b98468..d631d22089ba 100644
|
|||
break;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -67,5 +67,5 @@ index e362dc3d2028..0c3dfb8eef67 100644
|
|||
|
||||
debugfs_create_file("kmemleak", 0644, NULL, NULL, &kmemleak_fops);
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,202 +0,0 @@
|
|||
From acf7f4a59114471c3964f118564fe8e7a6f34bb8 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Pearson <markpearson@lenovo.com>
|
||||
Date: Thu, 2 Jul 2020 21:23:53 -0400
|
||||
Subject: [PATCH] platform/x86: thinkpad_acpi: lap or desk mode interface
|
||||
|
||||
Newer Lenovo Thinkpad platforms have support to identify whether the
|
||||
system is on-lap or not using an ACPI DYTC event from the firmware.
|
||||
|
||||
This patch provides the ability to retrieve the current mode via sysfs
|
||||
entrypoints and will be used by userspace for thermal mode and WWAN
|
||||
functionality
|
||||
|
||||
Co-developed-by: Nitin Joshi <njoshi1@lenovo.com>
|
||||
Signed-off-by: Nitin Joshi <njoshi1@lenovo.com>
|
||||
Reviewed-by: Sugumaran <slacshiminar@lenovo.com>
|
||||
Reviewed-by: Bastien Nocera <bnocera@redhat.com>
|
||||
Signed-off-by: Mark Pearson <markpearson@lenovo.com>
|
||||
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
---
|
||||
.../admin-guide/laptops/thinkpad-acpi.rst | 15 +++
|
||||
drivers/platform/x86/thinkpad_acpi.c | 111 +++++++++++++++++-
|
||||
2 files changed, 124 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Documentation/admin-guide/laptops/thinkpad-acpi.rst b/Documentation/admin-guide/laptops/thinkpad-acpi.rst
|
||||
index 822907dcc845..99066aa8d97b 100644
|
||||
--- a/Documentation/admin-guide/laptops/thinkpad-acpi.rst
|
||||
+++ b/Documentation/admin-guide/laptops/thinkpad-acpi.rst
|
||||
@@ -50,6 +50,7 @@ detailed description):
|
||||
- WAN enable and disable
|
||||
- UWB enable and disable
|
||||
- LCD Shadow (PrivacyGuard) enable and disable
|
||||
+ - Lap mode sensor
|
||||
|
||||
A compatibility table by model and feature is maintained on the web
|
||||
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
||||
@@ -1432,6 +1433,20 @@ The first command ensures the best viewing angle and the latter one turns
|
||||
on the feature, restricting the viewing angles.
|
||||
|
||||
|
||||
+DYTC Lapmode sensor
|
||||
+------------------
|
||||
+
|
||||
+sysfs: dytc_lapmode
|
||||
+
|
||||
+Newer thinkpads and mobile workstations have the ability to determine if
|
||||
+the device is in deskmode or lapmode. This feature is used by user space
|
||||
+to decide if WWAN transmission can be increased to maximum power and is
|
||||
+also useful for understanding the different thermal modes available as
|
||||
+they differ between desk and lap mode.
|
||||
+
|
||||
+The property is read-only. If the platform doesn't have support the sysfs
|
||||
+class is not created.
|
||||
+
|
||||
EXPERIMENTAL: UWB
|
||||
-----------------
|
||||
|
||||
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
|
||||
index 0f6fceda5fc0..7fee3c1c2418 100644
|
||||
--- a/drivers/platform/x86/thinkpad_acpi.c
|
||||
+++ b/drivers/platform/x86/thinkpad_acpi.c
|
||||
@@ -4030,8 +4030,8 @@ static bool hotkey_notify_6xxx(const u32 hkey,
|
||||
return true;
|
||||
case TP_HKEY_EV_THM_CSM_COMPLETED:
|
||||
pr_debug("EC reports: Thermal Control Command set completed (DYTC)\n");
|
||||
- /* recommended action: do nothing, we don't have
|
||||
- * Lenovo ATM information */
|
||||
+ /* Thermal event - pass on to event handler */
|
||||
+ tpacpi_driver_event(hkey);
|
||||
return true;
|
||||
case TP_HKEY_EV_THM_TRANSFM_CHANGED:
|
||||
pr_debug("EC reports: Thermal Transformation changed (GMTS)\n");
|
||||
@@ -9803,6 +9803,105 @@ static struct ibm_struct lcdshadow_driver_data = {
|
||||
.write = lcdshadow_write,
|
||||
};
|
||||
|
||||
+/*************************************************************************
|
||||
+ * DYTC subdriver, for the Lenovo lapmode feature
|
||||
+ */
|
||||
+
|
||||
+#define DYTC_CMD_GET 2 /* To get current IC function and mode */
|
||||
+#define DYTC_GET_LAPMODE_BIT 17 /* Set when in lapmode */
|
||||
+
|
||||
+static bool dytc_lapmode;
|
||||
+
|
||||
+static void dytc_lapmode_notify_change(void)
|
||||
+{
|
||||
+ sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "dytc_lapmode");
|
||||
+}
|
||||
+
|
||||
+static int dytc_command(int command, int *output)
|
||||
+{
|
||||
+ acpi_handle dytc_handle;
|
||||
+
|
||||
+ if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "DYTC", &dytc_handle))) {
|
||||
+ /* Platform doesn't support DYTC */
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+ if (!acpi_evalf(dytc_handle, output, NULL, "dd", command))
|
||||
+ return -EIO;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int dytc_lapmode_get(bool *state)
|
||||
+{
|
||||
+ int output, err;
|
||||
+
|
||||
+ err = dytc_command(DYTC_CMD_GET, &output);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ *state = output & BIT(DYTC_GET_LAPMODE_BIT) ? true : false;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void dytc_lapmode_refresh(void)
|
||||
+{
|
||||
+ bool new_state;
|
||||
+ int err;
|
||||
+
|
||||
+ err = dytc_lapmode_get(&new_state);
|
||||
+ if (err || (new_state == dytc_lapmode))
|
||||
+ return;
|
||||
+
|
||||
+ dytc_lapmode = new_state;
|
||||
+ dytc_lapmode_notify_change();
|
||||
+}
|
||||
+
|
||||
+/* sysfs lapmode entry */
|
||||
+static ssize_t dytc_lapmode_show(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ char *buf)
|
||||
+{
|
||||
+ return snprintf(buf, PAGE_SIZE, "%d\n", dytc_lapmode);
|
||||
+}
|
||||
+
|
||||
+static DEVICE_ATTR_RO(dytc_lapmode);
|
||||
+
|
||||
+static struct attribute *dytc_attributes[] = {
|
||||
+ &dev_attr_dytc_lapmode.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group dytc_attr_group = {
|
||||
+ .attrs = dytc_attributes,
|
||||
+};
|
||||
+
|
||||
+static int tpacpi_dytc_init(struct ibm_init_struct *iibm)
|
||||
+{
|
||||
+ int err;
|
||||
+
|
||||
+ err = dytc_lapmode_get(&dytc_lapmode);
|
||||
+ /* If support isn't available (ENODEV) then don't return an error
|
||||
+ * but just don't create the sysfs group
|
||||
+ */
|
||||
+ if (err == -ENODEV)
|
||||
+ return 0;
|
||||
+ /* For all other errors we can flag the failure */
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* Platform supports this feature - create the group */
|
||||
+ err = sysfs_create_group(&tpacpi_pdev->dev.kobj, &dytc_attr_group);
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static void dytc_exit(void)
|
||||
+{
|
||||
+ sysfs_remove_group(&tpacpi_pdev->dev.kobj, &dytc_attr_group);
|
||||
+}
|
||||
+
|
||||
+static struct ibm_struct dytc_driver_data = {
|
||||
+ .name = "dytc",
|
||||
+ .exit = dytc_exit,
|
||||
+};
|
||||
+
|
||||
/****************************************************************************
|
||||
****************************************************************************
|
||||
*
|
||||
@@ -9850,6 +9949,10 @@ static void tpacpi_driver_event(const unsigned int hkey_event)
|
||||
|
||||
mutex_unlock(&kbdlight_mutex);
|
||||
}
|
||||
+
|
||||
+ if (hkey_event == TP_HKEY_EV_THM_CSM_COMPLETED)
|
||||
+ dytc_lapmode_refresh();
|
||||
+
|
||||
}
|
||||
|
||||
static void hotkey_driver_event(const unsigned int scancode)
|
||||
@@ -10288,6 +10391,10 @@ static struct ibm_init_struct ibms_init[] __initdata = {
|
||||
.init = tpacpi_lcdshadow_init,
|
||||
.data = &lcdshadow_driver_data,
|
||||
},
|
||||
+ {
|
||||
+ .init = tpacpi_dytc_init,
|
||||
+ .data = &dytc_driver_data,
|
||||
+ },
|
||||
};
|
||||
|
||||
static int __init set_ibm_param(const char *val, const struct kernel_param *kp)
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -41,7 +41,7 @@ index 90a2a17239b0..be3b72c53656 100644
|
|||
+ return !!ipl_secure_flag;
|
||||
+}
|
||||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
|
||||
index 07aa15ba43b3..307abb2d82d7 100644
|
||||
index e600f6953d7c..4264e01824b3 100644
|
||||
--- a/arch/s390/kernel/setup.c
|
||||
+++ b/arch/s390/kernel/setup.c
|
||||
@@ -49,6 +49,7 @@
|
||||
|
@ -52,7 +52,7 @@ index 07aa15ba43b3..307abb2d82d7 100644
|
|||
|
||||
#include <asm/boot_data.h>
|
||||
#include <asm/ipl.h>
|
||||
@@ -1086,6 +1087,9 @@ void __init setup_arch(char **cmdline_p)
|
||||
@@ -1085,6 +1086,9 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
log_component_list();
|
||||
|
||||
|
@ -63,5 +63,5 @@ index 07aa15ba43b3..307abb2d82d7 100644
|
|||
/* boot_command_line has been already set up in early.c */
|
||||
*cmdline_p = boot_command_line;
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -32,10 +32,10 @@ Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
|
|||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
|
||||
index cd157f11eb22..c5dc6cf57a71 100644
|
||||
index bd38c8cea56e..477eb841d4e5 100644
|
||||
--- a/drivers/scsi/smartpqi/smartpqi_init.c
|
||||
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
|
||||
@@ -8247,6 +8247,18 @@ static const struct pci_device_id pqi_pci_id_table[] = {
|
||||
@@ -8251,6 +8251,18 @@ static const struct pci_device_id pqi_pci_id_table[] = {
|
||||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
0x19e5, 0xd22c)
|
||||
},
|
||||
|
@ -54,7 +54,7 @@ index cd157f11eb22..c5dc6cf57a71 100644
|
|||
{
|
||||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
PCI_VENDOR_ID_ADAPTEC2, 0x0110)
|
||||
@@ -8383,6 +8395,10 @@ static const struct pci_device_id pqi_pci_id_table[] = {
|
||||
@@ -8387,6 +8399,10 @@ static const struct pci_device_id pqi_pci_id_table[] = {
|
||||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
PCI_VENDOR_ID_ADVANTECH, 0x8312)
|
||||
},
|
||||
|
@ -66,5 +66,5 @@ index cd157f11eb22..c5dc6cf57a71 100644
|
|||
PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
|
||||
PCI_VENDOR_ID_DELL, 0x1fe0)
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ Signed-off-by: Jeremy Cline <jcline@redhat.com>
|
|||
5 files changed, 20 insertions(+)
|
||||
|
||||
diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h
|
||||
index af998f93d256..3c33f00cd4d6 100644
|
||||
index 2a8c74d99015..0d3129588b78 100644
|
||||
--- a/include/linux/lsm_hook_defs.h
|
||||
+++ b/include/linux/lsm_hook_defs.h
|
||||
@@ -383,6 +383,8 @@ LSM_HOOK(void, LSM_RET_VOID, bpf_prog_free_security, struct bpf_prog_aux *aux)
|
||||
|
@ -30,7 +30,7 @@ index af998f93d256..3c33f00cd4d6 100644
|
|||
#ifdef CONFIG_PERF_EVENTS
|
||||
LSM_HOOK(int, 0, perf_event_open, struct perf_event_attr *attr, int type)
|
||||
diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h
|
||||
index 95b7c1d32062..dbacbb1fc129 100644
|
||||
index 9e2e3e63719d..317660f68b4f 100644
|
||||
--- a/include/linux/lsm_hooks.h
|
||||
+++ b/include/linux/lsm_hooks.h
|
||||
@@ -1507,6 +1507,12 @@
|
||||
|
@ -99,5 +99,5 @@ index 70a7ad357bc6..23e16e773bc2 100644
|
|||
int security_perf_event_open(struct perf_event_attr *attr, int type)
|
||||
{
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Lebon <jlebon@redhat.com>
|
||||
Date: Thu, 28 May 2020 10:39:40 -0400
|
||||
Subject: [PATCH] selinux: allow reading labels before policy is loaded
|
||||
|
||||
This patch does for `getxattr` what commit 3e3e24b42043 ("selinux: allow
|
||||
labeling before policy is loaded") did for `setxattr`; it allows
|
||||
querying the current SELinux label on disk before the policy is loaded.
|
||||
|
||||
One of the motivations described in that commit message also drives this
|
||||
patch: for Fedora CoreOS (and eventually RHEL CoreOS), we want to be
|
||||
able to move the root filesystem for example, from xfs to ext4 on RAID,
|
||||
on first boot, at initrd time.[1]
|
||||
|
||||
Because such an operation works at the filesystem level, we need to be
|
||||
able to read the SELinux labels first from the original root, and apply
|
||||
them to the files of the new root. The previous commit enabled the
|
||||
second part of this process; this commit enables the first part.
|
||||
|
||||
[1] https://github.com/coreos/fedora-coreos-tracker/issues/94
|
||||
|
||||
Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
|
||||
Signed-off-by: Jonathan Lebon <jlebon@redhat.com>
|
||||
Signed-off-by: Paul Moore <paul@paul-moore.com>
|
||||
---
|
||||
security/selinux/hooks.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
|
||||
index efa6108b1ce9..ca901025802a 100644
|
||||
--- a/security/selinux/hooks.c
|
||||
+++ b/security/selinux/hooks.c
|
||||
@@ -3332,7 +3332,12 @@ static int selinux_inode_getsecurity(struct inode *inode, const char *name, void
|
||||
char *context = NULL;
|
||||
struct inode_security_struct *isec;
|
||||
|
||||
- if (strcmp(name, XATTR_SELINUX_SUFFIX))
|
||||
+ /*
|
||||
+ * If we're not initialized yet, then we can't validate contexts, so
|
||||
+ * just let vfs_getxattr fall back to using the on-disk xattr.
|
||||
+ */
|
||||
+ if (!selinux_initialized(&selinux_state) ||
|
||||
+ strcmp(name, XATTR_SELINUX_SUFFIX))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/*
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -18,7 +18,7 @@ index b26181cf9095..01728a4c5309 100644
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rgmii_pins>;
|
||||
- phy-mode = "rgmii";
|
||||
+ phy-mode = "rgmii-txid";
|
||||
+ phy-mode = "rgmii-id";
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -31,7 +31,7 @@ index 2165f238af13..9741fb5caa6f 100644
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rmii_pins>;
|
||||
- phy-mode = "rmii";
|
||||
+ phy-mode = "rmii-id";
|
||||
+ phy-mode = "rmii-txid";
|
||||
phy-handle = <&ext_rmii_phy1>;
|
||||
phy-supply = <®_dc1sw>;
|
||||
status = "okay";
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 19 May 2020 11:05:40 +0200
|
||||
Subject: [PATCH] virt: vbox: Add a few new vmmdev request types to the
|
||||
userspace whitelist
|
||||
|
||||
Upstream VirtualBox has defined and is using a few new request types for
|
||||
vmmdev requests passed through /dev/vboxguest to the hypervisor.
|
||||
|
||||
Add the defines for these to vbox_vmmdev_types.h and add add them to the
|
||||
whitelists of vmmdev requests which userspace is allowed to make.
|
||||
|
||||
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1789545
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
|
||||
---
|
||||
drivers/virt/vboxguest/vboxguest_core.c | 2 ++
|
||||
include/uapi/linux/vbox_vmmdev_types.h | 3 +++
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
index 4f1addaa3f6f..ffd76b949276 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.c
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
@@ -1299,7 +1299,9 @@ static int vbg_req_allowed(struct vbg_dev *gdev, struct vbg_session *session,
|
||||
case VMMDEVREQ_VIDEO_ACCEL_ENABLE:
|
||||
case VMMDEVREQ_VIDEO_ACCEL_FLUSH:
|
||||
case VMMDEVREQ_VIDEO_SET_VISIBLE_REGION:
|
||||
+ case VMMDEVREQ_VIDEO_UPDATE_MONITOR_POSITIONS:
|
||||
case VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX:
|
||||
+ case VMMDEVREQ_GET_DISPLAY_CHANGE_REQ_MULTI:
|
||||
case VMMDEVREQ_GET_SEAMLESS_CHANGE_REQ:
|
||||
case VMMDEVREQ_GET_VRDPCHANGE_REQ:
|
||||
case VMMDEVREQ_LOG_STRING:
|
||||
diff --git a/include/uapi/linux/vbox_vmmdev_types.h b/include/uapi/linux/vbox_vmmdev_types.h
|
||||
index c27289fd619a..f8a8d6b3c521 100644
|
||||
--- a/include/uapi/linux/vbox_vmmdev_types.h
|
||||
+++ b/include/uapi/linux/vbox_vmmdev_types.h
|
||||
@@ -63,6 +63,7 @@ enum vmmdev_request_type {
|
||||
VMMDEVREQ_SET_GUEST_CAPABILITIES = 56,
|
||||
VMMDEVREQ_VIDEMODE_SUPPORTED2 = 57, /* since version 3.2.0 */
|
||||
VMMDEVREQ_GET_DISPLAY_CHANGE_REQEX = 80, /* since version 4.2.4 */
|
||||
+ VMMDEVREQ_GET_DISPLAY_CHANGE_REQ_MULTI = 81,
|
||||
VMMDEVREQ_HGCM_CONNECT = 60,
|
||||
VMMDEVREQ_HGCM_DISCONNECT = 61,
|
||||
VMMDEVREQ_HGCM_CALL32 = 62,
|
||||
@@ -92,6 +93,8 @@ enum vmmdev_request_type {
|
||||
VMMDEVREQ_WRITE_COREDUMP = 218,
|
||||
VMMDEVREQ_GUEST_HEARTBEAT = 219,
|
||||
VMMDEVREQ_HEARTBEAT_CONFIGURE = 220,
|
||||
+ VMMDEVREQ_NT_BUG_CHECK = 221,
|
||||
+ VMMDEVREQ_VIDEO_UPDATE_MONITOR_POSITIONS = 222,
|
||||
/* Ensure the enum is a 32 bit data-type */
|
||||
VMMDEVREQ_SIZEHACK = 0x7fffffff
|
||||
};
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,320 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 19 May 2020 18:04:30 +0200
|
||||
Subject: [PATCH] virt: vbox: Add support for the new
|
||||
VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES ioctl
|
||||
|
||||
Add support for the new VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES ioctl, this
|
||||
is necessary for automatic resizing of the guest resolution to match the
|
||||
VM-window size to work with the new VMSVGA virtual GPU which is now the
|
||||
new default in VirtualBox.
|
||||
|
||||
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1789545
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
|
||||
---
|
||||
drivers/virt/vboxguest/vboxguest_core.c | 163 +++++++++++++++++++++++-
|
||||
drivers/virt/vboxguest/vboxguest_core.h | 14 ++
|
||||
include/uapi/linux/vboxguest.h | 24 ++++
|
||||
3 files changed, 200 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
index 15b3cb618c6e..4f1addaa3f6f 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.c
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
@@ -679,7 +679,7 @@ static int vbg_set_host_capabilities(struct vbg_dev *gdev,
|
||||
|
||||
WARN_ON(!mutex_is_locked(&gdev->session_mutex));
|
||||
|
||||
- caps = gdev->set_guest_caps_tracker.mask;
|
||||
+ caps = gdev->acquired_guest_caps | gdev->set_guest_caps_tracker.mask;
|
||||
|
||||
if (gdev->guest_caps_host == caps)
|
||||
return 0;
|
||||
@@ -703,6 +703,113 @@ static int vbg_set_host_capabilities(struct vbg_dev *gdev,
|
||||
return vbg_status_code_to_errno(rc);
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * Acquire (get exclusive access) guest capabilities for a session.
|
||||
+ * Takes the session mutex.
|
||||
+ * Return: 0 or negative errno value.
|
||||
+ * @gdev: The Guest extension device.
|
||||
+ * @session: The session.
|
||||
+ * @flags: Flags (VBGL_IOC_AGC_FLAGS_XXX).
|
||||
+ * @or_mask: The capabilities to add.
|
||||
+ * @not_mask: The capabilities to remove.
|
||||
+ * @session_termination: Set if we're called by the session cleanup code.
|
||||
+ * This tweaks the error handling so we perform
|
||||
+ * proper session cleanup even if the host
|
||||
+ * misbehaves.
|
||||
+ */
|
||||
+static int vbg_acquire_session_capabilities(struct vbg_dev *gdev,
|
||||
+ struct vbg_session *session,
|
||||
+ u32 or_mask, u32 not_mask,
|
||||
+ u32 flags, bool session_termination)
|
||||
+{
|
||||
+ unsigned long irqflags;
|
||||
+ bool wakeup = false;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ mutex_lock(&gdev->session_mutex);
|
||||
+
|
||||
+ if (gdev->set_guest_caps_tracker.mask & or_mask) {
|
||||
+ vbg_err("%s error: cannot acquire caps which are currently set\n",
|
||||
+ __func__);
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Mark any caps in the or_mask as now being in acquire-mode. Note
|
||||
+ * once caps are in acquire_mode they always stay in this mode.
|
||||
+ * This impacts event handling, so we take the event-lock.
|
||||
+ */
|
||||
+ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
|
||||
+ gdev->acquire_mode_guest_caps |= or_mask;
|
||||
+ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
|
||||
+
|
||||
+ /* If we only have to switch the caps to acquire mode, we're done. */
|
||||
+ if (flags & VBGL_IOC_AGC_FLAGS_CONFIG_ACQUIRE_MODE)
|
||||
+ goto out;
|
||||
+
|
||||
+ not_mask &= ~or_mask; /* or_mask takes priority over not_mask */
|
||||
+ not_mask &= session->acquired_guest_caps;
|
||||
+ or_mask &= ~session->acquired_guest_caps;
|
||||
+
|
||||
+ if (or_mask == 0 && not_mask == 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (gdev->acquired_guest_caps & or_mask) {
|
||||
+ ret = -EBUSY;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ gdev->acquired_guest_caps |= or_mask;
|
||||
+ gdev->acquired_guest_caps &= ~not_mask;
|
||||
+ /* session->acquired_guest_caps impacts event handling, take the lock */
|
||||
+ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
|
||||
+ session->acquired_guest_caps |= or_mask;
|
||||
+ session->acquired_guest_caps &= ~not_mask;
|
||||
+ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
|
||||
+
|
||||
+ ret = vbg_set_host_capabilities(gdev, session, session_termination);
|
||||
+ /* Roll back on failure, unless it's session termination time. */
|
||||
+ if (ret < 0 && !session_termination) {
|
||||
+ gdev->acquired_guest_caps &= ~or_mask;
|
||||
+ gdev->acquired_guest_caps |= not_mask;
|
||||
+ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
|
||||
+ session->acquired_guest_caps &= ~or_mask;
|
||||
+ session->acquired_guest_caps |= not_mask;
|
||||
+ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * If we added a capability, check if that means some other thread in
|
||||
+ * our session should be unblocked because there are events pending
|
||||
+ * (the result of vbg_get_allowed_event_mask_for_session() may change).
|
||||
+ *
|
||||
+ * HACK ALERT! When the seamless support capability is added we generate
|
||||
+ * a seamless change event so that the ring-3 client can sync with
|
||||
+ * the seamless state.
|
||||
+ */
|
||||
+ if (ret == 0 && or_mask != 0) {
|
||||
+ spin_lock_irqsave(&gdev->event_spinlock, irqflags);
|
||||
+
|
||||
+ if (or_mask & VMMDEV_GUEST_SUPPORTS_SEAMLESS)
|
||||
+ gdev->pending_events |=
|
||||
+ VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
|
||||
+
|
||||
+ if (gdev->pending_events)
|
||||
+ wakeup = true;
|
||||
+
|
||||
+ spin_unlock_irqrestore(&gdev->event_spinlock, irqflags);
|
||||
+
|
||||
+ if (wakeup)
|
||||
+ wake_up(&gdev->event_wq);
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&gdev->session_mutex);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* Sets the guest capabilities for a session. Takes the session spinlock.
|
||||
* Return: 0 or negative errno value.
|
||||
@@ -725,6 +832,13 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
|
||||
|
||||
mutex_lock(&gdev->session_mutex);
|
||||
|
||||
+ if (gdev->acquire_mode_guest_caps & or_mask) {
|
||||
+ vbg_err("%s error: cannot set caps which are in acquire_mode\n",
|
||||
+ __func__);
|
||||
+ ret = -EBUSY;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
/* Apply the changes to the session mask. */
|
||||
previous = session->set_guest_caps;
|
||||
session->set_guest_caps |= or_mask;
|
||||
@@ -962,6 +1076,7 @@ void vbg_core_close_session(struct vbg_session *session)
|
||||
struct vbg_dev *gdev = session->gdev;
|
||||
int i, rc;
|
||||
|
||||
+ vbg_acquire_session_capabilities(gdev, session, 0, U32_MAX, 0, true);
|
||||
vbg_set_session_capabilities(gdev, session, 0, U32_MAX, true);
|
||||
vbg_set_session_event_filter(gdev, session, 0, U32_MAX, true);
|
||||
|
||||
@@ -1019,6 +1134,25 @@ static int vbg_ioctl_driver_version_info(
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* Must be called with the event_lock held */
|
||||
+static u32 vbg_get_allowed_event_mask_for_session(struct vbg_dev *gdev,
|
||||
+ struct vbg_session *session)
|
||||
+{
|
||||
+ u32 acquire_mode_caps = gdev->acquire_mode_guest_caps;
|
||||
+ u32 session_acquired_caps = session->acquired_guest_caps;
|
||||
+ u32 allowed_events = VMMDEV_EVENT_VALID_EVENT_MASK;
|
||||
+
|
||||
+ if ((acquire_mode_caps & VMMDEV_GUEST_SUPPORTS_GRAPHICS) &&
|
||||
+ !(session_acquired_caps & VMMDEV_GUEST_SUPPORTS_GRAPHICS))
|
||||
+ allowed_events &= ~VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST;
|
||||
+
|
||||
+ if ((acquire_mode_caps & VMMDEV_GUEST_SUPPORTS_SEAMLESS) &&
|
||||
+ !(session_acquired_caps & VMMDEV_GUEST_SUPPORTS_SEAMLESS))
|
||||
+ allowed_events &= ~VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST;
|
||||
+
|
||||
+ return allowed_events;
|
||||
+}
|
||||
+
|
||||
static bool vbg_wait_event_cond(struct vbg_dev *gdev,
|
||||
struct vbg_session *session,
|
||||
u32 event_mask)
|
||||
@@ -1030,6 +1164,7 @@ static bool vbg_wait_event_cond(struct vbg_dev *gdev,
|
||||
spin_lock_irqsave(&gdev->event_spinlock, flags);
|
||||
|
||||
events = gdev->pending_events & event_mask;
|
||||
+ events &= vbg_get_allowed_event_mask_for_session(gdev, session);
|
||||
wakeup = events || session->cancel_waiters;
|
||||
|
||||
spin_unlock_irqrestore(&gdev->event_spinlock, flags);
|
||||
@@ -1044,6 +1179,7 @@ static u32 vbg_consume_events_locked(struct vbg_dev *gdev,
|
||||
{
|
||||
u32 events = gdev->pending_events & event_mask;
|
||||
|
||||
+ events &= vbg_get_allowed_event_mask_for_session(gdev, session);
|
||||
gdev->pending_events &= ~events;
|
||||
return events;
|
||||
}
|
||||
@@ -1445,6 +1581,29 @@ static int vbg_ioctl_change_filter_mask(struct vbg_dev *gdev,
|
||||
false);
|
||||
}
|
||||
|
||||
+static int vbg_ioctl_acquire_guest_capabilities(struct vbg_dev *gdev,
|
||||
+ struct vbg_session *session,
|
||||
+ struct vbg_ioctl_acquire_guest_caps *caps)
|
||||
+{
|
||||
+ u32 flags, or_mask, not_mask;
|
||||
+
|
||||
+ if (vbg_ioctl_chk(&caps->hdr, sizeof(caps->u.in), 0))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ flags = caps->u.in.flags;
|
||||
+ or_mask = caps->u.in.or_mask;
|
||||
+ not_mask = caps->u.in.not_mask;
|
||||
+
|
||||
+ if (flags & ~VBGL_IOC_AGC_FLAGS_VALID_MASK)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if ((or_mask | not_mask) & ~VMMDEV_GUEST_CAPABILITIES_MASK)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return vbg_acquire_session_capabilities(gdev, session, or_mask,
|
||||
+ not_mask, flags, false);
|
||||
+}
|
||||
+
|
||||
static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev,
|
||||
struct vbg_session *session, struct vbg_ioctl_set_guest_caps *caps)
|
||||
{
|
||||
@@ -1554,6 +1713,8 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
|
||||
return vbg_ioctl_interrupt_all_wait_events(gdev, session, data);
|
||||
case VBG_IOCTL_CHANGE_FILTER_MASK:
|
||||
return vbg_ioctl_change_filter_mask(gdev, session, data);
|
||||
+ case VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES:
|
||||
+ return vbg_ioctl_acquire_guest_capabilities(gdev, session, data);
|
||||
case VBG_IOCTL_CHANGE_GUEST_CAPABILITIES:
|
||||
return vbg_ioctl_change_guest_capabilities(gdev, session, data);
|
||||
case VBG_IOCTL_CHECK_BALLOON:
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
|
||||
index dc745a033164..ab4bf64e2cec 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.h
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.h
|
||||
@@ -117,6 +117,15 @@ struct vbg_dev {
|
||||
*/
|
||||
u32 event_filter_host;
|
||||
|
||||
+ /**
|
||||
+ * Guest capabilities which have been switched to acquire_mode.
|
||||
+ */
|
||||
+ u32 acquire_mode_guest_caps;
|
||||
+ /**
|
||||
+ * Guest capabilities acquired by vbg_acquire_session_capabilities().
|
||||
+ * Only one session can acquire a capability at a time.
|
||||
+ */
|
||||
+ u32 acquired_guest_caps;
|
||||
/**
|
||||
* Usage counters for guest capabilities requested through
|
||||
* vbg_set_session_capabilities(). Indexed by capability bit
|
||||
@@ -164,6 +173,11 @@ struct vbg_session {
|
||||
* host filter. Protected by vbg_gdev.session_mutex.
|
||||
*/
|
||||
u32 event_filter;
|
||||
+ /**
|
||||
+ * Guest capabilities acquired by vbg_acquire_session_capabilities().
|
||||
+ * Only one session can acquire a capability at a time.
|
||||
+ */
|
||||
+ u32 acquired_guest_caps;
|
||||
/**
|
||||
* Guest capabilities set through vbg_set_session_capabilities().
|
||||
* A capability claimed by any guest session will be reported to the
|
||||
diff --git a/include/uapi/linux/vboxguest.h b/include/uapi/linux/vboxguest.h
|
||||
index f79d7abe27db..15125f6ec60d 100644
|
||||
--- a/include/uapi/linux/vboxguest.h
|
||||
+++ b/include/uapi/linux/vboxguest.h
|
||||
@@ -257,6 +257,30 @@ VMMDEV_ASSERT_SIZE(vbg_ioctl_change_filter, 24 + 8);
|
||||
_IOWR('V', 12, struct vbg_ioctl_change_filter)
|
||||
|
||||
|
||||
+/** VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES data structure. */
|
||||
+struct vbg_ioctl_acquire_guest_caps {
|
||||
+ /** The header. */
|
||||
+ struct vbg_ioctl_hdr hdr;
|
||||
+ union {
|
||||
+ struct {
|
||||
+ /** Flags (VBGL_IOC_AGC_FLAGS_XXX). */
|
||||
+ __u32 flags;
|
||||
+ /** Capabilities to set (VMMDEV_GUEST_SUPPORTS_XXX). */
|
||||
+ __u32 or_mask;
|
||||
+ /** Capabilities to drop (VMMDEV_GUEST_SUPPORTS_XXX). */
|
||||
+ __u32 not_mask;
|
||||
+ } in;
|
||||
+ } u;
|
||||
+};
|
||||
+VMMDEV_ASSERT_SIZE(vbg_ioctl_acquire_guest_caps, 24 + 12);
|
||||
+
|
||||
+#define VBGL_IOC_AGC_FLAGS_CONFIG_ACQUIRE_MODE 0x00000001
|
||||
+#define VBGL_IOC_AGC_FLAGS_VALID_MASK 0x00000001
|
||||
+
|
||||
+#define VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES \
|
||||
+ _IOWR('V', 13, struct vbg_ioctl_acquire_guest_caps)
|
||||
+
|
||||
+
|
||||
/** VBG_IOCTL_CHANGE_GUEST_CAPABILITIES data structure. */
|
||||
struct vbg_ioctl_set_guest_caps {
|
||||
/** The header. */
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,130 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 19 May 2020 15:30:29 +0200
|
||||
Subject: [PATCH] virt: vbox: Add vbg_set_host_capabilities() helper function
|
||||
|
||||
Add vbg_set_host_capabilities() helper function, this is a preparation
|
||||
patch for adding support for the VBGL_IOCTL_GUEST_CAPS_ACQUIRE ioctl.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
|
||||
---
|
||||
drivers/virt/vboxguest/vboxguest_core.c | 79 ++++++++++++++-----------
|
||||
1 file changed, 46 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
index aee5eff229f2..15b3cb618c6e 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.c
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
@@ -661,6 +661,48 @@ static int vbg_reset_host_capabilities(struct vbg_dev *gdev)
|
||||
return vbg_status_code_to_errno(rc);
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * Set guest capabilities on the host.
|
||||
+ * Must be called with gdev->session_mutex hold.
|
||||
+ * Return: 0 or negative errno value.
|
||||
+ * @gdev: The Guest extension device.
|
||||
+ * @session: The session.
|
||||
+ * @session_termination: Set if we're called by the session cleanup code.
|
||||
+ */
|
||||
+static int vbg_set_host_capabilities(struct vbg_dev *gdev,
|
||||
+ struct vbg_session *session,
|
||||
+ bool session_termination)
|
||||
+{
|
||||
+ struct vmmdev_mask *req;
|
||||
+ u32 caps;
|
||||
+ int rc;
|
||||
+
|
||||
+ WARN_ON(!mutex_is_locked(&gdev->session_mutex));
|
||||
+
|
||||
+ caps = gdev->set_guest_caps_tracker.mask;
|
||||
+
|
||||
+ if (gdev->guest_caps_host == caps)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* On termination the requestor is the kernel, as we're cleaning up. */
|
||||
+ req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
|
||||
+ session_termination ? VBG_KERNEL_REQUEST :
|
||||
+ session->requestor);
|
||||
+ if (!req) {
|
||||
+ gdev->guest_caps_host = U32_MAX;
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ req->or_mask = caps;
|
||||
+ req->not_mask = ~caps;
|
||||
+ rc = vbg_req_perform(gdev, req);
|
||||
+ vbg_req_free(req, sizeof(*req));
|
||||
+
|
||||
+ gdev->guest_caps_host = (rc >= 0) ? caps : U32_MAX;
|
||||
+
|
||||
+ return vbg_status_code_to_errno(rc);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* Sets the guest capabilities for a session. Takes the session spinlock.
|
||||
* Return: 0 or negative errno value.
|
||||
@@ -678,23 +720,8 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
|
||||
u32 or_mask, u32 not_mask,
|
||||
bool session_termination)
|
||||
{
|
||||
- struct vmmdev_mask *req;
|
||||
u32 changed, previous;
|
||||
- int rc, ret = 0;
|
||||
-
|
||||
- /*
|
||||
- * Allocate a request buffer before taking the spinlock, when
|
||||
- * the session is being terminated the requestor is the kernel,
|
||||
- * as we're cleaning up.
|
||||
- */
|
||||
- req = vbg_req_alloc(sizeof(*req), VMMDEVREQ_SET_GUEST_CAPABILITIES,
|
||||
- session_termination ? VBG_KERNEL_REQUEST :
|
||||
- session->requestor);
|
||||
- if (!req) {
|
||||
- if (!session_termination)
|
||||
- return -ENOMEM;
|
||||
- /* Ignore allocation failure, we must do session cleanup. */
|
||||
- }
|
||||
+ int ret = 0;
|
||||
|
||||
mutex_lock(&gdev->session_mutex);
|
||||
|
||||
@@ -709,23 +736,10 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
|
||||
goto out;
|
||||
|
||||
vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed, previous);
|
||||
- or_mask = gdev->set_guest_caps_tracker.mask;
|
||||
-
|
||||
- if (gdev->guest_caps_host == or_mask || !req)
|
||||
- goto out;
|
||||
-
|
||||
- gdev->guest_caps_host = or_mask;
|
||||
- req->or_mask = or_mask;
|
||||
- req->not_mask = ~or_mask;
|
||||
- rc = vbg_req_perform(gdev, req);
|
||||
- if (rc < 0) {
|
||||
- ret = vbg_status_code_to_errno(rc);
|
||||
-
|
||||
- /* Failed, roll back (unless it's session termination time). */
|
||||
- gdev->guest_caps_host = U32_MAX;
|
||||
- if (session_termination)
|
||||
- goto out;
|
||||
|
||||
+ ret = vbg_set_host_capabilities(gdev, session, session_termination);
|
||||
+ /* Roll back on failure, unless it's session termination time. */
|
||||
+ if (ret < 0 && !session_termination) {
|
||||
vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed,
|
||||
session->set_guest_caps);
|
||||
session->set_guest_caps = previous;
|
||||
@@ -733,7 +747,6 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
|
||||
|
||||
out:
|
||||
mutex_unlock(&gdev->session_mutex);
|
||||
- vbg_req_free(req, sizeof(*req));
|
||||
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 19 May 2020 11:24:43 +0200
|
||||
Subject: [PATCH] virt: vbox: Log unknown ioctl requests as error
|
||||
|
||||
Every now and then upstream adds new ioctls without notifying us,
|
||||
log unknown ioctl requests as an error to catch these.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
|
||||
---
|
||||
drivers/virt/vboxguest/vboxguest_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
index ffd76b949276..e0e343d0ba93 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.c
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
@@ -1739,7 +1739,7 @@ int vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data)
|
||||
return vbg_ioctl_log(data);
|
||||
}
|
||||
|
||||
- vbg_debug("VGDrvCommonIoCtl: Unknown req %#08x\n", req);
|
||||
+ vbg_err("Userspace made an unknown ioctl req %#08x\n", req);
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 19 May 2020 14:33:13 +0200
|
||||
Subject: [PATCH] virt: vbox: Rename guest_caps struct members to
|
||||
set_guest_caps
|
||||
|
||||
Rename guest_caps[_tracker] struct members to set_guest_caps[_tracker]
|
||||
this is a preparation patch for adding support for the
|
||||
VBGL_IOCTL_GUEST_CAPS_ACQUIRE ioctl.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Upstream Status: https://lore.kernel.org/lkml/20200520195440.38759-1-hdegoede@redhat.com/
|
||||
---
|
||||
drivers/virt/vboxguest/vboxguest_core.c | 20 ++++++++++----------
|
||||
drivers/virt/vboxguest/vboxguest_core.h | 9 +++++----
|
||||
2 files changed, 15 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.c b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
index 18ebd7a6af98..aee5eff229f2 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.c
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.c
|
||||
@@ -699,17 +699,17 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
|
||||
mutex_lock(&gdev->session_mutex);
|
||||
|
||||
/* Apply the changes to the session mask. */
|
||||
- previous = session->guest_caps;
|
||||
- session->guest_caps |= or_mask;
|
||||
- session->guest_caps &= ~not_mask;
|
||||
+ previous = session->set_guest_caps;
|
||||
+ session->set_guest_caps |= or_mask;
|
||||
+ session->set_guest_caps &= ~not_mask;
|
||||
|
||||
/* If anything actually changed, update the global usage counters. */
|
||||
- changed = previous ^ session->guest_caps;
|
||||
+ changed = previous ^ session->set_guest_caps;
|
||||
if (!changed)
|
||||
goto out;
|
||||
|
||||
- vbg_track_bit_usage(&gdev->guest_caps_tracker, changed, previous);
|
||||
- or_mask = gdev->guest_caps_tracker.mask;
|
||||
+ vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed, previous);
|
||||
+ or_mask = gdev->set_guest_caps_tracker.mask;
|
||||
|
||||
if (gdev->guest_caps_host == or_mask || !req)
|
||||
goto out;
|
||||
@@ -726,9 +726,9 @@ static int vbg_set_session_capabilities(struct vbg_dev *gdev,
|
||||
if (session_termination)
|
||||
goto out;
|
||||
|
||||
- vbg_track_bit_usage(&gdev->guest_caps_tracker, changed,
|
||||
- session->guest_caps);
|
||||
- session->guest_caps = previous;
|
||||
+ vbg_track_bit_usage(&gdev->set_guest_caps_tracker, changed,
|
||||
+ session->set_guest_caps);
|
||||
+ session->set_guest_caps = previous;
|
||||
}
|
||||
|
||||
out:
|
||||
@@ -1452,7 +1452,7 @@ static int vbg_ioctl_change_guest_capabilities(struct vbg_dev *gdev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- caps->u.out.session_caps = session->guest_caps;
|
||||
+ caps->u.out.session_caps = session->set_guest_caps;
|
||||
caps->u.out.global_caps = gdev->guest_caps_host;
|
||||
|
||||
return 0;
|
||||
diff --git a/drivers/virt/vboxguest/vboxguest_core.h b/drivers/virt/vboxguest/vboxguest_core.h
|
||||
index 77c3a9c8255d..dc745a033164 100644
|
||||
--- a/drivers/virt/vboxguest/vboxguest_core.h
|
||||
+++ b/drivers/virt/vboxguest/vboxguest_core.h
|
||||
@@ -118,11 +118,12 @@ struct vbg_dev {
|
||||
u32 event_filter_host;
|
||||
|
||||
/**
|
||||
- * Usage counters for guest capabilities. Indexed by capability bit
|
||||
+ * Usage counters for guest capabilities requested through
|
||||
+ * vbg_set_session_capabilities(). Indexed by capability bit
|
||||
* number, one count per session using a capability.
|
||||
* Protected by session_mutex.
|
||||
*/
|
||||
- struct vbg_bit_usage_tracker guest_caps_tracker;
|
||||
+ struct vbg_bit_usage_tracker set_guest_caps_tracker;
|
||||
/**
|
||||
* The guest capabilities last reported to the host (or UINT32_MAX).
|
||||
* Protected by session_mutex.
|
||||
@@ -164,11 +165,11 @@ struct vbg_session {
|
||||
*/
|
||||
u32 event_filter;
|
||||
/**
|
||||
- * Guest capabilities for this session.
|
||||
+ * Guest capabilities set through vbg_set_session_capabilities().
|
||||
* A capability claimed by any guest session will be reported to the
|
||||
* host. Protected by vbg_gdev.session_mutex.
|
||||
*/
|
||||
- u32 guest_caps;
|
||||
+ u32 set_guest_caps;
|
||||
/** VMMDEV_REQUESTOR_* flags */
|
||||
u32 requestor;
|
||||
/** Set on CANCEL_ALL_WAITEVENTS, protected by vbg_devevent_spinlock. */
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
From 073d0552ead5bfc7a3a9c01de590e924f11b5dd2 Mon Sep 17 00:00:00 2001
|
||||
From: Juergen Gross <jgross@suse.com>
|
||||
Date: Mon, 7 Sep 2020 15:47:27 +0200
|
||||
Subject: [PATCH] xen/events: avoid removing an event channel while handling it
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Today it can happen that an event channel is being removed from the
|
||||
system while the event handling loop is active. This can lead to a
|
||||
race resulting in crashes or WARN() splats when trying to access the
|
||||
irq_info structure related to the event channel.
|
||||
|
||||
Fix this problem by using a rwlock taken as reader in the event
|
||||
handling loop and as writer when deallocating the irq_info structure.
|
||||
|
||||
As the observed problem was a NULL dereference in evtchn_from_irq()
|
||||
make this function more robust against races by testing the irq_info
|
||||
pointer to be not NULL before dereferencing it.
|
||||
|
||||
And finally make all accesses to evtchn_to_irq[row][col] atomic ones
|
||||
in order to avoid seeing partial updates of an array element in irq
|
||||
handling. Note that irq handling can be entered only for event channels
|
||||
which have been valid before, so any not populated row isn't a problem
|
||||
in this regard, as rows are only ever added and never removed.
|
||||
|
||||
This is XSA-331.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Reported-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
|
||||
Reported-by: Jinoh Kang <luke1337@theori.io>
|
||||
Signed-off-by: Juergen Gross <jgross@suse.com>
|
||||
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
|
||||
Reviewed-by: Wei Liu <wl@xen.org>
|
||||
---
|
||||
drivers/xen/events/events_base.c | 41 ++++++++++++++++++++++++++++----
|
||||
1 file changed, 36 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
|
||||
index 6f02c18fa65c..407741ece084 100644
|
||||
--- a/drivers/xen/events/events_base.c
|
||||
+++ b/drivers/xen/events/events_base.c
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/irqnr.h>
|
||||
#include <linux/pci.h>
|
||||
+#include <linux/spinlock.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/desc.h>
|
||||
@@ -71,6 +72,23 @@ const struct evtchn_ops *evtchn_ops;
|
||||
*/
|
||||
static DEFINE_MUTEX(irq_mapping_update_lock);
|
||||
|
||||
+/*
|
||||
+ * Lock protecting event handling loop against removing event channels.
|
||||
+ * Adding of event channels is no issue as the associated IRQ becomes active
|
||||
+ * only after everything is setup (before request_[threaded_]irq() the handler
|
||||
+ * can't be entered for an event, as the event channel will be unmasked only
|
||||
+ * then).
|
||||
+ */
|
||||
+static DEFINE_RWLOCK(evtchn_rwlock);
|
||||
+
|
||||
+/*
|
||||
+ * Lock hierarchy:
|
||||
+ *
|
||||
+ * irq_mapping_update_lock
|
||||
+ * evtchn_rwlock
|
||||
+ * IRQ-desc lock
|
||||
+ */
|
||||
+
|
||||
static LIST_HEAD(xen_irq_list_head);
|
||||
|
||||
/* IRQ <-> VIRQ mapping. */
|
||||
@@ -105,7 +123,7 @@ static void clear_evtchn_to_irq_row(unsigned row)
|
||||
unsigned col;
|
||||
|
||||
for (col = 0; col < EVTCHN_PER_ROW; col++)
|
||||
- evtchn_to_irq[row][col] = -1;
|
||||
+ WRITE_ONCE(evtchn_to_irq[row][col], -1);
|
||||
}
|
||||
|
||||
static void clear_evtchn_to_irq_all(void)
|
||||
@@ -142,7 +160,7 @@ static int set_evtchn_to_irq(evtchn_port_t evtchn, unsigned int irq)
|
||||
clear_evtchn_to_irq_row(row);
|
||||
}
|
||||
|
||||
- evtchn_to_irq[row][col] = irq;
|
||||
+ WRITE_ONCE(evtchn_to_irq[row][col], irq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -152,7 +170,7 @@ int get_evtchn_to_irq(evtchn_port_t evtchn)
|
||||
return -1;
|
||||
if (evtchn_to_irq[EVTCHN_ROW(evtchn)] == NULL)
|
||||
return -1;
|
||||
- return evtchn_to_irq[EVTCHN_ROW(evtchn)][EVTCHN_COL(evtchn)];
|
||||
+ return READ_ONCE(evtchn_to_irq[EVTCHN_ROW(evtchn)][EVTCHN_COL(evtchn)]);
|
||||
}
|
||||
|
||||
/* Get info for IRQ */
|
||||
@@ -261,10 +279,14 @@ static void xen_irq_info_cleanup(struct irq_info *info)
|
||||
*/
|
||||
evtchn_port_t evtchn_from_irq(unsigned irq)
|
||||
{
|
||||
- if (WARN(irq >= nr_irqs, "Invalid irq %d!\n", irq))
|
||||
+ const struct irq_info *info = NULL;
|
||||
+
|
||||
+ if (likely(irq < nr_irqs))
|
||||
+ info = info_for_irq(irq);
|
||||
+ if (!info)
|
||||
return 0;
|
||||
|
||||
- return info_for_irq(irq)->evtchn;
|
||||
+ return info->evtchn;
|
||||
}
|
||||
|
||||
unsigned int irq_from_evtchn(evtchn_port_t evtchn)
|
||||
@@ -440,16 +462,21 @@ static int __must_check xen_allocate_irq_gsi(unsigned gsi)
|
||||
static void xen_free_irq(unsigned irq)
|
||||
{
|
||||
struct irq_info *info = info_for_irq(irq);
|
||||
+ unsigned long flags;
|
||||
|
||||
if (WARN_ON(!info))
|
||||
return;
|
||||
|
||||
+ write_lock_irqsave(&evtchn_rwlock, flags);
|
||||
+
|
||||
list_del(&info->list);
|
||||
|
||||
set_info_for_irq(irq, NULL);
|
||||
|
||||
WARN_ON(info->refcnt > 0);
|
||||
|
||||
+ write_unlock_irqrestore(&evtchn_rwlock, flags);
|
||||
+
|
||||
kfree(info);
|
||||
|
||||
/* Legacy IRQ descriptors are managed by the arch. */
|
||||
@@ -1233,6 +1260,8 @@ static void __xen_evtchn_do_upcall(void)
|
||||
struct vcpu_info *vcpu_info = __this_cpu_read(xen_vcpu);
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
+ read_lock(&evtchn_rwlock);
|
||||
+
|
||||
do {
|
||||
vcpu_info->evtchn_upcall_pending = 0;
|
||||
|
||||
@@ -1243,6 +1272,8 @@ static void __xen_evtchn_do_upcall(void)
|
||||
virt_rmb(); /* Hypervisor can set upcall pending. */
|
||||
|
||||
} while (vcpu_info->evtchn_upcall_pending);
|
||||
+
|
||||
+ read_unlock(&evtchn_rwlock);
|
||||
}
|
||||
|
||||
void xen_evtchn_do_upcall(struct pt_regs *regs)
|
||||
--
|
||||
2.28.0
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
From 6acf1ba7596a051d6ff4092d22bf9c4ce210d9f5 Mon Sep 17 00:00:00 2001
|
||||
From: Vidya Sagar <vidyas@nvidia.com>
|
||||
Date: Sat, 11 Jan 2020 00:44:59 +0530
|
||||
Subject: [PATCH 2/2] arm64: tegra: Re-order PCIe aperture mappings to support
|
||||
ACPI boot
|
||||
|
||||
Re-order Tegra194's PCIe aperture mappings to have IO window moved to
|
||||
64-bit aperture and have the entire 32-bit aperture used for accessing
|
||||
the configuration space. This makes it to use the entire 32MB of the 32-bit
|
||||
aperture for ECAM purpose while booting through ACPI.
|
||||
|
||||
Signed-off-by: Vidya Sagar <vidyas@nvidia.com>
|
||||
---
|
||||
arch/arm64/boot/dts/nvidia/tegra194.dtsi | 36 ++++++++++++------------
|
||||
1 file changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/nvidia/tegra194.dtsi b/arch/arm64/boot/dts/nvidia/tegra194.dtsi
|
||||
index 4bc187a4eacdb..2b378fa06d19e 100644
|
||||
--- a/arch/arm64/boot/dts/nvidia/tegra194.dtsi
|
||||
+++ b/arch/arm64/boot/dts/nvidia/tegra194.dtsi
|
||||
@@ -1404,9 +1404,9 @@ pcie@14100000 {
|
||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||
|
||||
bus-range = <0x0 0xff>;
|
||||
- ranges = <0x81000000 0x0 0x30100000 0x0 0x30100000 0x0 0x00100000 /* downstream I/O (1MB) */
|
||||
- 0xc3000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000 /* prefetchable memory (768MB) */
|
||||
- 0x82000000 0x0 0x40000000 0x12 0x30000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
|
||||
+ ranges = <0xc3000000 0x12 0x00000000 0x12 0x00000000 0x0 0x30000000 /* prefetchable memory (768MB) */
|
||||
+ 0x82000000 0x00 0x40000000 0x12 0x30000000 0x0 0x0fff0000 /* non-prefetchable memory (256MB - 64KB) */
|
||||
+ 0x81000000 0x00 0x00000000 0x12 0x3fff0000 0x0 0x00010000>; /* downstream I/O (64KB) */
|
||||
};
|
||||
|
||||
pcie@14120000 {
|
||||
@@ -1449,9 +1449,9 @@ pcie@14120000 {
|
||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||
|
||||
bus-range = <0x0 0xff>;
|
||||
- ranges = <0x81000000 0x0 0x32100000 0x0 0x32100000 0x0 0x00100000 /* downstream I/O (1MB) */
|
||||
- 0xc3000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000 /* prefetchable memory (768MB) */
|
||||
- 0x82000000 0x0 0x40000000 0x12 0x70000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
|
||||
+ ranges = <0xc3000000 0x12 0x40000000 0x12 0x40000000 0x0 0x30000000 /* prefetchable memory (768MB) */
|
||||
+ 0x82000000 0x00 0x40000000 0x12 0x70000000 0x0 0x0fff0000 /* non-prefetchable memory (256MB - 64KB) */
|
||||
+ 0x81000000 0x00 0x00000000 0x12 0x7fff0000 0x0 0x00010000>; /* downstream I/O (64KB) */
|
||||
};
|
||||
|
||||
pcie@14140000 {
|
||||
@@ -1494,9 +1494,9 @@ pcie@14140000 {
|
||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||
|
||||
bus-range = <0x0 0xff>;
|
||||
- ranges = <0x81000000 0x0 0x34100000 0x0 0x34100000 0x0 0x00100000 /* downstream I/O (1MB) */
|
||||
- 0xc3000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000 /* prefetchable memory (768MB) */
|
||||
- 0x82000000 0x0 0x40000000 0x12 0xb0000000 0x0 0x10000000>; /* non-prefetchable memory (256MB) */
|
||||
+ ranges = <0xc3000000 0x12 0x80000000 0x12 0x80000000 0x0 0x30000000 /* prefetchable memory (768MB) */
|
||||
+ 0x82000000 0x00 0x40000000 0x12 0xb0000000 0x0 0x0fff0000 /* non-prefetchable memory (256MB - 64KB) */
|
||||
+ 0x81000000 0x00 0x00000000 0x12 0xbfff0000 0x0 0x00010000>; /* downstream I/O (64KB) */
|
||||
};
|
||||
|
||||
pcie@14160000 {
|
||||
@@ -1539,9 +1539,9 @@ pcie@14160000 {
|
||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||
|
||||
bus-range = <0x0 0xff>;
|
||||
- ranges = <0x81000000 0x0 0x36100000 0x0 0x36100000 0x0 0x00100000 /* downstream I/O (1MB) */
|
||||
- 0xc3000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */
|
||||
- 0x82000000 0x0 0x40000000 0x17 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
|
||||
+ ranges = <0xc3000000 0x14 0x00000000 0x14 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */
|
||||
+ 0x82000000 0x00 0x40000000 0x17 0x40000000 0x0 0xbfff0000 /* non-prefetchable memory (3GB - 64KB) */
|
||||
+ 0x81000000 0x00 0x00000000 0x17 0xffff0000 0x0 0x00010000>; /* downstream I/O (64KB) */
|
||||
};
|
||||
|
||||
pcie@14180000 {
|
||||
@@ -1584,9 +1584,9 @@ pcie@14180000 {
|
||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||
|
||||
bus-range = <0x0 0xff>;
|
||||
- ranges = <0x81000000 0x0 0x38100000 0x0 0x38100000 0x0 0x00100000 /* downstream I/O (1MB) */
|
||||
- 0xc3000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */
|
||||
- 0x82000000 0x0 0x40000000 0x1b 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
|
||||
+ ranges = <0xc3000000 0x18 0x00000000 0x18 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */
|
||||
+ 0x82000000 0x00 0x40000000 0x1b 0x40000000 0x0 0xbfff0000 /* non-prefetchable memory (3GB - 64KB) */
|
||||
+ 0x81000000 0x00 0x00000000 0x1b 0xffff0000 0x0 0x00010000>; /* downstream I/O (64KB) */
|
||||
};
|
||||
|
||||
pcie@141a0000 {
|
||||
@@ -1633,9 +1633,9 @@ pcie@141a0000 {
|
||||
nvidia,aspm-l0s-entrance-latency-us = <3>;
|
||||
|
||||
bus-range = <0x0 0xff>;
|
||||
- ranges = <0x81000000 0x0 0x3a100000 0x0 0x3a100000 0x0 0x00100000 /* downstream I/O (1MB) */
|
||||
- 0xc3000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */
|
||||
- 0x82000000 0x0 0x40000000 0x1f 0x40000000 0x0 0xc0000000>; /* non-prefetchable memory (3GB) */
|
||||
+ ranges = <0xc3000000 0x1c 0x00000000 0x1c 0x00000000 0x3 0x40000000 /* prefetchable memory (13GB) */
|
||||
+ 0x82000000 0x00 0x40000000 0x1f 0x40000000 0x0 0xbfff0000 /* non-prefetchable memory (3GB - 64KB) */
|
||||
+ 0x81000000 0x00 0x00000000 0x1f 0xffff0000 0x0 0x00010000>; /* downstream I/O (64KB) */
|
||||
};
|
||||
|
||||
pcie_ep@14160000 {
|
||||
--
|
||||
2.26.2
|
|
@ -1,305 +0,0 @@
|
|||
From MAILER-DAEMON Wed Oct 14 16:34:37 2020
|
||||
From: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
|
||||
To: netdev@vger.kernel.org
|
||||
Cc: Gerrit Renker <gerrit@erg.abdn.ac.uk>, "David S. Miller" <davem@davemloft.net>, Jakub Kicinski <kuba@kernel.org>, Thadeu Lima de Souza Cascardo <cascardo@canonical.com>, "Gustavo A. R. Silva" <gustavoars@kernel.org>, "Alexander A. Klimov" <grandmaster@al2klimov.de>, Kees Cook <keescook@chromium.org>, Eric Dumazet <edumazet@google.com>, Alexey Kodanev <alexey.kodanev@oracle.com>, dccp@vger.kernel.org, linux-kernel@vger.kernel.org
|
||||
Subject: [PATCH 1/2] dccp: ccid: move timers to struct dccp_sock
|
||||
Date: Tue, 13 Oct 2020 19:18:48 +0200
|
||||
Message-Id: <20201013171849.236025-2-kleber.souza@canonical.com>
|
||||
In-Reply-To: <20201013171849.236025-1-kleber.souza@canonical.com>
|
||||
References: <20201013171849.236025-1-kleber.souza@canonical.com>
|
||||
List-ID: <linux-kernel.vger.kernel.org>
|
||||
X-Mailing-List: linux-kernel@vger.kernel.org
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
From: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
|
||||
|
||||
When dccps_hc_tx_ccid is freed, ccid timers may still trigger. The reason
|
||||
del_timer_sync can't be used is because this relies on keeping a reference
|
||||
to struct sock. But as we keep a pointer to dccps_hc_tx_ccid and free that
|
||||
during disconnect, the timer should really belong to struct dccp_sock.
|
||||
|
||||
This addresses CVE-2020-16119.
|
||||
|
||||
Fixes: 839a6094140a (net: dccp: Convert timers to use timer_setup())
|
||||
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
|
||||
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
|
||||
Acked-bd: Richard Sailer <richard_siegfried@systemli.org>
|
||||
---
|
||||
include/linux/dccp.h | 2 ++
|
||||
net/dccp/ccids/ccid2.c | 32 +++++++++++++++++++-------------
|
||||
net/dccp/ccids/ccid3.c | 30 ++++++++++++++++++++----------
|
||||
3 files changed, 41 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/include/linux/dccp.h b/include/linux/dccp.h
|
||||
index 07e547c02fd8..504afa1a4be6 100644
|
||||
--- a/include/linux/dccp.h
|
||||
+++ b/include/linux/dccp.h
|
||||
@@ -259,6 +259,7 @@ struct dccp_ackvec;
|
||||
* @dccps_sync_scheduled - flag which signals "send out-of-band message soon"
|
||||
* @dccps_xmitlet - tasklet scheduled by the TX CCID to dequeue data packets
|
||||
* @dccps_xmit_timer - used by the TX CCID to delay sending (rate-based pacing)
|
||||
+ * @dccps_ccid_timer - used by the CCIDs
|
||||
* @dccps_syn_rtt - RTT sample from Request/Response exchange (in usecs)
|
||||
*/
|
||||
struct dccp_sock {
|
||||
@@ -303,6 +304,7 @@ struct dccp_sock {
|
||||
__u8 dccps_sync_scheduled:1;
|
||||
struct tasklet_struct dccps_xmitlet;
|
||||
struct timer_list dccps_xmit_timer;
|
||||
+ struct timer_list dccps_ccid_timer;
|
||||
};
|
||||
|
||||
static inline struct dccp_sock *dccp_sk(const struct sock *sk)
|
||||
diff --git a/net/dccp/ccids/ccid2.c b/net/dccp/ccids/ccid2.c
|
||||
index 3da1f77bd039..dbca1f1e2449 100644
|
||||
--- a/net/dccp/ccids/ccid2.c
|
||||
+++ b/net/dccp/ccids/ccid2.c
|
||||
@@ -126,21 +126,26 @@ static void dccp_tasklet_schedule(struct sock *sk)
|
||||
|
||||
static void ccid2_hc_tx_rto_expire(struct timer_list *t)
|
||||
{
|
||||
- struct ccid2_hc_tx_sock *hc = from_timer(hc, t, tx_rtotimer);
|
||||
- struct sock *sk = hc->sk;
|
||||
- const bool sender_was_blocked = ccid2_cwnd_network_limited(hc);
|
||||
+ struct dccp_sock *dp = from_timer(dp, t, dccps_ccid_timer);
|
||||
+ struct sock *sk = (struct sock *)dp;
|
||||
+ struct ccid2_hc_tx_sock *hc;
|
||||
+ bool sender_was_blocked;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
+
|
||||
+ if (inet_sk_state_load(sk) == DCCP_CLOSED)
|
||||
+ goto out;
|
||||
+
|
||||
+ hc = ccid_priv(dp->dccps_hc_tx_ccid);
|
||||
+ sender_was_blocked = ccid2_cwnd_network_limited(hc);
|
||||
+
|
||||
if (sock_owned_by_user(sk)) {
|
||||
- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + HZ / 5);
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + HZ / 5);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ccid2_pr_debug("RTO_EXPIRE\n");
|
||||
|
||||
- if (sk->sk_state == DCCP_CLOSED)
|
||||
- goto out;
|
||||
-
|
||||
/* back-off timer */
|
||||
hc->tx_rto <<= 1;
|
||||
if (hc->tx_rto > DCCP_RTO_MAX)
|
||||
@@ -166,7 +171,7 @@ static void ccid2_hc_tx_rto_expire(struct timer_list *t)
|
||||
if (sender_was_blocked)
|
||||
dccp_tasklet_schedule(sk);
|
||||
/* restart backed-off timer */
|
||||
- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto);
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + hc->tx_rto);
|
||||
out:
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
@@ -330,7 +335,7 @@ static void ccid2_hc_tx_packet_sent(struct sock *sk, unsigned int len)
|
||||
}
|
||||
#endif
|
||||
|
||||
- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto);
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + hc->tx_rto);
|
||||
|
||||
#ifdef CONFIG_IP_DCCP_CCID2_DEBUG
|
||||
do {
|
||||
@@ -700,9 +705,9 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
/* restart RTO timer if not all outstanding data has been acked */
|
||||
if (hc->tx_pipe == 0)
|
||||
- sk_stop_timer(sk, &hc->tx_rtotimer);
|
||||
+ sk_stop_timer(sk, &dp->dccps_ccid_timer);
|
||||
else
|
||||
- sk_reset_timer(sk, &hc->tx_rtotimer, jiffies + hc->tx_rto);
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer, jiffies + hc->tx_rto);
|
||||
done:
|
||||
/* check if incoming Acks allow pending packets to be sent */
|
||||
if (sender_was_blocked && !ccid2_cwnd_network_limited(hc))
|
||||
@@ -737,17 +742,18 @@ static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
|
||||
hc->tx_last_cong = hc->tx_lsndtime = hc->tx_cwnd_stamp = ccid2_jiffies32;
|
||||
hc->tx_cwnd_used = 0;
|
||||
hc->sk = sk;
|
||||
- timer_setup(&hc->tx_rtotimer, ccid2_hc_tx_rto_expire, 0);
|
||||
+ timer_setup(&dp->dccps_ccid_timer, ccid2_hc_tx_rto_expire, 0);
|
||||
INIT_LIST_HEAD(&hc->tx_av_chunks);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ccid2_hc_tx_exit(struct sock *sk)
|
||||
{
|
||||
+ struct dccp_sock *dp = dccp_sk(sk);
|
||||
struct ccid2_hc_tx_sock *hc = ccid2_hc_tx_sk(sk);
|
||||
int i;
|
||||
|
||||
- sk_stop_timer(sk, &hc->tx_rtotimer);
|
||||
+ sk_stop_timer(sk, &dp->dccps_ccid_timer);
|
||||
|
||||
for (i = 0; i < hc->tx_seqbufc; i++)
|
||||
kfree(hc->tx_seqbuf[i]);
|
||||
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
|
||||
index b9ee1a4a8955..685f4d046c0d 100644
|
||||
--- a/net/dccp/ccids/ccid3.c
|
||||
+++ b/net/dccp/ccids/ccid3.c
|
||||
@@ -184,17 +184,24 @@ static inline void ccid3_hc_tx_update_win_count(struct ccid3_hc_tx_sock *hc,
|
||||
|
||||
static void ccid3_hc_tx_no_feedback_timer(struct timer_list *t)
|
||||
{
|
||||
- struct ccid3_hc_tx_sock *hc = from_timer(hc, t, tx_no_feedback_timer);
|
||||
- struct sock *sk = hc->sk;
|
||||
+ struct dccp_sock *dp = from_timer(dp, t, dccps_ccid_timer);
|
||||
+ struct ccid3_hc_tx_sock *hc;
|
||||
+ struct sock *sk = (struct sock *)dp;
|
||||
unsigned long t_nfb = USEC_PER_SEC / 5;
|
||||
|
||||
bh_lock_sock(sk);
|
||||
+
|
||||
+ if (inet_sk_state_load(sk) == DCCP_CLOSED)
|
||||
+ goto out;
|
||||
+
|
||||
if (sock_owned_by_user(sk)) {
|
||||
/* Try again later. */
|
||||
/* XXX: set some sensible MIB */
|
||||
goto restart_timer;
|
||||
}
|
||||
|
||||
+ hc = ccid_priv(dp->dccps_hc_tx_ccid);
|
||||
+
|
||||
ccid3_pr_debug("%s(%p, state=%s) - entry\n", dccp_role(sk), sk,
|
||||
ccid3_tx_state_name(hc->tx_state));
|
||||
|
||||
@@ -250,8 +257,8 @@ static void ccid3_hc_tx_no_feedback_timer(struct timer_list *t)
|
||||
t_nfb = max(hc->tx_t_rto, 2 * hc->tx_t_ipi);
|
||||
|
||||
restart_timer:
|
||||
- sk_reset_timer(sk, &hc->tx_no_feedback_timer,
|
||||
- jiffies + usecs_to_jiffies(t_nfb));
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer,
|
||||
+ jiffies + usecs_to_jiffies(t_nfb));
|
||||
out:
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
@@ -280,7 +287,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
|
||||
return -EBADMSG;
|
||||
|
||||
if (hc->tx_state == TFRC_SSTATE_NO_SENT) {
|
||||
- sk_reset_timer(sk, &hc->tx_no_feedback_timer, (jiffies +
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer, (jiffies +
|
||||
usecs_to_jiffies(TFRC_INITIAL_TIMEOUT)));
|
||||
hc->tx_last_win_count = 0;
|
||||
hc->tx_t_last_win_count = now;
|
||||
@@ -354,6 +361,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, unsigned int len)
|
||||
static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk);
|
||||
+ struct dccp_sock *dp = dccp_sk(sk);
|
||||
struct tfrc_tx_hist_entry *acked;
|
||||
ktime_t now;
|
||||
unsigned long t_nfb;
|
||||
@@ -420,7 +428,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||
(unsigned int)(hc->tx_x >> 6));
|
||||
|
||||
/* unschedule no feedback timer */
|
||||
- sk_stop_timer(sk, &hc->tx_no_feedback_timer);
|
||||
+ sk_stop_timer(sk, &dp->dccps_ccid_timer);
|
||||
|
||||
/*
|
||||
* As we have calculated new ipi, delta, t_nom it is possible
|
||||
@@ -445,8 +453,8 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
|
||||
"expire in %lu jiffies (%luus)\n",
|
||||
dccp_role(sk), sk, usecs_to_jiffies(t_nfb), t_nfb);
|
||||
|
||||
- sk_reset_timer(sk, &hc->tx_no_feedback_timer,
|
||||
- jiffies + usecs_to_jiffies(t_nfb));
|
||||
+ sk_reset_timer(sk, &dp->dccps_ccid_timer,
|
||||
+ jiffies + usecs_to_jiffies(t_nfb));
|
||||
}
|
||||
|
||||
static int ccid3_hc_tx_parse_options(struct sock *sk, u8 packet_type,
|
||||
@@ -488,21 +496,23 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, u8 packet_type,
|
||||
|
||||
static int ccid3_hc_tx_init(struct ccid *ccid, struct sock *sk)
|
||||
{
|
||||
+ struct dccp_sock *dp = dccp_sk(sk);
|
||||
struct ccid3_hc_tx_sock *hc = ccid_priv(ccid);
|
||||
|
||||
hc->tx_state = TFRC_SSTATE_NO_SENT;
|
||||
hc->tx_hist = NULL;
|
||||
hc->sk = sk;
|
||||
- timer_setup(&hc->tx_no_feedback_timer,
|
||||
+ timer_setup(&dp->dccps_ccid_timer,
|
||||
ccid3_hc_tx_no_feedback_timer, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ccid3_hc_tx_exit(struct sock *sk)
|
||||
{
|
||||
+ struct dccp_sock *dp = dccp_sk(sk);
|
||||
struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk);
|
||||
|
||||
- sk_stop_timer(sk, &hc->tx_no_feedback_timer);
|
||||
+ sk_stop_timer(sk, &dp->dccps_ccid_timer);
|
||||
tfrc_tx_hist_purge(&hc->tx_hist);
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
|
||||
From MAILER-DAEMON Wed Oct 14 16:34:37 2020
|
||||
From: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
|
||||
To: netdev@vger.kernel.org
|
||||
Cc: Gerrit Renker <gerrit@erg.abdn.ac.uk>, "David S. Miller" <davem@davemloft.net>, Jakub Kicinski <kuba@kernel.org>, Thadeu Lima de Souza Cascardo <cascardo@canonical.com>, "Gustavo A. R. Silva" <gustavoars@kernel.org>, "Alexander A. Klimov" <grandmaster@al2klimov.de>, Kees Cook <keescook@chromium.org>, Eric Dumazet <edumazet@google.com>, Alexey Kodanev <alexey.kodanev@oracle.com>, dccp@vger.kernel.org, linux-kernel@vger.kernel.org
|
||||
Subject: [PATCH 2/2] Revert "dccp: don't free ccid2_hc_tx_sock struct in dccp_disconnect()"
|
||||
Date: Tue, 13 Oct 2020 19:18:49 +0200
|
||||
Message-Id: <20201013171849.236025-3-kleber.souza@canonical.com>
|
||||
In-Reply-To: <20201013171849.236025-1-kleber.souza@canonical.com>
|
||||
References: <20201013171849.236025-1-kleber.souza@canonical.com>
|
||||
List-ID: <linux-kernel.vger.kernel.org>
|
||||
X-Mailing-List: linux-kernel@vger.kernel.org
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
From: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
|
||||
|
||||
This reverts commit 2677d20677314101293e6da0094ede7b5526d2b1.
|
||||
|
||||
This fixes an issue that after disconnect, dccps_hc_tx_ccid will still be
|
||||
kept, allowing the socket to be reused as a listener socket, and the cloned
|
||||
socket will free its dccps_hc_tx_ccid, leading to a later use after free,
|
||||
when the listener socket is closed.
|
||||
|
||||
This addresses CVE-2020-16119.
|
||||
|
||||
Fixes: 2677d2067731 (dccp: don't free ccid2_hc_tx_sock struct in dccp_disconnect())
|
||||
Reported-by: Hadar Manor
|
||||
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
|
||||
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
|
||||
Acked-by: Richard Sailer <richard_siegfried@systemli.org>
|
||||
---
|
||||
net/dccp/proto.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
|
||||
index 6d705d90c614..359e848dba6c 100644
|
||||
--- a/net/dccp/proto.c
|
||||
+++ b/net/dccp/proto.c
|
||||
@@ -279,7 +279,9 @@ int dccp_disconnect(struct sock *sk, int flags)
|
||||
|
||||
dccp_clear_xmit_timers(sk);
|
||||
ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk);
|
||||
+ ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk);
|
||||
dp->dccps_hc_rx_ccid = NULL;
|
||||
+ dp->dccps_hc_tx_ccid = NULL;
|
||||
|
||||
__skb_queue_purge(&sk->sk_receive_queue);
|
||||
__skb_queue_purge(&sk->sk_write_queue);
|
||||
--
|
||||
2.25.1
|
||||
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
From c7c4d698cd2882c4d095aeed43bbad6fc990e998 Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Schramm <t.schramm@manjaro.org>
|
||||
Date: Thu, 28 May 2020 19:25:50 +0200
|
||||
Subject: arm64: dts: rockchip: add fuel gauge to Pinebook Pro dts
|
||||
|
||||
This commit adds cw2015 fuel gauge and battery to the Pinebook Pro dts.
|
||||
|
||||
Signed-off-by: Tobias Schramm <t.schramm@manjaro.org>
|
||||
Link: https://lore.kernel.org/r/20200528172550.2324722-2-t.schramm@manjaro.org
|
||||
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||
---
|
||||
.../boot/dts/rockchip/rk3399-pinebook-pro.dts | 25 ++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
|
||||
index cb0245d2226d5..8f5b2df01560e 100644
|
||||
--- a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
|
||||
+++ b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
|
||||
@@ -28,6 +28,13 @@
|
||||
pwms = <&pwm0 0 740740 0>;
|
||||
};
|
||||
|
||||
+ bat: battery {
|
||||
+ compatible = "simple-battery";
|
||||
+ charge-full-design-microamp-hours = <9800000>;
|
||||
+ voltage-max-design-microvolt = <4350000>;
|
||||
+ voltage-min-design-microvolt = <3000000>;
|
||||
+ };
|
||||
+
|
||||
edp_panel: edp-panel {
|
||||
compatible = "boe,nv140fhmn49";
|
||||
backlight = <&backlight>;
|
||||
@@ -741,6 +748,24 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
+
|
||||
+ cw2015@62 {
|
||||
+ compatible = "cellwise,cw2015";
|
||||
+ reg = <0x62>;
|
||||
+ cellwise,battery-profile = /bits/ 8 <
|
||||
+ 0x17 0x67 0x80 0x73 0x6E 0x6C 0x6B 0x63
|
||||
+ 0x77 0x51 0x5C 0x58 0x50 0x4C 0x48 0x36
|
||||
+ 0x15 0x0C 0x0C 0x19 0x5B 0x7D 0x6F 0x69
|
||||
+ 0x69 0x5B 0x0C 0x29 0x20 0x40 0x52 0x59
|
||||
+ 0x57 0x56 0x54 0x4F 0x3B 0x1F 0x7F 0x17
|
||||
+ 0x06 0x1A 0x30 0x5A 0x85 0x93 0x96 0x2D
|
||||
+ 0x48 0x77 0x9C 0xB3 0x80 0x52 0x94 0xCB
|
||||
+ 0x2F 0x00 0x64 0xA5 0xB5 0x11 0xF0 0x11
|
||||
+ >;
|
||||
+ cellwise,monitor-interval-ms = <5000>;
|
||||
+ monitored-battery = <&bat>;
|
||||
+ power-supplies = <&mains_charger>, <&fusb0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&i2s1 {
|
||||
--
|
||||
cgit 1.2.3-1.el7
|
|
@ -1,6 +1,6 @@
|
|||
From a58d581e212b3acbc65e56384e6bc60bb109f29a Mon Sep 17 00:00:00 2001
|
||||
From a267434b15bc06c72708327fb1110bf565577a15 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Fri, 7 Aug 2020 15:51:42 +0100
|
||||
Date: Tue, 3 Nov 2020 16:53:02 +0000
|
||||
Subject: [PATCH] arm64: tegra: Use valid PWM period for VDD_GPU on Tegra210
|
||||
|
||||
From: Thierry Reding <treding@nvidia.com>
|
||||
|
@ -18,30 +18,31 @@ Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
|||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi
|
||||
index cc6ed45a2b485..e2e984a75f601 100644
|
||||
index 6a4b50aaa25d..85ee7e6b71ac 100644
|
||||
--- a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi
|
||||
+++ b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi
|
||||
@@ -346,7 +346,7 @@ regulators {
|
||||
@@ -337,7 +337,7 @@ psci {
|
||||
|
||||
vdd_gpu: regulator@100 {
|
||||
compatible = "pwm-regulator";
|
||||
reg = <100>;
|
||||
- pwms = <&pwm 1 4880>;
|
||||
+ pwms = <&pwm 1 8000>;
|
||||
regulator-name = "VDD_GPU";
|
||||
regulator-min-microvolt = <710000>;
|
||||
regulator-max-microvolt = <1320000>;
|
||||
diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
|
||||
index 9bc52fdb393c8..ebaac57853138 100644
|
||||
index 2282ea1c6279..195a43e2356b 100644
|
||||
--- a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
|
||||
+++ b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
|
||||
@@ -789,7 +789,7 @@ vdd_cpu: regulator@5 {
|
||||
@@ -818,7 +818,7 @@ vdd_cpu: regulator@5 {
|
||||
|
||||
vdd_gpu: regulator@6 {
|
||||
compatible = "pwm-regulator";
|
||||
reg = <6>;
|
||||
- pwms = <&pwm 1 4880>;
|
||||
+ pwms = <&pwm 1 8000>;
|
||||
|
||||
regulator-name = "VDD_GPU";
|
||||
regulator-min-microvolt = <710000>;
|
||||
regulator-max-microvolt = <1320000>;
|
||||
--
|
||||
2.26.2
|
||||
2.28.0
|
||||
|
||||
|
|
|
@ -1,86 +0,0 @@
|
|||
From 72fd21b62055b985d3e3fb72a1e70e3d09596174 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Sun, 27 Sep 2020 18:20:41 +0100
|
||||
Subject: [PATCH] arm64: tegra: Enable DFLL support on Jetson Nano
|
||||
|
||||
Populate the DFLL node and corresponding PWM pin nodes in order to
|
||||
enable CPUFREQ support on the Jetson Nano platform.
|
||||
|
||||
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
|
||||
Signed-off-by: Thierry Reding <treding@nvidia.com>
|
||||
---
|
||||
.../boot/dts/nvidia/tegra210-p3450-0000.dts | 50 +++++++++++++++----
|
||||
1 file changed, 40 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
|
||||
index 9bc52fdb393c..4d980d753a98 100644
|
||||
--- a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
|
||||
+++ b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts
|
||||
@@ -101,6 +101,22 @@ gpu@57000000 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+ pinmux@700008d4 {
|
||||
+ dvfs_pwm_active_state: dvfs_pwm_active {
|
||||
+ dvfs_pwm_pbb1 {
|
||||
+ nvidia,pins = "dvfs_pwm_pbb1";
|
||||
+ nvidia,tristate = <TEGRA_PIN_DISABLE>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ dvfs_pwm_inactive_state: dvfs_pwm_inactive {
|
||||
+ dvfs_pwm_pbb1 {
|
||||
+ nvidia,pins = "dvfs_pwm_pbb1";
|
||||
+ nvidia,tristate = <TEGRA_PIN_ENABLE>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
/* debug port */
|
||||
serial@70006000 {
|
||||
status = "okay";
|
||||
@@ -574,17 +590,31 @@ sdhci@700b0400 {
|
||||
wakeup-source;
|
||||
};
|
||||
|
||||
- clocks {
|
||||
- compatible = "simple-bus";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
+ clock@70110000 {
|
||||
+ status = "okay";
|
||||
|
||||
- clk32k_in: clock@0 {
|
||||
- compatible = "fixed-clock";
|
||||
- reg = <0>;
|
||||
- #clock-cells = <0>;
|
||||
- clock-frequency = <32768>;
|
||||
- };
|
||||
+ nvidia,cf = <6>;
|
||||
+ nvidia,ci = <0>;
|
||||
+ nvidia,cg = <2>;
|
||||
+ nvidia,droop-ctrl = <0x00000f00>;
|
||||
+ nvidia,force-mode = <1>;
|
||||
+ nvidia,sample-rate = <25000>;
|
||||
+
|
||||
+ nvidia,pwm-min-microvolts = <708000>;
|
||||
+ nvidia,pwm-period-nanoseconds = <2500>; /* 2.5us */
|
||||
+ nvidia,pwm-to-pmic;
|
||||
+ nvidia,pwm-tristate-microvolts = <1000000>;
|
||||
+ nvidia,pwm-voltage-step-microvolts = <19200>;
|
||||
+
|
||||
+ pinctrl-names = "dvfs_pwm_enable", "dvfs_pwm_disable";
|
||||
+ pinctrl-0 = <&dvfs_pwm_active_state>;
|
||||
+ pinctrl-1 = <&dvfs_pwm_inactive_state>;
|
||||
+ };
|
||||
+
|
||||
+ clk32k_in: clock@0 {
|
||||
+ compatible = "fixed-clock";
|
||||
+ clock-frequency = <32768>;
|
||||
+ #clock-cells = <0>;
|
||||
};
|
||||
|
||||
cpus {
|
||||
--
|
||||
2.26.2
|
||||
|
|
@ -1,121 +1,3 @@
|
|||
From patchwork Sun Aug 30 19:14:37 2020
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Patchwork-Submitter: Dmitry Osipenko <digetx@gmail.com>
|
||||
X-Patchwork-Id: 11745283
|
||||
X-Patchwork-Delegate: kvalo@adurom.com
|
||||
Return-Path: <SRS0=8jSp=CI=vger.kernel.org=linux-wireless-owner@kernel.org>
|
||||
Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
|
||||
[172.30.200.123])
|
||||
by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 02F8E722
|
||||
for <patchwork-linux-wireless@patchwork.kernel.org>;
|
||||
Sun, 30 Aug 2020 19:15:31 +0000 (UTC)
|
||||
Received: from vger.kernel.org (vger.kernel.org [23.128.96.18])
|
||||
by mail.kernel.org (Postfix) with ESMTP id D325020757
|
||||
for <patchwork-linux-wireless@patchwork.kernel.org>;
|
||||
Sun, 30 Aug 2020 19:15:30 +0000 (UTC)
|
||||
Authentication-Results: mail.kernel.org;
|
||||
dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com
|
||||
header.b="XOye4I75"
|
||||
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
|
||||
id S1726492AbgH3TPQ (ORCPT
|
||||
<rfc822;patchwork-linux-wireless@patchwork.kernel.org>);
|
||||
Sun, 30 Aug 2020 15:15:16 -0400
|
||||
Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36382 "EHLO
|
||||
lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
|
||||
with ESMTP id S1726178AbgH3TPH (ORCPT
|
||||
<rfc822;linux-wireless@vger.kernel.org>);
|
||||
Sun, 30 Aug 2020 15:15:07 -0400
|
||||
Received: from mail-lf1-x143.google.com (mail-lf1-x143.google.com
|
||||
[IPv6:2a00:1450:4864:20::143])
|
||||
by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B885C061575;
|
||||
Sun, 30 Aug 2020 12:15:06 -0700 (PDT)
|
||||
Received: by mail-lf1-x143.google.com with SMTP id y2so951774lfy.10;
|
||||
Sun, 30 Aug 2020 12:15:06 -0700 (PDT)
|
||||
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=gmail.com; s=20161025;
|
||||
h=from:to:cc:subject:date:message-id:in-reply-to:references
|
||||
:mime-version:content-transfer-encoding;
|
||||
bh=hzL71nqb/6BZxUitP92QceAo8sdBLgT31i3ar+cwVk4=;
|
||||
b=XOye4I75cIfJ4wkN4RaeluIx+/YAJsxlMpAnP498/xZTl1BTh8eSlfQif5JouocnSh
|
||||
14l3fBQ+A+yleGcThqMh1IaJriMgqMbIE00NyGf7Vle0M2E7WLVo9PlrLCn9vtgowgLt
|
||||
Lr4Mu7V/lWdptapsH5tCqMvP1g5ir1mEsMMokwajMTno6GR0SBVHl/7ypVl5YA3p4HoF
|
||||
fFymnbrHgHbTrzQ/PoyTHfJ+z2cr7zsyoWJ2DNueWkIQjuS/8ueDks4amJJKs+KgB+yp
|
||||
+XRynXf/t0fyF8u1wenwv3sbeaCt3sIPLNePGmjRYeaXo5pTqEUgNHd6MH2PGfsDTuU0
|
||||
5MTg==
|
||||
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||
d=1e100.net; s=20161025;
|
||||
h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
|
||||
:references:mime-version:content-transfer-encoding;
|
||||
bh=hzL71nqb/6BZxUitP92QceAo8sdBLgT31i3ar+cwVk4=;
|
||||
b=j8AOqXUrl/hkYHnFrnNd2FRUeIHMr2dpaVrKcJBXuHajNJC8b3YN2G9F2K+lkC+ZxC
|
||||
w1B7sH1DNxY8u4wIuHketyNteuSdFH9vC+VZhu5DY5Bz0snrsLK43fS/8InrBWMd9/OZ
|
||||
3bt86DxIWv9szZELmV5sCnwAh5U9CKk95vI5k+mKJLfv8mmqgyJ2rbPBZO0xNWbyRMp3
|
||||
Bu+B+ze0mY9xjnOSwXK8dUvlTpRNr9zOeXmzjtWsb3xFgFN1PZ5wiD3bQ5m7XoYqQEXb
|
||||
Ah+zOiBL3P2mZUM54OyHP+HolPq8/V0zKDuw06na41SW1cJNuZUIG6W1m/x75S6hJO4D
|
||||
2lJg==
|
||||
X-Gm-Message-State: AOAM533MF2BJ56mP1JcVq45SsbuqEwSox1UmefQdmOHheDJSUx5w2LUC
|
||||
ca86fl0ZnPg4zrXg3bFav48=
|
||||
X-Google-Smtp-Source:
|
||||
ABdhPJx6cYCkNqBsgfZJn1WvrwBAiI7kWYd9Yi9pQ5L2953d0O0W457Bcur/fqHaFOJeiOQAPpwzwg==
|
||||
X-Received: by 2002:a19:f510:: with SMTP id j16mr337056lfb.169.1598814904892;
|
||||
Sun, 30 Aug 2020 12:15:04 -0700 (PDT)
|
||||
Received: from localhost.localdomain (109-252-170-211.dynamic.spd-mgts.ru.
|
||||
[109.252.170.211])
|
||||
by smtp.gmail.com with ESMTPSA id
|
||||
e23sm1409709lfj.80.2020.08.30.12.15.04
|
||||
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
|
||||
Sun, 30 Aug 2020 12:15:04 -0700 (PDT)
|
||||
From: Dmitry Osipenko <digetx@gmail.com>
|
||||
To: Arend van Spriel <arend.vanspriel@broadcom.com>,
|
||||
Franky Lin <franky.lin@broadcom.com>,
|
||||
Hante Meuleman <hante.meuleman@broadcom.com>,
|
||||
Chi-Hsien Lin <chi-hsien.lin@cypress.com>,
|
||||
Wright Feng <wright.feng@cypress.com>,
|
||||
Kalle Valo <kvalo@codeaurora.org>
|
||||
Cc: linux-wireless@vger.kernel.org,
|
||||
brcm80211-dev-list.pdl@broadcom.com,
|
||||
brcm80211-dev-list@cypress.com, netdev@vger.kernel.org,
|
||||
linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org
|
||||
Subject: [PATCH v3 1/3] brcmfmac: increase F2 watermark for BCM4329
|
||||
Date: Sun, 30 Aug 2020 22:14:37 +0300
|
||||
Message-Id: <20200830191439.10017-2-digetx@gmail.com>
|
||||
X-Mailer: git-send-email 2.27.0
|
||||
In-Reply-To: <20200830191439.10017-1-digetx@gmail.com>
|
||||
References: <20200830191439.10017-1-digetx@gmail.com>
|
||||
MIME-Version: 1.0
|
||||
Sender: linux-wireless-owner@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
This patch fixes SDHCI CRC errors during of RX throughput testing on
|
||||
BCM4329 chip if SDIO BUS is clocked above 25MHz. In particular the
|
||||
checksum problem is observed on NVIDIA Tegra20 SoCs. The good watermark
|
||||
value is borrowed from downstream BCMDHD driver and it's matching to the
|
||||
value that is already used for the BCM4339 chip, hence let's re-use it
|
||||
for BCM4329.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
index d1b96bad2718..b16944a898f9 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4278,6 +4278,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
|
||||
CY_43012_MESBUSYCTRL, &err);
|
||||
break;
|
||||
+ case SDIO_DEVICE_ID_BROADCOM_4329:
|
||||
case SDIO_DEVICE_ID_BROADCOM_4339:
|
||||
brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes for 4339\n",
|
||||
CY_4339_F2_WATERMARK);
|
||||
|
||||
From patchwork Sun Aug 30 19:14:38 2020
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# CONFIG_RCU_REF_SCALE_TEST:
|
||||
#
|
||||
# This option provides a kernel module that runs performance tests
|
||||
# useful comparing RCU with various read-side synchronization mechanisms.
|
||||
# The kernel module may be built after the fact on the running kernel to be
|
||||
# tested, if desired.
|
||||
#
|
||||
# Say Y here if you want these performance tests built into the kernel.
|
||||
# Say M if you want to build it as a module instead.
|
||||
# Say N if you are unsure.
|
||||
#
|
||||
# Symbol: RCU_REF_SCALE_TEST [=n]
|
||||
# Type : tristate
|
||||
# Defined at kernel/rcu/Kconfig.debug:64
|
||||
# Prompt: Scalability tests for read-side synchronization (RCU and others)
|
||||
# Depends on: DEBUG_KERNEL [=y]
|
||||
# Location:
|
||||
# -> Kernel hacking
|
||||
# -> RCU Debugging
|
||||
# Selects: TORTURE_TEST [=m] && SRCU [=y] && TASKS_RCU [=y] && TASKS_RUDE_RCU [=y] && TASKS_TRACE_RCU [=y]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_RCU_REF_SCALE_TEST=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_ARCH_KEEMBAY is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_ARCH_SPARX5 is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_ARM_SMCCC_SOC_ID=y
|
|
@ -0,0 +1,20 @@
|
|||
# CONFIG_BCACHE_ASYNC_REGISTRATION:
|
||||
#
|
||||
# Add a sysfs file /sys/fs/bcache/register_async. Writing registering
|
||||
# device path into this file will returns immediately and the real
|
||||
# registration work is handled in kernel work queue in asynchronous
|
||||
# way.
|
||||
#
|
||||
# Symbol: BCACHE_ASYNC_REGISTRATION [=n]
|
||||
# Type : bool
|
||||
# Defined at drivers/md/bcache/Kconfig:30
|
||||
# Prompt: Asynchronous device registration (EXPERIMENTAL)
|
||||
# Depends on: MD [=y] && BCACHE [=m]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Multiple devices driver support (RAID and LVM) (MD [=y])
|
||||
# -> Block device as cache (BCACHE [=m])
|
||||
#
|
||||
#
|
||||
#
|
||||
# CONFIG_BCACHE_ASYNC_REGISTRATION is not set
|
|
@ -0,0 +1,20 @@
|
|||
# CONFIG_CEC_CH7322:
|
||||
#
|
||||
# This is a driver for the Chrontel CH7322 CEC controller. It uses the
|
||||
# generic CEC framework interface.
|
||||
# CEC bus is present in the HDMI connector and enables communication
|
||||
# between compatible devices.
|
||||
#
|
||||
# Symbol: CEC_CH7322 [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/media/cec/i2c/Kconfig:5
|
||||
# Prompt: Chrontel CH7322 CEC controller
|
||||
# Depends on: MEDIA_CEC_SUPPORT [=y] && I2C [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> HDMI CEC drivers (MEDIA_CEC_SUPPORT [=y])
|
||||
# Selects: REGMAP_I2C [=y] && CEC_CORE [=m]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_CEC_CH7322=m
|
|
@ -0,0 +1,22 @@
|
|||
# CONFIG_CHARGER_BQ2515X:
|
||||
#
|
||||
# Say Y to enable support for the TI BQ2515X family of battery
|
||||
# charging integrated circuits. The BQ2515X are highly integrated
|
||||
# battery charge management ICs that integrate the most common
|
||||
# functions for wearable devices, namely a charger, an output voltage
|
||||
# rail, ADC for battery and system monitoring, and push-button
|
||||
# controller.
|
||||
#
|
||||
# Symbol: CHARGER_BQ2515X [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/power/supply/Kconfig:613
|
||||
# Prompt: TI BQ2515X battery charger family
|
||||
# Depends on: POWER_SUPPLY [=y] && I2C [=y] && (GPIOLIB [=y] || COMPILE_TEST [=n])
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Power supply class support (POWER_SUPPLY [=y])
|
||||
# Selects: REGMAP_I2C [=y]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_CHARGER_BQ2515X=m
|
|
@ -0,0 +1,17 @@
|
|||
# CONFIG_CMDLINE:
|
||||
#
|
||||
# On some platforms, there is currently no way for the boot loader to
|
||||
# pass arguments to the kernel. For these platforms, you can supply
|
||||
# some command-line options at build time by entering them here. In
|
||||
# most cases you will need to specify the root device here.
|
||||
#
|
||||
# Symbol: CMDLINE [=]
|
||||
# Type : string
|
||||
# Defined at arch/powerpc/Kconfig:882
|
||||
# Prompt: Initial kernel command string
|
||||
# Location:
|
||||
# -> Kernel options
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_CMDLINE=""
|
|
@ -1 +1 @@
|
|||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
|
||||
|
|
|
@ -1 +1 @@
|
|||
# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
# CONFIG_DEBUG_FS_ALLOW_ALL:
|
||||
#
|
||||
# No restrictions apply. Both API and filesystem registration
|
||||
# is on. This is the normal default operation.
|
||||
#
|
||||
# Symbol: DEBUG_FS_ALLOW_ALL [=y]
|
||||
# Type : bool
|
||||
# Defined at lib/Kconfig.debug:500
|
||||
# Prompt: Access normal
|
||||
# Depends on: <choice>
|
||||
# Location:
|
||||
# -> Kernel hacking
|
||||
# -> Generic Kernel Debugging Instruments
|
||||
# -> Debug Filesystem (DEBUG_FS [=y])
|
||||
# -> Debugfs default access (<choice> [=y])
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_DEBUG_FS_ALLOW_ALL=y
|
|
@ -0,0 +1,20 @@
|
|||
# CONFIG_DEBUG_FS_ALLOW_NONE:
|
||||
#
|
||||
# Access is off. Clients get -PERM when trying to create nodes in
|
||||
# debugfs tree and debugfs is not registered as a filesystem.
|
||||
# Client can then back-off or continue without debugfs access.
|
||||
#
|
||||
# Symbol: DEBUG_FS_ALLOW_NONE [=n]
|
||||
# Type : bool
|
||||
# Defined at lib/Kconfig.debug:513
|
||||
# Prompt: No access
|
||||
# Depends on: <choice>
|
||||
# Location:
|
||||
# -> Kernel hacking
|
||||
# -> Generic Kernel Debugging Instruments
|
||||
# -> Debug Filesystem (DEBUG_FS [=y])
|
||||
# -> Debugfs default access (<choice> [=y])
|
||||
#
|
||||
#
|
||||
#
|
||||
# CONFIG_DEBUG_FS_ALLOW_NONE is not set
|
|
@ -0,0 +1,20 @@
|
|||
# CONFIG_DEBUG_FS_DISALLOW_MOUNT:
|
||||
#
|
||||
# The API is open but filesystem is not loaded. Clients can still do
|
||||
# their work and read with debug tools that do not need
|
||||
# debugfs filesystem.
|
||||
#
|
||||
# Symbol: DEBUG_FS_DISALLOW_MOUNT [=n]
|
||||
# Type : bool
|
||||
# Defined at lib/Kconfig.debug:506
|
||||
# Prompt: Do not register debugfs as filesystem
|
||||
# Depends on: <choice>
|
||||
# Location:
|
||||
# -> Kernel hacking
|
||||
# -> Generic Kernel Debugging Instruments
|
||||
# -> Debug Filesystem (DEBUG_FS [=y])
|
||||
# -> Debugfs default access (<choice> [=y])
|
||||
#
|
||||
#
|
||||
#
|
||||
# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set
|
|
@ -0,0 +1,19 @@
|
|||
# CONFIG_DRM_AMD_DC_DCN3_0:
|
||||
#
|
||||
# Choose this option if you want to have
|
||||
# sienna_cichlid support for display engine
|
||||
#
|
||||
# Symbol: DRM_AMD_DC_DCN3_0 [=n]
|
||||
# Type : bool
|
||||
# Defined at drivers/gpu/drm/amd/display/Kconfig:20
|
||||
# Prompt: DCN 3.0 family
|
||||
# Depends on: HAS_IOMEM [=y] && DRM [=m] && DRM_AMDGPU [=m] && DRM_AMD_DC [=y] && X86 [=y] && DRM_AMD_DC_DCN [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Graphics support
|
||||
# -> AMD GPU (DRM_AMDGPU [=m])
|
||||
# -> Display Engine Configuration
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_DRM_AMD_DC_DCN3_0=y
|
|
@ -1 +0,0 @@
|
|||
CONFIG_DRM_PANEL_ROCKTECH_JH057N00900=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_DRM_PANEL_XINGBANGDA_XBD599 is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_FB_ARMCLCD is not set
|
|
@ -0,0 +1,15 @@
|
|||
# CONFIG_FS_ENCRYPTION_INLINE_CRYPT:
|
||||
#
|
||||
# Enable fscrypt to use inline encryption hardware if available.
|
||||
#
|
||||
# Symbol: FS_ENCRYPTION_INLINE_CRYPT [=n]
|
||||
# Type : bool
|
||||
# Defined at fs/crypto/Kconfig:28
|
||||
# Prompt: Enable fscrypt to use inline crypto
|
||||
# Depends on: FS_ENCRYPTION [=y] && BLK_INLINE_ENCRYPTION [=y]
|
||||
# Location:
|
||||
# -> File systems
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
|
|
@ -1 +1 @@
|
|||
# CONFIG_FW_LOADER_USER_HELPER is not set
|
||||
CONFIG_FW_LOADER_USER_HELPER=y
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK:
|
||||
#
|
||||
# Enabling this option forces a sysfs userspace fallback mechanism
|
||||
# to be used for all firmware requests which explicitly do not disable a
|
||||
# a fallback mechanism. Firmware calls which do prohibit a fallback
|
||||
# mechanism is request_firmware_direct(). This option is kept for
|
||||
# backward compatibility purposes given this precise mechanism can also
|
||||
# be enabled by setting the proc sysctl value to true:
|
||||
#
|
||||
# /proc/sys/kernel/firmware_config/force_sysfs_fallback
|
||||
#
|
||||
# If you are unsure about this, say N here.
|
||||
#
|
||||
# Symbol: FW_LOADER_USER_HELPER_FALLBACK [=n]
|
||||
# Type : bool
|
||||
# Defined at drivers/base/firmware_loader/Kconfig:143
|
||||
# Prompt: Force the firmware sysfs fallback mechanism when possible
|
||||
# Depends on: FW_LOADER [=y] && FW_LOADER_USER_HELPER [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Generic Driver Options
|
||||
# -> Firmware loader
|
||||
# -> Firmware loading facility (FW_LOADER [=y])
|
||||
# -> Enable the firmware sysfs fallback mechanism (FW_LOADER_USER_HELPER [=y])
|
||||
#
|
||||
#
|
||||
#
|
||||
# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
|
|
@ -0,0 +1,20 @@
|
|||
# CONFIG_GPIO_PCA9570:
|
||||
#
|
||||
# Say yes here to enable the GPO driver for the NXP PCA9570 chip.
|
||||
#
|
||||
# To compile this driver as a module, choose M here: the module will
|
||||
# be called gpio-pca9570.
|
||||
#
|
||||
# Symbol: GPIO_PCA9570 [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/gpio/Kconfig:965
|
||||
# Prompt: PCA9570 4-Bit I2C GPO expander
|
||||
# Depends on: GPIOLIB [=y] && I2C [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> GPIO Support (GPIOLIB [=y])
|
||||
# -> I2C GPIO expanders
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_GPIO_PCA9570=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_HW_RANDOM_BA431 is not set
|
|
@ -1 +1,21 @@
|
|||
# CONFIG_INFINIBAND_RTRS_SERVER:
|
||||
#
|
||||
# RDMA transport server module.
|
||||
#
|
||||
# RDMA Transport (RTRS) server module processing connection and IO
|
||||
# requests received from the RTRS client module, it will pass the
|
||||
# IO requests to its user eg. RNBD_server.
|
||||
#
|
||||
# Symbol: INFINIBAND_RTRS_SERVER [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/infiniband/ulp/rtrs/Kconfig:18
|
||||
# Prompt: RTRS server module
|
||||
# Depends on: INFINIBAND [=m] && INFINIBAND_ADDR_TRANS [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> InfiniBand support (INFINIBAND [=m])
|
||||
# Selects: INFINIBAND_RTRS [=n]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_INFINIBAND_RTRS_SERVER=m
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
# CONFIG_INV_ICM42600_I2C:
|
||||
#
|
||||
# This driver supports the InvenSense ICM-426xx motion tracking
|
||||
# devices over I2C.
|
||||
#
|
||||
# This driver can be built as a module. The module will be called
|
||||
# inv-icm42600-i2c.
|
||||
#
|
||||
# Symbol: INV_ICM42600_I2C [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/iio/imu/inv_icm42600/Kconfig:7
|
||||
# Prompt: InvenSense ICM-426xx I2C driver
|
||||
# Depends on: IIO [=m] && I2C [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Industrial I/O support (IIO [=m])
|
||||
# -> Inertial measurement units
|
||||
# Selects: INV_ICM42600 [=n] && REGMAP_I2C [=y]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_INV_ICM42600_I2C=m
|
|
@ -0,0 +1,22 @@
|
|||
# CONFIG_INV_ICM42600_SPI:
|
||||
#
|
||||
# This driver supports the InvenSense ICM-426xx motion tracking
|
||||
# devices over SPI.
|
||||
#
|
||||
# This driver can be built as a module. The module will be called
|
||||
# inv-icm42600-spi.
|
||||
#
|
||||
# Symbol: INV_ICM42600_SPI [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/iio/imu/inv_icm42600/Kconfig:19
|
||||
# Prompt: InvenSense ICM-426xx SPI driver
|
||||
# Depends on: IIO [=m] && SPI_MASTER [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Industrial I/O support (IIO [=m])
|
||||
# -> Inertial measurement units
|
||||
# Selects: INV_ICM42600 [=n] && REGMAP_SPI [=m]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_INV_ICM42600_SPI=m
|
|
@ -1 +1 @@
|
|||
# CONFIG_IR_SERIAL is not set
|
||||
CONFIG_IR_SERIAL=m
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
# CONFIG_IR_TOY:
|
||||
#
|
||||
# Say Y here if you want to use the Infrared Toy or IR Droid, USB
|
||||
# versions.
|
||||
#
|
||||
# To compile this driver as a module, choose M here: the module will be
|
||||
# called ir_toy.
|
||||
#
|
||||
# Symbol: IR_TOY [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/media/rc/Kconfig:533
|
||||
# Prompt: Infrared Toy and IR Droid
|
||||
# Depends on: RC_DEVICES [=y] && RC_CORE [=y] && USB_ARCH_HAS_HCD [=y]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Remote Controller support (RC_CORE [=y])
|
||||
# -> Remote Controller devices (RC_DEVICES [=y])
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_IR_TOY=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_KERNEL_ZSTD is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_LEDS_CLASS_MULTICOLOR=m
|
|
@ -0,0 +1,18 @@
|
|||
# CONFIG_LEDS_LP55XX_COMMON:
|
||||
#
|
||||
# This option supports common operations for LP5521/5523/55231/5562/8501
|
||||
# devices.
|
||||
#
|
||||
# Symbol: LEDS_LP55XX_COMMON [=n]
|
||||
# Type : tristate
|
||||
# Defined at drivers/leds/Kconfig:398
|
||||
# Prompt: Common Driver for TI/National LP5521/5523/55231/5562/8501
|
||||
# Depends on: NEW_LEDS [=y] && (LEDS_CLASS_MULTICOLOR [=n] || !LEDS_CLASS_MULTICOLOR [=n]) && OF [=y] && I2C [=m]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> LED Support (NEW_LEDS [=y])
|
||||
# Selects: FW_LOADER [=y] && FW_LOADER_USER_HELPER [=y]
|
||||
#
|
||||
#
|
||||
#
|
||||
# CONFIG_LEDS_LP55XX_COMMON is not set
|
|
@ -0,0 +1,21 @@
|
|||
# CONFIG_MLX5_EN_IPSEC:
|
||||
#
|
||||
# Build support for IPsec cryptography-offload accelaration in the NIC.
|
||||
# Note: Support for hardware with this capability needs to be selected
|
||||
# for this option to become available.
|
||||
#
|
||||
# Symbol: MLX5_EN_IPSEC [=n]
|
||||
# Type : bool
|
||||
# Defined at drivers/net/ethernet/mellanox/mlx5/core/Kconfig:150
|
||||
# Prompt: IPSec XFRM cryptography-offload accelaration
|
||||
# Depends on: NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_MELLANOX [=y] && MLX5_CORE_EN [=y] && XFRM_OFFLOAD [=y] && (INET_ESP_OFFLOAD [=m] || INET6_ESP_OFFLOAD [=m]) && (MLX5_FPGA_IPSEC [=n] || MLX5_IPSEC [=y])
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Network device support (NETDEVICES [=y])
|
||||
# -> Ethernet driver support (ETHERNET [=y])
|
||||
# -> Mellanox devices (NET_VENDOR_MELLANOX [=y])
|
||||
# -> Mellanox Technologies IPsec Connect-X support (MLX5_IPSEC [=y])
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_MLX5_EN_IPSEC=y
|
|
@ -0,0 +1,22 @@
|
|||
# CONFIG_MLX5_IPSEC:
|
||||
#
|
||||
# Build IPsec support for the Connect-X family of network cards by Mellanox
|
||||
# Technologies.
|
||||
# Note: If you select this option, the mlx5_core driver will include
|
||||
# IPsec support for the Connect-X family.
|
||||
#
|
||||
# Symbol: MLX5_IPSEC [=n]
|
||||
# Type : bool
|
||||
# Defined at drivers/net/ethernet/mellanox/mlx5/core/Kconfig:137
|
||||
# Prompt: Mellanox Technologies IPsec Connect-X support
|
||||
# Depends on: NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_MELLANOX [=y] && MLX5_CORE_EN [=y] && XFRM_OFFLOAD [=y] && (INET_ESP_OFFLOAD [=m] || INET6_ESP_OFFLOAD [=m])
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> Network device support (NETDEVICES [=y])
|
||||
# -> Ethernet driver support (ETHERNET [=y])
|
||||
# -> Mellanox devices (NET_VENDOR_MELLANOX [=y])
|
||||
# Selects: MLX5_ACCEL [=n]
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_MLX5_IPSEC=y
|
|
@ -0,0 +1,18 @@
|
|||
# CONFIG_MLX5_VDPA:
|
||||
#
|
||||
# Support library for Mellanox VDPA drivers. Provides code that is
|
||||
# common for all types of VDPA drivers. The following drivers are planned:
|
||||
# net, block.
|
||||
#
|
||||
# Symbol: MLX5_VDPA [=n]
|
||||
# Type : bool
|
||||
# Defined at drivers/vdpa/Kconfig:32
|
||||
# Prompt: MLX5 VDPA support library for ConnectX devices
|
||||
# Depends on: VDPA [=m] && MLX5_CORE [=m]
|
||||
# Location:
|
||||
# -> Device Drivers
|
||||
# -> vDPA drivers (VDPA [=m])
|
||||
#
|
||||
#
|
||||
#
|
||||
CONFIG_MLX5_VDPA=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_MLX5_VDPA_NET=m
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue