mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-30 23:00:47 +08:00
bcm27xx: pull 6.6 patches from RPi
Adds latest 6.6 patches from the Raspberry Pi repository. These patches were generated from: https://github.com/raspberrypi/linux/commits/rpi-6.6.y/ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
parent
26c1b564e0
commit
975ce33610
@ -314,6 +314,7 @@ CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_GPIO=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RANDSTRUCT_NONE=y
|
||||
CONFIG_RASPBERRYPI_FIRMWARE=y
|
||||
@ -346,6 +347,7 @@ CONFIG_SERIAL_DEV_BUS=y
|
||||
# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_RPI_FW=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMSC_PHY=y
|
||||
CONFIG_SOFTIRQ_ON_OWN_STACK=y
|
||||
|
@ -398,6 +398,7 @@ CONFIG_PTP_1588_CLOCK=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_GPIO=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_RANDSTRUCT_NONE=y
|
||||
CONFIG_RAS=y
|
||||
@ -435,6 +436,7 @@ CONFIG_SERIAL_DEV_BUS=y
|
||||
# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_RPI_FW=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ON_UP=y
|
||||
|
@ -389,6 +389,7 @@ CONFIG_PRINTK_TIME=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_GPIO=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
@ -428,6 +429,7 @@ CONFIG_SERIAL_DEV_BUS=y
|
||||
# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_RPI_FW=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMSC_PHY=y
|
||||
|
@ -405,6 +405,7 @@ CONFIG_PTP_1588_CLOCK=y
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_GPIO=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
CONFIG_QUEUED_SPINLOCKS=y
|
||||
@ -445,6 +446,7 @@ CONFIG_SERIAL_DEV_BUS=y
|
||||
# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set
|
||||
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_RPI_FW=y
|
||||
CONFIG_SG_POOL=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||
|
@ -128,7 +128,7 @@ CONFIG_CMA_SIZE_SEL_MBYTES=y
|
||||
# CONFIG_CMA_SYSFS is not set
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_RP1=y
|
||||
# CONFIG_COMMON_CLK_RP1_SDIO is not set
|
||||
CONFIG_COMMON_CLK_RP1_SDIO=y
|
||||
CONFIG_COMMON_CLK_XGENE=y
|
||||
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
|
||||
# CONFIG_COMPAT_32BIT_TIME is not set
|
||||
@ -511,6 +511,7 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_BCM2835=y
|
||||
CONFIG_PWM_BRCMSTB=y
|
||||
CONFIG_PWM_GPIO=y
|
||||
CONFIG_PWM_RP1=y
|
||||
CONFIG_PWM_SYSFS=y
|
||||
CONFIG_QUEUED_RWLOCKS=y
|
||||
@ -546,7 +547,6 @@ CONFIG_SCSI_COMMON=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_SENSORS_RASPBERRYPI_HWMON=y
|
||||
CONFIG_SENSORS_RP1_ADC=y
|
||||
CONFIG_SERIAL_8250_BCM2835AUX=y
|
||||
CONFIG_SERIAL_8250_BCM7271=y
|
||||
# CONFIG_SERIAL_8250_DMA is not set
|
||||
@ -574,6 +574,7 @@ CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
|
||||
CONFIG_SRAM=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_SUSPEND=y
|
||||
CONFIG_SUSPEND_FREEZER=y
|
||||
|
@ -1,6 +1,7 @@
|
||||
# CONFIG_BACKLIGHT_RPI is not set
|
||||
# CONFIG_BCM2712_MIP is not set
|
||||
# CONFIG_COMMON_CLK_RP1 is not set
|
||||
# CONFIG_COMMON_CLK_RP1_SDIO is not set
|
||||
# CONFIG_COMMON_CLK_RP1_SDIO is not set
|
||||
# CONFIG_DRM_PANEL_ILITEK_ILI9806E is not set
|
||||
# CONFIG_DRM_PANEL_TPO_Y17P is not set
|
||||
@ -9,8 +10,10 @@
|
||||
# CONFIG_DRM_RP1_DSI is not set
|
||||
# CONFIG_DRM_RP1_VEC is not set
|
||||
# CONFIG_FB_RPISENSE is not set
|
||||
# CONFIG_FIRMWARE_RP1 is not set
|
||||
# CONFIG_GPIO_PWM is not set
|
||||
# CONFIG_INPUT_RASPBERRYPI_BUTTON is not set
|
||||
# CONFIG_MBOX_RP1 is not set
|
||||
# CONFIG_MEDIA_PCI_HAILO is not set
|
||||
# CONFIG_MFD_PM8921_CORE is not set
|
||||
# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set
|
||||
@ -19,10 +22,14 @@
|
||||
# CONFIG_PHY_CADENCE_DP is not set
|
||||
# CONFIG_PINCTRL_BCM2712 is not set
|
||||
# CONFIG_PINCTRL_RP1 is not set
|
||||
# CONFIG_PWM_PIO_RP1 is not set
|
||||
# CONFIG_PWM_RP1 is not set
|
||||
# CONFIG_RASPBERRYPI_GPIOMEM is not set
|
||||
# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2 is not set
|
||||
# CONFIG_RP1_PIO is not set
|
||||
# CONFIG_SENSORS_RP1_ADC is not set
|
||||
# CONFIG_SERIAL_RPI_FW is not set
|
||||
# CONFIG_SND_PIMIDI is not set
|
||||
# CONFIG_SPI_RP2040_GPIO_BRIDGE is not set
|
||||
# CONFIG_VIDEO_AD5398 is not set
|
||||
# CONFIG_VIDEO_ARDUCAM_64MP is not set
|
||||
@ -39,3 +46,4 @@
|
||||
# CONFIG_VIDEO_OV64A40 is not set
|
||||
# CONFIG_VIDEO_RASPBERRYPI_PISP_BE is not set
|
||||
# CONFIG_VIDEO_RP1_CFE is not set
|
||||
# CONFIG_WS2812_PIO_RP1 is not set
|
||||
|
@ -2,6 +2,23 @@
|
||||
#
|
||||
# Copyright (C) 2019 OpenWrt.org
|
||||
|
||||
define KernelPackage/rp1-adc
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 ADC and temperature sensor driver
|
||||
KCONFIG:=CONFIG_SENSORS_RP1_ADC
|
||||
FILES:=$(LINUX_DIR)/drivers/hwmon/rp1-adc.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1-adc)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-adc/description
|
||||
Kernel module for RP1 silicon providing ADC and
|
||||
temperature monitoring.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-adc))
|
||||
|
||||
|
||||
define KernelPackage/hwmon-raspberrypi
|
||||
TITLE:=Raspberry Pi voltage monitor
|
||||
KCONFIG:=CONFIG_SENSORS_RASPBERRYPI_HWMON
|
||||
|
@ -53,3 +53,89 @@ define KernelPackage/smi-bcm2835-dev/description
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,smi-bcm2835-dev))
|
||||
|
||||
|
||||
define KernelPackage/rp1
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 firmware
|
||||
KCONFIG:=CONFIG_FIRMWARE_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/firmware/rp1.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1/description
|
||||
This driver provides a firmware interface to the RP1 processor using shared
|
||||
memory and a mailbox.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1))
|
||||
|
||||
|
||||
define KernelPackage/rp1-pio
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 PIO block support
|
||||
KCONFIG:=CONFIG_RP1_PIO
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/rp1-pio.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1-pio)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-rp1
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-pio/description
|
||||
Driver providing control of the Raspberry Pi PIO block, as found in RP1
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-pio))
|
||||
|
||||
|
||||
define KernelPackage/pwm-pio-rp1
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 PWM support
|
||||
KCONFIG:=CONFIG_PWM_PIO_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/pwm/pwm-pio-rp1.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,pwm-pio-rp1)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-rp1-pio
|
||||
endef
|
||||
|
||||
define KernelPackage/pwm-pio-rp1/description
|
||||
Enables precise control of PWM signals for tasks like motor control,
|
||||
LED dimming, and audio signal generation. Leveraging PIO allows for
|
||||
higher accuracy and flexibility in PWM signal generation compared
|
||||
to traditional hardware timers.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,pwm-pio-rp1))
|
||||
|
||||
|
||||
define KernelPackage/ws2812-pio-rp1
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 PIO-base WS2812 driver
|
||||
KCONFIG:=CONFIG_WS2812_PIO_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/ws2812-pio-rp1.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,ws2812-pio-rp1)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-rp1-pio
|
||||
endef
|
||||
|
||||
define KernelPackage/ws2812-pio-rp1/description
|
||||
Driver for the WS2812 (NeoPixel) LEDs using the RP1 PIO hardware.
|
||||
The driver creates a character device to which rgbw pixels may be
|
||||
written. Single-byte writes to offset 0 set the brightness at runtime.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,ws2812-pio-rp1))
|
||||
|
||||
|
||||
define KernelPackage/rp1-mailbox
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=RP1 mailbox IPC driver
|
||||
KCONFIG:=CONFIG_MBOX_RP1
|
||||
FILES:=$(LINUX_DIR)/drivers/mailbox/rp1-mailbox.ko
|
||||
AUTOLOAD:=$(call AutoLoad,21,rp1-mailbox)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-mailbox/description
|
||||
This is a RP1 mailbox IPC driver.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-mailbox))
|
||||
|
@ -20,6 +20,25 @@ endef
|
||||
$(eval $(call KernelPackage,camera-bcm2835))
|
||||
|
||||
|
||||
define KernelPackage/rp1-cfe
|
||||
TITLE:=RP1 Camera Front-End
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
KCONFIG:= \
|
||||
CONFIG_VIDEO_RP1_CFE \
|
||||
CONFIG_VIDEO_BCM2835
|
||||
FILES:=$(LINUX_DIR)/drivers/media/platform/raspberrypi/rp1_cfe/rp1-cfe.ko
|
||||
AUTOLOAD:=$(call AutoLoad,67,rp1-cfe)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-video-core +kmod-video-fwnode +kmod-video-dma-contig +kmod-video-async
|
||||
endef
|
||||
|
||||
define KernelPackage/rp1-cfe/description
|
||||
Driver for the Camera Serial Interface (CSI) to capture video
|
||||
streams from connected cameras.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,rp1-cfe))
|
||||
|
||||
|
||||
define KernelPackage/codec-bcm2835
|
||||
TITLE:=BCM2835 Video Codec
|
||||
KCONFIG:= \
|
||||
@ -115,3 +134,81 @@ define KernelPackage/vchiq-mmal-bcm2835/description
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,vchiq-mmal-bcm2835))
|
||||
|
||||
|
||||
define KernelPackage/drm-rp1-dsi
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
TITLE:=RP1 Display Serial Interface for Video
|
||||
KCONFIG:= \
|
||||
CONFIG_DRM_RP1_DSI \
|
||||
CONFIG_DRM_GEM_DMA_HELPER \
|
||||
CONFIG_DRM_KMS_HELPER \
|
||||
CONFIG_DRM_MIPI_DSI=y \
|
||||
CONFIG_DRM_VRAM_HELPER=n \
|
||||
CONFIG_DRM_TTM=n \
|
||||
CONFIG_DRM_TTM_HELPER=n \
|
||||
CONFIG_GENERIC_PHY_MIPI_DPHY=n \
|
||||
CONFIG_DRM_WERROR=n
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/rp1/rp1-dsi/drm-rp1-dsi.ko
|
||||
AUTOLOAD:=$(call AutoLoad,67,drm-rp1-dsi)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-drm-vc4
|
||||
endef
|
||||
|
||||
define KernelPackage/drm-rp1-dsi/description
|
||||
This module manages the DSI for driving high-resolution LCD panels
|
||||
such as the official Raspberry Pi displays or other screens that
|
||||
use the DSI interface.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,drm-rp1-dsi))
|
||||
|
||||
|
||||
define KernelPackage/drm-rp1-dpi
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
TITLE:=RP1 Display Parallel Interface for Video
|
||||
KCONFIG:= \
|
||||
CONFIG_DRM_RP1_DPI \
|
||||
CONFIG_DRM_GEM_DMA_HELPER \
|
||||
CONFIG_DRM_KMS_HELPER \
|
||||
CONFIG_DRM_VRAM_HELPER=n \
|
||||
CONFIG_DRM_TTM=n \
|
||||
CONFIG_DRM_TTM_HELPER=n
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/rp1/rp1-dpi/drm-rp1-dpi.ko
|
||||
AUTOLOAD:=$(call AutoLoad,67,drm-rp1-dpi)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-drm-vc4 +kmod-rp1-pio
|
||||
endef
|
||||
|
||||
define KernelPackage/drm-rp1-dpi/description
|
||||
This module is or driving displays using the DPI standard.
|
||||
Useful for interfacing with custom or low-level LCD panels
|
||||
that require parallel RGB signals. Provides direct control
|
||||
over the timing and signal driving of raw LCD panels.
|
||||
Typically used in maker projects or with non-HDMI displays.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,drm-rp1-dpi))
|
||||
|
||||
|
||||
define KernelPackage/drm-rp1-vec
|
||||
SUBMENU:=$(VIDEO_MENU)
|
||||
TITLE:=RP1 Display Composite Video
|
||||
KCONFIG:= \
|
||||
CONFIG_DRM_RP1_VEC \
|
||||
CONFIG_DRM_GEM_DMA_HELPER \
|
||||
CONFIG_DRM_KMS_HELPER \
|
||||
CONFIG_DRM_VRAM_HELPER=n \
|
||||
CONFIG_DRM_TTM=n \
|
||||
CONFIG_DRM_TTM_HELPER=n
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/rp1/rp1-vec/drm-rp1-vec.ko
|
||||
AUTOLOAD:=$(call AutoLoad,67,drm-rp1-vec)
|
||||
DEPENDS:=@TARGET_bcm27xx_bcm2712 +kmod-drm-vc4
|
||||
endef
|
||||
|
||||
define KernelPackage/drm-rp1-vec/description
|
||||
This module is used for composite video output, which is typically
|
||||
transmitted through the RCA jack. Primary use is onnecting older
|
||||
TVs or monitors that rely on analog signals via a composite interface.
|
||||
Handles standard-definition analog signals in NTSC and PAL.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,drm-rp1-vec))
|
||||
|
@ -89,7 +89,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
commit->event = kzalloc(sizeof(*commit->event),
|
||||
--- a/drivers/gpu/drm/i915/display/intel_display.c
|
||||
+++ b/drivers/gpu/drm/i915/display/intel_display.c
|
||||
@@ -7280,6 +7280,19 @@ int intel_atomic_commit(struct drm_devic
|
||||
@@ -7297,6 +7297,19 @@ int intel_atomic_commit(struct drm_devic
|
||||
state->base.legacy_cursor_update = false;
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/kernel/cgroup/cgroup.c
|
||||
+++ b/kernel/cgroup/cgroup.c
|
||||
@@ -6063,6 +6063,9 @@ int __init cgroup_init_early(void)
|
||||
@@ -6059,6 +6059,9 @@ int __init cgroup_init_early(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
/**
|
||||
* cgroup_init - cgroup initialization
|
||||
*
|
||||
@@ -6096,6 +6099,12 @@ int __init cgroup_init(void)
|
||||
@@ -6092,6 +6095,12 @@ int __init cgroup_init(void)
|
||||
|
||||
cgroup_unlock();
|
||||
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
for_each_subsys(ss, ssid) {
|
||||
if (ss->early_init) {
|
||||
struct cgroup_subsys_state *css =
|
||||
@@ -6736,6 +6745,10 @@ static int __init cgroup_disable(char *s
|
||||
@@ -6740,6 +6749,10 @@ static int __init cgroup_disable(char *s
|
||||
strcmp(token, ss->legacy_name))
|
||||
continue;
|
||||
|
||||
@ -51,7 +51,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
static_branch_disable(cgroup_subsys_enabled_key[i]);
|
||||
pr_info("Disabling %s control group subsystem\n",
|
||||
ss->name);
|
||||
@@ -6754,6 +6767,31 @@ static int __init cgroup_disable(char *s
|
||||
@@ -6758,6 +6771,31 @@ static int __init cgroup_disable(char *s
|
||||
}
|
||||
__setup("cgroup_disable=", cgroup_disable);
|
||||
|
||||
|
@ -1189,7 +1189,7 @@ Signed-off-by: Alexander Winkowski <dereference23@outlook.com>
|
||||
}
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -5710,7 +5710,7 @@ static void port_event(struct usb_hub *h
|
||||
@@ -5722,7 +5722,7 @@ static void port_event(struct usb_hub *h
|
||||
port_dev->over_current_count++;
|
||||
port_over_current_notify(port_dev);
|
||||
|
||||
|
@ -285,7 +285,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
static inline int mmc_blk_part_switch(struct mmc_card *card,
|
||||
unsigned int part_type);
|
||||
static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
|
||||
@@ -3016,6 +3023,8 @@ static int mmc_blk_probe(struct mmc_card
|
||||
@@ -3066,6 +3073,8 @@ static int mmc_blk_probe(struct mmc_card
|
||||
{
|
||||
struct mmc_blk_data *md;
|
||||
int ret = 0;
|
||||
@ -294,7 +294,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
/*
|
||||
* Check that the card supports the command class(es) we need.
|
||||
@@ -3023,7 +3032,16 @@ static int mmc_blk_probe(struct mmc_card
|
||||
@@ -3073,7 +3082,16 @@ static int mmc_blk_probe(struct mmc_card
|
||||
if (!(card->csd.cmdclass & CCC_BLOCK_READ))
|
||||
return -ENODEV;
|
||||
|
||||
@ -312,7 +312,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
card->complete_wq = alloc_workqueue("mmc_complete",
|
||||
WQ_MEM_RECLAIM | WQ_HIGHPRI, 0);
|
||||
@@ -3038,6 +3056,17 @@ static int mmc_blk_probe(struct mmc_card
|
||||
@@ -3088,6 +3106,17 @@ static int mmc_blk_probe(struct mmc_card
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
|
@ -14927,7 +14927,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
config SND_SOC_TFA989X
|
||||
tristate "NXP/Goodix TFA989X (TFA1) amplifiers"
|
||||
depends on I2C
|
||||
@@ -2404,4 +2422,8 @@ config SND_SOC_LPASS_TX_MACRO
|
||||
@@ -2405,4 +2423,8 @@ config SND_SOC_LPASS_TX_MACRO
|
||||
select SND_SOC_LPASS_MACRO_COMMON
|
||||
tristate "Qualcomm TX Macro in LPASS(Low Power Audio SubSystem)"
|
||||
|
||||
@ -17583,7 +17583,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
* For devices with more than one control interface, we assume the
|
||||
--- a/sound/usb/quirks.c
|
||||
+++ b/sound/usb/quirks.c
|
||||
@@ -2247,6 +2247,8 @@ static const struct usb_audio_quirk_flag
|
||||
@@ -2254,6 +2254,8 @@ static const struct usb_audio_quirk_flag
|
||||
QUIRK_FLAG_ALIGN_TRANSFER),
|
||||
DEVICE_FLG(0x534d, 0x2109, /* MacroSilicon MS2109 */
|
||||
QUIRK_FLAG_ALIGN_TRANSFER),
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
|
||||
--- a/drivers/usb/host/xhci.c
|
||||
+++ b/drivers/usb/host/xhci.c
|
||||
@@ -1497,6 +1497,109 @@ command_cleanup:
|
||||
@@ -1498,6 +1498,109 @@ command_cleanup:
|
||||
}
|
||||
|
||||
/*
|
||||
@ -125,7 +125,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
* non-error returns are a promise to giveback() the urb later
|
||||
* we drop ownership so next owner (or urb unlink) can get it
|
||||
*/
|
||||
@@ -5347,6 +5450,7 @@ static const struct hc_driver xhci_hc_dr
|
||||
@@ -5360,6 +5463,7 @@ static const struct hc_driver xhci_hc_dr
|
||||
.endpoint_reset = xhci_endpoint_reset,
|
||||
.check_bandwidth = xhci_check_bandwidth,
|
||||
.reset_bandwidth = xhci_reset_bandwidth,
|
||||
|
@ -26,7 +26,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -738,9 +738,9 @@ deq_found:
|
||||
@@ -740,9 +740,9 @@ deq_found:
|
||||
}
|
||||
|
||||
if ((ep->ep_state & SET_DEQ_PENDING)) {
|
||||
|
@ -19,7 +19,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/host/xhci.c
|
||||
+++ b/drivers/usb/host/xhci.c
|
||||
@@ -1586,7 +1586,7 @@ static void xhci_fixup_endpoint(struct u
|
||||
@@ -1587,7 +1587,7 @@ static void xhci_fixup_endpoint(struct u
|
||||
return;
|
||||
}
|
||||
ctrl_ctx->add_flags = xhci_get_endpoint_flag_from_index(ep_index);
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -243,6 +243,9 @@
|
||||
@@ -244,6 +244,9 @@
|
||||
#define USB_VENDOR_ID_BAANTO 0x2453
|
||||
#define USB_DEVICE_ID_BAANTO_MT_190W2 0x0100
|
||||
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
#define USB_VENDOR_ID_BELKIN 0x050d
|
||||
#define USB_DEVICE_ID_FLIP_KVM 0x3201
|
||||
|
||||
@@ -1406,6 +1409,9 @@
|
||||
@@ -1439,6 +1442,9 @@
|
||||
#define USB_VENDOR_ID_XIAOMI 0x2717
|
||||
#define USB_DEVICE_ID_MI_SILENT_MOUSE 0x5014
|
||||
|
||||
|
@ -343,7 +343,7 @@ Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
|
||||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20057,6 +20057,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
@@ -20059,6 +20059,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/sony,imx415.yaml
|
||||
F: drivers/media/i2c/imx415.c
|
||||
|
||||
|
@ -177,7 +177,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20065,6 +20065,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
@@ -20067,6 +20067,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx477.yaml
|
||||
F: drivers/media/i2c/imx477.c
|
||||
|
||||
|
@ -132,7 +132,7 @@ Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
|
||||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20062,6 +20062,7 @@ M: Raspberry Pi Kernel Maintenance <kern
|
||||
@@ -20064,6 +20064,7 @@ M: Raspberry Pi Kernel Maintenance <kern
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/gpu/drm/v3d/v3d_irq.c
|
||||
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
|
||||
@@ -181,6 +181,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
@@ -189,6 +189,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
"GMP",
|
||||
};
|
||||
const char *client = "?";
|
||||
@ -21,7 +21,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
V3D_WRITE(V3D_MMU_CTL, V3D_READ(V3D_MMU_CTL));
|
||||
|
||||
@@ -190,6 +191,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
@@ -198,6 +199,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
client = v3d41_axi_ids[axi_id];
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
dev_err(v3d->drm.dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n",
|
||||
client, axi_id, (long long)vio_addr,
|
||||
((intsts & V3D_HUB_INT_MMU_WRV) ?
|
||||
@@ -198,6 +200,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
@@ -206,6 +208,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
", pte invalid" : ""),
|
||||
((intsts & V3D_HUB_INT_MMU_CAP) ?
|
||||
", cap exceeded" : ""));
|
||||
|
@ -65,7 +65,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
|
||||
|
||||
return 0;
|
||||
@@ -1536,6 +1551,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
@@ -1537,6 +1552,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
pcie->gen = (ret < 0) ? 0 : ret;
|
||||
|
||||
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/media/i2c/ov7251.c
|
||||
+++ b/drivers/media/i2c/ov7251.c
|
||||
@@ -1541,7 +1541,7 @@ static int ov7251_init_ctrls(struct ov72
|
||||
@@ -1543,7 +1543,7 @@ static int ov7251_init_ctrls(struct ov72
|
||||
s64 pixel_rate;
|
||||
int hblank;
|
||||
|
||||
@ -22,7 +22,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
ov7251->ctrls.lock = &ov7251->lock;
|
||||
|
||||
v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
|
||||
@@ -1600,6 +1600,7 @@ static int ov7251_init_ctrls(struct ov72
|
||||
@@ -1602,6 +1602,7 @@ static int ov7251_init_ctrls(struct ov72
|
||||
|
||||
static int ov7251_probe(struct i2c_client *client)
|
||||
{
|
||||
@ -30,7 +30,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
struct device *dev = &client->dev;
|
||||
struct ov7251 *ov7251;
|
||||
unsigned int rate = 0, clk_rate = 0;
|
||||
@@ -1690,6 +1691,15 @@ static int ov7251_probe(struct i2c_clien
|
||||
@@ -1692,6 +1693,15 @@ static int ov7251_probe(struct i2c_clien
|
||||
goto destroy_mutex;
|
||||
}
|
||||
|
||||
|
@ -14,13 +14,13 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/media/i2c/ov7251.c
|
||||
+++ b/drivers/media/i2c/ov7251.c
|
||||
@@ -1676,7 +1676,8 @@ static int ov7251_probe(struct i2c_clien
|
||||
@@ -1678,7 +1678,8 @@ static int ov7251_probe(struct i2c_clien
|
||||
return PTR_ERR(ov7251->analog_regulator);
|
||||
}
|
||||
|
||||
- ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
|
||||
- ov7251->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
|
||||
+ ov7251->enable_gpio = devm_gpiod_get_optional(dev, "enable",
|
||||
+ GPIOD_OUT_HIGH);
|
||||
+ GPIOD_OUT_LOW);
|
||||
if (IS_ERR(ov7251->enable_gpio)) {
|
||||
dev_err(dev, "cannot get enable gpio\n");
|
||||
return PTR_ERR(ov7251->enable_gpio);
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/media/i2c/ov7251.c
|
||||
+++ b/drivers/media/i2c/ov7251.c
|
||||
@@ -1344,6 +1344,14 @@ static int ov7251_s_stream(struct v4l2_s
|
||||
@@ -1346,6 +1346,14 @@ static int ov7251_s_stream(struct v4l2_s
|
||||
if (ret < 0)
|
||||
goto err_power_down;
|
||||
|
||||
|
@ -62,7 +62,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
static const unsigned long supported_xclk_rates[] = {
|
||||
[OV7251_19_2_MHZ] = 19200000,
|
||||
[OV7251_24_MHZ] = 24000000,
|
||||
@@ -1372,6 +1384,23 @@ static int ov7251_s_stream(struct v4l2_s
|
||||
@@ -1374,6 +1386,23 @@ static int ov7251_s_stream(struct v4l2_s
|
||||
dev_err(ov7251->dev, "could not sync v4l2 controls\n");
|
||||
goto err_power_down;
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20106,6 +20106,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
@@ -20108,6 +20108,14 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx519.yaml
|
||||
F: drivers/media/i2c/imx519.c
|
||||
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/drivers/gpio/gpio-pca953x.c
|
||||
+++ b/drivers/gpio/gpio-pca953x.c
|
||||
@@ -1347,6 +1347,7 @@ static const struct of_device_id pca953x
|
||||
@@ -1311,6 +1311,7 @@ static const struct of_device_id pca953x
|
||||
{ .compatible = "ti,tca6424", .data = OF_953X(24, PCA_INT), },
|
||||
{ .compatible = "ti,tca9538", .data = OF_953X( 8, PCA_INT), },
|
||||
{ .compatible = "ti,tca9539", .data = OF_953X(16, PCA_INT), },
|
||||
|
@ -271,7 +271,7 @@ Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
|
||||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20111,7 +20111,7 @@ M: Raspberry Pi Kernel Maintenance <kern
|
||||
@@ -20113,7 +20113,7 @@ M: Raspberry Pi Kernel Maintenance <kern
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
@ -20,7 +20,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/net/bluetooth/hci_sync.c
|
||||
+++ b/net/bluetooth/hci_sync.c
|
||||
@@ -4872,6 +4872,7 @@ static const struct {
|
||||
@@ -4873,6 +4873,7 @@ static const struct {
|
||||
*/
|
||||
static int hci_dev_setup_sync(struct hci_dev *hdev)
|
||||
{
|
||||
@ -28,7 +28,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
int ret = 0;
|
||||
bool invalid_bdaddr;
|
||||
size_t i;
|
||||
@@ -4900,7 +4901,8 @@ static int hci_dev_setup_sync(struct hci
|
||||
@@ -4901,7 +4902,8 @@ static int hci_dev_setup_sync(struct hci
|
||||
test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
|
||||
if (!ret) {
|
||||
if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks) &&
|
||||
|
@ -291,7 +291,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
+ };
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20012,7 +20012,7 @@ M: Sakari Ailus <sakari.ailus@linux.inte
|
||||
@@ -20014,7 +20014,7 @@ M: Sakari Ailus <sakari.ailus@linux.inte
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
@ -257,31 +257,31 @@ Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
|
||||
+ v3d->gpu_queue_stats[V3D_BIN].last_exec_end = local_clock();
|
||||
|
||||
trace_v3d_bcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
@@ -110,6 +112,7 @@ v3d_irq(int irq, void *arg)
|
||||
|
||||
@@ -112,6 +114,7 @@ v3d_irq(int irq, void *arg)
|
||||
if (intsts & V3D_INT_FRDONE) {
|
||||
struct v3d_fence *fence =
|
||||
to_v3d_fence(v3d->render_job->base.irq_fence);
|
||||
+ v3d->gpu_queue_stats[V3D_RENDER].last_exec_end = local_clock();
|
||||
|
||||
trace_v3d_rcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
@@ -120,6 +123,7 @@ v3d_irq(int irq, void *arg)
|
||||
|
||||
@@ -124,6 +127,7 @@ v3d_irq(int irq, void *arg)
|
||||
if (intsts & V3D_INT_CSDDONE) {
|
||||
struct v3d_fence *fence =
|
||||
to_v3d_fence(v3d->csd_job->base.irq_fence);
|
||||
+ v3d->gpu_queue_stats[V3D_CSD].last_exec_end = local_clock();
|
||||
|
||||
trace_v3d_csd_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
@@ -157,6 +161,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
|
||||
@@ -163,6 +167,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
if (intsts & V3D_HUB_INT_TFUC) {
|
||||
struct v3d_fence *fence =
|
||||
to_v3d_fence(v3d->tfu_job->base.irq_fence);
|
||||
+ v3d->gpu_queue_stats[V3D_TFU].last_exec_end = local_clock();
|
||||
|
||||
trace_v3d_tfu_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
--- a/drivers/gpu/drm/v3d/v3d_sched.c
|
||||
+++ b/drivers/gpu/drm/v3d/v3d_sched.c
|
||||
@@ -19,6 +19,7 @@
|
||||
@ -423,7 +423,7 @@ Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
|
||||
v3d_switch_perfmon(v3d, &job->base);
|
||||
|
||||
/* XXX: Set the QCFG */
|
||||
@@ -190,6 +301,7 @@ v3d_tfu_job_run(struct drm_sched_job *sc
|
||||
@@ -194,6 +305,7 @@ v3d_tfu_job_run(struct drm_sched_job *sc
|
||||
|
||||
trace_v3d_submit_tfu(dev, to_v3d_fence(fence)->seqno);
|
||||
|
||||
@ -431,7 +431,7 @@ Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
|
||||
V3D_WRITE(V3D_TFU_IIA, job->args.iia);
|
||||
V3D_WRITE(V3D_TFU_IIS, job->args.iis);
|
||||
V3D_WRITE(V3D_TFU_ICA, job->args.ica);
|
||||
@@ -231,6 +343,7 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
||||
@@ -238,6 +350,7 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
||||
|
||||
trace_v3d_submit_csd(dev, to_v3d_fence(fence)->seqno);
|
||||
|
||||
@ -439,7 +439,7 @@ Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
|
||||
v3d_switch_perfmon(v3d, &job->base);
|
||||
|
||||
for (i = 1; i <= 6; i++)
|
||||
@@ -247,7 +360,10 @@ v3d_cache_clean_job_run(struct drm_sched
|
||||
@@ -254,7 +367,10 @@ v3d_cache_clean_job_run(struct drm_sched
|
||||
struct v3d_job *job = to_v3d_job(sched_job);
|
||||
struct v3d_dev *v3d = job->v3d;
|
||||
|
||||
@ -450,7 +450,7 @@ Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -385,8 +501,18 @@ v3d_sched_init(struct v3d_dev *v3d)
|
||||
@@ -392,8 +508,18 @@ v3d_sched_init(struct v3d_dev *v3d)
|
||||
int hw_jobs_limit = 1;
|
||||
int job_hang_limit = 0;
|
||||
int hang_limit_ms = 500;
|
||||
@ -469,7 +469,7 @@ Signed-off-by: Jose Maria Casanova Crespo <jmcasanova@igalia.com>
|
||||
ret = drm_sched_init(&v3d->queue[V3D_BIN].sched,
|
||||
&v3d_bin_sched_ops,
|
||||
hw_jobs_limit, job_hang_limit,
|
||||
@@ -440,9 +566,20 @@ void
|
||||
@@ -447,9 +573,20 @@ void
|
||||
v3d_sched_fini(struct v3d_dev *v3d)
|
||||
{
|
||||
enum v3d_queue q;
|
||||
|
@ -52,7 +52,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
erst_base = xhci_read_64(xhci, &ir->ir_set->erst_base);
|
||||
--- a/drivers/usb/host/xhci.h
|
||||
+++ b/drivers/usb/host/xhci.h
|
||||
@@ -1425,8 +1425,9 @@ struct urb_priv {
|
||||
@@ -1426,8 +1426,9 @@ struct urb_priv {
|
||||
* Each segment table entry is 4*32bits long. 1K seems like an ok size:
|
||||
* (1K bytes * 8bytes/bit) / (4*32 bits) = 64 segment entries in the table,
|
||||
* meaning 64 ring segments.
|
||||
|
@ -24,9 +24,9 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/host/xhci-pci.c
|
||||
+++ b/drivers/usb/host/xhci-pci.c
|
||||
@@ -483,6 +483,7 @@ static void xhci_pci_quirks(struct devic
|
||||
if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483) {
|
||||
@@ -486,6 +486,7 @@ static void xhci_pci_quirks(struct devic
|
||||
xhci->quirks |= XHCI_LPM_SUPPORT;
|
||||
xhci->quirks |= XHCI_TRB_OVERFETCH;
|
||||
xhci->quirks |= XHCI_EP_CTX_BROKEN_DCS;
|
||||
+ xhci->quirks |= XHCI_AVOID_DQ_ON_LINK;
|
||||
}
|
||||
@ -34,7 +34,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -728,6 +728,15 @@ static int xhci_move_dequeue_past_td(str
|
||||
@@ -730,6 +730,15 @@ static int xhci_move_dequeue_past_td(str
|
||||
} while (!cycle_found || !td_last_trb_found);
|
||||
|
||||
deq_found:
|
||||
@ -52,7 +52,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
addr = xhci_trb_virt_to_dma(new_seg, new_deq);
|
||||
--- a/drivers/usb/host/xhci.h
|
||||
+++ b/drivers/usb/host/xhci.h
|
||||
@@ -1663,6 +1663,9 @@ struct xhci_hcd {
|
||||
@@ -1664,6 +1664,9 @@ struct xhci_hcd {
|
||||
#define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48)
|
||||
#define XHCI_ETRON_HOST BIT_ULL(49)
|
||||
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 7713ce38e6a26425ace3a57b3d03ba0125c16f89 Mon Sep 17 00:00:00 2001
|
||||
From: Naushir Patuck <naush@raspberrypi.com>
|
||||
Date: Fri, 28 Jul 2023 12:00:40 +0100
|
||||
Subject: [PATCH 0487/1085] drivers: media: imx296: Add standby delay during
|
||||
probe
|
||||
|
||||
Add a 2-5ms delay when coming out of standby and before reading the
|
||||
sensor info register durning probe, as instructed by the datasheet. This
|
||||
standby delay is already present when the sensor starts streaming.
|
||||
|
||||
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
|
||||
---
|
||||
drivers/media/i2c/imx296.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/media/i2c/imx296.c
|
||||
+++ b/drivers/media/i2c/imx296.c
|
||||
@@ -940,6 +940,8 @@ static int imx296_identify_model(struct
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ usleep_range(2000, 5000);
|
||||
+
|
||||
ret = imx296_read(sensor, IMX296_SENSOR_INFO);
|
||||
if (ret < 0) {
|
||||
dev_err(sensor->dev, "failed to read sensor information (%d)\n",
|
@ -53,16 +53,16 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
help
|
||||
--- a/drivers/gpio/gpio-brcmstb.c
|
||||
+++ b/drivers/gpio/gpio-brcmstb.c
|
||||
@@ -639,6 +639,8 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -637,6 +637,8 @@ static int brcmstb_gpio_probe(struct pla
|
||||
#if defined(CONFIG_MIPS) && defined(__BIG_ENDIAN)
|
||||
flags = BGPIOF_BIG_ENDIAN_BYTE_ORDER;
|
||||
#endif
|
||||
+ if (of_property_read_bool(np, "brcm,gpio-direct"))
|
||||
+ flags |= BGPIOF_REG_DIRECT;
|
||||
|
||||
of_property_for_each_u32(np, "brcm,gpio-bank-widths", prop, p,
|
||||
bank_width) {
|
||||
@@ -688,7 +690,9 @@ static int brcmstb_gpio_probe(struct pla
|
||||
of_property_for_each_u32(np, "brcm,gpio-bank-widths", bank_width) {
|
||||
struct brcmstb_gpio_bank *bank;
|
||||
@@ -685,7 +687,9 @@ static int brcmstb_gpio_probe(struct pla
|
||||
}
|
||||
|
||||
gc->owner = THIS_MODULE;
|
||||
@ -73,7 +73,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
if (!gc->label) {
|
||||
err = -ENOMEM;
|
||||
goto fail;
|
||||
@@ -697,7 +701,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -694,7 +698,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
gc->of_gpio_n_cells = 2;
|
||||
gc->of_xlate = brcmstb_gpio_of_xlate;
|
||||
/* not all ngpio lines are valid, will use bank width later */
|
||||
@ -82,7 +82,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
gc->offset = bank->id * MAX_GPIO_PER_BANK;
|
||||
if (priv->parent_irq > 0)
|
||||
gc->to_irq = brcmstb_gpio_to_irq;
|
||||
@@ -706,8 +710,10 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -703,8 +707,10 @@ static int brcmstb_gpio_probe(struct pla
|
||||
* Mask all interrupts by default, since wakeup interrupts may
|
||||
* be retained from S5 cold boot
|
||||
*/
|
||||
|
@ -134,7 +134,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
struct napi_struct napi_tx;
|
||||
|
||||
dma_addr_t rx_ring_dma;
|
||||
@@ -1285,9 +1304,15 @@ struct macb {
|
||||
@@ -1287,9 +1306,15 @@ struct macb {
|
||||
|
||||
u32 caps;
|
||||
unsigned int dma_burst_length;
|
||||
@ -222,7 +222,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
wmb(); // ensure softirq can see update
|
||||
}
|
||||
|
||||
@@ -2402,6 +2425,11 @@ static netdev_tx_t macb_start_xmit(struc
|
||||
@@ -2404,6 +2427,11 @@ static netdev_tx_t macb_start_xmit(struc
|
||||
skb_tx_timestamp(skb);
|
||||
|
||||
spin_lock_irq(&bp->lock);
|
||||
@ -234,7 +234,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
|
||||
spin_unlock_irq(&bp->lock);
|
||||
|
||||
@@ -2776,6 +2804,37 @@ static void macb_configure_dma(struct ma
|
||||
@@ -2778,6 +2806,37 @@ static void macb_configure_dma(struct ma
|
||||
}
|
||||
}
|
||||
|
||||
@ -272,7 +272,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static void macb_init_hw(struct macb *bp)
|
||||
{
|
||||
u32 config;
|
||||
@@ -2804,6 +2863,11 @@ static void macb_init_hw(struct macb *bp
|
||||
@@ -2806,6 +2865,11 @@ static void macb_init_hw(struct macb *bp
|
||||
if (bp->caps & MACB_CAPS_JUMBO)
|
||||
bp->rx_frm_len_mask = MACB_RX_JFRMLEN_MASK;
|
||||
|
||||
@ -284,7 +284,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
macb_configure_dma(bp);
|
||||
|
||||
/* Enable RX partial store and forward and set watermark */
|
||||
@@ -3165,6 +3229,52 @@ static void gem_get_ethtool_strings(stru
|
||||
@@ -3170,6 +3234,52 @@ static void gem_get_ethtool_strings(stru
|
||||
}
|
||||
}
|
||||
|
||||
@ -337,7 +337,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static struct net_device_stats *macb_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct macb *bp = netdev_priv(dev);
|
||||
@@ -3757,6 +3867,8 @@ static const struct ethtool_ops macb_eth
|
||||
@@ -3764,6 +3874,8 @@ static const struct ethtool_ops macb_eth
|
||||
};
|
||||
|
||||
static const struct ethtool_ops gem_ethtool_ops = {
|
||||
@ -346,7 +346,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
.get_regs_len = macb_get_regs_len,
|
||||
.get_regs = macb_get_regs,
|
||||
.get_wol = macb_get_wol,
|
||||
@@ -3766,6 +3878,8 @@ static const struct ethtool_ops gem_etht
|
||||
@@ -3773,6 +3885,8 @@ static const struct ethtool_ops gem_etht
|
||||
.get_ethtool_stats = gem_get_ethtool_stats,
|
||||
.get_strings = gem_get_ethtool_strings,
|
||||
.get_sset_count = gem_get_sset_count,
|
||||
@ -355,7 +355,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
.get_link_ksettings = macb_get_link_ksettings,
|
||||
.set_link_ksettings = macb_set_link_ksettings,
|
||||
.get_ringparam = macb_get_ringparam,
|
||||
@@ -5062,6 +5176,11 @@ static int macb_probe(struct platform_de
|
||||
@@ -5069,6 +5183,11 @@ static int macb_probe(struct platform_de
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -365,9 +365,9 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
+ bp->use_aw2b_fill = device_property_read_bool(&pdev->dev, "cdns,use-aw2b-fill");
|
||||
+
|
||||
spin_lock_init(&bp->lock);
|
||||
spin_lock_init(&bp->stats_lock);
|
||||
|
||||
/* setup capabilities */
|
||||
@@ -5117,6 +5236,21 @@ static int macb_probe(struct platform_de
|
||||
@@ -5125,6 +5244,21 @@ static int macb_probe(struct platform_de
|
||||
else
|
||||
bp->phy_interface = interface;
|
||||
|
||||
@ -389,7 +389,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
/* IP specific init */
|
||||
err = init(pdev);
|
||||
if (err)
|
||||
@@ -5193,6 +5327,19 @@ static int macb_remove(struct platform_d
|
||||
@@ -5201,6 +5335,19 @@ static int macb_remove(struct platform_d
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -409,7 +409,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static int __maybe_unused macb_suspend(struct device *dev)
|
||||
{
|
||||
struct net_device *netdev = dev_get_drvdata(dev);
|
||||
@@ -5407,6 +5554,7 @@ static const struct dev_pm_ops macb_pm_o
|
||||
@@ -5415,6 +5562,7 @@ static const struct dev_pm_ops macb_pm_o
|
||||
static struct platform_driver macb_driver = {
|
||||
.probe = macb_probe,
|
||||
.remove = macb_remove,
|
||||
|
@ -831,7 +831,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1207,6 +1534,7 @@ static void brcm_pcie_enter_l23(struct b
|
||||
@@ -1208,6 +1535,7 @@ static void brcm_pcie_enter_l23(struct b
|
||||
|
||||
static int brcm_phy_cntl(struct brcm_pcie *pcie, const int start)
|
||||
{
|
||||
@ -839,7 +839,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static const u32 shifts[PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS] = {
|
||||
PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_SHIFT,
|
||||
PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_SHIFT,
|
||||
@@ -1239,6 +1567,9 @@ static int brcm_phy_cntl(struct brcm_pci
|
||||
@@ -1240,6 +1568,9 @@ static int brcm_phy_cntl(struct brcm_pci
|
||||
dev_err(pcie->dev, "failed to %s phy\n", (start ? "start" : "stop"));
|
||||
|
||||
return ret;
|
||||
@ -849,7 +849,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
}
|
||||
|
||||
static inline int brcm_phy_start(struct brcm_pcie *pcie)
|
||||
@@ -1271,6 +1602,12 @@ static void brcm_pcie_turn_off(struct br
|
||||
@@ -1272,6 +1603,12 @@ static void brcm_pcie_turn_off(struct br
|
||||
u32p_replace_bits(&tmp, 1, PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK);
|
||||
writel(tmp, base + PCIE_MISC_HARD_PCIE_HARD_DEBUG);
|
||||
|
||||
@ -862,7 +862,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
/* Shutdown PCIe bridge */
|
||||
pcie->bridge_sw_init_set(pcie, 1);
|
||||
}
|
||||
@@ -1301,9 +1638,9 @@ static int brcm_pcie_suspend_noirq(struc
|
||||
@@ -1302,9 +1639,9 @@ static int brcm_pcie_suspend_noirq(struc
|
||||
if (brcm_phy_stop(pcie))
|
||||
dev_err(dev, "Could not stop phy for suspend\n");
|
||||
|
||||
@ -874,7 +874,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1398,7 +1735,7 @@ err_regulator:
|
||||
@@ -1399,7 +1736,7 @@ err_regulator:
|
||||
if (pcie->sr)
|
||||
regulator_bulk_disable(pcie->sr->num_supplies, pcie->sr->supplies);
|
||||
err_reset:
|
||||
@ -883,7 +883,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
err_disable_clk:
|
||||
clk_disable_unprepare(pcie->clk);
|
||||
return ret;
|
||||
@@ -1410,8 +1747,8 @@ static void __brcm_pcie_remove(struct br
|
||||
@@ -1411,8 +1748,8 @@ static void __brcm_pcie_remove(struct br
|
||||
brcm_pcie_turn_off(pcie);
|
||||
if (brcm_phy_stop(pcie))
|
||||
dev_err(pcie->dev, "Could not stop phy\n");
|
||||
@ -894,7 +894,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
clk_disable_unprepare(pcie->clk);
|
||||
}
|
||||
|
||||
@@ -1429,12 +1766,16 @@ static const int pcie_offsets[] = {
|
||||
@@ -1430,12 +1767,16 @@ static const int pcie_offsets[] = {
|
||||
[RGR1_SW_INIT_1] = 0x9210,
|
||||
[EXT_CFG_INDEX] = 0x9000,
|
||||
[EXT_CFG_DATA] = 0x9004,
|
||||
@ -911,7 +911,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
};
|
||||
|
||||
static const struct pcie_cfg_data generic_cfg = {
|
||||
@@ -1442,6 +1783,7 @@ static const struct pcie_cfg_data generi
|
||||
@@ -1443,6 +1784,7 @@ static const struct pcie_cfg_data generi
|
||||
.type = GENERIC,
|
||||
.perst_set = brcm_pcie_perst_set_generic,
|
||||
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
|
||||
@ -919,7 +919,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
};
|
||||
|
||||
static const struct pcie_cfg_data bcm7425_cfg = {
|
||||
@@ -1449,6 +1791,7 @@ static const struct pcie_cfg_data bcm742
|
||||
@@ -1450,6 +1792,7 @@ static const struct pcie_cfg_data bcm742
|
||||
.type = BCM7425,
|
||||
.perst_set = brcm_pcie_perst_set_generic,
|
||||
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
|
||||
@ -927,7 +927,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
};
|
||||
|
||||
static const struct pcie_cfg_data bcm7435_cfg = {
|
||||
@@ -1463,12 +1806,15 @@ static const struct pcie_cfg_data bcm490
|
||||
@@ -1464,12 +1807,15 @@ static const struct pcie_cfg_data bcm490
|
||||
.type = BCM4908,
|
||||
.perst_set = brcm_pcie_perst_set_4908,
|
||||
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
|
||||
@ -943,7 +943,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
};
|
||||
|
||||
static const struct pcie_cfg_data bcm7278_cfg = {
|
||||
@@ -1476,6 +1822,7 @@ static const struct pcie_cfg_data bcm727
|
||||
@@ -1477,6 +1823,7 @@ static const struct pcie_cfg_data bcm727
|
||||
.type = BCM7278,
|
||||
.perst_set = brcm_pcie_perst_set_7278,
|
||||
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_7278,
|
||||
@ -951,7 +951,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
};
|
||||
|
||||
static const struct pcie_cfg_data bcm2711_cfg = {
|
||||
@@ -1483,10 +1830,27 @@ static const struct pcie_cfg_data bcm271
|
||||
@@ -1484,10 +1831,27 @@ static const struct pcie_cfg_data bcm271
|
||||
.type = BCM2711,
|
||||
.perst_set = brcm_pcie_perst_set_generic,
|
||||
.bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
|
||||
@ -979,7 +979,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
{ .compatible = "brcm,bcm4908-pcie", .data = &bcm4908_cfg },
|
||||
{ .compatible = "brcm,bcm7211-pcie", .data = &generic_cfg },
|
||||
{ .compatible = "brcm,bcm7278-pcie", .data = &bcm7278_cfg },
|
||||
@@ -1527,7 +1891,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
@@ -1528,7 +1892,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
|
||||
data = of_device_get_match_data(&pdev->dev);
|
||||
if (!data) {
|
||||
@ -988,7 +988,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1538,6 +1902,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
@@ -1539,6 +1903,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
pcie->type = data->type;
|
||||
pcie->perst_set = data->perst_set;
|
||||
pcie->bridge_sw_init_set = data->bridge_sw_init_set;
|
||||
@ -996,7 +996,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
pcie->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(pcie->base))
|
||||
@@ -1568,14 +1933,20 @@ static int brcm_pcie_probe(struct platfo
|
||||
@@ -1569,14 +1934,20 @@ static int brcm_pcie_probe(struct platfo
|
||||
clk_disable_unprepare(pcie->clk);
|
||||
return PTR_ERR(pcie->perst_reset);
|
||||
}
|
||||
@ -1019,41 +1019,47 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
clk_disable_unprepare(pcie->clk);
|
||||
return ret;
|
||||
}
|
||||
@@ -1598,6 +1969,33 @@ static int brcm_pcie_probe(struct platfo
|
||||
dev_err(pcie->dev, "probe of internal MSI failed");
|
||||
goto fail;
|
||||
}
|
||||
+ } else if (pci_msi_enabled() && msi_np != pcie->np) {
|
||||
+ /* Use RC_BAR1 for MIP access */
|
||||
+ u64 msi_pci_addr;
|
||||
+ u64 msi_phys_addr;
|
||||
+
|
||||
+ if (of_property_read_u64(msi_np, "brcm,msi-pci-addr", &msi_pci_addr)) {
|
||||
+ dev_err(pcie->dev, "Unable to find MSI PCI address\n");
|
||||
+ ret = -EINVAL;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ if (of_property_read_u64(msi_np, "reg", &msi_phys_addr)) {
|
||||
+ dev_err(pcie->dev, "Unable to find MSI physical address\n");
|
||||
+ ret = -EINVAL;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ writel(lower_32_bits(msi_pci_addr) | brcm_pcie_encode_ibar_size(0x1000),
|
||||
+ pcie->base + PCIE_MISC_RC_BAR1_CONFIG_LO);
|
||||
+ writel(upper_32_bits(msi_pci_addr),
|
||||
+ pcie->base + PCIE_MISC_RC_BAR1_CONFIG_HI);
|
||||
+
|
||||
+ writel(lower_32_bits(msi_phys_addr) |
|
||||
+ PCIE_MISC_UBUS_BAR1_CONFIG_REMAP_ACCESS_ENABLE_MASK,
|
||||
+ pcie->base + PCIE_MISC_UBUS_BAR1_CONFIG_REMAP);
|
||||
+ writel(upper_32_bits(msi_phys_addr),
|
||||
+ pcie->base + PCIE_MISC_UBUS_BAR1_CONFIG_REMAP_HI);
|
||||
}
|
||||
@@ -1595,8 +1966,38 @@ static int brcm_pcie_probe(struct platfo
|
||||
if (pci_msi_enabled()) {
|
||||
struct device_node *msi_np = of_parse_phandle(pcie->np, "msi-parent", 0);
|
||||
|
||||
bridge->ops = pcie->type == BCM7425 ? &brcm7425_pcie_ops : &brcm_pcie_ops;
|
||||
@@ -1614,6 +2012,8 @@ static int brcm_pcie_probe(struct platfo
|
||||
- if (msi_np == pcie->np)
|
||||
+ if (msi_np == pcie->np) {
|
||||
ret = brcm_pcie_enable_msi(pcie);
|
||||
+ } else {
|
||||
+ /* Use RC_BAR1 for MIP access */
|
||||
+ u64 msi_pci_addr;
|
||||
+ u64 msi_phys_addr;
|
||||
+
|
||||
+ if (of_property_read_u64(msi_np, "brcm,msi-pci-addr", &msi_pci_addr)) {
|
||||
+ dev_err(pcie->dev, "Unable to find MSI PCI address\n");
|
||||
+ ret = -EINVAL;
|
||||
+ of_node_put(msi_np);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ if (of_property_read_u64(msi_np, "reg", &msi_phys_addr)) {
|
||||
+ dev_err(pcie->dev, "Unable to find MSI physical address\n");
|
||||
+ ret = -EINVAL;
|
||||
+ of_node_put(msi_np);
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ writel(lower_32_bits(msi_pci_addr) | brcm_pcie_encode_ibar_size(0x1000),
|
||||
+ pcie->base + PCIE_MISC_RC_BAR1_CONFIG_LO);
|
||||
+ writel(upper_32_bits(msi_pci_addr),
|
||||
+ pcie->base + PCIE_MISC_RC_BAR1_CONFIG_HI);
|
||||
+
|
||||
+ writel(lower_32_bits(msi_phys_addr) |
|
||||
+ PCIE_MISC_UBUS_BAR1_CONFIG_REMAP_ACCESS_ENABLE_MASK,
|
||||
+ pcie->base + PCIE_MISC_UBUS_BAR1_CONFIG_REMAP);
|
||||
+ writel(upper_32_bits(msi_phys_addr),
|
||||
+ pcie->base + PCIE_MISC_UBUS_BAR1_CONFIG_REMAP_HI);
|
||||
+ }
|
||||
|
||||
of_node_put(msi_np);
|
||||
|
||||
@@ -1620,6 +2021,8 @@ static int brcm_pcie_probe(struct platfo
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -460,6 +460,40 @@ static int dw_i2s_set_tdm_slot(struct sn
|
||||
@@ -459,6 +459,40 @@ static int dw_i2s_set_tdm_slot(struct sn
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -51,7 +51,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
static int dw_i2s_dai_probe(struct snd_soc_dai *dai)
|
||||
{
|
||||
struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
|
||||
@@ -476,6 +510,7 @@ static const struct snd_soc_dai_ops dw_i
|
||||
@@ -475,6 +509,7 @@ static const struct snd_soc_dai_ops dw_i
|
||||
.trigger = dw_i2s_trigger,
|
||||
.set_fmt = dw_i2s_set_fmt,
|
||||
.set_tdm_slot = dw_i2s_set_tdm_slot,
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -248,7 +248,7 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -247,7 +247,7 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
{
|
||||
u32 ch_reg;
|
||||
struct i2s_clk_config_data *config = &dev->config;
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
i2s_disable_channels(dev, stream);
|
||||
|
||||
@@ -260,6 +260,7 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -259,6 +259,7 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
dev->fifo_th - 1);
|
||||
i2s_write_reg(dev->i2s_base, TER(ch_reg), TER_TXCHEN |
|
||||
dev->tdm_mask << TER_TXSLOT_SHIFT);
|
||||
@ -31,7 +31,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
} else {
|
||||
i2s_write_reg(dev->i2s_base, RCR(ch_reg),
|
||||
dev->xfer_resolution);
|
||||
@@ -267,9 +268,15 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -266,9 +267,15 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
dev->fifo_th - 1);
|
||||
i2s_write_reg(dev->i2s_base, RER(ch_reg), RER_RXCHEN |
|
||||
dev->tdm_mask << RER_RXSLOT_SHIFT);
|
||||
|
@ -22,7 +22,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc.h>
|
||||
@@ -208,15 +208,10 @@ static void i2s_start(struct dw_i2s_dev
|
||||
@@ -206,15 +206,10 @@ static void i2s_start(struct dw_i2s_dev
|
||||
i2s_write_reg(dev->i2s_base, CER, 1);
|
||||
}
|
||||
|
||||
@ -37,9 +37,9 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
- else
|
||||
- i2s_write_reg(dev->i2s_base, IRER, 0);
|
||||
|
||||
if (dev->use_pio || dev->is_jh7110)
|
||||
i2s_disable_irqs(dev, substream->stream, 8);
|
||||
@@ -225,23 +220,15 @@ static void i2s_stop(struct dw_i2s_dev *
|
||||
if (!(dev->use_pio || dev->is_jh7110))
|
||||
i2s_disable_dma(dev, substream->stream);
|
||||
@@ -224,23 +219,15 @@ static void i2s_stop(struct dw_i2s_dev *
|
||||
|
||||
if (!dev->active) {
|
||||
i2s_write_reg(dev->i2s_base, CER, 0);
|
||||
@ -67,7 +67,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
}
|
||||
|
||||
static void dw_i2s_config(struct dw_i2s_dev *dev, int stream)
|
||||
@@ -354,6 +341,62 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -353,6 +340,62 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
static int dw_i2s_prepare(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai)
|
||||
{
|
||||
@@ -381,9 +424,12 @@ static int dw_i2s_trigger(struct snd_pcm
|
||||
@@ -380,9 +423,12 @@ static int dw_i2s_trigger(struct snd_pcm
|
||||
i2s_start(dev, substream);
|
||||
break;
|
||||
|
||||
@ -144,7 +144,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
dev->active--;
|
||||
i2s_stop(dev, substream);
|
||||
break;
|
||||
@@ -512,6 +558,7 @@ static int dw_i2s_dai_probe(struct snd_s
|
||||
@@ -511,6 +557,7 @@ static int dw_i2s_dai_probe(struct snd_s
|
||||
static const struct snd_soc_dai_ops dw_i2s_dai_ops = {
|
||||
.probe = dw_i2s_dai_probe,
|
||||
.startup = dw_i2s_startup,
|
||||
|
@ -22,7 +22,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -271,23 +271,34 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -270,23 +270,34 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
{
|
||||
struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
|
||||
struct i2s_clk_config_data *config = &dev->config;
|
||||
@ -57,7 +57,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
dev->ccr = 0x10;
|
||||
dev->xfer_resolution = 0x05;
|
||||
break;
|
||||
@@ -519,24 +530,21 @@ static int dw_i2s_set_bclk_ratio(struct
|
||||
@@ -518,24 +529,21 @@ static int dw_i2s_set_bclk_ratio(struct
|
||||
struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
|
||||
struct i2s_clk_config_data *config = &dev->config;
|
||||
|
||||
|
@ -295,7 +295,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
|
||||
static irqreturn_t
|
||||
v3d_hub_irq(int irq, void *arg);
|
||||
@@ -120,7 +121,8 @@ v3d_irq(int irq, void *arg)
|
||||
@@ -124,7 +125,8 @@ v3d_irq(int irq, void *arg)
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -305,7 +305,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
struct v3d_fence *fence =
|
||||
to_v3d_fence(v3d->csd_job->base.irq_fence);
|
||||
v3d->gpu_queue_stats[V3D_CSD].last_exec_end = local_clock();
|
||||
@@ -134,7 +136,7 @@ v3d_irq(int irq, void *arg)
|
||||
@@ -140,7 +142,7 @@ v3d_irq(int irq, void *arg)
|
||||
/* We shouldn't be triggering these if we have GMP in
|
||||
* always-allowed mode.
|
||||
*/
|
||||
@ -314,7 +314,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
dev_err(v3d->drm.dev, "GMP violation\n");
|
||||
|
||||
/* V3D 4.2 wires the hub and core IRQs together, so if we &
|
||||
@@ -209,6 +211,11 @@ v3d_hub_irq(int irq, void *arg)
|
||||
@@ -217,6 +219,11 @@ v3d_hub_irq(int irq, void *arg)
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -326,7 +326,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -223,8 +230,8 @@ v3d_irq_init(struct v3d_dev *v3d)
|
||||
@@ -231,8 +238,8 @@ v3d_irq_init(struct v3d_dev *v3d)
|
||||
* for us.
|
||||
*/
|
||||
for (core = 0; core < v3d->cores; core++)
|
||||
@ -337,7 +337,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
|
||||
irq1 = platform_get_irq_optional(v3d_to_pdev(v3d), 1);
|
||||
if (irq1 == -EPROBE_DEFER)
|
||||
@@ -268,12 +275,12 @@ v3d_irq_enable(struct v3d_dev *v3d)
|
||||
@@ -276,12 +283,12 @@ v3d_irq_enable(struct v3d_dev *v3d)
|
||||
|
||||
/* Enable our set of interrupts, masking out any others. */
|
||||
for (core = 0; core < v3d->cores; core++) {
|
||||
@ -354,7 +354,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
}
|
||||
|
||||
void
|
||||
@@ -288,8 +295,8 @@ v3d_irq_disable(struct v3d_dev *v3d)
|
||||
@@ -296,8 +303,8 @@ v3d_irq_disable(struct v3d_dev *v3d)
|
||||
|
||||
/* Clear any pending interrupts we might have left. */
|
||||
for (core = 0; core < v3d->cores; core++)
|
||||
@ -600,7 +600,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
static struct dma_fence *
|
||||
v3d_tfu_job_run(struct drm_sched_job *sched_job)
|
||||
{
|
||||
@@ -302,20 +304,22 @@ v3d_tfu_job_run(struct drm_sched_job *sc
|
||||
@@ -306,20 +308,22 @@ v3d_tfu_job_run(struct drm_sched_job *sc
|
||||
trace_v3d_submit_tfu(dev, to_v3d_fence(fence)->seqno);
|
||||
|
||||
v3d_sched_stats_add_job(&v3d->gpu_queue_stats[V3D_TFU], sched_job);
|
||||
@ -635,16 +635,16 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
|
||||
return fence;
|
||||
}
|
||||
@@ -327,7 +331,7 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
||||
@@ -331,7 +335,7 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
||||
struct v3d_dev *v3d = job->base.v3d;
|
||||
struct drm_device *dev = &v3d->drm;
|
||||
struct dma_fence *fence;
|
||||
- int i;
|
||||
+ int i, csd_cfg0_reg, csd_cfg_reg_count;
|
||||
|
||||
v3d->csd_job = job;
|
||||
|
||||
@@ -346,10 +350,12 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
||||
if (unlikely(job->base.base.s_fence->finished.error))
|
||||
return NULL;
|
||||
@@ -353,10 +357,12 @@ v3d_csd_job_run(struct drm_sched_job *sc
|
||||
v3d_sched_stats_add_job(&v3d->gpu_queue_stats[V3D_CSD], sched_job);
|
||||
v3d_switch_perfmon(v3d, &job->base);
|
||||
|
||||
@ -660,7 +660,7 @@ v2: fix kernel panic with debug-fs interface to list registers
|
||||
|
||||
return fence;
|
||||
}
|
||||
@@ -452,7 +458,8 @@ v3d_csd_job_timedout(struct drm_sched_jo
|
||||
@@ -459,7 +465,8 @@ v3d_csd_job_timedout(struct drm_sched_jo
|
||||
{
|
||||
struct v3d_csd_job *job = to_csd_job(sched_job);
|
||||
struct v3d_dev *v3d = job->base.v3d;
|
||||
|
@ -22,7 +22,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
drivers/gpu/drm/vc4/vc4_drv.h | 7 ++-
|
||||
drivers/gpu/drm/vc4/vc4_gem.c | 24 +++++------
|
||||
drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +-
|
||||
drivers/gpu/drm/vc4/vc4_hvs.c | 50 ++++++++++++----------
|
||||
drivers/gpu/drm/vc4/vc4_hvs.c | 52 ++++++++++++----------
|
||||
drivers/gpu/drm/vc4/vc4_irq.c | 10 ++---
|
||||
drivers/gpu/drm/vc4/vc4_kms.c | 14 +++---
|
||||
drivers/gpu/drm/vc4/vc4_perfmon.c | 20 ++++-----
|
||||
@ -31,7 +31,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
drivers/gpu/drm/vc4/vc4_v3d.c | 10 ++---
|
||||
drivers/gpu/drm/vc4/vc4_validate.c | 8 ++--
|
||||
drivers/gpu/drm/vc4/vc4_validate_shaders.c | 2 +-
|
||||
16 files changed, 126 insertions(+), 111 deletions(-)
|
||||
16 files changed, 127 insertions(+), 112 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/vc4/tests/vc4_mock.c
|
||||
+++ b/drivers/gpu/drm/vc4/tests/vc4_mock.c
|
||||
@ -481,6 +481,15 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) |
|
||||
--- a/drivers/gpu/drm/vc4/vc4_hvs.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_hvs.c
|
||||
@@ -303,7 +303,7 @@ static void vc4_hvs_lut_load(struct vc4_
|
||||
if (!drm_dev_enter(drm, &idx))
|
||||
return;
|
||||
|
||||
- if (hvs->vc4->is_vc5)
|
||||
+ if (hvs->vc4->gen == VC4_GEN_5)
|
||||
return;
|
||||
|
||||
/* The LUT memory is laid out with each HVS channel in order,
|
||||
@@ -421,7 +421,7 @@ static void vc4_hvs_irq_enable_eof(const
|
||||
unsigned int channel)
|
||||
{
|
||||
|
@ -61,8 +61,8 @@ Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
|
||||
if (offset >= gc->ngpio || offset < 0)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -598,8 +598,8 @@ static int brcmstb_gpio_probe(struct pla
|
||||
const __be32 *p;
|
||||
@@ -596,8 +596,8 @@ static int brcmstb_gpio_probe(struct pla
|
||||
struct resource *res;
|
||||
u32 bank_width;
|
||||
int num_banks = 0;
|
||||
+ int num_gpios = 0;
|
||||
@ -71,7 +71,7 @@ Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
|
||||
unsigned long flags = 0;
|
||||
bool need_wakeup_event = false;
|
||||
|
||||
@@ -613,7 +613,6 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -611,7 +611,6 @@ static int brcmstb_gpio_probe(struct pla
|
||||
if (IS_ERR(reg_base))
|
||||
return PTR_ERR(reg_base);
|
||||
|
||||
@ -79,7 +79,7 @@ Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
|
||||
priv->reg_base = reg_base;
|
||||
priv->pdev = pdev;
|
||||
|
||||
@@ -655,7 +654,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -652,7 +651,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
dev_dbg(dev, "Width 0 found: Empty bank @ %d\n",
|
||||
num_banks);
|
||||
num_banks++;
|
||||
@ -88,7 +88,7 @@ Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -697,7 +696,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -694,7 +693,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
err = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
@ -97,7 +97,7 @@ Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
|
||||
gc->of_gpio_n_cells = 2;
|
||||
gc->of_xlate = brcmstb_gpio_of_xlate;
|
||||
/* not all ngpio lines are valid, will use bank width later */
|
||||
@@ -721,7 +720,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -718,7 +717,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
bank->id);
|
||||
goto fail;
|
||||
}
|
||||
@ -106,7 +106,7 @@ Fixes: 3b0213d56eb7 ("gpio: Add GPIO support for Broadcom STB SoCs")
|
||||
|
||||
dev_dbg(dev, "bank=%d, base=%d, ngpio=%d, width=%d\n", bank->id,
|
||||
gc->base, gc->ngpio, bank->width);
|
||||
@@ -732,7 +731,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
@@ -729,7 +728,7 @@ static int brcmstb_gpio_probe(struct pla
|
||||
num_banks++;
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/gpu/drm/drm_fb_helper.c
|
||||
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
||||
@@ -1851,7 +1851,7 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
@@ -1853,7 +1853,7 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
struct fb_info *info;
|
||||
unsigned int width, height;
|
||||
@ -24,7 +24,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
width = dev->mode_config.max_width;
|
||||
height = dev->mode_config.max_height;
|
||||
@@ -1879,6 +1879,15 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
@@ -1881,6 +1881,15 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
* register the fbdev emulation instance in kernel_fb_helper_list. */
|
||||
mutex_unlock(&fb_helper->lock);
|
||||
|
||||
|
@ -12,7 +12,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/gpu/drm/drm_fb_helper.c
|
||||
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
||||
@@ -1879,11 +1879,11 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
@@ -1881,11 +1881,11 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
* register the fbdev emulation instance in kernel_fb_helper_list. */
|
||||
mutex_unlock(&fb_helper->lock);
|
||||
|
||||
|
@ -45,7 +45,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
writel(tmp, base + PCIE_MISC_MISC_CTRL);
|
||||
|
||||
brcm_pcie_set_tc_qos(pcie);
|
||||
@@ -1917,6 +1918,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
@@ -1918,6 +1919,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
|
||||
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
|
||||
pcie->l1ss = of_property_read_bool(np, "brcm,enable-l1ss");
|
||||
|
@ -61,7 +61,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
/*
|
||||
* Wait for 100ms after PERST# deassertion; see PCIe CEM specification
|
||||
@@ -1919,6 +1940,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
@@ -1920,6 +1941,7 @@ static int brcm_pcie_probe(struct platfo
|
||||
pcie->ssc = of_property_read_bool(np, "brcm,enable-ssc");
|
||||
pcie->l1ss = of_property_read_bool(np, "brcm,enable-l1ss");
|
||||
pcie->rcb_mps_mode = of_property_read_bool(np, "brcm,enable-mps-rcb");
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -528,11 +528,8 @@ static int dw_i2s_set_bclk_ratio(struct
|
||||
@@ -527,11 +527,8 @@ static int dw_i2s_set_bclk_ratio(struct
|
||||
unsigned int ratio)
|
||||
{
|
||||
struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(cpu_dai);
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/media/i2c/ov7251.c
|
||||
+++ b/drivers/media/i2c/ov7251.c
|
||||
@@ -1063,7 +1063,7 @@ static int ov7251_s_ctrl(struct v4l2_ctr
|
||||
@@ -1065,7 +1065,7 @@ static int ov7251_s_ctrl(struct v4l2_ctr
|
||||
case V4L2_CID_EXPOSURE:
|
||||
ret = ov7251_set_exposure(ov7251, ctrl->val);
|
||||
break;
|
||||
@ -27,7 +27,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
ret = ov7251_set_gain(ov7251, ctrl->val);
|
||||
break;
|
||||
case V4L2_CID_TEST_PATTERN:
|
||||
@@ -1588,7 +1588,7 @@ static int ov7251_init_ctrls(struct ov72
|
||||
@@ -1590,7 +1590,7 @@ static int ov7251_init_ctrls(struct ov72
|
||||
ov7251->exposure = v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
|
||||
V4L2_CID_EXPOSURE, 1, 32, 1, 32);
|
||||
ov7251->gain = v4l2_ctrl_new_std(&ov7251->ctrls, &ov7251_ctrl_ops,
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -796,7 +796,7 @@ static int dw_configure_dai_by_dt(struct
|
||||
@@ -795,7 +795,7 @@ static int dw_configure_dai_by_dt(struct
|
||||
u32 idx2;
|
||||
int ret;
|
||||
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -235,10 +235,17 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -234,10 +234,17 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
{
|
||||
u32 ch_reg;
|
||||
struct i2s_clk_config_data *config = &dev->config;
|
||||
@ -34,7 +34,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
for (ch_reg = 0; ch_reg < (config->chan_nr / 2); ch_reg++) {
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
i2s_write_reg(dev->i2s_base, TCR(ch_reg),
|
||||
@@ -258,10 +265,6 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -257,10 +264,6 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
dmacr |= (DMACR_DMAEN_RXCH0 << ch_reg);
|
||||
}
|
||||
}
|
||||
@ -45,7 +45,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
i2s_write_reg(dev->i2s_base, I2S_DMACR, dmacr);
|
||||
}
|
||||
@@ -370,10 +373,13 @@ static int dw_i2s_startup(struct snd_pcm
|
||||
@@ -369,10 +372,13 @@ static int dw_i2s_startup(struct snd_pcm
|
||||
|
||||
dw_i2s_config(dev, substream->stream);
|
||||
dmacr = i2s_read_reg(dev->i2s_base, I2S_DMACR);
|
||||
|
@ -67,7 +67,7 @@ Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
|
||||
+...
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -18619,6 +18619,13 @@ S: Supported
|
||||
@@ -18621,6 +18621,13 @@ S: Supported
|
||||
F: drivers/iio/light/rohm-bu27008.c
|
||||
F: drivers/iio/light/rohm-bu27034.c
|
||||
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -15871,6 +15871,14 @@ S: Maintained
|
||||
@@ -15873,6 +15873,14 @@ S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/i2c/ov5695.c
|
||||
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -314,6 +314,25 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -313,6 +313,25 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
if (dev->tdm_slots)
|
||||
config->data_width = 32;
|
||||
|
||||
@ -44,7 +44,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
config->chan_nr = params_channels(params);
|
||||
|
||||
switch (config->chan_nr) {
|
||||
@@ -537,23 +556,7 @@ static int dw_i2s_set_bclk_ratio(struct
|
||||
@@ -536,23 +555,7 @@ static int dw_i2s_set_bclk_ratio(struct
|
||||
|
||||
dev_dbg(dev->dev, "%s(%d)\n", __func__, ratio);
|
||||
|
||||
@ -69,7 +69,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1068,6 +1071,7 @@ static int dw_i2s_probe(struct platform_
|
||||
@@ -1067,6 +1070,7 @@ static int dw_i2s_probe(struct platform_
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/dwc3/core.c
|
||||
+++ b/drivers/usb/dwc3/core.c
|
||||
@@ -1372,6 +1372,9 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
@@ -1367,6 +1367,9 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
if (dwc->parkmode_disable_hs_quirk)
|
||||
reg |= DWC3_GUCTL1_PARKMODE_DISABLE_HS;
|
||||
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
if (DWC3_VER_IS_WITHIN(DWC3, 290A, ANY) &&
|
||||
(dwc->maximum_speed == USB_SPEED_HIGH ||
|
||||
dwc->maximum_speed == USB_SPEED_FULL))
|
||||
@@ -1670,6 +1673,8 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1634,6 +1637,8 @@ static void dwc3_get_properties(struct d
|
||||
"snps,parkmode-disable-ss-quirk");
|
||||
dwc->parkmode_disable_hs_quirk = device_property_read_bool(dev,
|
||||
"snps,parkmode-disable-hs-quirk");
|
||||
@ -37,7 +37,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/dwc3/core.h
|
||||
+++ b/drivers/usb/dwc3/core.h
|
||||
@@ -271,6 +271,7 @@
|
||||
@@ -268,6 +268,7 @@
|
||||
#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24)
|
||||
#define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17)
|
||||
#define DWC3_GUCTL1_PARKMODE_DISABLE_HS BIT(16)
|
||||
@ -45,7 +45,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
#define DWC3_GUCTL1_RESUME_OPMODE_HS_HOST BIT(10)
|
||||
|
||||
/* Global Status Register */
|
||||
@@ -1117,10 +1118,12 @@ struct dwc3_scratchpad_array {
|
||||
@@ -1118,10 +1119,12 @@ struct dwc3_scratchpad_array {
|
||||
* generation after resume from suspend.
|
||||
* @ulpi_ext_vbus_drv: Set to confiure the upli chip to drives CPEN pin
|
||||
* VBUS with an external supply.
|
||||
|
@ -21,7 +21,7 @@ Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>
|
||||
|
||||
--- a/drivers/gpu/drm/drm_connector.c
|
||||
+++ b/drivers/gpu/drm/drm_connector.c
|
||||
@@ -1049,6 +1049,7 @@ static const struct drm_prop_enum_list d
|
||||
@@ -1050,6 +1050,7 @@ static const struct drm_prop_enum_list d
|
||||
{ DRM_MODE_TV_MODE_PAL_M, "PAL-M" },
|
||||
{ DRM_MODE_TV_MODE_PAL_N, "PAL-N" },
|
||||
{ DRM_MODE_TV_MODE_SECAM, "SECAM" },
|
||||
@ -29,7 +29,7 @@ Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>
|
||||
};
|
||||
DRM_ENUM_NAME_FN(drm_get_tv_mode_name, drm_tv_mode_enum_list)
|
||||
|
||||
@@ -1735,6 +1736,12 @@ EXPORT_SYMBOL(drm_connector_attach_dp_su
|
||||
@@ -1740,6 +1741,12 @@ EXPORT_SYMBOL(drm_connector_attach_dp_su
|
||||
* TV Mode is CCIR System B (aka 625-lines) together with
|
||||
* the SECAM Color Encoding.
|
||||
*
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -288,21 +288,18 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -287,21 +287,18 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
config->data_width = 16;
|
||||
dma_data->dt.addr_width = 2;
|
||||
@ -35,7 +35,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
dev->xfer_resolution = 0x05;
|
||||
break;
|
||||
|
||||
@@ -314,25 +311,6 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -313,25 +310,6 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
if (dev->tdm_slots)
|
||||
config->data_width = 32;
|
||||
|
||||
@ -61,7 +61,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
config->chan_nr = params_channels(params);
|
||||
|
||||
switch (config->chan_nr) {
|
||||
@@ -348,11 +326,31 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -347,11 +325,31 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
|
||||
dw_i2s_config(dev, substream->stream);
|
||||
|
||||
@ -95,7 +95,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
if (dev->i2s_clk_cfg) {
|
||||
ret = dev->i2s_clk_cfg(config);
|
||||
if (ret < 0) {
|
||||
@@ -360,8 +358,7 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -359,8 +357,7 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
@ -105,7 +105,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
ret = clk_set_rate(dev->clk, bitclk);
|
||||
if (ret) {
|
||||
@@ -370,6 +367,8 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -369,6 +366,8 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -320,7 +320,7 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
@@ -319,7 +319,7 @@ static int dw_i2s_hw_params(struct snd_p
|
||||
case TWO_CHANNEL_SUPPORT:
|
||||
break;
|
||||
default:
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -708,7 +708,7 @@ static int dw_configure_dai(struct dw_i2
|
||||
@@ -707,7 +707,7 @@ static int dw_configure_dai(struct dw_i2
|
||||
idx = 1;
|
||||
dw_i2s_dai->playback.channels_min = MIN_CHANNEL_NUM;
|
||||
dw_i2s_dai->playback.channels_max =
|
||||
@ -35,7 +35,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
dw_i2s_dai->playback.formats = formats[idx];
|
||||
dw_i2s_dai->playback.rates = rates;
|
||||
}
|
||||
@@ -722,7 +722,7 @@ static int dw_configure_dai(struct dw_i2
|
||||
@@ -721,7 +721,7 @@ static int dw_configure_dai(struct dw_i2
|
||||
idx = 1;
|
||||
dw_i2s_dai->capture.channels_min = MIN_CHANNEL_NUM;
|
||||
dw_i2s_dai->capture.channels_max =
|
||||
|
@ -22,7 +22,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/gpu/drm/drm_connector.c
|
||||
+++ b/drivers/gpu/drm/drm_connector.c
|
||||
@@ -2697,10 +2697,15 @@ int drm_connector_set_orientation_from_p
|
||||
@@ -2702,10 +2702,15 @@ int drm_connector_set_orientation_from_p
|
||||
{
|
||||
enum drm_panel_orientation orientation;
|
||||
|
||||
|
@ -48,7 +48,7 @@ Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
|
||||
drivers cannot. If you rely on getting the inactive state, use .duty_cycle=0,
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -17437,7 +17437,7 @@ F: drivers/video/backlight/pwm_bl.c
|
||||
@@ -17439,7 +17439,7 @@ F: drivers/video/backlight/pwm_bl.c
|
||||
F: include/dt-bindings/pwm/
|
||||
F: include/linux/pwm.h
|
||||
F: include/linux/pwm_backlight.h
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -18032,6 +18032,13 @@ L: linux-wireless@vger.kernel.org
|
||||
@@ -18034,6 +18034,13 @@ L: linux-wireless@vger.kernel.org
|
||||
S: Orphan
|
||||
F: drivers/net/wireless/legacy/ray*
|
||||
|
||||
|
@ -87,7 +87,7 @@ Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
|
||||
+ };
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -18037,6 +18037,7 @@ M: Jacopo Mondi <jacopo.mondi@ideasonboa
|
||||
@@ -18039,6 +18039,7 @@ M: Jacopo Mondi <jacopo.mondi@ideasonboa
|
||||
L: Raspberry Pi Kernel Maintenance <kernel-list@raspberrypi.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
|
@ -94,7 +94,7 @@ Signed-off-by: Richard Oliver <richard.oliver@raspberrypi.com>
|
||||
+
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -18027,6 +18027,11 @@ F: drivers/ras/
|
||||
@@ -18029,6 +18029,11 @@ F: drivers/ras/
|
||||
F: include/linux/ras.h
|
||||
F: include/ras/ras_event.h
|
||||
|
||||
|
@ -25,7 +25,7 @@ Signed-off-by: Richard Oliver <richard.oliver@raspberrypi.com>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -18031,6 +18031,7 @@ RASPBERRY PI RP2040 GPIO BRIDGE DRIVER
|
||||
@@ -18033,6 +18033,7 @@ RASPBERRY PI RP2040 GPIO BRIDGE DRIVER
|
||||
M: Raspberry Pi Kernel Maintenance <kernel-list@raspberrypi.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/spi/raspberrypi,rp2040-gpio-bridge.yaml
|
||||
@ -56,7 +56,7 @@ Signed-off-by: Richard Oliver <richard.oliver@raspberrypi.com>
|
||||
depends on RENESAS_RPCIF
|
||||
--- a/drivers/spi/Makefile
|
||||
+++ b/drivers/spi/Makefile
|
||||
@@ -115,6 +115,7 @@ obj-$(CONFIG_SPI_ROCKCHIP) += spi-rockc
|
||||
@@ -116,6 +116,7 @@ obj-$(CONFIG_SPI_ROCKCHIP) += spi-rockc
|
||||
obj-$(CONFIG_SPI_ROCKCHIP_SFC) += spi-rockchip-sfc.o
|
||||
obj-$(CONFIG_SPI_RB4XX) += spi-rb4xx.o
|
||||
obj-$(CONFIG_MACH_REALTEK_RTL) += spi-realtek-rtl.o
|
||||
|
@ -22,7 +22,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/sound/soc/dwc/dwc-i2s.c
|
||||
+++ b/sound/soc/dwc/dwc-i2s.c
|
||||
@@ -236,6 +236,8 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -235,6 +235,8 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
u32 ch_reg;
|
||||
struct i2s_clk_config_data *config = &dev->config;
|
||||
u32 dmacr;
|
||||
@ -31,7 +31,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
i2s_disable_channels(dev, stream);
|
||||
|
||||
@@ -251,7 +253,7 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
@@ -250,7 +252,7 @@ static void dw_i2s_config(struct dw_i2s_
|
||||
i2s_write_reg(dev->i2s_base, TCR(ch_reg),
|
||||
dev->xfer_resolution);
|
||||
i2s_write_reg(dev->i2s_base, TFCR(ch_reg),
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
i2s_write_reg(dev->i2s_base, TER(ch_reg), TER_TXCHEN |
|
||||
dev->tdm_mask << TER_TXSLOT_SHIFT);
|
||||
dmacr |= (DMACR_DMAEN_TXCH0 << ch_reg);
|
||||
@@ -783,8 +785,8 @@ static int dw_configure_dai_by_pd(struct
|
||||
@@ -782,8 +784,8 @@ static int dw_configure_dai_by_pd(struct
|
||||
dev->capture_dma_data.pd.data = pdata->capture_dma_data;
|
||||
dev->play_dma_data.pd.addr = res->start + I2S_TXDMA;
|
||||
dev->capture_dma_data.pd.addr = res->start + I2S_RXDMA;
|
||||
@ -51,7 +51,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
dev->play_dma_data.pd.addr_width = bus_widths[idx];
|
||||
dev->capture_dma_data.pd.addr_width = bus_widths[idx];
|
||||
dev->play_dma_data.pd.filter = pdata->filter;
|
||||
@@ -815,7 +817,10 @@ static int dw_configure_dai_by_dt(struct
|
||||
@@ -814,7 +816,10 @@ static int dw_configure_dai_by_dt(struct
|
||||
dev->play_dma_data.dt.addr = res->start + I2S_TXDMA;
|
||||
dev->play_dma_data.dt.fifo_size = fifo_depth *
|
||||
(fifo_width[idx2]) >> 8;
|
||||
@ -63,7 +63,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
}
|
||||
if (COMP1_RX_ENABLED(comp1)) {
|
||||
idx2 = COMP2_RX_WORDSIZE_0(comp2);
|
||||
@@ -824,9 +829,14 @@ static int dw_configure_dai_by_dt(struct
|
||||
@@ -823,9 +828,14 @@ static int dw_configure_dai_by_dt(struct
|
||||
dev->capture_dma_data.dt.addr = res->start + I2S_RXDMA;
|
||||
dev->capture_dma_data.dt.fifo_size = fifo_depth *
|
||||
(fifo_width[idx2] >> 8);
|
||||
@ -79,7 +79,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
return 0;
|
||||
|
||||
}
|
||||
@@ -1070,6 +1080,7 @@ static int dw_i2s_probe(struct platform_
|
||||
@@ -1069,6 +1079,7 @@ static int dw_i2s_probe(struct platform_
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/net/bluetooth/hci_sync.c
|
||||
+++ b/net/bluetooth/hci_sync.c
|
||||
@@ -4872,7 +4872,8 @@ static const struct {
|
||||
@@ -4873,7 +4873,8 @@ static const struct {
|
||||
*/
|
||||
static int hci_dev_setup_sync(struct hci_dev *hdev)
|
||||
{
|
||||
|
@ -150,7 +150,7 @@ Signed-off-by: Richard Oliver <richard.oliver@raspberrypi.com>
|
||||
+
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20127,6 +20127,13 @@ F: Documentation/devicetree/bindings/med
|
||||
@@ -20129,6 +20129,13 @@ F: Documentation/devicetree/bindings/med
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx477.yaml
|
||||
F: drivers/media/i2c/imx477.c
|
||||
|
||||
|
@ -21,7 +21,7 @@ Signed-off-by: Richard Oliver <richard.oliver@raspberrypi.com>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -20133,6 +20133,7 @@ L: linux-media@vger.kernel.org
|
||||
@@ -20135,6 +20135,7 @@ L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/i2c/sony,imx500.yaml
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/mm/vmscan.c
|
||||
+++ b/mm/vmscan.c
|
||||
@@ -4716,7 +4716,7 @@ void lru_gen_look_around(struct page_vma
|
||||
@@ -4723,7 +4723,7 @@ void lru_gen_look_around(struct page_vma
|
||||
if (!folio)
|
||||
continue;
|
||||
|
||||
|
@ -148,7 +148,7 @@ Signed-off-by: Maíra Canal <mcanal@igalia.com>
|
||||
|
||||
--- a/kernel/cgroup/cgroup.c
|
||||
+++ b/kernel/cgroup/cgroup.c
|
||||
@@ -6063,9 +6063,6 @@ int __init cgroup_init_early(void)
|
||||
@@ -6059,9 +6059,6 @@ int __init cgroup_init_early(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -158,7 +158,7 @@ Signed-off-by: Maíra Canal <mcanal@igalia.com>
|
||||
/**
|
||||
* cgroup_init - cgroup initialization
|
||||
*
|
||||
@@ -6099,12 +6096,6 @@ int __init cgroup_init(void)
|
||||
@@ -6095,12 +6092,6 @@ int __init cgroup_init(void)
|
||||
|
||||
cgroup_unlock();
|
||||
|
||||
@ -171,7 +171,7 @@ Signed-off-by: Maíra Canal <mcanal@igalia.com>
|
||||
for_each_subsys(ss, ssid) {
|
||||
if (ss->early_init) {
|
||||
struct cgroup_subsys_state *css =
|
||||
@@ -6745,10 +6736,6 @@ static int __init cgroup_disable(char *s
|
||||
@@ -6749,10 +6740,6 @@ static int __init cgroup_disable(char *s
|
||||
strcmp(token, ss->legacy_name))
|
||||
continue;
|
||||
|
||||
@ -182,7 +182,7 @@ Signed-off-by: Maíra Canal <mcanal@igalia.com>
|
||||
static_branch_disable(cgroup_subsys_enabled_key[i]);
|
||||
pr_info("Disabling %s control group subsystem\n",
|
||||
ss->name);
|
||||
@@ -6782,7 +6769,7 @@ static int __init cgroup_enable(char *st
|
||||
@@ -6786,7 +6773,7 @@ static int __init cgroup_enable(char *st
|
||||
strcmp(token, ss->legacy_name))
|
||||
continue;
|
||||
|
||||
|
@ -0,0 +1,141 @@
|
||||
From 25e6acfe00f589a5989ebd2c8d21a130fb3bf106 Mon Sep 17 00:00:00 2001
|
||||
From: Naushir Patuck <naush@raspberrypi.com>
|
||||
Date: Fri, 18 Oct 2024 09:18:10 +0100
|
||||
Subject: [PATCH] drivers: media: bcm2835_isp: Cache LS table dmabuf
|
||||
|
||||
Clients such as libcamera do not change the LS table dmabuf on every
|
||||
frame. In such cases instead of mapping/remapping the same dmabuf on
|
||||
every frame to send to the firmware, cache the dmabuf once and only
|
||||
update and remap if the dmabuf has been changed by the userland client.
|
||||
|
||||
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
|
||||
---
|
||||
.../bcm2835-isp/bcm2835-v4l2-isp.c | 77 +++++++++++--------
|
||||
1 file changed, 46 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
|
||||
+++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
|
||||
@@ -139,6 +139,8 @@ struct bcm2835_isp_dev {
|
||||
/* Image pipeline controls. */
|
||||
int r_gain;
|
||||
int b_gain;
|
||||
+ struct dma_buf *last_ls_dmabuf;
|
||||
+ struct mmal_parameter_lens_shading_v2 ls;
|
||||
};
|
||||
|
||||
struct bcm2835_isp_buffer {
|
||||
@@ -657,18 +659,18 @@ static void bcm2835_isp_node_stop_stream
|
||||
atomic_dec(&dev->num_streaming);
|
||||
/* If all ports disabled, then disable the component */
|
||||
if (atomic_read(&dev->num_streaming) == 0) {
|
||||
- struct bcm2835_isp_lens_shading ls;
|
||||
/*
|
||||
* The ISP component on the firmware has a reference to the
|
||||
* dmabuf handle for the lens shading table. Pass a null handle
|
||||
* to remove that reference now.
|
||||
*/
|
||||
- memset(&ls, 0, sizeof(ls));
|
||||
+ memset(&dev->ls, 0, sizeof(dev->ls));
|
||||
/* Must set a valid grid size for the FW */
|
||||
- ls.grid_cell_size = 16;
|
||||
+ dev->ls.grid_cell_size = 16;
|
||||
set_isp_param(&dev->node[0],
|
||||
MMAL_PARAMETER_LENS_SHADING_OVERRIDE,
|
||||
- &ls, sizeof(ls));
|
||||
+ &dev->ls, sizeof(dev->ls));
|
||||
+ dev->last_ls_dmabuf = NULL;
|
||||
|
||||
ret = vchiq_mmal_component_disable(dev->mmal_instance,
|
||||
dev->component);
|
||||
@@ -719,6 +721,36 @@ static inline unsigned int get_sizeimage
|
||||
return (bpl * height * fmt->size_multiplier_x2) >> 1;
|
||||
}
|
||||
|
||||
+static int map_ls_table(struct bcm2835_isp_dev *dev, struct dma_buf *dmabuf,
|
||||
+ const struct bcm2835_isp_lens_shading *v4l2_ls)
|
||||
+{
|
||||
+ void *vcsm_handle;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (IS_ERR_OR_NULL(dmabuf))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /*
|
||||
+ * struct bcm2835_isp_lens_shading and struct
|
||||
+ * mmal_parameter_lens_shading_v2 match so that we can do a
|
||||
+ * simple memcpy here.
|
||||
+ * Only the dmabuf to the actual table needs any manipulation.
|
||||
+ */
|
||||
+ memcpy(&dev->ls, v4l2_ls, sizeof(dev->ls));
|
||||
+ ret = vc_sm_cma_import_dmabuf(dmabuf, &vcsm_handle);
|
||||
+ if (ret) {
|
||||
+ dma_buf_put(dmabuf);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ dev->ls.mem_handle_table = vc_sm_cma_int_handle(vcsm_handle);
|
||||
+ dev->last_ls_dmabuf = dmabuf;
|
||||
+
|
||||
+ vc_sm_cma_free(vcsm_handle);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int bcm2835_isp_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct bcm2835_isp_dev *dev =
|
||||
@@ -754,44 +786,27 @@ static int bcm2835_isp_s_ctrl(struct v4l
|
||||
case V4L2_CID_USER_BCM2835_ISP_LENS_SHADING:
|
||||
{
|
||||
struct bcm2835_isp_lens_shading *v4l2_ls;
|
||||
- struct mmal_parameter_lens_shading_v2 ls;
|
||||
- struct dma_buf *dmabuf;
|
||||
- void *vcsm_handle;
|
||||
|
||||
v4l2_ls = (struct bcm2835_isp_lens_shading *)ctrl->p_new.p_u8;
|
||||
- /*
|
||||
- * struct bcm2835_isp_lens_shading and struct
|
||||
- * mmal_parameter_lens_shading_v2 match so that we can do a
|
||||
- * simple memcpy here.
|
||||
- * Only the dmabuf to the actual table needs any manipulation.
|
||||
- */
|
||||
- memcpy(&ls, v4l2_ls, sizeof(ls));
|
||||
+ struct dma_buf *dmabuf = dma_buf_get(v4l2_ls->dmabuf);
|
||||
|
||||
- dmabuf = dma_buf_get(v4l2_ls->dmabuf);
|
||||
- if (IS_ERR_OR_NULL(dmabuf))
|
||||
- return -EINVAL;
|
||||
-
|
||||
- ret = vc_sm_cma_import_dmabuf(dmabuf, &vcsm_handle);
|
||||
- if (ret) {
|
||||
- dma_buf_put(dmabuf);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ if (dmabuf != dev->last_ls_dmabuf)
|
||||
+ ret = map_ls_table(dev, dmabuf, v4l2_ls);
|
||||
|
||||
- ls.mem_handle_table = vc_sm_cma_int_handle(vcsm_handle);
|
||||
- if (ls.mem_handle_table)
|
||||
- /* The VPU will take a reference on the vcsm handle,
|
||||
+ if (!ret && dev->ls.mem_handle_table)
|
||||
+ /*
|
||||
+ * The VPU will take a reference on the vcsm handle,
|
||||
* which in turn will retain a reference on the dmabuf.
|
||||
* This code can therefore safely release all
|
||||
* references to the buffer.
|
||||
*/
|
||||
- ret = set_isp_param(node,
|
||||
- MMAL_PARAMETER_LENS_SHADING_OVERRIDE,
|
||||
- &ls,
|
||||
- sizeof(ls));
|
||||
+ ret =
|
||||
+ set_isp_param(node,
|
||||
+ MMAL_PARAMETER_LENS_SHADING_OVERRIDE,
|
||||
+ &dev->ls, sizeof(dev->ls));
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
- vc_sm_cma_free(vcsm_handle);
|
||||
dma_buf_put(dmabuf);
|
||||
break;
|
||||
}
|
@ -0,0 +1,330 @@
|
||||
From 3ab72fc21ea8576e59f6aad10bd6b1a0eae6e5eb Mon Sep 17 00:00:00 2001
|
||||
From: Vincent Whitchurch <vincent.whitchurch@axis.com>
|
||||
Date: Tue, 4 Jun 2024 23:00:41 +0200
|
||||
Subject: [PATCH] pwm: Add GPIO PWM driver
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
commit 7f61257cd6e1ad4769b4b819668cab00f68f2556 upstream.
|
||||
|
||||
Add a software PWM which toggles a GPIO from a high-resolution timer.
|
||||
|
||||
This will naturally not be as accurate or as efficient as a hardware
|
||||
PWM, but it is useful in some cases. I have for example used it for
|
||||
evaluating LED brightness handling (via leds-pwm) on a board where the
|
||||
LED was just hooked up to a GPIO, and for a simple verification of the
|
||||
timer frequency on another platform.
|
||||
|
||||
Since high-resolution timers are used, sleeping GPIO chips are not
|
||||
supported and are rejected in the probe function.
|
||||
|
||||
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
|
||||
Co-developed-by: Stefan Wahren <wahrenst@gmx.net>
|
||||
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
|
||||
Co-developed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Reviewed-by: Andy Shevchenko <andy@kernel.org>
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Reviewed-by: Dhruva Gole <d-gole@ti.com>
|
||||
Link: https://lore.kernel.org/r/20240604-pwm-gpio-v7-2-6b67cf60db92@linaro.org
|
||||
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
|
||||
Signed-off-by: Tim Gover <tim.gover@raspberrypi.com>
|
||||
|
||||
pwm: Backport pwm-gpio.c to rpi-6.6.y
|
||||
---
|
||||
.../driver-api/gpio/drivers-on-gpio.rst | 7 +-
|
||||
drivers/pwm/Kconfig | 11 +
|
||||
drivers/pwm/Makefile | 1 +
|
||||
drivers/pwm/pwm-gpio.c | 240 ++++++++++++++++++
|
||||
4 files changed, 258 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/pwm/pwm-gpio.c
|
||||
|
||||
--- a/Documentation/driver-api/gpio/drivers-on-gpio.rst
|
||||
+++ b/Documentation/driver-api/gpio/drivers-on-gpio.rst
|
||||
@@ -27,7 +27,12 @@ hardware descriptions such as device tre
|
||||
to the lines for a more permanent solution of this type.
|
||||
|
||||
- gpio-beeper: drivers/input/misc/gpio-beeper.c is used to provide a beep from
|
||||
- an external speaker connected to a GPIO line.
|
||||
+ an external speaker connected to a GPIO line. (If the beep is controlled by
|
||||
+ off/on, for an actual PWM waveform, see pwm-gpio below.)
|
||||
+
|
||||
+- pwm-gpio: drivers/pwm/pwm-gpio.c is used to toggle a GPIO with a high
|
||||
+ resolution timer producing a PWM waveform on the GPIO line, as well as
|
||||
+ Linux high resolution timers can do.
|
||||
|
||||
- extcon-gpio: drivers/extcon/extcon-gpio.c is used when you need to read an
|
||||
external connector status, such as a headset line for an audio driver or an
|
||||
--- a/drivers/pwm/Kconfig
|
||||
+++ b/drivers/pwm/Kconfig
|
||||
@@ -217,6 +217,17 @@ config PWM_FSL_FTM
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called pwm-fsl-ftm.
|
||||
|
||||
+config PWM_GPIO
|
||||
+ tristate "GPIO PWM support"
|
||||
+ depends on GPIOLIB
|
||||
+ depends on HIGH_RES_TIMERS
|
||||
+ help
|
||||
+ Generic PWM framework driver for software PWM toggling a GPIO pin
|
||||
+ from kernel high-resolution timers.
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the module
|
||||
+ will be called pwm-gpio.
|
||||
+
|
||||
config PWM_HIBVT
|
||||
tristate "HiSilicon BVT PWM support"
|
||||
depends on ARCH_HISI || COMPILE_TEST
|
||||
--- a/drivers/pwm/Makefile
|
||||
+++ b/drivers/pwm/Makefile
|
||||
@@ -18,6 +18,7 @@ obj-$(CONFIG_PWM_CROS_EC) += pwm-cros-ec
|
||||
obj-$(CONFIG_PWM_DWC) += pwm-dwc.o
|
||||
obj-$(CONFIG_PWM_EP93XX) += pwm-ep93xx.o
|
||||
obj-$(CONFIG_PWM_FSL_FTM) += pwm-fsl-ftm.o
|
||||
+obj-$(CONFIG_PWM_GPIO) += pwm-gpio.o
|
||||
obj-$(CONFIG_PWM_HIBVT) += pwm-hibvt.o
|
||||
obj-$(CONFIG_PWM_IMG) += pwm-img.o
|
||||
obj-$(CONFIG_PWM_IMX1) += pwm-imx1.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/pwm/pwm-gpio.c
|
||||
@@ -0,0 +1,240 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Generic software PWM for modulating GPIOs
|
||||
+ *
|
||||
+ * Copyright (C) 2020 Axis Communications AB
|
||||
+ * Copyright (C) 2020 Nicola Di Lieto
|
||||
+ * Copyright (C) 2024 Stefan Wahren
|
||||
+ * Copyright (C) 2024 Linus Walleij
|
||||
+ */
|
||||
+
|
||||
+#include <linux/cleanup.h>
|
||||
+#include <linux/container_of.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/gpio/consumer.h>
|
||||
+#include <linux/hrtimer.h>
|
||||
+#include <linux/math.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/mod_devicetable.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/property.h>
|
||||
+#include <linux/pwm.h>
|
||||
+#include <linux/spinlock.h>
|
||||
+#include <linux/time.h>
|
||||
+#include <linux/types.h>
|
||||
+
|
||||
+struct pwm_gpio {
|
||||
+ struct hrtimer gpio_timer;
|
||||
+ struct gpio_desc *gpio;
|
||||
+ struct pwm_state state;
|
||||
+ struct pwm_state next_state;
|
||||
+
|
||||
+ /* Protect internal state between pwm_ops and hrtimer */
|
||||
+ spinlock_t lock;
|
||||
+
|
||||
+ bool changing;
|
||||
+ bool running;
|
||||
+ bool level;
|
||||
+ struct pwm_chip chip;
|
||||
+};
|
||||
+
|
||||
+static void pwm_gpio_round(struct pwm_state *dest, const struct pwm_state *src)
|
||||
+{
|
||||
+ u64 dividend;
|
||||
+ u32 remainder;
|
||||
+
|
||||
+ *dest = *src;
|
||||
+
|
||||
+ /* Round down to hrtimer resolution */
|
||||
+ dividend = dest->period;
|
||||
+ remainder = do_div(dividend, hrtimer_resolution);
|
||||
+ dest->period -= remainder;
|
||||
+
|
||||
+ dividend = dest->duty_cycle;
|
||||
+ remainder = do_div(dividend, hrtimer_resolution);
|
||||
+ dest->duty_cycle -= remainder;
|
||||
+}
|
||||
+
|
||||
+static u64 pwm_gpio_toggle(struct pwm_gpio *gpwm, bool level)
|
||||
+{
|
||||
+ const struct pwm_state *state = &gpwm->state;
|
||||
+ bool invert = state->polarity == PWM_POLARITY_INVERSED;
|
||||
+
|
||||
+ gpwm->level = level;
|
||||
+ gpiod_set_value(gpwm->gpio, gpwm->level ^ invert);
|
||||
+
|
||||
+ if (!state->duty_cycle || state->duty_cycle == state->period) {
|
||||
+ gpwm->running = false;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ gpwm->running = true;
|
||||
+ return level ? state->duty_cycle : state->period - state->duty_cycle;
|
||||
+}
|
||||
+
|
||||
+static enum hrtimer_restart pwm_gpio_timer(struct hrtimer *gpio_timer)
|
||||
+{
|
||||
+ struct pwm_gpio *gpwm = container_of(gpio_timer, struct pwm_gpio,
|
||||
+ gpio_timer);
|
||||
+ u64 next_toggle;
|
||||
+ bool new_level;
|
||||
+
|
||||
+ guard(spinlock_irqsave)(&gpwm->lock);
|
||||
+
|
||||
+ /* Apply new state at end of current period */
|
||||
+ if (!gpwm->level && gpwm->changing) {
|
||||
+ gpwm->changing = false;
|
||||
+ gpwm->state = gpwm->next_state;
|
||||
+ new_level = !!gpwm->state.duty_cycle;
|
||||
+ } else {
|
||||
+ new_level = !gpwm->level;
|
||||
+ }
|
||||
+
|
||||
+ next_toggle = pwm_gpio_toggle(gpwm, new_level);
|
||||
+ if (next_toggle)
|
||||
+ hrtimer_forward(gpio_timer, hrtimer_get_expires(gpio_timer),
|
||||
+ ns_to_ktime(next_toggle));
|
||||
+
|
||||
+ return next_toggle ? HRTIMER_RESTART : HRTIMER_NORESTART;
|
||||
+}
|
||||
+
|
||||
+static int pwm_gpio_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
+ const struct pwm_state *state)
|
||||
+{
|
||||
+ struct pwm_gpio *gpwm = container_of(chip, struct pwm_gpio, chip);
|
||||
+ bool invert = state->polarity == PWM_POLARITY_INVERSED;
|
||||
+
|
||||
+ if (state->duty_cycle && state->duty_cycle < hrtimer_resolution)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (state->duty_cycle != state->period &&
|
||||
+ (state->period - state->duty_cycle < hrtimer_resolution))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (!state->enabled) {
|
||||
+ hrtimer_cancel(&gpwm->gpio_timer);
|
||||
+ } else if (!gpwm->running) {
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * This just enables the output, but pwm_gpio_toggle()
|
||||
+ * really starts the duty cycle.
|
||||
+ */
|
||||
+ ret = gpiod_direction_output(gpwm->gpio, invert);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ guard(spinlock_irqsave)(&gpwm->lock);
|
||||
+
|
||||
+ if (!state->enabled) {
|
||||
+ pwm_gpio_round(&gpwm->state, state);
|
||||
+ gpwm->running = false;
|
||||
+ gpwm->changing = false;
|
||||
+
|
||||
+ gpiod_set_value(gpwm->gpio, invert);
|
||||
+ } else if (gpwm->running) {
|
||||
+ pwm_gpio_round(&gpwm->next_state, state);
|
||||
+ gpwm->changing = true;
|
||||
+ } else {
|
||||
+ unsigned long next_toggle;
|
||||
+
|
||||
+ pwm_gpio_round(&gpwm->state, state);
|
||||
+ gpwm->changing = false;
|
||||
+
|
||||
+ next_toggle = pwm_gpio_toggle(gpwm, !!state->duty_cycle);
|
||||
+ if (next_toggle)
|
||||
+ hrtimer_start(&gpwm->gpio_timer, next_toggle,
|
||||
+ HRTIMER_MODE_REL);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pwm_gpio_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
+ struct pwm_state *state)
|
||||
+{
|
||||
+ struct pwm_gpio *gpwm = container_of(chip, struct pwm_gpio, chip);
|
||||
+
|
||||
+ guard(spinlock_irqsave)(&gpwm->lock);
|
||||
+
|
||||
+ if (gpwm->changing)
|
||||
+ *state = gpwm->next_state;
|
||||
+ else
|
||||
+ *state = gpwm->state;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct pwm_ops pwm_gpio_ops = {
|
||||
+ .apply = pwm_gpio_apply,
|
||||
+ .get_state = pwm_gpio_get_state,
|
||||
+};
|
||||
+
|
||||
+static void pwm_gpio_disable_hrtimer(void *data)
|
||||
+{
|
||||
+ struct pwm_gpio *gpwm = data;
|
||||
+
|
||||
+ hrtimer_cancel(&gpwm->gpio_timer);
|
||||
+}
|
||||
+
|
||||
+static int pwm_gpio_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct pwm_chip *chip;
|
||||
+ struct pwm_gpio *gpwm;
|
||||
+ int ret;
|
||||
+
|
||||
+ gpwm = devm_kzalloc(&pdev->dev, sizeof(*gpwm), GFP_KERNEL);
|
||||
+ if (IS_ERR(gpwm))
|
||||
+ return PTR_ERR(gpwm);
|
||||
+
|
||||
+ chip = &gpwm->chip;
|
||||
+
|
||||
+ spin_lock_init(&gpwm->lock);
|
||||
+
|
||||
+ gpwm->gpio = devm_gpiod_get(dev, NULL, GPIOD_ASIS);
|
||||
+ if (IS_ERR(gpwm->gpio))
|
||||
+ return dev_err_probe(dev, PTR_ERR(gpwm->gpio),
|
||||
+ "%pfw: could not get gpio\n",
|
||||
+ dev_fwnode(dev));
|
||||
+
|
||||
+ if (gpiod_cansleep(gpwm->gpio))
|
||||
+ return dev_err_probe(dev, -EINVAL,
|
||||
+ "%pfw: sleeping GPIO not supported\n",
|
||||
+ dev_fwnode(dev));
|
||||
+
|
||||
+ chip->dev = dev;
|
||||
+ chip->ops = &pwm_gpio_ops;
|
||||
+ chip->atomic = true;
|
||||
+ chip->npwm = 1;
|
||||
+
|
||||
+ hrtimer_init(&gpwm->gpio_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
+ ret = devm_add_action_or_reset(dev, pwm_gpio_disable_hrtimer, gpwm);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ gpwm->gpio_timer.function = pwm_gpio_timer;
|
||||
+
|
||||
+ return devm_pwmchip_add(dev, chip);
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id pwm_gpio_dt_ids[] = {
|
||||
+ { .compatible = "pwm-gpio" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, pwm_gpio_dt_ids);
|
||||
+
|
||||
+static struct platform_driver pwm_gpio_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "pwm-gpio",
|
||||
+ .of_match_table = pwm_gpio_dt_ids,
|
||||
+ },
|
||||
+ .probe = pwm_gpio_probe,
|
||||
+};
|
||||
+module_platform_driver(pwm_gpio_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("PWM GPIO driver");
|
||||
+MODULE_AUTHOR("Vincent Whitchurch");
|
||||
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,79 @@
|
||||
From ff0fe12ab875d587348b6f2b9e73ae928049ebee Mon Sep 17 00:00:00 2001
|
||||
From: Tim Gover <tim.gover@raspberrypi.com>
|
||||
Date: Thu, 31 Oct 2024 16:12:54 +0000
|
||||
Subject: [PATCH] dtoverlay: Add a dtoverlay for pwm-gpio
|
||||
|
||||
Signed-off-by: Tim Gover <tim.gover@raspberrypi.com>
|
||||
---
|
||||
arch/arm/boot/dts/overlays/Makefile | 1 +
|
||||
arch/arm/boot/dts/overlays/README | 6 +++
|
||||
.../boot/dts/overlays/pwm-gpio-overlay.dts | 38 +++++++++++++++++++
|
||||
3 files changed, 45 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/overlays/pwm-gpio-overlay.dts
|
||||
|
||||
--- a/arch/arm/boot/dts/overlays/Makefile
|
||||
+++ b/arch/arm/boot/dts/overlays/Makefile
|
||||
@@ -217,6 +217,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \
|
||||
proto-codec.dtbo \
|
||||
pwm.dtbo \
|
||||
pwm-2chan.dtbo \
|
||||
+ pwm-gpio.dtbo \
|
||||
pwm-ir-tx.dtbo \
|
||||
pwm1.dtbo \
|
||||
qca7000.dtbo \
|
||||
--- a/arch/arm/boot/dts/overlays/README
|
||||
+++ b/arch/arm/boot/dts/overlays/README
|
||||
@@ -3903,6 +3903,12 @@ Params: pin Output p
|
||||
clock PWM clock frequency (informational)
|
||||
|
||||
|
||||
+Name: pwm-gpio
|
||||
+Info: Configures the software PWM GPIO driver
|
||||
+Load: dtoverlay=pwm-gpio,<param>=<val>
|
||||
+Params: gpio Output pin (default 4)
|
||||
+
|
||||
+
|
||||
Name: pwm-ir-tx
|
||||
Info: Use GPIO pin as pwm-assisted infrared transmitter output.
|
||||
This is an alternative to "gpio-ir-tx". pwm-ir-tx makes use
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/overlays/pwm-gpio-overlay.dts
|
||||
@@ -0,0 +1,38 @@
|
||||
+// Device tree overlay for software GPIO PWM.
|
||||
+/dts-v1/;
|
||||
+/plugin/;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "brcm,bcm2835";
|
||||
+
|
||||
+ fragment@0 {
|
||||
+ target = <&gpio>;
|
||||
+ __overlay__ {
|
||||
+ pwm_gpio_pins: pwm_gpio_pins@4 {
|
||||
+ brcm,pins = <4>; /* gpio 4 */
|
||||
+ brcm,function = <1>; /* output */
|
||||
+ brcm,pull = <0>; /* pull-none */
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ fragment@1 {
|
||||
+ target-path = "/";
|
||||
+ __overlay__ {
|
||||
+ pwm_gpio: pwm_gpio@4 {
|
||||
+ compatible = "pwm-gpio";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pwm_gpio_pins>;
|
||||
+ gpios = <&gpio 4 0>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ __overrides__ {
|
||||
+ gpio = <&pwm_gpio>,"gpios:4",
|
||||
+ <&pwm_gpio_pins>,"brcm,pins:0",
|
||||
+ /* modify reg values to allow multiple instantiation */
|
||||
+ <&pwm_gpio>,"reg:0",
|
||||
+ <&pwm_gpio_pins>,"reg:0";
|
||||
+ };
|
||||
+};
|
@ -0,0 +1,29 @@
|
||||
From 624eb357e1a16385b3d6171e9194e4c5f8d4fd5f Mon Sep 17 00:00:00 2001
|
||||
From: Dom Cobley <popcornmix@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 19:09:18 +0100
|
||||
Subject: [PATCH] dts: 2712: Drop some numa options from bootargs
|
||||
|
||||
iommu_dma_numa_policy=interleave is not valid in the current tree
|
||||
It generates an unknown setting will be passed to usespace warning
|
||||
|
||||
system_heap.max_order=0 is wanted when numa is enabled, but may not
|
||||
be when it is disabled.
|
||||
|
||||
Add it on firmware side when we know if numa=fake=<n> is used.
|
||||
|
||||
Signed-off-by: Dom Cobley <popcornmix@gmail.com>
|
||||
---
|
||||
arch/arm64/boot/dts/broadcom/bcm2712-rpi.dtsi | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/arch/arm64/boot/dts/broadcom/bcm2712-rpi.dtsi
|
||||
+++ b/arch/arm64/boot/dts/broadcom/bcm2712-rpi.dtsi
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
/ {
|
||||
chosen: chosen {
|
||||
- bootargs = "reboot=w coherent_pool=1M 8250.nr_uarts=1 pci=pcie_bus_safe cgroup_disable=memory numa_policy=interleave iommu_dma_numa_policy=interleave system_heap.max_order=0";
|
||||
+ bootargs = "reboot=w coherent_pool=1M 8250.nr_uarts=1 pci=pcie_bus_safe cgroup_disable=memory numa_policy=interleave";
|
||||
stdout-path = "serial10:115200n8";
|
||||
};
|
||||
|
@ -0,0 +1,42 @@
|
||||
From 74f3ca5e39586ea26201fe6eaf1b9e6793b101b7 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
Date: Tue, 29 Oct 2024 13:33:21 +0000
|
||||
Subject: [PATCH] mmc: quirks: add more broken Kingston Canvas Go! SD card date
|
||||
ranges
|
||||
|
||||
A user has reported that a card of this model from late 2021 doesn't
|
||||
work, so extend the date range and make it match on all card sizes.
|
||||
|
||||
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
---
|
||||
drivers/mmc/core/quirks.h | 18 +++++++++++++++---
|
||||
1 file changed, 15 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/mmc/core/quirks.h
|
||||
+++ b/drivers/mmc/core/quirks.h
|
||||
@@ -18,10 +18,22 @@
|
||||
static const struct mmc_fixup __maybe_unused mmc_sd_fixups[] = {
|
||||
/*
|
||||
* Kingston Canvas Go! Plus microSD cards never finish SD cache flush.
|
||||
- * This has so far only been observed on cards from 11/2019, while new
|
||||
- * cards from 2023/05 do not exhibit this behavior.
|
||||
+ * This has been observed on cards from 2019/11 and 2021/11, while new
|
||||
+ * cards from 2023/05 and 2024/08 do not exhibit this behavior.
|
||||
*/
|
||||
- _FIXUP_EXT("SD64G", CID_MANFID_KINGSTON_SD, 0x5449, 2019, 11,
|
||||
+ _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_KINGSTON_SD, 0x5449, 2019, CID_MONTH_ANY,
|
||||
+ 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd,
|
||||
+ MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY),
|
||||
+
|
||||
+ _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_KINGSTON_SD, 0x5449, 2020, CID_MONTH_ANY,
|
||||
+ 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd,
|
||||
+ MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY),
|
||||
+
|
||||
+ _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_KINGSTON_SD, 0x5449, 2021, CID_MONTH_ANY,
|
||||
+ 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd,
|
||||
+ MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY),
|
||||
+
|
||||
+ _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_KINGSTON_SD, 0x5449, 2022, CID_MONTH_ANY,
|
||||
0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd,
|
||||
MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY),
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 6c0f34fb0f83741f7f03f6bfd3fcbc89cb2c7cde Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
Date: Wed, 6 Nov 2024 10:26:55 +0000
|
||||
Subject: [PATCH] dt-bindings: usb: snps,dwc3: add FS/HS periodic NAK polling
|
||||
quirk
|
||||
|
||||
Add two quirk properties that control whether or not the controller
|
||||
issues many more handshakes to FS/HS Async endpoints in a single
|
||||
(micro)frame. Enabling these can significantly increase throughput for
|
||||
endpoints that frequently respond with NAKs.
|
||||
|
||||
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
---
|
||||
Documentation/devicetree/bindings/usb/snps,dwc3.yaml | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/Documentation/devicetree/bindings/usb/snps,dwc3.yaml
|
||||
+++ b/Documentation/devicetree/bindings/usb/snps,dwc3.yaml
|
||||
@@ -231,6 +231,16 @@ properties:
|
||||
description: When set, disable u2mac linestate check during HS transmit
|
||||
type: boolean
|
||||
|
||||
+ snps,enhanced-nak-fs-quirk:
|
||||
+ description:
|
||||
+ When set, the controller schedules many more handshakes to Async FS
|
||||
+ endpoints, improving throughput when they frequently respond with NAKs.
|
||||
+
|
||||
+ snps,enhanced-nak-hs-quirk:
|
||||
+ description:
|
||||
+ When set, the controller schedules many more handshakes to Async HS
|
||||
+ endpoints, improving throughput when they frequently respond with NAKs.
|
||||
+
|
||||
snps,parkmode-disable-ss-quirk:
|
||||
description:
|
||||
When set, disable park mode for all Superspeed bus instances.
|
@ -0,0 +1,77 @@
|
||||
From bb53ca75f9e3631e753f397ccab704a8f975658b Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
Date: Wed, 6 Nov 2024 10:45:24 +0000
|
||||
Subject: [PATCH] usb: dwc3: core: add support for setting NAK enhancement bits
|
||||
for FS/HS
|
||||
|
||||
If a device frequently NAKs, it can exhaust the scheduled handshakes in
|
||||
a frame. It will then not get polled by the controller until the next
|
||||
frame interval. This is most noticeable on FS devices as the controller
|
||||
schedules a small set of transactions only once per full-speed frame.
|
||||
|
||||
Setting the ENH_PER_NAK_FS/LS bits in the GUCTL1 register increases the
|
||||
number of transactions that can be scheduled to Async (Control/Bulk)
|
||||
endpoints in the respective frame time. In the FS case, this only
|
||||
applies to FS devices directly connected to root ports.
|
||||
|
||||
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
---
|
||||
drivers/usb/dwc3/core.c | 10 ++++++++++
|
||||
drivers/usb/dwc3/core.h | 6 ++++++
|
||||
2 files changed, 16 insertions(+)
|
||||
|
||||
--- a/drivers/usb/dwc3/core.c
|
||||
+++ b/drivers/usb/dwc3/core.c
|
||||
@@ -1361,6 +1361,12 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
if (dwc->dis_tx_ipgap_linecheck_quirk)
|
||||
reg |= DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS;
|
||||
|
||||
+ if (dwc->enh_nak_fs_quirk)
|
||||
+ reg |= DWC3_GUCTL1_NAK_PER_ENH_FS;
|
||||
+
|
||||
+ if (dwc->enh_nak_hs_quirk)
|
||||
+ reg |= DWC3_GUCTL1_NAK_PER_ENH_HS;
|
||||
+
|
||||
if (dwc->parkmode_disable_ss_quirk)
|
||||
reg |= DWC3_GUCTL1_PARKMODE_DISABLE_SS;
|
||||
|
||||
@@ -1633,6 +1639,10 @@ static void dwc3_get_properties(struct d
|
||||
"snps,resume-hs-terminations");
|
||||
dwc->ulpi_ext_vbus_drv = device_property_read_bool(dev,
|
||||
"snps,ulpi-ext-vbus-drv");
|
||||
+ dwc->enh_nak_fs_quirk = device_property_read_bool(dev,
|
||||
+ "snps,enhanced-nak-fs-quirk");
|
||||
+ dwc->enh_nak_hs_quirk = device_property_read_bool(dev,
|
||||
+ "snps,enhanced-nak-hs-quirk");
|
||||
dwc->parkmode_disable_ss_quirk = device_property_read_bool(dev,
|
||||
"snps,parkmode-disable-ss-quirk");
|
||||
dwc->parkmode_disable_hs_quirk = device_property_read_bool(dev,
|
||||
--- a/drivers/usb/dwc3/core.h
|
||||
+++ b/drivers/usb/dwc3/core.h
|
||||
@@ -266,6 +266,8 @@
|
||||
#define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28)
|
||||
#define DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK BIT(26)
|
||||
#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24)
|
||||
+#define DWC3_GUCTL1_NAK_PER_ENH_FS BIT(19)
|
||||
+#define DWC3_GUCTL1_NAK_PER_ENH_HS BIT(18)
|
||||
#define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17)
|
||||
#define DWC3_GUCTL1_PARKMODE_DISABLE_HS BIT(16)
|
||||
#define DWC3_GUCTL1_PARKMODE_DISABLE_FSLS BIT(15)
|
||||
@@ -1119,6 +1121,8 @@ struct dwc3_scratchpad_array {
|
||||
* generation after resume from suspend.
|
||||
* @ulpi_ext_vbus_drv: Set to confiure the upli chip to drives CPEN pin
|
||||
* VBUS with an external supply.
|
||||
+ * @enh_nak_fs_quirk: Set to schedule more handshakes to Async FS endpoints.
|
||||
+ * @enh_nak_hs_quirk: Set to schedule more handshakes to Async HS endpoints.
|
||||
* @parkmode_disable_ss_quirk: If set, disable park mode feature for all
|
||||
* Superspeed instances.
|
||||
* @parkmode_disable_hs_quirk: If set, disable park mode feature for all
|
||||
@@ -1348,6 +1352,8 @@ struct dwc3 {
|
||||
unsigned dis_tx_ipgap_linecheck_quirk:1;
|
||||
unsigned resume_hs_terminations:1;
|
||||
unsigned ulpi_ext_vbus_drv:1;
|
||||
+ unsigned enh_nak_fs_quirk:1;
|
||||
+ unsigned enh_nak_hs_quirk:1;
|
||||
unsigned parkmode_disable_ss_quirk:1;
|
||||
unsigned parkmode_disable_hs_quirk:1;
|
||||
unsigned parkmode_disable_fsls_quirk:1;
|
@ -0,0 +1,30 @@
|
||||
From 803757627b48bdad9530b50053321fdea6dfcab4 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
Date: Wed, 6 Nov 2024 10:54:58 +0000
|
||||
Subject: [PATCH] DTS: rp1: set enhanced FS NAK quirk for usb3 controllers
|
||||
|
||||
There seem to be only benefits, and no downsides.
|
||||
|
||||
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
---
|
||||
arch/arm64/boot/dts/broadcom/rp1.dtsi | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/broadcom/rp1.dtsi
|
||||
+++ b/arch/arm64/boot/dts/broadcom/rp1.dtsi
|
||||
@@ -1077,6 +1077,7 @@
|
||||
usb3-lpm-capable;
|
||||
snps,axi-pipe-limit = /bits/ 8 <8>;
|
||||
snps,dis_rxdet_inp3_quirk;
|
||||
+ snps,enhanced-nak-fs-quirk;
|
||||
snps,parkmode-disable-ss-quirk;
|
||||
snps,parkmode-disable-hs-quirk;
|
||||
snps,parkmode-disable-fsls-quirk;
|
||||
@@ -1093,6 +1094,7 @@
|
||||
usb3-lpm-capable;
|
||||
snps,axi-pipe-limit = /bits/ 8 <8>;
|
||||
snps,dis_rxdet_inp3_quirk;
|
||||
+ snps,enhanced-nak-fs-quirk;
|
||||
snps,parkmode-disable-ss-quirk;
|
||||
snps,parkmode-disable-hs-quirk;
|
||||
snps,parkmode-disable-fsls-quirk;
|
@ -0,0 +1,50 @@
|
||||
From e9e852af347ae3ccee4e7abb01f9ef91387980f9 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
Date: Wed, 6 Nov 2024 11:07:55 +0000
|
||||
Subject: [PATCH] drivers: usb: xhci: prevent a theoretical race on
|
||||
non-coherent platforms
|
||||
|
||||
For platforms that have xHCI controllers attached over PCIe, and
|
||||
non-coherent routes to main memory, a theoretical race exists between
|
||||
posting new TRBs to a ring, and writing to the doorbell register.
|
||||
|
||||
In a contended system, write traffic from the CPU may be stalled before
|
||||
the memory controller, whereas the CPU to Endpoint route is separate
|
||||
and not likely to be contended. Similarly, the DMA route from the
|
||||
endpoint to main memory may be separate and uncontended.
|
||||
|
||||
Therefore the xHCI can receive a doorbell write and find a stale view
|
||||
of a transfer ring. In cases where only a single TRB is ping-ponged at
|
||||
a time, this can cause the endpoint to not get polled at all.
|
||||
|
||||
Adding a readl() before the write forces a round-trip transaction
|
||||
across PCIe, definitively serialising the CPU along the PCI
|
||||
producer-consumer ordering rules.
|
||||
|
||||
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
---
|
||||
drivers/usb/host/xhci-ring.c | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -507,6 +507,19 @@ void xhci_ring_ep_doorbell(struct xhci_h
|
||||
|
||||
trace_xhci_ring_ep_doorbell(slot_id, DB_VALUE(ep_index, stream_id));
|
||||
|
||||
+ /*
|
||||
+ * For non-coherent systems with PCIe DMA (such as Pi 4, Pi 5) there
|
||||
+ * is a theoretical race between the TRB write and barrier, which
|
||||
+ * is reported complete as soon as the write leaves the CPU domain,
|
||||
+ * the doorbell write, which may be reported as complete by the RC
|
||||
+ * at some arbitrary point, and the visibility of new TRBs in system
|
||||
+ * RAM by the endpoint DMA engine.
|
||||
+ *
|
||||
+ * This read before the write positively serialises the CPU state
|
||||
+ * by incurring a round-trip across the link.
|
||||
+ */
|
||||
+ readl(db_addr);
|
||||
+
|
||||
writel(DB_VALUE(ep_index, stream_id), db_addr);
|
||||
/* flush the write */
|
||||
readl(db_addr);
|
@ -0,0 +1,32 @@
|
||||
From ce65ed02cb6707ae5c9f3a304f5b0124f4eed559 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Mon, 4 Nov 2024 14:10:53 +0000
|
||||
Subject: [PATCH] iio: humidity: dht11: Allow non-zero decimals
|
||||
|
||||
The DHT11 datasheet is pretty cryptic, but it does suggest that after
|
||||
each integer value (humidity and temperature) there are "decimal"
|
||||
values. Validate these as integers in the range 0-9 and treat them as
|
||||
tenths of a unit.
|
||||
|
||||
Link: https://github.com/raspberrypi/linux/issues/6220
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
drivers/iio/humidity/dht11.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/iio/humidity/dht11.c
|
||||
+++ b/drivers/iio/humidity/dht11.c
|
||||
@@ -152,9 +152,9 @@ static int dht11_decode(struct dht11 *dh
|
||||
dht11->temperature = (((temp_int & 0x7f) << 8) + temp_dec) *
|
||||
((temp_int & 0x80) ? -100 : 100);
|
||||
dht11->humidity = ((hum_int << 8) + hum_dec) * 100;
|
||||
- } else if (temp_dec == 0 && hum_dec == 0) { /* DHT11 */
|
||||
- dht11->temperature = temp_int * 1000;
|
||||
- dht11->humidity = hum_int * 1000;
|
||||
+ } else if (temp_dec < 10 && hum_dec < 10) { /* DHT11 */
|
||||
+ dht11->temperature = temp_int * 1000 + temp_dec * 100;
|
||||
+ dht11->humidity = hum_int * 1000 + hum_dec * 100;
|
||||
} else {
|
||||
dev_err(dht11->dev,
|
||||
"Don't know how to decode data: %d %d %d %d\n",
|
@ -0,0 +1,41 @@
|
||||
From c3393ac1098d1f191e37eed73bf366ebc88ac4ee Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Wed, 11 Sep 2024 14:49:05 +0100
|
||||
Subject: [PATCH] drm/vc4: Correct condition for ignoring a plane to src rect
|
||||
=0, not <1.0
|
||||
|
||||
The logic for dropping a plane less than zero didn't account for the
|
||||
possibility that a plane could be being upscaled with a src_rect with
|
||||
width/height < 1 pixel, but not 0 subpixels.
|
||||
|
||||
Check for not 0 subpixels, not < 1, in both vc4 and vc6 paths.
|
||||
|
||||
Fixes: dac616899f87 ("drm/vc4: Drop planes that have 0 destination size")
|
||||
Fixes: f73b18eb0d48 ("drm/vc4: Drop planes that are completely off-screen")
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_plane.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
@@ -1160,7 +1160,8 @@ static int vc4_plane_mode_set(struct drm
|
||||
width = vc4_state->src_w[0] >> 16;
|
||||
height = vc4_state->src_h[0] >> 16;
|
||||
|
||||
- if (!width || !height || !vc4_state->crtc_w || !vc4_state->crtc_h) {
|
||||
+ if (!vc4_state->src_w[0] || !vc4_state->src_h[0] ||
|
||||
+ !vc4_state->crtc_w || !vc4_state->crtc_h) {
|
||||
/* 0 source size probably means the plane is offscreen */
|
||||
vc4_state->dlist_initialized = 1;
|
||||
return 0;
|
||||
@@ -1698,7 +1699,8 @@ static int vc6_plane_mode_set(struct drm
|
||||
width = vc4_state->src_w[0] >> 16;
|
||||
height = vc4_state->src_h[0] >> 16;
|
||||
|
||||
- if (!width || !height || !vc4_state->crtc_w || !vc4_state->crtc_h) {
|
||||
+ if (!vc4_state->src_w[0] || !vc4_state->src_h[0] ||
|
||||
+ !vc4_state->crtc_w || !vc4_state->crtc_h) {
|
||||
/* 0 source size probably means the plane is offscreen.
|
||||
* 0 destination size is a redundant plane.
|
||||
*/
|
@ -0,0 +1,59 @@
|
||||
From ca621585c573cae54dc1235d90822e8bcef2f73d Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Wed, 11 Sep 2024 15:23:33 +0100
|
||||
Subject: [PATCH] drm/vc4: Use the TPZ scaling filter for 1x1 source images
|
||||
|
||||
The documentation says that the TPZ filter can not upscale,
|
||||
and requesting a scaling factor > 1:1 will output the original
|
||||
image in the top left, and repeat the right/bottom most pixels
|
||||
thereafter.
|
||||
That fits perfectly with upscaling a 1x1 image which is done
|
||||
a fair amount by some compositors to give solid colour, and it
|
||||
saves a large amount of LBM (TPZ is based on src size, whilst
|
||||
PPF is based on dest size).
|
||||
|
||||
Select TPZ filter for images with source rectangle <=1.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_plane.c | 21 +++++++++++++++------
|
||||
1 file changed, 15 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
@@ -265,7 +265,11 @@ static enum vc4_scaling_mode vc4_get_sca
|
||||
{
|
||||
if (dst == src >> 16)
|
||||
return VC4_SCALING_NONE;
|
||||
- if (3 * dst >= 2 * (src >> 16))
|
||||
+
|
||||
+ if (src <= (1 << 16))
|
||||
+ /* Source rectangle <= 1 pixel can use TPZ for resize/upscale */
|
||||
+ return VC4_SCALING_TPZ;
|
||||
+ else if (3 * dst >= 2 * (src >> 16))
|
||||
return VC4_SCALING_PPF;
|
||||
else
|
||||
return VC4_SCALING_TPZ;
|
||||
@@ -560,12 +564,17 @@ static void vc4_write_tpz(struct vc4_pla
|
||||
|
||||
WARN_ON_ONCE(vc4->gen > VC4_GEN_6);
|
||||
|
||||
- scale = src / dst;
|
||||
+ if ((dst << 16) < src) {
|
||||
+ scale = src / dst;
|
||||
|
||||
- /* The specs note that while the reciprocal would be defined
|
||||
- * as (1<<32)/scale, ~0 is close enough.
|
||||
- */
|
||||
- recip = ~0 / scale;
|
||||
+ /* The specs note that while the reciprocal would be defined
|
||||
+ * as (1<<32)/scale, ~0 is close enough.
|
||||
+ */
|
||||
+ recip = ~0 / scale;
|
||||
+ } else {
|
||||
+ scale = (1 << 16) + 1;
|
||||
+ recip = (1 << 16) - 1;
|
||||
+ }
|
||||
|
||||
vc4_dlist_write(vc4_state,
|
||||
/*
|
@ -0,0 +1,30 @@
|
||||
From 68b0ff3549148e614e1733d773cee8e689c763c6 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Tue, 20 Aug 2024 16:25:10 +0100
|
||||
Subject: [PATCH] drm: Set non-desktop property to true for writeback and
|
||||
virtual connectors
|
||||
|
||||
The non-desktop property "Indicates the output should be ignored for
|
||||
purposes of displaying a standard desktop environment or console."
|
||||
|
||||
That sounds like it should be true for all writeback and virtual
|
||||
connectors as you shouldn't render a desktop to them, so set it
|
||||
by default.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/drm_connector.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_connector.c
|
||||
+++ b/drivers/gpu/drm/drm_connector.c
|
||||
@@ -362,7 +362,8 @@ static int __drm_connector_init(struct d
|
||||
|
||||
drm_object_attach_property(&connector->base,
|
||||
config->non_desktop_property,
|
||||
- 0);
|
||||
+ (connector_type != DRM_MODE_CONNECTOR_VIRTUAL &&
|
||||
+ connector_type != DRM_MODE_CONNECTOR_WRITEBACK) ? 0 : 1;
|
||||
drm_object_attach_property(&connector->base,
|
||||
config->tile_property,
|
||||
0);
|
@ -0,0 +1,101 @@
|
||||
From 8181e682d6f4ef209845ec24f0a1eb37764d6731 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Fri, 21 Oct 2022 14:26:12 +0100
|
||||
Subject: [PATCH] drm: Increase plane_mask to 64bit.
|
||||
|
||||
The limit of 32 planes per DRM device is dictated by the use
|
||||
of planes_mask returning a u32.
|
||||
|
||||
Change to a u64 such that 64 planes can be supported by a device.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/drm_atomic.c | 2 +-
|
||||
drivers/gpu/drm/drm_framebuffer.c | 2 +-
|
||||
drivers/gpu/drm/drm_mode_config.c | 2 +-
|
||||
drivers/gpu/drm/drm_plane.c | 2 +-
|
||||
drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c | 2 +-
|
||||
include/drm/drm_crtc.h | 2 +-
|
||||
include/drm/drm_plane.h | 4 ++--
|
||||
7 files changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_atomic.c
|
||||
+++ b/drivers/gpu/drm/drm_atomic.c
|
||||
@@ -451,7 +451,7 @@ static void drm_atomic_crtc_print_state(
|
||||
drm_printf(p, "\tactive_changed=%d\n", state->active_changed);
|
||||
drm_printf(p, "\tconnectors_changed=%d\n", state->connectors_changed);
|
||||
drm_printf(p, "\tcolor_mgmt_changed=%d\n", state->color_mgmt_changed);
|
||||
- drm_printf(p, "\tplane_mask=%x\n", state->plane_mask);
|
||||
+ drm_printf(p, "\tplane_mask=%llx\n", state->plane_mask);
|
||||
drm_printf(p, "\tconnector_mask=%x\n", state->connector_mask);
|
||||
drm_printf(p, "\tencoder_mask=%x\n", state->encoder_mask);
|
||||
drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode));
|
||||
--- a/drivers/gpu/drm/drm_framebuffer.c
|
||||
+++ b/drivers/gpu/drm/drm_framebuffer.c
|
||||
@@ -959,7 +959,7 @@ static int atomic_remove_fb(struct drm_f
|
||||
struct drm_connector *conn __maybe_unused;
|
||||
struct drm_connector_state *conn_state;
|
||||
int i, ret;
|
||||
- unsigned plane_mask;
|
||||
+ u64 plane_mask;
|
||||
bool disable_crtcs = false;
|
||||
|
||||
retry_disable:
|
||||
--- a/drivers/gpu/drm/drm_mode_config.c
|
||||
+++ b/drivers/gpu/drm/drm_mode_config.c
|
||||
@@ -636,7 +636,7 @@ void drm_mode_config_validate(struct drm
|
||||
struct drm_encoder *encoder;
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_plane *plane;
|
||||
- u32 primary_with_crtc = 0, cursor_with_crtc = 0;
|
||||
+ u64 primary_with_crtc = 0, cursor_with_crtc = 0;
|
||||
unsigned int num_primary = 0;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
--- a/drivers/gpu/drm/drm_plane.c
|
||||
+++ b/drivers/gpu/drm/drm_plane.c
|
||||
@@ -249,7 +249,7 @@ static int __drm_universal_plane_init(st
|
||||
int ret;
|
||||
|
||||
/* plane index is used with 32bit bitmasks */
|
||||
- if (WARN_ON(config->num_total_plane >= 32))
|
||||
+ if (WARN_ON(config->num_total_plane >= 64))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
--- a/drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c
|
||||
+++ b/drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c
|
||||
@@ -230,7 +230,7 @@ static int ipu_crtc_atomic_check(struct
|
||||
{
|
||||
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
|
||||
crtc);
|
||||
- u32 primary_plane_mask = drm_plane_mask(crtc->primary);
|
||||
+ u64 primary_plane_mask = drm_plane_mask(crtc->primary);
|
||||
|
||||
if (crtc_state->active && (primary_plane_mask & crtc_state->plane_mask) == 0)
|
||||
return -EINVAL;
|
||||
--- a/include/drm/drm_crtc.h
|
||||
+++ b/include/drm/drm_crtc.h
|
||||
@@ -192,7 +192,7 @@ struct drm_crtc_state {
|
||||
* @plane_mask: Bitmask of drm_plane_mask(plane) of planes attached to
|
||||
* this CRTC.
|
||||
*/
|
||||
- u32 plane_mask;
|
||||
+ u64 plane_mask;
|
||||
|
||||
/**
|
||||
* @connector_mask: Bitmask of drm_connector_mask(connector) of
|
||||
--- a/include/drm/drm_plane.h
|
||||
+++ b/include/drm/drm_plane.h
|
||||
@@ -915,9 +915,9 @@ static inline unsigned int drm_plane_ind
|
||||
* drm_plane_mask - find the mask of a registered plane
|
||||
* @plane: plane to find mask for
|
||||
*/
|
||||
-static inline u32 drm_plane_mask(const struct drm_plane *plane)
|
||||
+static inline u64 drm_plane_mask(const struct drm_plane *plane)
|
||||
{
|
||||
- return 1 << drm_plane_index(plane);
|
||||
+ return 1ULL << drm_plane_index(plane);
|
||||
}
|
||||
|
||||
struct drm_plane * drm_plane_from_index(struct drm_device *dev, int idx);
|
@ -0,0 +1,42 @@
|
||||
From 5dc4cef7d7fcda4ea59b9e456a835fa54336af6b Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Fri, 21 Oct 2022 14:27:45 +0100
|
||||
Subject: [PATCH] drm/vc4: Increase number of overlay planes from 16 to 48
|
||||
|
||||
The HVS can accept an arbitrary number of planes, provided
|
||||
that the overall pixel read load is within limits, and
|
||||
the display list can fit into the dlist memory.
|
||||
|
||||
Now that DRM will support 64 planes per device, increase
|
||||
the number of overlay planes from 16 to 48 so that the
|
||||
dlist complexity can be increased (eg 4x4 video wall on
|
||||
each of 3 displays).
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/drm_connector.c | 2 +-
|
||||
drivers/gpu/drm/vc4/vc4_plane.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_connector.c
|
||||
+++ b/drivers/gpu/drm/drm_connector.c
|
||||
@@ -363,7 +363,7 @@ static int __drm_connector_init(struct d
|
||||
drm_object_attach_property(&connector->base,
|
||||
config->non_desktop_property,
|
||||
(connector_type != DRM_MODE_CONNECTOR_VIRTUAL &&
|
||||
- connector_type != DRM_MODE_CONNECTOR_WRITEBACK) ? 0 : 1;
|
||||
+ connector_type != DRM_MODE_CONNECTOR_WRITEBACK) ? 0 : 1);
|
||||
drm_object_attach_property(&connector->base,
|
||||
config->tile_property,
|
||||
0);
|
||||
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
@@ -2517,7 +2517,7 @@ struct drm_plane *vc4_plane_init(struct
|
||||
return plane;
|
||||
}
|
||||
|
||||
-#define VC4_NUM_OVERLAY_PLANES 16
|
||||
+#define VC4_NUM_OVERLAY_PLANES 48
|
||||
|
||||
int vc4_plane_create_additional_planes(struct drm_device *drm)
|
||||
{
|
@ -0,0 +1,71 @@
|
||||
From dd340cb082a020fbd42b794493ffd063dd8e15b4 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Tue, 15 Aug 2023 15:44:34 +0100
|
||||
Subject: [PATCH] drm/vc4: Assign 32 overlay planes to writeback only
|
||||
|
||||
Instead of having 48 generic overlay planes, assign 32 to the
|
||||
writeback connector so that there is no ambiguity in wlroots
|
||||
when trying to find a plane for composition using the writeback
|
||||
connector vs display.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_plane.c | 34 +++++++++++++++++++++++++++++++--
|
||||
1 file changed, 32 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
@@ -2517,13 +2517,28 @@ struct drm_plane *vc4_plane_init(struct
|
||||
return plane;
|
||||
}
|
||||
|
||||
-#define VC4_NUM_OVERLAY_PLANES 48
|
||||
+#define VC4_NUM_OVERLAY_PLANES 16
|
||||
+#define VC4_NUM_TXP_OVERLAY_PLANES 32
|
||||
|
||||
int vc4_plane_create_additional_planes(struct drm_device *drm)
|
||||
{
|
||||
struct drm_plane *cursor_plane;
|
||||
struct drm_crtc *crtc;
|
||||
unsigned int i;
|
||||
+ struct drm_crtc *txp_crtc;
|
||||
+ uint32_t non_txp_crtc_mask;
|
||||
+
|
||||
+ drm_for_each_crtc(crtc, drm) {
|
||||
+ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
|
||||
+
|
||||
+ if (vc4_crtc->feeds_txp) {
|
||||
+ txp_crtc = crtc;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ non_txp_crtc_mask = GENMASK(drm->mode_config.num_crtc - 1, 0) -
|
||||
+ drm_crtc_mask(txp_crtc);
|
||||
|
||||
/* Set up some arbitrary number of planes. We're not limited
|
||||
* by a set number of physical registers, just the space in
|
||||
@@ -2537,7 +2552,22 @@ int vc4_plane_create_additional_planes(s
|
||||
for (i = 0; i < VC4_NUM_OVERLAY_PLANES; i++) {
|
||||
struct drm_plane *plane =
|
||||
vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY,
|
||||
- GENMASK(drm->mode_config.num_crtc - 1, 0));
|
||||
+ non_txp_crtc_mask);
|
||||
+
|
||||
+ if (IS_ERR(plane))
|
||||
+ continue;
|
||||
+
|
||||
+ /* Create zpos property. Max of all the overlays + 1 primary +
|
||||
+ * 1 cursor plane on a crtc.
|
||||
+ */
|
||||
+ drm_plane_create_zpos_property(plane, i + 1, 1,
|
||||
+ VC4_NUM_OVERLAY_PLANES + 1);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < VC4_NUM_TXP_OVERLAY_PLANES; i++) {
|
||||
+ struct drm_plane *plane =
|
||||
+ vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY,
|
||||
+ drm_crtc_mask(txp_crtc));
|
||||
|
||||
if (IS_ERR(plane))
|
||||
continue;
|
@ -0,0 +1,47 @@
|
||||
From b3b3d12cf0734318a0fed0b33e13d714188369db Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Tue, 22 Oct 2024 17:17:31 +0100
|
||||
Subject: [PATCH] drm: Add a DRM_MODE_TRANSPOSE option to the DRM rotation
|
||||
property
|
||||
|
||||
Some hardware will implement transpose as a rotation operation,
|
||||
which when combined with X and Y reflect can result in a rotation,
|
||||
but is a discrete operation in its own right.
|
||||
|
||||
Add an option for transpose only.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/drm_blend.c | 3 +++
|
||||
include/uapi/drm/drm_mode.h | 1 +
|
||||
2 files changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_blend.c
|
||||
+++ b/drivers/gpu/drm/drm_blend.c
|
||||
@@ -263,6 +263,8 @@ EXPORT_SYMBOL(drm_plane_create_alpha_pro
|
||||
* "reflect-x"
|
||||
* DRM_MODE_REFLECT_Y:
|
||||
* "reflect-y"
|
||||
+ * DRM_MODE_TRANSPOSE:
|
||||
+ * "transpose"
|
||||
*
|
||||
* Rotation is the specified amount in degrees in counter clockwise direction,
|
||||
* the X and Y axis are within the source rectangle, i.e. the X/Y axis before
|
||||
@@ -280,6 +282,7 @@ int drm_plane_create_rotation_property(s
|
||||
{ __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" },
|
||||
{ __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" },
|
||||
{ __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" },
|
||||
+ { __builtin_ffs(DRM_MODE_TRANSPOSE) - 1, "transpose" },
|
||||
};
|
||||
struct drm_property *prop;
|
||||
|
||||
--- a/include/uapi/drm/drm_mode.h
|
||||
+++ b/include/uapi/drm/drm_mode.h
|
||||
@@ -203,6 +203,7 @@ extern "C" {
|
||||
*/
|
||||
#define DRM_MODE_REFLECT_X (1<<4)
|
||||
#define DRM_MODE_REFLECT_Y (1<<5)
|
||||
+#define DRM_MODE_TRANSPOSE (1<<6)
|
||||
|
||||
/*
|
||||
* DRM_MODE_REFLECT_MASK
|
@ -0,0 +1,164 @@
|
||||
From 8fec3ff870499256f2c18fe7983f6ed3fea4faaf Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Tue, 22 Oct 2024 17:22:40 +0100
|
||||
Subject: [PATCH] drm: Add a rotation parameter to connectors.
|
||||
|
||||
Some connectors, particularly writeback, can implement flip
|
||||
or transpose operations as writing back to memory.
|
||||
|
||||
Add a connector rotation property to control this.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/drm_atomic_uapi.c | 4 +++
|
||||
drivers/gpu/drm/drm_blend.c | 50 ++++++++++++++++++++++++-------
|
||||
include/drm/drm_blend.h | 5 ++++
|
||||
include/drm/drm_connector.h | 11 +++++++
|
||||
4 files changed, 60 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/drm_atomic_uapi.c
|
||||
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
|
||||
@@ -811,6 +811,8 @@ static int drm_atomic_connector_set_prop
|
||||
state->max_requested_bpc = val;
|
||||
} else if (property == connector->privacy_screen_sw_state_property) {
|
||||
state->privacy_screen_sw_state = val;
|
||||
+ } else if (property == connector->rotation_property) {
|
||||
+ state->rotation = val;
|
||||
} else if (connector->funcs->atomic_set_property) {
|
||||
return connector->funcs->atomic_set_property(connector,
|
||||
state, property, val);
|
||||
@@ -900,6 +902,8 @@ drm_atomic_connector_get_property(struct
|
||||
*val = state->max_requested_bpc;
|
||||
} else if (property == connector->privacy_screen_sw_state_property) {
|
||||
*val = state->privacy_screen_sw_state;
|
||||
+ } else if (property == connector->rotation_property) {
|
||||
+ *val = state->rotation;
|
||||
} else if (connector->funcs->atomic_get_property) {
|
||||
return connector->funcs->atomic_get_property(connector,
|
||||
state, property, val);
|
||||
--- a/drivers/gpu/drm/drm_blend.c
|
||||
+++ b/drivers/gpu/drm/drm_blend.c
|
||||
@@ -235,6 +235,16 @@ int drm_plane_create_alpha_property(stru
|
||||
}
|
||||
EXPORT_SYMBOL(drm_plane_create_alpha_property);
|
||||
|
||||
+static const struct drm_prop_enum_list drm_rotate_props[] = {
|
||||
+ { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" },
|
||||
+ { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" },
|
||||
+ { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" },
|
||||
+ { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" },
|
||||
+ { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" },
|
||||
+ { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" },
|
||||
+ { __builtin_ffs(DRM_MODE_TRANSPOSE) - 1, "transpose" },
|
||||
+};
|
||||
+
|
||||
/**
|
||||
* drm_plane_create_rotation_property - create a new rotation property
|
||||
* @plane: drm plane
|
||||
@@ -275,15 +285,6 @@ int drm_plane_create_rotation_property(s
|
||||
unsigned int rotation,
|
||||
unsigned int supported_rotations)
|
||||
{
|
||||
- static const struct drm_prop_enum_list props[] = {
|
||||
- { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" },
|
||||
- { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" },
|
||||
- { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" },
|
||||
- { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" },
|
||||
- { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" },
|
||||
- { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" },
|
||||
- { __builtin_ffs(DRM_MODE_TRANSPOSE) - 1, "transpose" },
|
||||
- };
|
||||
struct drm_property *prop;
|
||||
|
||||
WARN_ON((supported_rotations & DRM_MODE_ROTATE_MASK) == 0);
|
||||
@@ -291,7 +292,8 @@ int drm_plane_create_rotation_property(s
|
||||
WARN_ON(rotation & ~supported_rotations);
|
||||
|
||||
prop = drm_property_create_bitmask(plane->dev, 0, "rotation",
|
||||
- props, ARRAY_SIZE(props),
|
||||
+ drm_rotate_props,
|
||||
+ ARRAY_SIZE(drm_rotate_props),
|
||||
supported_rotations);
|
||||
if (!prop)
|
||||
return -ENOMEM;
|
||||
@@ -307,6 +309,34 @@ int drm_plane_create_rotation_property(s
|
||||
}
|
||||
EXPORT_SYMBOL(drm_plane_create_rotation_property);
|
||||
|
||||
+int drm_connector_create_rotation_property(struct drm_connector *conn,
|
||||
+ unsigned int rotation,
|
||||
+ unsigned int supported_rotations)
|
||||
+{
|
||||
+ struct drm_property *prop;
|
||||
+
|
||||
+ WARN_ON((supported_rotations & DRM_MODE_ROTATE_MASK) == 0);
|
||||
+ WARN_ON(!is_power_of_2(rotation & DRM_MODE_ROTATE_MASK));
|
||||
+ WARN_ON(rotation & ~supported_rotations);
|
||||
+
|
||||
+ prop = drm_property_create_bitmask(conn->dev, 0, "rotation",
|
||||
+ drm_rotate_props,
|
||||
+ ARRAY_SIZE(drm_rotate_props),
|
||||
+ supported_rotations);
|
||||
+ if (!prop)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ drm_object_attach_property(&conn->base, prop, rotation);
|
||||
+
|
||||
+ if (conn->state)
|
||||
+ conn->state->rotation = rotation;
|
||||
+
|
||||
+ conn->rotation_property = prop;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(drm_connector_create_rotation_property);
|
||||
+
|
||||
/**
|
||||
* drm_rotation_simplify() - Try to simplify the rotation
|
||||
* @rotation: Rotation to be simplified
|
||||
--- a/include/drm/drm_blend.h
|
||||
+++ b/include/drm/drm_blend.h
|
||||
@@ -34,6 +34,7 @@
|
||||
struct drm_device;
|
||||
struct drm_atomic_state;
|
||||
struct drm_plane;
|
||||
+struct drm_connector;
|
||||
|
||||
static inline bool drm_rotation_90_or_270(unsigned int rotation)
|
||||
{
|
||||
@@ -58,4 +59,8 @@ int drm_atomic_normalize_zpos(struct drm
|
||||
struct drm_atomic_state *state);
|
||||
int drm_plane_create_blend_mode_property(struct drm_plane *plane,
|
||||
unsigned int supported_modes);
|
||||
+
|
||||
+int drm_connector_create_rotation_property(struct drm_connector *conn,
|
||||
+ unsigned int rotation,
|
||||
+ unsigned int supported_rotations);
|
||||
#endif
|
||||
--- a/include/drm/drm_connector.h
|
||||
+++ b/include/drm/drm_connector.h
|
||||
@@ -1029,6 +1029,11 @@ struct drm_connector_state {
|
||||
* DRM blob property for HDR output metadata
|
||||
*/
|
||||
struct drm_property_blob *hdr_output_metadata;
|
||||
+
|
||||
+ /**
|
||||
+ * @rotation: Connector property to rotate the maximum output image.
|
||||
+ */
|
||||
+ u32 rotation;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1696,6 +1701,12 @@ struct drm_connector {
|
||||
*/
|
||||
struct drm_property *privacy_screen_hw_state_property;
|
||||
|
||||
+ /**
|
||||
+ * @rotation_property: Optional DRM property controlling rotation of the
|
||||
+ * output.
|
||||
+ */
|
||||
+ struct drm_property *rotation_property;
|
||||
+
|
||||
#define DRM_CONNECTOR_POLL_HPD (1 << 0)
|
||||
#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
|
||||
#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
|
@ -0,0 +1,65 @@
|
||||
From 8346446098032c62d1de891a97c7f62264b18f81 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Wed, 14 Aug 2024 16:41:07 +0100
|
||||
Subject: [PATCH] drm/vc4: txp: Add a rotation property to the writeback
|
||||
connector
|
||||
|
||||
The txp block can implement transpose as it writes out the image
|
||||
data, so expose that through the new connector rotation property.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_txp.c | 21 +++++++++++++++++----
|
||||
1 file changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/vc4/vc4_txp.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
+#include <drm/drm_blend.h>
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/drm_edid.h>
|
||||
#include <drm/drm_fb_dma_helper.h>
|
||||
@@ -259,10 +260,15 @@ static int vc4_txp_connector_atomic_chec
|
||||
crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
|
||||
|
||||
fb = conn_state->writeback_job->fb;
|
||||
- if (fb->width != crtc_state->mode.hdisplay ||
|
||||
- fb->height != crtc_state->mode.vdisplay) {
|
||||
- DRM_DEBUG_KMS("Invalid framebuffer size %ux%u\n",
|
||||
- fb->width, fb->height);
|
||||
+ if ((conn_state->rotation == DRM_MODE_ROTATE_0 &&
|
||||
+ fb->width != crtc_state->mode.hdisplay &&
|
||||
+ fb->height != crtc_state->mode.vdisplay) ||
|
||||
+ (conn_state->rotation == (DRM_MODE_ROTATE_0 | DRM_MODE_TRANSPOSE) &&
|
||||
+ fb->width != crtc_state->mode.vdisplay &&
|
||||
+ fb->height != crtc_state->mode.hdisplay)) {
|
||||
+ DRM_DEBUG_KMS("Invalid framebuffer size %ux%u vs mode %ux%u\n",
|
||||
+ fb->width, fb->height,
|
||||
+ crtc_state->mode.hdisplay, crtc_state->mode.vdisplay);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -330,6 +336,9 @@ static void vc4_txp_connector_atomic_com
|
||||
*/
|
||||
ctrl |= TXP_ALPHA_INVERT;
|
||||
|
||||
+ if (conn_state->rotation & DRM_MODE_TRANSPOSE)
|
||||
+ ctrl |= TXP_TRANSPOSE;
|
||||
+
|
||||
if (!drm_dev_enter(drm, &idx))
|
||||
return;
|
||||
|
||||
@@ -608,6 +617,10 @@ static int vc4_txp_bind(struct device *d
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ drm_connector_create_rotation_property(&txp->connector.base, DRM_MODE_ROTATE_0,
|
||||
+ DRM_MODE_ROTATE_0 |
|
||||
+ DRM_MODE_TRANSPOSE);
|
||||
+
|
||||
ret = devm_request_irq(dev, irq, vc4_txp_interrupt, 0,
|
||||
dev_name(dev), txp);
|
||||
if (ret)
|
@ -0,0 +1,40 @@
|
||||
From a2fa911d90495762047c05dec4241308ae61ca36 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Thu, 19 Sep 2024 18:05:00 +0100
|
||||
Subject: [PATCH] dmaengine: dw-axi-dmac: Allow client-chosen width
|
||||
|
||||
For devices where transfer lengths are not known upfront, there is a
|
||||
danger when the destination is wider than the source that partial words
|
||||
can be lost at the end of a transfer. Ideally the controller would be
|
||||
able to flush the residue, but it can't - it's not even possible to tell
|
||||
that there is any.
|
||||
|
||||
Instead, allow the client driver to avoid the problem by setting a
|
||||
smaller width.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
|
||||
+++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
|
||||
@@ -724,6 +724,18 @@ static int dw_axi_dma_set_hw_desc(struct
|
||||
case DMA_DEV_TO_MEM:
|
||||
reg_burst_msize = axi_dma_encode_msize(chan->config.src_maxburst);
|
||||
reg_width = __ffs(chan->config.src_addr_width);
|
||||
+ /*
|
||||
+ * For devices where transfer lengths are not known upfront,
|
||||
+ * there is a danger when the destination is wider than the
|
||||
+ * source that partial words can be lost at the end of a transfer.
|
||||
+ * Ideally the controller would be able to flush the residue, but
|
||||
+ * it can't - it's not even possible to tell that there is any.
|
||||
+ * Instead, allow the client driver to avoid the problem by setting
|
||||
+ * a smaller width.
|
||||
+ */
|
||||
+ if (chan->config.dst_addr_width &&
|
||||
+ (chan->config.dst_addr_width < mem_width))
|
||||
+ mem_width = chan->config.dst_addr_width;
|
||||
device_addr = phys_to_dma(chan->chip->dev, chan->config.src_addr);
|
||||
ctllo = reg_width << CH_CTL_L_SRC_WIDTH_POS |
|
||||
mem_width << CH_CTL_L_DST_WIDTH_POS |
|
@ -0,0 +1,31 @@
|
||||
From 5cf7209c294a58029984880d4858e2d3c7e46a3c Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Thu, 19 Sep 2024 18:12:12 +0100
|
||||
Subject: [PATCH] spi: dw: Let the DMAC set the transfer widths
|
||||
|
||||
SPI transfers are of defined length, unlike some UART traffic, so it is
|
||||
safe to let the DMA controller choose a suitable memory width.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
drivers/spi/spi-dw-dma.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/spi/spi-dw-dma.c
|
||||
+++ b/drivers/spi/spi-dw-dma.c
|
||||
@@ -330,7 +330,6 @@ static int dw_spi_dma_config_tx(struct d
|
||||
txconf.direction = DMA_MEM_TO_DEV;
|
||||
txconf.dst_addr = dws->dma_addr;
|
||||
txconf.dst_maxburst = dws->txburst;
|
||||
- txconf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
txconf.dst_addr_width = dw_spi_dma_convert_width(dws->n_bytes);
|
||||
txconf.device_fc = false;
|
||||
|
||||
@@ -431,7 +430,6 @@ static int dw_spi_dma_config_rx(struct d
|
||||
rxconf.direction = DMA_DEV_TO_MEM;
|
||||
rxconf.src_addr = dws->dma_addr;
|
||||
rxconf.src_maxburst = dws->rxburst;
|
||||
- rxconf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
rxconf.src_addr_width = dw_spi_dma_convert_width(dws->n_bytes);
|
||||
rxconf.device_fc = false;
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 8894298105f4cb41dfa41e0b0d3c40c3f7b92c44 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Thu, 19 Sep 2024 18:22:24 +0100
|
||||
Subject: [PATCH] serial: pl011: Request a memory width of 1 byte
|
||||
|
||||
In order to avoid losing residue bytes when a receive is terminated
|
||||
early, set the destination width to single bytes.
|
||||
|
||||
Link: https://github.com/raspberrypi/linux/issues/6365
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
drivers/tty/serial/amba-pl011.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/tty/serial/amba-pl011.c
|
||||
+++ b/drivers/tty/serial/amba-pl011.c
|
||||
@@ -468,6 +468,7 @@ static void pl011_dma_probe(struct uart_
|
||||
.src_addr = uap->port.mapbase +
|
||||
pl011_reg_to_offset(uap, REG_DR),
|
||||
.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE,
|
||||
+ .dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE,
|
||||
.direction = DMA_DEV_TO_MEM,
|
||||
.src_maxburst = uap->fifosize >> 2,
|
||||
.device_fc = false,
|
@ -0,0 +1,56 @@
|
||||
From 66aef6ce3557edd9d58d794e4a800c5be49ca0e7 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
Date: Mon, 11 Nov 2024 10:30:38 +0000
|
||||
Subject: [PATCH] drivers: usb: xhci: set HID bit in streaming endpoint
|
||||
contexts
|
||||
|
||||
The xHC may commence Host Initiated Data Moves for streaming endpoints -
|
||||
see USB3.2 spec s8.12.1.4.2.4. However, this behaviour is typically
|
||||
counterproductive as the submission of UAS URBs in {Status, Data,
|
||||
Command} order and 1 outstanding IO per stream ID means the device never
|
||||
enters Move Data after a HIMD for Status or Data stages with the same
|
||||
stream ID. For OUT transfers this is especially inefficient as the host
|
||||
will start transmitting multiple bulk packets as a burst, all of which
|
||||
get NAKed by the device - wasting bandwidth.
|
||||
|
||||
Also, some buggy UAS adapters don't properly handle the EP flow control
|
||||
state this creates - e.g. RTL9210.
|
||||
|
||||
Set Host Initiated Data Move Disable to always defer stream selection to
|
||||
the device. xHC implementations may treat this field as "don't care,
|
||||
forced to 1" anyway - xHCI 1.2 s4.12.1.
|
||||
|
||||
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
---
|
||||
drivers/usb/host/xhci-mem.c | 8 ++++++++
|
||||
drivers/usb/host/xhci.h | 2 ++
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/usb/host/xhci-mem.c
|
||||
+++ b/drivers/usb/host/xhci-mem.c
|
||||
@@ -716,6 +716,14 @@ void xhci_setup_streams_ep_input_ctx(str
|
||||
ep_ctx->ep_info &= cpu_to_le32(~EP_MAXPSTREAMS_MASK);
|
||||
ep_ctx->ep_info |= cpu_to_le32(EP_MAXPSTREAMS(max_primary_streams)
|
||||
| EP_HAS_LSA);
|
||||
+
|
||||
+ /*
|
||||
+ * Set Host Initiated Data Move Disable to always defer stream
|
||||
+ * selection to the device. xHC implementations may treat this
|
||||
+ * field as "don't care, forced to 1" anyway - xHCI 1.2 s4.12.1.
|
||||
+ */
|
||||
+ ep_ctx->ep_info2 |= EP_HID;
|
||||
+
|
||||
ep_ctx->deq = cpu_to_le64(stream_info->ctx_array_dma);
|
||||
}
|
||||
|
||||
--- a/drivers/usb/host/xhci.h
|
||||
+++ b/drivers/usb/host/xhci.h
|
||||
@@ -492,6 +492,8 @@ struct xhci_ep_ctx {
|
||||
#define CTX_TO_EP_MAXPSTREAMS(p) (((p) & EP_MAXPSTREAMS_MASK) >> 10)
|
||||
/* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */
|
||||
#define EP_HAS_LSA (1 << 15)
|
||||
+/* Host initiated data move disable in info2 */
|
||||
+#define EP_HID (1 << 7)
|
||||
/* hosts with LEC=1 use bits 31:24 as ESIT high bits. */
|
||||
#define CTX_TO_MAX_ESIT_PAYLOAD_HI(p) (((p) >> 24) & 0xff)
|
||||
|
@ -0,0 +1,199 @@
|
||||
From 35e50ee3d66e014d869f0d7a3468bef964d26d32 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Thu, 14 Nov 2024 13:14:02 +0000
|
||||
Subject: [PATCH] media: i2c: imx477: Add options for slightly modifying the
|
||||
link freq
|
||||
|
||||
The default link frequency of 450MHz has been noted to interfere
|
||||
with GPS if they are in close proximty.
|
||||
Add the option for 453 and 456MHz to move the signal slightly out
|
||||
of the band. (447MHz can not be offered as corruption is then observed
|
||||
on the 133x992 10bit mode).
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
fixup imx477 gps
|
||||
---
|
||||
drivers/media/i2c/imx477.c | 86 +++++++++++++++++++++++++++++---------
|
||||
1 file changed, 67 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/media/i2c/imx477.c
|
||||
+++ b/drivers/media/i2c/imx477.c
|
||||
@@ -164,8 +164,48 @@ struct imx477_mode {
|
||||
struct imx477_reg_list reg_list;
|
||||
};
|
||||
|
||||
-static const s64 imx477_link_freq_menu[] = {
|
||||
- IMX477_DEFAULT_LINK_FREQ,
|
||||
+/* Link frequency setup */
|
||||
+enum {
|
||||
+ IMX477_LINK_FREQ_450MHZ,
|
||||
+ IMX477_LINK_FREQ_453MHZ,
|
||||
+ IMX477_LINK_FREQ_456MHZ,
|
||||
+};
|
||||
+
|
||||
+static const s64 link_freqs[] = {
|
||||
+ [IMX477_LINK_FREQ_450MHZ] = 450000000,
|
||||
+ [IMX477_LINK_FREQ_453MHZ] = 453000000,
|
||||
+ [IMX477_LINK_FREQ_456MHZ] = 456000000,
|
||||
+};
|
||||
+
|
||||
+/* 450MHz is the nominal "default" link frequency */
|
||||
+static const struct imx477_reg link_450Mhz_regs[] = {
|
||||
+ {0x030E, 0x00},
|
||||
+ {0x030F, 0x96},
|
||||
+};
|
||||
+
|
||||
+static const struct imx477_reg link_453Mhz_regs[] = {
|
||||
+ {0x030E, 0x00},
|
||||
+ {0x030F, 0x97},
|
||||
+};
|
||||
+
|
||||
+static const struct imx477_reg link_456Mhz_regs[] = {
|
||||
+ {0x030E, 0x00},
|
||||
+ {0x030F, 0x98},
|
||||
+};
|
||||
+
|
||||
+static const struct imx477_reg_list link_freq_regs[] = {
|
||||
+ [IMX477_LINK_FREQ_450MHZ] = {
|
||||
+ .regs = link_450Mhz_regs,
|
||||
+ .num_of_regs = ARRAY_SIZE(link_450Mhz_regs)
|
||||
+ },
|
||||
+ [IMX477_LINK_FREQ_453MHZ] = {
|
||||
+ .regs = link_453Mhz_regs,
|
||||
+ .num_of_regs = ARRAY_SIZE(link_453Mhz_regs)
|
||||
+ },
|
||||
+ [IMX477_LINK_FREQ_456MHZ] = {
|
||||
+ .regs = link_456Mhz_regs,
|
||||
+ .num_of_regs = ARRAY_SIZE(link_456Mhz_regs)
|
||||
+ },
|
||||
};
|
||||
|
||||
static const struct imx477_reg mode_common_regs[] = {
|
||||
@@ -558,8 +598,6 @@ static const struct imx477_reg mode_4056
|
||||
{0x0309, 0x0c},
|
||||
{0x030b, 0x02},
|
||||
{0x030d, 0x02},
|
||||
- {0x030e, 0x00},
|
||||
- {0x030f, 0x96},
|
||||
{0x0310, 0x01},
|
||||
{0x0820, 0x07},
|
||||
{0x0821, 0x08},
|
||||
@@ -659,8 +697,6 @@ static const struct imx477_reg mode_2028
|
||||
{0x0309, 0x0c},
|
||||
{0x030b, 0x02},
|
||||
{0x030d, 0x02},
|
||||
- {0x030e, 0x00},
|
||||
- {0x030f, 0x96},
|
||||
{0x0310, 0x01},
|
||||
{0x0820, 0x07},
|
||||
{0x0821, 0x08},
|
||||
@@ -760,8 +796,6 @@ static const struct imx477_reg mode_2028
|
||||
{0x0309, 0x0c},
|
||||
{0x030b, 0x02},
|
||||
{0x030d, 0x02},
|
||||
- {0x030e, 0x00},
|
||||
- {0x030f, 0x96},
|
||||
{0x0310, 0x01},
|
||||
{0x0820, 0x07},
|
||||
{0x0821, 0x08},
|
||||
@@ -890,8 +924,6 @@ static const struct imx477_reg mode_1332
|
||||
{0x0309, 0x0a},
|
||||
{0x030b, 0x02},
|
||||
{0x030d, 0x02},
|
||||
- {0x030e, 0x00},
|
||||
- {0x030f, 0x96},
|
||||
{0x0310, 0x01},
|
||||
{0x0820, 0x07},
|
||||
{0x0821, 0x08},
|
||||
@@ -1121,6 +1153,8 @@ struct imx477 {
|
||||
struct v4l2_ctrl *vblank;
|
||||
struct v4l2_ctrl *hblank;
|
||||
|
||||
+ unsigned int link_freq_idx;
|
||||
+
|
||||
/* Current mode */
|
||||
const struct imx477_mode *mode;
|
||||
|
||||
@@ -1712,7 +1746,7 @@ static int imx477_get_selection(struct v
|
||||
static int imx477_start_streaming(struct imx477 *imx477)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&imx477->sd);
|
||||
- const struct imx477_reg_list *reg_list;
|
||||
+ const struct imx477_reg_list *reg_list, *freq_regs;
|
||||
const struct imx477_reg_list *extra_regs;
|
||||
int ret, tm;
|
||||
|
||||
@@ -1725,6 +1759,13 @@ static int imx477_start_streaming(struct
|
||||
extra_regs->num_of_regs);
|
||||
}
|
||||
|
||||
+ if (!ret) {
|
||||
+ /* Update the link frequency registers */
|
||||
+ freq_regs = &link_freq_regs[imx477->link_freq_idx];
|
||||
+ ret = imx477_write_regs(imx477, freq_regs->regs,
|
||||
+ freq_regs->num_of_regs);
|
||||
+ }
|
||||
+
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "%s failed to set common settings\n",
|
||||
__func__);
|
||||
@@ -2010,9 +2051,8 @@ static int imx477_init_controls(struct i
|
||||
/* LINK_FREQ is also read only */
|
||||
imx477->link_freq =
|
||||
v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx477_ctrl_ops,
|
||||
- V4L2_CID_LINK_FREQ,
|
||||
- ARRAY_SIZE(imx477_link_freq_menu) - 1, 0,
|
||||
- imx477_link_freq_menu);
|
||||
+ V4L2_CID_LINK_FREQ, 1, 0,
|
||||
+ &link_freqs[imx477->link_freq_idx]);
|
||||
if (imx477->link_freq)
|
||||
imx477->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
|
||||
@@ -2110,13 +2150,14 @@ static void imx477_free_controls(struct
|
||||
mutex_destroy(&imx477->mutex);
|
||||
}
|
||||
|
||||
-static int imx477_check_hwcfg(struct device *dev)
|
||||
+static int imx477_check_hwcfg(struct device *dev, struct imx477 *imx477)
|
||||
{
|
||||
struct fwnode_handle *endpoint;
|
||||
struct v4l2_fwnode_endpoint ep_cfg = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY
|
||||
};
|
||||
int ret = -EINVAL;
|
||||
+ int i;
|
||||
|
||||
endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
|
||||
if (!endpoint) {
|
||||
@@ -2141,11 +2182,18 @@ static int imx477_check_hwcfg(struct dev
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
- if (ep_cfg.nr_of_link_frequencies != 1 ||
|
||||
- ep_cfg.link_frequencies[0] != IMX477_DEFAULT_LINK_FREQ) {
|
||||
+ for (i = 0; i < ARRAY_SIZE(link_freqs); i++) {
|
||||
+ if (link_freqs[i] == ep_cfg.link_frequencies[0]) {
|
||||
+ imx477->link_freq_idx = i;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (i == ARRAY_SIZE(link_freqs)) {
|
||||
dev_err(dev, "Link frequency not supported: %lld\n",
|
||||
ep_cfg.link_frequencies[0]);
|
||||
- goto error_out;
|
||||
+ ret = -EINVAL;
|
||||
+ goto error_out;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
@@ -2206,7 +2254,7 @@ static int imx477_probe(struct i2c_clien
|
||||
(const struct imx477_compatible_data *)match->data;
|
||||
|
||||
/* Check the hardware configuration in device tree */
|
||||
- if (imx477_check_hwcfg(dev))
|
||||
+ if (imx477_check_hwcfg(dev, imx477))
|
||||
return -EINVAL;
|
||||
|
||||
/* Default the trigger mode from OF to -1, which means invalid */
|
@ -0,0 +1,43 @@
|
||||
From 7e253a062d5a14de13ccfb410570975099c238be Mon Sep 17 00:00:00 2001
|
||||
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
Date: Thu, 14 Nov 2024 13:15:24 +0000
|
||||
Subject: [PATCH] dtoverlays: Add link-frequency override to imx477/378 overlay
|
||||
|
||||
Copy of the imx708 change.
|
||||
|
||||
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
---
|
||||
arch/arm/boot/dts/overlays/README | 4 ++++
|
||||
arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi | 1 +
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/overlays/README
|
||||
+++ b/arch/arm/boot/dts/overlays/README
|
||||
@@ -2780,6 +2780,8 @@ Params: rotation Mounting
|
||||
camera clamping I/Os such as XVS to 0V.
|
||||
sync-source Configure as vsync source
|
||||
sync-sink Configure as vsync sink
|
||||
+ link-frequency Allowable link frequency values to use in Hz:
|
||||
+ 450000000 (default), 453000000, 456000000.
|
||||
|
||||
|
||||
Name: imx462
|
||||
@@ -2822,6 +2824,8 @@ Params: rotation Mounting
|
||||
camera clamping I/Os such as XVS to 0V.
|
||||
sync-source Configure as vsync source
|
||||
sync-sink Configure as vsync sink
|
||||
+ link-frequency Allowable link frequency values to use in Hz:
|
||||
+ 450000000 (default), 453000000, 456000000.
|
||||
|
||||
|
||||
Name: imx500
|
||||
--- a/arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi
|
||||
+++ b/arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi
|
||||
@@ -80,6 +80,7 @@
|
||||
<&cam_node>, "clocks:0=",<&cam0_clk>,
|
||||
<&cam_node>, "VANA-supply:0=",<&cam0_reg>;
|
||||
always-on = <0>, "+99";
|
||||
+ link-frequency = <&cam_endpoint>,"link-frequencies#0";
|
||||
};
|
||||
};
|
||||
|
@ -0,0 +1,29 @@
|
||||
From 59a8855b51c1d8acf37d3c80f34782d71f474617 Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Wed, 13 Nov 2024 10:37:22 +0000
|
||||
Subject: [PATCH] dmaengine: dw-axi-dmac: Only start idle channels
|
||||
|
||||
Attempting to start a non-idle channel causes an error message to be
|
||||
logged, and is inefficient. Test for emptiness of the desc_issued list
|
||||
before doing so.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
|
||||
+++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
|
||||
@@ -536,9 +536,11 @@ static void dma_chan_issue_pending(struc
|
||||
{
|
||||
struct axi_dma_chan *chan = dchan_to_axi_dma_chan(dchan);
|
||||
unsigned long flags;
|
||||
+ bool was_empty;
|
||||
|
||||
spin_lock_irqsave(&chan->vc.lock, flags);
|
||||
- if (vchan_issue_pending(&chan->vc))
|
||||
+ was_empty = list_empty(&chan->vc.desc_issued);
|
||||
+ if (vchan_issue_pending(&chan->vc) && was_empty)
|
||||
axi_chan_start_first_queued(chan);
|
||||
spin_unlock_irqrestore(&chan->vc.lock, flags);
|
||||
}
|
@ -0,0 +1,252 @@
|
||||
From 0d58d8cfb6f989f290d983552fcaa116e582e84a Mon Sep 17 00:00:00 2001
|
||||
From: Phil Elwell <phil@raspberrypi.com>
|
||||
Date: Thu, 31 Oct 2024 17:33:38 +0000
|
||||
Subject: [PATCH] mailbox: Add RP1 mailbox support
|
||||
|
||||
The Raspberry Pi RP1 includes 2 M3 cores running firmware. This driver
|
||||
adds a mailbox communication channel to them via a doorbell and some
|
||||
shared memory.
|
||||
|
||||
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
---
|
||||
drivers/mailbox/Kconfig | 9 ++
|
||||
drivers/mailbox/Makefile | 2 +
|
||||
drivers/mailbox/rp1-mailbox.c | 208 ++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 219 insertions(+)
|
||||
create mode 100644 drivers/mailbox/rp1-mailbox.c
|
||||
|
||||
--- a/drivers/mailbox/Kconfig
|
||||
+++ b/drivers/mailbox/Kconfig
|
||||
@@ -295,4 +295,13 @@ config QCOM_IPCC
|
||||
acts as an interrupt controller for receiving interrupts from clients.
|
||||
Say Y here if you want to build this driver.
|
||||
|
||||
+config MBOX_RP1
|
||||
+ tristate "RP1 Mailbox"
|
||||
+ depends on MFD_RP1
|
||||
+ help
|
||||
+ An implementation of a mailbox interface to the Raspberry Pi RP1 I/O
|
||||
+ interface. Although written as a mailbox driver, the hardware only
|
||||
+ provides an array of 32 doorbells.
|
||||
+ Say Y here if you want to use the RP1 Mailbox.
|
||||
+
|
||||
endif
|
||||
--- a/drivers/mailbox/Makefile
|
||||
+++ b/drivers/mailbox/Makefile
|
||||
@@ -62,3 +62,5 @@ obj-$(CONFIG_SPRD_MBOX) += sprd-mailbox
|
||||
obj-$(CONFIG_QCOM_IPCC) += qcom-ipcc.o
|
||||
|
||||
obj-$(CONFIG_APPLE_MAILBOX) += apple-mailbox.o
|
||||
+
|
||||
+obj-$(CONFIG_MBOX_RP1) += rp1-mailbox.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/mailbox/rp1-mailbox.c
|
||||
@@ -0,0 +1,208 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Copyright (C) 2023 Raspberry Pi Ltd.
|
||||
+ *
|
||||
+ * Parts of this driver are based on:
|
||||
+ * - bcm2835-mailbox.c
|
||||
+ * Copyright (C) 2010,2015 Broadcom
|
||||
+ * Copyright (C) 2013-2014 Lubomir Rintel
|
||||
+ * Copyright (C) 2013 Craig McGeachie
|
||||
+ */
|
||||
+
|
||||
+#include <linux/compat.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/mailbox_controller.h>
|
||||
+#include <linux/miscdevice.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+/*
|
||||
+ * RP1's PROC_EVENTS register can generate interrupts on the M3 cores (when
|
||||
+ * enabled). The 32-bit register is treated as 32 events, all of which share a
|
||||
+ * common interrupt. HOST_EVENTS is the same in the reverse direction.
|
||||
+ */
|
||||
+#define SYSCFG_PROC_EVENTS 0x00000008
|
||||
+#define SYSCFG_HOST_EVENTS 0x0000000c
|
||||
+#define SYSCFG_HOST_EVENT_IRQ_EN 0x00000010
|
||||
+#define SYSCFG_HOST_EVENT_IRQ 0x00000014
|
||||
+
|
||||
+#define HW_SET_BITS 0x00002000
|
||||
+#define HW_CLR_BITS 0x00003000
|
||||
+
|
||||
+#define MAX_CHANS 4 /* 32 is the hardware limit */
|
||||
+
|
||||
+struct rp1_mbox {
|
||||
+ void __iomem *regs;
|
||||
+ unsigned int irq;
|
||||
+ struct mbox_controller controller;
|
||||
+};
|
||||
+
|
||||
+static struct rp1_mbox *rp1_chan_mbox(struct mbox_chan *chan)
|
||||
+{
|
||||
+ return container_of(chan->mbox, struct rp1_mbox, controller);
|
||||
+}
|
||||
+
|
||||
+static unsigned int rp1_chan_event(struct mbox_chan *chan)
|
||||
+{
|
||||
+ return (unsigned int)(uintptr_t)chan->con_priv;
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t rp1_mbox_irq(int irq, void *dev_id)
|
||||
+{
|
||||
+ struct rp1_mbox *mbox = dev_id;
|
||||
+ struct mbox_chan *chan;
|
||||
+ unsigned int doorbell;
|
||||
+ unsigned int evs;
|
||||
+
|
||||
+ evs = readl(mbox->regs + SYSCFG_HOST_EVENT_IRQ);
|
||||
+ writel(evs, mbox->regs + SYSCFG_HOST_EVENTS + HW_CLR_BITS);
|
||||
+
|
||||
+ while (evs) {
|
||||
+ doorbell = __ffs(evs);
|
||||
+ chan = &mbox->controller.chans[doorbell];
|
||||
+ mbox_chan_received_data(chan, NULL);
|
||||
+ evs &= ~(1 << doorbell);
|
||||
+ }
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static int rp1_send_data(struct mbox_chan *chan, void *data)
|
||||
+{
|
||||
+ struct rp1_mbox *mbox = rp1_chan_mbox(chan);
|
||||
+ unsigned int event = rp1_chan_event(chan);
|
||||
+
|
||||
+ writel(event, mbox->regs + SYSCFG_PROC_EVENTS + HW_SET_BITS);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int rp1_startup(struct mbox_chan *chan)
|
||||
+{
|
||||
+ struct rp1_mbox *mbox = rp1_chan_mbox(chan);
|
||||
+ unsigned int event = rp1_chan_event(chan);
|
||||
+
|
||||
+ writel(event, mbox->regs + SYSCFG_HOST_EVENT_IRQ_EN + HW_SET_BITS);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void rp1_shutdown(struct mbox_chan *chan)
|
||||
+{
|
||||
+ struct rp1_mbox *mbox = rp1_chan_mbox(chan);
|
||||
+ unsigned int event = rp1_chan_event(chan);
|
||||
+
|
||||
+ writel(event, mbox->regs + SYSCFG_HOST_EVENT_IRQ_EN + HW_CLR_BITS);
|
||||
+}
|
||||
+
|
||||
+static bool rp1_last_tx_done(struct mbox_chan *chan)
|
||||
+{
|
||||
+ struct rp1_mbox *mbox = rp1_chan_mbox(chan);
|
||||
+ unsigned int event = rp1_chan_event(chan);
|
||||
+ unsigned int evs;
|
||||
+
|
||||
+ evs = readl(mbox->regs + SYSCFG_HOST_EVENT_IRQ);
|
||||
+
|
||||
+ return !(evs & event);
|
||||
+}
|
||||
+
|
||||
+static const struct mbox_chan_ops rp1_mbox_chan_ops = {
|
||||
+ .send_data = rp1_send_data,
|
||||
+ .startup = rp1_startup,
|
||||
+ .shutdown = rp1_shutdown,
|
||||
+ .last_tx_done = rp1_last_tx_done
|
||||
+};
|
||||
+
|
||||
+static struct mbox_chan *rp1_mbox_xlate(struct mbox_controller *mbox,
|
||||
+ const struct of_phandle_args *spec)
|
||||
+{
|
||||
+ struct mbox_chan *chan;
|
||||
+ unsigned int doorbell;
|
||||
+
|
||||
+ if (spec->args_count != 1)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ doorbell = spec->args[0];
|
||||
+ if (doorbell >= MAX_CHANS)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ chan = &mbox->chans[doorbell];
|
||||
+ if (chan->con_priv)
|
||||
+ return ERR_PTR(-EBUSY);
|
||||
+
|
||||
+ chan->con_priv = (void *)(uintptr_t)(1 << doorbell);
|
||||
+
|
||||
+ return chan;
|
||||
+}
|
||||
+
|
||||
+static int rp1_mbox_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct mbox_chan *chans;
|
||||
+ struct rp1_mbox *mbox;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ mbox = devm_kzalloc(dev, sizeof(*mbox), GFP_KERNEL);
|
||||
+ if (mbox == NULL)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
|
||||
+ rp1_mbox_irq, 0, dev_name(dev), mbox);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "Failed to register a mailbox IRQ handler: %d\n",
|
||||
+ ret);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ mbox->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
+ if (IS_ERR(mbox->regs)) {
|
||||
+ ret = PTR_ERR(mbox->regs);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ chans = devm_kcalloc(dev, MAX_CHANS, sizeof(*chans), GFP_KERNEL);
|
||||
+ if (!chans)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ mbox->controller.txdone_poll = true;
|
||||
+ mbox->controller.txpoll_period = 5;
|
||||
+ mbox->controller.ops = &rp1_mbox_chan_ops;
|
||||
+ mbox->controller.of_xlate = &rp1_mbox_xlate;
|
||||
+ mbox->controller.dev = dev;
|
||||
+ mbox->controller.num_chans = MAX_CHANS;
|
||||
+ mbox->controller.chans = chans;
|
||||
+
|
||||
+ ret = devm_mbox_controller_register(dev, &mbox->controller);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ platform_set_drvdata(pdev, mbox);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id rp1_mbox_of_match[] = {
|
||||
+ { .compatible = "raspberrypi,rp1-mbox", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rp1_mbox_of_match);
|
||||
+
|
||||
+static struct platform_driver rp1_mbox_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "rp1-mbox",
|
||||
+ .of_match_table = rp1_mbox_of_match,
|
||||
+ },
|
||||
+ .probe = rp1_mbox_probe,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(rp1_mbox_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Phil Elwell <phil@raspberrypi.com>");
|
||||
+MODULE_DESCRIPTION("RP1 mailbox IPC driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user