diff options
author | Jan200101 <sentrycraft123@gmail.com> | 2023-04-10 13:25:49 +0200 |
---|---|---|
committer | Jan200101 <sentrycraft123@gmail.com> | 2023-04-10 13:25:49 +0200 |
commit | 799a1c2b96f0d931ba44a839795c9cf31fdbce79 (patch) | |
tree | 35e110ae9ae75647129321cce8c549fb0668fda4 /SOURCES/patch-6.2-redhat.patch | |
parent | 4b0c9e6653550c9ca30435bdccae35736505d038 (diff) | |
download | kernel-fsync-799a1c2b96f0d931ba44a839795c9cf31fdbce79.tar.gz kernel-fsync-799a1c2b96f0d931ba44a839795c9cf31fdbce79.zip |
kernel 6.2.10
Diffstat (limited to 'SOURCES/patch-6.2-redhat.patch')
-rw-r--r-- | SOURCES/patch-6.2-redhat.patch | 996 |
1 files changed, 745 insertions, 251 deletions
diff --git a/SOURCES/patch-6.2-redhat.patch b/SOURCES/patch-6.2-redhat.patch index 0578914..c6546eb 100644 --- a/SOURCES/patch-6.2-redhat.patch +++ b/SOURCES/patch-6.2-redhat.patch @@ -1,6 +1,8 @@ + .../bindings/display/panel/himax,hx8394.yaml | 76 +++ Makefile | 4 + arch/arm/Kconfig | 4 +- arch/arm64/Kconfig | 3 +- + .../boot/dts/rockchip/rk3399-pinephone-pro.dts | 114 +++++ arch/s390/include/asm/ipl.h | 1 + arch/s390/kernel/ipl.c | 5 + arch/s390/kernel/setup.c | 4 + @@ -15,20 +17,16 @@ drivers/firmware/efi/efi.c | 124 +++-- drivers/firmware/efi/secureboot.c | 38 ++ drivers/firmware/sysfb.c | 18 +- - drivers/gpu/drm/nouveau/nouveau_backlight.c | 7 +- + drivers/gpu/drm/panel/Kconfig | 12 + + drivers/gpu/drm/panel/Makefile | 1 + + drivers/gpu/drm/panel/panel-himax-hx8394.c | 451 ++++++++++++++++++ drivers/hid/hid-rmi.c | 66 --- drivers/hwtracing/coresight/coresight-etm4x-core.c | 19 + - drivers/input/mouse/alps.c | 16 +- - drivers/input/mouse/focaltech.c | 8 +- drivers/input/rmi4/rmi_driver.c | 124 +++-- drivers/iommu/iommu.c | 22 + - drivers/net/wwan/iosm/iosm_ipc_imem.c | 7 + drivers/pci/quirks.c | 24 + drivers/usb/core/hub.c | 7 + drivers/usb/host/xhci-pci.c | 7 +- - drivers/usb/typec/ucsi/ucsi.c | 22 +- - fs/btrfs/ioctl.c | 2 + - fs/btrfs/qgroup.c | 11 +- include/linux/efi.h | 22 +- include/linux/lsm_hook_defs.h | 2 + include/linux/lsm_hooks.h | 6 + @@ -41,10 +39,92 @@ security/lockdown/Kconfig | 13 + security/lockdown/lockdown.c | 1 + security/security.c | 6 + - 43 files changed, 1029 insertions(+), 208 deletions(-) + 41 files changed, 1637 insertions(+), 181 deletions(-) +diff --git a/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml b/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml +new file mode 100644 +index 000000000000..1b2a1baa26f9 +--- /dev/null ++++ b/Documentation/devicetree/bindings/display/panel/himax,hx8394.yaml +@@ -0,0 +1,76 @@ ++# SPDX-License-Identifier: (GPL-2.0-only or BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/display/panel/himax,hx8394.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Himax HX8394 MIPI-DSI LCD panel controller ++ ++maintainers: ++ - Ondrej Jirman <megi@xff.cz> ++ - Javier Martinez Canillas <javierm@redhat.com> ++ ++description: ++ Device tree bindings for panels based on the Himax HX8394 controller, ++ such as the HannStar HSD060BHW4 720x1440 TFT LCD panel connected with ++ a MIPI-DSI video interface. ++ ++allOf: ++ - $ref: panel-common.yaml# ++ ++properties: ++ compatible: ++ items: ++ - enum: ++ - hannstar,hsd060bhw4 ++ - const: himax,hx8394 ++ ++ reg: true ++ ++ reset-gpios: true ++ ++ backlight: true ++ ++ port: true ++ ++ vcc-supply: ++ description: Panel power supply ++ ++ iovcc-supply: ++ description: I/O voltage supply ++ ++required: ++ - compatible ++ - reg ++ - reset-gpios ++ - backlight ++ - port ++ - vcc-supply ++ - iovcc-supply ++ ++additionalProperties: false ++ ++examples: ++ - | ++ #include <dt-bindings/gpio/gpio.h> ++ ++ dsi { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ panel@0 { ++ compatible = "hannstar,hsd060bhw4", "himax,hx8394"; ++ reg = <0>; ++ vcc-supply = <®_2v8_p>; ++ iovcc-supply = <®_1v8_p>; ++ reset-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>; ++ backlight = <&backlight>; ++ ++ port { ++ mipi_in_panel: endpoint { ++ remote-endpoint = <&mipi_out_panel>; ++ }; ++ }; ++ }; ++ }; ++ ++... diff --git a/Makefile b/Makefile -index 8732f7208d59..2ef18d9eed77 100644 +index 6ec0ec452e46..40a89b4c3682 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,10 @@ $(if $(filter __%, $(MAKECMDGOALS)), \ @@ -95,6 +175,170 @@ index ddfd35c86bda..2b69e42dff58 100644 default "12" if ARM64_16K_PAGES default "11" help +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts +index a0795a2b1cb1..475ba78acc09 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-pinephone-pro.dts +@@ -29,6 +29,11 @@ chosen { + stdout-path = "serial2:115200n8"; + }; + ++ backlight: backlight { ++ compatible = "pwm-backlight"; ++ pwms = <&pwm0 0 50000 0>; ++ }; ++ + gpio-keys { + compatible = "gpio-keys"; + pinctrl-names = "default"; +@@ -102,6 +107,30 @@ wifi_pwrseq: sdio-wifi-pwrseq { + /* WL_REG_ON on module */ + reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>; + }; ++ ++ /* MIPI DSI panel 1.8v supply */ ++ vcc1v8_lcd: vcc1v8-lcd { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ regulator-name = "vcc1v8_lcd"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ vin-supply = <&vcc3v3_sys>; ++ gpio = <&gpio3 RK_PA5 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ }; ++ ++ /* MIPI DSI panel 2.8v supply */ ++ vcc2v8_lcd: vcc2v8-lcd { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ regulator-name = "vcc2v8_lcd"; ++ regulator-min-microvolt = <2800000>; ++ regulator-max-microvolt = <2800000>; ++ vin-supply = <&vcc3v3_sys>; ++ gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ }; + }; + + &cpu_alert0 { +@@ -139,6 +168,11 @@ &emmc_phy { + status = "okay"; + }; + ++&gpu { ++ mali-supply = <&vdd_gpu>; ++ status = "okay"; ++}; ++ + &i2c0 { + clock-frequency = <400000>; + i2c-scl-rising-time-ns = <168>; +@@ -333,6 +367,25 @@ regulator-state-mem { + }; + }; + ++&i2c3 { ++ i2c-scl-rising-time-ns = <450>; ++ i2c-scl-falling-time-ns = <15>; ++ status = "okay"; ++ ++ touchscreen@14 { ++ compatible = "goodix,gt1158"; ++ reg = <0x14>; ++ interrupt-parent = <&gpio3>; ++ interrupts = <RK_PB5 IRQ_TYPE_EDGE_RISING>; ++ irq-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_HIGH>; ++ reset-gpios = <&gpio3 RK_PB4 GPIO_ACTIVE_HIGH>; ++ AVDD28-supply = <&vcc3v0_touch>; ++ VDDIO-supply = <&vcc3v0_touch>; ++ touchscreen-size-x = <720>; ++ touchscreen-size-y = <1440>; ++ }; ++}; ++ + &cluster0_opp { + opp04 { + status = "disabled"; +@@ -362,6 +415,39 @@ &io_domains { + status = "okay"; + }; + ++&mipi_dsi { ++ status = "okay"; ++ clock-master; ++ ++ ports { ++ mipi_out: port@1 { ++ #address-cells = <0>; ++ #size-cells = <0>; ++ reg = <1>; ++ ++ mipi_out_panel: endpoint { ++ remote-endpoint = <&mipi_in_panel>; ++ }; ++ }; ++ }; ++ ++ panel@0 { ++ compatible = "hannstar,hsd060bhw4"; ++ reg = <0>; ++ backlight = <&backlight>; ++ reset-gpios = <&gpio4 RK_PD1 GPIO_ACTIVE_LOW>; ++ vcc-supply = <&vcc2v8_lcd>; ++ iovcc-supply = <&vcc1v8_lcd>; ++ pinctrl-names = "default"; ++ ++ port { ++ mipi_in_panel: endpoint { ++ remote-endpoint = <&mipi_out_panel>; ++ }; ++ }; ++ }; ++}; ++ + &pmu_io_domains { + pmu1830-supply = <&vcc_1v8>; + status = "okay"; +@@ -429,6 +515,10 @@ &sdio0 { + status = "okay"; + }; + ++&pwm0 { ++ status = "okay"; ++}; ++ + &sdmmc { + bus-width = <4>; + cap-sd-highspeed; +@@ -479,3 +569,27 @@ bluetooth { + &uart2 { + status = "okay"; + }; ++ ++&vopb { ++ status = "okay"; ++ assigned-clocks = <&cru DCLK_VOP0_DIV>, <&cru DCLK_VOP0>, ++ <&cru ACLK_VOP0>, <&cru HCLK_VOP0>; ++ assigned-clock-rates = <0>, <0>, <400000000>, <100000000>; ++ assigned-clock-parents = <&cru PLL_GPLL>, <&cru DCLK_VOP0_DIV>; ++}; ++ ++&vopb_mmu { ++ status = "okay"; ++}; ++ ++&vopl { ++ status = "okay"; ++ assigned-clocks = <&cru DCLK_VOP1_DIV>, <&cru DCLK_VOP1>, ++ <&cru ACLK_VOP1>, <&cru HCLK_VOP1>; ++ assigned-clock-rates = <0>, <0>, <400000000>, <100000000>; ++ assigned-clock-parents = <&cru PLL_GPLL>, <&cru DCLK_VOP1_DIV>; ++}; ++ ++&vopl_mmu { ++ status = "okay"; ++}; diff --git a/arch/s390/include/asm/ipl.h b/arch/s390/include/asm/ipl.h index b0d00032479d..afb9544fb007 100644 --- a/arch/s390/include/asm/ipl.h @@ -598,32 +842,498 @@ index 3c197db42c9d..16e4a2e90fae 100644 pd = sysfb_create_simplefb(si, &mode); if (!IS_ERR(pd)) goto unlock_mutex; -diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c -index 40409a29f5b6..91b5ecc57538 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_backlight.c -+++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c -@@ -33,6 +33,7 @@ - #include <linux/apple-gmux.h> - #include <linux/backlight.h> - #include <linux/idr.h> -+#include <drm/drm_probe_helper.h> - - #include "nouveau_drv.h" - #include "nouveau_reg.h" -@@ -299,8 +300,12 @@ nv50_backlight_init(struct nouveau_backlight *bl, - struct nouveau_drm *drm = nouveau_drm(nv_encoder->base.base.dev); - struct nvif_object *device = &drm->client.device.object; - -+ /* -+ * Note when this runs the connectors have not been probed yet, -+ * so nv_conn->base.status is not set yet. -+ */ - if (!nvif_rd32(device, NV50_PDISP_SOR_PWM_CTL(ffs(nv_encoder->dcb->or) - 1)) || -- nv_conn->base.status != connector_status_connected) -+ drm_helper_probe_detect(&nv_conn->base, NULL, false) != connector_status_connected) - return -ENODEV; - - if (nv_conn->type == DCB_CONNECTOR_eDP) { +diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig +index 737edcdf9eef..7ee9c83f09a7 100644 +--- a/drivers/gpu/drm/panel/Kconfig ++++ b/drivers/gpu/drm/panel/Kconfig +@@ -154,6 +154,18 @@ config DRM_PANEL_FEIYANG_FY07024DI26A30D + Say Y if you want to enable support for panels based on the + Feiyang FY07024DI26A30-D MIPI-DSI interface. + ++config DRM_PANEL_HIMAX_HX8394 ++ tristate "HIMAX HX8394 MIPI-DSI LCD panels" ++ depends on OF ++ depends on DRM_MIPI_DSI ++ depends on BACKLIGHT_CLASS_DEVICE ++ help ++ Say Y if you want to enable support for panels based on the ++ Himax HX8394 controller, such as the HannStar HSD060BHW4 ++ 720x1440 TFT LCD panel that uses a MIPI-DSI interface. ++ ++ If M is selected the module will be called panel-himax-hx8394. ++ + config DRM_PANEL_ILITEK_IL9322 + tristate "Ilitek ILI9322 320x240 QVGA panels" + depends on OF && SPI +diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile +index f8f9d9f6a307..84c01adafd4c 100644 +--- a/drivers/gpu/drm/panel/Makefile ++++ b/drivers/gpu/drm/panel/Makefile +@@ -13,6 +13,7 @@ obj-$(CONFIG_DRM_PANEL_EBBG_FT8719) += panel-ebbg-ft8719.o + obj-$(CONFIG_DRM_PANEL_ELIDA_KD35T133) += panel-elida-kd35t133.o + obj-$(CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02) += panel-feixin-k101-im2ba02.o + obj-$(CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D) += panel-feiyang-fy07024di26a30d.o ++obj-$(CONFIG_DRM_PANEL_HIMAX_HX8394) += panel-himax-hx8394.o + obj-$(CONFIG_DRM_PANEL_ILITEK_IL9322) += panel-ilitek-ili9322.o + obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9341) += panel-ilitek-ili9341.o + obj-$(CONFIG_DRM_PANEL_ILITEK_ILI9881C) += panel-ilitek-ili9881c.o +diff --git a/drivers/gpu/drm/panel/panel-himax-hx8394.c b/drivers/gpu/drm/panel/panel-himax-hx8394.c +new file mode 100644 +index 000000000000..d4fb5d1b295b +--- /dev/null ++++ b/drivers/gpu/drm/panel/panel-himax-hx8394.c +@@ -0,0 +1,451 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Driver for panels based on Himax HX8394 controller, such as: ++ * ++ * - HannStar HSD060BHW4 5.99" MIPI-DSI panel ++ * ++ * Copyright (C) 2021 Kamil Trzciński ++ * ++ * Based on drivers/gpu/drm/panel/panel-sitronix-st7703.c ++ * Copyright (C) Purism SPC 2019 ++ */ ++ ++#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/of_device.h> ++#include <linux/regulator/consumer.h> ++ ++#include <video/mipi_display.h> ++ ++#include <drm/drm_mipi_dsi.h> ++#include <drm/drm_modes.h> ++#include <drm/drm_panel.h> ++ ++#define DRV_NAME "panel-himax-hx8394" ++ ++/* Manufacturer specific commands sent via DSI, listed in HX8394-F datasheet */ ++#define HX8394_CMD_SETSEQUENCE 0xb0 ++#define HX8394_CMD_SETPOWER 0xb1 ++#define HX8394_CMD_SETDISP 0xb2 ++#define HX8394_CMD_SETCYC 0xb4 ++#define HX8394_CMD_SETVCOM 0xb6 ++#define HX8394_CMD_SETTE 0xb7 ++#define HX8394_CMD_SETSENSOR 0xb8 ++#define HX8394_CMD_SETEXTC 0xb9 ++#define HX8394_CMD_SETMIPI 0xba ++#define HX8394_CMD_SETOTP 0xbb ++#define HX8394_CMD_SETREGBANK 0xbd ++#define HX8394_CMD_UNKNOWN1 0xc0 ++#define HX8394_CMD_SETDGCLUT 0xc1 ++#define HX8394_CMD_SETID 0xc3 ++#define HX8394_CMD_SETDDB 0xc4 ++#define HX8394_CMD_UNKNOWN2 0xc6 ++#define HX8394_CMD_SETCABC 0xc9 ++#define HX8394_CMD_SETCABCGAIN 0xca ++#define HX8394_CMD_SETPANEL 0xcc ++#define HX8394_CMD_SETOFFSET 0xd2 ++#define HX8394_CMD_SETGIP0 0xd3 ++#define HX8394_CMD_UNKNOWN3 0xd4 ++#define HX8394_CMD_SETGIP1 0xd5 ++#define HX8394_CMD_SETGIP2 0xd6 ++#define HX8394_CMD_SETGPO 0xd6 ++#define HX8394_CMD_SETSCALING 0xdd ++#define HX8394_CMD_SETIDLE 0xdf ++#define HX8394_CMD_SETGAMMA 0xe0 ++#define HX8394_CMD_SETCHEMODE_DYN 0xe4 ++#define HX8394_CMD_SETCHE 0xe5 ++#define HX8394_CMD_SETCESEL 0xe6 ++#define HX8394_CMD_SET_SP_CMD 0xe9 ++#define HX8394_CMD_SETREADINDEX 0xfe ++#define HX8394_CMD_GETSPIREAD 0xff ++ ++struct hx8394 { ++ struct device *dev; ++ struct drm_panel panel; ++ struct gpio_desc *reset_gpio; ++ struct regulator *vcc; ++ struct regulator *iovcc; ++ bool prepared; ++ ++ const struct hx8394_panel_desc *desc; ++}; ++ ++struct hx8394_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 hx8394 *ctx); ++}; ++ ++static inline struct hx8394 *panel_to_hx8394(struct drm_panel *panel) ++{ ++ return container_of(panel, struct hx8394, panel); ++} ++ ++static int hsd060bhw4_init_sequence(struct hx8394 *ctx) ++{ ++ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); ++ ++ /* 5.19.8 SETEXTC: Set extension command (B9h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETEXTC, ++ 0xff, 0x83, 0x94); ++ ++ /* 5.19.2 SETPOWER: Set power (B1h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETPOWER, ++ 0x48, 0x11, 0x71, 0x09, 0x32, 0x24, 0x71, 0x31, 0x55, 0x30); ++ ++ /* 5.19.9 SETMIPI: Set MIPI control (BAh) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETMIPI, ++ 0x63, 0x03, 0x68, 0x6b, 0xb2, 0xc0); ++ ++ /* 5.19.3 SETDISP: Set display related register (B2h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETDISP, ++ 0x00, 0x80, 0x78, 0x0c, 0x07); ++ ++ /* 5.19.4 SETCYC: Set display waveform cycles (B4h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETCYC, ++ 0x12, 0x63, 0x12, 0x63, 0x12, 0x63, 0x01, 0x0c, 0x7c, 0x55, ++ 0x00, 0x3f, 0x12, 0x6b, 0x12, 0x6b, 0x12, 0x6b, 0x01, 0x0c, ++ 0x7c); ++ ++ /* 5.19.19 SETGIP0: Set GIP Option0 (D3h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETGIP0, ++ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00, 0x32, 0x10, ++ 0x09, 0x00, 0x09, 0x32, 0x15, 0xad, 0x05, 0xad, 0x32, 0x00, ++ 0x00, 0x00, 0x00, 0x37, 0x03, 0x0b, 0x0b, 0x37, 0x00, 0x00, ++ 0x00, 0x0c, 0x40); ++ ++ /* 5.19.20 Set GIP Option1 (D5h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETGIP1, ++ 0x19, 0x19, 0x18, 0x18, 0x1b, 0x1b, 0x1a, 0x1a, 0x00, 0x01, ++ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x20, 0x21, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x24, 0x25, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18); ++ ++ /* 5.19.21 Set GIP Option2 (D6h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETGIP2, ++ 0x18, 0x18, 0x19, 0x19, 0x1b, 0x1b, 0x1a, 0x1a, 0x07, 0x06, ++ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x25, 0x24, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x21, 0x20, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, ++ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18); ++ ++ /* 5.19.25 SETGAMMA: Set gamma curve related setting (E0h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETGAMMA, ++ 0x00, 0x04, 0x0c, 0x12, 0x14, 0x18, 0x1a, 0x18, 0x31, 0x3f, ++ 0x4d, 0x4c, 0x54, 0x65, 0x6b, 0x70, 0x7f, 0x82, 0x7e, 0x8a, ++ 0x99, 0x4a, 0x48, 0x49, 0x4b, 0x4a, 0x4c, 0x4b, 0x7f, 0x00, ++ 0x04, 0x0c, 0x11, 0x13, 0x17, 0x1a, 0x18, 0x31, ++ 0x3f, 0x4d, 0x4c, 0x54, 0x65, 0x6b, 0x70, 0x7f, ++ 0x82, 0x7e, 0x8a, 0x99, 0x4a, 0x48, 0x49, 0x4b, ++ 0x4a, 0x4c, 0x4b, 0x7f); ++ ++ /* 5.19.17 SETPANEL (CCh) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETPANEL, ++ 0x0b); ++ ++ /* Unknown command, not listed in the HX8394-F datasheet */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_UNKNOWN1, ++ 0x1f, 0x31); ++ ++ /* 5.19.5 SETVCOM: Set VCOM voltage (B6h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETVCOM, ++ 0x7d, 0x7d); ++ ++ /* Unknown command, not listed in the HX8394-F datasheet */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_UNKNOWN3, ++ 0x02); ++ ++ /* 5.19.11 Set register bank (BDh) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETREGBANK, ++ 0x01); ++ ++ /* 5.19.2 SETPOWER: Set power (B1h) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETPOWER, ++ 0x00); ++ ++ /* 5.19.11 Set register bank (BDh) */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_SETREGBANK, ++ 0x00); ++ ++ /* Unknown command, not listed in the HX8394-F datasheet */ ++ mipi_dsi_dcs_write_seq(dsi, HX8394_CMD_UNKNOWN3, ++ 0xed); ++ ++ return 0; ++} ++ ++static const struct drm_display_mode hsd060bhw4_mode = { ++ .hdisplay = 720, ++ .hsync_start = 720 + 40, ++ .hsync_end = 720 + 40 + 46, ++ .htotal = 720 + 40 + 46 + 40, ++ .vdisplay = 1440, ++ .vsync_start = 1440 + 9, ++ .vsync_end = 1440 + 9 + 7, ++ .vtotal = 1440 + 9 + 7 + 7, ++ .clock = 74250, ++ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, ++ .width_mm = 68, ++ .height_mm = 136, ++}; ++ ++static const struct hx8394_panel_desc hsd060bhw4_desc = { ++ .mode = &hsd060bhw4_mode, ++ .lanes = 4, ++ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST, ++ .format = MIPI_DSI_FMT_RGB888, ++ .init_sequence = hsd060bhw4_init_sequence, ++}; ++ ++static int hx8394_enable(struct drm_panel *panel) ++{ ++ struct hx8394 *ctx = panel_to_hx8394(panel); ++ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); ++ int ret; ++ ++ ret = ctx->desc->init_sequence(ctx); ++ if (ret) { ++ dev_err(ctx->dev, "Panel init sequence failed: %d\n", ret); ++ return ret; ++ } ++ ++ ret = mipi_dsi_dcs_exit_sleep_mode(dsi); ++ if (ret) { ++ dev_err(ctx->dev, "Failed to exit sleep mode: %d\n", ret); ++ return ret; ++ } ++ ++ /* Panel is operational 120 msec after reset */ ++ msleep(120); ++ ++ ret = mipi_dsi_dcs_set_display_on(dsi); ++ if (ret) { ++ dev_err(ctx->dev, "Failed to turn on the display: %d\n", ret); ++ goto sleep_in; ++ } ++ ++ return 0; ++ ++sleep_in: ++ /* This will probably fail, but let's try orderly power off anyway. */ ++ ret = mipi_dsi_dcs_enter_sleep_mode(dsi); ++ if (!ret) ++ msleep(50); ++ ++ return ret; ++} ++ ++static int hx8394_disable(struct drm_panel *panel) ++{ ++ struct hx8394 *ctx = panel_to_hx8394(panel); ++ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); ++ int ret; ++ ++ ret = mipi_dsi_dcs_enter_sleep_mode(dsi); ++ if (ret) { ++ dev_err(ctx->dev, "Failed to enter sleep mode: %d\n", ret); ++ return ret; ++ } ++ ++ msleep(50); /* about 3 frames */ ++ ++ return 0; ++} ++ ++static int hx8394_unprepare(struct drm_panel *panel) ++{ ++ struct hx8394 *ctx = panel_to_hx8394(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; ++ ++ return 0; ++} ++ ++static int hx8394_prepare(struct drm_panel *panel) ++{ ++ struct hx8394 *ctx = panel_to_hx8394(panel); ++ int ret; ++ ++ if (ctx->prepared) ++ return 0; ++ ++ gpiod_set_value_cansleep(ctx->reset_gpio, 1); ++ ++ ret = regulator_enable(ctx->vcc); ++ if (ret) { ++ dev_err(ctx->dev, "Failed to enable vcc supply: %d\n", ret); ++ return ret; ++ } ++ ++ ret = regulator_enable(ctx->iovcc); ++ if (ret) { ++ dev_err(ctx->dev, "Failed to enable iovcc supply: %d\n", ret); ++ goto disable_vcc; ++ } ++ ++ gpiod_set_value_cansleep(ctx->reset_gpio, 0); ++ ++ msleep(180); ++ ++ ctx->prepared = true; ++ ++ return 0; ++ ++disable_vcc: ++ gpiod_set_value_cansleep(ctx->reset_gpio, 1); ++ regulator_disable(ctx->vcc); ++ return ret; ++} ++ ++static int hx8394_get_modes(struct drm_panel *panel, ++ struct drm_connector *connector) ++{ ++ struct hx8394 *ctx = panel_to_hx8394(panel); ++ struct drm_display_mode *mode; ++ ++ mode = drm_mode_duplicate(connector->dev, ctx->desc->mode); ++ if (!mode) { ++ dev_err(ctx->dev, "Failed to add mode %ux%u@%u\n", ++ ctx->desc->mode->hdisplay, ctx->desc->mode->vdisplay, ++ drm_mode_vrefresh(ctx->desc->mode)); ++ 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 hx8394_drm_funcs = { ++ .disable = hx8394_disable, ++ .unprepare = hx8394_unprepare, ++ .prepare = hx8394_prepare, ++ .enable = hx8394_enable, ++ .get_modes = hx8394_get_modes, ++}; ++ ++static int hx8394_probe(struct mipi_dsi_device *dsi) ++{ ++ struct device *dev = &dsi->dev; ++ struct hx8394 *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_HIGH); ++ if (IS_ERR(ctx->reset_gpio)) ++ return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), ++ "Failed to get reset gpio\n"); ++ ++ mipi_dsi_set_drvdata(dsi, ctx); ++ ++ ctx->dev = dev; ++ ctx->desc = of_device_get_match_data(dev); ++ ++ 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)) ++ return dev_err_probe(dev, PTR_ERR(ctx->vcc), ++ "Failed to request vcc regulator\n"); ++ ++ ctx->iovcc = devm_regulator_get(dev, "iovcc"); ++ if (IS_ERR(ctx->iovcc)) ++ return dev_err_probe(dev, PTR_ERR(ctx->iovcc), ++ "Failed to request iovcc regulator\n"); ++ ++ drm_panel_init(&ctx->panel, dev, &hx8394_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) { ++ dev_err_probe(dev, ret, "mipi_dsi_attach failed\n"); ++ drm_panel_remove(&ctx->panel); ++ return ret; ++ } ++ ++ dev_dbg(dev, "%ux%u@%u %ubpp dsi %udl - ready\n", ++ ctx->desc->mode->hdisplay, ctx->desc->mode->vdisplay, ++ drm_mode_vrefresh(ctx->desc->mode), ++ mipi_dsi_pixel_format_to_bpp(dsi->format), dsi->lanes); ++ ++ return 0; ++} ++ ++static void hx8394_shutdown(struct mipi_dsi_device *dsi) ++{ ++ struct hx8394 *ctx = mipi_dsi_get_drvdata(dsi); ++ int ret; ++ ++ ret = drm_panel_disable(&ctx->panel); ++ if (ret < 0) ++ dev_err(&dsi->dev, "Failed to disable panel: %d\n", ret); ++ ++ ret = drm_panel_unprepare(&ctx->panel); ++ if (ret < 0) ++ dev_err(&dsi->dev, "Failed to unprepare panel: %d\n", ret); ++} ++ ++static void hx8394_remove(struct mipi_dsi_device *dsi) ++{ ++ struct hx8394 *ctx = mipi_dsi_get_drvdata(dsi); ++ int ret; ++ ++ hx8394_shutdown(dsi); ++ ++ ret = mipi_dsi_detach(dsi); ++ if (ret < 0) ++ dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); ++ ++ drm_panel_remove(&ctx->panel); ++} ++ ++static const struct of_device_id hx8394_of_match[] = { ++ { .compatible = "hannstar,hsd060bhw4", .data = &hsd060bhw4_desc }, ++ { /* sentinel */ } ++}; ++MODULE_DEVICE_TABLE(of, hx8394_of_match); ++ ++static struct mipi_dsi_driver hx8394_driver = { ++ .probe = hx8394_probe, ++ .remove = hx8394_remove, ++ .shutdown = hx8394_shutdown, ++ .driver = { ++ .name = DRV_NAME, ++ .of_match_table = hx8394_of_match, ++ }, ++}; ++module_mipi_dsi_driver(hx8394_driver); ++ ++MODULE_AUTHOR("Kamil Trzciński <ayufan@ayufan.eu>"); ++MODULE_DESCRIPTION("DRM driver for Himax HX8394 based MIPI DSI panels"); ++MODULE_LICENSE("GPL"); diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c index 84e7ba5314d3..efc96776f761 100644 --- a/drivers/hid/hid-rmi.c @@ -777,83 +1487,6 @@ index 77bca6932f01..27f5455aef6c 100644 amba_driver_unregister(&etm4x_amba_driver); platform_driver_unregister(&etm4_platform_driver); etm4_pm_clear(); -diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c -index 989228b5a0a4..e2c11d9f3868 100644 ---- a/drivers/input/mouse/alps.c -+++ b/drivers/input/mouse/alps.c -@@ -852,8 +852,8 @@ static void alps_process_packet_v6(struct psmouse *psmouse) - x = y = z = 0; - - /* Divide 4 since trackpoint's speed is too fast */ -- input_report_rel(dev2, REL_X, (char)x / 4); -- input_report_rel(dev2, REL_Y, -((char)y / 4)); -+ input_report_rel(dev2, REL_X, (s8)x / 4); -+ input_report_rel(dev2, REL_Y, -((s8)y / 4)); - - psmouse_report_standard_buttons(dev2, packet[3]); - -@@ -1104,8 +1104,8 @@ static void alps_process_trackstick_packet_v7(struct psmouse *psmouse) - ((packet[3] & 0x20) << 1); - z = (packet[5] & 0x3f) | ((packet[3] & 0x80) >> 1); - -- input_report_rel(dev2, REL_X, (char)x); -- input_report_rel(dev2, REL_Y, -((char)y)); -+ input_report_rel(dev2, REL_X, (s8)x); -+ input_report_rel(dev2, REL_Y, -((s8)y)); - input_report_abs(dev2, ABS_PRESSURE, z); - - psmouse_report_standard_buttons(dev2, packet[1]); -@@ -2294,20 +2294,20 @@ static int alps_get_v3_v7_resolution(struct psmouse *psmouse, int reg_pitch) - if (reg < 0) - return reg; - -- x_pitch = (char)(reg << 4) >> 4; /* sign extend lower 4 bits */ -+ x_pitch = (s8)(reg << 4) >> 4; /* sign extend lower 4 bits */ - x_pitch = 50 + 2 * x_pitch; /* In 0.1 mm units */ - -- y_pitch = (char)reg >> 4; /* sign extend upper 4 bits */ -+ y_pitch = (s8)reg >> 4; /* sign extend upper 4 bits */ - y_pitch = 36 + 2 * y_pitch; /* In 0.1 mm units */ - - reg = alps_command_mode_read_reg(psmouse, reg_pitch + 1); - if (reg < 0) - return reg; - -- x_electrode = (char)(reg << 4) >> 4; /* sign extend lower 4 bits */ -+ x_electrode = (s8)(reg << 4) >> 4; /* sign extend lower 4 bits */ - x_electrode = 17 + x_electrode; - -- y_electrode = (char)reg >> 4; /* sign extend upper 4 bits */ -+ y_electrode = (s8)reg >> 4; /* sign extend upper 4 bits */ - y_electrode = 13 + y_electrode; - - x_phys = x_pitch * (x_electrode - 1); /* In 0.1 mm units */ -diff --git a/drivers/input/mouse/focaltech.c b/drivers/input/mouse/focaltech.c -index 6fd5fff0cbff..c74b99077d16 100644 ---- a/drivers/input/mouse/focaltech.c -+++ b/drivers/input/mouse/focaltech.c -@@ -202,8 +202,8 @@ static void focaltech_process_rel_packet(struct psmouse *psmouse, - state->pressed = packet[0] >> 7; - finger1 = ((packet[0] >> 4) & 0x7) - 1; - if (finger1 < FOC_MAX_FINGERS) { -- state->fingers[finger1].x += (char)packet[1]; -- state->fingers[finger1].y += (char)packet[2]; -+ state->fingers[finger1].x += (s8)packet[1]; -+ state->fingers[finger1].y += (s8)packet[2]; - } else { - psmouse_err(psmouse, "First finger in rel packet invalid: %d\n", - finger1); -@@ -218,8 +218,8 @@ static void focaltech_process_rel_packet(struct psmouse *psmouse, - */ - finger2 = ((packet[3] >> 4) & 0x7) - 1; - if (finger2 < FOC_MAX_FINGERS) { -- state->fingers[finger2].x += (char)packet[4]; -- state->fingers[finger2].y += (char)packet[5]; -+ state->fingers[finger2].x += (s8)packet[4]; -+ state->fingers[finger2].y += (s8)packet[5]; - } - } - diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c index 258d5fe3d395..f7298e3dc8f3 100644 --- a/drivers/input/rmi4/rmi_driver.c @@ -1086,24 +1719,6 @@ index f8100067502f..e0823c45e2fa 100644 /* * Changes the default domain of an iommu group that has *only* one device * -diff --git a/drivers/net/wwan/iosm/iosm_ipc_imem.c b/drivers/net/wwan/iosm/iosm_ipc_imem.c -index 1e6a47976642..c066b0040a3f 100644 ---- a/drivers/net/wwan/iosm/iosm_ipc_imem.c -+++ b/drivers/net/wwan/iosm/iosm_ipc_imem.c -@@ -587,6 +587,13 @@ static void ipc_imem_run_state_worker(struct work_struct *instance) - while (ctrl_chl_idx < IPC_MEM_MAX_CHANNELS) { - if (!ipc_chnl_cfg_get(&chnl_cfg_port, ctrl_chl_idx)) { - ipc_imem->ipc_port[ctrl_chl_idx] = NULL; -+ -+ if (ipc_imem->pcie->pci->device == INTEL_CP_DEVICE_7560_ID && -+ chnl_cfg_port.wwan_port_type == WWAN_PORT_XMMRPC) { -+ ctrl_chl_idx++; -+ continue; -+ } -+ - if (ipc_imem->pcie->pci->device == INTEL_CP_DEVICE_7360_ID && - chnl_cfg_port.wwan_port_type == WWAN_PORT_MBIM) { - ctrl_chl_idx++; diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 494fa46f5767..27bc8dd45ad8 100644 --- a/drivers/pci/quirks.c @@ -1177,127 +1792,6 @@ index fb988e4ea924..6db07ca419c3 100644 }; static int __init xhci_pci_init(void) -diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c -index 8cbbb002fefe..086b50968983 100644 ---- a/drivers/usb/typec/ucsi/ucsi.c -+++ b/drivers/usb/typec/ucsi/ucsi.c -@@ -1039,9 +1039,8 @@ static struct fwnode_handle *ucsi_find_fwnode(struct ucsi_connector *con) - return NULL; - } - --static int ucsi_register_port(struct ucsi *ucsi, int index) -+static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con) - { -- struct ucsi_connector *con = &ucsi->connector[index]; - struct typec_capability *cap = &con->typec_cap; - enum typec_accessory *accessory = cap->accessory; - enum usb_role u_role = USB_ROLE_NONE; -@@ -1062,7 +1061,6 @@ static int ucsi_register_port(struct ucsi *ucsi, int index) - init_completion(&con->complete); - mutex_init(&con->lock); - INIT_LIST_HEAD(&con->partner_tasks); -- con->num = index + 1; - con->ucsi = ucsi; - - cap->fwnode = ucsi_find_fwnode(con); -@@ -1204,7 +1202,7 @@ static int ucsi_register_port(struct ucsi *ucsi, int index) - */ - static int ucsi_init(struct ucsi *ucsi) - { -- struct ucsi_connector *con; -+ struct ucsi_connector *con, *connector; - u64 command, ntfy; - int ret; - int i; -@@ -1235,16 +1233,16 @@ static int ucsi_init(struct ucsi *ucsi) - } - - /* Allocate the connectors. Released in ucsi_unregister() */ -- ucsi->connector = kcalloc(ucsi->cap.num_connectors + 1, -- sizeof(*ucsi->connector), GFP_KERNEL); -- if (!ucsi->connector) { -+ connector = kcalloc(ucsi->cap.num_connectors + 1, sizeof(*connector), GFP_KERNEL); -+ if (!connector) { - ret = -ENOMEM; - goto err_reset; - } - - /* Register all connectors */ - for (i = 0; i < ucsi->cap.num_connectors; i++) { -- ret = ucsi_register_port(ucsi, i); -+ connector[i].num = i + 1; -+ ret = ucsi_register_port(ucsi, &connector[i]); - if (ret) - goto err_unregister; - } -@@ -1256,11 +1254,12 @@ static int ucsi_init(struct ucsi *ucsi) - if (ret < 0) - goto err_unregister; - -+ ucsi->connector = connector; - ucsi->ntfy = ntfy; - return 0; - - err_unregister: -- for (con = ucsi->connector; con->port; con++) { -+ for (con = connector; con->port; con++) { - ucsi_unregister_partner(con); - ucsi_unregister_altmodes(con, UCSI_RECIPIENT_CON); - ucsi_unregister_port_psy(con); -@@ -1269,10 +1268,7 @@ static int ucsi_init(struct ucsi *ucsi) - typec_unregister_port(con->port); - con->port = NULL; - } -- -- kfree(ucsi->connector); -- ucsi->connector = NULL; -- -+ kfree(connector); - err_reset: - memset(&ucsi->cap, 0, sizeof(ucsi->cap)); - ucsi_reset_ppm(ucsi); -diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c -index 7e348bd2ccde..c232636ecdfe 100644 ---- a/fs/btrfs/ioctl.c -+++ b/fs/btrfs/ioctl.c -@@ -3731,7 +3731,9 @@ static long btrfs_ioctl_qgroup_assign(struct file *file, void __user *arg) - } - - /* update qgroup status and info */ -+ mutex_lock(&fs_info->qgroup_ioctl_lock); - err = btrfs_run_qgroups(trans); -+ mutex_unlock(&fs_info->qgroup_ioctl_lock); - if (err < 0) - btrfs_handle_fs_error(fs_info, err, - "failed to update qgroup status and info"); -diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c -index af97413abcf4..abf2b7f14307 100644 ---- a/fs/btrfs/qgroup.c -+++ b/fs/btrfs/qgroup.c -@@ -2828,13 +2828,22 @@ int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans) - } - - /* -- * called from commit_transaction. Writes all changed qgroups to disk. -+ * Writes all changed qgroups to disk. -+ * Called by the transaction commit path and the qgroup assign ioctl. - */ - int btrfs_run_qgroups(struct btrfs_trans_handle *trans) - { - struct btrfs_fs_info *fs_info = trans->fs_info; - int ret = 0; - -+ /* -+ * In case we are called from the qgroup assign ioctl, assert that we -+ * are holding the qgroup_ioctl_lock, otherwise we can race with a quota -+ * disable operation (ioctl) and access a freed quota root. -+ */ -+ if (trans->transaction->state != TRANS_STATE_COMMIT_DOING) -+ lockdep_assert_held(&fs_info->qgroup_ioctl_lock); -+ - if (!fs_info->quota_root) - return ret; - diff --git a/include/linux/efi.h b/include/linux/efi.h index ac22f7ca195a..e680835ad387 100644 --- a/include/linux/efi.h |