mirror of
https://github.com/archr-linux/Arch-R.git
synced 2026-03-31 14:41:55 -07:00
linux (Allwinner): patches included in 5.17
This commit is contained in:
@@ -1,107 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sat, 30 Jan 2021 18:12:26 +0100
|
||||
Subject: [PATCH] ARM: dts: sun8i: Adjust power key nodes
|
||||
|
||||
Several H3 and one H2+ board have power key nodes, which are slightly
|
||||
off. Some are missing wakeup-source property and some have BTN_0 code
|
||||
assigned instead of KEY_POWER.
|
||||
|
||||
Adjust them, so they can function as intended by designer.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
[BananaPi M2 Zero changes]
|
||||
Signed-off-by: Michael Klein <michael@fossekall.de>
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts | 3 ++-
|
||||
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 ++-
|
||||
arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi | 3 ++-
|
||||
arch/arm/boot/dts/sunxi-libretech-all-h3-cc.dtsi | 1 +
|
||||
6 files changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
index 8e8634ff2f9d..d5c7b7984d85 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h2-plus-bananapi-m2-zero.dts
|
||||
@@ -52,8 +52,9 @@ gpio_keys {
|
||||
|
||||
sw4 {
|
||||
label = "power";
|
||||
- linux,code = <BTN_0>;
|
||||
+ linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
+ wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
|
||||
index c7c3e7d8b3c8..fc45d5aaa67f 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
|
||||
@@ -81,6 +81,7 @@ k1 {
|
||||
label = "k1";
|
||||
linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
+ wakeup-source;
|
||||
};
|
||||
};
|
||||
};
|
||||
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 {
|
||||
|
||||
sw4 {
|
||||
label = "sw4";
|
||||
- linux,code = <BTN_0>;
|
||||
+ linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
+ wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
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 {
|
||||
|
||||
sw4 {
|
||||
label = "sw4";
|
||||
- linux,code = <BTN_0>;
|
||||
+ linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
+ wakeup-source;
|
||||
};
|
||||
};
|
||||
};
|
||||
diff --git a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi
|
||||
index 7a6af54dd342..d03f5853ef7b 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 {
|
||||
|
||||
sw4 {
|
||||
label = "power";
|
||||
- linux,code = <BTN_0>;
|
||||
+ linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
|
||||
+ wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
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 {
|
||||
label = "power";
|
||||
linux,code = <KEY_POWER>;
|
||||
gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
|
||||
+ wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -5,14 +5,14 @@ Subject: [PATCH] arm64: dts: allwinner: h6: tanix-tx6: enable ethernet
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-tanix-tx6.dts | 28 +++++++++++++++++++
|
||||
.../dts/allwinner/sun50i-h6-tanix.dtsi | 28 +++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi
|
||||
@@ -13,6 +13,7 @@
|
||||
compatible = "oranth,tanix-tx6", "allwinner,sun50i-h6";
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
+ ethernet0 = &emac;
|
||||
serial0 = &uart0;
|
||||
@@ -63,7 +63,7 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc0_pins>;
|
||||
@@ -119,6 +143,10 @@
|
||||
vcc-pc-supply = <®_vcc1v8>;
|
||||
vcc-pg-supply = <®_vcc1v8>;
|
||||
};
|
||||
|
||||
+&pwm {
|
||||
@@ -71,5 +71,5 @@ Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
+};
|
||||
+
|
||||
&r_ir {
|
||||
linux,rc-map-name = "rc-tanix-tx5max";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
From ba918badf612c19b4e31a57b2ff4baa06e99d7d5 Mon Sep 17 00:00:00 2001
|
||||
From: heitbaum <rudi@heitbaum.com>
|
||||
Date: Sun, 23 May 2021 06:37:45 +0000
|
||||
Subject: [PATCH] Allwinner: linux: enable BT on Tanix TX6 and add wifi node for rtl8822cs (rtw88)
|
||||
|
||||
Add and enable dts nodes for both rtw88 (rtl8822cs sdio) and uart rtl8822cs bluetooth.
|
||||
|
||||
# udevadm info /sys/bus/sdio/devices/mmc1\:0001\:1/
|
||||
P: /devices/platform/soc/4021000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1
|
||||
L: 0
|
||||
E:
|
||||
DEVPATH=/devices/platform/soc/4021000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1
|
||||
E: OF_NAME=sdio-wifi
|
||||
E: OF_FULLNAME=/soc/mmc@4021000/sdio-wifi@1
|
||||
E: OF_COMPATIBLE_N=0
|
||||
E: SDIO_CLASS=07
|
||||
E: SDIO_ID=024C:C822
|
||||
E: SDIO_REVISION=0.0
|
||||
E: MODALIAS=sdio:c07v024CdC822
|
||||
E: SUBSYSTEM=sdio
|
||||
|
||||
# dmesg | grep hci0
|
||||
Bluetooth: hci0: RTL: examining hci_ver=08 hci_rev=000c subver=8822
|
||||
Bluetooth: hci0: RTL: rom_version status=0 version=3
|
||||
Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_fw.bin
|
||||
Bluetooth: hci0: RTL: loading rtl_bt/rtl8822cs_config.bin
|
||||
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-tanix-tx6.dts | 32 +++++++++++++++++++
|
||||
1 file changed, 48 insertions(+)
|
||||
|
||||
--- 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 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
+ reg_vcc_wifi_io: vcc-wifi-io {
|
||||
+ /* Always on 1.8V/300mA regulator for WiFi and BT IO */
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc-wifi-io";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ vin-supply = <®_vcc3v3>;
|
||||
+ };
|
||||
+
|
||||
reg_vdd_cpu_gpu: regulator-vdd-cpu-gpu {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vdd-cpu-gpu";
|
||||
regulator-min-microvolt = <1135000>;
|
||||
regulator-max-microvolt = <1135000>;
|
||||
};
|
||||
+
|
||||
+ wifi_pwrseq: wifi-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ clocks = <&rtc 1>;
|
||||
+ clock-names = "ext_clock";
|
||||
+ reset-gpios = <&r_pio 1 3 GPIO_ACTIVE_LOW>; /* PM3 */
|
||||
+ };
|
||||
};
|
||||
|
||||
&ac200_pwm_clk {
|
||||
@@ -122,6 +139,22 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&mmc1 {
|
||||
+ vmmc-supply = <®_vcc3v3>;
|
||||
+ vqmmc-supply = <®_vcc_wifi_io>;
|
||||
+ mmc-pwrseq = <&wifi_pwrseq>;
|
||||
+ bus-width = <4>;
|
||||
+ non-removable;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ rtl8822cs: sdio-wifi@1 {
|
||||
+ reg = <1>;
|
||||
+ interrupt-parent = <&r_pio>;
|
||||
+ interrupts = <1 0 IRQ_TYPE_LEVEL_LOW>; /* PM0 */
|
||||
+ interrupt-names = "host-wake";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&mmc2 {
|
||||
vmmc-supply = <®_vcc3v3>;
|
||||
vqmmc-supply = <®_vcc1v8>;
|
||||
@@ -158,6 +191,21 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&uart1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
|
||||
+ uart-has-rtscts;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ bluetooth {
|
||||
+ //use 8822cs compatible to load hci_h5 and btrtl driver
|
||||
+ compatible = "realtek,rtl8822cs-bt";
|
||||
+ device-wake-gpios = <&r_pio 1 2 GPIO_ACTIVE_HIGH>; /* PM2 */
|
||||
+ host-wake-gpios = <&r_pio 1 1 GPIO_ACTIVE_HIGH>; /* PM1 */
|
||||
+ enable-gpios = <&r_pio 1 4 GPIO_ACTIVE_HIGH>; /* PM4 */
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
&usb2otg {
|
||||
dr_mode = "host";
|
||||
status = "okay";
|
||||
@@ -0,0 +1,58 @@
|
||||
From ba918badf612c19b4e31a57b2ff4baa06e99d7d5 Mon Sep 17 00:00:00 2001
|
||||
From: heitbaum <rudi@heitbaum.com>
|
||||
Date: Sun, 23 May 2021 06:37:45 +0000
|
||||
Subject: [PATCH] Allwinner: linux: add wifi node for rtl8822cs (rtw88)
|
||||
|
||||
Add and enable dts node for rtw88 (rtl8822cs sdio)
|
||||
|
||||
# udevadm info /sys/bus/sdio/devices/mmc1\:0001\:1/
|
||||
P: /devices/platform/soc/4021000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1
|
||||
L: 0
|
||||
E:
|
||||
DEVPATH=/devices/platform/soc/4021000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1
|
||||
E: OF_NAME=sdio-wifi
|
||||
E: OF_FULLNAME=/soc/mmc@4021000/sdio-wifi@1
|
||||
E: OF_COMPATIBLE_N=0
|
||||
E: SDIO_CLASS=07
|
||||
E: SDIO_ID=024C:C822
|
||||
E: SDIO_REVISION=0.0
|
||||
E: MODALIAS=sdio:c07v024CdC822
|
||||
E: SUBSYSTEM=sdio
|
||||
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-tanix-tx6.dtsi | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix.dtsi
|
||||
@@ -52,6 +52,16 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
+ reg_vcc_wifi_io: vcc-wifi-io {
|
||||
+ /* Always on 1.8V/300mA regulator for WiFi and BT IO */
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc-wifi-io";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ vin-supply = <®_vcc3v3>;
|
||||
+ };
|
||||
+
|
||||
reg_vdd_cpu_gpu: regulator-vdd-cpu-gpu {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vdd-cpu-gpu";
|
||||
@@ -159,6 +169,13 @@
|
||||
bus-width = <4>;
|
||||
non-removable;
|
||||
status = "okay";
|
||||
+
|
||||
+ rtl8822cs: sdio-wifi@1 {
|
||||
+ reg = <1>;
|
||||
+ interrupt-parent = <&r_pio>;
|
||||
+ interrupts = <1 0 IRQ_TYPE_LEVEL_LOW>; /* PM0 */
|
||||
+ interrupt-names = "host-wake";
|
||||
+ };
|
||||
};
|
||||
|
||||
&mmc2 {
|
||||
@@ -1,54 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Mon, 8 Nov 2021 20:48:17 +0100
|
||||
Subject: [PATCH] arm64: dts: allwinner: h6: tanix-tx6: Add SPDIF
|
||||
|
||||
Tanix TX6 board has SPDIF connector in form of 3.5 mm jack.
|
||||
|
||||
Add support for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
---
|
||||
.../dts/allwinner/sun50i-h6-tanix-tx6.dts | 22 +++++++++++++++++++
|
||||
1 file changed, 22 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 8f2a80f128de..6c10ff7f4b1c 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-tanix-tx6.dts
|
||||
@@ -52,6 +52,24 @@ reg_vdd_cpu_gpu: regulator-vdd-cpu-gpu {
|
||||
regulator-min-microvolt = <1135000>;
|
||||
regulator-max-microvolt = <1135000>;
|
||||
};
|
||||
+
|
||||
+ sound-spdif {
|
||||
+ compatible = "simple-audio-card";
|
||||
+ simple-audio-card,name = "sun50i-h6-spdif";
|
||||
+
|
||||
+ simple-audio-card,cpu {
|
||||
+ sound-dai = <&spdif>;
|
||||
+ };
|
||||
+
|
||||
+ simple-audio-card,codec {
|
||||
+ sound-dai = <&spdif_out>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ spdif_out: spdif-out {
|
||||
+ #sound-dai-cells = <0>;
|
||||
+ compatible = "linux,spdif-dit";
|
||||
+ };
|
||||
};
|
||||
|
||||
&cpu0 {
|
||||
@@ -127,6 +145,10 @@ &r_ir {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
+&spdif {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&uart0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_ph_pins>;
|
||||
@@ -1,132 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Tue, 9 Nov 2021 18:52:37 +0100
|
||||
Subject: [PATCH] ASoC: sunxi: sun4i-spdif: Implement IEC958 control
|
||||
|
||||
SPDIF core is capable of sending custom status.
|
||||
|
||||
Implement IEC958 control handling.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
---
|
||||
sound/soc/sunxi/sun4i-spdif.c | 95 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 95 insertions(+)
|
||||
|
||||
diff --git a/sound/soc/sunxi/sun4i-spdif.c b/sound/soc/sunxi/sun4i-spdif.c
|
||||
index a10949bf0ca1..e80982b229ff 100644
|
||||
--- a/sound/soc/sunxi/sun4i-spdif.c
|
||||
+++ b/sound/soc/sunxi/sun4i-spdif.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/reset.h>
|
||||
+#include <sound/asoundef.h>
|
||||
#include <sound/dmaengine_pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/soc.h>
|
||||
@@ -385,11 +386,105 @@ static int sun4i_spdif_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int sun4i_spdif_info(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_info *uinfo)
|
||||
+{
|
||||
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
|
||||
+ uinfo->count = 1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int sun4i_spdif_get_status_mask(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ u8 *status = ucontrol->value.iec958.status;
|
||||
+
|
||||
+ status[0] = 0xff;
|
||||
+ status[1] = 0xff;
|
||||
+ status[2] = 0xff;
|
||||
+ status[3] = 0xff;
|
||||
+ status[4] = 0xff;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int sun4i_spdif_get_status(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
|
||||
+ struct sun4i_spdif_dev *host = snd_soc_dai_get_drvdata(cpu_dai);
|
||||
+ u8 *status = ucontrol->value.iec958.status;
|
||||
+ unsigned int reg;
|
||||
+
|
||||
+ regmap_read(host->regmap, SUN4I_SPDIF_TXCHSTA0, ®);
|
||||
+
|
||||
+ status[0] = reg & 0xff;
|
||||
+ status[1] = (reg >> 8) & 0xff;
|
||||
+ status[2] = (reg >> 16) & 0xff;
|
||||
+ status[3] = (reg >> 24) & 0xff;
|
||||
+
|
||||
+ regmap_read(host->regmap, SUN4I_SPDIF_TXCHSTA1, ®);
|
||||
+
|
||||
+ status[4] = reg & 0xff;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int sun4i_spdif_set_status(struct snd_kcontrol *kcontrol,
|
||||
+ struct snd_ctl_elem_value *ucontrol)
|
||||
+{
|
||||
+ struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
|
||||
+ struct sun4i_spdif_dev *host = snd_soc_dai_get_drvdata(cpu_dai);
|
||||
+ u8 *status = ucontrol->value.iec958.status;
|
||||
+ unsigned int reg;
|
||||
+
|
||||
+ reg = ((u32)status[3] << 24);
|
||||
+ reg |= ((u32)status[2] << 16);
|
||||
+ reg |= ((u32)status[1] << 8);
|
||||
+ reg |= (u32)status[0];
|
||||
+
|
||||
+ regmap_write(host->regmap, SUN4I_SPDIF_TXCHSTA0, reg);
|
||||
+
|
||||
+ reg = status[4];
|
||||
+ regmap_write(host->regmap, SUN4I_SPDIF_TXCHSTA1, reg);
|
||||
+
|
||||
+ reg = SUN4I_SPDIF_TXCFG_CHSTMODE;
|
||||
+ if (status[0] & IEC958_AES0_NONAUDIO)
|
||||
+ reg |= SUN4I_SPDIF_TXCFG_NONAUDIO;
|
||||
+
|
||||
+ regmap_update_bits(host->regmap, SUN4I_SPDIF_TXCFG,
|
||||
+ SUN4I_SPDIF_TXCFG_CHSTMODE |
|
||||
+ SUN4I_SPDIF_TXCFG_NONAUDIO, reg);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct snd_kcontrol_new sun4i_spdif_controls[] = {
|
||||
+ {
|
||||
+ .access = SNDRV_CTL_ELEM_ACCESS_READ,
|
||||
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
+ .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, MASK),
|
||||
+ .info = sun4i_spdif_info,
|
||||
+ .get = sun4i_spdif_get_status_mask
|
||||
+ },
|
||||
+ {
|
||||
+ .iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
+ .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
|
||||
+ .info = sun4i_spdif_info,
|
||||
+ .get = sun4i_spdif_get_status,
|
||||
+ .put = sun4i_spdif_set_status
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
static int sun4i_spdif_soc_dai_probe(struct snd_soc_dai *dai)
|
||||
{
|
||||
struct sun4i_spdif_dev *host = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
snd_soc_dai_init_dma_data(dai, &host->dma_params_tx, NULL);
|
||||
+ snd_soc_add_dai_controls(dai, sun4i_spdif_controls,
|
||||
+ ARRAY_SIZE(sun4i_spdif_controls));
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Sat, 20 Nov 2021 10:35:25 +0100
|
||||
Subject: [PATCH] ARM: dts: sun8i: h3: beelink-x2: Add GPIO CEC node
|
||||
|
||||
Beelink X2 doesn't use HW CEC controller found in DW HDMI core. It has
|
||||
dedicated GPIO pin for that purpose.
|
||||
|
||||
Add a node for it.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
---
|
||||
arch/arm/boot/dts/sun8i-h3-beelink-x2.dts | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
|
||||
index f0e591e1c771..4ab4bbf001ba 100644
|
||||
--- a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
|
||||
+++ b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts
|
||||
@@ -57,6 +57,12 @@ aliases {
|
||||
ethernet1 = &sdiowifi;
|
||||
};
|
||||
|
||||
+ cec-gpio {
|
||||
+ compatible = "cec-gpio";
|
||||
+ cec-gpios = <&pio 0 14 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; /* PA14 */
|
||||
+ hdmi-phandle = <&hdmi>;
|
||||
+ };
|
||||
+
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
Date: Tue, 5 Oct 2021 17:22:04 +0200
|
||||
Subject: [PATCH] drm/sun4i: virtual CMA addresses are not needed
|
||||
|
||||
Driver never uses virtual address of DRM CMA buffers. Switch to CMA
|
||||
helpers which don't deal with virtual mapping.
|
||||
|
||||
This was actually already the case before commit ad408c766cef
|
||||
("drm/sun4i: Use DRM_GEM_CMA_VMAP_DRIVER_OPS for GEM operations"),
|
||||
but only convenient macro at the time used helpers with virtual
|
||||
mapping.
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/sun4i/sun4i_drv.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
|
||||
index 54dd562e294c..b630614b3d72 100644
|
||||
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
|
||||
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
|
||||
@@ -53,7 +53,7 @@ static const struct drm_driver sun4i_drv_driver = {
|
||||
.minor = 0,
|
||||
|
||||
/* GEM Operations */
|
||||
- DRM_GEM_CMA_DRIVER_OPS_VMAP_WITH_DUMB_CREATE(drm_sun4i_gem_dumb_create),
|
||||
+ DRM_GEM_CMA_DRIVER_OPS_WITH_DUMB_CREATE(drm_sun4i_gem_dumb_create),
|
||||
};
|
||||
|
||||
static int sun4i_drv_bind(struct device *dev)
|
||||
@@ -1,42 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:31 +0100
|
||||
Subject: [PATCH] hantro: postproc: Fix motion vector space size
|
||||
|
||||
When the post-processor hardware block is enabled, the driver
|
||||
allocates an internal queue of buffers for the decoder enginer,
|
||||
and uses the vb2 queue for the post-processor engine.
|
||||
|
||||
For instance, on a G1 core, the decoder engine produces NV12 buffers
|
||||
and the post-processor engine can produce YUY2 buffers. The decoder
|
||||
engine expects motion vectors to be appended to the NV12 buffers,
|
||||
but this is only required for CODECs that need motion vectors,
|
||||
such as H.264.
|
||||
|
||||
Fix the post-processor logic accordingly.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
drivers/staging/media/hantro/hantro_postproc.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
index ed8916c950a4..07842152003f 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_postproc.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
@@ -132,9 +132,10 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
|
||||
unsigned int num_buffers = cap_queue->num_buffers;
|
||||
unsigned int i, buf_size;
|
||||
|
||||
- buf_size = ctx->dst_fmt.plane_fmt[0].sizeimage +
|
||||
- hantro_h264_mv_size(ctx->dst_fmt.width,
|
||||
- ctx->dst_fmt.height);
|
||||
+ buf_size = ctx->dst_fmt.plane_fmt[0].sizeimage;
|
||||
+ if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_H264_SLICE)
|
||||
+ buf_size += hantro_h264_mv_size(ctx->dst_fmt.width,
|
||||
+ ctx->dst_fmt.height);
|
||||
|
||||
for (i = 0; i < num_buffers; ++i) {
|
||||
struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i];
|
||||
@@ -1,229 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:32 +0100
|
||||
Subject: [PATCH] hantro: postproc: Introduce struct hantro_postproc_ops
|
||||
|
||||
Turns out the post-processor block on the G2 core is substantially
|
||||
different from the one on the G1 core. Introduce hantro_postproc_ops
|
||||
with .enable and .disable methods, which will allow to support
|
||||
the G2 post-processor cleanly.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Reviewed-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
drivers/staging/media/hantro/hantro.h | 5 +--
|
||||
drivers/staging/media/hantro/hantro_hw.h | 13 ++++++-
|
||||
.../staging/media/hantro/hantro_postproc.c | 35 +++++++++++++------
|
||||
drivers/staging/media/hantro/imx8m_vpu_hw.c | 2 +-
|
||||
.../staging/media/hantro/rockchip_vpu_hw.c | 6 ++--
|
||||
.../staging/media/hantro/sama5d4_vdec_hw.c | 2 +-
|
||||
6 files changed, 45 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h
|
||||
index c2e2dca38628..c2e01959dc00 100644
|
||||
--- a/drivers/staging/media/hantro/hantro.h
|
||||
+++ b/drivers/staging/media/hantro/hantro.h
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
struct hantro_ctx;
|
||||
struct hantro_codec_ops;
|
||||
+struct hantro_postproc_ops;
|
||||
|
||||
#define HANTRO_JPEG_ENCODER BIT(0)
|
||||
#define HANTRO_ENCODERS 0x0000ffff
|
||||
@@ -59,6 +60,7 @@ struct hantro_irq {
|
||||
* @num_dec_fmts: Number of decoder formats.
|
||||
* @postproc_fmts: Post-processor formats.
|
||||
* @num_postproc_fmts: Number of post-processor formats.
|
||||
+ * @postproc_ops: Post-processor ops.
|
||||
* @codec: Supported codecs
|
||||
* @codec_ops: Codec ops.
|
||||
* @init: Initialize hardware, optional.
|
||||
@@ -69,7 +71,6 @@ struct hantro_irq {
|
||||
* @num_clocks: number of clocks in the array
|
||||
* @reg_names: array of register range names
|
||||
* @num_regs: number of register range names in the array
|
||||
- * @postproc_regs: &struct hantro_postproc_regs pointer
|
||||
*/
|
||||
struct hantro_variant {
|
||||
unsigned int enc_offset;
|
||||
@@ -80,6 +81,7 @@ struct hantro_variant {
|
||||
unsigned int num_dec_fmts;
|
||||
const struct hantro_fmt *postproc_fmts;
|
||||
unsigned int num_postproc_fmts;
|
||||
+ const struct hantro_postproc_ops *postproc_ops;
|
||||
unsigned int codec;
|
||||
const struct hantro_codec_ops *codec_ops;
|
||||
int (*init)(struct hantro_dev *vpu);
|
||||
@@ -90,7 +92,6 @@ struct hantro_variant {
|
||||
int num_clocks;
|
||||
const char * const *reg_names;
|
||||
int num_regs;
|
||||
- const struct hantro_postproc_regs *postproc_regs;
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h
|
||||
index 267a6d33a47b..2f85430682d8 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_hw.h
|
||||
+++ b/drivers/staging/media/hantro/hantro_hw.h
|
||||
@@ -174,6 +174,17 @@ struct hantro_postproc_ctx {
|
||||
struct hantro_aux_buf dec_q[VB2_MAX_FRAME];
|
||||
};
|
||||
|
||||
+/**
|
||||
+ * struct hantro_postproc_ops - post-processor operations
|
||||
+ *
|
||||
+ * @enable: Enable the post-processor block. Optional.
|
||||
+ * @disable: Disable the post-processor block. Optional.
|
||||
+ */
|
||||
+struct hantro_postproc_ops {
|
||||
+ void (*enable)(struct hantro_ctx *ctx);
|
||||
+ void (*disable)(struct hantro_ctx *ctx);
|
||||
+};
|
||||
+
|
||||
/**
|
||||
* struct hantro_codec_ops - codec mode specific operations
|
||||
*
|
||||
@@ -221,7 +232,7 @@ extern const struct hantro_variant rk3328_vpu_variant;
|
||||
extern const struct hantro_variant rk3399_vpu_variant;
|
||||
extern const struct hantro_variant sama5d4_vdec_variant;
|
||||
|
||||
-extern const struct hantro_postproc_regs hantro_g1_postproc_regs;
|
||||
+extern const struct hantro_postproc_ops hantro_g1_postproc_ops;
|
||||
|
||||
extern const u32 hantro_vp8_dec_mc_filter[8][6];
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
index 07842152003f..882fb8bc5ddd 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_postproc.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
@@ -15,14 +15,14 @@
|
||||
#define HANTRO_PP_REG_WRITE(vpu, reg_name, val) \
|
||||
{ \
|
||||
hantro_reg_write(vpu, \
|
||||
- &(vpu)->variant->postproc_regs->reg_name, \
|
||||
+ &hantro_g1_postproc_regs.reg_name, \
|
||||
val); \
|
||||
}
|
||||
|
||||
#define HANTRO_PP_REG_WRITE_S(vpu, reg_name, val) \
|
||||
{ \
|
||||
hantro_reg_write_s(vpu, \
|
||||
- &(vpu)->variant->postproc_regs->reg_name, \
|
||||
+ &hantro_g1_postproc_regs.reg_name, \
|
||||
val); \
|
||||
}
|
||||
|
||||
@@ -64,16 +64,13 @@ bool hantro_needs_postproc(const struct hantro_ctx *ctx,
|
||||
return fmt->fourcc != V4L2_PIX_FMT_NV12;
|
||||
}
|
||||
|
||||
-void hantro_postproc_enable(struct hantro_ctx *ctx)
|
||||
+static void hantro_postproc_g1_enable(struct hantro_ctx *ctx)
|
||||
{
|
||||
struct hantro_dev *vpu = ctx->dev;
|
||||
struct vb2_v4l2_buffer *dst_buf;
|
||||
u32 src_pp_fmt, dst_pp_fmt;
|
||||
dma_addr_t dst_dma;
|
||||
|
||||
- if (!vpu->variant->postproc_regs)
|
||||
- return;
|
||||
-
|
||||
/* Turn on pipeline mode. Must be done first. */
|
||||
HANTRO_PP_REG_WRITE_S(vpu, pipeline_en, 0x1);
|
||||
|
||||
@@ -154,12 +151,30 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-void hantro_postproc_disable(struct hantro_ctx *ctx)
|
||||
+static void hantro_postproc_g1_disable(struct hantro_ctx *ctx)
|
||||
{
|
||||
struct hantro_dev *vpu = ctx->dev;
|
||||
|
||||
- if (!vpu->variant->postproc_regs)
|
||||
- return;
|
||||
-
|
||||
HANTRO_PP_REG_WRITE_S(vpu, pipeline_en, 0x0);
|
||||
}
|
||||
+
|
||||
+void hantro_postproc_disable(struct hantro_ctx *ctx)
|
||||
+{
|
||||
+ struct hantro_dev *vpu = ctx->dev;
|
||||
+
|
||||
+ if (vpu->variant->postproc_ops && vpu->variant->postproc_ops->disable)
|
||||
+ vpu->variant->postproc_ops->disable(ctx);
|
||||
+}
|
||||
+
|
||||
+void hantro_postproc_enable(struct hantro_ctx *ctx)
|
||||
+{
|
||||
+ struct hantro_dev *vpu = ctx->dev;
|
||||
+
|
||||
+ if (vpu->variant->postproc_ops && vpu->variant->postproc_ops->enable)
|
||||
+ vpu->variant->postproc_ops->enable(ctx);
|
||||
+}
|
||||
+
|
||||
+const struct hantro_postproc_ops hantro_g1_postproc_ops = {
|
||||
+ .enable = hantro_postproc_g1_enable,
|
||||
+ .disable = hantro_postproc_g1_disable,
|
||||
+};
|
||||
diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
index ea919bfb9891..22fa7d2f3b64 100644
|
||||
--- a/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
+++ b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
@@ -262,7 +262,7 @@ const struct hantro_variant imx8mq_vpu_variant = {
|
||||
.num_dec_fmts = ARRAY_SIZE(imx8m_vpu_dec_fmts),
|
||||
.postproc_fmts = imx8m_vpu_postproc_fmts,
|
||||
.num_postproc_fmts = ARRAY_SIZE(imx8m_vpu_postproc_fmts),
|
||||
- .postproc_regs = &hantro_g1_postproc_regs,
|
||||
+ .postproc_ops = &hantro_g1_postproc_ops,
|
||||
.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
|
||||
HANTRO_H264_DECODER,
|
||||
.codec_ops = imx8mq_vpu_codec_ops,
|
||||
diff --git a/drivers/staging/media/hantro/rockchip_vpu_hw.c b/drivers/staging/media/hantro/rockchip_vpu_hw.c
|
||||
index d4f52957cc53..6c1ad5534ce5 100644
|
||||
--- a/drivers/staging/media/hantro/rockchip_vpu_hw.c
|
||||
+++ b/drivers/staging/media/hantro/rockchip_vpu_hw.c
|
||||
@@ -460,7 +460,7 @@ const struct hantro_variant rk3036_vpu_variant = {
|
||||
.num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
|
||||
.postproc_fmts = rockchip_vpu1_postproc_fmts,
|
||||
.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
|
||||
- .postproc_regs = &hantro_g1_postproc_regs,
|
||||
+ .postproc_ops = &hantro_g1_postproc_ops,
|
||||
.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
|
||||
HANTRO_H264_DECODER,
|
||||
.codec_ops = rk3036_vpu_codec_ops,
|
||||
@@ -485,7 +485,7 @@ const struct hantro_variant rk3066_vpu_variant = {
|
||||
.num_dec_fmts = ARRAY_SIZE(rk3066_vpu_dec_fmts),
|
||||
.postproc_fmts = rockchip_vpu1_postproc_fmts,
|
||||
.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
|
||||
- .postproc_regs = &hantro_g1_postproc_regs,
|
||||
+ .postproc_ops = &hantro_g1_postproc_ops,
|
||||
.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
|
||||
HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
|
||||
.codec_ops = rk3066_vpu_codec_ops,
|
||||
@@ -505,7 +505,7 @@ const struct hantro_variant rk3288_vpu_variant = {
|
||||
.num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts),
|
||||
.postproc_fmts = rockchip_vpu1_postproc_fmts,
|
||||
.num_postproc_fmts = ARRAY_SIZE(rockchip_vpu1_postproc_fmts),
|
||||
- .postproc_regs = &hantro_g1_postproc_regs,
|
||||
+ .postproc_ops = &hantro_g1_postproc_ops,
|
||||
.codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER |
|
||||
HANTRO_VP8_DECODER | HANTRO_H264_DECODER,
|
||||
.codec_ops = rk3288_vpu_codec_ops,
|
||||
diff --git a/drivers/staging/media/hantro/sama5d4_vdec_hw.c b/drivers/staging/media/hantro/sama5d4_vdec_hw.c
|
||||
index 9c3b8cd0b239..f3fecc7248c4 100644
|
||||
--- a/drivers/staging/media/hantro/sama5d4_vdec_hw.c
|
||||
+++ b/drivers/staging/media/hantro/sama5d4_vdec_hw.c
|
||||
@@ -100,7 +100,7 @@ const struct hantro_variant sama5d4_vdec_variant = {
|
||||
.num_dec_fmts = ARRAY_SIZE(sama5d4_vdec_fmts),
|
||||
.postproc_fmts = sama5d4_vdec_postproc_fmts,
|
||||
.num_postproc_fmts = ARRAY_SIZE(sama5d4_vdec_postproc_fmts),
|
||||
- .postproc_regs = &hantro_g1_postproc_regs,
|
||||
+ .postproc_ops = &hantro_g1_postproc_ops,
|
||||
.codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER |
|
||||
HANTRO_H264_DECODER,
|
||||
.codec_ops = sama5d4_vdec_codec_ops,
|
||||
@@ -1,97 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:33 +0100
|
||||
Subject: [PATCH] hantro: Simplify postprocessor
|
||||
|
||||
Add a 'postprocessed' boolean property to struct hantro_fmt
|
||||
to signal that a format is produced by the post-processor.
|
||||
This will allow to introduce the G2 post-processor in a simple way.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
drivers/staging/media/hantro/hantro.h | 2 ++
|
||||
drivers/staging/media/hantro/hantro_postproc.c | 8 +-------
|
||||
drivers/staging/media/hantro/imx8m_vpu_hw.c | 1 +
|
||||
drivers/staging/media/hantro/rockchip_vpu_hw.c | 1 +
|
||||
drivers/staging/media/hantro/sama5d4_vdec_hw.c | 1 +
|
||||
5 files changed, 6 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h
|
||||
index c2e01959dc00..dd5e56765d4e 100644
|
||||
--- a/drivers/staging/media/hantro/hantro.h
|
||||
+++ b/drivers/staging/media/hantro/hantro.h
|
||||
@@ -263,6 +263,7 @@ struct hantro_ctx {
|
||||
* @max_depth: Maximum depth, for bitstream formats
|
||||
* @enc_fmt: Format identifier for encoder registers.
|
||||
* @frmsize: Supported range of frame sizes (only for bitstream formats).
|
||||
+ * @postprocessed: Indicates if this format needs the post-processor.
|
||||
*/
|
||||
struct hantro_fmt {
|
||||
char *name;
|
||||
@@ -272,6 +273,7 @@ struct hantro_fmt {
|
||||
int max_depth;
|
||||
enum hantro_enc_fmt enc_fmt;
|
||||
struct v4l2_frmsize_stepwise frmsize;
|
||||
+ bool postprocessed;
|
||||
};
|
||||
|
||||
struct hantro_reg {
|
||||
diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
index 882fb8bc5ddd..4549aec08feb 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_postproc.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
@@ -53,15 +53,9 @@ const struct hantro_postproc_regs hantro_g1_postproc_regs = {
|
||||
bool hantro_needs_postproc(const struct hantro_ctx *ctx,
|
||||
const struct hantro_fmt *fmt)
|
||||
{
|
||||
- struct hantro_dev *vpu = ctx->dev;
|
||||
-
|
||||
if (ctx->is_encoder)
|
||||
return false;
|
||||
-
|
||||
- if (!vpu->variant->postproc_fmts)
|
||||
- return false;
|
||||
-
|
||||
- return fmt->fourcc != V4L2_PIX_FMT_NV12;
|
||||
+ return fmt->postprocessed;
|
||||
}
|
||||
|
||||
static void hantro_postproc_g1_enable(struct hantro_ctx *ctx)
|
||||
diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
index 22fa7d2f3b64..02e61438220a 100644
|
||||
--- a/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
+++ b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
@@ -82,6 +82,7 @@ static const struct hantro_fmt imx8m_vpu_postproc_fmts[] = {
|
||||
{
|
||||
.fourcc = V4L2_PIX_FMT_YUYV,
|
||||
.codec_mode = HANTRO_MODE_NONE,
|
||||
+ .postprocessed = true,
|
||||
},
|
||||
};
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/rockchip_vpu_hw.c b/drivers/staging/media/hantro/rockchip_vpu_hw.c
|
||||
index 6c1ad5534ce5..f372f767d4ff 100644
|
||||
--- a/drivers/staging/media/hantro/rockchip_vpu_hw.c
|
||||
+++ b/drivers/staging/media/hantro/rockchip_vpu_hw.c
|
||||
@@ -62,6 +62,7 @@ static const struct hantro_fmt rockchip_vpu1_postproc_fmts[] = {
|
||||
{
|
||||
.fourcc = V4L2_PIX_FMT_YUYV,
|
||||
.codec_mode = HANTRO_MODE_NONE,
|
||||
+ .postprocessed = true,
|
||||
},
|
||||
};
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/sama5d4_vdec_hw.c b/drivers/staging/media/hantro/sama5d4_vdec_hw.c
|
||||
index f3fecc7248c4..b2fc1c5613e1 100644
|
||||
--- a/drivers/staging/media/hantro/sama5d4_vdec_hw.c
|
||||
+++ b/drivers/staging/media/hantro/sama5d4_vdec_hw.c
|
||||
@@ -15,6 +15,7 @@ static const struct hantro_fmt sama5d4_vdec_postproc_fmts[] = {
|
||||
{
|
||||
.fourcc = V4L2_PIX_FMT_YUYV,
|
||||
.codec_mode = HANTRO_MODE_NONE,
|
||||
+ .postprocessed = true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:34 +0100
|
||||
Subject: [PATCH] hantro: Add quirk for NV12/NV12_4L4 capture format
|
||||
|
||||
The G2 core decoder engine produces NV12_4L4 format,
|
||||
which is a simple NV12 4x4 tiled format. The driver currently
|
||||
hides this format by always enabling the post-processor engine,
|
||||
and therefore offering NV12 directly.
|
||||
|
||||
This is done without using the logic in hantro_postproc.c
|
||||
and therefore makes it difficult to add VP9 cleanly.
|
||||
|
||||
Since fixing this is not easy, add a small quirk to force
|
||||
NV12 if HEVC was configured, but otherwise declare NV12_4L4
|
||||
as the pixel format in imx8mq_vpu_g2_variant.dec_fmts.
|
||||
|
||||
This will be used by the VP9 decoder which will be added soon.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
drivers/staging/media/hantro/hantro_v4l2.c | 14 ++++++++++++++
|
||||
drivers/staging/media/hantro/imx8m_vpu_hw.c | 2 +-
|
||||
2 files changed, 15 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c
|
||||
index bcb0bdff4a9a..d1f060c55fed 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_v4l2.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_v4l2.c
|
||||
@@ -150,6 +150,20 @@ static int vidioc_enum_fmt(struct file *file, void *priv,
|
||||
unsigned int num_fmts, i, j = 0;
|
||||
bool skip_mode_none;
|
||||
|
||||
+ /*
|
||||
+ * The HEVC decoder on the G2 core needs a little quirk to offer NV12
|
||||
+ * only on the capture side. Once the post-processor logic is used,
|
||||
+ * we will be able to expose NV12_4L4 and NV12 as the other cases,
|
||||
+ * and therefore remove this quirk.
|
||||
+ */
|
||||
+ if (capture && ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_HEVC_SLICE) {
|
||||
+ if (f->index == 0) {
|
||||
+ f->pixelformat = V4L2_PIX_FMT_NV12;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* When dealing with an encoder:
|
||||
* - on the capture side we want to filter out all MODE_NONE formats.
|
||||
diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
index 02e61438220a..a40b161e5956 100644
|
||||
--- a/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
+++ b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
@@ -134,7 +134,7 @@ static const struct hantro_fmt imx8m_vpu_dec_fmts[] = {
|
||||
|
||||
static const struct hantro_fmt imx8m_vpu_g2_dec_fmts[] = {
|
||||
{
|
||||
- .fourcc = V4L2_PIX_FMT_NV12,
|
||||
+ .fourcc = V4L2_PIX_FMT_NV12_4L4,
|
||||
.codec_mode = HANTRO_MODE_NONE,
|
||||
},
|
||||
{
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,138 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:38 +0100
|
||||
Subject: [PATCH] media: hantro: Rename registers
|
||||
|
||||
Add more consistency in the way registers are named.
|
||||
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
.../staging/media/hantro/hantro_g2_hevc_dec.c | 40 +++++++++----------
|
||||
drivers/staging/media/hantro/hantro_g2_regs.h | 28 ++++++-------
|
||||
2 files changed, 34 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c
|
||||
index 76a921163b9a..abae36f9b418 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c
|
||||
@@ -448,9 +448,9 @@ static int set_ref(struct hantro_ctx *ctx)
|
||||
if (dpb[i].rps == V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR)
|
||||
dpb_longterm_e |= BIT(V4L2_HEVC_DPB_ENTRIES_NUM_MAX - 1 - i);
|
||||
|
||||
- hantro_write_addr(vpu, G2_REG_ADDR_REF(i), luma_addr);
|
||||
- hantro_write_addr(vpu, G2_REG_CHR_REF(i), chroma_addr);
|
||||
- hantro_write_addr(vpu, G2_REG_DMV_REF(i), mv_addr);
|
||||
+ hantro_write_addr(vpu, G2_REF_LUMA_ADDR(i), luma_addr);
|
||||
+ hantro_write_addr(vpu, G2_REF_CHROMA_ADDR(i), chroma_addr);
|
||||
+ hantro_write_addr(vpu, G2_REF_MV_ADDR(i), mv_addr);
|
||||
}
|
||||
|
||||
luma_addr = hantro_hevc_get_ref_buf(ctx, decode_params->pic_order_cnt_val);
|
||||
@@ -460,20 +460,20 @@ static int set_ref(struct hantro_ctx *ctx)
|
||||
chroma_addr = luma_addr + cr_offset;
|
||||
mv_addr = luma_addr + mv_offset;
|
||||
|
||||
- hantro_write_addr(vpu, G2_REG_ADDR_REF(i), luma_addr);
|
||||
- hantro_write_addr(vpu, G2_REG_CHR_REF(i), chroma_addr);
|
||||
- hantro_write_addr(vpu, G2_REG_DMV_REF(i++), mv_addr);
|
||||
+ hantro_write_addr(vpu, G2_REF_LUMA_ADDR(i), luma_addr);
|
||||
+ hantro_write_addr(vpu, G2_REF_CHROMA_ADDR(i), chroma_addr);
|
||||
+ hantro_write_addr(vpu, G2_REF_MV_ADDR(i++), mv_addr);
|
||||
|
||||
- hantro_write_addr(vpu, G2_ADDR_DST, luma_addr);
|
||||
- hantro_write_addr(vpu, G2_ADDR_DST_CHR, chroma_addr);
|
||||
- hantro_write_addr(vpu, G2_ADDR_DST_MV, mv_addr);
|
||||
+ hantro_write_addr(vpu, G2_OUT_LUMA_ADDR, luma_addr);
|
||||
+ hantro_write_addr(vpu, G2_OUT_CHROMA_ADDR, chroma_addr);
|
||||
+ hantro_write_addr(vpu, G2_OUT_MV_ADDR, mv_addr);
|
||||
|
||||
hantro_hevc_ref_remove_unused(ctx);
|
||||
|
||||
for (; i < V4L2_HEVC_DPB_ENTRIES_NUM_MAX; i++) {
|
||||
- hantro_write_addr(vpu, G2_REG_ADDR_REF(i), 0);
|
||||
- hantro_write_addr(vpu, G2_REG_CHR_REF(i), 0);
|
||||
- hantro_write_addr(vpu, G2_REG_DMV_REF(i), 0);
|
||||
+ hantro_write_addr(vpu, G2_REF_LUMA_ADDR(i), 0);
|
||||
+ hantro_write_addr(vpu, G2_REF_CHROMA_ADDR(i), 0);
|
||||
+ hantro_write_addr(vpu, G2_REF_MV_ADDR(i), 0);
|
||||
}
|
||||
|
||||
hantro_reg_write(vpu, &g2_refer_lterm_e, dpb_longterm_e);
|
||||
@@ -499,7 +499,7 @@ static void set_buffers(struct hantro_ctx *ctx)
|
||||
src_len = vb2_get_plane_payload(&src_buf->vb2_buf, 0);
|
||||
src_buf_len = vb2_plane_size(&src_buf->vb2_buf, 0);
|
||||
|
||||
- hantro_write_addr(vpu, G2_ADDR_STR, src_dma);
|
||||
+ hantro_write_addr(vpu, G2_STREAM_ADDR, src_dma);
|
||||
hantro_reg_write(vpu, &g2_stream_len, src_len);
|
||||
hantro_reg_write(vpu, &g2_strm_buffer_len, src_buf_len);
|
||||
hantro_reg_write(vpu, &g2_strm_start_offset, 0);
|
||||
@@ -508,12 +508,12 @@ static void set_buffers(struct hantro_ctx *ctx)
|
||||
/* Destination (decoded frame) buffer. */
|
||||
dst_dma = hantro_get_dec_buf_addr(ctx, &dst_buf->vb2_buf);
|
||||
|
||||
- hantro_write_addr(vpu, G2_RASTER_SCAN, dst_dma);
|
||||
- hantro_write_addr(vpu, G2_RASTER_SCAN_CHR, dst_dma + cr_offset);
|
||||
- hantro_write_addr(vpu, G2_ADDR_TILE_SIZE, ctx->hevc_dec.tile_sizes.dma);
|
||||
- hantro_write_addr(vpu, G2_TILE_FILTER, ctx->hevc_dec.tile_filter.dma);
|
||||
- hantro_write_addr(vpu, G2_TILE_SAO, ctx->hevc_dec.tile_sao.dma);
|
||||
- hantro_write_addr(vpu, G2_TILE_BSD, ctx->hevc_dec.tile_bsd.dma);
|
||||
+ hantro_write_addr(vpu, G2_RS_OUT_LUMA_ADDR, dst_dma);
|
||||
+ hantro_write_addr(vpu, G2_RS_OUT_CHROMA_ADDR, dst_dma + cr_offset);
|
||||
+ hantro_write_addr(vpu, G2_TILE_SIZES_ADDR, ctx->hevc_dec.tile_sizes.dma);
|
||||
+ hantro_write_addr(vpu, G2_TILE_FILTER_ADDR, ctx->hevc_dec.tile_filter.dma);
|
||||
+ hantro_write_addr(vpu, G2_TILE_SAO_ADDR, ctx->hevc_dec.tile_sao.dma);
|
||||
+ hantro_write_addr(vpu, G2_TILE_BSD_ADDR, ctx->hevc_dec.tile_bsd.dma);
|
||||
}
|
||||
|
||||
static void prepare_scaling_list_buffer(struct hantro_ctx *ctx)
|
||||
@@ -563,7 +563,7 @@ static void prepare_scaling_list_buffer(struct hantro_ctx *ctx)
|
||||
for (k = 0; k < 8; k++)
|
||||
*p++ = sc->scaling_list_32x32[i][8 * k + j];
|
||||
|
||||
- hantro_write_addr(vpu, HEVC_SCALING_LIST, ctx->hevc_dec.scaling_lists.dma);
|
||||
+ hantro_write_addr(vpu, G2_HEVC_SCALING_LIST_ADDR, ctx->hevc_dec.scaling_lists.dma);
|
||||
}
|
||||
|
||||
static void hantro_g2_check_idle(struct hantro_dev *vpu)
|
||||
diff --git a/drivers/staging/media/hantro/hantro_g2_regs.h b/drivers/staging/media/hantro/hantro_g2_regs.h
|
||||
index bb22fa921914..24b18f839ff8 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_g2_regs.h
|
||||
+++ b/drivers/staging/media/hantro/hantro_g2_regs.h
|
||||
@@ -177,20 +177,20 @@
|
||||
#define G2_REG_CONFIG_DEC_CLK_GATE_E BIT(16)
|
||||
#define G2_REG_CONFIG_DEC_CLK_GATE_IDLE_E BIT(17)
|
||||
|
||||
-#define G2_ADDR_DST (G2_SWREG(65))
|
||||
-#define G2_REG_ADDR_REF(i) (G2_SWREG(67) + ((i) * 0x8))
|
||||
-#define G2_ADDR_DST_CHR (G2_SWREG(99))
|
||||
-#define G2_REG_CHR_REF(i) (G2_SWREG(101) + ((i) * 0x8))
|
||||
-#define G2_ADDR_DST_MV (G2_SWREG(133))
|
||||
-#define G2_REG_DMV_REF(i) (G2_SWREG(135) + ((i) * 0x8))
|
||||
-#define G2_ADDR_TILE_SIZE (G2_SWREG(167))
|
||||
-#define G2_ADDR_STR (G2_SWREG(169))
|
||||
-#define HEVC_SCALING_LIST (G2_SWREG(171))
|
||||
-#define G2_RASTER_SCAN (G2_SWREG(175))
|
||||
-#define G2_RASTER_SCAN_CHR (G2_SWREG(177))
|
||||
-#define G2_TILE_FILTER (G2_SWREG(179))
|
||||
-#define G2_TILE_SAO (G2_SWREG(181))
|
||||
-#define G2_TILE_BSD (G2_SWREG(183))
|
||||
+#define G2_OUT_LUMA_ADDR (G2_SWREG(65))
|
||||
+#define G2_REF_LUMA_ADDR(i) (G2_SWREG(67) + ((i) * 0x8))
|
||||
+#define G2_OUT_CHROMA_ADDR (G2_SWREG(99))
|
||||
+#define G2_REF_CHROMA_ADDR(i) (G2_SWREG(101) + ((i) * 0x8))
|
||||
+#define G2_OUT_MV_ADDR (G2_SWREG(133))
|
||||
+#define G2_REF_MV_ADDR(i) (G2_SWREG(135) + ((i) * 0x8))
|
||||
+#define G2_TILE_SIZES_ADDR (G2_SWREG(167))
|
||||
+#define G2_STREAM_ADDR (G2_SWREG(169))
|
||||
+#define G2_HEVC_SCALING_LIST_ADDR (G2_SWREG(171))
|
||||
+#define G2_RS_OUT_LUMA_ADDR (G2_SWREG(175))
|
||||
+#define G2_RS_OUT_CHROMA_ADDR (G2_SWREG(177))
|
||||
+#define G2_TILE_FILTER_ADDR (G2_SWREG(179))
|
||||
+#define G2_TILE_SAO_ADDR (G2_SWREG(181))
|
||||
+#define G2_TILE_BSD_ADDR (G2_SWREG(183))
|
||||
|
||||
#define g2_strm_buffer_len G2_DEC_REG(258, 0, 0xffffffff)
|
||||
#define g2_strm_start_offset G2_DEC_REG(259, 0, 0xffffffff)
|
||||
@@ -1,178 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:39 +0100
|
||||
Subject: [PATCH] media: hantro: Prepare for other G2 codecs
|
||||
|
||||
VeriSilicon Hantro G2 core supports other codecs besides hevc.
|
||||
Factor out some common code in preparation for vp9 support.
|
||||
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Reviewed-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
drivers/staging/media/hantro/Makefile | 1 +
|
||||
drivers/staging/media/hantro/hantro.h | 7 +++++
|
||||
drivers/staging/media/hantro/hantro_drv.c | 5 +++
|
||||
drivers/staging/media/hantro/hantro_g2.c | 26 ++++++++++++++++
|
||||
.../staging/media/hantro/hantro_g2_hevc_dec.c | 31 -------------------
|
||||
drivers/staging/media/hantro/hantro_g2_regs.h | 7 +++++
|
||||
drivers/staging/media/hantro/hantro_hw.h | 2 ++
|
||||
7 files changed, 48 insertions(+), 31 deletions(-)
|
||||
create mode 100644 drivers/staging/media/hantro/hantro_g2.c
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/Makefile b/drivers/staging/media/hantro/Makefile
|
||||
index 90036831fec4..fe6d84871d07 100644
|
||||
--- a/drivers/staging/media/hantro/Makefile
|
||||
+++ b/drivers/staging/media/hantro/Makefile
|
||||
@@ -12,6 +12,7 @@ hantro-vpu-y += \
|
||||
hantro_g1_mpeg2_dec.o \
|
||||
hantro_g2_hevc_dec.o \
|
||||
hantro_g1_vp8_dec.o \
|
||||
+ hantro_g2.o \
|
||||
rockchip_vpu2_hw_jpeg_enc.o \
|
||||
rockchip_vpu2_hw_h264_dec.o \
|
||||
rockchip_vpu2_hw_mpeg2_dec.o \
|
||||
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h
|
||||
index dd5e56765d4e..d91eb2b1c509 100644
|
||||
--- a/drivers/staging/media/hantro/hantro.h
|
||||
+++ b/drivers/staging/media/hantro/hantro.h
|
||||
@@ -369,6 +369,13 @@ static inline void vdpu_write(struct hantro_dev *vpu, u32 val, u32 reg)
|
||||
writel(val, vpu->dec_base + reg);
|
||||
}
|
||||
|
||||
+static inline void hantro_write_addr(struct hantro_dev *vpu,
|
||||
+ unsigned long offset,
|
||||
+ dma_addr_t addr)
|
||||
+{
|
||||
+ vdpu_write(vpu, addr & 0xffffffff, offset);
|
||||
+}
|
||||
+
|
||||
static inline u32 vdpu_read(struct hantro_dev *vpu, u32 reg)
|
||||
{
|
||||
u32 val = readl(vpu->dec_base + reg);
|
||||
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
|
||||
index fb82b9297a2b..bb72e5e208b7 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_drv.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_drv.c
|
||||
@@ -907,6 +907,11 @@ static int hantro_probe(struct platform_device *pdev)
|
||||
vpu->enc_base = vpu->reg_bases[0] + vpu->variant->enc_offset;
|
||||
vpu->dec_base = vpu->reg_bases[0] + vpu->variant->dec_offset;
|
||||
|
||||
+ /**
|
||||
+ * TODO: Eventually allow taking advantage of full 64-bit address space.
|
||||
+ * Until then we assume the MSB portion of buffers' base addresses is
|
||||
+ * always 0 due to this masking operation.
|
||||
+ */
|
||||
ret = dma_set_coherent_mask(vpu->dev, DMA_BIT_MASK(32));
|
||||
if (ret) {
|
||||
dev_err(vpu->dev, "Could not set DMA coherent mask.\n");
|
||||
diff --git a/drivers/staging/media/hantro/hantro_g2.c b/drivers/staging/media/hantro/hantro_g2.c
|
||||
new file mode 100644
|
||||
index 000000000000..6f3e1f797f83
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/media/hantro/hantro_g2.c
|
||||
@@ -0,0 +1,26 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Hantro VPU codec driver
|
||||
+ *
|
||||
+ * Copyright (C) 2021 Collabora Ltd, Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
+ */
|
||||
+
|
||||
+#include "hantro_hw.h"
|
||||
+#include "hantro_g2_regs.h"
|
||||
+
|
||||
+void hantro_g2_check_idle(struct hantro_dev *vpu)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < 3; i++) {
|
||||
+ u32 status;
|
||||
+
|
||||
+ /* Make sure the VPU is idle */
|
||||
+ status = vdpu_read(vpu, G2_REG_INTERRUPT);
|
||||
+ if (status & G2_REG_INTERRUPT_DEC_E) {
|
||||
+ dev_warn(vpu->dev, "device still running, aborting");
|
||||
+ status |= G2_REG_INTERRUPT_DEC_ABORT_E | G2_REG_INTERRUPT_DEC_IRQ_DIS;
|
||||
+ vdpu_write(vpu, status, G2_REG_INTERRUPT);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c
|
||||
index abae36f9b418..f62608b0b408 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_g2_hevc_dec.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_g2_hevc_dec.c
|
||||
@@ -8,20 +8,6 @@
|
||||
#include "hantro_hw.h"
|
||||
#include "hantro_g2_regs.h"
|
||||
|
||||
-#define HEVC_DEC_MODE 0xC
|
||||
-
|
||||
-#define BUS_WIDTH_32 0
|
||||
-#define BUS_WIDTH_64 1
|
||||
-#define BUS_WIDTH_128 2
|
||||
-#define BUS_WIDTH_256 3
|
||||
-
|
||||
-static inline void hantro_write_addr(struct hantro_dev *vpu,
|
||||
- unsigned long offset,
|
||||
- dma_addr_t addr)
|
||||
-{
|
||||
- vdpu_write(vpu, addr & 0xffffffff, offset);
|
||||
-}
|
||||
-
|
||||
static void prepare_tile_info_buffer(struct hantro_ctx *ctx)
|
||||
{
|
||||
struct hantro_dev *vpu = ctx->dev;
|
||||
@@ -566,23 +552,6 @@ static void prepare_scaling_list_buffer(struct hantro_ctx *ctx)
|
||||
hantro_write_addr(vpu, G2_HEVC_SCALING_LIST_ADDR, ctx->hevc_dec.scaling_lists.dma);
|
||||
}
|
||||
|
||||
-static void hantro_g2_check_idle(struct hantro_dev *vpu)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- for (i = 0; i < 3; i++) {
|
||||
- u32 status;
|
||||
-
|
||||
- /* Make sure the VPU is idle */
|
||||
- status = vdpu_read(vpu, G2_REG_INTERRUPT);
|
||||
- if (status & G2_REG_INTERRUPT_DEC_E) {
|
||||
- dev_warn(vpu->dev, "device still running, aborting");
|
||||
- status |= G2_REG_INTERRUPT_DEC_ABORT_E | G2_REG_INTERRUPT_DEC_IRQ_DIS;
|
||||
- vdpu_write(vpu, status, G2_REG_INTERRUPT);
|
||||
- }
|
||||
- }
|
||||
-}
|
||||
-
|
||||
int hantro_g2_hevc_dec_run(struct hantro_ctx *ctx)
|
||||
{
|
||||
struct hantro_dev *vpu = ctx->dev;
|
||||
diff --git a/drivers/staging/media/hantro/hantro_g2_regs.h b/drivers/staging/media/hantro/hantro_g2_regs.h
|
||||
index 24b18f839ff8..136ba6d98a1f 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_g2_regs.h
|
||||
+++ b/drivers/staging/media/hantro/hantro_g2_regs.h
|
||||
@@ -27,6 +27,13 @@
|
||||
#define G2_REG_INTERRUPT_DEC_IRQ_DIS BIT(4)
|
||||
#define G2_REG_INTERRUPT_DEC_E BIT(0)
|
||||
|
||||
+#define HEVC_DEC_MODE 0xc
|
||||
+
|
||||
+#define BUS_WIDTH_32 0
|
||||
+#define BUS_WIDTH_64 1
|
||||
+#define BUS_WIDTH_128 2
|
||||
+#define BUS_WIDTH_256 3
|
||||
+
|
||||
#define g2_strm_swap G2_DEC_REG(2, 28, 0xf)
|
||||
#define g2_dirmv_swap G2_DEC_REG(2, 20, 0xf)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h
|
||||
index 2f85430682d8..1d869abf90b2 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_hw.h
|
||||
+++ b/drivers/staging/media/hantro/hantro_hw.h
|
||||
@@ -312,4 +312,6 @@ void hantro_vp8_dec_exit(struct hantro_ctx *ctx);
|
||||
void hantro_vp8_prob_update(struct hantro_ctx *ctx,
|
||||
const struct v4l2_ctrl_vp8_frame *hdr);
|
||||
|
||||
+void hantro_g2_check_idle(struct hantro_dev *vpu);
|
||||
+
|
||||
#endif /* HANTRO_HW_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:41 +0100
|
||||
Subject: [PATCH] media: hantro: Staticize a struct in postprocessor code
|
||||
|
||||
The struct is not used outside this file, so it can be static.
|
||||
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
drivers/staging/media/hantro/hantro_postproc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
index 4549aec08feb..89de43021779 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_postproc.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
@@ -33,7 +33,7 @@
|
||||
#define VPU_PP_OUT_RGB 0x0
|
||||
#define VPU_PP_OUT_YUYV 0x3
|
||||
|
||||
-const struct hantro_postproc_regs hantro_g1_postproc_regs = {
|
||||
+static const struct hantro_postproc_regs hantro_g1_postproc_regs = {
|
||||
.pipeline_en = {G1_REG_PP_INTERRUPT, 1, 0x1},
|
||||
.max_burst = {G1_REG_PP_DEV_CONFIG, 0, 0x1f},
|
||||
.clk_gate = {G1_REG_PP_DEV_CONFIG, 1, 0x1},
|
||||
@@ -1,161 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Date: Tue, 16 Nov 2021 15:38:42 +0100
|
||||
Subject: [PATCH] media: hantro: Support NV12 on the G2 core
|
||||
|
||||
The G2 decoder block produces NV12 4x4 tiled format (NV12_4L4).
|
||||
Enable the G2 post-processor block, in order to produce regular NV12.
|
||||
|
||||
The logic in hantro_postproc.c is leveraged to take care of allocating
|
||||
the extra buffers and configure the post-processor, which is
|
||||
significantly simpler than the one on the G1.
|
||||
|
||||
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
|
||||
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
||||
---
|
||||
.../staging/media/hantro/hantro_g2_vp9_dec.c | 6 ++--
|
||||
drivers/staging/media/hantro/hantro_hw.h | 1 +
|
||||
.../staging/media/hantro/hantro_postproc.c | 31 +++++++++++++++++++
|
||||
drivers/staging/media/hantro/imx8m_vpu_hw.c | 11 +++++++
|
||||
4 files changed, 46 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c
|
||||
index fc55b03a8004..e04242d10fa2 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_g2_vp9_dec.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_g2_vp9_dec.c
|
||||
@@ -152,7 +152,7 @@ static void config_output(struct hantro_ctx *ctx,
|
||||
hantro_reg_write(ctx->dev, &g2_out_dis, 0);
|
||||
hantro_reg_write(ctx->dev, &g2_output_format, 0);
|
||||
|
||||
- luma_addr = vb2_dma_contig_plane_dma_addr(&dst->base.vb.vb2_buf, 0);
|
||||
+ luma_addr = hantro_get_dec_buf_addr(ctx, &dst->base.vb.vb2_buf);
|
||||
hantro_write_addr(ctx->dev, G2_OUT_LUMA_ADDR, luma_addr);
|
||||
|
||||
chroma_addr = luma_addr + chroma_offset(ctx, dec_params);
|
||||
@@ -191,7 +191,7 @@ static void config_ref(struct hantro_ctx *ctx,
|
||||
hantro_reg_write(ctx->dev, &ref_reg->hor_scale, (refw << 14) / dst->vp9.width);
|
||||
hantro_reg_write(ctx->dev, &ref_reg->ver_scale, (refh << 14) / dst->vp9.height);
|
||||
|
||||
- luma_addr = vb2_dma_contig_plane_dma_addr(&buf->base.vb.vb2_buf, 0);
|
||||
+ luma_addr = hantro_get_dec_buf_addr(ctx, &buf->base.vb.vb2_buf);
|
||||
hantro_write_addr(ctx->dev, ref_reg->y_base, luma_addr);
|
||||
|
||||
chroma_addr = luma_addr + chroma_offset(ctx, dec_params);
|
||||
@@ -236,7 +236,7 @@ static void config_ref_registers(struct hantro_ctx *ctx,
|
||||
config_ref(ctx, dst, &ref_regs[1], dec_params, dec_params->golden_frame_ts);
|
||||
config_ref(ctx, dst, &ref_regs[2], dec_params, dec_params->alt_frame_ts);
|
||||
|
||||
- mv_addr = vb2_dma_contig_plane_dma_addr(&mv_ref->base.vb.vb2_buf, 0) +
|
||||
+ mv_addr = hantro_get_dec_buf_addr(ctx, &mv_ref->base.vb.vb2_buf) +
|
||||
mv_offset(ctx, dec_params);
|
||||
hantro_write_addr(ctx->dev, G2_REF_MV_ADDR(0), mv_addr);
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h
|
||||
index fe5b51046d33..dbe51303724b 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_hw.h
|
||||
+++ b/drivers/staging/media/hantro/hantro_hw.h
|
||||
@@ -310,6 +310,7 @@ extern const struct hantro_variant rk3399_vpu_variant;
|
||||
extern const struct hantro_variant sama5d4_vdec_variant;
|
||||
|
||||
extern const struct hantro_postproc_ops hantro_g1_postproc_ops;
|
||||
+extern const struct hantro_postproc_ops hantro_g2_postproc_ops;
|
||||
|
||||
extern const u32 hantro_vp8_dec_mc_filter[8][6];
|
||||
|
||||
diff --git a/drivers/staging/media/hantro/hantro_postproc.c b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
index 89de43021779..a7774ad4c445 100644
|
||||
--- a/drivers/staging/media/hantro/hantro_postproc.c
|
||||
+++ b/drivers/staging/media/hantro/hantro_postproc.c
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "hantro.h"
|
||||
#include "hantro_hw.h"
|
||||
#include "hantro_g1_regs.h"
|
||||
+#include "hantro_g2_regs.h"
|
||||
|
||||
#define HANTRO_PP_REG_WRITE(vpu, reg_name, val) \
|
||||
{ \
|
||||
@@ -99,6 +100,21 @@ static void hantro_postproc_g1_enable(struct hantro_ctx *ctx)
|
||||
HANTRO_PP_REG_WRITE(vpu, display_width, ctx->dst_fmt.width);
|
||||
}
|
||||
|
||||
+static void hantro_postproc_g2_enable(struct hantro_ctx *ctx)
|
||||
+{
|
||||
+ struct hantro_dev *vpu = ctx->dev;
|
||||
+ struct vb2_v4l2_buffer *dst_buf;
|
||||
+ size_t chroma_offset = ctx->dst_fmt.width * ctx->dst_fmt.height;
|
||||
+ dma_addr_t dst_dma;
|
||||
+
|
||||
+ dst_buf = hantro_get_dst_buf(ctx);
|
||||
+ dst_dma = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
||||
+
|
||||
+ hantro_write_addr(vpu, G2_RS_OUT_LUMA_ADDR, dst_dma);
|
||||
+ hantro_write_addr(vpu, G2_RS_OUT_CHROMA_ADDR, dst_dma + chroma_offset);
|
||||
+ hantro_reg_write(vpu, &g2_out_rs_e, 1);
|
||||
+}
|
||||
+
|
||||
void hantro_postproc_free(struct hantro_ctx *ctx)
|
||||
{
|
||||
struct hantro_dev *vpu = ctx->dev;
|
||||
@@ -127,6 +143,9 @@ int hantro_postproc_alloc(struct hantro_ctx *ctx)
|
||||
if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_H264_SLICE)
|
||||
buf_size += hantro_h264_mv_size(ctx->dst_fmt.width,
|
||||
ctx->dst_fmt.height);
|
||||
+ else if (ctx->vpu_src_fmt->fourcc == V4L2_PIX_FMT_VP9_FRAME)
|
||||
+ buf_size += hantro_vp9_mv_size(ctx->dst_fmt.width,
|
||||
+ ctx->dst_fmt.height);
|
||||
|
||||
for (i = 0; i < num_buffers; ++i) {
|
||||
struct hantro_aux_buf *priv = &ctx->postproc.dec_q[i];
|
||||
@@ -152,6 +171,13 @@ static void hantro_postproc_g1_disable(struct hantro_ctx *ctx)
|
||||
HANTRO_PP_REG_WRITE_S(vpu, pipeline_en, 0x0);
|
||||
}
|
||||
|
||||
+static void hantro_postproc_g2_disable(struct hantro_ctx *ctx)
|
||||
+{
|
||||
+ struct hantro_dev *vpu = ctx->dev;
|
||||
+
|
||||
+ hantro_reg_write(vpu, &g2_out_rs_e, 0);
|
||||
+}
|
||||
+
|
||||
void hantro_postproc_disable(struct hantro_ctx *ctx)
|
||||
{
|
||||
struct hantro_dev *vpu = ctx->dev;
|
||||
@@ -172,3 +198,8 @@ const struct hantro_postproc_ops hantro_g1_postproc_ops = {
|
||||
.enable = hantro_postproc_g1_enable,
|
||||
.disable = hantro_postproc_g1_disable,
|
||||
};
|
||||
+
|
||||
+const struct hantro_postproc_ops hantro_g2_postproc_ops = {
|
||||
+ .enable = hantro_postproc_g2_enable,
|
||||
+ .disable = hantro_postproc_g2_disable,
|
||||
+};
|
||||
diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
index 455a107ffb02..1a43f6fceef9 100644
|
||||
--- a/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
+++ b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
||||
@@ -132,6 +132,14 @@ static const struct hantro_fmt imx8m_vpu_dec_fmts[] = {
|
||||
},
|
||||
};
|
||||
|
||||
+static const struct hantro_fmt imx8m_vpu_g2_postproc_fmts[] = {
|
||||
+ {
|
||||
+ .fourcc = V4L2_PIX_FMT_NV12,
|
||||
+ .codec_mode = HANTRO_MODE_NONE,
|
||||
+ .postprocessed = true,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
static const struct hantro_fmt imx8m_vpu_g2_dec_fmts[] = {
|
||||
{
|
||||
.fourcc = V4L2_PIX_FMT_NV12_4L4,
|
||||
@@ -301,6 +309,9 @@ const struct hantro_variant imx8mq_vpu_g2_variant = {
|
||||
.dec_offset = 0x0,
|
||||
.dec_fmts = imx8m_vpu_g2_dec_fmts,
|
||||
.num_dec_fmts = ARRAY_SIZE(imx8m_vpu_g2_dec_fmts),
|
||||
+ .postproc_fmts = imx8m_vpu_g2_postproc_fmts,
|
||||
+ .num_postproc_fmts = ARRAY_SIZE(imx8m_vpu_g2_postproc_fmts),
|
||||
+ .postproc_ops = &hantro_g2_postproc_ops,
|
||||
.codec = HANTRO_HEVC_DECODER | HANTRO_VP9_DECODER,
|
||||
.codec_ops = imx8mq_vpu_g2_codec_ops,
|
||||
.init = imx8mq_vpu_hw_init,
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user