mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-08-02 15:37:49 +00:00
Merge pull request #5558 from heitbaum/kernel11
[Allwinner,Generic,Rockchip] linux: Update to 5.14
This commit is contained in:
commit
bc10a0168e
@ -0,0 +1,26 @@
|
||||
From e7e83f2593c9e67e3ee50d032f1ad39fe47ea81d Mon Sep 17 00:00:00 2001
|
||||
From: Carlos <CGarces@users.noreply.github.com>
|
||||
Date: Sat, 3 Apr 2021 14:38:14 +0000
|
||||
Subject: [PATCH] Fix GRO_DROP deprecation kernel 5.12
|
||||
|
||||
---
|
||||
os_dep/linux/recv_linux.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/os_dep/linux/recv_linux.c b/os_dep/linux/recv_linux.c
|
||||
index 2f7b3e37..7fecc843 100644
|
||||
--- a/os_dep/linux/recv_linux.c
|
||||
+++ b/os_dep/linux/recv_linux.c
|
||||
@@ -355,8 +355,12 @@ static int napi_recv(_adapter *padapter, int budget)
|
||||
|
||||
#ifdef CONFIG_RTW_GRO
|
||||
if (pregistrypriv->en_gro) {
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0)
|
||||
if (rtw_napi_gro_receive(&padapter->napi, pskb) != GRO_DROP)
|
||||
rx_ok = _TRUE;
|
||||
+#else
|
||||
+ rx_ok = _TRUE;
|
||||
+#endif
|
||||
goto next;
|
||||
}
|
||||
#endif /* CONFIG_RTW_GRO */
|
@ -28,8 +28,8 @@ case "${LINUX}" in
|
||||
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"
|
||||
;;
|
||||
*)
|
||||
PKG_VERSION="5.10.47"
|
||||
PKG_SHA256="30b52a2fe6d1e0c1e1dc651d5df9a37eb54b35ea1f7f51b9f23d8903c29ae1c5"
|
||||
PKG_VERSION="5.14"
|
||||
PKG_SHA256="7e068b5e0d26a62b10e5320b25dce57588cbbc6f781c090442138c9c9c3271b2"
|
||||
PKG_URL="https://www.kernel.org/pub/linux/kernel/v5.x/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||
PKG_PATCH_DIRS="default"
|
||||
;;
|
||||
@ -37,10 +37,6 @@ esac
|
||||
|
||||
PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die
|
||||
|
||||
if listcontains "${UBOOT_FIRMWARE}" "crust"; then
|
||||
PKG_PATCH_DIRS+=" crust"
|
||||
fi
|
||||
|
||||
if [ -n "${KERNEL_TOOLCHAIN}" ]; then
|
||||
PKG_DEPENDS_HOST+=" gcc-arm-${KERNEL_TOOLCHAIN}:host"
|
||||
PKG_DEPENDS_TARGET+=" gcc-arm-${KERNEL_TOOLCHAIN}:host"
|
||||
|
@ -1,24 +0,0 @@
|
||||
From a7163ecab9b2a395e809e41255f3567d7a188a5d Mon Sep 17 00:00:00 2001
|
||||
From: MilhouseVH <milhouseVH.github@nmacleod.com>
|
||||
Date: Fri, 14 Feb 2020 00:34:00 +0000
|
||||
Subject: [PATCH] gcc-plugin.sh: use CONFIG_PLUGIN_HOSTCC="" on all distros
|
||||
|
||||
---
|
||||
scripts/gcc-plugin.sh | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh
|
||||
index d3caefe..6ba7f13 100755
|
||||
--- a/scripts/gcc-plugin.sh
|
||||
+++ b/scripts/gcc-plugin.sh
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
-
|
||||
+exit 0
|
||||
set -e
|
||||
|
||||
srctree=$(dirname "$0")
|
||||
--
|
||||
2.20.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,26 +0,0 @@
|
||||
From 4cc652f2c660bd01bd0d8cefde272400cbe82fbe Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 16 Jan 2021 11:32:04 +0100
|
||||
Subject: [PATCH 1/2] ARM: dts: sun8i: h2-plus: bananapi-m2-zero: Increase BT
|
||||
UART speed
|
||||
|
||||
Bluetooth module on BananaPi M2 Zero can also be used for streaming
|
||||
audio. However, for that case higher UART speed is required.
|
||||
|
||||
Add a max-speed property.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
@@ -125,6 +125,7 @@
|
||||
|
||||
bluetooth {
|
||||
compatible = "brcm,bcm43438-bt";
|
||||
+ max-speed = <1500000>;
|
||||
clocks = <&rtc 1>;
|
||||
clock-names = "lpo";
|
||||
vbat-supply = <®_vcc3v3>;
|
@ -1,51 +0,0 @@
|
||||
From aa47c3b292cb0ffcf2c00b2a12c477ec3027a729 Mon Sep 17 00:00:00 2001
|
||||
From: PJBrs <pjbrs@floorenpj.xs4all.nl>
|
||||
Date: Sat, 16 Jan 2021 11:39:45 +0100
|
||||
Subject: [PATCH 2/2] ARM: dts: sunxi: h2-plus-bananapi-m2-zero: Add HDMI out
|
||||
|
||||
Add HDMI out, including the display engine, to the BananaPi M2 Zero.
|
||||
---
|
||||
.../dts/sun8i-h2-plus-bananapi-m2-zero.dts | 25 +++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
@@ -26,6 +26,17 @@
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
+ connector {
|
||||
+ compatible = "hdmi-connector";
|
||||
+ type = "a";
|
||||
+
|
||||
+ port {
|
||||
+ hdmi_con_in: endpoint {
|
||||
+ remote-endpoint = <&hdmi_out_con>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
@@ -107,6 +118,20 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&de {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi_out {
|
||||
+ hdmi_out_con: endpoint {
|
||||
+ remote-endpoint = <&hdmi_con_in>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&ohci0 {
|
||||
status = "okay";
|
||||
};
|
@ -16,17 +16,6 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
include/drm/bridge/dw_hdmi.h | 2 +
|
||||
5 files changed, 89 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
|
||||
@@ -3421,7 +3421,7 @@ struct dw_hdmi *dw_hdmi_probe(struct pla
|
||||
hdmi->audio = platform_device_register_full(&pdevinfo);
|
||||
}
|
||||
|
||||
- if (config0 & HDMI_CONFIG0_CEC) {
|
||||
+ if (!plat_data->is_cec_unusable && (config0 & HDMI_CONFIG0_CEC)) {
|
||||
cec.hdmi = hdmi;
|
||||
cec.ops = &dw_hdmi_cec_ops;
|
||||
cec.irq = irq;
|
||||
--- a/drivers/gpu/drm/sun4i/Kconfig
|
||||
+++ b/drivers/gpu/drm/sun4i/Kconfig
|
||||
@@ -56,6 +56,8 @@ config DRM_SUN8I_DW_HDMI
|
||||
@ -98,7 +87,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
plat_data->cur_ctr = variant->cur_ctr;
|
||||
plat_data->phy_config = variant->phy_cfg;
|
||||
}
|
||||
+ plat_data->is_cec_unusable = phy->variant->bit_bang_cec;
|
||||
+ plat_data->disable_cec = phy->variant->bit_bang_cec;
|
||||
}
|
||||
|
||||
+static int sun8i_hdmi_phy_cec_pin_read(struct cec_adapter *adap)
|
||||
@ -197,14 +186,3 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
clk_disable_unprepare(phy->clk_mod);
|
||||
clk_disable_unprepare(phy->clk_bus);
|
||||
clk_disable_unprepare(phy->clk_phy);
|
||||
--- a/include/drm/bridge/dw_hdmi.h
|
||||
+++ b/include/drm/bridge/dw_hdmi.h
|
||||
@@ -153,6 +153,8 @@ struct dw_hdmi_plat_data {
|
||||
const struct dw_hdmi_phy_config *phy_config;
|
||||
int (*configure_phy)(struct dw_hdmi *hdmi, void *data,
|
||||
unsigned long mpixelclock);
|
||||
+
|
||||
+ unsigned int is_cec_unusable : 1;
|
||||
};
|
||||
|
||||
struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,
|
||||
|
@ -1,25 +0,0 @@
|
||||
From 54b5c2cb4fc87ca72daa662423d4d969f3b5edb8 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 16 Jan 2021 11:49:57 +0100
|
||||
Subject: [PATCH] ARM: dts: sunxi: bananapi-m2-plus: Increase BT UART speed
|
||||
|
||||
Bluetooth module on BananaPi M2 Plus can also be used for streaming
|
||||
audio. However, for that case higher UART speed is required.
|
||||
|
||||
Add a max-speed property.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
|
||||
@@ -219,6 +219,7 @@
|
||||
|
||||
bluetooth {
|
||||
compatible = "brcm,bcm43438-bt";
|
||||
+ max-speed = <1500000>;
|
||||
clocks = <&rtc 1>;
|
||||
clock-names = "lpo";
|
||||
vbat-supply = <®_vcc3v3>;
|
@ -1,45 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Thu, 29 Oct 2020 21:04:24 +0100
|
||||
Subject: [PATCH] pineh64 model b - bluetooth wip
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-pine-h64-model-b.dts | 16 ++++++++++++++++
|
||||
drivers/bluetooth/hci_h5.c | 3 +++
|
||||
2 files changed, 19 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64-model-b.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64-model-b.dts
|
||||
@@ -34,3 +34,19 @@
|
||||
non-removable;
|
||||
status = "okay";
|
||||
};
|
||||
+
|
||||
+&uart1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
|
||||
+ uart-has-rtscts;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ bluetooth {
|
||||
+ compatible = "realtek,rtl8723bs-bt";
|
||||
+ device-wakeup-gpios = <&r_pio 1 2 GPIO_ACTIVE_HIGH>; /* PM2 */
|
||||
+ host-wakeup-gpios = <&r_pio 1 1 GPIO_ACTIVE_HIGH>; /* PM1 */
|
||||
+ enable-gpios = <&r_pio 1 4 GPIO_ACTIVE_HIGH>; /* PM4 */
|
||||
+ firmware-postfix = "OBDA8723";
|
||||
+ max-speed = <1500000>;
|
||||
+ };
|
||||
+};
|
||||
--- a/drivers/bluetooth/hci_h5.c
|
||||
+++ b/drivers/bluetooth/hci_h5.c
|
||||
@@ -820,6 +820,9 @@ static int h5_serdev_probe(struct serdev
|
||||
if (!data)
|
||||
return -ENODEV;
|
||||
|
||||
+ of_property_read_string(dev->of_node,
|
||||
+ "firmware-postfix", &h5->id);
|
||||
+
|
||||
h5->vnd = (const struct h5_vnd *)data;
|
||||
}
|
||||
|
@ -1,35 +0,0 @@
|
||||
From 8e2b67acc77a0c7704b2001dd4bf8646f286e4be Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 16 Jan 2021 13:09:00 +0100
|
||||
Subject: [PATCH] ARM: dts: sun8i: r40: Add timer node
|
||||
|
||||
Allwinner R40 has a timer.
|
||||
|
||||
Add a node for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-r40.dtsi | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/sun8i-r40.dtsi
|
||||
+++ b/arch/arm/boot/dts/sun8i-r40.dtsi
|
||||
@@ -647,6 +647,18 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ timer@1c20c00 {
|
||||
+ compatible = "allwinner,sun4i-a10-timer";
|
||||
+ reg = <0x01c20c00 0x90>;
|
||||
+ interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
|
||||
+ <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&osc24M>;
|
||||
+ };
|
||||
+
|
||||
wdt: watchdog@1c20c90 {
|
||||
compatible = "allwinner,sun4i-a10-wdt";
|
||||
reg = <0x01c20c90 0x10>;
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,40 +0,0 @@
|
||||
From 9a7e6c2d8a18a24b013c1ad165ed04bb7d2c7716 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Tue, 25 Aug 2020 19:35:22 +0200
|
||||
Subject: [PATCH 01/44] media: cedrus: Add support for R40
|
||||
|
||||
Video engine in R40 is very similar to that in A33 but it runs on lower
|
||||
speed, at least according to OS images released by board designer.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Link: https://lore.kernel.org/r/20200825173523.1289379-5-jernej.skrabec@siol.net
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
@@ -508,6 +508,11 @@ static const struct cedrus_variant sun8i
|
||||
.mod_rate = 402000000,
|
||||
};
|
||||
|
||||
+static const struct cedrus_variant sun8i_r40_cedrus_variant = {
|
||||
+ .capabilities = CEDRUS_CAPABILITY_UNTILED,
|
||||
+ .mod_rate = 297000000,
|
||||
+};
|
||||
+
|
||||
static const struct cedrus_variant sun50i_a64_cedrus_variant = {
|
||||
.capabilities = CEDRUS_CAPABILITY_UNTILED |
|
||||
CEDRUS_CAPABILITY_H265_DEC,
|
||||
@@ -549,6 +554,10 @@ static const struct of_device_id cedrus_
|
||||
.data = &sun8i_h3_cedrus_variant,
|
||||
},
|
||||
{
|
||||
+ .compatible = "allwinner,sun8i-r40-video-engine",
|
||||
+ .data = &sun8i_r40_cedrus_variant,
|
||||
+ },
|
||||
+ {
|
||||
.compatible = "allwinner,sun50i-a64-video-engine",
|
||||
.data = &sun50i_a64_cedrus_variant,
|
||||
},
|
@ -139,8 +139,8 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
return rc;
|
||||
--- a/drivers/clk/clk.c
|
||||
+++ b/drivers/clk/clk.c
|
||||
@@ -4188,6 +4188,37 @@ void devm_clk_hw_unregister(struct devic
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_unregister);
|
||||
@@ -4271,6 +4271,37 @@ struct clk *devm_clk_hw_get_clk(struct d
|
||||
EXPORT_SYMBOL_GPL(devm_clk_hw_get_clk);
|
||||
|
||||
/*
|
||||
+ * clk-conf helpers
|
@ -1,99 +0,0 @@
|
||||
From f710d6403b7716d7a5319e51c4cb3c217ec85b73 Mon Sep 17 00:00:00 2001
|
||||
From: Sean Young <sean@mess.org>
|
||||
Date: Tue, 10 Nov 2020 09:30:38 +0100
|
||||
Subject: [PATCH 02/44] media: sunxi-cir: allow timeout to be set at runtime
|
||||
|
||||
This allows the timeout to be set with the LIRC_SET_REC_TIMEOUT ioctl.
|
||||
|
||||
The timeout was hardcoded at just over 20ms, but returned 120ms when
|
||||
queried with the LIRC_GET_REC_TIMEOUT ioctl.
|
||||
|
||||
This also ensures the idle threshold is set correctly with a base clock
|
||||
other than 8Mhz.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Sean Young <sean@mess.org>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
drivers/media/rc/sunxi-cir.c | 48 ++++++++++++++++++++++++++++++------
|
||||
1 file changed, 40 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/media/rc/sunxi-cir.c
|
||||
+++ b/drivers/media/rc/sunxi-cir.c
|
||||
@@ -73,10 +73,6 @@
|
||||
#define SUNXI_IR_BASE_CLK 8000000
|
||||
/* Noise threshold in samples */
|
||||
#define SUNXI_IR_RXNOISE 1
|
||||
-/* Idle Threshold in samples */
|
||||
-#define SUNXI_IR_RXIDLE 20
|
||||
-/* Time after which device stops sending data in ms */
|
||||
-#define SUNXI_IR_TIMEOUT 120
|
||||
|
||||
/**
|
||||
* struct sunxi_ir_quirks - Differences between SoC variants.
|
||||
@@ -146,6 +142,41 @@ static irqreturn_t sunxi_ir_irq(int irqn
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
+/* Convert idle threshold to usec */
|
||||
+static unsigned int sunxi_ithr_to_usec(unsigned int base_clk, unsigned int ithr)
|
||||
+{
|
||||
+ return DIV_ROUND_CLOSEST(USEC_PER_SEC * (ithr + 1),
|
||||
+ base_clk / (128 * 64));
|
||||
+}
|
||||
+
|
||||
+/* Convert usec to idle threshold */
|
||||
+static unsigned int sunxi_usec_to_ithr(unsigned int base_clk, unsigned int usec)
|
||||
+{
|
||||
+ /* make sure we don't end up with a timeout less than requested */
|
||||
+ return DIV_ROUND_UP((base_clk / (128 * 64)) * usec, USEC_PER_SEC) - 1;
|
||||
+}
|
||||
+
|
||||
+static int sunxi_ir_set_timeout(struct rc_dev *rc_dev, unsigned int timeout)
|
||||
+{
|
||||
+ struct sunxi_ir *ir = rc_dev->priv;
|
||||
+ unsigned int base_clk = clk_get_rate(ir->clk);
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ unsigned int ithr = sunxi_usec_to_ithr(base_clk, timeout);
|
||||
+
|
||||
+ dev_dbg(rc_dev->dev.parent, "setting idle threshold to %u\n", ithr);
|
||||
+
|
||||
+ spin_lock_irqsave(&ir->ir_lock, flags);
|
||||
+ /* Set noise threshold and idle threshold */
|
||||
+ writel(REG_CIR_NTHR(SUNXI_IR_RXNOISE) | REG_CIR_ITHR(ithr),
|
||||
+ ir->base + SUNXI_IR_CIR_REG);
|
||||
+ spin_unlock_irqrestore(&ir->ir_lock, flags);
|
||||
+
|
||||
+ rc_dev->timeout = sunxi_ithr_to_usec(base_clk, ithr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int sunxi_ir_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -242,9 +273,11 @@ static int sunxi_ir_probe(struct platfor
|
||||
ir->rc->map_name = ir->map_name ?: RC_MAP_EMPTY;
|
||||
ir->rc->dev.parent = dev;
|
||||
ir->rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
|
||||
- /* Frequency after IR internal divider with sample period in ns */
|
||||
+ /* Frequency after IR internal divider with sample period in us */
|
||||
ir->rc->rx_resolution = (USEC_PER_SEC / (b_clk_freq / 64));
|
||||
- ir->rc->timeout = MS_TO_US(SUNXI_IR_TIMEOUT);
|
||||
+ ir->rc->min_timeout = sunxi_ithr_to_usec(b_clk_freq, 0);
|
||||
+ ir->rc->max_timeout = sunxi_ithr_to_usec(b_clk_freq, 255);
|
||||
+ ir->rc->s_timeout = sunxi_ir_set_timeout;
|
||||
ir->rc->driver_name = SUNXI_IR_DEV;
|
||||
|
||||
ret = rc_register_device(ir->rc);
|
||||
@@ -272,8 +305,7 @@ static int sunxi_ir_probe(struct platfor
|
||||
writel(REG_CTL_MD, ir->base+SUNXI_IR_CTL_REG);
|
||||
|
||||
/* Set noise threshold and idle threshold */
|
||||
- writel(REG_CIR_NTHR(SUNXI_IR_RXNOISE)|REG_CIR_ITHR(SUNXI_IR_RXIDLE),
|
||||
- ir->base + SUNXI_IR_CIR_REG);
|
||||
+ sunxi_ir_set_timeout(ir->rc, IR_DEFAULT_TIMEOUT);
|
||||
|
||||
/* Invert Input Signal */
|
||||
writel(REG_RXCTL_RPPI, ir->base + SUNXI_IR_RXCTL_REG);
|
@ -1,118 +0,0 @@
|
||||
From a8bdfe3893f9b226492dac4b4e0d37a27dbee201 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= <peron.clem@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:35 +0100
|
||||
Subject: [PATCH 03/44] ASoC: sun4i-i2s: Change set_chan_cfg() params
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
As slots and slot_width can be set manually using set_tdm().
|
||||
These values are then kept in sun4i_i2s struct.
|
||||
So we need to check if these values are set or not.
|
||||
|
||||
This is not done actually and will trigger a bug.
|
||||
For example, if we set to the simple soundcard in the device-tree
|
||||
dai-tdm-slot-width = <32> and then start a stream using S16_LE,
|
||||
currently we would calculate BCLK for 32-bit slots, but program
|
||||
lrck_period for 16-bit slots, making the sample rate double what we
|
||||
expected.
|
||||
|
||||
To fix this, we need to check if these values are set or not but as
|
||||
this logic is already done by the caller. Avoid duplicating this
|
||||
logic and just pass the required values as params to set_chan_cfg().
|
||||
|
||||
Suggested-by: Samuel Holland <samuel@sholland.org>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-3-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 32 ++++++++++++++++++--------------
|
||||
1 file changed, 18 insertions(+), 14 deletions(-)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -162,8 +162,15 @@ struct sun4i_i2s_quirks {
|
||||
unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
|
||||
s8 (*get_sr)(const struct sun4i_i2s *, int);
|
||||
s8 (*get_wss)(const struct sun4i_i2s *, int);
|
||||
- int (*set_chan_cfg)(const struct sun4i_i2s *,
|
||||
- const struct snd_pcm_hw_params *);
|
||||
+
|
||||
+ /*
|
||||
+ * In the set_chan_cfg() function pointer:
|
||||
+ * @slots: channels per frame + padding slots, regardless of format
|
||||
+ * @slot_width: bits per sample + padding bits, regardless of format
|
||||
+ */
|
||||
+ int (*set_chan_cfg)(const struct sun4i_i2s *i2s,
|
||||
+ unsigned int channels, unsigned int slots,
|
||||
+ unsigned int slot_width);
|
||||
int (*set_fmt)(const struct sun4i_i2s *, unsigned int);
|
||||
};
|
||||
|
||||
@@ -399,10 +406,9 @@ static s8 sun8i_i2s_get_sr_wss(const str
|
||||
}
|
||||
|
||||
static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
||||
- const struct snd_pcm_hw_params *params)
|
||||
+ unsigned int channels, unsigned int slots,
|
||||
+ unsigned int slot_width)
|
||||
{
|
||||
- unsigned int channels = params_channels(params);
|
||||
-
|
||||
/* Map the channels for playback and capture */
|
||||
regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210);
|
||||
regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210);
|
||||
@@ -419,15 +425,11 @@ static int sun4i_i2s_set_chan_cfg(const
|
||||
}
|
||||
|
||||
static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
||||
- const struct snd_pcm_hw_params *params)
|
||||
+ unsigned int channels, unsigned int slots,
|
||||
+ unsigned int slot_width)
|
||||
{
|
||||
- unsigned int channels = params_channels(params);
|
||||
- unsigned int slots = channels;
|
||||
unsigned int lrck_period;
|
||||
|
||||
- if (i2s->slots)
|
||||
- slots = i2s->slots;
|
||||
-
|
||||
/* Map the channels for playback and capture */
|
||||
regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210);
|
||||
regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210);
|
||||
@@ -450,13 +452,13 @@ static int sun8i_i2s_set_chan_cfg(const
|
||||
switch (i2s->format & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
- lrck_period = params_physical_width(params) * slots;
|
||||
+ lrck_period = slot_width * slots;
|
||||
break;
|
||||
|
||||
case SND_SOC_DAIFMT_LEFT_J:
|
||||
case SND_SOC_DAIFMT_RIGHT_J:
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
- lrck_period = params_physical_width(params);
|
||||
+ lrck_period = slot_width;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -482,7 +484,9 @@ static int sun4i_i2s_hw_params(struct sn
|
||||
unsigned int word_size = params_width(params);
|
||||
unsigned int slot_width = params_physical_width(params);
|
||||
unsigned int channels = params_channels(params);
|
||||
+
|
||||
unsigned int slots = channels;
|
||||
+
|
||||
int ret, sr, wss;
|
||||
u32 width;
|
||||
|
||||
@@ -492,7 +496,7 @@ static int sun4i_i2s_hw_params(struct sn
|
||||
if (i2s->slot_width)
|
||||
slot_width = i2s->slot_width;
|
||||
|
||||
- ret = i2s->variant->set_chan_cfg(i2s, params);
|
||||
+ ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "Invalid channel configuration\n");
|
||||
return ret;
|
@ -1,295 +0,0 @@
|
||||
From 8ff0df5dffe58a2d1595a6e59ccd5ce63d6bf0e5 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Fri, 30 Oct 2020 15:46:36 +0100
|
||||
Subject: [PATCH 04/44] ASoC: sun4i-i2s: Add support for H6 I2S
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
H6 I2S is very similar to that in H3, except it supports up to 16
|
||||
channels.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-4-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 222 ++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 222 insertions(+)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -124,6 +124,21 @@
|
||||
#define SUN8I_I2S_RX_CHAN_SEL_REG 0x54
|
||||
#define SUN8I_I2S_RX_CHAN_MAP_REG 0x58
|
||||
|
||||
+/* Defines required for sun50i-h6 support */
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK GENMASK(21, 20)
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset) ((offset) << 20)
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_SEL_MASK GENMASK(19, 16)
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_SEL(chan) ((chan - 1) << 16)
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_EN_MASK GENMASK(15, 0)
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_EN(num_chan) (((1 << num_chan) - 1))
|
||||
+
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_MAP0_REG 0x44
|
||||
+#define SUN50I_H6_I2S_TX_CHAN_MAP1_REG 0x48
|
||||
+
|
||||
+#define SUN50I_H6_I2S_RX_CHAN_SEL_REG 0x64
|
||||
+#define SUN50I_H6_I2S_RX_CHAN_MAP0_REG 0x68
|
||||
+#define SUN50I_H6_I2S_RX_CHAN_MAP1_REG 0x6C
|
||||
+
|
||||
struct sun4i_i2s;
|
||||
|
||||
/**
|
||||
@@ -476,6 +491,60 @@ static int sun8i_i2s_set_chan_cfg(const
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
||||
+ unsigned int channels, unsigned int slots,
|
||||
+ unsigned int slot_width)
|
||||
+{
|
||||
+ unsigned int lrck_period;
|
||||
+
|
||||
+ /* Map the channels for playback and capture */
|
||||
+ regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0xFEDCBA98);
|
||||
+ regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210);
|
||||
+ regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0xFEDCBA98);
|
||||
+ regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x76543210);
|
||||
+
|
||||
+ /* Configure the channels */
|
||||
+ regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL_MASK,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL(channels));
|
||||
+ regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL_MASK,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL(channels));
|
||||
+
|
||||
+ regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG,
|
||||
+ SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK,
|
||||
+ SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM(channels));
|
||||
+ regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG,
|
||||
+ SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM_MASK,
|
||||
+ SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM(channels));
|
||||
+
|
||||
+ switch (i2s->format & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||
+ case SND_SOC_DAIFMT_DSP_A:
|
||||
+ case SND_SOC_DAIFMT_DSP_B:
|
||||
+ lrck_period = slot_width * slots;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_LEFT_J:
|
||||
+ case SND_SOC_DAIFMT_RIGHT_J:
|
||||
+ case SND_SOC_DAIFMT_I2S:
|
||||
+ lrck_period = slot_width;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG,
|
||||
+ SUN8I_I2S_FMT0_LRCK_PERIOD_MASK,
|
||||
+ SUN8I_I2S_FMT0_LRCK_PERIOD(lrck_period));
|
||||
+
|
||||
+ regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_EN_MASK,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_EN(channels));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
@@ -703,6 +772,108 @@ static int sun8i_i2s_set_soc_fmt(const s
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int sun50i_h6_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
|
||||
+ unsigned int fmt)
|
||||
+{
|
||||
+ u32 mode, val;
|
||||
+ u8 offset;
|
||||
+
|
||||
+ /*
|
||||
+ * DAI clock polarity
|
||||
+ *
|
||||
+ * The setup for LRCK contradicts the datasheet, but under a
|
||||
+ * scope it's clear that the LRCK polarity is reversed
|
||||
+ * compared to the expected polarity on the bus.
|
||||
+ */
|
||||
+ switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
||||
+ case SND_SOC_DAIFMT_IB_IF:
|
||||
+ /* Invert both clocks */
|
||||
+ val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED;
|
||||
+ break;
|
||||
+ case SND_SOC_DAIFMT_IB_NF:
|
||||
+ /* Invert bit clock */
|
||||
+ val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED |
|
||||
+ SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED;
|
||||
+ break;
|
||||
+ case SND_SOC_DAIFMT_NB_IF:
|
||||
+ /* Invert frame clock */
|
||||
+ val = 0;
|
||||
+ break;
|
||||
+ case SND_SOC_DAIFMT_NB_NF:
|
||||
+ val = SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG,
|
||||
+ SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK |
|
||||
+ SUN8I_I2S_FMT0_BCLK_POLARITY_MASK,
|
||||
+ val);
|
||||
+
|
||||
+ /* DAI Mode */
|
||||
+ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||
+ case SND_SOC_DAIFMT_DSP_A:
|
||||
+ mode = SUN8I_I2S_CTRL_MODE_PCM;
|
||||
+ offset = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_DSP_B:
|
||||
+ mode = SUN8I_I2S_CTRL_MODE_PCM;
|
||||
+ offset = 0;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_I2S:
|
||||
+ mode = SUN8I_I2S_CTRL_MODE_LEFT;
|
||||
+ offset = 1;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_LEFT_J:
|
||||
+ mode = SUN8I_I2S_CTRL_MODE_LEFT;
|
||||
+ offset = 0;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_RIGHT_J:
|
||||
+ mode = SUN8I_I2S_CTRL_MODE_RIGHT;
|
||||
+ offset = 0;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
|
||||
+ SUN8I_I2S_CTRL_MODE_MASK, mode);
|
||||
+ regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset));
|
||||
+ regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK,
|
||||
+ SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset));
|
||||
+
|
||||
+ /* DAI clock master masks */
|
||||
+ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||
+ case SND_SOC_DAIFMT_CBS_CFS:
|
||||
+ /* BCLK and LRCLK master */
|
||||
+ val = SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT;
|
||||
+ break;
|
||||
+
|
||||
+ case SND_SOC_DAIFMT_CBM_CFM:
|
||||
+ /* BCLK and LRCLK slave */
|
||||
+ val = 0;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
|
||||
+ SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT,
|
||||
+ val);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int sun4i_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
{
|
||||
struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
|
||||
@@ -983,6 +1154,22 @@ static const struct reg_default sun8i_i2
|
||||
{ SUN8I_I2S_RX_CHAN_MAP_REG, 0x00000000 },
|
||||
};
|
||||
|
||||
+static const struct reg_default sun50i_h6_i2s_reg_defaults[] = {
|
||||
+ { SUN4I_I2S_CTRL_REG, 0x00060000 },
|
||||
+ { SUN4I_I2S_FMT0_REG, 0x00000033 },
|
||||
+ { SUN4I_I2S_FMT1_REG, 0x00000030 },
|
||||
+ { SUN4I_I2S_FIFO_CTRL_REG, 0x000400f0 },
|
||||
+ { SUN4I_I2S_DMA_INT_CTRL_REG, 0x00000000 },
|
||||
+ { SUN4I_I2S_CLK_DIV_REG, 0x00000000 },
|
||||
+ { SUN8I_I2S_CHAN_CFG_REG, 0x00000000 },
|
||||
+ { SUN8I_I2S_TX_CHAN_SEL_REG, 0x00000000 },
|
||||
+ { SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0x00000000 },
|
||||
+ { SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x00000000 },
|
||||
+ { SUN50I_H6_I2S_RX_CHAN_SEL_REG, 0x00000000 },
|
||||
+ { SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0x00000000 },
|
||||
+ { SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x00000000 },
|
||||
+};
|
||||
+
|
||||
static const struct regmap_config sun4i_i2s_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
@@ -1010,6 +1197,19 @@ static const struct regmap_config sun8i_
|
||||
.volatile_reg = sun8i_i2s_volatile_reg,
|
||||
};
|
||||
|
||||
+static const struct regmap_config sun50i_h6_i2s_regmap_config = {
|
||||
+ .reg_bits = 32,
|
||||
+ .reg_stride = 4,
|
||||
+ .val_bits = 32,
|
||||
+ .max_register = SUN50I_H6_I2S_RX_CHAN_MAP1_REG,
|
||||
+ .cache_type = REGCACHE_FLAT,
|
||||
+ .reg_defaults = sun50i_h6_i2s_reg_defaults,
|
||||
+ .num_reg_defaults = ARRAY_SIZE(sun50i_h6_i2s_reg_defaults),
|
||||
+ .writeable_reg = sun4i_i2s_wr_reg,
|
||||
+ .readable_reg = sun8i_i2s_rd_reg,
|
||||
+ .volatile_reg = sun8i_i2s_volatile_reg,
|
||||
+};
|
||||
+
|
||||
static int sun4i_i2s_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct sun4i_i2s *i2s = dev_get_drvdata(dev);
|
||||
@@ -1168,6 +1368,24 @@ static const struct sun4i_i2s_quirks sun
|
||||
.set_fmt = sun4i_i2s_set_soc_fmt,
|
||||
};
|
||||
|
||||
+static const struct sun4i_i2s_quirks sun50i_h6_i2s_quirks = {
|
||||
+ .has_reset = true,
|
||||
+ .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG,
|
||||
+ .sun4i_i2s_regmap = &sun50i_h6_i2s_regmap_config,
|
||||
+ .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8),
|
||||
+ .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2),
|
||||
+ .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6),
|
||||
+ .bclk_dividers = sun8i_i2s_clk_div,
|
||||
+ .num_bclk_dividers = ARRAY_SIZE(sun8i_i2s_clk_div),
|
||||
+ .mclk_dividers = sun8i_i2s_clk_div,
|
||||
+ .num_mclk_dividers = ARRAY_SIZE(sun8i_i2s_clk_div),
|
||||
+ .get_bclk_parent_rate = sun8i_i2s_get_bclk_parent_rate,
|
||||
+ .get_sr = sun8i_i2s_get_sr_wss,
|
||||
+ .get_wss = sun8i_i2s_get_sr_wss,
|
||||
+ .set_chan_cfg = sun50i_h6_i2s_set_chan_cfg,
|
||||
+ .set_fmt = sun50i_h6_i2s_set_soc_fmt,
|
||||
+};
|
||||
+
|
||||
static int sun4i_i2s_init_regmap_fields(struct device *dev,
|
||||
struct sun4i_i2s *i2s)
|
||||
{
|
||||
@@ -1337,6 +1555,10 @@ static const struct of_device_id sun4i_i
|
||||
.compatible = "allwinner,sun50i-a64-codec-i2s",
|
||||
.data = &sun50i_a64_codec_i2s_quirks,
|
||||
},
|
||||
+ {
|
||||
+ .compatible = "allwinner,sun50i-h6-i2s",
|
||||
+ .data = &sun50i_h6_i2s_quirks,
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sun4i_i2s_match);
|
@ -10,7 +10,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
--- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
@@ -406,6 +406,7 @@
|
||||
@@ -388,6 +388,7 @@
|
||||
reg = <0x01c20000 0x400>;
|
||||
clocks = <&osc24M>, <&rtc 0>;
|
||||
clock-names = "hosc", "losc";
|
||||
@ -18,7 +18,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
@@ -894,6 +895,7 @@
|
||||
@@ -876,6 +877,7 @@
|
||||
clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
|
||||
<&ccu CLK_PLL_PERIPH0>;
|
||||
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
@ -1,134 +0,0 @@
|
||||
From aec30a56043a890b75440bb8c9673a07166cf104 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= <peron.clem@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:37 +0100
|
||||
Subject: [PATCH 05/44] ASoC: sun4i-i2s: Change get_sr() and get_wss() to be
|
||||
more explicit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
We are actually using a complex formula to just return a bunch of
|
||||
simple values. Also this formula is wrong for sun4i when calling
|
||||
get_wss() the function return 4 instead of 3.
|
||||
|
||||
Replace this with a simpler switch case.
|
||||
|
||||
Also drop the i2s params which is unused and return a simple int as
|
||||
returning an error code could be out of range for an s8 and there is
|
||||
no optim to return a s8 here.
|
||||
|
||||
Fixes: 619c15f7fac9 ("ASoC: sun4i-i2s: Change SR and WSS computation")
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-5-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 75 +++++++++++++++++++++++--------------
|
||||
1 file changed, 47 insertions(+), 28 deletions(-)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -175,8 +175,8 @@ struct sun4i_i2s_quirks {
|
||||
unsigned int num_mclk_dividers;
|
||||
|
||||
unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
|
||||
- s8 (*get_sr)(const struct sun4i_i2s *, int);
|
||||
- s8 (*get_wss)(const struct sun4i_i2s *, int);
|
||||
+ int (*get_sr)(unsigned int width);
|
||||
+ int (*get_wss)(unsigned int width);
|
||||
|
||||
/*
|
||||
* In the set_chan_cfg() function pointer:
|
||||
@@ -387,37 +387,56 @@ static int sun4i_i2s_set_clk_rate(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static s8 sun4i_i2s_get_sr(const struct sun4i_i2s *i2s, int width)
|
||||
+static int sun4i_i2s_get_sr(unsigned int width)
|
||||
{
|
||||
- if (width < 16 || width > 24)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- if (width % 4)
|
||||
- return -EINVAL;
|
||||
+ switch (width) {
|
||||
+ case 16:
|
||||
+ return 0;
|
||||
+ case 20:
|
||||
+ return 1;
|
||||
+ case 24:
|
||||
+ return 2;
|
||||
+ }
|
||||
|
||||
- return (width - 16) / 4;
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
-static s8 sun4i_i2s_get_wss(const struct sun4i_i2s *i2s, int width)
|
||||
+static int sun4i_i2s_get_wss(unsigned int width)
|
||||
{
|
||||
- if (width < 16 || width > 32)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- if (width % 4)
|
||||
- return -EINVAL;
|
||||
+ switch (width) {
|
||||
+ case 16:
|
||||
+ return 0;
|
||||
+ case 20:
|
||||
+ return 1;
|
||||
+ case 24:
|
||||
+ return 2;
|
||||
+ case 32:
|
||||
+ return 3;
|
||||
+ }
|
||||
|
||||
- return (width - 16) / 4;
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
-static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
|
||||
+static int sun8i_i2s_get_sr_wss(unsigned int width)
|
||||
{
|
||||
- if (width % 4)
|
||||
- return -EINVAL;
|
||||
-
|
||||
- if (width < 8 || width > 32)
|
||||
- return -EINVAL;
|
||||
+ switch (width) {
|
||||
+ case 8:
|
||||
+ return 1;
|
||||
+ case 12:
|
||||
+ return 2;
|
||||
+ case 16:
|
||||
+ return 3;
|
||||
+ case 20:
|
||||
+ return 4;
|
||||
+ case 24:
|
||||
+ return 5;
|
||||
+ case 28:
|
||||
+ return 6;
|
||||
+ case 32:
|
||||
+ return 7;
|
||||
+ }
|
||||
|
||||
- return (width - 8) / 4 + 1;
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
||||
@@ -582,11 +601,11 @@ static int sun4i_i2s_hw_params(struct sn
|
||||
}
|
||||
i2s->playback_dma_data.addr_width = width;
|
||||
|
||||
- sr = i2s->variant->get_sr(i2s, word_size);
|
||||
+ sr = i2s->variant->get_sr(word_size);
|
||||
if (sr < 0)
|
||||
return -EINVAL;
|
||||
|
||||
- wss = i2s->variant->get_wss(i2s, slot_width);
|
||||
+ wss = i2s->variant->get_wss(slot_width);
|
||||
if (wss < 0)
|
||||
return -EINVAL;
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
@@ -637,6 +637,7 @@
|
||||
@@ -646,6 +646,7 @@
|
||||
reg = <0x01c20000 0x400>;
|
||||
clocks = <&osc24M>, <&rtc 0>;
|
||||
clock-names = "hosc", "losc";
|
||||
@ -18,7 +18,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
@@ -1229,6 +1230,7 @@
|
||||
@@ -1267,6 +1268,7 @@
|
||||
clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
|
||||
<&ccu CLK_PLL_PERIPH0>;
|
||||
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
@ -1,86 +0,0 @@
|
||||
From fe1ae019879d51633d8dcd705117c70b701b77e9 Mon Sep 17 00:00:00 2001
|
||||
From: Marcus Cooper <codekipper@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:38 +0100
|
||||
Subject: [PATCH 06/44] ASoC: sun4i-i2s: Set sign extend sample
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On the newer SoCs such as the H3 and A64 this is set by default
|
||||
to transfer a 0 after each sample in each slot. However the A10
|
||||
and A20 SoCs that this driver was developed on had a default
|
||||
setting where it padded the audio gain with zeros.
|
||||
|
||||
This isn't a problem while we have only support for 16bit audio
|
||||
but with larger sample resolution rates in the pipeline then SEXT
|
||||
bits should be cleared so that they also pad at the LSB. Without
|
||||
this the audio gets distorted.
|
||||
|
||||
Set sign extend sample for all the sunxi generations even if they
|
||||
are not affected. This will keep consistency and avoid relying on
|
||||
default.
|
||||
|
||||
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-6-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -48,6 +48,9 @@
|
||||
#define SUN4I_I2S_FMT0_FMT_I2S (0 << 0)
|
||||
|
||||
#define SUN4I_I2S_FMT1_REG 0x08
|
||||
+#define SUN4I_I2S_FMT1_REG_SEXT_MASK BIT(8)
|
||||
+#define SUN4I_I2S_FMT1_REG_SEXT(sext) ((sext) << 8)
|
||||
+
|
||||
#define SUN4I_I2S_FIFO_TX_REG 0x0c
|
||||
#define SUN4I_I2S_FIFO_RX_REG 0x10
|
||||
|
||||
@@ -105,6 +108,9 @@
|
||||
#define SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED (1 << 7)
|
||||
#define SUN8I_I2S_FMT0_BCLK_POLARITY_NORMAL (0 << 7)
|
||||
|
||||
+#define SUN8I_I2S_FMT1_REG_SEXT_MASK GENMASK(5, 4)
|
||||
+#define SUN8I_I2S_FMT1_REG_SEXT(sext) ((sext) << 4)
|
||||
+
|
||||
#define SUN8I_I2S_INT_STA_REG 0x0c
|
||||
#define SUN8I_I2S_FIFO_TX_REG 0x20
|
||||
|
||||
@@ -686,6 +692,7 @@ static int sun4i_i2s_set_soc_fmt(const s
|
||||
}
|
||||
regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
|
||||
SUN4I_I2S_CTRL_MODE_MASK, val);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -788,6 +795,11 @@ static int sun8i_i2s_set_soc_fmt(const s
|
||||
SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT,
|
||||
val);
|
||||
|
||||
+ /* Set sign extension to pad out LSB with 0 */
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT1_REG,
|
||||
+ SUN8I_I2S_FMT1_REG_SEXT_MASK,
|
||||
+ SUN8I_I2S_FMT1_REG_SEXT(0));
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -890,6 +902,11 @@ static int sun50i_h6_i2s_set_soc_fmt(con
|
||||
SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT,
|
||||
val);
|
||||
|
||||
+ /* Set sign extension to pad out LSB with 0 */
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT1_REG,
|
||||
+ SUN8I_I2S_FMT1_REG_SEXT_MASK,
|
||||
+ SUN8I_I2S_FMT1_REG_SEXT(0));
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
@@ -241,6 +241,7 @@
|
||||
@@ -230,6 +230,7 @@
|
||||
reg = <0x03001000 0x1000>;
|
||||
clocks = <&osc24M>, <&rtc 0>, <&rtc 2>;
|
||||
clock-names = "hosc", "losc", "iosc";
|
||||
@ -18,7 +18,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
@@ -920,6 +921,7 @@
|
||||
@@ -925,6 +926,7 @@
|
||||
clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
|
||||
<&ccu CLK_PLL_PERIPH0>;
|
||||
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
@ -1,61 +0,0 @@
|
||||
From 9c2121fe514f12c830bceea7b33872fa67af3e97 Mon Sep 17 00:00:00 2001
|
||||
From: Marcus Cooper <codekipper@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:39 +0100
|
||||
Subject: [PATCH 07/44] ASoC: sun4i-i2s: Add 20 and 24 bit support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Extend the functionality of the driver to include support of 20 and
|
||||
24 bits per sample.
|
||||
|
||||
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-7-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -600,6 +600,9 @@ static int sun4i_i2s_hw_params(struct sn
|
||||
case 16:
|
||||
width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
break;
|
||||
+ case 32:
|
||||
+ width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
+ break;
|
||||
default:
|
||||
dev_err(dai->dev, "Unsupported physical sample width: %d\n",
|
||||
params_physical_width(params));
|
||||
@@ -1081,6 +1084,10 @@ static int sun4i_i2s_dai_probe(struct sn
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#define SUN4I_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
|
||||
+ SNDRV_PCM_FMTBIT_S20_LE | \
|
||||
+ SNDRV_PCM_FMTBIT_S24_LE)
|
||||
+
|
||||
static struct snd_soc_dai_driver sun4i_i2s_dai = {
|
||||
.probe = sun4i_i2s_dai_probe,
|
||||
.capture = {
|
||||
@@ -1088,14 +1095,14 @@ static struct snd_soc_dai_driver sun4i_i
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
||||
- .formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
+ .formats = SUN4I_FORMATS,
|
||||
},
|
||||
.playback = {
|
||||
.stream_name = "Playback",
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.rates = SNDRV_PCM_RATE_8000_192000,
|
||||
- .formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
+ .formats = SUN4I_FORMATS,
|
||||
},
|
||||
.ops = &sun4i_i2s_dai_ops,
|
||||
.symmetric_rates = 1,
|
@ -15,7 +15,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
--- a/drivers/rtc/rtc-sun6i.c
|
||||
+++ b/drivers/rtc/rtc-sun6i.c
|
||||
@@ -639,7 +639,6 @@ static const struct rtc_class_ops sun6i_
|
||||
@@ -641,7 +641,6 @@ static const struct rtc_class_ops sun6i_
|
||||
.alarm_irq_enable = sun6i_rtc_alarm_irq_enable
|
||||
};
|
||||
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
/* Enable IRQ wake on suspend, to wake up from RTC. */
|
||||
static int sun6i_rtc_suspend(struct device *dev)
|
||||
{
|
||||
@@ -652,7 +651,7 @@ static int sun6i_rtc_suspend(struct devi
|
||||
@@ -654,7 +653,7 @@ static int sun6i_rtc_suspend(struct devi
|
||||
}
|
||||
|
||||
/* Disable IRQ wake on resume. */
|
||||
@ -32,7 +32,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
{
|
||||
struct sun6i_rtc_dev *chip = dev_get_drvdata(dev);
|
||||
|
||||
@@ -661,7 +660,6 @@ static int sun6i_rtc_resume(struct devic
|
||||
@@ -663,7 +662,6 @@ static int sun6i_rtc_resume(struct devic
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(sun6i_rtc_pm_ops,
|
||||
sun6i_rtc_suspend, sun6i_rtc_resume);
|
||||
@@ -733,6 +731,11 @@ static int sun6i_rtc_probe(struct platfo
|
||||
@@ -735,6 +733,11 @@ static int sun6i_rtc_probe(struct platfo
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
/*
|
||||
* As far as RTC functionality goes, all models are the same. The
|
||||
* datasheets claim that different models have different number of
|
||||
@@ -753,6 +756,7 @@ MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids
|
||||
@@ -755,6 +758,7 @@ MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids
|
||||
|
||||
static struct platform_driver sun6i_rtc_driver = {
|
||||
.probe = sun6i_rtc_probe,
|
@ -1,49 +0,0 @@
|
||||
From 9f0cbed8e957216d58a2dd5c9c8e795ec39004ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= <peron.clem@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:40 +0100
|
||||
Subject: [PATCH 08/44] ASoC: sun4i-i2s: Fix sun8i volatile regs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The FIFO TX reg is volatile and sun8i i2s register
|
||||
mapping is different from sun4i.
|
||||
|
||||
Even if in this case it's doesn't create an issue,
|
||||
Avoid setting some regs that are undefined in sun8i.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-8-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 15 +++++++++++----
|
||||
1 file changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -1162,12 +1162,19 @@ static bool sun8i_i2s_rd_reg(struct devi
|
||||
|
||||
static bool sun8i_i2s_volatile_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
- if (reg == SUN8I_I2S_INT_STA_REG)
|
||||
+ switch (reg) {
|
||||
+ case SUN4I_I2S_FIFO_CTRL_REG:
|
||||
+ case SUN4I_I2S_FIFO_RX_REG:
|
||||
+ case SUN4I_I2S_FIFO_STA_REG:
|
||||
+ case SUN4I_I2S_RX_CNT_REG:
|
||||
+ case SUN4I_I2S_TX_CNT_REG:
|
||||
+ case SUN8I_I2S_FIFO_TX_REG:
|
||||
+ case SUN8I_I2S_INT_STA_REG:
|
||||
return true;
|
||||
- if (reg == SUN8I_I2S_FIFO_TX_REG)
|
||||
- return false;
|
||||
|
||||
- return sun4i_i2s_volatile_reg(dev, reg);
|
||||
+ default:
|
||||
+ return false;
|
||||
+ }
|
||||
}
|
||||
|
||||
static const struct reg_default sun4i_i2s_reg_defaults[] = {
|
@ -1,53 +0,0 @@
|
||||
From de8ff7b3ac4736f5aa0c55968170bd449e46c88f Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Fri, 30 Oct 2020 15:46:41 +0100
|
||||
Subject: [PATCH 09/44] ASoC: sun4i-i2s: Fix setting of FIFO modes
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Because SUN4I_I2S_FIFO_CTRL_REG is volatile, writes done while the
|
||||
regmap is cache-only are ignored. To work around this, move the
|
||||
configuration to a callback that runs while the ASoC core has a
|
||||
runtime PM reference to the device.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-9-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -596,6 +596,13 @@ static int sun4i_i2s_hw_params(struct sn
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ /* Set significant bits in our FIFOs */
|
||||
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG,
|
||||
+ SUN4I_I2S_FIFO_CTRL_TX_MODE_MASK |
|
||||
+ SUN4I_I2S_FIFO_CTRL_RX_MODE_MASK,
|
||||
+ SUN4I_I2S_FIFO_CTRL_TX_MODE(1) |
|
||||
+ SUN4I_I2S_FIFO_CTRL_RX_MODE(1));
|
||||
+
|
||||
switch (params_physical_width(params)) {
|
||||
case 16:
|
||||
width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
@@ -924,13 +931,6 @@ static int sun4i_i2s_set_fmt(struct snd_
|
||||
return ret;
|
||||
}
|
||||
|
||||
- /* Set significant bits in our FIFOs */
|
||||
- regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG,
|
||||
- SUN4I_I2S_FIFO_CTRL_TX_MODE_MASK |
|
||||
- SUN4I_I2S_FIFO_CTRL_RX_MODE_MASK,
|
||||
- SUN4I_I2S_FIFO_CTRL_TX_MODE(1) |
|
||||
- SUN4I_I2S_FIFO_CTRL_RX_MODE(1));
|
||||
-
|
||||
i2s->format = fmt;
|
||||
|
||||
return 0;
|
@ -38,7 +38,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
if (ret < 0 || !rx_buf)
|
||||
goto out;
|
||||
|
||||
@@ -854,8 +855,13 @@ static void scpi_free_channels(void *dat
|
||||
@@ -856,8 +857,13 @@ static void scpi_free_channels(void *dat
|
||||
struct scpi_drvinfo *info = data;
|
||||
int i;
|
||||
|
||||
@ -54,7 +54,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
}
|
||||
|
||||
static int scpi_remove(struct platform_device *pdev)
|
||||
@@ -903,6 +909,7 @@ static int scpi_probe(struct platform_de
|
||||
@@ -913,6 +919,7 @@ static int scpi_probe(struct platform_de
|
||||
struct resource res;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
@ -62,7 +62,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
scpi_info = devm_kzalloc(dev, sizeof(*scpi_info), GFP_KERNEL);
|
||||
if (!scpi_info)
|
||||
@@ -916,6 +923,14 @@ static int scpi_probe(struct platform_de
|
||||
@@ -926,6 +933,14 @@ static int scpi_probe(struct platform_de
|
||||
dev_err(dev, "no mboxes property in '%pOF'\n", np);
|
||||
return -ENODEV;
|
||||
}
|
||||
@ -77,7 +77,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
scpi_info->channels = devm_kcalloc(dev, count, sizeof(struct scpi_chan),
|
||||
GFP_KERNEL);
|
||||
@@ -961,15 +976,34 @@ static int scpi_probe(struct platform_de
|
||||
@@ -974,15 +989,34 @@ static int scpi_probe(struct platform_de
|
||||
mutex_init(&pchan->xfers_lock);
|
||||
|
||||
ret = scpi_alloc_xfer_list(dev, pchan);
|
@ -34,7 +34,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
reg = <0x01d00000 0x80000>;
|
||||
--- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
@@ -123,6 +123,13 @@
|
||||
@@ -105,6 +105,13 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 82b0eb24d554180fdea8a254553dcce22085cc74 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= <peron.clem@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:42 +0100
|
||||
Subject: [PATCH 10/44] ASoC: sun4i-i2s: fix coding-style for callback
|
||||
definition
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Checkpatch script produces warning:
|
||||
WARNING: function definition argument 'const struct sun4i_i2s *'
|
||||
should also have an identifier name.
|
||||
|
||||
Let's fix this by adding identifier name to get_bclk_parent_rate()
|
||||
and set_fmt() callback definition.
|
||||
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-10-peron.clem@gmail.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-i2s.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/sound/soc/sunxi/sun4i-i2s.c
|
||||
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
||||
@@ -180,7 +180,7 @@ struct sun4i_i2s_quirks {
|
||||
const struct sun4i_i2s_clk_div *mclk_dividers;
|
||||
unsigned int num_mclk_dividers;
|
||||
|
||||
- unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
|
||||
+ unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *i2s);
|
||||
int (*get_sr)(unsigned int width);
|
||||
int (*get_wss)(unsigned int width);
|
||||
|
||||
@@ -192,7 +192,7 @@ struct sun4i_i2s_quirks {
|
||||
int (*set_chan_cfg)(const struct sun4i_i2s *i2s,
|
||||
unsigned int channels, unsigned int slots,
|
||||
unsigned int slot_width);
|
||||
- int (*set_fmt)(const struct sun4i_i2s *, unsigned int);
|
||||
+ int (*set_fmt)(const struct sun4i_i2s *i2s, unsigned int fmt);
|
||||
};
|
||||
|
||||
struct sun4i_i2s {
|
@ -1,45 +0,0 @@
|
||||
From 51ebc019df15b46d109bafe7068ebb6fe0b266b5 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Wed, 6 Jan 2021 19:19:01 +0100
|
||||
Subject: [PATCH 11/44] ARM: dts: sun8i: r40: Add deinterlace node
|
||||
|
||||
R40 contains deinterlace core compatible to that in H3. One peculiarity
|
||||
is that RAM gate is shared with CSI1. User manual states it's separate
|
||||
but that's not true. Shared gate was verified with BSP Linux code check
|
||||
and with runtime tests (CPU crashed if CSI1 gate was not ungated).
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Link: https://lore.kernel.org/r/20210106181901.1324075-3-jernej.skrabec@siol.net
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-r40.dtsi | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/sun8i-r40.dtsi
|
||||
+++ b/arch/arm/boot/dts/sun8i-r40.dtsi
|
||||
@@ -190,6 +190,25 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ deinterlace: deinterlace@1400000 {
|
||||
+ compatible = "allwinner,sun8i-r40-deinterlace",
|
||||
+ "allwinner,sun8i-h3-deinterlace";
|
||||
+ reg = <0x01400000 0x20000>;
|
||||
+ clocks = <&ccu CLK_BUS_DEINTERLACE>,
|
||||
+ <&ccu CLK_DEINTERLACE>,
|
||||
+ /*
|
||||
+ * NOTE: Contrary to what datasheet claims,
|
||||
+ * DRAM deinterlace gate doesn't exist and
|
||||
+ * it's shared with CSI1.
|
||||
+ */
|
||||
+ <&ccu CLK_DRAM_CSI1>;
|
||||
+ clock-names = "bus", "mod", "ram";
|
||||
+ resets = <&ccu RST_BUS_DEINTERLACE>;
|
||||
+ interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interconnects = <&mbus 9>;
|
||||
+ interconnect-names = "dma-mem";
|
||||
+ };
|
||||
+
|
||||
syscon: system-control@1c00000 {
|
||||
compatible = "allwinner,sun8i-r40-system-control",
|
||||
"allwinner,sun4i-a10-system-control";
|
@ -22,9 +22,9 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
+ };
|
||||
+
|
||||
sound: sound {
|
||||
compatible = "simple-audio-card";
|
||||
simple-audio-card,name = "sun50i-a64-audio";
|
||||
@@ -339,6 +346,19 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@@ -344,6 +351,19 @@
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
@ -1,38 +0,0 @@
|
||||
From 7166a5b6ab1f3d9ba0f5236b738525e828138c8e Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Wed, 6 Jan 2021 19:25:23 +0100
|
||||
Subject: [PATCH 12/44] arm64: dts: allwinner: h5: Add deinterlace node
|
||||
|
||||
Deinterlace core is completely compatible to H3.
|
||||
|
||||
Add a node for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Link: https://lore.kernel.org/r/20210106182523.1325796-1-jernej.skrabec@siol.net
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi
|
||||
@@ -121,6 +121,19 @@
|
||||
resets = <&ccu RST_BUS_CE>;
|
||||
};
|
||||
|
||||
+ deinterlace: deinterlace@1e00000 {
|
||||
+ compatible = "allwinner,sun8i-h3-deinterlace";
|
||||
+ reg = <0x01e00000 0x20000>;
|
||||
+ clocks = <&ccu CLK_BUS_DEINTERLACE>,
|
||||
+ <&ccu CLK_DEINTERLACE>,
|
||||
+ <&ccu CLK_DRAM_DEINTERLACE>;
|
||||
+ clock-names = "bus", "mod", "ram";
|
||||
+ resets = <&ccu RST_BUS_DEINTERLACE>;
|
||||
+ interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ interconnects = <&mbus 9>;
|
||||
+ interconnect-names = "dma-mem";
|
||||
+ };
|
||||
+
|
||||
mali: gpu@1e80000 {
|
||||
compatible = "allwinner,sun50i-h5-mali", "arm,mali-450";
|
||||
reg = <0x01e80000 0x30000>;
|
@ -24,7 +24,7 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
arm,no-tick-in-suspend;
|
||||
@@ -207,6 +214,19 @@
|
||||
@@ -196,6 +203,19 @@
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
@ -9,7 +9,7 @@ Subject: [PATCH 22/44] ASoC: hdmi-codec: fix channel allocation
|
||||
|
||||
--- a/sound/soc/codecs/hdmi-codec.c
|
||||
+++ b/sound/soc/codecs/hdmi-codec.c
|
||||
@@ -195,78 +195,69 @@ static const struct snd_pcm_chmap_elem h
|
||||
@@ -194,78 +194,69 @@ static const struct snd_pcm_chmap_elem h
|
||||
*/
|
||||
static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = {
|
||||
{ .ca_id = 0x00, .n_ch = 2,
|
@ -1,40 +0,0 @@
|
||||
From dcd9635dc6027b04a64e19ebb3dc15aaae082400 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Tue, 18 Feb 2020 19:24:29 +0100
|
||||
Subject: [PATCH 13/44] drm/sun4i: csc: Rework DE3 CSC macros
|
||||
|
||||
Rework DE3 CSC macros to take just one coordinate instead of two. This
|
||||
will make its usage easier in subsequent commit.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/gpu/drm/sun4i/sun8i_csc.c | 2 +-
|
||||
drivers/gpu/drm/sun4i/sun8i_mixer.h | 6 ++----
|
||||
2 files changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_csc.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_csc.c
|
||||
@@ -194,7 +194,7 @@ static void sun8i_de3_ccsc_set_coefficie
|
||||
return;
|
||||
}
|
||||
|
||||
- base_reg = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE, layer, 0, 0);
|
||||
+ base_reg = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE, layer, 0);
|
||||
regmap_bulk_write(map, base_reg, table, 12);
|
||||
}
|
||||
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.h
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h
|
||||
@@ -50,10 +50,8 @@
|
||||
#define SUN8I_MIXER_BLEND_CK_MIN(base, x) ((base) + 0xe0 + 0x04 * (x))
|
||||
#define SUN8I_MIXER_BLEND_OUTCTL(base) ((base) + 0xfc)
|
||||
#define SUN50I_MIXER_BLEND_CSC_CTL(base) ((base) + 0x100)
|
||||
-#define SUN50I_MIXER_BLEND_CSC_COEFF(base, layer, x, y) \
|
||||
- ((base) + 0x110 + (layer) * 0x30 + (x) * 0x10 + 4 * (y))
|
||||
-#define SUN50I_MIXER_BLEND_CSC_CONST(base, layer, i) \
|
||||
- ((base) + 0x110 + (layer) * 0x30 + (i) * 0x10 + 0x0c)
|
||||
+#define SUN50I_MIXER_BLEND_CSC_COEFF(base, layer, x) \
|
||||
+ ((base) + 0x110 + (layer) * 0x30 + (x) * 4)
|
||||
|
||||
#define SUN8I_MIXER_BLEND_PIPE_CTL_EN_MSK GENMASK(12, 8)
|
||||
#define SUN8I_MIXER_BLEND_PIPE_CTL_EN(pipe) BIT(8 + pipe)
|
@ -1,163 +0,0 @@
|
||||
From acdfa534d3fe6759f43c1fe0bcd2fd40f31d3797 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Tue, 18 Feb 2020 19:44:33 +0100
|
||||
Subject: [PATCH 14/44] drm/sun4i: de2/de3: Remove redundant CSC matrices
|
||||
|
||||
YUV to RGB matrices are almost identical to YVU to RGB matrices. They
|
||||
only have second and third column reversed. Do that reversion in code in
|
||||
order to lower amount of static data and redundancy.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/gpu/drm/sun4i/sun8i_csc.c | 99 +++++++++++--------------------
|
||||
1 file changed, 34 insertions(+), 65 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_csc.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_csc.c
|
||||
@@ -46,33 +46,6 @@ static const u32 yuv2rgb[2][2][12] = {
|
||||
},
|
||||
};
|
||||
|
||||
-static const u32 yvu2rgb[2][2][12] = {
|
||||
- [DRM_COLOR_YCBCR_LIMITED_RANGE] = {
|
||||
- [DRM_COLOR_YCBCR_BT601] = {
|
||||
- 0x000004A8, 0x00000662, 0x00000000, 0xFFFC8451,
|
||||
- 0x000004A8, 0xFFFFFCC0, 0xFFFFFE6F, 0x00021E4D,
|
||||
- 0x000004A8, 0x00000000, 0x00000811, 0xFFFBACA9,
|
||||
- },
|
||||
- [DRM_COLOR_YCBCR_BT709] = {
|
||||
- 0x000004A8, 0x0000072B, 0x00000000, 0xFFFC1F99,
|
||||
- 0x000004A8, 0xFFFFFDDF, 0xFFFFFF26, 0x00013383,
|
||||
- 0x000004A8, 0x00000000, 0x00000873, 0xFFFB7BEF,
|
||||
- }
|
||||
- },
|
||||
- [DRM_COLOR_YCBCR_FULL_RANGE] = {
|
||||
- [DRM_COLOR_YCBCR_BT601] = {
|
||||
- 0x00000400, 0x0000059B, 0x00000000, 0xFFFD322E,
|
||||
- 0x00000400, 0xFFFFFD25, 0xFFFFFEA0, 0x00021DD5,
|
||||
- 0x00000400, 0x00000000, 0x00000716, 0xFFFC74BD,
|
||||
- },
|
||||
- [DRM_COLOR_YCBCR_BT709] = {
|
||||
- 0x00000400, 0x0000064C, 0x00000000, 0xFFFCD9B4,
|
||||
- 0x00000400, 0xFFFFFE21, 0xFFFFFF41, 0x00014F96,
|
||||
- 0x00000400, 0x00000000, 0x0000076C, 0xFFFC49EF,
|
||||
- }
|
||||
- },
|
||||
-};
|
||||
-
|
||||
/*
|
||||
* DE3 has a bit different CSC units. Factors are in two's complement format.
|
||||
* First three factors in a row are multiplication factors which have 17 bits
|
||||
@@ -123,33 +96,6 @@ static const u32 yuv2rgb_de3[2][2][12] =
|
||||
},
|
||||
};
|
||||
|
||||
-static const u32 yvu2rgb_de3[2][2][12] = {
|
||||
- [DRM_COLOR_YCBCR_LIMITED_RANGE] = {
|
||||
- [DRM_COLOR_YCBCR_BT601] = {
|
||||
- 0x0002542A, 0x0003312A, 0x00000000, 0xFFC00000,
|
||||
- 0x0002542A, 0xFFFE5FC3, 0xFFFF376B, 0xFE000000,
|
||||
- 0x0002542A, 0x00000000, 0x000408D2, 0xFE000000,
|
||||
- },
|
||||
- [DRM_COLOR_YCBCR_BT709] = {
|
||||
- 0x0002542A, 0x000395E2, 0x00000000, 0xFFC00000,
|
||||
- 0x0002542A, 0xFFFEEF27, 0xFFFF92D2, 0xFE000000,
|
||||
- 0x0002542A, 0x00000000, 0x0004398C, 0xFE000000,
|
||||
- }
|
||||
- },
|
||||
- [DRM_COLOR_YCBCR_FULL_RANGE] = {
|
||||
- [DRM_COLOR_YCBCR_BT601] = {
|
||||
- 0x00020000, 0x0002CDD2, 0x00000000, 0x00000000,
|
||||
- 0x00020000, 0xFFFE925D, 0xFFFF4FCE, 0xFE000000,
|
||||
- 0x00020000, 0x00000000, 0x00038B43, 0xFE000000,
|
||||
- },
|
||||
- [DRM_COLOR_YCBCR_BT709] = {
|
||||
- 0x00020000, 0x0003264C, 0x00000000, 0x00000000,
|
||||
- 0x00020000, 0xFFFF1053, 0xFFFFA018, 0xFE000000,
|
||||
- 0x00020000, 0x00000000, 0x0003B611, 0xFE000000,
|
||||
- }
|
||||
- },
|
||||
-};
|
||||
-
|
||||
static void sun8i_csc_set_coefficients(struct regmap *map, u32 base,
|
||||
enum sun8i_csc_mode mode,
|
||||
enum drm_color_encoding encoding,
|
||||
@@ -157,21 +103,30 @@ static void sun8i_csc_set_coefficients(s
|
||||
{
|
||||
const u32 *table;
|
||||
u32 base_reg;
|
||||
+ int i;
|
||||
+
|
||||
+ table = yuv2rgb[range][encoding];
|
||||
|
||||
switch (mode) {
|
||||
case SUN8I_CSC_MODE_YUV2RGB:
|
||||
- table = yuv2rgb[range][encoding];
|
||||
+ base_reg = SUN8I_CSC_COEFF(base, 0);
|
||||
+ regmap_bulk_write(map, base_reg, table, 12);
|
||||
break;
|
||||
case SUN8I_CSC_MODE_YVU2RGB:
|
||||
- table = yvu2rgb[range][encoding];
|
||||
+ for (i = 0; i < 12; i++) {
|
||||
+ if ((i & 3) == 1)
|
||||
+ base_reg = SUN8I_CSC_COEFF(base, i + 1);
|
||||
+ else if ((i & 3) == 2)
|
||||
+ base_reg = SUN8I_CSC_COEFF(base, i - 1);
|
||||
+ else
|
||||
+ base_reg = SUN8I_CSC_COEFF(base, i);
|
||||
+ regmap_write(map, base_reg, table[i]);
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
DRM_WARN("Wrong CSC mode specified.\n");
|
||||
return;
|
||||
}
|
||||
-
|
||||
- base_reg = SUN8I_CSC_COEFF(base, 0);
|
||||
- regmap_bulk_write(map, base_reg, table, 12);
|
||||
}
|
||||
|
||||
static void sun8i_de3_ccsc_set_coefficients(struct regmap *map, int layer,
|
||||
@@ -180,22 +135,36 @@ static void sun8i_de3_ccsc_set_coefficie
|
||||
enum drm_color_range range)
|
||||
{
|
||||
const u32 *table;
|
||||
- u32 base_reg;
|
||||
+ u32 addr;
|
||||
+ int i;
|
||||
+
|
||||
+ table = yuv2rgb_de3[range][encoding];
|
||||
|
||||
switch (mode) {
|
||||
case SUN8I_CSC_MODE_YUV2RGB:
|
||||
- table = yuv2rgb_de3[range][encoding];
|
||||
+ addr = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE, layer, 0);
|
||||
+ regmap_bulk_write(map, addr, table, 12);
|
||||
break;
|
||||
case SUN8I_CSC_MODE_YVU2RGB:
|
||||
- table = yvu2rgb_de3[range][encoding];
|
||||
+ for (i = 0; i < 12; i++) {
|
||||
+ if ((i & 3) == 1)
|
||||
+ addr = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE,
|
||||
+ layer,
|
||||
+ i + 1);
|
||||
+ else if ((i & 3) == 2)
|
||||
+ addr = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE,
|
||||
+ layer,
|
||||
+ i - 1);
|
||||
+ else
|
||||
+ addr = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE,
|
||||
+ layer, i);
|
||||
+ regmap_write(map, addr, table[i]);
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
DRM_WARN("Wrong CSC mode specified.\n");
|
||||
return;
|
||||
}
|
||||
-
|
||||
- base_reg = SUN50I_MIXER_BLEND_CSC_COEFF(DE3_BLD_BASE, layer, 0);
|
||||
- regmap_bulk_write(map, base_reg, table, 12);
|
||||
}
|
||||
|
||||
static void sun8i_csc_enable(struct regmap *map, u32 base, bool enable)
|
@ -0,0 +1,45 @@
|
||||
From 229e5bdcd39ed3ca0a71dc8500ba4ea90d4415db Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sun, 6 Jun 2021 10:23:13 +0200
|
||||
Subject: [PATCH] media: hevc: Add segment address field
|
||||
|
||||
If HEVC frame consists of multiple slices, segment address has to be
|
||||
known in order to properly decode it.
|
||||
|
||||
Add segment address field to slice parameters.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst | 3 +++
|
||||
include/media/hevc-ctrls.h | 3 ++-
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
|
||||
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
|
||||
@@ -3000,6 +3000,9 @@ enum v4l2_mpeg_video_hevc_size_of_length
|
||||
* - __u8
|
||||
- ``pic_struct``
|
||||
-
|
||||
+ * - __u32
|
||||
+ - ``slice_segment_addr``
|
||||
+ -
|
||||
* - __u8
|
||||
- ``ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
- The list of L0 reference elements as indices in the DPB.
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -196,10 +196,11 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u8 pic_struct;
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
+ __u32 slice_segment_addr;
|
||||
__u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
__u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
|
||||
- __u8 padding[5];
|
||||
+ __u8 padding;
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */
|
||||
struct v4l2_hevc_pred_weight_table pred_weight_table;
|
@ -1,62 +0,0 @@
|
||||
From 2c9a7a5a71d5ed6db9ee28a5ccd11f0db45f574d Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Wed, 15 Apr 2020 10:24:05 +0200
|
||||
Subject: [PATCH 15/44] drm/sun4i: Add support for BT2020 to DE3
|
||||
|
||||
DE3 supports 10-bit formats, so it's only naturally to also support
|
||||
BT2020 encoding.
|
||||
|
||||
Add support for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/gpu/drm/sun4i/sun8i_csc.c | 12 +++++++++++-
|
||||
drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 2 ++
|
||||
2 files changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_csc.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_csc.c
|
||||
@@ -69,7 +69,7 @@ static const u32 yuv2rgb[2][2][12] = {
|
||||
* c20 c21 c22 [d2 const2]
|
||||
*/
|
||||
|
||||
-static const u32 yuv2rgb_de3[2][2][12] = {
|
||||
+static const u32 yuv2rgb_de3[2][3][12] = {
|
||||
[DRM_COLOR_YCBCR_LIMITED_RANGE] = {
|
||||
[DRM_COLOR_YCBCR_BT601] = {
|
||||
0x0002542A, 0x00000000, 0x0003312A, 0xFFC00000,
|
||||
@@ -80,6 +80,11 @@ static const u32 yuv2rgb_de3[2][2][12] =
|
||||
0x0002542A, 0x00000000, 0x000395E2, 0xFFC00000,
|
||||
0x0002542A, 0xFFFF92D2, 0xFFFEEF27, 0xFE000000,
|
||||
0x0002542A, 0x0004398C, 0x00000000, 0xFE000000,
|
||||
+ },
|
||||
+ [DRM_COLOR_YCBCR_BT2020] = {
|
||||
+ 0x0002542A, 0x00000000, 0x00035B7B, 0xFFC00000,
|
||||
+ 0x0002542A, 0xFFFFA017, 0xFFFEB2FC, 0xFE000000,
|
||||
+ 0x0002542A, 0x00044896, 0x00000000, 0xFE000000,
|
||||
}
|
||||
},
|
||||
[DRM_COLOR_YCBCR_FULL_RANGE] = {
|
||||
@@ -92,6 +97,11 @@ static const u32 yuv2rgb_de3[2][2][12] =
|
||||
0x00020000, 0x00000000, 0x0003264C, 0x00000000,
|
||||
0x00020000, 0xFFFFA018, 0xFFFF1053, 0xFE000000,
|
||||
0x00020000, 0x0003B611, 0x00000000, 0xFE000000,
|
||||
+ },
|
||||
+ [DRM_COLOR_YCBCR_BT2020] = {
|
||||
+ 0x00020000, 0x00000000, 0x0002F2FE, 0x00000000,
|
||||
+ 0x00020000, 0xFFFFABC0, 0xFFFEDB78, 0xFE000000,
|
||||
+ 0x00020000, 0x0003C346, 0x00000000, 0xFE000000,
|
||||
}
|
||||
},
|
||||
};
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_vi_layer.c
|
||||
@@ -543,6 +543,8 @@ struct sun8i_vi_layer *sun8i_vi_layer_in
|
||||
|
||||
supported_encodings = BIT(DRM_COLOR_YCBCR_BT601) |
|
||||
BIT(DRM_COLOR_YCBCR_BT709);
|
||||
+ if (mixer->cfg->is_de3)
|
||||
+ supported_encodings |= BIT(DRM_COLOR_YCBCR_BT2020);
|
||||
|
||||
supported_ranges = BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
|
||||
BIT(DRM_COLOR_YCBCR_FULL_RANGE);
|
@ -0,0 +1,180 @@
|
||||
From 478e8d8b3997e15825c49f6f716faf26e1becaeb Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Gaignard <benjamin.gaignard@collabora.com>
|
||||
Date: Thu, 15 Jul 2021 17:12:22 +0200
|
||||
Subject: [PATCH] media: hevc: Add scaling matrix control
|
||||
|
||||
HEVC scaling lists are used for the scaling process for transform
|
||||
coefficients.
|
||||
V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED has to set when they are
|
||||
encoded in the bitstream.
|
||||
|
||||
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
|
||||
Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Reviewed-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
.../media/v4l/ext-ctrls-codec.rst | 57 +++++++++++++++++++
|
||||
.../media/v4l/vidioc-queryctrl.rst | 6 ++
|
||||
drivers/media/v4l2-core/v4l2-ctrls-core.c | 6 ++
|
||||
drivers/media/v4l2-core/v4l2-ctrls-defs.c | 4 ++
|
||||
include/media/hevc-ctrls.h | 11 ++++
|
||||
5 files changed, 84 insertions(+)
|
||||
|
||||
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
|
||||
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
|
||||
@@ -3071,6 +3071,63 @@ enum v4l2_mpeg_video_hevc_size_of_length
|
||||
|
||||
\normalsize
|
||||
|
||||
+``V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (struct)``
|
||||
+ Specifies the HEVC scaling matrix parameters used for the scaling process
|
||||
+ for transform coefficients.
|
||||
+ These matrix and parameters are defined according to :ref:`hevc`.
|
||||
+ They are described in section 7.4.5 "Scaling list data semantics" of
|
||||
+ the specification.
|
||||
+
|
||||
+.. c:type:: v4l2_ctrl_hevc_scaling_matrix
|
||||
+
|
||||
+.. raw:: latex
|
||||
+
|
||||
+ \scriptsize
|
||||
+
|
||||
+.. tabularcolumns:: |p{5.4cm}|p{6.8cm}|p{5.1cm}|
|
||||
+
|
||||
+.. cssclass:: longtable
|
||||
+
|
||||
+.. flat-table:: struct v4l2_ctrl_hevc_scaling_matrix
|
||||
+ :header-rows: 0
|
||||
+ :stub-columns: 0
|
||||
+ :widths: 1 1 2
|
||||
+
|
||||
+ * - __u8
|
||||
+ - ``scaling_list_4x4[6][16]``
|
||||
+ - Scaling list is used for the scaling process for transform
|
||||
+ coefficients. The values on each scaling list are expected
|
||||
+ in raster scan order.
|
||||
+ * - __u8
|
||||
+ - ``scaling_list_8x8[6][64]``
|
||||
+ - Scaling list is used for the scaling process for transform
|
||||
+ coefficients. The values on each scaling list are expected
|
||||
+ in raster scan order.
|
||||
+ * - __u8
|
||||
+ - ``scaling_list_16x16[6][64]``
|
||||
+ - Scaling list is used for the scaling process for transform
|
||||
+ coefficients. The values on each scaling list are expected
|
||||
+ in raster scan order.
|
||||
+ * - __u8
|
||||
+ - ``scaling_list_32x32[2][64]``
|
||||
+ - Scaling list is used for the scaling process for transform
|
||||
+ coefficients. The values on each scaling list are expected
|
||||
+ in raster scan order.
|
||||
+ * - __u8
|
||||
+ - ``scaling_list_dc_coef_16x16[6]``
|
||||
+ - Scaling list is used for the scaling process for transform
|
||||
+ coefficients. The values on each scaling list are expected
|
||||
+ in raster scan order.
|
||||
+ * - __u8
|
||||
+ - ``scaling_list_dc_coef_32x32[2]``
|
||||
+ - Scaling list is used for the scaling process for transform
|
||||
+ coefficients. The values on each scaling list are expected
|
||||
+ in raster scan order.
|
||||
+
|
||||
+.. raw:: latex
|
||||
+
|
||||
+ \normalsize
|
||||
+
|
||||
.. c:type:: v4l2_hevc_dpb_entry
|
||||
|
||||
.. raw:: latex
|
||||
--- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
|
||||
+++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst
|
||||
@@ -495,6 +495,12 @@ See also the examples in :ref:`control`.
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_hevc_slice_params`, containing HEVC
|
||||
slice parameters for stateless video decoders.
|
||||
+ * - ``V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX``
|
||||
+ - n/a
|
||||
+ - n/a
|
||||
+ - n/a
|
||||
+ - A struct :c:type:`v4l2_ctrl_hevc_scaling_matrix`, containing HEVC
|
||||
+ scaling matrix for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_VP8_FRAME``
|
||||
- n/a
|
||||
- n/a
|
||||
--- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
|
||||
+++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
|
||||
@@ -687,6 +687,9 @@ static int std_validate_compound(const s
|
||||
|
||||
break;
|
||||
|
||||
+ case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
|
||||
+ break;
|
||||
+
|
||||
case V4L2_CTRL_TYPE_AREA:
|
||||
area = p;
|
||||
if (!area->width || !area->height)
|
||||
@@ -1240,6 +1243,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(s
|
||||
case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
|
||||
elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params);
|
||||
break;
|
||||
+ case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
|
||||
+ elem_size = sizeof(struct v4l2_ctrl_hevc_scaling_matrix);
|
||||
+ break;
|
||||
case V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS:
|
||||
elem_size = sizeof(struct v4l2_ctrl_hevc_decode_params);
|
||||
break;
|
||||
--- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
|
||||
+++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
|
||||
@@ -996,6 +996,7 @@ const char *v4l2_ctrl_get_name(u32 id)
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_SPS: return "HEVC Sequence Parameter Set";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_PPS: return "HEVC Picture Parameter Set";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS: return "HEVC Slice Parameters";
|
||||
+ case V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX: return "HEVC Scaling Matrix";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS: return "HEVC Decode Parameters";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE: return "HEVC Decode Mode";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE: return "HEVC Start Code";
|
||||
@@ -1488,6 +1489,9 @@ void v4l2_ctrl_fill(u32 id, const char *
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:
|
||||
*type = V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS;
|
||||
break;
|
||||
+ case V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX:
|
||||
+ *type = V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX;
|
||||
+ break;
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS:
|
||||
*type = V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS;
|
||||
break;
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_CODEC_BASE + 1008)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_CODEC_BASE + 1009)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_BASE + 1010)
|
||||
+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_BASE + 1011)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_BASE + 1012)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_CODEC_BASE + 1015)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_CODEC_BASE + 1016)
|
||||
@@ -27,6 +28,7 @@
|
||||
#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120
|
||||
#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121
|
||||
#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122
|
||||
+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123
|
||||
#define V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS 0x0124
|
||||
|
||||
enum v4l2_mpeg_video_hevc_decode_mode {
|
||||
@@ -225,6 +227,15 @@ struct v4l2_ctrl_hevc_decode_params {
|
||||
__u64 flags;
|
||||
};
|
||||
|
||||
+struct v4l2_ctrl_hevc_scaling_matrix {
|
||||
+ __u8 scaling_list_4x4[6][16];
|
||||
+ __u8 scaling_list_8x8[6][64];
|
||||
+ __u8 scaling_list_16x16[6][64];
|
||||
+ __u8 scaling_list_32x32[2][64];
|
||||
+ __u8 scaling_list_dc_coef_16x16[6];
|
||||
+ __u8 scaling_list_dc_coef_32x32[2];
|
||||
+};
|
||||
+
|
||||
/* MPEG-class control IDs specific to the Hantro driver as defined by V4L2 */
|
||||
#define V4L2_CID_CODEC_HANTRO_BASE (V4L2_CTRL_CLASS_CODEC | 0x1200)
|
||||
/*
|
@ -1,12 +1,14 @@
|
||||
From d99740197a9776b9332d21b9f3b05dab658a90eb Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 26 Oct 2019 15:44:15 +0200
|
||||
Subject: [PATCH 26/44] media: cedrus: hevc: Add support for multiple slices
|
||||
From d92a4a27d983032267b231a32be98a11a9995e5c Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sun, 6 Jun 2021 10:23:14 +0200
|
||||
Subject: [PATCH] media: cedrus: hevc: Add support for multiple slices
|
||||
|
||||
Now that segment address is available, support for multi-slice frames
|
||||
can be easily added.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
.../staging/media/sunxi/cedrus/cedrus_h265.c | 26 ++++++++++++-------
|
||||
.../staging/media/sunxi/cedrus/cedrus_video.c | 1 +
|
||||
@ -14,17 +16,17 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -309,6 +309,8 @@ static void cedrus_h265_setup(struct ced
|
||||
const struct v4l2_ctrl_hevc_pps *pps;
|
||||
@@ -247,6 +247,8 @@ static void cedrus_h265_setup(struct ced
|
||||
const struct v4l2_ctrl_hevc_slice_params *slice_params;
|
||||
const struct v4l2_ctrl_hevc_decode_params *decode_params;
|
||||
const struct v4l2_hevc_pred_weight_table *pred_weight_table;
|
||||
+ unsigned int width_in_ctb_luma, ctb_size_luma;
|
||||
+ unsigned int log2_max_luma_coding_block_size;
|
||||
dma_addr_t src_buf_addr;
|
||||
dma_addr_t src_buf_end_addr;
|
||||
u32 chroma_log2_weight_denom;
|
||||
@@ -321,15 +323,17 @@ static void cedrus_h265_setup(struct ced
|
||||
slice_params = run->h265.slice_params;
|
||||
@@ -260,15 +262,17 @@ static void cedrus_h265_setup(struct ced
|
||||
decode_params = run->h265.decode_params;
|
||||
pred_weight_table = &slice_params->pred_weight_table;
|
||||
|
||||
+ log2_max_luma_coding_block_size =
|
||||
@ -46,7 +48,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
/*
|
||||
* Each CTB requires a MV col buffer with a specific unit size.
|
||||
@@ -383,15 +387,17 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -322,15 +326,17 @@ static void cedrus_h265_setup(struct ced
|
||||
reg = VE_DEC_H265_BITS_END_ADDR_BASE(src_buf_end_addr);
|
||||
cedrus_write(dev, VE_DEC_H265_BITS_END_ADDR, reg);
|
||||
|
||||
@ -67,9 +69,9 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
/* Initialize bitstream access. */
|
||||
cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_INIT_SWDEC);
|
||||
@@ -543,8 +549,8 @@ static void cedrus_h265_setup(struct ced
|
||||
V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT,
|
||||
pps->flags);
|
||||
@@ -482,8 +488,8 @@ static void cedrus_h265_setup(struct ced
|
||||
V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT,
|
||||
slice_params->flags);
|
||||
|
||||
- /* FIXME: For multi-slice support. */
|
||||
- reg |= VE_DEC_H265_DEC_SLICE_HDR_INFO0_FLAG_FIRST_SLICE_SEGMENT_IN_PIC;
|
||||
@ -80,7 +82,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -332,6 +332,7 @@ static int cedrus_s_fmt_vid_out(struct f
|
||||
@@ -340,6 +340,7 @@ static int cedrus_s_fmt_vid_out(struct f
|
||||
|
||||
switch (ctx->src_fmt.pixelformat) {
|
||||
case V4L2_PIX_FMT_H264_SLICE:
|
@ -1,27 +0,0 @@
|
||||
From e689f3536e632e26166e66eac88728c6653a18b6 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Tue, 12 Jan 2021 23:24:21 -0600
|
||||
Subject: [PATCH 16/44] mmc: sunxi-mmc: Ensure host is suspended during system
|
||||
sleep
|
||||
|
||||
If the device suspend process begins before the mmc host's autosuspend
|
||||
timeout, the host will continue running during system sleep. Avoid
|
||||
this by forcing runtime suspend during a global suspend transition.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Acked-by: Maxime Ripard <mripard@kernel.org>
|
||||
---
|
||||
drivers/mmc/host/sunxi-mmc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/mmc/host/sunxi-mmc.c
|
||||
+++ b/drivers/mmc/host/sunxi-mmc.c
|
||||
@@ -1506,6 +1506,8 @@ static int sunxi_mmc_runtime_suspend(str
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops sunxi_mmc_pm_ops = {
|
||||
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
|
||||
+ pm_runtime_force_resume)
|
||||
SET_RUNTIME_PM_OPS(sunxi_mmc_runtime_suspend,
|
||||
sunxi_mmc_runtime_resume,
|
||||
NULL)
|
@ -1,42 +0,0 @@
|
||||
From e019a54d084020e6acc2869da341b376700bfe4c Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Fri, 30 Oct 2020 15:46:44 +0100
|
||||
Subject: [PATCH 17/44] arm64: dts: allwinner: h6: Add I2S1 node
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add Allwinner H6 I2S1 node connected to HDMI interface.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Acked-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-12-peron.clem@gmail.com
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
@@ -609,6 +609,19 @@
|
||||
};
|
||||
};
|
||||
|
||||
+ i2s1: i2s@5091000 {
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ compatible = "allwinner,sun50i-h6-i2s";
|
||||
+ reg = <0x05091000 0x1000>;
|
||||
+ interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_I2S1>, <&ccu CLK_I2S1>;
|
||||
+ clock-names = "apb", "mod";
|
||||
+ dmas = <&dma 4>, <&dma 4>;
|
||||
+ resets = <&ccu RST_BUS_I2S1>;
|
||||
+ dma-names = "rx", "tx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
spdif: spdif@5093000 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "allwinner,sun50i-h6-spdif";
|
@ -1,29 +1,30 @@
|
||||
From b4b79b4eeacb63f0a72c866526e4a2021a201090 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 26 Oct 2019 13:58:49 +0200
|
||||
Subject: [PATCH 24/44] media: cedrus: hevc: Add support for scaling matrix
|
||||
From 297289d611b802ecd232df6cab02987f9059c3bc Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sun, 6 Jun 2021 08:50:50 +0200
|
||||
Subject: [PATCH] media: cedrus: hevc: Add support for scaling lists
|
||||
|
||||
HEVC frames may use scaling list feature. Add support for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.c | 7 ++
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.c | 6 ++
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.h | 1 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_dec.c | 2 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_h265.c | 70 ++++++++++++++++++-
|
||||
.../staging/media/sunxi/cedrus/cedrus_regs.h | 2 +
|
||||
5 files changed, 81 insertions(+), 1 deletion(-)
|
||||
5 files changed, 80 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
@@ -126,6 +126,13 @@ static const struct cedrus_control cedru
|
||||
@@ -137,6 +137,12 @@ static const struct cedrus_control cedru
|
||||
},
|
||||
{
|
||||
.cfg = {
|
||||
+ .id = V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX,
|
||||
+ },
|
||||
+ .codec = CEDRUS_CODEC_H265,
|
||||
+ .required = true,
|
||||
+ },
|
||||
+ {
|
||||
+ .cfg = {
|
||||
@ -32,25 +33,25 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
.def = V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED,
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -74,6 +74,7 @@ struct cedrus_h265_run {
|
||||
const struct v4l2_ctrl_hevc_sps *sps;
|
||||
@@ -78,6 +78,7 @@ struct cedrus_h265_run {
|
||||
const struct v4l2_ctrl_hevc_pps *pps;
|
||||
const struct v4l2_ctrl_hevc_slice_params *slice_params;
|
||||
const struct v4l2_ctrl_hevc_decode_params *decode_params;
|
||||
+ const struct v4l2_ctrl_hevc_scaling_matrix *scaling_matrix;
|
||||
};
|
||||
|
||||
struct cedrus_run {
|
||||
struct cedrus_vp8_run {
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
|
||||
@@ -68,6 +68,8 @@ void cedrus_device_run(void *priv)
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_PPS);
|
||||
run.h265.slice_params = cedrus_find_control_data(ctx,
|
||||
@@ -72,6 +72,8 @@ void cedrus_device_run(void *priv)
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS);
|
||||
run.h265.decode_params = cedrus_find_control_data(ctx,
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS);
|
||||
+ run.h265.scaling_matrix = cedrus_find_control_data(ctx,
|
||||
+ V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX);
|
||||
break;
|
||||
|
||||
default:
|
||||
case V4L2_PIX_FMT_VP8_FRAME:
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -238,6 +238,69 @@ static void cedrus_h265_skip_bits(struct
|
||||
@ -123,7 +124,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
static void cedrus_h265_setup(struct cedrus_ctx *ctx,
|
||||
struct cedrus_run *run)
|
||||
{
|
||||
@@ -519,7 +582,12 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -527,7 +590,12 @@ static void cedrus_h265_setup(struct ced
|
||||
|
||||
/* Scaling list. */
|
||||
|
||||
@ -139,7 +140,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
/* Neightbor information address. */
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
@@ -493,6 +493,8 @@
|
||||
@@ -494,6 +494,8 @@
|
||||
#define VE_DEC_H265_ENTRY_POINT_OFFSET_ADDR (VE_ENGINE_DEC_H265 + 0x64)
|
||||
#define VE_DEC_H265_TILE_START_CTB (VE_ENGINE_DEC_H265 + 0x68)
|
||||
#define VE_DEC_H265_TILE_END_CTB (VE_ENGINE_DEC_H265 + 0x6c)
|
@ -1,43 +0,0 @@
|
||||
From 0175a3d5680924d3d64ee8181b50c8b06ee715d1 Mon Sep 17 00:00:00 2001
|
||||
From: Marcus Cooper <codekipper@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:45 +0100
|
||||
Subject: [PATCH 18/44] arm64: dts: allwinner: a64: Add I2S2 node
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add the I2S2 node connected to the HDMI interface.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Acked-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-13-peron.clem@gmail.com
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
@@ -846,6 +846,20 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ i2s2: i2s@1c22800 {
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ compatible = "allwinner,sun50i-a64-i2s",
|
||||
+ "allwinner,sun8i-h3-i2s";
|
||||
+ reg = <0x01c22800 0x400>;
|
||||
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_I2S2>, <&ccu CLK_I2S2>;
|
||||
+ clock-names = "apb", "mod";
|
||||
+ resets = <&ccu RST_BUS_I2S2>;
|
||||
+ dma-names = "rx", "tx";
|
||||
+ dmas = <&dma 27>, <&dma 27>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
dai: dai@1c22c00 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "allwinner,sun50i-a64-codec-i2s";
|
@ -12,15 +12,15 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -135,6 +135,8 @@ struct cedrus_ctx {
|
||||
@@ -144,6 +144,8 @@ struct cedrus_ctx {
|
||||
ssize_t mv_col_buf_unit_size;
|
||||
void *neighbor_info_buf;
|
||||
dma_addr_t neighbor_info_buf_addr;
|
||||
+ void *entry_points_buf;
|
||||
+ dma_addr_t entry_points_buf_addr;
|
||||
} h265;
|
||||
} codec;
|
||||
};
|
||||
struct {
|
||||
unsigned int last_frame_p_type;
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -301,6 +301,61 @@ static void cedrus_h265_write_scaling_li
|
||||
@ -85,7 +85,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
static void cedrus_h265_setup(struct cedrus_ctx *ctx,
|
||||
struct cedrus_run *run)
|
||||
{
|
||||
@@ -311,6 +366,7 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -312,6 +367,7 @@ static void cedrus_h265_setup(struct ced
|
||||
const struct v4l2_hevc_pred_weight_table *pred_weight_table;
|
||||
unsigned int width_in_ctb_luma, ctb_size_luma;
|
||||
unsigned int log2_max_luma_coding_block_size;
|
||||
@ -93,7 +93,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
dma_addr_t src_buf_addr;
|
||||
dma_addr_t src_buf_end_addr;
|
||||
u32 chroma_log2_weight_denom;
|
||||
@@ -388,12 +444,19 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -390,12 +446,19 @@ static void cedrus_h265_setup(struct ced
|
||||
cedrus_write(dev, VE_DEC_H265_BITS_END_ADDR, reg);
|
||||
|
||||
/* Coding tree block address */
|
||||
@ -117,7 +117,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
/* Clear the number of correctly-decoded coding tree blocks. */
|
||||
if (ctx->fh.m2m_ctx->new_frame)
|
||||
@@ -497,7 +560,9 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -499,7 +562,9 @@ static void cedrus_h265_setup(struct ced
|
||||
V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED,
|
||||
pps->flags);
|
||||
|
||||
@ -128,7 +128,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
reg |= VE_DEC_H265_FLAG(VE_DEC_H265_DEC_PPS_CTRL1_FLAG_TRANSQUANT_BYPASS_ENABLED,
|
||||
V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED,
|
||||
@@ -573,12 +638,14 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -575,12 +640,14 @@ static void cedrus_h265_setup(struct ced
|
||||
|
||||
chroma_log2_weight_denom = pred_weight_table->luma_log2_weight_denom +
|
||||
pred_weight_table->delta_chroma_log2_weight_denom;
|
||||
@ -144,7 +144,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
/* Decoded picture size. */
|
||||
|
||||
reg = VE_DEC_H265_DEC_PIC_SIZE_WIDTH(ctx->src_fmt.width) |
|
||||
@@ -672,6 +739,17 @@ static int cedrus_h265_start(struct cedr
|
||||
@@ -674,6 +741,17 @@ static int cedrus_h265_start(struct cedr
|
||||
if (!ctx->codec.h265.neighbor_info_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -162,7 +162,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -690,6 +768,9 @@ static void cedrus_h265_stop(struct cedr
|
||||
@@ -692,6 +770,9 @@ static void cedrus_h265_stop(struct cedr
|
||||
dma_free_coherent(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
|
||||
ctx->codec.h265.neighbor_info_buf,
|
||||
ctx->codec.h265.neighbor_info_buf_addr);
|
@ -1,42 +0,0 @@
|
||||
From fd67e65487b4e5e2a93df2868043302a99f93098 Mon Sep 17 00:00:00 2001
|
||||
From: Marcus Cooper <codekipper@gmail.com>
|
||||
Date: Fri, 30 Oct 2020 15:46:48 +0100
|
||||
Subject: [PATCH 19/44] arm: dts: sunxi: h3/h5: Add I2S2 node
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Add H3/H5 I2S2 node connected to the HDMI interface.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
||||
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Acked-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Link: https://lore.kernel.org/r/20201030144648.397824-16-peron.clem@gmail.com
|
||||
---
|
||||
arch/arm/boot/dts/sunxi-h3-h5.dtsi | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
--- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
@@ -662,6 +662,19 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ i2s2: i2s@1c22800 {
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ compatible = "allwinner,sun8i-h3-i2s";
|
||||
+ reg = <0x01c22800 0x400>;
|
||||
+ interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&ccu CLK_BUS_I2S2>, <&ccu CLK_I2S2>;
|
||||
+ clock-names = "apb", "mod";
|
||||
+ dmas = <&dma 27>;
|
||||
+ resets = <&ccu RST_BUS_I2S2>;
|
||||
+ dma-names = "tx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
codec: codec@1c22c00 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "allwinner,sun8i-h3-codec";
|
@ -11,7 +11,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -149,6 +149,7 @@ struct cedrus_dec_ops {
|
||||
@@ -166,6 +166,7 @@ struct cedrus_dec_ops {
|
||||
int (*start)(struct cedrus_ctx *ctx);
|
||||
void (*stop)(struct cedrus_ctx *ctx);
|
||||
void (*trigger)(struct cedrus_ctx *ctx);
|
||||
@ -21,7 +21,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
struct cedrus_variant {
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -455,6 +455,18 @@ static int cedrus_buf_prepare(struct vb2
|
||||
@@ -469,6 +469,18 @@ static int cedrus_buf_prepare(struct vb2
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count)
|
||||
{
|
||||
struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
@@ -535,6 +547,7 @@ static void cedrus_buf_request_complete(
|
||||
@@ -551,6 +563,7 @@ static void cedrus_buf_request_complete(
|
||||
static struct vb2_ops cedrus_qops = {
|
||||
.queue_setup = cedrus_queue_setup,
|
||||
.buf_prepare = cedrus_buf_prepare,
|
@ -1,47 +0,0 @@
|
||||
From 3c970c9e87e403b190407dec5c6e4745aef78e6a Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Fri, 30 Oct 2020 18:25:30 +0100
|
||||
Subject: [PATCH 20/44] arm64: dts: allwinner: h6: PineH64 model B: Add wifi
|
||||
|
||||
PineH64 model B contains RTL8723CS wifi+bt combo module.
|
||||
|
||||
Since bluetooth support is not yet squared away, only wifi is enabled
|
||||
for now.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Tested-by: <clabbe.montjoie@gmail.com>
|
||||
Acked-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Link: https://lore.kernel.org/r/20201030172530.1096394-1-jernej.skrabec@siol.net
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-pine-h64-model-b.dts | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64-model-b.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64-model-b.dts
|
||||
@@ -10,6 +10,12 @@
|
||||
compatible = "pine64,pine-h64-model-b", "allwinner,sun50i-h6";
|
||||
|
||||
/delete-node/ reg_gmac_3v3;
|
||||
+
|
||||
+ wifi_pwrseq: wifi_pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ reset-gpios = <&r_pio 1 3 GPIO_ACTIVE_LOW>; /* PM3 */
|
||||
+ post-power-on-delay-ms = <200>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&hdmi_connector {
|
||||
@@ -19,3 +25,12 @@
|
||||
&emac {
|
||||
phy-supply = <®_aldo2>;
|
||||
};
|
||||
+
|
||||
+&mmc1 {
|
||||
+ vmmc-supply = <®_cldo3>;
|
||||
+ vqmmc-supply = <®_aldo1>;
|
||||
+ mmc-pwrseq = <&wifi_pwrseq>;
|
||||
+ bus-width = <4>;
|
||||
+ non-removable;
|
||||
+ status = "okay";
|
||||
+};
|
@ -11,7 +11,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -96,6 +96,11 @@ struct cedrus_buffer {
|
||||
@@ -105,6 +105,11 @@ struct cedrus_buffer {
|
||||
unsigned int position;
|
||||
enum cedrus_h264_pic_type pic_type;
|
||||
} h264;
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
} codec;
|
||||
};
|
||||
|
||||
@@ -129,10 +134,6 @@ struct cedrus_ctx {
|
||||
@@ -138,10 +143,6 @@ struct cedrus_ctx {
|
||||
ssize_t intra_pred_buf_size;
|
||||
} h264;
|
||||
struct {
|
||||
@ -130,7 +130,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,36 +427,6 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -388,36 +429,6 @@ static void cedrus_h265_setup(struct ced
|
||||
width_in_ctb_luma =
|
||||
DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma);
|
||||
|
||||
@ -167,16 +167,16 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
/* Activate H265 engine. */
|
||||
cedrus_engine_enable(ctx, CEDRUS_CODEC_H265);
|
||||
|
||||
@@ -669,7 +680,7 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -671,7 +682,7 @@ static void cedrus_h265_setup(struct ced
|
||||
|
||||
/* Write decoded picture buffer in pic list. */
|
||||
cedrus_h265_frame_info_write_dpb(ctx, slice_params->dpb,
|
||||
- slice_params->num_active_dpb_entries);
|
||||
+ slice_params->num_active_dpb_entries, sps);
|
||||
cedrus_h265_frame_info_write_dpb(ctx, decode_params->dpb,
|
||||
- decode_params->num_active_dpb_entries);
|
||||
+ decode_params->num_active_dpb_entries, sps);
|
||||
|
||||
/* Output frame. */
|
||||
|
||||
@@ -680,7 +691,7 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -682,7 +693,7 @@ static void cedrus_h265_setup(struct ced
|
||||
cedrus_h265_frame_info_write_single(ctx, output_pic_list_index,
|
||||
slice_params->pic_struct != 0,
|
||||
pic_order_cnt,
|
||||
@ -185,7 +185,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
cedrus_write(dev, VE_DEC_H265_OUTPUT_FRAME_IDX, output_pic_list_index);
|
||||
|
||||
@@ -729,9 +740,6 @@ static int cedrus_h265_start(struct cedr
|
||||
@@ -731,9 +742,6 @@ static int cedrus_h265_start(struct cedr
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
|
||||
@ -195,7 +195,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
ctx->codec.h265.neighbor_info_buf =
|
||||
dma_alloc_coherent(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
|
||||
&ctx->codec.h265.neighbor_info_buf_addr,
|
||||
@@ -757,14 +765,6 @@ static void cedrus_h265_stop(struct cedr
|
||||
@@ -759,14 +767,6 @@ static void cedrus_h265_stop(struct cedr
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
|
||||
@ -210,7 +210,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
dma_free_coherent(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
|
||||
ctx->codec.h265.neighbor_info_buf,
|
||||
ctx->codec.h265.neighbor_info_buf_addr);
|
||||
@@ -780,6 +780,16 @@ static void cedrus_h265_trigger(struct c
|
||||
@@ -782,6 +782,16 @@ static void cedrus_h265_trigger(struct c
|
||||
cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_DEC_SLICE);
|
||||
}
|
||||
|
||||
@ -227,7 +227,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
struct cedrus_dec_ops cedrus_dec_ops_h265 = {
|
||||
.irq_clear = cedrus_h265_irq_clear,
|
||||
.irq_disable = cedrus_h265_irq_disable,
|
||||
@@ -788,4 +798,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h26
|
||||
@@ -790,4 +800,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h26
|
||||
.start = cedrus_h265_start,
|
||||
.stop = cedrus_h265_stop,
|
||||
.trigger = cedrus_h265_trigger,
|
@ -11,7 +11,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -95,6 +95,9 @@ struct cedrus_buffer {
|
||||
@@ -104,6 +104,9 @@ struct cedrus_buffer {
|
||||
struct {
|
||||
unsigned int position;
|
||||
enum cedrus_h264_pic_type pic_type;
|
@ -14,7 +14,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
@@ -301,7 +301,7 @@ static int cedrus_open(struct file *file
|
||||
@@ -289,7 +289,7 @@ static int cedrus_open(struct file *file
|
||||
goto err_ctrls;
|
||||
}
|
||||
ctx->dst_fmt.pixelformat = V4L2_PIX_FMT_SUNXI_TILED_NV12;
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
ctx->src_fmt.pixelformat = V4L2_PIX_FMT_MPEG2_SLICE;
|
||||
/*
|
||||
* TILED_NV12 has more strict requirements, so copy the width and
|
||||
@@ -309,7 +309,7 @@ static int cedrus_open(struct file *file
|
||||
@@ -297,7 +297,7 @@ static int cedrus_open(struct file *file
|
||||
*/
|
||||
ctx->src_fmt.width = ctx->dst_fmt.width;
|
||||
ctx->src_fmt.height = ctx->dst_fmt.height;
|
||||
@ -34,7 +34,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -532,6 +532,18 @@ static void cedrus_h265_setup(struct ced
|
||||
@@ -534,6 +534,18 @@ static void cedrus_h265_setup(struct ced
|
||||
|
||||
cedrus_write(dev, VE_DEC_H265_DEC_PCM_CTRL, reg);
|
||||
|
||||
@ -55,7 +55,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
reg = VE_DEC_H265_DEC_PPS_CTRL0_PPS_CR_QP_OFFSET(pps->pps_cr_qp_offset) |
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
@@ -498,6 +498,10 @@
|
||||
@@ -499,6 +499,10 @@
|
||||
|
||||
#define VE_DEC_H265_LOW_ADDR (VE_ENGINE_DEC_H265 + 0x80)
|
||||
|
||||
@ -68,7 +68,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
#define VE_DEC_H265_LOW_ADDR_SECONDARY_CHROMA(a) \
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -93,7 +93,7 @@ static struct cedrus_format *cedrus_find
|
||||
@@ -100,7 +100,7 @@ static struct cedrus_format *cedrus_find
|
||||
return &cedrus_formats[i];
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
{
|
||||
unsigned int width = pix_fmt->width;
|
||||
unsigned int height = pix_fmt->height;
|
||||
@@ -147,6 +147,17 @@ void cedrus_prepare_format(struct v4l2_p
|
||||
@@ -155,6 +155,17 @@ void cedrus_prepare_format(struct v4l2_p
|
||||
break;
|
||||
}
|
||||
|
||||
@ -95,7 +95,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
pix_fmt->width = width;
|
||||
pix_fmt->height = height;
|
||||
|
||||
@@ -239,17 +250,27 @@ static int cedrus_try_fmt_vid_cap(struct
|
||||
@@ -247,17 +258,27 @@ static int cedrus_try_fmt_vid_cap(struct
|
||||
struct cedrus_ctx *ctx = cedrus_file2ctx(file);
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
struct v4l2_pix_format *pix_fmt = &f->fmt.pix;
|
||||
@ -124,7 +124,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -267,8 +288,7 @@ static int cedrus_try_fmt_vid_out(struct
|
||||
@@ -275,8 +296,7 @@ static int cedrus_try_fmt_vid_out(struct
|
||||
if (!fmt)
|
||||
return -EINVAL;
|
||||
|
||||
@ -134,7 +134,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -349,7 +369,7 @@ static int cedrus_s_fmt_vid_out(struct f
|
||||
@@ -357,7 +377,7 @@ static int cedrus_s_fmt_vid_out(struct f
|
||||
ctx->dst_fmt.quantization = f->fmt.pix.quantization;
|
||||
ctx->dst_fmt.width = ctx->src_fmt.width;
|
||||
ctx->dst_fmt.height = ctx->src_fmt.height;
|
@ -17,7 +17,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
+static int cedrus_try_ctrl(struct v4l2_ctrl *ctrl)
|
||||
+{
|
||||
+ if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_SPS) {
|
||||
+ if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) {
|
||||
+ const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps;
|
||||
+
|
||||
+ if (sps->chroma_format_idc != 1)
|
||||
@ -62,39 +62,39 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
static const struct cedrus_control cedrus_controls[] = {
|
||||
{
|
||||
.cfg = {
|
||||
@@ -60,6 +104,7 @@ static const struct cedrus_control cedru
|
||||
@@ -62,6 +106,7 @@ static const struct cedrus_control cedru
|
||||
{
|
||||
.cfg = {
|
||||
.id = V4L2_CID_MPEG_VIDEO_H264_SPS,
|
||||
.id = V4L2_CID_STATELESS_H264_SPS,
|
||||
+ .ops = &cedrus_ctrl_ops,
|
||||
},
|
||||
.codec = CEDRUS_CODEC_H264,
|
||||
.required = true,
|
||||
@@ -106,6 +151,7 @@ static const struct cedrus_control cedru
|
||||
},
|
||||
@@ -120,6 +165,7 @@ static const struct cedrus_control cedru
|
||||
{
|
||||
.cfg = {
|
||||
.id = V4L2_CID_MPEG_VIDEO_HEVC_SPS,
|
||||
+ .ops = &cedrus_ctrl_ops,
|
||||
},
|
||||
.codec = CEDRUS_CODEC_H265,
|
||||
.required = true,
|
||||
@@ -534,7 +580,8 @@ static const struct cedrus_variant sun50
|
||||
|
||||
static const struct cedrus_variant sun50i_h6_cedrus_variant = {
|
||||
.capabilities = CEDRUS_CAPABILITY_UNTILED |
|
||||
- CEDRUS_CAPABILITY_H265_DEC,
|
||||
},
|
||||
@@ -556,7 +602,8 @@ static const struct cedrus_variant sun50
|
||||
CEDRUS_CAPABILITY_MPEG2_DEC |
|
||||
CEDRUS_CAPABILITY_H264_DEC |
|
||||
CEDRUS_CAPABILITY_H265_DEC |
|
||||
- CEDRUS_CAPABILITY_VP8_DEC,
|
||||
+ CEDRUS_CAPABILITY_H265_DEC |
|
||||
+ CEDRUS_CAPABILITY_H265_10_DEC,
|
||||
.quirks = CEDRUS_QUIRK_NO_DMA_OFFSET,
|
||||
.mod_rate = 600000000,
|
||||
};
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#define CEDRUS_CAPABILITY_UNTILED BIT(0)
|
||||
#define CEDRUS_CAPABILITY_H265_DEC BIT(1)
|
||||
+#define CEDRUS_CAPABILITY_H265_10_DEC BIT(2)
|
||||
|
||||
#define CEDRUS_QUIRK_NO_DMA_OFFSET BIT(0)
|
||||
@@ -32,6 +32,7 @@
|
||||
#define CEDRUS_CAPABILITY_H264_DEC BIT(2)
|
||||
#define CEDRUS_CAPABILITY_MPEG2_DEC BIT(3)
|
||||
#define CEDRUS_CAPABILITY_VP8_DEC BIT(4)
|
||||
+#define CEDRUS_CAPABILITY_H265_10_DEC BIT(5)
|
||||
|
||||
enum cedrus_codec {
|
||||
CEDRUS_CODEC_MPEG2,
|
@ -1,85 +0,0 @@
|
||||
From 82a8ceccbaf9aa3d8cbc56d10e3905eec0d4ffb4 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 26 Oct 2019 13:55:15 +0200
|
||||
Subject: [PATCH 23/44] media: uapi: hevc: Add scaling matrix control
|
||||
|
||||
HEVC has a scaling matrix concept. Add support for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/media/v4l2-core/v4l2-ctrls.c | 10 ++++++++++
|
||||
include/media/hevc-ctrls.h | 11 +++++++++++
|
||||
2 files changed, 21 insertions(+)
|
||||
|
||||
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
|
||||
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
|
||||
@@ -1021,6 +1021,7 @@ const char *v4l2_ctrl_get_name(u32 id)
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_SPS: return "HEVC Sequence Parameter Set";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_PPS: return "HEVC Picture Parameter Set";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS: return "HEVC Slice Parameters";
|
||||
+ case V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX: return "HEVC Scaling Matrix";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE: return "HEVC Decode Mode";
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE: return "HEVC Start Code";
|
||||
|
||||
@@ -1461,6 +1462,9 @@ void v4l2_ctrl_fill(u32 id, const char *
|
||||
case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:
|
||||
*type = V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS;
|
||||
break;
|
||||
+ case V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX:
|
||||
+ *type = V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX;
|
||||
+ break;
|
||||
case V4L2_CID_UNIT_CELL_SIZE:
|
||||
*type = V4L2_CTRL_TYPE_AREA;
|
||||
*flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
@@ -1934,6 +1938,9 @@ static int std_validate_compound(const s
|
||||
zero_padding(*p_hevc_slice_params);
|
||||
break;
|
||||
|
||||
+ case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
|
||||
+ break;
|
||||
+
|
||||
case V4L2_CTRL_TYPE_AREA:
|
||||
area = p;
|
||||
if (!area->width || !area->height)
|
||||
@@ -2626,6 +2633,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(s
|
||||
case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS:
|
||||
elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params);
|
||||
break;
|
||||
+ case V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX:
|
||||
+ elem_size = sizeof(struct v4l2_ctrl_hevc_scaling_matrix);
|
||||
+ break;
|
||||
case V4L2_CTRL_TYPE_AREA:
|
||||
elem_size = sizeof(struct v4l2_area);
|
||||
break;
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -19,6 +19,7 @@
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010)
|
||||
+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 1011)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_MPEG_BASE + 1015)
|
||||
#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_MPEG_BASE + 1016)
|
||||
|
||||
@@ -26,6 +27,7 @@
|
||||
#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120
|
||||
#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121
|
||||
#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122
|
||||
+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123
|
||||
|
||||
enum v4l2_mpeg_video_hevc_decode_mode {
|
||||
V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED,
|
||||
@@ -209,4 +211,13 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u64 flags;
|
||||
};
|
||||
|
||||
+struct v4l2_ctrl_hevc_scaling_matrix {
|
||||
+ __u8 scaling_list_4x4[6][16];
|
||||
+ __u8 scaling_list_8x8[6][64];
|
||||
+ __u8 scaling_list_16x16[6][64];
|
||||
+ __u8 scaling_list_32x32[2][64];
|
||||
+ __u8 scaling_list_dc_coef_16x16[6];
|
||||
+ __u8 scaling_list_dc_coef_32x32[2];
|
||||
+};
|
||||
+
|
||||
#endif
|
@ -152,10 +152,10 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
+ mixer->channel_zpos[channel] = enable ? zpos : -1;
|
||||
}
|
||||
|
||||
static int sun8i_ui_layer_update_coord(struct sun8i_mixer *mixer, int channel,
|
||||
@@ -267,11 +240,9 @@ static void sun8i_ui_layer_atomic_disabl
|
||||
struct drm_plane_state *old_state)
|
||||
{
|
||||
static void sun8i_ui_layer_update_alpha(struct sun8i_mixer *mixer, int channel,
|
||||
@@ -294,11 +267,9 @@ static void sun8i_ui_layer_atomic_disabl
|
||||
struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state,
|
||||
plane);
|
||||
struct sun8i_ui_layer *layer = plane_to_sun8i_ui_layer(plane);
|
||||
- unsigned int old_zpos = old_state->normalized_zpos;
|
||||
struct sun8i_mixer *mixer = layer->mixer;
|
||||
@ -166,21 +166,21 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
}
|
||||
|
||||
static void sun8i_ui_layer_atomic_update(struct drm_plane *plane,
|
||||
@@ -279,12 +250,11 @@ static void sun8i_ui_layer_atomic_update
|
||||
{
|
||||
@@ -310,12 +281,11 @@ static void sun8i_ui_layer_atomic_update
|
||||
plane);
|
||||
struct sun8i_ui_layer *layer = plane_to_sun8i_ui_layer(plane);
|
||||
unsigned int zpos = plane->state->normalized_zpos;
|
||||
unsigned int zpos = new_state->normalized_zpos;
|
||||
- unsigned int old_zpos = old_state->normalized_zpos;
|
||||
struct sun8i_mixer *mixer = layer->mixer;
|
||||
|
||||
if (!plane->state->visible) {
|
||||
if (!new_state->visible) {
|
||||
sun8i_ui_layer_enable(mixer, layer->channel,
|
||||
- layer->overlay, false, 0, old_zpos);
|
||||
+ layer->overlay, false, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -295,7 +265,7 @@ static void sun8i_ui_layer_atomic_update
|
||||
@@ -328,7 +298,7 @@ static void sun8i_ui_layer_atomic_update
|
||||
sun8i_ui_layer_update_buffer(mixer, layer->channel,
|
||||
layer->overlay, plane);
|
||||
sun8i_ui_layer_enable(mixer, layer->channel, layer->overlay,
|
||||
@ -234,10 +234,10 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
+ mixer->channel_zpos[channel] = enable ? zpos : -1;
|
||||
}
|
||||
|
||||
static int sun8i_vi_layer_update_coord(struct sun8i_mixer *mixer, int channel,
|
||||
@@ -370,11 +344,9 @@ static void sun8i_vi_layer_atomic_disabl
|
||||
struct drm_plane_state *old_state)
|
||||
{
|
||||
static void sun8i_vi_layer_update_alpha(struct sun8i_mixer *mixer, int channel,
|
||||
@@ -398,11 +372,9 @@ static void sun8i_vi_layer_atomic_disabl
|
||||
struct drm_plane_state *old_state = drm_atomic_get_old_plane_state(state,
|
||||
plane);
|
||||
struct sun8i_vi_layer *layer = plane_to_sun8i_vi_layer(plane);
|
||||
- unsigned int old_zpos = old_state->normalized_zpos;
|
||||
struct sun8i_mixer *mixer = layer->mixer;
|
||||
@ -248,21 +248,21 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
}
|
||||
|
||||
static void sun8i_vi_layer_atomic_update(struct drm_plane *plane,
|
||||
@@ -382,12 +354,11 @@ static void sun8i_vi_layer_atomic_update
|
||||
{
|
||||
@@ -414,12 +386,11 @@ static void sun8i_vi_layer_atomic_update
|
||||
plane);
|
||||
struct sun8i_vi_layer *layer = plane_to_sun8i_vi_layer(plane);
|
||||
unsigned int zpos = plane->state->normalized_zpos;
|
||||
unsigned int zpos = new_state->normalized_zpos;
|
||||
- unsigned int old_zpos = old_state->normalized_zpos;
|
||||
struct sun8i_mixer *mixer = layer->mixer;
|
||||
|
||||
if (!plane->state->visible) {
|
||||
if (!new_state->visible) {
|
||||
sun8i_vi_layer_enable(mixer, layer->channel,
|
||||
- layer->overlay, false, 0, old_zpos);
|
||||
+ layer->overlay, false, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -398,7 +369,7 @@ static void sun8i_vi_layer_atomic_update
|
||||
@@ -432,7 +403,7 @@ static void sun8i_vi_layer_atomic_update
|
||||
sun8i_vi_layer_update_buffer(mixer, layer->channel,
|
||||
layer->overlay, plane);
|
||||
sun8i_vi_layer_enable(mixer, layer->channel, layer->overlay,
|
@ -1,36 +0,0 @@
|
||||
From e61cf76fca5984dd9edcb0daf6c5cb5278f32e05 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 26 Oct 2019 15:42:28 +0200
|
||||
Subject: [PATCH 25/44] media: uapi: hevc: Add segment address field
|
||||
|
||||
If HEVC frame consists of multiple slices, segment address has to be
|
||||
known in order to properly decode it.
|
||||
|
||||
Add segment address field to slice parameters.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
include/media/hevc-ctrls.h | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -167,6 +167,9 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u32 bit_size;
|
||||
__u32 data_bit_offset;
|
||||
|
||||
+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
+ __u32 slice_segment_addr;
|
||||
+
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */
|
||||
__u8 nal_unit_type;
|
||||
__u8 nuh_temporal_id_plus1;
|
||||
@@ -200,7 +203,7 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u8 num_rps_poc_st_curr_after;
|
||||
__u8 num_rps_poc_lt_curr;
|
||||
|
||||
- __u8 padding;
|
||||
+ __u8 padding[5];
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
@ -33,7 +33,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
select MFD_CORE
|
||||
--- a/drivers/mfd/Makefile
|
||||
+++ b/drivers/mfd/Makefile
|
||||
@@ -143,6 +143,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-s
|
||||
@@ -142,6 +142,7 @@ obj-$(CONFIG_MFD_DA9052_SPI) += da9052-s
|
||||
obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o
|
||||
|
||||
obj-$(CONFIG_MFD_AC100) += ac100.o
|
@ -17,7 +17,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/drivers/media/platform/Kconfig
|
||||
+++ b/drivers/media/platform/Kconfig
|
||||
@@ -510,6 +510,19 @@ config VIDEO_QCOM_VENUS
|
||||
@@ -574,6 +574,19 @@ config VIDEO_QCOM_VENUS
|
||||
on various Qualcomm SoCs.
|
||||
To compile this driver as a module choose m here.
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
|
||||
@@ -153,6 +153,17 @@
|
||||
@@ -160,6 +160,17 @@
|
||||
};
|
||||
};
|
||||
|
@ -230,7 +230,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG,
|
||||
SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK,
|
||||
SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset));
|
||||
@@ -1198,8 +1239,14 @@ static const struct reg_default sun8i_i2
|
||||
@@ -1196,8 +1237,14 @@ static const struct reg_default sun8i_i2
|
||||
{ SUN4I_I2S_DMA_INT_CTRL_REG, 0x00000000 },
|
||||
{ SUN4I_I2S_CLK_DIV_REG, 0x00000000 },
|
||||
{ SUN8I_I2S_CHAN_CFG_REG, 0x00000000 },
|
||||
@ -247,7 +247,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
{ SUN8I_I2S_RX_CHAN_SEL_REG, 0x00000000 },
|
||||
{ SUN8I_I2S_RX_CHAN_MAP_REG, 0x00000000 },
|
||||
};
|
||||
@@ -1212,9 +1259,18 @@ static const struct reg_default sun50i_h
|
||||
@@ -1210,9 +1257,18 @@ static const struct reg_default sun50i_h
|
||||
{ SUN4I_I2S_DMA_INT_CTRL_REG, 0x00000000 },
|
||||
{ SUN4I_I2S_CLK_DIV_REG, 0x00000000 },
|
||||
{ SUN8I_I2S_CHAN_CFG_REG, 0x00000000 },
|
||||
@ -269,7 +269,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
{ SUN50I_H6_I2S_RX_CHAN_SEL_REG, 0x00000000 },
|
||||
{ SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0x00000000 },
|
||||
{ SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x00000000 },
|
||||
@@ -1287,7 +1343,7 @@ static int sun4i_i2s_runtime_resume(stru
|
||||
@@ -1285,7 +1341,7 @@ static int sun4i_i2s_runtime_resume(stru
|
||||
/* Enable the first output line */
|
||||
regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
|
||||
SUN4I_I2S_CTRL_SDO_EN_MASK,
|
||||
@ -278,7 +278,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
ret = clk_prepare_enable(i2s->mod_clk);
|
||||
if (ret) {
|
||||
@@ -1529,6 +1585,7 @@ static int sun4i_i2s_probe(struct platfo
|
||||
@@ -1526,6 +1582,7 @@ static int sun4i_i2s_probe(struct platfo
|
||||
|
||||
i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG;
|
||||
i2s->capture_dma_data.maxburst = 8;
|
@ -1,985 +0,0 @@
|
||||
From 574ba48fa87225fbf3e39ffd2b11a6fb93cb6c98 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Wed, 20 May 2020 23:01:29 +0200
|
||||
Subject: [PATCH 33/44] media: cedrus: Add support for VP8 decoding
|
||||
|
||||
VP8 in Cedrus shares same engine as H264.
|
||||
|
||||
Note that it seems necessary to call bitstream parsing functions,
|
||||
to parse frame header, otherwise decoded image is garbage. This is
|
||||
contrary to what is driver supposed to do. However, values are not
|
||||
really used, so this might be acceptable. It's possible that bitstream
|
||||
parsing functions set some internal VPU state, which is later necessary
|
||||
for proper decoding. Biggest suspect is "VP8 probs update" trigger.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/Makefile | 3 +-
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.c | 8 +
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.h | 15 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_dec.c | 5 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_hw.c | 1 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_regs.h | 80 ++
|
||||
.../staging/media/sunxi/cedrus/cedrus_video.c | 9 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_vp8.c | 699 ++++++++++++++++++
|
||||
8 files changed, 819 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_vp8.c
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/Makefile
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/Makefile
|
||||
@@ -2,4 +2,5 @@
|
||||
obj-$(CONFIG_VIDEO_SUNXI_CEDRUS) += sunxi-cedrus.o
|
||||
|
||||
sunxi-cedrus-y = cedrus.o cedrus_video.o cedrus_hw.o cedrus_dec.o \
|
||||
- cedrus_mpeg2.o cedrus_h264.o cedrus_h265.o
|
||||
+ cedrus_mpeg2.o cedrus_h264.o cedrus_h265.o \
|
||||
+ cedrus_vp8.o
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
@@ -195,6 +195,13 @@ static const struct cedrus_control cedru
|
||||
.codec = CEDRUS_CODEC_H265,
|
||||
.required = false,
|
||||
},
|
||||
+ {
|
||||
+ .cfg = {
|
||||
+ .id = V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER,
|
||||
+ },
|
||||
+ .codec = CEDRUS_CODEC_VP8,
|
||||
+ .required = true,
|
||||
+ },
|
||||
};
|
||||
|
||||
#define CEDRUS_CONTROLS_COUNT ARRAY_SIZE(cedrus_controls)
|
||||
@@ -446,6 +453,7 @@ static int cedrus_probe(struct platform_
|
||||
dev->dec_ops[CEDRUS_CODEC_MPEG2] = &cedrus_dec_ops_mpeg2;
|
||||
dev->dec_ops[CEDRUS_CODEC_H264] = &cedrus_dec_ops_h264;
|
||||
dev->dec_ops[CEDRUS_CODEC_H265] = &cedrus_dec_ops_h265;
|
||||
+ dev->dec_ops[CEDRUS_CODEC_VP8] = &cedrus_dec_ops_vp8;
|
||||
|
||||
mutex_init(&dev->dev_mutex);
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -36,6 +36,7 @@ enum cedrus_codec {
|
||||
CEDRUS_CODEC_MPEG2,
|
||||
CEDRUS_CODEC_H264,
|
||||
CEDRUS_CODEC_H265,
|
||||
+ CEDRUS_CODEC_VP8,
|
||||
CEDRUS_CODEC_LAST,
|
||||
};
|
||||
|
||||
@@ -78,6 +79,10 @@ struct cedrus_h265_run {
|
||||
const struct v4l2_ctrl_hevc_scaling_matrix *scaling_matrix;
|
||||
};
|
||||
|
||||
+struct cedrus_vp8_run {
|
||||
+ const struct v4l2_ctrl_vp8_frame_header *slice_params;
|
||||
+};
|
||||
+
|
||||
struct cedrus_run {
|
||||
struct vb2_v4l2_buffer *src;
|
||||
struct vb2_v4l2_buffer *dst;
|
||||
@@ -86,6 +91,7 @@ struct cedrus_run {
|
||||
struct cedrus_h264_run h264;
|
||||
struct cedrus_mpeg2_run mpeg2;
|
||||
struct cedrus_h265_run h265;
|
||||
+ struct cedrus_vp8_run vp8;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -143,6 +149,14 @@ struct cedrus_ctx {
|
||||
void *entry_points_buf;
|
||||
dma_addr_t entry_points_buf_addr;
|
||||
} h265;
|
||||
+ struct {
|
||||
+ unsigned int last_frame_p_type;
|
||||
+ unsigned int last_filter_type;
|
||||
+ unsigned int last_sharpness_level;
|
||||
+
|
||||
+ u8 *entropy_probs_buf;
|
||||
+ dma_addr_t entropy_probs_buf_dma;
|
||||
+ } vp8;
|
||||
} codec;
|
||||
};
|
||||
|
||||
@@ -190,6 +204,7 @@ struct cedrus_dev {
|
||||
extern struct cedrus_dec_ops cedrus_dec_ops_mpeg2;
|
||||
extern struct cedrus_dec_ops cedrus_dec_ops_h264;
|
||||
extern struct cedrus_dec_ops cedrus_dec_ops_h265;
|
||||
+extern struct cedrus_dec_ops cedrus_dec_ops_vp8;
|
||||
|
||||
static inline void cedrus_write(struct cedrus_dev *dev, u32 reg, u32 val)
|
||||
{
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
|
||||
@@ -72,6 +72,11 @@ void cedrus_device_run(void *priv)
|
||||
V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX);
|
||||
break;
|
||||
|
||||
+ case V4L2_PIX_FMT_VP8_FRAME:
|
||||
+ run.vp8.slice_params = cedrus_find_control_data(ctx,
|
||||
+ V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER);
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
break;
|
||||
}
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c
|
||||
@@ -48,6 +48,7 @@ int cedrus_engine_enable(struct cedrus_c
|
||||
break;
|
||||
|
||||
case CEDRUS_CODEC_H264:
|
||||
+ case CEDRUS_CODEC_VP8:
|
||||
reg |= VE_MODE_DEC_H264;
|
||||
break;
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
@@ -552,6 +552,7 @@
|
||||
#define VE_H264_SHS_QP_SCALING_MATRIX_DEFAULT BIT(24)
|
||||
|
||||
#define VE_H264_CTRL 0x220
|
||||
+#define VE_H264_CTRL_VP8 BIT(29)
|
||||
#define VE_H264_CTRL_VLD_DATA_REQ_INT BIT(2)
|
||||
#define VE_H264_CTRL_DECODE_ERR_INT BIT(1)
|
||||
#define VE_H264_CTRL_SLICE_DECODE_INT BIT(0)
|
||||
@@ -561,7 +562,12 @@
|
||||
VE_H264_CTRL_SLICE_DECODE_INT)
|
||||
|
||||
#define VE_H264_TRIGGER_TYPE 0x224
|
||||
+#define VE_H264_TRIGGER_TYPE_PROBABILITY(x) SHIFT_AND_MASK_BITS(x, 31, 24)
|
||||
+#define VE_H264_TRIGGER_TYPE_BIN_LENS(x) SHIFT_AND_MASK_BITS((x) - 1, 18, 16)
|
||||
#define VE_H264_TRIGGER_TYPE_N_BITS(x) (((x) & 0x3f) << 8)
|
||||
+#define VE_H264_TRIGGER_TYPE_VP8_GET_BITS (15 << 0)
|
||||
+#define VE_H264_TRIGGER_TYPE_VP8_UPDATE_COEF (14 << 0)
|
||||
+#define VE_H264_TRIGGER_TYPE_VP8_SLICE_DECODE (10 << 0)
|
||||
#define VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE (8 << 0)
|
||||
#define VE_H264_TRIGGER_TYPE_INIT_SWDEC (7 << 0)
|
||||
#define VE_H264_TRIGGER_TYPE_FLUSH_BITS (3 << 0)
|
||||
@@ -571,6 +577,7 @@
|
||||
#define VE_H264_STATUS_DECODE_ERR_INT VE_H264_CTRL_DECODE_ERR_INT
|
||||
#define VE_H264_STATUS_SLICE_DECODE_INT VE_H264_CTRL_SLICE_DECODE_INT
|
||||
#define VE_H264_STATUS_VLD_BUSY BIT(8)
|
||||
+#define VE_H264_STATUS_VP8_UPPROB_BUSY BIT(17)
|
||||
|
||||
#define VE_H264_STATUS_INT_MASK VE_H264_CTRL_INT_MASK
|
||||
|
||||
@@ -589,10 +596,83 @@
|
||||
#define VE_H264_OUTPUT_FRAME_IDX 0x24c
|
||||
#define VE_H264_EXTRA_BUFFER1 0x250
|
||||
#define VE_H264_EXTRA_BUFFER2 0x254
|
||||
+#define VE_H264_MB_ADDR 0x260
|
||||
+#define VE_H264_ERROR_CASE 0x2b8
|
||||
#define VE_H264_BASIC_BITS 0x2dc
|
||||
#define VE_AVC_SRAM_PORT_OFFSET 0x2e0
|
||||
#define VE_AVC_SRAM_PORT_DATA 0x2e4
|
||||
|
||||
+#define VE_VP8_PPS 0x214
|
||||
+#define VE_VP8_PPS_PIC_TYPE_P_FRAME BIT(31)
|
||||
+#define VE_VP8_PPS_LAST_SHARPNESS_LEVEL(v) SHIFT_AND_MASK_BITS(v, 30, 28)
|
||||
+#define VE_VP8_PPS_LAST_PIC_TYPE_P_FRAME BIT(27)
|
||||
+#define VE_VP8_PPS_ALTREF_SIGN_BIAS BIT(26)
|
||||
+#define VE_VP8_PPS_GOLDEN_SIGN_BIAS BIT(25)
|
||||
+#define VE_VP8_PPS_RELOAD_ENTROPY_PROBS BIT(24)
|
||||
+#define VE_VP8_PPS_REFRESH_ENTROPY_PROBS BIT(23)
|
||||
+#define VE_VP8_PPS_MB_NO_COEFF_SKIP BIT(22)
|
||||
+#define VE_VP8_PPS_TOKEN_PARTITION(v) SHIFT_AND_MASK_BITS(v, 21, 20)
|
||||
+#define VE_VP8_PPS_MODE_REF_LF_DELTA_UPDATE BIT(19)
|
||||
+#define VE_VP8_PPS_MODE_REF_LF_DELTA_ENABLE BIT(18)
|
||||
+#define VE_VP8_PPS_LOOP_FILTER_LEVEL(v) SHIFT_AND_MASK_BITS(v, 17, 12)
|
||||
+#define VE_VP8_PPS_LOOP_FILTER_SIMPLE BIT(11)
|
||||
+#define VE_VP8_PPS_SHARPNESS_LEVEL(v) SHIFT_AND_MASK_BITS(v, 10, 8)
|
||||
+#define VE_VP8_PPS_LAST_LOOP_FILTER_SIMPLE BIT(7)
|
||||
+#define VE_VP8_PPS_SEGMENTATION_ENABLE BIT(6)
|
||||
+#define VE_VP8_PPS_MB_SEGMENT_ABS_DELTA BIT(5)
|
||||
+#define VE_VP8_PPS_UPDATE_MB_SEGMENTATION_MAP BIT(4)
|
||||
+#define VE_VP8_PPS_FULL_PIXEL BIT(3)
|
||||
+#define VE_VP8_PPS_BILINEAR_MC_FILTER BIT(2)
|
||||
+#define VE_VP8_PPS_FILTER_TYPE_SIMPLE BIT(1)
|
||||
+#define VE_VP8_PPS_LPF_DISABLE BIT(0)
|
||||
+
|
||||
+#define VE_VP8_QP_INDEX_DELTA 0x218
|
||||
+#define VE_VP8_QP_INDEX_DELTA_UVAC(v) SHIFT_AND_MASK_BITS(v, 31, 27)
|
||||
+#define VE_VP8_QP_INDEX_DELTA_UVDC(v) SHIFT_AND_MASK_BITS(v, 26, 22)
|
||||
+#define VE_VP8_QP_INDEX_DELTA_Y2AC(v) SHIFT_AND_MASK_BITS(v, 21, 17)
|
||||
+#define VE_VP8_QP_INDEX_DELTA_Y2DC(v) SHIFT_AND_MASK_BITS(v, 16, 12)
|
||||
+#define VE_VP8_QP_INDEX_DELTA_Y1DC(v) SHIFT_AND_MASK_BITS(v, 11, 7)
|
||||
+#define VE_VP8_QP_INDEX_DELTA_BASE_QINDEX(v) SHIFT_AND_MASK_BITS(v, 6, 0)
|
||||
+
|
||||
+#define VE_VP8_PART_SIZE_OFFSET 0x21c
|
||||
+#define VE_VP8_ENTROPY_PROBS_ADDR 0x250
|
||||
+#define VE_VP8_FIRST_DATA_PART_LEN 0x254
|
||||
+
|
||||
+#define VE_VP8_FSIZE 0x258
|
||||
+#define VE_VP8_FSIZE_WIDTH(w) \
|
||||
+ SHIFT_AND_MASK_BITS(DIV_ROUND_UP(w, 16), 15, 8)
|
||||
+#define VE_VP8_FSIZE_HEIGHT(h) \
|
||||
+ SHIFT_AND_MASK_BITS(DIV_ROUND_UP(h, 16), 7, 0)
|
||||
+
|
||||
+#define VE_VP8_PICSIZE 0x25c
|
||||
+#define VE_VP8_PICSIZE_WIDTH(w) SHIFT_AND_MASK_BITS(w, 27, 16)
|
||||
+#define VE_VP8_PICSIZE_HEIGHT(h) SHIFT_AND_MASK_BITS(h, 11, 0)
|
||||
+
|
||||
+#define VE_VP8_REC_LUMA 0x2ac
|
||||
+#define VE_VP8_FWD_LUMA 0x2b0
|
||||
+#define VE_VP8_BWD_LUMA 0x2b4
|
||||
+#define VE_VP8_REC_CHROMA 0x2d0
|
||||
+#define VE_VP8_FWD_CHROMA 0x2d4
|
||||
+#define VE_VP8_BWD_CHROMA 0x2d8
|
||||
+#define VE_VP8_ALT_LUMA 0x2e8
|
||||
+#define VE_VP8_ALT_CHROMA 0x2ec
|
||||
+
|
||||
+#define VE_VP8_SEGMENT_FEAT_MB_LV0 0x2f0
|
||||
+#define VE_VP8_SEGMENT_FEAT_MB_LV1 0x2f4
|
||||
+
|
||||
+#define VE_VP8_SEGMENT3(v) SHIFT_AND_MASK_BITS(v, 31, 24)
|
||||
+#define VE_VP8_SEGMENT2(v) SHIFT_AND_MASK_BITS(v, 23, 16)
|
||||
+#define VE_VP8_SEGMENT1(v) SHIFT_AND_MASK_BITS(v, 15, 8)
|
||||
+#define VE_VP8_SEGMENT0(v) SHIFT_AND_MASK_BITS(v, 7, 0)
|
||||
+
|
||||
+#define VE_VP8_REF_LF_DELTA 0x2f8
|
||||
+#define VE_VP8_MODE_LF_DELTA 0x2fc
|
||||
+
|
||||
+#define VE_VP8_LF_DELTA3(v) SHIFT_AND_MASK_BITS(v, 30, 24)
|
||||
+#define VE_VP8_LF_DELTA2(v) SHIFT_AND_MASK_BITS(v, 22, 16)
|
||||
+#define VE_VP8_LF_DELTA1(v) SHIFT_AND_MASK_BITS(v, 14, 8)
|
||||
+#define VE_VP8_LF_DELTA0(v) SHIFT_AND_MASK_BITS(v, 6, 0)
|
||||
+
|
||||
#define VE_ISP_INPUT_SIZE 0xa00
|
||||
#define VE_ISP_INPUT_STRIDE 0xa04
|
||||
#define VE_ISP_CTRL 0xa08
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -49,6 +49,10 @@ static struct cedrus_format cedrus_forma
|
||||
.capabilities = CEDRUS_CAPABILITY_H265_DEC,
|
||||
},
|
||||
{
|
||||
+ .pixelformat = V4L2_PIX_FMT_VP8_FRAME,
|
||||
+ .directions = CEDRUS_DECODE_SRC,
|
||||
+ },
|
||||
+ {
|
||||
.pixelformat = V4L2_PIX_FMT_SUNXI_TILED_NV12,
|
||||
.directions = CEDRUS_DECODE_DST,
|
||||
},
|
||||
@@ -110,6 +114,7 @@ void cedrus_prepare_format(struct v4l2_p
|
||||
case V4L2_PIX_FMT_MPEG2_SLICE:
|
||||
case V4L2_PIX_FMT_H264_SLICE:
|
||||
case V4L2_PIX_FMT_HEVC_SLICE:
|
||||
+ case V4L2_PIX_FMT_VP8_FRAME:
|
||||
/* Zero bytes per line for encoded source. */
|
||||
bytesperline = 0;
|
||||
/* Choose some minimum size since this can't be 0 */
|
||||
@@ -506,6 +511,10 @@ static int cedrus_start_streaming(struct
|
||||
ctx->current_codec = CEDRUS_CODEC_H265;
|
||||
break;
|
||||
|
||||
+ case V4L2_PIX_FMT_VP8_FRAME:
|
||||
+ ctx->current_codec = CEDRUS_CODEC_VP8;
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_vp8.c
|
||||
@@ -0,0 +1,699 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
+/*
|
||||
+ * Cedrus VPU driver
|
||||
+ *
|
||||
+ * Copyright (c) 2019 Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/types.h>
|
||||
+
|
||||
+#include <media/videobuf2-dma-contig.h>
|
||||
+
|
||||
+#include "cedrus.h"
|
||||
+#include "cedrus_hw.h"
|
||||
+#include "cedrus_regs.h"
|
||||
+
|
||||
+#define CEDRUS_ENTROPY_PROBS_SIZE 0x2400
|
||||
+#define VP8_PROB_HALF 128
|
||||
+
|
||||
+static const u8 prob_table_init[] = {
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xB0, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xF1, 0xFC, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xF9, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF4, 0xFC, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xEA, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xF6, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0xFE, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFE, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFB, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFE, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xE1, 0xFC, 0xF1, 0xFD, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xEA, 0xFA, 0xF1, 0xFA, 0xFD, 0xFF, 0xFD, 0xFE,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xFD, 0xFE, 0xFE,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFE, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xF7, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFD, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xBA, 0xFB, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xFB, 0xF4, 0xFE,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFB, 0xFB, 0xF3, 0xFD, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFE, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xEC, 0xFD, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFE, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0xF9, 0xFD,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFD, 0xFD, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFC, 0xFE, 0xFB, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFC, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xF8, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFB, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFD, 0xFE, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFB, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFD, 0xFE, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xF9, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x9C, 0xA3, 0x80,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x6F, 0x96, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x5A, 0x4F, 0x85, 0x57, 0x55, 0x50, 0x6F,
|
||||
+ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x93, 0x88, 0x12, 0x00, 0x6A, 0x91, 0x01, 0x00, 0xB3, 0x79, 0x01, 0x00,
|
||||
+ 0xDF, 0x01, 0x22, 0x00, 0xD0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0x01, 0x8F,
|
||||
+ 0x0E, 0x12, 0x0E, 0x6B, 0x87, 0x40, 0x39, 0x44, 0x3C, 0x38, 0x80, 0x41,
|
||||
+ 0x9F, 0x86, 0x80, 0x22, 0xEA, 0xBC, 0x80, 0x1C, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x84, 0x02, 0x04, 0x06, 0x80, 0x81, 0x82, 0x83, 0x80, 0x02, 0x04, 0x06,
|
||||
+ 0x81, 0x82, 0x83, 0x84, 0x80, 0x02, 0x81, 0x04, 0x82, 0x83, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08,
|
||||
+ 0x04, 0x06, 0x80, 0x81, 0x82, 0x83, 0x0A, 0x0C, 0x84, 0x85, 0x86, 0x87,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x04, 0x06, 0x80, 0x81,
|
||||
+ 0x82, 0x83, 0x0A, 0x0C, 0x84, 0x85, 0x86, 0x87, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x83, 0x02, 0x82, 0x04, 0x80, 0x81, 0x00, 0x00, 0x80, 0x02, 0x81, 0x04,
|
||||
+ 0x82, 0x06, 0x08, 0x0C, 0x83, 0x0A, 0x85, 0x86, 0x84, 0x0E, 0x87, 0x10,
|
||||
+ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x8A, 0x02, 0x8B, 0x04, 0x8C, 0x8D, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
+ 0x87, 0x02, 0x85, 0x04, 0x86, 0x06, 0x88, 0x89,
|
||||
+};
|
||||
+
|
||||
+static const u8 vp8_mv_update_prob[2][19] = {
|
||||
+ { 237, 246, 253, 253, 254, 254, 254, 254, 254,
|
||||
+ 254, 254, 254, 254, 254, 250, 250, 252, 254, 254 },
|
||||
+ { 231, 243, 245, 253, 254, 254, 254, 254, 254,
|
||||
+ 254, 254, 254, 254, 254, 251, 251, 254, 254, 254 }
|
||||
+};
|
||||
+
|
||||
+static uint8_t read_bits(struct cedrus_dev *dev, unsigned int bits_count,
|
||||
+ unsigned int probability)
|
||||
+{
|
||||
+ cedrus_write(dev, VE_H264_TRIGGER_TYPE,
|
||||
+ VE_H264_TRIGGER_TYPE_VP8_GET_BITS |
|
||||
+ VE_H264_TRIGGER_TYPE_BIN_LENS(bits_count) |
|
||||
+ VE_H264_TRIGGER_TYPE_PROBABILITY(probability));
|
||||
+
|
||||
+ while (cedrus_read(dev, VE_H264_STATUS) & VE_H264_STATUS_VLD_BUSY)
|
||||
+ ;
|
||||
+
|
||||
+ return cedrus_read(dev, VE_H264_BASIC_BITS);
|
||||
+}
|
||||
+
|
||||
+static void get_delta_q(struct cedrus_dev *dev)
|
||||
+{
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 4, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void process_segmentation_info(struct cedrus_dev *dev)
|
||||
+{
|
||||
+ int update = read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ int i;
|
||||
+
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+
|
||||
+ for (i = 0; i < 4; i++)
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 7, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < 4; i++)
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 6, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (update)
|
||||
+ for (i = 0; i < 3; i++)
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF))
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+}
|
||||
+
|
||||
+static void process_ref_lf_delta_info(struct cedrus_dev *dev)
|
||||
+{
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < 4; i++)
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 6, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < 4; i++)
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 6, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void process_ref_frame_info(struct cedrus_dev *dev)
|
||||
+{
|
||||
+ u8 refresh_golden_frame = read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ u8 refresh_alt_ref_frame = read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+
|
||||
+ if (!refresh_golden_frame)
|
||||
+ read_bits(dev, 2, VP8_PROB_HALF);
|
||||
+
|
||||
+ if (!refresh_alt_ref_frame)
|
||||
+ read_bits(dev, 2, VP8_PROB_HALF);
|
||||
+
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+}
|
||||
+
|
||||
+static void cedrus_read_header(struct cedrus_dev *dev,
|
||||
+ const struct v4l2_ctrl_vp8_frame_header *slice)
|
||||
+{
|
||||
+ int i, j;
|
||||
+
|
||||
+ if (VP8_FRAME_IS_KEY_FRAME(slice)) {
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ }
|
||||
+
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF))
|
||||
+ process_segmentation_info(dev);
|
||||
+
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 6, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 3, VP8_PROB_HALF);
|
||||
+
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF))
|
||||
+ process_ref_lf_delta_info(dev);
|
||||
+
|
||||
+ read_bits(dev, 2, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 7, VP8_PROB_HALF);
|
||||
+
|
||||
+ get_delta_q(dev);
|
||||
+ get_delta_q(dev);
|
||||
+ get_delta_q(dev);
|
||||
+ get_delta_q(dev);
|
||||
+ get_delta_q(dev);
|
||||
+
|
||||
+ if (!VP8_FRAME_IS_KEY_FRAME(slice))
|
||||
+ process_ref_frame_info(dev);
|
||||
+
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+
|
||||
+ if (!VP8_FRAME_IS_KEY_FRAME(slice))
|
||||
+ read_bits(dev, 1, VP8_PROB_HALF);
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_TRIGGER_TYPE, VE_H264_TRIGGER_TYPE_VP8_UPDATE_COEF);
|
||||
+ while (cedrus_read(dev, VE_H264_STATUS) & VE_H264_STATUS_VP8_UPPROB_BUSY)
|
||||
+ ;
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_STATUS, VE_H264_CTRL_INT_MASK);
|
||||
+
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF))
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+
|
||||
+ if (!VP8_FRAME_IS_KEY_FRAME(slice)) {
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ }
|
||||
+
|
||||
+ if (read_bits(dev, 1, VP8_PROB_HALF)) {
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ read_bits(dev, 8, VP8_PROB_HALF);
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < 2; i++)
|
||||
+ for (j = 0; j < 19; j++)
|
||||
+ if (read_bits(dev, 1, vp8_mv_update_prob[i][j]))
|
||||
+ read_bits(dev, 7, VP8_PROB_HALF);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void cedrus_vp8_update_probs(const struct v4l2_ctrl_vp8_frame_header *slice,
|
||||
+ u8 *prob_table)
|
||||
+{
|
||||
+ int i, j, k;
|
||||
+
|
||||
+ memcpy(&prob_table[0x1008], slice->entropy_header.y_mode_probs, 4);
|
||||
+ memcpy(&prob_table[0x1010], slice->entropy_header.uv_mode_probs, 3);
|
||||
+
|
||||
+ memcpy(&prob_table[0x1018], slice->segment_header.segment_probs, 3);
|
||||
+
|
||||
+ prob_table[0x101c] = slice->prob_skip_false;
|
||||
+ prob_table[0x101d] = slice->prob_intra;
|
||||
+ prob_table[0x101e] = slice->prob_last;
|
||||
+ prob_table[0x101f] = slice->prob_gf;
|
||||
+
|
||||
+ memcpy(&prob_table[0x1020], slice->entropy_header.mv_probs[0], 19);
|
||||
+ memcpy(&prob_table[0x1040], slice->entropy_header.mv_probs[1], 19);
|
||||
+
|
||||
+ for (i = 0; i < 4; ++i)
|
||||
+ for (j = 0; j < 8; ++j)
|
||||
+ for (k = 0; k < 3; ++k)
|
||||
+ memcpy(&prob_table[i * 512 + j * 64 + k * 16],
|
||||
+ slice->entropy_header.coeff_probs[i][j][k], 11);
|
||||
+}
|
||||
+
|
||||
+static enum cedrus_irq_status
|
||||
+cedrus_vp8_irq_status(struct cedrus_ctx *ctx)
|
||||
+{
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+ u32 reg = cedrus_read(dev, VE_H264_STATUS);
|
||||
+
|
||||
+ if (reg & (VE_H264_STATUS_DECODE_ERR_INT |
|
||||
+ VE_H264_STATUS_VLD_DATA_REQ_INT))
|
||||
+ return CEDRUS_IRQ_ERROR;
|
||||
+
|
||||
+ if (reg & VE_H264_CTRL_SLICE_DECODE_INT)
|
||||
+ return CEDRUS_IRQ_OK;
|
||||
+
|
||||
+ return CEDRUS_IRQ_NONE;
|
||||
+}
|
||||
+
|
||||
+static void cedrus_vp8_irq_clear(struct cedrus_ctx *ctx)
|
||||
+{
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_STATUS,
|
||||
+ VE_H264_STATUS_INT_MASK);
|
||||
+}
|
||||
+
|
||||
+static void cedrus_vp8_irq_disable(struct cedrus_ctx *ctx)
|
||||
+{
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+ u32 reg = cedrus_read(dev, VE_H264_CTRL);
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_CTRL,
|
||||
+ reg & ~VE_H264_CTRL_INT_MASK);
|
||||
+}
|
||||
+
|
||||
+static void cedrus_vp8_setup(struct cedrus_ctx *ctx,
|
||||
+ struct cedrus_run *run)
|
||||
+{
|
||||
+ const struct v4l2_ctrl_vp8_frame_header *slice = run->vp8.slice_params;
|
||||
+ struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q;
|
||||
+ struct vb2_buffer *src_buf = &run->src->vb2_buf;
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+ dma_addr_t luma_addr, chroma_addr;
|
||||
+ dma_addr_t src_buf_addr;
|
||||
+ int header_size;
|
||||
+ int qindex;
|
||||
+ u32 reg;
|
||||
+
|
||||
+ cedrus_engine_enable(ctx, CEDRUS_CODEC_VP8);
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8);
|
||||
+
|
||||
+ cedrus_vp8_update_probs(slice, ctx->codec.vp8.entropy_probs_buf);
|
||||
+
|
||||
+ reg = slice->first_part_size * 8;
|
||||
+ cedrus_write(dev, VE_VP8_FIRST_DATA_PART_LEN, reg);
|
||||
+
|
||||
+ header_size = VP8_FRAME_IS_KEY_FRAME(slice) ? 10 : 3;
|
||||
+
|
||||
+ reg = slice->first_part_size + header_size;
|
||||
+ cedrus_write(dev, VE_VP8_PART_SIZE_OFFSET, reg);
|
||||
+
|
||||
+ reg = vb2_plane_size(src_buf, 0) * 8;
|
||||
+ cedrus_write(dev, VE_H264_VLD_LEN, reg);
|
||||
+
|
||||
+ /*
|
||||
+ * FIXME: There is a problem if frame header is skipped (adding
|
||||
+ * first_part_header_bits to offset). It seems that functions
|
||||
+ * for parsing bitstreams change internal state of VPU in some
|
||||
+ * way that can't be otherwise set. Maybe this can be bypassed
|
||||
+ * by somehow fixing probability table buffer?
|
||||
+ */
|
||||
+ reg = header_size * 8;
|
||||
+ cedrus_write(dev, VE_H264_VLD_OFFSET, reg);
|
||||
+
|
||||
+ src_buf_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0);
|
||||
+ cedrus_write(dev, VE_H264_VLD_END,
|
||||
+ src_buf_addr + vb2_get_plane_payload(src_buf, 0));
|
||||
+ cedrus_write(dev, VE_H264_VLD_ADDR,
|
||||
+ VE_H264_VLD_ADDR_VAL(src_buf_addr) |
|
||||
+ VE_H264_VLD_ADDR_FIRST | VE_H264_VLD_ADDR_VALID |
|
||||
+ VE_H264_VLD_ADDR_LAST);
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_TRIGGER_TYPE,
|
||||
+ VE_H264_TRIGGER_TYPE_INIT_SWDEC);
|
||||
+
|
||||
+ cedrus_write(dev, VE_VP8_ENTROPY_PROBS_ADDR,
|
||||
+ ctx->codec.vp8.entropy_probs_buf_dma);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ switch (slice->version) {
|
||||
+ case 1:
|
||||
+ reg |= VE_VP8_PPS_FILTER_TYPE_SIMPLE;
|
||||
+ reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ reg |= VE_VP8_PPS_LPF_DISABLE;
|
||||
+ reg |= VE_VP8_PPS_BILINEAR_MC_FILTER;
|
||||
+ break;
|
||||
+ case 3:
|
||||
+ reg |= VE_VP8_PPS_LPF_DISABLE;
|
||||
+ reg |= VE_VP8_PPS_FULL_PIXEL;
|
||||
+ break;
|
||||
+ }
|
||||
+ if (slice->segment_header.flags & V4L2_VP8_SEGMENT_HEADER_FLAG_UPDATE_MAP)
|
||||
+ reg |= VE_VP8_PPS_UPDATE_MB_SEGMENTATION_MAP;
|
||||
+ if (!(slice->segment_header.flags & V4L2_VP8_SEGMENT_HEADER_FLAG_DELTA_VALUE_MODE))
|
||||
+ reg |= VE_VP8_PPS_MB_SEGMENT_ABS_DELTA;
|
||||
+ if (slice->segment_header.flags & V4L2_VP8_SEGMENT_HEADER_FLAG_ENABLED)
|
||||
+ reg |= VE_VP8_PPS_SEGMENTATION_ENABLE;
|
||||
+ if (ctx->codec.vp8.last_filter_type)
|
||||
+ reg |= VE_VP8_PPS_LAST_LOOP_FILTER_SIMPLE;
|
||||
+ reg |= VE_VP8_PPS_SHARPNESS_LEVEL(slice->lf_header.sharpness_level);
|
||||
+ if (slice->lf_header.flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE)
|
||||
+ reg |= VE_VP8_PPS_LOOP_FILTER_SIMPLE;
|
||||
+ reg |= VE_VP8_PPS_LOOP_FILTER_LEVEL(slice->lf_header.level);
|
||||
+ if (slice->lf_header.flags & V4L2_VP8_LF_HEADER_ADJ_ENABLE)
|
||||
+ reg |= VE_VP8_PPS_MODE_REF_LF_DELTA_ENABLE;
|
||||
+ if (slice->lf_header.flags & V4L2_VP8_LF_HEADER_DELTA_UPDATE)
|
||||
+ reg |= VE_VP8_PPS_MODE_REF_LF_DELTA_UPDATE;
|
||||
+ reg |= VE_VP8_PPS_TOKEN_PARTITION(ilog2(slice->num_dct_parts));
|
||||
+ if (slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_MB_NO_SKIP_COEFF)
|
||||
+ reg |= VE_VP8_PPS_MB_NO_COEFF_SKIP;
|
||||
+ reg |= VE_VP8_PPS_RELOAD_ENTROPY_PROBS;
|
||||
+ if (slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_SIGN_BIAS_GOLDEN)
|
||||
+ reg |= VE_VP8_PPS_GOLDEN_SIGN_BIAS;
|
||||
+ if (slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_SIGN_BIAS_ALT)
|
||||
+ reg |= VE_VP8_PPS_ALTREF_SIGN_BIAS;
|
||||
+ if (ctx->codec.vp8.last_frame_p_type)
|
||||
+ reg |= VE_VP8_PPS_LAST_PIC_TYPE_P_FRAME;
|
||||
+ reg |= VE_VP8_PPS_LAST_SHARPNESS_LEVEL(ctx->codec.vp8.last_sharpness_level);
|
||||
+ if (!(slice->flags & V4L2_VP8_FRAME_HEADER_FLAG_KEY_FRAME))
|
||||
+ reg |= VE_VP8_PPS_PIC_TYPE_P_FRAME;
|
||||
+ cedrus_write(dev, VE_VP8_PPS, reg);
|
||||
+
|
||||
+ cedrus_read_header(dev, slice);
|
||||
+
|
||||
+ /* reset registers changed by HW */
|
||||
+ cedrus_write(dev, VE_H264_CUR_MB_NUM, 0);
|
||||
+ cedrus_write(dev, VE_H264_MB_ADDR, 0);
|
||||
+ cedrus_write(dev, VE_H264_ERROR_CASE, 0);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_QP_INDEX_DELTA_UVAC(slice->quant_header.uv_ac_delta);
|
||||
+ reg |= VE_VP8_QP_INDEX_DELTA_UVDC(slice->quant_header.uv_dc_delta);
|
||||
+ reg |= VE_VP8_QP_INDEX_DELTA_Y2AC(slice->quant_header.y2_ac_delta);
|
||||
+ reg |= VE_VP8_QP_INDEX_DELTA_Y2DC(slice->quant_header.y2_dc_delta);
|
||||
+ reg |= VE_VP8_QP_INDEX_DELTA_Y1DC(slice->quant_header.y_dc_delta);
|
||||
+ reg |= VE_VP8_QP_INDEX_DELTA_BASE_QINDEX(slice->quant_header.y_ac_qi);
|
||||
+ cedrus_write(dev, VE_VP8_QP_INDEX_DELTA, reg);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_FSIZE_WIDTH(slice->width);
|
||||
+ reg |= VE_VP8_FSIZE_HEIGHT(slice->height);
|
||||
+ cedrus_write(dev, VE_VP8_FSIZE, reg);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_PICSIZE_WIDTH(slice->width);
|
||||
+ reg |= VE_VP8_PICSIZE_HEIGHT(slice->height);
|
||||
+ cedrus_write(dev, VE_VP8_PICSIZE, reg);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_SEGMENT3(slice->segment_header.quant_update[3]);
|
||||
+ reg |= VE_VP8_SEGMENT2(slice->segment_header.quant_update[2]);
|
||||
+ reg |= VE_VP8_SEGMENT1(slice->segment_header.quant_update[1]);
|
||||
+ reg |= VE_VP8_SEGMENT0(slice->segment_header.quant_update[0]);
|
||||
+ cedrus_write(dev, VE_VP8_SEGMENT_FEAT_MB_LV0, reg);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_SEGMENT3(slice->segment_header.lf_update[3]);
|
||||
+ reg |= VE_VP8_SEGMENT2(slice->segment_header.lf_update[2]);
|
||||
+ reg |= VE_VP8_SEGMENT1(slice->segment_header.lf_update[1]);
|
||||
+ reg |= VE_VP8_SEGMENT0(slice->segment_header.lf_update[0]);
|
||||
+ cedrus_write(dev, VE_VP8_SEGMENT_FEAT_MB_LV1, reg);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_LF_DELTA3(slice->lf_header.ref_frm_delta[3]);
|
||||
+ reg |= VE_VP8_LF_DELTA2(slice->lf_header.ref_frm_delta[2]);
|
||||
+ reg |= VE_VP8_LF_DELTA1(slice->lf_header.ref_frm_delta[1]);
|
||||
+ reg |= VE_VP8_LF_DELTA0(slice->lf_header.ref_frm_delta[0]);
|
||||
+ cedrus_write(dev, VE_VP8_REF_LF_DELTA, reg);
|
||||
+
|
||||
+ reg = 0;
|
||||
+ reg |= VE_VP8_LF_DELTA3(slice->lf_header.mb_mode_delta[3]);
|
||||
+ reg |= VE_VP8_LF_DELTA2(slice->lf_header.mb_mode_delta[2]);
|
||||
+ reg |= VE_VP8_LF_DELTA1(slice->lf_header.mb_mode_delta[1]);
|
||||
+ reg |= VE_VP8_LF_DELTA0(slice->lf_header.mb_mode_delta[0]);
|
||||
+ cedrus_write(dev, VE_VP8_MODE_LF_DELTA, reg);
|
||||
+
|
||||
+ luma_addr = cedrus_dst_buf_addr(ctx, run->dst->vb2_buf.index, 0);
|
||||
+ chroma_addr = cedrus_dst_buf_addr(ctx, run->dst->vb2_buf.index, 1);
|
||||
+ cedrus_write(dev, VE_VP8_REC_LUMA, luma_addr);
|
||||
+ cedrus_write(dev, VE_VP8_REC_CHROMA, chroma_addr);
|
||||
+
|
||||
+ qindex = vb2_find_timestamp(cap_q, slice->last_frame_ts, 0);
|
||||
+ if (qindex >= 0) {
|
||||
+ luma_addr = cedrus_dst_buf_addr(ctx, qindex, 0);
|
||||
+ chroma_addr = cedrus_dst_buf_addr(ctx, qindex, 1);
|
||||
+ cedrus_write(dev, VE_VP8_FWD_LUMA, luma_addr);
|
||||
+ cedrus_write(dev, VE_VP8_FWD_CHROMA, chroma_addr);
|
||||
+ } else {
|
||||
+ cedrus_write(dev, VE_VP8_FWD_LUMA, 0);
|
||||
+ cedrus_write(dev, VE_VP8_FWD_CHROMA, 0);
|
||||
+ }
|
||||
+
|
||||
+ qindex = vb2_find_timestamp(cap_q, slice->golden_frame_ts, 0);
|
||||
+ if (qindex >= 0) {
|
||||
+ luma_addr = cedrus_dst_buf_addr(ctx, qindex, 0);
|
||||
+ chroma_addr = cedrus_dst_buf_addr(ctx, qindex, 1);
|
||||
+ cedrus_write(dev, VE_VP8_BWD_LUMA, luma_addr);
|
||||
+ cedrus_write(dev, VE_VP8_BWD_CHROMA, chroma_addr);
|
||||
+ } else {
|
||||
+ cedrus_write(dev, VE_VP8_BWD_LUMA, 0);
|
||||
+ cedrus_write(dev, VE_VP8_BWD_CHROMA, 0);
|
||||
+ }
|
||||
+
|
||||
+ qindex = vb2_find_timestamp(cap_q, slice->alt_frame_ts, 0);
|
||||
+ if (qindex >= 0) {
|
||||
+ luma_addr = cedrus_dst_buf_addr(ctx, qindex, 0);
|
||||
+ chroma_addr = cedrus_dst_buf_addr(ctx, qindex, 1);
|
||||
+ cedrus_write(dev, VE_VP8_ALT_LUMA, luma_addr);
|
||||
+ cedrus_write(dev, VE_VP8_ALT_CHROMA, chroma_addr);
|
||||
+ } else {
|
||||
+ cedrus_write(dev, VE_VP8_ALT_LUMA, 0);
|
||||
+ cedrus_write(dev, VE_VP8_ALT_CHROMA, 0);
|
||||
+ }
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_CTRL, VE_H264_CTRL_VP8 |
|
||||
+ VE_H264_CTRL_DECODE_ERR_INT |
|
||||
+ VE_H264_CTRL_SLICE_DECODE_INT);
|
||||
+
|
||||
+ if (slice->lf_header.level) {
|
||||
+ ctx->codec.vp8.last_filter_type =
|
||||
+ !!(slice->lf_header.flags & V4L2_VP8_LF_FILTER_TYPE_SIMPLE);
|
||||
+ ctx->codec.vp8.last_frame_p_type =
|
||||
+ !VP8_FRAME_IS_KEY_FRAME(slice);
|
||||
+ ctx->codec.vp8.last_sharpness_level =
|
||||
+ slice->lf_header.sharpness_level;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int cedrus_vp8_start(struct cedrus_ctx *ctx)
|
||||
+{
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+
|
||||
+ ctx->codec.vp8.entropy_probs_buf =
|
||||
+ dma_alloc_coherent(dev->dev, CEDRUS_ENTROPY_PROBS_SIZE,
|
||||
+ &ctx->codec.vp8.entropy_probs_buf_dma,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!ctx->codec.vp8.entropy_probs_buf)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ memcpy(&ctx->codec.vp8.entropy_probs_buf[2048],
|
||||
+ prob_table_init, sizeof(prob_table_init));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void cedrus_vp8_stop(struct cedrus_ctx *ctx)
|
||||
+{
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+
|
||||
+ cedrus_engine_disable(dev);
|
||||
+
|
||||
+ dma_free_coherent(dev->dev, CEDRUS_ENTROPY_PROBS_SIZE,
|
||||
+ ctx->codec.vp8.entropy_probs_buf,
|
||||
+ ctx->codec.vp8.entropy_probs_buf_dma);
|
||||
+}
|
||||
+
|
||||
+static void cedrus_vp8_trigger(struct cedrus_ctx *ctx)
|
||||
+{
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+
|
||||
+ cedrus_write(dev, VE_H264_TRIGGER_TYPE,
|
||||
+ VE_H264_TRIGGER_TYPE_VP8_SLICE_DECODE);
|
||||
+}
|
||||
+
|
||||
+struct cedrus_dec_ops cedrus_dec_ops_vp8 = {
|
||||
+ .irq_clear = cedrus_vp8_irq_clear,
|
||||
+ .irq_disable = cedrus_vp8_irq_disable,
|
||||
+ .irq_status = cedrus_vp8_irq_status,
|
||||
+ .setup = cedrus_vp8_setup,
|
||||
+ .start = cedrus_vp8_start,
|
||||
+ .stop = cedrus_vp8_stop,
|
||||
+ .trigger = cedrus_vp8_trigger,
|
||||
+};
|
@ -35,7 +35,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
clocks {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
@@ -672,7 +690,6 @@
|
||||
@@ -681,7 +699,6 @@
|
||||
dmas = <&dma 27>;
|
||||
resets = <&ccu RST_BUS_I2S2>;
|
||||
dma-names = "tx";
|
||||
@ -43,7 +43,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
};
|
||||
|
||||
codec: codec@1c22c00 {
|
||||
@@ -806,6 +823,7 @@
|
||||
@@ -815,6 +832,7 @@
|
||||
};
|
||||
|
||||
hdmi: hdmi@1ee0000 {
|
@ -4,7 +4,6 @@ Date: Sat, 30 Jan 2021 18:12:26 +0100
|
||||
Subject: [PATCH] h3/h5: power key wake up source
|
||||
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-h3-beelink-x2.dts | 11 +++++++++++
|
||||
arch/arm/boot/dts/sun8i-h3-nanopi.dtsi | 1 +
|
||||
arch/arm/boot/dts/sun8i-h3-orangepi-2.dts | 3 ++-
|
||||
arch/arm/boot/dts/sun8i-h3-orangepi-pc.dts | 3 ++-
|
||||
@ -12,33 +11,9 @@ Subject: [PATCH] h3/h5: power key wake up source
|
||||
arch/arm/boot/dts/sunxi-libretech-all-h3-cc.dtsi | 1 +
|
||||
6 files changed, 19 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
|
||||
index 45a24441ff18..24aff65f82ca 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
|
||||
@@ -111,6 +111,17 @@ spdif_out: spdif-out {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "linux,spdif-dit";
|
||||
};
|
||||
+
|
||||
+ r_gpio_keys {
|
||||
+ compatible = "gpio-keys";
|
||||
+
|
||||
+ power {
|
||||
+ label = "power";
|
||||
+ linux,code = <KEY_POWER>;
|
||||
+ gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
+ wakeup-source;
|
||||
+ };
|
||||
+ };
|
||||
};
|
||||
|
||||
&de {
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
|
||||
index 4df29a65316d..684a0a1f8886 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
|
||||
@@ -81,6 +81,7 @@ k1 {
|
||||
@@ -81,6 +81,7 @@
|
||||
label = "k1";
|
||||
linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
@ -46,11 +21,9 @@ index 4df29a65316d..684a0a1f8886 100644
|
||||
};
|
||||
};
|
||||
};
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-2.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-2.dts
|
||||
index 597c425d08ec..9daffd90c12f 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-2.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-2.dts
|
||||
@@ -99,8 +99,9 @@ sw2 {
|
||||
@@ -99,8 +99,9 @@
|
||||
|
||||
sw4 {
|
||||
label = "sw4";
|
||||
@ -61,11 +34,9 @@ index 597c425d08ec..9daffd90c12f 100644
|
||||
};
|
||||
};
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dts
|
||||
index 5aff8ecc66cb..90f75fa85e68 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dts
|
||||
@@ -91,8 +91,9 @@ r_gpio_keys {
|
||||
@@ -91,8 +91,9 @@
|
||||
|
||||
sw4 {
|
||||
label = "sw4";
|
||||
@ -76,11 +47,9 @@ index 5aff8ecc66cb..90f75fa85e68 100644
|
||||
};
|
||||
};
|
||||
};
|
||||
diff --git a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
|
||||
index 8e5cb3b3fd68..b1066dedc1a2 100644
|
||||
--- a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
|
||||
@@ -82,8 +82,9 @@ gpio_keys {
|
||||
@@ -82,8 +82,9 @@
|
||||
|
||||
sw4 {
|
||||
label = "power";
|
||||
@ -91,11 +60,9 @@ index 8e5cb3b3fd68..b1066dedc1a2 100644
|
||||
};
|
||||
};
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sunxi-libretech-all-h3-cc.dtsi b/arch/arm/boot/dts/sunxi-libretech-all-h3-cc.dtsi
|
||||
index c44fd726945a..9e14fe5fdcde 100644
|
||||
--- a/arch/arm/boot/dts/sunxi-libretech-all-h3-cc.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-libretech-all-h3-cc.dtsi
|
||||
@@ -49,6 +49,7 @@ power {
|
||||
@@ -49,6 +49,7 @@
|
||||
label = "power";
|
||||
linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
|
@ -11,27 +11,25 @@ Subject: [PATCH] wip h3/h5 cvbs
|
||||
drivers/gpu/drm/sun4i/sun8i_mixer.h | 5 +-
|
||||
6 files changed, 169 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sunxi-h3-h5.dtsi b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
index 22d533d18992..f18959b2e8df 100644
|
||||
--- a/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
+++ b/arch/arm/boot/dts/sunxi-h3-h5.dtsi
|
||||
@@ -101,7 +101,7 @@ osc32k: osc32k_clk {
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
de: display-engine {
|
||||
compatible = "allwinner,sun8i-h3-display-engine";
|
||||
- allwinner,pipelines = <&mixer0>;
|
||||
+ allwinner,pipelines = <&mixer0>, <&mixer1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -138,11 +138,50 @@ ports {
|
||||
|
||||
@@ -163,11 +163,50 @@
|
||||
#size-cells = <0>;
|
||||
|
||||
|
||||
mixer0_out: port@1 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
reg = <1>;
|
||||
|
||||
|
||||
- mixer0_out_tcon0: endpoint {
|
||||
+ mixer0_out_tcon0: endpoint@0 {
|
||||
+ reg = <0>;
|
||||
@ -76,14 +74,14 @@ index 22d533d18992..f18959b2e8df 100644
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -171,11 +210,19 @@ ports {
|
||||
@@ -196,11 +235,19 @@
|
||||
#size-cells = <0>;
|
||||
|
||||
|
||||
tcon0_in: port@0 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
reg = <0>;
|
||||
|
||||
|
||||
- tcon0_in_mixer0: endpoint {
|
||||
+ tcon0_in_mixer0: endpoint@0 {
|
||||
+ reg = <0>;
|
||||
@ -95,12 +93,12 @@ index 22d533d18992..f18959b2e8df 100644
|
||||
+ remote-endpoint = <&mixer1_out_tcon0>;
|
||||
+ };
|
||||
};
|
||||
|
||||
|
||||
tcon0_out: port@1 {
|
||||
@@ -191,6 +238,49 @@ tcon0_out_hdmi: endpoint@1 {
|
||||
@@ -216,6 +263,49 @@
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
+ tcon1: lcd-controller@1c0d000 {
|
||||
+ compatible = "allwinner,sun8i-h3-tcon-tv",
|
||||
+ "allwinner,sun8i-a83t-tcon-tv";
|
||||
@ -147,10 +145,10 @@ index 22d533d18992..f18959b2e8df 100644
|
||||
mmc0: mmc@1c0f000 {
|
||||
/* compatible and clocks are in per SoC .dtsi file */
|
||||
reg = <0x01c0f000 0x1000>;
|
||||
@@ -792,6 +882,21 @@ csi: camera@1cb0000 {
|
||||
@@ -831,6 +921,21 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
+ tve: tv-encoder@1e00000 {
|
||||
+ compatible = "allwinner,sun8i-h3-tv-encoder",
|
||||
+ "allwinner,sun4i-a10-tv-encoder";
|
||||
@ -167,15 +165,13 @@ index 22d533d18992..f18959b2e8df 100644
|
||||
+ };
|
||||
+
|
||||
hdmi: hdmi@1ee0000 {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "allwinner,sun8i-h3-dw-hdmi",
|
||||
"allwinner,sun8i-a83t-dw-hdmi";
|
||||
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
|
||||
index 7e629a4493af..334b7edea3b7 100644
|
||||
--- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
|
||||
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
|
||||
@@ -456,8 +456,18 @@ static SUNXI_CCU_M_WITH_MUX_GATE(tcon_clk, "tcon", tcon_parents,
|
||||
@@ -456,8 +456,18 @@ static SUNXI_CCU_M_WITH_MUX_GATE(tcon_cl
|
||||
CLK_SET_RATE_PARENT);
|
||||
|
||||
|
||||
static const char * const tve_parents[] = { "pll-de", "pll-periph1" };
|
||||
-static SUNXI_CCU_M_WITH_MUX_GATE(tve_clk, "tve", tve_parents,
|
||||
- 0x120, 0, 4, 24, 3, BIT(31), 0);
|
||||
@ -191,30 +187,26 @@ index 7e629a4493af..334b7edea3b7 100644
|
||||
+ &ccu_div_ops, 0),
|
||||
+ },
|
||||
+};
|
||||
|
||||
|
||||
static const char * const deinterlace_parents[] = { "pll-periph0", "pll-periph1" };
|
||||
static SUNXI_CCU_M_WITH_MUX_GATE(deinterlace_clk, "deinterlace", deinterlace_parents,
|
||||
diff --git a/drivers/gpu/drm/sun4i/Makefile b/drivers/gpu/drm/sun4i/Makefile
|
||||
index 0d04f2447b01..7b151994e904 100644
|
||||
--- a/drivers/gpu/drm/sun4i/Makefile
|
||||
+++ b/drivers/gpu/drm/sun4i/Makefile
|
||||
@@ -16,7 +16,7 @@ sun8i-drm-hdmi-y += sun8i_hdmi_phy_clk.o
|
||||
|
||||
@@ -16,7 +16,7 @@ sun8i-drm-hdmi-y += sun8i_hdmi_phy_clk.
|
||||
|
||||
sun8i-mixer-y += sun8i_mixer.o sun8i_ui_layer.o \
|
||||
sun8i_vi_layer.o sun8i_ui_scaler.o \
|
||||
- sun8i_vi_scaler.o sun8i_csc.o
|
||||
+ sun8i_vi_scaler.o sun8i_csc.o sun4i_tv.o
|
||||
|
||||
|
||||
sun4i-tcon-y += sun4i_crtc.o
|
||||
sun4i-tcon-y += sun4i_dotclock.o
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c
|
||||
index 5b42cf25cc86..35ca78a30087 100644
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c
|
||||
@@ -32,6 +32,12 @@ struct de2_fmt_info {
|
||||
u32 de2_fmt;
|
||||
};
|
||||
|
||||
|
||||
+static const u32 sun8i_rgb2yuv_coef[12] = {
|
||||
+ 0x00000107, 0x00000204, 0x00000064, 0x00004200,
|
||||
+ 0x00001f68, 0x00001ed6, 0x000001c2, 0x00020200,
|
||||
@ -224,10 +216,10 @@ index 5b42cf25cc86..35ca78a30087 100644
|
||||
static const struct de2_fmt_info de2_formats[] = {
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_ARGB8888,
|
||||
@@ -298,9 +304,28 @@ static struct drm_plane **sun8i_layers_init(struct drm_device *drm,
|
||||
@@ -341,9 +347,28 @@ static struct drm_plane **sun8i_layers_i
|
||||
return planes;
|
||||
}
|
||||
|
||||
|
||||
+static void sun8i_mixer_apply_color_correction(struct sunxi_engine *engine)
|
||||
+{
|
||||
+ DRM_DEBUG_DRIVER("Applying RGB to YUV color correction\n");
|
||||
@ -253,12 +245,12 @@ index 5b42cf25cc86..35ca78a30087 100644
|
||||
+ .apply_color_correction = sun8i_mixer_apply_color_correction,
|
||||
+ .disable_color_correction = sun8i_mixer_disable_color_correction,
|
||||
};
|
||||
|
||||
static const struct regmap_config sun8i_mixer_regmap_config = {
|
||||
@@ -560,6 +585,15 @@ static const struct sun8i_mixer_cfg sun8i_h3_mixer0_cfg = {
|
||||
|
||||
static bool sun8i_mixer_volatile_reg(struct device *dev, unsigned int reg)
|
||||
@@ -608,6 +633,15 @@ static const struct sun8i_mixer_cfg sun8
|
||||
.vi_num = 1,
|
||||
};
|
||||
|
||||
|
||||
+static const struct sun8i_mixer_cfg sun8i_h3_mixer1_cfg = {
|
||||
+ .ccsc = 1,
|
||||
+ .mod_rate = 432000000,
|
||||
@ -271,25 +263,23 @@ index 5b42cf25cc86..35ca78a30087 100644
|
||||
static const struct sun8i_mixer_cfg sun8i_r40_mixer0_cfg = {
|
||||
.ccsc = 0,
|
||||
.mod_rate = 297000000,
|
||||
@@ -628,6 +662,10 @@ static const struct of_device_id sun8i_mixer_of_table[] = {
|
||||
.compatible = "allwinner,sun8i-h3-de2-mixer-0",
|
||||
@@ -677,6 +711,10 @@ static const struct of_device_id sun8i_m
|
||||
.data = &sun8i_h3_mixer0_cfg,
|
||||
},
|
||||
+ {
|
||||
{
|
||||
+ .compatible = "allwinner,sun8i-h3-de2-mixer-1",
|
||||
+ .data = &sun8i_h3_mixer1_cfg,
|
||||
+ },
|
||||
{
|
||||
+ {
|
||||
.compatible = "allwinner,sun8i-r40-de2-mixer-0",
|
||||
.data = &sun8i_r40_mixer0_cfg,
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.h b/drivers/gpu/drm/sun4i/sun8i_mixer.h
|
||||
index 7576b523fdbb..6593085cecf3 100644
|
||||
},
|
||||
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.h
|
||||
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.h
|
||||
@@ -120,6 +120,10 @@
|
||||
/* format 20 is packed YVU444 10-bit */
|
||||
/* format 21 is packed YUV444 10-bit */
|
||||
|
||||
|
||||
+/* The DCSC sub-engine is used to do color space conversation */
|
||||
+#define SUN8I_MIXER_DCSC_EN 0xb0000
|
||||
+#define SUN8I_MIXER_DCSC_COEF_REG(x) (0xb0010 + 0x4 * (x))
|
||||
@ -302,6 +292,6 @@ index 7576b523fdbb..6593085cecf3 100644
|
||||
#define SUN8I_MIXER_ASE_EN 0xa8000
|
||||
#define SUN8I_MIXER_FCC_EN 0xaa000
|
||||
-#define SUN8I_MIXER_DCSC_EN 0xb0000
|
||||
|
||||
|
||||
#define SUN50I_MIXER_FCE_EN 0x70000
|
||||
#define SUN50I_MIXER_PEAK_EN 0x70800
|
@ -10,43 +10,35 @@ Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
|
||||
include/media/hevc-ctrls.h | 16 ++++++++++++----
|
||||
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h
|
||||
index 6e881b7896bc..46936bae7c30 100644
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -56,6 +56,9 @@ enum v4l2_mpeg_video_hevc_start_code {
|
||||
@@ -58,6 +58,8 @@ enum v4l2_mpeg_video_hevc_start_code {
|
||||
/* The controls are not stable at the moment and will likely be reworked. */
|
||||
struct v4l2_ctrl_hevc_sps {
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */
|
||||
+ __u8 video_parameter_set_id;
|
||||
+ __u8 seq_parameter_set_id;
|
||||
+ __u8 chroma_format_idc;
|
||||
__u16 pic_width_in_luma_samples;
|
||||
__u16 pic_height_in_luma_samples;
|
||||
__u8 bit_depth_luma_minus8;
|
||||
@@ -76,9 +79,8 @@ struct v4l2_ctrl_hevc_sps {
|
||||
__u8 log2_diff_max_min_pcm_luma_coding_block_size;
|
||||
__u8 num_short_term_ref_pic_sets;
|
||||
__u8 num_long_term_ref_pics_sps;
|
||||
- __u8 chroma_format_idc;
|
||||
|
||||
- __u8 padding;
|
||||
+ __u8 padding[7];
|
||||
@@ -81,6 +83,8 @@ struct v4l2_ctrl_hevc_sps {
|
||||
__u8 chroma_format_idc;
|
||||
__u8 sps_max_sub_layers_minus1;
|
||||
|
||||
+ __u8 padding[6];
|
||||
+
|
||||
__u64 flags;
|
||||
};
|
||||
@@ -105,7 +107,10 @@ struct v4l2_ctrl_hevc_sps {
|
||||
|
||||
@@ -108,6 +112,7 @@ struct v4l2_ctrl_hevc_sps {
|
||||
|
||||
struct v4l2_ctrl_hevc_pps {
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */
|
||||
+ __u8 pic_parameter_set_id;
|
||||
__u8 num_extra_slice_header_bits;
|
||||
+ __u8 num_ref_idx_l0_default_active_minus1;
|
||||
+ __u8 num_ref_idx_l1_default_active_minus1;
|
||||
__s8 init_qp_minus26;
|
||||
__u8 diff_cu_qp_delta_depth;
|
||||
__s8 pps_cb_qp_offset;
|
||||
@@ -118,7 +123,7 @@ struct v4l2_ctrl_hevc_pps {
|
||||
__u8 num_ref_idx_l0_default_active_minus1;
|
||||
__u8 num_ref_idx_l1_default_active_minus1;
|
||||
@@ -123,7 +128,7 @@ struct v4l2_ctrl_hevc_pps {
|
||||
__s8 pps_tc_offset_div2;
|
||||
__u8 log2_parallel_merge_level_minus2;
|
||||
|
||||
@ -55,15 +47,15 @@ index 6e881b7896bc..46936bae7c30 100644
|
||||
__u64 flags;
|
||||
};
|
||||
|
||||
@@ -204,7 +209,10 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u8 num_rps_poc_st_curr_after;
|
||||
__u8 num_rps_poc_lt_curr;
|
||||
@@ -202,7 +207,10 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
__u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
|
||||
- __u8 padding[5];
|
||||
- __u8 padding;
|
||||
+ __u16 short_term_ref_pic_set_size;
|
||||
+ __u16 long_term_ref_pic_set_size;
|
||||
+
|
||||
+ __u8 padding;
|
||||
+ __u8 padding[4];
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */
|
||||
struct v4l2_hevc_pred_weight_table pred_weight_table;
|
@ -0,0 +1,32 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 23 May 2020 15:07:15 +0000
|
||||
Subject: [PATCH] HACK: media: uapi: hevc: tiles and num_slices
|
||||
|
||||
---
|
||||
include/media/hevc-ctrls.h | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -83,7 +83,8 @@ struct v4l2_ctrl_hevc_sps {
|
||||
__u8 chroma_format_idc;
|
||||
__u8 sps_max_sub_layers_minus1;
|
||||
|
||||
- __u8 padding[6];
|
||||
+ __u8 num_slices;
|
||||
+ __u8 padding[5];
|
||||
|
||||
__u64 flags;
|
||||
};
|
||||
@@ -210,7 +211,9 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u16 short_term_ref_pic_set_size;
|
||||
__u16 long_term_ref_pic_set_size;
|
||||
|
||||
- __u8 padding[4];
|
||||
+ __u32 num_entry_point_offsets;
|
||||
+ __u32 entry_point_offset_minus1[256];
|
||||
+ __u8 padding[8];
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */
|
||||
struct v4l2_hevc_pred_weight_table pred_weight_table;
|
@ -10,7 +10,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
@@ -161,6 +161,24 @@
|
||||
@@ -166,6 +166,24 @@
|
||||
};
|
||||
};
|
||||
|
||||
@ -35,7 +35,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
allwinner,erratum-unknown1;
|
||||
@@ -878,7 +896,6 @@
|
||||
@@ -918,7 +936,6 @@
|
||||
resets = <&ccu RST_BUS_I2S2>;
|
||||
dma-names = "rx", "tx";
|
||||
dmas = <&dma 27>, <&dma 27>;
|
||||
@ -43,7 +43,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
};
|
||||
|
||||
dai: dai@1c22c00 {
|
||||
@@ -1178,6 +1195,7 @@
|
||||
@@ -1218,6 +1235,7 @@
|
||||
};
|
||||
|
||||
hdmi: hdmi@1ee0000 {
|
@ -10,7 +10,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
@@ -1101,6 +1101,9 @@
|
||||
@@ -1141,6 +1141,9 @@
|
||||
clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>;
|
||||
clock-names = "bus", "core";
|
||||
resets = <&ccu RST_BUS_GPU>;
|
@ -29,7 +29,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
};
|
||||
--- a/arch/arm/boot/dts/sun8i-r40.dtsi
|
||||
+++ b/arch/arm/boot/dts/sun8i-r40.dtsi
|
||||
@@ -692,6 +692,25 @@
|
||||
@@ -736,6 +736,25 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -35,7 +35,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
thermal-zones {
|
||||
cpu_thermal: cpu0-thermal {
|
||||
/* milliseconds */
|
||||
@@ -666,6 +684,19 @@
|
||||
@@ -710,6 +728,19 @@
|
||||
clocks = <&osc24M>;
|
||||
};
|
||||
|
||||
@ -55,7 +55,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
ir0: ir@1c21800 {
|
||||
compatible = "allwinner,sun8i-r40-ir",
|
||||
"allwinner,sun6i-a31-ir";
|
||||
@@ -1142,6 +1173,7 @@
|
||||
@@ -1186,6 +1217,7 @@
|
||||
};
|
||||
|
||||
hdmi: hdmi@1ee0000 {
|
@ -35,7 +35,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
soc {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
@@ -652,7 +670,6 @@
|
||||
@@ -664,7 +682,6 @@
|
||||
dmas = <&dma 4>, <&dma 4>;
|
||||
resets = <&ccu RST_BUS_I2S1>;
|
||||
dma-names = "rx", "tx";
|
||||
@ -43,7 +43,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
};
|
||||
|
||||
spdif: spdif@5093000 {
|
||||
@@ -785,6 +802,7 @@
|
||||
@@ -801,6 +818,7 @@
|
||||
};
|
||||
|
||||
hdmi: hdmi@6000000 {
|
@ -22,7 +22,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
@@ -549,12 +549,10 @@ static int sun8i_dwmac_init(struct platf
|
||||
@@ -571,12 +571,10 @@ static int sun8i_dwmac_init(struct platf
|
||||
struct sunxi_priv_data *gmac = priv;
|
||||
int ret;
|
||||
|
||||
@ -39,7 +39,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(gmac->tx_clk);
|
||||
@@ -1021,8 +1019,7 @@ static void sun8i_dwmac_exit(struct plat
|
||||
@@ -1045,8 +1043,7 @@ static void sun8i_dwmac_exit(struct plat
|
||||
|
||||
clk_disable_unprepare(gmac->tx_clk);
|
||||
|
||||
@ -49,7 +49,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
}
|
||||
|
||||
static void sun8i_dwmac_set_mac_loopback(void __iomem *ioaddr, bool enable)
|
||||
@@ -1150,12 +1147,12 @@ static int sun8i_dwmac_probe(struct plat
|
||||
@@ -1174,12 +1171,12 @@ static int sun8i_dwmac_probe(struct plat
|
||||
}
|
||||
|
||||
/* Optional regulator for PHY */
|
@ -47,7 +47,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
struct reset_control *rst_ephy;
|
||||
const struct emac_variant *variant;
|
||||
struct regmap_field *regmap_field;
|
||||
@@ -549,9 +551,9 @@ static int sun8i_dwmac_init(struct platf
|
||||
@@ -571,9 +573,9 @@ static int sun8i_dwmac_init(struct platf
|
||||
struct sunxi_priv_data *gmac = priv;
|
||||
int ret;
|
||||
|
||||
@ -59,7 +59,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -572,8 +574,7 @@ static int sun8i_dwmac_init(struct platf
|
||||
@@ -594,8 +596,7 @@ static int sun8i_dwmac_init(struct platf
|
||||
err_disable_clk:
|
||||
clk_disable_unprepare(gmac->tx_clk);
|
||||
err_disable_regulator:
|
||||
@ -69,7 +69,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1019,7 +1020,7 @@ static void sun8i_dwmac_exit(struct plat
|
||||
@@ -1043,7 +1044,7 @@ static void sun8i_dwmac_exit(struct plat
|
||||
|
||||
clk_disable_unprepare(gmac->tx_clk);
|
||||
|
||||
@ -78,7 +78,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
}
|
||||
|
||||
static void sun8i_dwmac_set_mac_loopback(void __iomem *ioaddr, bool enable)
|
||||
@@ -1147,11 +1148,9 @@ static int sun8i_dwmac_probe(struct plat
|
||||
@@ -1171,11 +1172,9 @@ static int sun8i_dwmac_probe(struct plat
|
||||
}
|
||||
|
||||
/* Optional regulator for PHY */
|
@ -1,57 +0,0 @@
|
||||
From: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Subject: [PATCH v2] drm/lima: add governor data with pre-defined thresholds
|
||||
Date: Wed, 27 Jan 2021 19:40:47 +0000
|
||||
|
||||
This patch adapts the panfrost pre-defined thresholds change [0] to the
|
||||
lima driver to improve real-world performance. The upthreshold value has
|
||||
been set to ramp GPU frequency to max freq faster (compared to panfrost)
|
||||
to compensate for the lower overall performance of utgard devices.
|
||||
|
||||
[0] https://patchwork.kernel.org/project/dri-devel/patch/20210121170445.19761-1-lukasz.luba@arm.com/
|
||||
|
||||
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
|
||||
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Reviewed-by: Qiang Yu <yuq825@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_devfreq.c | 10 +++++++++-
|
||||
drivers/gpu/drm/lima/lima_devfreq.h | 2 ++
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
@@ -177,8 +177,16 @@ int lima_devfreq_init(struct lima_device
|
||||
lima_devfreq_profile.initial_freq = cur_freq;
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
+ /*
|
||||
+ * Setup default thresholds for the simple_ondemand governor.
|
||||
+ * The values are chosen based on experiments.
|
||||
+ */
|
||||
+ ldevfreq->gov_data.upthreshold = 30;
|
||||
+ ldevfreq->gov_data.downdifferential = 5;
|
||||
+
|
||||
devfreq = devm_devfreq_add_device(dev, &lima_devfreq_profile,
|
||||
- DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
|
||||
+ DEVFREQ_GOV_SIMPLE_ONDEMAND,
|
||||
+ &ldevfreq->gov_data);
|
||||
if (IS_ERR(devfreq)) {
|
||||
dev_err(dev, "Couldn't initialize GPU devfreq\n");
|
||||
ret = PTR_ERR(devfreq);
|
||||
--- a/drivers/gpu/drm/lima/lima_devfreq.h
|
||||
+++ b/drivers/gpu/drm/lima/lima_devfreq.h
|
||||
@@ -4,6 +4,7 @@
|
||||
#ifndef __LIMA_DEVFREQ_H__
|
||||
#define __LIMA_DEVFREQ_H__
|
||||
|
||||
+#include <linux/devfreq.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
@@ -18,6 +19,7 @@ struct lima_devfreq {
|
||||
struct opp_table *clkname_opp_table;
|
||||
struct opp_table *regulators_opp_table;
|
||||
struct thermal_cooling_device *cooling;
|
||||
+ struct devfreq_simple_ondemand_data gov_data;
|
||||
bool opp_of_table_added;
|
||||
|
||||
ktime_t busy_time;
|
@ -34,7 +34,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
struct reset_control *rst_ephy;
|
||||
const struct emac_variant *variant;
|
||||
struct regmap_field *regmap_field;
|
||||
@@ -551,10 +554,16 @@ static int sun8i_dwmac_init(struct platf
|
||||
@@ -573,10 +576,16 @@ static int sun8i_dwmac_init(struct platf
|
||||
struct sunxi_priv_data *gmac = priv;
|
||||
int ret;
|
||||
|
||||
@ -52,7 +52,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(gmac->tx_clk);
|
||||
@@ -575,6 +584,8 @@ err_disable_clk:
|
||||
@@ -597,6 +606,8 @@ err_disable_clk:
|
||||
clk_disable_unprepare(gmac->tx_clk);
|
||||
err_disable_regulator:
|
||||
regulator_disable(gmac->regulator_phy);
|
||||
@ -61,7 +61,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1021,6 +1032,7 @@ static void sun8i_dwmac_exit(struct plat
|
||||
@@ -1045,6 +1056,7 @@ static void sun8i_dwmac_exit(struct plat
|
||||
clk_disable_unprepare(gmac->tx_clk);
|
||||
|
||||
regulator_disable(gmac->regulator_phy);
|
||||
@ -69,7 +69,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
}
|
||||
|
||||
static void sun8i_dwmac_set_mac_loopback(void __iomem *ioaddr, bool enable)
|
||||
@@ -1154,6 +1166,15 @@ static int sun8i_dwmac_probe(struct plat
|
||||
@@ -1178,6 +1190,15 @@ static int sun8i_dwmac_probe(struct plat
|
||||
return ret;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ Signed-off-by: Ondrej Jirman <megous@megous.com>
|
||||
&mmc0 {
|
||||
vmmc-supply = <®_cldo1>;
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
|
||||
@@ -207,6 +246,7 @@
|
||||
@@ -211,6 +250,7 @@
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-name = "vcc33-audio-tv-ephy-mac";
|
@ -1,24 +0,0 @@
|
||||
From: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Subject: [PATCH] drm/lima: Use delayed timer as default in devfreq profile
|
||||
Date: Wed, 27 Jan 2021 10:51:21 +0000
|
||||
|
||||
Devfreq framework supports 2 modes for monitoring devices.
|
||||
Use delayed timer as default instead of deferrable timer
|
||||
in order to monitor the GPU status regardless of CPU idle.
|
||||
|
||||
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Reviewed-by: Qiang Yu <yuq825@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/lima/lima_devfreq.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
+++ b/drivers/gpu/drm/lima/lima_devfreq.c
|
||||
@@ -86,6 +86,7 @@ static int lima_devfreq_get_dev_status(s
|
||||
}
|
||||
|
||||
static struct devfreq_dev_profile lima_devfreq_profile = {
|
||||
+ .timer = DEVFREQ_TIMER_DELAYED,
|
||||
.polling_ms = 50, /* ~3 frames */
|
||||
.target = lima_devfreq_target,
|
||||
.get_dev_status = lima_devfreq_get_dev_status,
|
@ -28,7 +28,7 @@ Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
&emac {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ext_rgmii_pins>;
|
||||
@@ -331,3 +335,8 @@
|
||||
@@ -332,3 +336,8 @@
|
||||
usb3_vbus-supply = <®_usb_vbus>;
|
||||
status = "okay";
|
||||
};
|
@ -1,59 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Date: Thu, 21 Jan 2021 17:04:45 +0000
|
||||
Subject: [PATCH] drm/panfrost: Add governor data with pre-defined thresholds
|
||||
|
||||
The simple_ondemand devfreq governor uses two thresholds to decide about
|
||||
the frequency change: upthreshold, downdifferential. These two tunable
|
||||
change the behavior of the governor decision, e.g. how fast to increase
|
||||
the frequency or how rapidly limit the frequency. This patch adds needed
|
||||
governor data with thresholds values gathered experimentally in different
|
||||
workloads.
|
||||
|
||||
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Reviewed-by: Steven Price <steven.price@arm.com>
|
||||
Signed-off-by: Steven Price <steven.price@arm.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20210121170445.19761-1-lukasz.luba@arm.com
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 10 +++++++++-
|
||||
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 2 ++
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
@@ -134,8 +134,16 @@ int panfrost_devfreq_init(struct panfros
|
||||
panfrost_devfreq_profile.initial_freq = cur_freq;
|
||||
dev_pm_opp_put(opp);
|
||||
|
||||
+ /*
|
||||
+ * Setup default thresholds for the simple_ondemand governor.
|
||||
+ * The values are chosen based on experiments.
|
||||
+ */
|
||||
+ pfdevfreq->gov_data.upthreshold = 45;
|
||||
+ pfdevfreq->gov_data.downdifferential = 5;
|
||||
+
|
||||
devfreq = devm_devfreq_add_device(dev, &panfrost_devfreq_profile,
|
||||
- DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
|
||||
+ DEVFREQ_GOV_SIMPLE_ONDEMAND,
|
||||
+ &pfdevfreq->gov_data);
|
||||
if (IS_ERR(devfreq)) {
|
||||
DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
|
||||
ret = PTR_ERR(devfreq);
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
|
||||
@@ -4,6 +4,7 @@
|
||||
#ifndef __PANFROST_DEVFREQ_H__
|
||||
#define __PANFROST_DEVFREQ_H__
|
||||
|
||||
+#include <linux/devfreq.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/ktime.h>
|
||||
|
||||
@@ -17,6 +18,7 @@ struct panfrost_devfreq {
|
||||
struct devfreq *devfreq;
|
||||
struct opp_table *regulators_opp_table;
|
||||
struct thermal_cooling_device *cooling;
|
||||
+ struct devfreq_simple_ondemand_data gov_data;
|
||||
bool opp_of_table_added;
|
||||
|
||||
ktime_t busy_time;
|
@ -37,8 +37,8 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
+ };
|
||||
};
|
||||
|
||||
watchdog: watchdog@30090a0 {
|
||||
@@ -364,6 +378,13 @@
|
||||
timer@3009000 {
|
||||
@@ -373,6 +387,13 @@
|
||||
drive-strength = <40>;
|
||||
};
|
||||
|
||||
@ -52,7 +52,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
hdmi_pins: hdmi-pins {
|
||||
pins = "PH8", "PH9", "PH10";
|
||||
function = "hdmi";
|
||||
@@ -384,6 +405,11 @@
|
||||
@@ -393,6 +414,11 @@
|
||||
function = "i2c2";
|
||||
};
|
||||
|
||||
@ -64,7 +64,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
mmc0_pins: mmc0-pins {
|
||||
pins = "PF0", "PF1", "PF2", "PF3",
|
||||
"PF4", "PF5";
|
||||
@@ -410,6 +436,11 @@
|
||||
@@ -419,6 +445,11 @@
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
@ -76,7 +76,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
/omit-if-no-ref/
|
||||
spi0_pins: spi0-pins {
|
||||
pins = "PC0", "PC2", "PC3";
|
||||
@@ -640,6 +671,31 @@
|
||||
@@ -652,6 +683,31 @@
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Date: Tue, 5 Jan 2021 16:41:11 +0000
|
||||
Subject: [PATCH] drm/panfrost: Use delayed timer as default in devfreq profile
|
||||
|
||||
Devfreq framework supports 2 modes for monitoring devices.
|
||||
Use delayed timer as default instead of deferrable timer
|
||||
in order to monitor the GPU status regardless of CPU idle.
|
||||
|
||||
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
|
||||
Reviewed-by: Steven Price <steven.price@arm.com>
|
||||
Signed-off-by: Steven Price <steven.price@arm.com>
|
||||
Link: https://patchwork.freedesktop.org/patch/msgid/20210105164111.30122-1-lukasz.luba@arm.com
|
||||
---
|
||||
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
|
||||
@@ -81,6 +81,7 @@ static int panfrost_devfreq_get_dev_stat
|
||||
}
|
||||
|
||||
static struct devfreq_dev_profile panfrost_devfreq_profile = {
|
||||
+ .timer = DEVFREQ_TIMER_DELAYED,
|
||||
.polling_ms = 50, /* ~3 frames */
|
||||
.target = panfrost_devfreq_target,
|
||||
.get_dev_status = panfrost_devfreq_get_dev_status,
|
@ -37,7 +37,7 @@ Signed-off-by: Alejandro González <alejandro.gonzalez.correo@gmail.com>
|
||||
|
||||
--- a/drivers/mmc/host/sunxi-mmc.c
|
||||
+++ b/drivers/mmc/host/sunxi-mmc.c
|
||||
@@ -1398,14 +1398,17 @@ static int sunxi_mmc_probe(struct platfo
|
||||
@@ -1421,14 +1421,17 @@ static int sunxi_mmc_probe(struct platfo
|
||||
|
||||
/*
|
||||
* Some H5 devices do not have signal traces precise enough to
|
@ -29,11 +29,9 @@ Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_config.bin
|
||||
.../dts/allwinner/sun50i-h6-tanix-tx6.dts | 32 +++++++++++++++++++
|
||||
1 file changed, 48 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
index 5233ad1488..06e7820fd9 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
@@ -47,12 +47,29 @@ reg_vcc3v3: vcc3v3 {
|
||||
@@ -47,12 +47,29 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
@ -63,7 +61,7 @@ index 5233ad1488..06e7820fd9 100644
|
||||
};
|
||||
|
||||
&ac200_pwm_clk {
|
||||
@@ -122,6 +139,22 @@ &mmc0 {
|
||||
@@ -122,6 +139,22 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -86,7 +84,7 @@ index 5233ad1488..06e7820fd9 100644
|
||||
&mmc2 {
|
||||
vmmc-supply = <®_vcc3v3>;
|
||||
vqmmc-supply = <®_vcc1v8>;
|
||||
@@ -158,6 +191,21 @@ &uart0 {
|
||||
@@ -158,6 +191,21 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -108,6 +106,3 @@ index 5233ad1488..06e7820fd9 100644
|
||||
&usb2otg {
|
||||
dr_mode = "host";
|
||||
status = "okay";
|
||||
--
|
||||
2.29.2
|
||||
|
@ -1,37 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sun, 11 Apr 2021 10:45:50 +0200
|
||||
Subject: [PATCH] media: cedrus: wip: hevc: dependent flag
|
||||
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus_h265.c | 4 ++--
|
||||
include/media/hevc-ctrls.h | 1 +
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
index 8861e1535886..ab6fc857a477 100644
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -634,8 +634,8 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
|
||||
slice_params->flags);
|
||||
|
||||
reg |= VE_DEC_H265_FLAG(VE_DEC_H265_DEC_SLICE_HDR_INFO0_FLAG_DEPENDENT_SLICE_SEGMENT,
|
||||
- V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT,
|
||||
- pps->flags);
|
||||
+ V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT,
|
||||
+ slice_params->flags);
|
||||
|
||||
if (ctx->fh.m2m_ctx->new_frame)
|
||||
reg |= VE_DEC_H265_DEC_SLICE_HDR_INFO0_FLAG_FIRST_SLICE_SEGMENT_IN_PIC;
|
||||
diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h
|
||||
index eb83c1d61b8d..cd51fb6df1f0 100644
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -162,6 +162,7 @@ struct v4l2_hevc_pred_weight_table {
|
||||
#define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6)
|
||||
#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7)
|
||||
#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8)
|
||||
+#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9)
|
||||
|
||||
struct v4l2_ctrl_hevc_slice_params {
|
||||
__u32 bit_size;
|
@ -1,42 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Karlman <jonas@kwiboo.se>
|
||||
Date: Sat, 23 May 2020 15:07:15 +0000
|
||||
Subject: [PATCH] HACK: media: uapi: hevc: tiles and num_slices
|
||||
|
||||
---
|
||||
include/media/hevc-ctrls.h | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h
|
||||
index 46936bae7c30..4d51c148d0ba 100644
|
||||
--- a/include/media/hevc-ctrls.h
|
||||
+++ b/include/media/hevc-ctrls.h
|
||||
@@ -80,7 +80,8 @@ struct v4l2_ctrl_hevc_sps {
|
||||
__u8 num_short_term_ref_pic_sets;
|
||||
__u8 num_long_term_ref_pics_sps;
|
||||
|
||||
- __u8 padding[7];
|
||||
+ __u8 num_slices;
|
||||
+ __u8 padding[6];
|
||||
|
||||
__u64 flags;
|
||||
};
|
||||
@@ -175,6 +176,7 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
__u32 slice_segment_addr;
|
||||
+ __u32 num_entry_point_offsets;
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */
|
||||
__u8 nal_unit_type;
|
||||
@@ -212,7 +214,9 @@ struct v4l2_ctrl_hevc_slice_params {
|
||||
__u16 short_term_ref_pic_set_size;
|
||||
__u16 long_term_ref_pic_set_size;
|
||||
|
||||
- __u8 padding;
|
||||
+ __u8 padding[5];
|
||||
+
|
||||
+ __u32 entry_point_offset_minus1[256];
|
||||
|
||||
/* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */
|
||||
struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
|
@ -1,41 +0,0 @@
|
||||
From b19d3479f25e8a0ff24df0b46c82e50ef0f900dd Mon Sep 17 00:00:00 2001
|
||||
From: Salvatore Bonaccorso <carnil@debian.org>
|
||||
Date: Mon, 24 May 2021 14:21:11 +0200
|
||||
Subject: [PATCH] ARM: dts: sun8i: h3: orangepi-plus: Fix ethernet phy-mode
|
||||
|
||||
Commit bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx delay
|
||||
config") sets the RX/TX delay according to the phy-mode property in the
|
||||
device tree. For the Orange Pi Plus board this is "rgmii", which is the
|
||||
wrong setting.
|
||||
|
||||
Following the example of a900cac3750b ("ARM: dts: sun7i: a20: bananapro:
|
||||
Fix ethernet phy-mode") the phy-mode is changed to "rgmii-id" which gets
|
||||
the Ethernet working again on this board.
|
||||
|
||||
Fixes: bbc4d71d6354 ("net: phy: realtek: fix rtl8211e rx/tx delay config")
|
||||
Reported-by: "B.R. Oake" <broake@mailfence.com>
|
||||
Reported-by: Vagrant Cascadian <vagrant@reproducible-builds.org>
|
||||
Link: https://bugs.debian.org/988574
|
||||
Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
|
||||
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||||
Link: https://lore.kernel.org/r/20210524122111.416885-1-carnil@debian.org
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts b/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts
|
||||
index 97f497854e05..d05fa679dcd3 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-orangepi-plus.dts
|
||||
@@ -85,7 +85,7 @@ &emac {
|
||||
pinctrl-0 = <&emac_rgmii_pins>;
|
||||
phy-supply = <®_gmac_3v3>;
|
||||
phy-handle = <&ext_rgmii_phy>;
|
||||
- phy-mode = "rgmii";
|
||||
+ phy-mode = "rgmii-id";
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,34 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sun, 3 Jan 2021 05:25:38 -0600
|
||||
Subject: [PATCH] net: stmmac: dwmac-sun8i: Return void from PHY unpower
|
||||
|
||||
This is a deinitialization function that always returned zero, and that
|
||||
return value was always ignored. Have it return void instead.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
@@ -820,15 +820,14 @@ static int sun8i_dwmac_power_internal_ph
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int sun8i_dwmac_unpower_internal_phy(struct sunxi_priv_data *gmac)
|
||||
+static void sun8i_dwmac_unpower_internal_phy(struct sunxi_priv_data *gmac)
|
||||
{
|
||||
if (!gmac->internal_phy_powered)
|
||||
- return 0;
|
||||
+ return;
|
||||
|
||||
clk_disable_unprepare(gmac->ephy_clk);
|
||||
reset_control_assert(gmac->rst_ephy);
|
||||
gmac->internal_phy_powered = false;
|
||||
- return 0;
|
||||
}
|
||||
|
||||
/* MDIO multiplexing switch function
|
@ -1,29 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sun, 3 Jan 2021 05:25:39 -0600
|
||||
Subject: [PATCH] net: stmmac: dwmac-sun8i: Remove unnecessary PHY power check
|
||||
|
||||
sun8i_dwmac_unpower_internal_phy already checks if the PHY is powered,
|
||||
so there is no need to do it again here.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
@@ -1018,10 +1018,8 @@ static void sun8i_dwmac_exit(struct plat
|
||||
{
|
||||
struct sunxi_priv_data *gmac = priv;
|
||||
|
||||
- if (gmac->variant->soc_has_internal_phy) {
|
||||
- if (gmac->internal_phy_powered)
|
||||
- sun8i_dwmac_unpower_internal_phy(gmac);
|
||||
- }
|
||||
+ if (gmac->variant->soc_has_internal_phy)
|
||||
+ sun8i_dwmac_unpower_internal_phy(gmac);
|
||||
|
||||
clk_disable_unprepare(gmac->tx_clk);
|
||||
|
@ -1,30 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sun, 3 Jan 2021 05:25:40 -0600
|
||||
Subject: [PATCH] net: stmmac: dwmac-sun8i: Use reset_control_reset
|
||||
|
||||
Use the appropriate function instead of reimplementing it,
|
||||
and update the error message to match the code.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
@@ -806,11 +806,9 @@ static int sun8i_dwmac_power_internal_ph
|
||||
/* Make sure the EPHY is properly reseted, as U-Boot may leave
|
||||
* it at deasserted state, and thus it may fail to reset EMAC.
|
||||
*/
|
||||
- reset_control_assert(gmac->rst_ephy);
|
||||
-
|
||||
- ret = reset_control_deassert(gmac->rst_ephy);
|
||||
+ ret = reset_control_reset(gmac->rst_ephy);
|
||||
if (ret) {
|
||||
- dev_err(priv->device, "Cannot deassert internal phy\n");
|
||||
+ dev_err(priv->device, "Cannot reset internal PHY\n");
|
||||
clk_disable_unprepare(gmac->ephy_clk);
|
||||
return ret;
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Holland <samuel@sholland.org>
|
||||
Date: Sun, 3 Jan 2021 05:25:41 -0600
|
||||
Subject: [PATCH] net: stmmac: dwmac-sun8i: Minor probe function cleanup
|
||||
|
||||
Adjust the spacing and use an explicit "return 0" in the success path
|
||||
to make the function easier to parse.
|
||||
|
||||
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
|
||||
@@ -1227,6 +1227,7 @@ static int sun8i_dwmac_probe(struct plat
|
||||
|
||||
ndev = dev_get_drvdata(&pdev->dev);
|
||||
priv = netdev_priv(ndev);
|
||||
+
|
||||
/* The mux must be registered after parent MDIO
|
||||
* so after stmmac_dvr_probe()
|
||||
*/
|
||||
@@ -1245,7 +1246,8 @@ static int sun8i_dwmac_probe(struct plat
|
||||
goto dwmac_remove;
|
||||
}
|
||||
|
||||
- return ret;
|
||||
+ return 0;
|
||||
+
|
||||
dwmac_mux:
|
||||
reset_control_put(gmac->rst_ephy);
|
||||
clk_put(gmac->ephy_clk);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user