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:
=?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= 2024-12-27 17:14:40 +01:00
parent 26c1b564e0
commit 975ce33610
240 changed files with 27794 additions and 263 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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))

View File

@ -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))

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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),

View File

@ -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,

View File

@ -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)) {

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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" : ""));

View File

@ -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");

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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), },

View File

@ -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

View File

@ -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) &&

View File

@ -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

View File

@ -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;

View File

@ -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.

View File

@ -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)

View File

@ -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",

View File

@ -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
*/

View File

@ -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,

View File

@ -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;
}

View File

@ -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,

View File

@ -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);

View File

@ -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,

View File

@ -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;

View File

@ -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;

View File

@ -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)
{

View File

@ -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++;
}

View File

@ -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);

View File

@ -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);

View File

@ -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");

View File

@ -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");

View File

@ -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);

View File

@ -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,

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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_
}
}

View File

@ -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.

View File

@ -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.
*

View File

@ -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;
}
}

View File

@ -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 =

View File

@ -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;

View File

@ -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

View File

@ -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*

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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_
}
}

View File

@ -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)
{

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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");

View File

@ -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";
+ };
+};

View File

@ -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";
};

View File

@ -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),

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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",

View File

@ -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.
*/

View File

@ -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,
/*

View File

@ -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);

View File

@ -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);

View File

@ -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)
{

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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 |

View File

@ -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;

View File

@ -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,

View File

@ -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)

View File

@ -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 */

View File

@ -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";
};
};

View File

@ -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);
}

View File

@ -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